Cet utilitaire calcul aussi la Cle INSEE mais je pense que cette pratique est réglementée.
je n'ai pas pu tester les numéro corse, n'en ayant pas en ma possession.
N'hésitez pas à tester ce code avec vos propres cartes. Merci de vos retours d'expérience.
Comme à chaque fois ce code est sous licence "As you like"
Code : Tout sélectionner
;Controle Vitale Version 1.01
;2013 - falsam
;O.S. Windows
EnableExplicit
Enumeration
#FontApp
#FontH1
#FontH2
#Mainform
#NumInsee
#NumInseeKey
#Help
#NumInseeCalc
#NumInseeVerify
EndEnumeration
Define.l Event, WEvent, MEvent, GEvent, TEvent
Global WindowStyle.i=#PB_Window_SystemMenu|#PB_Window_ScreenCentered
Global NumInsee.s, NumInseeKey.i, Col.i
;Reg Ex pour tester que la chaine ne comporte que des chiffre de 0 à 9
Global *RegMatch = CreateRegularExpression(#PB_Any ,"[0-9]")
Procedure StringGadgetCursorX(Gadget)
Protected Min.i, Max.i
SendMessage_(GadgetID(Gadget),#EM_GETSEL,@Min,@Max)
ProcedureReturn Max-SendMessage_(GadgetID(Gadget),#EM_LINEINDEX,SendMessage_(GadgetID(Gadget),#EM_LINEFROMCHAR,Min,0),0)+1
EndProcedure
;Calcul ou vérification de la clé de controle
Procedure CheckInseeKey(NumInsee.s, NumInseeKey.i, Verify.b=#False)
Protected Result.l
Result = 97 - (Val(NumInsee) - 97*Int(Val(NumInsee)/97))
If Verify = #False
;La clé est juste vérifié
If Result = NumInseeKey
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
Else
;la clé est calculée
ProcedureReturn Result
EndIf
EndProcedure
;Cas de la Corse
;On remplace le caractère A ou B par un zéro.
;Si la lettre est A ==> 2A devient 19 (NumInsee - 1 000 000).
;Si la lettre est B ==> 2B devient 18 (NumInsee - 2 000 000)
Procedure.s CaseCorse(NumInsee.s)
Protected Dummy.q ;Numéro insee à 13 chiffres
If FindString(NumInsee, "2A")
ReplaceString(NumInsee, "2A", "19", #PB_String_InPlace)
Dummy = Val(NumInsee)
EndIf
If FindString(NumInsee, "2B")
ReplaceString(NumInsee, "2B", "18", #PB_String_InPlace)
Dummy = Val(NumInsee)
EndIf
ProcedureReturn Str(Dummy)
EndProcedure
Procedure Open_MainForm()
Protected IdGadget.i
OpenWindow(#Mainform, 0, 0, 400, 250, "Controle Vitale 1.00", WindowStyle)
;Un peu de couleur
SetWindowColor(#MainForm, $037422)
;Dessin cotes gauche
IdGadget = CanvasGadget(#PB_Any, 0, 0, 100, 250)
StartDrawing(CanvasOutput(IdGadget))
Box(0, 0, 100, 250, $037422)
DrawingMode(#PB_2DDrawing_Outlined )
LineXY(0, 0, 100, 250, RGB(0, 0, 0))
FillArea(1, 5, RGB(0, 0, 0), RGB(255, 215, 0))
DrawingMode(#PB_2DDrawing_Transparent )
DrawingFont(FontID(#FontH1))
DrawText(30, 3, "Vit", RGB(255, 215, 0))
DrawingFont(FontID(#FontH2))
DrawRotatedText(5, 240, "(2013) falsam", 90 ,$037422)
StopDrawing()
;Dessin Entete
IdGadget = CanvasGadget(#PB_Any, 100, 0, 300, 70)
StartDrawing(CanvasOutput(IdGadget))
Box(0, 0, 300, 70, $037422)
DrawingMode(#PB_2DDrawing_Transparent )
DrawingFont(FontID(#FontH1))
DrawText(0, 3, "ale", RGB(255, 215, 0))
DrawingFont(FontID(#FontH2))
DrawText(30, 55, "Tout simplement essentielle.", RGB(255, 255, 255))
StopDrawing()
IdGadget = TextGadget(#PB_Any, 50, 82, 80, 20, "Code Insee")
SetGadgetColor(IdGadget, #PB_Gadget_BackColor, $037422)
SetGadgetColor(IdGadget, #PB_Gadget_FrontColor, $FFFFFF)
;13 Chiffre pour le numéro INSEE
;01-01 sexe (1 pour masculin, 2 pour féminin)
;02-03 Année de naissance (2 derniers chiffres du millésime)
;04-05 Mois de naissance sur 2 chiffres
;06-07 Numéro du département de naissance (99 pour l'étranger, 2A et 2B pour la Corse)
;08-10 Numéro d’ordre de la commune de naissance dans le département
;11-13 Numéro d'ordre d'inscription sur le registre d'état civil (3 chiffres)
StringGadget(#NumInsee, 130, 80, 200, 22, "", #PB_String_UpperCase)
SetGadgetAttribute(#NumInsee, #PB_String_MaximumLength, 13)
;La clé de vérification
StringGadget(#NumInseeKey, 335, 80, 50, 22, "", #PB_String_UpperCase)
SetGadgetAttribute(#NumInseeKey, #PB_String_MaximumLength, 2)
;Texte d'aide
TextGadget(#Help, 130, 110, 250, 100, "?")
SetGadgetColor(#Help, #PB_Gadget_BackColor,$037422)
SetGadgetColor(#Help, #PB_Gadget_FrontColor, $FFFFFF)
;Bouton de verification ou de création de la clé INSEE
ButtonGadget(#NumInseeVerify, 310, 220, 80, 22, "Calculer")
EndProcedure
Procedure Start()
;Initialisation application, police, etc ..
LoadFont(#FontApp, "Arial", 11)
LoadFont(#FontH1, "Arial", 40, #PB_Font_Bold) ;Font titre
LoadFont(#FontH2, "Arial", 9, #PB_Font_Bold) ;Font sous-titre
SetGadgetFont(#PB_Default,FontID(#FontApp))
Open_MainForm()
DisableGadget(#NumInseeVerify, #True)
Col=1
EndProcedure
start()
Repeat
Event = WaitWindowEvent(10)
GEvent = EventGadget()
TEvent = EventType()
Select Event
Case #WM_KEYUP, #WM_LBUTTONUP
Col = StringGadgetCursorX(#NumInsee)
;SetWindowTitle(#Mainform,"Column : "+Str(Col))
Select Col
Case 1
SetGadgetText(#Help, "Sexe : 1 pour les hommes, 2 pour les femmes, 3 pour les personnes transgenres ou pour les personnes étrangères de sexe masculin en cours d'immatriculation en France")
Case 2,3
SetGadgetText(#help, "Deux derniers chiffres de l'année de naissance ")
Case 4,5
SetGadgetText(#help, "Mois de naissance")
Case 6,7
SetGadgetText(#help, "Département de naissance métropolitain (2A ou 2B pour la Corse)")
Case 8,9,10
SetGadgetText(#Help, "Numéro d’ordre de la commune de naissance dans le département")
Case 11,12,13
SetGadgetText(#help, "Numéro d’ordre de l’acte de naissance dans le mois et la commune (ou le pays)")
Case 14
SetGadgetText(#help, "Clé de contrôle")
SetActiveGadget(#NumInseeKey)
EndSelect
Case #PB_Event_Gadget
Select GEvent
Case #NumInsee, #NumInseeKey
NumInsee = GetGadgetText(#NumInsee)
NumInseeKey = Val(GetGadgetText(#NumInseeKey))
If Tevent = #PB_EventType_Change
Col = StringGadgetCursorX(#NumInsee)
;On arrive à la colonne 8
;Si le 6eme caractere est un 2 alors le 7eme caractere est soit un A ou un B ou un chiffre
If Col=8 And Mid(GetGadgetText(#NumInsee), 6, 1) = "2"
If Mid(GetGadgetText(#NumInsee), 7, 1) <> "A" And Mid(GetGadgetText(#NumInsee), 7, 1) <> "B" Or Not MatchRegularExpression (*RegMatch, Mid(GetGadgetText(#NumInsee), 7, 1))
MessageRequester("Erreur","Erreur dans le département de naissance")
keybd_event_(#VK_BACK,0,0,0) ;On efface le dernier caractére
EndIf
;Pour toutes les autres positions le caractére doit etre numérique
ElseIf Col<>1 And Not MatchRegularExpression (*RegMatch, Mid(GetGadgetText(#NumInsee), Col-1, 1))
MessageRequester("Erreur","Uniquement des chiffres !")
keybd_event_(#VK_BACK,0,0,0) ;On efface le dernier caractére
EndIf
If Len(GetGadgetText(#NumInsee))=13 And Len(GetGadgetText(#NumInseeKey))=2
SetGadgetText(#NumInseeVerify, "Vérifier")
SetGadgetData(#NumInseeVerify, #False)
DisableGadget(#NumInseeVerify, #False)
EndIf
If Len(GetGadgetText(#NumInsee))=13 And Len(GetGadgetText(#NumInseeKey))=0
SetGadgetText(#NumInseeVerify, "Calculer")
SetGadgetData(#NumInseeVerify, #True)
If FindString(NumInsee, "2A") Or FindString(NumInsee, "2B")
CaseCorse(NumInsee)
EndIf
DisableGadget(#NumInseeVerify, #False)
EndIf
If Len(GetGadgetText(#NumInsee))<13
SetGadgetText(#NumInseeVerify, "Calculer")
SetGadgetData(#NumInseeVerify, #False)
DisableGadget(#NumInseeVerify, #True)
EndIf
EndIf
Case #NumInseeVerify
If FindString(NumInsee, "2A") Or FindString(NumInsee, "2B")
NumInsee = CaseCorse(NumInsee)
EndIf
If GetGadgetData(#NumInseeVerify) = #False
If Not CheckInseeKey(NumInsee, NumInseeKey)
MessageRequester("Erreur", "Vérifier les informations de la carte")
Else
MessageRequester("Information", "Le numéro de la carte est correct")
EndIf
Else
SetGadgetText(#NumInseeKey, Str(CheckInseeKey(NumInsee, NumInseeKey, #True)))
SetGadgetText(#NumInseeVerify, "Vérifier")
SetGadgetData(#NumInseeVerify, #False)
EndIf
SetActiveGadget(#NumInseeKey)
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver