diff --git a/app/Console/Commands/CafelPoultryMepCommand.php b/app/Console/Commands/CafelPoultryMepCommand.php new file mode 100644 index 0000000..042ae8d --- /dev/null +++ b/app/Console/Commands/CafelPoultryMepCommand.php @@ -0,0 +1,38 @@ +info('Running the Job, this could take some time.'); + + $job = new CafelMepPoultryJob(); + $job->handle(); + + $this->info('Fin du traitement'); + } +} diff --git a/app/Console/Commands/LDCWebStatusChecker.php b/app/Console/Commands/LDCWebStatusChecker.php deleted file mode 100644 index 451d2cd..0000000 --- a/app/Console/Commands/LDCWebStatusChecker.php +++ /dev/null @@ -1,79 +0,0 @@ - 0) { - foreach ($files as $file) { - $data['logs'] = $data['logs'] + filesize($file); - } - } - - $data['code']['version'] = app()->version(); - - try { - Http::post( - 'https://ldc-web.s-web.test/api/status-checker', - ['token' => 'CE8S52Qq7stf5k8frF4T', 'datas' => json_encode($data)] - ); - } catch (\Exception $e) { - report($e); - } - - return 0; - } -} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 55d8992..134d8c4 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -38,6 +38,7 @@ class Kernel extends ConsoleKernel $schedule->job(XmlFluxEggJob::class, 'tracea')->onOneServer()->dailyAt('02:00'); $schedule->job(XmlFluxPoultryJob::class, 'tracea')->onOneServer()->dailyAt('22:00'); + $schedule->command('xml:clean_olds')->onOneServer()->dailyAt('06:00'); } /** diff --git a/app/Http/Controllers/Fo/TraceaPoultryController.php b/app/Http/Controllers/Fo/TraceaPoultryController.php index 9376721..461efd9 100644 --- a/app/Http/Controllers/Fo/TraceaPoultryController.php +++ b/app/Http/Controllers/Fo/TraceaPoultryController.php @@ -3,8 +3,10 @@ namespace App\Http\Controllers\Fo; use App\Http\Controllers\Controller; +use App\Http\Requests\Fo\Ajax\GetDistributionRequest; use App\Http\Requests\Fo\SearchPoultryTraceaRequest; use App\Models\TraceaPoultry; +use Illuminate\Http\JsonResponse; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Session; @@ -68,14 +70,34 @@ class TraceaPoultryController extends Controller \redirect()->route('poultry.search')->throwResponse(); } - $distributionPicture = $this->getDistributionPicture($traceaPoultry->sign); + // ! Test that food and mep are available + if (!$traceaPoultry->mep or !$traceaPoultry->food) { + return \view('front.poultry.unavailable'); + } return view('front.poultry.show', compact( - 'traceaPoultry', - 'distributionPicture' + 'traceaPoultry' )); } + /** + * Get Distribution Info + * + * @param \App\Http\Requests\Fo\Ajax\GetDistributionRequest $request + * @return \Illuminate\Http\JsonResponse + */ + public function getDistribution(GetDistributionRequest $request): JsonResponse + { + /** @var \App\Models\TraceaPoultry */ + $traceaPoultry = TraceaPoultry::where('order_num', $request->ordernum) + ->where('external_code_lot', $request->codelot)->firstOrFail(); + return \response()->json([ + 'exp_date' => $traceaPoultry->exp_date, + 'sign' => $traceaPoultry->sign, + 'picture' => $this->getDistributionPicture($traceaPoultry->sign) + ]); + } + /** * Get distribution sign picture name if exists. * diff --git a/app/Http/Middleware/SecureHeaders.php b/app/Http/Middleware/SecureHeaders.php index 2d2f157..91c5300 100644 --- a/app/Http/Middleware/SecureHeaders.php +++ b/app/Http/Middleware/SecureHeaders.php @@ -44,7 +44,7 @@ class SecureHeaders // phpcs:ignore Generic.Files.LineLength.TooLong "style-src 'self' $cssDev https://fonts.googleapis.com;", // phpcs:ignore Generic.Files.LineLength.TooLong - "script-src 'self' $jsDev https://fonts.googleapis.com;" + "script-src 'self' $jsDev https://fonts.googleapis.com https://www.googletagmanager.com;" ]; $response->headers->set( 'Content-Security-Policy', diff --git a/app/Http/Requests/Fo/Ajax/GetDistributionRequest.php b/app/Http/Requests/Fo/Ajax/GetDistributionRequest.php new file mode 100644 index 0000000..3b02198 --- /dev/null +++ b/app/Http/Requests/Fo/Ajax/GetDistributionRequest.php @@ -0,0 +1,31 @@ + 'required|numeric|digits:10', + 'ordernum' => 'required|numeric|digits:6', + ]; + } +} diff --git a/app/Jobs/CafelMepPoultryJob.php b/app/Jobs/CafelMepPoultryJob.php new file mode 100644 index 0000000..c570fa5 --- /dev/null +++ b/app/Jobs/CafelMepPoultryJob.php @@ -0,0 +1,49 @@ +subDays(config('cafel.mises_en_places_retain', 370)); + $this->syncWithCafelApi( + CafelMepPoultry::class, + 'cafel.ldc.mepvolailles', + [ + 'dateDebut' => $dateDebut->format('Y-m-d'), + 'dateFin' => now()->format('Y-m-d') + ], + function (array $row) { + // * Validate row data + CafelMepPoultry::validateDataRow($row); + + /** @var array Unique Key columns */ + $uniqueColumnsKey = []; + foreach (CafelMepPoultry::UNIQUE_COLUMN_KEYS as $uField) { + $uniqueColumnsKey[$uField] = $row[$uField]; + } + + forward_static_call_array( + [CafelPoultryMiseEnPlace::class, 'updateOrCreate'], + [$uniqueColumnsKey, $row] + ); + } + ); + $this->mailInvalidRows(CafelMepPoultry::UNIQUE_COLUMN_KEYS, CafelMepPoultry::class); + + // * DeleteOld MEPs + // * Garder une interstice de X jours entre la suppression et ce qu'on récupère de CAFEL + CafelPoultryMiseEnPlace::whereDate('transfert_date', '<', $dateDebut->subDays( + config('cafel.mises_en_places_retain', 370) + ))->delete(); + } +} diff --git a/app/Lib/CafelApi/Models/CafelMepPoultry.php b/app/Lib/CafelApi/Models/CafelMepPoultry.php new file mode 100644 index 0000000..e0be9ce --- /dev/null +++ b/app/Lib/CafelApi/Models/CafelMepPoultry.php @@ -0,0 +1,42 @@ + + */ +abstract class CafelMepPoultry extends CafelClientModel +{ + /** + * Unique columns key + * + * @var array + */ + public const UNIQUE_COLUMN_KEYS = [ + 'batch_code' + ]; + + /** + * Validation rules from cafel Api + * + * @var array + */ + protected static $validationRules = [ + // Eg V072FXT (un seul par ligne). + 'inuav_code' => 'required|string|regex:/^[A-Z]\d{3}[A-Z]{3}$/', + // Eg 19377/0 . + 'batch_code' => 'required|max:10|regex:/^[0-9A-Z]*\/\d$/', + 'transfert_date' => 'required|date_format:Y-m-d' + ]; + + /** + * Column translations + * + * @var array + */ + protected static $columnsTranslations = [ + 'Inuav_code' => 'inuav_code', + 'Batch_code' => 'batch_code', + 'Transfert_date' => 'transfert_date' + ]; +} diff --git a/app/Models/CafelPoultryMiseEnPlace.php b/app/Models/CafelPoultryMiseEnPlace.php new file mode 100644 index 0000000..37e3ef4 --- /dev/null +++ b/app/Models/CafelPoultryMiseEnPlace.php @@ -0,0 +1,69 @@ + 'date' + ]; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'batch_code', + 'inuav_code', + 'transfert_date' + ]; + + // * METHODS + + /** + * Get Mep using cafel lot code + * + * @param integer $codeLotCafel + * @return self|null + */ + public static function whereCodeLotCafel(int $codeLotCafel): ?self + { + return Cache::remember("poultryMep$codeLotCafel", 5, function () use ($codeLotCafel) { + return self::where( + 'batch_code', + 'LIKE', + '%' . \filter_var($codeLotCafel, \FILTER_SANITIZE_STRING) . '/%' + )->first(); + }); + } +} diff --git a/app/Models/TraceaPoultry.php b/app/Models/TraceaPoultry.php index 5b097c4..69bd7f6 100644 --- a/app/Models/TraceaPoultry.php +++ b/app/Models/TraceaPoultry.php @@ -98,6 +98,7 @@ class TraceaPoultry extends Model public function getBreederAttribute(): ?CafelPoultryBreeder { $matches = []; + preg_match('/(?PV\d{3}[A-Z]{3})/', \strval($this->breeder_code), $matches); if (!\array_key_exists('inuav', $matches)) { return collect(); @@ -153,4 +154,25 @@ class TraceaPoultry extends Model // * On utilise code lot_opa vue que son explication de merde est inversée ... Uu return CafelFood::whereCodeLotCafel(FoodType::chicken(), \intval($this->opa_lot)); } + + /** + * * Get Bea + * + * L'explication du batch code est un non sens.... putin de merde + * + * Comment faisons-nous pour lier notre lot à une note BEA ? + * (code lot sous ce format : XXXXX/0 pour les données BEA) -> Code lot CAFEL / Code OPA + * Comment faisons-nous pour lier notre lot à son alimentation ? + * (code lot sous ce format : XXXXX/0 pour les données alimentation) -> Code lot CAFEL / Code OPA + * Pour ces questions, peux-tu nous dire avec les informations que nous recevons du flux Sablé + * les règles que nous devons utiliser stp ? * -> @Mathilde Hervier peux-tu répondre à cette question ? + * Le 6e champ reçu dans le fichier xml est le code lot OPA qui sert donc à faire le lien avec la CAFEL + * + * @return \App\Models\CafelPoultryMiseEnPlace|null + */ + public function getMepAttribute(): ?CafelPoultryMiseEnPlace + { + // * On utilise code lot_opa vue que son explication de merde est inversée ... Uu + return CafelPoultryMiseEnPlace::whereCodeLotCafel(\intval($this->opa_lot)); + } } diff --git a/composer.json b/composer.json index b1e953d..125958c 100644 --- a/composer.json +++ b/composer.json @@ -19,12 +19,12 @@ "kwaadpepper/enum": "^2.1", "kwaadpepper/exception-handler": "^0.0.6", "kwaadpepper/refresh-sitemap": "^1.0", - "laravel/ui": "^3.0", "laravel/framework": "^8.0", "laravel/tinker": "^2.0", + "laravel/ui": "^3.0", "laravelcollective/html": "^6.0", "ldc/web-admin-secure-laravel": "1.0.1", - "ldc/web-status-checker-laravel": "1.0.3", + "ldc/web-status-checker-laravel": "^1.0", "mews/purifier": "^3.3", "nesbot/carbon": "^2.29", "spatie/laravel-mix-preload": "^1.3" diff --git a/composer.lock b/composer.lock index df17782..88e1167 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "040c7f9d55df10bfbad67ab4fc1eec41", + "content-hash": "3b8a85ff97e17a3645c1bb8dcb6a15bf", "packages": [ { "name": "arondeparon/laravel-request-sanitizer", @@ -9303,5 +9303,5 @@ "ext-xml": "*" }, "platform-dev": [], - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.3.0" } diff --git a/config/cafel.php b/config/cafel.php index 4a7e51d..5dfade3 100644 --- a/config/cafel.php +++ b/config/cafel.php @@ -51,6 +51,12 @@ return [ 'methods' => [ 'GET' ] + ], + 'cafel.ldc.mepvolailles' => [ + 'uri' => 'api/ldc/mepvolailles', + 'methods' => [ + 'GET' + ] ] ] ]; diff --git a/database/migrations/2022_09_30_154855_create_cafel_poultry_mise_en_places_table.php b/database/migrations/2022_09_30_154855_create_cafel_poultry_mise_en_places_table.php new file mode 100644 index 0000000..cf1c1d8 --- /dev/null +++ b/database/migrations/2022_09_30_154855_create_cafel_poultry_mise_en_places_table.php @@ -0,0 +1,32 @@ +string('batch_code', 10)->unique(); + $table->string('inuav_code', 100); + $table->date('transfert_date'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('cafel_poultry_mise_en_places'); + } +} diff --git a/package-lock.json b/package-lock.json index 169011d..61c547f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,10 +4,6 @@ "requires": true, "packages": { "": { - "name": "bogt", - "dependencies": { - "sweetalert2": "^11.4.20" - }, "devDependencies": { "@lighting-beetle/glider-js": "^1.8.2", "@popperjs/core": "^2.11.5", @@ -24,6 +20,7 @@ "resolve-url-loader": "^5.0.0", "sass": "1.32.13", "sass-loader": "^8.0.2", + "sweetalert2": "^11.4.35", "vue": "^2.6.14", "vue-template-compiler": "^2.6.14" } @@ -8454,9 +8451,10 @@ } }, "node_modules/sweetalert2": { - "version": "11.4.20", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.4.20.tgz", - "integrity": "sha512-3LiBFa5yRmTcqM0vGcFmo0EnhmaMSJfzhFpvZoXK6BOY94HIcIUbwhhW+NY5oXOpz5CT21qFAu0fKCUkOc/Pew==", + "version": "11.4.35", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.4.35.tgz", + "integrity": "sha512-nifH7Hd8oSIO8qf6GHhob6xZK2KoX7+EalTFm3nHshdQ38TY/r0m/QiuJCDL0cTGbRhzMWL7WYBSA3fjnh+F1g==", + "dev": true, "funding": { "type": "individual", "url": "https://sweetalert2.github.io/#donations" @@ -15709,9 +15707,10 @@ } }, "sweetalert2": { - "version": "11.4.20", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.4.20.tgz", - "integrity": "sha512-3LiBFa5yRmTcqM0vGcFmo0EnhmaMSJfzhFpvZoXK6BOY94HIcIUbwhhW+NY5oXOpz5CT21qFAu0fKCUkOc/Pew==" + "version": "11.4.35", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.4.35.tgz", + "integrity": "sha512-nifH7Hd8oSIO8qf6GHhob6xZK2KoX7+EalTFm3nHshdQ38TY/r0m/QiuJCDL0cTGbRhzMWL7WYBSA3fjnh+F1g==", + "dev": true }, "tapable": { "version": "2.2.1", diff --git a/package.json b/package.json index 7eb8855..58324ba 100644 --- a/package.json +++ b/package.json @@ -25,10 +25,8 @@ "resolve-url-loader": "^5.0.0", "sass": "1.32.13", "sass-loader": "^8.0.2", + "sweetalert2": "^11.4.35", "vue": "^2.6.14", "vue-template-compiler": "^2.6.14" - }, - "dependencies": { - "sweetalert2": "^11.4.20" } } diff --git a/resources/documents/cafel/APIs Cafel pour récupération des infos éleveurs œufs et volailles de chair - 2.docx b/resources/documents/cafel/APIs Cafel pour récupération des infos éleveurs œufs et volailles de chair - 2.docx new file mode 100644 index 0000000..1b2a081 Binary files /dev/null and b/resources/documents/cafel/APIs Cafel pour récupération des infos éleveurs œufs et volailles de chair - 2.docx differ diff --git a/resources/js/alert.js b/resources/js/alert.js index d10751b..b4a9baf 100644 --- a/resources/js/alert.js +++ b/resources/js/alert.js @@ -1,5 +1,5 @@ // ES6 Modules or TypeScript -import Swal from 'sweetalert2' +import Swal from 'sweetalert2/dist/sweetalert2.js' document.addEventListener('DOMContentLoaded', () => { if (document.getElementsByClassName('oldEgg').length) { diff --git a/resources/js/front.js b/resources/js/front.js index 1e70a3a..ee9c896 100644 --- a/resources/js/front.js +++ b/resources/js/front.js @@ -7,8 +7,8 @@ require('./alert'); import IMask from 'imask' document.addEventListener('DOMContentLoaded', () => { - let maskInputs = document.getElementsByClassName('inputMask') - for (let maskInput of maskInputs) { + const maskInputs = document.getElementsByClassName('inputMask') + for (const maskInput of maskInputs) { if (maskInput.dataset.mask) { maskInput.imask = IMask(maskInput, { mask: maskInput.dataset.mask.indexOf('|') !== -1 ? diff --git a/resources/js/pages/poultry-show.js b/resources/js/pages/poultry-show.js index 04d4085..63d500c 100644 --- a/resources/js/pages/poultry-show.js +++ b/resources/js/pages/poultry-show.js @@ -1,12 +1,16 @@ import Glider from '@lighting-beetle/glider-js' +import axios from 'axios' document.addEventListener('DOMContentLoaded', () => { - let labelSlider = document.querySelector('.container.poultryShow .glider-container.labels > .glider'), + const labelSlider = document.querySelector('.container.poultryShow .glider-container.labels > .glider'), linksSlider = document.querySelector('.container.poultryShow .glider-container.links > .glider'), orderNum = document.getElementById('order_num'), orderVal = document.getElementById('order_val'), orderInvalid = document.getElementById('order_num_invalid'), - orderExp = document.getElementById('order_exp') + orderExp = document.getElementById('order_exp'), + distriSign = document.getElementById('distriSign'), + distriPicture = document.getElementById('distriPicture'), + distriDate = document.getElementById('distriDate'); if (labelSlider) { new Glider(labelSlider, { slidesToShow: 1, @@ -43,7 +47,8 @@ document.addEventListener('DOMContentLoaded', () => { ] }) } - if (orderNum && orderVal && orderExp && orderInvalid) { + // * Distribution + if (orderNum && orderVal && orderExp && orderInvalid && distriPicture && distriDate) { orderVal.addEventListener('click', (e) => { e.preventDefault() @@ -57,17 +62,32 @@ document.addEventListener('DOMContentLoaded', () => { behavior: "smooth" }) } - if (orderNum.imask.value.slice(0, -5) !== orderNum.dataset.orderNumber) { - orderInvalid.classList.add('d-block') - orderExp.classList.add('d-none') - orderNum.imask.masked.reset() - scrollToIdWithOffset('order_num_invalid', 50) - return; - } - orderInvalid.classList.remove('d-block') - orderExp.classList.remove('d-none') - orderNum.imask.masked.reset() - scrollToIdWithOffset(orderExp.id, 50) + + axios.get( + `/tracabilite/volaille/distribution?codelot=${orderNum.dataset.codeLot}&ordernum=${orderNum.imask.value.slice(0, -5)}` + ).then((response) => { + const date = new Date(response.data.exp_date); + distriDate.textContent = new Intl.DateTimeFormat('fr-FR', { dateStyle: 'full'}).format(date); + distriSign.querySelector('span').textContent = response.data.sign; + if (response.data.picture) { + distriPicture.querySelector('img').classList.remove('d-none'); + distriPicture.querySelector('img').src = `/assets/images/signs/${response.data.picture}`; + } else { + distriPicture.querySelector('img').classList.add('d-none'); + } + + orderInvalid.classList.remove('d-block'); + orderExp.classList.remove('d-none'); + orderNum.imask.masked.reset(); + scrollToIdWithOffset(orderExp.id, 50); + }).catch((e) => { + orderInvalid.classList.add('d-block'); + orderExp.classList.add('d-none'); + orderNum.imask.masked.reset(); + scrollToIdWithOffset('order_num_invalid', 50); + }); }) + } else { + throw new Error('Missing Dom elements'); } }) diff --git a/resources/sass/back.scss b/resources/sass/back.scss index 59e4806..e7b80e0 100644 --- a/resources/sass/back.scss +++ b/resources/sass/back.scss @@ -45,3 +45,8 @@ body { } } + +.egg-alert { + margin-top:10px; + margin-bottom:10px; +} diff --git a/resources/sass/front/_alert.scss b/resources/sass/front/_alert.scss index 663b01b..8f30129 100644 --- a/resources/sass/front/_alert.scss +++ b/resources/sass/front/_alert.scss @@ -1,3 +1,5 @@ +@import 'sweetalert2/dist/sweetalert2.css'; + .swal2-confirm { border-radius: 0 !important; box-shadow: 0px 5px 5px #00000069 !important; @@ -8,4 +10,4 @@ text-decoration: none; font-family: MyriadProBold; } -} \ No newline at end of file +} diff --git a/resources/views/back/modules/flashMessage.blade.php b/resources/views/back/modules/flashMessage.blade.php index 4aca5db..3570bbc 100644 --- a/resources/views/back/modules/flashMessage.blade.php +++ b/resources/views/back/modules/flashMessage.blade.php @@ -1,15 +1,3 @@ - - - - - - - - - - - - @if ($message = Session::get('success')) -
+
Élevage

Nous n'avons pu retrouver l'éleveur concerné par votre boite.

diff --git a/resources/views/front/frame.blade.php b/resources/views/front/frame.blade.php index 90bf67a..3bbf7ef 100644 --- a/resources/views/front/frame.blade.php +++ b/resources/views/front/frame.blade.php @@ -5,9 +5,21 @@ {{ __('Autorisation nécessaire') }} + -

+

{{__("Vous devez autoriser les cookies '".request()->type."' pour visualiser cet élément") }}

diff --git a/resources/views/front/modules/flashMessage.blade.php b/resources/views/front/modules/flashMessage.blade.php index b3cfdb3..2d439ad 100644 --- a/resources/views/front/modules/flashMessage.blade.php +++ b/resources/views/front/modules/flashMessage.blade.php @@ -1,15 +1,3 @@ - - - - - - - - - - - - @if ($message = Session::get('success'))
diff --git a/resources/views/front/poultry/parts/breeding.blade.php b/resources/views/front/poultry/parts/breeding.blade.php index 5b1b2f6..5cb3b43 100644 --- a/resources/views/front/poultry/parts/breeding.blade.php +++ b/resources/views/front/poultry/parts/breeding.blade.php @@ -15,7 +15,7 @@
{{ __('Les poussins sont arrivés dans le poulailler le') }} : - {{ now()->formatLocalized('%A') }} {{ now()->format('d/m/Y') }} + {{ $mep->transfert_date->formatLocalized('%A') }} {{ $mep->transfert_date->format('d/m/Y') }}
diff --git a/resources/views/front/poultry/parts/distribution.blade.php b/resources/views/front/poultry/parts/distribution.blade.php index c57857f..fb21f43 100644 --- a/resources/views/front/poultry/parts/distribution.blade.php +++ b/resources/views/front/poultry/parts/distribution.blade.php @@ -21,7 +21,12 @@
- + @include('back.modules.input-error', ['inputName' => 'order_num'])
{{ __('Numéro de commande invalide') }}
@@ -51,16 +56,14 @@ {{ __('Date') }}
- {{ $date }} + {{ $date }}
- @if($distributionPicture) -
- {{ $sign }} +
+
-
- {{ $sign }} +
+
- @endif
diff --git a/resources/views/front/poultry/show.blade.php b/resources/views/front/poultry/show.blade.php index a7aad24..2202e02 100644 --- a/resources/views/front/poultry/show.blade.php +++ b/resources/views/front/poultry/show.blade.php @@ -117,7 +117,8 @@ @if($traceaPoultry->breeder)
@include('front.poultry.parts.breeding', [ - 'breeder' => $traceaPoultry->breeder + 'breeder' => $traceaPoultry->breeder, + 'mep' => $traceaPoultry->mep ])
@endif @@ -152,7 +153,6 @@ nous avions dit que nous fonctionnions comme cela lors d'une réunion en décemb
@include('front.poultry.parts.distribution', [ - 'distributionPicture' => $distributionPicture, 'sign' => $traceaPoultry->sign, 'date' => sprintf('%s %s', $traceaPoultry->exp_date->formatLocalized('%A'), $traceaPoultry->exp_date->format('d/m/Y')) ]) diff --git a/resources/views/front/poultry/unavailable.blade.php b/resources/views/front/poultry/unavailable.blade.php new file mode 100644 index 0000000..606b60a --- /dev/null +++ b/resources/views/front/poultry/unavailable.blade.php @@ -0,0 +1,29 @@ +@extends('layouts.front') +@section('title', __('Traceabilité des Volailles de Loué')) +@section('description', __('Recherchez la treaceabilité de votre produit Loué ainsi que sa provenance.')) + +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+
+ {{ __('Erreur') }} +
+
+ {{ __('Une erreur est survenue') }} +
+
+ @include('front.modules.flashMessage') +
+
+ Élevage +
+
+
+
+ {{ __('Nous sommes dans l’incapacité de vous afficher la traçabilité de votre poulet. Nous nous excusons pour ce désagrément.') }} +
+
+
+@endsection diff --git a/routes/web-fo.php b/routes/web-fo.php index 0b848f5..3e6b718 100644 --- a/routes/web-fo.php +++ b/routes/web-fo.php @@ -22,6 +22,8 @@ Route::name('poultry.')->group(function () { Route::view('/', 'front.poultry.search')->name('search'); Route::post('/', [TraceaPoultryController::class, 'searchSubmit'])->name('searchSubmit'); Route::get('tracabilite/volaille', [TraceaPoultryController::class, 'show'])->name('show'); + Route::get('tracabilite/volaille/distribution', [TraceaPoultryController::class, 'getDistribution']) + ->name('distribution'); Route::get('tracabilite/volaille/info', [InfoController::class, 'poultry'])->name('infos'); Route::get( 'tracabilite/volaille/info/des-poulets-libres-par-nature',