diff --git a/gatepass_slip/README.rst b/gatepass_slip/README.rst new file mode 100644 index 000000000..a7107321b --- /dev/null +++ b/gatepass_slip/README.rst @@ -0,0 +1,36 @@ +Gatepass +======== + +Gatepass tickets for delivery orders. + + +Installation +============ +- www.odoo.com/documentation/11.0/setup/install.html +- Install our custom addon + +License +======= +GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPLv3) +(http://www.gnu.org/licenses/agpl.html) + +Bug Tracker +=========== +Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. + +Credits +======= +* Cybrosys Techno Solutions + +Author +------ + +Developer: Sayooj AO @ Cybrosys + +Maintainer +---------- + +This module is maintained by Cybrosys Technologies. + +For support and more information, please visit https://www.cybrosys.com. + diff --git a/gatepass_slip/__init__.py b/gatepass_slip/__init__.py new file mode 100644 index 000000000..fc4aa4573 --- /dev/null +++ b/gatepass_slip/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +################################################################################### +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies (). +# Author: Sayooj A O() +# +# This program is free software: you can modify +# it under the terms of the GNU Lesser General Public License(LGPLv3) 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 Lesser 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 . +# +################################################################################### +from . import models diff --git a/gatepass_slip/__manifest__.py b/gatepass_slip/__manifest__.py new file mode 100644 index 000000000..8f25e5505 --- /dev/null +++ b/gatepass_slip/__manifest__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +################################################################################### +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies (). +# Author: Sayooj A O() +# +# This program is free software: you can modify +# it under the terms of the GNU Lesser General Public License(LGPLv3) 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 Lesser 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 . +# +################################################################################### +{ + 'name': 'Gatepass', + 'summary': """Generating Gate pass slip in delivery orders""", + 'version': '11.0.1.0.0', + 'description': """Generating Gate pass slip in delivery orders""", + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'website': 'http://www.cybrosys.com', + 'category': 'Inventory', + 'depends': ['base', 'stock'], + 'license': 'LGPL-3', + 'data': [ + 'views/gate_pass_details_views.xml', + 'report/gate_pass_template.xml', + 'report/gate_pass_report.xml', + # 'security/ir.model.access.csv', + + ], + 'demo': [], + 'images': ['static/description/banner.png'], + 'installable': True, + 'auto_install': False, +} diff --git a/gatepass_slip/doc/RELEASE_NOTES.md b/gatepass_slip/doc/RELEASE_NOTES.md new file mode 100755 index 000000000..edd0bbe7d --- /dev/null +++ b/gatepass_slip/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 06.04.2019 +#### Version 11.0.1.0.0 +##### ADD +- Initial commit diff --git a/gatepass_slip/models/__init__.py b/gatepass_slip/models/__init__.py new file mode 100644 index 000000000..8ba309dab --- /dev/null +++ b/gatepass_slip/models/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +################################################################################### +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2018-TODAY Cybrosys Technologies (). +# Author: Sayooj A O() +# +# This program is free software: you can modify +# it under the terms of the GNU Lesser General Public License(LGPLv3) 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 Lesser 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 . +# +################################################################################### +from . import gate_pass_details \ No newline at end of file diff --git a/gatepass_slip/models/gate_pass_details.py b/gatepass_slip/models/gate_pass_details.py new file mode 100644 index 000000000..fb84aa8f0 --- /dev/null +++ b/gatepass_slip/models/gate_pass_details.py @@ -0,0 +1,13 @@ +from odoo import models,api,fields + + +class GatePass(models.Model): + + _inherit = 'stock.picking' + + enable_order_line = fields.Boolean(string='Include Product Details', default=True) + vehicle_no = fields.Char(string='Vehicle Number') + vehicle_driver_name = fields.Char(string='Driver Name') + driver_contact_number = fields.Char(string='Contact No') + corresponding_company = fields.Char(string='Company') + diff --git a/gatepass_slip/report/gate_pass_report.xml b/gatepass_slip/report/gate_pass_report.xml new file mode 100644 index 000000000..037bf4a18 --- /dev/null +++ b/gatepass_slip/report/gate_pass_report.xml @@ -0,0 +1,28 @@ + + + + + Gate Pass + + custom + 150 + 240 + Portrait + 40 + 5 + 5 + 5 + + 40 + 90 + + + + \ No newline at end of file diff --git a/gatepass_slip/report/gate_pass_template.xml b/gatepass_slip/report/gate_pass_template.xml new file mode 100644 index 000000000..e6a5b60fa --- /dev/null +++ b/gatepass_slip/report/gate_pass_template.xml @@ -0,0 +1,119 @@ + + + + + + \ No newline at end of file diff --git a/gatepass_slip/static/description/banner.png b/gatepass_slip/static/description/banner.png new file mode 100644 index 000000000..ddb7f710b Binary files /dev/null and b/gatepass_slip/static/description/banner.png differ diff --git a/gatepass_slip/static/description/gate_pass_details.png b/gatepass_slip/static/description/gate_pass_details.png new file mode 100644 index 000000000..e22dbf252 Binary files /dev/null and b/gatepass_slip/static/description/gate_pass_details.png differ diff --git a/gatepass_slip/static/description/gate_pass_print.png b/gatepass_slip/static/description/gate_pass_print.png new file mode 100644 index 000000000..5dc68b753 Binary files /dev/null and b/gatepass_slip/static/description/gate_pass_print.png differ diff --git a/gatepass_slip/static/description/gate_pass_report.png b/gatepass_slip/static/description/gate_pass_report.png new file mode 100644 index 000000000..8b49d34bd Binary files /dev/null and b/gatepass_slip/static/description/gate_pass_report.png differ diff --git a/gatepass_slip/static/description/icon.png b/gatepass_slip/static/description/icon.png new file mode 100644 index 000000000..bde7e7efb Binary files /dev/null and b/gatepass_slip/static/description/icon.png differ diff --git a/gatepass_slip/static/description/index.html b/gatepass_slip/static/description/index.html new file mode 100644 index 000000000..17295eef9 --- /dev/null +++ b/gatepass_slip/static/description/index.html @@ -0,0 +1,354 @@ + +
+
+

+ Gatepass +

+

+ Module For generating gatepass tickets for delivery orders +

+
+ Cybrosys Technologies +
+ +
+ cybrosys technologies +
+
+
+
+ +
+
+

+ Overview +

+

+ Gatepass modules helps to generate gatepass tickets including the details of the vehicle,driver and the information about the + company which the vehicle belongs to with entry date and time.And the information of the products in the delivery order. +

+

+ Configuration +

+

+ No additional configuration required +

+
+
+ +
+
+

+ Features +

+

+ + Creating the details of Gatepass with details of Vehicle number,Driver's name,Contact information of the driver, + company of the driver +

+

+ + Information about the products in the delivery order also provided in the ticket. + This can be enable from the "Gatepass details'" form +

+

+ + Printing Gatepass ticket +

+
+
+ +
+
+

+ Screenshots +

+

+ + Here we can fill the details regarding to the Gate Pass +

+
+ +
+

+ + From the Print menu we can print the Gate Pass Ticket +

+
+ +
+

+ + This would be the printed Gate Pass Ticket +

+
+ +
+
+
+ +
+
+ cybrosys technologies +
+
+
+
+

+ Our Services +

+
+ + + +
+ +
+ + + +
+

+ + Odoo Support +

+ +
+ +
+
+
+
+
+

+ Our Industries +

+
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Trading + +

+

+ Easily procure and sell your products. +

+
+ +
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Manufacturing +

+

+ Plan, track and schedule your operations. +

+
+ +
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Restaurant +

+

+ Run your bar or restaurant methodical. +

+
+ +
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + POS +

+

+ Easy configuring and convivial selling. +

+
+ +
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + E-commerce & Website +

+

+ Mobile friendly, awe-inspiring product pages. +

+
+
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Hotel Management +

+

+ An all-inclusive hotel management application. +

+
+
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Education +

+

+ A Collaborative platform for educational management. +

+
+
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Service Management +

+

+ Keep track of services and invoice accordingly. +

+
+
+
+
+
+
+ +
diff --git a/gatepass_slip/views/gate_pass_details_views.xml b/gatepass_slip/views/gate_pass_details_views.xml new file mode 100644 index 000000000..7c47ac3f3 --- /dev/null +++ b/gatepass_slip/views/gate_pass_details_views.xml @@ -0,0 +1,23 @@ + + + + + gate slip + stock.picking + + + + + + + + + + + + + + + + + diff --git a/top_selling_product_report/README.rst b/top_selling_product_report/README.rst new file mode 100644 index 000000000..be266ae9a --- /dev/null +++ b/top_selling_product_report/README.rst @@ -0,0 +1,16 @@ +Top/Least Selling Product Report v11 +==================== +Top Selling and Least Selling Product Reports + +Installation +============ + - www.odoo.com/documentation/11.0/setup/install.html + - Install our custom addon +Configuration +============= + + No additional configurations needed + +Credits +======= + Developer: Ajmal JK @ cybrosys, Contact: odoo@cybrosys.com diff --git a/top_selling_product_report/__init__.py b/top_selling_product_report/__init__.py new file mode 100644 index 000000000..acc7f6ee3 --- /dev/null +++ b/top_selling_product_report/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from . import wizard +from . import report diff --git a/top_selling_product_report/__manifest__.py b/top_selling_product_report/__manifest__.py new file mode 100644 index 000000000..54c40214a --- /dev/null +++ b/top_selling_product_report/__manifest__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'Top/Least Selling Product Report', + 'version': '11.0.1.0.0', + 'summary': 'Top Selling and Least Selling Product Reports', + 'description': 'Top Selling and Least Selling Product Reports', + 'author': 'Cybrosys Techno solutions', + 'maintainer': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'website': 'https://www.cybrosys.com', + 'depends': ['base','sale_management','stock','sale'], + 'category': 'Sale', + 'demo': [], + 'data': ['wizard/top_selling_wizard.xml', + 'report/top_selling_report.xml', + 'report/top_selling_report_template.xml'], + 'installable': True, + 'images': ['static/description/banner.png'], + 'qweb': [], + 'license': 'AGPL-3', + 'demo': [], + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/top_selling_product_report/doc/RELEASE_NOTES.md b/top_selling_product_report/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..8c885e6d2 --- /dev/null +++ b/top_selling_product_report/doc/RELEASE_NOTES.md @@ -0,0 +1,6 @@ +## Module + +#### 05.04.2019 +#### Version 11.0.1.0.0 +##### ADD +- Initial commit for Top Selling Product Report diff --git a/top_selling_product_report/report/__init__.py b/top_selling_product_report/report/__init__.py new file mode 100644 index 000000000..a9221e3e5 --- /dev/null +++ b/top_selling_product_report/report/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import top_selling_report diff --git a/top_selling_product_report/report/top_selling_report.py b/top_selling_product_report/report/top_selling_report.py new file mode 100644 index 000000000..3cd5e024b --- /dev/null +++ b/top_selling_product_report/report/top_selling_report.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +from odoo import models +from datetime import timedelta, datetime, date +from dateutil.relativedelta import relativedelta +import dateutil.relativedelta + + +class CustomReport(models.AbstractModel): + _name = "report.top_selling_product_report.top_selling_reports" + + def get_report_values(self, docids, data=None): + + limit_value = data['period'] if data['period'] else None + date_option = data['date'] + date_selected_from = None + date_selected = None + date_selected_to = None + other_details = {} + + company_id = data['company'] + warehouse_id = data['warehouse'] + + from_date = date.today() - dateutil.relativedelta.relativedelta(years=100) + to_date = date.today() + dateutil.relativedelta.relativedelta(days=1) + + if date_option == 'days': + + from_date = date.today() - dateutil.relativedelta.relativedelta(days=11) + to_date = date.today() + dateutil.relativedelta.relativedelta(days=1) + date_selected = "Last 10 Days" + + elif date_option == 'last_month': + + date_limit = date.today() - dateutil.relativedelta.relativedelta(months=1) + from_date = date_limit.replace(day=1) + to_date = (date_limit + relativedelta(months=1, day=1)) - timedelta(1) + date_selected = "Last Month" + + elif date_option == 'curr_month': + + from_date = date.today().replace(day=1) + to_date = date.today() + dateutil.relativedelta.relativedelta(days=1) + date_selected = "Current Month" + + elif date_option == 'last_year': + + date_limit = date.today() - dateutil.relativedelta.relativedelta(years=1) + from_date = date_limit.replace(day=1) + to_date = (date_limit + relativedelta(months=12, day=1)) - timedelta(1) + date_selected = "Last Year" + + elif date_option == 'curr_year': + + date_limit = date.today() - dateutil.relativedelta.relativedelta(years=1) + from_date = date.today().replace(month=1,day=1) + to_date = date.today() + dateutil.relativedelta.relativedelta(days=1) + date_selected = "Current Year" + + elif date_option == 'select_period': + + from_date = data['from_date'] + to_date = data['to_date'] + date_selected_from = from_date + date_selected_to = to_date + + other_details.update({ + + 'limit': limit_value, + 'least': data['least'], + 'range': date_selected, + 'date_selected_from': date_selected_from, + 'date_selected_to': date_selected_to , + }) + + cr = self._cr + order = 'asc' if data['least'] else 'desc' + company_id = str(tuple(company_id)) if len(company_id) > 1 else "("+str(company_id[0])+")" + warehouse_id = str(tuple(warehouse_id)) if len(warehouse_id) > 1 else "("+str(warehouse_id[0])+")" + limit_clause = " limit'%s'"%limit_value if limit_value else "" + + query = ("""select sl.name as product_name,sum(product_uom_qty),pu.name from sale_order_line sl + JOIN sale_order so ON sl.order_id = so.id + JOIN product_uom pu on sl.product_uom = pu.id + where so.date_order::DATE >= '%s'::DATE and + so.date_order::DATE <= '%s'::DATE and + sl.state = 'sale' and so.company_id in %s + and so.warehouse_id in %s + group by sl.name,pu.name order by sum %s""" % (from_date, to_date, company_id, warehouse_id, order)) + limit_clause + cr.execute(query) + dat = cr.dictfetchall() + + return{ + 'data': dat, + 'other': other_details, + } + diff --git a/top_selling_product_report/report/top_selling_report.xml b/top_selling_product_report/report/top_selling_report.xml new file mode 100644 index 000000000..cc31fb6d7 --- /dev/null +++ b/top_selling_product_report/report/top_selling_report.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/top_selling_product_report/report/top_selling_report_template.xml b/top_selling_product_report/report/top_selling_report_template.xml new file mode 100644 index 000000000..c64f9c4a9 --- /dev/null +++ b/top_selling_product_report/report/top_selling_report_template.xml @@ -0,0 +1,95 @@ + + + + + + \ No newline at end of file diff --git a/top_selling_product_report/static/description/banner.png b/top_selling_product_report/static/description/banner.png new file mode 100644 index 000000000..1582a676d Binary files /dev/null and b/top_selling_product_report/static/description/banner.png differ diff --git a/top_selling_product_report/static/description/icon.png b/top_selling_product_report/static/description/icon.png new file mode 100644 index 000000000..dfb3f133e Binary files /dev/null and b/top_selling_product_report/static/description/icon.png differ diff --git a/top_selling_product_report/static/description/index.html b/top_selling_product_report/static/description/index.html new file mode 100644 index 000000000..afe613318 --- /dev/null +++ b/top_selling_product_report/static/description/index.html @@ -0,0 +1,359 @@ + +
+
+

+ Top/Least Selling Product Report +

+

+ Top Selling and Least Selling Product Reports +

+
+ Cybrosys Technologies +
+ +
+ cybrosys technologies
+
+
+
+ +
+
+

+ Overview +

+

+ This module helps in generating top selling and least selling product pdf reports. One can generate top/least selling product report + according to the company and warehouse for range of period. +

+
+
+ +
+
+

+ Features +

+

+ + Generates top/least selling product report. +

+

+ + Generates reports for certain time periods. +

+

+ + Report for a range of product. +

+
+
+ +
+
+

+ Screenshots +

+

+       When you install this module, an extra menu named Top/Least Selling Product is created. +

+
+ +
+

+ + Go to Sales --> Reporting --> Top/Least Selling Product.
+       A wizard will be opened once the user clicks on it..
+ + Choose companies and warehouses for generating report.
+ + Select a time period from 'Top Selling product of' selection field.
+ + Select 'Least Selling Product' to generate least selling product report.
+

+
+ +
+

+ +       Click the button Print to least selling product report in PDF format.
+

+
+ +
+

+ + For 'Top selling product report' deselect 'Least Selling Product'.
+       Click the button Print to get top selling product report in PDF format.
+

+
+ +
+
+
+
+
+ cybrosys technologies +
+
+ +
+
+

+ Our Services +

+
+ + + +
+ +
+ + + +
+

+ + Odoo Support +

+ +
+ +
+
+
+
+
+

+ Our Industries +

+
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Trading + +

+

+ Easily procure and sell your products. +

+
+ +
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Manufacturing +

+

+ Plan, track and schedule your operations. +

+
+ +
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Restaurant +

+

+ Run your bar or restaurant methodical. +

+
+ +
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + POS +

+

+ Easy configuring and convivial selling. +

+
+ +
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + E-commerce & Website +

+

+ Mobile friendly, awe-inspiring product pages. +

+
+
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Hotel Management +

+

+ An all-inclusive hotel management application. +

+
+
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Education +

+

+ A Collaborative platform for educational management. +

+
+
+
+ +
+
+ + Odoo Industry + +
+
+
+

+ + Service Management +

+

+ Keep track of services and invoice accordingly. +

+
+
+
+
+
+
+ +
diff --git a/top_selling_product_report/static/description/top-Least-selling-product-report1.png b/top_selling_product_report/static/description/top-Least-selling-product-report1.png new file mode 100644 index 000000000..ab228afa6 Binary files /dev/null and b/top_selling_product_report/static/description/top-Least-selling-product-report1.png differ diff --git a/top_selling_product_report/static/description/top-Least-selling-product-report2.png b/top_selling_product_report/static/description/top-Least-selling-product-report2.png new file mode 100644 index 000000000..34d464c2b Binary files /dev/null and b/top_selling_product_report/static/description/top-Least-selling-product-report2.png differ diff --git a/top_selling_product_report/static/description/top-Least-selling-product-report3.png b/top_selling_product_report/static/description/top-Least-selling-product-report3.png new file mode 100644 index 000000000..9d1e77189 Binary files /dev/null and b/top_selling_product_report/static/description/top-Least-selling-product-report3.png differ diff --git a/top_selling_product_report/static/description/top-Least-selling-product-report4.png b/top_selling_product_report/static/description/top-Least-selling-product-report4.png new file mode 100644 index 000000000..8b6b514d1 Binary files /dev/null and b/top_selling_product_report/static/description/top-Least-selling-product-report4.png differ diff --git a/top_selling_product_report/wizard/__init__.py b/top_selling_product_report/wizard/__init__.py new file mode 100644 index 000000000..6765d80aa --- /dev/null +++ b/top_selling_product_report/wizard/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import top_selling diff --git a/top_selling_product_report/wizard/top_selling.py b/top_selling_product_report/wizard/top_selling.py new file mode 100644 index 000000000..2b24b516b --- /dev/null +++ b/top_selling_product_report/wizard/top_selling.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +from odoo import fields, api, models + + +class TopSellingWizard(models.TransientModel): + + _name = 'top.selling' + + from_date = fields.Date(string='From') + to_date = fields.Date(string='To') + date = fields.Selection([('days', 'Last 10 Days'), ('curr_month', 'Current Month'), ('last_month', 'Last Month'), + ('curr_year', 'Current Year'), ('last_year', 'Last Year'), ('select_period', 'Select Period')], + string="Top Selling product of", default='days') + period = fields.Char(string="Products Range", help="Enter number of products in report.") + least = fields.Boolean(string="Least Selling Product", default=False) + company = fields.Many2many('res.company', default=lambda self: self.env.user.company_id, string="Company") + warehouse = fields.Many2many('stock.warehouse', string="Warehouse") + + @api.multi + def print_report(self): + + company_id = [] + warehouse_id = [] + + if self.company: + for val in self.company: + company_id.append(val.id) + else: + company = self.env['res.company'].search([]) + for val in company: + company_id.append(val.id) + + if self.warehouse: + for val in self.warehouse: + warehouse_id.append(val.id) + else: + warehouse = self.env['stock.warehouse'].search([]) + for val in warehouse: + warehouse_id.append(val.id) + + data = {'date': self.date, 'period': self.period, 'least': self.least, 'from_date': self.from_date, + 'to_date': self.to_date, 'company': company_id, 'warehouse': warehouse_id} + + return self.env.ref('top_selling_product_report.top_selling_pdf').report_action(self, data=data) diff --git a/top_selling_product_report/wizard/top_selling_wizard.xml b/top_selling_product_report/wizard/top_selling_wizard.xml new file mode 100644 index 000000000..a5d5e5b2f --- /dev/null +++ b/top_selling_product_report/wizard/top_selling_wizard.xml @@ -0,0 +1,51 @@ + + + + + Top/Least Selling Products + top.selling + +
+ + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + + Top/Least Selling Products + top.selling + form + form + new + + + +
\ No newline at end of file