Odoo18-Base/addons/sale_project_stock/models/stock_move.py

70 lines
2.7 KiB
Python
Raw Permalink Normal View History

2025-01-06 10:57:38 +07:00
# 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,
}