| @ -0,0 +1,45 @@ | |||||
|  | .. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg | ||||
|  |     :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html | ||||
|  |     :alt: License: AGPL-3 | ||||
|  | 
 | ||||
|  | Sales And Products Performance Report | ||||
|  | ===================================== | ||||
|  | Overall Performance Report of Sales and Products. | ||||
|  | 
 | ||||
|  | Company | ||||
|  | ------- | ||||
|  | * `Cybrosys Techno Solutions <https://cybrosys.com/>`__ | ||||
|  | 
 | ||||
|  | License | ||||
|  | ------- | ||||
|  | GNU AFFERO GENERAL PUBLIC LICENSE Version 3 (AGPL v3) | ||||
|  | (https://www.gnu.org/licenses/agpl-3.0-standalone.html) | ||||
|  | 
 | ||||
|  | Credits | ||||
|  | ------- | ||||
|  | * Developer: (V16) Ansil P V, | ||||
|  |              (V17) Sabeel B, | ||||
|  |              (V18) Bhagyadev KP | ||||
|  | * Contact: odoo@cybrosys.com | ||||
|  | 
 | ||||
|  | Contacts | ||||
|  | -------- | ||||
|  | * Mail Contact : odoo@cybrosys.com | ||||
|  | * Website : https://cybrosys.com | ||||
|  | 
 | ||||
|  | Bug Tracker | ||||
|  | ----------- | ||||
|  | Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. | ||||
|  | 
 | ||||
|  | Maintainer | ||||
|  | ========== | ||||
|  | .. image:: https://cybrosys.com/images/logo.png | ||||
|  |    :target: https://cybrosys.com | ||||
|  | 
 | ||||
|  | This module is maintained by Cybrosys Technologies. | ||||
|  | 
 | ||||
|  | For support and more information, please visit `Our Website <https://cybrosys.com/>`__ | ||||
|  | 
 | ||||
|  | Further information | ||||
|  | =================== | ||||
|  | HTML Description: `<static/description/index.html>`__ | ||||
| @ -0,0 +1,23 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | #    Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Bhagyadev KP (odoo@cybrosys.com) | ||||
|  | # | ||||
|  | #    This program is free software: you can modify | ||||
|  | #    it under the terms of the GNU Affero General Public License (AGPL) 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 <https://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ################################################################################ | ||||
|  | from . import models | ||||
|  | from . import wizard | ||||
| @ -0,0 +1,47 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | #    Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Bhagyadev KP (odoo@cybrosys.com) | ||||
|  | # | ||||
|  | #    This program is free software: you can modify | ||||
|  | #    it under the terms of the GNU Affero General Public License (AGPL) 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 <https://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ################################################################################ | ||||
|  | { | ||||
|  |     'name': "Sales And Products Performance Report", | ||||
|  |     'version': '18.0.1.0.0', | ||||
|  |     'category': 'Sales, Accounting', | ||||
|  |     'summary': 'Performance Report Summary of Sales and Products', | ||||
|  |     'description': "The Overview of Sales and Products Performance Done by" | ||||
|  |                    "Sales Team and Sales Person", | ||||
|  |     'author': 'Cybrosys Techno Solutions', | ||||
|  |     'company': 'Cybrosys Techno Solutions', | ||||
|  |     'maintainer': 'Cybrosys Techno Solutions', | ||||
|  |     'website': 'https://www.cybrosys.com', | ||||
|  |     'depends': ['stock', 'sale_management'], | ||||
|  |     'data': [ | ||||
|  |         'security/ir.model.access.csv', | ||||
|  |         'views/product_template_views.xml', | ||||
|  |         'views/res_users_views.xml', | ||||
|  |         'views/sale_order_menu.xml', | ||||
|  |         'wizard/product_performance_views.xml', | ||||
|  |         'wizard/sales_performance_views.xml', | ||||
|  |     ], | ||||
|  |     'images': ['static/description/banner.jpg'], | ||||
|  |     'license': 'AGPL-3', | ||||
|  |     'installable': True, | ||||
|  |     'auto_install': False, | ||||
|  |     'application': False, | ||||
|  | } | ||||
| @ -0,0 +1,7 @@ | |||||
|  | ## Module <sales_product_performance_report> | ||||
|  | 
 | ||||
|  | #### 15.02.2025 | ||||
|  | #### Version 18.0.1.0.0 | ||||
|  | #### ADD | ||||
|  | 
 | ||||
|  | - Initial commit for Sales And Products Performance Report | ||||
| @ -0,0 +1,24 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | #    Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Bhagyadev KP (odoo@cybrosys.com) | ||||
|  | # | ||||
|  | #    This program is free software: you can modify | ||||
|  | #    it under the terms of the GNU Affero General Public License (AGPL) 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 <https://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ################################################################################ | ||||
|  | from . import product_template | ||||
|  | from . import res_users | ||||
|  | from . import sale_order | ||||
| @ -0,0 +1,142 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | #    Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Bhagyadev KP (odoo@cybrosys.com) | ||||
|  | # | ||||
|  | #    This program is free software: you can modify | ||||
|  | #    it under the terms of the GNU Affero General Public License (AGPL) 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 <https://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ################################################################################ | ||||
|  | from odoo import fields, models, _ | ||||
|  | from odoo.exceptions import UserError | ||||
|  | from odoo.http import request | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class ProductTemplate(models.Model): | ||||
|  |     """Inherits the product template for adding fields and methods""" | ||||
|  |     _inherit = 'product.template' | ||||
|  | 
 | ||||
|  |     stock_warehouse_id = fields.Many2one( | ||||
|  |         comodel_name='stock.warehouse', | ||||
|  |         string='Warehouse', | ||||
|  |         help="Warehouse Selection", | ||||
|  |         domain="[('company_id', '=', " | ||||
|  |                "company_id)]" | ||||
|  |     ) | ||||
|  |     quantity = fields.Float( | ||||
|  |         string='On Hand', | ||||
|  |         help=' for Quantity' | ||||
|  |     ) | ||||
|  |     revenue = fields.Float( | ||||
|  |         string="Revenue", | ||||
|  |         help='Float Field for Revenue ' | ||||
|  |     ) | ||||
|  |     total_order = fields.Integer( | ||||
|  |         string="ToTal Order", | ||||
|  |         help='Float Field for Total Order' | ||||
|  |     ) | ||||
|  |     ordered_quantities = fields.Integer( | ||||
|  |         string="Ordered Quantities", | ||||
|  |         help='for Ordered Quantities' | ||||
|  |     ) | ||||
|  |     delivered_quantities = fields.Integer( | ||||
|  |         string="Delivered Quantities", | ||||
|  |         help='for Ordered Quantities' | ||||
|  |     ) | ||||
|  |     returned_quantities = fields.Integer( | ||||
|  |         string="Returned Quantities", | ||||
|  |         help='for Ordered Quantities' | ||||
|  |     ) | ||||
|  |     avg_price = fields.Float( | ||||
|  |         string="Avg Price", | ||||
|  |         help='Avg Price of Products' | ||||
|  |     ) | ||||
|  |     avg_qty_order = fields.Float( | ||||
|  |         string="Avg Qty Per Order", | ||||
|  |         help='Average Quantity Order' | ||||
|  |     ) | ||||
|  |     avg_stock = fields.Integer( | ||||
|  |         string="Avg Stock", | ||||
|  |         help='Avg Stock of Products' | ||||
|  |     ) | ||||
|  | 
 | ||||
|  |     def performance_values(self, start_date, end_date, up_to_date): | ||||
|  |         """ | ||||
|  |         For Calculate Performance Values | ||||
|  |         :param start_date: for get records after the date . | ||||
|  |         :param end_date: for get records before the date. | ||||
|  |         :param up_to_date: for up_to_date records. | ||||
|  |         """ | ||||
|  |         domain = [('product_template_id', '=', self.id)] | ||||
|  |         if not up_to_date: | ||||
|  |             if start_date: | ||||
|  |                 domain.append(('order_id.date_order', '>=', start_date)) | ||||
|  |             if end_date: | ||||
|  |                 domain.append(('order_id.date_order', '<=', end_date)) | ||||
|  |         sale_order = self.env['sale.order.line'].search(domain) | ||||
|  |         product_variant = self.env['product.product'].search([ | ||||
|  |             ('product_tmpl_id', '=', self.id)]) | ||||
|  |         stock_quant = self.env['stock.quant'].search([ | ||||
|  |             ('product_id', '=', product_variant[0].id)]) | ||||
|  |         self.quantity = self.qty_available | ||||
|  |         self.stock_warehouse_id = stock_quant.location_id.warehouse_id | ||||
|  |         self.delivered_quantities = sum(sale_order.mapped('qty_delivered')) | ||||
|  |         self.ordered_quantities = sum(sale_order.mapped('product_uom_qty')) | ||||
|  |         self.total_order = len(sale_order) | ||||
|  |         self.avg_stock = (self.ordered_quantities / self.total_order) \ | ||||
|  |             if self.total_order != 0 else 0 | ||||
|  |         self.avg_qty_order = self.delivered_quantities / self.total_order \ | ||||
|  |             if self.total_order != 0 else 0.00 | ||||
|  |         self.avg_price = (sum(sale_order.mapped('price_unit')) / | ||||
|  |                           self.total_order) if self.total_order != 0 else 0.00 | ||||
|  |         self.revenue = 0 | ||||
|  |         for line in sale_order: | ||||
|  |             self.revenue += line.price_subtotal | ||||
|  |             return_qty = self.env['stock.move'].search( | ||||
|  |                 [('sale_line_id', '=', line.id), | ||||
|  |                  ('picking_id.sale_id', '=', line.order_id.id), | ||||
|  |                  ('picking_type_id.code', '=', 'incoming')]) | ||||
|  |             if return_qty.quantity: | ||||
|  |                 self.returned_quantities = return_qty.quantity | ||||
|  | 
 | ||||
|  |     def action_sale_order(self): | ||||
|  |         """ | ||||
|  |             action for get sale orders done with this product | ||||
|  |             return: to sale order list view and form view | ||||
|  |         """ | ||||
|  |         domain = [('product_template_id', '=', self.id)] | ||||
|  |         if not self._context['up_to_date']: | ||||
|  |             if self._context['start_date']: | ||||
|  |                 domain.append( | ||||
|  |                     ('order_id.date_order', '>=', self._context['start_date'])) | ||||
|  |             if self._context['end_date']: | ||||
|  |                 domain.append( | ||||
|  |                     ('order_id.date_order', '<=', self._context['end_date'])) | ||||
|  |         sale_order = self.env['sale.order.line'].search(domain) | ||||
|  |         orders = [order.order_id.id for order in sale_order] | ||||
|  |         list_view_id = request.env.ref('sale.view_order_tree').id | ||||
|  |         form_view_id = request.env.ref( | ||||
|  |             'sale.view_order_form').id | ||||
|  |         if orders: | ||||
|  |             return { | ||||
|  |                 'name': _('Product Performance Report'), | ||||
|  |                 'res_model': 'sale.order', | ||||
|  |                 'views': [(list_view_id, 'list'), (form_view_id, 'form')], | ||||
|  |                 'type': 'ir.actions.act_window', | ||||
|  |                 'target': 'self', | ||||
|  |                 'domain': [('id', 'in', orders)] | ||||
|  |             } | ||||
|  |         else: | ||||
|  |             raise UserError(_("No Orders with this Product!")) | ||||
| @ -0,0 +1,138 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | #    Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Bhagyadev KP (odoo@cybrosys.com) | ||||
|  | # | ||||
|  | #    This program is free software: you can modify | ||||
|  | #    it under the terms of the GNU Affero General Public License (AGPL) 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 <https://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ################################################################################ | ||||
|  | from odoo import fields, models, _ | ||||
|  | from odoo.exceptions import UserError | ||||
|  | from odoo.http import request | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class ResUsers(models.Model): | ||||
|  |     """Inherits the User model for adding fields and methods""" | ||||
|  |     _inherit = 'res.users' | ||||
|  | 
 | ||||
|  |     warehouse_id = fields.Many2one( | ||||
|  |         comodel_name='stock.warehouse', | ||||
|  |         string='Warehouse', | ||||
|  |         domain="[('company_id', '=', company_id)]" | ||||
|  |     ) | ||||
|  |     estimated_revenue = fields.Float( | ||||
|  |         string="Estimated Revenue", | ||||
|  |         help='Estimated Revenue of orders done by' | ||||
|  |              'the user' | ||||
|  |     ) | ||||
|  |     net_revenue = fields.Float( | ||||
|  |         string="Net Revenue", | ||||
|  |         help='Net Revenue of orders' | ||||
|  |     ) | ||||
|  |     total_sale_order = fields.Integer( | ||||
|  |         string="ToTal Order", | ||||
|  |         help='No of Total Orders' | ||||
|  |     ) | ||||
|  |     sale_order_done = fields.Integer( | ||||
|  |         string="Sale Order Done", | ||||
|  |         help='No of Done Sale Orders' | ||||
|  |     ) | ||||
|  |     returned_orders = fields.Integer( | ||||
|  |         string="Returned Orders", | ||||
|  |         help='No of Returned Orders' | ||||
|  |     ) | ||||
|  |     avg_price = fields.Float( | ||||
|  |         string="Avg Price", | ||||
|  |         help='Average Price' | ||||
|  |     ) | ||||
|  |     overall_performance = fields.Float( | ||||
|  |         string="Over All%", | ||||
|  |         help='Overall Performance' | ||||
|  |     ) | ||||
|  |     overall_performance_separate = fields.Float( | ||||
|  |         string="Over All Separated", | ||||
|  |         help='Overall Performance of ' | ||||
|  |              'Sales Person Done with ' | ||||
|  |              'Different Sales Team' | ||||
|  |     ) | ||||
|  | 
 | ||||
|  |     def performance_values(self, sale_person, start_date, end_date, up_to_date): | ||||
|  |         """ | ||||
|  |             For Calculate Performance Values | ||||
|  |             :param sale_person: for get sale_person . | ||||
|  |             :param start_date: for get records after the date . | ||||
|  |             :param end_date: for get records before the date. | ||||
|  |             :param up_to_date: for up_to_date records. | ||||
|  |         """ | ||||
|  |         domain = [ | ||||
|  |             ('team_id', '=', self.sale_team_id.id), | ||||
|  |             ('user_id', '=', sale_person.id) | ||||
|  |         ] | ||||
|  |         if not up_to_date: | ||||
|  |             if start_date: | ||||
|  |                 domain.append(('date_order', '>=', start_date)) | ||||
|  |             if end_date: | ||||
|  |                 domain.append(('date_order', '<=', end_date)) | ||||
|  |         sale_order = self.env['sale.order'].search(domain) | ||||
|  |         self.total_sale_order = len(sale_order) | ||||
|  |         domain.append(('state', '=', 'sale')) | ||||
|  |         self.sale_order_done = len(self.env['sale.order'].search(domain)) | ||||
|  |         self.net_revenue = sum(self.env['sale.order'].search | ||||
|  |                                (domain).mapped('amount_total')) | ||||
|  |         self.estimated_revenue = sum(sale_order.mapped('amount_total')) | ||||
|  |         self.avg_price = self.estimated_revenue / self.total_sale_order \ | ||||
|  |             if self.total_sale_order else None | ||||
|  |         return_order = self.env['stock.picking'].search([ | ||||
|  |             ('sale_id', 'in', sale_order.ids), | ||||
|  |             ('picking_type_id.code', '=', "incoming") | ||||
|  |         ]) | ||||
|  |         self.returned_orders = len(return_order) | ||||
|  |         overall_order = self.env['sale.order'].search_count([]) | ||||
|  |         self.overall_performance = ( | ||||
|  |                 (self.total_sale_order / overall_order) * 100) | ||||
|  |         separate_order = self.env['sale.order'].search_count([ | ||||
|  |             ('team_id', '!=', self.sale_team_id.id), | ||||
|  |             ('user_id', '=', sale_person.id)]) | ||||
|  |         self.overall_performance_separate = ( | ||||
|  |                 (separate_order / overall_order) * 100) | ||||
|  | 
 | ||||
|  |     def action_sale_order(self): | ||||
|  |         """ | ||||
|  |             action for get sale orders done with this product | ||||
|  |             return: to sale order list view and form view | ||||
|  |         """ | ||||
|  |         domain = [('user_id', '=', self.id)] | ||||
|  |         if not self._context['up_to_date']: | ||||
|  |             if self._context['start_date']: | ||||
|  |                 domain.append(('date_order', '>=', | ||||
|  |                                self._context['start_date'])) | ||||
|  |             if self._context['end_date']: | ||||
|  |                 domain.append(('date_order', '<=', self._context['end_date'])) | ||||
|  |         sale_order = self.env['sale.order'].search(domain).mapped('id') | ||||
|  |         list_view_id = request.env.ref('sale.view_order_tree').id | ||||
|  |         form_view_id = request.env.ref( | ||||
|  |             'sale.view_order_form').id | ||||
|  |         if sale_order: | ||||
|  |             return { | ||||
|  |                 'name': _('Sales Order Report'), | ||||
|  |                 'res_model': 'sale.order', | ||||
|  |                 'views': [(list_view_id, 'list'), (form_view_id, 'form')], | ||||
|  |                 'type': 'ir.actions.act_window', | ||||
|  |                 'target': 'self', | ||||
|  |                 'domain': [('id', 'in', sale_order) if sale_order else None], | ||||
|  |             } | ||||
|  |         else: | ||||
|  |             raise UserError(_("No Orders done by this Sales Person!")) | ||||
| @ -0,0 +1,53 @@ | |||||
|  | # -*- coding: utf-8 -*- | ||||
|  | ################################################################################ | ||||
|  | # | ||||
|  | #    Cybrosys Technologies Pvt. Ltd. | ||||
|  | #    Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | ||||
|  | #    Author: Bhagyadev KP (odoo@cybrosys.com) | ||||
|  | # | ||||
|  | #    This program is free software: you can modify | ||||
|  | #    it under the terms of the GNU Affero General Public License (AGPL) 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 <https://www.gnu.org/licenses/>. | ||||
|  | # | ||||
|  | ################################################################################ | ||||
|  | from odoo import api, models, _ | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | class SaleOrder(models.Model): | ||||
|  |     """Inherits the sale order model for creating the product performance report""" | ||||
|  |     _inherit = 'sale.order' | ||||
|  | 
 | ||||
|  |     @api.model | ||||
|  |     def action_product_performance_report(self): | ||||
|  |         """ | ||||
|  |             action for get product performance report | ||||
|  |         """ | ||||
|  |         return { | ||||
|  |             'name': _('Product Performance'), | ||||
|  |             'type': 'ir.actions.act_window', | ||||
|  |             'view_mode': 'form', | ||||
|  |             'res_model': 'product.performance', | ||||
|  |             'target': 'new', | ||||
|  |         } | ||||
|  | 
 | ||||
|  |     @api.model | ||||
|  |     def action_sales_performance_report(self): | ||||
|  |         """ | ||||
|  |             action for get sales performance report | ||||
|  |         """ | ||||
|  |         return { | ||||
|  |             'name': _('Sales Performance'), | ||||
|  |             'type': 'ir.actions.act_window', | ||||
|  |             'view_mode': 'form', | ||||
|  |             'res_model': 'sales.performance', | ||||
|  |             'target': 'new', | ||||
|  |         } | ||||
| 
 | 
| After Width: | Height: | Size: 2.2 KiB | 
| After Width: | Height: | Size: 28 KiB | 
| After Width: | Height: | Size: 628 KiB | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 210 KiB | 
| After Width: | Height: | Size: 209 KiB | 
| After Width: | Height: | Size: 109 KiB | 
| After Width: | Height: | Size: 495 B | 
| After Width: | Height: | Size: 1.0 KiB | 
| After Width: | Height: | Size: 624 B | 
| After Width: | Height: | Size: 136 KiB | 
| After Width: | Height: | Size: 214 KiB | 
| After Width: | Height: | Size: 36 KiB | 
| After Width: | Height: | Size: 3.6 KiB | 
| After Width: | Height: | Size: 310 B | 
| After Width: | Height: | Size: 929 B | 
| After Width: | Height: | Size: 1.3 KiB | 
| After Width: | Height: | Size: 3.3 KiB | 
| After Width: | Height: | Size: 1.4 KiB | 
| After Width: | Height: | Size: 17 KiB | 
| After Width: | Height: | Size: 542 B | 
| After Width: | Height: | Size: 576 B | 
| After Width: | Height: | Size: 733 B | 
| After Width: | Height: | Size: 4.3 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 4.0 KiB | 
| After Width: | Height: | Size: 1.7 KiB | 
| After Width: | Height: | Size: 738 KiB | 
| After Width: | Height: | Size: 2.2 KiB | 
| After Width: | Height: | Size: 911 B | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 600 B | 
| After Width: | Height: | Size: 673 B | 
| After Width: | Height: | Size: 2.0 KiB | 
| After Width: | Height: | Size: 462 B | 
| After Width: | Height: | Size: 2.1 KiB | 
| After Width: | Height: | Size: 926 B | 
| After Width: | Height: | Size: 9.0 KiB | 
| After Width: | Height: | Size: 23 KiB | 
| After Width: | Height: | Size: 7.0 KiB | 
| After Width: | Height: | Size: 878 B | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 653 B | 
| After Width: | Height: | Size: 800 B | 
| After Width: | Height: | Size: 905 B | 
| After Width: | Height: | Size: 189 KiB | 
| After Width: | Height: | Size: 4.3 KiB | 
| After Width: | Height: | Size: 839 B | 
| After Width: | Height: | Size: 1.7 KiB | 
| After Width: | Height: | Size: 5.9 KiB | 
| After Width: | Height: | Size: 1.6 KiB | 
| After Width: | Height: | Size: 34 KiB | 
| After Width: | Height: | Size: 26 KiB | 
| After Width: | Height: | Size: 3.8 KiB | 
| After Width: | Height: | Size: 23 KiB | 
| After Width: | Height: | Size: 1.9 KiB | 
| After Width: | Height: | Size: 2.3 KiB | 
| After Width: | Height: | Size: 427 B | 
| After Width: | Height: | Size: 627 B | 
| After Width: | Height: | Size: 1.1 KiB | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 988 B | 
| After Width: | Height: | Size: 3.7 KiB | 
| After Width: | Height: | Size: 5.0 KiB | 
| After Width: | Height: | Size: 875 B | 
| After Width: | Height: | Size: 1.2 KiB | 
| After Width: | Height: | Size: 767 KiB | 
| After Width: | Height: | Size: 138 KiB | 
| After Width: | Height: | Size: 760 KiB | 
| After Width: | Height: | Size: 92 KiB | 
| After Width: | Height: | Size: 697 KiB | 
| After Width: | Height: | Size: 1.1 MiB | 
| After Width: | Height: | Size: 168 KiB | 
| After Width: | Height: | Size: 128 KiB | 
| After Width: | Height: | Size: 128 KiB | 
| After Width: | Height: | Size: 61 KiB | 
| After Width: | Height: | Size: 72 KiB | 
| After Width: | Height: | Size: 62 KiB | 
| After Width: | Height: | Size: 153 KiB | 
| After Width: | Height: | Size: 128 KiB | 
| After Width: | Height: | Size: 128 KiB | 
| After Width: | Height: | Size: 132 KiB | 
| After Width: | Height: | Size: 134 KiB | 
| After Width: | Height: | Size: 134 KiB | 
| After Width: | Height: | Size: 139 KiB | 
| After Width: | Height: | Size: 215 KiB | 
| After Width: | Height: | Size: 168 KiB | 
| After Width: | Height: | Size: 1.0 MiB | 
| After Width: | Height: | Size: 880 KiB |