ldc-crm/app/Http/Controllers/Api/V2/ArcadiaController.php
Jérémy Munsch 787ee5a4c5 - tag 2.0.1
- Add Questions segementation
- Fix Customer delete Tests
2021-08-11 17:37:59 +02:00

115 lines
4.1 KiB
PHP

<?php
namespace App\Http\Controllers\Api\V2;
use App\Enums\ArcadiaMailType;
use App\Enums\ArcadiaOrderType;
use App\Exceptions\Api\V2\CrmException;
use App\Http\Controllers\Controller;
use App\Http\Requests\Api\V2\BaseApiRequest;
use App\Http\Requests\Api\V2\SendArchadiaDefaultMailRequest;
use App\Http\Requests\Api\V2\SendArchadiaGameMailRequest;
use App\Mail\CourrierArcadiaError;
use App\Models\Customer;
use App\Models\CustomerInfo;
use App\Models\Service;
use DOMDocument;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;
/**
* TODO: séparer ça quand coté arcadia ils auront branché le cerveau
* Ici c'est du sale à cause d'arcadia
* Ils ont fait le choix de rajouter une fonctionnalité
* sur un methode existant en rajoutant des conditions
* sales
*
* Donc un séparation est faite sur les endpoints CRM et dans le client
* pour éviter une confusion de noes utilisateurs
*/
class ArcadiaController extends Controller
{
public function outgoingMailDefault(SendArchadiaDefaultMailRequest $request, Customer $customer, Service $service)
{
$this->authorize('customerBelongsToService', $customer);
return $this->handleArcadiaMail($request, ArcadiaMailType::default(), $customer, $service);
}
public function outgoingMailGame(SendArchadiaGameMailRequest $request, Customer $customer, Service $service)
{
$this->authorize('customerBelongsToService', $customer);
return $this->handleArcadiaMail($request, ArcadiaMailType::game(), $customer, $service);
}
private function handleArcadiaMail(
BaseApiRequest $request,
ArcadiaMailType $type,
Customer $customer,
Service $service
) {
$request = $request->merge([
'order_number' => str_pad(\intval($request->order_number), 9, '0', STR_PAD_LEFT)
]);
$xml = 'none';
try {
/** @var \App\Models\CustomerInfo $customerInfo */
$customerInfo = $customer->info($service->brand)->firstOrFail();
$orderType = ArcadiaOrderType::make(intval($request->state_order));
$xml = $this->makeXml($request, $type, $orderType, $customer, $customerInfo);
// Format xml
$doc = new DOMDocument('1.0', 'utf-8');
$doc->preserveWhiteSpace = true;
$doc->formatOutput = true;
$doc->loadXML($xml);
$xml = $doc->saveXML();
Storage::disk('arcadia')->put(date("Ymd_His") . ".xml", $xml);
return response()->json();
} catch (\Exception $e) {
Log::critical("ARCADIA XML CREATION FAILED : " . $e->getMessage());
if (!config('app.debug')) {
dispatch(function () use ($xml, $e) {
Mail::to(config('mail.MAIL_ADMIN'))->send(new CourrierArcadiaError(
"ARCADIA XML CREATION FAILED",
"Une erreur est survenue lors de la création du fichier XML : " . $e->getMessage(),
$xml
));
})->afterResponse();
} else {
throw $e;
}
throw new CrmException('Failed to create the arcadia xml file', 0, $e);
}
}
/**
* render Arcadia xml for order
*
* @param SendArchadiaMailRequest $request
* @param ArcadiaMailType $type
* @param ArcadiaOrderType $orderType
* @param Customer $customer
* @param CustomerInfo $customerInfo
* @return string
*/
private function makeXml(
BaseApiRequest $request,
ArcadiaMailType $type,
ArcadiaOrderType $orderType,
Customer $customer,
CustomerInfo $customerInfo
): string {
return view(
'mail.arcadiaOrders.default',
[
'request' => $request,
'type' => $type,
'orderType' => $orderType,
'customer' => $customer,
'customerInfo' => $customerInfo
]
)->render();
}
}