 
/* ************************************************************************************************************************************************************************
	Wstawianie do, edycja `oppo_e` 
************************************************************************************************************************************************************************ */	
DELIMITER $$
DROP PROCEDURE IF EXISTS `zmpo_instancjeE_P`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `zmpo_instancjeE_P`(
	IN _MODE VARCHAR(150),
    IN _eId VARCHAR(255),
	IN _IdnNg VARCHAR(255),	 -- IdnNg - guid zam
	IN _GUID VARCHAR(255),	 -- np. guid_zmpo
	IN _guid_instancji VARCHAR(255),	 
	IN _A VARCHAR(255),     --  AbsTemp 
	IN _B VARCHAR(255),     --  hFix 
	IN _C VARCHAR(255),	    --  hAbsD1 hmmm chyba nie, ma być default czyli 1 
	IN _D VARCHAR(255),     --  GuidWniosku
    -- IN _GuidWniosku VARCHAR(255),
	IN _Params TEXT
)
L_EXIT: BEGIN 
    -- DECLARE _hAbsD1 DOUBLE(16,4) DEFAULT 0;
    -- DECLARE _X, i INTEGER DEFAULT 0;
    DECLARE _Y VARCHAR(38) DEFAULT NULL;
--  Gdy eID NULL    
    IF _eID IS NULL THEN SET _eID = CONNECTION_ID(); END IF;
--  Gdy eID ma byc NEW - draft
    -- IF _eID = 'NEW' THEN SET _eID := CONCAT('NEW:', _GUID); END IF;
    IF _MODE = '->+E' THEN
    /*
    --  NIE MA wstawiania 1 rek. jako +E
        CALL zmpo_instancjeE_P('->+E', _eId, 'IdnNg', guid_zmpo, _guid_instancji, '', '', '', '', '');
    */
                    set @.jmama._RodzajKod := _RodzajKod;
        IF NOT EXISTS(SELECT GUID FROM `zmpo_instancje` WHERE GUID = _GUID AND eId = _eId) THEN
            SET @.Params = IFNULL(_Params, '');
        END IF;
    END IF;
    
	IF _MODE LIKE '%R->%E%' THEN
    /*
    --  Insert do E z R 
        UWAGA - działamy tu na N rekordach - jako detale poz. zam. czyli bierzemy z 
        całego zamówienia klucz idnng_guid_instancji
        CALL zmpo_instancjeE_P('R->+E', _eId, 'IdnNg', guid_zmpo, _guid_instancji, '', '', '', '', '');
    */
        IF _MODE LIKE '%R->+E%' THEN
            DROP TEMPORARY TABLE IF EXISTS `t_zmpo_instancje`;
            CREATE TEMPORARY TABLE `t_zmpo_instancje` LIKE `zmpo_instancje`;
            INSERT IGNORE INTO `t_zmpo_instancje`
                SELECT * FROM `zmpo_instancje` r 
                WHERE
                    r.idnng = _IdnNg AND r.eId = ''
            ;
            UPDATE `t_zmpo_instancje` SET eId = _eId;
            INSERT IGNORE INTO `zmpo_instancje` SELECT * FROM `t_zmpo_instancje` USE KEY (PRIMARY);
        END IF;
        UPDATE `zmpo_instancje` e, `zmpo_instancje` r USE KEY (idnng_guid_instancji)
        SET
            e.idn = r.idn,
            e.guid = r.guid,
            e.guid_zmpo = r.guid_zmpo,
            e.idnng = r.idnng,
            e.guid_instancji = r.guid_instancji,
            e.ilosc = r.ilosc,
            e.deleted = r.deleted
            -- e.alocaltime = r.alocaltime
        WHERE
            TRUE
            AND r.idnng = _IdnNg AND r.eId = ''
            AND e.GUID = r.GUID AND e.eId = _eId
        ;
	END IF;

	IF _MODE LIKE '%R<-E%' THEN
    /*
    --  Update R z E
        CALL zmpo_instancjeE_P('R<-E', _eId, _IdnNg, '', '', '', '', '', '', '');

    */
        INSERT IGNORE INTO `zmpo_instancje`
        (Idn, GUID, idnng, guid_instancji, eId)
        SELECT
            e.Idn, e.GUID, e.idnng, e.guid_instancji, '' AS eID
		FROM `zmpo_instancje` e
        WHERE
            e.idnng = _IdnNg AND e.eId = _eId
            AND e.deleted = 0
        ;
        UPDATE `zmpo_instancje` r,
        (
		SELECT
			e.*
		FROM `zmpo_instancje` e
        WHERE
            e.idnng = _IdnNg AND e.eId = _eId

		) e
        SET
            -- r.idn = e.idn,
            r.guid = e.guid,
            r.guid_zmpo = e.guid_zmpo,
            r.idnng = e.idnng,
            r.guid_instancji = e.guid_instancji,
            r.ilosc = e.ilosc,
            r.deleted = e.deleted
        WHERE 
			TRUE
            AND r.GUID = e.GUID AND r.eId = ''
        ;
        DELETE r FROM `zmpo_instancje` r
        WHERE
            r.idnng = _IdnNg AND r.eID = ''
            AND r.deleted = 1
        ;
        DELETE e FROM `zmpo_instancje` e
        WHERE
            e.idnng = _IdnNg AND e.eId = _eId
            AND e.deleted = 1
        ;
        
	END IF;

    IF _MODE = 'E.NEW' THEN
    /*
    --  Apply 
        CALL zmpo_instancjeE_P('E.NEW', _eId, 'IdnNg', '', '', '', '', '', '', '');
    */
        CALL zmpo_instancjeE_P('->+E', _eId, _IdnNg, '', '', '', '', '', '', '');
        CALL zmpo_instancjeE_P('R->+E', _eId, _IdnNg, '', '', '', '', '', '', '');
	END IF;

    IF _MODE = 'E.EDIT' THEN
    /*
    --  Edycja 
        CALL zmpo_instancjeE_P('E.EDIT', _eId, 'IdnNg', '', '', '', '', '', '', '');
    */
        CALL zmpo_instancjeE_P('R->+E', _eId, _IdnNg, '', '', '', '', '', '', '');
	END IF;

    IF _MODE LIKE 'E.Before.APPLY' OR _MODE LIKE 'E.After.Post' OR _MODE LIKE 'E.After.Update' OR _MODE LIKE 'E.CHECK' THEN
    /*
    --  Przed APPLY spr. błędów 
        CALL zmpo_instancjeE_P('E.Before.APPLY', '', _eId, _IdnNg, '', '', '', '', '', '<select>');
        CALL zmpo_instancjeE_P('E.After.Update', '', _eId, _IdnNg, '', '', '', '', '', '<select>');
        CALL zmpo_instancjeE_P('E.CHECK', _eId, '', _IdnNg, '', '', '', '', '', '');
    */
        DELETE em FROM `_eId_msg` em WHERE em.eKey = _IdnNg AND em.eId = _eId;
        SET @.abs.first.IdMsg := NULL;
        LEAVE L_EXIT;
	END IF;

    IF _MODE LIKE 'E.APPLY%' THEN
    /*
    --  Apply 
        CALL zmpo_instancjeE_P('E.APPLY', _eId, _IdnNg, '', '', '', '', '', '', '');
    */
    --  przed zapisem spr. czy ...
        CALL zmpo_instancjeE_P('R<-E', _eId, _IdnNg, '', '', '', '', '', '', '');
	END IF;

	IF _MODE LIKE '%E.CLEAR%' OR _MODE LIKE '%E.CLOSE%' THEN
    /*
    --  Update R z E
        CALL zmpo_instancjeE_P('E.CLEAR', _eId, 'IdnNg', '', '', '', '', '', '', '');
    */
        DELETE e FROM `zmpo_instancje` e
        WHERE
            e.idnng = _IdnNg AND e.eId = _eId
        ;
	END IF;

	IF _MODE LIKE 'TOOLS.P.Select.Instancje.PxAreaGUID%' THEN
    /*
    --  zwraca listę instancji dla danej pozycji z Oddziału!!!
        CALL zmpo_instancjeE_P('TOOLS.P.Select.Instancje.PxAreaGUID', _eId, 'IdnNg', '_GUID', '', '', '', '', '', '');
        CALL zmpo_instancjeE_P('TOOLS.P.Select.Instancje.PxAreaGUID.Exclude', _eId, 'IdnNg', '_GUID', 'instancja zastepowana', '', '', '', '', '');
    */
        SET @.n.AreaGUID := NULL;
        SET @.n.AreaGUID := (
            SELECT n.AreaGUID FROM `zmng_e` n WHERE n.GUID = _IdnNg
        );
        IF _MODE NOT LIKE 'TOOLS.P.Select.Instancje.PxAreaGUID.Exclude' THEN
        --  Nie z wyłączeniem konkr. instancji 
            SET _guid_instancji = ''; 
        END IF;
		SELECT
			ti.*
		FROM `zmpo_e` p, `towrng_instancje` ti
		WHERE
			p.GUID = _GUID  --  'ea0d8178-b38b-11ec-9241-00155d000205*'
			AND ti.IdnTowr = p.IdnTowr
            AND ti.GUID <> _guid_instancji
			AND ti.AreaGUID = @.n.AreaGUID
            AND NOT EXISTS(
                SELECT 
                    e.guid_instancji
                FROM `zmpo_instancje` e
                WHERE
                    e.idnng = _IdnNg AND e.eID = _eID
                    AND e.guid_instancji = ti.GUID
                    AND e.deleted = 0
            )
		;
	END IF;

	IF _MODE LIKE 'TOOLS.P.ADD.Instancja%' THEN
    /*
    --  Dodanie instancji do pozycji _GUID
        CALL zmpo_instancjeE_P('TOOLS.P.ADD.Instancja', _eId, 'IdnNg', '_GUID', 'instancja', '', '', '', '', '');
    */
        SET @.P.GUID := _Get_ID_xxxxx('SHORT', 38, 'zminst:','','','','','');
        INSERT IGNORE INTO `zmpo_instancje`
		(GUID, IdnNg, eId, guid_zmpo, guid_instancji)
        SELECT
            @.P.GUID AS GUID, zp.idnng, _eId AS eID,
            zp.GUID AS guid_zmpo,
            ti.guid AS guid_instancji
		FROM `zmpo_e` zp, `towrng_instancje` ti
        WHERE
			zp.IdnNg = _IdnNg
			AND zp.GUID = _GUID
			AND ti.guid = _guid_instancji
        ON DUPLICATE KEY UPDATE 
            deleted = 0
        ;
        UPDATE `zmpo_e` zp
        SET
            zp.Ilosc = (
                SELECT COUNT(*) FROM `zmpo_instancje` e
                WHERE
                    e.guid_zmpo = zp.GUID 
                    AND e.eId = _eId
                    AND e.deleted = 0
            )
        WHERE 
            zp.GUID = _GUID
        ;
	END IF;
    
	IF _MODE LIKE 'TOOLS.P.Delete.Instancja%' THEN
    /*
    --  Usuwanie instancji z pozycji 
        TOOLS.P.Delete.Instancja.GUID       usuwa wg GUID (_GUID)
        TOOLS.P.Delete.Instancja.IDN        usuwa wg IDN (_GUID = Idn)
        TOOLS.P.Delete.Instancja.GUID_Instancji       usuwa wg GUID poz + GUID_Instancji
        CALL zmpo_instancjeE_P('TOOLS.P.Delete.Instancja.GUID', _eId, 'IdnNg', 'GUID poz instacji', '', '', '', '', '', '');
        CALL zmpo_instancjeE_P('TOOLS.P.Delete.Instancja.IDN', _eId, 'IdnNg', 'Idn poz instacji', '', '', '', '', '', '');
        CALL zmpo_instancjeE_P('TOOLS.P.Delete.Instancja.GUID_Instancji', _eId, 'IdnNg', '', 'instancja', '', '', '', '', '');
    */
        IF _MODE LIKE 'TOOLS.P.Delete.Instancja.GUID' THEN
        --  usuwa wg GUID (_GUID)
            UPDATE `zmpo_instancje` e
            SET e.deleted = 1
            -- DELETE e FROM `zmpo_instancje` e
            WHERE
                e.idnng = _IdnNg AND e.eID = _eID
                AND e.GUID = _GUID
            ;
        ELSEIF _MODE LIKE 'TOOLS.P.Delete.Instancja.Idn' THEN
        --  usuwa wg IDN (_GUID = Idn)
            UPDATE `zmpo_instancje` e
            SET e.deleted = 1
            -- DELETE e FROM `zmpo_instancje` e
            WHERE
                e.idnng = _IdnNg AND e.eID = _eID
                AND e.Idn = _GUID       --  _GUID jako Idn !!!!
            ;
        ELSEIF _MODE LIKE 'TOOLS.P.Delete.Instancja.GUID_Instancji' THEN
        --  usuwa wg GUID poz + GUID_Instancji
            UPDATE `zmpo_instancje` e
            SET e.deleted = 1
            -- DELETE e FROM `zmpo_instancje` e
            WHERE
                e.idnng = _IdnNg AND e.eID = _eID
                AND e.guid_instancji = _guid_instancji
            ;
        END IF;
        UPDATE `zmpo_e` zp
        SET
            zp.Ilosc = (
                SELECT COUNT(*) FROM `zmpo_instancje` e
                WHERE
                    e.guid_zmpo = zp.GUID 
                    AND e.eId = _eId
                    AND e.deleted = 0
            )
        WHERE 
            zp.IdnNg = _IdnNg
        ;
	END IF;
END$$

DELIMITER ;

/*
====================================================================================================================================================================================
	NOTATNIK
====================================================================================================================================================================================

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
*/

/*  Zmiany CVS
$Log: C_HT_zmpo_instancjeE.sql,v $
Revision 1.1  2026/01/23 08:47:49  jmam
Inicjacja
*/
