1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # OpenERP, Open Source Management Solution
5 # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
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.
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.
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/>.
20 ##############################################################################
22 from osv import osv, fields
24 class stock_move(osv.osv):
25 _inherit = 'stock.move'
27 'purchase_line_id': fields.many2one('purchase.order.line',
28 'Purchase Order Line', ondelete='set null', select=True,
32 def _get_reference_accounting_values_for_valuation(self, cr, uid, move, context=None):
34 Overrides the default stock valuation to take into account the currency that was specified
35 on the purchase order in case the valuation data was not directly specified during picking
38 product_uom_obj = self.pool.get('product.uom')
40 reference_amount, reference_currency_id = super(stock_move, self)._get_reference_accounting_values_for_valuation(cr, uid, move, context=context)
41 default_uom = move.product_id.uom_id.id
42 qty = product_uom_obj._compute_qty(cr, uid, move.product_uom.id, move.product_qty, default_uom)
43 if move.product_id.cost_method != 'average' or not move.price_unit:
44 # no average price costing or cost not specified during picking validation, we will
45 # plug the purchase line values if they are found.
46 if move.purchase_line_id and move.picking_id.purchase_id.pricelist_id:
47 reference_amount, reference_currency_id = move.purchase_line_id.price_unit * qty, move.picking_id.purchase_id.pricelist_id.currency_id.id
48 return reference_amount, reference_currency_id
53 # Inherit of picking to add the link to the PO
55 class stock_picking(osv.osv):
56 _inherit = 'stock.picking'
58 'purchase_id': fields.many2one('purchase.order', 'Purchase Order',
59 ondelete='set null', select=True),
65 def _get_address_invoice(self, cr, uid, picking):
66 """ Gets invoice address of a partner
67 @return {'contact': address, 'invoice': address} for invoice
69 res = super(stock_picking, self)._get_address_invoice(cr, uid, picking)
70 if picking.purchase_id:
71 partner_obj = self.pool.get('res.partner')
72 partner = picking.purchase_id.partner_id or picking.address_id.partner_id
73 data = partner_obj.address_get(cr, uid, [partner.id],
74 ['contact', 'invoice'])
78 def get_currency_id(self, cursor, user, picking):
79 if picking.purchase_id:
80 return picking.purchase_id.pricelist_id.currency_id.id
82 return super(stock_picking, self).get_currency_id(cursor, user, picking)
84 def _get_comment_invoice(self, cursor, user, picking):
85 if picking.purchase_id and picking.purchase_id.notes:
87 return picking.note + '\n' + picking.purchase_id.notes
89 return picking.purchase_id.notes
90 return super(stock_picking, self)._get_comment_invoice(cursor, user, picking)
92 def _get_price_unit_invoice(self, cursor, user, move_line, type):
93 if move_line.purchase_line_id:
94 if move_line.purchase_line_id.order_id.invoice_method == 'picking':
95 return move_line.price_unit
97 return move_line.purchase_line_id.price_unit
98 return super(stock_picking, self)._get_price_unit_invoice(cursor, user, move_line, type)
100 def _get_discount_invoice(self, cursor, user, move_line):
101 if move_line.purchase_line_id:
103 return super(stock_picking, self)._get_discount_invoice(cursor, user, move_line)
105 def _get_taxes_invoice(self, cursor, user, move_line, type):
106 if move_line.purchase_line_id:
107 return [x.id for x in move_line.purchase_line_id.taxes_id]
108 return super(stock_picking, self)._get_taxes_invoice(cursor, user, move_line, type)
110 def _get_account_analytic_invoice(self, cursor, user, picking, move_line):
111 if picking.purchase_id and move_line.purchase_line_id:
112 return move_line.purchase_line_id.account_analytic_id.id
113 return super(stock_picking, self)._get_account_analytic_invoice(cursor, user, picking, move_line)
115 def _invoice_line_hook(self, cursor, user, move_line, invoice_line_id):
116 if move_line.purchase_line_id:
117 invoice_line_obj = self.pool.get('account.invoice.line')
118 invoice_line_obj.write(cursor, user, [invoice_line_id], {'note': move_line.purchase_line_id.notes,})
119 return super(stock_picking, self)._invoice_line_hook(cursor, user, move_line, invoice_line_id)
121 def _invoice_hook(self, cursor, user, picking, invoice_id):
122 purchase_obj = self.pool.get('purchase.order')
123 if picking.purchase_id:
124 purchase_obj.write(cursor, user, [picking.purchase_id.id], {'invoice_ids': [(4, invoice_id)]})
125 return super(stock_picking, self)._invoice_hook(cursor, user, picking, invoice_id)
127 class stock_partial_picking(osv.osv_memory):
128 _inherit = 'stock.partial.picking'
130 # Overridden to inject the purchase price as true 'cost price' when processing
132 def _product_cost_for_average_update(self, cr, uid, move):
133 if move.picking_id.purchase_id:
134 return {'cost': move.purchase_line_id.price_unit,
135 'currency': move.picking_id.purchase_id.pricelist_id.currency_id.id}
136 return super(stock_partial_picking, self)._product_cost_for_average_update(cr, uid, move)
138 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: