110 lines
4.6 KiB
PHP
110 lines
4.6 KiB
PHP
<?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')));
|
|
}
|
|
}
|