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,5 @@
# © 2016 Chafique DELLI @ Akretion
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import wizard_update_invoice_supplierinfo
from . import wizard_update_invoice_supplierinfo_line

View File

@@ -0,0 +1,70 @@
# Copyright 2016 Chafique DELLI @ Akretion
# Copyright 2016-Today: GRAP (http://www.grap.coop)
# Copyright Sylvain LE GAL (https://twitter.com/legalsylvain)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
class WizardUpdateInvoiceSupplierinfo(models.TransientModel):
_name = "wizard.update.invoice.supplierinfo"
_description = "Wizard to update supplierinfo"
line_ids = fields.One2many(
comodel_name="wizard.update.invoice.supplierinfo.line",
inverse_name="wizard_id",
string="Lines",
)
invoice_id = fields.Many2one(
comodel_name="account.move",
required=True,
readonly=True,
ondelete="cascade",
)
state = fields.Selection(related="invoice_id.state", readonly=True)
supplier_partner_id = fields.Many2one(
comodel_name="res.partner",
string="Supplier",
related="invoice_id.supplier_partner_id",
readonly=True,
)
display_discount = fields.Boolean(
compute="_compute_display_discount",
)
@api.depends("line_ids.current_discount", "line_ids.new_discount")
def _compute_display_discount(self):
for wizard in self:
wizard.display_discount = any(
wizard.mapped("line_ids.current_discount")
) or any(wizard.mapped("line_ids.new_discount"))
def update_supplierinfo(self):
self.ensure_one()
supplierinfo_obj = self.env["product.supplierinfo"]
for line in self.line_ids:
supplierinfo = line.supplierinfo_id
# Create supplierinfo if not exist
if not supplierinfo:
vals = line._prepare_supplierinfo()
supplierinfo_obj.create(vals)
else:
vals = line._prepare_supplierinfo_update()
supplierinfo.write(vals)
# Manually write uom_po_id on product
# because unfortunately product_uom is a related on supplierinfo
# and writing product_uom doesn't change the related field.
if (
"product_uom" in vals
and vals["product_uom"] != line.product_id.uom_po_id.id
):
line.product_id.uom_po_id = vals["product_uom"]
# Mark the invoice as checked
self.invoice_id.write({"supplierinfo_ok": True})
def set_supplierinfo_ok(self):
self.invoice_id.write({"supplierinfo_ok": True})

View File

@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_wizard_update_invoice_supplierinfo_form" model="ir.ui.view">
<field name="model">wizard.update.invoice.supplierinfo</field>
<field name="arch" type="xml">
<form>
<group col="4" colspan="4">
<field name="invoice_id" invisible="1" />
<field name="state" invisible="1" />
<field name="display_discount" invisible="1" />
<field name="supplier_partner_id" />
</group>
<separator string="List of products to update" />
<field name="line_ids">
<list
create="false"
editable="bottom"
decoration-info="not supplierinfo_id"
>
<field name="product_id" />
<field
name="current_min_quantity"
invisible="not supplierinfo_id"
optional="show"
/>
<field name="new_min_quantity" optional="show" />
<field
name="current_price"
invisible="not supplierinfo_id"
optional="show"
/>
<field name="new_price" optional="show" />
<field name="current_uom_id" column_invisible="1" />
<field
name="current_uom_id"
invisible="not supplierinfo_id"
groups="uom.group_uom"
optional="show"
/>
<field name="new_uom_id" column_invisible="1" />
<field
name="new_uom_id"
groups="uom.group_uom"
optional="show"
/>
<field
name="current_discount"
invisible="not supplierinfo_id"
column_invisible="not parent.display_discount"
optional="show"
/>
<field
name="new_discount"
optional="show"
column_invisible="not parent.display_discount"
/>
<field
name="cost_variation"
invisible="cost_variation == 0.0"
optional="show"
/>
</list>
</field>
<footer>
<button
name="update_supplierinfo"
string="Update Supplier Infos"
type="object"
class="oe_highlight"
/>
<button
name="set_supplierinfo_ok"
string="Ignore"
type="object"
confirm="Do you want to set invoice as checked ?"
help="This will mark the invoice as checked. It will be possible to uncheck manually in the 'Other Info' tab."
/>
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
</odoo>

View File

@@ -0,0 +1,148 @@
# Copyright 2016 Chafique DELLI @ Akretion
# Copyright 2016-Today: GRAP (http://www.grap.coop)
# Copyright Sylvain LE GAL (https://twitter.com/legalsylvain)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
class WizardUpdateInvoiceSupplierinfoLine(models.TransientModel):
_name = "wizard.update.invoice.supplierinfo.line"
_description = "Wizard Line to update supplierinfo"
wizard_id = fields.Many2one(
comodel_name="wizard.update.invoice.supplierinfo",
required=True,
ondelete="cascade",
)
product_id = fields.Many2one("product.product", string="Product")
product_uom_id = fields.Many2one("uom.uom", related="product_id.uom_id")
supplierinfo_id = fields.Many2one(comodel_name="product.supplierinfo")
current_min_quantity = fields.Float(
string="current Min quantity", related="supplierinfo_id.min_qty", readonly=True
)
new_min_quantity = fields.Float(required=True)
current_uom_id = fields.Many2one(
string="UoM",
comodel_name="uom.uom",
related="supplierinfo_id.product_uom",
readonly=True,
)
new_uom_id = fields.Many2one(
comodel_name="uom.uom", string="New UoM", required=True
)
current_price = fields.Float(
related="supplierinfo_id.price",
digits="Product Price",
readonly=True,
)
new_price = fields.Float(
string="New Unit Price",
digits="Product Price",
required=True,
)
current_cost = fields.Float(
string="Cost",
compute="_compute_current_cost",
digits="Product Price",
readonly=True,
)
new_cost = fields.Float(
compute="_compute_new_cost",
digits="Product Price",
readonly=True,
)
cost_variation = fields.Float(
string="Cost Variation (%)",
compute="_compute_cost_variation",
digits="Discount",
)
current_discount = fields.Float(
digits="Discount",
readonly=True,
)
new_discount = fields.Float(
digits="Discount",
required=True,
)
def _get_fields_depend_current_cost(self):
return [
"supplierinfo_id",
"product_uom_id",
"current_price",
"current_uom_id",
"current_discount",
]
def _get_fields_depend_new_cost(self):
return [
"supplierinfo_id",
"product_uom_id",
"new_price",
"new_uom_id",
"new_discount",
]
@api.depends(lambda self: self._get_fields_depend_current_cost())
def _compute_current_cost(self):
self.write({"current_cost": False})
for line in self.filtered(lambda x: x.supplierinfo_id):
current_cost = line.current_uom_id._compute_price(
line.current_price, line.product_uom_id
)
line.current_cost = current_cost * (100 - line.current_discount) / 100
@api.depends(lambda self: self._get_fields_depend_new_cost())
def _compute_new_cost(self):
for line in self.filtered(lambda x: x.new_uom_id):
new_cost = line.new_uom_id._compute_price(
line.new_price, line.product_uom_id
)
line.new_cost = new_cost * (100 - line.new_discount) / 100
for line in self.filtered(lambda x: not x.new_uom_id):
line.new_cost = 0.0
@api.depends("current_cost", "new_cost")
def _compute_cost_variation(self):
self.write({"cost_variation": False})
for line in self.filtered("current_cost"):
line.cost_variation = (
100 * (line.new_cost - line.current_cost) / line.current_cost
)
# Custom Section
def _prepare_supplierinfo(self):
self.ensure_one()
vals = {
"product_tmpl_id": self.product_id.product_tmpl_id.id,
"partner_id": self.wizard_id.invoice_id.supplier_partner_id.id,
"delay": 1,
}
vals.update(self._prepare_supplierinfo_update())
return vals
def _prepare_supplierinfo_update(self):
self.ensure_one()
res = {
"min_qty": self.new_min_quantity,
"price": self.new_price,
"currency_id": self.wizard_id.invoice_id.currency_id.id,
"discount": self.new_discount,
}
if self.new_uom_id:
res["product_uom"] = self.new_uom_id.id
return res