ldc-dam/app/Http/Traits/ArcadiaLink.php
2022-06-20 14:04:15 +02:00

198 lines
8.4 KiB
PHP

<?php
namespace App\Http\Traits;
use App\Models\Format;
use App\Scopes\SystemScope;
use DOMDocument;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
trait ArcadiaLink
{
public static function checkRequiredValues($media)
{
$required = ['sujet_id', 'typemedia_id', 'typevue_id', 'variante_id', 'langue_id', 'version'];
foreach ($required as $v) {
if ($media->$v === null) {
return false;
}
}
return true;
}
public static function create($media)
{
if (!self::checkRequiredValues($media)) {
return;
}
$media->isLocked = 1;
$media->save();
self::convert(self::getXML($media, "C"), $media);
}
public static function update($media)
{
if ($media->arcadia_id === null) {
return;
}
if (!self::checkRequiredValues($media)) {
return;
}
$media->isLocked = 1;
$media->save();
self::convert(self::getXML($media, "M"), $media);
}
public static function delete($media)
{
if ($media->arcadia_id === null) {
return;
}
if (!self::checkRequiredValues($media)) {
return;
}
$media->isLocked = 1;
$media->save();
self::convert(self::getXML($media, "S"), $media);
}
public static function reactivate($media)
{
if ($media->arcadia_id === null) {
return;
}
if (!self::checkRequiredValues($media)) {
return;
}
$media->isLocked = 1;
$media->save();
self::convert(self::getXML($media, "R"), $media);
}
private static function convert($xml, $media)
{
$uid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff));
Storage::disk('arcadia_link_s')->put("$uid.xml", $xml);
self::compress($uid, $media);
}
private static function compress($uid, $media)
{
try {
$zip_file = storage_path('arcadia_link/send') . "/$media->id-$uid.zip";
$zip = new \ZipArchive();
$zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
$zip->addFile(storage_path('arcadia_link/send') . "/$uid.xml", 'media.xml');
$zip->addFile(public_path() . "/$media->folder$media->uid.$media->extension", "$media->uid.$media->extension");
$zip->close();
unset($zip);
unlink(storage_path('arcadia_link/send') . "/$uid.xml");
// On insert dans la table de supervision
$s = new \App\Models\ArcadiaLink();
$s->media_id = $media->id;
if ($media->arcadia_id !== null) {
$s->arcadia_id = $media->arcadia_id;
}
$s->filename = "$media->id-$uid.zip";
$s->save();
} catch (Exception $e) {
// echo "Exception : " . $e;
// TODO : Envoi mail Log
Log::emergency("Erreur création .zip : $e (Traits/ArcadiaLink)");
}//end try
}
private static function getXML($media, $mouvement)
{
$refKey = self::getRefKey($media);
$formats = self::getFormats();
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$root = $dom->createElement('MEDIA_VISUEL');
$dom->appendChild($root);
$root->appendChild($dom->createElement('codeArcadia'))->appendChild($dom->createCDATASection("$media->arcadia_id"));
$root->appendChild($dom->createElement('code_DAM'))->appendChild($dom->createCDATASection("$media->id"));
$root->appendChild($dom->createElement('TypeMouvement'))->appendChild($dom->createCDATASection("$mouvement"));
$cleRef = $root->appendChild($dom->createElement('cle_Referentiel'));
foreach ($refKey as $k) {
if ($media->sujet_id === 1) {
$cleRef->appendChild($dom->createElement('id'))->appendChild($dom->createCDATASection("$k->noArt"));
} elseif ($media->sujet_id === 2) {
$cleRef->appendChild($dom->createElement('id'))->appendChild($dom->createCDATASection("$k->codMarq"));
} elseif ($media->sujet_id === 4) {
$cleRef->appendChild($dom->createElement('id'))->appendChild($dom->createCDATASection("$k->id"));
}
}
$root->appendChild($dom->createElement('libExtension'))->appendChild($dom->createCDATASection("$media->extension"));
$root->appendChild($dom->createElement('nbPxLargeur'))->appendChild($dom->createCDATASection("$media->largeur"));
$root->appendChild($dom->createElement('largeurMm'))->appendChild($dom->createCDATASection("$media->largeur_mm"));
$root->appendChild($dom->createElement('nbPxHauteur'))->appendChild($dom->createCDATASection("$media->hauteur"));
$root->appendChild($dom->createElement('hauteurMm'))->appendChild($dom->createCDATASection("$media->hauteur_mm"));
$root->appendChild($dom->createElement('pppLargeur'))->appendChild($dom->createCDATASection("$media->resolution"));
$root->appendChild($dom->createElement('version'))->appendChild($dom->createCDATASection("$media->version"));
$root->appendChild($dom->createElement('codeTypeMedia'))->appendChild($dom->createCDATASection("$media->typemedia_id"));
$root->appendChild($dom->createElement('codeTypeVue'))->appendChild($dom->createCDATASection("$media->typevue_id"));
$root->appendChild($dom->createElement('commentaire'))->appendChild($dom->createCDATASection("$media->commentaire"));
$root->appendChild($dom->createElement('codeSujet'))->appendChild($dom->createCDATASection("$media->sujet_id"));
$root->appendChild($dom->createElement('langue'))->appendChild($dom->createCDATASection("$media->langue_id"));
$root->appendChild($dom->createElement('copyright'))->appendChild($dom->createCDATASection("$media->copyright_id"));
$root->appendChild($dom->createElement('codeVariante'))->appendChild($dom->createCDATASection("$media->variante_id"));
$root->appendChild($dom->createElement('dateCreation'))->appendChild($dom->createCDATASection("$media->created_at"));
$root->appendChild($dom->createElement('dateModification'))->appendChild($dom->createCDATASection("$media->updated_at"));
$root->appendChild($dom->createElement('datePublication'))->appendChild($dom->createCDATASection("$media->published_at"));
$root->appendChild($dom->createElement('libelle'))->appendChild($dom->createCDATASection("$media->libelle"));
$root->appendChild($dom->createElement('NomFichier'))->appendChild($dom->createCDATASection("$media->uid.$media->extension"));
$mediaFormat = $root->appendChild($dom->createElement('formats'));
foreach ($formats as $k) {
$format = $mediaFormat->appendChild($dom->createElement('format'));
$format->appendChild($dom->createElement('id'))->appendChild($dom->createCDATASection($k['id']));
$format->appendChild($dom->createElement('libelle'))->appendChild($dom->createCDATASection($k['libelle']));
$format->appendChild($dom->createElement('extension'))->appendChild($dom->createCDATASection("$media->extension"));
$format->appendChild($dom->createElement('largeur'))->appendChild($dom->createCDATASection($k['largeur']));
$format->appendChild($dom->createElement('hauteur'))->appendChild($dom->createCDATASection($k['hauteur']));
$format->appendChild($dom->createElement('lien'))->appendChild($dom->createCDATASection(env('APP_URL') . "/$media->folder$media->uid" . "_" . $k['libelle'] . ".$media->extension"));
}
return $dom->saveXML();
}
public static function getRefKey($media)
{
switch ($media->sujet_id) {
case 1:
return $media->articles()->get();
break;
case 2:
return $media->marques()->get();
break;
case 4:
return $media->societes()->get();
break;
default:
return [];
}
}
private static function getFormats()
{
return Format::withoutGlobalScope(SystemScope::class)
->where('system', true)->get();
}
}