Initial commit: Odoo 18.0-20251222 extra-addons
This commit is contained in:
5
account_invoice_supplierinfo_update/wizard/__init__.py
Normal file
5
account_invoice_supplierinfo_update/wizard/__init__.py
Normal 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
|
||||
@@ -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})
|
||||
@@ -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>
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user