diff options
Diffstat (limited to 'indoteknik_custom/models')
| -rw-r--r-- | indoteknik_custom/models/__init__.py | 2 | ||||
| -rw-r--r-- | indoteknik_custom/models/purchase_order.py | 34 | ||||
| -rw-r--r-- | indoteknik_custom/models/purchase_order_line.py | 83 | ||||
| -rw-r--r-- | indoteknik_custom/models/purchase_pricelist.py | 14 |
4 files changed, 117 insertions, 16 deletions
diff --git a/indoteknik_custom/models/__init__.py b/indoteknik_custom/models/__init__.py index 8445ec9e..30914b52 100644 --- a/indoteknik_custom/models/__init__.py +++ b/indoteknik_custom/models/__init__.py @@ -12,3 +12,5 @@ from . import crm_lead from . import res_users from . import user_activity_log from . import purchase_order +from . import purchase_pricelist +from . import purchase_order_line diff --git a/indoteknik_custom/models/purchase_order.py b/indoteknik_custom/models/purchase_order.py index f01c4752..ba98d8d3 100644 --- a/indoteknik_custom/models/purchase_order.py +++ b/indoteknik_custom/models/purchase_order.py @@ -7,21 +7,23 @@ class PurchaseOrder(models.Model): sale_order_id = fields.Many2one('sale.order', string='Sale Order') def sale_order_sync(self): - if self.sale_order_id: - purchase_orders = self.search(['&', ('sale_order_id', '=', self.sale_order_id.id), ('id', '!=', self.id)]) - products_exception = [] - for purchase_order in purchase_orders: - for order_line in purchase_order.order_line: - products_exception.append(order_line.product_id.id) + if not self.sale_order_id: + return - self.order_line.unlink() - for order_line in self.sale_order_id.order_line: - if order_line.product_id.id and order_line.product_id.id not in products_exception: - values = { - 'order_id': self.id, - 'product_id': order_line.product_id.id, - 'name': order_line.product_id.name, - 'product_qty': order_line.product_qty - } - self.env['purchase.order.line'].sudo().create(values) + purchase_orders = self.search(['&', ('sale_order_id', '=', self.sale_order_id.id), ('id', '!=', self.id)]) + products_exception = [] + for purchase_order in purchase_orders: + for order_line in purchase_order.order_line: + products_exception.append(order_line.product_id.id) + + self.order_line.unlink() + for order_line in self.sale_order_id.order_line: + if order_line.product_id.id and order_line.product_id.id not in products_exception: + values = { + 'order_id': self.id, + 'product_id': order_line.product_id.id, + 'name': order_line.product_id.name, + 'product_qty': order_line.product_qty + } + self.env['purchase.order.line'].sudo().create(values) diff --git a/indoteknik_custom/models/purchase_order_line.py b/indoteknik_custom/models/purchase_order_line.py new file mode 100644 index 00000000..6b7bbfc1 --- /dev/null +++ b/indoteknik_custom/models/purchase_order_line.py @@ -0,0 +1,83 @@ +from odoo import fields, models, api +from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT + + +class PurchaseOrderLine(models.Model): + _inherit = 'purchase.order.line' + + # Override method from addons/purchase/models/purchase.py + @api.onchange('product_id') + def onchange_product_id(self): + if not self.product_id: + return + + # Reset date, price and quantity since _onchange_quantity will provide default values + self.price_unit = self.product_qty = 0.0 + + self._product_id_change() + + self._suggest_quantity() + self._onchange_quantity() + + # Override method from addons/purchase/models/purchase.py + @api.onchange('product_qty', 'product_uom') + def _onchange_quantity(self): + if not self.product_id: + return + params = {'order_id': self.order_id} + seller = self.product_id._select_seller( + partner_id=self.partner_id, + quantity=self.product_qty, + date=self.order_id.date_order and self.order_id.date_order.date(), + uom_id=self.product_uom, + params=params) + + if seller or not self.date_planned: + self.date_planned = self._get_date_planned(seller).strftime(DEFAULT_SERVER_DATETIME_FORMAT) + + # If not seller, use the standard price. It needs a proper currency conversion. + if not seller: + po_line_uom = self.product_uom or self.product_id.uom_po_id + price_unit = self.env['account.tax']._fix_tax_included_price_company( + self.product_id.uom_id._compute_price(self.product_id.standard_price, po_line_uom), + self.product_id.supplier_taxes_id, + self.taxes_id, + self.company_id, + ) + if price_unit and self.order_id.currency_id and self.order_id.company_id.currency_id != self.order_id.currency_id: + price_unit = self.order_id.company_id.currency_id._convert( + price_unit, + self.order_id.currency_id, + self.order_id.company_id, + self.date_order or fields.Date.today(), + ) + + self.price_unit = price_unit + return + + price_unit = self.env['account.tax']._fix_tax_included_price_company(seller.price, + self.product_id.supplier_taxes_id, + self.taxes_id, + self.company_id) if seller else 0.0 + if price_unit and seller and self.order_id.currency_id and seller.currency_id != self.order_id.currency_id: + price_unit = seller.currency_id._convert( + price_unit, self.order_id.currency_id, self.order_id.company_id, self.date_order or fields.Date.today()) + + if seller and self.product_uom and seller.product_uom != self.product_uom: + price_unit = seller.product_uom._compute_price(price_unit, self.product_uom) + + # Custom script + purchase_pricelist = self.env['purchase.pricelist'].search([ + ('product_id', '=', self.product_id.id), + ('vendor_id', '=', self.partner_id.id) + ], limit=1) + price_unit = purchase_pricelist.product_price + + if not price_unit: + product_supplierinfo = self.env['product.supplierinfo'].search([ + ('product_tmpl_id', '=', self.product_id.product_tmpl_id.id), + ('name', '=', self.partner_id.id) + ], limit=1) + price_unit = product_supplierinfo.price + + self.price_unit = price_unit diff --git a/indoteknik_custom/models/purchase_pricelist.py b/indoteknik_custom/models/purchase_pricelist.py new file mode 100644 index 00000000..25e551ae --- /dev/null +++ b/indoteknik_custom/models/purchase_pricelist.py @@ -0,0 +1,14 @@ +from odoo import models, fields, api + + +class PurchasePricelist(models.Model): + _name = 'purchase.pricelist' + + name = fields.Char(string='Name', compute="_compute_name") + product_id = fields.Many2one('product.product', string="Product", required=True) + vendor_id = fields.Many2one('res.partner', string="Vendor", required=True) + product_price = fields.Float(string='Price', required=True) + + @api.depends('product_id', 'vendor_id') + def _compute_name(self): + self.name = self.vendor_id.name + ', ' + self.product_id.name |
