| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- <?php
- namespace App\Http\Controllers;
- use App\Helpers\Price;
- use App\Models\Dictionary\District;
- use App\Models\ObjectType;
- use App\Models\Order;
- use App\Models\OrderStatus;
- use App\Models\Product;
- use App\Models\ProductSKU;
- use App\Models\Reclamation;
- use App\Models\ReclamationStatus;
- use App\Models\User;
- use Illuminate\Http\Request;
- use Illuminate\Support\Str;
- class ReportController extends Controller
- {
- protected array $data = [
- 'active' => 'reports',
- 'title' => 'Отчёты',
- 'id' => 'reports',
- ];
- public function index()
- {
- $mountStatuses = [5, 7, 8, 9, 10];
- $doneStatuses = [9, 10];
- $objectTypes = ObjectType::query()->get()->pluck('name', 'id')->toArray();
- $this->data['objectTypes'] = $objectTypes;
- $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['doneMafsManager'] = $this->data['notDoneMafsManager'] = [];
- // всего заказов, выполнено заказов
- $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) 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();
- // общая сумма mount
- $this->data['totalMountSum'] = Price::format(
- ProductSKU::query()->
- 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();
- $this->data['totalMafsType'][$objectTypeId] = ProductSKU::query()->
- whereHas('order', function ($query) use ($objectTypeId) {
- $query->where('object_type_id', '=', $objectTypeId);
- })->count();
- // со статусами: в монтаже, готова к сдаче, не сдана замечания, сдана замечания, сдана - зеленый цвет
- $this->data['mountOrdersType'][$objectTypeId] = Order::query()
- ->where('object_type_id', '=', $objectTypeId)
- ->whereIn('order_status_id', $mountStatuses)
- ->count();
- $this->data['mountMafsType'][$objectTypeId] = ProductSKU::query()->
- whereHas('order', function ($query) use ($objectTypeId, $mountStatuses) {
- $query->where('object_type_id', '=', $objectTypeId)
- ->whereIn('order_status_id', $mountStatuses);
- })->count();
- // остальные - не готовы
- $this->data['notMountOrdersType'][$objectTypeId] = Order::query()
- ->where('object_type_id', '=', $objectTypeId)
- ->whereNotIn('order_status_id', $mountStatuses)
- ->count();
- $this->data['notMountMafsType'][$objectTypeId] = ProductSKU::query()->
- whereHas('order', function ($query) use ($objectTypeId, $mountStatuses) {
- $query->where('object_type_id', '=', $objectTypeId)
- ->whereNotIn('order_status_id', $mountStatuses);
- })->count();
- }
- // рекламации
- $this->data['totalReclamations'] = Reclamation::query()->count();
- $this->data['reclamationStatuses'] = ReclamationStatus::query()->get()->pluck('name', 'id')->toArray();
- foreach ($this->data['reclamationStatuses'] as $reclamationStatusId => $reclamationStatus) {
- $this->data['reclamations'][$reclamationStatus] = Reclamation::query()->where('status_id', '=', $reclamationStatusId)->count();
- }
- $this->data['reclamationMafs'] = $this->data['reclamationDetails'] = [];
- foreach (Reclamation::all() as $reclamation) {
- foreach ($reclamation->skus as $sku) {
- $a = $sku->product->article;
- if(isset($this->data['reclamationMafs'][$a])){
- $this->data['reclamationMafs'][$a]++;
- } else {
- $this->data['reclamationMafs'][$a] = 1;
- }
- }
- foreach ($reclamation->details as $detail) {
- $a = $detail->name;
- if(isset($this->data['reclamationDetails'][$a])){
- $this->data['reclamationDetails'][$a] += $detail->quantity;
- } else {
- $this->data['reclamationDetails'][$a] = $detail->quantity;
- }
- }
- }
- // svod
- $orderStatuses = OrderStatus::query()->get()->pluck('name', 'id')->toArray();
- foreach ($orderStatuses as $orderStatusId => $orderStatus) {
- $this->data['orderStatuses'][$orderStatus] = Order::query()->where('order_status_id', '=', $orderStatusId)->count();
- $this->data['orderMafStatuses'][$orderStatus] = ProductSKU::query()->
- whereHas('order', function ($query) use ($orderStatusId) {
- $query->where('order_status_id', $orderStatusId);
- })->count();
- }
- // общая сумма
- $this->data['totalSum'] = Price::format(
- ProductSKU::query()
- ->withSum('product', 'total_price')
- ->get()
- ->sum('product_sum_total_price')
- );
- // общая сумма done
- $this->data['totalDoneSum'] = Price::format(
- ProductSKU::query()->
- whereHas('order', function ($query) use ($doneStatuses) {
- $query->whereIn('order_status_id', $doneStatuses);
- })
- ->withSum('product', 'total_price')
- ->get()
- ->sum('product_sum_total_price')
- );
- $districts = District::query()->get()->pluck('shortname', 'id')->toArray();
- foreach ($districts as $districtId => $district) {
- $totalOrders = $this->getOrderCount($districtId);
- $totalMafs = $this->getMafCount($districtId);
- $readyOrders = $this->getOrderCount($districtId, 4);
- $readyMafs = $this->getMafCount($districtId, 4);
- $mountOrders = $this->getOrderCount($districtId, 5);
- $mountMafs = $this->getMafCount($districtId, 5);
- $readyDoneOrders = $this->getOrderCount($districtId, 7);
- $readyDoneMafs = $this->getMafCount($districtId, 7);
- $doneOrders = $this->getOrderCount($districtId, $doneStatuses);
- $doneMafs = $this->getMafCount($districtId, $doneStatuses);
- $statusOstOrders = $totalOrders - $mountOrders - $readyDoneOrders - $doneOrders;
- $statusOstMafs = $totalMafs - $mountMafs - $readyDoneMafs - $doneMafs;
- $totalYardOrders = $this->getOrderCount($districtId, null, 1);
- $totalYardMafs = $this->getMafCount($districtId, null, 1);
- $mountYardOrders = $this->getOrderCount($districtId, $mountStatuses, 1);
- $mountYardMafs = $this->getMafCount($districtId, $mountStatuses, 1);
- $ostYardOrders = $totalYardOrders - $mountYardOrders;
- $ostYardMafs = $totalYardMafs - $mountYardMafs;
- $totalEduOrders = $this->getOrderCount($districtId, null, 2);
- $totalEduMafs = $this->getMafCount($districtId, null, 2);
- $mountEduOrders = $this->getOrderCount($districtId, $mountStatuses, 2);
- $mountEduMafs = $this->getMafCount($districtId, $mountStatuses, 2);
- $ostEduOrders = $totalYardOrders - $mountYardOrders;
- $ostEduMafs = $totalYardMafs - $mountYardMafs;
- $totalZnakOrders = $this->getOrderCount($districtId, null, 3);
- $totalZnakMafs = $this->getMafCount($districtId, null, 3);
- $mountZnakOrders = $this->getOrderCount($districtId, $mountStatuses, 3);
- $mountZnakMafs = $this->getMafCount($districtId, $mountStatuses, 3);
- $ostZnakOrders = $totalYardOrders - $mountYardOrders;
- $ostZnakMafs = $totalYardMafs - $mountYardMafs;
- $this->data['byDistrict'][$district] = [
- 'name' => $district,
- 'totalSum' => $this->getDistrictSum($districtId),
- 'doneSum' => $this->getDistrictSum($districtId, $doneStatuses),
- 'totalOrders' => $totalOrders,
- 'totalMafs' => $totalMafs,
- 'readyOrders' => $readyOrders,
- 'readyMafs' => $readyMafs,
- 'mountOrders' => $mountOrders,
- 'mountMafs' => $mountMafs,
- 'readyDoneOrders' => $readyDoneOrders,
- 'readyDoneMafs' => $readyDoneMafs,
- 'doneOrders' => $doneOrders,
- 'doneMafs' => $doneMafs,
- 'statusOstOrders' => $statusOstOrders,
- 'statusOstMafs' => $statusOstMafs,
- 'totalYardOrders' => $totalYardOrders,
- 'totalYardMafs' => $totalYardMafs,
- 'mountYardOrders' => $mountYardOrders,
- 'mountYardMafs' => $mountYardMafs,
- 'ostYardOrders' => $ostYardOrders,
- 'ostYardMafs' => $ostYardMafs,
- 'totalEduOrders' => $totalEduOrders,
- 'totalEduMafs' => $totalEduMafs,
- 'mountEduOrders' => $mountEduOrders,
- 'mountEduMafs' => $mountEduMafs,
- 'ostEduOrders' => $ostEduOrders,
- 'ostEduMafs' => $ostEduMafs,
- 'totalZnakOrders' => $totalZnakOrders,
- 'totalZnakMafs' => $totalZnakMafs,
- 'mountZnakOrders' => $mountZnakOrders,
- 'mountZnakMafs' => $mountZnakMafs,
- 'ostZnakOrders' => $ostZnakOrders,
- 'ostZnakMafs' => $ostZnakMafs,
- ];
- }
- return view('reports.index', $this->data);
- }
- private function getOrderCount($districtId, $status = null, $type = null)
- {
- $q = Order::query()->where('district_id', '=', $districtId);
- if($status) {
- if(!is_array($status)) $status = [$status];
- $q->whereIn('order_status_id', $status);
- }
- if($type) {
- if(!is_array($type)) $type = [$type];
- $q->whereIn('object_type_id', $type);
- }
- return $q->count();
- }
- private function getMafCount($districtId, $status = null, $type = null)
- {
- return ProductSKU::query()->
- whereHas('order', function ($query) use ($districtId, $status, $type) {
- $query->where('district_id', '=', $districtId);
- if($status) {
- if(!is_array($status)) $status = [$status];
- $query->whereIn('order_status_id', $status);
- }
- if($type) {
- if(!is_array($type)) $type = [$type];
- $query->whereIn('object_type_id', $type);
- }
- })->count();
- }
- private function getDistrictSum($districtId, $done = false)
- {
- return Price::format(
- ProductSKU::query()->
- whereHas('order', function ($query) use ($done, $districtId) {
- $query->where('district_id', $districtId);
- if($done){
- $query->whereIn('order_status_id', $done);
- }
- })
- ->withSum('product', 'total_price')
- ->get()
- ->sum('product_sum_total_price')
- );
- }
- }
|