Initialize v18 branch

Rename *_usability modules to *_usability_akretion
This commit is contained in:
Alexis de Lattre
2024-12-24 10:11:21 +01:00
parent 9913924202
commit 13744fc404
264 changed files with 50 additions and 87 deletions

View File

@@ -0,0 +1,3 @@
from . import sale_order
from . import account_move
from . import stock_picking

View File

@@ -0,0 +1,33 @@
# Copyright 2024 Akretion France (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models
class AccountMove(models.Model):
_inherit = 'account.move'
def _report_get_sale_pickings(self, sale_order=None):
self.ensure_one()
# the sale_order arg is usefull when using
# py3o_lines_layout_groupby_order() to display the delivery orders
# linked to a specific sale_order
assert self.move_type in ('out_invoice', 'out_refund')
sale_orders = sale_order or self.sale_ids
picking_domain = [
('id', 'in', sale_orders.picking_ids.ids),
('state', '=', 'done'),
('date_done', '<', self.create_date),
('company_id', '=', self.company_id.id),
]
previous_inv = self.env['account.move'].search([
('move_type', 'in', ('out_invoice', 'out_refund')),
('create_date', '<', self.create_date),
('id', 'in', sale_orders.invoice_ids.ids),
('company_id', '=', self.company_id.id),
], limit=1, order='id desc')
if previous_inv:
picking_domain.append(('date_done', '>', previous_inv.create_date))
pickings = self.env['stock.picking'].search(picking_domain)
return pickings

View File

@@ -0,0 +1,37 @@
# Copyright 2015-2020 Akretion France (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
from odoo.tools import float_compare, float_round
class SaleOrder(models.Model):
_inherit = 'sale.order'
warehouse_id = fields.Many2one(tracking=True)
incoterm = fields.Many2one(tracking=True)
incoterm_location = fields.Char(tracking=True)
picking_policy = fields.Selection(tracking=True)
def report_qty_to_deliver(self):
# Can be useful for delivery report
self.ensure_one()
res = []
prec = self.env['decimal.precision'].precision_get(
'Product Unit of Measure')
for line in self.order_line:
if (
line.product_id.type in ('product', 'consu') and
float_compare(
line.product_uom_qty, line.qty_delivered,
precision_digits=prec) > 0):
qty_to_deliver = float_round(
line.product_uom_qty - line.qty_delivered, precision_digits=prec)
res.append({
'product': line.product_id,
'name': line.name,
'uom': line.product_uom,
'qty_to_deliver': qty_to_deliver,
})
return res

View File

@@ -0,0 +1,84 @@
# Copyright 2024 Akretion France (http://www.akretion.com)
# @author Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models, _
from odoo.exceptions import UserError
import logging
logger = logging.getLogger(__name__)
class StockPicking(models.Model):
_inherit = 'stock.picking'
def _report_delivery_prices(self):
self.ensure_one()
assert self.state == 'done'
if not self.partner_id:
raise UserError(_("Partner is not set on picking %s.") % self.display_name)
weight_uom_categ_id = self.env.ref('uom.product_uom_categ_kgm').id
kg_uom = self.env.ref('uom.product_uom_kgm')
partner_pricelist = self.partner_id.property_product_pricelist
currency = self.sale_id.currency_id or partner_pricelist.currency_id
total_amount = 0.0
total_weight_kg = 0.0
lines = []
for line in self.move_line_ids:
move = line.move_id
uom = line.product_uom_id
if uom.category_id.id == weight_uom_categ_id:
weight_kg_subtotal = uom._compute_quantity(line.qty_done, kg_uom)
else:
qty_product_uom = uom._compute_quantity(line.qty_done, line.product_id.uom_id)
weight_kg_subtotal = qty_product_uom * line.product_id.weight
if (
move.sale_line_id and
move.sale_line_id.product_id == line.product_id and
move.sale_line_id.product_uom_qty > 0 and
move.sale_line_id.product_uom == uom):
price_unit = currency.round(
line.move_id.sale_line_id.price_subtotal / move.sale_line_id.product_uom_qty)
logger.info(
'For move line %s, got price %s from sale order line',
line.display_name, price_unit)
else:
# TODO remove tax if tax included
price_unit = partner_pricelist._get_product_price(
line.product_id, line.qty_done, uom=uom,
date=fields.Date.to_date(self.date_done))
price_unit = currency.round(price_unit)
# Only for very special case where picking is linked to sale order but this line
# is from linked to sale order line, and the partner pricelist is NOT in the same
# currency as the sale order pricelist. Should very rarely happen.
if currency != partner_pricelist.currency_id:
raise UserError(_(
"The pricelist of the related sale order is in currency "
"%(sale_pricelist_currency)s whereas the pricelist "
"%(partner_pricelist_name)s of partner %(partner)s "
"is in currency %(partner_pricelist_currency)s.",
sale_pricelist_currency=self.sale_id.currency_id.name,
partner_pricelist_name=partner_pricelist.name,
partner=self.partner_id.display_name,
partner_pricelist_currency=partner_pricelist.currency_id.name))
logger.info(
'For move line %s, got price %s from partner pricelist %s',
line.display_name, price_unit, partner_pricelist.display_name)
price_subtotal = currency.round(price_unit * line.qty_done)
total_amount += price_subtotal
lines.append({
'line': line,
'qty': line.qty_done,
'uom': uom,
'product': line.product_id,
'weight_kg_subtotal': weight_kg_subtotal,
'price_unit': price_unit,
'price_subtotal': price_subtotal,
'lot': line.lot_id and line.lot_id.display_name or (line.lot_name or ''),
})
res = {
'lines': lines,
'currency': currency,
'total_amount': currency.round(total_amount),
'total_weight_kg': total_weight_kg,
}
return res