summaryrefslogtreecommitdiff
path: root/addons/purchase/models/product.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/purchase/models/product.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/purchase/models/product.py')
-rw-r--r--addons/purchase/models/product.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/addons/purchase/models/product.py b/addons/purchase/models/product.py
new file mode 100644
index 00000000..197d4af6
--- /dev/null
+++ b/addons/purchase/models/product.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import api, fields, models, _
+from odoo.addons.base.models.res_partner import WARNING_MESSAGE, WARNING_HELP
+from odoo.tools.float_utils import float_round
+from dateutil.relativedelta import relativedelta
+
+
+class ProductTemplate(models.Model):
+ _name = 'product.template'
+ _inherit = 'product.template'
+
+ property_account_creditor_price_difference = fields.Many2one(
+ 'account.account', string="Price Difference Account", company_dependent=True,
+ help="This account is used in automated inventory valuation to "\
+ "record the price difference between a purchase order and its related vendor bill when validating this vendor bill.")
+ purchased_product_qty = fields.Float(compute='_compute_purchased_product_qty', string='Purchased')
+ purchase_method = fields.Selection([
+ ('purchase', 'On ordered quantities'),
+ ('receive', 'On received quantities'),
+ ], string="Control Policy", help="On ordered quantities: Control bills based on ordered quantities.\n"
+ "On received quantities: Control bills based on received quantities.", default="receive")
+ purchase_line_warn = fields.Selection(WARNING_MESSAGE, 'Purchase Order Line Warning', help=WARNING_HELP, required=True, default="no-message")
+ purchase_line_warn_msg = fields.Text('Message for Purchase Order Line')
+
+ def _compute_purchased_product_qty(self):
+ for template in self:
+ template.purchased_product_qty = float_round(sum([p.purchased_product_qty for p in template.product_variant_ids]), precision_rounding=template.uom_id.rounding)
+
+ @api.model
+ def get_import_templates(self):
+ res = super(ProductTemplate, self).get_import_templates()
+ if self.env.context.get('purchase_product_template'):
+ return [{
+ 'label': _('Import Template for Products'),
+ 'template': '/purchase/static/xls/product_purchase.xls'
+ }]
+ return res
+
+ def action_view_po(self):
+ action = self.env["ir.actions.actions"]._for_xml_id("purchase.action_purchase_order_report_all")
+ action['domain'] = ['&', ('state', 'in', ['purchase', 'done']), ('product_tmpl_id', 'in', self.ids)]
+ action['context'] = {
+ 'graph_measure': 'qty_ordered',
+ 'search_default_later_than_a_year_ago': True
+ }
+ return action
+
+
+class ProductProduct(models.Model):
+ _name = 'product.product'
+ _inherit = 'product.product'
+
+ purchased_product_qty = fields.Float(compute='_compute_purchased_product_qty', string='Purchased')
+
+ def _compute_purchased_product_qty(self):
+ date_from = fields.Datetime.to_string(fields.Date.context_today(self) - relativedelta(years=1))
+ domain = [
+ ('order_id.state', 'in', ['purchase', 'done']),
+ ('product_id', 'in', self.ids),
+ ('order_id.date_approve', '>=', date_from)
+ ]
+ order_lines = self.env['purchase.order.line'].read_group(domain, ['product_id', 'product_uom_qty'], ['product_id'])
+ purchased_data = dict([(data['product_id'][0], data['product_uom_qty']) for data in order_lines])
+ for product in self:
+ if not product.id:
+ product.purchased_product_qty = 0.0
+ continue
+ product.purchased_product_qty = float_round(purchased_data.get(product.id, 0), precision_rounding=product.uom_id.rounding)
+
+ def action_view_po(self):
+ action = self.env["ir.actions.actions"]._for_xml_id("purchase.action_purchase_order_report_all")
+ action['domain'] = ['&', ('state', 'in', ['purchase', 'done']), ('product_id', 'in', self.ids)]
+ action['context'] = {
+ 'graph_measure': 'qty_ordered',
+ 'search_default_later_than_a_year_ago': True
+ }
+ return action
+
+
+class ProductCategory(models.Model):
+ _inherit = "product.category"
+
+ property_account_creditor_price_difference_categ = fields.Many2one(
+ 'account.account', string="Price Difference Account",
+ company_dependent=True,
+ help="This account will be used to value price difference between purchase price and accounting cost.")
+
+
+class ProductSupplierinfo(models.Model):
+ _inherit = "product.supplierinfo"
+
+ @api.onchange('name')
+ def _onchange_name(self):
+ self.currency_id = self.name.property_purchase_currency_id.id or self.env.company.currency_id.id