ldc-crm/app/Http/Controllers/Api/v1/ArcadiaController.php
2021-05-12 18:39:53 +02:00

214 lines
10 KiB
PHP

<?php
namespace App\Http\Controllers\Api\v1;
use App\Http\Controllers\Controller;
use App\Http\Resources\StatusResource;
use App\Mail\CourrierArcadiaError;
use App\Models\Customer;
use DOMDocument;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
class ArcadiaController extends Controller
{
public function outgoingMail(Request $request)
{
$validator = Validator::make($request->all(), [
'crm_id' => 'required',
'fields' => 'required|json',
'type' => 'required',
]);
if ($validator->fails())
return new StatusResource(['status' => 'KO', 'code' => 201, 'message' => 'Error on required fields.', 'errors' => $validator->errors()]);
$brandId = $request->brand_id;
$crmId = $request->crm_id;
$fields = json_decode($request->fields);
$type = $request->type;
$customer = Customer::where('id', $crmId)->first();
if (!$customer)
return new StatusResource(['status' => 'KO', 'code' => 202, 'message' => 'User not found.']);
$customerInfos = $customer->infos()->where('brand_id', $brandId)->first();
if (!$customerInfos)
return new StatusResource(['status' => 'KO', 'code' => 202, 'message' => 'User not found.']);
$check = $this->checkRequiredFields($fields, $type);
if ($check['status'] !== 'OK')
return new StatusResource($check);
$xml = $this->makeXML($fields, $type, $customer, $customerInfos);
try {
Storage::disk('arcadia')->put(date ("Ymd_His") . microtime(true) . ".xml", $xml);
return new StatusResource(['status' => 'OK']);
}catch (\Exception $e){
Log::critical("ARCADIA XML CREATION FAILED : " . $e->getMessage());
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));
return new StatusResource(['status' => 'KO', 'code' => 204, 'message' => 'Arcadia XML Creation failed.']);
}
}
private function checkRequiredFields($fields, $type)
{
$errors = [];
$key = array_search('operation', array_column($fields->root, 'fieldName'));
if ($key === false)
$errors[] = ['field' => 'operation', 'error' => 'required'];
$key = array_search('support_code', array_column($fields->orderLine, 'fieldName'));
if ($key === false)
$errors[] = ['field' => 'support_code', 'error' => 'required'];
$key = array_search('label_type_support', array_column($fields->orderLine, 'fieldName'));
if ($key === false)
$errors[] = ['field' => 'label_type_support', 'error' => 'required'];
$key = array_search('order_date', array_column($fields->root, 'fieldName'));
if ($key === false)
$errors[] = ['field' => 'order_date', 'error' => 'required'];
if (!preg_match("/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/", $fields->root[$key]->fieldValue)) {
$errors[] = ['field' => 'order_date', 'error' => 'format must be DD/MM/YYYY'];
}
if ($type === 'default'){
$key = array_search('order_num', array_column($fields->root, 'fieldName'));
if ($key === false)
$errors[] = ['field' => 'order_num', 'error' => 'required for default type'];
if (!is_numeric($fields->root[$key]->fieldValue) || strlen($fields->root[$key]->fieldValue) !== 9)
$errors[] = ['field' => 'order_num', 'error' => 'format must be 9 numeric characters'];
$key = array_search('state_order_cb', array_column($fields->root, 'fieldName'));
if ($key === false)
$errors[] = ['field' => 'state_order_cb', 'error' => 'required for default type'];
if ($fields->root[$key]->fieldValue !== 1 && $fields->root[$key]->fieldValue !== 'Null')
$errors[] = ['field' => 'state_order_cb', 'error' => 'value must be 1 or Null (Yes Null not NULL)'];
$orderCB = $fields->root[$key]->fieldValue;
$key = array_search('state_order_check', array_column($fields->root, 'fieldName'));
if ($key === false)
$errors[] = ['field' => 'state_order_check', 'error' => 'required for default type'];
if ($fields->root[$key]->fieldValue !== 1 && $fields->root[$key]->fieldValue !== 'Null')
$errors[] = ['field' => 'state_order_check', 'error' => 'value must be 1 or Null (Yes Null not NULL)'];
$orderCheck = $fields->root[$key]->fieldValue;
if ($orderCB === $orderCheck)
$errors[] = ['field' => 'state_order', 'error' => 'state_order_cb and state_order_check values must be different'];
$key = array_search('package_unit_weight', array_column($fields->orderLine, 'fieldName'));
if ($key === false)
$errors[] = ['field' => 'package_unit_weight', 'error' => 'required for default type'];
}elseif ($type === 'game'){
$key = array_search('code_unique', array_column($fields->orderLine, 'fieldName'));
if ($key === false)
$errors[] = ['field' => 'code_unique', 'error' => 'required for game type'];
}
if (!empty($errors))
return ['status' => 'KO', 'code' => 203, 'message' => $errors];
return ['status' => 'OK'];
}
private function makeXML($fields, $type, $customer, $customerInfos)
{
$pivot = [
'order_num' => 'Num_Commande', // required if type = default - format 9 numeric characters
'order_date' => 'Date_Commande', // required - format : DD/MM/YYYY
'operation' => 'Operation', // required
'support_code' => 'Code_Support', // required
'label_type_support' => 'Libelle_Type_Support', // required
'package_unit_weight' => 'Poids_Unitaire_Colis', // required if type = default
'qty' => 'Quantite',
'code_on_pack' => 'Code_on_Pack',
'code_unique' => 'Code_Unique', // required if type = game
'state_order_cb' => 'Etat_Commande_CB', // required if type = default - format 1 ou Null (oui Null et pas NULL)
'state_order_check' => 'Etat_Commande_Cheque', // required if type = default - format 1 ou Null (oui Null et pas NULL)
];
$dom = new DOMDocument('1.0','UTF-8');
$dom->formatOutput = true;
$root = $dom->createElement('export_arcadia');
$dom->appendChild($root);
$order = $root->appendChild($dom->createElement('Commande'));
$key = array_search('order_num', array_column($fields->root, 'fieldName'));
if ($key === false)
$order->appendChild($dom->createElement('Num_Commande'));
else
$order->appendChild($dom->createElement('Num_Commande', $fields->root[$key]->fieldValue));
foreach ($fields->root as $value){
if (isset($pivot[$value->fieldName]) && $value->fieldName !== 'state_order_cb' && $value->fieldName !== 'state_order_check' && $value->fieldName !== 'order_num')
$order->appendChild($dom->createElement($pivot[$value->fieldName], $value->fieldValue));
}
if ($type === 'default') {
$key = array_search('state_order_cb', array_column($fields->root, 'fieldName'));
if ($key)
$order->appendChild($dom->createElement('Etat_Commande_CB', $fields->root[$key]->fieldValue));
$key = array_search('state_order_check', array_column($fields->root, 'fieldName'));
if ($key)
$order->appendChild($dom->createElement('Etat_Commande_Cheque', $fields->root[$key]->fieldValue));
}
$order->appendChild($dom->createElement('Email_conso'))->appendChild($dom->createCDATASection( "$customer->email"));
$order->appendChild($dom->createElement('Civilite'));
$order->appendChild($dom->createElement('Nom'))->appendChild($dom->createCDATASection( "$customerInfos->lastname"));
$order->appendChild($dom->createElement('Prenom'))->appendChild($dom->createCDATASection( "$customerInfos->firstname"));
$order->appendChild($dom->createElement('Adresse'))->appendChild($dom->createCDATASection( "$customerInfos->address"));
$order->appendChild($dom->createElement('Adresse_Complementaire'))->appendChild($dom->createCDATASection( "$customerInfos->address2"));
$order->appendChild($dom->createElement('CP'))->appendChild($dom->createCDATASection( "$customerInfos->postcode"));
$order->appendChild($dom->createElement('Ville'))->appendChild($dom->createCDATASection( "$customerInfos->city"));
$order->appendChild($dom->createElement('Telephone'))->appendChild($dom->createCDATASection( "$customerInfos->phone"));
$orderLine = $order->appendChild($dom->createElement('Ligne_de_Commande'));
$key = array_search('qty', array_column($fields->orderLine, 'fieldName'));
if ($key === false)
$orderLine->appendChild($dom->createElement('Quantite', '1'));
$key = array_search('package_unit_weight', array_column($fields->orderLine, 'fieldName'));
if ($key === false)
$orderLine->appendChild($dom->createElement('Poids_Unitaire_Colis'));
foreach ($fields->orderLine as $value){
if (isset($pivot[$value->fieldName]) && $value->fieldName !== 'code_on_pack' && $value->fieldName !== 'code_unique')
$orderLine->appendChild($dom->createElement($pivot[$value->fieldName], $value->fieldValue));
}
if ($type === 'game') {
$key = array_search('code_on_pack', array_column($fields->orderLine, 'fieldName'));
if ($key)
$orderLine->appendChild($dom->createElement('Code_on_Pack'))->appendChild($dom->createCDATASection($fields->orderLine[$key]->fieldValue));
$key = array_search('code_unique', array_column($fields->orderLine, 'fieldName'));
if ($key)
$orderLine->appendChild($dom->createElement('Code_Unique'))->appendChild($dom->createCDATASection($fields->orderLine[$key]->fieldValue));
}
return $dom->saveXML();
}
}