DELIMITER $$;
CREATE TRIGGER on_cloture_inventaire 
AFTER UPDATE ON entete_inventaire
    FOR EACH ROW 
        IF NEW.validation = 1 AND OLD.validation = 0 THEN
        BEGIN
            DECLARE done INT DEFAULT FALSE;
            DECLARE var_produit_code, var_type CHAR(100);
            DECLARE var_user_code CHAR(100);
            DECLARE var_soussociete_code CHAR(100);
            DECLARE var_quantite INT;
            DECLARE var_prix_achat_ttc, var_prix_ttc DOUBLE;
            DECLARE var_stock, var_dlc, var_casse, var_reservation, var_securite INT;
            DECLARE stock_diff INT;

            DECLARE lignes CURSOR FOR SELECT l.produit_code, l.quantite, l.prix_achat_ttc, l.prix_ttc,
                                              e.type , e.user_code, s.quantite as stock, s.dlc, 
                                              s.casse, s.reservation, s.securite, e.soussociete_code
                                        FROM  entete_inventaire  as e 
                                        INNER JOIN ligne_inventaire as l ON e.code = l.entete_inventaire_code
                                        INNER JOIN stock_depots as s ON s.produit_code = l.produit_code AND s.soussociete_code=e.soussociete_code
                                        WHERE e.code=NEW.code;
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

            OPEN lignes;

            read_loop: LOOP
            
                FETCH lignes INTO var_produit_code, var_quantite, var_prix_achat_ttc, var_prix_ttc, var_type, var_user_code, 
                                  var_stock, var_dlc, var_casse, var_reservation, var_securite,var_soussociete_code;
                IF done THEN
                    LEAVE read_loop;
                END IF;
                
                IF var_type='dlc' THEN
                    SET stock_diff = var_quantite - var_dlc;
                    UPDATE stock_depots SET dlc=var_quantite WHERE produit_code=var_produit_code AND soussociete_code=var_soussociete_code;

                    -- insert stock_depots_historique
                    -- make quantite to 0
                    INSERT INTO 
                        stock_depot_info (
                            user_code, commercial_code, soussociete_code, code, produit_code, old_quantite, diff_quantite, new_quantite, 
                            module_nomadis, type_mouvement, cause, latitude, longitude, date, created_at, updated_at
                        ) 
                    VALUES (
                        var_user_code, NULL, var_soussociete_code, NEW.code,  var_produit_code, var_dlc, - var_dlc, 0,
                        'Inventaire', 'inventaire_dlc', 'Triggers:inventaire/cloturé', NULL, NULL, NOW(), NOW(), NOW()
                    );
                    -- add new quantity
                    INSERT INTO 
                        stock_depot_info (
                            user_code, commercial_code, soussociete_code, code, produit_code, old_quantite, diff_quantite, new_quantite, 
                            module_nomadis, type_mouvement, cause, latitude, longitude, date, created_at, updated_at
                        ) 
                    VALUES (
                        var_user_code, NULL, var_soussociete_code, NEW.code,  var_produit_code, 0, var_quantite, var_quantite,
                        'Inventaire', 'inventaire_dlc', 'Triggers:inventaire/cloturé', NULL, NULL, NOW(), NOW(), NOW()
                    );

                    -- IF stock_diff <> 0 THEN
                        INSERT INTO 
                            mouvements (
                                        magasinier_code, depot_code, commercial_code, soussociete_code, produit_code,prix_achat_ttc, prix_ttc, 
                                        quantite, stk_before_inventaire, stk_after_inventaire,
                                        type, numero, num_serie, configuration, etat, isSync, wavesoft, date, created_at, updated_at
                                        )
                            values ( 
                                        var_user_code, NULL, var_user_code,var_soussociete_code, var_produit_code, var_prix_achat_ttc, var_prix_ttc, 
                                        0, var_dlc, 0,
                                        'inventaire_dlc', NEW.code, NULL,NULL,'accepted', 1,0, NOW(), NOW(), NOW()
                                    );
                        INSERT INTO 
                            mouvements (
                                        magasinier_code, depot_code, commercial_code, soussociete_code, produit_code,prix_achat_ttc, prix_ttc, 
                                        quantite, stk_before_inventaire, stk_after_inventaire,
                                        type, numero, num_serie, configuration, etat, isSync, wavesoft, date, created_at, updated_at
                                        )
                            values ( 
                                        var_user_code, NULL, var_user_code,var_soussociete_code, var_produit_code, var_prix_achat_ttc, var_prix_ttc, 
                                        var_quantite, 0, var_quantite,
                                        'inventaire_dlc', NEW.code, NULL,NULL,'accepted', 1,0, NOW(), NOW(), NOW()
                                    );
                        
                    -- END IF;

                    -- UPDATE LIGNE INVENTAIRE
                        UPDATE ligne_inventaire as l
                        LEFT JOIN entete_inventaire as e ON e.code = l.entete_inventaire_code 
                        SET l.stk_before_inventaire=var_dlc, l.stk_after_inventaire=var_quantite
                        WHERE e.code = NEW.code and l.produit_code=var_produit_code AND e.soussociete_code=var_soussociete_code;

                ELSEIF var_type='casse' THEN
                    SET stock_diff = var_quantite - var_casse;
                    UPDATE stock_depots SET casse=var_quantite WHERE produit_code=var_produit_code AND soussociete_code=var_soussociete_code;

                     -- insert stock_depots_historique
                    INSERT INTO 
                        stock_depot_info (
                            user_code, commercial_code, soussociete_code, code, produit_code, old_quantite, diff_quantite, new_quantite, 
                            module_nomadis, type_mouvement, cause, latitude, longitude, date, created_at, updated_at
                        ) 
                    VALUES (
                        var_user_code, NULL, var_soussociete_code, NEW.code, var_produit_code, var_casse, - var_casse, 0,
                        'Inventaire', 'inventaire_casse', 'Triggers:inventaire/cloturé', NULL, NULL, NOW(), NOW(), NOW()
                    );
                    INSERT INTO 
                        stock_depot_info (
                            user_code, commercial_code, soussociete_code, code, produit_code, old_quantite, diff_quantite, new_quantite, 
                            module_nomadis, type_mouvement, cause, latitude, longitude, date, created_at, updated_at
                        ) 
                    VALUES (
                        var_user_code, NULL, var_soussociete_code, NEW.code, var_produit_code, 0, var_quantite, var_quantite,
                        'Inventaire', 'inventaire_casse', 'Triggers:inventaire/cloturé', NULL, NULL, NOW(), NOW(), NOW()
                    );

                    -- IF stock_diff <> 0 THEN
                        INSERT INTO 
                            mouvements (
                                        magasinier_code, depot_code, commercial_code,soussociete_code, produit_code,prix_achat_ttc, prix_ttc, 
                                        quantite, stk_before_inventaire, stk_after_inventaire,
                                        type, numero, num_serie,configuration, etat, isSync, wavesoft, date, created_at, updated_at
                                        )
                            values ( 
                                        var_user_code, NULL, var_user_code,var_soussociete_code, var_produit_code, var_prix_achat_ttc, var_prix_ttc, 
                                        0, var_casse,0,
                                        'inventaire_casse', NEW.code, NULL,NULL,'accepted', 1,0, NOW(), NOW(), NOW()
                                    );
                       INSERT INTO 
                            mouvements (
                                        magasinier_code, depot_code, commercial_code,soussociete_code, produit_code,prix_achat_ttc, prix_ttc, 
                                        quantite, stk_before_inventaire, stk_after_inventaire,
                                        type, numero, num_serie,configuration, etat, isSync, wavesoft, date, created_at, updated_at
                                        )
                            values ( 
                                        var_user_code, NULL, var_user_code,var_soussociete_code, var_produit_code, var_prix_achat_ttc, var_prix_ttc, 
                                        var_quantite, 0,var_quantite,
                                        'inventaire_casse', NEW.code, NULL,NULL,'accepted', 1,0, NOW(), NOW(), NOW()
                                    );
                    -- END IF;

                     -- UPDATE LIGNE INVENTAIRE
                        UPDATE ligne_inventaire as l
                        LEFT JOIN entete_inventaire as e ON e.code = l.entete_inventaire_code 
                        SET l.stk_before_inventaire=var_casse, l.stk_after_inventaire=var_quantite
                        WHERE e.code = NEW.code and l.produit_code=var_produit_code AND e.soussociete_code=var_soussociete_code;
                        
                ELSEIF var_type='stock' THEN
                    SET stock_diff = var_quantite - var_stock;
                    UPDATE stock_depots SET quantite=var_quantite WHERE produit_code=var_produit_code AND soussociete_code=var_soussociete_code;

                     -- insert stock_depots_historique
                     -- make quantity 0
                    INSERT INTO 
                        stock_depot_info (
                            user_code, commercial_code, soussociete_code, code, produit_code, old_quantite, diff_quantite, new_quantite, 
                            module_nomadis, type_mouvement, cause, latitude, longitude, date, created_at, updated_at
                        ) 
                    VALUES (
                        var_user_code, NULL, var_soussociete_code, NEW.code, var_produit_code, var_stock, - var_stock , 0,
                        'Inventaire', 'inventaire_stock', 'Triggers:inventaire/cloturé', NULL, NULL, NOW(), NOW(), NOW()
                    );
                    -- add new quantite 
                    INSERT INTO 
                        stock_depot_info (
                            user_code, commercial_code, soussociete_code, code, produit_code, old_quantite, diff_quantite, new_quantite, 
                            module_nomadis, type_mouvement, cause, latitude, longitude, date, created_at, updated_at
                        ) 
                    VALUES (
                        var_user_code, NULL, var_soussociete_code, NEW.code, var_produit_code, 0, var_quantite, var_quantite,
                        'Inventaire', 'inventaire_stock', 'Triggers:inventaire/cloturé', NULL, NULL, NOW(), NOW(), NOW()
                    );

                    -- IF stock_diff <> 0 THEN
                    -- make quantity 0
                    INSERT INTO 
                        mouvements (
                                    magasinier_code, depot_code, commercial_code, soussociete_code, produit_code ,prix_achat_ttc, prix_ttc, 
                                    quantite, stk_before_inventaire, stk_after_inventaire,
                                    type, numero, num_serie, configuration, etat, isSync, wavesoft, date, created_at, updated_at
                                    )
                        values ( 
                                    var_user_code, NULL, var_user_code,var_soussociete_code, var_produit_code, var_prix_achat_ttc, var_prix_ttc, 
                                    0, var_stock, 0,
                                    'inventaire_stock', NEW.code, NULL,NULL,'accepted', 1,0, NOW(), NOW(), NOW()
                                );

                    -- add new quantite    
                    INSERT INTO 
                        mouvements (
                                    magasinier_code, depot_code, commercial_code, soussociete_code, produit_code ,prix_achat_ttc, prix_ttc, 
                                    quantite, stk_before_inventaire, stk_after_inventaire,
                                    type, numero, num_serie, configuration, etat, isSync, wavesoft, date, created_at, updated_at
                                    )
                        values ( 
                                    var_user_code, NULL, var_user_code,var_soussociete_code, var_produit_code, var_prix_achat_ttc, var_prix_ttc, 
                                    var_quantite, 0, var_quantite,
                                    'inventaire_stock', NEW.code, NULL,NULL,'accepted', 1,0, NOW(), NOW(), NOW()
                                );
                        
                    -- END IF;

                    -- UPDATE LIGNE INVENTAIRE
                        UPDATE ligne_inventaire as l
                        LEFT JOIN entete_inventaire as e ON e.code = l.entete_inventaire_code 
                        SET l.stk_before_inventaire=var_stock, l.stk_after_inventaire=var_quantite
                        WHERE e.code = NEW.code and l.produit_code=var_produit_code AND e.soussociete_code=var_soussociete_code;

                ELSEIF var_type='reservation' THEN
                    SET stock_diff = var_quantite - var_reservation;
                    UPDATE stock_depots SET reservation=var_quantite WHERE produit_code=var_produit_code AND soussociete_code=var_soussociete_code;

                     -- insert stock_depots_historique
                    INSERT INTO 
                        stock_depot_info (
                            user_code, commercial_code, soussociete_code, code, produit_code, old_quantite, diff_quantite, new_quantite, 
                            module_nomadis, type_mouvement, cause, latitude, longitude, date, created_at, updated_at
                        ) 
                    VALUES (
                        var_user_code, NULL, var_soussociete_code, NEW.code, var_produit_code, var_reservation, -var_reservation, 0,
                        'Inventaire', 'inventaire_reservation', 'Triggers:inventaire/cloturé', NULL, NULL, NOW(), NOW(), NOW()
                    );
                    INSERT INTO 
                        stock_depot_info (
                            user_code, commercial_code, soussociete_code, code, produit_code, old_quantite, diff_quantite, new_quantite, 
                            module_nomadis, type_mouvement, cause, latitude, longitude, date, created_at, updated_at
                        ) 
                    VALUES (
                        var_user_code, NULL, var_soussociete_code, NEW.code, var_produit_code, 0, var_quantite, var_quantite,
                        'Inventaire', 'inventaire_reservation', 'Triggers:inventaire/cloturé', NULL, NULL, NOW(), NOW(), NOW()
                    );

                    -- IF stock_diff <> 0 THEN
                        INSERT INTO 
                            mouvements (
                                        magasinier_code, depot_code, commercial_code, soussociete_code, produit_code, prix_achat_ttc, prix_ttc, 
                                        quantite, stk_before_inventaire, stk_after_inventaire,
                                        type, numero, num_serie, configuration, etat, isSync, wavesoft, date, created_at, updated_at
                                        )
                            values ( 
                                        var_user_code, NULL, var_user_code, var_soussociete_code,var_produit_code, var_prix_achat_ttc, var_prix_ttc, 
                                        0, var_reservation,0,
                                        'inventaire_reservation', NEW.code, NULL,NULL,'accepted', 1,0, NOW(), NOW(), NOW()
                                    );
                        INSERT INTO 
                            mouvements (
                                        magasinier_code, depot_code, commercial_code, soussociete_code, produit_code, prix_achat_ttc, prix_ttc, 
                                        quantite, stk_before_inventaire, stk_after_inventaire,
                                        type, numero, num_serie, configuration, etat, isSync, wavesoft, date, created_at, updated_at
                                        )
                            values ( 
                                        var_user_code, NULL, var_user_code, var_soussociete_code,var_produit_code, var_prix_achat_ttc, var_prix_ttc, 
                                        var_quantite, 0,var_quantite,
                                        'inventaire_reservation', NEW.code, NULL,NULL,'accepted', 1,0, NOW(), NOW(), NOW()
                                    );
                    -- END IF;
                    -- UPDATE LIGNE INVENTAIRE
                        UPDATE ligne_inventaire as l
                        LEFT JOIN entete_inventaire as e ON e.code = l.entete_inventaire_code 
                        SET l.stk_before_inventaire=var_reservation, l.stk_after_inventaire=var_quantite
                        WHERE e.code = NEW.code and l.produit_code=var_produit_code AND e.soussociete_code=var_soussociete_code;

                ELSEIF var_type='securite' THEN
                    SET stock_diff = var_quantite - var_securite;
                    UPDATE stock_depots SET quantite=var_quantite WHERE produit_code=var_produit_code AND soussociete_code=var_soussociete_code;

                     -- insert stock_depots_historique
                    INSERT INTO 
                        stock_depot_info (
                            user_code, commercial_code, soussociete_code, code, produit_code, old_quantite, diff_quantite, new_quantite, 
                            module_nomadis, type_mouvement, cause, latitude, longitude, date, created_at, updated_at
                        ) 
                    VALUES (
                        var_user_code, NULL, var_soussociete_code, NEW.code, var_produit_code, var_securite, - var_securite, 0,
                        'Inventaire', 'inventaire_securite', 'Triggers:inventaire/cloturé', NULL, NULL, NOW(), NOW(), NOW()
                    );

                    INSERT INTO 
                        stock_depot_info (
                            user_code, commercial_code, soussociete_code, code, produit_code, old_quantite, diff_quantite, new_quantite, 
                            module_nomadis, type_mouvement, cause, latitude, longitude, date, created_at, updated_at
                        ) 
                    VALUES (
                        var_user_code, NULL, var_soussociete_code, NEW.code, var_produit_code, 0, var_quantite, var_quantite,
                        'Inventaire', 'inventaire_securite', 'Triggers:inventaire/cloturé', NULL, NULL, NOW(), NOW(), NOW()
                    );

                   -- IF stock_diff <> 0 THEN
                        INSERT INTO 
                            mouvements (
                                        magasinier_code, depot_code, soussociete_code, commercial_code, produit_code, prix_achat_ttc, prix_ttc, 
                                        quantite, stk_before_inventaire, stk_after_inventaire,
                                        type, numero, num_serie, configuration, etat, isSync, wavesoft, date, created_at, updated_at
                                        )
                            values ( 
                                        var_user_code, NULL, var_user_code,var_soussociete_code, var_produit_code, var_prix_achat_ttc, var_prix_ttc, 
                                        0,var_securite, 0,
                                        'inventaire_securite', NEW.code, NULL,NULL,'accepted', 1,0, NOW(), NOW(), NOW()
                                    );  
                        INSERT INTO 
                            mouvements (
                                        magasinier_code, depot_code, soussociete_code, commercial_code, produit_code, prix_achat_ttc, prix_ttc, 
                                        quantite, stk_before_inventaire, stk_after_inventaire,
                                        type, numero, num_serie, configuration, etat, isSync, wavesoft, date, created_at, updated_at
                                        )
                            values ( 
                                        var_user_code, NULL, var_user_code,var_soussociete_code, var_produit_code, var_prix_achat_ttc, var_prix_ttc, 
                                        var_quantite,0, var_quantite,
                                        'inventaire_securite', NEW.code, NULL,NULL,'accepted', 1,0, NOW(), NOW(), NOW()
                                    );                      
                    -- END IF;

                     -- UPDATE LIGNE INVENTAIRE
                        UPDATE ligne_inventaire as l
                        LEFT JOIN entete_inventaire as e ON e.code = l.entete_inventaire_code 
                        SET l.stk_before_inventaire=var_securite, l.stk_after_inventaire=var_quantite
                        WHERE e.code = NEW.code and l.produit_code=var_produit_code AND e.soussociete_code=var_soussociete_code;

                END IF;
            
            END LOOP;
            CLOSE lignes;
        END;
        END IF;