Compare commits

..

81 commits

Author SHA1 Message Date
Jérémy Munsch
c66cdbb8b5
Merge branch 'trunk' 2022-12-12 13:26:00 +01:00
Jérémy Munsch
858d5f1e4c
Merge branch 'develop' into trunk 2022-12-12 13:24:05 +01:00
Jérémy Munsch
8e4b9e2014
bump composer 2022-12-12 13:22:06 +01:00
Jérémy Munsch
9f5159c964
fix Cors 2022-12-12 13:21:44 +01:00
Jérémy Munsch
b374f957da
Merge branch 'hotfix' into develop 2022-10-27 09:13:24 +02:00
Jérémy Munsch
ee16395d6c
Merge branch 'hotfix' 2022-10-27 09:13:19 +02:00
Jérémy Munsch
3ab8003e02
Go sync to dispatch Lockdown 2022-10-27 09:13:10 +02:00
Jérémy Munsch
d9aa9be2c5
Fix mail inversion locked Down 2022-10-27 09:11:29 +02:00
Jérémy Munsch
b4322eeb8f
Merge branch 'trunk' 2022-06-30 15:27:26 +02:00
Jérémy Munsch
38a99433a5
Merge branch 'develop' into trunk 2022-06-30 15:27:15 +02:00
Jérémy Munsch
d8fdfe7a91
Fix missing sondage variable on answer sondage 2022-06-30 15:23:34 +02:00
Jérémy Munsch
03e9643be1
Fix missing alert message on front + add message must be logged in 2022-06-30 15:21:11 +02:00
Jérémy Munsch
a94bbdd7ff
Ticket n° 955 fix reset pwd 2022-06-30 15:05:38 +02:00
Jérémy Munsch
c4871b557e
Merge branch 'trunk' 2022-06-22 10:16:02 +02:00
Jérémy Munsch
b48bb82202
Merge branch 'develop' into trunk 2022-06-22 10:15:54 +02:00
Jérémy Munsch
a8ff6100a5
Fix Mail employee restet password 2022-06-22 10:15:45 +02:00
Jérémy Munsch
211bb914e5
Merge branch 'trunk' 2022-06-17 12:45:15 +02:00
Jérémy Munsch
70b7b011ec
Merge branch 'develop' into trunk 2022-06-17 12:45:09 +02:00
Jérémy Munsch
2860fa81ac
Fix UserSite handling 2022-06-17 12:44:51 +02:00
Jérémy Munsch
a977f2486f
Merge branch 'trunk' 2022-06-17 10:54:01 +02:00
Jérémy Munsch
366ac78c10
Merge branch 'develop' into trunk 2022-06-17 10:53:37 +02:00
Jérémy Munsch
19e7525ac9
Fix wrong translation 2022-06-17 10:53:14 +02:00
Jérémy Munsch
4ba8a73df9
bump composer dependencies 2022-06-17 10:52:42 +02:00
Jérémy Munsch
55b6a78ab9
Cascade on delete on user_site 2022-06-17 10:44:08 +02:00
Jérémy Munsch
c914dc9371
Fix site user relation 2022-06-17 10:36:32 +02:00
Jérémy Munsch
18d9a6205b
Add missing crud models 2022-06-17 10:26:27 +02:00
Jérémy Munsch
f5bc5af8e4
Remove https condition on local 2022-06-17 10:16:55 +02:00
Jérémy Munsch
33c138d075
Fix exception handler policy 2022-06-17 10:00:00 +02:00
Jérémy Munsch
08fdafc62d
Merge branch 'trunk' 2021-12-03 15:37:19 +01:00
Jérémy Munsch
7974600a4d
Merge branch 'develop' into trunk 2021-12-03 15:37:18 +01:00
Jérémy Munsch
91e8f49800
Merge branch 'addGoogleAnalytics' into develop 2021-12-03 15:36:45 +01:00
Jérémy Munsch
90b7db8911
add ldc web checker 2021-12-03 14:59:39 +01:00
Jérémy Munsch
30cbcb59bd
Merge branch 'trunk' 2021-11-26 12:42:20 +01:00
Jérémy Munsch
3079d624ba
Merge branch 'develop' into trunk 2021-11-26 12:42:19 +01:00
Jérémy Munsch
074cd676d7
Merge branch 'trunk' 2021-11-10 12:29:09 +01:00
Jérémy Munsch
fa03aced3c
Merge branch 'develop' into trunk 2021-11-10 12:29:01 +01:00
Jérémy Munsch
3015b58919 Merge branch 'trunk' 2021-09-06 12:02:05 +02:00
Jérémy Munsch
7c72300ec4 Merge branch 'develop' into trunk 2021-09-06 12:02:05 +02:00
Jérémy Munsch
edcfd1491f Merge branch 'trunk' 2021-09-06 11:47:28 +02:00
Jérémy Munsch
ccddbbbfc1 Merge branch 'develop' into trunk 2021-09-06 11:47:27 +02:00
Jérémy Munsch
338b4c05c8 Merge branch 'trunk' 2021-08-12 11:20:21 +02:00
Jérémy Munsch
48c23d5cd7 Merge branch 'develop' into trunk 2021-08-12 11:20:20 +02:00
Jérémy Munsch
768b2ec37b Merge branch 'trunk' 2021-08-11 11:23:12 +02:00
Jérémy Munsch
269c2fe949 Merge branch 'develop' into trunk 2021-08-11 11:23:12 +02:00
Jérémy Munsch
60df3c60f8 Merge branch 'trunk' 2021-07-28 14:56:56 +02:00
Jérémy Munsch
24cf149d7e Merge branch 'develop' into trunk 2021-07-28 14:56:22 +02:00
Jérémy Munsch
97a555eb20 Merge branch 'trunk' 2021-07-22 14:06:25 +02:00
Jérémy Munsch
1bc093a0a7 Merge branch 'develop' into trunk 2021-07-22 14:06:11 +02:00
Jérémy Munsch
69bbc64773 Merge branch 'trunk' 2021-07-22 11:30:33 +02:00
Jérémy Munsch
317fbae26d Merge branch 'develop' into trunk 2021-07-22 11:28:38 +02:00
Jérémy Munsch
05daf341fe Merge branch 'trunk' 2021-07-21 16:28:25 +02:00
Jérémy Munsch
1997b94c18 Merge branch 'develop' into trunk 2021-07-21 16:28:09 +02:00
Jérémy Munsch
83e818d2ea Merge branch 'trunk' 2021-07-21 16:08:09 +02:00
Jérémy Munsch
4179ebb6c3 Merge branch 'develop' into trunk 2021-07-21 16:07:51 +02:00
Jérémy Munsch
3fc1c2fb76 Merge branch 'trunk' 2021-07-21 14:54:14 +02:00
Jérémy Munsch
acc1dd3ada Merge branch 'develop' into trunk 2021-07-21 14:54:00 +02:00
Jérémy Munsch
bd08ce5d69 Merge branch 'trunk' 2021-07-19 15:27:26 +02:00
Jérémy Munsch
8096ebaa4a Merge branch 'develop' into trunk 2021-07-19 15:27:11 +02:00
76496154e5 Merge branch 'trunk' 2021-07-15 02:06:24 +02:00
10b6d98667 Merge branch 'develop' into trunk 2021-07-15 02:05:51 +02:00
Jérémy Munsch
0493fd4063 Merge branch 'trunk' 2021-07-13 15:00:48 +02:00
Jérémy Munsch
269be8c678 Merge branch 'develop' into trunk 2021-07-13 15:00:33 +02:00
Vincent BRIDIER
9cc81d2a78 Merge branch 'trunk' 2021-07-08 14:27:07 +02:00
Vincent BRIDIER
a5895e5dcc Merge branch 'develop' into trunk 2021-07-08 14:26:46 +02:00
Vincent BRIDIER
a6b97b2f41 Merge branch 'trunk' 2021-07-08 14:08:33 +02:00
Vincent BRIDIER
77a8b9c23b Merge branch 'develop' into trunk 2021-07-08 14:08:15 +02:00
Vincent BRIDIER
dec399c251 Merge branch 'trunk' 2021-07-08 14:06:27 +02:00
Vincent BRIDIER
01b6237db4 Merge branch 'develop' into trunk 2021-07-08 14:06:11 +02:00
Jérémy Munsch
96ee6ca7dd Merge branch 'trunk' 2021-07-05 16:56:36 +02:00
Jérémy Munsch
32a7e70a68 Merge branch 'develop' into trunk 2021-07-05 16:56:18 +02:00
Jérémy Munsch
eed5ffc5a1 Merge branch 'develop' into trunk 2021-06-28 17:02:41 +02:00
Jérémy Munsch
a3c0cb81a8 Merge branch 'develop' into trunk 2021-06-28 11:59:07 +02:00
Jérémy Munsch
5874835563 Merge branch 'develop' into trunk 2021-06-28 11:51:49 +02:00
Jérémy Munsch
8be7e0f05f Merge branch 'develop' into trunk 2021-06-17 16:26:10 +02:00
Jérémy Munsch
ccd27bb6ba Merge branch 'develop' into trunk 2021-06-17 16:12:16 +02:00
Jérémy Munsch
987f320fe7 Merge branch 'develop' into trunk 2021-06-17 16:06:26 +02:00
Vincent BRIDIER
7b546e82cf Merge branch 'trunk' of https://voight001.lesidc.com/portsalaries into trunk 2021-06-09 17:11:25 +02:00
Jérémy Munsch
57de4c9b2b Merge branch 'develop' into trunk 2021-06-08 13:15:39 +02:00
Jérémy Munsch
c3a67c0e88 Merge branch 'trunk' 2021-06-08 12:11:18 +02:00
Jérémy Munsch
5983b13861 Merge branch 'develop' into trunk 2021-06-08 12:09:49 +02:00
Jérémy Munsch
a27ebeb87e Merge branch 'develop' into trunk 2021-06-07 18:30:28 +02:00
26 changed files with 1326 additions and 1408 deletions

View file

@ -0,0 +1,78 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
/*
* Command Name: LDC Web Status Checker
* Description: Envoi des infos Serveur/Laravel vers LDC Web
* Version: 1.1
* Author: Vincent BRIDIER
* Author URI: vincent.bridier@ldc.fr
*/
class LdcWebStatusChecker extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'ldcweb:statuschecker';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Envoi des infos Serveur/Laravel vers LDC Web';
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$data = [];
$data['uuid'] = config('ldcweb.project_uuid');
// Sitemap.xml ?
if (file_exists(public_path() . '/sitemap.xml')) {
$data['sitemap'] = 'true';
} else {
$data['sitemap'] = 'false';
}
// Robots.txt ?
if (file_exists(public_path() . '/robots.txt')) {
$data['robots'] = 'true';
} else {
$data['robots'] = 'false';
}
//Check logs
$data['logs'] = 0;
$patherror = storage_path('/logs');
$files = glob($patherror . '/*.log');
if (count($files) > 0) {
foreach ($files as $file) {
$data['logs'] = $data['logs'] + filesize($file);
}
}
$data['code']['version'] = app()->version();
// Send by cURL
$url = 'https://ldc-web.ldc.fr/api/status-checker';
$ch = curl_init($url);
$payload = ['token' => 'CE8S52Qq7stf5k8frF4T', 'datas' => json_encode($data)];
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
return 0;
}
}

View file

@ -244,11 +244,11 @@ class EmployeesController extends Controller
// Is employee locked down ?
if ($employee->password_attempts >= 3) {
SendEmployeeLockedDownMailToEmployee::dispatchAfterResponse(
SendEmployeeLockedDownMailToEmployee::dispatch(
new EmployeeLockedDown($employee),
$employee
);
SendEmployeeLockedDownMailToSiteRH::dispatchAfterResponse(
SendEmployeeLockedDownMailToSiteRH::dispatch(
new EmployeeYourAccountIsLockedDown($employee),
$employee
);
@ -278,15 +278,16 @@ class EmployeesController extends Controller
public function passwordForgottenSubmit(EmployeeForgottenPasswordRequest $request)
{
/** @var \App\Models\Employee */
$employee = Employee::where('matricule', $request->matricule)->firstOrFail();
$token = $employee->token ?? new EmployeeMailToken();
$token->fill([
'email' => $employee->email,
'employee_id' => $employee->id
]);
/** @var \App\Models\EmployeeMailToken */
$token = EmployeeMailToken::whereHas('employee', function ($q) use ($employee) {
$q->where('id', $employee->id);
})->firstOrNew();
$token->email = $employee->email;
$token->employee()->associate($employee);
$token->saveOrFail();
$token->employee()->associate($token);
SendMailResetPasswordToEmployee::dispatchAfterResponse($employee);
SendMailResetPasswordToEmployee::dispatchAfterResponse($employee, $token);
return \redirect()->back()->with('successMail', true);
}

View file

@ -155,7 +155,7 @@ class SondagesController extends Controller
/** @var \app\Models\Employee */
$employee = auth('employee')->user();
if ($employee->hasAnweredToSondage($sondage)) {
return view('front.sondages.saved', ['answered' => true]);
return view('front.sondages.saved', ['answered' => true, 'sondage' => $sondage]);
}
return view('front.sondages.show', compact('sondage'));
}

View file

@ -3,6 +3,7 @@
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
use Illuminate\Support\Facades\Session;
class Authenticate extends Middleware
{
@ -19,6 +20,7 @@ class Authenticate extends Middleware
'employee' => route('employees.login')
];
if (! $request->expectsJson()) {
Session::flash('message', trans('Vous devez vous identifier pour àccéder à cette page'));
foreach ($request->route()->gatherMiddleware() as $middleware) {
if (\is_string($middleware) and strpos($middleware, 'auth:') !== false) {
$route = $logins[str_replace('auth:', '', $middleware)] ?? null;

View file

@ -6,6 +6,8 @@ use App\Models\Site;
use Closure;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use App\Enums\Role;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Session;
class UserSite
{
@ -21,29 +23,35 @@ class UserSite
/** @var \App\Models\User */
$user = auth()->user();
try {
if (!Site::whereId($user->selected_site_id)->exists()) {
$user->selected_site_id = null;
$user->save();
}
if ($request->query('userSite')) {
/** @var \App\Models\Site|null */
$site = $user->role->equals(Role::admin()) ?
Site::whereId($request->query('userSite'))->first() :
$user->sites()->where('site_id', $request->query('userSite'))->first();
if ($site) {
$user->selected_site_id = $site->id;
$user->saveOrFail();
}
}
// Select user site
if (!$user->selected_site_id) {
/** @var \App\Models\Site */
$site = $user->role->equals(Role::admin()) ?
Site::firstOrFail() : $user->sites()->firstOrFail();
$user->selected_site_id = $site->id;
$user->saveOrFail();
}
if ($request->query('userSite')) {
$site = $user->role->equals(Role::admin()) ?
Site::whereId($request->query('userSite'))->firstOrFail() :
$user->sites()->where('site_id', $request->query('userSite'))->firstOrFail();
$user->selected_site_id = $site->id;
$user->saveOrFail();
} elseif (!Site::where('id', $user->selected_site_id)->exists()) {
$site = $user->role->equals(Role::admin()) ?
Site::whereId($request->query('userSite'))->firstOrFail() :
$user->sites()->where('site_id', $request->query('userSite'))
->firstOrFail();
$user->selected_site_id = $site->id;
$user->saveOrFail();
}
} catch (ModelNotFoundException $e) {
abort(400, 'Vous n\'avez pas de site administrable');
Log::warning("$user->name n'as pas de site administrable.");
auth()->logout();
Session::flash('error', "$user->name n'as pas de site administrable.");
return \response()->redirectToRoute('bo.login');
}
return $next($request);
}

View file

@ -4,6 +4,7 @@ namespace App\Jobs;
use App\Mail\EmployeePasswordResetMail;
use App\Models\Employee;
use App\Models\EmployeeMailToken;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
@ -19,16 +20,22 @@ class SendMailResetPasswordToEmployee implements ShouldQueue
use Queueable;
use SerializesModels;
/** @var \App\Models\Employee */
protected $employee;
/** @var \App\Models\EmployeeMailToken */
protected $token;
/**
* Create a new job instance.
*
* @return void
* @param \App\Models\Employee $employee
* @param \App\Models\EmployeeMailToken $token
*/
public function __construct(Employee $employee)
public function __construct(Employee $employee, EmployeeMailToken $token)
{
$this->employee = $employee;
$this->token = $token;
}
/**
@ -38,7 +45,7 @@ class SendMailResetPasswordToEmployee implements ShouldQueue
*/
public function handle()
{
Mail::to(['email' => $this->employee->token->email])->send(new EmployeePasswordResetMail($this->employee));
Mail::to(['email' => $this->token->email])->send(new EmployeePasswordResetMail($this->employee));
Log::debug(sprintf('Sent %s to %s', EmployeePasswordResetMail::class, config('mail.contactsList.contact')));
}
}

View file

@ -34,8 +34,8 @@ class EmployeeLockedDown extends Mailable
{
return $this
->subject(sprintf('%s : Un compte salarié vient d\'être verrouillé', config('app.name')))
->view('emails.employee-lockedDown')
->text('emails.employee-lockedDown-plain')
->view('emails.employee-own-lockedDown')
->text('emails.employee-own-lockedDown-plain')
->with('employee', $this->employee);
}
}

View file

@ -34,8 +34,8 @@ class EmployeeYourAccountIsLockedDown extends Mailable
{
return $this
->subject(sprintf('%s : Votre compte salarié vient d\'être verrouillé', config('app.name')))
->view('emails.employee-own-lockedDown')
->text('emails.employee-own-lockedDown-plain')
->view('emails.employee-lockedDown')
->text('emails.employee-lockedDown-plain')
->with('employee', $this->employee);
}
}

View file

@ -179,6 +179,16 @@ class Site extends Model
parent::__construct($attributes);
}
protected static function booted()
{
static::deleted(function (self $model) {
User::whereSelectedSiteId($model->id)->get()
->map(function (User $user) {
$user->selected_site_id = null;
});
});
}
/**
* Has one Societe
*
@ -206,7 +216,7 @@ class Site extends Model
*/
public function users()
{
return $this->belongsToMany(Site::class);
return $this->belongsToMany(User::class, 'user_site');
}
/**

View file

@ -28,9 +28,7 @@ class AppServiceProvider extends ServiceProvider
public function boot()
{
// LOCAL HTTPS FIX
if (config('app.env') !== 'local') {
URL::forceScheme('https');
}
URL::forceScheme('https');
// HA PROXY FIX
App::singleton('clientIp', function () {
if (config('app.env') === 'local') {

View file

@ -12,9 +12,9 @@
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.0.1",
"htmlmin/htmlmin": "^8.0",
"kwaadpepper/crud-policies": "^0.2.0",
"kwaadpepper/enum": "^2.0",
"kwaadpepper/exception-handler": "^0.0.1",
"kwaadpepper/crud-policies": "^0.4.5",
"kwaadpepper/enum": "^2.1",
"kwaadpepper/exception-handler": "^0.0.9",
"kwaadpepper/image-resizer": "^0.0.3",
"laravel/framework": "^8.12",
"laravel/tinker": "^2.5",
@ -66,7 +66,11 @@
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true
"sort-packages": true,
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true,
"composer/package-versions-deprecated": true
}
},
"minimum-stability": "dev",
"prefer-stable": true

2447
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -19,9 +19,7 @@ return [
'allowed_methods' => ['*'],
'allowed_origins' => ['
http://portsalaries.test
'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],

View file

@ -12,6 +12,6 @@ return [
* so you can receive email if things go mad
*/
'contactsList' => [
'serviceweb' => env('MAIL_LIST_SERVICEWEB', 'equipe.web@ldc.fr')
env('MAIL_LIST_SERVICEWEB', 'equipe.web@ldc.fr')
]
];

5
config/ldcweb.php Normal file
View file

@ -0,0 +1,5 @@
<?php
return [
'project_uuid' => env('PROJECT_UUID')
];

View file

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class ChangeDeleteRestictionPivotUserSite extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('user_site', function (Blueprint $table) {
$table->dropForeign(['site_id']);
$table->foreign('site_id')->references('id')->on('sites')
->cascadeOnDelete();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View file

@ -0,0 +1,13 @@
<?php
return [
'classes' => [
'societes' => 'Societies',
'employees' => 'Employees',
'plannings' => 'Plannings',
'poles' => 'Poles',
'sites' => 'Sites',
'sondages' => 'Sondages',
'users' => 'Users',
]
];

View file

@ -0,0 +1,13 @@
<?php
return [
'classes' => [
'societes' => 'Sociétés',
'employees' => 'Salariés',
'plannings' => 'Plannings',
'poles' => 'Poles',
'sites' => 'Sites',
'sondages' => 'Sondages',
'users' => 'Utilisateurs',
]
];

View file

@ -9,4 +9,16 @@
#siteid {
color: white;
margin-right: 100px;
}
}
.alertMessage {
text-align: center;
max-width: 80%;
min-width: 15rem;
margin: 1rem auto;
padding: 0.5rem 1rem;
background-color: #e5e2e2;
font-weight: bold;
border-radius: 0.4rem;
font-family: Tahoma;
}

View file

@ -1,4 +1,4 @@
@import "_import";
@import "./_import";
@import "layouts/backend/top_nav";

View file

@ -1,2 +1,3 @@
@import "~swiper/swiper.min";
@import "front/style.sass";
@import "./_import";

View file

@ -1,2 +1,3 @@
@import "~swiper/swiper.min";
@import "front/styleLogin.sass";
@import "./_import";

View file

@ -29,4 +29,4 @@
<!-- STYLES -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" integrity="sha256-hHKA3d/HttC8OW3Sl093W8DoZudhHJDj++kZYo6MLzA=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.16/dist/sweetalert2.min.css" integrity="sha256-qpXwccFYncH5gTqXFe9EXZ8QeDw1Re68bbNVfFZzIzg=" crossorigin="anonymous">
<link rel="stylesheet" href="{{ asset('css/preload-back.css') }}">
<link rel="stylesheet" href="{{ mix('css/preload-back.css') }}">

View file

@ -7,7 +7,7 @@
</head>
<body>
@include("layouts.frontend.header")
<!--@include('layouts.frontend.message')-->
@include('layouts.frontend.message')
@yield('content')
@include("layouts.frontend.footer")
@stack('scriptsConstants')

View file

@ -24,8 +24,8 @@
@preload('mix-manifest.json')
<!-- STYLES -->
<link rel="stylesheet" href="{{ asset('css/preload-front_login.css') }}">
<link rel="stylesheet" href="{{ asset('css/preload-front.css') }}">
<link rel="stylesheet" href="{{ mix('css/preload-front_login.css') }}">
<link rel="stylesheet" href="{{ mix('css/preload-front.css') }}">
<style>
:root {
@if(isset($societe->colors['primary']))
@ -53,4 +53,4 @@
}
gtag('js', new Date());
gtag('config', 'G-PTNNFW0ZE1');
</script>
</script>

View file

@ -1,5 +1,5 @@
@if(session('message'))
<div>
<div class="alertMessage">
{{ session('message') }}
</div>
@endif