--IF EXISTS (SELECT 1 FROM sys.triggers trg inner join sys.tables tbl on trg.parent_id= tbl.object_id where tbl.schema_id=SCHEMA_Id('dbo') and trg.name = 'PRO_F_ECRITUREC_INS_UPD_ContrepartieTiers') 
--DROP TRIGGER [dbo].PRO_F_ECRITUREC_INS_UPD_ContrepartieTiers
GO
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:		Jonathan SONRIER
-- Create date: 2016-01-01
-- Description:	Ajoute la contrepartie tiers pour les lignes sans tiers

-- Updated :    Christophe ELSENSOHN 2022/02/16
-- Integration dans le concept SPC avec gestion des noms de schéma.

-- Updated :    Christophe ELSENSOHN 2022/03/14
-- Trigger executable uniquement sur les journaux de type 0,1 et 3.
-- Sur les journaux de Trésorerie, il y avait un problème puisque lors de
-- l'intégration d'extraits, le numéro pièce est le numéro de l'extrait.
-- Un extrait pouvant avoir X paiements, on se retrouvait avec des contrepartie
-- tiers qui n'avaient rien à voir avec l'écriture.
-- Cependant, ce trigger ne devrait pas être actif en dehors du recalcul
-- de contrepartie Tiers.
-- =============================================
CREATE TRIGGER [dbo].[PRO_F_ECRITUREC_INS_UPD_ContrepartieTiers]
   ON [dbo].[F_ECRITUREC]
   AFTER INSERT, UPDATE
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for trigger here
    IF (UPDATE(CT_Num) OR UPDATE(CT_NumCont))
    BEGIN
        DECLARE @JO_NUM AS VARCHAR(7)
        DECLARE @JM_DATE AS SMALLDATETIME
        DECLARE @EC_JOUR AS SMALLINT
        DECLARE @EC_PIECE AS VARCHAR(17)
        DECLARE @CT_NUM AS VARCHAR(17)
        DECLARE @CT_NUMCONT AS VARCHAR(17)
        DECLARE @CBMARQ AS INT

        DECLARE @CT_NUMTIERS AS VARCHAR(17)

        DECLARE CURSOR_TRIG_PRO_RECALC_CONTREPARTIE_TIERS CURSOR LOCAL FOR
            SELECT
                I.JO_Num
                ,I.JM_Date
                ,I.EC_Jour
                ,I.EC_Piece
                ,I.CT_Num
                ,I.CT_NumCont
                ,I.cbMarq
            FROM
                INSERTED I
                INNER JOIN F_JOURNAUX J ON I.JO_Num = J.JO_Num
            WHERE
                J.JO_TYPE IN (0,1,3)

        OPEN CURSOR_TRIG_PRO_RECALC_CONTREPARTIE_TIERS
        FETCH NEXT FROM CURSOR_TRIG_PRO_RECALC_CONTREPARTIE_TIERS INTO
            @JO_NUM
            ,@JM_DATE
            ,@EC_JOUR
            ,@EC_PIECE
            ,@CT_NUM
            ,@CT_NUMCONT
            ,@CBMARQ

        WHILE @@FETCH_STATUS = 0
        BEGIN
            -------------------------------------------------------------------------------------------
            -- On met à jour la contrepartie tiers pour la pièce en cours de création / modification --
            -------------------------------------------------------------------------------------------
            
            -- On récupère le compte tiers de la pièce
            SELECT TOP 1
                @CT_NUMTIERS = E.CT_Num
            FROM
                F_ECRITUREC E
            WHERE
                E.CT_Num IS NOT NULL
                AND E.JO_Num = @JO_NUM
                AND E.JM_Date = @JM_DATE
                AND E.EC_Jour = @EC_JOUR
                AND E.EC_Piece = @EC_PIECE

            -- On met à jour la contrepartie tiers
            IF (@CT_NUMTIERS IS NOT NULL)
            BEGIN
                -- On met à jour la contrepartie tiers
                UPDATE E
                SET
                    E.CT_NumCont = @CT_NUMTIERS
                FROM
                    F_ECRITUREC E
                WHERE
                    E.CT_Num IS NULL
                    AND E.JO_Num = @JO_NUM
                    AND E.JM_Date = @JM_DATE
                    AND E.EC_Jour = @EC_JOUR
                    AND E.EC_Piece = @EC_PIECE

                -- On notifie la modification de la ligne
                INSERT INTO cbNotification (
                    cbSession
                    ,cbFile
                    ,cbType
                    ,cbUser
                    ,cbIndMod
                    ,cbMarq
                )
                SELECT
                    RF.cbSession
                    ,RF.cbFile
                    ,5
                    ,@@SPID
                    ,0
                    ,E.cbMarq
                FROM
                    cbRegFile RF,
                    F_ECRITUREC E
                WHERE
                    RF.cbFile = 'F_ECRITUREC'
                    AND E.CT_Num IS NULL
                    AND E.JO_Num = @JO_NUM
                    AND E.JM_Date = @JM_DATE
                    AND E.EC_Jour = @EC_JOUR
                    AND E.EC_Piece = @EC_PIECE
                    AND E.cbMarq <> @CBMARQ
                    AND NOT EXISTS (
                        SELECT *
                        FROM cbNotification N
                        WHERE
                            N.cbSession = RF.cbSession
                            AND N.cbFile = RF.cbFile
                            AND N.cbType = 5
                            AND N.cbUser = @@SPID
                            AND N.cbIndMod = 0
                            AND N.cbMarq = E.cbMarq
                    )
            END

            FETCH NEXT FROM CURSOR_TRIG_PRO_RECALC_CONTREPARTIE_TIERS INTO
                @JO_NUM
                ,@JM_DATE
                ,@EC_JOUR
                ,@EC_PIECE
                ,@CT_NUM
                ,@CT_NUMCONT
                ,@CBMARQ
        END

        CLOSE CURSOR_TRIG_PRO_RECALC_CONTREPARTIE_TIERS
        DEALLOCATE CURSOR_TRIG_PRO_RECALC_CONTREPARTIE_TIERS
    END
END
