<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Models\ArticlesStock;
use App\Models\Stock_categorie;
use App\Models\BonRequisitionsStock;
use App\Models\DetailBonRequisitionStock;
use App\Models\Stock_divers_initial;
use App\Models\BordereauxSortieStock; 
use App\Models\BordereauxEntreeStockDetail; 
use App\Models\DetailBordereauxSortieStock;  
use App\Models\DetailDemandesFraisStock;
use App\Models\DemandesAchatStock;
use App\Models\DetailDemandesAchatStock;
use App\Models\BonCommandeAchat; 
use App\Models\MouvementsStock; 
use App\Models\User; 
use Carbon\Carbon;
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class DemandesStockController extends Controller
{
    //
        public function __construct()
        {
            $this->middleware('auth');
        }
        public function all_requisitions()
        {
                 $service_id = DB::table('services')
            ->where('idservice', Auth::user()->service_id)
            ->value('idservice');

            $stocks = DB::table('stocks')->orderBy('id_stock','desc')->get();
            $requisitions = DB::table('bon_requisitions_stocks')
            ->leftjoin('services', 'services.idservice', '=', 'bon_requisitions_stocks.service_id')
            ->leftjoin('directions', 'directions.id_direction', '=', 'services.direction_id')
            ->leftjoin('users', 'users.id', '=', 'bon_requisitions_stocks.demandeur_id')
            ->leftjoin('stocks', 'stocks.id_stock', '=', 'bon_requisitions_stocks.stock_id')
             ->where('bon_requisitions_stocks.service_id', $service_id)
            ->orderBy('bon_requisitions_stocks.id_requisition', 'desc')
            ->select('bon_requisitions_stocks.*', 'services.nom_service', 'users.name', 'directions.nom_direction', 'stocks.nom_stock')
            ->get();
            $nom_service = DB::table('services')
            ->where('idservice', Auth::user()->service_id)
            ->value('nom_service');
            return view('stockDivers_views.bon_requisition.all_requisitions', compact('requisitions','stocks', 'nom_service'));
        }
public function save_bon_requisition(Request $request)
{
    // ✅ 1. Validation
    $request->validate([
        'stock_id' => 'required|numeric|exists:stocks,id_stock',
        'motif_requisition' => 'nullable|string|max:255'
    ]);

    // ✅ 2. Vérifier l'utilisateur connecté
    $user = auth()->user();

    if (!$user || !$user->service_id) {
        return redirect()->back()
            ->withErrors("Impossible de déterminer le service de l'utilisateur connecté.");
    }
    //recupérer le stock pour verifier qu'il existe et aussi pour le nom du stock dans le bon de requisition
    $stock = DB::table('stocks')->where('id_stock', $request->stock_id)->first();
    if (!$stock) {
        return redirect()->back()
            ->withErrors("Stock introuvable.");
    }
    $code_stock = $stock->code_stock;
    $service_id   = $user->service_id;
    $demandeur_id = $user->id;

    // ✅ 3. Récupérer la direction
    $direction = DB::table('services')
        ->join('directions', 'services.direction_id', '=', 'directions.id_direction')
        ->where('services.idservice', $service_id)
        ->select('directions.id_direction', 'directions.pseudo_dir')
        ->first();

    if (!$direction) {
        return redirect()->back()
            ->withErrors("Direction introuvable pour le service de l'utilisateur.");
    }
    $code_demande = 'REQ'; //Code de bon de commande BON de Requisition
    $direction_id = $direction->id_direction;
    $prefixe      = strtoupper($direction->pseudo_dir); //code_direction
    $annee        = now()->year;

//Generer une Reference de format : prefixe/code_stock/code_demande/numero/annee ex : DRH/SCKVL/0001/2026

    // ✅ 4. Génération sécurisée + contrôle du compteur
    $result = DB::transaction(function () use ($prefixe,$code_stock,$code_demande,$annee, $direction_id) {

        $dernierNumero = DB::table('bon_requisitions_stocks')
            ->where('direction_id', $direction_id)
            ->where('numero_requisition', 'like', $prefixe. '/' . $code_stock .'/' .$code_demande . '/%/' . $annee)
            ->lockForUpdate()
            ->orderBy('numero_requisition', 'desc')
            ->value('numero_requisition');

        if ($dernierNumero) {
            $parts = explode('/', $dernierNumero);
            $dernierCompteur = (int) $parts[3]; // Récupérer la partie compteur
            $nouveauCompteur = $dernierCompteur + 1;
        } else {
            $nouveauCompteur = 1;
        }

        // 🚫 Bloquer si dépassement
        if ($nouveauCompteur > 9999) {
            return ['error' => true];
        }

        $numero = sprintf('%s/%s/%s/%04d/%d', $prefixe, $code_stock, $code_demande, $nouveauCompteur, $annee);

        return [
            'error' => false,
            'numero' => $numero
        ];
    });

    // ✅ 5. Vérifier erreur compteur
    if ($result['error']) {
        return redirect()->back()->with(
            'error',
            "Erreur : le nombre maximum de réquisitions pour cette direction est atteint pour cette année."
        );
    }


    // ✅ 6. Insertion
    $bon = new BonRequisitionsStock();
    $bon->numero_requisition = $result['numero'];
    $bon->date_requisition = now();
    $bon->service_id = $service_id;
    $bon->direction_id = $direction_id;
    $bon->demandeur_id = $demandeur_id;
    $bon->stock_id = $request->stock_id;
    $bon->statut_requisition = 1 ; //en_attente
    $bon->motif_requisition = $request->motif_requisition;
    $bon->save();

    return redirect()->back()
        ->with('success', 'Bon de réquisition ajouté avec succès !');
}
public function detail_bon_requisition($id)
{ 
$info_requisition = BonRequisitionsStock::leftJoin('services', 'services.idservice', '=', 'bon_requisitions_stocks.service_id')
->leftJoin('directions', 'directions.id_direction', '=', 'services.direction_id')
->join('users', 'users.id', '=', 'bon_requisitions_stocks.demandeur_id')
->leftJoin('stocks', 'stocks.id_stock', '=', 'bon_requisitions_stocks.stock_id')
->where('bon_requisitions_stocks.id_requisition', $id)
->select('bon_requisitions_stocks.*', 'services.nom_service', 'users.name', 'directions.nom_direction', 'stocks.nom_stock')
->first();
    if (!$info_requisition) {
        return redirect()->back()->withErrors("Bon de réquisition introuvable.");
    }
//recuperer categorie du stock pour afficher les articles de ce stock dans le detail du bon de requisition
$categorie_stock = DB::table('stock_categories')
    ->where('stock_id', $info_requisition->stock_id)->first();
     
    $requisition_details  = DB::table('detail_bon_requisition_stocks')
        ->leftJoin('articles_stocks', 'articles_stocks.id_article', '=', 'detail_bon_requisition_stocks.article_id')
          ->leftJoin('stock_divers_initials', 'stock_divers_initials.article_id', '=', 'articles_stocks.id_article')
          ->leftJoin('unite_mesures', 'articles_stocks.unite_mesure_id', '=', 'unite_mesures.id_unite_mesure')
        ->where('detail_bon_requisition_stocks.requisition_id', $id)
         ->select('detail_bon_requisition_stocks.*','articles_stocks.*','stock_divers_initials.*','unite_mesures.unite_mesure')
        ->get();

    return view('stockDivers_views.bon_requisition.detail_bon_requisition', compact('requisition_details','info_requisition'));
}
public function form_ajout_article_demande($id)
{
    $requisition = BonRequisitionsStock::find($id);
    if (!$requisition) {
        return redirect()->back()->withErrors("Bon de réquisition introuvable.");
    }
    $articles = DB::table('articles_stocks')
            //joindre avec la table stock_categories pour filtrer les articles selon la categorie du stock du bon de requisition
            ->Join('stock_divers_initials', 'stock_divers_initials.article_id', '=', 'articles_stocks.id_article')
            ->leftJoin('stock_categories', 'stock_categories.categorie_id', '=', 'articles_stocks.categorie_id')
            ->leftJoin('unite_mesures', 'articles_stocks.unite_mesure_id', '=', 'unite_mesures.id_unite_mesure')
            ->leftjoin('stocks', 'stocks.id_stock', '=', 'stock_categories.stock_id')
            ->where('stock_categories.stock_id', $requisition->stock_id)
            ->select('articles_stocks.*','stock_divers_initials.*','unite_mesures.unite_mesure')
            ->get();
      
    return view('stockDivers_views.bon_requisition.form_ajout_article_demande', compact('requisition', 'articles'));
}
 
                  
public function save_demande_details(Request $request)
{
    // 1. Validation
    $validator = Validator::make($request->all(), [
        'requisition_id'         => 'required|exists:bon_requisitions_stocks,id_requisition',
        'article'                => 'required|array',
        'article.*'              => 'exists:articles_stocks,id_article',
        'quantite'               => 'required|array',
        'quantite.*'             => 'required|numeric|min:1',
        'observation_article'    => 'nullable|array',
        'observation_article.*'  => 'nullable|string|max:255'
    ]);

    if ($validator->fails()) {
        return back()->withErrors($validator)->withInput();
    }

    $requisition_id = $request->input('requisition_id');
    $articles       = $request->input('article');
    $quantites      = $request->input('quantite');
    $observations   = $request->input('observation_article', []);

    // 2. Vérifier l'existence du bon de réquisition
    $bonRequisition = BonRequisitionsStock::where('id_requisition', $requisition_id)->first();
    if (!$bonRequisition) {
        return redirect()->back()->with('error', 'Ce bon de réquisition est introuvable.');
    }

    // 3. Cohérence des tableaux
    if (count($articles) !== count($quantites)) {
        return back()->withErrors("Les données sont incohérentes.")->withInput();
    }

    // 4. Éviter les doublons d'articles dans les détails existants
    $existingDetails = DetailBonRequisitionStock::where('requisition_id', $requisition_id)
        ->whereIn('article_id', $articles)
        ->exists();
    if ($existingDetails) {
        return back()->withErrors("Un ou plusieurs articles existent déjà dans cette demande. Modifiez les quantités directement.")->withInput();
    }

    // 5. Récupérer les stocks disponibles (colonne 'quantite_stock' à adapter)
  $stocks = DB::table('stock_divers_initials')
                    ->whereIn('article_id', $articles)
                    ->pluck('qte_disponible', 'article_id')  // qte_disponible = colonne réelle dans votre table
                     ->toArray();

    // 6. Déterminer la disponibilité de chaque article
    $disponibilites = [];
    foreach ($articles as $index => $articleId) {
        $demande = (int)$quantites[$index];
        $disponible = $stocks[$articleId] ?? 0;
        $estDisponible = ($demande <= $disponible);
        $disponibilites[$articleId] = $estDisponible;
    }

    // 7. Règle d'homogénéité : tous les articles doivent avoir le même état
    $firstArticleId = $articles[0];
    $firstEstDisponible = $disponibilites[$firstArticleId];

    foreach ($articles as $articleId) {
        if ($disponibilites[$articleId] !== $firstEstDisponible) {
            $nomArticle = DB::table('articles_stocks')->where('id_article', $articleId)->value('nom_article');
            $statutAttendu = $firstEstDisponible ? "disponible" : "indisponible";
            return back()->withErrors(
                "L'article '$nomArticle' est " . ($disponibilites[$articleId] ? "disponible" : "indisponible") .
                " alors que le premier article est $statutAttendu. Tous les articles doivent être cohérents."
            )->withInput();
        }
    }

    // 8. Si tous disponibles, vérifier les quantités par rapport au stock (sécurité)
    if ($firstEstDisponible) {
        foreach ($articles as $index => $articleId) {
            $demande = (int)$quantites[$index];
            $disponible = $stocks[$articleId] ?? 0;
            if ($demande > $disponible) {
                $nom = DB::table('articles_stocks')->where('id_article', $articleId)->value('nom_article');
                return back()->withErrors("Quantité demandée pour '$nom' ($demande) dépasse le stock disponible ($disponible).")->withInput();
            }
        }
    }

    // 9. Regrouper les quantités par article
    $grouped = [];
    $observationsParArticle = [];
    foreach ($articles as $index => $articleId) {
        $qte = (int)$quantites[$index];
        $obs = $observations[$index] ?? null;
        if (!isset($grouped[$articleId])) {
            $grouped[$articleId] = 0;
            $observationsParArticle[$articleId] = $obs;
        }
        $grouped[$articleId] += $qte;
    }

    DB::beginTransaction();

    try {
        foreach ($grouped as $articleId => $qteTotale) {
            DetailBonRequisitionStock::create([
                'requisition_id'     => $requisition_id,
                'article_id'             => $articleId,
                'qte_demandee_requisition' => $qteTotale,
                'observation_article'    => $observationsParArticle[$articleId] ?? null,
                'status_demande'         => 1,
            ]);
            // 10. Mettre à jour le stock  initial disponible
         DB::table('stock_divers_initials')
                ->where('article_id', $articleId)
                ->where('qte_disponible', '>=', $qteTotale)
                ->decrement('qte_disponible', $qteTotale);

         DB::table('stock_divers_initials')
                ->where('article_id', $articleId)
                ->increment('qte_reserver', $qteTotale);
           
        }

        // 10. Mise à jour de l'entête selon disponibilité (1 = tous dispo, 0 = tous indispo)
         $bonRequisition->firstEstDisponible = $firstEstDisponible ? 1 : 0;
        $bonRequisition->save();

        DB::commit();

        return redirect()->route('detail_bon_requisition', ['id' => $requisition_id])
            ->with('success', count($grouped) . " détail(s) ajouté(s) avec succès.");

    } catch (\Exception $e) {
        DB::rollBack();
        return back()->withErrors("Erreur : " . $e->getMessage());
    }
}
public function update_article_demande(Request $request, $id)
{
    // Validation
    $validator = Validator::make($request->all(), [
        'quantite' => 'required|numeric|min:1',
        'observation_article' => 'nullable|string|max:255'
    ]);

    if ($validator->fails()) {
        return back()->withErrors($validator)->withInput();
    }

    $quantite = $request->input('quantite');
    $observation = $request->input('observation_article');

    // Vérifier que le détail existe
    $detail = DB::table('detail_bon_requisition_stocks')->where('id_detail_bon_requisition', $id)->first();

    if (!$detail) {
        return back()->withErrors("Détail de demande introuvable.")->withInput();
    }

    // Mettre à jour
    DB::table('detail_bon_requisition_stocks')
        ->where('id_detail_bon_requisition', $id)
        ->update([
            'qte_demandee_requisition' => $quantite,
            'observation_article' => $observation,
            'updated_at' => Carbon::now('Africa/Bujumbura')
        ]);

    return redirect()->route('detail_bon_requisition', ['id' => $detail->requisition_id])
        ->with('success', "Détail de demande mis à jour avec succès !");
}
public function accepter_un_article_demande($id)
{
    $detail = DB::table('detail_bon_requisition_stocks')->where('id_detail_bon_requisition', $id)->first();
    if (!$detail) {
        return redirect()->back()->withErrors("Détail de demande introuvable.");
    }
    DB::table('detail_bon_requisition_stocks')
        ->where('id_detail_bon_requisition', $id)
        ->update(['status_demande' => 2]); // Approuvée

    return redirect()->route('detail_bon_requisition', ['id' => $detail->requisition_id])
        ->with('success', "Détail de demande approuvé avec succès !");
}
public function annuler_un_article_demande($id)
{
    $detail = DB::table('detail_bon_requisition_stocks')->where('id_detail_bon_requisition', $id)->first();
    if (!$detail) {
        return redirect()->back()->withErrors("Détail de demande introuvable.");
    }
    DB::table('detail_bon_requisition_stocks')
        ->where('id_detail_bon_requisition', $id)
        ->update(['status_demande' => 3]); // Rejetée   
         return redirect()->route('detail_bon_requisition', ['id' => $detail->requisition_id])
        ->with('success', "Détail de demande annulé avec succès !");
}   

public function delete_demande_details($id)
{
    $detail = DB::table('detail_bon_requisition_stocks')->where('id', $id)->first();
    if (!$detail) {
        return redirect()->back()->withErrors("Détail de demande introuvable.");
    }
    DB::table('detail_bon_requisition_stocks')->where('id_detail_bon_requisition', $id)->delete();
    return redirect()->route('detail_bon_requisition', ['id' => $detail->requisition_id])
        ->with('success', "Détail de demande supprimé avec succès !");
}

public function transfer_requisition_achat($id)
{
    $bon = BonRequisitionsStock::find($id);
    if (!$bon) {
        return redirect()->back()->withErrors("Bon de réquisition introuvable.");
    }
    $bon->update(['statut_requisition' => 4]); //// Transferer au service achat
    
    return redirect()->back()
        ->with('success', "Bon de réquisition transferé au service Achat avec succès !");
}

public function rejetter_bon_requisition($id)
{
    $bon = BonRequisitionsStock::find($id);
    if (!$bon) {
        return redirect()->back()->withErrors("Bon de réquisition introuvable.");
    }
    // rejetter_bon_requisition les détails associés
    DB::table('detail_bon_requisition_stocks')->where('requisition_id', $id)->update(['status_demande' => 3]); // Rejetée
    // rejetter_bon_requisition le bon de réquisition
    $bon->update(['statut_requisition' => 0,'reject_by' => Auth::user()->id]); // Rejetée

    return redirect()->route('all_requisitions')
        ->with('success', "Bon de réquisition et ses détails rejetés avec succès !");
}
public function delete_bon_requisition($id)
{
    $bon = BonRequisitionsStock::find($id);
    if (!$bon) {
        return redirect()->back()->withErrors("Bon de réquisition introuvable.");
    }
      DB::table('detail_bon_requisition_stocks')->where('requisition_id', $id)->delete(); // supprimer
    $bon->delete(); // supprimer

    return redirect()->route('all_requisitions')
        ->with('success', "Bon de réquisition supprimé avec succès !");
}
public function tous_accepter_demande_details($id) //accepeter tous pour requisition_id
{
    $detail = DB::table('detail_bon_requisition_stocks')->where('requisition_id', $id)->first();
    if (!$detail) {
        return redirect()->back()->withErrors("Détail de demande introuvable.");
    }
    DB::table('detail_bon_requisition_stocks')
        ->where('requisition_id', $detail->requisition_id)
        ->where('status_demande', 1) // Accepter uniquement les demandes en attente
        ->update(['status_demande' => 2]); // Approuvée

    return redirect()->route('detail_bon_requisition', ['id' => $detail->requisition_id])
        ->with('success', "Tous les détails de la demande ont été approuvés !");
}
public function tous_annuler_demande_details($id)
{
    $detail = DB::table('detail_bon_requisition_stocks')->where('requisition_id', $id)->first();
    if (!$detail) {
        return redirect()->back()->withErrors("Détail de demande introuvable.");
    }
    DB::table('detail_bon_requisition_stocks')
        ->where('requisition_id', $detail->requisition_id)
        ->where('status_demande', 1) // Annuler uniquement les demandes en attente
        ->update(['status_demande' => 3]); // Rejetée

    return redirect()->route('detail_bon_requisition', ['id' => $detail->requisition_id])
        ->with('success', "Tous les détails de la demande ont été annulés !");
}


public function print_bon_requisition($id)
{
    // 1. Récupérer le bon avec ses relations (demandeur, service, direction, stock)

   $bon_requisition = DB::table('bon_requisitions_stocks')
    ->join('users', 'users.id', '=', 'bon_requisitions_stocks.demandeur_id')
    ->leftJoin('services', 'services.idservice', '=', 'bon_requisitions_stocks.service_id')
    ->leftJoin('directions', 'directions.id_direction', '=', 'services.direction_id')
    ->leftJoin('stocks', 'stocks.id_stock', '=', 'bon_requisitions_stocks.stock_id')
    ->where('bon_requisitions_stocks.id_requisition', $id)
    ->select(
        'bon_requisitions_stocks.*',
        'services.nom_service',
        'users.name as demandeur',
        'directions.nom_direction',
        'stocks.*'
    )
    ->first();
    if (!$bon_requisition) {
        return back()->withErrors("Bon de réquisition introuvable.");
    }

    // 2. Récupérer tous les détails du bon
    $all_details = DB::table('detail_bon_requisition_stocks')
        ->where('requisition_id', $id)
        ->get();

    if ($all_details->isEmpty()) {
        return back()->withErrors("Aucun article trouvé pour ce bon de réquisition.");
    }

    // 3. Vérifier que tous les articles sont soit approuvés (2) soit rejetés (3)
    $non_valides = $all_details->filter(function ($detail) {
        return !in_array($detail->status_demande, [2, 3]);
    });

    if ($non_valides->isNotEmpty()) {
        return back()->withErrors("Impossible d'imprimer : tous les articles doivent être approuvés ou rejetés.");
    }

    // 4. Récupérer uniquement les articles approuvés (pour l'affichage) avec leurs libellés
    $articles_approuves = DB::table('detail_bon_requisition_stocks')
        ->join('articles_stocks', 'articles_stocks.id_article', '=', 'detail_bon_requisition_stocks.article_id')
        ->where('detail_bon_requisition_stocks.requisition_id', $id)
        ->where('detail_bon_requisition_stocks.status_demande', 2)
        ->select(
            'detail_bon_requisition_stocks.*',
            'articles_stocks.nom_article'
        )
        ->get();

    // 5. personnels siganteurs
    $chef_service_demandeur = User::join('bon_requisitions_stocks', 'bon_requisitions_stocks.service_id', '=', 'users.service_id')
                            ->leftjoin('services', 'services.chefservice_id', '=', 'users.id')
                             ->where('bon_requisitions_stocks.service_id', $bon_requisition->service_id)->first();

    $chef_service_stock = User::join('stocks', 'stocks.service_en_charge_id', '=', 'users.service_id')
                            ->leftjoin('services', 'services.chefservice_id', '=', 'users.id')
                            ->leftjoin('postes', 'postes.idposte', '=', 'users.poste_id')
                             ->where('stocks.id_stock', $bon_requisition->stock_id)->first(); // Récupérer un utilisateur du service de stock pour le chef de service stock
      
    $directeur_hierarchique = User::join('directions', 'directions.directeur_id', '=', 'users.id')
                            ->leftJoin('services', 'directions.id_direction', '=', 'services.direction_id')
                            ->leftjoin('bon_requisitions_stocks', 'bon_requisitions_stocks.service_id', '=', 'services.idservice')
                             ->where('bon_requisitions_stocks.service_id', $bon_requisition->service_id)->first(); 
                            
    $chef_departement = "Nom de chef de departement";
    //Données pour la vue PDF
    $data = [
        'articles'          => $articles_approuves,
        'numero_requisition'=> $bon_requisition->numero_requisition ?? null,
        'date_requisition'  => $bon_requisition->date_requisition ?? null,
        'demandeur'         => $bon_requisition->demandeur->name ?? $bon_requisition->demandeur,
        'nom_direction'     => $bon_requisition->nom_direction ?? null,
        'nom_service'       => $bon_requisition->nom_service ?? null,       
        'nom_stock'         => $bon_requisition->nom_stock ?? null,
        'chef_service_demandeur' => $chef_service_demandeur->name ?? "Chef de service demandeur non défini",
        'chef_service_stock' => $chef_service_stock->name ?? "Chef de service stock non défini",
        'poste_chef_service_stock' => $chef_service_stock->nom_poste ?? "Poste non défini",
        'directeur_hierarchique' =>  $directeur_hierarchique->name ?? "Directeur hiérarchique non défini",
        'chef_departement' => $chef_departement,
    ];

    $pdf = Pdf::loadView('stockDivers_views.formulaires.print_bon_requisition', $data)
              ->setPaper('A4', 'portrait');

    return $pdf->stream("Bon_Requisition_{$bon_requisition->numero_requisition}.pdf");
}


/////////////////-----------------------initialisation des stocks divers----------------
	public function stock_divers_initials(){

		$stock_divers_initials=DB::table('stock_divers_initials')
	                ->join('articles_stocks','stock_divers_initials.article_id','=','articles_stocks.id_article')
                    ->leftjoin('categories','articles_stocks.categorie_id','=','categories.id_categorie')
	                ->select('*')->get();

        //articles qui sont dans la table stock_divers_initials pour eviter de les afficher dans le formulaire d'initialisation des stocks divers
        $articles_ids = $stock_divers_initials->pluck('article_id')->toArray();            
		$articles = DB::table('articles_stocks')->select('*')->whereNotIn('id_article', $articles_ids)->get();

	    return view('stockDivers_views.stock_divers.stock_divers_initials',compact('articles','stock_divers_initials'));
	}


    public function save_stock_divers_initial(Request $request)
    {
        $request->validate([
            'article_id' => 'required|exists:articles_stocks,id_article',
            'stock_inventorier' => 'required|numeric|min:0',
            'qte_reserver' => 'nullable|numeric|min:0',
            'cump_article' => 'required|numeric|min:0',
            'initialiser_le' => 'required|date'
        ]);

         $stock_article = DB::table('articles_stocks')->where('id_article', $request->article_id)->first();
         if (!$stock_article) {
            return redirect()->back()->withErrors("Article introuvable.");
        }

        $stock = new Stock_divers_initial();
        $stock->article_id = $request->article_id;
        $stock->qte_stock = $request->stock_inventorier;
        $stock->stock_inventorier = $request->stock_inventorier;
        $stock->qte_disponible = $request->stock_inventorier; 
        $stock->qte_reserver = 0;
        $stock->cump_article = $request->cump_article;
        $stock->initialiser_par= Auth::user()->id; 
        $stock->initialiser_le= $request->initialiser_le;
        $stock->categorie_id = $stock_article->categorie_id; 
          $stock->save();

            return redirect()->back()->with('success' , 'Initialisation faite avec succès.!');  
  }
public function edit_stock_article(Request $request, $id)
{
    $request->validate([
        'stock_inventorier' => 'required|numeric|min:0',
        'qte_reserver' => 'nullable|numeric|min:0',
        'cump_article' => 'required|numeric|min:0',
    ]);
    $stock = Stock_divers_initial::find($id);
    if (!$stock) {
        return redirect()->back()->withErrors("Stock introuvable.");
    }
    $stock_article = DB::table('stock_divers_initials')->where('article_id', $stock->article_id)->update([
        'qte_stock' => $request->stock_inventorier,
        'qte_disponible' => $request->stock_inventorier - $request->qte_reserver,
        'qte_reserver' => $stock->qte_reserver,
        'cump_article' => $request->cump_article,
        'updated_at' => Carbon::now('Africa/Bujumbura')
    ]);
    return redirect()->back()->with('success', 'Stock mis à jour avec succès.');
    
}

  public function entrer_article_stock(Request $request){

     $mvt = new MouvementsStock();
        $mvt->article_id = $stock_article->id_article;
        $mvt->type_mvt = $request->type_mouvement;
        $mvt->qte_avant_mvt = 0;
        $mvt->quantite = $stock->qte_stock;
        $mvt->prix_mvt = $stock->cump;
        $mvt->qte_apres_mvt = $stock->qte_stock;
        $mvt->reference_type = "Initialisation" ;
        $mvt->motif_mvt = "Stock initial" ;
        $mvt->date_mouvement = $stock->initialiser_le;
        $mvt->created_by = Auth::user()->name;
        $mvt->save();

  }
  //-----------------------requisition en cours de stock----------------
public function transfer_requisition_stock($id)
{
    $bon = BonRequisitionsStock::find($id);
    if (!$bon) {
        return redirect()->back()->withErrors("Bon de réquisition introuvable.");
    }

    // 2. Récupérer tous les détails du bon
    $all_details = DB::table('detail_bon_requisition_stocks')
        ->where('requisition_id', $id)
        ->get();

    if ($all_details->isEmpty()) {
        return back()->withErrors("Aucun article trouvé pour ce bon de réquisition.");
    }

    // 3. Vérifier que tous les articles sont soit approuvés (2) soit rejetés (3)
    $non_valides = $all_details->filter(function ($detail) {
        return !in_array($detail->status_demande, [2, 3]);
    });

    if ($non_valides->isNotEmpty()) {
        return back()->withErrors("Impossible de transférer au stock : tous les articles doivent être approuvés ou rejetés.");
    }

    if ($bon->statut_requisition != 1) { // 1 = en attente
        return redirect()->back()->withErrors("Seules les réquisitions en attente peuvent être transférées au stock.");
    }   
    $bon->statut_requisition = 2; // 2 = transféré au stock
    $bon->save();   
    
    return redirect()->route('all_requisitions')
        ->with('success', "Bon de réquisition transféré au stock avec succès !");}



        /////////////////////////////////////////////// stock------------------------------------------------------------------------
public function requistions_en_stock()
{
    $requisitions = DB::table('bon_requisitions_stocks')
    ->leftjoin('services', 'services.idservice', '=', 'bon_requisitions_stocks.service_id')
    ->leftjoin('directions', 'directions.id_direction', '=', 'services.direction_id')
    ->leftjoin('users', 'users.id', '=', 'bon_requisitions_stocks.demandeur_id')
    ->leftjoin('stocks', 'stocks.id_stock', '=', 'bon_requisitions_stocks.stock_id')
    ->where('bon_requisitions_stocks.statut_requisition', 2) // 2 = transféré au stock
    ->orderBy('bon_requisitions_stocks.id_requisition', 'desc')
    ->select('bon_requisitions_stocks.*', 'services.nom_service', 'users.name', 'directions.nom_direction', 'stocks.nom_stock')
    ->get();
$nom_stock = ' STOCK DIVERS ';
    return view('stockDivers_views.stock_divers.requistions_en_stock', compact('requisitions', 'nom_stock'));
}

public function detail_requisition_en_stock($id)
{
$info_requisition = BonRequisitionsStock::leftJoin('services', 'services.idservice', '=', 'bon_requisitions_stocks.service_id')
->leftJoin('directions', 'directions.id_direction', '=', 'services.direction_id')
->join('users', 'users.id', '=', 'bon_requisitions_stocks.demandeur_id')
->leftJoin('stocks', 'stocks.id_stock', '=', 'bon_requisitions_stocks.stock_id')
->where('bon_requisitions_stocks.id_requisition', $id)
->select('bon_requisitions_stocks.*', 'services.nom_service', 'users.name', 'directions.nom_direction', 'stocks.nom_stock')
->first();
    if (!$info_requisition) {
        return redirect()->back()->withErrors("Bon de réquisition introuvable.");
    }
//recuperer categorie du stock pour afficher les articles de ce stock dans le detail du bon de requisition
$categorie_stock = DB::table('stock_categories')
    ->where('stock_id', $info_requisition->stock_id)->first();
$articles = DB::table('articles_stocks')
        ->where('categorie_id', $categorie_stock->categorie_id)
        ->get();
    $requisition_details  = DB::table('detail_bon_requisition_stocks')
        ->leftJoin('articles_stocks', 'articles_stocks.id_article', '=', 'detail_bon_requisition_stocks.article_id')
        ->where('detail_bon_requisition_stocks.requisition_id', $id)
        ->select('detail_bon_requisition_stocks.*', 'articles_stocks.*')
        ->get();
$users = User::join('user_roles', 'user_roles.user_id', '=', 'users.id')
        ->leftjoin('user_informations', 'user_informations.id_user_info', '=', 'users.id')
        ->whereIn('user_roles.role_id', [43])
        ->where('users.id', '!=', 0)
         ->orderBy('users.name','ASC')
        ->select('users.id','users.name','user_informations.matricule')
        ->get();
    return view('stockDivers_views.stock_divers.details_requisition_stock', compact('requisition_details', 'articles','info_requisition', 'users'));
}
 public function Articles_entres(){
   
    $articles_entres = DB::table('bon_requisitions_stocks')
            ->leftjoin('services', 'services.idservice', '=', 'bon_requisitions_stocks.service_id')
            ->leftjoin('demandes_achat_stocks', 'demandes_achat_stocks.requisition_id', '=', 'bon_requisitions_stocks.id_requisition')
            ->leftjoin('bon_commande_achats', 'demandes_achat_stocks.id_demande_achat', '=', 'bon_commande_achats.demande_achat_id')
            ->leftjoin('users', 'users.id', '=', 'bon_requisitions_stocks.demandeur_id')
             ->where('bon_requisitions_stocks.statut_requisition', 7)
             ->where('demandes_achat_stocks.statut_demande_achat', 7)
             ->where('bon_commande_achats.status_bon_commande', 7)
            ->orderBy('bon_requisitions_stocks.id_requisition', 'desc')
            ->select('bon_requisitions_stocks.*', 'services.nom_service', 'users.name','bon_commande_achats.id_bon_commande_achat','bon_commande_achats.numero_bon_commande','demandes_achat_stocks.numero_demande_achat')
            ->get();
      // return $articles_entres;
            return view('stockDivers_views.stock_divers.articles_entres', compact('articles_entres'));
        }

        public function detail_bon_commande_stock($id_bon_commande_achat){

    $info_bonCommande = BonCommandeAchat::where('id_bon_commande_achat', $id_bon_commande_achat)->first();

    if (!$info_bonCommande) {
        return back()->with('error', 'Bon de commande introuvable.');
    }
    $info_requisition = BonRequisitionsStock::leftJoin('services', 'services.idservice', '=', 'bon_requisitions_stocks.service_id')
               ->leftjoin('demandes_achat_stocks', 'demandes_achat_stocks.requisition_id', '=', 'bon_requisitions_stocks.id_requisition')
              ->leftjoin('bon_commande_achats', 'demandes_achat_stocks.id_demande_achat', '=', 'bon_commande_achats.demande_achat_id')
                ->leftJoin('directions', 'directions.id_direction', '=', 'services.direction_id')
                ->join('users', 'users.id', '=', 'bon_requisitions_stocks.demandeur_id')
                ->where('bon_commande_achats.id_bon_commande_achat', $info_bonCommande->id_bon_commande_achat)
                ->select('bon_requisitions_stocks.*', 'services.nom_service', 'users.name', 'directions.nom_direction','demandes_achat_stocks.numero_demande_achat')
                ->first();

    if (!$info_requisition) {
        return redirect()->back()->withErrors("Bon de réquisition introuvable.");
    }

    $bon_commande_details  = DB::table('detail_bon_commande_achats')
        ->leftJoin('articles_stocks', 'articles_stocks.id_article', '=', 'detail_bon_commande_achats.article_id')
        ->leftJoin('bon_commande_achats', 'bon_commande_achats.id_bon_commande_achat', '=', 'detail_bon_commande_achats.bon_commande_id')
        ->where('detail_bon_commande_achats.bon_commande_id', $id_bon_commande_achat)
        ->select('detail_bon_commande_achats.*', 'articles_stocks.*','bon_commande_achats.*')
        ->get();
$users = User::join('user_roles', 'user_roles.user_id', '=', 'users.id')
        ->leftjoin('user_informations', 'user_informations.id_user_info', '=', 'users.id')
        ->whereIn('user_roles.role_id', [43])
        ->where('users.id', '!=', 0)
        ->where('users.service_id', 3) //3: id du service Achat
        ->orderBy('users.name','ASC')
        ->select('users.id','users.name','user_informations.matricule')
        ->get();
    return view('stockDivers_views.stock_divers.details_bon_commande', compact('bon_commande_details', 'info_bonCommande','info_requisition','users'));
}

}