<?php

use Twig\Environment;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Extension\CoreExtension;
use Twig\Extension\SandboxExtension;
use Twig\Markup;
use Twig\Sandbox\SecurityError;
use Twig\Sandbox\SecurityNotAllowedTagError;
use Twig\Sandbox\SecurityNotAllowedFilterError;
use Twig\Sandbox\SecurityNotAllowedFunctionError;
use Twig\Source;
use Twig\Template;

/* intervention/validation_intervention.html.twig */
class __TwigTemplate_baf7896a51d744204d902be0ac1f849610fa6a7fef99ac888dba1cdea076a20d extends Template
{
    private $source;
    private $macros = [];

    public function __construct(Environment $env)
    {
        parent::__construct($env);

        $this->source = $this->getSourceContext();

        $this->blocks = [
            'body_class' => [$this, 'block_body_class'],
            'style_container' => [$this, 'block_style_container'],
            'title' => [$this, 'block_title'],
            'main' => [$this, 'block_main'],
            'javascripts' => [$this, 'block_javascripts'],
        ];
    }

    protected function doGetParent(array $context)
    {
        // line 1
        return "admin/layout.html.twig";
    }

    protected function doDisplay(array $context, array $blocks = [])
    {
        $macros = $this->macros;
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "intervention/validation_intervention.html.twig"));

        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "intervention/validation_intervention.html.twig"));

        $this->parent = $this->loadTemplate("admin/layout.html.twig", "intervention/validation_intervention.html.twig", 1);
        yield from $this->parent->unwrap()->yield($context, array_merge($this->blocks, $blocks));
        
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);

        
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);

    }

    // line 3
    public function block_body_class($context, array $blocks = [])
    {
        $macros = $this->macros;
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body_class"));

        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body_class"));

        // line 0
        yield "bg-grey font-size-sm";
        
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);

        
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);

        return; yield '';
    }

    // line 4
    public function block_style_container($context, array $blocks = [])
    {
        $macros = $this->macros;
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "style_container"));

        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "style_container"));

        yield "padding:0;";
        
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);

        
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);

        return; yield '';
    }

    // line 5
    public function block_title($context, array $blocks = [])
    {
        $macros = $this->macros;
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title"));

        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title"));

        yield " Validation intervention ";
        
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);

        
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);

        return; yield '';
    }

    // line 6
    public function block_main($context, array $blocks = [])
    {
        $macros = $this->macros;
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "main"));

        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "main"));

        // line 7
        yield "
<form id=\"form-change-intervention-recherche\" class=\"form form-ajax\" method=\"post\" action=\"";
        // line 8
        yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("maj_intervention_recherche", ["type" => (isset($context["type"]) || array_key_exists("type", $context) ? $context["type"] : (function () { throw new RuntimeError('Variable "type" does not exist.', 8, $this->source); })())]), "html", null, true);
        yield "\">
    <input type=\"hidden\" name=\"type_change\" form=\"form-change-intervention-recherche\" value=\"\">
    <input type=\"hidden\" name=\"data_value\" value=\"\" form=\"form-change-intervention-recherche\" >
</form>

<div class=\"d-flex bg-primary  pt-2 ps-2 ms-1 me-1  \" style=\"flex-grow:1;\">
    <form id=\"validation-form-search\" method=\"post\" class=\"w-100 form form-ajax\" data-no-reset=\"no\" data-js=\" \$('#target-show-intervention').html('');\$('#a_partir_du').val('');\" data-target-html=\"#target-list-intervention\" action=\"";
        // line 14
        yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("search_intervention_a_valider", ["type" => (isset($context["type"]) || array_key_exists("type", $context) ? $context["type"] : (function () { throw new RuntimeError('Variable "type" does not exist.', 14, $this->source); })())]), "html", null, true);
        yield "\">
        <div class=\"d-flex align-items-center justify-content-center\">
            ";
        // line 16
        $context["utilisateurSites"] = CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 16, $this->source); })()), "user", [], "any", false, false, false, 16), "getUtilisateurSites", [], "any", false, false, false, 16);
        // line 17
        yield "            ";
        if ((1 === CoreExtension::compare(Twig\Extension\CoreExtension::length($this->env->getCharset(), (isset($context["utilisateurSites"]) || array_key_exists("utilisateurSites", $context) ? $context["utilisateurSites"] : (function () { throw new RuntimeError('Variable "utilisateurSites" does not exist.', 17, $this->source); })())), 1))) {
            // line 18
            yield "                <div class=\"input-group form-group pb-2 d-flex w-auto me-4\">
                    <label class=\"white me-2  control-label align-self-center\">Site </label>
                    <select name=\"site\" style=\"width:auto\" class=\"form-control bg-grey change_recherche_intervention\"  required data-form-change=\"#form-change-intervention-recherche\" data-target=\"#target-intervention_responsable\">
                        ";
            // line 21
            $context['_parent'] = $context;
            $context['_seq'] = CoreExtension::ensureTraversable((isset($context["utilisateurSites"]) || array_key_exists("utilisateurSites", $context) ? $context["utilisateurSites"] : (function () { throw new RuntimeError('Variable "utilisateurSites" does not exist.', 21, $this->source); })()));
            foreach ($context['_seq'] as $context["_key"] => $context["utilisateurSite"]) {
                // line 22
                yield "                            <option value=\"";
                yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, $context["utilisateurSite"], "site", [], "any", false, false, false, 22), "id", [], "any", false, false, false, 22), "html", null, true);
                yield "\">";
                yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, $context["utilisateurSite"], "site", [], "any", false, false, false, 22), "nom", [], "any", false, false, false, 22), "html", null, true);
                yield "</option>
                        ";
            }
            $_parent = $context['_parent'];
            unset($context['_seq'], $context['_iterated'], $context['_key'], $context['utilisateurSite'], $context['_parent'], $context['loop']);
            $context = array_intersect_key($context, $_parent) + $_parent;
            // line 24
            yield "                    </select>
                </div>
            ";
        } else {
            // line 27
            yield "                <div class=\"input-group form-group pb-2 d-flex w-auto me-4\">
                    <label class=\"white me-2  control-label align-self-center\" for=\"agent_nom\" >Site</label>
                    <input type=\"text\" id=\"intervention_site\" disabled name=\"site\" class=\"form-control bg-white\" style=\"max-width: 164px;\" value=\"";
            // line 29
            yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["utilisateurSites"]) || array_key_exists("utilisateurSites", $context) ? $context["utilisateurSites"] : (function () { throw new RuntimeError('Variable "utilisateurSites" does not exist.', 29, $this->source); })()), 0, [], "array", false, false, false, 29), "getSite", [], "any", false, false, false, 29), "nom", [], "any", false, false, false, 29), "html", null, true);
            yield "\">
                </div>
            ";
        }
        // line 32
        yield "            <div class=\"input-group form-group pb-2 d-flex w-auto me-4\" id=\"target-intervention_responsable\">
                ";
        // line 33
        yield Twig\Extension\CoreExtension::include($this->env, $context, "intervention/_select_intervention_responsable.html.twig");
        yield "
            </div>
            <div class=\"input-group form-group pb-2 d-flex w-auto me-4\" id=\"target-intervention_agent\">
                ";
        // line 36
        yield Twig\Extension\CoreExtension::include($this->env, $context, "intervention/_select_intervention_agent.html.twig");
        yield "
            </div>
            <div class=\"d-flex flex-column align-items-center h-100 pb-2\" style=\"gap:0.5rem;\">
                <button class=\"btn bg-vert-vert w-100\" style=\"width: 193px !important;\" type=\"submit\">Rechercher</button>
                <button class=\"btn bg-rouge-rouge w-100\" style=\"width:193px !important\" type=\"reset\" id=\"btn-efface-recherche-validation\">Effacer</button>
            </div>
        </div>
    </form>
</div>

<div class=\"d-flex mt-2\" id=\"body-validation\">
    <div class=\"validation-left\" style=\"width: 353px; max-height: 84vh; overflow-y: auto;\" id=\"target-list-intervention\">
    </div>
    <div id=\"target-show-intervention\" class=\"d-flex flex-grow-1 mx-1\"></div>
</div>
    ";
        // line 51
        yield $this->extensions['Symfony\WebpackEncoreBundle\Twig\EntryFilesTwigExtension']->renderWebpackScriptTags("loader");
        yield "

";
        
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);

        
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);

        return; yield '';
    }

    // line 54
    public function block_javascripts($context, array $blocks = [])
    {
        $macros = $this->macros;
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->enter($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));

        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02 = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->enter($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));

        // line 55
        yield "    ";
        yield from $this->yieldParentBlock("javascripts", $context, $blocks);
        yield "
    <script type=\"module\">
        let initialValues = {};
        let valueChanged = false;
        let gridModified = false;
        
        // Fonction pour gérer le comportement sticky de validation-left
        function handleStickyBehavior() {
            const validationLeft = document.querySelector('.validation-left');
            const bodyValidation = document.getElementById('body-validation');
            
            if (!validationLeft || !bodyValidation) return;
            
            // Observer les changements de position
            const observer = new IntersectionObserver((entries) => {
                entries.forEach(entry => {
                    if (entry.target === validationLeft) {
                        const rect = entry.boundingClientRect;
                        const isSticky = rect.top <= 47;
                        
                        if (isSticky) {
                            // L'élément est en mode sticky, augmenter la hauteur
                            validationLeft.style.maxHeight = '94vh';
                        } else {
                            // L'élément n'est plus sticky, revenir à la hauteur normale
                            validationLeft.style.maxHeight = '84vh';
                        }
                    }
                });
            }, {
                threshold: [0, 1],
                rootMargin: '0px'
            });
            
            observer.observe(validationLeft);
            
            // Alternative avec scroll event pour une détection plus précise
            let ticking = false;
            function updateStickyHeight() {
                if (!ticking) {
                    requestAnimationFrame(() => {
                        const rect = validationLeft.getBoundingClientRect();
                        const isSticky = rect.top <= 47;
                        
                        if (isSticky) {
                            validationLeft.style.maxHeight = '94vh';
                        } else {
                            validationLeft.style.maxHeight = '84vh';
                        }
                        ticking = false;
                    });
                    ticking = true;
                }
            }
            
            // Écouter le scroll sur le conteneur parent
            bodyValidation.addEventListener('scroll', updateStickyHeight);
            window.addEventListener('scroll', updateStickyHeight);
        }
        
        // Initialiser le comportement sticky au chargement
        \$(document).ready(function() {
            handleStickyBehavior();
        });
        
        \$('body').on('change', '.change_recherche_intervention', function(e) {
            var form = \$(this).data('form-change');
            var name = \$(this).attr('name');
            \$(form + ' > input[name=type_change]').val(name);
            \$(form + ' > input[name=data_value]').val(\$(this).val());
            \$(form).data('target-html', \$(this).data('target'));
            \$(form).submit();
            //si nom = site on vide la selection responsable et agent
            if (name == 'site') {
                \$('#intervention_responsable').val('');
                \$('#intervention_agent').html('');
            }
            //si nom = responsable, on vide la selection agent
            else if (name == 'intervention_responsable') {
                \$('#intervention_agent').val('');
            }
        });
        \$('body').on('click', '#btn-efface-recherche-validation', function(e) {
            \$('#target-list-intervention').html('');
            \$('#target-show-intervention').html('');
        })
        \$('body').on('click', '.accordion-button', function(e) {
            // Récupérer le bouton cliqué
            var button = \$(this);

            // Faire défiler jusqu'au bouton, en le rendant visible
            button[0].scrollIntoView({
                behavior: 'smooth', // Défilement fluide
                block: 'nearest'    // Le bouton sera visible sans remonter tout en haut
            });
        });
        \$('body').on('click', '.list-group-item.show_validation', function(e) {
            var route = \$(this).data('href');
            showLoader();
            \$('.list-group-item.show_validation').removeClass('active');
            \$(this).addClass('active');
            window.getHtmlFromAjax(route)
                .then(function (data) {
                    \$('#target-show-intervention').html(data);
                })
                .catch(function (error) {
                    console.error('Erreur :', error);
                })
                .finally(function() {
                    initDevExtremeGrids('#intervention-grid-facturation');
                    initFacturationGridEvents();
                    updateMontantHTRecap();
                    updateMontantTTCRecap();
                    updatePrixTTC('deplacement');
                    updatePrixTTC('mo');
                    hideLoader();
                    saveInitialValues();
                    valueChanged = false;
                    gridModified = false;
                });
        });
        \$('body').on('change','.tva-select', function(e) {
            const group = \$(this).data('group');
            updatePrixTTC(group);
        });
        \$('body').on('click', '#add_facture-piece', function (e) {
            var datagridFacturePiece = \$('#intervention-grid-facturation').dxDataGrid('instance');
            datagridFacturePiece.addRow();
        });
        \$('body').on('change', '#mode-paiement, #mo-tva, #deplacement-tva, #montant-acompte, #contrat_type, #equipement_tva', function(e) {
            const elementId = \$(this).attr('id');
            const currentValue = getFieldValue(elementId);
            const initialValue = initialValues[elementId];

            console.log(`\${elementId}: initial=\${initialValue}, current=\${currentValue}`);

            // Mettre à jour le statut du popup
            updatePopupModifiedStatus();
        });
        \$(document).on('ready turbo:load', function() {
            if (\$('#intervention_responsable').val() != '' && \$('#intervention_agent option').length  == 1) {
                \$('#intervention_responsable').val('');
            }
        })

        function calculatePrixTTC(prixHT, tva) {
            if (!prixHT || !tva) return '';
            const prixHtNumber = parseFloat(prixHT.replace(',', '.'));
            const tvaNumber = parseFloat(tva.replace(',', '.'));
            if (isNaN(prixHtNumber) || isNaN(tvaNumber)) return '';

            const prixTTC = prixHtNumber * (1 + (tvaNumber / 100));
            return prixTTC.toFixed(2).replace('.', ',');
        }
        function initFacturationGridEvents() {
            const gridElement = '#intervention-grid-facturation';
            const grid = \$(gridElement).dxDataGrid('instance');

            if (!grid) return;

            // Configurer le style personnalisé du DataGrid
            grid.option({
                rowAlternationEnabled: false, // Désactiver l'alternance de couleurs
                rowHeight: 25, // Hauteur fixe des lignes
                onEditorPreparing: function(e) {
                    // Si c'est la colonne affectation
                    if (e.dataField === 'idproduit_facture_affectation') {
                        // Stocker la valeur originale AVANT que l'éditeur soit préparé
                        const originalValue = e.value; // e.value contient la valeur actuelle de la cellule

                        // Préserver la configuration existante du lookup
                        const columnConfig = grid.option('columns').find(col => col.dataField === 'idproduit_facture_affectation');

                        if (columnConfig && columnConfig.lookup) {
                            // Créer un éditeur personnalisé en préservant le lookup ET la valeur initiale
                            e.editorOptions = {
                                // Préserver toutes les options existantes du lookup
                                dataSource: columnConfig.lookup.dataSource,
                                displayExpr: columnConfig.lookup.displayExpr,
                                valueExpr: columnConfig.lookup.valueExpr,
                                searchEnabled: columnConfig.lookup.searchEnabled || false,
                                dropDownOptions: columnConfig.lookup.dropDownOptions || {},
                                placeholder: columnConfig.lookup.placeholder || 'Sélectionner...',

                                // IMPORTANT : Préserver la valeur initiale
                                value: originalValue,

                                // Ajouter notre gestion personnalisée
                                onValueChanged: function (args) {
                                    console.log('Valeur changée:', args);
                                    console.log('Valeur originale:', originalValue);

                                    // IMPORTANT : Mettre à jour manuellement les données de la ligne
                                    e.setValue(args.value)

                                    // Marquer la ligne comme modifiée
                                    gridModified = true;
                                    \$('#button-valider-adm').attr('data-dxpopup', true);

                                    // Si la nouvelle valeur est 4 (affectation 'S')
                                    if (args.value == 4) {
                                        // Ouvrir la popup pour le motif de service
                                        openMotifServicePopupOnAffectationChange( e.row.data, e.row.rowIndex, grid, originalValue);
                                    }
                                }
                            };
                        } else {
                            console.warn('Configuration de colonne ou lookup non trouvé pour idproduit_facture_affectation');
                            console.log('columnConfig:', columnConfig);
                        }
                    }
                },
            });

            // Écouter les événements du grid
            \$(gridElement).on('grid:contentReady grid:rowInserted grid:rowRemoved grid:rowUpdated', function(event, e) {
                updateTotalHTPieces(e.component);
                updateRecapTVA(e.component);

                if (event.type !== 'grid:contentReady') {
                    gridModified = true;
                    \$('#button-valider-adm').attr('data-dxpopup', true);
                }
            });

            // Écouter les changements sur les champs qui peuvent affecter le total
            \$('body').on('change', '#deplacement-prix-ht, #deplacement-tva, #mo-prix-ht, #mo-tva', function() {
                updateMontantHTRecap();
                updateRecapTVA(grid);
            });

            \$('body').on('change', '#montant-ttc-recap, #montant-paiement, #montant-acompte', function() {
                updateMontantDu();
                updateMontantEcart();
            });
        }

        function updatePrixTTC(group) {
            const prixHT = \$(`#\${group}-prix-ht`).val();
            const tva = \$(`#\${group}-tva option:selected`).text().replace('%', '');  // Plus complexe et fragile
            const prixTTC = calculatePrixTTC(prixHT, tva);
            if (prixTTC != '') {
                \$(`#\${group}-intervention-prix-ttc`).val(String(prixTTC) + '€');
            }
        }
        function formatNumber(number) {
            return number.toFixed(2).replace('.', ',');
        }

        // Fonction pour parser un nombre au format français
        function parseNumber(str) {
            if (!str) return 0;
            return parseFloat(str.replace(',', '.')) || 0;
        }

        function updateTotalHTPieces(gridInstance) {
            let total = 0;
            // Somme de tous les total_ht du tableau
            const visibleRows = gridInstance.getVisibleRows();
            visibleRows.forEach(function(row) {
                if (row.data && row.data.total_ht && row.data.affectation == 'F') {
                    total += parseNumber(String(row.data.total_ht));
                }
            });

            \$('#total-ht-pieces').val(formatNumber(total) + ('€'));
            
            // Mettre à jour le total TTC des pièces
            updateTotalTTCPieces();
            
            // Déclencher la mise à jour du récapitulatif
            updateMontantHTRecap();
        }

        // Fonction pour mettre à jour le montant HT récap
        function updateMontantHTRecap() {
            const totalHTPieces = parseNumber(\$('#total-ht-pieces').val().replace('%', ''));
            const totalHTDeplacement = parseNumber(\$('#deplacement-prix-ht').val());
            const totalHTMO = parseNumber(\$('#mo-prix-ht').val());

            const totalHT = totalHTPieces + totalHTDeplacement + totalHTMO;
            \$('#montant-ht-recap').val(String(formatNumber(totalHT)) + '€');

            // Déclencher la mise à jour du TTC
            updateMontantTTCRecap();
        }

        // Fonction pour mettre à jour le montant TTC récap
        function updateMontantTTCRecap() {
            const montantHT = parseNumber(\$('#montant-ht-recap').val());
            const montantTVA = parseNumber(\$('#montant-tva-recap').val());

            const montantTTC = montantHT + montantTVA;
            \$('#montant-ttc-recap').val(String(formatNumber(montantTTC)) + '€');
            
            // Mettre à jour le montant dû
            updateMontantDu();
            updateMontantEcart();
        }

        function updateTotalTTCPieces() {
            const totalHTPieces = parseNumber(\$('#total-ht-pieces').val());
            const totalTVAPieces = parseNumber(\$('#total-recap-tab-tva').val());
            
            const totalTTCPieces = totalHTPieces + totalTVAPieces;
            \$('#total-ttc-pieces').val(formatNumber(totalTTCPieces) + '€');
        }

        function updateRecapTVA(gridInstance) {
            // Objet pour stocker les totaux par taux de TVA
            let tvaRecap = {};

            // 1. Récupérer les TVA du grid
            gridInstance.getVisibleRows().forEach(function(row) {
                if (row.data && row.data.total_ht && row.data.taux_tva && row.data.affectation == 'F') {
                    const taux = parseNumber(String(row.data.taux_tva));
                    const ht = parseNumber(String(row.data.total_ht));
                    const tva = (ht * taux) / 100;

                    if (!tvaRecap[taux]) {
                        tvaRecap[taux] = { baseHT: 0, montantTVA: 0 };
                    }
                    tvaRecap[taux].baseHT += ht;
                    tvaRecap[taux].montantTVA += tva;
                }
            });

            // 2. Ajouter TVA du déplacement
            const deplacementHT = parseNumber(\$('#deplacement-prix-ht').val());
            const deplacementTVA = parseNumber(\$('#deplacement-tva option:selected').text().replace('%', ''));
            if (deplacementHT && deplacementTVA) {
                const tva = (deplacementHT * deplacementTVA) / 100;
                if (!tvaRecap[deplacementTVA]) {
                    tvaRecap[deplacementTVA] = { baseHT: 0, montantTVA: 0 };
                }
                tvaRecap[deplacementTVA].baseHT += deplacementHT;
                tvaRecap[deplacementTVA].montantTVA += tva;
            }

            // 3. Ajouter TVA de la main d'œuvre
            const moHT = parseNumber(\$('#mo-prix-ht').val());
            const moTVA = parseNumber(\$('#mo-tva option:selected').text().replace('%', ''));
            if (moHT && moTVA) {
                const tva = (moHT * moTVA) / 100;
                if (!tvaRecap[moTVA]) {
                    tvaRecap[moTVA] = { baseHT: 0, montantTVA: 0 };
                }
                tvaRecap[moTVA].baseHT += moHT;
                tvaRecap[moTVA].montantTVA += tva;
            }

            // 4. Mettre à jour le tableau récapitulatif
            const tbody = \$('#tab-recap-taux tbody');
            tbody.empty();

            let totalTVA = 0;
            let nbLignes = 0;

            // Trier les taux de TVA
            Object.keys(tvaRecap).sort((a, b) => parseFloat(a) - parseFloat(b)).forEach(function(taux) {
                const recap = tvaRecap[taux];
                tbody.append(`
            <tr style=\"height:25px\">
                <td class=\"text-center\">\${formatNumber(recap.baseHT)}€</td>
                <td class=\"text-center\">\${formatNumber(parseFloat(taux))}%</td>
                <td class=\"text-center\">\${formatNumber(recap.montantTVA)}€</td>
            </tr>
        `);
                totalTVA += recap.montantTVA;
                nbLignes++;
            });

            // Compléter avec des lignes vides pour atteindre minimum 3 lignes
            const lignesManquantes = Math.max(0, 3 - nbLignes);
            for (let i = 0; i < lignesManquantes; i++) {
                tbody.append('<tr style=\"height: 25px\"><td colspan=\"3\"></td></tr>');
            }

            // 5. Mettre à jour le montant total de TVA

            \$('#total-recap-tab-tva').val(String(formatNumber(totalTVA)) + '€');
            \$('#montant-tva-recap').val(String(formatNumber(totalTVA)) + '€');

            // 6. Mettre à jour le total TTC des pièces
            updateTotalTTCPieces();

            // 7. Déclencher la mise à jour du TTC
            updateMontantTTCRecap();
        }
        function updateMontantDu() {
            const montantTTC = parseNumber(\$('#montant-ttc-recap').val());
            const montantPaiement = parseNumber(\$('#montant-paiement').val());

            const montantDu = montantTTC - montantPaiement;
            \$('#montant-du').val(formatNumber(montantDu) + '€');
        }

        function updateMontantEcart() {
            const montantTTC = parseNumber(\$('#montant-ttc-recap').val());
            const montantPaiement = parseNumber(\$('#montant-paiement').val());

            const ecart = montantTTC - montantPaiement;
            \$('#montant-ecart').val(formatNumber(ecart) + '€');
        }
        // Fonction pour ouvrir la popup motif_service
        // Fonction synchrone pour ouvrir la popup et récupérer le motif
        function openMotifServicePopupOnAffectationChange(rowData, rowIndex, grid, originalAffectationValue) {
            // Créer le contenu de la popup
            const popupContent = `
                <div class=\"modal fade\" id=\"motifServiceModal\" tabindex=\"-1\" aria-labelledby=\"motifServiceModalLabel\" aria-hidden=\"true\">
                    <div class=\"modal-dialog\">
                        <div class=\"modal-content\">
                            <div class=\"modal-header\">
                                <h5 class=\"modal-title\" id=\"motifServiceModalLabel\">Motif de service requis</h5>
                                <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>
                            </div>
                            <div class=\"modal-body\">
                                <form id=\"motifServiceForm\">
                                    <div class=\"mb-3\">
                                        <label for=\"motif_service\" class=\"form-label\">Motif de service *</label>
                                        <textarea class=\"form-control\" style= \"resize: none;\" id=\"motif_service\" name=\"motif_service\" rows=\"3\" placeholder=\"Saisissez le motif de service...\" required>\${rowData.motif_service || ''}</textarea>
                                        <div class=\"form-text\">Le motif de service est obligatoire pour cette affectation.</div>
                                    </div>
                                </form>
                            </div>
                            <div class=\"modal-footer\">
                                <button type=\"button\" class=\"btn btn-secondary\" id=\"cancelMotifService\">Annuler</button>
                                <button type=\"button\" class=\"btn btn-primary\" id=\"saveMotifService\">Enregistrer</button>
                            </div>
                        </div>
                    </div>
                </div>
            `;

            // Supprimer l'ancienne popup si elle existe
            \$('#motifServiceModal').remove();

            // Ajouter la nouvelle popup au body
            \$('body').append(popupContent);

            // Afficher la popup
            const modal = new bootstrap.Modal(document.getElementById('motifServiceModal'));
            modal.show();

            // Gérer la sauvegarde
            \$('#saveMotifService').on('click', function() {
                const motifService = \$('#motif_service').val().trim();

                if (!motifService) {
                    // Afficher une erreur si le champ est vide
                    \$('#motif_service').addClass('is-invalid');
                    return;
                }

                try {
                    // Mise à jour locale des données (sans enregistrement automatique)
                    grid.cellValue(rowIndex, \"motif_service\", motifService);
                    
                    // Marquer comme modifié pour le bouton de validation
                    gridModified = true;
                    \$('#button-valider-adm').attr('data-dxpopup', true);

                    console.log('Motif de service mis à jour localement:', motifService);
                    showSuccessMessage('Motif de service mis à jour (en attente de validation)');

                    // Fermer la popup
                    modal.hide();

                } catch (error) {
                    console.error('Erreur lors de la mise à jour locale:', error);
                    showErrorMessage('Erreur lors de la mise à jour du motif de service');
                }
            });

            // Gérer l'annulation
            \$('#cancelMotifService').on('click', function() {
                // Fermer la popup
                modal.hide();

                // Remettre la valeur précédente dans la colonne affectation
                setTimeout(() => {
                    try {
                        // Restaurer l'ancienne valeur d'affectation localement
                        rowData.idproduit_facture_affectation = originalAffectationValue;
                        
                        // Marquer comme modifié pour le bouton de validation
                        gridModified = true;
                        \$('#button-valider-adm').attr('data-dxpopup', true);
                        
                        console.log('Affectation restaurée localement:', originalAffectationValue);
                    } catch (error) {
                        console.error('Erreur lors de la restauration:', error);
                    }
                }, 100);
            });

            // Gérer la validation en temps réel
            \$('#motif_service').on('input', function() {
                if (\$(this).val().trim()) {
                    \$(this).removeClass('is-invalid');
                }
            });
        }
        // Fonctions pour afficher les messages
        function showSuccessMessage(message) {
            // Votre logique d'affichage de message de succès
            console.log('Succès:', message);
        }

        function showErrorMessage(message) {
            // Votre logique d'affichage de message d'erreur
            console.error('Erreur:', message);
        }
        function markPopupAsModified() {
            \$('#popup-validation-fiche-doc').attr('data-dxpopup', true);
        }
        function hasValueChanged(elementId) {
            const currentValue = \$(`#\${elementId}`).val();
            return initialValues[elementId] !== currentValue;
        }
        function saveInitialValues() {
            initialValues = {
                'mode-paiement': \$('#mode-paiement').val(),
                'mo-tva': \$('#mo-tva').val(),
                'deplacement-tva': \$('#deplacement-tva').val(),
                'montant-acompte': \$('#montant-acompte').val(),
                'contrat_type': \$('#contrat_type').val(),
                'equipement_tva' : \$('#equipement_tva'),
            };
        }
        function updatePopupModifiedStatus() {
            const \$popup = \$('#button-valider-adm');

            if (checkAllFieldsUnchanged()) {
                // Si toutes les valeurs sont revenues à leur état initial
                \$popup.removeAttr('data-dxpopup');
                console.log('Tous les champs sont revenus à leur état initial');
            } else {
                // Si au moins une valeur est différente
                \$popup.attr('data-dxpopup', true);
            }
        }
        function checkAllFieldsUnchanged() {
            const fields = ['mode-paiement', 'mo-tva', 'deplacement-tva', 'montant-acompte', 'contrat_type', 'equipement_tva'];
            const fieldsUnchanged = fields.every(fieldId => !hasValueChanged(fieldId));

            // Retourne true seulement si les champs ET le grid sont inchangés
            return fieldsUnchanged && !gridModified;
        }
        function getFieldValue(elementId) {
            const \$element = \$(`#\${elementId}`);

            if (\$element.hasClass('dx-widget')) {
                const widget = \$element.dxSelectBox('instance') ||
                    \$element.dxNumberBox('instance') ||
                    \$element.dxTextBox('instance');

                if (widget) {
                    return widget.option('value');
                }
            }

            return \$element.val();
        }
    </script>
";
        
        $__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02->leave($__internal_319393461309892924ff6e74d6d6e64287df64b63545b994e100d4ab223aed02_prof);

        
        $__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e->leave($__internal_085b0142806202599c7fe3b329164a92397d8978207a37e79d70b8c52599e33e_prof);

        return; yield '';
    }

    /**
     * @codeCoverageIgnore
     */
    public function getTemplateName()
    {
        return "intervention/validation_intervention.html.twig";
    }

    /**
     * @codeCoverageIgnore
     */
    public function isTraitable()
    {
        return false;
    }

    /**
     * @codeCoverageIgnore
     */
    public function getDebugInfo()
    {
        return array (  242 => 55,  232 => 54,  218 => 51,  200 => 36,  194 => 33,  191 => 32,  185 => 29,  181 => 27,  176 => 24,  165 => 22,  161 => 21,  156 => 18,  153 => 17,  151 => 16,  146 => 14,  137 => 8,  134 => 7,  124 => 6,  104 => 5,  84 => 4,  73 => 0,  63 => 3,  40 => 1,);
    }

    public function getSourceContext()
    {
        return new Source("{% extends 'admin/layout.html.twig' %}

{% block body_class 'bg-grey font-size-sm' %}
{% block style_container %}padding:0;{% endblock %}
{% block title %} Validation intervention {% endblock %}
{% block main %}

<form id=\"form-change-intervention-recherche\" class=\"form form-ajax\" method=\"post\" action=\"{{ path('maj_intervention_recherche', {type: type}) }}\">
    <input type=\"hidden\" name=\"type_change\" form=\"form-change-intervention-recherche\" value=\"\">
    <input type=\"hidden\" name=\"data_value\" value=\"\" form=\"form-change-intervention-recherche\" >
</form>

<div class=\"d-flex bg-primary  pt-2 ps-2 ms-1 me-1  \" style=\"flex-grow:1;\">
    <form id=\"validation-form-search\" method=\"post\" class=\"w-100 form form-ajax\" data-no-reset=\"no\" data-js=\" \$('#target-show-intervention').html('');\$('#a_partir_du').val('');\" data-target-html=\"#target-list-intervention\" action=\"{{ path('search_intervention_a_valider', {type: type}) }}\">
        <div class=\"d-flex align-items-center justify-content-center\">
            {% set utilisateurSites = app.user.getUtilisateurSites %}
            {% if utilisateurSites|length > 1 %}
                <div class=\"input-group form-group pb-2 d-flex w-auto me-4\">
                    <label class=\"white me-2  control-label align-self-center\">Site </label>
                    <select name=\"site\" style=\"width:auto\" class=\"form-control bg-grey change_recherche_intervention\"  required data-form-change=\"#form-change-intervention-recherche\" data-target=\"#target-intervention_responsable\">
                        {% for utilisateurSite in utilisateurSites %}
                            <option value=\"{{ utilisateurSite.site.id }}\">{{ utilisateurSite.site.nom }}</option>
                        {% endfor %}
                    </select>
                </div>
            {% else %}
                <div class=\"input-group form-group pb-2 d-flex w-auto me-4\">
                    <label class=\"white me-2  control-label align-self-center\" for=\"agent_nom\" >Site</label>
                    <input type=\"text\" id=\"intervention_site\" disabled name=\"site\" class=\"form-control bg-white\" style=\"max-width: 164px;\" value=\"{{ utilisateurSites[0].getSite.nom }}\">
                </div>
            {% endif %}
            <div class=\"input-group form-group pb-2 d-flex w-auto me-4\" id=\"target-intervention_responsable\">
                {{ include('intervention/_select_intervention_responsable.html.twig') }}
            </div>
            <div class=\"input-group form-group pb-2 d-flex w-auto me-4\" id=\"target-intervention_agent\">
                {{ include('intervention/_select_intervention_agent.html.twig') }}
            </div>
            <div class=\"d-flex flex-column align-items-center h-100 pb-2\" style=\"gap:0.5rem;\">
                <button class=\"btn bg-vert-vert w-100\" style=\"width: 193px !important;\" type=\"submit\">Rechercher</button>
                <button class=\"btn bg-rouge-rouge w-100\" style=\"width:193px !important\" type=\"reset\" id=\"btn-efface-recherche-validation\">Effacer</button>
            </div>
        </div>
    </form>
</div>

<div class=\"d-flex mt-2\" id=\"body-validation\">
    <div class=\"validation-left\" style=\"width: 353px; max-height: 84vh; overflow-y: auto;\" id=\"target-list-intervention\">
    </div>
    <div id=\"target-show-intervention\" class=\"d-flex flex-grow-1 mx-1\"></div>
</div>
    {{ encore_entry_script_tags('loader') }}

{% endblock %}
{% block javascripts %}
    {{ parent() }}
    <script type=\"module\">
        let initialValues = {};
        let valueChanged = false;
        let gridModified = false;
        
        // Fonction pour gérer le comportement sticky de validation-left
        function handleStickyBehavior() {
            const validationLeft = document.querySelector('.validation-left');
            const bodyValidation = document.getElementById('body-validation');
            
            if (!validationLeft || !bodyValidation) return;
            
            // Observer les changements de position
            const observer = new IntersectionObserver((entries) => {
                entries.forEach(entry => {
                    if (entry.target === validationLeft) {
                        const rect = entry.boundingClientRect;
                        const isSticky = rect.top <= 47;
                        
                        if (isSticky) {
                            // L'élément est en mode sticky, augmenter la hauteur
                            validationLeft.style.maxHeight = '94vh';
                        } else {
                            // L'élément n'est plus sticky, revenir à la hauteur normale
                            validationLeft.style.maxHeight = '84vh';
                        }
                    }
                });
            }, {
                threshold: [0, 1],
                rootMargin: '0px'
            });
            
            observer.observe(validationLeft);
            
            // Alternative avec scroll event pour une détection plus précise
            let ticking = false;
            function updateStickyHeight() {
                if (!ticking) {
                    requestAnimationFrame(() => {
                        const rect = validationLeft.getBoundingClientRect();
                        const isSticky = rect.top <= 47;
                        
                        if (isSticky) {
                            validationLeft.style.maxHeight = '94vh';
                        } else {
                            validationLeft.style.maxHeight = '84vh';
                        }
                        ticking = false;
                    });
                    ticking = true;
                }
            }
            
            // Écouter le scroll sur le conteneur parent
            bodyValidation.addEventListener('scroll', updateStickyHeight);
            window.addEventListener('scroll', updateStickyHeight);
        }
        
        // Initialiser le comportement sticky au chargement
        \$(document).ready(function() {
            handleStickyBehavior();
        });
        
        \$('body').on('change', '.change_recherche_intervention', function(e) {
            var form = \$(this).data('form-change');
            var name = \$(this).attr('name');
            \$(form + ' > input[name=type_change]').val(name);
            \$(form + ' > input[name=data_value]').val(\$(this).val());
            \$(form).data('target-html', \$(this).data('target'));
            \$(form).submit();
            //si nom = site on vide la selection responsable et agent
            if (name == 'site') {
                \$('#intervention_responsable').val('');
                \$('#intervention_agent').html('');
            }
            //si nom = responsable, on vide la selection agent
            else if (name == 'intervention_responsable') {
                \$('#intervention_agent').val('');
            }
        });
        \$('body').on('click', '#btn-efface-recherche-validation', function(e) {
            \$('#target-list-intervention').html('');
            \$('#target-show-intervention').html('');
        })
        \$('body').on('click', '.accordion-button', function(e) {
            // Récupérer le bouton cliqué
            var button = \$(this);

            // Faire défiler jusqu'au bouton, en le rendant visible
            button[0].scrollIntoView({
                behavior: 'smooth', // Défilement fluide
                block: 'nearest'    // Le bouton sera visible sans remonter tout en haut
            });
        });
        \$('body').on('click', '.list-group-item.show_validation', function(e) {
            var route = \$(this).data('href');
            showLoader();
            \$('.list-group-item.show_validation').removeClass('active');
            \$(this).addClass('active');
            window.getHtmlFromAjax(route)
                .then(function (data) {
                    \$('#target-show-intervention').html(data);
                })
                .catch(function (error) {
                    console.error('Erreur :', error);
                })
                .finally(function() {
                    initDevExtremeGrids('#intervention-grid-facturation');
                    initFacturationGridEvents();
                    updateMontantHTRecap();
                    updateMontantTTCRecap();
                    updatePrixTTC('deplacement');
                    updatePrixTTC('mo');
                    hideLoader();
                    saveInitialValues();
                    valueChanged = false;
                    gridModified = false;
                });
        });
        \$('body').on('change','.tva-select', function(e) {
            const group = \$(this).data('group');
            updatePrixTTC(group);
        });
        \$('body').on('click', '#add_facture-piece', function (e) {
            var datagridFacturePiece = \$('#intervention-grid-facturation').dxDataGrid('instance');
            datagridFacturePiece.addRow();
        });
        \$('body').on('change', '#mode-paiement, #mo-tva, #deplacement-tva, #montant-acompte, #contrat_type, #equipement_tva', function(e) {
            const elementId = \$(this).attr('id');
            const currentValue = getFieldValue(elementId);
            const initialValue = initialValues[elementId];

            console.log(`\${elementId}: initial=\${initialValue}, current=\${currentValue}`);

            // Mettre à jour le statut du popup
            updatePopupModifiedStatus();
        });
        \$(document).on('ready turbo:load', function() {
            if (\$('#intervention_responsable').val() != '' && \$('#intervention_agent option').length  == 1) {
                \$('#intervention_responsable').val('');
            }
        })

        function calculatePrixTTC(prixHT, tva) {
            if (!prixHT || !tva) return '';
            const prixHtNumber = parseFloat(prixHT.replace(',', '.'));
            const tvaNumber = parseFloat(tva.replace(',', '.'));
            if (isNaN(prixHtNumber) || isNaN(tvaNumber)) return '';

            const prixTTC = prixHtNumber * (1 + (tvaNumber / 100));
            return prixTTC.toFixed(2).replace('.', ',');
        }
        function initFacturationGridEvents() {
            const gridElement = '#intervention-grid-facturation';
            const grid = \$(gridElement).dxDataGrid('instance');

            if (!grid) return;

            // Configurer le style personnalisé du DataGrid
            grid.option({
                rowAlternationEnabled: false, // Désactiver l'alternance de couleurs
                rowHeight: 25, // Hauteur fixe des lignes
                onEditorPreparing: function(e) {
                    // Si c'est la colonne affectation
                    if (e.dataField === 'idproduit_facture_affectation') {
                        // Stocker la valeur originale AVANT que l'éditeur soit préparé
                        const originalValue = e.value; // e.value contient la valeur actuelle de la cellule

                        // Préserver la configuration existante du lookup
                        const columnConfig = grid.option('columns').find(col => col.dataField === 'idproduit_facture_affectation');

                        if (columnConfig && columnConfig.lookup) {
                            // Créer un éditeur personnalisé en préservant le lookup ET la valeur initiale
                            e.editorOptions = {
                                // Préserver toutes les options existantes du lookup
                                dataSource: columnConfig.lookup.dataSource,
                                displayExpr: columnConfig.lookup.displayExpr,
                                valueExpr: columnConfig.lookup.valueExpr,
                                searchEnabled: columnConfig.lookup.searchEnabled || false,
                                dropDownOptions: columnConfig.lookup.dropDownOptions || {},
                                placeholder: columnConfig.lookup.placeholder || 'Sélectionner...',

                                // IMPORTANT : Préserver la valeur initiale
                                value: originalValue,

                                // Ajouter notre gestion personnalisée
                                onValueChanged: function (args) {
                                    console.log('Valeur changée:', args);
                                    console.log('Valeur originale:', originalValue);

                                    // IMPORTANT : Mettre à jour manuellement les données de la ligne
                                    e.setValue(args.value)

                                    // Marquer la ligne comme modifiée
                                    gridModified = true;
                                    \$('#button-valider-adm').attr('data-dxpopup', true);

                                    // Si la nouvelle valeur est 4 (affectation 'S')
                                    if (args.value == 4) {
                                        // Ouvrir la popup pour le motif de service
                                        openMotifServicePopupOnAffectationChange( e.row.data, e.row.rowIndex, grid, originalValue);
                                    }
                                }
                            };
                        } else {
                            console.warn('Configuration de colonne ou lookup non trouvé pour idproduit_facture_affectation');
                            console.log('columnConfig:', columnConfig);
                        }
                    }
                },
            });

            // Écouter les événements du grid
            \$(gridElement).on('grid:contentReady grid:rowInserted grid:rowRemoved grid:rowUpdated', function(event, e) {
                updateTotalHTPieces(e.component);
                updateRecapTVA(e.component);

                if (event.type !== 'grid:contentReady') {
                    gridModified = true;
                    \$('#button-valider-adm').attr('data-dxpopup', true);
                }
            });

            // Écouter les changements sur les champs qui peuvent affecter le total
            \$('body').on('change', '#deplacement-prix-ht, #deplacement-tva, #mo-prix-ht, #mo-tva', function() {
                updateMontantHTRecap();
                updateRecapTVA(grid);
            });

            \$('body').on('change', '#montant-ttc-recap, #montant-paiement, #montant-acompte', function() {
                updateMontantDu();
                updateMontantEcart();
            });
        }

        function updatePrixTTC(group) {
            const prixHT = \$(`#\${group}-prix-ht`).val();
            const tva = \$(`#\${group}-tva option:selected`).text().replace('%', '');  // Plus complexe et fragile
            const prixTTC = calculatePrixTTC(prixHT, tva);
            if (prixTTC != '') {
                \$(`#\${group}-intervention-prix-ttc`).val(String(prixTTC) + '€');
            }
        }
        function formatNumber(number) {
            return number.toFixed(2).replace('.', ',');
        }

        // Fonction pour parser un nombre au format français
        function parseNumber(str) {
            if (!str) return 0;
            return parseFloat(str.replace(',', '.')) || 0;
        }

        function updateTotalHTPieces(gridInstance) {
            let total = 0;
            // Somme de tous les total_ht du tableau
            const visibleRows = gridInstance.getVisibleRows();
            visibleRows.forEach(function(row) {
                if (row.data && row.data.total_ht && row.data.affectation == 'F') {
                    total += parseNumber(String(row.data.total_ht));
                }
            });

            \$('#total-ht-pieces').val(formatNumber(total) + ('€'));
            
            // Mettre à jour le total TTC des pièces
            updateTotalTTCPieces();
            
            // Déclencher la mise à jour du récapitulatif
            updateMontantHTRecap();
        }

        // Fonction pour mettre à jour le montant HT récap
        function updateMontantHTRecap() {
            const totalHTPieces = parseNumber(\$('#total-ht-pieces').val().replace('%', ''));
            const totalHTDeplacement = parseNumber(\$('#deplacement-prix-ht').val());
            const totalHTMO = parseNumber(\$('#mo-prix-ht').val());

            const totalHT = totalHTPieces + totalHTDeplacement + totalHTMO;
            \$('#montant-ht-recap').val(String(formatNumber(totalHT)) + '€');

            // Déclencher la mise à jour du TTC
            updateMontantTTCRecap();
        }

        // Fonction pour mettre à jour le montant TTC récap
        function updateMontantTTCRecap() {
            const montantHT = parseNumber(\$('#montant-ht-recap').val());
            const montantTVA = parseNumber(\$('#montant-tva-recap').val());

            const montantTTC = montantHT + montantTVA;
            \$('#montant-ttc-recap').val(String(formatNumber(montantTTC)) + '€');
            
            // Mettre à jour le montant dû
            updateMontantDu();
            updateMontantEcart();
        }

        function updateTotalTTCPieces() {
            const totalHTPieces = parseNumber(\$('#total-ht-pieces').val());
            const totalTVAPieces = parseNumber(\$('#total-recap-tab-tva').val());
            
            const totalTTCPieces = totalHTPieces + totalTVAPieces;
            \$('#total-ttc-pieces').val(formatNumber(totalTTCPieces) + '€');
        }

        function updateRecapTVA(gridInstance) {
            // Objet pour stocker les totaux par taux de TVA
            let tvaRecap = {};

            // 1. Récupérer les TVA du grid
            gridInstance.getVisibleRows().forEach(function(row) {
                if (row.data && row.data.total_ht && row.data.taux_tva && row.data.affectation == 'F') {
                    const taux = parseNumber(String(row.data.taux_tva));
                    const ht = parseNumber(String(row.data.total_ht));
                    const tva = (ht * taux) / 100;

                    if (!tvaRecap[taux]) {
                        tvaRecap[taux] = { baseHT: 0, montantTVA: 0 };
                    }
                    tvaRecap[taux].baseHT += ht;
                    tvaRecap[taux].montantTVA += tva;
                }
            });

            // 2. Ajouter TVA du déplacement
            const deplacementHT = parseNumber(\$('#deplacement-prix-ht').val());
            const deplacementTVA = parseNumber(\$('#deplacement-tva option:selected').text().replace('%', ''));
            if (deplacementHT && deplacementTVA) {
                const tva = (deplacementHT * deplacementTVA) / 100;
                if (!tvaRecap[deplacementTVA]) {
                    tvaRecap[deplacementTVA] = { baseHT: 0, montantTVA: 0 };
                }
                tvaRecap[deplacementTVA].baseHT += deplacementHT;
                tvaRecap[deplacementTVA].montantTVA += tva;
            }

            // 3. Ajouter TVA de la main d'œuvre
            const moHT = parseNumber(\$('#mo-prix-ht').val());
            const moTVA = parseNumber(\$('#mo-tva option:selected').text().replace('%', ''));
            if (moHT && moTVA) {
                const tva = (moHT * moTVA) / 100;
                if (!tvaRecap[moTVA]) {
                    tvaRecap[moTVA] = { baseHT: 0, montantTVA: 0 };
                }
                tvaRecap[moTVA].baseHT += moHT;
                tvaRecap[moTVA].montantTVA += tva;
            }

            // 4. Mettre à jour le tableau récapitulatif
            const tbody = \$('#tab-recap-taux tbody');
            tbody.empty();

            let totalTVA = 0;
            let nbLignes = 0;

            // Trier les taux de TVA
            Object.keys(tvaRecap).sort((a, b) => parseFloat(a) - parseFloat(b)).forEach(function(taux) {
                const recap = tvaRecap[taux];
                tbody.append(`
            <tr style=\"height:25px\">
                <td class=\"text-center\">\${formatNumber(recap.baseHT)}€</td>
                <td class=\"text-center\">\${formatNumber(parseFloat(taux))}%</td>
                <td class=\"text-center\">\${formatNumber(recap.montantTVA)}€</td>
            </tr>
        `);
                totalTVA += recap.montantTVA;
                nbLignes++;
            });

            // Compléter avec des lignes vides pour atteindre minimum 3 lignes
            const lignesManquantes = Math.max(0, 3 - nbLignes);
            for (let i = 0; i < lignesManquantes; i++) {
                tbody.append('<tr style=\"height: 25px\"><td colspan=\"3\"></td></tr>');
            }

            // 5. Mettre à jour le montant total de TVA

            \$('#total-recap-tab-tva').val(String(formatNumber(totalTVA)) + '€');
            \$('#montant-tva-recap').val(String(formatNumber(totalTVA)) + '€');

            // 6. Mettre à jour le total TTC des pièces
            updateTotalTTCPieces();

            // 7. Déclencher la mise à jour du TTC
            updateMontantTTCRecap();
        }
        function updateMontantDu() {
            const montantTTC = parseNumber(\$('#montant-ttc-recap').val());
            const montantPaiement = parseNumber(\$('#montant-paiement').val());

            const montantDu = montantTTC - montantPaiement;
            \$('#montant-du').val(formatNumber(montantDu) + '€');
        }

        function updateMontantEcart() {
            const montantTTC = parseNumber(\$('#montant-ttc-recap').val());
            const montantPaiement = parseNumber(\$('#montant-paiement').val());

            const ecart = montantTTC - montantPaiement;
            \$('#montant-ecart').val(formatNumber(ecart) + '€');
        }
        // Fonction pour ouvrir la popup motif_service
        // Fonction synchrone pour ouvrir la popup et récupérer le motif
        function openMotifServicePopupOnAffectationChange(rowData, rowIndex, grid, originalAffectationValue) {
            // Créer le contenu de la popup
            const popupContent = `
                <div class=\"modal fade\" id=\"motifServiceModal\" tabindex=\"-1\" aria-labelledby=\"motifServiceModalLabel\" aria-hidden=\"true\">
                    <div class=\"modal-dialog\">
                        <div class=\"modal-content\">
                            <div class=\"modal-header\">
                                <h5 class=\"modal-title\" id=\"motifServiceModalLabel\">Motif de service requis</h5>
                                <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>
                            </div>
                            <div class=\"modal-body\">
                                <form id=\"motifServiceForm\">
                                    <div class=\"mb-3\">
                                        <label for=\"motif_service\" class=\"form-label\">Motif de service *</label>
                                        <textarea class=\"form-control\" style= \"resize: none;\" id=\"motif_service\" name=\"motif_service\" rows=\"3\" placeholder=\"Saisissez le motif de service...\" required>\${rowData.motif_service || ''}</textarea>
                                        <div class=\"form-text\">Le motif de service est obligatoire pour cette affectation.</div>
                                    </div>
                                </form>
                            </div>
                            <div class=\"modal-footer\">
                                <button type=\"button\" class=\"btn btn-secondary\" id=\"cancelMotifService\">Annuler</button>
                                <button type=\"button\" class=\"btn btn-primary\" id=\"saveMotifService\">Enregistrer</button>
                            </div>
                        </div>
                    </div>
                </div>
            `;

            // Supprimer l'ancienne popup si elle existe
            \$('#motifServiceModal').remove();

            // Ajouter la nouvelle popup au body
            \$('body').append(popupContent);

            // Afficher la popup
            const modal = new bootstrap.Modal(document.getElementById('motifServiceModal'));
            modal.show();

            // Gérer la sauvegarde
            \$('#saveMotifService').on('click', function() {
                const motifService = \$('#motif_service').val().trim();

                if (!motifService) {
                    // Afficher une erreur si le champ est vide
                    \$('#motif_service').addClass('is-invalid');
                    return;
                }

                try {
                    // Mise à jour locale des données (sans enregistrement automatique)
                    grid.cellValue(rowIndex, \"motif_service\", motifService);
                    
                    // Marquer comme modifié pour le bouton de validation
                    gridModified = true;
                    \$('#button-valider-adm').attr('data-dxpopup', true);

                    console.log('Motif de service mis à jour localement:', motifService);
                    showSuccessMessage('Motif de service mis à jour (en attente de validation)');

                    // Fermer la popup
                    modal.hide();

                } catch (error) {
                    console.error('Erreur lors de la mise à jour locale:', error);
                    showErrorMessage('Erreur lors de la mise à jour du motif de service');
                }
            });

            // Gérer l'annulation
            \$('#cancelMotifService').on('click', function() {
                // Fermer la popup
                modal.hide();

                // Remettre la valeur précédente dans la colonne affectation
                setTimeout(() => {
                    try {
                        // Restaurer l'ancienne valeur d'affectation localement
                        rowData.idproduit_facture_affectation = originalAffectationValue;
                        
                        // Marquer comme modifié pour le bouton de validation
                        gridModified = true;
                        \$('#button-valider-adm').attr('data-dxpopup', true);
                        
                        console.log('Affectation restaurée localement:', originalAffectationValue);
                    } catch (error) {
                        console.error('Erreur lors de la restauration:', error);
                    }
                }, 100);
            });

            // Gérer la validation en temps réel
            \$('#motif_service').on('input', function() {
                if (\$(this).val().trim()) {
                    \$(this).removeClass('is-invalid');
                }
            });
        }
        // Fonctions pour afficher les messages
        function showSuccessMessage(message) {
            // Votre logique d'affichage de message de succès
            console.log('Succès:', message);
        }

        function showErrorMessage(message) {
            // Votre logique d'affichage de message d'erreur
            console.error('Erreur:', message);
        }
        function markPopupAsModified() {
            \$('#popup-validation-fiche-doc').attr('data-dxpopup', true);
        }
        function hasValueChanged(elementId) {
            const currentValue = \$(`#\${elementId}`).val();
            return initialValues[elementId] !== currentValue;
        }
        function saveInitialValues() {
            initialValues = {
                'mode-paiement': \$('#mode-paiement').val(),
                'mo-tva': \$('#mo-tva').val(),
                'deplacement-tva': \$('#deplacement-tva').val(),
                'montant-acompte': \$('#montant-acompte').val(),
                'contrat_type': \$('#contrat_type').val(),
                'equipement_tva' : \$('#equipement_tva'),
            };
        }
        function updatePopupModifiedStatus() {
            const \$popup = \$('#button-valider-adm');

            if (checkAllFieldsUnchanged()) {
                // Si toutes les valeurs sont revenues à leur état initial
                \$popup.removeAttr('data-dxpopup');
                console.log('Tous les champs sont revenus à leur état initial');
            } else {
                // Si au moins une valeur est différente
                \$popup.attr('data-dxpopup', true);
            }
        }
        function checkAllFieldsUnchanged() {
            const fields = ['mode-paiement', 'mo-tva', 'deplacement-tva', 'montant-acompte', 'contrat_type', 'equipement_tva'];
            const fieldsUnchanged = fields.every(fieldId => !hasValueChanged(fieldId));

            // Retourne true seulement si les champs ET le grid sont inchangés
            return fieldsUnchanged && !gridModified;
        }
        function getFieldValue(elementId) {
            const \$element = \$(`#\${elementId}`);

            if (\$element.hasClass('dx-widget')) {
                const widget = \$element.dxSelectBox('instance') ||
                    \$element.dxNumberBox('instance') ||
                    \$element.dxTextBox('instance');

                if (widget) {
                    return widget.option('value');
                }
            }

            return \$element.val();
        }
    </script>
{% endblock %}
", "intervention/validation_intervention.html.twig", "/builds/dev/refonte_sav/templates/intervention/validation_intervention.html.twig");
    }
}
