diff --git a/app/Mail/AlerteStock.php b/app/Mail/AlerteStock.php
index 6ad87b50..525b7e83 100644
--- a/app/Mail/AlerteStock.php
+++ b/app/Mail/AlerteStock.php
@@ -23,14 +23,20 @@ class AlerteStock extends TemplateMailable
public $seuil;
+ public $lien_article;
+
+ public $lien_offre;
+
protected static $templateModelClass = MailTemplate::class;
public function __construct($offer)
{
- $this->article = $offer->article->title ?? 'Article #'.$offer->article_id;
+ $this->article = $offer->article->name ?? 'Article #'.$offer->article_id;
$this->offre = $offer->id;
$this->stock_restant = $offer->stock_current;
$this->seuil = $offer->minimum_ondemand;
+ $this->lien_article = url('/Admin/Shop/Articles/edit/'.$offer->article_id);
+ $this->lien_offre = url('/Admin/Shop/Offers/edit/'.$offer->id);
}
public function envelope()
diff --git a/database/migrations/shop/2026_02_20_130000_update_mail_template_alerte_stock_add_link.php b/database/migrations/shop/2026_02_20_130000_update_mail_template_alerte_stock_add_link.php
new file mode 100644
index 00000000..16fc3f33
--- /dev/null
+++ b/database/migrations/shop/2026_02_20_130000_update_mail_template_alerte_stock_add_link.php
@@ -0,0 +1,125 @@
+where('mailable', 'App\\Mail\\AlerteStock')
+ ->update([
+ 'html_template' => json_encode(['fr' => $this->getHtmlTemplate()], JSON_UNESCAPED_UNICODE),
+ 'text_template' => json_encode(['fr' => $this->getTextTemplate()], JSON_UNESCAPED_UNICODE),
+ 'updated_at' => now(),
+ ]);
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ DB::table('mail_templates')
+ ->where('mailable', 'App\\Mail\\AlerteStock')
+ ->update([
+ 'html_template' => json_encode(['fr' => $this->getOldHtmlTemplate()], JSON_UNESCAPED_UNICODE),
+ 'text_template' => json_encode(['fr' => $this->getOldTextTemplate()], JSON_UNESCAPED_UNICODE),
+ 'updated_at' => now(),
+ ]);
+ }
+
+ private function getHtmlTemplate(): string
+ {
+ return '
'
+ .''
+ .''
+ .''
+ .''
+ .''
+ .' | '
+ .' '
+ .''
+ .''
+ .''
+ .''
+ .'| '
+ .'Alerte stock bas | '
+ .'| '
+ .' Le stock de l\'article {{article}} (offre n°{{offre}}) '
+ .'a atteint le seuil d\'alerte. '
+ .'{{stock_restant}} unités restantes '
+ .'Seuil d\'alerte configuré : {{seuil}} unités '
+ .'Voir l\'article'
+ .' Voir l\'offre '
+ .'Pensez à réapprovisionner cet article. '
+ .' | '
+ .' '
+ .' | '
+ .''
+ .''
+ .'Jardin\'enVie Artisan Semencier 429 route des chaux, 26500 Bourg les Valence - Drôme'
+ .' | '
+ .' |
';
+ }
+
+ private function getTextTemplate(): string
+ {
+ return "ALERTE STOCK BAS\n\n"
+ ."Article : {{article}} (offre n°{{offre}})\n"
+ ."Stock restant : {{stock_restant}} unités\n"
+ ."Seuil d'alerte : {{seuil}} unités\n\n"
+ ."Voir l'article dans l'admin : {{lien_article}}\n"
+ ."Voir l'offre dans l'admin : {{lien_offre}}\n\n"
+ ."Pensez à réapprovisionner cet article.\n\n"
+ ."Jardin'enVie Artisan Semencier\n"
+ .'429 route des chaux, 26500 Bourg les Valence - Drôme';
+ }
+
+ private function getOldHtmlTemplate(): string
+ {
+ return ''
+ .''
+ .''
+ .''
+ .''
+ .''
+ .' | '
+ .' '
+ .''
+ .''
+ .''
+ .''
+ .'| '
+ .'Alerte stock bas | '
+ .'| '
+ .' Le stock de l\'article {{article}} (offre n°{{offre}}) '
+ .'a atteint le seuil d\'alerte. '
+ .'{{stock_restant}} unités restantes '
+ .'Seuil d\'alerte configuré : {{seuil}} unités '
+ .'Pensez à réapprovisionner cet article. '
+ .' | '
+ .' '
+ .' | '
+ .''
+ .''
+ .'Jardin\'enVie Artisan Semencier 429 route des chaux, 26500 Bourg les Valence - Drôme'
+ .' | '
+ .' |
';
+ }
+
+ private function getOldTextTemplate(): string
+ {
+ return "ALERTE STOCK BAS\n\n"
+ ."Article : {{article}} (offre n°{{offre}})\n"
+ ."Stock restant : {{stock_restant}} unités\n"
+ ."Seuil d'alerte : {{seuil}} unités\n\n"
+ ."Pensez à réapprovisionner cet article.\n\n"
+ ."Jardin'enVie Artisan Semencier\n"
+ .'429 route des chaux, 26500 Bourg les Valence - Drôme';
+ }
+};