70 lines
2.7 KiB
Python
70 lines
2.7 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import fields, models
|
|
from odoo.tools import float_is_zero
|
|
|
|
|
|
class StockMove(models.Model):
|
|
_inherit = 'stock.move'
|
|
|
|
def _sale_get_invoice_price(self, order):
|
|
""" Based on the current stock move, compute the price to reinvoice the analytic line that is going to be created (so the
|
|
price of the sale line).
|
|
"""
|
|
self.ensure_one()
|
|
|
|
if self.product_id.expense_policy == 'sales_price':
|
|
return order.pricelist_id._get_product_price(
|
|
self.product_id,
|
|
1.0,
|
|
uom=self.product_uom,
|
|
date=order.date_order,
|
|
)
|
|
|
|
uom_precision_digits = self.env['decimal.precision'].precision_get('Product Unit of Measure')
|
|
if float_is_zero(self.quantity, precision_digits=uom_precision_digits):
|
|
return 0.0
|
|
|
|
price_unit = self.product_id.standard_price
|
|
# Prevent unnecessary currency conversion that could be impacted by exchange rate
|
|
# fluctuations
|
|
if self.company_id.currency_id and price_unit and self.company_id.currency_id == order.currency_id:
|
|
return self.company_id.currency_id.round(price_unit)
|
|
|
|
currency_id = self.company_id.currency_id
|
|
if currency_id and currency_id != order.currency_id:
|
|
price_unit = currency_id._convert(price_unit, order.currency_id, order.company_id, order.date_order or fields.Date.today())
|
|
return price_unit
|
|
|
|
def _sale_prepare_sale_line_values(self, order, price, last_sequence):
|
|
""" Generate the sale.line creation value from the current stock move """
|
|
self.ensure_one()
|
|
|
|
fpos = order.fiscal_position_id or order.fiscal_position_id._get_fiscal_position(order.partner_id)
|
|
product_taxes = self.product_id.taxes_id._filter_taxes_by_company(order.company_id)
|
|
taxes = fpos.map_tax(product_taxes)
|
|
|
|
return {
|
|
'order_id': order.id,
|
|
'name': self.name,
|
|
'sequence': last_sequence,
|
|
'price_unit': price,
|
|
'tax_id': [x.id for x in taxes],
|
|
'discount': 0.0,
|
|
'product_id': self.product_id.id,
|
|
'product_uom_qty': self.product_uom_qty,
|
|
'qty_delivered': self.quantity,
|
|
}
|
|
|
|
def _get_new_picking_values(self):
|
|
return {
|
|
**super()._get_new_picking_values(),
|
|
'project_id': self.sale_line_id.order_id.project_id.id,
|
|
}
|
|
|
|
def _assign_picking_values(self, picking):
|
|
return {
|
|
**super()._assign_picking_values(picking),
|
|
'project_id': self[:1].sale_line_id.order_id.project_id.id,
|
|
}
|