From e97b7186b155a52e90414a680e50f0a65f136756 Mon Sep 17 00:00:00 2001 From: xtremxpert Date: Tue, 8 Apr 2025 10:10:47 -0400 Subject: [PATCH] product_supplierinfo_tracking --- product_supplierinfo_tracking/__init__.py | 3 + product_supplierinfo_tracking/__manifest__.py | 51 +++++++ .../models/__init__.py | 1 + .../models/product_supplierinfo.py | 141 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 14547 bytes .../views/product_view.xml | 13 ++ .../views/supplierinfo_pricelist.xml | 22 +++ 7 files changed, 231 insertions(+) create mode 100644 product_supplierinfo_tracking/__init__.py create mode 100755 product_supplierinfo_tracking/__manifest__.py create mode 100644 product_supplierinfo_tracking/models/__init__.py create mode 100755 product_supplierinfo_tracking/models/product_supplierinfo.py create mode 100644 product_supplierinfo_tracking/static/description/icon.png create mode 100755 product_supplierinfo_tracking/views/product_view.xml create mode 100644 product_supplierinfo_tracking/views/supplierinfo_pricelist.xml diff --git a/product_supplierinfo_tracking/__init__.py b/product_supplierinfo_tracking/__init__.py new file mode 100644 index 0000000..cde864b --- /dev/null +++ b/product_supplierinfo_tracking/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import models diff --git a/product_supplierinfo_tracking/__manifest__.py b/product_supplierinfo_tracking/__manifest__.py new file mode 100755 index 0000000..3c90a0d --- /dev/null +++ b/product_supplierinfo_tracking/__manifest__.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2004-2010 Tiny SPRL (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +{ + "name": "Product Supplierinfo Tracking", + "version": "18.0.2.0.5", + "license": "AGPL-3", + "author": "Bemade", + "category": "Purchase", + "depends": [ + "base", + "product", + "stock", + "sale", + "purchase", + "mrp", + ], + "description": """ + This module extends basic inventory and pricelist management in + OpenERP to include support for supplierinfo tracking. + + """, + "demo": [], + 'data': [ + 'views/product_view.xml', + 'views/supplierinfo_pricelist.xml', + ], + 'test': [], + 'installable': True, + 'active': False +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/product_supplierinfo_tracking/models/__init__.py b/product_supplierinfo_tracking/models/__init__.py new file mode 100644 index 0000000..d29af9a --- /dev/null +++ b/product_supplierinfo_tracking/models/__init__.py @@ -0,0 +1 @@ +from . import product_supplierinfo \ No newline at end of file diff --git a/product_supplierinfo_tracking/models/product_supplierinfo.py b/product_supplierinfo_tracking/models/product_supplierinfo.py new file mode 100755 index 0000000..2f1e150 --- /dev/null +++ b/product_supplierinfo_tracking/models/product_supplierinfo.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api +from markupsafe import Markup + + +class ProductSupplierInfo(models.Model): + _name = "product.supplierinfo" + _inherit = [ + "product.supplierinfo", + "mail.thread", + "mail.activity.mixin" + ] + + # Commented out because breaking basic Odoo tests. See if this is really needed. + + # _sql_constraints = [("supplierinfo_product_tmpl_id_no_null", + # "CHECK((product_tmpl_id IS NOT NULL))", + # "Supplier pricelist need product template"), + # ] + + # This while avoid the database to save those record with lost product_tmpl_id + @api.depends("supplier_list_price", "supplier_discount_percent") + def _compute_price(self): + for rec in self: + rec.price = rec.supplier_list_price - ( + rec.supplier_list_price * rec.supplier_discount_percent / 100 + ) + + @api.depends("supplier_discount_percent") + def _inverse_price(self): + for rec in self: + discount = ( + rec.supplier_discount_percent if rec.supplier_discount_percent else 0 + ) + rec.supplier_list_price = (100 * rec.price) / (100 - discount) + + partner_id = fields.Many2one(tracking=True, domain=[("is_company", "=", True)]) + product_name = fields.Char(tracking=True) + product_code = fields.Char(tracking=True) + product_uom = fields.Many2one(tracking=True) + min_qty = fields.Float(tracking=True) + currency_id = fields.Many2one(tracking=True) + date_start = fields.Date(tracking=True) + date_end = fields.Date(tracking=True) + product_id = fields.Many2one(tracking=True) + product_tmpl_id = fields.Many2one(tracking=True) + delay = fields.Integer(tracking=True) + + date_updated = fields.Date( + string="Last updated", + help="Date at which the supplier " + " list price was last updated.", + ) + + purchasing_notes = fields.Text(tracking=True, string="Purchasing Notes") + + supplier_list_price = fields.Float( + string="Supplier List Price", + digits="Product Price", + tracking=True, + help=""" + This the supplier list price to which supplier discounts are applied, if + any, and the net price if no supplier discounts are to be applied + """, + ) + + supplier_discount_percent = fields.Float( + string="Supplier discount (%)", digits="Product Price", tracking=True, default=0 + ) + + price = fields.Float( + compute="_compute_price", + inverse="_inverse_price", + string="Supplier Price", + digits="Product Price", + help="This price will be considered as a price for the supplier UoM if any or " + "the default Unit of Measure of the product otherwise", + store=True, + ) + + def _generate_chatter(self, vals, operation): + if len(self) == 1 and self.product_tmpl_id: + msg = "" + headmsg = ( + f"" + f"Price {operation} for {self.product_id.name} :
" + ) + if self.min_qty > 0: + msg += f"
  • Minimum qty : {self.min_qty}
  • " + if self.date_start: + msg += f"
  • Starting : {self.date_start}
  • " + if self.date_end: + msg += f"
  • Ending : {self.date_end}
  • " + if msg: + msg = headmsg + "
      " + msg + "
    " + else: + msg = headmsg + for change in vals: + msg += f"{change} --> {vals[change]}
    " + # Should always be there + if self.product_tmpl_id: + self.product_tmpl_id.message_post( + body=Markup(msg), + ) + # only for variant + if self.product_id: + self.product_id.message_post(body=Markup(msg)) + + # Well hard time to set the chatter + # def create(self, vals): + # res = super(ProductSupplierInfo, self).create(vals) + # # # res._generate_chatter(vals, 'create') + + def write(self, vals): + res = super(ProductSupplierInfo, self).write(vals) + self._generate_chatter(vals, "modify") + return res + + def suplierinfo_show_details(self): + """ + Action to open product.supplierinfo (pricelist) in its own windows and not in a javascript + popup to avoid loosing product_tmpl_id. We rely on both context and domain to pass the + information + """ + # views = [(self.env.ref('account.invoice_supplier_tree').id, 'tree'), + # (self.env.ref('account.invoice_supplier_form').id, 'form')] + return { + "name": "Supplier price", + "view_type": "form", + "view_mode": "form", + "res_id": self.id, + "context": self.env.context, + "res_model": "product.supplierinfo", + "domain": [ + ("product_tmpl_id", "=", self.product_tmpl_id), + ("product_id", "=", self.product_id), + ], + "type": "ir.actions.act_window", + # 'view_id': False, + # 'views': views, + } diff --git a/product_supplierinfo_tracking/static/description/icon.png b/product_supplierinfo_tracking/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4a8f3595cce5d05c9b82efaba6e24c74b43c0162 GIT binary patch literal 14547 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 D;+c%? literal 0 HcmV?d00001 diff --git a/product_supplierinfo_tracking/views/product_view.xml b/product_supplierinfo_tracking/views/product_view.xml new file mode 100755 index 0000000..bc6787f --- /dev/null +++ b/product_supplierinfo_tracking/views/product_view.xml @@ -0,0 +1,13 @@ + + + + product.supplierinfo.list.view2 + product.supplierinfo + + + + 1 + + + + diff --git a/product_supplierinfo_tracking/views/supplierinfo_pricelist.xml b/product_supplierinfo_tracking/views/supplierinfo_pricelist.xml new file mode 100644 index 0000000..410d4de --- /dev/null +++ b/product_supplierinfo_tracking/views/supplierinfo_pricelist.xml @@ -0,0 +1,22 @@ + + + + + supplierinfo.pricelist.chatter + product.supplierinfo + + + + + + + + + + + + +