source: spip-zone/_plugins_/spip_proprietaire/spip_3/inc/spip_proprio_insee.php @ 102436

Last change on this file since 102436 was 102436, checked in by cyp@…, 3 years ago

PSR SPIP

File size: 8.0 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6
7// ----------------------
8// FILTRES INSEE
9// ----------------------
10// CF. <http://fr.wikipedia.org/wiki/Code_Insee>
11// Exemple : siren=732 829 320
12// Exemple : siret=404 833 048 00022 tva=FR 83 404 833 048
13
14/**
15 * Calcule un numéro SIREN.
16 *
17 * @param numeric $_num          Le numéro SIREN à compléter (8 ou 9 chiffres)
18 * @param bool    $remplacer_cle Doit-on renvoyer un SIREN valide (en remplaçant la clé le cas échéant) ?
19 */
20function calculer_siren($_num = null, $remplacer_cle = false) {
21        if (is_null($_num)) {
22                return 0;
23        }
24        $num = preg_replace('/[^0-9]/', '', $_num);
25        if (strlen($num) > 9) {
26                return false;
27        }
28        if ($remplacer_cle && strlen($num) == 9) {
29                $num = substr($num, 0, 8);
30        }
31        if (strlen($num) == 8) {
32                $_num = $_num.cle_de_luhn($num);
33        }
34
35        return $_num;
36}
37
38/**
39 * Vérifier la validité d'un numéro SIREN.
40 *
41 * @param numeric $num Le numéro à vérifier (8 ou 9 chiffres)
42 */
43function siren_valide($num = null) {
44        if (is_null($num)) {
45                return 0;
46        }
47        $num = calculer_siren($num);
48        $num = preg_replace('/[^0-9]/', '', $num);
49        if (strlen($num) != 9) {
50                return false;
51        }
52
53        return luhn_valide($num);
54}
55
56/**
57 * Calcule un numéro SIRET.
58 *
59 * @param numeric $_num_siren    Le numéro SIREN (8 ou 9 chiffres)
60 * @param numeric $_num_siret    Le numéro SIRET (1 à 5 chiffres)
61 * @param bool    $remplacer_cle Doit-on renvoyer un SIREN valide (en remplaçant la clé le cas échéant) ?
62 */
63function calculer_siret($_num_siren = null, $_num_siret = null, $remplacer_cle = false) {
64        if (is_null($_num_siren) || is_null($_num_siret)) {
65                return 0;
66        }
67        $_num_siren = calculer_siren($_num_siren);
68        $num_siret = preg_replace('/[^0-9]/', '', $_num_siret);
69        $num_siren = preg_replace('/[^0-9]/', '', $_num_siren);
70        if (strlen($num_siret) > 5) {
71                return false;
72        } elseif (strlen($num_siret) <= 3) {
73                $num_siret = sprintf('%04d', $num_siret);
74        } elseif ($remplacer_cle && strlen($num_siret) == 5) {
75                $num_siret = substr($num_siret, 0, 4);
76        }
77        if (strlen($num_siret) == 4) {
78                $_num_siret = $num_siret.cle_de_luhn($num_siren.$num_siret);
79        }
80
81        return $_num_siren.(substr_count($_num_siren, ' ') ? ' ' : '').$_num_siret;
82}
83
84/**
85 * Vérifier la validité d'un numéro SIRET.
86 *
87 * @param numeric $num_siren Le numéro SIREN (8 ou 9 chiffres) | Si unique argument, considéré comme SIRET complet
88 * @param numeric $num_siret Le numéro SIRET (1 à 5 chiffres)
89 */
90function siret_valide($num_siren = null, $num_siret = null) {
91        if (is_null($num_siren)) {
92                return false;
93        }
94        $num_siren = preg_replace('/[^0-9]/', '', $num_siren);
95        if (is_null($num_siret)) {
96                $bckup = $num_siren;
97                $num_siren = substr($bckup, 0, 9);
98                $num_siret = substr($bckup, 9);
99        }
100        $num_siren = calculer_siren($num_siren);
101        if (!siren_valide($num_siren)) {
102                return false;
103        }
104        $num_siret = calculer_siret($num_siren, $num_siret);
105        $num_siret = preg_replace('/[^0-9]/', '', $num_siret);
106        if (strlen($num_siret) != 14) {
107                return false;
108        }
109
110        return luhn_valide($num_siren.$num_siret);
111}
112
113/**
114 * Renvoie l'identifiant de TVA intracommunautaire correspondant à un numéro SIREN tel qu'il est calculé par l'INSEE
115 * Valable seulement en France.
116 *
117 * @param numeric $_num_siren Le numéro SIREN utilisé
118 *
119 * @return string L'identifiant de TVA qui préfixe le numéro SIREN
120 */
121function calculer_tva_intracom($_num_siren = null) {
122        if (is_null($_num_siren)) {
123                return 0;
124        }
125        $num_siren = calculer_siren($_num_siren);
126        $num_siren = preg_replace('/[^0-9]/', '', $num_siren);
127        $tva = (12 + 3 * ($num_siren % 97)) % 97;
128
129        return 'FR '.$tva;
130}
131
132/**
133 * Vérifier la validité d'un numéro de TVA intracommunautaire.
134 *
135 * @param numeric $num_siren Le numéro TVA
136 */
137function tva_intracom_valide($_num_tva = null) {
138        if (is_null($_num_tva)) {
139                return 0;
140        }
141        $num_tva = preg_replace('/[^0-9]/', '', $_num_tva);
142        if (strlen($num_tva) != 11) {
143                return false;
144        }
145        $num_siren = substr($num_tva, 2);
146        $tva_verif = str_replace('FR ', '', calculer_tva_intracom($num_siren));
147
148        return $tva_verif == substr($num_tva, 0, 2);
149}
150
151/**
152 * Formule de Luhn.
153 *
154 * @param numeric $_num La suite de chiffre sur laquelle calculée la clé (sans la clé donc ...)
155 *
156 * @return numeric La clé calculée
157 */
158function cle_de_luhn($_num = null) {
159        if (is_null($_num)) {
160                return 0;
161        }
162        $num = $_num.'0';
163        $length = strlen($num);
164        $checksum = 0;
165        for ($i = $length - 1; $i >= 0; --$i) {
166                $digit = $num[$i];
167                if ((($length - $i) % 2) == 0) {
168                        $digit = $digit * 2;
169                        if ($digit > 9) {
170                                $digit = $digit - 9;
171                        }
172                }
173                $checksum += $digit;
174        }
175        $cleLuhn = 10 - ($checksum % 10);
176        if ($cleLuhn == 10) {
177                $cleLuhn = 0;
178        }
179
180        return $cleLuhn;
181}
182
183/**
184 * Vérifie que le dernier chiffre de la suite est bien la clé de Luhn de la suite.
185 *
186 * @param numeric $num La suite à vérifier AVEC la clé en fin
187 *
188 * @return bool OK si le dernier chiffre est bien la clé de Luhn de la suite précédente
189 */
190function luhn_valide($num = null) {
191        if (is_null($num)) {
192                return 0;
193        }
194        $_num = substr($num, 0, strlen($num) - 1);
195
196        return (intval($num) == intval($_num.cle_de_luhn($_num)));
197}
198
199/*
200$siren = '404 833 04';
201$siren_full = calculer_siren($siren);
202$siren_ok = siren_valide($siren_full);
203
204$siren_fake = '404 833 043';
205$siren_fake_ok = siren_valide($siren_fake);
206$siren_fake_recalc = calculer_siren($siren, true);
207$siren_fake_recalc_ok = siren_valide($siren_fake_recalc);
208
209$siret = '2';
210$siret_full = calculer_siret($siren, $siret);
211$siret_ok = siret_valide($siret_full);
212
213$siret_fake = '00024';
214$siret_fake_ok = siret_valide($siren_fake.$siret_fake);
215$siret_fake_recalc = calculer_siret($siren_fake_recalc, $siret_fake, true);
216$siret_fake_recalc_ok = siret_valide($siret_fake_recalc);
217
218$tva_intracom = calculer_tva_intracom($siren);
219$tva_intracom_full = $tva_intracom.' '.$siren_full;
220$tva_ok = tva_intracom_valide($tva_intracom_full);
221
222$tva_intracom_fake = 'FR 76';
223$tva_fake_ok = tva_intracom_valide($tva_fake.$siren_fake);
224$tva_fake_recalc = calculer_tva_intracom($siren_fake_recalc);
225$tva_fake_recalc_ok = tva_intracom_valide($tva_fake_recalc.$siren_fake_recalc);
226
227        echo "<ul>";
228        echo "<li>SIREN : '$siren'</li>";
229        echo "<li>SIRET : '$siret'</li>";
230        echo "<li>SIREN completé : '$siren_full' (valide : ".var_export($siren_ok, 1).")</li>";
231        echo "<li>SIRET completé : '$siret_full' (valide : ".var_export($siret_ok, 1).")</li>";
232        echo "<li>TVA intracommunautaire calculé : '$tva_intracom_full' (valide : ".var_export($tva_ok, 1).")</li>";
233        echo "</ul>";
234        echo "<ul>";
235        echo "<li>SIREN faux : '$siren_fake' (valide : ".var_export($siren_fake_ok, 1).")</li>";
236        echo "<li>SIRET faux : '$siret_fake' (valide : ".var_export($siret_fake_ok, 1).")</li>";
237        echo "<li>TVA faux : '$tva_intracom_fake' (valide : ".var_export($tva_fake_ok, 1).")</li>";
238        echo "</ul>";
239        echo "<ul>";
240        echo "<li>SIREN faux recalculé : '$siren_fake_recalc' (valide : ".var_export($siren_fake_recalc_ok, 1).")</li>";
241        echo "<li>SIRET faux recalculé : '$siret_fake_recalc' (valide : ".var_export($siret_fake_recalc_ok, 1).")</li>";
242        echo "<li>TVA faux recalculé : '$tva_fake_recalc' (valide : ".var_export($tva_fake_recalc_ok, 1).")</li>";
243        echo "</ul>";
244
245exit;
246*/
247
248/**
249 * Complète les références depuis SIREN et SIRET.
250 *
251 * @param numeric $num_siren Le numéro SIREN (8 ou 9 chiffres) | Si unique argument, considéré comme SIRET complet
252 * @param numeric $num_siret Le numéro SIRET (1 à 5 chiffres)
253 *
254 * @return array( SIREN , SIRET , TVA )
255 */
256function completer_insee($num_siren = null, $num_siret = null, $notva = false, $forcer_siret = false) {
257        if (is_null($num_siren)) {
258                return false;
259        }
260        $num_siren = preg_replace('/[^0-9]/', '', $num_siren);
261        if (is_null($num_siret)) {
262                if (strlen($num_siren) > 9) {
263                        $bckup = $num_siren;
264                        $num_siren = substr($bckup, 0, 9);
265                        $num_siret = substr($bckup, 9);
266                } else {
267                        if ($forcer_siret) {
268                                $num_siret = '1';
269                        } else {
270                                $num_siret = false;
271                        }
272                }
273        }
274        $siren_ok = calculer_siren($num_siren);
275        $siret_ok = $num_siret ? calculer_siret($siren_ok, $num_siret) : '';
276        $tva_intracom_ok = $notva === true ? '' : calculer_tva_intracom($siren_ok);
277
278        return array($siren_ok, str_replace($siren_ok, '', $siret_ok), $tva_intracom_ok);
279}
Note: See TracBrowser for help on using the repository browser.