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

Last change on this file since 93035 was 93035, checked in by teddy.spip@…, 4 years ago

Sur la zone, on est en tabulation et non en espace pour l'indentation (nicod_)

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