浏览代码

Management stats

Samson Mutunga 2 年之前
父节点
当前提交
e996f0ea5c

+ 19 - 0
app/Http/Controllers/ManagementStatsController.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Http\Controllers;
+use Illuminate\Http\Request;
+
+use Illuminate\Support\Facades\Http;
+
+
+class ManagementStatsController extends Controller
+{
+
+    public function index(Request $request)
+    {
+        $filters = $request->all();
+        
+        return view('app.admin.management-stats.index', compact('filters'));
+    }
+
+} 

+ 23 - 0
app/Http/Middleware/EnsureSuperAdmin.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Models\AppSession;
+use Closure;
+
+class EnsureSuperAdmin
+{
+    public function handle($request, Closure $next)
+    {
+        $sessionKey = $request->cookie('sessionKey');
+        $appSession = AppSession::where('session_key', $sessionKey)->where('is_active', true)->first();
+        $authenticated = $sessionKey && $appSession && $appSession->pro && $appSession->pro->pro_type == 'ADMIN';
+       
+        if (!$authenticated) {
+            //return redirect('/');
+            return abort(403);
+        }
+
+        return $next($request);
+    }
+}

+ 92 - 0
resources/views/app/admin/management-stats/filters.blade.php

@@ -0,0 +1,92 @@
+<style>
+	#admin-management-stats-filters label {
+		font-weight: bold;
+	}
+
+	#admin-management-stats-filters .mw-100px {
+		min-width: 100px;
+	}
+	.filter-container{
+		display: flex;
+		align-items: flex-start;
+		flex-wrap: wrap;
+	}
+	.filter-container >div {
+		width: 165px;
+	}
+	.filter-container >div:not(:last-child) {
+		margin-right: 10px;
+	}
+	.sm-section {
+		width: 125px !important;
+		margin-bottom: 10px;
+	}
+</style>
+<form id="admin-management-stats-filters" method="GET" action="{{ route('super-admin.management-stats') }}" class="filter-container" v-cloak>
+	<div class="sm-section">
+		<div class="">
+			<label>Start Month:</label>
+			<input type="month" name="start_month" class="form-control input-sm" v-model="filters.start_month">
+		</div>
+	</div>
+
+	<div class="sm-section">
+		<div class="">
+			<label>End Month:</label>
+			<input type="month" name="end_month" class="form-control input-sm" v-model="filters.end_month">
+		</div>
+	</div>
+
+
+	<div>
+		<div class="">
+			<label>&nbsp;</label>
+			<div class=" d-flex">
+				<button type="button" v-on:click.prevent="doSubmit()" class="btn btn-primary btn-sm mr-2"><i class="fas fa-filter"></i> Filter</button>
+				<a href="#" v-on:click.prevent="fastLoad('{{route('super-admin.management-stats')}}')" class="btn btn-link btn-sm text-danger">Clear</a>
+			</div>
+		</div>
+	</div>
+</form>
+
+<?php
+$loadedFilters = $filters;
+$allFilterKeys = [
+	'start_month',
+	'end_month',
+];
+for ($i=0; $i < count($allFilterKeys); $i++) {
+	if (!isset($loadedFilters[$allFilterKeys[$i]]) || !$loadedFilters[$allFilterKeys[$i]]) {
+		$loadedFilters[$allFilterKeys[$i]] = '';
+	}
+}
+?>
+<script>
+	(function() {
+		function init() {
+			new Vue({
+				el: '#admin-management-stats-filters',
+				delimiters: ['@{{', '}}'],
+				data: {
+					filters: <?= json_encode($loadedFilters) ?>
+				},
+				methods: {
+					init: function() {
+
+					},
+					doSubmit: function() {
+						fastLoad("{{ route('super-admin.management-stats') }}?" + $('#admin-management-stats-filters').serialize());
+						return false;
+					}
+				},
+				mounted: function() {
+					console.log(this.filters);
+					this.init();
+				},
+			});
+
+
+		}
+		addMCInitializer('admin-management-stats-filters', init, '#admin-management-stats-filters');
+	})();
+</script>

+ 98 - 0
resources/views/app/admin/management-stats/index.blade.php

@@ -0,0 +1,98 @@
+@extends ('layouts/template')
+
+@section('content')
+<link href="/c3/c3.min.css" rel="stylesheet">
+<script src="/c3/d3.v5.min.js" charset="utf-8"></script>
+<script src="/c3/c3.min.js"></script>
+
+<div class="p-3 mcp-theme-1" id="patients-list">
+    <div class="card">
+
+        <div class="card-header px-3 py-2 d-flex align-items-center">
+            <strong class="mr-4">
+                <i class="fas fa-user"></i>
+                Management Stats
+            </strong>
+        </div>
+        <div class="p-3">
+            @include('app.admin.management-stats.filters')
+        </div>
+        <div id="managementStatsComponent">
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="card">
+                        <div class="card-header">Some Reports</div>
+                        <div class="card-body">
+                            <div id="graph1"></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    (function() {
+        function init() {
+            new Vue({
+                el: '#managementStatsComponent',
+                delimiters: ['@{{', '}}'],
+                data: {
+
+                },
+                methods: {
+                    initGraph1: function() {
+                        var elementID = "#graph1";
+                        var myData = {};
+
+                        myData.x = 'x';
+                        myData.xFormat = "%Y-%m-%d";
+                        myData.type = 'bar';
+                        myX = ["2015-11-20", "2015-11-21", "2015-11-22", "2015-11-23", "2015-11-24"];
+                        myY = [1, 2, 3, 4, 5];
+                        myX.splice(0, 0, 'x');
+                        myY.splice(0, 0, 'New Reports');
+                        myData.columns = [];
+                        myData.columns.push(myX);
+                        myData.columns.push(myY);
+                        var chart = c3.generate({
+                            bindto: elementID,
+                            data: myData,
+                            size: {
+                                height: 480,
+                                width: 400,
+                            },
+                            bar: {
+                                width: {
+                                    ratio: 0.5 // this makes bar width 50% of length between ticks
+                                }
+                                // or
+                                //width: 100 // this makes bar width 100px
+                            },
+                            axis: {
+                                x: {
+                                    type: 'timeseries',
+                                    tick: {
+                                        format: "%b-%d"
+                                    }
+                                },
+
+                            }
+                        })
+                    },
+                    init: function() {
+                        this.initGraph1();
+                    },
+                },
+                mounted: function() {
+                    this.init();
+                },
+            });
+
+
+        }
+        addMCInitializer('managementStats', init, '#managementStatsComponent');
+    })();
+</script>
+
+@endsection

+ 4 - 1
routes/web.php

@@ -2,6 +2,7 @@
 
 use Illuminate\Support\Facades\Route;
 use App\Http\Controllers\SupervisingPhysicianController;
+use App\Http\Controllers\ManagementStatsController;
 
 /*
 |--------------------------------------------------------------------------
@@ -232,7 +233,9 @@ Route::middleware('pro.auth')->group(function () {
         Route::get('supply-orders', 'AdminController@supply_orders')->name('supply_orders');
         Route::get('get-create-new-patient-script-template', 'AdminController@getCreateNewPatientScriptTemplate')->name('getCreateNewPatientScriptTemplate');
         Route::get('patients-missing-defult-settings', 'AdminController@patientsMissingDefasultSettings')->name('patientsMissingDefasultSettings');
-       
+    });
+    Route::name('super-admin.')->prefix('super-admin')->middleware('pro.auth.admin')->group(function () {
+        Route::get('mgmt-stats', [ManagementStatsController::class, 'index'])->name('management-stats');
     });
 
     Route::name('invoice-center.')->prefix('invoice-center')->group(function () {