Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
ArcadiaController
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
4 / 4
8
100.00% covered (success)
100.00%
1 / 1
 outgoingMailDefault
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 outgoingMailGame
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 handleArcadiaMail
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
4
 makeXml
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace App\Http\Controllers\Api\V2;
4
5use App\Enums\ArcadiaMailType;
6use App\Enums\ArcadiaOrderType;
7use App\Http\Controllers\Controller;
8use App\Http\Requests\Api\V2\BaseApiRequest;
9use App\Http\Requests\Api\V2\SendArchadiaDefaultMailRequest;
10use App\Http\Requests\Api\V2\SendArchadiaGameMailRequest;
11use App\Mail\CourrierArcadiaError;
12use DOMDocument;
13use Illuminate\Http\JsonResponse;
14use Illuminate\Support\Facades\Log;
15use Illuminate\Support\Facades\Mail;
16use Illuminate\Support\Facades\Storage;
17use Illuminate\Support\Str;
18
19/**
20 * ! Ici c'est du sale à cause d'arcadia
21 * Ils ont fait le choix de rajouter une fonctionnalité
22 * sur une methode existante en rajoutant des conditions
23 * sales. Ils ont donc une seule méthode pour envoyer plusieurs
24 * types de réclas avec des champs différents...
25 *
26 * Donc une séparation est faite sur les endpoints CRM et dans le client
27 * pour éviter une confusion de nos utilisateurs
28 */
29class ArcadiaController extends Controller
30{
31    /**
32     * Send arcadia default mail (reclamations)
33     *
34     * @param \App\Http\Requests\Api\V2\SendArchadiaDefaultMailRequest $request
35     * @return \Illuminate\Http\JsonResponse
36     */
37    public function outgoingMailDefault(SendArchadiaDefaultMailRequest $request): JsonResponse
38    {
39        return $this->handleArcadiaMail($request, ArcadiaMailType::default());
40    }
41
42    /**
43     * Send arcadia game mail (games)
44     *
45     * @param \App\Http\Requests\Api\V2\SendArchadiaGameMailRequest $request
46     * @return \Illuminate\Http\JsonResponse
47     */
48    public function outgoingMailGame(SendArchadiaGameMailRequest $request): JsonResponse
49    {
50        return $this->handleArcadiaMail($request, ArcadiaMailType::game());
51    }
52
53    /**
54     * Form xml message and save it in the apropriate storage location
55     * to be picked up by the arcadia job
56     *
57     * @param \App\Http\Requests\Api\V2\BaseApiRequest $request
58     * @param \App\Enums\ArcadiaMailType               $type
59     * @return \Illuminate\Http\JsonResponse
60     * @throws \Exception If an error occurs while generating and saving the xml file.
61     */
62    private function handleArcadiaMail(BaseApiRequest $request, ArcadiaMailType $type): JsonResponse
63    {
64        $request = $request->merge([
65            'order_num' => str_pad(\intval($request->order_num), 9, '0', STR_PAD_LEFT)
66        ]);
67        $xml     = 'none';
68        try {
69            $customerInfo = \array_intersect_key($request->all()['deliver'], [
70                'email' => '',
71                'firstname' => '',
72                'lastname' => '',
73                'address' => '',
74                'address2' => '',
75                'city' => '',
76                'postcode' => '',
77                'phone' => ''
78            ]);
79            $orderType    = ArcadiaOrderType::make(intval($request->state_order));
80            $xml          = $this->makeXml($request, $type, $orderType, $customerInfo);
81
82            // * Format xml.
83            $doc                     = new DOMDocument('1.0', 'utf-8');
84            $doc->xmlStandalone      = true;
85            $doc->preserveWhiteSpace = false;
86            $doc->formatOutput       = true;
87            $doc->loadXML($xml);
88            $xml = $doc->saveXML();
89
90            Storage::disk('arcadia')->put(Str::slug(sprintf(
91                'v2_order_%s_%s_%s%s',
92                $request->order_num,
93                $type->label,
94                date('Ymd_His'),
95                \microtime(true)
96            )) . '.xml', $xml);
97            return response()->json();
98            // @codeCoverageIgnoreStart
99        } catch (\Exception $e) {
100            Log::critical("ARCADIA XML CREATION FAILED FOR $request->order_num : " . $e->getMessage());
101            if (!config('app.debug')) {
102                dispatch(function () use ($xml, $e, $request) {
103                    Mail::to(config('mail.MAIL_ADMIN'))->send(new CourrierArcadiaError(
104                        "ARCADIA XML CREATION FAILED FOR $request->order_num",
105                        "Une erreur est survenue lors de la création du fichier XML : " . $e->getMessage(),
106                        $xml ?: ''
107                    ));
108                })->afterResponse();
109            }
110            throw $e;
111            // @codeCoverageIgnoreEnd
112        }//end try
113    }
114
115    /**
116     * render Arcadia xml for order
117     *
118     * @param \App\Http\Requests\Api\V2\BaseApiRequest $request
119     * @param \App\Enums\ArcadiaMailType               $type
120     * @param \App\Enums\ArcadiaOrderType              $orderType
121     * @param array                                    $customerInfo
122     * @return string
123     */
124    private function makeXml(
125        BaseApiRequest $request,
126        ArcadiaMailType $type,
127        ArcadiaOrderType $orderType,
128        array $customerInfo
129    ): string {
130        $arcadiaMailType = $type->equals(ArcadiaMailType::default()) ?
131            'mail.arcadiaOrders.default' : 'mail.arcadiaOrders.game';
132        return view($arcadiaMailType, [
133            'request' => $request,
134            'type' => $type,
135            'orderType' => $orderType,
136            'customerInfo' => $customerInfo
137        ])->render();
138    }
139}