From fdfdf10ad43160f9cca8f4364ef6af17959463f0 Mon Sep 17 00:00:00 2001 From: Andreas Osim Date: Mon, 17 Feb 2020 11:33:03 +0100 Subject: [PATCH] new dealer discount --- .../tz_dealer_discount/__init__.py | 5 ++ .../tz_dealer_discount/__manifest__.py | 28 ++++++++ .../tz_dealer_discount/models/__init__.py | 7 ++ .../tz_dealer_discount/models/invoice.py | 62 ++++++++++++++++ .../tz_dealer_discount/models/res_config.py | 37 ++++++++++ .../tz_dealer_discount/models/sale.py | 68 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 17134 bytes .../tz_dealer_discount/views/invoice_view.xml | 50 +++++++++++++ .../views/res_config_view.xml | 34 +++++++++ .../tz_dealer_discount/views/sale_view.xml | 27 +++++++ 10 files changed, 318 insertions(+) create mode 100644 ext/custom-addons/tz_dealer_discount/__init__.py create mode 100644 ext/custom-addons/tz_dealer_discount/__manifest__.py create mode 100644 ext/custom-addons/tz_dealer_discount/models/__init__.py create mode 100644 ext/custom-addons/tz_dealer_discount/models/invoice.py create mode 100644 ext/custom-addons/tz_dealer_discount/models/res_config.py create mode 100644 ext/custom-addons/tz_dealer_discount/models/sale.py create mode 100644 ext/custom-addons/tz_dealer_discount/static/description/icon.png create mode 100644 ext/custom-addons/tz_dealer_discount/views/invoice_view.xml create mode 100644 ext/custom-addons/tz_dealer_discount/views/res_config_view.xml create mode 100644 ext/custom-addons/tz_dealer_discount/views/sale_view.xml diff --git a/ext/custom-addons/tz_dealer_discount/__init__.py b/ext/custom-addons/tz_dealer_discount/__init__.py new file mode 100644 index 00000000..fa7ea9f7 --- /dev/null +++ b/ext/custom-addons/tz_dealer_discount/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +from . import models + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/ext/custom-addons/tz_dealer_discount/__manifest__.py b/ext/custom-addons/tz_dealer_discount/__manifest__.py new file mode 100644 index 00000000..f9480c82 --- /dev/null +++ b/ext/custom-addons/tz_dealer_discount/__manifest__.py @@ -0,0 +1,28 @@ +# -*- encoding: utf-8 -*- +########################################################################### +# +# Copyright (C) 2016 - Today Turkesh Patel. +# +# @author Turkesh Patel +########################################################################### + +{ + 'name': 'Sale and Invoice Dealer Discounts', + 'category': 'Accounting', + 'version': '1.0', + 'author' : 'TZAustria, derived from Almighty Consulting Services', + 'support': 'andreas.osim@glaser-co.at', + 'website': 'https://www.tzaustria.at', + 'summary': """Apply Dealer Discounts on Sale Orders and Invoice based on fixed amounts and percentage, BUT NOT for special products (based on material_type)""", + 'description': """Apply Dealer Discounts on Sale Orders and Invoice based on fixed amounts and percentage, BUT NOT for special products (based on material_type)""", + 'depends': ['purchase','sale_management','account'], + 'data': [ + 'views/sale_view.xml', + 'views/invoice_view.xml', + 'views/res_config_view.xml', + ], + 'installable': True, + 'auto_install': False, +} + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/ext/custom-addons/tz_dealer_discount/models/__init__.py b/ext/custom-addons/tz_dealer_discount/models/__init__.py new file mode 100644 index 00000000..ed14f7cc --- /dev/null +++ b/ext/custom-addons/tz_dealer_discount/models/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + +from . import sale +from . import invoice +from . import res_config + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/ext/custom-addons/tz_dealer_discount/models/invoice.py b/ext/custom-addons/tz_dealer_discount/models/invoice.py new file mode 100644 index 00000000..c661442a --- /dev/null +++ b/ext/custom-addons/tz_dealer_discount/models/invoice.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models, api, _ +from odoo.exceptions import UserError + +class Invoice(models.Model): + _inherit = "account.invoice" + + dealer_discount = fields.Boolean("Add Dealer Discount", readonly=True, states={'draft': [('readonly', False)]},) + dealer_discount_type = fields.Selection([('fixed','Fixed'),('percentage','Percentage')], + "Discount Type", readonly=True, states={'draft': [('readonly', False)]}, default='fixed') + dealer_discount_amount = fields.Float("Discount Amount", readonly=True, states={'draft': [('readonly', False)]},) + dealer_discount_percentage = fields.Float("Discount Percentage", readonly=True, states={'draft': [('readonly', False)]},) + + @api.multi + def _dealer_discount_unset(self): + if self.env.user.company_id.invoice_dealer_discount_product_id: + self.env['account.invoice.line'].search([('invoice_id', 'in', self.ids), ('product_id', '=', self.env.user.company_id.invoice_dealer_discount_product_id.id)]).unlink() + + @api.multi + def create_dealer_discount(self): + InvoiceLine = self.env['account.invoice.line'] + + product_id = self.env.user.company_id.invoice_dealer_discount_product_id + if not product_id: + raise UserError(_('Please set Invoice Dealer Discount product in General Settings first.')) + + # Remove Discount line first + self._dealer_discount_unset() + + account_id = product_id.property_account_income_id.id + if not account_id: + prop = self.env['ir.property'].get('property_account_income_categ_id', 'product.category') + account_id = prop and prop.id or False + + for invoice in self: + amount = 0 + if invoice.dealer_discount_type == 'fixed': + amount = invoice.dealer_discount_amount + if invoice.dealer_discount_type == 'percentage': + amount = (invoice.amount_total * invoice.dealer_discount_percentage)/100 + + # Apply fiscal position + taxes = product_id.taxes_id.filtered(lambda t: t.company_id.id == invoice.company_id.id) + taxes_ids = taxes.ids + if invoice.partner_id and self.fiscal_position_id: + taxes_ids = self.fiscal_position_id.map_tax(taxes, product_id, invoice.partner_id).ids + + # Create the Invoice line + InvoiceLine.create({ + 'name': product_id.name, + 'price_unit': -amount, + 'account_id': account_id, + 'quantity': 1.0, + 'discount': 0.0, + 'uom_id': product_id.uom_id.id, + 'product_id': product_id.id, + 'invoice_id': invoice.id, + 'invoice_line_tax_ids': [(6, 0, taxes_ids)], + 'sequence': 100, + }) + return True diff --git a/ext/custom-addons/tz_dealer_discount/models/res_config.py b/ext/custom-addons/tz_dealer_discount/models/res_config.py new file mode 100644 index 00000000..ad044db7 --- /dev/null +++ b/ext/custom-addons/tz_dealer_discount/models/res_config.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models, api + + +class ResCompany(models.Model): + _inherit = "res.company" + + sale_dealer_discount_product_id = fields.Many2one('product.product', string='Sale Dealer Discount Product') + invoice_dealer_discount_product_id = fields.Many2one('product.product', string='Invoice Dealer Discount Product') + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + sale_dealer_discount_product_id = fields.Many2one('product.product', string='Sale Dealer Discount Product') + invoice_dealer_discount_product_id = fields.Many2one('product.product', string='Invoice Dealer Discount Product') + + @api.model + def get_values(self): + res = super(ResConfigSettings, self).get_values() + res.update( + sale_dealer_discount_product_id=self.env.user.company_id.sale_dealer_discount_product_id and self.env.user.company_id.sale_dealer_discount_product_id.id or False, + invoice_dealer_discount_product_id=self.env.user.company_id.invoice_dealer_discount_product_id and self.env.user.company_id.invoice_dealer_discount_product_id.id or False, + ) + return res + + @api.multi + def set_values(self): + super(ResConfigSettings, self).set_values() + if not self.env.user._is_admin(): + raise AccessError(_("Only administrators can change the settings")) + + self.env.user.company_id.sale_dealer_discount_product_id = self.sale_dealer_discount_product_id.id + self.env.user.company_id.invoice_dealer_discount_product_id = self.invoice_dealer_discount_product_id.id + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/ext/custom-addons/tz_dealer_discount/models/sale.py b/ext/custom-addons/tz_dealer_discount/models/sale.py new file mode 100644 index 00000000..ee694b8d --- /dev/null +++ b/ext/custom-addons/tz_dealer_discount/models/sale.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models, api, _ +from odoo.exceptions import UserError + +class SaleOrder(models.Model): + _inherit = "sale.order" + + dealer_discount = fields.Boolean("Add Dealer Discount", readonly=True, states={'draft': [('readonly', False),],'sent': [('readonly', False)]},) + dealer_discount_type = fields.Selection([('fixed','Fixed'),('percentage','Percentage')], + "Discount Type", readonly=True, states={'draft': [('readonly', False)],'sent': [('readonly', False)]}, default='percentage') + dealer_discount_amount = fields.Float("Discount Amount", readonly=True, states={'draft': [('readonly', False)],'sent': [('readonly', False)]},) + dealer_discount_percentage = fields.Float("Discount Percentage", readonly=True, states={'draft': [('readonly', False)],'sent': [('readonly', False)]},) + + @api.multi + def _dealer_discount_unset(self): + if self.env.user.company_id.sale_dealer_discount_product_id: + self.env['sale.order.line'].search([('order_id', 'in', self.ids), ('product_id', '=', self.env.user.company_id.sale_dealer_discount_product_id.id)]).unlink() + + @api.multi + def create_dealer_discount(self): + Line = self.env['sale.order.line'] + + discount_product_id = self.env.user.company_id.sale_dealer_discount_product_id + if not discount_product_id: + raise UserError(_('Please set Sale Dealer Discount product in General Settings first.')) + + # Remove Discount line first + self._dealer_discount_unset() + + for order in self: + amount = 0 + if order.dealer_discount_type == 'fixed': + discount_text = discount_product_id.name + amount = order.dealer_discount_amount + else: + sep = "; " + discount_text = "-" + str(order.dealer_discount_percentage) + "% " + discount_product_id.name + ", " + discount_pos = "" + n=0 + nd=0 + for line in order.order_line: + n += 1 + if not line.product_id.product_tmpl_id.material_type_id.no_dealer_discount: + nd += 1 + amount += (line.price_subtotal * order.dealer_discount_percentage)/100 + discount_pos += str(n)+sep + if nd>1: + discount_text = discount_text + "Positionen: " + else: + discount_text = discount_text + "Position: " + + discount_text = discount_text + discount_pos.rstrip(sep) + + if amount > 0: + # Create the Sale line + Line.create({ + 'name': discount_text, + 'price_unit': -amount, + 'product_uom_qty': 1.0, + 'discount': 0.0, + 'product_uom': discount_product_id.uom_id.id, + 'product_id': discount_product_id.id, + 'order_id': order.id, + 'sequence': 99999, + }) + + return True diff --git a/ext/custom-addons/tz_dealer_discount/static/description/icon.png b/ext/custom-addons/tz_dealer_discount/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..32c1481da1d0bf07472faac546a3410a249e4d2d GIT binary patch literal 17134 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 R@RbcZa!~(3>OQNh{|CnDkRt#9 literal 0 HcmV?d00001 diff --git a/ext/custom-addons/tz_dealer_discount/views/invoice_view.xml b/ext/custom-addons/tz_dealer_discount/views/invoice_view.xml new file mode 100644 index 00000000..c0671440 --- /dev/null +++ b/ext/custom-addons/tz_dealer_discount/views/invoice_view.xml @@ -0,0 +1,50 @@ + + + + + + account.invoice.form.dealer_discount + account.invoice + + + + + + + + + + + + account.invoice.form.dealer_discount + account.invoice + + + + + + + + + + diff --git a/ext/custom-addons/tz_dealer_discount/views/res_config_view.xml b/ext/custom-addons/tz_dealer_discount/views/res_config_view.xml new file mode 100644 index 00000000..c1213f65 --- /dev/null +++ b/ext/custom-addons/tz_dealer_discount/views/res_config_view.xml @@ -0,0 +1,34 @@ + + + + + res.config.settings + res.config.settings + + + +
+

Dealer Discount Configuration

+
+
+
+
+
+
+
+
+
+
+ +
diff --git a/ext/custom-addons/tz_dealer_discount/views/sale_view.xml b/ext/custom-addons/tz_dealer_discount/views/sale_view.xml new file mode 100644 index 00000000..7be53ede --- /dev/null +++ b/ext/custom-addons/tz_dealer_discount/views/sale_view.xml @@ -0,0 +1,27 @@ + + + + + + sale.order.form.dealer_discount + sale.order + + + + + + + + + +