Consultant Senior Technico-Fonctionnel Oracle E-Business Suite
Consultant Senior Technico-Fonctionnel Oracle E-Business Suite

CODE SQL PRET A L'EMPLOI

------------------------------------------------------------------------------------------------------------------------------------
--CALCUL DE CLE RIB
-------------------------------------------------
--Equivalent numérique des lettres:

-- A,J = 1 ; B,K,S = 2 ; C,L,T = 3 ; D,M,U = 4 ; E,N,V = 5
-- F,O,W = 6 ; G,P,X = 7 ; H,Q,Y = 8 ; I,R,Z = 9
--
-- pour le calcul
--
-- Clé RIB = 97 - ( (
-- 89 x Code banque +
-- 15 x Code guichet +
-- 3 x Numéro de compte ) modulo 97 )

-- requète
SELECT TO_CHAR((97
- MOD(
(89 * TO_NUMBER(:COD_BANQUE)) --BANQUE
+ (15 * TO_NUMBER(:COD_GUICHE)) --BANQUE
+ (3 * TO_NUMBER(TRANSLATE(:NUM_COMPTE,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'12345678912345678923456789')))
,97)
),'00') --NUM_COMPTE
CLE_RIB
FROM dual;

-----------------------------------------------------------------------------------------------------------------------------------

--CALCUL IBAN

---------------------------------
-- ce sont les deux chiffres qui suivent le code PAYS (FR pour la France)
--equivalent numérique des lettres:
-- A = 10
-- B = 11
-- ......
-- Z = 35
-- ou pour les puristes du code : code ascii de la lettre - 55
--
-- pour le calcul
--
-- Clé IBAN = 98 - ( (
-- Code banque +
-- Code guichet +
-- Numéro de compte +
-- clé rib +
-- code Pays +
-- '00' ) modulo 97 )
--
-- requète
SELECT TRIM(:CODE_PAYS) || TO_CHAR(98 - mod(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(
TRIM(:COD_BANQUE) || TRIM(:COD_GUICHE) ||
TRIM(:NUM_COMPTE) || TRIM(:COD_CLERIB)
|| :CODE_PAYS || '00', --CODE PAYS + 00
'A','10'),'B','11'),'C','12'),'D','13'),'E','14'),'F','15'),'G','16'),'H','17'),
'I','18'),'J','19'),'K','20'),'L','21'),'M','22'),'N','23'),'O','24'),'P','25'),
'Q','26'),'R','27'),'S','28'),'T','29'),'U','30'),'V','31'),'W','32'),'X','33'),
'Y','34'),'Z','35'),' ',''),97)) || TRIM(:COD_BANQUE) || TRIM(:COD_GUICHE) ||
TRIM(:NUM_COMPTE) || TRIM(:COD_CLERIB) IBAN
FROM DUAL;

-----------------------------------------------------------------------------------------------------------------------------------

OBTENIR UN JOUR OUVRE AVEC L'ALGORITHME DE PAQUES

CREATE OR REPLACE FUNCTION APPS.XXFND_JOUR_OUVRE_FUNC (p_date IN DATE, P_debug IN VARCHAR2, pb_pentecote IN BOOLEAN, pn_nb_ouvre_sup IN NUMBER ) RETURN DATE AS
-----------------------------------------------------------------------
-- NOM : XXFND_JOUR_OUVRE_FUNC.sql
-- TYPE : PL/SQL
-- Version : 121.1.1
-- DATE : 16/04/2013
--
-- AUTEUR : jean-Pierre Battesti
--
-----------------------------------------------------------------------
-- DESCRIPTION DU PROGRAMME :
--
-- Nom Programme: XXFND_JOUR_OUVRE_FUNC.sql
--
-- Description:
-- Retourne un jour ouvré
-- p_date = date en paramètre
-- P_debug = Y pour afficher les différents jours férié
-- pb_pentecote = TRUE pour le lundi de pentecôte est férié
-- pn_nb_ouvre_sup = Nb de jours ouvrés supplémentaires
-- ***********************************************************************

ld_date_du_jour DATE;
ln_count_jour INTEGER :=0;
ln_annee INTEGER;
lb_boucle BOOLEAN := TRUE;
ln_jour_semaine INTEGER;
ln_jour INTEGER;
ln_mois INTEGER;
ln_boucle_jour INTEGER := 0;
ln_var1 INTEGER;
ln_var2 INTEGER;
ln_var3 INTEGER;
ln_var4 INTEGER;
ln_var5 INTEGER;
ln_var6 INTEGER;
ln_var7 INTEGER;
ln_jour_paques INTEGER;
ln_mois_paques INTEGER;
ln_jour_asc INTEGER;
ln_mois_asc INTEGER;
ln_jour_pent INTEGER;
ln_mois_pent INTEGER;

BEGIN

WHILE lb_boucle
LOOP

ld_date_du_jour := TRUNC(p_date) + ln_boucle_jour;
ln_jour_semaine := TO_NUMBER(TO_CHAR( TRUNC(p_date) + ln_boucle_jour, 'D'));
ln_jour := TO_NUMBER(TO_CHAR( TRUNC(p_date)+ ln_boucle_jour, 'DD'));
ln_mois := TO_NUMBER(TO_CHAR( TRUNC(p_date) + ln_boucle_jour, 'MM'));
ln_annee := TO_NUMBER(TO_CHAR( TRUNC(p_date) + ln_boucle_jour, 'YYYY'));

lb_boucle := FALSE;
-- DIMANCHE ou SAMEDI
IF ln_jour_semaine = 7 OR ln_jour_semaine = 6 THEN
lb_boucle := TRUE;
IF P_debug = 'Y' THEN
DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' Week-end');
END IF;
ELSE
-- Jour de l'an
IF ln_jour = 1 AND ln_mois = 1 THEN
lb_boucle := TRUE;
IF P_debug = 'Y' THEN
DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' Jour de l''an');
END IF;

ELSE
-- 1 MAI
IF ln_jour = 1 AND ln_mois = 5 THEN
lb_boucle := TRUE;
IF P_debug = 'Y' THEN
DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' Fète du travail');
END IF;
ELSE
-- 8 MAI
IF ln_jour = 8 AND ln_mois = 5 THEN
lb_boucle := TRUE;
IF P_debug = 'Y' THEN
DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' Fin de la guerre 1945');
END IF;
ELSE
-- 14 Juillet
IF ln_jour = 14 AND ln_mois = 7 THEN
lb_boucle := TRUE;
IF P_debug = 'Y' THEN
DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' Fète nationale');
END IF;
ELSE
-- Assomption
IF ln_jour = 15 AND ln_mois = 8 THEN
lb_boucle := TRUE;
IF P_debug = 'Y' THEN
DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' Assomption');
END IF;
ELSE
-- 1 novembre
IF ln_jour = 1 AND ln_mois = 11 THEN
lb_boucle := TRUE;
IF P_debug = 'Y' THEN
DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' La toussain');
END IF;
ELSE
-- 11 novembre
IF ln_jour = 11 AND ln_mois = 11 THEN
lb_boucle := TRUE;
IF P_debug = 'Y' THEN
DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' Armistice 1918');
END IF;
ELSE
-- 25 decembre
IF ln_jour = 25 AND ln_mois = 12 THEN

lb_boucle := TRUE;
IF P_debug = 'Y' THEN

DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' Noël');
END IF;
ELSE

--------------------------------------------------------------------------------------------------------------------------------------------------------

--debut algo paques

ln_var1 := mod(ln_annee, 19) + 1;

ln_var2 := TRUNC(ln_annee / 100) + 1;

ln_var3 := TRUNC((3 * ln_var2) / 4) - 12;

ln_var4 := (((8 * ln_var2) + 5) / 25) - 5;

ln_var5 := TRUNC((5 * ln_annee) / 4) - ln_var3 - 10;

ln_var6 := MOD((MOD((11 * ln_var1 + 20 + ln_var4 - ln_var3), 30) + 30),30);

--IF (ln_var6 = 25 And ln_var1 > 11) Or (ln_var6 = 24) THEN

IF ln_var6 = 24 OR (ln_var6 = 25 And ln_var1 > 11) THEN

ln_var6 := ln_var6 + 1;

END IF;

ln_var7 := 44 - ln_var6;

If ln_var7 < 21 Then

ln_var7 := ln_var7 + 30;

End If;

ln_var7 := ln_var7 + 7;

ln_var7 := ln_var7 - MOD((ln_var5 + ln_var7),7);

-- PLUS 1 POUR LE LUNDI

ln_var7 := ln_var7 + 1;

If ln_var7 <= 31 Then

--mars

ln_jour_paques := ln_var7;

ln_mois_paques := 3;

ELSE

--avril

ln_var7 := ln_var7 - 31;

ln_jour_paques := ln_var7;

ln_mois_paques := 4;

END IF;

ln_jour_asc := TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(ln_jour_paques,'00') || '/' || TO_CHAR(ln_mois_paques,'00') || '/' || TO_CHAR(ln_annee,'0000'),'DD/MM/YYYY') + 38,'DD'));

ln_mois_asc := TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(ln_jour_paques,'00') || '/' || TO_CHAR(ln_mois_paques,'00') || '/' || TO_CHAR(ln_annee,'0000'),'DD/MM/YYYY') + 38,'MM'));

ln_jour_pent := TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(ln_jour_paques,'00') || '/' || TO_CHAR(ln_mois_paques,'00') || '/' || TO_CHAR(ln_annee,'0000'),'DD/MM/YYYY') + 49,'DD'));

ln_mois_pent := TO_NUMBER(TO_CHAR(TO_DATE(TO_CHAR(ln_jour_paques,'00') || '/' || TO_CHAR(ln_mois_paques,'00') || '/' || TO_CHAR(ln_annee,'0000'),'DD/MM/YYYY') + 49,'MM'));

--fin algo paques

--------------------------------------------------------------------------------------------------------------------------------------------------------

-- paques

IF ln_jour = ln_jour_paques AND ln_mois = ln_mois_paques THEN

lb_boucle := TRUE;

IF P_debug = 'Y' THEN

DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' Lundi de Pâques');

END IF;

ELSE

-- ascension

IF ln_jour = ln_jour_asc AND ln_mois = ln_mois_asc THEN

lb_boucle := TRUE;

IF P_debug = 'Y' THEN

DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' Jeudi de l''ascension');

END IF;

ELSE

-- pentecote

IF ln_jour = ln_jour_pent AND ln_mois = ln_mois_pent and pb_pentecote = TRUE THEN

lb_boucle := TRUE;

IF P_debug = 'Y' THEN

DBMS_output.put_line('Jour férié :' || to_char(ld_date_du_jour,'DAYDD MONTHYYYY') || ' Lundi de pentecote');

END IF;

END IF; --FIN pentecote

END IF; --FIN ascenci

END IF; --FIN Paques
END IF; --FIN 25 decembre
END IF; --FIN 11 novembre
END IF; --FIN 1 novembre
END IF; --FIN assomption
END IF; --FIN 14 Juillet
END IF; --FIN 8 MAI
END IF; --FIN 1ER MAI
END IF; --FIN JOUR DE L'AN
END IF; --FIN week end

-- Jour férié next
IF lb_boucle THEN
ln_boucle_jour := ln_boucle_jour + 1;
ELSE
if ln_count_jour < pn_nb_ouvre_sup then
ln_count_jour := ln_count_jour + 1;
ln_boucle_jour := ln_boucle_jour + 1;
lb_boucle := TRUE;
end IF;

END IF;

END LOOP;

return ld_date_du_jour;

END XXFND_JOUR_OUVRE_FUNC;
/