From 57e4f8ea9f46a2c1bc0677ad8ebaaa18a4fc8945 Mon Sep 17 00:00:00 2001 From: cybroodoo Date: Tue, 29 Dec 2015 12:49:28 +0530 Subject: [PATCH] updated reports --- sale_discount_total/__openerp__.py | 4 +- sale_discount_total/__openerp__.py~ | 30 ++++++ sale_discount_total/models/account_invoice.py | 2 +- .../models/account_invoice.py~ | 88 ++++++++++++++++++ sale_discount_total/models/sale.py | 4 +- sale_discount_total/models/sale.py~ | 91 +++++++++++++++++++ sale_discount_total/views/invoice_report.xml | 83 +++++++++++++++++ .../views/sale_order_report.xml | 40 ++++++++ 8 files changed, 338 insertions(+), 4 deletions(-) create mode 100644 sale_discount_total/__openerp__.py~ create mode 100644 sale_discount_total/models/account_invoice.py~ create mode 100644 sale_discount_total/models/sale.py~ create mode 100644 sale_discount_total/views/invoice_report.xml create mode 100644 sale_discount_total/views/sale_order_report.xml diff --git a/sale_discount_total/__openerp__.py b/sale_discount_total/__openerp__.py index 6906c9c41..a3c8f2194 100644 --- a/sale_discount_total/__openerp__.py +++ b/sale_discount_total/__openerp__.py @@ -20,7 +20,9 @@ Module to manage discount for total amount in Sale. 'depends': ['sale', 'base', 'stock'], 'data': [ 'views/sale_view.xml', - 'views/account_invoice_view.xml' + 'views/account_invoice_view.xml', + 'views/invoice_report.xml', + 'views/sale_order_report.xml' ], 'demo': [ diff --git a/sale_discount_total/__openerp__.py~ b/sale_discount_total/__openerp__.py~ new file mode 100644 index 000000000..6906c9c41 --- /dev/null +++ b/sale_discount_total/__openerp__.py~ @@ -0,0 +1,30 @@ +{ + 'name': 'Sale Discount for Total Amount', + 'version': '1.0', + 'category': 'sale', + 'sequence': 6, + 'summary': "extension of default Sale Management module meant to provide discount for total amount", + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'website': 'http://www.cybrosys.com', + + 'description': """ + +Sale Discount for Total Amount +======================= +Module to manage discount for total amount in Sale. + Two Type of Discount, + Discount by a fixed value, + Discount by a percentage... +""", + 'depends': ['sale', 'base', 'stock'], + 'data': [ + 'views/sale_view.xml', + 'views/account_invoice_view.xml' + + ], + 'demo': [ + ], + 'installable': True, + 'auto_install': False, +} diff --git a/sale_discount_total/models/account_invoice.py b/sale_discount_total/models/account_invoice.py index e7ce609cd..6912f4c87 100644 --- a/sale_discount_total/models/account_invoice.py +++ b/sale_discount_total/models/account_invoice.py @@ -19,7 +19,7 @@ class AccountInvoice(models.Model): discount_type = fields.Selection([('percent', 'Percentage'), ('amount', 'Amount')], 'Discount Type', readonly=True, states={'draft': [('readonly', False)]}) - discount_rate = fields.Float('Discount rate', digits_compute=dp.get_precision('Account'), readonly=True, + discount_rate = fields.Float('Discount Rate', digits_compute=dp.get_precision('Account'), readonly=True, states={'draft': [('readonly', False)]}) amount_discount = fields.Float(string='Discount', digits=dp.get_precision('Account'), readonly=True, compute='_compute_amount') diff --git a/sale_discount_total/models/account_invoice.py~ b/sale_discount_total/models/account_invoice.py~ new file mode 100644 index 000000000..e7ce609cd --- /dev/null +++ b/sale_discount_total/models/account_invoice.py~ @@ -0,0 +1,88 @@ +from openerp import api, models, fields +from openerp.osv import osv +import openerp.addons.decimal_precision as dp + + +class AccountInvoice(models.Model): + _inherit = "account.invoice" + + @api.one + @api.depends('invoice_line.price_subtotal', 'tax_line.amount') + def _compute_amount(self): + self.amount_untaxed = sum(line.price_subtotal for line in self.invoice_line) + self.amount_tax = sum(line.amount for line in self.tax_line) + if self.discount_type == 'percent': + self.amount_discount = ((self.amount_untaxed + self.amount_tax) * self.discount_rate) / 100 + elif self.discount_type == 'amount': + self.amount_discount = self.discount_rate + self.amount_total = self.amount_untaxed + self.amount_tax - self.amount_discount + + discount_type = fields.Selection([('percent', 'Percentage'), ('amount', 'Amount')], 'Discount Type', readonly=True, + states={'draft': [('readonly', False)]}) + discount_rate = fields.Float('Discount rate', digits_compute=dp.get_precision('Account'), readonly=True, + states={'draft': [('readonly', False)]}) + amount_discount = fields.Float(string='Discount', digits=dp.get_precision('Account'), + readonly=True, compute='_compute_amount') + amount_untaxed = fields.Float(string='Subtotal', digits=dp.get_precision('Account'), + readonly=True, compute='_compute_amount', track_visibility='always') + amount_tax = fields.Float(string='Tax', digits=dp.get_precision('Account'), + readonly=True, compute='_compute_amount') + amount_total = fields.Float(string='Total', digits=dp.get_precision('Account'), + readonly=True, compute='_compute_amount') + + @api.onchange('discount_type', 'discount_rate') + def compute_discount(self): + for inv in self: + amount = sum(line.price_subtotal for line in self.invoice_line) + tax = sum(line.amount for line in self.tax_line) + if inv.discount_type == 'percent': + if inv.discount_rate == 100: + disc_amnt = amount + tax + else: + disc_amnt = (amount + tax) * inv.discount_rate / 100 + total = amount + tax - disc_amnt + self.amount_discount = disc_amnt + self.amount_total = total + else: + total = (amount + tax) - inv.discount_rate + self.amount_discount = inv.discount_rate + self.amount_total = total + + @api.model + def _prepare_refund(self, invoice, date=None, period_id=None, description=None, journal_id=None): + res = super(AccountInvoice, self)._prepare_refund(invoice, date, period_id, + description, journal_id) + res.update({ + 'discount_type': self.discount_type, + 'discount_rate': self.discount_rate, + }) + return res + + +class invoice_line(osv.Model): + _inherit = 'account.invoice.line' + + def move_line_get(self, cr, uid, invoice_id, context=None): + res = super(invoice_line, self).move_line_get(cr, uid, invoice_id, context=context) + inv = self.pool.get('account.invoice').browse(cr, uid, invoice_id, context=context) + + if inv.type in ('out_invoice', 'out_refund') and inv.discount_type: + prop = self.pool.get('ir.property').get(cr, uid, 'property_account_income_categ', 'product.category', + context=context) + prop_id = prop and prop.id or False + account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, inv.fiscal_position or False, + prop_id) + sign = -1 + + res.append({ + 'name': 'Discount', + 'price_unit': sign * inv.amount_discount, + 'quantity': 1, + 'price': sign * inv.amount_discount, + 'account_id': account_id, + 'product_id': False, + 'uos_id': False, + 'account_analytic_id': False, + 'taxes': False, + }) + return res diff --git a/sale_discount_total/models/sale.py b/sale_discount_total/models/sale.py index 7ad50b7f9..d07f29394 100644 --- a/sale_discount_total/models/sale.py +++ b/sale_discount_total/models/sale.py @@ -41,8 +41,8 @@ class SaleOrder(osv.Model): _columns = { 'discount_type': fields.selection([ ('percent', 'Percentage'), - ('amount', 'Amount')], 'Discount type'), - 'discount_rate': fields.float('Discount Amount', digits_compute=dp.get_precision('Account'), + ('amount', 'Amount')], 'Discount Type'), + 'discount_rate': fields.float('Discount Rate', digits_compute=dp.get_precision('Account'), readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, ), 'amount_discount': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Discount', diff --git a/sale_discount_total/models/sale.py~ b/sale_discount_total/models/sale.py~ new file mode 100644 index 000000000..7ad50b7f9 --- /dev/null +++ b/sale_discount_total/models/sale.py~ @@ -0,0 +1,91 @@ +from openerp.osv import fields, osv +from openerp import api +import openerp.addons.decimal_precision as dp + + +class SaleOrder(osv.Model): + _inherit = 'sale.order' + + def _amount_all(self, cr, uid, ids, field_name, arg, context=None): + cur_obj = self.pool.get('res.currency') + res = {} + for order in self.browse(cr, uid, ids, context=context): + res[order.id] = { + 'amount_untaxed': 0.0, + 'amount_discount': 0.0, + 'amount_tax': 0.0, + 'amount_total': 0.0, + } + val = val1 = val2 = 0.0 + cur = order.pricelist_id.currency_id + for line in order.order_line: + val1 += line.price_subtotal + val += self._amount_line_tax(cr, uid, line, context=context) + if order.discount_type == 'amount': + val2 = order.discount_rate + elif order.discount_type == 'percent': + val2 = ((val1 + val) * order.discount_rate) / 100 + res[order.id]['amount_tax'] = cur_obj.round(cr, uid, cur, val) + res[order.id]['amount_untaxed'] = cur_obj.round(cr, uid, cur, val1) + res[order.id]['amount_discount'] = cur_obj.round(cr, uid, cur, val2) + res[order.id]['amount_total'] = res[order.id]['amount_untaxed'] + res[order.id]['amount_tax'] - \ + res[order.id]['amount_discount'] + return res + + def _get_order(self, cr, uid, ids, context=None): + result = {} + for line in self.pool.get('sale.order.line').browse(cr, uid, ids, context=context): + result[line.order_id.id] = True + return result.keys() + + _columns = { + 'discount_type': fields.selection([ + ('percent', 'Percentage'), + ('amount', 'Amount')], 'Discount type'), + 'discount_rate': fields.float('Discount Amount', digits_compute=dp.get_precision('Account'), + readonly=True, + states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, ), + 'amount_discount': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Discount', + multi='sums', help="The total discount."), + 'amount_untaxed': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), + string='Untaxed Amount', + multi='sums', help="The amount without tax.", track_visibility='always'), + 'amount_tax': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Taxes', + multi='sums', help="The tax amount."), + 'amount_total': fields.function(_amount_all, digits_compute=dp.get_precision('Account'), string='Total', + multi='sums', help="The total amount."), + } + + _defaults = { + 'discount_type': 'percent', + } + + @api.onchange('discount_type', 'discount_rate') + def compute_discount(self): + for order in self: + val1 = val2 = 0.0 + for line in order.order_line: + val1 += line.price_subtotal + val2 += self._amount_line_tax(line) + if order.discount_type == 'percent': + if order.discount_rate == 100: + disc_amnt = val1 + val2 + else: + disc_amnt = (val1 + val2) * order.discount_rate / 100 + total = val1 + val2 - disc_amnt + self.currency_id = order.pricelist_id.currency_id + self.amount_discount = disc_amnt + self.amount_total = total + else: + total = (val1 + val2) - order.discount_rate + self.currency_id = order.pricelist_id.currency_id + self.amount_discount = order.discount_rate + self.amount_total = total + + def _prepare_invoice(self, cr, uid, order, lines, context=None): + invoice_vals = super(SaleOrder, self)._prepare_invoice(cr, uid, order, lines, context=context) + invoice_vals.update({ + 'discount_type': order.discount_type, + 'discount_rate': order.discount_rate + }) + return invoice_vals diff --git a/sale_discount_total/views/invoice_report.xml b/sale_discount_total/views/invoice_report.xml new file mode 100644 index 000000000..721181872 --- /dev/null +++ b/sale_discount_total/views/invoice_report.xml @@ -0,0 +1,83 @@ + + + + + + \ No newline at end of file diff --git a/sale_discount_total/views/sale_order_report.xml b/sale_discount_total/views/sale_order_report.xml new file mode 100644 index 000000000..53a9270a6 --- /dev/null +++ b/sale_discount_total/views/sale_order_report.xml @@ -0,0 +1,40 @@ + + + + + + \ No newline at end of file