Initial commit: Odoo 18.0-20251222 extra-addons
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled

This commit is contained in:
tocmo0nlord
2026-03-13 20:43:25 +00:00
parent 36e847a7df
commit adbe430761
9472 changed files with 1265727 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import sale_order_line_price_history

View File

@@ -0,0 +1,156 @@
# Copyright 2019 Tecnativa - Ernesto Tejeda
# Copyright 2024 Moduon Team S.L. <info@moduon.team>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class SaleOrderLinePriceHistory(models.TransientModel):
_name = "sale.order.line.price.history"
_description = "Sale order line price history"
@api.model
def _default_partner_id(self):
line_id = self.env.context.get("active_id")
return self.env["sale.order.line"].browse(line_id).order_partner_id.id
@api.model
def _default_product_id(self):
line_id = self.env.context.get("active_id")
return self.env["sale.order.line"].browse(line_id).product_id.id
sale_order_line_id = fields.Many2one(
comodel_name="sale.order.line",
string="Sale order line",
default=lambda self: self.env.context.get("active_id"),
)
product_id = fields.Many2one(
comodel_name="product.product",
string="Product",
default=_default_product_id,
)
partner_id = fields.Many2one(
comodel_name="res.partner",
string="Customer",
default=_default_partner_id,
)
line_ids = fields.One2many(
comodel_name="sale.order.line.price.history.line",
inverse_name="history_id",
string="History lines",
readonly=True,
)
include_quotations = fields.Boolean(
help="Include quotations lines in the sale history",
)
include_commercial_partner = fields.Boolean(
string="Include commercial entity",
default=True,
help="Include commercial entity and its contacts in the sale history",
)
@api.onchange("partner_id", "include_quotations", "include_commercial_partner")
def _onchange_partner_id(self):
self.line_ids = False
states = ["sale", "done"]
if self.include_quotations:
states += ["draft", "sent"]
domain = [
("product_id", "=", self.product_id.id),
("state", "in", states),
]
if self.partner_id:
if self.include_commercial_partner:
domain += [
(
"order_partner_id",
"child_of",
self.partner_id.commercial_partner_id.ids,
)
]
else:
domain += [("order_partner_id", "child_of", self.partner_id.ids)]
vals = []
sol_limit = (
self.env["ir.config_parameter"]
.sudo()
.get_param("sale_order_line_price_history.order_line_limit", default="20")
)
order_lines = self.env["sale.order.line"].search(domain, limit=int(sol_limit))
order_lines -= self.sale_order_line_id
for order_line in order_lines:
vals.append(
(
0,
False,
{
"sale_order_line_id": order_line.id,
"history_sale_order_line_id": self.sale_order_line_id.id,
"history_id": self.id,
},
)
)
self.line_ids = vals
class SaleOrderLinePriceHistoryline(models.TransientModel):
_name = "sale.order.line.price.history.line"
_description = "Sale order line price history line"
_order = "sale_order_date_order desc"
history_id = fields.Many2one(
comodel_name="sale.order.line.price.history",
string="History",
)
target_sale_order_line_id = fields.Many2one(
comodel_name="sale.order.line",
related="history_id.sale_order_line_id",
)
history_sale_order_line_id = fields.Many2one(
comodel_name="sale.order.line",
string="history sale order line",
)
sale_order_line_id = fields.Many2one(
comodel_name="sale.order.line",
)
order_id = fields.Many2one(
related="sale_order_line_id.order_id",
)
order_state = fields.Selection(
related="order_id.state",
)
partner_id = fields.Many2one(
related="sale_order_line_id.order_partner_id",
)
sale_order_date_order = fields.Datetime(
related="sale_order_line_id.order_id.date_order",
)
product_uom_qty = fields.Float(
related="sale_order_line_id.product_uom_qty",
)
price_unit = fields.Float(
related="sale_order_line_id.price_unit",
)
discount = fields.Float(
related="sale_order_line_id.discount",
)
def _prepare_set_price_history_vals(self):
"""Hook method to prepare the values to update the
sales order line in context.
This method is invoke by action_set_price method in this model.
"""
self.ensure_one()
return {"price_unit": self.price_unit, "discount": self.discount}
def action_set_price(self):
if self.history_sale_order_line_id and self.sale_order_line_id:
self.history_sale_order_line_id.write(
self._prepare_set_price_history_vals()
)
else:
raise ValidationError(
_("Not found historical sale order line for this action!")
)

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2019 Tecnativa - Ernesto Tejeda
Copyright 2024 Moduon Team S.L. <info@moduon.team>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="sale_order_line_price_history_view_form" model="ir.ui.view">
<field name="name">sale.order.line.price.history.view.form</field>
<field name="model">sale.order.line.price.history</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="partner_id" />
<field name="product_id" readonly="1" />
<field name="include_commercial_partner" />
<field name="include_quotations" />
<field name="sale_order_line_id" invisible="1" />
</group>
<group string="Sale history">
<field name="line_ids" nolabel="1" readonly="1" colspan="2">
<form>
<header>
<field name="order_state" widget="statusbar" />
</header>
<sheet>
<group>
<field
name="sale_order_line_id"
invisible="1"
/>
<field
name="history_sale_order_line_id"
invisible="1"
/>
<field name="order_id" />
<field name="partner_id" />
<field name="sale_order_date_order" />
<field name="product_uom_qty" />
<field name="price_unit" />
<label
for="discount"
groups="sale.group_discount_per_so_line"
/>
<div
name="discount"
groups="sale.group_discount_per_so_line"
>
<field
name="discount"
class="oe_inline"
/> %%
</div>
</group>
</sheet>
<footer />
</form>
<list decoration-info="order_state in ('draft', 'sent')">
<field name="order_id" />
<field name="order_state" column_invisible="1" />
<field
name="partner_id"
column_invisible="parent.partner_id"
/>
<field name="sale_order_date_order" />
<field name="product_uom_qty" />
<field name="price_unit" />
<field
name="discount"
groups="sale.group_discount_per_so_line"
/>
<field
name="target_sale_order_line_id"
string=" "
widget="set_price_to_line_widget"
help="Price History"
/>
</list>
</field>
</group>
</sheet>
<footer>
<button special="cancel" string="Close" />
</footer>
</form>
</field>
</record>
<record id="sale_order_line_price_history_action" model="ir.actions.act_window">
<field name="name">Price history per customer</field>
<field name="res_model">sale.order.line.price.history</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>