\ No newline at end of file
diff --git a/modules/dashguestcycle/views/templates/hook/index.php b/modules/dashguestcycle/views/templates/hook/index.php
new file mode 100644
index 000000000..370358388
--- /dev/null
+++ b/modules/dashguestcycle/views/templates/hook/index.php
@@ -0,0 +1,29 @@
+
+* @copyright 2007-2016 PrestaShop SA
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*/
+
+header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
+header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+
+header('Cache-Control: no-store, no-cache, must-revalidate');
+header('Cache-Control: post-check=0, pre-check=0', false);
+header('Pragma: no-cache');
+
+header('Location: ../');
+exit;
\ No newline at end of file
diff --git a/modules/dashoccupancy/dashoccupancy.php b/modules/dashoccupancy/dashoccupancy.php
new file mode 100644
index 000000000..b1d317833
--- /dev/null
+++ b/modules/dashoccupancy/dashoccupancy.php
@@ -0,0 +1,143 @@
+name = 'dashoccupancy';
+ $this->tab = 'dashboard';
+ $this->version = '1.0.0';
+ $this->ps_versions_compliancy = array('min' => '1.6', 'max' => '1.6');
+ $this->author = 'Webkul';
+ $this->bootstrap = true;
+ parent::__construct();
+ $this->displayName = $this->l('Dashboard Occupancy');
+ $this->description = $this->l('Adds a block with a graphical representation of occupancy of your hotel`s room.');
+ $this->confirmUnsinstall = $this->l('Are you sure you want to uninstall?');
+
+ $this->allow_push = true;
+
+ }
+
+ public function install()
+ {
+ return (parent::install()
+ && $this->registerHook('dashboardZoneTwo')
+ && $this->registerHook('dashboardData')
+ && $this->registerHook('actionAdminControllerSetMedia')
+ );
+ }
+
+ public function hookActionAdminControllerSetMedia()
+ {
+ if (get_class($this->context->controller) == 'AdminDashboardController') {
+ $this->context->controller->addJs($this->_path.'views/js/'.$this->name.'.js');
+ }
+ $this->context->controller->addCSS($this->_path.'views/css/'.$this->name.'.css');
+ }
+
+ public function hookDashboardZoneTwo($params)
+ {
+ Media::addJsDef(array(
+ 'ajaxUrl' => $this->context->link->getModuleLink($this->name, 'chartdata'),
+ 'date_from' => $params['date_from'],
+ 'date_to' => $params['date_to'],
+ ));
+ $availPieChartLabelData = AdminStatsController::getAvailPieChartData($params['date_from'], $params['date_to']);
+ $totalRooms = sprintf("%02d", AdminStatsController::getTotalRooms());
+ $this->context->smarty->assign(array(
+ 'totalRooms' => $totalRooms,
+ 'inactiveRooms' => $availPieChartLabelData['inactive'],
+ 'availableRooms' => $availPieChartLabelData['available'],
+ 'occupiedRooms' => $availPieChartLabelData['occupied'],
+ 'date_occupancy_range' => $this->l('(from %s to %s)'),
+ 'date_occupancy_avail_format' => $this->context->language->date_format_lite,
+ ));
+ return $this->display(__FILE__, 'dashboard_zone_two.tpl');
+ }
+
+ public function hookDashboardData($params)
+ {
+ $totalRooms = sprintf("%02d", AdminStatsController::getTotalRooms());
+ $data = array();
+ $data['total_rooms'] = $totalRooms;
+
+ if (Configuration::get('PS_DASHBOARD_SIMULATION'))
+ {
+ $data['occupied'] = round(rand(0, 20));
+ $data['available'] = round(rand(0, 20));
+ $data['inactive'] = round(rand(0, 20));
+ $availPieChartData = array();
+ $objChartData = array();
+ $objChartData['label'] = $this->l('Occupied');;
+ $objChartData['value'] = $data['occupied']*100/$totalRooms;
+ $availPieChartData[] = $objChartData;
+
+ $objChartData = array();
+ $objChartData['label'] = $this->l('Available');
+ $objChartData['value'] = $data['available']*100/$totalRooms;
+ $availPieChartData[] = $objChartData;
+
+ $objChartData = array();
+ $objChartData['label'] = $this->l('Inactive/ maintainance');
+ $objChartData['value'] = $data['inactive']*100/$totalRooms;
+ $availPieChartData[] = $objChartData;
+
+ $data['chart_data'] = $availPieChartData;
+
+ } else {
+ $dateFrom = $params['date_from'];
+ $dateTo = $params['date_to'];
+ $availPieChartLabelData = AdminStatsController::getAvailPieChartData(
+ $dateFrom,
+ $dateTo
+ );
+
+ $availPieChartData = array();
+ $objChartData = array();
+ $objChartData['label'] = $this->l('Occupied');;
+ $objChartData['value'] = $availPieChartLabelData['occupied']*100/$totalRooms;
+ $availPieChartData[] = $objChartData;
+
+ $objChartData = array();
+ $objChartData['label'] = $this->l('Available');
+ $objChartData['value'] = $availPieChartLabelData['available']*100/$totalRooms;
+ $availPieChartData[] = $objChartData;
+
+ $objChartData = array();
+ $objChartData['label'] = $this->l('Inactive/ maintainance');
+ $objChartData['value'] = $availPieChartLabelData['inactive']*100/$totalRooms;
+ $availPieChartData[] = $objChartData;
+
+ $data['occupied'] = $availPieChartLabelData['occupied'];
+ $data['available'] = $availPieChartLabelData['available'];
+ $data['inactive'] = $availPieChartLabelData['inactive'];
+ $data['chart_data'] = $availPieChartData;
+
+ }
+
+ return array('data_avail_pie_chart' => $data);
+ }
+}
diff --git a/modules/dashoccupancy/index.php b/modules/dashoccupancy/index.php
new file mode 100644
index 000000000..370358388
--- /dev/null
+++ b/modules/dashoccupancy/index.php
@@ -0,0 +1,29 @@
+
+* @copyright 2007-2016 PrestaShop SA
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*/
+
+header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
+header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+
+header('Cache-Control: no-store, no-cache, must-revalidate');
+header('Cache-Control: post-check=0, pre-check=0', false);
+header('Pragma: no-cache');
+
+header('Location: ../');
+exit;
\ No newline at end of file
diff --git a/modules/dashoccupancy/views/js/dashoccupancy.js b/modules/dashoccupancy/views/js/dashoccupancy.js
new file mode 100644
index 000000000..516502741
--- /dev/null
+++ b/modules/dashoccupancy/views/js/dashoccupancy.js
@@ -0,0 +1,62 @@
+/**
+ * 2010-2021 Webkul.
+ *
+ * NOTICE OF LICENSE
+ *
+ * All right is reserved,
+ * Please go through LICENSE.txt file inside our module
+ *
+ * DISCLAIMER
+ *
+ * Do not edit or add to this file if you wish to upgrade this module to newer
+ * versions in the future. If you wish to customize this module for your
+ * needs please refer to CustomizationPolicy.txt file inside our module for more information.
+ *
+ * @author Webkul IN
+ * @copyright 2010-2021 Webkul IN
+ * @license LICENSE.txt
+ */
+
+// PIE CHART CODE
+function generateAvailablityPieChart(chartData) {
+ nv.addGraph(function() {
+ var chart = nv.models.pieChart()
+ .x(function(d) { return d.label })
+ .y(function(d) { return d.value })
+ .showLabels(true)
+ .showLegend(false)
+ .labelThreshold(.01)
+ .labelType("percent")
+ .donut(true)
+ .donutRatio(0.35)
+ .color(["#A569DF", "#56CE56", "#FF655C"]);
+
+ d3.select("#availablePieChart svg")
+ .datum(chartData)
+ .transition().duration(350)
+ .call(chart);
+ nv.utils.windowResize(chart.update);
+ return chart;
+ });
+}
+
+$(document).ready(function() {
+ if (typeof date_occupancy_range === "undefined")
+ var date_occupancy_range = '(from %s to %s)';
+
+ if (typeof date_occupancy_avail_format === "undefined")
+ var date_occupancy_avail_format = 'Y-mm-dd';
+
+ $('#date-start').change(function() {
+ start = Date.parseDate($('#date-start').val(), 'Y-m-d');
+ end = Date.parseDate($('#date-end').val(), 'Y-m-d');
+ $('#dashoccupancy_date_range').html(sprintf(date_occupancy_range, start.format(date_occupancy_avail_format), end.format(date_occupancy_avail_format)));
+ });
+
+ $('#date-end').change(function() {
+ start = Date.parseDate($('#date-start').val(), 'Y-m-d');
+ end = Date.parseDate($('#date-end').val(), 'Y-m-d');
+
+ $('#dashoccupancy_date_range').html(sprintf(date_occupancy_range, start.format(date_occupancy_avail_format), end.format(date_occupancy_avail_format)));
+ });
+});
\ No newline at end of file
diff --git a/modules/dashoccupancy/views/js/index.php b/modules/dashoccupancy/views/js/index.php
new file mode 100644
index 000000000..8761a003e
--- /dev/null
+++ b/modules/dashoccupancy/views/js/index.php
@@ -0,0 +1,35 @@
+
+* @copyright 2007-2016 PrestaShop SA
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*/
+
+header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
+header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+
+header('Cache-Control: no-store, no-cache, must-revalidate');
+header('Cache-Control: post-check=0, pre-check=0', false);
+header('Pragma: no-cache');
+
+header('Location: ../');
+exit;
\ No newline at end of file
diff --git a/modules/dashoccupancy/views/templates/hook/dashboard_zone_two.tpl b/modules/dashoccupancy/views/templates/hook/dashboard_zone_two.tpl
new file mode 100644
index 000000000..0d6893f68
--- /dev/null
+++ b/modules/dashoccupancy/views/templates/hook/dashboard_zone_two.tpl
@@ -0,0 +1,94 @@
+{**
+* 2010-2021 Webkul.
+*
+* NOTICE OF LICENSE
+*
+* All right is reserved,
+* Please go through LICENSE.txt file inside our module
+*
+* DISCLAIMER
+*
+* Do not edit or add to this file if you wish to upgrade this module to newer
+* versions in the future. If you wish to customize this module for your
+* needs please refer to CustomizationPolicy.txt file inside our module for more information.
+*
+* @author Webkul IN
+* @copyright 2010-2021 Webkul IN
+* @license LICENSE.txt
+*}
+
+
+
+
diff --git a/modules/dashoccupancy/views/templates/hook/index.php b/modules/dashoccupancy/views/templates/hook/index.php
new file mode 100644
index 000000000..8761a003e
--- /dev/null
+++ b/modules/dashoccupancy/views/templates/hook/index.php
@@ -0,0 +1,35 @@
+
+* @copyright 2007-2016 PrestaShop SA
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*/
+
+header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
+header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+
+header('Cache-Control: no-store, no-cache, must-revalidate');
+header('Cache-Control: post-check=0, pre-check=0', false);
+header('Pragma: no-cache');
+
+header('Location: ../');
+exit;
\ No newline at end of file
diff --git a/modules/dashoccupancy/views/templates/index.php b/modules/dashoccupancy/views/templates/index.php
new file mode 100644
index 000000000..8761a003e
--- /dev/null
+++ b/modules/dashoccupancy/views/templates/index.php
@@ -0,0 +1,35 @@
+
+* @copyright 2007-2016 PrestaShop SA
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*/
+
+header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
+header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+
+header('Cache-Control: no-store, no-cache, must-revalidate');
+header('Cache-Control: post-check=0, pre-check=0', false);
+header('Pragma: no-cache');
+
+header('Location: ../');
+exit;
\ No newline at end of file
diff --git a/modules/dashperformance/CHANGELOG.txt b/modules/dashperformance/CHANGELOG.txt
new file mode 100644
index 000000000..4f29acabf
--- /dev/null
+++ b/modules/dashperformance/CHANGELOG.txt
@@ -0,0 +1,4 @@
+Changelog
+
+v1.0.0
+- first release
diff --git a/modules/dashperformance/CustomizationPolicy.txt b/modules/dashperformance/CustomizationPolicy.txt
new file mode 100644
index 000000000..7a688847f
--- /dev/null
+++ b/modules/dashperformance/CustomizationPolicy.txt
@@ -0,0 +1,80 @@
+1. Definitions
+--------------
+"Webkul" means Webkul Software Pvt. Ltd.
+"Customization" means those services by which functionality / features are added to a product that are not included in the base installation of a product, which are aimed to suit the specific needs of the customer.
+"Module" means the custom add-on module to be developed and provided by Webkul to you in accordance with this policy and the Order Form.
+"Order Form" means the order form (electronic or hard copy), accepted by Webkul, through which you ordered the Module to be developed and provided by Webkul and which sets out the details, specifications and parameters of the customized Module to be provided.
+"Software" means the software licensed by Webkul to you pursuant to the terms and conditions of a Webkul Software License Agreement.
+
+
+2. Module Development
+---------------------
+All customization Services and use of the Module are subject to the terms and conditions of Webkul’s Software Licence Agreement, found on Webkul’s website, and are also subject to the terms and conditions set forth in the Order Form, as well as the customization parameters. No other customization services will be provided unless expressly agreed upon by you and Webkul in writing, signed by authorized representatives of you and Webkul.
+
+
+3. Customization Services
+-------------------------
+Customization Services will be provided in accordance with the terms of the Order Form and subject to the conditions set forth on the Order Form including full payment of all fees and adherence to all time limits and scheduling restrictions.
+If expressly stated on the Order Form, the Customization Services and Module shall be subject to acceptance by you in accordance with the acceptance criteria set forth in the Order Form. Where there is no acceptance criteria set forth on the Order Form, acceptance shall be deemed to occur upon the earliest of:
+completion of the acceptance criteria,
+Webkul's completion of the Customization Services and written notification to you of such completion,
+your use of the Module in other than a test environment.
+Notwithstanding the foregoing, if acceptance testing, delivery or completion is delayed by thirty (30) days or more for reasons not related to Webkul’s performance, you must pay the value of any milestone that is contingent on acceptance. Such acceptance does not negate any warranty rights that you may have respecting the Module, as set forth herein. You are solely responsible for preparing your facilities and equipment for installation of the Module, where applicable.
+Webkul will make reasonable efforts to accommodate your time and deadline requirements with respect to the performance of Customization Services; however, meeting such requirements is subject to availability of resources, both human and equipment at the time of your request and is dependent on your availability to provide input and to perform necessary actions. Webkul shall not be liable in any way for any delay or damage arising from Webkul’s failure to meet such of your requirements or any deadlines.
+Any changes to the Customization Services or Module requirements after execution of the Order Form will be subject to a cost and delivery re-assessment, and a written change order or re-quote that has been mutually agreed upon by you and Webkul in writing. Webkul reserves the right to make changes in the design of its Software without the obligation to make equivalent changes to the Module.
+If, pursuant to your request, Webkul reviews drawings and documents prepared by others in connection with the Customization Services, including your personnel and other consultants, contractors, and suppliers, Webkul’s review of such drawings and documents shall be only to confirm general compliance with the intent of the design and information given, and shall not constitute acceptance by Webkul of any responsibility for correctness of specifications or details of such drawings and documentation. Webkul shall be entitled to rely on all information provided, and decisions and approvals made, by you in connection with Webkul’s work hereunder. You agree that Webkul and its personnel shall not be subject to any liability or costs relating to the Customization Services to the extent such liability and costs are attributable to any information provided by you that is not complete, accurate or current in all material respects.
+The Module, and all parts thereof, shall at all times be treated as Software licensed to you under the terms and conditions of the Licence Agreement.
+
+
+4. Term and Termination
+-----------------------
+The term of the Development Services, if any, shall be as set out on the Order Form.
+Customization Services may be terminated by Webkul immediately upon notice for cause if:
+you materially breach any agreement entered into between you and Webkul, including Webkul’s Licence Agreement and/or any User / software license agreement relating to Webkul’s products (or you consistently fail to properly perform and observe your obligations under such agreements or any applicable Webkul Software policy), and you fail to rectify the situation within ten (10) calendar days of notice from Webkul; or
+you become insolvent, or a receiver or receiver-manager is appointed for any part of your property, or you make an assignment, proposal or arrangement for the benefit of your creditors or you file an assignment in bankruptcy, or any proceedings under any bankruptcy or insolvency laws are commenced against you.
+Webkul shall have the right to terminate Customization Services immediately upon notice to you, without penalty or refund, if any agreement relating to the Software is terminated for any reason.
+Each party shall have the right to terminate the Development Services for convenience upon ninety (90) days’ notice to the other party.
+Termination of the Customization Services or any agreement shall not affect your payment obligation for any Customization Services performed by Webkul prior to the date of termination, regardless of whether you have had, as at the date of termination, any use of the Module or part thereof. In the event that the Customization Services are terminated prior to the delivery of the Module to you, Webkul shall not be obligated to deliver any work-in-progress or any portion of the Module to you, unless otherwise expressly agreed by the parties in writing.
+
+
+5. Fees
+-------
+You shall pay fees for the Customization Services and Module license in accordance with the fee schedule set forth in the Order Form. Webkul shall submit invoices to you for all fees and payments due, including applicable expenses, on a monthly basis in arrears. You shall pay to Webkul the full amount of each invoice received from Webkul within seven (7) days of receipt of the invoice. All invoices shall detail the nature of the Customization Services performed, the fees payable, and the basis on which the calculation of the fees has been made.
+You are responsible for, and shall pay all taxes relating to the Customization Services and the Module. Unless otherwise indicated, all amounts payable by you under an Order Form are exclusive of any tax, duty, levy, or similar government charge that may be assessed by any jurisdiction, whether based on gross revenue, the delivery, possession or use of the Module, other Software or Customization Services, or otherwise.
+If you fail to pay any amount due within thirty (30) days of such payment becoming due and payable, in addition to any other rights and remedies available to Webkul, Webkul shall be entitled to charge interest on all outstanding amounts at the lesser of 18% per annum or the maximum rate permitted by law, such interest commencing as of the due date for such payment. You shall also be responsible for paying for all reasonable fees and costs incurred by Webkul, including legal fees, in collecting any overdue amounts or enforcing any provision of any agreement entered into between you and Webkul.
+Pricing is subject to Webkul’s understanding of the project requirements, the terms of this policy and the Order Form. Webkul reserves the right to invoice you for additional Customization Services requested by you, or that are required based on incomplete details or specifications provided by you, that are not specified in the Order Form but are provided by Webkul to you, provided that Webkul provides you with notice that such additional Customization Services are not included in the Order Form and are subject to Webkul’s then current time and materials fee schedule for such Customization Services. Invoices for such additional Customization Services shall be subject to payment in accordance with this Section.
+
+
+6. Intellectual Property Rights
+-------------------------------
+Webkul shall own all intellectual property rights (whether or not patentable or registrable under copyright, trade-mark or similar legislation or subject to analogous protection) in and to the Module, and all work conceived, created, invented, produced, designed or reduced to practice by Webkul and its personnel as a result of or with respect to any and all Customization Services provided to you. Your rights and obligations relating to the use of the Module shall be governed by the terms of the applicable Webkul Software License Agreement regardless of whether you may have contributed to any Module in any way. The foregoing shall not be deemed to transfer ownership to Webkul of any pre-existing intellectual property rights that you may have in the materials that you provide to Webkul in order to permit Webkul to perform the Customization Services; however, to the extent that you have provided such materials to Webkul, you hereby grant Webkul a non-exclusive, non-transferable, royalty-free license to use all such materials for the purposes of performing the Customization Services and providing you with the Module.
+
+
+7. Limited Warranty and Limitation of Liability
+-----------------------------------------------
+Limited Warranty: Webkul warrants that all services provided by Webkul shall be provided in a competent, professional manner by persons who are fully trained and qualified to perform the Customization Services. Webkul does not represent or warrant that the Customization Services or Module provided hereunder will be capable of achieving a particular result for your business, or that the operation of the Module will be error free or uninterrupted, or that all errors in the Module can be found or corrected, although Webkul shall use commercially reasonable efforts to do so. Without limiting the foregoing, this warranty is valid only for the six (6) months following the acceptance date as set forth in Section 3(b). The above warranty shall not apply to defects or non-conformities resulting from:
+improper or inadequate maintenance or installation of the Module
+use of the Module in combination with software, interfaces, or other materials that are not supplied or specifically authorized by Webkul,
+unauthorized or improper use or modification of the Module, including use that is not contemplated in the Order Form or instructions provided by Webkul,
+abuse, negligence, accident, or other damage from external sources, or
+improper preparation of your facilities or equipment for installation and use or the Module.
+Limitation of Liability:
+save as otherwise provided in a written agreement between you and Webkul, and to the maximum extent permitted by applicable law, Webkul makes no warranty or condition, express or implied, statutory or otherwise, with respect to the module or the Customization services, including, without limitation, the implied warranties or conditions of merchantability and fitness for a particular purpose.
+in no event shall Webkul be liable to you or any other person for any indirect, special, punitive, exemplary, consequential or incidental damages (including without limitation, damages for loss of revenues or profits, business interruption, loss of business information, and the like) arising out of the use, inability to use or the performance or non-performance of, the module or the provision of the Customization services, even if Webkul has been advised of the possibility of such damage or claim, or it is foreseeable.
+in no event shall Webkul’s maximum aggregate liability to you for direct damages exceed the total amount paid by you for the Customization services performed by Webkul within the six (6) months preceding the date on which the claim arose.
+
+
+8. General Terms and Conditions
+-------------------------------
+As Webkul is primarily a plugin and app development company and its main focus is on constant plugin development fulfilling various latest requirements and keeping up with the latest trends, Webkul has all the right to release the same customized plugin as a new plugin in future to be available to all its customers. The same may include few or every feature of the customisation. Webkul reserve all the rights to do the same as the customisation done for the client is Intellectual property of Webkul.
+The customization undertaken by Webkul would be identical to the discussed requirements, and would not include any sort of additional changes or alterations. Any additional changes or alterations would be considered as a separate project and would be charged separately.
+Webkul would be providing customization support for only one month from the delivery of the project. For any further support extended to you, the same shall be charged separately which includes specifically any further help or bug /error fix.
+The cost of customization doesn’t include the cost of extension installation or exchange of the extension, if it has not been specifically quoted within the project cost.
+During the project customization, you ought not to edit or change any of the files and it is also advisable to have a backup every-time a change is made. If you, on your own, are making certain changes, it is advisable to back up the files, folder and database. Before doing anything on your own, you need to inform Webkul if Webkul is working on the project or your support period is subsisting.
+The customization charge will include a single template. Any time during or after the customization if you change the template, you shall be wholly and solely liable for any loss or damage emanating from the same. Webkul will not be responsible for any loss or damage done due to the same.
+All the communication will take place through Webkul’s help desk system only. If the need arises, the issues can be discussed via Skype once in week or month. Webkul does not allow screen sharing and remote desktop.
+Customization cost will not include any free consulting beyond the scope of the project.
+If while making any changes by yourself or by your team, something gets damaged, then Webkul will not be responsible for it. This includes any issues faced by you for your own fault even during the support period of the module or project.
+Webkul will not be responsible for any damages during the customization. It is advised that you must have a proper backup management system deployed.
+The terms and conditions of this Policy shall be governed by Indian Laws, and the courts in Delhi alone shall only have exclusive jurisdiction to resolve/ adjudicate upon any disputes.
+If any dispute arises between webkul and you/Licensee at any time, in connection with the validity, interpretation, implementation or alleged breach of any provision of this Agreement, the same shall be referred to a sole Arbitrator who shall be an independent and neutral third party appointed exclusively by Webkul. You shall not object to the appointment of the Arbitrator so appointed by Webkul. The place of arbitration shall be Delhi, India. The Arbitration & Conciliation Act, 1996 as amended by The Arbitration & Conciliation (Amendment) Act, 2015, shall govern the arbitration proceedings. The arbitration proceedings shall be held in the English language.
diff --git a/modules/dashperformance/LICENSE.txt b/modules/dashperformance/LICENSE.txt
new file mode 100644
index 000000000..44b1b399c
--- /dev/null
+++ b/modules/dashperformance/LICENSE.txt
@@ -0,0 +1,223 @@
+SOFTWARE LICENCE AGREEMENT
+===============================
+
+This AGREEMENT is made effective on the date of the purchase of the software between Webkul Software Pvt. Ltd.,Company incorporated under the Companies Act, 1956 (hereinafter referred to as “Licensor"), and the purchaser of the software/ product (hereinafter referred to as "Licensee").
+
+Preamble
+==================
+Licensor is a web and mobile product based organization engaged in the business of developing and marketing software for enterprise level e-commerce businesses. It is an ISO and NSR (NASSCOM) certified organization having a team of more than 150 creative engineers which come from different backgrounds. It has developed more than 700 web extensions and apps in the past few years for open source platforms which are used and trusted globally. Licensee now wishes to obtain license, and Licensor wishes to grant a license, to allow use of the software so purchased in developing the e-commerce business website/ mobile app of the Licensee, subject to the terms and conditions set forth herein.
+
+
+THEREFORE, with the intent to be legally bound, the parties hereby agree as follows:
+
+
+Agreement
+================
+
+1.Definitions :
+------------------
+As used in this Agreement, the following capitalized terms shall have the definitions set forth below:
+
+
+"Derivative Works" are works developed by Licensee, its officers, agents, contractors or employees, which are based upon, in whole or in part, the Source Code and/or the Documentation and may also be based upon and/or incorporate one or more other preexisting works of the Licensor. Derivative Works may be any improvement, revision, modification, translation (including compilation or recapitulation by computer), abridgment, condensation, expansion, or any other form in which such a preexisting work may be recast, transformed, or adapted. For purposes hereof, a Derivative Work shall also include any compilation that incorporates such a preexisting work.
+
+
+"Documentation" is written, printed or otherwise recorded or stored (digital or paper) material relating to the Software and/or Source Code, including technical specifications and instructions for its use including Software/ Source Code annotations and other descriptions of the principles of its operation and instructions for its use.
+
+
+"Improvements" shall mean, with respect to the Software, all modifications and changes made, developed, acquired or conceived after the date hereof and during the entire term of this Agreement.
+
+
+"Source Code" is the computer programming source code form of the Software in the form maintained by the Licensor, and includes all non-third-party executables, libraries, components, and Documentation created or used in the creation, development, maintenance, and support of the Software as well as all updates, error corrections and revisions thereto provided by Licensor, in whole or in part.
+
+
+2. Software License.
+-------------------------
+
+(a)Grant of License. For the consideration set forth below, Licensor hereby grants to Licensee, and Licensee hereby accepts the worldwide, non-exclusive, perpetual, royalty-free rights and licenses set forth below:
+
+
+(i)The right and license to use and incorporate the software, in whole or in part, to develop its website/ mobile app (including the integration of all or part of the Licensor’s software into Licensee's own software) on one domain ( Except Joomla modules , listed on store are entitled to be used on unlimited domain as per the standard guidelines ) only, solely for the own personal or business use of the Licensee. However, the License does not authorize the Licensee to compile, copy or distribute the said Software or its Derivative Works.
+
+
+(ii)The right and license does not authorize the Licensee to make any backup or archival copies of the Software and / or the Source Code and Documentation.
+
+(iii)The right and license does not authorize the Licensee to migrate the domain license to another domain.
+
+
+(b)Scope; Rights and Responsibilities.
+
+
+(i)Licensor shall enable the Licensee to download one complete copy of the Software.
+
+
+(ii)The Software is intended for the sole use of the Licensee in development of its own website/ mobile app.
+
+
+(iii)Licensee does not have the right to hand over, sell, distribute, sub-license, rent, lease or lend any portion of the Software or Documentation, whether modified or unmodified, to anyone. Licensee should not place the Software on a server so that it becomes accessible via a public network such as the Internet for distribution purposes. In case the Licensee is using any source code management system like github, it can use the code there only when it has paid subscription from such management system.
+
+
+(iv)Licensee is not authorized to appoint, or work with, third parties to perform any development services using the Source Code, the source code to Derivative Works and/or the Documentation on behalf of, or working with, the Licensee. Release of Source Code, Derivative Work source code and/or Documentation to any third party shall be considered as violation of the Agreement, inter-alia entailing forthwith termination and legal action.
+
+
+
+(c)Ownership.
+
+
+(i)Software and Source Code. All right, title, copyright, and interest in the Software, Source Code, Software Modifications and Error corrections will be and remain the property of Licensor.
+
+
+(ii)Derivative Works. As creation of Derivative Works by the Licensee is prohibited, thus, all right, title, copyright, and interest in any and/or all Derivative Works and Improvements created by, or on behalf of, Licensee will also be deemed to the property of Licensor. Licensor shall be entitled to protect copyright / intellectual property in all such Derivative Works and Improvements also in any country as it may deem fit including without limitation seeking copyright and/or patent protection.
+
+
+3.Consideration.
+--------------------
+
+(a)Licensee shall pay to Licensor the amount as mentioned on the website from where the order is placed, as one-time, upfront fees in consideration for the licenses and rights granted hereunder (hereinafter referred to as the "License Fee"). The License Fee to be paid by Licensee shall be paid upfront at the time of placing the order, and no credit will be allowed under any circumstances.
+
+
+(b)Once paid, the License Fees shall be non-refundable. The Licensee has fully satisfied itself about the Software and has seen the demonstration, and only thereafter has placed the order. Thus, the License Fees or any part thereof is non-refundable. No claim for refund of the Licence Fees shall be entertained under any circumstances.
+
+
+
+4.Representations and Warranties.
+-------------------------------------
+
+(a)Mutual. Each of the parties represents and warrants to the other as follows.
+
+
+(i)such party is a legal entity duly organized, validly existing and in good standing;
+
+
+(ii)such party has the power and authority to conduct its business as presently conducted and to enter into, execute, deliver and perform this Agreement.
+
+
+(iii)This Agreement has been duly and validly accepted by such party and constitutes the legal, valid and binding obligations of such party respectively, enforceable against such party in accordance with their respective terms;
+
+
+(iv)the acceptance, execution, delivery and performance of this Agreement does not and will not violate such party's charter or by-laws; nor require any consent, authorization, approval, exemption or other action by any third party or governmental entity.
+
+
+(b)Licensor warrants that, at the time of purchase of the Software:
+
+
+the Software will function materially as set forth in the website or published functionality provided by Licensor to customers and potential customers describing the Software; and
+
+
+Software add-ons, if purchased by the Licensee from the Licensor, will not materially diminish the features or functions of or the specifications of the Software as they existed as of the execution of this Agreement.
+
+
+
+(c)Title. Licensor represents and warrants that it is the exclusive owner of all copyright/ intellectual property in the Software (including the Source Code) and has good and marketable title to the Software (including the Source Code) free and clear of all liens, claims and encumbrances of any nature whatsoever (collectively, "Liens"). Licensor's grant of license and rights to Licensee hereunder does not, and will not infringe any third party's property, intellectual property or personal rights.
+
+
+
+5.Term.
+-------------
+
+(a)Subject to Licensee's payment obligations, this Agreement shall commence as on the date of making payment of the Software by the Licensee to the Licensor, and shall continue until terminated by either party.
+
+
+(b)The Licensor retains the right to terminate the license at any time, if the Licensee is not abiding by any of the terms of the Agreement. The Licensee may terminate the Agreement at any time at its own discretion by uninstalling the Software and /or by destroying the said Software (or any copies thereof). However, the Licensee shall not be entitled to seek any refund of the amount paid by it to the Licensor, under any circumstances.
+
+
+(c)Survival. In the event this Agreement is terminated for any reason, the provisions set forth in Sections 2(a), 2(b), and 2(c) shall survive.
+
+
+
+
+6. Indemnification
+----------------------
+
+The Licensee release the Licensor from, and agree to indemnify, defend and hold harmless the Licensor (and its officers, directors, employees, agents and Affiliates) against, any claim, loss, damage, settlement, cost, taxes, expense or other liability (including, without limitation, attorneys' fees) (each, a "Claim") arising from or related to: (a) any actual or alleged breach of any obligations in this Agreement; (b) any refund, adjustment, or return of Software,(c) any claim for actual or alleged infringement of any Intellectual Property Rights made by any third party or damages related thereto; or (d) Taxes.
+
+
+7. Limitation of Liability
+------------------------------
+
+The Licensor will not be liable for any direct, indirect, incidental, special, consequential or exemplary damages, including but not limited to, damages for loss of profits, goodwill, use, data or other intangible losses arising out of or in connection with the Software, whether in contract, warranty, tort etc. (including negligence, software liability, any type of civil responsibility or other theory or otherwise) to the Licensee or any other person for cost of software, cover, recovery or recoupment of any investment made by the Licensee or its affiliates in connection with this Agreement, or for any other loss of profit, revenue, business, or data or punitive or consequential damages arising out of or relating to this Agreement. Further, the aggregate liability of the Licensor, arising out of or in connection with this Agreement or the transactions contemplated hereby will not exceed at any time, or under any circumstances, the total amounts received by the Licensor from the Licensee in connection with the particular software giving rise to the claim.
+
+
+8. Force Majeure
+---------------------
+
+The Licensor will not be liable for any delay or failure to perform any of its obligations under this Agreement by reasons, events or other matters beyond its reasonable control.
+
+
+9. Relationship of Parties
+------------------------------
+
+The Licensor and Licensee are independent legal entities, and nothing in this Agreement will be construed to create a partnership, joint venture, association of persons, agency, franchise, sales representative, or employment relationship between the parties. The Licensee will have no authority to make or accept any offers or representations on behalf of the Licensor. The relationship between the parties is that of Licensor and Licensee only, and the rights, duties, liabilities of each party shall be governed by this Agreement.
+
+
+10. Modification
+------------------------
+
+The Licensor may amend any of the terms and conditions contained in this Agreement at any time and solely at its discretion. Any changes will be effective upon the posting of such changes on the Portal/ website, and the Licensee is responsible for reviewing these changes and informing itself of all applicable changes or notices. The continued use of a software by the Licensee after posting of any changes by the Licensor, will constitute the acceptance of such changes or modifications by the Licensee.
+
+
+
+11.Miscellaneous.
+-----------------------
+
+(a)General Provisions. This Agreement: (i) may be amended only by a writing signed by each of the parties; (ii) may be executed in several counterparts, each of which shall be deemed an original but all of which shall constitute one and the same instrument; (iii) contains the entire agreement of the parties with respect to the transactions contemplated hereby and supersedes all prior written and oral agreements, and all contemporaneous oral agreements, relating to such transactions; (iv) shall be governed by, and construed and enforced in accordance with, the laws of India; and (v) shall be binding upon, and inure to the benefit of, the parties and their respective successors and permitted assigns. Each of the parties hereby irrevocably submits to the jurisdiction of the Courts at Delhi, India, for the purposes of any action or proceeding arising out of or relating to this Agreement or the subject matter hereof and brought by any other party.
+
+
+(b)Assignment. Licensee cannot assign, pledge or otherwise transfer, whether by operation of law or otherwise, this Agreement, or any of its obligations hereunder, without the prior written consent of Licensor, which consent shall not be unreasonably withheld.
+
+
+(c)Notices. Unless otherwise specifically provided herein, all notices, consents, requests, demands and other communications required or permitted hereunder:
+
+
+(i)shall be in writing;
+
+
+(ii)shall be sent by messenger, certified or registered mail/email, or reliable express delivery service, to the appropriate address(es) set forth below; and
+
+
+(iii)shall be deemed to have been given on the date of receipt by the addressee, as evidenced by a receipt executed by the addressee (or a responsible person in his or her office), the records of the Party delivering such communication or a notice to the effect that such addressee refused to claim or accept such communication, if sent by messenger, mail or express delivery service.
+
+
+All such communications shall be sent to the following addresses or numbers, or to such other addresses or numbers as any party may inform the others by giving five days' prior notice:
+
+
+If to Webkul Software Pvt. Ltd.:
+
+
+
+Webkul Software Pvt. Ltd.
+
+H-28, ARV Park, Sector 63, NOIDA – 201301,
+
+Uttar Pradesh, India
+
+
+If to Licensee:
+
+At the address mentioned by the Licensee
+
+(at the time of placing order of generating Invoice)
+
+
+(d)Severability. It is the intent of the parties that the provisions of this Agreement be enforced to the fullest extent permissible under the laws and public policies of India in which enforcement hereof is sought. In furtherance of the foregoing, each provision hereof shall be severable from each other provision, and any provision hereof which is/ becomes unenforceable shall be subject to the following: (i) if such provision is contrary to or conflicts with any requirement of any statute, rule or regulation in effect, then such requirement shall be incorporated into, or substituted for, such unenforceable provision to the minimum extent necessary to make such provision enforceable; (ii) the court, agency or arbitrator considering the matter is hereby authorized to (or, if such court, agency or arbitrator is unwilling or fails to do so, then the parties shall) amend such provision to the minimum extent necessary to make such provision enforceable, and the parties hereby consent to the entry of an order so amending such provision; and (iii) if any such provision cannot be or is not reformed and made enforceable pursuant to clause (i) or (ii) above, then such provision shall be ineffective to the minimum extent necessary to make the remainder of this Agreement enforceable. Any application of the foregoing provisions to any provision hereof shall not effect the validity or enforceability of any other provision hereof.
+
+
+(e)By purchasing the Software, the Licensee acknowledge that it has read this Agreement, and that it agrees to the content of the Agreement, its terms and agree to use the Software in compliance with this Agreement.
+
+
+(f)The Licensor holds the sole copyright of the Software. The Software or any portion thereof is a copyrightable matter and is liable to be protected by the applicable laws. Copyright infringement in any manner can lead to prosecution according to the current law. The Licensor reserves the right to revoke the license of any user who is not holding any license or is holding an invalid license.
+
+
+(g)This Agreement gives the right to use only one copy of the Software on one domain solely for the own personal or business use of the Licensee, subject to all the terms and conditions of this Agreement. A separate License has to be purchased for each new Software installation. Any distribution of the Software without the written consent of the Licensor (including non-commercial distribution) is regarded as violation of this Agreement, and will entail immediate termination of the Agreement and may invite liability, both civil and criminal, as per applicable laws.
+
+
+(h)The Licensor reserves the rights to publish a selected list of users/ Licensees of its Software, and no permission of any Licensee is needed in this regard. The Licensee agrees that the Licensor may, in its sole discretion, disclose or make available any information provided or submitted by the Licensee or related to it under this Agreement to any judicial, quasi-judicial, governmental, regulatory or any other authority as may be required by the Licensor to co-operate and / or comply with any of their orders, instructions or directions or to fulfill any requirements under applicable Laws.
+
+
+(i)If the Licensee continues to use the Software even after the sending of the notice by the Licensor for termination, the Licensee agree to accept an injunction to restrain itself from its further use, and to pay all costs (including but not limited to reasonable attorney fees) to enforce injunction or to revoke the License, and any damages suffered by the Licensor because of the misuse of the Software by the Licensee.
+
+
+12. Arbitration
+-----------------------
+
+If any dispute arises between the Licensor and the Licensee at any time, in connection with the validity, interpretation, implementation or alleged breach of any provision of this Agreement, the same shall be referred to a sole Arbitrator who shall be an independent and neutral third party appointed exclusively by the Licensor. The Licensee shall not object to the appointment of the Arbitrator so appointed by the Licensor. The place of arbitration shall be Delhi, India. The Arbitration & Conciliation Act, 1996 as amended by The Arbitration & Conciliation (Amendment) Act, 2015, shall govern the arbitration proceedings. The arbitration proceedings shall be held in the English language.
diff --git a/modules/dashperformance/dashperformance.php b/modules/dashperformance/dashperformance.php
new file mode 100644
index 000000000..c7199a4c7
--- /dev/null
+++ b/modules/dashperformance/dashperformance.php
@@ -0,0 +1,94 @@
+name = 'dashperformance';
+ $this->tab = 'dashboard';
+ $this->version = '1.0.0';
+ $this->ps_versions_compliancy = array('min' => '1.6', 'max' => '1.6');
+ $this->author = 'Webkul';
+ $this->bootstrap = true;
+ parent::__construct();
+ $this->displayName = $this->l('Dashboard Performance');
+ $this->description = $this->l('Adds a block with a graphical representation of performance of your website.');
+ $this->confirmUnsinstall = $this->l('Are you sure you want to uninstall?');
+
+ $this->allow_push = true;
+ }
+
+ public function install()
+ {
+ return (parent::install()
+ && $this->registerHook('dashboardZoneTwo')
+ && $this->registerHook('dashboardData')
+ && $this->registerHook('actionAdminControllerSetMedia')
+ );
+ }
+
+ public function hookActionAdminControllerSetMedia()
+ {
+ if (get_class($this->context->controller) == 'AdminDashboardController') {
+ $this->context->controller->addJs($this->_path.'views/js/'.$this->name.'.js');
+ }
+ $this->context->controller->addCSS($this->_path.'views/css/'.$this->name.'.css');
+ }
+
+ public function hookDashboardZoneTwo($params)
+ {
+ return $this->display(__FILE__, 'dashboard_zone_two.tpl');
+ }
+
+ public function hookDashboardData($params)
+ {
+ $data = array();
+ if (Configuration::get('PS_DASHBOARD_SIMULATION')) {
+ $data['dp_average_daily_rate'] = Tools::displayPrice(round(rand(2000, 20000)));
+ $data['dp_cancellation_rate'] = (round(rand(1, 1000), 2) / 100).'%';
+ $data['dp_revenue'] = Tools::displayPrice(round(rand(20000, 70000)));
+ $data['dp_nights_stayed'] = rand(100, 1000);
+ } else {
+ $data['dp_average_daily_rate'] = AdminStatsController::getAverageDailyRate(
+ $params['date_from'],
+ $params['date_to']
+ );
+ $data['dp_cancellation_rate'] = AdminStatsController::getCancellationRate(
+ $params['date_from'],
+ $params['date_to']
+ );
+ $data['dp_revenue'] = AdminStatsController::getRevenue(
+ $params['date_from'],
+ $params['date_to']
+ );
+ $data['dp_nights_stayed'] = AdminStatsController::getNightsStayed(
+ $params['date_from'],
+ $params['date_to']
+ );
+ }
+
+ return array('data_value' => $data);
+ }
+}
diff --git a/modules/dashperformance/index.php b/modules/dashperformance/index.php
new file mode 100644
index 000000000..370358388
--- /dev/null
+++ b/modules/dashperformance/index.php
@@ -0,0 +1,29 @@
+dashperformance_2b87a85adc13f4bbd555376e5875b360'] = 'Dashboard-Leistung';
+$_MODULE['<{dashperformance}prestashop>dashperformance_01a59802a9fc001df283e6b2eb5382ca'] = 'Fügt einen Block mit einer grafischen Darstellung der Leistung Ihrer Website hinzu.';
+$_MODULE['<{dashperformance}prestashop>dashperformance_876f23178c29dc2552c0b48bf23cd9bd'] = 'Bist du sicher, dass du es deinstallieren willst?';
+$_MODULE['<{dashperformance}prestashop>chartdata_bbd86c81e760279d9731d5cac811ba50'] = 'Besetzt';
+$_MODULE['<{dashperformance}prestashop>chartdata_78945de8de090e90045d299651a68a9b'] = 'Erhältlich';
+$_MODULE['<{dashperformance}prestashop>chartdata_145e4e82f20061446c56546e3a0501e7'] = 'Inaktiv / Wartung';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_9446a98ad14416153cc4d45ab8b531bf'] = 'Leistung';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_63a6a88c066880c5ac42394a22803ca6'] = 'Aktualisierung';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_254f642527b45bc260048e30704edb39'] = 'Aufbau';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_93d459c645acd52c3d15d72e5ece52de'] = 'Durchschn. ';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_6c9fc730f967097688d1c43d1f2889e7'] = 'Stornierungsrate';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_54358a914f51e1af19df8520159fe607'] = 'Einnahmen';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_e7c3c94086501fb4cac569b5624ddb12'] = 'Übernachtungen';
diff --git a/modules/dashperformance/translations/es.php b/modules/dashperformance/translations/es.php
new file mode 100644
index 000000000..090ad497f
--- /dev/null
+++ b/modules/dashperformance/translations/es.php
@@ -0,0 +1,17 @@
+dashperformance_2b87a85adc13f4bbd555376e5875b360'] = 'Rendimiento del panel';
+$_MODULE['<{dashperformance}prestashop>dashperformance_01a59802a9fc001df283e6b2eb5382ca'] = 'Agrega un bloque con una representación gráfica del rendimiento de su sitio web.';
+$_MODULE['<{dashperformance}prestashop>dashperformance_876f23178c29dc2552c0b48bf23cd9bd'] = '¿Estas seguro que lo quieres desinstalar?';
+$_MODULE['<{dashperformance}prestashop>chartdata_bbd86c81e760279d9731d5cac811ba50'] = 'Ocupado';
+$_MODULE['<{dashperformance}prestashop>chartdata_78945de8de090e90045d299651a68a9b'] = 'Disponible';
+$_MODULE['<{dashperformance}prestashop>chartdata_145e4e82f20061446c56546e3a0501e7'] = 'Inactivo / mantenimiento';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_9446a98ad14416153cc4d45ab8b531bf'] = 'Rendimiento';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_63a6a88c066880c5ac42394a22803ca6'] = 'Actualizar';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_254f642527b45bc260048e30704edb39'] = 'Configuración';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_93d459c645acd52c3d15d72e5ece52de'] = 'Promedio ';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_6c9fc730f967097688d1c43d1f2889e7'] = 'Tasa de cancelación';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_54358a914f51e1af19df8520159fe607'] = 'Ingresos';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_e7c3c94086501fb4cac569b5624ddb12'] = 'Noches alojadas';
diff --git a/modules/dashperformance/translations/fr.php b/modules/dashperformance/translations/fr.php
new file mode 100644
index 000000000..c9ade62b7
--- /dev/null
+++ b/modules/dashperformance/translations/fr.php
@@ -0,0 +1,17 @@
+dashperformance_2b87a85adc13f4bbd555376e5875b360'] = 'Performances du tableau de bord';
+$_MODULE['<{dashperformance}prestashop>dashperformance_01a59802a9fc001df283e6b2eb5382ca'] = 'Ajoute un bloc avec une représentation graphique des performances de votre site Web.';
+$_MODULE['<{dashperformance}prestashop>dashperformance_876f23178c29dc2552c0b48bf23cd9bd'] = 'Êtes-vous sur de vouloir désinstaller?';
+$_MODULE['<{dashperformance}prestashop>chartdata_bbd86c81e760279d9731d5cac811ba50'] = 'Occupé';
+$_MODULE['<{dashperformance}prestashop>chartdata_78945de8de090e90045d299651a68a9b'] = 'Disponible';
+$_MODULE['<{dashperformance}prestashop>chartdata_145e4e82f20061446c56546e3a0501e7'] = 'Inactif/maintenance';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_9446a98ad14416153cc4d45ab8b531bf'] = 'Performance';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_63a6a88c066880c5ac42394a22803ca6'] = 'Rafraîchir';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_254f642527b45bc260048e30704edb39'] = 'Configuration';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_93d459c645acd52c3d15d72e5ece52de'] = 'Moy. ';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_6c9fc730f967097688d1c43d1f2889e7'] = 'Taux d\'annulation';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_54358a914f51e1af19df8520159fe607'] = 'Revenu';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_e7c3c94086501fb4cac569b5624ddb12'] = 'Nuits passées';
diff --git a/modules/dashperformance/translations/index.php b/modules/dashperformance/translations/index.php
new file mode 100644
index 000000000..370358388
--- /dev/null
+++ b/modules/dashperformance/translations/index.php
@@ -0,0 +1,29 @@
+dashperformance_2b87a85adc13f4bbd555376e5875b360'] = 'Prestazioni del cruscotto';
+$_MODULE['<{dashperformance}prestashop>dashperformance_01a59802a9fc001df283e6b2eb5382ca'] = 'Aggiunge un blocco con una rappresentazione grafica delle prestazioni del tuo sito web.';
+$_MODULE['<{dashperformance}prestashop>dashperformance_876f23178c29dc2552c0b48bf23cd9bd'] = 'Sei sicuro di voler disinstallare?';
+$_MODULE['<{dashperformance}prestashop>chartdata_bbd86c81e760279d9731d5cac811ba50'] = 'Occupato';
+$_MODULE['<{dashperformance}prestashop>chartdata_78945de8de090e90045d299651a68a9b'] = 'A disposizione';
+$_MODULE['<{dashperformance}prestashop>chartdata_145e4e82f20061446c56546e3a0501e7'] = 'Inattivo/manutenzione';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_9446a98ad14416153cc4d45ab8b531bf'] = 'Prestazione';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_63a6a88c066880c5ac42394a22803ca6'] = 'ricaricare';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_254f642527b45bc260048e30704edb39'] = 'Configurazione';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_93d459c645acd52c3d15d72e5ece52de'] = 'Media ';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_6c9fc730f967097688d1c43d1f2889e7'] = 'Tasso di cancellazione';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_54358a914f51e1af19df8520159fe607'] = 'Reddito';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_e7c3c94086501fb4cac569b5624ddb12'] = 'Pernottamenti';
diff --git a/modules/dashperformance/translations/nl.php b/modules/dashperformance/translations/nl.php
new file mode 100644
index 000000000..0fff0cc6c
--- /dev/null
+++ b/modules/dashperformance/translations/nl.php
@@ -0,0 +1,17 @@
+dashperformance_2b87a85adc13f4bbd555376e5875b360'] = 'Dashboardprestaties';
+$_MODULE['<{dashperformance}prestashop>dashperformance_01a59802a9fc001df283e6b2eb5382ca'] = 'Voegt een blok toe met een grafische weergave van de prestaties van uw website.';
+$_MODULE['<{dashperformance}prestashop>dashperformance_876f23178c29dc2552c0b48bf23cd9bd'] = 'Weet u zeker dat u de installatie ongedaan wilt maken?';
+$_MODULE['<{dashperformance}prestashop>chartdata_bbd86c81e760279d9731d5cac811ba50'] = 'Bezet';
+$_MODULE['<{dashperformance}prestashop>chartdata_78945de8de090e90045d299651a68a9b'] = 'Beschikbaar';
+$_MODULE['<{dashperformance}prestashop>chartdata_145e4e82f20061446c56546e3a0501e7'] = 'Inactief/ onderhoud';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_9446a98ad14416153cc4d45ab8b531bf'] = 'Uitvoering';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_63a6a88c066880c5ac42394a22803ca6'] = 'Vernieuwen';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_254f642527b45bc260048e30704edb39'] = 'Configuratie';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_93d459c645acd52c3d15d72e5ece52de'] = 'Gem. ';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_6c9fc730f967097688d1c43d1f2889e7'] = 'Annuleringstarief';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_54358a914f51e1af19df8520159fe607'] = 'Winst';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_e7c3c94086501fb4cac569b5624ddb12'] = 'Nachten verbleven';
diff --git a/modules/dashperformance/translations/pl.php b/modules/dashperformance/translations/pl.php
new file mode 100644
index 000000000..7fd2e82e5
--- /dev/null
+++ b/modules/dashperformance/translations/pl.php
@@ -0,0 +1,17 @@
+dashperformance_2b87a85adc13f4bbd555376e5875b360'] = 'Wydajność deski rozdzielczej';
+$_MODULE['<{dashperformance}prestashop>dashperformance_01a59802a9fc001df283e6b2eb5382ca'] = 'Dodaje blok z graficzną reprezentacją wydajności Twojej witryny.';
+$_MODULE['<{dashperformance}prestashop>dashperformance_876f23178c29dc2552c0b48bf23cd9bd'] = 'Jesteś pewien, że chcesz odinstalować?';
+$_MODULE['<{dashperformance}prestashop>chartdata_bbd86c81e760279d9731d5cac811ba50'] = 'Zajęty';
+$_MODULE['<{dashperformance}prestashop>chartdata_78945de8de090e90045d299651a68a9b'] = 'Do dyspozycji';
+$_MODULE['<{dashperformance}prestashop>chartdata_145e4e82f20061446c56546e3a0501e7'] = 'Nieaktywny/utrzymany';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_9446a98ad14416153cc4d45ab8b531bf'] = 'Wydajność';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_63a6a88c066880c5ac42394a22803ca6'] = 'Odświeżać';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_254f642527b45bc260048e30704edb39'] = 'Konfiguracja';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_93d459c645acd52c3d15d72e5ece52de'] = 'Śr. ';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_6c9fc730f967097688d1c43d1f2889e7'] = 'Wskaźnik anulowania';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_54358a914f51e1af19df8520159fe607'] = 'Przychód';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_e7c3c94086501fb4cac569b5624ddb12'] = 'Przebywane noce';
diff --git a/modules/dashperformance/translations/pt.php b/modules/dashperformance/translations/pt.php
new file mode 100644
index 000000000..ea62a916e
--- /dev/null
+++ b/modules/dashperformance/translations/pt.php
@@ -0,0 +1,17 @@
+dashperformance_2b87a85adc13f4bbd555376e5875b360'] = 'Desempenho do painel';
+$_MODULE['<{dashperformance}prestashop>dashperformance_01a59802a9fc001df283e6b2eb5382ca'] = 'Adiciona um bloco com uma representação gráfica do desempenho do seu site.';
+$_MODULE['<{dashperformance}prestashop>dashperformance_876f23178c29dc2552c0b48bf23cd9bd'] = 'Você tem certeza que quer desinstalar?';
+$_MODULE['<{dashperformance}prestashop>chartdata_bbd86c81e760279d9731d5cac811ba50'] = 'Ocupado';
+$_MODULE['<{dashperformance}prestashop>chartdata_78945de8de090e90045d299651a68a9b'] = 'Disponível';
+$_MODULE['<{dashperformance}prestashop>chartdata_145e4e82f20061446c56546e3a0501e7'] = 'Inativo / manutenção';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_9446a98ad14416153cc4d45ab8b531bf'] = 'atuação';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_63a6a88c066880c5ac42394a22803ca6'] = 'Refrescar';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_254f642527b45bc260048e30704edb39'] = 'Configuração';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_93d459c645acd52c3d15d72e5ece52de'] = 'Média ';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_6c9fc730f967097688d1c43d1f2889e7'] = 'Taxa de cancelamento';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_54358a914f51e1af19df8520159fe607'] = 'Receita';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_e7c3c94086501fb4cac569b5624ddb12'] = 'Noites hospedadas';
diff --git a/modules/dashperformance/translations/ru.php b/modules/dashperformance/translations/ru.php
new file mode 100644
index 000000000..2be6429e1
--- /dev/null
+++ b/modules/dashperformance/translations/ru.php
@@ -0,0 +1,17 @@
+dashperformance_2b87a85adc13f4bbd555376e5875b360'] = 'Производительность приборной панели';
+$_MODULE['<{dashperformance}prestashop>dashperformance_01a59802a9fc001df283e6b2eb5382ca'] = 'Добавляет блок с графическим представлением производительности вашего сайта.';
+$_MODULE['<{dashperformance}prestashop>dashperformance_876f23178c29dc2552c0b48bf23cd9bd'] = 'Вы уверены, что хотите удалить?';
+$_MODULE['<{dashperformance}prestashop>chartdata_bbd86c81e760279d9731d5cac811ba50'] = 'Занят';
+$_MODULE['<{dashperformance}prestashop>chartdata_78945de8de090e90045d299651a68a9b'] = 'Доступный';
+$_MODULE['<{dashperformance}prestashop>chartdata_145e4e82f20061446c56546e3a0501e7'] = 'Неактивный / обслуживание';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_9446a98ad14416153cc4d45ab8b531bf'] = 'Представление';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_63a6a88c066880c5ac42394a22803ca6'] = 'Обновить';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_254f642527b45bc260048e30704edb39'] = 'Конфигурация';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_93d459c645acd52c3d15d72e5ece52de'] = 'Средн. ';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_6c9fc730f967097688d1c43d1f2889e7'] = 'Скорость отмены';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_54358a914f51e1af19df8520159fe607'] = 'Доход';
+$_MODULE['<{dashperformance}prestashop>dashboard_zone_two_e7c3c94086501fb4cac569b5624ddb12'] = 'Ночей Остались';
diff --git a/modules/dashperformance/views/css/dashperformance.css b/modules/dashperformance/views/css/dashperformance.css
new file mode 100644
index 000000000..c725b20ef
--- /dev/null
+++ b/modules/dashperformance/views/css/dashperformance.css
@@ -0,0 +1,60 @@
+/**
+* 2010-2021 Webkul.
+*
+* NOTICE OF LICENSE
+*
+* All right is reserved,
+* Please go through LICENSE.txt file inside our module
+*
+* DISCLAIMER
+*
+* Do not edit or add to this file if you wish to upgrade this module to newer
+* versions in the future. If you wish to customize this module for your
+* needs please refer to CustomizationPolicy.txt file inside our module for more information.
+*
+* @author Webkul IN
+* @copyright 2010-2021 Webkul IN
+* @license LICENSE.txt
+*/
+
+/* square columns setup - start */
+#dashperformance .circles-wrapper > div {
+ padding: 15px !important;
+}
+
+#dashperformance .circle-wrapper {
+ position: relative;
+ width: 100%;
+ padding-bottom: 100%;
+}
+
+#dashperformance .circle {
+ position: absolute;
+}
+/* square columns setup - end */
+
+#dashperformance .circle {
+ width: 100%;
+ height: 100%;
+ border-radius: 50%;
+ cursor: pointer;
+}
+
+#dashperformance .circle-content-wrapper {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+
+#dashperformance .title-wrapper p {
+ font-weight: bold;
+ font-size: 14px;
+ line-height: 18px;
+}
+
+#dashperformance .value-wrapper p {
+ font-weight: bold;
+ font-size: 24px;
+ line-height: 30px;
+}
\ No newline at end of file
diff --git a/modules/dashperformance/views/index.php b/modules/dashperformance/views/index.php
new file mode 100644
index 000000000..8761a003e
--- /dev/null
+++ b/modules/dashperformance/views/index.php
@@ -0,0 +1,35 @@
+
+* @copyright 2007-2016 PrestaShop SA
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*/
+
+header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
+header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+
+header('Cache-Control: no-store, no-cache, must-revalidate');
+header('Cache-Control: post-check=0, pre-check=0', false);
+header('Pragma: no-cache');
+
+header('Location: ../');
+exit;
\ No newline at end of file
diff --git a/modules/dashperformance/views/templates/hook/dashboard_zone_two.tpl b/modules/dashperformance/views/templates/hook/dashboard_zone_two.tpl
new file mode 100644
index 000000000..011cc790f
--- /dev/null
+++ b/modules/dashperformance/views/templates/hook/dashboard_zone_two.tpl
@@ -0,0 +1,122 @@
+{**
+* 2010-2021 Webkul.
+*
+* NOTICE OF LICENSE
+*
+* All right is reserved,
+* Please go through LICENSE.txt file inside our module
+*
+* DISCLAIMER
+*
+* Do not edit or add to this file if you wish to upgrade this module to newer
+* versions in the future. If you wish to customize this module for your
+* needs please refer to CustomizationPolicy.txt file inside our module for more information.
+*
+* @author Webkul IN
+* @copyright 2010-2021 Webkul IN
+* @license LICENSE.txt
+*}
+
+
+
\ No newline at end of file
diff --git a/modules/dashperformance/views/templates/hook/index.php b/modules/dashperformance/views/templates/hook/index.php
new file mode 100644
index 000000000..8761a003e
--- /dev/null
+++ b/modules/dashperformance/views/templates/hook/index.php
@@ -0,0 +1,35 @@
+
+* @copyright 2007-2016 PrestaShop SA
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*/
+
+header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
+header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+
+header('Cache-Control: no-store, no-cache, must-revalidate');
+header('Cache-Control: post-check=0, pre-check=0', false);
+header('Pragma: no-cache');
+
+header('Location: ../');
+exit;
\ No newline at end of file
diff --git a/modules/dashperformance/views/templates/index.php b/modules/dashperformance/views/templates/index.php
new file mode 100644
index 000000000..8761a003e
--- /dev/null
+++ b/modules/dashperformance/views/templates/index.php
@@ -0,0 +1,35 @@
+
+* @copyright 2007-2016 PrestaShop SA
+* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
+* International Registered Trademark & Property of PrestaShop SA
+*/
+
+header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
+header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
+
+header('Cache-Control: no-store, no-cache, must-revalidate');
+header('Cache-Control: post-check=0, pre-check=0', false);
+header('Pragma: no-cache');
+
+header('Location: ../');
+exit;
\ No newline at end of file
diff --git a/modules/dashproducts/dashproducts.php b/modules/dashproducts/dashproducts.php
index d59645b9a..642df314e 100644
--- a/modules/dashproducts/dashproducts.php
+++ b/modules/dashproducts/dashproducts.php
@@ -33,7 +33,7 @@ public function __construct()
{
$this->name = 'dashproducts';
$this->tab = 'dashboard';
- $this->version = '1.0.0';
+ $this->version = '1.0.1';
$this->author = 'PrestaShop';
$this->push_filename = _PS_CACHE_DIR_.'push/activity';
@@ -55,11 +55,19 @@ public function install()
return (parent::install()
&& $this->registerHook('dashboardZoneTwo')
&& $this->registerHook('dashboardData')
+ && $this->registerHook('actionAdminControllerSetMedia')
&& $this->registerHook('actionObjectOrderAddAfter')
&& $this->registerHook('actionSearch')
);
}
+ public function hookActionAdminControllerSetMedia()
+ {
+ if (Tools::getValue('controller') == 'AdminDashboard') {
+ $this->context->controller->addCSS($this->_path.'views/css/dashproducts.css');
+ }
+ }
+
public function hookDashboardZoneTwo($params)
{
$this->context->smarty->assign(
@@ -101,10 +109,12 @@ public function getTableRecentOrders()
{
$header = array(
array('title' => $this->l('Customer Name'), 'class' => 'text-left'),
- array('title' => $this->l('Products'), 'class' => 'text-center'),
- array('title' => $this->l('Total').' '.$this->l('Tax excl.'), 'class' => 'text-center'),
- array('title' => $this->l('Date'), 'class' => 'text-center'),
- array('title' => $this->l('Status'), 'class' => 'text-center'),
+ array('title' => $this->l('Total Rooms'), 'class' => 'text-left'),
+ array('title' => $this->l('Order'), 'class' => 'text-left'),
+ array('title' => $this->l('Hotel'), 'class' => 'text-left'),
+ array('title' => $this->l('Total').' '.$this->l('Tax excl.'), 'class' => 'text-left'),
+ array('title' => $this->l('Date'), 'class' => 'text-left'),
+ array('title' => $this->l('Status'), 'class' => 'text-left'),
array('title' => '', 'class' => 'text-right'),
);
@@ -112,8 +122,13 @@ public function getTableRecentOrders()
$orders = Order::getOrdersWithInformations($limit);
$body = array();
- foreach ($orders as $order)
- {
+ foreach ($orders as $order) {
+ $bookingInfo = Db::getInstance()->getRow(
+ 'SELECT COUNT(*) AS `total_rooms`, hbd.`id_hotel`, hbd.`hotel_name`
+ FROM `'._DB_PREFIX_.'htl_booking_detail` hbd
+ WHERE `id_order` = '.(int)$order['id_order']
+ );
+
$currency = Currency::getCurrency((int)$order['id_currency']);
$tr = array();
$tr[] = array(
@@ -123,25 +138,38 @@ public function getTableRecentOrders()
);
$tr[] = array(
'id' => 'total_products',
- 'value' => count(OrderDetail::getList((int)$order['id_order'])),
- 'class' => 'text-center',
+ 'value' => $bookingInfo['total_rooms'],
+ 'class' => 'text-left',
+ );
+ $tr[] = array(
+ 'id' => 'order',
+ 'value' => '
#'.$order['id_order'].'',
+ 'class' => 'text-left',
+ );
+ $tr[] = array(
+ 'id' => 'hotel',
+ 'value' => '
'.
+ Tools::htmlentitiesUTF8($bookingInfo['hotel_name']).'',
+ 'class' => 'text-left',
);
$tr[] = array(
'id' => 'total_paid',
'value' => Tools::displayPrice((float)$order['total_paid'], $currency),
- 'class' => 'text-center',
+ 'class' => 'text-left',
'wrapper_start' => $order['valid'] ? '
' : '',
'wrapper_end' => '',
);
$tr[] = array(
'id' => 'date_add',
'value' => Tools::displayDate($order['date_add']),
- 'class' => 'text-center',
+ 'class' => 'text-left',
);
$tr[] = array(
'id' => 'status',
'value' => Tools::htmlentitiesUTF8($order['state_name']),
- 'class' => 'text-center',
+ 'class' => 'text-left',
);
$tr[] = array(
'id' => 'details',
@@ -167,17 +195,17 @@ public function getTableBestSellers($date_from, $date_to)
),
array(
'id' => 'product',
- 'title' => $this->l('Product'),
+ 'title' => $this->l('Room type'),
'class' => 'text-center',
),
array(
'id' => 'category',
- 'title' => $this->l('Category'),
+ 'title' => $this->l('Hotel'),
'class' => 'text-center',
),
array(
'id' => 'total_sold',
- 'title' => $this->l('Total sold'),
+ 'title' => $this->l('Total bookings'),
'class' => 'text-center',
),
array(
@@ -185,42 +213,33 @@ public function getTableBestSellers($date_from, $date_to)
'title' => $this->l('Sales'),
'class' => 'text-center',
),
- array(
- 'id' => 'net_profit',
- 'title' => $this->l('Net profit'),
- 'class' => 'text-center',
- )
);
$products = Db::getInstance()->ExecuteS(
- '
- SELECT
- product_id,
- product_name,
- SUM(product_quantity) as total,
- p.price as price,
- pa.price as price_attribute,
- SUM(total_price_tax_excl / conversion_rate) as sales,
- SUM(product_quantity * purchase_supplier_price / conversion_rate) as expenses
- FROM `'._DB_PREFIX_.'orders` o
- LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order
- LEFT JOIN `'._DB_PREFIX_.'product` p ON p.id_product = product_id
- LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON pa.id_product_attribute = od.product_attribute_id
- WHERE `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"
- AND valid = 1
- '.Shop::addSqlRestriction(false, 'o').'
- GROUP BY product_id, product_attribute_id
- ORDER BY total DESC
- LIMIT '.(int)Configuration::get('DASHPRODUCT_NBR_SHOW_BEST_SELLER', 10)
+ 'SELECT
+ hbd.`id_product`,
+ hbd.`room_type_name` AS `product_name`,
+ COUNT(hbd.`id_room`) AS `total`,
+ hbd.`total_price_tax_excl` AS `price`,
+ SUM(hbd.`total_price_tax_excl`) AS `sales`
+ FROM `'._DB_PREFIX_.'htl_booking_detail` hbd
+ LEFT JOIN `'._DB_PREFIX_.'orders` o ON (o.`id_order` = hbd.`id_order`)
+ WHERE o.`invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"
+ AND o.`valid` = 1 AND hbd.`is_refunded` = 0
+ GROUP BY hbd.`id_product`
+ ORDER BY `sales` DESC
+ LIMIT '.(int)Configuration::get('DASHPRODUCT_NBR_SHOW_BEST_SELLER', 10)
);
$body = array();
- foreach ($products as $product)
- {
- $product_obj = new Product((int)$product['product_id'], false, $this->context->language->id);
- if (!Validate::isLoadedObject($product_obj))
+ foreach ($products as $product) {
+ $product_obj = new Product((int)$product['id_product'], false, $this->context->language->id);
+ if (!Validate::isLoadedObject($product_obj)) {
continue;
- $category = new Category($product_obj->getDefaultCategory(), $this->context->language->id);
+ }
+
+ $objHotelRoomType = new HotelRoomType();
+ $roomTypeInfo = $objHotelRoomType->getRoomTypeInfoByIdProduct($product_obj->id);
$img = '';
if (($row_image = Product::getCover($product_obj->id)) && $row_image['id_image'])
@@ -231,9 +250,6 @@ public function getTableBestSellers($date_from, $date_to)
}
$productPrice = $product['price'];
- if (isset($product['price_attribute']) && $product['price_attribute'] != '0.000000') {
- $productPrice = $product['price_attribute'];
- }
$body[] = array(
array(
@@ -243,12 +259,17 @@ public function getTableBestSellers($date_from, $date_to)
),
array(
'id' => 'product',
- 'value' => ''.Tools::htmlentitiesUTF8($product['product_name']).''.'
'.Tools::displayPrice($productPrice),
+ 'value' => ''.
+ Tools::htmlentitiesUTF8($product['product_name']).''.
+ '
'.Tools::displayPrice($productPrice),
'class' => 'text-center'
),
array(
'id' => 'category',
- 'value' => $category->name,
+ 'value' => ''.
+ Tools::htmlentitiesUTF8($roomTypeInfo['hotel_name']).'',
'class' => 'text-center'
),
array(
@@ -261,11 +282,6 @@ public function getTableBestSellers($date_from, $date_to)
'value' => Tools::displayPrice($product['sales']),
'class' => 'text-center'
),
- array(
- 'id' => 'net_profit',
- 'value' => Tools::displayPrice($product['sales'] - $product['expenses']),
- 'class' => 'text-center'
- )
);
}
@@ -282,7 +298,12 @@ public function getTableMostViewed($date_from, $date_to)
),
array(
'id' => 'product',
- 'title' => $this->l('Product'),
+ 'title' => $this->l('Room type'),
+ 'class' => 'text-center',
+ ),
+ array(
+ 'id' => 'hotel',
+ 'title' => $this->l('Hotel'),
'class' => 'text-center',
),
array(
@@ -297,35 +318,36 @@ public function getTableMostViewed($date_from, $date_to)
),
array(
'id' => 'purchased',
- 'title' => $this->l('Purchased'),
+ 'title' => $this->l('Booked'),
'class' => 'text-center',
),
array(
'id' => 'rate',
- 'title' => $this->l('Percentage'),
+ 'title' => $this->l('Conversion rate'),
'class' => 'text-center',
)
);
- if (Configuration::get('PS_STATSDATA_PAGESVIEWS'))
- {
+ if (Configuration::get('PS_STATSDATA_PAGESVIEWS')) {
$products = $this->getTotalViewed($date_from, $date_to, (int)Configuration::get('DASHPRODUCT_NBR_SHOW_MOST_VIEWED'));
$body = array();
- if (is_array($products) && count($products))
- foreach ($products as $product)
- {
+ if (is_array($products) && count($products)) {
+ foreach ($products as $product) {
$product_obj = new Product((int)$product['id_object'], true, $this->context->language->id);
- if (!Validate::isLoadedObject($product_obj))
+ if (!Validate::isLoadedObject($product_obj)) {
continue;
+ }
$img = '';
- if (($row_image = Product::getCover($product_obj->id)) && $row_image['id_image'])
- {
+ if (($row_image = Product::getCover($product_obj->id)) && $row_image['id_image']) {
$image = new Image($row_image['id_image']);
$path_to_image = _PS_PROD_IMG_DIR_.$image->getExistingImgPath().'.'.$this->context->controller->imageType;
$img = ImageManager::thumbnail($path_to_image, 'product_mini_'.$product_obj->id.'.'.$this->context->controller->imageType, 45, $this->context->controller->imageType);
}
+ $objHRT = new HotelRoomType($product_obj->id);
+ $objHBI = new HotelBranchInformation($objHRT->id_hotel, $this->context->language->id);
+
$tr = array();
$tr[] = array(
'id' => 'product',
@@ -334,7 +356,17 @@ public function getTableMostViewed($date_from, $date_to)
);
$tr[] = array(
'id' => 'product',
- 'value' => Tools::htmlentitiesUTF8($product_obj->name).'
'.Tools::displayPrice(Product::getPriceStatic((int)$product_obj->id)),
+ 'value' => ''.
+ Tools::htmlentitiesUTF8($product_obj->name).''.'
'.
+ Tools::displayPrice(Product::getPriceStatic((int)$product_obj->id)),
+ 'class' => 'text-center',
+ );
+ $tr[] = array(
+ 'id' => 'hotel',
+ 'value' => ''.
+ Tools::htmlentitiesUTF8($objHBI->hotel_name).'',
'class' => 'text-center',
);
$tr[] = array(
@@ -351,7 +383,7 @@ public function getTableMostViewed($date_from, $date_to)
$purchased = $this->getTotalProductPurchased($date_from, $date_to, (int)$product_obj->id);
$tr[] = array(
'id' => 'purchased',
- 'value' => $this->getTotalProductPurchased($date_from, $date_to, (int)$product_obj->id),
+ 'value' => $purchased,
'class' => 'text-center',
);
$tr[] = array(
@@ -361,9 +393,10 @@ public function getTableMostViewed($date_from, $date_to)
);
$body[] = $tr;
}
+ }
}
else
- $body = ''.$this->l('You must enable the "Save global page views" option from the "Data mining for statistics" module in order to display the most viewed products, or use the Google Analytics module.').'
';
+ $body = ''.$this->l('You must enable the "Save global page views" option from the "Data mining for statistics" module in order to display the most viewed room types, or use the Google Analytics module.').'
';
return array('header' => $header, 'body' => $body);
}
@@ -372,48 +405,92 @@ public function getTableTop10MostSearch($date_from, $date_to)
$header = array(
array(
'id' => 'reference',
- 'title' => $this->l('Term'),
- 'class' => 'text-left'
+ 'title' => $this->l('Hotel'),
+ 'class' => 'text-center'
),
array(
- 'id' => 'name',
- 'title' => $this->l('Search'),
+ 'id' => 'image',
+ 'title' => $this->l('Cover image'),
'class' => 'text-center'
),
array(
- 'id' => 'totalQuantitySold',
- 'title' => $this->l('Results'),
+ 'id' => 'location',
+ 'title' => $this->l('Location'),
'class' => 'text-center'
- )
+ ),
+ array(
+ 'id' => 'count',
+ 'title' => $this->l('Count'),
+ 'class' => 'text-center'
+ ),
+ // array(
+ // 'id' => 'totalQuantitySold',
+ // 'title' => $this->l('Results'),
+ // 'class' => 'text-center'
+ // )
);
- $terms = $this->getMostSearchTerms($date_from, $date_to, (int)Configuration::get('DASHPRODUCT_NBR_SHOW_TOP_SEARCH'));
- $body = array();
- if (is_array($terms) && count($terms))
- foreach ($terms as $term)
- {
- $tr = array();
- $tr[] = array(
- 'id' => 'product',
- 'value' => $term['keywords'],
- 'class' => 'text-left',
- );
- $tr[] = array(
- 'id' => 'product',
- 'value' => $term['count_keywords'],
- 'class' => 'text-center',
- );
- $tr[] = array(
- 'id' => 'product',
- 'value' => $term['results'],
- 'class' => 'text-center',
- );
- $body[] = $tr;
- }
+ if (Configuration::get('PS_STATSDATA_PAGESVIEWS')) {
+ $hotels = $this->getMostSearchedHotels(
+ $date_from,
+ $date_to,
+ (int)Configuration::get('DASHPRODUCT_NBR_SHOW_TOP_SEARCH')
+ );
+
+ $body = array();
+ if (is_array($hotels) && count($hotels))
+ foreach ($hotels as $hotel) {
+ $objHBI = new HotelBranchInformation($hotel['id_hotel'], $this->context->language->id);
+ $tr = array();
+ $tr[] = array(
+ 'id' => 'reference',
+ 'value' => ''.
+ Tools::htmlentitiesUTF8($hotel['hotel_name']).'',
+ 'class' => 'text-center',
+ );
+ $tr[] = array(
+ 'id' => 'image',
+ 'value' => $this->getHotelImage($objHBI->id),
+ 'class' => 'text-center',
+ );
+ $tr[] = array(
+ 'id' => 'location',
+ 'value' => $objHBI->address,
+ 'class' => 'text-center',
+ );
+ $tr[] = array(
+ 'id' => 'views',
+ 'value' => $hotel['views'],
+ 'class' => 'text-center',
+ );
+ $body[] = $tr;
+ }
+ } else {
+ $body = ''.
+ $this->l('You must enable the "Save global page views" option from the "Data mining for statistics" module in order to display the most viewed room types, or use the Google Analytics module.').
+ '
';
+ }
return array('header' => $header, 'body' => $body);
}
+ public function getHotelImage($idHotel)
+ {
+ $imageDir = _MODULE_DIR_.'hotelreservationsystem/views/img/hotel_img/';
+ $noPictureImagePath = _PS_IMG_.'p/en.jpg';
+ $hotelImage = HotelImage::getCover($idHotel);
+ $imgLink = '';
+ if (is_array($hotelImage) && count($hotelImage)) {
+ $imagePath = $imageDir.$hotelImage['hotel_image_id'].'.jpg';
+ $imgLink = $imagePath;
+ } else {
+ $imgLink = $noPictureImagePath;
+ }
+
+ return '
';
+ }
+
public function getTableTop5Search()
{
$header = array(
@@ -436,7 +513,7 @@ public function getTotalProductSales($date_from, $date_to, $id_product)
WHERE od.`product_id` = '.(int)$id_product.'
'.Shop::addSqlRestriction(Shop::SHARE_ORDER, 'o').'
AND o.valid = 1
- AND o.`date_add` BETWEEN "'.pSQL($date_from).'" AND "'.pSQL($date_to).'"';
+ AND o.`date_add` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"';
return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
}
@@ -448,26 +525,23 @@ public function getTotalProductAddedCart($date_from, $date_to, $id_product)
FROM `'._DB_PREFIX_.'cart_product` cp
WHERE cp.`id_product` = '.(int)$id_product.'
'.Shop::addSqlRestriction(false, 'cp').'
- AND cp.`date_add` BETWEEN "'.pSQL($date_from).'" AND "'.pSQL($date_to).'"');
+ AND cp.`date_add` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"');
}
public function getTotalProductPurchased($date_from, $date_to, $id_product)
{
- return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
- SELECT count(`product_id`) as count
- FROM `'._DB_PREFIX_.'order_detail` od
- JOIN `'._DB_PREFIX_.'orders` o ON o.`id_order` = od.`id_order`
- WHERE od.`product_id` = '.(int)$id_product.'
- '.Shop::addSqlRestriction(false, 'od').'
- AND o.valid = 1
- AND o.`date_add` BETWEEN "'.pSQL($date_from).'" AND "'.pSQL($date_to).'"');
+ return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(
+ 'SELECT COUNT(hbd.`id_product`) AS `count`
+ FROM `'._DB_PREFIX_.'htl_booking_detail` hbd
+ WHERE hbd.`is_refunded` = 0 AND hbd.`is_back_order` = 0 AND hbd.`id_product` = '.(int)$id_product.'
+ AND hbd.`date_add` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"'
+ );
}
public function getTotalViewed($date_from, $date_to, $limit = 10)
{
$gapi = Module::isInstalled('gapi') ? Module::getInstanceByName('gapi') : false;
- if (Validate::isLoadedObject($gapi) && $gapi->isConfigured())
- {
+ if (Validate::isLoadedObject($gapi) && $gapi->isConfigured()) {
$products = array();
// Only works with the default product URL pattern at this time
if ($result = $gapi->requestReportData('ga:pagePath', 'ga:visits', $date_from, $date_to, '-ga:visits', 'ga:pagePath=~/([a-z]{2}/)?([a-z]+/)?[0-9][0-9]*\-.*\.html$', 1, 10))
@@ -479,33 +553,44 @@ public function getTotalViewed($date_from, $date_to, $limit = 10)
return $products;
}
- else
+ else {
return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
- SELECT p.id_object, pv.counter
+ SELECT p.id_object, SUM(pv.counter) AS `counter`
FROM `'._DB_PREFIX_.'page_viewed` pv
LEFT JOIN `'._DB_PREFIX_.'date_range` dr ON pv.`id_date_range` = dr.`id_date_range`
LEFT JOIN `'._DB_PREFIX_.'page` p ON pv.`id_page` = p.`id_page`
LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON pt.`id_page_type` = p.`id_page_type`
WHERE pt.`name` = \'product\'
'.Shop::addSqlRestriction(false, 'pv').'
- AND dr.`time_start` BETWEEN "'.pSQL($date_from).'" AND "'.pSQL($date_to).'"
- AND dr.`time_end` BETWEEN "'.pSQL($date_from).'" AND "'.pSQL($date_to).'"
+ AND dr.`time_start` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"
+ AND dr.`time_end` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"
+ GROUP BY p.id_object
+ ORDER BY `counter` DESC
LIMIT '.(int)$limit);
+ }
}
- public function getMostSearchTerms($date_from, $date_to, $limit = 10)
+ public function getMostSearchedHotels($date_from, $date_to, $limit = 10)
{
- if (!Module::isInstalled('statssearch'))
+ if (!Module::isInstalled('statsdata')) {
return array();
+ }
- return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
- SELECT `keywords`, count(`id_statssearch`) as count_keywords, `results`
- FROM `'._DB_PREFIX_.'statssearch` ss
- WHERE ss.`date_add` BETWEEN "'.pSQL($date_from).'" AND "'.pSQL($date_to).'"
- '.Shop::addSqlRestriction(false, 'ss').'
- GROUP BY ss.`keywords`
- ORDER BY `count_keywords` DESC
- LIMIT '.(int)$limit);
+ $pageType = Page::getPageTypeByName('category');
+ return Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
+ 'SELECT hbi.`id` AS `id_hotel`, cl.`name` AS `hotel_name`, pv.`counter` AS `views`
+ FROM `'._DB_PREFIX_.'page_viewed` pv
+ LEFT JOIN `'._DB_PREFIX_.'page` p ON (p.`id_page` = pv.`id_page`)
+ LEFT JOIN `'._DB_PREFIX_.'page_type` pt ON (pt.`id_page_type` = p.`id_page_type`)
+ LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (cl.`id_category` = p.`id_object`)
+ LEFT JOIN `'._DB_PREFIX_.'htl_branch_info` hbi ON (hbi.`id_category` = hbi.`id_category`)
+ LEFT JOIN `'._DB_PREFIX_.'date_range` dr ON (pv.`id_date_range` = dr.`id_date_range`)
+ WHERE pt.`name` = "'.pSQL('category').'"
+ AND dr.`time_start` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"
+ AND dr.`time_end` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"
+ GROUP BY p.`id_page_type`, p.`id_object`
+ LIMIT '.(int)$limit
+ );
}
public function renderConfigForm()
@@ -526,11 +611,11 @@ public function renderConfigForm()
$inputs = array(
array(
- 'label' => $this->l('Number of "Recent Orders" to display'),
+ 'label' => $this->l('Number of "Recent Bookings" to display'),
'config_name' => 'DASHPRODUCT_NBR_SHOW_LAST_ORDER'
),
array(
- 'label' => $this->l('Number of "Best Sellers" to display'),
+ 'label' => $this->l('Number of "Best Selling" to display'),
'config_name' => 'DASHPRODUCT_NBR_SHOW_BEST_SELLER'
),
array(
diff --git a/modules/dashproducts/translations/en.php b/modules/dashproducts/translations/en.php
new file mode 100644
index 000000000..445245a38
--- /dev/null
+++ b/modules/dashproducts/translations/en.php
@@ -0,0 +1,50 @@
+dashproducts_6655df4af87b2038afd507a33545a56d'] = 'Dashboard Products';
+$_MODULE['<{dashproducts}prestashop>dashproducts_4a528e24be5aca96e8a15b256efe1f31'] = 'Adds a block with a table of your latest orders and a ranking of your products';
+$_MODULE['<{dashproducts}prestashop>dashproducts_2ea989f83006e233627987293f4bde0a'] = 'Customer Name';
+$_MODULE['<{dashproducts}prestashop>dashproducts_068f80c7519d0528fb08e82137a72131'] = 'Products';
+$_MODULE['<{dashproducts}prestashop>dashproducts_96b0141273eabab320119c467cdcaf17'] = 'Total';
+$_MODULE['<{dashproducts}prestashop>dashproducts_58ef6750a23ba432fc1377b7de085d9f'] = 'Tax excl.';
+$_MODULE['<{dashproducts}prestashop>dashproducts_44749712dbec183e983dcd78a7736c41'] = 'Date';
+$_MODULE['<{dashproducts}prestashop>dashproducts_ec53a8c4f07baed5d8825072c89799be'] = 'Status';
+$_MODULE['<{dashproducts}prestashop>dashproducts_3ec365dd533ddb7ef3d1c111186ce872'] = 'Details';
+$_MODULE['<{dashproducts}prestashop>dashproducts_be53a0541a6d36f6ecb879fa2c584b08'] = 'Image';
+$_MODULE['<{dashproducts}prestashop>dashproducts_deb10517653c255364175796ace3553f'] = 'Product';
+$_MODULE['<{dashproducts}prestashop>dashproducts_3adbdb3ac060038aa0e6e6c138ef9873'] = 'Category';
+$_MODULE['<{dashproducts}prestashop>dashproducts_2aed3d711270a6ed67d21ec2d7cd4af8'] = 'Total sold';
+$_MODULE['<{dashproducts}prestashop>dashproducts_11ff9f68afb6b8b5b8eda218d7c83a65'] = 'Sales';
+$_MODULE['<{dashproducts}prestashop>dashproducts_9e79098315622e58529d664b9a8b3cf8'] = 'Net profit';
+$_MODULE['<{dashproducts}prestashop>dashproducts_ed4832a84ee072b00a6740f657183598'] = 'Views';
+$_MODULE['<{dashproducts}prestashop>dashproducts_2c04f1ad7694378897b98624780327ff'] = 'Added to cart';
+$_MODULE['<{dashproducts}prestashop>dashproducts_ce4ee01637f4279d02d0f232459dc9a4'] = 'Purchased';
+$_MODULE['<{dashproducts}prestashop>dashproducts_37be07209f53a5d636d5c904ca9ae64c'] = 'Percentage';
+$_MODULE['<{dashproducts}prestashop>dashproducts_1eb18ea1d018abef5759cef60ddc289b'] = 'You must enable the "Save global page views" option from the "Data mining for statistics" module in order to display the most viewed products, or use the Google Analytics module.';
+$_MODULE['<{dashproducts}prestashop>dashproducts_cf5f3091e30dee6597885d8c0e0c357f'] = 'Term';
+$_MODULE['<{dashproducts}prestashop>dashproducts_13348442cc6a27032d2b4aa28b75a5d3'] = 'Search';
+$_MODULE['<{dashproducts}prestashop>dashproducts_fd69c5cf902969e6fb71d043085ddee6'] = 'Results';
+$_MODULE['<{dashproducts}prestashop>dashproducts_38fb7d24e0d60a048f540ecb18e13376'] = ' Save ';
+$_MODULE['<{dashproducts}prestashop>dashproducts_ea4788705e6873b424c65e91c2846b19'] = 'Cancel';
+$_MODULE['<{dashproducts}prestashop>dashproducts_85bf7474324d7d02725e4dca586afcd9'] = 'Number of "Recent Orders" to display';
+$_MODULE['<{dashproducts}prestashop>dashproducts_735b8c7f6d50b4c6f818deeab3cdea4a'] = 'Number of "Best Sellers" to display';
+$_MODULE['<{dashproducts}prestashop>dashproducts_14d24dddc4c67abf8364b980b2ccd5a2'] = 'Number of "Most Viewed" to display';
+$_MODULE['<{dashproducts}prestashop>dashproducts_f1ee1eaab342241138d45f35f4d8466a'] = 'Number of "Top Searches" to display';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_3e361ce73ecabd6524af286d55809ed7'] = 'Products and Sales';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_f1206f9fadc5ce41694f69129aecac26'] = 'Configure';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_63a6a88c066880c5ac42394a22803ca6'] = 'Refresh';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_254f642527b45bc260048e30704edb39'] = 'Configuration';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_fd3458547ef9c3a8bd0e1e1b4ef2b4dd'] = 'Recent Orders';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_d7b2933ba512ada478c97fa43dd7ebe6'] = 'Best Sellers';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_be5006eb5af9ab6dbca803f8d3065bbc'] = 'Most Viewed';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_1eb5e5713d7363e921dd7f5500b6d212'] = 'Top Searches';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_3d23ac9ab254a9f1014c3a859b01bcfc'] = 'Last %d orders';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_82f0f8d535196ce2a6ea16652d981f94'] = 'Top %d products';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_5da618e8e4b89c66fe86e32cdafde142'] = 'From';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_01b6e20344b68835c5ed1ddedf20d531'] = 'to';
+$_MODULE['<{dashproducts}prestashop>dashboard_zone_two_1daaca459ce1e6610e0b97a9ad723f27'] = 'Top %d most search terms';
+
+
+return $_MODULE;
diff --git a/modules/dashproducts/views/css/dashproducts.css b/modules/dashproducts/views/css/dashproducts.css
new file mode 100644
index 000000000..c0008a3b3
--- /dev/null
+++ b/modules/dashproducts/views/css/dashproducts.css
@@ -0,0 +1,73 @@
+/**
+* 2010-2021 Webkul.
+*
+* NOTICE OF LICENSE
+*
+* All right is reserved,
+* Please go through LICENSE.txt file inside our module
+*
+* DISCLAIMER
+*
+* Do not edit or add to this file if you wish to upgrade this module to newer
+* versions in the future. If you wish to customize this module for your
+* needs please refer to CustomizationPolicy.txt file inside our module for more information.
+*
+* @author Webkul IN
+* @copyright 2010-2021 Webkul IN
+* @license LICENSE.txt
+*/
+
+/* start */
+.bootstrap #dashboard #dashproducts nav {
+ margin-bottom: 10px;
+ font: 400 1.1em/120% "Ubuntu Condensed", Helvetica, Arial, sans-serif;
+ text-transform: uppercase;
+ }
+/* end */
+
+.bootstrap #dashboard #dashproducts nav {
+ margin-top: 16px;
+ margin-bottom: 16px;
+ text-align: center;
+}
+
+#content.bootstrap #dashproducts section:last-child .tab-content.panel {
+ border-radius: 5px;
+ margin: 0 10px;
+}
+
+#dashproducts #table_top_10_most_search .hotel-thumbnail {
+ width: 55px;
+}
+
+#dashproducts section .nav-pills {
+ padding: 0 15%;
+ margin-top: 30px;
+ margin-bottom: 30px;
+}
+
+@media (max-width: 500px) {
+ #dashproducts section .nav-pills {
+ padding: 0 5%;
+ }
+}
+
+
+@media (max-width: 900px) {
+ #dashproducts section .nav-pills {
+ padding: 0 10%;
+ }
+}
+
+#dashproducts section .nav-pills .nav-item {
+ margin-bottom: 2px;
+}
+
+#dashproducts section .nav-pills .nav-item a {
+ border: 1px solid #00AFF0;
+ border-radius: 5px;
+}
+
+#dashproducts section .nav-pills .nav-item + .nav-item {
+ margin-left: 0px;
+}
\ No newline at end of file
diff --git a/modules/dashproducts/views/css/index.php b/modules/dashproducts/views/css/index.php
new file mode 100644
index 000000000..370358388
--- /dev/null
+++ b/modules/dashproducts/views/css/index.php
@@ -0,0 +1,29 @@
+
-* @copyright 2007-2016 PrestaShop SA
-* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
-* International Registered Trademark & Property of PrestaShop SA
+* @author Webkul IN
+* @copyright 2010-2021 Webkul IN
+* @license LICENSE.txt
*}
-