ldc-mesbr-app/app/Http/Controllers/Api/V1/PrintController.php

111 lines
4.6 KiB
PHP
Raw Normal View History

2023-11-24 20:26:29 +01:00
<?php
namespace App\Http\Controllers\Api\V1;
use App\Enums\CampaignTypes;
use App\Http\Controllers\Controller;
use App\Http\Requests\Api\V1\PrintRequest;
use App\Lib\Helpers\CouponHelper;
use App\Models\Basket;
use App\Models\Campaign;
use App\Models\CouponLog;
use App\Models\Customer;
use App\Models\PrintedWall;
use Illuminate\Support\Str;
use LDC\LDCCRM\CrmApiV2;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Support\Facades\Storage;
class PrintController extends Controller
{
/**
* Print coupons whith hashcode and customer params
*
* @param \App\Http\Requests\Api\V1\PrintRequest $request
* @return mixed
* @throws \Illuminate\Contracts\Container\BindingResolutionException BindingResolutionException.
* @throws \Psr\Container\NotFoundExceptionInterface NotFoundExceptionInterface.
* @throws \Psr\Container\ContainerExceptionInterface ContainerExceptionInterface.
* @throws \InvalidArgumentException InvalidArgumentException.
* @throws \Illuminate\Database\Eloquent\InvalidCastException InvalidCastException.
*/
public function print(PrintRequest $request)
{
$customer = Customer::where('hashcode', $request->customer_hashcode)->first();
$campaign = Campaign::find($request->campaign_id);
$couponsToPrint = [];
$crmApi = new CrmApiV2(
config('services.crm.endpoint'),
$campaign->brand->crm_token,
$campaign->brand->crm_password
);
$crmCustomer = $crmApi->getCustomer($customer->hashcode);
if ($campaign->type === CampaignTypes::WALL) {
$coupons = $request->coupons;
$availableCoupons = $campaign->coupons
->where('status', 1)->where('can_be_used', 1)->whereIn('id', explode(",", $coupons));
// FIXME : Mettre une condition et un retour erreur si availableCoupons est vide pour ne pas renvoyer un PDF vide.
foreach ($availableCoupons as $coupon) {
if (!CouponHelper::wallCouponIsUsed($coupon, $campaign, $customer)) {
$printUniqId = CouponLog::create(
['coupon_id' => $coupon->id, 'campaign_id' => $campaign->id, 'customer_id' => $customer->id]
)->id;
$cpH = new CouponHelper($coupon, $campaign, $crmCustomer, $printUniqId);
$couponsToPrint[] = $cpH->generate();
// ----- Mémorise l'impression.
$wall = new PrintedWall();
$wall->campaign_id = $campaign->id;
$wall->coupon_id = $coupon->id;
$wall->customer_id = $customer->id;
$wall->save();
// FIXME : Ajout le save pour les stats, se servir de la table coupon_logs pour journaliser ?
}
}
} //end if
if ($campaign->type === CampaignTypes::BASKET) {
$basket = Basket::firstOrCreate(
[
'campaign_id' => $campaign->id,
'customer_id' => $customer->id
]
);
foreach ($basket->content as $content) {
if ($content->coupon->status === 1 && $content->coupon->can_be_used) {
for ($i = 1; $i <= $content->qty; $i++) {
$printUniqId = CouponLog::create(
[
'coupon_id' => $content->coupon->id,
'campaign_id' => $campaign->id,
'customer_id' => $customer->id
]
)->id;
$cpH = new CouponHelper($content->coupon, $campaign, $crmCustomer, $printUniqId);
$couponsToPrint[] = $cpH->generate();
}
}
$basket->content()->delete();
}
} //end if
$pdfName = sprintf("Coupons_%s_%s_%s.pdf", $crmCustomer->firstname, $crmCustomer->lastname, Str::ulid());
$pdfPath = sprintf("%s/%s", 'app/private/coupons_pdf', $pdfName);
Pdf::loadView('api.pdf.coupons', ['coupons' => $couponsToPrint])->save(storage_path($pdfPath));
// FIXME : Gérer l'échec
/**
* Methode Pixibox a fixer sur le print
* return route('coupons.print', ['pdf' =>
* Storage::disk('coupons_pdf')->temporaryUrl($pdfName, now()->addMinutes(config('coupons.fileValidity')))]);.
*/
return Storage::disk('coupons_pdf')->temporaryUrl($pdfName, now()->addMinutes(config('coupons.fileValidity')));
}
}