<?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\DetailDemandeFraisStock;
use App\Models\DetailBonCommandeAchat;
use App\Models\DemandesFraisStock;
use NumberFormatter;
use App\Models\User; 
use Carbon\Carbon; 
use Barryvdh\DomPDF\Facade\Pdf;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class DemandeAchatStockController extends Controller
{
   public function __construct()
    {
        $this->middleware('auth');
    }

// --------------------------pour achat##############################################------------------------------------
 public function requisitions_achat()
{
    $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', 4) // 2 = encours du service achats
    ->orderBy('bon_requisitions_stocks.id_requisition', 'desc')
    ->select('bon_requisitions_stocks.*', 'services.nom_service', 'users.name', 'directions.nom_direction', 'stocks.nom_stock')
    ->get();

    return view('stockDivers_views.service_achat.requisitions_achat', compact('requisitions'));
    
}
public function detail_requisition_achat($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

    $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();

    return view('stockDivers_views.service_achat.details_requisition_achat', compact('requisition_details', 'info_requisition',));
} 

public function genere_demande_achat(Request $request)
{
    // 1. Validation
    $validated = $request->validate([
        'id_requisition'        => 'required|exists:bon_requisitions_stocks,id_requisition',
        'date_demande_achat'    => 'required|date|before_or_equal:today',
        'observation_generale'  => 'nullable|string|max:500',
    ]);

    $requisitionId = $validated['id_requisition'];
    $dateDemande   = $validated['date_demande_achat'];
    $observation   = $validated['observation_generale'];

    // 2. Vérifier qu'aucune demande n'existe déjà
    $existe = DemandesAchatStock::where('requisition_id', $requisitionId)->exists();
    if ($existe) {
        return redirect()->back()->withErrors('Une demande d’achat a déjà été générée pour ce bon de réquisition.');
    }
  $bon_requisition = BonRequisitionsStock::find($requisitionId);
    if (!$bon_requisition) {
        return redirect()->back()->withErrors("Bon de réquisition introuvable.");
    }
    // 3. Récupérer les articles approuvés
    $articlesApprouves = 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', $requisitionId)
        ->where('detail_bon_requisition_stocks.status_demande', 2) // approuvé
        ->select(
            'detail_bon_requisition_stocks.*',
            'articles_stocks.nom_article'
        )
        ->get();

    if ($articlesApprouves->isEmpty()) {
        return redirect()->back()->withErrors('Aucun ArticlesStock approuvé trouvé pour ce bon de réquisition.');
    }

    // 4. Génération du numéro unique (transaction)
    $prefixe  = 'DAP';
    $codeBon  = 'DA';
    $annee    = now()->year;

    $result = DB::transaction(function () use ($prefixe, $codeBon, $annee) {
        $dernierNumero = DB::table('demandes_achat_stocks')
            ->where('numero_demande_achat', 'like', $prefixe . '/' . $codeBon . '/%/' . $annee)
            ->lockForUpdate()
            ->orderBy('numero_demande_achat', 'desc')
            ->value('numero_demande_achat');

        if ($dernierNumero) {
            $parts = explode('/', $dernierNumero);
            $dernierCompteur = (int)($parts[2] ?? 0);
            $nouveauCompteur = $dernierCompteur + 1;
        } else {
            $nouveauCompteur = 1;
        }

        if ($nouveauCompteur > 9999) {
            return ['error' => true, 'message' => "Limite annuelle atteinte ($nouveauCompteur/9999)"];
        }

        $numero = sprintf('%s/%s/%04d/%d', $prefixe, $codeBon, $nouveauCompteur, $annee);
        return ['error' => false, 'numero' => $numero];
    });

    if ($result['error']) {
        return redirect()->back()->withErrors($result['message'] ?? "Impossible de générer un numéro (limite atteinte pour l'année $annee).");
    }

    // 5. Création de la demande d'achat (avec transaction globale)
    $demande = null;

    DB::transaction(function () use ($result, $requisitionId, $dateDemande, $observation, $articlesApprouves, &$demande) {
        // 5.1 Créer la demande principale
           $demande = new DemandesAchatStock();
    $demande->numero_demande_achat = $result['numero'];
    $demande->requisition_id = $requisitionId;
    $demande->date_demande_achat = $dateDemande;
    $demande->statut_demande_achat = 1; // 1 = en cours
    $demande->employe_createur_id = auth()->id();  // plus sûr que Auth::id()
    $demande->observation_achat = $observation;
    $demande->save();

        // 5.2 Créer les lignes de détails
        foreach ($articlesApprouves as $ArticlesStock) {
                $detail = new DetailDemandesAchatStock();
                $detail->article_id = $ArticlesStock->article_id;
                $detail->qte_demande = $ArticlesStock->qte_demandee_requisition;
                $detail->article_id = $ArticlesStock->article_id;
                 $detail->demande_achat_id =  $demande->id_demande_achat ; // id du demande d'achat
                 $detail->save();
        }
    });
   $bon_requisition->update(['statut_requisition' =>5 ]); // en cours demande d'achat
  

    // 8. Redirection avec message de succès (et lien vers le PDF)
    return redirect()->route('demandes_achat')
        ->with('success', "Demande d'achat N° {$result['numero']}  générée avec succès !");
}


public function printDemandeAchat($id_demande_achat)
{
    // 1. Récupérer la demande d'achat avec sa relation (bon de réquisition)
    $demande = DemandesAchatStock::leftjoin('bon_requisitions_stocks','bon_requisitions_stocks.id_requisition' ,'=','demandes_achat_stocks.requisition_id')
                ->select('bon_requisitions_stocks.numero_requisition','demandes_achat_stocks.*')
                 ->where('id_demande_achat',$id_demande_achat)->first();
    // 2. Récupérer les détails (articles) de cette demande
    $articles = DetailDemandesAchatStock::where('demande_achat_id', $demande->id_demande_achat)
        ->join('articles_stocks', 'articles_stocks.id_article', '=', 'detail_demandes_achat_stocks.article_id')
        // ->leftjoin('demandes_achat_stocks','bon_requisitions_stocks.id_requisition' ,'=','demandes_achat_stocks.requisition_id')
          ->leftjoin('unite_mesures','unite_mesures.id_unite_mesure' ,'=','articles_stocks.unite_mesure_id')
        ->select(
            'detail_demandes_achat_stocks.*',
            'articles_stocks.nom_article',
            'unite_mesures.unite_mesure as unite'
        )
        ->get();

    if ($articles->isEmpty()) {
        return redirect()->back()->withErrors("Aucun ArticlesStock trouvé pour cette demande d'achat.");
    }

    // 3. Informations pour l'en-tête et l'observation
    $informations = [
        'direction'            => "Direction des Approvisionnements",
        'service'              => "Service des achats",
        'numero_bon_achat'     => $demande->numero_demande_achat,
        'date_demande_achat'   => $demande->date_demande_achat,
        'observation'          => $demande->observation_achat ?? 'Aucune observation',
        'numero_requisition'   => $demande->numero_requisition ?? 'N/R',
    ];
// 
    // 4. Signataires (vous pouvez les stocker en config, en BDD, ou les passer en dur)
    $signateurs = [
        'nom_service_achat' => "MUHOZA Jedidja",
        'Directeur_Appro'   => "IRAMBONA DISMAS",
        'DAF'               => "NIYONGABO Melance",
        'DGA'               => "NIKUZE Thierry Willy",
        'DG'                => "NDAYISHIMIYE Therese",
    ];

    // 5. Générer le PDF via la vue que vous avez créée
    $pdf = Pdf::loadView('stockDivers_views.formulaires.print_demande_achat', [
        'informations' => $informations,
        'articles'     => $articles,
        'signateurs'   => $signateurs,
    ]);

    // 6. Retourner le PDF en ligne (pour affichage / impression)
    return $pdf->setPaper('a4', 'portrait')
               ->stream('demande_achat_' . $demande->numero_demande_achat . '.pdf');
}

public function all_demandes_achat()
{
    // Charge toutes les demandes avec la relation requisition (et pagination)
    $demandes = DemandesAchatStock::join('bon_requisitions_stocks', 'demandes_achat_stocks.requisition_id', '=', 'bon_requisitions_stocks.id_requisition')
                ->leftJoin('services', 'services.idservice', '=', 'bon_requisitions_stocks.service_id')
                ->select('demandes_achat_stocks.*','bon_requisitions_stocks.*', 'services.nom_service')
                ->orderBy('id_demande_achat','desc')
                ->get();
    return view('stockDivers_views.service_achat.all_demandes_achats', compact('demandes'));
}
public function details_demande_achat($id)
{
    $info_bon_achat = DemandesAchatStock::where('id_demande_achat',$id)->first();
  if (!$info_bon_achat) {
        return redirect()->back()->withErrors("Demande d'achat introuvable.");
    }
$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', $info_bon_achat->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

    $achats_details  = DB::table('detail_demandes_achat_stocks')
        ->leftJoin('articles_stocks', 'articles_stocks.id_article', '=', 'detail_demandes_achat_stocks.article_id')
        ->leftJoin('demandes_achat_stocks', 'demandes_achat_stocks.id_demande_achat', '=', 'detail_demandes_achat_stocks.demande_achat_id')
        ->where('detail_demandes_achat_stocks.demande_achat_id', $id)
        ->select('detail_demandes_achat_stocks.*', 'articles_stocks.*','demandes_achat_stocks.*')
        ->get();
$fournisseur_carburants = Db::table('fournisseur_carburants')->get();

    return view('stockDivers_views.service_achat.details_achats', compact('achats_details', 'info_requisition','info_bon_achat','fournisseur_carburants'));
} 

 public function rejetter_demande_achat($id){
        $info_bon_achat =  DemandesAchatStock::where('id_demande_achat',$id)->first();
 if (!$info_bon_achat) {
        return redirect()->back()->withErrors("Demande d'achat introuvable.");
    }
    $info_bon_achat->update(['statut_demande_achat' => 0]);
     return redirect()->back()->with('success',"Demande d'achat rejetée avec succès !");
 }

public function genere_bon_commande(Request $request)
{
    $request->validate([
        'id_demande_achat' => 'required|exists:demandes_achat_stocks,id_demande_achat',
        'date_demande_achat' => 'required|date',
        'fournisseur_id' => 'required|exists:fournisseur_carburants,id_fournisseur_carburant',
        'payer_tva' => 'nullable',
        'observation_generale' => 'nullable|string',
        'article_id' => 'required|array',
        'article_id.*' => 'required',
        'qte_demande' => 'required|array',
        'qte_demande.*' => 'required|numeric|min:1',
        'pu_demande' => 'required|array',
        'pu_demande.*' => 'required|numeric|min:0',
    ]);

  $verify = BonCommandeAchat::where('demande_achat_id',$request->id_demande_achat)->first();
            if( $verify){
        return redirect()->back()->with("error", "Erreur: La demande d'achat ID:{$request->id_demande_achat} existe sur la table des bons de commande");   
            }
    try {
        DB::beginTransaction();

        // Générer le numéro de bon de commande : DAP/BC/0001/2026
        $annee = date('Y');
        $dernier = BonCommandeAchat::whereYear('created_at', $annee)
                    ->orderBy('id_bon_commande_achat', 'desc')
                    ->first();
        if ($dernier) {
            $dernierNum = (int) explode('/', $dernier->numero_bon_commande)[2];
            $nouveauNum = str_pad($dernierNum + 1, 4, '0', STR_PAD_LEFT);
        } else {
            $nouveauNum = '0001';
        }
        $numero_bon_commande = "DAP/BC/{$nouveauNum}/{$annee}";

        // Création du bon de commande
        $bonCommande = BonCommandeAchat::create([
            'numero_bon_commande' => $numero_bon_commande,
            'date_bon_commande' => $request->date_demande_achat,
            'demande_achat_id' => $request->id_demande_achat,
            'fournisseur_id' => $request->fournisseur_id,
            'status_bon_commande'=> 1, //en cours
            'payer_tva' => $request->has('payer_tva') ? 1 : 0,
        ]);
      
        // Enregistrement des détails
        foreach ($request->article_id as $index => $article_id) {
            // Vous devez récupérer l'id réel de l'ArticlesStock à partir de son nom (ou passer l'id directement)

            $ArticlesStock = ArticlesStock::where('id_article', $article_id)->first();
            if (!$ArticlesStock) {
                // Gestion d'erreur si l'ArticlesStock n'existe pas
                throw new \Exception("ArticlesStock {$articleNom} introuvable");
            }
            DetailBonCommandeAchat::create([
                'bon_commande_id' => $bonCommande->id_bon_commande_achat,
                'article_id' => $ArticlesStock->id_article,
                'qte_demande' => $request->qte_demande[$index],
                'pu_demande' => $request->pu_demande[$index],
            ]);
        }

        // Mise à jour du statut de la demande d'achat (par exemple passage à 5)
        $DemandesAchatStock =  DemandesAchatStock::where('id_demande_achat',$request->id_demande_achat)->first();
       
        if ($DemandesAchatStock) {
            $DemandesAchatStock->statut_demande_achat = 8; // Autoriser a faire demande des frais
            $DemandesAchatStock->save();
        }

        DB::commit();

        return redirect()->route('all_bon_commandes')->with('success', "Bon de commande généré avec succès : {$numero_bon_commande}");
    } catch (\Exception $e) {
        DB::rollBack();
        return redirect()->back()->with('error', 'Erreur lors de la génération : ' . $e->getMessage());
    }
}

public function genere_demande_frais(Request $request)
{
    $request->validate([
        'id_demande_achat' => 'required|exists:demandes_achat_stocks,id_demande_achat',
        'date_demande_achat' => 'required|date',
        'motif_demande_frais' => 'nullable|string',
        'article_id' => 'required|array',
        'article_id.*' => 'required',
        'qte_demande' => 'required|array',
        'qte_demande.*' => 'required|numeric|min:1',
        'pu_demande' => 'required|array',
        'pu_demande.*' => 'required|numeric|min:0',
    ]);

    try {
        DB::beginTransaction();

        // Générer le numéro de demande de frais : DAP/DF/0001/2026
        $annee = date('Y');
        $dernier = DemandesFraisStock::whereYear('created_at', $annee)
                    ->orderBy('id_demande_frais', 'desc')
                    ->first();
        if ($dernier) {
            $dernierNum = (int) explode('/', $dernier->numero_demande_frais)[2];
            $nouveauNum = str_pad($dernierNum + 1, 4, '0', STR_PAD_LEFT);
        } else {
            $nouveauNum = '0001';
        }
        $numero_demande_frais = "DAP/DF/{$nouveauNum}/{$annee}";

        // Récupérer les infos de la demande d'achat pour service_demandeur_id et employe_createur_id
        $DemandesAchatStock = DemandesAchatStock::find($request->id_demande_achat);
        // Vous pouvez adapter selon votre logique : 
        $serviceId = $DemandesAchatStock->service_id ?? null;
        $employeId = Auth::id(); // ou l'utilisateur connecté


        // Création de la demande de frais
        $DemandesFraisStock = DemandesFraisStock::create([
            'numero_demande_frais' => $numero_demande_frais,
            'demande_achat_id' => $request->id_demande_achat,
            'date_demande' => $request->date_demande_achat,
            'employe_createur_id' => $employeId,
            'service_demandeur_id' => $serviceId,
            'statut_demande_frais' => 1, // Valeur par défaut
            'motif_demande_frais' => $request->motif_demande_frais
        ]);

        // Enregistrement des détails
        foreach ($request->article_id as $index => $article_id) {
            $ArticlesStock = ArticlesStock::where('id_article', $article_id)->first();
            if (!$ArticlesStock) {
                throw new \Exception("ArticlesStock {$article_id} introuvable");
            }
            DetailDemandeFraisStock::create([
                'demande_frais_id' => $DemandesFraisStock->id_demande_frais,
                'article_id' => $ArticlesStock->id_article,
                'qte_demande' => $request->qte_demande[$index],
                'pu_demande' => $request->pu_demande[$index],
            ]);
        }

        // Mettre à jour le statut (si nécessaire)
        if ($DemandesAchatStock) {
            $DemandesAchatStock->statut_demande_achat = 5; // même statut
            $DemandesAchatStock->save();
        }
// // Mettre à jour le statut du bon de commande (si nécessaire)
BonCommandeAchat::where('demande_achat_id', $request->id_demande_achat)
    ->update(['status_bon_commande' => 2]); // par exemple, 2 = en cours de demande de frais

        DB::commit();

        return redirect()->route('all_demandes_frais')->with('success', "Demande de frais générée : {$numero_demande_frais}");
    } catch (\Exception $e) {
        DB::rollBack();
        return redirect()->back()->with('error', 'Erreur : ' . $e->getMessage());
    }
}
public function all_bon_commandes()
{
    $demandes = BonCommandeAchat::leftjoin('demandes_achat_stocks', 'demandes_achat_stocks.id_demande_achat', '=', 'bon_commande_achats.demande_achat_id')
                ->select('bon_commande_achats.*','demandes_achat_stocks.numero_demande_achat')
                ->orderBy('id_bon_commande_achat','desc')
                ->get();
              
    return view('stockDivers_views.service_achat.all_bon_commandes', compact('demandes'));
}

public function PrintBonCommande($id)
{
    $bonCommande_info = BonCommandeAchat::leftJoin('fournisseur_carburants', 'fournisseur_carburants.id_fournisseur_carburant', '=', 'bon_commande_achats.fournisseur_id')
                        ->select('bon_commande_achats.*','fournisseur_carburants.nom_social_fournisseur')
                        ->where('id_bon_commande_achat',$id)
                        ->first();
    if (!$bonCommande_info) {
         return back()->with('error', 'Bon de commande introuvable');
    }

    $details = DetailBonCommandeAchat::join('bon_commande_achats','bon_commande_achats.id_bon_commande_achat' ,'=','detail_bon_commande_achats.bon_commande_id')
     ->Join('articles_stocks', 'articles_stocks.id_article', '=', 'detail_bon_commande_achats.article_id')
     ->leftjoin('unite_mesures','unite_mesures.id_unite_mesure' ,'=','articles_stocks.unite_mesure_id')
     ->where('detail_bon_commande_achats.bon_commande_id',$id)
      ->select('detail_bon_commande_achats.*','articles_stocks.nom_article','unite_mesures.unite_mesure as unite')->get();
    // Calcul des totaux
    $totalHTVA = 0;
    foreach ($details as $detail) {
        $totalHTVA += $detail->qte_demande * $detail->pu_demande;
    }

    $TVA = ($bonCommande_info->payer_tva == 1) ? ($totalHTVA * 18 / 100) : 0;
    $totalTVAC = $totalHTVA + $TVA;

    // Conversion en lettres
    $formatter = new \NumberFormatter('fr_FR', \NumberFormatter::SPELLOUT);
    $montantEnLettres = ($bonCommande_info->payer_tva == 1)
        ? ucfirst($formatter->format($totalTVAC))
        : ucfirst($formatter->format($totalHTVA));

    $totaux = [
        'totalHTVA'       => $totalHTVA,
        'TVA'             => $TVA,
        'totalTVAC'       => $totalTVAC,
        'montantEnLettres'=> $montantEnLettres . ' Francs Burundais TVAC'
    ];

    // Signataires (peuvent venir de config ou être fixes)
    $signateurs = [
        'Directeur_Appro' => "IRAMBONA DISMAS",
        'DGA'             => "NIKUZE Thierry Willy",
        'DG'              => "NDAYISHIMIYE Therese",
    ];

    // Génération du PDF
    $pdf = Pdf::loadView('stockDivers_views.formulaires.print_bon_commande', [
        'bonCommande_info' => $bonCommande_info,
        'detail_bonCommande' => $details,
        'totaux' => $totaux,
        'signateurs' => $signateurs,
    ]);

    return $pdf->setPaper('a4', 'portrait')
               ->stream('bon_commande_' . $bonCommande_info->numero_bon_commande . '.pdf');
}
public function details_bon_commande($id)
{
    $info_bon_commande = BonCommandeAchat::where('id_bon_commande_achat', $id)->first();
    if (!$info_bon_commande) {
        return redirect()->back()->withErrors("Bon de commande introuvable.");
    }

    $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')
        ->leftJoin('demandes_achat_stocks', 'demandes_achat_stocks.requisition_id', '=', 'bon_requisitions_stocks.id_requisition')
        ->leftJoin('bon_commande_achats', 'bon_commande_achats.demande_achat_id', '=', 'demandes_achat_stocks.id_demande_achat')
        ->where('bon_commande_achats.id_bon_commande_achat', $id)
        ->select(
            'bon_requisitions_stocks.*',
            'services.nom_service',
            'users.name',
            'directions.nom_direction',
            'stocks.nom_stock',
            'demandes_achat_stocks.numero_demande_achat'
        )
        ->first();

    if (!$info_requisition) {
        return redirect()->back()->withErrors("Bon de réquisition introuvable.");
    }

    $details_bon_commande = 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')
        ->leftJoin('fournisseur_carburants', 'fournisseur_carburants.id_fournisseur_carburant', '=', 'bon_commande_achats.fournisseur_id')
        ->where('detail_bon_commande_achats.bon_commande_id', $id)
        ->select('detail_bon_commande_achats.*', 'articles_stocks.*', 'bon_commande_achats.*')
        ->get();

    // Calcul des totaux
    $totalHTVA = 0;
    foreach ($details_bon_commande as $detail) {
        $totalHTVA += $detail->qte_demande * $detail->pu_demande;
    }

    $TVA = ($info_bon_commande->payer_tva == 1) ? ($totalHTVA * 18 / 100) : 0;
    $totalTVAC = $totalHTVA + $TVA;

    // Passage des variables individuelles à la vue (plus propre)
    return view('stockDivers_views.service_achat.details_bon_commande', compact(
        'details_bon_commande',
        'info_requisition',
        'info_bon_commande',
        'totalHTVA',
        'TVA',
        'totalTVAC'
    ));
} 
public function all_demandes_frais()
{
    $demandes = DemandesFraisStock::leftjoin('demandes_achat_stocks', 'demandes_achat_stocks.id_demande_achat', '=', 'demandes_frais_stocks.demande_achat_id')
                ->select('demandes_frais_stocks.*','demandes_achat_stocks.numero_demande_achat')
                ->orderBy('id_demande_frais','desc')
                ->get();
              
    return view('stockDivers_views.service_achat.all_demandes_frais', compact('demandes'));
}
public function Print_demande_frais($id_demande_frais)
{ 
    $demandeFrais_info = DemandesFraisStock::where('id_demande_frais',$id_demande_frais )->first();
    if (!$demandeFrais_info) {
       return back()->with('error', 'Demande des frais introuvable');
    }

    $details = DetailDemandeFraisStock::join('demandes_frais_stocks','demandes_frais_stocks.id_demande_frais'  ,'=','detail_demandes_frais_stocks.demande_frais_id')
                                ->Join('articles_stocks', 'articles_stocks.id_article', '=', 'detail_demandes_frais_stocks.article_id')
                                ->leftjoin('unite_mesures','unite_mesures.id_unite_mesure' ,'=','articles_stocks.unite_mesure_id')
                                ->select('detail_demandes_frais_stocks.*','articles_stocks.nom_article','unite_mesures.unite_mesure as unite')
                                ->where('detail_demandes_frais_stocks.demande_frais_id',$id_demande_frais)
                                ->get();  
                                // Calcul des totaux
    $totalHTVA = 0;
    foreach ($details as $detail) {
        $totalHTVA += $detail->qte_demande * $detail->pu_demande;
    }

    $TVA = ($demandeFrais_info->payer_tva == 1) ? ($totalHTVA * 18 / 100) : 0;
    $totalTVAC = $totalHTVA + $TVA;

    // Conversion en lettres
    $formatter = new \NumberFormatter('fr_FR', \NumberFormatter::SPELLOUT);
    $montantEnLettres =  ucfirst($formatter->format($totalHTVA));

    $totaux = [
        'totalHTVA'       => $totalHTVA,
        'TVA'             => $TVA,
        'totalHTVA'       => $totalHTVA,
        'montantEnLettres'=> $montantEnLettres . ' Francs Burundais'
    ];

    // Signataires (peuvent venir de config ou être fixes)
    $signateurs = [
        'chef_achat' => "MUHOZA Jedidja",
        'Directeur_Appro' => "IRAMBONA DISMAS",
        'chef_comptable' => "HARERIMANA Emelyne",
        'DAF' =>        "NIYONGABO Melance",
        'DGA'             => "NIKUZE Thierry Willy",
        'DG'              => "NDAYISHIMIYE Therese",
    ];

    // Génération du PDF
    $pdf = Pdf::loadView('stockDivers_views.formulaires.print_demande_frais', [
        'demandeFrais_info' => $demandeFrais_info,
        'montantEnLettres' => $montantEnLettres,
        'details' => $details,
        'totaux' => $totaux,
        'signateurs' => $signateurs,
    ]);

    return $pdf->setPaper('a4', 'portrait')
               ->stream('bon_commande_' . $demandeFrais_info->numero_bon_commande . '.pdf');
  
}

public function Transferer_achat_stock(int $id){

    $bonCommande = BonCommandeAchat::where('id_bon_commande_achat', $id)->first();

    if (!$bonCommande) {
        return back()->with('error', 'Bon de commande introuvable.');
    }

    if (!$bonCommande->demande_achat_id) {
        return back()->with('error', 'Aucune demande d\'achat associée à ce bon de commande.');
    }

    $demandeAchat = DemandesAchatStock::where('id_demande_achat', $bonCommande->demande_achat_id)->first();

    if (!$demandeAchat) {
        return back()->with('error', 'Demande d\'achat attachée à ce bon de commande introuvable.');
    }

    if (!$demandeAchat->requisition_id) {
        return back()->with('error', 'Aucun bon de réquisition associé à cette demande d\'achat.');
    }

    $bonRequisition = BonRequisitionsStock::where('id_requisition', $demandeAchat->requisition_id)->first();

    if (!$bonRequisition) {
        return back()->with('error', 'Bon de réquisition attaché à la demande d\'achat introuvable.');
    }

    // Mise à jour atomique des trois statuts (7 = En cours : articles entrés au stock)
    DB::transaction(function () use ($bonCommande, $demandeAchat, $bonRequisition) {
        $bonCommande->update(['status_bon_commande' => 7]);
        $demandeAchat->update(['statut_demande_achat' => 7]);
        $bonRequisition->update(['statut_requisition' => 7]);
    });

    return back()->with('success', 'Transféré au stock avec succès.');
}
}
