From 78a0bcf52ecd6a130b1b45dba96f9f17d98d240a Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 12 May 2024 00:06:28 +0000 Subject: [PATCH] bug fixes --- Admin/Install/Navigation.install.json | 336 +++- Admin/Routes/Web/Backend.php | 240 ++- Controller/BackendController.php | 282 +++- Models/ClientMapper.php | 2 + Models/GeneralMapper.php | 3 + Models/ItemMapper.php | 186 ++- Models/RegionMapper.php | 6 + Models/SalesRepMapper.php | 74 +- Theme/Backend/Lang/Navigation.de.lang.php | 3 +- Theme/Backend/Lang/Navigation.en.lang.php | 6 + Theme/Backend/Lang/de.lang.php | 2 +- Theme/Backend/Lang/en.lang.php | 7 +- Theme/Backend/analysis-item.tpl.php | 119 +- .../analysis-overview-dashboard.tpl.php | 105 +- Theme/Backend/analysis-region.tpl.php | 98 +- Theme/Backend/analysis-rep-annually.tpl.php | 202 +++ Theme/Backend/analysis-rep-monthly.tpl.php | 219 +++ Theme/Backend/analysis-rep-mtd.tpl.php | 113 ++ Theme/Backend/analysis-rep-ytd.tpl.php | 113 ++ Theme/Backend/analysis-rep.tpl.php | 1438 ----------------- 20 files changed, 1766 insertions(+), 1788 deletions(-) create mode 100755 Theme/Backend/analysis-rep-annually.tpl.php create mode 100755 Theme/Backend/analysis-rep-monthly.tpl.php create mode 100755 Theme/Backend/analysis-rep-mtd.tpl.php create mode 100755 Theme/Backend/analysis-rep-ytd.tpl.php delete mode 100755 Theme/Backend/analysis-rep.tpl.php diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json index 54f2a64..ff873e9 100755 --- a/Admin/Install/Navigation.install.json +++ b/Admin/Install/Navigation.install.json @@ -5,7 +5,7 @@ "type": 2, "subtype": 1, "name": "Analysis", - "uri": "{/base}/sales/analysis", + "uri": "{/base}/sales/analysis/ytd", "target": "self", "icon": null, "order": 15, @@ -14,34 +14,156 @@ "parent": 1001601001, "children": [ { - "id": 1001602001, + "id": 1005402001, "pid": "/sales/analysis", "type": 3, "subtype": 1, "name": "Dashboard", - "uri": "{/base}/sales/analysis", + "uri": "{/base}/sales/analysis/ytd", "target": "self", "icon": null, "order": 1, "from": "SalesAnalysis", "permission": { "permission": 2, "category": null, "element": null }, "parent": 1005401001, - "children": [] + "children": [ + { + "id": 1005402002, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "YTD", + "uri": "{/base}/sales/analysis/ytd", + "target": "self", + "icon": null, + "order": 1, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005402001, + "children": [] + }, + { + "id": 1005402003, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "MTD", + "uri": "{/base}/sales/analysis/mtd", + "target": "self", + "icon": null, + "order": 5, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005402001, + "children": [] + }, + { + "id": 1005402004, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "Monthly", + "uri": "{/base}/sales/analysis/monthly", + "target": "self", + "icon": null, + "order": 10, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005402001, + "children": [] + }, + { + "id": 1005402005, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "Annually", + "uri": "{/base}/sales/analysis/annually", + "target": "self", + "icon": null, + "order": 15, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005402001, + "children": [] + } + ] }, { - "id": 1001603001, + "id": 1005403001, "pid": "/sales/analysis", "type": 3, "subtype": 1, "name": "Item", - "uri": "{/base}/sales/analysis/item", + "uri": "{/base}/sales/analysis/item/ytd", "target": "self", "icon": null, "order": 5, "from": "SalesAnalysis", "permission": { "permission": 2, "category": null, "element": null }, "parent": 1005401001, - "children": [] + "children": [ + { + "id": 1005403002, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "YTD", + "uri": "{/base}/sales/analysis/item/ytd", + "target": "self", + "icon": null, + "order": 1, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005403001, + "children": [] + }, + { + "id": 1005403003, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "MTD", + "uri": "{/base}/sales/analysis/item/mtd", + "target": "self", + "icon": null, + "order": 5, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005403001, + "children": [] + }, + { + "id": 1005403004, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "Monthly", + "uri": "{/base}/sales/analysis/item/monthly", + "target": "self", + "icon": null, + "order": 10, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005403001, + "children": [] + }, + { + "id": 1005403005, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "Annually", + "uri": "{/base}/sales/analysis/item/annually", + "target": "self", + "icon": null, + "order": 15, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005403001, + "children": [] + } + ] }, { "id": 1005404001, @@ -49,14 +171,75 @@ "type": 3, "subtype": 1, "name": "Client", - "uri": "{/base}/sales/analysis/client", + "uri": "{/base}/sales/analysis/client/ytd", "target": "self", "icon": null, "order": 10, "from": "SalesAnalysis", "permission": { "permission": 2, "category": null, "element": null }, "parent": 1005401001, - "children": [] + "children": [ + { + "id": 1005404002, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "YTD", + "uri": "{/base}/sales/analysis/client/ytd", + "target": "self", + "icon": null, + "order": 1, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005404001, + "children": [] + }, + { + "id": 1005404003, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "MTD", + "uri": "{/base}/sales/analysis/client/mtd", + "target": "self", + "icon": null, + "order": 5, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005404001, + "children": [] + }, + { + "id": 1005404004, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "Monthly", + "uri": "{/base}/sales/analysis/client/monthly", + "target": "self", + "icon": null, + "order": 10, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005404001, + "children": [] + }, + { + "id": 1005404005, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "Annually", + "uri": "{/base}/sales/analysis/client/annually", + "target": "self", + "icon": null, + "order": 15, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005404001, + "children": [] + } + ] }, { "id": 1005405001, @@ -64,14 +247,15 @@ "type": 3, "subtype": 1, "name": "Bill", - "uri": "{/base}/sales/analysis/bill", + "uri": "{/base}/sales/analysis/bill/ytd", "target": "self", "icon": null, "order": 15, "from": "SalesAnalysis", "permission": { "permission": 2, "category": null, "element": null }, "parent": 1005401001, - "children": [] + "children": [], + "status": 3 }, { "id": 1005406001, @@ -79,14 +263,75 @@ "type": 3, "subtype": 1, "name": "Region", - "uri": "{/base}/sales/analysis/region", + "uri": "{/base}/sales/analysis/region/ytd", "target": "self", "icon": null, "order": 20, "from": "SalesAnalysis", "permission": { "permission": 2, "category": null, "element": null }, "parent": 1005401001, - "children": [] + "children": [ + { + "id": 1005406002, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "YTD", + "uri": "{/base}/sales/analysis/region/ytd", + "target": "self", + "icon": null, + "order": 1, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005406001, + "children": [] + }, + { + "id": 1005406003, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "MTD", + "uri": "{/base}/sales/analysis/region/mtd", + "target": "self", + "icon": null, + "order": 5, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005406001, + "children": [] + }, + { + "id": 1005406004, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "Monthly", + "uri": "{/base}/sales/analysis/region/monthly", + "target": "self", + "icon": null, + "order": 10, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005406001, + "children": [] + }, + { + "id": 1005406005, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "Annually", + "uri": "{/base}/sales/analysis/region/annually", + "target": "self", + "icon": null, + "order": 15, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005406001, + "children": [] + } + ] }, { "id": 1005407001, @@ -94,14 +339,75 @@ "type": 3, "subtype": 1, "name": "SalesRep", - "uri": "{/base}/sales/analysis/rep", + "uri": "{/base}/sales/analysis/rep/ytd", "target": "self", "icon": null, "order": 25, "from": "SalesAnalysis", "permission": { "permission": 2, "category": null, "element": null }, "parent": 1005401001, - "children": [] + "children": [ + { + "id": 1005407002, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "YTD", + "uri": "{/base}/sales/analysis/rep/ytd", + "target": "self", + "icon": null, + "order": 1, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005407001, + "children": [] + }, + { + "id": 1005407003, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "MTD", + "uri": "{/base}/sales/analysis/rep/mtd", + "target": "self", + "icon": null, + "order": 5, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005407001, + "children": [] + }, + { + "id": 1005407004, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "Monthly", + "uri": "{/base}/sales/analysis/rep/monthly", + "target": "self", + "icon": null, + "order": 10, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005407001, + "children": [] + }, + { + "id": 1005407005, + "pid": "/sales/analysis", + "type": 4, + "subtype": 1, + "name": "Annually", + "uri": "{/base}/sales/analysis/rep/annually", + "target": "self", + "icon": null, + "order": 15, + "from": "SalesAnalysis", + "permission": { "permission": 2, "category": null, "element": null }, + "parent": 1005407001, + "children": [] + } + ] } ] } diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index dddd8ac..3f70936 100755 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -6,9 +6,45 @@ use phpOMS\Account\PermissionType; use phpOMS\Router\RouteVerb; return [ - '^/sales/analysis(\?.*$|$)' => [ + '^/sales/analysis/ytd(\?.*$|$)' => [ [ - 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewDashboard', + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewDashboardYtd', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/mtd(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewDashboardMtd', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/monthly(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewDashboardMonthly', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/annually(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewDashboardAnnually', 'verb' => RouteVerb::GET, 'active' => true, 'permission' => [ @@ -19,9 +55,9 @@ return [ ], ], - '^/sales/analysis/bill(\?.*$|$)' => [ + '^/sales/analysis/bill/ytd(\?.*$|$)' => [ [ - 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewBillAnalysis', + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewBillAnalysisYtd', 'verb' => RouteVerb::GET, 'active' => true, 'permission' => [ @@ -31,9 +67,9 @@ return [ ], ], ], - '^/sales/analysis/rep(\?.*$|$)' => [ + '^/sales/analysis/bill/mtd(\?.*$|$)' => [ [ - 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewSalesRepAnalysis', + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewBillAnalysisMtd', 'verb' => RouteVerb::GET, 'active' => true, 'permission' => [ @@ -43,9 +79,9 @@ return [ ], ], ], - '^/sales/analysis/region(\?.*$|$)' => [ + '^/sales/analysis/bill/monthly(\?.*$|$)' => [ [ - 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewRegionAnalysis', + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewBillAnalysisMonthly', 'verb' => RouteVerb::GET, 'active' => true, 'permission' => [ @@ -55,9 +91,9 @@ return [ ], ], ], - '^/sales/analysis/client(\?.*$|$)' => [ + '^/sales/analysis/bill/annually(\?.*$|$)' => [ [ - 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewClientAnalysis', + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewBillAnalysisAnnually', 'verb' => RouteVerb::GET, 'active' => true, 'permission' => [ @@ -67,9 +103,189 @@ return [ ], ], ], - '^/sales/analysis/item(\?.*$|$)' => [ + '^/sales/analysis/rep/ytd(\?.*$|$)' => [ [ - 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewItemSalesAnalysis', + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewSalesRepAnalysisYtd', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/rep/mtd(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewSalesRepAnalysisMtd', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/rep/monthly(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewSalesRepAnalysisMonthly', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/rep/annually(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewSalesRepAnalysisAnnually', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/region/ytd(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewRegionAnalysisYtd', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/region/mtd(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewRegionAnalysisMtd', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/region/monthly(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewRegionAnalysisMonthly', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/region/annually(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewRegionAnalysisAnnually', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/client/ytd(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewClientAnalysisYtd', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/client/mtd(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewClientAnalysisMtd', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/client/monthly(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewClientAnalysisMonthly', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/client/annually(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewClientAnalysisAnnually', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/item/ytd(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewItemSalesAnalysisYtd', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/item/mtd(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewItemSalesAnalysisMtd', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/item/monthly(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewItemSalesAnalysisMonthly', + 'verb' => RouteVerb::GET, + 'active' => true, + 'permission' => [ + 'module' => BackendController::NAME, + 'type' => PermissionType::READ, + 'state' => PermissionCategory::DASHBOARD, + ], + ], + ], + '^/sales/analysis/item/annually(\?.*$|$)' => [ + [ + 'dest' => '\Modules\SalesAnalysis\Controller\BackendController:viewItemSalesAnalysisAnnually', 'verb' => RouteVerb::GET, 'active' => true, 'permission' => [ diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 7489e74..bc5a6f2 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -15,6 +15,7 @@ declare(strict_types=1); namespace Modules\SalesAnalysis\Controller; use Modules\Organization\Models\UnitMapper; +use Modules\Sales\Models\SalesRepMapper as ModelsSalesRepMapper; use Modules\SalesAnalysis\Models\ClientMapper; use Modules\SalesAnalysis\Models\GeneralMapper; use Modules\SalesAnalysis\Models\ItemMapper; @@ -58,7 +59,7 @@ final class BackendController extends Controller * * @since 1.0.0 */ - public function viewDashboard(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + public function viewDashboardYtd(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { $head = $response->data['Content']->head; $nonce = $this->app->appSettings->getOption('script-nonce'); @@ -162,7 +163,7 @@ final class BackendController extends Controller * @since 1.0.0 * @codeCoverageIgnore */ - public function viewRegionAnalysis(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + public function viewRegionAnalysisYtd(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { $head = $response->data['Content']->head; $nonce = $this->app->appSettings->getOption('script-nonce'); @@ -355,7 +356,7 @@ final class BackendController extends Controller * @since 1.0.0 * @codeCoverageIgnore */ - public function viewSalesRepAnalysis(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + public function viewSalesRepAnalysisYtd(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { $head = $response->data['Content']->head; $nonce = $this->app->appSettings->getOption('script-nonce'); @@ -365,8 +366,9 @@ final class BackendController extends Controller $head->addAsset(AssetType::JSLATE, 'Modules/SalesAnalysis/Controller/Controller.js?v=' . self::VERSION, ['nonce' => $nonce, 'type' => 'module']); $view = new View($this->app->l11nManager, $request, $response); - $view->setTemplate('/Modules/SalesAnalysis/Theme/Backend/analysis-rep'); + $view->setTemplate('/Modules/SalesAnalysis/Theme/Backend/analysis-rep-ytd'); $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1005401001, $request, $response); + $view->data['nav-sub'] = $this->app->moduleManager->get('Navigation')->createNavigationMidSub(1005407001, $request, $response); $businessStart = 1; $startOfYear = SmartDateTime::createFromDateTime(SmartDateTime::startOfYear($businessStart)); @@ -383,30 +385,11 @@ final class BackendController extends Controller $view->data['endComparison'] = $endComparison; $view->data['historyStart'] = $historyStart; - $domestic = UnitMapper::get() - ->with('mainAddress') - ->where('id', $this->app->unitId) - ->execute(); - - [ - $mtdCurrent, - $ytdCurrent, - $monthlyCurrent - ] = SalesRepMapper::monthlySalesProfit( - $startCurrent, - $endCurrent, - $businessStart - ); - - [ - $mtdPY, - $ytdPY, - $monthlyPY - ] = SalesRepMapper::monthlySalesProfit( - $startComparison, - $endComparison, - $businessStart - ); + $view->data['salesRep'] = ModelsSalesRepMapper::getAll() + ->with('main') + ->with('main/account') + ->where('unit', $this->app->unitId) + ->executeGetArray(); [ $view->data['mtdPYClientRep'], @@ -421,8 +404,6 @@ final class BackendController extends Controller $businessStart ); - $annualRepSales = SalesRepMapper::salesProfitRep($historyStart, $startCurrent, $startCurrent, $endCurrent); - [ $view->data['mtdPYClientRepCount'], $view->data['mtdAClientRepCount'], @@ -453,7 +434,242 @@ final class BackendController extends Controller * @since 1.0.0 * @codeCoverageIgnore */ - public function viewBillAnalysis(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + public function viewSalesRepAnalysisMtd(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + { + $head = $response->data['Content']->head; + $nonce = $this->app->appSettings->getOption('script-nonce'); + + $head->addAsset(AssetType::CSS, 'Resources/chartjs/chart.css?v=' . $this->app->version); + $head->addAsset(AssetType::JSLATE, 'Resources/chartjs/chart.js?v=' . $this->app->version, ['nonce' => $nonce]); + $head->addAsset(AssetType::JSLATE, 'Modules/SalesAnalysis/Controller/Controller.js?v=' . self::VERSION, ['nonce' => $nonce, 'type' => 'module']); + + $view = new View($this->app->l11nManager, $request, $response); + $view->setTemplate('/Modules/SalesAnalysis/Theme/Backend/analysis-rep-mtd'); + $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1005401001, $request, $response); + $view->data['nav-sub'] = $this->app->moduleManager->get('Navigation')->createNavigationMidSub(1005407001, $request, $response); + + $businessStart = 1; + $startOfYear = SmartDateTime::createFromDateTime(SmartDateTime::startOfYear($businessStart)); + $startCurrent = $request->getDataDateTime('startcurrent') ?? clone $startOfYear; + $endCurrent = $request->getDataDateTime('endcurrent') ?? SmartDateTime::endOfMonth(); + $endCurrentIndex = SmartDateTime::calculateMonthIndex((int) $endCurrent->format('m'), $businessStart); + $startComparison = $request->getDataDateTime('startcomparison') ?? SmartDateTime::createFromDateTime($startCurrent)->createModify(-1); + $endComparison = $request->getDataDateTime('endcomparison') ?? SmartDateTime::createFromDateTime(SmartDateTime::endOfYear($businessStart))->smartModify(-1); + $historyStart = $startOfYear->createModify(-9); + + $view->data['startCurrent'] = $startCurrent; + $view->data['endCurrent'] = $endCurrent; + $view->data['startComparison'] = $startComparison; + $view->data['endComparison'] = $endComparison; + $view->data['historyStart'] = $historyStart; + + $view->data['salesRep'] = ModelsSalesRepMapper::getAll() + ->with('main') + ->with('main/account') + ->where('unit', $this->app->unitId) + ->executeGetArray(); + + [ + $view->data['mtdPYClientRep'], + $view->data['mtdAClientRep'], + $view->data['ytdPYClientRep'], + $view->data['ytdAClientRep'], + ] = SalesRepMapper::mtdYtdRep( + $startCurrent, + $endCurrent, + $startComparison, + $endComparison, + $businessStart + ); + + [ + $view->data['mtdPYClientRepCount'], + $view->data['mtdAClientRepCount'], + $view->data['ytdPYClientRepCount'], + $view->data['ytdAClientRepCount'], + ] = SalesRepMapper::mtdYtdClientRep( + $startCurrent, + $endCurrent, + $startComparison, + $endComparison, + $businessStart + ); + + $annualRepCount = SalesRepMapper::annualCustomerRep(clone $historyStart, $endCurrent); + + return $view; + } + + /** + * Routing end-point for application behavior. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewSalesRepAnalysisMonthly(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + { + $head = $response->data['Content']->head; + $nonce = $this->app->appSettings->getOption('script-nonce'); + + $head->addAsset(AssetType::CSS, 'Resources/chartjs/chart.css?v=' . $this->app->version); + $head->addAsset(AssetType::JSLATE, 'Resources/chartjs/chart.js?v=' . $this->app->version, ['nonce' => $nonce]); + $head->addAsset(AssetType::JSLATE, 'Modules/SalesAnalysis/Controller/Controller.js?v=' . self::VERSION, ['nonce' => $nonce, 'type' => 'module']); + + $view = new View($this->app->l11nManager, $request, $response); + $view->setTemplate('/Modules/SalesAnalysis/Theme/Backend/analysis-rep-monthly'); + $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1005401001, $request, $response); + $view->data['nav-sub'] = $this->app->moduleManager->get('Navigation')->createNavigationMidSub(1005407001, $request, $response); + + $businessStart = 1; + $startOfYear = SmartDateTime::createFromDateTime(SmartDateTime::startOfYear($businessStart)); + $startCurrent = $request->getDataDateTime('startcurrent') ?? clone $startOfYear; + $endCurrent = $request->getDataDateTime('endcurrent') ?? SmartDateTime::endOfMonth(); + $endCurrentIndex = SmartDateTime::calculateMonthIndex((int) $endCurrent->format('m'), $businessStart); + $startComparison = $request->getDataDateTime('startcomparison') ?? SmartDateTime::createFromDateTime($startCurrent)->createModify(-1); + $endComparison = $request->getDataDateTime('endcomparison') ?? SmartDateTime::createFromDateTime(SmartDateTime::endOfYear($businessStart))->smartModify(-1); + $historyStart = $startOfYear->createModify(-9); + + $view->data['startCurrent'] = $startCurrent; + $view->data['endCurrent'] = $endCurrent; + $view->data['startComparison'] = $startComparison; + $view->data['endComparison'] = $endComparison; + $view->data['endCurrentIndex'] = $endCurrentIndex; + $view->data['historyStart'] = $historyStart; + + $view->data['salesRep'] = ModelsSalesRepMapper::getAll() + ->with('main') + ->with('main/account') + ->where('unit', $this->app->unitId) + ->executeGetArray(); + + + [ + $mtdCurrent, + $ytdCurrent, + $monthlyCurrent + ] = SalesRepMapper::monthlySalesProfit( + $startCurrent, + $endCurrent, + $businessStart + ); + + $view->data['monthlyRepCurrent'] = $monthlyCurrent; + + [ + $mtdPY, + $ytdPY, + $monthlyPY + ] = SalesRepMapper::monthlySalesProfit( + $startComparison, + $endComparison, + $businessStart + ); + + $view->data['monthlyRepPY'] = $monthlyPY; + + return $view; + } + + /** + * Routing end-point for application behavior. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewSalesRepAnalysisAnnually(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + { + $head = $response->data['Content']->head; + $nonce = $this->app->appSettings->getOption('script-nonce'); + + $head->addAsset(AssetType::CSS, 'Resources/chartjs/chart.css?v=' . $this->app->version); + $head->addAsset(AssetType::JSLATE, 'Resources/chartjs/chart.js?v=' . $this->app->version, ['nonce' => $nonce]); + $head->addAsset(AssetType::JSLATE, 'Modules/SalesAnalysis/Controller/Controller.js?v=' . self::VERSION, ['nonce' => $nonce, 'type' => 'module']); + + $view = new View($this->app->l11nManager, $request, $response); + $view->setTemplate('/Modules/SalesAnalysis/Theme/Backend/analysis-rep-annually'); + $view->data['nav'] = $this->app->moduleManager->get('Navigation')->createNavigationMid(1005401001, $request, $response); + $view->data['nav-sub'] = $this->app->moduleManager->get('Navigation')->createNavigationMidSub(1005407001, $request, $response); + + $businessStart = 1; + $startOfYear = SmartDateTime::createFromDateTime(SmartDateTime::startOfYear($businessStart)); + $startCurrent = $request->getDataDateTime('startcurrent') ?? clone $startOfYear; + $endCurrent = $request->getDataDateTime('endcurrent') ?? SmartDateTime::endOfMonth(); + $endCurrentIndex = SmartDateTime::calculateMonthIndex((int) $endCurrent->format('m'), $businessStart); + $startComparison = $request->getDataDateTime('startcomparison') ?? SmartDateTime::createFromDateTime($startCurrent)->createModify(-1); + $endComparison = $request->getDataDateTime('endcomparison') ?? SmartDateTime::createFromDateTime(SmartDateTime::endOfYear($businessStart))->smartModify(-1); + $historyStart = $startOfYear->createModify(-9); + + $view->data['startCurrent'] = $startCurrent; + $view->data['endCurrent'] = $endCurrent; + $view->data['startComparison'] = $startComparison; + $view->data['endComparison'] = $endComparison; + $view->data['historyStart'] = $historyStart; + + $view->data['salesRep'] = ModelsSalesRepMapper::getAll() + ->with('main') + ->with('main/account') + ->where('unit', $this->app->unitId) + ->executeGetArray(); + + + [ + $view->data['mtdPYClientRep'], + $view->data['mtdAClientRep'], + $view->data['ytdPYClientRep'], + $view->data['ytdAClientRep'], + ] = SalesRepMapper::mtdYtdRep( + $startCurrent, + $endCurrent, + $startComparison, + $endComparison, + $businessStart + ); + + $view->data['annualRep'] = SalesRepMapper::salesProfitRep($historyStart, $startCurrent, $startCurrent, $endCurrent); + + [ + $view->data['mtdPYClientRepCount'], + $view->data['mtdAClientRepCount'], + $view->data['ytdPYClientRepCount'], + $view->data['ytdAClientRepCount'], + ] = SalesRepMapper::mtdYtdClientRep( + $startCurrent, + $endCurrent, + $startComparison, + $endComparison, + $businessStart + ); + + $annualRepCount = SalesRepMapper::annualCustomerRep(clone $historyStart, $endCurrent); + + return $view; + } + + /** + * Routing end-point for application behavior. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param array $data Generic data + * + * @return RenderableInterface + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewBillAnalysisYtd(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { $head = $response->data['Content']->head; $nonce = $this->app->appSettings->getOption('script-nonce'); @@ -481,7 +697,7 @@ final class BackendController extends Controller * @since 1.0.0 * @codeCoverageIgnore */ - public function viewClientAnalysis(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + public function viewClientAnalysisYtd(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { $head = $response->data['Content']->head; $nonce = $this->app->appSettings->getOption('script-nonce'); @@ -656,7 +872,7 @@ final class BackendController extends Controller * @since 1.0.0 * @codeCoverageIgnore */ - public function viewItemSalesAnalysis(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface + public function viewItemSalesAnalysisYtd(RequestAbstract $request, ResponseAbstract $response, array $data = []) : RenderableInterface { $head = $response->data['Content']->head; $nonce = $this->app->appSettings->getOption('script-nonce'); diff --git a/Models/ClientMapper.php b/Models/ClientMapper.php index fbaa5bd..52ce58c 100755 --- a/Models/ClientMapper.php +++ b/Models/ClientMapper.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace Modules\SalesAnalysis\Models; +use Modules\Billing\Models\BillStatus; use Modules\Billing\Models\BillTransferType; use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; use phpOMS\DataStorage\Database\Query\Builder; @@ -73,6 +74,7 @@ class ClientMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $startComparison->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $endCurrent->format('Y-m-d') . '\' AND clientmgmt_attr_type_name IN (\'segment\', \'section\', \'client_group\', \'client_type\') diff --git a/Models/GeneralMapper.php b/Models/GeneralMapper.php index 1745ac4..2f649f5 100755 --- a/Models/GeneralMapper.php +++ b/Models/GeneralMapper.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace Modules\SalesAnalysis\Models; +use Modules\Billing\Models\BillStatus; use Modules\Billing\Models\BillTransferType; use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; use phpOMS\DataStorage\Database\Query\Builder; @@ -55,6 +56,7 @@ class GeneralMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $startComparison->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $endCurrent->format('Y-m-d') . '\' GROUP BY @@ -151,6 +153,7 @@ class GeneralMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $historyStart->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $endCurrent->format('Y-m-d') . '\' GROUP BY diff --git a/Models/ItemMapper.php b/Models/ItemMapper.php index 7f6ddb9..147ab71 100755 --- a/Models/ItemMapper.php +++ b/Models/ItemMapper.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace Modules\SalesAnalysis\Models; +use Modules\Billing\Models\BillStatus; use Modules\Billing\Models\BillTransferType; use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; use phpOMS\DataStorage\Database\Query\Builder; @@ -47,47 +48,54 @@ class ItemMapper extends DataMapperFactory $query = new Builder(self::$db); $query->raw( 'SELECT - itemmgmt_attr_type_name, - itemmgmt_attr_type_l11n_title, - itemmgmt_attr_value_id, - itemmgmt_attr_value_l11n_title, + segment, section, sales_group, product_group, product_type, YEAR(billing_bill_performance_date) as salesyear, MONTH(billing_bill_performance_date) as salesmonth, - SUM(billing_bill_element_total_netsalesprice * billing_type_sign) as netsales, - SUM(billing_bill_element_total_netprofit * billing_type_sign) as netprofit - FROM billing_bill - LEFT JOIN billing_type - ON billing_bill_type = billing_type_id - LEFT JOIN billing_bill_element - ON billing_bill_id = billing_bill_element_bill - LEFT JOIN itemmgmt_item - ON itemmgmt_item_id = billing_bill_element_item - LEFT JOIN itemmgmt_item_attr - ON itemmgmt_item_id = itemmgmt_item_attr_item - LEFT JOIN itemmgmt_attr_type - ON itemmgmt_item_attr_type = itemmgmt_attr_type_id - LEFT JOIN itemmgmt_attr_type_l11n - ON itemmgmt_attr_type_id = itemmgmt_attr_type_l11n_type AND itemmgmt_attr_type_l11n_lang = \'' . $language . '\' - LEFT JOIN itemmgmt_attr_value - ON itemmgmt_item_attr_value = itemmgmt_attr_value_id - LEFT JOIN itemmgmt_attr_value_l11n - ON itemmgmt_attr_value_id = itemmgmt_attr_value_l11n_value AND itemmgmt_attr_value_l11n_lang = \'' . $language . '\' - WHERE - billing_type_transfer_type = ' . BillTransferType::SALES . ' - AND billing_type_accounting = 1 - AND billing_bill_performance_date >= \'' . $startComparison->format('Y-m-d') . '\' - AND billing_bill_performance_date <= \'' . $endCurrent->format('Y-m-d') . '\' - AND itemmgmt_attr_type_name IN (\'segment\', \'section\', \'sales_group\', \'product_group\', \'product_type\') + SUM(netsales) AS netsales, + SUM(netprofit) AS netprofit + FROM ( + SELECT + MAX(CASE WHEN itemmgmt_attr_type.itemmgmt_attr_type_name = \'segment\' THEN itemmgmt_attr_value_l11n.itemmgmt_attr_value_l11n_title END) AS segment, + MAX(CASE WHEN itemmgmt_attr_type.itemmgmt_attr_type_name = \'section\' THEN itemmgmt_attr_value_l11n.itemmgmt_attr_value_l11n_title END) AS section, + MAX(CASE WHEN itemmgmt_attr_type.itemmgmt_attr_type_name = \'sales_group\' THEN itemmgmt_attr_value_l11n.itemmgmt_attr_value_l11n_title END) AS sales_group, + MAX(CASE WHEN itemmgmt_attr_type.itemmgmt_attr_type_name = \'product_group\' THEN itemmgmt_attr_value_l11n.itemmgmt_attr_value_l11n_title END) AS product_group, + MAX(CASE WHEN itemmgmt_attr_type.itemmgmt_attr_type_name = \'product_type\' THEN itemmgmt_attr_value_l11n.itemmgmt_attr_value_l11n_title END) AS product_type, + billing_bill_performance_date, + SUM(billing_bill_element_total_netsalesprice * billing_type_sign) as netsales, + SUM(billing_bill_element_total_netprofit * billing_type_sign) as netprofit + FROM billing_bill + LEFT JOIN billing_type + ON billing_bill_type = billing_type_id + LEFT JOIN billing_bill_element + ON billing_bill_id = billing_bill_element_bill + LEFT JOIN itemmgmt_item + ON itemmgmt_item_id = billing_bill_element_item + LEFT JOIN itemmgmt_item_attr + ON itemmgmt_item_id = itemmgmt_item_attr_item + LEFT JOIN itemmgmt_attr_type + ON itemmgmt_item_attr_type = itemmgmt_attr_type_id + LEFT JOIN itemmgmt_attr_type_l11n + ON itemmgmt_attr_type_id = itemmgmt_attr_type_l11n_type AND itemmgmt_attr_type_l11n_lang = \'' . $language . '\' + LEFT JOIN itemmgmt_attr_value + ON itemmgmt_item_attr_value = itemmgmt_attr_value_id + LEFT JOIN itemmgmt_attr_value_l11n + ON itemmgmt_attr_value_id = itemmgmt_attr_value_l11n_value AND itemmgmt_attr_value_l11n_lang = \'' . $language . '\' + WHERE + billing_type_transfer_type = ' . BillTransferType::SALES . ' + AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' + AND billing_bill_performance_date >= \'' . $startComparison->format('Y-m-d') . '\' + AND billing_bill_performance_date <= \'' . $endCurrent->format('Y-m-d') . '\' + AND itemmgmt_attr_type_name IN (\'segment\', \'section\', \'sales_group\', \'product_group\', \'product_type\') + GROUP BY billing_bill_performance_date + ) AS subquery GROUP BY - itemmgmt_attr_type_name, - itemmgmt_attr_type_l11n_title, - itemmgmt_attr_value_id, - itemmgmt_attr_value_l11n_title, + segment, section, sales_group, product_group, product_type, YEAR(billing_bill_performance_date), MONTH(billing_bill_performance_date) ORDER BY YEAR(billing_bill_performance_date) ASC, - MONTH(billing_bill_performance_date) ASC' + MONTH(billing_bill_performance_date) ASC;' ); $results = $query->execute()?->fetchAll(\PDO::FETCH_ASSOC) ?? []; @@ -95,11 +103,11 @@ class ItemMapper extends DataMapperFactory $oldIndex = 1; $period = 1; - $mtdAItemAttribute = []; - $mtdPYItemAttribute = []; + $mtdAItemAttribute = ['segment' => [], 'section' => [], 'sales_group' => [], 'product_group' => [], 'product_type' => []]; + $mtdPYItemAttribute = ['segment' => [], 'section' => [], 'sales_group' => [], 'product_group' => [], 'product_type' => []]; - $ytdAItemAttribute = []; - $ytdPYItemAttribute = []; + $ytdAItemAttribute = ['segment' => [], 'section' => [], 'sales_group' => [], 'product_group' => [], 'product_type' => []]; + $ytdPYItemAttribute = ['segment' => [], 'section' => [], 'sales_group' => [], 'product_group' => [], 'product_type' => []]; foreach ($results as $result) { $monthIndex = SmartDateTime::calculateMonthIndex((int) $result['salesmonth'], $businessStart); @@ -127,33 +135,113 @@ class ItemMapper extends DataMapperFactory if ($monthIndex === $endCurrentIndex) { if ($period === 1) { - $mtdPYItemAttribute[$result['itemmgmt_attr_type_name']] = $temp; + $mtdPYItemAttribute['segment'][$result['segment']] = $temp; + $mtdPYItemAttribute['section'][$result['section']] = $temp; + $mtdPYItemAttribute['sales_group'][$result['sales_group']] = $temp; + $mtdPYItemAttribute['product_group'][$result['product_group']] = $temp; + $mtdPYItemAttribute['product_type'][$result['product_type']] = $temp; } else { - $mtdAItemAttribute[$result['itemmgmt_attr_type_name']] = $temp; + $mtdAItemAttribute['segment'][$result['segment']] = $temp; + $mtdAItemAttribute['section'][$result['section']] = $temp; + $mtdAItemAttribute['sales_group'][$result['sales_group']] = $temp; + $mtdAItemAttribute['product_group'][$result['product_group']] = $temp; + $mtdAItemAttribute['product_type'][$result['product_type']] = $temp; } } if ($monthIndex <= $endCurrentIndex) { - if (!isset($ytdPYItemAttribute[$result['itemmgmt_attr_type_name']])) { - $ytdPYItemAttribute[$result['itemmgmt_attr_type_name']] = [ + if (!isset($ytdPYItemAttribute['segment'][$result['segment']])) { + $ytdPYItemAttribute['segment'][$result['segment']] = [ 'net_sales' => 0, 'net_profit' => 0, - 'value_l11n' => $result['itemmgmt_attr_value_l11n_title'], + 'value_l11n' => $result['segment'], ]; - $ytdAItemAttribute[$result['itemmgmt_attr_type_name']] = [ + $ytdAItemAttribute['segment'][$result['segment']] = [ 'net_sales' => 0, 'net_profit' => 0, - 'value_l11n' => $result['itemmgmt_attr_value_l11n_title'], + 'value_l11n' => $result['segment'], + ]; + } + + if (!isset($ytdPYItemAttribute['section'][$result['section']])) { + $ytdPYItemAttribute['section'][$result['section']] = [ + 'net_sales' => 0, + 'net_profit' => 0, + 'value_l11n' => $result['section'], + ]; + + $ytdAItemAttribute['section'][$result['section']] = [ + 'net_sales' => 0, + 'net_profit' => 0, + 'value_l11n' => $result['section'], + ]; + } + + if (!isset($ytdPYItemAttribute['sales_group'][$result['sales_group']])) { + $ytdPYItemAttribute['sales_group'][$result['sales_group']] = [ + 'net_sales' => 0, + 'net_profit' => 0, + 'value_l11n' => $result['sales_group'], + ]; + + $ytdAItemAttribute['sales_group'][$result['sales_group']] = [ + 'net_sales' => 0, + 'net_profit' => 0, + 'value_l11n' => $result['sales_group'], + ]; + } + + if (!isset($ytdPYItemAttribute['product_group'][$result['product_group']])) { + $ytdPYItemAttribute['product_group'][$result['product_group']] = [ + 'net_sales' => 0, + 'net_profit' => 0, + 'value_l11n' => $result['product_group'], + ]; + + $ytdAItemAttribute['product_group'][$result['product_group']] = [ + 'net_sales' => 0, + 'net_profit' => 0, + 'value_l11n' => $result['product_group'], + ]; + } + + if (!isset($ytdPYItemAttribute['product_type'][$result['product_type']])) { + $ytdPYItemAttribute['product_type'][$result['product_type']] = [ + 'net_sales' => 0, + 'net_profit' => 0, + 'value_l11n' => $result['product_type'], + ]; + + $ytdAItemAttribute['product_type'][$result['product_type']] = [ + 'net_sales' => 0, + 'net_profit' => 0, + 'value_l11n' => $result['product_type'], ]; } if ($period === 1) { - $ytdPYItemAttribute[$result['itemmgmt_attr_type_name']]['net_sales'] += $temp['net_sales']; - $ytdPYItemAttribute[$result['itemmgmt_attr_type_name']]['net_profit'] += $temp['net_profit']; + $ytdPYItemAttribute['segment'][$result['segment']]['net_sales'] += $temp['net_sales']; + $ytdPYItemAttribute['segment'][$result['segment']]['net_profit'] += $temp['net_profit']; + $ytdPYItemAttribute['section'][$result['section']]['net_sales'] += $temp['net_sales']; + $ytdPYItemAttribute['section'][$result['section']]['net_profit'] += $temp['net_profit']; + $ytdPYItemAttribute['sales_group'][$result['sales_group']]['net_sales'] += $temp['net_sales']; + $ytdPYItemAttribute['sales_group'][$result['sales_group']]['net_profit'] += $temp['net_profit']; + $ytdPYItemAttribute['product_group'][$result['product_group']]['net_sales'] += $temp['net_sales']; + $ytdPYItemAttribute['product_group'][$result['product_group']]['net_profit'] += $temp['net_profit']; + $ytdPYItemAttribute['product_type'][$result['product_type']]['net_sales'] += $temp['net_sales']; + $ytdPYItemAttribute['product_type'][$result['product_type']]['net_profit'] += $temp['net_profit']; } else { - $ytdAItemAttribute[$result['itemmgmt_attr_type_name']]['net_sales'] += $temp['net_sales']; - $ytdAItemAttribute[$result['itemmgmt_attr_type_name']]['net_profit'] += $temp['net_profit']; + $ytdAItemAttribute['segment'][$result['segment']]['net_sales'] += $temp['net_sales']; + $ytdAItemAttribute['segment'][$result['segment']]['net_profit'] += $temp['net_profit']; + $ytdAItemAttribute['section'][$result['section']]['net_sales'] += $temp['net_sales']; + $ytdAItemAttribute['section'][$result['section']]['net_profit'] += $temp['net_profit']; + $ytdAItemAttribute['sales_group'][$result['sales_group']]['net_sales'] += $temp['net_sales']; + $ytdAItemAttribute['sales_group'][$result['sales_group']]['net_profit'] += $temp['net_profit']; + $ytdAItemAttribute['product_group'][$result['product_group']]['net_sales'] += $temp['net_sales']; + $ytdAItemAttribute['product_group'][$result['product_group']]['net_profit'] += $temp['net_profit']; + $ytdAItemAttribute['product_type'][$result['product_type']]['net_sales'] += $temp['net_sales']; + $ytdAItemAttribute['product_type'][$result['product_type']]['net_profit'] += $temp['net_profit']; } } } diff --git a/Models/RegionMapper.php b/Models/RegionMapper.php index 796855b..8085bba 100755 --- a/Models/RegionMapper.php +++ b/Models/RegionMapper.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace Modules\SalesAnalysis\Models; +use Modules\Billing\Models\BillStatus; use Modules\Billing\Models\BillTransferType; use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; use phpOMS\DataStorage\Database\Query\Builder; @@ -62,6 +63,7 @@ class RegionMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $start->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $end->format('Y-m-d') . '\' GROUP BY @@ -145,6 +147,7 @@ class RegionMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $historyStart->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $endCurrent->format('Y-m-d') . '\' GROUP BY @@ -229,6 +232,7 @@ class RegionMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $startComparison->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $endCurrent->format('Y-m-d') . '\' GROUP BY @@ -339,6 +343,7 @@ class RegionMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $historyStart->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $currentEnd->format('Y-m-d') . '\' GROUP BY @@ -406,6 +411,7 @@ class RegionMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $startComparison->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $endCurrent->format('Y-m-d') . '\' GROUP BY diff --git a/Models/SalesRepMapper.php b/Models/SalesRepMapper.php index d2a2f19..0f16c73 100755 --- a/Models/SalesRepMapper.php +++ b/Models/SalesRepMapper.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace Modules\SalesAnalysis\Models; +use Modules\Billing\Models\BillStatus; use Modules\Billing\Models\BillTransferType; use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; use phpOMS\DataStorage\Database\Query\Builder; @@ -58,6 +59,7 @@ class SalesRepMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $start->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $end->format('Y-m-d') . '\' GROUP BY @@ -141,6 +143,7 @@ class SalesRepMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $historyStart->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $endCurrent->format('Y-m-d') . '\' GROUP BY @@ -225,6 +228,7 @@ class SalesRepMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $startComparison->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $endCurrent->format('Y-m-d') . '\' GROUP BY @@ -242,11 +246,11 @@ class SalesRepMapper extends DataMapperFactory $oldIndex = 1; $period = 1; - $mtdAClientCountry = []; - $mtdPYClientCountry = []; + $mtdAClientRep = []; + $mtdPYClientRep = []; - $ytdAClientCountry = []; - $ytdPYClientCountry = []; + $ytdAClientRep = []; + $ytdPYClientRep = []; foreach ($results as $result) { $monthIndex = SmartDateTime::calculateMonthIndex((int) $result['salesmonth'], $businessStart); @@ -273,36 +277,36 @@ class SalesRepMapper extends DataMapperFactory if ($monthIndex === $endCurrentIndex) { if ($period === 1) { - $mtdPYClientCountry[$result['billing_bill_rep']] = $temp; + $mtdPYClientRep[$result['billing_bill_rep']] = $temp; } else { - $mtdAClientCountry[$result['billing_bill_rep']] = $temp; + $mtdAClientRep[$result['billing_bill_rep']] = $temp; } } if ($monthIndex <= $endCurrentIndex) { - if (!isset($ytdPYClientCountry[$result['billing_bill_rep']])) { - $ytdPYClientCountry[$result['billing_bill_rep']] = [ + if (!isset($ytdPYClientRep[$result['billing_bill_rep']])) { + $ytdPYClientRep[$result['billing_bill_rep']] = [ 'client_count' => 0, ]; - $ytdAClientCountry[$result['billing_bill_rep']] = [ + $ytdAClientRep[$result['billing_bill_rep']] = [ 'client_count' => 0, ]; } if ($period === 1) { - $ytdPYClientCountry[$result['billing_bill_rep']]['client_count'] += $temp['client_count']; + $ytdPYClientRep[$result['billing_bill_rep']]['client_count'] += $temp['client_count']; } else { - $ytdAClientCountry[$result['billing_bill_rep']]['client_count'] += $temp['client_count']; + $ytdAClientRep[$result['billing_bill_rep']]['client_count'] += $temp['client_count']; } } } return [ - $mtdPYClientCountry, - $mtdAClientCountry, - $ytdPYClientCountry, - $ytdAClientCountry, + $mtdPYClientRep, + $mtdAClientRep, + $ytdPYClientRep, + $ytdAClientRep, ]; } @@ -328,6 +332,10 @@ class SalesRepMapper extends DataMapperFactory FROM billing_bill LEFT JOIN billing_type ON billing_bill_type = billing_type_id + LEFT JOIN sales_rep + ON billing_bill_rep = sales_rep_id + LEFT JOIN account + ON sales_rep_main = account_id LEFT JOIN clientmgmt_client ON clientmgmt_client_id = billing_bill_client LEFT JOIN address @@ -335,6 +343,7 @@ class SalesRepMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $historyStart->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $currentEnd->format('Y-m-d') . '\' GROUP BY @@ -402,6 +411,7 @@ class SalesRepMapper extends DataMapperFactory WHERE billing_type_transfer_type = ' . BillTransferType::SALES . ' AND billing_type_accounting = 1 + AND billing_bill_status = ' . BillStatus::ARCHIVED . ' AND billing_bill_performance_date >= \'' . $startComparison->format('Y-m-d') . '\' AND billing_bill_performance_date <= \'' . $endCurrent->format('Y-m-d') . '\' GROUP BY @@ -419,11 +429,11 @@ class SalesRepMapper extends DataMapperFactory $oldIndex = 1; $period = 1; - $mtdAClientCountry = []; - $mtdPYClientCountry = []; + $mtdAClientRep = []; + $mtdPYClientRep = []; - $ytdAClientCountry = []; - $ytdPYClientCountry = []; + $ytdAClientRep = []; + $ytdPYClientRep = []; foreach ($results as $result) { $monthIndex = SmartDateTime::calculateMonthIndex((int) $result['salesmonth'], $businessStart); @@ -451,40 +461,40 @@ class SalesRepMapper extends DataMapperFactory if ($monthIndex === $endCurrentIndex) { if ($period === 1) { - $mtdPYClientCountry[$result['billing_bill_rep']] = $temp; + $mtdPYClientRep[$result['billing_bill_rep']] = $temp; } else { - $mtdAClientCountry[$result['billing_bill_rep']] = $temp; + $mtdAClientRep[$result['billing_bill_rep']] = $temp; } } if ($monthIndex <= $endCurrentIndex) { - if (!isset($ytdPYClientCountry[$result['billing_bill_rep']])) { - $ytdPYClientCountry[$result['billing_bill_rep']] = [ + if (!isset($ytdPYClientRep[$result['billing_bill_rep']])) { + $ytdPYClientRep[$result['billing_bill_rep']] = [ 'net_sales' => 0, 'net_profit' => 0, ]; - $ytdAClientCountry[$result['billing_bill_rep']] = [ + $ytdAClientRep[$result['billing_bill_rep']] = [ 'net_sales' => 0, 'net_profit' => 0, ]; } if ($period === 1) { - $ytdPYClientCountry[$result['billing_bill_rep']]['net_sales'] += $temp['net_sales']; - $ytdPYClientCountry[$result['billing_bill_rep']]['net_profit'] += $temp['net_profit']; + $ytdPYClientRep[$result['billing_bill_rep']]['net_sales'] += $temp['net_sales']; + $ytdPYClientRep[$result['billing_bill_rep']]['net_profit'] += $temp['net_profit']; } else { - $ytdAClientCountry[$result['billing_bill_rep']]['net_sales'] += $temp['net_sales']; - $ytdAClientCountry[$result['billing_bill_rep']]['net_profit'] += $temp['net_profit']; + $ytdAClientRep[$result['billing_bill_rep']]['net_sales'] += $temp['net_sales']; + $ytdAClientRep[$result['billing_bill_rep']]['net_profit'] += $temp['net_profit']; } } } return [ - $mtdPYClientCountry, - $mtdAClientCountry, - $ytdPYClientCountry, - $ytdAClientCountry, + $mtdPYClientRep, + $mtdAClientRep, + $ytdPYClientRep, + $ytdAClientRep, ]; } } diff --git a/Theme/Backend/Lang/Navigation.de.lang.php b/Theme/Backend/Lang/Navigation.de.lang.php index 3e96216..a1380dc 100755 --- a/Theme/Backend/Lang/Navigation.de.lang.php +++ b/Theme/Backend/Lang/Navigation.de.lang.php @@ -13,7 +13,7 @@ declare(strict_types=1); return ['Navigation' => [ - 'Analysis' => 'Analyse', + 'Analysis' => 'Auswertung', 'Dashboard' => 'Dashboard', 'Database' => 'Database', 'Invoices' => 'Rechnungen', @@ -21,4 +21,5 @@ return ['Navigation' => [ 'Overview' => 'Übersicht', 'Products' => 'Produkte', 'Regions' => 'Regionen', + 'SalesRep' => 'Verkäufer', ]]; diff --git a/Theme/Backend/Lang/Navigation.en.lang.php b/Theme/Backend/Lang/Navigation.en.lang.php index e0f0255..d466610 100755 --- a/Theme/Backend/Lang/Navigation.en.lang.php +++ b/Theme/Backend/Lang/Navigation.en.lang.php @@ -21,4 +21,10 @@ return ['Navigation' => [ 'Overview' => 'Overview', 'Products' => 'Products', 'Regions' => 'Regions', + 'YTD' => 'YTD', + 'MTD' => 'MTD', + 'Monthly' => 'Monthly', + 'Annually' => 'Annually', + 'SalesRep' => 'Sales Reps', + 'SalesRep' => 'Sales Rep', ]]; diff --git a/Theme/Backend/Lang/de.lang.php b/Theme/Backend/Lang/de.lang.php index 2971838..57ded14 100755 --- a/Theme/Backend/Lang/de.lang.php +++ b/Theme/Backend/Lang/de.lang.php @@ -68,6 +68,6 @@ return ['SalesAnalysis' => [ 'America' => 'Amerika', 'Oceania' => 'Ozeanien', 'Africa' => 'Afrika', - 'SalesRep' => 'Verkäufer', 'SalesReps' => 'Verkäufer', + 'SalesRep' => 'Verkäufer', ]]; diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index e463f22..509a250 100755 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -68,6 +68,9 @@ return ['SalesAnalysis' => [ 'America' => 'America', 'Oceania' => 'Oceania', 'Africa' => 'Africa', - 'SalesRep' => 'SalesRep', - 'SalesReps' => 'SalesReps', + 'YTD' => 'YTD', + 'Monthly' => 'Monthly', + 'Annually' => 'Annually', + 'SalesReps' => 'Sales Reps', + 'SalesRep' => 'Sales Rep', ]]; diff --git a/Theme/Backend/analysis-item.tpl.php b/Theme/Backend/analysis-item.tpl.php index ac5d28b..ab23feb 100755 --- a/Theme/Backend/analysis-item.tpl.php +++ b/Theme/Backend/analysis-item.tpl.php @@ -49,29 +49,26 @@ echo $this->data['nav']->render(); getHtml('DiffPY'); ?> (getHtml('MTD'); ?>) data['ytdAItemAttribute'] as $type => $values) : - if ($type !== 'segment') { - continue; - } + foreach ($this->data['ytdAItemAttribute']['segment'] as $values) : ?> - printHtml($this->data['ytdPYItemAttribute'][$type]['value_l11n']); ?> - getCurrency((int) ($this->data['ytdPYItemAttribute'][$type]['net_sales'] ?? 0)); ?> - getCurrency((int) ($this->data['ytdAItemAttribute'][$type]['net_sales'] ?? 0)); ?> + printHtml($values['value_l11n']); ?> + getCurrency((int) ($this->data['ytdPYItemAttribute']['segment'][$values['value_l11n']]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['ytdAItemAttribute']['segment'][$values['value_l11n']]['net_sales'] ?? 0)); ?> getCurrency( - ((int) ($this->data['ytdAItemAttribute'][$type]['net_sales'] ?? 0)) - - ((int) ($this->data['ytdPYItemAttribute'][$type]['net_sales'] ?? 0)) + ((int) ($this->data['ytdAItemAttribute']['segment'][$values['value_l11n']]['net_sales'] ?? 0)) - + ((int) ($this->data['ytdPYItemAttribute']['segment'][$values['value_l11n']]['net_sales'] ?? 0)) ); ?> - getCurrency((int) ($this->data['mtdPYItemAttribute'][$type]['net_sales'] ?? 0)); ?> - getCurrency((int) ($this->data['mtdAItemAttribute'][$type]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['mtdPYItemAttribute']['segment'][$values['value_l11n']]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['mtdAItemAttribute']['segment'][$values['value_l11n']]['net_sales'] ?? 0)); ?> getCurrency( - ((int) ($this->data['mtdAItemAttribute'][$type]['net_sales'] ?? 0)) - - ((int) ($this->data['mtdPYItemAttribute'][$type]['net_sales'] ?? 0)) + ((int) ($this->data['mtdAItemAttribute']['segment'][$values['value_l11n']]['net_sales'] ?? 0)) - + ((int) ($this->data['mtdPYItemAttribute']['segment'][$values['value_l11n']]['net_sales'] ?? 0)) ); ?> - + @@ -94,25 +91,22 @@ echo $this->data['nav']->render(); getHtml('SalesA'); ?> (getHtml('MTD'); ?>) getHtml('DiffPY'); ?> (getHtml('MTD'); ?>) - data['ytdAItemAttribute'] as $type => $values) : - if ($type !== 'section') { - continue; - } + data['ytdAItemAttribute']['section'] as $values) : ?> - printHtml($this->data['ytdPYItemAttribute'][$type]['value_l11n']); ?> - getCurrency((int) ($this->data['ytdPYItemAttribute'][$type]['net_sales'] ?? 0)); ?> - getCurrency((int) ($this->data['ytdAItemAttribute'][$type]['net_sales'] ?? 0)); ?> + printHtml($values['value_l11n']); ?> + getCurrency((int) ($this->data['ytdPYItemAttribute']['section'][$values['value_l11n']]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['ytdAItemAttribute']['section'][$values['value_l11n']]['net_sales'] ?? 0)); ?> getCurrency( - ((int) ($this->data['ytdAItemAttribute'][$type]['net_sales'] ?? 0)) - - ((int) ($this->data['ytdPYItemAttribute'][$type]['net_sales'] ?? 0)) + ((int) ($this->data['ytdAItemAttribute']['section'][$values['value_l11n']]['net_sales'] ?? 0)) - + ((int) ($this->data['ytdPYItemAttribute']['section'][$values['value_l11n']]['net_sales'] ?? 0)) ); ?> - getCurrency((int) ($this->data['mtdPYItemAttribute'][$type]['net_sales'] ?? 0)); ?> - getCurrency((int) ($this->data['mtdAItemAttribute'][$type]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['mtdPYItemAttribute']['section'][$values['value_l11n']]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['mtdAItemAttribute']['section'][$values['value_l11n']]['net_sales'] ?? 0)); ?> getCurrency( - ((int) ($this->data['mtdAItemAttribute'][$type]['net_sales'] ?? 0)) - - ((int) ($this->data['mtdPYItemAttribute'][$type]['net_sales'] ?? 0)) + ((int) ($this->data['mtdAItemAttribute']['section'][$values['value_l11n']]['net_sales'] ?? 0)) - + ((int) ($this->data['mtdPYItemAttribute']['section'][$values['value_l11n']]['net_sales'] ?? 0)) ); ?> @@ -141,24 +135,21 @@ echo $this->data['nav']->render(); getHtml('DiffPY'); ?> (getHtml('MTD'); ?>) data['ytdAItemAttribute'] as $type => $values) : - if ($type !== 'sales_group') { - continue; - } + foreach ($this->data['ytdAItemAttribute']['sales_group'] as $values) : ?> - printHtml($this->data['ytdPYItemAttribute'][$type]['value_l11n']); ?> - getCurrency((int) ($this->data['ytdPYItemAttribute'][$type]['net_sales'] ?? 0)); ?> - getCurrency((int) ($this->data['ytdAItemAttribute'][$type]['net_sales'] ?? 0)); ?> + printHtml($values['value_l11n']); ?> + getCurrency((int) ($this->data['ytdPYItemAttribute']['sales_group'][$values['value_l11n']]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['ytdAItemAttribute']['sales_group'][$values['value_l11n']]['net_sales'] ?? 0)); ?> getCurrency( - ((int) ($this->data['ytdAItemAttribute'][$type]['net_sales'] ?? 0)) - - ((int) ($this->data['ytdPYItemAttribute'][$type]['net_sales'] ?? 0)) + ((int) ($this->data['ytdAItemAttribute']['sales_group'][$values['value_l11n']]['net_sales'] ?? 0)) - + ((int) ($this->data['ytdPYItemAttribute']['sales_group'][$values['value_l11n']]['net_sales'] ?? 0)) ); ?> - getCurrency((int) ($this->data['mtdPYItemAttribute'][$type]['net_sales'] ?? 0)); ?> - getCurrency((int) ($this->data['mtdAItemAttribute'][$type]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['mtdPYItemAttribute']['sales_group'][$values['value_l11n']]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['mtdAItemAttribute']['sales_group'][$values['value_l11n']]['net_sales'] ?? 0)); ?> getCurrency( - ((int) ($this->data['mtdAItemAttribute'][$type]['net_sales'] ?? 0)) - - ((int) ($this->data['mtdPYItemAttribute'][$type]['net_sales'] ?? 0)) + ((int) ($this->data['mtdAItemAttribute']['sales_group'][$values['value_l11n']]['net_sales'] ?? 0)) - + ((int) ($this->data['mtdPYItemAttribute']['sales_group'][$values['value_l11n']]['net_sales'] ?? 0)) ); ?> @@ -187,24 +178,21 @@ echo $this->data['nav']->render(); getHtml('DiffPY'); ?> (getHtml('MTD'); ?>) data['ytdAItemAttribute'] as $type => $values) : - if ($type !== 'product_group') { - continue; - } + foreach ($this->data['ytdAItemAttribute']['product_group'] as $values) : ?> - printHtml($this->data['ytdPYItemAttribute'][$type]['value_l11n']); ?> - getCurrency((int) ($this->data['ytdPYItemAttribute'][$type]['net_sales'] ?? 0)); ?> - getCurrency((int) ($this->data['ytdAItemAttribute'][$type]['net_sales'] ?? 0)); ?> + printHtml($values['value_l11n']); ?> + getCurrency((int) ($this->data['ytdPYItemAttribute']['product_group'][$values['value_l11n']]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['ytdAItemAttribute']['product_group'][$values['value_l11n']]['net_sales'] ?? 0)); ?> getCurrency( - ((int) ($this->data['ytdAItemAttribute'][$type]['net_sales'] ?? 0)) - - ((int) ($this->data['ytdPYItemAttribute'][$type]['net_sales'] ?? 0)) + ((int) ($this->data['ytdAItemAttribute']['product_group'][$values['value_l11n']]['net_sales'] ?? 0)) - + ((int) ($this->data['ytdPYItemAttribute']['product_group'][$values['value_l11n']]['net_sales'] ?? 0)) ); ?> - getCurrency((int) ($this->data['mtdPYItemAttribute'][$type]['net_sales'] ?? 0)); ?> - getCurrency((int) ($this->data['mtdAItemAttribute'][$type]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['mtdPYItemAttribute']['product_group'][$values['value_l11n']]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['mtdAItemAttribute']['product_group'][$values['value_l11n']]['net_sales'] ?? 0)); ?> getCurrency( - ((int) ($this->data['mtdAItemAttribute'][$type]['net_sales'] ?? 0)) - - ((int) ($this->data['mtdPYItemAttribute'][$type]['net_sales'] ?? 0)) + ((int) ($this->data['mtdAItemAttribute']['product_group'][$values['value_l11n']]['net_sales'] ?? 0)) - + ((int) ($this->data['mtdPYItemAttribute']['product_group'][$values['value_l11n']]['net_sales'] ?? 0)) ); ?> @@ -233,24 +221,21 @@ echo $this->data['nav']->render(); getHtml('DiffPY'); ?> (getHtml('MTD'); ?>) data['ytdAItemAttribute'] as $type => $values) : - if ($type !== 'product_type') { - continue; - } + foreach ($this->data['ytdAItemAttribute']['product_type'] as $values) : ?> - printHtml($this->data['ytdPYItemAttribute'][$type]['value_l11n']); ?> - getCurrency((int) ($this->data['ytdPYItemAttribute'][$type]['net_sales'] ?? 0)); ?> - getCurrency((int) ($this->data['ytdAItemAttribute'][$type]['net_sales'] ?? 0)); ?> + printHtml($values['value_l11n']); ?> + getCurrency((int) ($this->data['ytdPYItemAttribute']['product_type'][$values['value_l11n']]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['ytdAItemAttribute']['product_type'][$values['value_l11n']]['net_sales'] ?? 0)); ?> getCurrency( - ((int) ($this->data['ytdAItemAttribute'][$type]['net_sales'] ?? 0)) - - ((int) ($this->data['ytdPYItemAttribute'][$type]['net_sales'] ?? 0)) + ((int) ($this->data['ytdAItemAttribute']['product_type'][$values['value_l11n']]['net_sales'] ?? 0)) - + ((int) ($this->data['ytdPYItemAttribute']['product_type'][$values['value_l11n']]['net_sales'] ?? 0)) ); ?> - getCurrency((int) ($this->data['mtdPYItemAttribute'][$type]['net_sales'] ?? 0)); ?> - getCurrency((int) ($this->data['mtdAItemAttribute'][$type]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['mtdPYItemAttribute']['product_type'][$values['value_l11n']]['net_sales'] ?? 0)); ?> + getCurrency((int) ($this->data['mtdAItemAttribute']['product_type'][$values['value_l11n']]['net_sales'] ?? 0)); ?> getCurrency( - ((int) ($this->data['mtdAItemAttribute'][$type]['net_sales'] ?? 0)) - - ((int) ($this->data['mtdPYItemAttribute'][$type]['net_sales'] ?? 0)) + ((int) ($this->data['mtdAItemAttribute']['product_type'][$values['value_l11n']]['net_sales'] ?? 0)) - + ((int) ($this->data['mtdPYItemAttribute']['product_type'][$values['value_l11n']]['net_sales'] ?? 0)) ); ?> diff --git a/Theme/Backend/analysis-overview-dashboard.tpl.php b/Theme/Backend/analysis-overview-dashboard.tpl.php index 48043bd..f804d00 100755 --- a/Theme/Backend/analysis-overview-dashboard.tpl.php +++ b/Theme/Backend/analysis-overview-dashboard.tpl.php @@ -21,6 +21,7 @@ use phpOMS\Uri\UriFactory; */ echo $this->data['nav']->render(); ?> +
@@ -233,12 +235,12 @@ echo $this->data['nav']->render(); } }'>
- -