mailer = $mailer; $this->propertyService = $propertyService; $this->currencyService = $currencyService; $this->userService = $userService; } public function reportCalculate($userId, $contractUserProperty, $type) { $today = Carbon::now()->subDay()->toDateString(); $report = ['data' => null, 'summary' => null]; switch ($type) { case 'daily': $vwBookingSummaryAll = vwBookingSummaryAll::where('time', '>', Carbon::parse($today)->toDateString()) ->where('time', '<', Carbon::parse($today)->addDay()->toDateString()) ->where('commission', '>', 0) ->where('contract_user_id', $userId) ->whereIn('property_id', $contractUserProperty) ->get()->toArray(); break; case 'monthly': $monthlySummary = []; $annuallyMonths = []; for ($i = 0; $i < 12; $i++) { $annuallyMonths[] = Carbon::parse($today)->firstOfYear()->addMonths($i)->format('Y-m'); } $vwBookingSummaryAll = vwBookingSummaryAll::whereIn('transaction_period', [Carbon::parse($today)->firstOfMonth()->format('Y-m')]) ->where('commission', '>', 0) ->where('contract_user_id', $userId) ->whereIn('property_id', $contractUserProperty) ->get()->toArray(); $vwBookingSummaryTransaction = vwBookingSummaryAll::whereIn('transaction_period', $annuallyMonths) ->where('commission', '>', 0) ->where('contract_user_id', $userId) ->whereIn('property_id', $contractUserProperty) ->get()->toArray(); $vwBookingSummaryCheckout = vwBookingSummaryAll::whereIn('checkout_period', $annuallyMonths) ->where('commission', '>', 0) ->where('contract_user_id', $userId) ->whereIn('property_id', $contractUserProperty) ->get()->toArray(); $vwBookingSummaryTransactionGrouped = collect($vwBookingSummaryTransaction)->groupBy('transaction_period')->toArray(); $vwBookingSummaryCheckoutGrouped = collect($vwBookingSummaryCheckout)->groupBy('checkout_period')->toArray(); $monthlySummary['month'] = []; foreach ($annuallyMonths as $annuallyMonth) { $annuallyMonth = Carbon::parse($annuallyMonth)->format('Y-m'); $monthlySummary['month'][$annuallyMonth] = $annuallyMonth; $monthlySummary['transaction'][$annuallyMonth]['count'] = 0; $monthlySummary['transaction'][$annuallyMonth]['total'] = 0; $monthlySummary['transaction'][$annuallyMonth]['commission'] = 0; if(isset($vwBookingSummaryTransactionGrouped[$annuallyMonth])) { $dataCollectGroupCurrency = collect($vwBookingSummaryTransactionGrouped[$annuallyMonth])->groupBy('currency_code')->toArray(); foreach ($dataCollectGroupCurrency as $currencyCode => $currencyGroup) { $lastExchangeRate = $this->currencyService->lastExchangeRate($currencyCode, 'EUR'); $monthlySummary['transaction'][$annuallyMonth]['count'] += collect($currencyGroup)->count(); $monthlySummary['transaction'][$annuallyMonth]['total'] += collect($currencyGroup)->sum('total') * $lastExchangeRate['data']; $monthlySummary['transaction'][$annuallyMonth]['commission'] += collect($currencyGroup)->sum('commission') * $lastExchangeRate['data']; } } $monthlySummary['checkout'][$annuallyMonth]['count'] = 0; $monthlySummary['checkout'][$annuallyMonth]['total'] = 0; $monthlySummary['checkout'][$annuallyMonth]['commission'] = 0; if(isset($vwBookingSummaryCheckoutGrouped[$annuallyMonth])) { $dataCollectGroupCurrency = collect($vwBookingSummaryCheckoutGrouped[$annuallyMonth])->groupBy('currency_code')->toArray(); foreach ($dataCollectGroupCurrency as $currencyCode => $currencyGroup) { $lastExchangeRate = $this->currencyService->lastExchangeRate($currencyCode, 'EUR'); $monthlySummary['checkout'][$annuallyMonth]['count'] += collect($currencyGroup)->count(); $monthlySummary['checkout'][$annuallyMonth]['total'] += collect($currencyGroup)->sum('total') * $lastExchangeRate['data']; $monthlySummary['checkout'][$annuallyMonth]['commission'] += collect($currencyGroup)->sum('commission') * $lastExchangeRate['data']; } } } $report['monthlySummary'] = $monthlySummary; break; case 'annually': $vwBookingSummaryAll = vwBookingSummaryAll::where('time', '>', Carbon::parse($today)->firstOfYear()->toDateString()) ->where('time', '<', Carbon::parse($today)->addYear()->firstOfYear()->toDateString()) ->where('commission', '>', 0) ->where('contract_user_id', $userId) ->whereIn('property_id', $contractUserProperty) ->get()->toArray(); break; } if ($vwBookingSummaryAll) { $dataCollect = collect($vwBookingSummaryAll); $dataCollectGroup = $dataCollect->groupBy('property_id')->toArray(); foreach ($dataCollectGroup as $propertyId => $propertyList) { $property = reset($propertyList); $report['data'][$propertyId]['id'] = $property['property_id']; $report['data'][$propertyId]['name'] = $property['property_name']; $report['data'][$propertyId]['count'] = 0; $report['data'][$propertyId]['total'] = 0; $report['data'][$propertyId]['commission'] = 0; $dataCollectGroupCurrency = collect($propertyList)->groupBy('currency_code')->toArray(); foreach ($dataCollectGroupCurrency as $currencyCode => $currencyGroup) { $lastExchangeRate = $this->currencyService->lastExchangeRate($currencyCode, 'EUR'); $count = collect($currencyGroup)->count(); $total = collect($currencyGroup)->sum('total'); $commission = collect($currencyGroup)->sum('commission'); $report['data'][$propertyId]['count'] += $count; $report['data'][$propertyId]['total'] += $total * $lastExchangeRate['data']; $report['data'][$propertyId]['commission'] += $commission * $lastExchangeRate['data']; } } $report['data'] = collect($report['data'])->sortByDesc('commission')->toArray(); $report['summary']['count'] = collect($report['data'])->sum('count'); $report['summary']['total'] = collect($report['data'])->sum('total'); $report['summary']['commission'] = collect($report['data'])->sum('commission'); } return $report; } public function handle() { $this->info(date('Y-m-d H:i:s') . ' START'); $today = Carbon::now()->subDay()->toDateString(); $userListIds = [904, 941, 1485];//41, 22, 883 $userListCriteria = [ 'criteria' => [ ['field' => 'status', 'condition' => '=', 'value' => 1], ], 'whereIn' => [ ['field' => 'id', 'value' => $userListIds] ], 'orderBy' => [ ['field' => 'id', 'value' => 'ASC'] ] ]; $userList = $this->userService->select($userListCriteria); foreach ($userList['data'] as $user) { $contractUserProperty = vwActiveProperty::where('contract_user_id', $user['id']) //->where('month', '>', '2024-10') ->get()->toArray(); $contractUserProperty = $contractUserProperty ? pickItemFromArray('id',$contractUserProperty) : []; $this->info(date('Y-m-d H:i:s') . ' : '.$user['nameSurname']); $report['name'] = $user['nameSurname']; $report['email'] = $user['email']; //DAILY $report['daily']['data'] = []; $report['daily']['title'] = 'Daily Report'; $report['daily']['type'] = 'daily'; $report['daily']['period'] = Carbon::parse($today)->format('d.m.Y'); $reportCalculate = $this->reportCalculate($user['id'], $contractUserProperty, $report['daily']['type']); $report['daily']['data'] = $reportCalculate['data']; $report['daily']['summary'] = $reportCalculate['summary']; //MONTHLY $report['monthly']['data'] = []; $report['monthly']['title'] = 'Monthly Report'; $report['monthly']['type'] = 'monthly'; $report['monthly']['period'] = Carbon::parse($today)->firstOfMonth()->format('m.Y'); $reportCalculate = $this->reportCalculate($user['id'], $contractUserProperty, $report['monthly']['type']); $report['monthly']['data'] = $reportCalculate['data']; $report['monthly']['summary'] = $reportCalculate['summary']; $report['monthlySummary'] = $reportCalculate['monthlySummary']; //ANNUALLY $report['annually']['data'] = []; $report['annually']['title'] = 'Annually Report'; $report['annually']['type'] = 'annually'; $report['annually']['period'] = Carbon::parse($today)->firstOfYear()->format('Y'); $reportCalculate = $this->reportCalculate($user['id'], $contractUserProperty, $report['annually']['type']); $report['annually']['data'] = $reportCalculate['data']; $report['annually']['summary'] = $reportCalculate['summary']; $report['activeProperty'] = vwActiveProperty::where('commission', '>', 1) ->where('contract_user_id', $user['id']) ->whereIn('id', $contractUserProperty) ->orderByDesc('id') ->get()->toArray(); //Property Price Comparison $priceComparisonLink = null; $todayComparison = Carbon::now()->toDateString(); $firstDayOfWeek = Carbon::parse($todayComparison)->startOfWeek(Carbon::MONDAY); //$firstDayOfWeek = Carbon::parse($today)->startOfWeek(Carbon::MONDAY)->toDateString(); //if(Carbon::now()->toDateString() == $firstDayOfWeek) { $year = Carbon::parse($firstDayOfWeek)->format('Y'); $week = Carbon::parse($firstDayOfWeek)->isoWeek(); $queryKeyHash = md5($year . '-' . $week); $priceComparisonLink = config('app.url').'/property-comparison/'.$queryKeyHash.'/'.$user['id']; //} $report['priceComparisonLink'] = $priceComparisonLink; //Property Price Comparison $this->mailer->onQueue('dailyReportSalesMail', new DailyReportMailSales($report)); } //Hotel LIST /*$vwActivePropertySummary = []; $vwActiveProperty = vwActiveProperty::where('commission', '>', 1)->get()->toArray(); $vwActivePropertySummary['count'] = count($vwActiveProperty); $vwActivePropertySummary['groupByMonth'] = collect($vwActiveProperty)->sortByDesc('month')->groupBy('month')->toArray(); $vwActivePropertySummary['lastMonth'] = collect($vwActivePropertySummary['groupByMonth'])->take(3)->toArray(); //Hotel LIST $report['activeProperty'] = $vwActivePropertySummary;*/ $this->info(date('Y-m-d H:i:s') . ' FINISHED'); } }