call(function () { $date = new DateTime(); Log::info('-------- Weekly Invoice Generation Start ' . $date->format("d/m/Y") . ' -----------'); $hypers = AgentPlus::whereHas('network', function ($query) { return $query->has('nh_network_config'); })->where('category', 'hyper')->get(); foreach ($hypers as $hyper) { $config = NhNetworksConfig::where('network_id', $hyper->network_id)->first(); if (!isset($config)) { continue; } $agents = AgentPlus::where('network_id', $hyper->network_id)->where('category', 'geolocated')->get(); foreach ($agents as $agent) { $start_at = new DateTime(); switch ($config->provider_billing_period) { case BillingPeriodType::WEEKLY: $start_at->modify('-7 days'); break; case BillingPeriodType::BIMONTHLY: $start_at->modify('-14 days'); break; case BillingPeriodType::MONTHLY: $start_at->modify('-28 days'); break; default: $start_at = new DateTime(); } $end_at = new DateTime(); $invoice_id = $this->generateInvoiceID($agent->code_membre); $country = CountriesCurrency::findOrFail($agent->country_id); $datetime = $this->getCurrentTimeByCountryCode($country->code_country); $totalInsurerAmount = 0; $totalInsuredAmount = 0; $sheets = NhHealthCareSheet::with(['insurance'])->where('network_agent_id', $agent->network_agent_id)->where('state', InsuranceSubscriptionState::ACCEPTED) ->where('created_at', '>=', $start_at)->where('created_at', '<=', $end_at)->orderBy('created_at', 'DESC')->get(); if (sizeof($sheets) == 0) { Log::info("Periode " . $date->format("d/m/Y") . " - " . $date->format("d/m/Y") . "\n Network " . $hyper->network . "\n Aucune feuille de soins acceptée"); continue; } foreach ($sheets as $sheet) { $this->fetchHealthCareSheetAmounts($sheet); $totalInsuredAmount += $sheet->insured_amount; $totalInsurerAmount += $sheet->insurer_amount; $sheet->date = $sheet->created_at->format('d/m/Y'); } try { DB::beginTransaction(); $directoryName = '/invoices-docs/'; $filename = $start_at->format('dmY') . '_' . $end_at->format('dmY') . '_' . $agent->code_membre . '_' . time() . '.pdf'; $invoice = NhInvoice::create([ 'invoice_id' => $invoice_id, 'network_agent_id' => $agent->network_agent_id, 'amount' => $totalInsuredAmount + $totalInsurerAmount, 'insured_amount' => $totalInsuredAmount, 'insurer_amount' => $totalInsurerAmount, 'period_start_at' => $start_at, 'period_end_at' => $end_at, 'file_url' => config('services.app_url') . $directoryName . $filename, 'created_at' => $datetime, 'updated_at' => $datetime ]); $invoice->amount = $this->toMoneyWithCurrencyCode($invoice->amount, $country->currency_code); $invoice->insured_amount = $this->toMoneyWithCurrencyCode($invoice->insured_amount, $country->currency_code); $invoice->insurer_amount = $this->toMoneyWithCurrencyCode($invoice->insurer_amount, $country->currency_code); $invoice->home_visit_fees = $this->toMoneyWithCurrencyCode($invoice->home_visit_fees, $country->currency_code); $ids = array_map(function ($r) { return $r['id']; }, $sheets->toArray()); DB::update("UPDATE nh_health_care_sheets SET state = :state_ , invoice_id = :id WHERE id IN (" . implode(',', $ids) . ")", ['id' => $invoice->id, 'state_' => InsuranceSubscriptionState::INVOICE_ISSUED]); $invoice->sheets = $sheets; $invoice->agent = $agent; $invoice->hyper = $hyper; $invoice->period = $start_at->format('d/m/Y') . ' ' . trans('messages.to') . ' ' . $end_at->format('d/m/Y'); //Check if the directory already exists. if (!is_dir(public_path($directoryName))) { //Directory does not exist, so lets create it. mkdir(public_path($directoryName), 0755); } $title = $agent->lastname . ' - ' . trans('messages.invoice') . ' ' . $invoice->invoice_id; $message = __('messages.generated_invoice_mail', ['agent' => $agent->lastname, 'period' => $invoice->period]); $file = PDF::loadView('emails.invoice', $invoice->toArray())->setPaper('a4', 'landscape')->setWarnings(false)->save(public_path($directoryName . $filename)); DB::commit(); $recipients = [preg_replace("/\s+/", "", $hyper->email)]; // Supprimer les espaces dans le mail Mail::mailer('smtp')->raw($message, function ($message) use ($recipients, $title, $file) { $message->subject($title) ->to($recipients) ->attachData($file->output(), str_replace(' ', '-', $title) . '.pdf'); }); } catch (\Throwable $t) { DB::rollBack(); Log::error('-------- Mail not sent -----------'); Log::error($t->getMessage() . " :\n" . $t->getTraceAsString()); } } } Log::info('-------- Weekly Invoice Generation End ' . $date->format("d/m/Y") . '-----------'); })->weekly()->runInBackground(); // Verifier les assurances qui ont expiré chaque jour à minuit $schedule->call(function () { try { DB::beginTransaction(); $datetime = new DateTime(); $insurances = NhInfosInsurances::with(['network:id,name', 'user.identification'])->where('state', InsuranceState::PAID)->where('end_at', '<=', $datetime)->get(); NhInsurance::where('state', InsuranceState::PAID)->where('end_at', '<=', $datetime)->update([ 'state' => InsuranceState::EXPIRED ]); DB::commit(); $title = trans('messages.insurance_expired'); foreach ($insurances as $i) { $message = trans('messages.insurance_expired_mail', ['name' => $i->lastname, 'insured_id' => $i->insured_id, 'bonus_amount' => $this->toMoneyWithCurrencyCode($i->bonus_amount, $i->currency_code), 'total_bonus_amount' => $this->toMoneyWithCurrencyCode($i->total_bonus_amount, $i->currency_code), 'number_of_beneficiaries' => $i->number_of_beneficiaries, 'gender' => trans('states.' . $i->user->identification->gender), 'insurance_name' => $i->network->name, 'months' => $i->number_of_months]); $recipients = [preg_replace("/\s+/", "", $i->email)]; // Supprimer les espaces dans le mail Mail::mailer('smtp')->raw($message, function ($message) use ($recipients, $title) { $message->subject($title) ->to($recipients); }); } } catch (\Throwable $t) { DB::rollBack(); Log::error('-------- Mail not sent notify expired insurance-----------'); Log::error($t->getMessage() . " :\n" . $t->getTraceAsString()); } })->daily()->runInBackground(); } }