Delimiter //
/**
 * liste des ecritures de "reconciliation"
 */ 
Drop Procedure If Exists LOADER_ENTRIES_NORMALIZE_MAP_RECONCILIATIONS_ENTRIES//
Create Procedure LOADER_ENTRIES_NORMALIZE_MAP_RECONCILIATIONS_ENTRIES(
)
Begin
	MAIN_NORMALIZE_MAP_RECONCILIATIONS_ENTRIES: Begin
-- 		Declare lenmre_typeCredit, lenmre_typeDebit Int unsigned ;
		-- recherche des types d'ecritures
		Set @lenmre_typeCredit = (
				Select ID_DF_ENTRIES_TYPE From DF_ENTRIES_TYPE 
				Where DF_ENTRIES_TYPE_CODE = 'PAY' And DF_ENTRIES_TYPE_ACCOUNTANT = 1 And DF_ENTRIES_TYPE_IS_CREDIT = 1
			)
		;
		Set @lenmre_typeDebit = (
				Select ID_DF_ENTRIES_TYPE From DF_ENTRIES_TYPE 
-- 				Where DF_ENTRIES_TYPE_CODE = 'INV' And DF_ENTRIES_TYPE_ACCOUNTANT = 1 And DF_ENTRIES_TYPE_IS_DEBIT = 1
				-- vue avec Olivie ; utilisation d'une OD pour les ecriture de réconciliation au débit
				Where DF_ENTRIES_TYPE_CODE = 'MSC' And DF_ENTRIES_TYPE_ACCOUNTANT = 1 And DF_ENTRIES_TYPE_IS_DEBIT = 1
			)
		;

		-- table temporaire avec les nouvelle ecritures de reconciliation
		-- afin des compenser, les nouvelles écriture doivent être de signe oposé
		-- à la somme des montant
		Drop Temporary Table If Exists TMP_LOADER_RECONCILIATIONS_ENTRIES;
-- 		Drop Table If Exists TMP_LOADER_RECONCILIATIONS_ENTRIES;
		Create Temporary Table TMP_LOADER_RECONCILIATIONS_ENTRIES (
-- 		Create Table TMP_LOADER_RECONCILIATIONS_ENTRIES (
			ENTRIES_ID_ENTRIES_NEW Int Unsigned not null Primary Key auto_increment
			, ACCOUNTS_ID_ACCOUNTS Int Unsigned not null
			, DF_ENTR_TYPE_ID_DF_ENTR_TYPE Int Unsigned not null
-- 			, ENTRIES_ENT_BALANCE Decimal(19, 4) Null 
-- 			, ENTRIES_ENT_DEBIT Decimal(19, 4) Null 
-- 			, ENTRIES_ENT_CREDIT Decimal(19, 4) Null 
			, ENT_BALANCE Decimal(19, 4) Null 
			, ENT_DEBIT Decimal(19, 4) Null 
			, ENT_CREDIT Decimal(19, 4) Null 
			, ENTRIES_LABEL Varchar(50) Null
			, index (ACCOUNTS_ID_ACCOUNTS)
		);

		-- on rempli la table en inversant les signes
		-- pour cela on utilise unse sous-requête
		Insert Into TMP_LOADER_RECONCILIATIONS_ENTRIES (
			ACCOUNTS_ID_ACCOUNTS
			, DF_ENTR_TYPE_ID_DF_ENTR_TYPE 
-- 			, ENTRIES_ENT_BALANCE
-- 			, ENTRIES_ENT_DEBIT 
-- 			, ENTRIES_ENT_CREDIT
			, ENT_BALANCE
			, ENT_DEBIT 
			, ENT_CREDIT
			, ENTRIES_LABEL
		)
		
		Select
			TMP_ENT.ACCOUNTS_ID_ACCOUNTS
			-- comme le montant de la nouvelle ecriture devra balancer les ecritures
			-- la nouvelle auran un montant qui sera la valeur négative des ecritures balancé
			-- On inverse donc la balance obtenu pour la nouvelle ecriture
			-- => si ENT_BALANCESUM <= 0 , (crediteur) il faut créer un mouvement au débit
			-- => si ENT_BALANCESUM > 0 , (débiteur) il faut créer un mouvement au crédit
-- 			, Case When ENT_BALANCESUM < 0 Then @lenmre_typeCredit Else @lenmre_typeDebit End 
			, Case When ENT_BALANCESUM > 0 Then @lenmre_typeCredit Else @lenmre_typeDebit End -- ici c'est ele type de la nouvelle ecriture, inversin de signe
			, -ENT_BALANCESUM -- l'oppposé de la balance
			
			, Case When ENT_BALANCESUM <= 0 Then -ENT_BALANCESUM Else 0 End -- mouvement créditeur => creation d'un ecriteur au debit, en inversant le signe pour avoir une valeur psitive
			, Case When ENT_BALANCESUM > 0 Then ENT_BALANCESUM Else 0 End -- mouvement Débiteur => creation d'un ecriteur au crédit, la valeur est positiven pas besoin de toucher au signe
			, 'RECONCIL'
		From (
				Select 
					TER.ACCOUNTS_ID_ACCOUNTS
			-- , Sum(ENT.ENTRIES_ENT_DEBIT - ENT.ENTRIES_ENT_CREDIT) BALSUM
					, Sum(ENT.ENTRIES_ENT_BALANCE) ENT_BALANCESUM
				From
					ENTRIES ENT
					Inner Join TMP_LOADER_ENTRIES_TO_RECONCIL TER
						On  ENT.ID_ENTRIES = TER.ENTRIES_ID_ENTRIES
                Where
                    TER.MATCHINGCODES_UNMATCH_FORCED = 0
				Group By TER.ACCOUNTS_ID_ACCOUNTS
				Having Sum(ENT.ENTRIES_ENT_BALANCE) <> 0
			) TMP_ENT

		;


	End;

End//
Delimiter ;




