Compare commits
No commits in common. "master" and "fixCafelTempFileReleaseFileDescriptor" have entirely different histories.
master
...
fixCafelTe
41 changed files with 4937 additions and 6089 deletions
|
|
@ -3,7 +3,6 @@ APP_ENV=local
|
|||
APP_KEY=
|
||||
APP_DEBUG=true
|
||||
APP_URL=http://localhost
|
||||
APP_DOMAIN=
|
||||
|
||||
LOG_CHANNEL=stack
|
||||
|
||||
|
|
@ -38,6 +37,7 @@ CAFEL_PASSWORD=
|
|||
MAIL_INVALID_CAFEL_DATA=equipe.web@ldc.fr
|
||||
MAIL_INVALID_CAFEL_DATA_IMAGE=equipe.web@ldc.fr
|
||||
MAIL_INVALID_XML=equipe.web@ldc.fr
|
||||
MAIL_LIST_SERVICEWEB=equipe.web@ldc.fr
|
||||
|
||||
## LDC WEB STATUS CHECKER
|
||||
LDC_STATUS_CHECKER_API_KEY="MY_KEY"
|
||||
|
|
@ -45,9 +45,6 @@ LDC_STATUS_CHECKER_UUID="UUID_PROJECT"
|
|||
## LDC WEB ADMIN SECURE
|
||||
LDC_WEB_API_KEY="MY_KEY"
|
||||
|
||||
|
||||
## GOOGLE
|
||||
ANALYTICS_GOOGLE_ID=
|
||||
|
||||
# TERRE D'ACTION MODAL (YYYY-MM-DD)
|
||||
TERRE_ACTION_START_DATE=
|
||||
TERRE_ACTION_END_DATE=
|
||||
|
|
|
|||
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -18,4 +18,3 @@ Homestead.json
|
|||
Homestead.yaml
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
auth.json
|
||||
|
|
@ -1,12 +1,46 @@
|
|||
include:
|
||||
- project: 'ldc-web/shared-ci'
|
||||
ref: 'main'
|
||||
file: 'lint/lint7.3.yml'
|
||||
- project: 'ldc-web/shared-ci'
|
||||
ref: 'main'
|
||||
file: 'security/security7.3.yml'
|
||||
|
||||
image: $CI_REGISTRY/service-web-lab/ldc-web-images-docker/ldcweb-qa:php7.3-1.0
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -1,11 +0,0 @@
|
|||
## Comportement constaté
|
||||
|
||||
|
||||
## Comportement attendu
|
||||
|
||||
|
||||
## Solution envisagée
|
||||
|
||||
|
||||
## Étapes pour la reproduction du bug
|
||||
*
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
## Présentation du besoin
|
||||
|
||||
|
||||
## Implémentation
|
||||
|
||||
|
||||
## Maquettes, documentations...
|
||||
|
|
@ -30,11 +30,11 @@ class Kernel extends ConsoleKernel
|
|||
protected function schedule(Schedule $schedule)
|
||||
{
|
||||
// * Jobs cafel sur queue cafel
|
||||
$schedule->job(CafelFoodJob::class, 'cafel')->onOneServer()->dailyAt('22h30');
|
||||
$schedule->job(CafelBeaVolJob::class, 'cafel')->onOneServer()->dailyAt('22h45');
|
||||
$schedule->job(CafelMepEggJob::class, 'cafel')->onOneServer()->dailyAt('23h00');
|
||||
$schedule->job(CafelEggBreederJob::class, 'cafel')->onOneServer()->dailyAt('23h15');
|
||||
$schedule->job(CafelPoultryBreederJob::class, 'cafel')->onOneServer()->dailyAt('23h30');
|
||||
$schedule->job(CafelFoodJob::class, 'cafel')->onOneServer()->everyThreeHours();
|
||||
$schedule->job(CafelBeaVolJob::class, 'cafel')->onOneServer()->everyThreeHours();
|
||||
$schedule->job(CafelMepEggJob::class, 'cafel')->onOneServer()->everyThreeHours();
|
||||
$schedule->job(CafelEggBreederJob::class, 'cafel')->onOneServer()->everyThreeHours();
|
||||
$schedule->job(CafelPoultryBreederJob::class, 'cafel')->onOneServer()->everyThreeHours();
|
||||
|
||||
$schedule->job(XmlFluxEggJob::class, 'tracea')->onOneServer()->dailyAt('02:00');
|
||||
$schedule->job(XmlFluxPoultryJob::class, 'tracea')->onOneServer()->dailyAt('22:00');
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@ namespace App\Exceptions;
|
|||
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Mail;
|
||||
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
||||
use Sentry\Laravel\Integration;
|
||||
use Throwable;
|
||||
use Kwaadpepper\ExceptionHandler\Exceptions\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
|
||||
*/
|
||||
public function register()
|
||||
public function report(Throwable $exception)
|
||||
{
|
||||
$this->reportable(function (\Throwable $e) {
|
||||
if ($e instanceof CafelApiImageFetchException) {
|
||||
$this->reportCafelApiImageErrorException($e);
|
||||
if ($exception instanceof CafelApiImageFetchException) {
|
||||
$this->reportCafelApiImageErrorException($exception);
|
||||
return;
|
||||
}
|
||||
Integration::captureUnhandledException($e);
|
||||
});
|
||||
parent::report($exception);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ class EggController extends Controller
|
|||
$mobas = TraceaEgg::where('box_code', $id)->orderBy('box_code', 'DESC')->first();
|
||||
|
||||
if (!$mobas) {
|
||||
return redirect()->route('egg.search');
|
||||
return redirect('/search');
|
||||
}
|
||||
|
||||
$edes = $mobas->code_edes;
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@ class TrustHosts extends Middleware
|
|||
public function hosts()
|
||||
{
|
||||
return [
|
||||
\config('app.egg_domain'),
|
||||
$this->allSubdomainsOfApplicationUrl(),
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ class RemoveOldXmlEntries
|
|||
}
|
||||
try {
|
||||
$q = TraceaEgg::query();
|
||||
$q->where('dcr', '<=', now()->subMonths(config('tracea.keepEggMonths', 12)));
|
||||
$q->where('dcr', '<=', now()->subMonths(config('tracea.keepEggMonths', 12)))->destroy();
|
||||
$q->delete();
|
||||
} catch (\Exception $e) {
|
||||
report($e);
|
||||
|
|
|
|||
|
|
@ -3,8 +3,6 @@
|
|||
namespace App\Jobs;
|
||||
|
||||
use App\Lib\CafelApi\Models\CafelClientModel;
|
||||
use GuzzleHttp\Exception\ConnectException;
|
||||
use GuzzleHttp\Exception\RequestException;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
|
|
@ -86,11 +84,7 @@ abstract class CafelJobs implements ShouldQueue
|
|||
$attribute => collect($messages)->implode(', ') . $verifiedValue
|
||||
];
|
||||
})->implode(' '))->all();
|
||||
} catch (ConnectException | RequestException $e) {
|
||||
// ! Guzzle SSL Error connection failure
|
||||
\report($e);
|
||||
$this->invalidRows[] = collect($row)->put('validation_message', $e->getMessage())->all();
|
||||
}//end try
|
||||
}
|
||||
}//end foreach
|
||||
} while (!empty($result));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -99,8 +99,8 @@ class CafelEggBreeder extends Model
|
|||
{
|
||||
// * EVENT CLOSURES.
|
||||
static::creating(function (self $model) {
|
||||
self::areInuavCodesUniques($model);
|
||||
self::isEdeCodeUnique($model);
|
||||
return self::areInuavCodesUniques($model);
|
||||
return self::isEdeCodeUnique($model);
|
||||
});
|
||||
static::updating(function (self $model) {
|
||||
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) {
|
||||
Storage::delete(\public_path($model->getRawOriginal('path_picture_2')));
|
||||
}
|
||||
self::areInuavCodesUniques($model);
|
||||
self::isEdeCodeUnique($model);
|
||||
return self::areInuavCodesUniques($model);
|
||||
return self::isEdeCodeUnique($model);
|
||||
});
|
||||
static::deleting(function (self $model) {
|
||||
if ($model->getRawOriginal('path_picture_1')) {
|
||||
|
|
|
|||
|
|
@ -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
5
auth.json
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"gitlab-token": {
|
||||
"gitlab.com": "glpat-gbNVMUd6T2kaB5eii7TZ"
|
||||
}
|
||||
}
|
||||
|
|
@ -17,16 +17,16 @@
|
|||
"fideloper/proxy": "^4.0",
|
||||
"guzzlehttp/guzzle": "^7.4",
|
||||
"kwaadpepper/enum": "^2.1",
|
||||
"kwaadpepper/exception-handler": "^0.0.6",
|
||||
"kwaadpepper/refresh-sitemap": "^1.0",
|
||||
"laravel/framework": "^8.0",
|
||||
"laravel/tinker": "^2.0",
|
||||
"laravel/ui": "^3.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",
|
||||
"mews/purifier": "^3.3",
|
||||
"nesbot/carbon": "^2.29",
|
||||
"sentry/sentry-laravel": "^3.1",
|
||||
"spatie/laravel-mix-preload": "^1.3"
|
||||
},
|
||||
"require-dev": {
|
||||
|
|
@ -45,10 +45,7 @@
|
|||
"sort-packages": true,
|
||||
"allow-plugins": {
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true
|
||||
},
|
||||
"gitlab-domains": [
|
||||
"lab.s-web.fr"
|
||||
]
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"laravel": {
|
||||
|
|
@ -82,9 +79,9 @@
|
|||
]
|
||||
},
|
||||
"repositories": {
|
||||
"lab.s-web.fr": {
|
||||
"gitlab.com/16669037": {
|
||||
"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
2185
composer.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -53,8 +53,6 @@ return [
|
|||
*/
|
||||
|
||||
'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),
|
||||
|
||||
|
|
@ -177,7 +175,6 @@ return [
|
|||
App\Providers\AuthServiceProvider::class,
|
||||
App\Providers\EventServiceProvider::class,
|
||||
App\Providers\RouteServiceProvider::class,
|
||||
App\Providers\ViewServiceProvider::class,
|
||||
|
||||
],
|
||||
|
||||
|
|
@ -237,4 +234,7 @@ return [
|
|||
'CafelPoultryBreeder' => \App\Models\CafelPoultryBreeder::class,
|
||||
|
||||
],
|
||||
|
||||
'project_uuid' => env('PROJECT_UUID'),
|
||||
|
||||
];
|
||||
|
|
|
|||
15
config/exception-handler.php
Normal file
15
config/exception-handler.php
Normal 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')),
|
||||
];
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
<?php
|
||||
|
||||
return [
|
||||
'terreActionStartDate' => env('TERRE_ACTION_START_DATE'),
|
||||
'terreActionEndDate' => env('TERRE_ACTION_END_DATE')
|
||||
];
|
||||
|
|
@ -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
5140
package-lock.json
generated
5140
package-lock.json
generated
File diff suppressed because it is too large
Load diff
2
resources/js/alert.js
vendored
2
resources/js/alert.js
vendored
|
|
@ -10,7 +10,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||
imageHeight: 200,
|
||||
imageAlt: 'Logo Loué terre d\'action',
|
||||
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',
|
||||
showCloseButton: true,
|
||||
})
|
||||
|
|
|
|||
21
resources/sass/front.scss
vendored
21
resources/sass/front.scss
vendored
|
|
@ -1,19 +1,19 @@
|
|||
// 1. Include new custom variables
|
||||
// Variables
|
||||
@import 'variables';
|
||||
|
||||
|
||||
// 2. Include functions first (so you can manipulate colors, SVGs, calc, etc)
|
||||
@import "~bootstrap/scss/functions";
|
||||
// 1. Include functions first (so you can manipulate colors, SVGs, calc, etc)
|
||||
@import '~bootstrap/scss/functions';
|
||||
|
||||
// 2. Include any default variable overrides here
|
||||
|
||||
// 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/type';
|
||||
@import '~bootstrap/scss/images';
|
||||
|
|
@ -27,9 +27,6 @@
|
|||
@import '~bootstrap/scss/alert';
|
||||
@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
|
||||
.text-break {
|
||||
overflow-wrap: break-word !important;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page yellow">
|
||||
<header>
|
||||
<a href="{{route('egg.FrontPage', ['id' => request()->id])}}">
|
||||
|
|
@ -18,17 +18,15 @@
|
|||
<p class="title">De quoi est composée l'alimentation des poules ?</p>
|
||||
<div class="box">
|
||||
@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
|
||||
<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
|
||||
</div>
|
||||
<p class="title">D'où proviennent les céréales ?</p>
|
||||
<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
|
||||
Fermiers de Loué, ALIFEL, pour les transformer en alimentation pour poules, qui sera ensuite retournée à l’éleveur.
|
||||
</p>
|
||||
<img class="circuit" src="{{ asset('assets/images/parts/circuit_alimentation.png') }}" alt="Circuit Alimentation">
|
||||
<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>
|
||||
<img src="{{ asset('assets/images/parts/circuit_alimentation.png') }}" alt="Circuit Alimentation" class="circuit">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page emballage">
|
||||
<header>
|
||||
<a href="{{route('egg.FrontPage', ['id' => request()->id])}}">
|
||||
|
|
@ -16,10 +16,8 @@
|
|||
<div class="container">
|
||||
<div class="details-alimentation">
|
||||
<div class="box">
|
||||
<img class="oeuf" src="{{ asset('assets/images/egg/LOGO_LOEUF.png') }}" alt="Logo l'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
|
||||
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>
|
||||
<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 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>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page elevage">
|
||||
<header>
|
||||
<a href="{{route('egg.infoElevage', ['id' => request()->id])}}">
|
||||
|
|
@ -18,9 +18,7 @@
|
|||
<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é">
|
||||
<div class="items">
|
||||
<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>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page elevage">
|
||||
<header>
|
||||
<a href="{{route('egg.FrontPage', ['id' => request()->id])}}">
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
<div class="container">
|
||||
<div class="portrait-eleveur">
|
||||
<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">
|
||||
@else
|
||||
<img src="{{ asset('assets/images/parts/generique_portrait.jpg') }}" alt="Éleveur">
|
||||
|
|
@ -35,19 +35,15 @@
|
|||
@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
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page elevage">
|
||||
<header>
|
||||
<a href="{{route('egg.infoElevage', ['id' => request()->id])}}">
|
||||
|
|
@ -17,8 +17,7 @@
|
|||
<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>
|
||||
<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
|
||||
d’identification (code 1), de grandes différences existent :</p>
|
||||
<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>
|
||||
<div class="tables">
|
||||
<div class="table">
|
||||
<table>
|
||||
|
|
@ -39,7 +38,7 @@
|
|||
</tr>
|
||||
<tr>
|
||||
<td><img src="{{ asset('assets/images/egg/ble.png') }}" alt="Céréales"></td>
|
||||
<td>65 % de céréales locales minimum</td>
|
||||
<td>65 % de céréales locales minimu, sans OGM (< 0,9%) </td>
|
||||
<td>Aucune garantie sur l’alimentation des poules</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
|
|
|||
|
|
@ -5,17 +5,15 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="{{ Session::get('subColor') }} block">
|
||||
<div class="container oldEgg">
|
||||
<div class="block {{ Session::get('subColor') }}">
|
||||
<div class="header">
|
||||
<p>Vous venez de scanner :</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 class="body">
|
||||
@if ($dataVisuel)
|
||||
<img class="box_img" src="{{ asset($dataVisuel->path) }}" alt="œufs">
|
||||
@endif
|
||||
<img src="{{ asset($dataVisuel->path) }}" alt="œufs" class="box_img">
|
||||
<div class="date">
|
||||
<p>Ces œufs ont été pondus le :</p>
|
||||
<p>{{ Carbon\Carbon::parse($datePonte)->format('d/m/Y') }}</p>
|
||||
|
|
@ -25,18 +23,16 @@
|
|||
<p>{{ Carbon\Carbon::parse($dcr)->format('d/m/Y') }}</p>
|
||||
</div>
|
||||
@if (!$dcrGood)
|
||||
<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>
|
||||
<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 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>
|
||||
<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
|
||||
|
||||
<div class="labels">
|
||||
<a class="lr" href="{{ route('egg.labelRouge', ['id' => request()->id]) }}">
|
||||
<img class="lr" src="{{ asset('assets/images/labels/LR.png') }}" alt="Label Rouge">
|
||||
<a href="{{route('egg.labelRouge', ['id' => request()->id])}}" class="lr">
|
||||
<img src="{{ asset('assets/images/labels/LR.png') }}" alt="Label Rouge" class="lr">
|
||||
</a>
|
||||
<a class="bio" href="{{ route('egg.labelBio', ['id' => request()->id]) }}">
|
||||
<img class="bio" src="{{ asset('assets/images/labels/AB.png') }}" alt="Agriculture Biologique">
|
||||
<a href="{{route('egg.labelBio', ['id' => request()->id])}}" class="bio">
|
||||
<img src="{{ asset('assets/images/labels/AB.png') }}" alt="Agriculture Biologique" class="bio">
|
||||
</a>
|
||||
<a href="{{route('egg.labelIGP', ['id' => request()->id])}}">
|
||||
<img src="{{ asset('assets/images/labels/IGP.png') }}" alt="Indication Géographique Protégée">
|
||||
|
|
@ -54,7 +50,7 @@
|
|||
<p>Les Labels et les Certifications</p>
|
||||
</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)
|
||||
<div class="elevage" id="content">
|
||||
|
|
@ -68,23 +64,21 @@
|
|||
@endif
|
||||
<div class="title">
|
||||
<p>Ces poules ont été élevées en liberté</p>
|
||||
<a href="{{ route('egg.infoElevage', ['id' => $id]) }}"><img
|
||||
src="{{ asset('assets/images/egg/picto_info_elevage.png') }}" alt="Info"></a>
|
||||
<a href="{{route('egg.infoElevage', ['id' => $id])}}"><img src="{{ asset('assets/images/egg/picto_info_elevage.png') }}" alt="Info"></a>
|
||||
</div>
|
||||
<div class="details">
|
||||
<p class="by">
|
||||
<span class="green">PAR : </span> {{$eleveurs[0]->firstname}} {{$eleveurs[0]->lastname}} <br>
|
||||
<span class="green">À : </span> {{$eleveurs[0]->city}} ({{$eleveurs[0]->postcode}})
|
||||
</p>
|
||||
@if (isset($eleveurs[0]->path_picture_1) && $eleveurs[0]->path_picture_1 != '')
|
||||
<img class="img-fluid" src="{{ asset($eleveurs[0]->path_picture_1) }}" alt="Élevage">
|
||||
@if (isset($eleveurs[0]->path_photo1) && $eleveurs[0]->path_photo1 != '')
|
||||
<img class="img-fluid" src="{{ asset($eleveurs[0]->path_photo1) }}" alt="Élevage">
|
||||
@else
|
||||
<img class="img-fluid" src="{{ asset('assets/images/egg/generique.jpg') }}" alt="Élevage">
|
||||
@endif
|
||||
<div class="bottom one">
|
||||
@if ($eleveurs[0]->questions)
|
||||
<a href="{{ route('egg.portraitEleveur', ['id' => $id, 'eleveurId' => $eleveurs[0]->cafel_code]) }}">en savoir
|
||||
+ sur</a>
|
||||
<a href="{{route('egg.portraitEleveur', ['id' => $id, 'eleveurId' => $eleveurs[0]->cafel_code])}}">en savoir + sur</a>
|
||||
@endif
|
||||
<p>{{$eleveurs[0]->firstname}} {{$eleveurs[0]->lastname}}</p>
|
||||
</div>
|
||||
|
|
@ -104,8 +98,7 @@
|
|||
|
||||
<div class="title">
|
||||
<p>Ces poules ont été élevées en liberté</p>
|
||||
<a href="{{ route('egg.infoElevage', ['id' => $id]) }}"><img
|
||||
src="{{ asset('assets/images/egg/picto_info_elevage.png') }}" alt="Info"></a>
|
||||
<a href="{{ route('egg.infoElevage', ['id' => $id]) }}"><img src="{{ asset('assets/images/egg/picto_info_elevage.png') }}" alt="Info"></a>
|
||||
</div>
|
||||
<div class="details">
|
||||
<p class="by">
|
||||
|
|
@ -119,12 +112,9 @@
|
|||
<div class="bottom multiple">
|
||||
@foreach ($eleveurs as $eleveur)
|
||||
@if ($eleveur->questions)
|
||||
<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>
|
||||
<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>
|
||||
@else
|
||||
<div class="disabled">{{ $eleveur->firstname }} {{ $eleveur->lastname }} <br> <span
|
||||
class="light">{{ $eleveur->city }} ({{ $eleveur->postcode }})</span></div>
|
||||
<div class="disabled">{{$eleveur->firstname}} {{$eleveur->lastname}} <br> <span class="light">{{$eleveur->city}} ({{$eleveur->postcode}})</span></div>
|
||||
@endif
|
||||
@endforeach
|
||||
</div>
|
||||
|
|
@ -136,14 +126,13 @@
|
|||
<p class="title">Alimentation</p>
|
||||
<div class="box">
|
||||
<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>
|
||||
<p class="infos"><span class="yellow">Usine d'aliment : </span><br>ALIFEL, 72540 Loué</p>
|
||||
@if (isset($aliment) && !empty($aliment))
|
||||
<p class="infos"><span class="yellow">Dernière livraison :
|
||||
</span><br>{{ Carbon\Carbon::parse($aliment->date_livraison)->format('d/m/Y') }}</p>
|
||||
<p class="infos"><span class="yellow">Dernière livraison : </span><br>{{ Carbon\Carbon::parse($aliment->date_livraison)->format('d/m/Y') }}</p>
|
||||
@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">
|
||||
<a href="{{route('egg.infoAlim', ['id' => $id])}}">en savoir +</a>
|
||||
</div>
|
||||
|
|
@ -154,8 +143,7 @@
|
|||
<div class="box">
|
||||
<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="description">Chaque œuf est vérifié et trié individuellement, puis emballé dans des boîtes recyclées et recyclables.
|
||||
</p>
|
||||
<p class="description">Chaque œuf est vérifié et trié individuellement, puis emballé dans des boîtes recyclées et recyclables.</p>
|
||||
<img src="{{ asset('assets/images/egg/Photo-LOEUF.jpg') }}" alt="Logo">
|
||||
<div class="bottom">
|
||||
<a href="{{route('egg.infoEmballage', ['id' => $id])}}">en savoir + sur</a>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page elevage">
|
||||
<header>
|
||||
<a href="{{route('egg.FrontPage', ['id' => request()->id])}}">
|
||||
|
|
@ -18,19 +18,17 @@
|
|||
<p class="title">Infos pratiques</p>
|
||||
<div class="items">
|
||||
<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">
|
||||
<p>Un mode d'élevage en liberté, qu'est-ce que cela signifie ?</p>
|
||||
<a href="{{ route('egg.infoElevageLib', ['id' => request()->id]) }}"><img
|
||||
src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +"></a>
|
||||
<a href="{{ route('egg.infoElevageLib', ['id' => request()->id]) }}"><img src="{{ asset('assets/images/egg/loupe.png') }}" alt="En savoir +"></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="item">
|
||||
<img class="top-img" src="{{ asset('assets/images/egg/infos-elevages-2.jpg') }}" alt="Différence entre les œufs">
|
||||
<img src="{{ asset('assets/images/egg/infos-elevages-2.jpg') }}" alt="Différence entre les œufs" class="top-img">
|
||||
<div class="text">
|
||||
<p>Quelle différence entre un œuf plein air et un œuf fermier IGP Label Rouge de Loué ?</p>
|
||||
<a href="{{ route('egg.infoDiffOeufs', ['id' => request()->id]) }}"><img
|
||||
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>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page {{ Session::get('subColor') }}">
|
||||
<header>
|
||||
<a href="{{route('egg.labelCertif', ['id' => request()->id])}}">
|
||||
|
|
@ -17,12 +17,11 @@
|
|||
<div class="labels-and-certifs">
|
||||
<div class="label-fermiers">
|
||||
<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>
|
||||
<p class="title">Qu’est-ce-qu’un œuf «fermier» ?</p>
|
||||
<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 à
|
||||
un cahier des charges bien précis. Pour en bénéficier, 5 critères sont à respecter :</p>
|
||||
<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>
|
||||
<div class="items">
|
||||
<div class="item">
|
||||
<img src="{{ asset('assets/images/egg/poule.png') }}" alt="Poule">
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page {{ Session::get('subColor') }}">
|
||||
<header>
|
||||
<a href="{{route('egg.labelCertif', ['id' => request()->id])}}">
|
||||
|
|
@ -17,15 +17,13 @@
|
|||
<div class="labels-and-certifs">
|
||||
<div class="label-igp">
|
||||
<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>
|
||||
<p class="title">Une filière locale encadrée par l’Indication Géographique Protégée (IGP)</p>
|
||||
<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
|
||||
zone d’élevage délimitée.
|
||||
<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.
|
||||
<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é situé en Sarthe (72).
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page {{ Session::get('subColor') }}">
|
||||
<header>
|
||||
<a href="{{route('egg.labelCertif', ['id' => request()->id ])}}">
|
||||
|
|
@ -17,23 +17,19 @@
|
|||
<div class="labels-and-certifs">
|
||||
<div class="label-bio">
|
||||
<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>
|
||||
<p class="title">Qu'est-ce qu'un œuf BIO ?</p>
|
||||
<div class="box">
|
||||
<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.
|
||||
<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.
|
||||
<br>
|
||||
Ce Label permet aux Fermiers de Loué d’aller encore plus loin dans le respect de l’environnement et du bien-être
|
||||
animal.
|
||||
</p>
|
||||
<p>Les œufs de Loué sont exclusivement des œufs de poules élevées en liberté, Label Rouge (code 1) ou Bio (code 0).
|
||||
Ce Label permet aux Fermiers de Loué d’aller encore plus loin dans le respect de l’environnement et du bien-être animal.
|
||||
</p>
|
||||
<p>Les œufs de Loué sont exclusivement des œufs de poules élevées en liberté, Label Rouge (code 1) ou Bio (code 0).</p>
|
||||
</div>
|
||||
<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>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page {{ Session::get('subColor') }}">
|
||||
<header>
|
||||
<a href="{{route('egg.labelCertif', ['id' => request()->id ])}}">
|
||||
|
|
@ -17,20 +17,16 @@
|
|||
<div class="labels-and-certifs">
|
||||
<div class="label-rouge">
|
||||
<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>
|
||||
<p class="title">Le Label Rouge, un Label de qualité</p>
|
||||
<div class="box">
|
||||
<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>
|
||||
<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>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>
|
||||
<p>Les œufs de Loué sont exclusivement des œufs de poules élevées en liberté, Label Rouge (code 1) ou Bio (code 0).</p>
|
||||
</div>
|
||||
<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>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page {{ Session::get('subColor') }}">
|
||||
<header>
|
||||
<a href="{{route('egg.labelCertif', ['id' => request()->id])}}">
|
||||
|
|
@ -17,19 +17,15 @@
|
|||
<div class="labels-and-certifs">
|
||||
<div class="label-nutriscore">
|
||||
<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>
|
||||
<p class="title">Les œufs de Loué sont notés A au Nutri-Score</p>
|
||||
<div class="box">
|
||||
<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>
|
||||
<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>
|
||||
</div>
|
||||
<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>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="sub-page {{ Session::get('subColor') }}">
|
||||
<header>
|
||||
<a href="{{route('egg.FrontPage', ['id' => request()->id])}}">
|
||||
|
|
@ -17,30 +17,30 @@
|
|||
<div class="labels-and-certifs">
|
||||
<div class="menu">
|
||||
<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">
|
||||
<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 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">
|
||||
<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 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">
|
||||
<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 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">
|
||||
<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 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">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="blue block">
|
||||
<div class="container oldEgg">
|
||||
<div class="block blue">
|
||||
<div class="header">
|
||||
<p></p>
|
||||
<p>Erreur</p>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
@section('breadcrumb', request()->route()->getName())
|
||||
|
||||
@section('content')
|
||||
<div @class(['container', 'oldEgg' => $isDisplayedTAModal])>
|
||||
<div class="container oldEgg">
|
||||
<div class="block-fill">
|
||||
<div class="header">
|
||||
<p><span>Tout connaître</span><br>de l’origine de mes œufs</p>
|
||||
|
|
@ -16,11 +16,11 @@
|
|||
@csrf
|
||||
<div class="item">
|
||||
<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 class="item">
|
||||
<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>
|
||||
|
||||
<input type="submit" value="Valider">
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ use App\Http\Controllers\Fo\InfoController;
|
|||
use App\Http\Controllers\Fo\TraceaPoultryController;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::domain(config('app.domain'))->group(function () {
|
||||
// * LEGALS and POLICY
|
||||
Route::view('/charte-confidentialite', 'front.pages.policy')->name('policy');
|
||||
Route::view('/mentions-legales-cgu', 'front.pages.legals')->name('legals');
|
||||
|
|
@ -45,14 +44,8 @@ Route::domain(config('app.domain'))->group(function () {
|
|||
Route::name('labels.')->prefix('/tracabilite/volaille/labels')->group(function () {
|
||||
Route::view('/ab', 'front.poultry.labels.ab')->name('ab');
|
||||
Route::view('/lr', 'front.poultry.labels.lr')->name('lr');
|
||||
Route::view(
|
||||
'/bea',
|
||||
'front.poultry.labels.bea'
|
||||
)->name('bea');
|
||||
Route::view(
|
||||
'/igp',
|
||||
'front.poultry.labels.igp'
|
||||
)->name('igp');
|
||||
Route::view('/bea', 'front.poultry.labels.bea')->name('bea');
|
||||
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');
|
||||
});
|
||||
|
|
@ -92,17 +85,3 @@ Route::domain(config('app.domain'))->group(function () {
|
|||
|
||||
Route::get('/{id}', [EggController::class, 'indexId'])->name('FrontPage');
|
||||
});
|
||||
});
|
||||
|
||||
Route::domain(config('app.egg_domain'))->group(function () {
|
||||
Route::get('/{id}', function ($id) {
|
||||
return redirect(config('app.url') . route('egg.FrontPage', ['id' => $id], false));
|
||||
});
|
||||
});
|
||||
|
||||
Route::fallback(function () {
|
||||
if (request()->getHost() === config('app.egg_domain')) {
|
||||
return redirect(config('app.url'));
|
||||
}
|
||||
abort(404);
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue