Sfoglia il codice sorgente

removed object type, added report

Alexander Musikhin 6 mesi fa
parent
commit
45f946629d

+ 63 - 18
app/Http/Controllers/ReportController.php

@@ -8,6 +8,7 @@ use App\Models\Order;
 use App\Models\OrderStatus;
 use App\Models\Product;
 use App\Models\ProductSKU;
+use App\Models\User;
 use Illuminate\Http\Request;
 use Illuminate\Support\Str;
 
@@ -22,29 +23,73 @@ class ReportController extends Controller
 
     public function index()
     {
-        $doneStatuses = [5, 7, 8, 9, 10];
+        $mountStatuses = [5, 7, 8, 9, 10];
+        $doneStatuses = [9, 10];
         $objectTypes = ObjectType::query()->get()->pluck('name', 'id')->toArray();
         $this->data['objectTypes'] = $objectTypes;
-        $this->data['totalOrders']  = Order::all()->count();
-        $this->data['doneOrders']  = Order::query()->whereIn('order_status_id', [9, 10])->count();
+        $user_ids = Order::query()->distinct()->get('user_id')->pluck('user_id')->toArray();
+        $managers = User::query()->whereIn('id', $user_ids)->get()->pluck('name', 'id')->toArray();
+        $this->data['managers'] = $managers;
+
 
+        // всего заказов, выполнено заказов
+        $this->data['totalOrders']  = Order::all()->count();
+        $this->data['doneOrders']  = Order::query()->whereIn('order_status_id', $doneStatuses)->count();
+        $this->data['mountOrders']  = Order::query()->whereIn('order_status_id', $mountStatuses)->count();
 
+        // всего маф / завершено маф / установлено маф
         $this->data['totalMafs']    = ProductSKU::all()->count();
         $this->data['doneMafs']    = ProductSKU::query()->
-            whereHas('order', function ($query) {
-                $query->whereIn('order_status_id', [9, 10]);
+            whereHas('order', function ($query) use ($doneStatuses) {
+                $query->whereIn('order_status_id', $doneStatuses);
             })->count();
+        $this->data['mountMafs']    = ProductSKU::query()->
+        whereHas('order', function ($query) use ($mountStatuses){
+            $query->whereIn('order_status_id', $mountStatuses);
+        })->count();
 
-
+        // общая сумма
         $this->data['totalSum'] = Price::format(
             ProductSKU::query()->
-            whereHas('order', function ($query) use ($doneStatuses) {
-                $query->whereIn('order_status_id', $doneStatuses);
+            whereHas('order', function ($query) use ($mountStatuses) {
+                $query->whereIn('order_status_id', $mountStatuses);
             })
             ->withSum('product', 'total_price')
             ->get()
             ->sum('product_sum_total_price')
         );
+
+        // done by managers
+        foreach ($managers as $userId => $userName) {
+            $this->data['totalOrderManager'] = Order::where('user_id', $userId)->count();
+            $this->data['totalMafsManager'][$userId]     = ProductSKU::query()->
+            whereHas('order', function ($query) use ($userId) {
+                $query->where('user_id', '=', $userId);
+            })->count();
+
+            $this->data['doneOrdersManager'][$userId]  = Order::query()
+                ->where('user_id', '=', $userId)
+                ->whereIn('order_status_id', $doneStatuses)
+                ->count();
+            $this->data['doneMafsManager'][$userId]     = ProductSKU::query()->
+            whereHas('order', function ($query) use ($userId, $doneStatuses) {
+                $query->where('user_id', '=', $userId)
+                    ->whereIn('order_status_id', $doneStatuses);
+            })->count();
+
+            $this->data['notDoneOrdersManager'][$userId]  = Order::query()
+                ->where('user_id', '=', $userId)
+                ->whereNotIn('order_status_id', $doneStatuses)
+                ->count();
+            $this->data['notDoneMafsManager'][$userId]     = ProductSKU::query()->
+            whereHas('order', function ($query) use ($userId, $doneStatuses) {
+                $query->where('user_id', '=', $userId)
+                    ->whereNotIn('order_status_id', $doneStatuses);
+            })->count();
+
+        }
+
+        // total mount by types
         foreach ($objectTypes as $objectTypeId => $objectType) {
             // total by types
             $this->data['totalOrdersType'][$objectTypeId]  = Order::where('object_type_id', '=', $objectTypeId)->count();
@@ -55,25 +100,25 @@ class ReportController extends Controller
 
             // со статусами: в монтаже, готова к сдаче, не сдана замечания, сдана замечания, сдана - зеленый цвет
 
-            $this->data['doneOrdersType'][$objectTypeId]  = Order::query()
+            $this->data['mountOrdersType'][$objectTypeId]  = Order::query()
                 ->where('object_type_id', '=', $objectTypeId)
-                ->whereIn('order_status_id', $doneStatuses)
+                ->whereIn('order_status_id', $mountStatuses)
                 ->count();
-            $this->data['doneMafsType'][$objectTypeId]     = ProductSKU::query()->
-            whereHas('order', function ($query) use ($objectTypeId, $doneStatuses) {
+            $this->data['mountMafsType'][$objectTypeId]     = ProductSKU::query()->
+            whereHas('order', function ($query) use ($objectTypeId, $mountStatuses) {
                 $query->where('object_type_id', '=', $objectTypeId)
-                ->whereIn('order_status_id', $doneStatuses);
+                ->whereIn('order_status_id', $mountStatuses);
             })->count();
 
             // остальные - не готовы
-            $this->data['notDoneOrdersType'][$objectTypeId]  = Order::query()
+            $this->data['notMountOrdersType'][$objectTypeId]  = Order::query()
                 ->where('object_type_id', '=', $objectTypeId)
-                ->whereNotIn('order_status_id', $doneStatuses)
+                ->whereNotIn('order_status_id', $mountStatuses)
                 ->count();
-            $this->data['notDoneMafsType'][$objectTypeId]     = ProductSKU::query()->
-            whereHas('order', function ($query) use ($objectTypeId, $doneStatuses) {
+            $this->data['notMountMafsType'][$objectTypeId]     = ProductSKU::query()->
+            whereHas('order', function ($query) use ($objectTypeId, $mountStatuses) {
                 $query->where('object_type_id', '=', $objectTypeId)
-                    ->whereNotIn('order_status_id', $doneStatuses);
+                    ->whereNotIn('order_status_id', $mountStatuses);
             })->count();
 
 

+ 2 - 2
database/seeders/ObjectTypeSeeder.php

@@ -13,8 +13,8 @@ class ObjectTypeSeeder extends Seeder
     public function run(): void
     {
         ObjectType::query()->updateOrCreate(['id' => 1], ['name' => 'Дворовые территории']);
-        ObjectType::query()->updateOrCreate(['id' => 2], ['name' => 'Дошкольное образование']);
+        ObjectType::query()->updateOrCreate(['id' => 2], ['name' => 'Образование']);
         ObjectType::query()->updateOrCreate(['id' => 3], ['name' => 'Знаковые объекты']);
-        ObjectType::query()->updateOrCreate(['id' => 4], ['name' => 'Образование']);
+        ObjectType::query()->where('id', 4)->delete();
     }
 }

+ 1 - 1
resources/views/orders/edit.blade.php

@@ -13,7 +13,7 @@
                 @if(isset($order))
                     <input type="hidden" name="id" value="{{ $order->id }}">
                 @endif
-{{--                <input type="text" name="previous_url" value="{{ $previous_url ?? ''}}">--}}
+
                 @include('partials.select', ['name' => 'order_status_id', 'title' => 'Статус', 'options' => $orderStatuses, 'value' => $order->order_status_id ?? old('order_status_id'), 'required' => true])
 
                 @include('partials.select', ['name' => 'district_id', 'title' => 'Округ', 'options' => $districts, 'value' => $order?->district_id ?? old('district_id'), 'first_empty' => true, 'required' => true])

+ 139 - 23
resources/views/reports/index.blade.php

@@ -1,6 +1,71 @@
-
 @extends('layouts.app')
+
+@php
+    $labels_manager = $notDone = $labels = '';
+    $la = [];
+    foreach ($mountMafsType as $id => $count) {
+        $la[] = $objectTypes[$id] . ' ' . $mountMafsType[$id] .'/'. $notMountMafsType[$id];
+        $labels .= '"' . $objectTypes[$id] . ' (' . $mountMafsType[$id] .'/'. $notMountMafsType[$id] . ')",';
+        $notDone .= '[' . $totalMafsType[$id] . ', ' . $mountMafsType[$id] . '],';
+    }
+
+    foreach ($doneMafsManager as $id => $count) {
+        $labels_manager .= '"' . $managers[$id] . ' (' . $doneMafsManager[$id] .'/'. $notDoneMafsManager[$id] . ')",';
+    }
+
+@endphp
+
 @section('content')
+    <div class="row">
+        <div class="col-12 text-center">
+            <h1 class="text-success">Выполнение плана по монтажу МАФ</h1>
+        </div>
+    </div>
+    <hr>
+    <div class="row">
+        <div class="col-xl-4 mb-2">
+            <div class="text-center text-success fs-4 fw-bold" >
+               {{ $totalMafs }} / {{ $totalOrders }}
+            </div>
+            <div class="text-center">
+                Всего МАФ / Площадок
+            </div>
+        </div>
+        <div class="col-xl-4 mb-2">
+            <div class="text-center text-success fs-4 fw-bold" >
+               {{ $mountMafs }} / {{ $mountOrders }}
+            </div>
+            <div class="text-center">
+                Установлено МАФ / Площадок
+            </div>
+        </div>
+        <div class="col-xl-4 mb-2">
+
+            <div class="text-center text-success fs-6 fw-bold" >
+                {{ implode('; ', $la) }}
+            </div>
+            <div class="text-center">
+                Установлено по типам объекта
+            </div>
+        </div>
+    </div>
+    <hr>
+    <div class="row align-items-center">
+        <div class="col-xl-6">
+            <div class="mx-5 px-5 mb-3">
+                <canvas id="total_orders" class="mx-4"></canvas>
+            </div>
+        </div>
+
+        <div class="col-xl-6 ">
+            <div class=" mb-3">
+                <canvas id="order_types" class="mx-4"></canvas>
+            </div>
+        </div>
+    </div>
+    <hr>
+
+
     <div class="row">
         <div class="col-12 text-center">
             <h1 class="text-success">Выполнение плана по сдаче МАФ</h1>
@@ -8,7 +73,7 @@
     </div>
     <hr>
     <div class="row">
-        <div class="col-md-4">
+        <div class="col-xl-4">
             <div class="text-center text-success fs-4 fw-bold" >
                {{ $totalMafs }} / {{ $totalOrders }}
             </div>
@@ -16,7 +81,7 @@
                 Всего МАФ / Площадок
             </div>
         </div>
-        <div class="col-4">
+        <div class="col-xl-4">
             <div class="text-center text-success fs-4 fw-bold" >
                {{ $doneMafs }} / {{ $doneOrders }}
             </div>
@@ -24,7 +89,7 @@
                 Сдано МАФ / Площадок
             </div>
         </div>
-        <div class="col-md-4">
+        <div class="col-xl-4">
             <div class="text-center text-success fs-4 fw-bold" >
                {!! $totalSum !!}
             </div>
@@ -34,28 +99,23 @@
         </div>
     </div>
     <hr>
-    <div class="row">
-        <div class="col-md-4 offset-md-1">
-            <canvas id="total_orders" class="p-4 m-4"></canvas>
+    <div class="row align-items-center">
+        <div class="col-xl-6 align-middle">
+            <div class="mx-5 px-5 mb-3">
+                <canvas id="done_orders" class="mx-4"></canvas>
+            </div>
         </div>
 
-        <div class="col-md-6 offset-md-1">
-            <canvas id="order_types"></canvas>
+        <div class="col-xl-6 align-middle">
+            <div class=" mb-3">
+                <canvas id="done_users" class="mx-4"></canvas>
+            </div>
         </div>
     </div>
 
 
-    @dump(get_defined_vars())
-
 @endsection
 
-@php
-    $notDone = $labels = '';
-    foreach ($doneMafsType as $id => $count) {
-        $labels .= '"' . $objectTypes[$id] . ' (' . $doneMafsType[$id] .'/'. $notDoneMafsType[$id] . ')",';
-        $notDone .= '[' . $totalMafsType[$id] . ', ' . $doneMafsType[$id] . '],';
-    }
-@endphp
 
 @push('scripts')
     <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
@@ -65,10 +125,48 @@
             type: 'bar',
             data: {
                 labels: [{!! $labels  !!}],
+                datasets: [
+                    {
+                        label: 'Установлено',
+                        data: [{{ implode(',', $mountMafsType) }}],
+                        borderWidth: 1,
+                        backgroundColor: [
+                            'rgb(114,180,150)',
+                        ],
+                        grouped: false,
+                    },
+                    {
+                        label: 'Осталось установить',
+                        data: [{{ $notDone }}],
+                        borderWidth: 1,
+                        backgroundColor: [
+                            'rgb(251,215,105)',
+                        ],
+                        grouped: false,
+                    }
+                ]
+            },
+            options: {
+                scales: {
+                    y: {
+                        beginAtZero: true
+                    }
+                },
+
+            }
+        });
+
+
+        // by users
+        const ctx1 = document.getElementById('done_users');
+        new Chart(ctx1, {
+            type: 'bar',
+            data: {
+                labels: [{!! $labels_manager  !!}],
                 datasets: [
                     {
                         label: 'Сдано',
-                        data: [{{ implode(',', $doneMafsType) }}],
+                        data: [{{ implode(',', $doneMafsManager) }}],
                         borderWidth: 1,
                         backgroundColor: [
                             'rgb(114,180,150)',
@@ -77,7 +175,7 @@
                     },
                     {
                         label: 'Осталось сдать',
-                        data: [{{ $notDone }}],
+                        data: [{{ implode(',', $notDoneMafsManager) }}],
                         borderWidth: 1,
                         backgroundColor: [
                             'rgb(251,215,105)',
@@ -96,12 +194,30 @@
             }
         });
 
-        // круговая диаграмма
-        const circleDiag = document.getElementById('total_orders');
+
+        // круговая диаграмма 1
+        let circleDiag = document.getElementById('total_orders');
         new Chart(circleDiag, {
             type: 'doughnut',
             data: {
-                labels: ['Сдано', 'Осталось сдать'],
+                labels: ['Установлено', 'Осталось установить'],
+                datasets: [{
+                    data: [{{ $doneMafs }}, {{ $totalMafs - $doneMafs }}],
+                    backgroundColor: [
+                        'rgb(114,180,150)',
+                        'rgb(251,215,105)',
+                    ]
+                }],
+
+            },
+        });
+
+        // круговая диаграмма 2
+        let circleDiag2 = document.getElementById('done_orders');
+        new Chart(circleDiag2, {
+            type: 'doughnut',
+            data: {
+                labels: ['Установлено', 'Осталось установить'],
                 datasets: [{
                     data: [{{ $doneMafs }}, {{ $totalMafs - $doneMafs }}],
                     backgroundColor: [