Program Controle_reference_bancaire;


{	Auteur : Christian SCHERER
		 Délégation à l'Emploi
	Tél. :	 +33 1 40 56 61 45
	Date :   13.12.93
}


{ algorithme de contrôle de cohérence d'un RIB :

  Code banque      : 5 caractères numériques
  Code guichet     : 5 caractères numériques
  Numéro de compte : 11 caractères alpha-numériques
  Clé RIB          : 2 caractères numériques

  Algorithme communiqué par la Banque de France
  le 13.12.93, par téléphone au 42 92 36 38  :


  Constituer un nombre entier de 23 digits en concaténant
  les quatre champs :

             Code banque & Code guichet & Numéro de compte & Clé RIB

  Certains numéros de compte contiennent des lettres qu'il faut remplacer
  par des chiffres :

  A et J  par 1
  B,K,S   par 2
  C,L,T   par 3
  D,M,U   par 4
  E,N,V   par 5
  F,O,W   par 6
  G,P,X   par 7
  H,Q,Y   par 8
  I,R,Z   par 9

}




uses dos, crt;

type references=
     record
       cb  : string[5];
       cg  : string[5];
       cpte: string[11];
       cle : string[2]
      end;



const
     nb_ref=21;       {     quelques exemples  .......   }
     tab_ref : array[1..nb_ref] of references = (
(cb:'30026'  ; cg:'00200' ; cpte:'0000134126'      ; cle:' V'),
(cb:'30004'  ; cg:'02038' ; cpte:'00020323068'     ; cle:'88'),
(cb:'30004'  ; cg:'00804' ; cpte:'00022569632'     ; cle:'36'),
(cb:'30004'  ; cg:'00974' ; cpte:'00021066039'     ; cle:'93'),
(cb:'42559'  ; cg:'00061' ; cpte:'21022911104'     ; cle:''),
(cb:'18206'  ; cg:'00428' ; cpte:'17990301001'     ; cle:'44'),
(cb:'30066'  ; cg:'00231' ; cpte:'06212789151'     ; cle:'85'),
(cb:'30027'  ; cg:'00262' ; cpte:'12026860011'     ; cle:'26'),
(cb:'30027'  ; cg:'00211' ; cpte:'12011840161'     ; cle:'64'),
(cb:'42559'  ; cg:'00008' ; cpte:'21021212007'     ; cle:'24'),
(cb:'30041'  ; cg:'00001' ; cpte:'0917528U020'     ; cle:''),
(cb:''       ; cg:''      ; cpte:'02231076310'     ; cle:'83'),
(cb:'10071'  ; cg:'01000' ; cpte:'00600009660'     ; cle:'16'),
(cb:'42659'  ; cg:'00004' ; cpte:'04231062167'     ; cle:'83'),
(cb:'42559'  ; cg:'00001' ; cpte:'210204371'       ; cle:'09'),
(cb:'10207'  ; cg:'00014' ; cpte:'04014045959'     ; cle:'33'),
(cb:'15879'  ; cg:'33845' ; cpte:'00452544940'     ; cle:'57'),
(cb:'42559'  ; cg:'00011' ; cpte:'21020939602'     ; cle:''),
(cb:''       ; cg:''      ; cpte:'02222111249'     ; cle:'76'),
(cb:'42559'  ; cg:'00005' ; cpte:'21022706304'     ; cle:''),
(cb:'30041'  ; cg:'00001' ; cpte:'0006419H020'     ; cle:'66'
);


Var
   i:integer;
   r:references;
   c:char;
   Ch : char;
const
     Esc=chr(27);


Procedure Pause;
Var
   ch:char;
begin
     while not keypressed do
           begin

           end;
     ch:=ReadKey;
end;


Function Show_RIB(r:references):string;
begin
     With r do
            begin
                 Show_RIB :=
                 'cb='''+cb+
                 '''  cg='''+cg+
                 '''  cpte='''+cpte+
                 '''  cle='''+cle+'''';
            end;
end;

Function digit(c:Char):byte;
Const
  Transcode='12345678912345678923456789';
     {       ABCDEFGHIJKLMNOPQRSTUVWXYZ }
Var
   s:string;
begin
     s:=Transcode;
     if (c>='a') and (c<='z') then
       c:=Chr(Ord(c)+Ord('A')-Ord('a'));
     if (c>='A') and (c<='Z') then
        digit:=Ord(S[1+Ord(c)-Ord('A')])-Ord('0')
     else
         if (c>='0') and (c<='9') then
        digit:=Ord(c)-Ord('0')
     else
         Begin
              WriteLN('illegal character :',c);
              Pause;
         end;
end;



Function Check_RIB(r:references):String;
Var
   i : byte;
   h,k: integer;
   s:string;

begin
     With r do
       begin
            if  (length(cb)=5) and
                (length(cg)=5) and
                (length(cpte)=11) and
                (length(cle)=2) then
                   begin
                     s:=cb+cg+cpte+cle;
                     h:=0;
                     k:=1;
                     i:=length(s);
                     repeat
                           h:= h+ k*digit(s[i]);
                           k:= (k *10) mod 97;
                           Dec(i);
                     until i=0;
                     if (h mod 97)=0 then
                        Check_RIB:='RIB cohérent'
                     else
                        Check_RIB:='RIB illégal'







                   end
            else
               Check_RIB:='Mauvaise structure';
       end;  {With}


end;






begin
     ClrScr;
     Writeln('======================================');
     Writeln('**** Traitement des exemples  ***');
     Writeln('======================================');

     for i:=1 to nb_ref do
         begin
              r:=Tab_ref[i];
              Write(Show_RIB(r),'    --->');
              WriteLN(Check_RIB(r));
         end;




     Pause;

end.

