@extends('layouts.app') @section('titre', 'Composer ordonnancement') @section('contenu')

{{ $active ? 'Re-planifier' : 'Composer' }} — {{ $ligne->code }} — journée du {{ $journee->date_reference->translatedFormat('l d/m/Y') }} @if($mode === 'simulation') SIMULATION @endif

@if($active)

Version active : v{{ $active->version }} du {{ $active->created_at->format('d/m/Y H:i') }}. Enregistrer créera la version v{{ $active->version + 1 }} — la v{{ $active->version }} sera archivée (jamais écrasée).

@endif
@csrf

Enchaînement des produits

La proposition automatique est désactivée : une nouvelle version démarre vide, la composition est saisie manuellement. Le n° d'ordre s'incrémente automatiquement à chaque ligne renseignée ; utilisez les flèches ▲/▼ pour réordonner les priorités de production (les horaires se recalculent aussitôt). Le nombre de pétrins restant à produire reste affiché à titre indicatif, actualisé en direct dès qu'une ligne est ajoutée. Pour fractionner un besoin en plusieurs séries, saisir le même produit sur plusieurs lignes (ex. 8 puis 4). Laisser la quantité vide pour ignorer une ligne.

@php // Proposition d'ordonnancement automatique désactivée pour le moment (composition manuelle) : // une NOUVELLE version démarre vide. En re-planification, on recharge la version active // (c'est l'existant à reprendre, pas une proposition calculée). $lignesInitiales = []; if ($active) { foreach ($active->items as $item) { $lignesInitiales[] = ['produit' => $item->produit_fabrique_id, 'qte' => $item->qte_petrins]; } } // ~15 à 20 lignes par jour : on en affiche au moins 15 (plus si déjà pré-rempli). // Des lignes s'ajoutent automatiquement (JS) quand la dernière est remplie. $nbLignes = max(15, count($lignesInitiales) + 5); // Produits proposés = ceux de la ligne avec un besoin en pétrins (+ ceux déjà présents en re-planification) $carac = function ($p) { return [ 'libelle' => $p->libelle, 'max' => $p->nb_petrins_max_serie, 'cadence' => $p->cadence_min_par_petrin, 'chgt' => $p->temps_changement_min, 'process' => $p->duree_process_min, ]; }; // Composition manuelle : tous les produits actifs de la ligne sont sélectionnables. // Le besoin calculé reste attaché (data-besoin) à titre indicatif pour le « reste ». $aFabriquer = []; foreach ($produits as $p) { $aFabriquer[$p->id] = $carac($p) + ['besoin' => (int) ($besoins[$p->id]['qte_petrins'] ?? 0)]; } // Heure de démarrage du pétrin : reprise de la version active en re-planification, // sinon l'heure de début de la journée, sinon 03:00. $heureDemarrage = substr((string) ($active->heure_demarrage ?? $journee->heure_debut ?? '03:00'), 0, 5); @endphp

Départ du 1er pétrin de cette ligne pour la journée. Peut différer d'une ligne à l'autre et d'un jour à l'autre ; les horaires ci-dessous s'enchaînent à partir de cette heure.

@for($i = 0; $i < $nbLignes; $i++) @php $initial = $lignesInitiales[$i] ?? null; $produitInitial = old("items.$i.produit_fabrique_id", $initial['produit'] ?? ''); $besoinProduit = $produitInitial !== '' ? ($besoins[(int) $produitInitial] ?? null) : null; @endphp @endfor
OrdreProduit à fabriquerQté pétrins Restant à produireMax / série Départ pétrinTemps prod.Temps chgtHeure sortie
{{ $besoinProduit['qte_petrins'] ?? '' }} {{ $besoinProduit['produit_fabrique']->nb_petrins_max_serie ?? '' }}
@endsection