[IMP] Consistency
[odoo/odoo.git] / addons / sale_stock / stock.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 #    OpenERP, Open Source Management Solution
5 #    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
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 openerp.osv import fields, osv
23 from openerp.tools.translate import _
24
25 class stock_move(osv.osv):
26     _inherit = 'stock.move'
27     _columns = {
28         'sale_line_id': fields.many2one('sale.order.line', 'Sales Order Line', ondelete='set null', select=True, readonly=True),
29     }
30
31     def _prepare_chained_picking(self, cr, uid, picking_name, picking, picking_type, moves_todo, context=None):
32         values = super(stock_move, self)._prepare_chained_picking(cr, uid, picking_name, picking, picking_type, moves_todo, context=context)
33         if picking.sale_id:
34             values['sale_id'] = picking.sale_id.id
35         return values
36
37 class stock_picking(osv.osv):
38     _inherit = 'stock.picking'
39     _columns = {
40         'sale_id': fields.many2one('sale.order', 'Sales Order', ondelete='set null', select=True),
41     }
42     _defaults = {
43         'sale_id': False
44     }
45
46     def get_currency_id(self, cursor, user, picking):
47         if picking.sale_id:
48             return picking.sale_id.pricelist_id.currency_id.id
49         else:
50             return super(stock_picking, self).get_currency_id(cursor, user, picking)
51
52     def _get_partner_to_invoice(self, cr, uid, picking, context=None):
53         """ Inherit the original function of the 'stock' module
54             We select the partner of the sales order as the partner of the customer invoice
55         """
56         if picking.sale_id:
57             return picking.sale_id.partner_invoice_id
58         return super(stock_picking, self)._get_partner_to_invoice(cr, uid, picking, context=context)
59
60     def _get_comment_invoice(self, cursor, user, picking):
61         if picking.note or (picking.sale_id and picking.sale_id.note):
62             return picking.note or picking.sale_id.note
63         return super(stock_picking, self)._get_comment_invoice(cursor, user, picking)
64
65     def _prepare_invoice(self, cr, uid, picking, partner, inv_type, journal_id, context=None):
66         """ Inherit the original function of the 'stock' module in order to override some
67             values if the picking has been generated by a sales order
68         """
69         invoice_vals = super(stock_picking, self)._prepare_invoice(cr, uid, picking, partner, inv_type, journal_id, context=context)
70         if picking.sale_id:
71             invoice_vals['fiscal_position'] = picking.sale_id.fiscal_position.id
72             invoice_vals['payment_term'] = picking.sale_id.payment_term.id
73             invoice_vals['user_id'] = picking.sale_id.user_id.id
74             invoice_vals['name'] = picking.sale_id.client_order_ref or ''
75         return invoice_vals
76
77     def _prepare_invoice_line(self, cr, uid, group, picking, move_line, invoice_id, invoice_vals, context=None):
78         invoice_vals = super(stock_picking, self)._prepare_invoice_line(cr, uid, group, picking, move_line, invoice_id, invoice_vals, context=context)
79         if picking.sale_id:
80             if move_line.sale_line_id:
81                 invoice_vals['account_analytic_id'] = self._get_account_analytic_invoice(cr, uid, picking, move_line)
82         return invoice_vals
83
84     def _get_price_unit_invoice(self, cursor, user, move_line, type):
85         if move_line.sale_line_id and move_line.sale_line_id.product_id.id == move_line.product_id.id:
86             uom_id = move_line.product_id.uom_id.id
87             uos_id = move_line.product_id.uos_id and move_line.product_id.uos_id.id or False
88             price = move_line.sale_line_id.price_unit
89             coeff = move_line.product_id.uos_coeff
90             if uom_id != uos_id  and coeff != 0:
91                 price_unit = price / coeff
92                 return price_unit
93             return move_line.sale_line_id.price_unit
94         return super(stock_picking, self)._get_price_unit_invoice(cursor, user, move_line, type)
95
96     def _get_discount_invoice(self, cursor, user, move_line):
97         if move_line.sale_line_id:
98             return move_line.sale_line_id.discount
99         return super(stock_picking, self)._get_discount_invoice(cursor, user, move_line)
100
101     def _get_taxes_invoice(self, cursor, user, move_line, type):
102         if move_line.sale_line_id and move_line.sale_line_id.product_id.id == move_line.product_id.id:
103             return [x.id for x in move_line.sale_line_id.tax_id]
104         return super(stock_picking, self)._get_taxes_invoice(cursor, user, move_line, type)
105
106     def _get_account_analytic_invoice(self, cursor, user, picking, move_line):
107         if picking.sale_id:
108             return picking.sale_id.project_id.id
109         return super(stock_picking, self)._get_account_analytic_invoice(cursor, user, picking, move_line)
110
111     def _invoice_line_hook(self, cursor, user, move_line, invoice_line_id):
112         if move_line.sale_line_id:
113             move_line.sale_line_id.write({'invoice_lines': [(4, invoice_line_id)]})
114         return super(stock_picking, self)._invoice_line_hook(cursor, user, move_line, invoice_line_id)
115
116     def _invoice_hook(self, cursor, user, picking, invoice_id):
117         sale_obj = self.pool.get('sale.order')
118         if picking.sale_id:
119             sale_obj.write(cursor, user, [picking.sale_id.id], {
120                 'invoice_ids': [(4, invoice_id)],
121                 })
122         return super(stock_picking, self)._invoice_hook(cursor, user, picking, invoice_id)
123     
124     def action_done(self, cr, uid, ids, context=None):
125         """ Changes picking state to done. This method is called at the end of
126             the workflow by the activity "done".
127         """
128         for record in self.browse(cr, uid, ids, context):
129             if record.type == "out" and record.sale_id:
130                 self.pool.get('sale.order').message_post(cr, uid, [record.sale_id.id], body=_("Products delivered"), context=context)
131         return super(stock_picking, self).action_done(cr, uid, ids, context=context)
132
133 # Redefinition of the new field in order to update the model stock.picking.out in the orm
134 # FIXME: this is a temporary workaround because of a framework bug (ref: lp996816). It should be removed as soon as
135 #        the bug is fixed
136 class stock_picking_out(osv.osv):
137     _inherit = 'stock.picking.out'
138     _columns = {
139         'sale_id': fields.many2one('sale.order', 'Sale Order',
140             ondelete='set null', select=True),
141     }
142 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: