@extends('admin.layout') {{-- Le meme formulaire sert a refabriquer une commande (CommandeController:: refabriquer) : $origine est alors la commande refaite, et $pre les valeurs qu'elle apporte a la premiere ligne. Hors refabrication, les deux sont vides et l'ecran est celui de toujours. --}} @php $origine = $origine ?? null; $pre = $pre ?? []; @endphp @section('title', $origine ? __('Refabriquer la commande n° :id', ['id' => $origine->id]) : __('Ajouter une commande')) @section('content')

@yield('title')

{{-- Deroule du bloc devis et des champs d'observation. Les regles sont partagees avec la creation d'un chantier, qui deroule les memes blocs. --}}
@if ($errors->any())
    @foreach ($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@endif {{-- Libelle a gauche du champ, comme la fenetre de l'ancien logiciel : le formulaire tient sur un ecran, on le relit d'un coup d'oeil avant d'enregistrer. En haut, ce qui est commun a la saisie : devis, client et pour qui sur une ligne, les dates en bandeau dessous. Puis chaque commande en pleine largeur, sur deux colonnes. Rien ne laisse de vide : ni une colonne client de deux champs face a cinq dates, ni une colonne reservee aux commandes ajoutees. ⚠️ edit.blade.php en est le calque : meme ordre, memes blocs. --}}
@csrf
{{-- ==================== REFABRICATION ==================== --}} @if ($origine)
{{ __('Refabrication de la commande') }} n° {{ $origine->id }} · {{ mb_strtoupper((string) $origine->modele, 'UTF-8') }} @if ($origine->created_at) · {{ __('commandée le :date', ['date' => $origine->created_at->format('d/m/Y')]) }} @endif — {{ __('tout ce qui suit vient d’elle et reste modifiable') }}
{{-- Fautif et raison : obligatoires, c'est ce qui rend la liste des refabrications utile. --}}
@endif {{-- ==================== EN-TETE ==================== --}}
@include('admin.commandes._devis', [ 'devisId' => old('devis_id', $pre['devis_id'] ?? null), 'clientId' => old('client_id', $pre['client_id'] ?? null), 'negoce' => old('negoce', !empty($pre['negoce']) ? '1' : '0') == '1', // Une refabrication reprend le choix de la commande // d'origine, un retour de validation le sien. 'negoceAuto' => old('negoce') === null && !isset($pre['negoce']), ]) {{-- Remplie par le script quand le devis se charge : celle deja saisie pour ce devis, s'il y en a une. --}} @include('admin.commandes._adresse_chantier', [ 'adresseChantier' => null, 'devisId' => $pre['devis_id'] ?? null, 'clientId' => $pre['client_id'] ?? null, ]) {{-- Les dates en bandeau, libelle au-dessus : cinq champs courts sur une ligne plutot qu'une colonne de cinq lignes. Les validateurs viennent de config/commandes.php. --}}
{{-- La note sur les dates, repliee par defaut : elle est rare, et un textarea vide donnait surtout l'impression qu'il fallait le remplir. --}}
{{-- ==================== COMMANDE(S) ==================== --}}
{{-- « Générer depuis le devis » : déroulé quand le devis est chargé (js/commandes/lignes-devis.js). Les lignes qu'il pose sont des propositions, chacune à cocher « Vérifiée » avant l'envoi ; ce qu'il ne sait pas convertir est listé dessous, à ajouter à la main. Pas en refabrication : elle refait une commande, pas un devis. --}} @unless ($origine) @php $langGenerer = [ 'propose' => __('Le devis :id peut pré-remplir les commandes.'), 'proposeUne' => __('Le devis :id peut pré-remplir 1 commande.'), 'proposePlusieurs' => __('Le devis :id peut pré-remplir :n commandes.'), 'proposeAucune' => __('Le devis :id ne pré-remplit aucune commande.'), 'completerUne' => __('1 autre ligne est à compléter à la main.'), 'completerPlusieurs' => __(':n autres lignes sont à compléter à la main.'), 'chargement' => __('Lecture du devis…'), 'generees' => __(':n ligne(s) générée(s) : vérifiez-les une à une.'), 'aucune' => __('Rien à générer : aucun produit du devis ne se retrouve au catalogue.'), 'erreur' => __('Le devis ne répond pas : saisissez les lignes à la main.'), 'nonReprises' => __('Lignes du devis non reprises (:n)'), 'ajouter' => __('Ajouter'), ]; @endphp
@endunless
{{-- Une ligne posée par « Générer depuis le devis » : d'où elle vient, le texte du devis pour comparer, et la case qui empêche l'envoi tant qu'on ne l'a pas regardée. Caché et la case désactivée sur une ligne saisie à la main : rien ne bloque alors. --}}
{{ __('Depuis le devis') }} :
{{ __('Texte du devis') }}

                                    
{{-- Deux colonnes dans la carte : le produit a gauche (type, modele, couleur, finition), la livraison et les cotes a droite. --}}
{{-- Modele et variation ne font qu'un champ : on tape, la liste du type se filtre, un clic fige le choix. Le texte saisi est poste aussi : `commandes.modele` est un libelle fige, un nom hors catalogue s'y enregistre aussi bien. Une entree choisie prime, le controleur resout alors le libelle sur l'id. --}}
{{-- Platine et quantite : accessoire seulement. Replies, ils sont desactives et pas seulement masques : sinon une platine choisie puis un changement de type la posteraient sur un coulissant. --}}
{{-- En refabrication, le texte est poste aussi : si aucune couleur de l'api ne porte plus le libelle d'origine, il vaut tel quel tant qu'on n'y touche pas (CommandeController::store). --}}
{{-- Desactivee et videe sur « pas de laquage » : une piece qu'on ne laque pas n'a pas de finition. --}}
{{-- Les Oui/Non en interrupteurs, sous la finition : ils comblent la colonne du produit, plus courte que celle de la livraison, au lieu de faire une rangee a part. Le champ cache poste « Non » ; coche, l'interrupteur qui le suit l'emporte avec « Oui » (PHP garde la derniere valeur d'un meme nom). Le libelle enveloppe l'entree : pas d'id a renumeroter au clonage. --}}
{{ __('Options') }}
{{-- Découpes, déroulées par l'interrupteur : un champ de recherche et des étiquettes (vue _decoupes). --}}
{{ __('Découpes') }} @include('admin.commandes._decoupes', ['nom' => 'items[0][decoupes][]', 'choisies' => $pre['decoupes'] ?? []])
{{-- Priorite et etat cote a cote : deux reglages courts. A la creation : EN ATTENTE, IN PROCESS (deja lancee a l'usine) ou STANDBY ; `selected` suit le clonage, une ligne ajoutee repart donc EN ATTENTE. --}}
{{-- Les cotes sur une ligne, en mm, selon le type : pas de longueur sur un accessoire, largeur sur un carport ou un store, pas de hauteur sur un store. Un champ replie est desactive et ne part pas ; le controleur le laisse nul de toute facon (CommandeController::cotes). --}}
{{ __('Long.') }}
{{ __('Haut.') }}
{{ __('Larg.') }}
{{-- Une refabrication refait une commande : pas de seconde ligne (le controleur le refuse aussi). --}}
@unless ($origine) @endunless
{{-- Hors du
: un champ de recherche a l'interieur soumettrait la commande a la premiere touche Entree. Le choix pose l'identifiant dans `#numero_client` et emet un `change`, que l'ecran relit plus bas. --}} @include('admin.gestan.clients._modale_recherche', ['cible' => '#numero_client']) @php // Libelles des