Compare commits

..

No commits in common. "master" and "handleGuzzleConnectionErrorForCafel" have entirely different histories.

42 changed files with 4952 additions and 6099 deletions

View file

@ -3,7 +3,6 @@ APP_ENV=local
APP_KEY= APP_KEY=
APP_DEBUG=true APP_DEBUG=true
APP_URL=http://localhost APP_URL=http://localhost
APP_DOMAIN=
LOG_CHANNEL=stack LOG_CHANNEL=stack
@ -38,6 +37,7 @@ CAFEL_PASSWORD=
MAIL_INVALID_CAFEL_DATA=equipe.web@ldc.fr MAIL_INVALID_CAFEL_DATA=equipe.web@ldc.fr
MAIL_INVALID_CAFEL_DATA_IMAGE=equipe.web@ldc.fr MAIL_INVALID_CAFEL_DATA_IMAGE=equipe.web@ldc.fr
MAIL_INVALID_XML=equipe.web@ldc.fr MAIL_INVALID_XML=equipe.web@ldc.fr
MAIL_LIST_SERVICEWEB=equipe.web@ldc.fr
## LDC WEB STATUS CHECKER ## LDC WEB STATUS CHECKER
LDC_STATUS_CHECKER_API_KEY="MY_KEY" LDC_STATUS_CHECKER_API_KEY="MY_KEY"
@ -45,9 +45,6 @@ LDC_STATUS_CHECKER_UUID="UUID_PROJECT"
## LDC WEB ADMIN SECURE ## LDC WEB ADMIN SECURE
LDC_WEB_API_KEY="MY_KEY" LDC_WEB_API_KEY="MY_KEY"
## GOOGLE ## GOOGLE
ANALYTICS_GOOGLE_ID= ANALYTICS_GOOGLE_ID=
# TERRE D'ACTION MODAL (YYYY-MM-DD)
TERRE_ACTION_START_DATE=
TERRE_ACTION_END_DATE=

1
.gitignore vendored
View file

@ -18,4 +18,3 @@ Homestead.json
Homestead.yaml Homestead.yaml
npm-debug.log npm-debug.log
yarn-error.log yarn-error.log
auth.json

View file

@ -1,12 +1,46 @@
include: image: $CI_REGISTRY/service-web-lab/ldc-web-images-docker/ldcweb-qa:php7.3-1.0
- project: 'ldc-web/shared-ci'
ref: 'main'
file: 'lint/lint7.3.yml'
- project: 'ldc-web/shared-ci'
ref: 'main'
file: 'security/security7.3.yml'
stages: stages:
- lint - Security
- security - CodingStandards
composer-security:
stage: Security
script:
- local-php-security-checker --format=json --path=./composer.lock > composer-security-checker-report.json
artifacts:
when: on_failure
expose_as: 'composer-security-checker'
paths:
- composer-security-checker-report.json
allow_failure: true
npm-security:
stage: Security
script:
- audit-ci -p npm -o json > npm-security-checker-report.json
artifacts:
when: on_failure
expose_as: 'npm-security-checker'
paths:
- npm-security-checker-report.json
allow_failure: true
phpcs:
stage: CodingStandards
before_script:
- composer config gitlab-token.gitlab.com $CI_DEPLOY_USER $CI_DEPLOY_PASSWORD
- composer install
cache:
paths:
- vendor/
script:
- vendor/bin/phpcs --report=junit --report-file=phpcs-report.xml
artifacts:
when: on_failure
expose_as: 'phpcs'
paths:
- phpcs-report.xml
reports:
junit: phpcs-report.xml
allow_failure: false

View file

@ -1,11 +0,0 @@
## Comportement constaté
## Comportement attendu
## Solution envisagée
## Étapes pour la reproduction du bug
*

View file

@ -1,7 +0,0 @@
## Présentation du besoin
## Implémentation
## Maquettes, documentations...

View file

@ -30,11 +30,11 @@ class Kernel extends ConsoleKernel
protected function schedule(Schedule $schedule) protected function schedule(Schedule $schedule)
{ {
// * Jobs cafel sur queue cafel // * Jobs cafel sur queue cafel
$schedule->job(CafelFoodJob::class, 'cafel')->onOneServer()->dailyAt('22h30'); $schedule->job(CafelFoodJob::class, 'cafel')->onOneServer()->everyThreeHours();
$schedule->job(CafelBeaVolJob::class, 'cafel')->onOneServer()->dailyAt('22h45'); $schedule->job(CafelBeaVolJob::class, 'cafel')->onOneServer()->everyThreeHours();
$schedule->job(CafelMepEggJob::class, 'cafel')->onOneServer()->dailyAt('23h00'); $schedule->job(CafelMepEggJob::class, 'cafel')->onOneServer()->everyThreeHours();
$schedule->job(CafelEggBreederJob::class, 'cafel')->onOneServer()->dailyAt('23h15'); $schedule->job(CafelEggBreederJob::class, 'cafel')->onOneServer()->everyThreeHours();
$schedule->job(CafelPoultryBreederJob::class, 'cafel')->onOneServer()->dailyAt('23h30'); $schedule->job(CafelPoultryBreederJob::class, 'cafel')->onOneServer()->everyThreeHours();
$schedule->job(XmlFluxEggJob::class, 'tracea')->onOneServer()->dailyAt('02:00'); $schedule->job(XmlFluxEggJob::class, 'tracea')->onOneServer()->dailyAt('02:00');
$schedule->job(XmlFluxPoultryJob::class, 'tracea')->onOneServer()->dailyAt('22:00'); $schedule->job(XmlFluxPoultryJob::class, 'tracea')->onOneServer()->dailyAt('22:00');

View file

@ -4,8 +4,8 @@ namespace App\Exceptions;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Mail;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Throwable;
use Sentry\Laravel\Integration; use Kwaadpepper\ExceptionHandler\Exceptions\ExceptionHandler;
class Handler extends ExceptionHandler class Handler extends ExceptionHandler
{ {
@ -27,19 +27,18 @@ class Handler extends ExceptionHandler
]; ];
/** /**
* Register the exception handling callbacks for the application. * Report or log an exception.
* *
* @param \Throwable $exception
* @return void * @return void
*/ */
public function register() public function report(Throwable $exception)
{ {
$this->reportable(function (\Throwable $e) { if ($exception instanceof CafelApiImageFetchException) {
if ($e instanceof CafelApiImageFetchException) { $this->reportCafelApiImageErrorException($exception);
$this->reportCafelApiImageErrorException($e); return;
return; }
} parent::report($exception);
Integration::captureUnhandledException($e);
});
} }
/** /**

View file

@ -49,7 +49,7 @@ class EggController extends Controller
$mobas = TraceaEgg::where('box_code', $id)->orderBy('box_code', 'DESC')->first(); $mobas = TraceaEgg::where('box_code', $id)->orderBy('box_code', 'DESC')->first();
if (!$mobas) { if (!$mobas) {
return redirect()->route('egg.search'); return redirect('/search');
} }
$edes = $mobas->code_edes; $edes = $mobas->code_edes;

View file

@ -14,7 +14,6 @@ class TrustHosts extends Middleware
public function hosts() public function hosts()
{ {
return [ return [
\config('app.egg_domain'),
$this->allSubdomainsOfApplicationUrl(), $this->allSubdomainsOfApplicationUrl(),
]; ];
} }

View file

@ -23,7 +23,7 @@ class RemoveOldXmlEntries
} }
try { try {
$q = TraceaEgg::query(); $q = TraceaEgg::query();
$q->where('dcr', '<=', now()->subMonths(config('tracea.keepEggMonths', 12))); $q->where('dcr', '<=', now()->subMonths(config('tracea.keepEggMonths', 12)))->destroy();
$q->delete(); $q->delete();
} catch (\Exception $e) { } catch (\Exception $e) {
report($e); report($e);

View file

@ -228,25 +228,15 @@ abstract class CafelClientModel implements \JsonSerializable
// * Filter Keys using intersection // * Filter Keys using intersection
\extract(\array_intersect_key($response->body, ['Ext' => '', 'Name' => '', 'Data' => ''])); \extract(\array_intersect_key($response->body, ['Ext' => '', 'Name' => '', 'Data' => '']));
// * Create temp file and get its absolute path
if (!($tempFile = tmpfile())) {
new \RuntimeException('Could not create temp file');
}
$filePath = ToolboxHelper::storeImage( return ToolboxHelper::storeImage(
$folder, $folder,
FileHelper::fromBase64( FileHelper::fromBase64(
$tempFile,
Str::lower($Name), Str::lower($Name),
Str::lower($Ext), Str::lower($Ext),
$Data $Data
), ),
false false
); );
// * Closing the file will cause to remove it from temp dir!
fclose($tempFile);
return $filePath;
} }
} }

View file

@ -1,190 +0,0 @@
<?php
namespace App\Lib;
class ExceptionsHelper
{
/**
* Handle sentry event
*
* @param \Sentry\Event $event
* @return null|\Sentry\Event
*/
public static function sentryEventHandler(\Sentry\Event $event): ?\Sentry\Event
{
// Remove unwanted reports.
$event->setModules([]);
$event->setOsContext(null);
/** @var \Sentry\ExceptionDataBag[] */
$exceptionBag = [];
foreach ($event->getExceptions() as $exceptionDataBag) {
$exceptionBag[] = self::getAnonymizedSentryException($exceptionDataBag);
}
$event->setExceptions($exceptionBag);
return $event;
}
/**
* Anonimize Sentry Exception bag
*
* @param \Sentry\ExceptionDataBag $exceptionDataBag
* @return \Sentry\ExceptionDataBag
*/
private static function getAnonymizedSentryException(
\Sentry\ExceptionDataBag $exceptionDataBag
): \Sentry\ExceptionDataBag {
$exceptionDataBag->setValue(self::getAnonymizedMessage($exceptionDataBag->getValue()));
if ($stackTrace = $exceptionDataBag->getStacktrace()) {
$exceptionDataBag->setStacktrace(self::getAnonymizedSentryStackTrace($stackTrace));
}
return $exceptionDataBag;
}
/**
* Anonymise sentry stacktrace
*
* @param \Sentry\Stacktrace $stackTrace
* @return \Sentry\Stacktrace
*/
private static function getAnonymizedSentryStackTrace(\Sentry\Stacktrace $stackTrace): \Sentry\Stacktrace
{
/** @var \Sentry\Frame[] */
$frames = \array_reverse($stackTrace->getFrames(), true);
$i = \count($frames) - 1;
// * Remove all but keep first (index.php).
while ($i-- > 0) {
$stackTrace->removeFrame(count($stackTrace->getFrames()) - 1);
}
foreach ($frames as $index => $frame) {
$frame->setPostContext([]);
$frame->setPreContext([]);
$frame->setContextLine('');
$frame->setVars(self::getAnonymizedSentryParams($frame->getVars()));
$stackTrace->addFrame($frame);
if ($index === 0) {
$stackTrace->removeFrame(count($stackTrace->getFrames()) - 1);
}
}
return $stackTrace;
}
/**
* Get anonymized sentry params
*
* @param mixed[] $params
* @return string[]
*/
private static function getAnonymizedSentryParams(array $params): array
{
foreach ($params as &$param) {
$type = \strtolower(\gettype($param));
if (\is_string($param)) {
$type = \explode(' ', \trim($param))[0] ?? null;
}
switch ($type) {
case 'Lambda':
case 'Object':
continue 2;
case 'array':
$param = sprintf('Array(%d)', \count($param));
continue 2;
default:
if (\is_numeric($param)) {
$param = \ucfirst($type);
continue 2;
}
if (\is_string($param)) {
$param = sprintf('String(%d)', \strlen($param));
continue 2;
}
} //end switch
} //end foreach
return $params;
}
/**
* Anonymize at least Sql queries
*
* @param string $message
* @return string
*/
public static function getAnonymizedMessage(string $message): string
{
$message = \preg_replace('/^(.*)( \(SQL:.*\))$/', '$1', $message) ?? $message;
if ($sqlPos = \strpos($message, 'to use near')) {
$message = \mb_strcut($message, 0, $sqlPos);
}
return $message;
}
/**
* Anonymize stack trace
*
* @param \Throwable $e
* @return string
*/
public static function getAnonymizedStackTrace(\Throwable $e): string
{
$projectPath = \realpath(\sprintf('%s/../', \app_path()));
$traceStack = $e->getTrace();
$traceStr = '';
$maxStackStage = 0;
foreach ($traceStack as $stackStage => $stack) {
$maxStackStage = $stackStage;
$traceStr .= \sprintf(
'#%s %s(%d): ',
$stackStage,
str_replace($projectPath, '', $stack['file'] ?? ''),
$stack['line'] ?? ''
);
if (isset($stack['class'])) {
$traceStr .= "{$stack['class']}->{$stack['function']}(";
if (isset($stack['args'])) {
$traceStr .= self::handleArgs($stack);
}
$traceStr .= ")\n";
} elseif (isset($stack['function'])) {
$traceStr .= "{$stack['function']}(";
if (isset($stack['args'])) {
$traceStr .= self::handleArgs($stack);
}
$traceStr .= ")\n";
}
} //end foreach
$maxStackStage++;
$traceStr .= "#$maxStackStage {main}";
return $traceStr;
}
/**
* Handle Args
*
* @param array $stack
* @return string
*/
public static function handleArgs(array $stack): string
{
$traceArgs = '';
$argsCount = count($stack['args']);
for ($i = 0; $i < $argsCount; $i++) {
$type = \gettype($stack['args'][$i]);
switch ($type) {
case 'object':
$traceArgs .= sprintf('Object(%s)', \get_class($stack['args'][$i]));
break;
case 'array':
$traceArgs .= sprintf('Array(%d)', \count($stack['args'][$i]));
break;
case 'string':
$traceArgs .= sprintf('String(%d)', \strlen($stack['args'][$i]));
break;
default:
$traceArgs .= \gettype($stack['args'][$i]);
}
$traceArgs .= ($i !== ($argsCount - 1) ? ',' : '');
}
return $traceArgs;
}
}

View file

@ -51,18 +51,21 @@ class FileHelper
} }
/** /**
* Generate from base64 blob * Generate from blob
* *
* @param resource $tempFile A temp file where to store data. * @param string $fileName
* @param string $fileName The target filename. * @param string $extension
* @param string $extension The file extension to use. * @param string $base64String
* @param string $base64String The base64 encode picture.
* @return SplFileInfo * @return SplFileInfo
* @throws \ErrorException If writing to temp file failed. * @throws \ErrorException If writing to temp file failed.
* @throws \App\Exceptions\CafelApiImageFetchException If invalid image was given or ext could not be confirmed. * @throws \App\Exceptions\CafelApiImageFetchException If invalid image was given or ext could not be confirmed.
*/ */
public static function fromBase64($tempFile, string $fileName, string $extension, string $base64String): SplFileInfo public static function fromBase64(string $fileName, string $extension, string $base64String): SplFileInfo
{ {
// * Create temp file and get its absolute path
if (!($tempFile = tmpfile())) {
new \ErrorException('Could not create temp file');
}
$tempFilePath = stream_get_meta_data($tempFile)['uri']; $tempFilePath = stream_get_meta_data($tempFile)['uri'];
if (!($blob = \base64_decode($base64String, true))) { if (!($blob = \base64_decode($base64String, true))) {
@ -90,6 +93,12 @@ class FileHelper
throw new \ErrorException('Could not write on temp file'); throw new \ErrorException('Could not write on temp file');
} }
// Close this file after response is sent.
// Closing the file will cause to remove it from temp director!
app()->terminating(function () use ($tempFile) {
fclose($tempFile);
});
return new SplFileInfo(\storage_path("tmp/$filePath.$extension")); return new SplFileInfo(\storage_path("tmp/$filePath.$extension"));
} }
} }

View file

@ -99,8 +99,8 @@ class CafelEggBreeder extends Model
{ {
// * EVENT CLOSURES. // * EVENT CLOSURES.
static::creating(function (self $model) { static::creating(function (self $model) {
self::areInuavCodesUniques($model); return self::areInuavCodesUniques($model);
self::isEdeCodeUnique($model); return self::isEdeCodeUnique($model);
}); });
static::updating(function (self $model) { static::updating(function (self $model) {
if ($model->getRawOriginal('path_picture_1') !== $model->path_picture_1) { if ($model->getRawOriginal('path_picture_1') !== $model->path_picture_1) {
@ -109,8 +109,8 @@ class CafelEggBreeder extends Model
if ($model->getRawOriginal('path_picture_2') !== $model->path_picture_2) { if ($model->getRawOriginal('path_picture_2') !== $model->path_picture_2) {
Storage::delete(\public_path($model->getRawOriginal('path_picture_2'))); Storage::delete(\public_path($model->getRawOriginal('path_picture_2')));
} }
self::areInuavCodesUniques($model); return self::areInuavCodesUniques($model);
self::isEdeCodeUnique($model); return self::isEdeCodeUnique($model);
}); });
static::deleting(function (self $model) { static::deleting(function (self $model) {
if ($model->getRawOriginal('path_picture_1')) { if ($model->getRawOriginal('path_picture_1')) {

View file

@ -1,26 +0,0 @@
<?php
namespace App\Providers;
use Carbon\Carbon;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot(): void
{
if (!app()->runningInConsole()) {
View::share('isDisplayedTAModal', (function () {
$now = now();
return $now->greaterThanOrEqualTo(new Carbon(config('modal.terreActionStartDate'))) &&
$now->lessThanOrEqualTo(new Carbon(config('modal.terreActionEndDate')));
})());
}
}
}

5
auth.json Normal file
View file

@ -0,0 +1,5 @@
{
"gitlab-token": {
"gitlab.com": "glpat-gbNVMUd6T2kaB5eii7TZ"
}
}

View file

@ -17,16 +17,16 @@
"fideloper/proxy": "^4.0", "fideloper/proxy": "^4.0",
"guzzlehttp/guzzle": "^7.4", "guzzlehttp/guzzle": "^7.4",
"kwaadpepper/enum": "^2.1", "kwaadpepper/enum": "^2.1",
"kwaadpepper/exception-handler": "^0.0.6",
"kwaadpepper/refresh-sitemap": "^1.0", "kwaadpepper/refresh-sitemap": "^1.0",
"laravel/framework": "^8.0", "laravel/framework": "^8.0",
"laravel/tinker": "^2.0", "laravel/tinker": "^2.0",
"laravel/ui": "^3.0", "laravel/ui": "^3.0",
"laravelcollective/html": "^6.0", "laravelcollective/html": "^6.0",
"ldc/web-admin-secure-laravel": "^1.0", "ldc/web-admin-secure-laravel": "1.0.1",
"ldc/web-status-checker-laravel": "^1.0", "ldc/web-status-checker-laravel": "^1.0",
"mews/purifier": "^3.3", "mews/purifier": "^3.3",
"nesbot/carbon": "^2.29", "nesbot/carbon": "^2.29",
"sentry/sentry-laravel": "^3.1",
"spatie/laravel-mix-preload": "^1.3" "spatie/laravel-mix-preload": "^1.3"
}, },
"require-dev": { "require-dev": {
@ -45,10 +45,7 @@
"sort-packages": true, "sort-packages": true,
"allow-plugins": { "allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true "dealerdirect/phpcodesniffer-composer-installer": true
}, }
"gitlab-domains": [
"lab.s-web.fr"
]
}, },
"extra": { "extra": {
"laravel": { "laravel": {
@ -82,9 +79,9 @@
] ]
}, },
"repositories": { "repositories": {
"lab.s-web.fr": { "gitlab.com/16669037": {
"type": "composer", "type": "composer",
"url": "https://lab.s-web.fr/api/v4/group/23/-/packages/composer/packages.json" "url": "https://gitlab.com/api/v4/group/16669037/-/packages/composer/packages.json"
} }
} }
} }

2185
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -53,8 +53,6 @@ return [
*/ */
'url' => env('APP_URL', 'http://localhost'), 'url' => env('APP_URL', 'http://localhost'),
'domain' => env('APP_DOMAIN', 'tracabilite.loue.fr'),
'egg_domain' => env('APP_EGG_DOMAIN', 'bo.gt'),
'asset_url' => env('ASSET_URL', null), 'asset_url' => env('ASSET_URL', null),
@ -177,7 +175,6 @@ return [
App\Providers\AuthServiceProvider::class, App\Providers\AuthServiceProvider::class,
App\Providers\EventServiceProvider::class, App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class, App\Providers\RouteServiceProvider::class,
App\Providers\ViewServiceProvider::class,
], ],
@ -237,4 +234,7 @@ return [
'CafelPoultryBreeder' => \App\Models\CafelPoultryBreeder::class, 'CafelPoultryBreeder' => \App\Models\CafelPoultryBreeder::class,
], ],
'project_uuid' => env('PROJECT_UUID'),
]; ];

View file

@ -0,0 +1,15 @@
<?php
return [
/**
* Send mail when app debug is turn off
* so you can be warned if an unhandled exception occurs
*/
'enableMaiLog' => !config('app.debug'),
/**
* Put a developper secured mailbox in here
* so you can receive email if things go mad
*/
'contactsList' => explode(',', env('MAIL_LIST_SERVICEWEB', 'equipe.web@ldc.fr')),
];

View file

@ -1,6 +0,0 @@
<?php
return [
'terreActionStartDate' => env('TERRE_ACTION_START_DATE'),
'terreActionEndDate' => env('TERRE_ACTION_END_DATE')
];

View file

@ -1,62 +0,0 @@
<?php
return [
'dsn' => env('SENTRY_LARAVEL_DSN', env('SENTRY_DSN')),
// The release version of your application
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')).
'release' => env('SENTRY_RELEASE'),
// When left empty or `null` the Laravel environment will be used.
'environment' => env('SENTRY_ENVIRONMENT'),
'breadcrumbs' => [
// Capture Laravel logs in breadcrumbs.
'logs' => true,
// Capture SQL queries in breadcrumbs.
'sql_queries' => true,
// Capture bindings on SQL queries logged in breadcrumbs.
'sql_bindings' => true,
// Capture queue job information in breadcrumbs.
'queue_info' => true,
// Capture command information in breadcrumbs.
'command_info' => true,
],
'tracing' => [
// Trace queue jobs as their own transactions.
'queue_job_transactions' => env('SENTRY_TRACE_QUEUE_ENABLED', false),
// Capture queue jobs as spans when executed on the sync driver.
'queue_jobs' => true,
// Capture SQL queries as spans.
'sql_queries' => true,
// Try to find out where the SQL query originated from and add it to the query spans.
'sql_origin' => true,
// Capture views as spans.
'views' => true,
// Indicates if the tracing integrations supplied by Sentry should be loaded.
'default_integrations' => true,
// Indicates that requests without a matching route should be traced.
'missing_routes' => false,
],
// @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#send-default-pii
'send_default_pii' => env('SENTRY_SEND_DEFAULT_PII', false),
// @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#traces-sample-rate
'traces_sample_rate' => env('SENTRY_TRACES_SAMPLE_RATE') === null ? null : (float)env('SENTRY_TRACES_SAMPLE_RATE'),
'before_send' => [\App\Lib\ExceptionsHelper::class, 'sentryEventHandler'],
];

File diff suppressed because it is too large Load diff

5144
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -10,7 +10,7 @@ document.addEventListener('DOMContentLoaded', () => {
imageHeight: 200, imageHeight: 200,
imageAlt: 'Logo Loué terre d\'action', imageAlt: 'Logo Loué terre d\'action',
background: '#4b8764', background: '#4b8764',
confirmButtonText: '<a href="https://action-reboisement.loue.fr" target="_blank">Je valide mon achat</a>', confirmButtonText: '<a href="https://www.loue.fr/article/Des-arbres-et-des-haies-pour-les-volailles-fermières-de-Loué/a3.aspx" target="_blank">Je valide mon achat</a>',
confirmButtonColor: '#005621', confirmButtonColor: '#005621',
showCloseButton: true, showCloseButton: true,
}) })

View file

@ -1,19 +1,19 @@
// 1. Include new custom variables // Variables
@import 'variables'; @import 'variables';
// 2. Include functions first (so you can manipulate colors, SVGs, calc, etc) // 1. Include functions first (so you can manipulate colors, SVGs, calc, etc)
@import "~bootstrap/scss/functions"; @import '~bootstrap/scss/functions';
// 2. Include any default variable overrides here
// 3. Include remainder of required Bootstrap stylesheets // 3. Include remainder of required Bootstrap stylesheets
@import "~bootstrap/scss/variables"; @import '~bootstrap/scss/variables';
@import '~bootstrap/scss/mixins';
// 4. Include remainder of required parts
@import "~bootstrap/scss/maps";
@import "~bootstrap/scss/mixins";
@import "~bootstrap/scss/root";
// 5. Optionally include any other parts as needed // 4. Include any optional Bootstrap components as you like
@import '~bootstrap/scss/root';
@import '~bootstrap/scss/reboot'; @import '~bootstrap/scss/reboot';
@import '~bootstrap/scss/type'; @import '~bootstrap/scss/type';
@import '~bootstrap/scss/images'; @import '~bootstrap/scss/images';
@ -27,9 +27,6 @@
@import '~bootstrap/scss/alert'; @import '~bootstrap/scss/alert';
@import '~bootstrap/scss/close'; @import '~bootstrap/scss/close';
// 6. Optionally include utilities API last to generate classes based on the Sass map in `_utilities.scss`
@import "~bootstrap/scss/utilities/api";
// Fix for bootstrap // Fix for bootstrap
.text-break { .text-break {
overflow-wrap: break-word !important; overflow-wrap: break-word !important;

View file

@ -5,33 +5,31 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page yellow"> <div class="sub-page yellow">
<header> <header>
<a href="{{ route('egg.FrontPage', ['id' => request()->id]) }}"> <a href="{{route('egg.FrontPage', ['id' => request()->id])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="details-alimentation"> <div class="details-alimentation">
<p class="title">De quoi est composée l'alimentation des poules ?</p> <p class="title">De quoi est composée l'alimentation des poules ?</p>
<div class="box"> <div class="box">
@if (Session::get('subColor') == 'blue') @if (Session::get('subColor') == 'blue')
<img class="type active" src="{{ asset('assets/images/parts/alimentation-lr.jpg') }}" alt="Alimentation Label Rouge"> <img src="{{ asset('assets/images/parts/alimentation-lr.jpg') }}" alt="Alimentation Label Rouge" class="type active">
@else @else
<img class="type active" src="{{ asset('assets/images/parts/alimentation-bio.jpg') }}" alt="Alimentation Bio"> <img src="{{ asset('assets/images/parts/alimentation-bio.jpg') }}" alt="Alimentation Bio" class="type active">
@endif @endif
</div> </div>
<p class="title">D'où proviennent les céréales ?</p> <p class="title">D'où proviennent les céréales ?</p>
<div class="box"> <div class="box">
<p>De l’éleveur lui-même. Il cultive les céréales qui seront ensuite envoyées à l’usine d’aliments de la coopérative des <p>De l’éleveur lui-même. Il cultive les céréales qui seront ensuite envoyées à l’usine d’aliments de la coopérative des Fermiers de Loué, ALIFEL, pour les transformer en alimentation pour poules, qui sera ensuite retournée à l’éleveur.</p>
Fermiers de Loué, ALIFEL, pour les transformer en alimentation pour poules, qui sera ensuite retournée à l’éleveur. <img src="{{ asset('assets/images/parts/circuit_alimentation.png') }}" alt="Circuit Alimentation" class="circuit">
</p>
<img class="circuit" src="{{ asset('assets/images/parts/circuit_alimentation.png') }}" alt="Circuit Alimentation">
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,24 +5,22 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page emballage"> <div class="sub-page emballage">
<header> <header>
<a href="{{ route('egg.FrontPage', ['id' => request()->id]) }}"> <a href="{{route('egg.FrontPage', ['id' => request()->id])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="details-alimentation"> <div class="details-alimentation">
<div class="box"> <div class="box">
<img class="oeuf" src="{{ asset('assets/images/egg/LOGO_LOEUF.png') }}" alt="Logo l'oeuf"> <img src="{{ asset('assets/images/egg/LOGO_LOEUF.png') }}" alt="Logo l'oeuf" class="oeuf">
<p>Une fois les œufs triés à la main par nos éleveurs, un camion passe 4 fois par semaine dans les fermes pour les <p>Une fois les œufs triés à la main par nos éleveurs, un camion passe 4 fois par semaine dans les fermes pour les récupérer et les emmener au centre d’emballage : LOEUF (72). Les œufs pourront y être contrôlés, triés, calibrés et emballés dans les boîtes prêts à être livrés dans vos magasins.</p>
récupérer et les emmener au centre d’emballage : LOEUF (72). Les œufs pourront y être contrôlés, triés, calibrés et
emballés dans les boîtes prêts à être livrés dans vos magasins.</p>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,25 +5,23 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page elevage"> <div class="sub-page elevage">
<header> <header>
<a href="{{ route('egg.infoElevage', ['id' => request()->id]) }}"> <a href="{{route('egg.infoElevage', ['id' => request()->id])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="elevage-liberte text-center"> <div class="elevage-liberte text-center">
<p class="title">Un mode d'élevage en liberté,<br>qu'est-ce que cela signifie ?</p> <p class="title">Un mode d'élevage en liberté,<br>qu'est-ce que cela signifie ?</p>
<img class="img img-fluid" src="{{ asset('assets/images/egg/generique.jpg') }}" alt="Loué"> <img class="img img-fluid" src="{{ asset('assets/images/egg/generique.jpg') }}" alt="Loué">
<div class="items"> <div class="items">
<p class="description">Nos poules gambadent librement, du matin au crépuscule, en profitant en moyenne de 50 000 m2 (5 <p class="description">Nos poules gambadent librement, du matin au crépuscule, en profitant en moyenne de 50 000 m2 (5 hectares) de prairies arborées. Toutes les fermes disposent d’un parcours boisé sur lequel elles peuvent compléter leur alimentation et laisser libre cours à leur comportement naturel : gratter, picorer, fouiller, courir !</p>
hectares) de prairies arborées. Toutes les fermes disposent d’un parcours boisé sur lequel elles peuvent compléter
leur alimentation et laisser libre cours à leur comportement naturel : gratter, picorer, fouiller, courir !</p>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,79 +5,75 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page elevage"> <div class="sub-page elevage">
<header> <header>
<a href="{{ route('egg.FrontPage', ['id' => request()->id]) }}"> <a href="{{route('egg.FrontPage', ['id' => request()->id])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="portrait-eleveur"> <div class="portrait-eleveur">
<div class="top"> <div class="top">
@if ($eleveur->path_picture_2 != null && $eleveur->path_picture_2 != '') @if ($eleveur->path_picture_2 != null && $eleveur->path_picture_2 != "")
<img src="{{ asset($eleveur->path_picture_2) }}" alt="Éleveur"> <img src="{{ asset($eleveur->path_picture_2) }}" alt="Éleveur">
@else @else
<img src="{{ asset('assets/images/parts/generique_portrait.jpg') }}" alt="Éleveur"> <img src="{{ asset('assets/images/parts/generique_portrait.jpg') }}" alt="Éleveur">
@endif
<div class="content">
<p>
<span class="name green">{{$eleveur->firstname}} {{$eleveur->lastname}}</span><br>
@if ($age)
{{$age}} ans <span class="green">/</span>
@endif
{{$eleveur->city}} ({{$eleveur->postcode}})
</p>
@if ($ageElevage)
@switch($eleveur->civilite)
@case(App\Enums\BreederCivilty::elle())
<p>Éleveuse de poules de Loué depuis {{$ageElevage}} ans</p>
@break
@case(App\Enums\BreederCivilty::il())
<p>Éleveur de poules de Loué depuis {{$ageElevage}} ans</p>
@break
@case(App\Enums\BreederCivilty::elles())
<p>Éleveuses de poules de Loué depuis {{$ageElevage}} ans</p>
@break
@case(App\Enums\BreederCivilty::ils())
<p>Éleveurs de poules de Loué depuis {{$ageElevage}} ans</p>
@break
@default
<p>Éleveur(se) de poules de Loué depuis {{$ageElevage}} ans</p>
@endswitch
@endif @endif
<div class="content"> </div>
<p> </div>
<span class="name green">{{ $eleveur->firstname }} {{ $eleveur->lastname }}</span><br> <div class="pagination">
@if ($age) <div class="prev"></div>
{{ $age }} ans <span class="green">/</span> <div class="next"></div>
@endif <p>Question<br><span id="q-index">1</span>/{{count($questions)}}</p>
{{ $eleveur->city }} ({{ $eleveur->postcode }}) </div>
</p> <div class="slider">
@foreach ($questions as $key => $question)
@if ($ageElevage) @if ($key == 0)
@switch($eleveur->civilite) <div class="item active" id="q-{{$key + 1}}">
@case(App\Enums\BreederCivilty::elle()) @else
<p>Éleveuse de poules de Loué depuis {{ $ageElevage }} ans</p> <div class="item" id="q-{{$key + 1}}">
@break
@case(App\Enums\BreederCivilty::il())
<p>Éleveur de poules de Loué depuis {{ $ageElevage }} ans</p>
@break
@case(App\Enums\BreederCivilty::elles())
<p>Éleveuses de poules de Loué depuis {{ $ageElevage }} ans</p>
@break
@case(App\Enums\BreederCivilty::ils())
<p>Éleveurs de poules de Loué depuis {{ $ageElevage }} ans</p>
@break
@default
<p>Éleveur(se) de poules de Loué depuis {{ $ageElevage }} ans</p>
@endswitch
@endif @endif
<p class="question">{{$question[0]}}</p>
<p class="answer">« <span class="green">{{$question[1]}}</span> »</p>
</div> </div>
@endforeach
</div> </div>
<div class="pagination">
<div class="prev"></div>
<div class="next"></div>
<p>Question<br><span id="q-index">1</span>/{{ count($questions) }}</p>
</div>
<div class="slider">
@foreach ($questions as $key => $question)
@if ($key == 0)
<div class="item active" id="q-{{ $key + 1 }}">
@else
<div class="item" id="q-{{ $key + 1 }}">
@endif
<p class="question">{{ $question[0] }}</p>
<p class="answer">« <span class="green">{{ $question[1] }}</span> »</p>
</div>
@endforeach
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> @endsection
@endsection
@push('scripts') @push('scripts')
<script nonce="{{ $nonce }}"> <script nonce="{{ $nonce }}">
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
let currentPage = 1; let currentPage = 1;
@ -113,4 +109,4 @@
}); });
}); });
</script> </script>
@endpush @endpush

View file

@ -5,59 +5,58 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page elevage"> <div class="sub-page elevage">
<header> <header>
<a href="{{ route('egg.infoElevage', ['id' => request()->id]) }}"> <a href="{{route('egg.infoElevage', ['id' => request()->id])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="vs-oeufs"> <div class="vs-oeufs">
<p class="title">Quelle différence entre un œuf<br>plein air et un œuf fermier IGP<br>Label Rouge de Loué ?</p> <p class="title">Quelle différence entre un œuf<br>plein air et un œuf fermier IGP<br>Label Rouge de Loué ?</p>
<div class="items"> <div class="items">
<p class="description">Même si les œufs Plein Air et les œufs Label Rouge de Loué bénéficient du même code <p class="description">Même si les œufs Plein Air et les œufs Label Rouge de Loué bénéficient du même code d’identification (code 1), de grandes différences existent :</p>
d’identification (code 1), de grandes différences existent :</p> <div class="tables">
<div class="tables"> <div class="table">
<div class="table"> <table>
<table> <tr>
<tr> <td></td>
<td></td> <th>Œufs fermiers IGP Label Rouge de Loué de poules élevées en liberté</th>
<th>Œufs fermiers IGP Label Rouge de Loué de poules élevées en liberté</th> <th>Œufs de poules élevées en Plein Air</th>
<th>Œufs de poules élevées en Plein Air</th> </tr>
</tr> <tr>
<tr> <td><img src="{{ asset('assets/images/egg/poule.png') }}" alt="Poule"></td>
<td><img src="{{ asset('assets/images/egg/poule.png') }}" alt="Poule"></td> <td>Limité à 6 000 poules par exploitation</td>
<td>Limité à 6 000 poules par exploitation</td> <td>Pas de limite</td>
<td>Pas de limite</td> </tr>
</tr> <tr>
<tr> <td><img src="{{ asset('assets/images/egg/main_œuf.png') }}" alt="Oeufs"></td>
<td><img src="{{ asset('assets/images/egg/main_œuf.png') }}" alt="Oeufs"></td> <td>Œufs ramassés quotidiennement et triés à la main</td>
<td>Œufs ramassés quotidiennement et triés à la main</td> <td>Automatisé</td>
<td>Automatisé</td> </tr>
</tr> <tr>
<tr> <td><img src="{{ asset('assets/images/egg/ble.png') }}" alt="Céréales"></td>
<td><img src="{{ asset('assets/images/egg/ble.png') }}" alt="Céréales"></td> <td>65 % de céréales locales minimu, sans OGM (< 0,9%) </td>
<td>65 % de céréales locales minimum</td> <td>Aucune garantie sur l’alimentation des poules</td>
<td>Aucune garantie sur l’alimentation des poules</td> </tr>
</tr> <tr>
<tr> <td><img src="{{ asset('assets/images/egg/mail.png') }}" alt="Lettre"></td>
<td><img src="{{ asset('assets/images/egg/mail.png') }}" alt="Lettre"></td> <td>Parcours extérieur de 8 m2 par poule</td>
<td>Parcours extérieur de 8 m2 par poule</td> <td>Parcours extérieur de 4 m2 par poule</td>
<td>Parcours extérieur de 4 m2 par poule</td> </tr>
</tr> <tr>
<tr> <td><img src="{{ asset('assets/images/egg/tracteur.png') }}" alt="Tracteur"></td>
<td><img src="{{ asset('assets/images/egg/tracteur.png') }}" alt="Tracteur"></td> <td>Conditionnement des œufs dans un rayon de 150 km de l’élevage</td>
<td>Conditionnement des œufs dans un rayon de 150 km de l’élevage</td> <td>Aucune contrainte géographique entre l’élevage et le centre d’emballage</td>
<td>Aucune contrainte géographique entre l’élevage et le centre d’emballage</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,17 +5,15 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="{{ Session::get('subColor') }} block"> <div class="block {{ Session::get('subColor') }}">
<div class="header"> <div class="header">
<p>Vous venez de scanner :</p> <p>Vous venez de scanner :</p>
<p>Œufs fermiers de Loué de <br> poules élevées en liberté</p> <p>Œufs fermiers de Loué de <br> poules élevées en liberté</p>
<p>{{ optional($dataVisuel)->libelle }}</p> <p>{{ $dataVisuel->libelle }}</p>
</div> </div>
<div class="body"> <div class="body">
@if ($dataVisuel) <img src="{{ asset($dataVisuel->path) }}" alt="œufs" class="box_img">
<img class="box_img" src="{{ asset($dataVisuel->path) }}" alt="œufs">
@endif
<div class="date"> <div class="date">
<p>Ces œufs ont été pondus le :</p> <p>Ces œufs ont été pondus le :</p>
<p>{{ Carbon\Carbon::parse($datePonte)->format('d/m/Y') }}</p> <p>{{ Carbon\Carbon::parse($datePonte)->format('d/m/Y') }}</p>
@ -25,36 +23,34 @@
<p>{{ Carbon\Carbon::parse($dcr)->format('d/m/Y') }}</p> <p>{{ Carbon\Carbon::parse($dcr)->format('d/m/Y') }}</p>
</div> </div>
@if (!$dcrGood) @if (!$dcrGood)
<p class="message red"><span>ATTENTION !</span><br>La date de consommation recommandée (DCR) est dépassée. Vos œufs ne <p class="message red"><span>ATTENTION !</span><br>La date de consommation recommandée (DCR) est dépassée. Vos œufs ne doivent plus être consommés.</p>
doivent plus être consommés.</p> <p class="message blue"><span>BONNE NOUVELLE !</span><br>Vous pouvez toujours connaître toute l'origine de vos œufs en parcourant cette page.</p>
<p class="message blue"><span>BONNE NOUVELLE !</span><br>Vous pouvez toujours connaître toute l'origine de vos œufs en
parcourant cette page.</p>
@endif @endif
<div class="labels"> <div class="labels">
<a class="lr" href="{{ route('egg.labelRouge', ['id' => request()->id]) }}"> <a href="{{route('egg.labelRouge', ['id' => request()->id])}}" class="lr">
<img class="lr" src="{{ asset('assets/images/labels/LR.png') }}" alt="Label Rouge"> <img src="{{ asset('assets/images/labels/LR.png') }}" alt="Label Rouge" class="lr">
</a> </a>
<a class="bio" href="{{ route('egg.labelBio', ['id' => request()->id]) }}"> <a href="{{route('egg.labelBio', ['id' => request()->id])}}" class="bio">
<img class="bio" src="{{ asset('assets/images/labels/AB.png') }}" alt="Agriculture Biologique"> <img src="{{ asset('assets/images/labels/AB.png') }}" alt="Agriculture Biologique" class="bio">
</a> </a>
<a href="{{ route('egg.labelIGP', ['id' => request()->id]) }}"> <a href="{{route('egg.labelIGP', ['id' => request()->id])}}">
<img src="{{ asset('assets/images/labels/IGP.png') }}" alt="Indication Géographique Protégée"> <img src="{{ asset('assets/images/labels/IGP.png') }}" alt="Indication Géographique Protégée">
</a> </a>
<a href="{{ route('egg.labelNutriscore', ['id' => request()->id]) }}"> <a href="{{route('egg.labelNutriscore', ['id' => request()->id])}}">
<img src="{{ asset('assets/images/labels/nutriscore.png') }}" alt="Nutriscore"> <img src="{{ asset('assets/images/labels/nutriscore.png') }}" alt="Nutriscore">
</a> </a>
<a href="{{ route('egg.labelFermiers', ['id' => request()->id]) }}"> <a href="{{route('egg.labelFermiers', ['id' => request()->id])}}">
<img src="{{ asset('assets/images/labels/fermiers.png') }}" alt="Fermiers"> <img src="{{ asset('assets/images/labels/fermiers.png') }}" alt="Fermiers">
</a> </a>
</div> </div>
</div> </div>
<div class="footer"> <div class="footer">
<a href="{{ route('egg.labelCertif', ['id' => $id]) }}">en savoir + sur</a> <a href="{{route('egg.labelCertif', ['id' => $id])}}">en savoir + sur</a>
<p>Les Labels et les Certifications</p> <p>Les Labels et les Certifications</p>
</div> </div>
</div> </div>
<a class="btn-discover" href="#content"><b><i>Tout connaître de <br> l’origine de mes œufs</i></b></a> <a href="#content" class="btn-discover"><b><i>Tout connaître de <br> l’origine de mes œufs</i></b></a>
@if (!$multiple) @if (!$multiple)
<div class="elevage" id="content"> <div class="elevage" id="content">
@ -68,25 +64,23 @@
@endif @endif
<div class="title"> <div class="title">
<p>Ces poules ont été élevées en liberté</p> <p>Ces poules ont été élevées en liberté</p>
<a href="{{ route('egg.infoElevage', ['id' => $id]) }}"><img <a href="{{route('egg.infoElevage', ['id' => $id])}}"><img src="{{ asset('assets/images/egg/picto_info_elevage.png') }}" alt="Info"></a>
src="{{ asset('assets/images/egg/picto_info_elevage.png') }}" alt="Info"></a>
</div> </div>
<div class="details"> <div class="details">
<p class="by"> <p class="by">
<span class="green">PAR : </span> {{ $eleveurs[0]->firstname }} {{ $eleveurs[0]->lastname }} <br> <span class="green">PAR : </span> {{$eleveurs[0]->firstname}} {{$eleveurs[0]->lastname}} <br>
<span class="green">À : </span> {{ $eleveurs[0]->city }} ({{ $eleveurs[0]->postcode }}) <span class="green">À : </span> {{$eleveurs[0]->city}} ({{$eleveurs[0]->postcode}})
</p> </p>
@if (isset($eleveurs[0]->path_picture_1) && $eleveurs[0]->path_picture_1 != '') @if (isset($eleveurs[0]->path_photo1) && $eleveurs[0]->path_photo1 != '')
<img class="img-fluid" src="{{ asset($eleveurs[0]->path_picture_1) }}" alt="Élevage"> <img class="img-fluid" src="{{ asset($eleveurs[0]->path_photo1) }}" alt="Élevage">
@else @else
<img class="img-fluid" src="{{ asset('assets/images/egg/generique.jpg') }}" alt="Élevage"> <img class="img-fluid" src="{{ asset('assets/images/egg/generique.jpg') }}" alt="Élevage">
@endif @endif
<div class="bottom one"> <div class="bottom one">
@if ($eleveurs[0]->questions) @if ($eleveurs[0]->questions)
<a href="{{ route('egg.portraitEleveur', ['id' => $id, 'eleveurId' => $eleveurs[0]->cafel_code]) }}">en savoir <a href="{{route('egg.portraitEleveur', ['id' => $id, 'eleveurId' => $eleveurs[0]->cafel_code])}}">en savoir + sur</a>
+ sur</a>
@endif @endif
<p>{{ $eleveurs[0]->firstname }} {{ $eleveurs[0]->lastname }}</p> <p>{{$eleveurs[0]->firstname}} {{$eleveurs[0]->lastname}}</p>
</div> </div>
</div> </div>
</div> </div>
@ -104,8 +98,7 @@
<div class="title"> <div class="title">
<p>Ces poules ont été élevées en liberté</p> <p>Ces poules ont été élevées en liberté</p>
<a href="{{ route('egg.infoElevage', ['id' => $id]) }}"><img <a href="{{ route('egg.infoElevage', ['id' => $id]) }}"><img src="{{ asset('assets/images/egg/picto_info_elevage.png') }}" alt="Info"></a>
src="{{ asset('assets/images/egg/picto_info_elevage.png') }}" alt="Info"></a>
</div> </div>
<div class="details"> <div class="details">
<p class="by"> <p class="by">
@ -119,12 +112,9 @@
<div class="bottom multiple"> <div class="bottom multiple">
@foreach ($eleveurs as $eleveur) @foreach ($eleveurs as $eleveur)
@if ($eleveur->questions) @if ($eleveur->questions)
<a href="{{ route('egg.portraitEleveur', ['id' => $id, 'eleveurId' => $eleveur->cafel_code]) }}">{{ $eleveur->firstname }} <a href="{{ route('egg.portraitEleveur', ['id' => $id, 'eleveurId' => $eleveur->cafel_code]) }}">{{ $eleveur->firstname }} {{$eleveur->lastname}} <br> <span class="light">{{$eleveur->city}} ({{$eleveur->postcode}})</span></a>
{{ $eleveur->lastname }} <br> <span class="light">{{ $eleveur->city }}
({{ $eleveur->postcode }})</span></a>
@else @else
<div class="disabled">{{ $eleveur->firstname }} {{ $eleveur->lastname }} <br> <span <div class="disabled">{{$eleveur->firstname}} {{$eleveur->lastname}} <br> <span class="light">{{$eleveur->city}} ({{$eleveur->postcode}})</span></div>
class="light">{{ $eleveur->city }} ({{ $eleveur->postcode }})</span></div>
@endif @endif
@endforeach @endforeach
</div> </div>
@ -136,16 +126,15 @@
<p class="title">Alimentation</p> <p class="title">Alimentation</p>
<div class="box"> <div class="box">
<div class="title"> <div class="title">
<p>Poules nourries à base de céréales locales (65% minimum)< /p> <p>Poules nourries à base de céréales locales (65% minimum) garanties sans OGM (<0,9%)</p>
</div> </div>
<p class="infos"><span class="yellow">Usine d'aliment : </span><br>ALIFEL, 72540 Loué</p> <p class="infos"><span class="yellow">Usine d'aliment : </span><br>ALIFEL, 72540 Loué</p>
@if (isset($aliment) && !empty($aliment)) @if (isset($aliment) && !empty($aliment))
<p class="infos"><span class="yellow">Dernière livraison : <p class="infos"><span class="yellow">Dernière livraison : </span><br>{{ Carbon\Carbon::parse($aliment->date_livraison)->format('d/m/Y') }}</p>
</span><br>{{ Carbon\Carbon::parse($aliment->date_livraison)->format('d/m/Y') }}</p>
@endif @endif
<img class="alifel img-fluid" src="{{ asset('assets/images/parts/ALIFEL.jpg') }}" alt="Alifel"> <img src="{{ asset('assets/images/parts/ALIFEL.jpg') }}" alt="Alifel" class="alifel img-fluid">
<div class="bottom"> <div class="bottom">
<a href="{{ route('egg.infoAlim', ['id' => $id]) }}">en savoir +</a> <a href="{{route('egg.infoAlim', ['id' => $id])}}">en savoir +</a>
</div> </div>
</div> </div>
</div> </div>
@ -154,26 +143,25 @@
<div class="box"> <div class="box">
<p class="date">{{ Carbon\Carbon::parse($date_emballage)->format('d/m/Y') }}</p> <p class="date">{{ Carbon\Carbon::parse($date_emballage)->format('d/m/Y') }}</p>
<p class="lieu"><span class="title">LIEU : </span>LA BAZOGE (72650)</p> <p class="lieu"><span class="title">LIEU : </span>LA BAZOGE (72650)</p>
<p class="description">Chaque œuf est vérifié et trié individuellement, puis emballé dans des boîtes recyclées et recyclables. <p class="description">Chaque œuf est vérifié et trié individuellement, puis emballé dans des boîtes recyclées et recyclables.</p>
</p>
<img src="{{ asset('assets/images/egg/Photo-LOEUF.jpg') }}" alt="Logo"> <img src="{{ asset('assets/images/egg/Photo-LOEUF.jpg') }}" alt="Logo">
<div class="bottom"> <div class="bottom">
<a href="{{ route('egg.infoEmballage', ['id' => $id]) }}">en savoir + sur</a> <a href="{{route('egg.infoEmballage', ['id' => $id])}}">en savoir + sur</a>
<p>LŒUF</p> <p>LŒUF</p>
</div> </div>
</div> </div>
</div> </div>
<!--div class="magasin"> <!--div class="magasin">
<p class="title">Magasin</p> <p class="title">Magasin</p>
<div class="box"> <div class="box">
<p class="title">Merci pour votre confiance !</p> <p class="title">Merci pour votre confiance !</p>
<p class="description">Les Fermiers de Loué vous offrent<br>un bon de réduction de 0,50 &euro;<br>pour votre prochain achat d'œufs.</p> <p class="description">Les Fermiers de Loué vous offrent<br>un bon de réduction de 0,50 &euro;<br>pour votre prochain achat d'œufs.</p>
<img src="/loue/img/bon_reduc.png" alt="Réduction"> <img src="/loue/img/bon_reduc.png" alt="Réduction">
<div class="bottom"> <div class="bottom">
<a href="#">Cliquez ici<br>pour en profiter</a> <a href="#">Cliquez ici<br>pour en profiter</a>
</div>
</div> </div>
</div--> </div>
</div> </div-->
</div> </div>
</div>
@endsection @endsection

View file

@ -5,37 +5,35 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page elevage"> <div class="sub-page elevage">
<header> <header>
<a href="{{ route('egg.FrontPage', ['id' => request()->id]) }}"> <a href="{{route('egg.FrontPage', ['id' => request()->id])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="infos-elevages"> <div class="infos-elevages">
<p class="title">Infos pratiques</p> <p class="title">Infos pratiques</p>
<div class="items"> <div class="items">
<div class="item"> <div class="item">
<img class="top-img" src="{{ asset('assets/images/egg/infos-elevages-1.jpg') }}" alt="Élevage en liberté"> <img src="{{ asset('assets/images/egg/infos-elevages-1.jpg') }}" alt="Élevage en liberté" class="top-img">
<div class="text"> <div class="text">
<p>Un mode d'élevage en liberté, qu'est-ce que cela signifie ?</p> <p>Un mode d'élevage en liberté, qu'est-ce que cela signifie ?</p>
<a href="{{ route('egg.infoElevageLib', ['id' => request()->id]) }}"><img <a href="{{ route('egg.infoElevageLib', ['id' => request()->id]) }}"><img src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +"></a>
src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +"></a>
</div>
</div> </div>
<div class="item"> </div>
<img class="top-img" src="{{ asset('assets/images/egg/infos-elevages-2.jpg') }}" alt="Différence entre les œufs"> <div class="item">
<div class="text"> <img src="{{ asset('assets/images/egg/infos-elevages-2.jpg') }}" alt="Différence entre les œufs" class="top-img">
<p>Quelle différence entre un œuf plein air et un œuf fermier IGP Label Rouge de Loué ?</p> <div class="text">
<a href="{{ route('egg.infoDiffOeufs', ['id' => request()->id]) }}"><img <p>Quelle différence entre un œuf plein air et un œuf fermier IGP Label Rouge de Loué ?</p>
src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +"></a> <a href="{{ route('egg.infoDiffOeufs', ['id' => request()->id]) }}"><img src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +"></a>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,45 +5,43 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page {{ Session::get('subColor') }}"> <div class="sub-page {{ Session::get('subColor') }}">
<header> <header>
<a href="{{ route('egg.labelCertif', ['id' => request()->id]) }}"> <a href="{{route('egg.labelCertif', ['id' => request()->id])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="labels-and-certifs"> <div class="labels-and-certifs">
<div class="label-fermiers"> <div class="label-fermiers">
<div class="text-center"> <div class="text-center">
<img class="logo" src="{{ asset('assets/images/labels/fermiers.png') }}" alt="Fermiers"> <img src="{{ asset('assets/images/labels/fermiers.png') }}" alt="Fermiers" class="logo">
</div> </div>
<p class="title">Qu’est-ce-qu’un œuf «fermier» ?</p> <p class="title">Qu’est-ce-qu’un œuf «fermier» ?</p>
<div class="box"> <div class="box">
<p>Le terme « fermier » va bien au-delà d’un mot inscrit sur une boîte. C’est un décret délibéré qui doit répondre à <p>Le terme « fermier » va bien au-delà d’un mot inscrit sur une boîte. C’est un décret délibéré qui doit répondre à un cahier des charges bien précis. Pour en bénéficier, 5 critères sont à respecter :</p>
un cahier des charges bien précis. Pour en bénéficier, 5 critères sont à respecter :</p> <div class="items">
<div class="items"> <div class="item">
<div class="item"> <img src="{{ asset('assets/images/egg/poule.png') }}" alt="Poule">
<img src="{{ asset('assets/images/egg/poule.png') }}" alt="Poule"> <p>Élevage limité à 6 000 poules</p>
<p>Élevage limité à 6 000 poules</p> </div>
</div> <div class="item">
<div class="item"> <img src="{{ asset('assets/images/egg/main_œuf.png') }}" alt="Oeufs">
<img src="{{ asset('assets/images/egg/main_œuf.png') }}" alt="Oeufs"> <p>Œufs ramassés quotidiennement et triés à la main</p>
<p>Œufs ramassés quotidiennement et triés à la main</p> </div>
</div> <div class="item">
<div class="item"> <img src="{{ asset('assets/images/egg/ble.png') }}" alt="Céréales">
<img src="{{ asset('assets/images/egg/ble.png') }}" alt="Céréales"> <p>Céréales contenues dans l’alimentation issues de l’exploitation ou des exploitations environnantes</p>
<p>Céréales contenues dans l’alimentation issues de l’exploitation ou des exploitations environnantes</p> </div>
</div> <div class="item">
<div class="item"> <img src="{{ asset('assets/images/egg/mail.png') }}" alt="Lettre">
<img src="{{ asset('assets/images/egg/mail.png') }}" alt="Lettre"> <p>Nom et adresse de l’éleveur mentionnés sur la boîte</p>
<p>Nom et adresse de l’éleveur mentionnés sur la boîte</p> </div>
</div> <div class="item">
<div class="item"> <img src="{{ asset('assets/images/egg/tracteur.png') }}" alt="Tracteur">
<img src="{{ asset('assets/images/egg/tracteur.png') }}" alt="Tracteur"> <p>Élevage intégré dans une activité agricole diversifiée</p>
<p>Élevage intégré dans une activité agricole diversifiée</p>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -51,4 +49,5 @@
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,32 +5,30 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page {{ Session::get('subColor') }}"> <div class="sub-page {{ Session::get('subColor') }}">
<header> <header>
<a href="{{ route('egg.labelCertif', ['id' => request()->id]) }}"> <a href="{{route('egg.labelCertif', ['id' => request()->id])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="labels-and-certifs"> <div class="labels-and-certifs">
<div class="label-igp"> <div class="label-igp">
<div class="text-center"> <div class="text-center">
<img class="logo" src="{{ asset('assets/images/labels/IGP.png') }}" alt="Indication Géographique Protégée"> <img src="{{ asset('assets/images/labels/IGP.png') }}" alt="Indication Géographique Protégée" class="logo">
</div> </div>
<p class="title">Une filière locale encadrée par l’Indication Géographique Protégée (IGP)</p> <p class="title">Une filière locale encadrée par l’Indication Géographique Protégée (IGP)</p>
<div class="box"> <div class="box">
<p>Les œufs de Loué sont les seuls à bénéficier d’une Indication Géographique Protégée (IGP). Celle-ci détermine une <p>Les œufs de Loué sont les seuls à bénéficier d’une Indication Géographique Protégée (IGP). Celle-ci détermine une zone d’élevage délimitée.
zone d’élevage délimitée. <br><br>
<br><br> Pour les œufs et les volailles de Loué, l’IGP se concentre dans un périmètre de 150 km autour du village de Loué situé en Sarthe (72).
Pour les œufs et les volailles de Loué, l’IGP se concentre dans un périmètre de 150 km autour du village de Loué </p>
situé en Sarthe (72).
</p>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,40 +5,36 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page {{ Session::get('subColor') }}"> <div class="sub-page {{ Session::get('subColor') }}">
<header> <header>
<a href="{{ route('egg.labelCertif', ['id' => request()->id]) }}"> <a href="{{route('egg.labelCertif', ['id' => request()->id ])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="labels-and-certifs"> <div class="labels-and-certifs">
<div class="label-bio"> <div class="label-bio">
<div class="text-center"> <div class="text-center">
<img class="logo" src="{{ asset('assets/images/labels/AB.png') }}" alt="Agriculture Biologique"> <img src="{{ asset('assets/images/labels/AB.png') }}" alt="Agriculture Biologique" class="logo">
</div> </div>
<p class="title">Qu'est-ce qu'un œuf BIO ?</p> <p class="title">Qu'est-ce qu'un œuf BIO ?</p>
<div class="box"> <div class="box">
<p>Depuis 1994, les Fermiers de Loué ont décidé de s’engager dans l’élevage biologique. Le Label Agriculture <p>Depuis 1994, les Fermiers de Loué ont décidé de s’engager dans l’élevage biologique. Le Label Agriculture Biologique garantit un mode de production fondé sur la non-utilisation de produits chimiques de synthèse et d’OGM.
Biologique garantit un mode de production fondé sur la non-utilisation de produits chimiques de synthèse. <br>
<br> Ce Label permet aux Fermiers de Loué d’aller encore plus loin dans le respect de l’environnement et du bien-être animal.
Ce Label permet aux Fermiers de Loué d’aller encore plus loin dans le respect de l’environnement et du bien-être </p>
animal. <p>Les œufs de Loué sont exclusivement des œufs de poules élevées en liberté, Label Rouge (code 1) ou Bio (code 0).</p>
</p> </div>
<p>Les œufs de Loué sont exclusivement des œufs de poules élevées en liberté, Label Rouge (code 1) ou Bio (code 0). <div class="mt-5">
</p> <div class="video youtube ratio ratio-16x9" data-authorize="0">
</div> <iframe src="/frame/youtube" data-src="https://www.youtube.com/embed/IeTVms72rJw?controls=0" width="100%" height="100%" frameborder="0" allow="fullscreen picture-in-picture"></iframe>
<div class="mt-5">
<div class="video youtube ratio ratio-16x9" data-authorize="0">
<iframe data-src="https://www.youtube.com/embed/IeTVms72rJw?controls=0" src="/frame/youtube" width="100%"
height="100%" frameborder="0" allow="fullscreen picture-in-picture"></iframe>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,37 +5,33 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page {{ Session::get('subColor') }}"> <div class="sub-page {{ Session::get('subColor') }}">
<header> <header>
<a href="{{ route('egg.labelCertif', ['id' => request()->id]) }}"> <a href="{{route('egg.labelCertif', ['id' => request()->id ])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="labels-and-certifs"> <div class="labels-and-certifs">
<div class="label-rouge"> <div class="label-rouge">
<div class="text-center"> <div class="text-center">
<img class="logo" src="{{ asset('assets/images/labels/LR.png') }}" alt="Label Rouge"> <img src="{{ asset('assets/images/labels/LR.png') }}" alt="Label Rouge" class="logo">
</div> </div>
<p class="title">Le Label Rouge, un Label de qualité</p> <p class="title">Le Label Rouge, un Label de qualité</p>
<div class="box"> <div class="box">
<p>Les produits certifiés Label Rouge répondent à un cahier des charges strict, garantissant un niveau de qualité <p>Les produits certifiés Label Rouge répondent à un cahier des charges strict, garantissant un niveau de qualité supérieur. Pour y prétendre, un organisme certificateur indépendant se rend chez les éleveurs pour les auditer.</p>
supérieur. Pour y prétendre, un organisme certificateur indépendant se rend chez les éleveurs pour les auditer. <p>Les œufs de Loué sont exclusivement des œufs de poules élevées en liberté, Label Rouge (code 1) ou Bio (code 0).</p>
</p> </div>
<p>Les œufs de Loué sont exclusivement des œufs de poules élevées en liberté, Label Rouge (code 1) ou Bio (code 0). <div class="mt-5">
</p> <div class="video youtube ratio ratio-16x9" data-authorize="0">
</div> <iframe src="/frame/youtube" data-src="https://www.youtube.com/embed/eXyg-eRPpSw?controls=0" width="100%" height="100%" frameborder="0" allow="fullscreen picture-in-picture"></iframe>
<div class="mt-5">
<div class="video youtube ratio ratio-16x9" data-authorize="0">
<iframe data-src="https://www.youtube.com/embed/eXyg-eRPpSw?controls=0" src="/frame/youtube" width="100%"
height="100%" frameborder="0" allow="fullscreen picture-in-picture"></iframe>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,36 +5,32 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page {{ Session::get('subColor') }}"> <div class="sub-page {{ Session::get('subColor') }}">
<header> <header>
<a href="{{ route('egg.labelCertif', ['id' => request()->id]) }}"> <a href="{{route('egg.labelCertif', ['id' => request()->id])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="labels-and-certifs"> <div class="labels-and-certifs">
<div class="label-nutriscore"> <div class="label-nutriscore">
<div class="text-center"> <div class="text-center">
<img class="logo" src="{{ asset('assets/images/labels/nutriscore.png') }}" alt="Nutriscore"> <img src="{{ asset('assets/images/labels/nutriscore.png') }}" alt="Nutriscore" class="logo">
</div> </div>
<p class="title">Les œufs de Loué sont notés A au Nutri-Score</p> <p class="title">Les œufs de Loué sont notés A au Nutri-Score</p>
<div class="box"> <div class="box">
<p>Conçu dans le cadre du Programme National Nutrition santé, le logo Nutri-Score est le logo officiel de <p>Conçu dans le cadre du Programme National Nutrition santé, le logo Nutri-Score est le logo officiel de l’étiquetage nutritionnel en France. Diététiques, riches en bons nutriments et reconnus meilleure source naturelle de protéines, les œufs fermiers de Loué (Label rouge ou Bio) obtiennent la lettre A : la notation la plus favorable sur le plan nutritionnel.</p>
l’étiquetage nutritionnel en France. Diététiques, riches en bons nutriments et reconnus meilleure source </div>
naturelle de protéines, les œufs fermiers de Loué (Label rouge ou Bio) obtiennent la lettre A : la notation la <div class="mt-5">
plus favorable sur le plan nutritionnel.</p> <div class="video youtube ratio ratio-16x9" data-authorize="0">
</div> <iframe src="/frame/youtube" data-src="https://www.youtube.com/embed/D9rFCgZa9zs?controls=0" width="100%" height="100%" frameborder="0" allow="fullscreen picture-in-picture"></iframe>
<div class="mt-5">
<div class="video youtube ratio ratio-16x9" data-authorize="0">
<iframe data-src="https://www.youtube.com/embed/D9rFCgZa9zs?controls=0" src="/frame/youtube" width="100%"
height="100%" frameborder="0" allow="fullscreen picture-in-picture"></iframe>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,46 +5,46 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="sub-page {{ Session::get('subColor') }}"> <div class="sub-page {{ Session::get('subColor') }}">
<header> <header>
<a href="{{ route('egg.FrontPage', ['id' => request()->id]) }}"> <a href="{{route('egg.FrontPage', ['id' => request()->id])}}">
<p class="arrow">&#9668;</p> <p class="arrow">&#9668;</p>
<p>Retour</p> <p>Retour</p>
</a> </a>
</header> </header>
<div class="container"> <div class="container">
<div class="labels-and-certifs"> <div class="labels-and-certifs">
<div class="menu"> <div class="menu">
<p class="title">Mieux comprendre les Labels et les mentions présentes sur les boites</p> <p class="title">Mieux comprendre les Labels et les mentions présentes sur les boites</p>
<a class="item bio" href="{{ route('egg.labelBio', ['id' => request()->id]) }}"> <a href="{{ route('egg.labelBio', ['id' => request()->id]) }}" class="item bio">
<img src="{{ asset('assets/images/labels/AB.png') }}" alt="Agriculture Biologique"> <img src="{{ asset('assets/images/labels/AB.png') }}" alt="Agriculture Biologique">
<p class="text-center">Qu'est-ce qu'un œuf BIO ?</p> <p class="text-center">Qu'est-ce qu'un œuf BIO ?</p>
<img class="loupe" src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +"> <img src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +" class="loupe">
</a> </a>
<a class="item lr" href="{{ route('egg.labelRouge', ['id' => request()->id]) }}"> <a href="{{ route('egg.labelRouge', ['id' => request()->id]) }}" class="item lr">
<img src="{{ asset('assets/images/labels/LR.png') }}" alt="Label Rouge"> <img src="{{ asset('assets/images/labels/LR.png') }}" alt="Label Rouge">
<p class="text-center">Le Label Rouge, un<br>Label de qualité</p> <p class="text-center">Le Label Rouge, un<br>Label de qualité</p>
<img class="loupe" src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +"> <img src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +" class="loupe">
</a> </a>
<a class="item" href="{{ route('egg.labelIGP', ['id' => request()->id]) }}"> <a href="{{ route('egg.labelIGP', ['id' => request()->id]) }}" class="item">
<img src="{{ asset('assets/images/labels/IGP.png') }}" alt="Indication Géographique Protégée"> <img src="{{ asset('assets/images/labels/IGP.png') }}" alt="Indication Géographique Protégée">
<p class="text-center">Une fillière locale<br>encadrée par l'Indication<br>Géographique Protégée<br>(IGP)</p> <p class="text-center">Une fillière locale<br>encadrée par l'Indication<br>Géographique Protégée<br>(IGP)</p>
<img class="loupe" src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +"> <img src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +" class="loupe">
</a> </a>
<a class="item" href="{{ route('egg.labelNutriscore', ['id' => request()->id]) }}"> <a href="{{ route('egg.labelNutriscore', ['id' => request()->id]) }}" class="item">
<img src="{{ asset('assets/images/labels/nutriscore.png') }}" alt="Nutriscore"> <img src="{{ asset('assets/images/labels/nutriscore.png') }}" alt="Nutriscore">
<p class="text-center">Les œufs de Loué sont<br>notés A au Nutri-Score</p> <p class="text-center">Les œufs de Loué sont<br>notés A au Nutri-Score</p>
<img class="loupe" src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +"> <img src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +" class="loupe">
</a> </a>
<a class="item" href="{{ route('egg.labelFermiers', ['id' => request()->id]) }}"> <a href="{{ route('egg.labelFermiers', ['id' => request()->id]) }}" class="item">
<img src="{{ asset('assets/images/labels/fermiers.png') }}" alt="Fermiers"> <img src="{{ asset('assets/images/labels/fermiers.png') }}" alt="Fermiers">
<p class="text-center">Qu'est-ce-qu'un œuf<br>"fermier" ?</p> <p class="text-center">Qu'est-ce-qu'un œuf<br>"fermier" ?</p>
<img class="loupe" src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +"> <img src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +" class="loupe">
</a> </a>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,18 +5,18 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="blue block"> <div class="block blue">
<div class="header"> <div class="header">
<p></p> <p></p>
<p>Erreur</p> <p>Erreur</p>
<p>Ne mettez pas tous vos oeufs dans le même panier ! :)</p> <p>Ne mettez pas tous vos oeufs dans le même panier ! :)</p>
</div> </div>
<div class="body egg-alert"> <div class="body egg-alert">
<img class="img-fluid" src="{{ asset('assets/images/egg/generique.jpg') }}" alt="Élevage"> <img class="img-fluid" src="{{ asset('assets/images/egg/generique.jpg') }}" alt="Élevage">
<p class="message blue">Nous n'avons pu retrouver l'éleveur concerné par votre boite.</p> <p class="message blue">Nous n'avons pu retrouver l'éleveur concerné par votre boite.</p>
<p></p> <p></p>
</div>
</div> </div>
</div> </div>
</div>
@endsection @endsection

View file

@ -5,64 +5,64 @@
@section('breadcrumb', request()->route()->getName()) @section('breadcrumb', request()->route()->getName())
@section('content') @section('content')
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])> <div class="container oldEgg">
<div class="block-fill"> <div class="block-fill">
<div class="header"> <div class="header">
<p><span>Tout connaître</span><br>de l’origine de mes œufs</p> <p><span>Tout connaître</span><br>de l’origine de mes œufs</p>
</div> </div>
<div class="body"> <div class="body">
<p class="message blue">Merci de compléter ces indications que<br>vous trouverez sur votre boîte d’œufs :</p> <p class="message blue">Merci de compléter ces indications que<br>vous trouverez sur votre boîte d’œufs :</p>
<form action="{{ route('egg.searchSubmit') }}" method="POST"> <form action="{{ route('egg.searchSubmit') }}" method="POST">
@csrf @csrf
<div class="item"> <div class="item">
<label>Code du producteur <span>A</span> :</label> <label>Code du producteur <span>A</span> :</label>
<input name="code" type="text" placeholder="Ex. 1FRJBB01" required> <input type="text" name="code" placeholder="Ex. 1FRJBB01" required>
</div> </div>
<div class="item"> <div class="item">
<label>Date de consommation<br>recommandée (DCR) <span>B</span> :</label> <label>Date de consommation<br>recommandée (DCR) <span>B</span> :</label>
<input name="date" type="text" placeholder="JJ/MM" pattern="[0-9]{2}/[0-9]{2}" required> <input type="text" name="date" placeholder="JJ/MM" pattern="[0-9]{2}/[0-9]{2}" required>
</div> </div>
<input type="submit" value="Valider"> <input type="submit" value="Valider">
</form> </form>
</div> </div>
<div class="footer d-flex justify-content-center mt-5"> <div class="footer d-flex justify-content-center mt-5">
<p>Informations sur l'oeuf :</p> <p>Informations sur l'oeuf :</p>
<div class="box"> <div class="box">
<img src="{{ asset('assets/images/egg/oeuf.png') }}" alt="Oeuf" width="70%"> <img src="{{ asset('assets/images/egg/oeuf.png') }}" alt="Oeuf" width="70%">
{{-- <p>Pondu le<br><span class="date">14/12</span></p> {{--<p>Pondu le<br><span class="date">14/12</span></p>
<p>À cons. de préf. avant le <p>À cons. de préf. avant le
<br><span class="date">11/01</span><span class="step">A</span> <br><span class="date">11/01</span><span class="step">A</span>
<br><span class="prod">1FR0PD01</span><span class="step">B</span> <br><span class="prod">1FR0PD01</span><span class="step">B</span>
</p> --}} </p>--}}
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
@endsection @endsection
@push('scripts') @push('scripts')
<script nonce="{{ $nonce }}"> <script nonce="{{ $nonce }}">
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
$(document).ready(function() { $(document).ready(function() {
$('input[name=date]').bind('keyup', 'keydown', function(e) { $('input[name=date]').bind('keyup', 'keydown', function(e) {
//To accomdate for backspacing, we detect which key was pressed - if backspace, do nothing: //To accomdate for backspacing, we detect which key was pressed - if backspace, do nothing:
if (e.which !== 8) { if (e.which !== 8) {
var numChars = $(this).val().length; var numChars = $(this).val().length;
var thisVal = $(this).val(); var thisVal = $(this).val();
if (numChars === 2) { if (numChars === 2) {
thisVal += '/'; thisVal += '/';
$(this).val(thisVal);
}
if (numChars >= 3) {
if (thisVal.charAt(2) != '/') {
thisVal = thisVal.substring(0, 2) + '/' + thisVal.substring(2);
$(this).val(thisVal); $(this).val(thisVal);
} }
if (numChars >= 3) {
if (thisVal.charAt(2) != '/') {
thisVal = thisVal.substring(0, 2) + '/' + thisVal.substring(2);
$(this).val(thisVal);
}
}
} }
}); }
}); });
}); });
</script> });
</script>
@endpush @endpush

View file

@ -6,103 +6,82 @@ use App\Http\Controllers\Fo\InfoController;
use App\Http\Controllers\Fo\TraceaPoultryController; use App\Http\Controllers\Fo\TraceaPoultryController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
Route::domain(config('app.domain'))->group(function () { // * LEGALS and POLICY
// * LEGALS and POLICY Route::view('/charte-confidentialite', 'front.pages.policy')->name('policy');
Route::view('/charte-confidentialite', 'front.pages.policy')->name('policy'); Route::view('/mentions-legales-cgu', 'front.pages.legals')->name('legals');
Route::view('/mentions-legales-cgu', 'front.pages.legals')->name('legals');
// * IFRAME Media COOKIE // * IFRAME Media COOKIE
Route::view('/frame/{type}', 'front.frame') Route::view('/frame/{type}', 'front.frame')
->where('type', 'youtube')->name('front.frame'); ->where('type', 'youtube')->name('front.frame');
// * Page éleveur (Oeuf et Volaille) // * Page éleveur (Oeuf et Volaille)
Route::get('/eleveurs/{breeder}', [BreederController::class, 'show'])->name('breeders.show'); Route::get('/eleveurs/{breeder}', [BreederController::class, 'show'])->name('breeders.show');
// * Partie Poultry // * Partie Poultry
Route::name('poultry.')->group(function () { Route::name('poultry.')->group(function () {
Route::view('/', 'front.poultry.search')->name('search'); Route::view('/', 'front.poultry.search')->name('search');
Route::post('/', [TraceaPoultryController::class, 'searchSubmit'])->name('searchSubmit'); Route::post('/', [TraceaPoultryController::class, 'searchSubmit'])->name('searchSubmit');
Route::get('tracabilite/volaille', [TraceaPoultryController::class, 'show'])->name('show'); Route::get('tracabilite/volaille', [TraceaPoultryController::class, 'show'])->name('show');
Route::get('tracabilite/volaille/distribution', [TraceaPoultryController::class, 'getDistribution']) Route::get('tracabilite/volaille/distribution', [TraceaPoultryController::class, 'getDistribution'])
->name('distribution'); ->name('distribution');
Route::get('tracabilite/volaille/info', [InfoController::class, 'poultry'])->name('infos'); Route::get('tracabilite/volaille/info', [InfoController::class, 'poultry'])->name('infos');
Route::get( Route::get(
'tracabilite/volaille/info/des-poulets-libres-par-nature', 'tracabilite/volaille/info/des-poulets-libres-par-nature',
[InfoController::class, 'poultryFreeChicken'] [InfoController::class, 'poultryFreeChicken']
)->name('infos.freeChicken'); )->name('infos.freeChicken');
Route::get( Route::get(
'tracabilite/volaille/info/quest-ce-quun-poulet-fermier-de-loue', 'tracabilite/volaille/info/quest-ce-quun-poulet-fermier-de-loue',
[InfoController::class, 'poultryFarmChicken'] [InfoController::class, 'poultryFarmChicken']
)->name('infos.farmChiken'); )->name('infos.farmChiken');
Route::get( Route::get(
'tracabilite/volaille/alimentation/bio', 'tracabilite/volaille/alimentation/bio',
[InfoController::class, 'poultryBio'] [InfoController::class, 'poultryBio']
)->name('food.bio'); )->name('food.bio');
Route::get( Route::get(
'tracabilite/volaille/alimentation/label-rouge', 'tracabilite/volaille/alimentation/label-rouge',
[InfoController::class, 'poultryLr'] [InfoController::class, 'poultryLr']
)->name('food.lr'); )->name('food.lr');
Route::name('labels.')->prefix('/tracabilite/volaille/labels')->group(function () { Route::name('labels.')->prefix('/tracabilite/volaille/labels')->group(function () {
Route::view('/ab', 'front.poultry.labels.ab')->name('ab'); Route::view('/ab', 'front.poultry.labels.ab')->name('ab');
Route::view('/lr', 'front.poultry.labels.lr')->name('lr'); Route::view('/lr', 'front.poultry.labels.lr')->name('lr');
Route::view( Route::view('/bea', 'front.poultry.labels.bea')->name('bea');
'/bea', Route::view('/igp', 'front.poultry.labels.igp')->name('igp');
'front.poultry.labels.bea' Route::view('/nutriscore', 'front.poultry.labels.nutriscore')->name('nutriscore');
)->name('bea'); Route::view('/planet-score', 'front.poultry.labels.planet-score')->name('planet-score');
Route::view(
'/igp',
'front.poultry.labels.igp'
)->name('igp');
Route::view('/nutriscore', 'front.poultry.labels.nutriscore')->name('nutriscore');
Route::view('/planet-score', 'front.poultry.labels.planet-score')->name('planet-score');
});
});
// * Partie Egg
Route::prefix('/oeuf')->name('egg.')->group(function () {
Route::view('/search', 'front.egg.search')->name('search');
Route::post('/find-my-box', [EggController::class, 'findMyBox'])->name('searchSubmit');
// * LABELS
Route::view('/{id}/labels-et-certifications', 'front.egg.labels_and_certifs')->name('labelCertif');
Route::view('/{id}/label-rouge', 'front.egg.labels.label_rouge')->name('labelRouge');
Route::view('/{id}/label-bio', 'front.egg.labels.label_bio')->name('labelBio');
Route::view('/{id}/label-igp', 'front.egg.labels.igp')->name('labelIGP');
Route::view('/{id}/label-nutriscore', 'front.egg.labels.nutriscore')->name('labelNutriscore');
Route::view('/{id}/label-fermiers', 'front.egg.labels.fermiers')->name('labelFermiers');
// * INFOS ELEVAGE
Route::view('/{id}/infos-elevages', 'front.egg.infos_elevages')->name('infoElevage');
Route::view('/{id}/differences-oeufs', 'front.egg.elevages.vs_oeufs')->name('infoDiffOeufs');
Route::view('/{id}/elevage-liberte', 'front.egg.elevages.elevage_liberte')->name('infoElevageLib');
// * ALIMENTATION
Route::view('/{id}/details-alimentation', 'front.egg.details-alimentation')->name('infoAlim');
// * EMBALLAGE
Route::view('/{id}/details-emballage', 'front.egg.details-emballage')->name('infoEmballage');
// * ELEVEURS
Route::get('/{id}/portrait-eleveur/{eleveurId}', [EggController::class, 'eleveurPortrait'])
->name('portraitEleveur');
Route::get('/{id}', [EggController::class, 'indexId'])->name('FrontPage');
}); });
}); });
Route::domain(config('app.egg_domain'))->group(function () { // * Partie Egg
Route::get('/{id}', function ($id) { Route::prefix('/oeuf')->name('egg.')->group(function () {
return redirect(config('app.url') . route('egg.FrontPage', ['id' => $id], false)); Route::view('/search', 'front.egg.search')->name('search');
}); Route::post('/find-my-box', [EggController::class, 'findMyBox'])->name('searchSubmit');
});
Route::fallback(function () { // * LABELS
if (request()->getHost() === config('app.egg_domain')) { Route::view('/{id}/labels-et-certifications', 'front.egg.labels_and_certifs')->name('labelCertif');
return redirect(config('app.url'));
} Route::view('/{id}/label-rouge', 'front.egg.labels.label_rouge')->name('labelRouge');
abort(404); Route::view('/{id}/label-bio', 'front.egg.labels.label_bio')->name('labelBio');
Route::view('/{id}/label-igp', 'front.egg.labels.igp')->name('labelIGP');
Route::view('/{id}/label-nutriscore', 'front.egg.labels.nutriscore')->name('labelNutriscore');
Route::view('/{id}/label-fermiers', 'front.egg.labels.fermiers')->name('labelFermiers');
// * INFOS ELEVAGE
Route::view('/{id}/infos-elevages', 'front.egg.infos_elevages')->name('infoElevage');
Route::view('/{id}/differences-oeufs', 'front.egg.elevages.vs_oeufs')->name('infoDiffOeufs');
Route::view('/{id}/elevage-liberte', 'front.egg.elevages.elevage_liberte')->name('infoElevageLib');
// * ALIMENTATION
Route::view('/{id}/details-alimentation', 'front.egg.details-alimentation')->name('infoAlim');
// * EMBALLAGE
Route::view('/{id}/details-emballage', 'front.egg.details-emballage')->name('infoEmballage');
// * ELEVEURS
Route::get('/{id}/portrait-eleveur/{eleveurId}', [EggController::class, 'eleveurPortrait'])
->name('portraitEleveur');
Route::get('/{id}', [EggController::class, 'indexId'])->name('FrontPage');
}); });