OpenConcerto

Dépôt officiel du code source de l'ERP OpenConcerto
sonarqube

svn://code.openconcerto.org/openconcerto

Rev

Rev 25 | Rev 73 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
25 ilm 1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 2011 OpenConcerto, by ILM Informatique. All rights reserved.
5
 *
6
 * The contents of this file are subject to the terms of the GNU General Public License Version 3
7
 * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
8
 * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
9
 * language governing permissions and limitations under the License.
10
 *
11
 * When distributing the software, include this License Header Notice in each file.
12
 */
13
 
14
 package org.openconcerto.erp.core.humanresources.employe.report;
15
 
16
import org.openconcerto.erp.config.ComptaPropsConfiguration;
17
import org.openconcerto.map.model.Ville;
18
import org.openconcerto.sql.Configuration;
19
import org.openconcerto.sql.element.SQLElement;
20
import org.openconcerto.sql.model.SQLRow;
21
import org.openconcerto.sql.model.SQLRowListRSH;
22
import org.openconcerto.sql.model.SQLSelect;
23
import org.openconcerto.sql.model.Where;
24
 
25
import java.io.IOException;
26
import java.text.DateFormat;
41 ilm 27
import java.text.DecimalFormat;
28
import java.text.DecimalFormatSymbols;
25 ilm 29
import java.text.Normalizer;
30
import java.text.Normalizer.Form;
31
import java.text.SimpleDateFormat;
32
import java.util.Date;
33
import java.util.List;
34
 
35
import javax.swing.JFrame;
36
import javax.swing.JOptionPane;
41 ilm 37
import javax.swing.SwingUtilities;
25 ilm 38
 
39
public class N4DSSalarie {
40
 
41
    private static DateFormat format = new SimpleDateFormat("ddMMyyyy");
42
    private ComptaPropsConfiguration conf = ((ComptaPropsConfiguration) Configuration.getInstance());
43
    private N4DS n4ds;
44
 
41 ilm 45
    DecimalFormat decimalFormat = new DecimalFormat("0.00");
46
 
25 ilm 47
    // FIXME Salarie renvoye
48
 
49
    public N4DSSalarie(N4DS n4ds) {
50
        this.n4ds = n4ds;
41 ilm 51
        DecimalFormatSymbols symbol = new DecimalFormatSymbols();
52
        symbol.setDecimalSeparator('.');
53
        decimalFormat.setDecimalFormatSymbols(symbol);
25 ilm 54
    }
55
 
56
    public void write(SQLRow row, SQLRow rowSociete) throws IOException {
57
        writeS30(row);
58
        writeS41(row, rowSociete);
59
        writeS44(row);
41 ilm 60
        writeS48(row);
61
        writeS65(row);
25 ilm 62
    }
63
 
41 ilm 64
    private void writeS44(final SQLRow rowSalarie) throws IOException {
65
        // // FIXME
66
        // n4ds.write("S44.G01.00.001", "07");
67
        // n4ds.write("S44.G01.00.002", "1100");
68
 
69
        n4ds.write("S44.G03.00.001", "90");
70
 
71
        // FIXME Régimes complémentaires
72
        SQLRow rowInfos = rowSalarie.getForeignRow("ID_INFOS_SALARIE_PAYE");
73
        SQLRow rowContrat = rowInfos.getForeignRow("ID_CONTRAT_SALARIE");
74
        if (rowContrat.getString("CODE_IRC_RETRAITE") != null && rowContrat.getString("CODE_IRC_RETRAITE").trim().length() > 0) {
75
            // Mederic "G022"
76
            n4ds.write("S44.G03.05.001", rowContrat.getString("CODE_IRC_RETRAITE"));
77
            // 200339139001002
78
            n4ds.write("S44.G03.05.002", rowContrat.getString("NUMERO_RATTACHEMENT_RETRAITE"));
79
        }
80
 
81
        // UGRR
82
        if (rowContrat.getString("CODE_IRC_UGRR") != null && rowContrat.getString("CODE_IRC_UGRR").trim().length() > 0 && rowContrat.getString("NUMERO_RATTACHEMENT_UGRR") != null
83
                && rowContrat.getString("NUMERO_RATTACHEMENT_UGRR").trim().length() > 0) {
84
            // "A700"
85
            n4ds.write("S44.G03.05.001", rowContrat.getString("CODE_IRC_UGRR"));
86
            // 800943487
87
            n4ds.write("S44.G03.05.002", rowContrat.getString("NUMERO_RATTACHEMENT_UGRR"));
88
        } else {
89
            SwingUtilities.invokeLater(new Runnable() {
90
 
91
                @Override
92
                public void run() {
93
                    JOptionPane.showMessageDialog(null, "Attention les informations de rattachement à l'UGRR ne sont pas définies pour le salarié " + rowSalarie.getString("NOM"));
94
                }
95
            });
96
        }
97
 
98
        // UGRC
99
        if (rowContrat.getString("CODE_IRC_UGRC") != null && rowContrat.getString("CODE_IRC_UGRC").trim().length() > 0 && rowContrat.getString("NUMERO_RATTACHEMENT_UGRC") != null
100
                && rowContrat.getString("NUMERO_RATTACHEMENT_UGRC").trim().length() > 0) {
101
            // "C039"
102
            n4ds.write("S44.G03.05.001", rowContrat.getString("CODE_IRC_UGRC"));
103
            // "00095913"
104
            n4ds.write("S44.G03.05.002", rowContrat.getString("NUMERO_RATTACHEMENT_UGRC"));
105
        } else {
106
            SwingUtilities.invokeLater(new Runnable() {
107
 
108
                @Override
109
                public void run() {
110
                    JOptionPane.showMessageDialog(null, "Attention les informations de rattachement à l'UGRC ne sont pas définies pour le salarié " + rowSalarie.getString("NOM"));
111
                }
112
            });
113
        }
114
 
115
    }
116
 
117
    private void writeS48(SQLRow rowSalarie) throws IOException {
118
        // Assurance chômage
119
        n4ds.write("S48.G10.00.015", "01");
120
        n4ds.write("S48.G10.00.016", "90");
121
        n4ds.write("S48.G10.00.017", "01");
122
        final double baseBrute = getBaseBrute(rowSalarie);
123
        n4ds.write("S48.G10.00.018", decimalFormat.format(baseBrute));
124
        n4ds.write("S48.G10.00.019", decimalFormat.format(baseBrute));
125
 
126
    }
127
 
128
    private void writeS65(SQLRow rowSalarie) throws IOException {
129
        final double baseBrute = getBaseBrute(rowSalarie);
130
 
131
        if ((baseBrute / 12.0 / 151.6667) < (1.6 * 9.0)) {
132
            double COEFF_FILLON = (0.281 / 0.6) * ((1.6 * 9 * 12 * 151.6667 / (rowSalarie.getForeign("ID_INFOS_SALARIE_PAYE").getFloat("SALAIRE_MOIS") * 12.0)) - 1.0);
133
            n4ds.write("S65.G30.40.001", String.valueOf("9.00"));
134
            n4ds.write("S65.G30.40.002", decimalFormat.format(baseBrute));
135
            n4ds.write("S65.G30.40.003", decimalFormat.format(baseBrute * COEFF_FILLON));
136
        }
137
 
138
        // Section prudhomme
139
        n4ds.write("S65.G40.05.009", "01");
25 ilm 140
        // FIXME
41 ilm 141
        n4ds.write("S65.G40.05.010", "05");
25 ilm 142
 
41 ilm 143
        // FIXME durée annuelle = 1200heures
144
        n4ds.write("S65.G40.10.023.001", "01");
145
        n4ds.write("S65.G40.10.023.002", "98");
146
        n4ds.write("S65.G40.10.023.003", "98");
147
        n4ds.write("S65.G40.10.023.004", "98");
148
        n4ds.write("S65.G40.10.023.005", "98");
149
 
25 ilm 150
    }
151
 
152
    private void writeS41(SQLRow rowSalarie, SQLRow rowSociete) throws IOException {
153
 
154
        // FIXME Debut periode
155
        n4ds.write("S40.G01.00.001", "01012011");
156
        // FIXME embauche, etc...
157
        n4ds.write("S40.G01.00.002.001", "097");
158
 
159
        // FIXME Fin periode
41 ilm 160
        n4ds.write("S40.G01.00.003", "31122011");
25 ilm 161
        // FIXME licenciement, etc...
162
        n4ds.write("S40.G01.00.004.001", "098");
163
 
164
        // Nic de l'établissment du d'affectation du salarié
165
        String siren = rowSociete.getString("NUM_SIRET").replaceAll(" ", "").substring(0, 9);
166
        String nic = rowSociete.getString("NUM_SIRET").replaceAll(" ", "").substring(9);
167
        n4ds.write("S40.G01.00.005", nic);
168
 
169
        /**
170
         * Situation administrative générale du salarié ou de l'agent. S40.G10.00
171
         */
172
 
173
        // TODO: ajouter les codes emplois pour le public, etc...
174
        n4ds.write("S40.G10.00.005", "10");
175
 
176
        // TODO Code Employeur multiple
177
        // Ici forcé en employeur unique
178
        n4ds.write("S40.G10.00.008.001", "01");
179
 
180
        // TODO Code Emploi multiple
181
        // Ici forcé en emploi unique
182
        n4ds.write("S40.G10.00.008.002", "01");
183
 
184
        // TODO Code decalage paie
185
        // Ici, sans décalage de paie
186
        n4ds.write("S40.G10.00.009.001", "01");
187
        // Ici, paiement au mois
41 ilm 188
        n4ds.write("S40.G10.00.009.002", "16");
25 ilm 189
 
190
        SQLRow rowInfos = rowSalarie.getForeignRow("ID_INFOS_SALARIE_PAYE");
191
        SQLRow rowContrat = rowInfos.getForeignRow("ID_CONTRAT_SALARIE");
192
 
193
        // Nature de l'emploi
194
        n4ds.write("S40.G10.00.010", rowContrat.getString("NATURE"));
195
 
196
        // Catégorie socio
197
        SQLRow rowCodeEmploi = rowContrat.getForeignRow("ID_CODE_EMPLOI");
198
        n4ds.write("S40.G10.05.011.001", rowCodeEmploi.getString("CODE"));
199
 
200
        // code contrat
201
        SQLRow rowCodeContrat = rowContrat.getForeignRow("ID_CODE_CONTRAT_TRAVAIL");
202
        n4ds.write("S40.G10.05.012.001", rowCodeContrat.getString("CODE"));
203
 
204
        // code droit contrat
205
        SQLRow rowCodeDroitContrat = rowContrat.getForeignRow("ID_CODE_DROIT_CONTRAT");
206
        n4ds.write("S40.G10.05.012.002", rowCodeDroitContrat.getString("CODE"));
207
 
41 ilm 208
        // Code intitulé du contrat de travail
209
        n4ds.write("S40.G10.05.012.003", "90");
25 ilm 210
 
41 ilm 211
        // FIXME code modalité d'activité
212
        SQLRow rowStatutCat = rowContrat.getForeignRow("ID_CODE_STATUT_CATEGORIEL");
213
        n4ds.write("S40.G10.05.013.004", rowStatutCat.getString("CODE"));
25 ilm 214
 
215
        // FIXME code statut cat convention
41 ilm 216
        // SQLRow rowStatutCat = rowContrat.getForeignRow("ID_CODE_STATUT_CATEGORIEL");
217
        SQLRow rowCodeStatutConv = rowContrat.getForeignRow("ID_CODE_STATUT_CAT_CONV");
218
        n4ds.write("S40.G10.05.015.001", rowCodeStatutConv.getString("CODE"));
25 ilm 219
 
220
        // Code statut cat agirc arrco
221
        n4ds.write("S40.G10.05.015.002", rowStatutCat.getString("CODE"));
222
 
223
        // Convention collective IDCC
224
        SQLRow rowIDCC = rowInfos.getForeignRow("ID_IDCC");
225
        n4ds.write("S40.G10.05.016", rowIDCC.getString("CODE"));
226
        // FIXME Classement conventionnel
227
        n4ds.write("S40.G10.05.017", "sans classement conventionnel");
228
 
229
        /**
230
         * Caisse spécifique de congés payés. S40.G10.06
231
         */
232
 
233
        //
234
 
235
        /**
236
         * Complément salarié sous contrat de droit privé dans le secteur public. S40.G10.08
237
         */
238
        // TODO secteur public
239
 
240
        /**
241
         * Situation administrative spécifique de l'agent sous statut d'emploi de droit public.
242
         * S40.G10.10
243
         */
244
        // TODO secteur public
245
 
246
        /**
247
         * Emploi supérieur antérieur de l'agent sous statut personnel de droit public. S40.G10.15
248
         * */
249
        // TODO secteur public
250
 
251
        /**
252
         * Départ ou retour de détachement de l'agent sous statut personnel de droit public.
253
         * S40.G10.24
254
         */
255
        // TODO secteur public
256
 
257
        // FIXME Code regime de base obligatoire
258
        // n4ds.write("S41.G01.00.018.001", "200");
259
 
260
        // TODO rubrique conditionnelle
261
 
262
        // if (prenom.equalsIgnoreCase("guillaume")) {
263
        // // FIXME Durée anuelle du travail
264
        // n4ds.write( "S41.G01.00.023.001", "99");
265
        //
266
        // // FIXME Durée trimestrielle du travail
267
        // n4ds.write( "S41.G01.00.023.002", "12");
268
        //
269
        // // FIXME Durée mensuelle du travail
270
        // n4ds.write( "S41.G01.00.023.003", "98");
271
        // } else {
272
 
273
        // FIXME Code unité d'expression du temps de travail
274
        n4ds.write("S40.G15.00.001", "10");
275
 
41 ilm 276
        // FIXME Temps de travail
277
        double tempsTravail = 1820.00;
278
        n4ds.write("S40.G15.00.003", decimalFormat.format(tempsTravail));
279
        n4ds.write("S40.G15.00.022.001", decimalFormat.format(tempsTravail));
280
        n4ds.write("S40.G15.00.022.002", decimalFormat.format(tempsTravail));
281
 
282
        n4ds.write("S40.G15.05.013.001", "10");
283
        n4ds.write("S40.G15.05.025.001", "10");
284
        n4ds.write("S40.G15.05.025.002", decimalFormat.format(tempsTravail));
285
        n4ds.write("S40.G15.05.025.003", decimalFormat.format(tempsTravail));
286
 
287
        // Code régime obligatoire maladie
288
        n4ds.write("S40.G20.00.018.002", "200");
289
        // Code régime obligatoire AT
290
        n4ds.write("S40.G20.00.018.003", "200");
291
        // Code régime obligatoire vieillesse
292
        n4ds.write("S40.G20.00.018.004", "200");
293
 
25 ilm 294
        // TODO Code section accident travail
41 ilm 295
        n4ds.write("S40.G25.00.025", rowInfos.getString("CODE_AT"));
25 ilm 296
 
297
        // TODO Code risque accident travail
41 ilm 298
        n4ds.write("S40.G25.00.026", rowInfos.getString("CODE_SECTION_AT"));
25 ilm 299
 
300
        // TODO Code bureau
301
        // n4ds.write( "S41.G01.00.027", "B");
302
 
303
        // Taux accident travail
304
        float f = rowInfos.getFloat("TAUX_AT");
305
 
41 ilm 306
        n4ds.write("S40.G25.00.028", decimalFormat.format(f));
307
        n4ds.write("S40.G25.00.029", decimalFormat.format(tempsTravail));
308
 
25 ilm 309
        // Base brute
41 ilm 310
        final double baseBrute = getBaseBrute(rowSalarie);
311
        n4ds.write("S40.G28.05.029.001", decimalFormat.format(baseBrute));
25 ilm 312
        n4ds.addMasseSalarialeBrute(baseBrute);
313
 
314
        // Code nature cotisations
41 ilm 315
        n4ds.write("S40.G28.05.029.003", "01");
316
        n4ds.write("S40.G28.05.029.004", "0");
25 ilm 317
 
318
        // FIXME Base brute limité plafond
41 ilm 319
        n4ds.write("S40.G28.05.030.001", decimalFormat.format(baseBrute));
25 ilm 320
 
321
        // CSG
41 ilm 322
        n4ds.write("S40.G30.04.001", decimalFormat.format(getCSG(rowSalarie)));
25 ilm 323
 
41 ilm 324
        // FIXME CRDS ...
325
        n4ds.write("S40.G30.04.002", decimalFormat.format(getCSG(rowSalarie)));
25 ilm 326
 
327
        // FIXME base brute fiscale
41 ilm 328
        n4ds.write("S40.G40.00.035.001", decimalFormat.format(baseBrute));
25 ilm 329
 
41 ilm 330
        // revenu d'activite net
331
        n4ds.write("S40.G40.00.063.001", decimalFormat.format(getNetImp(rowSalarie)));
25 ilm 332
 
41 ilm 333
        // Fillon
334
        // if (rowSalarie.getString("PRENOM").equalsIgnoreCase("ludovic") ||
335
        // rowSalarie.getString("PRENOM").equalsIgnoreCase("guillaume")) {
336
        // // S41.G01.06.001 Code type exonération O X ..6
337
        // n4ds.write("S41.G01.06.001", "33");
338
        // // X S41.G01.06.002.001 Base brute soumise à exonération O N ..10
339
        // n4ds.write("S41.G01.06.002.001", String.valueOf(baseBrute));
340
        // }
341
 
342
        double fraisPro = getFraisProfessionels(rowSalarie);
343
 
25 ilm 344
        if (fraisPro > 0) {
345
            // remboursement frais pro
41 ilm 346
            n4ds.write("S40.G40.10.043", "02");
25 ilm 347
 
41 ilm 348
            // Montant des frais professionnels
349
            n4ds.write("S40.G40.10.044.001", decimalFormat.format(fraisPro));
25 ilm 350
 
351
        }
352
 
353
    }
354
 
41 ilm 355
    private double getFraisProfessionels(SQLRow rowSalarie) {
25 ilm 356
 
357
        SQLElement eltFichePaye = this.conf.getDirectory().getElement("FICHE_PAYE");
358
        SQLElement eltFichePayeElement = this.conf.getDirectory().getElement("FICHE_PAYE_ELEMENT");
359
        SQLElement eltRubriqueNet = this.conf.getDirectory().getElement("RUBRIQUE_NET");
360
        SQLSelect sel = new SQLSelect(rowSalarie.getTable().getBase());
361
        sel.addSelect(eltFichePayeElement.getTable().getKey());
41 ilm 362
        Date d = new Date(111, 0, 1);
363
        Date d2 = new Date(111, 11, 31);
25 ilm 364
        Where w = new Where(eltFichePaye.getTable().getField("DU"), d, d2);
365
        w = w.and(new Where(eltFichePaye.getTable().getField("VALIDE"), "=", Boolean.TRUE));
366
        w = w.and(new Where(eltFichePaye.getTable().getField("ID_SALARIE"), "=", rowSalarie.getID()));
367
        w = w.and(new Where(eltFichePayeElement.getTable().getField("ID_FICHE_PAYE"), "=", eltFichePaye.getTable().getKey()));
368
        w = w.and(new Where(eltFichePayeElement.getTable().getField("SOURCE"), "=", "RUBRIQUE_NET"));
369
 
370
        sel.setWhere(w);
371
        System.err.println(sel.asString());
372
        List<SQLRow> l = (List<SQLRow>) this.conf.getBase().getDataSource().execute(sel.asString(), new SQLRowListRSH(eltFichePayeElement.getTable()));
373
 
41 ilm 374
        double fraisPro = 0;
25 ilm 375
        for (SQLRow row : l) {
376
            int id = row.getInt("IDSOURCE");
377
            if (id > 1) {
378
                SQLRow rowRubrique = eltRubriqueNet.getTable().getRow(id);
379
                if (rowRubrique.getBoolean("FRAIS_PERS")) {
380
                    fraisPro += row.getFloat("MONTANT_SAL_AJ");
381
                }
382
            }
383
        }
384
 
41 ilm 385
        return fraisPro;
25 ilm 386
    }
387
 
41 ilm 388
    private double getBaseBrute(SQLRow rowSalarie) {
25 ilm 389
 
390
        SQLElement eltFichePaye = this.conf.getDirectory().getElement("FICHE_PAYE");
391
        SQLSelect sel = new SQLSelect(rowSalarie.getTable().getBase());
392
        sel.addSelect(eltFichePaye.getTable().getKey());
41 ilm 393
        Date d = new Date(111, 0, 1);
394
        Date d2 = new Date(111, 11, 31);
25 ilm 395
        Where w = new Where(eltFichePaye.getTable().getField("DU"), d, d2);
396
        w = w.and(new Where(eltFichePaye.getTable().getField("VALIDE"), "=", Boolean.TRUE));
397
        w = w.and(new Where(eltFichePaye.getTable().getField("ID_SALARIE"), "=", rowSalarie.getID()));
398
 
399
        sel.setWhere(w);
400
        System.err.println(sel.asString());
401
        List<SQLRow> l = (List<SQLRow>) this.conf.getBase().getDataSource().execute(sel.asString(), new SQLRowListRSH(eltFichePaye.getTable()));
402
 
41 ilm 403
        double brut = 0;
25 ilm 404
        for (SQLRow row : l) {
405
            brut += row.getFloat("SAL_BRUT");
406
        }
407
 
41 ilm 408
        return brut;
25 ilm 409
    }
410
 
41 ilm 411
    private double getNetImp(SQLRow rowSalarie) {
25 ilm 412
 
413
        SQLElement eltFichePaye = this.conf.getDirectory().getElement("FICHE_PAYE");
414
        SQLSelect sel = new SQLSelect(rowSalarie.getTable().getBase());
415
        sel.addSelect(eltFichePaye.getTable().getKey());
41 ilm 416
        Date d = new Date(111, 0, 1);
417
        Date d2 = new Date(111, 11, 31);
25 ilm 418
        Where w = new Where(eltFichePaye.getTable().getField("DU"), d, d2);
419
        w = w.and(new Where(eltFichePaye.getTable().getField("VALIDE"), "=", Boolean.TRUE));
420
        w = w.and(new Where(eltFichePaye.getTable().getField("ID_SALARIE"), "=", rowSalarie.getID()));
421
 
422
        sel.setWhere(w);
423
        List<SQLRow> l = (List<SQLRow>) this.conf.getBase().getDataSource().execute(sel.asString(), new SQLRowListRSH(eltFichePaye.getTable()));
424
 
41 ilm 425
        double brut = 0;
25 ilm 426
        for (SQLRow row : l) {
427
            brut += row.getFloat("NET_IMP");
428
        }
429
 
41 ilm 430
        return brut;
25 ilm 431
    }
432
 
41 ilm 433
    private double getCSG(SQLRow rowSalarie) {
25 ilm 434
 
435
        SQLElement eltFichePaye = this.conf.getDirectory().getElement("FICHE_PAYE");
436
        SQLSelect sel = new SQLSelect(rowSalarie.getTable().getBase());
437
        sel.addSelect(eltFichePaye.getTable().getKey());
41 ilm 438
        Date d = new Date(111, 0, 1);
439
        Date d2 = new Date(111, 11, 31);
25 ilm 440
        Where w = new Where(eltFichePaye.getTable().getField("DU"), d, d2);
441
        w = w.and(new Where(eltFichePaye.getTable().getField("VALIDE"), "=", Boolean.TRUE));
442
        w = w.and(new Where(eltFichePaye.getTable().getField("ID_SALARIE"), "=", rowSalarie.getID()));
443
 
444
        sel.setWhere(w);
445
        List<SQLRow> l = (List<SQLRow>) this.conf.getBase().getDataSource().execute(sel.asString(), new SQLRowListRSH(eltFichePaye.getTable()));
446
 
41 ilm 447
        double brut = 0;
25 ilm 448
        for (SQLRow row : l) {
449
            brut += row.getFloat("CSG");
450
        }
451
 
41 ilm 452
        return brut;
25 ilm 453
    }
454
 
455
    private void writeS30(SQLRow rowSalarie) throws IOException {
456
 
457
        SQLRow rowEtatCivil = rowSalarie.getForeignRow("ID_ETAT_CIVIL");
458
 
459
        // Numero inscription
460
        String nir = rowEtatCivil.getString("NUMERO_SS").replaceAll(" ", "");
461
 
462
        if (nir.length() >= 13) {
463
            nir = nir.substring(0, 13);
464
        } else {
465
            JOptionPane.showMessageDialog(new JFrame(), "Numéro d'inscription pour le salarié " + rowSalarie.getString("PRENOM") + " " + rowSalarie.getString("NOM") + " incorrect");
466
 
467
        }
468
        n4ds.write("S30.G01.00.001", nir);
469
 
470
        // Nom
471
        n4ds.write("S30.G01.00.002", rowSalarie.getString("NOM"));
472
 
473
        // Prenoms
474
        // FIXME: regarder pour les prénoms pas seulement le 1er
475
        n4ds.write("S30.G01.00.003", rowSalarie.getString("PRENOM"));
476
 
477
        // Code civilite
478
        final SQLRow rowTitre = rowSalarie.getForeignRow("ID_TITRE_PERSONNEL");
479
        final String civilite = rowTitre.getString("NOM").toLowerCase();
480
        if (civilite.contains("monsieur")) {
481
            n4ds.write("S30.G01.00.007", "01");
482
        } else if (civilite.contains("madame")) {
483
            n4ds.write("S30.G01.00.007", "02");
484
        } else if (civilite.contains("mademoiselle") || civilite.contains("mlle")) {
485
            n4ds.write("S30.G01.00.007", "03");
486
        } else {
487
            JOptionPane.showMessageDialog(new JFrame(), "Civilité incorrecte pour " + rowSalarie.getString("PRENOM") + " " + rowSalarie.getString("NOM") + " (" + civilite + ")");
488
        }
489
        SQLRow rowAdr = rowEtatCivil.getForeignRow("ID_ADRESSE");
490
        String voie = rowAdr.getString("RUE");
491
 
492
        Ville ville = Ville.getVilleFromVilleEtCode(rowAdr.getString("VILLE"));
493
 
494
        // Complement adresse
495
        if (voie.contains("\n")) {
496
            String[] sVoies = voie.split("\n");
497
            if (sVoies.length > 0) {
498
                voie = sVoies[0].trim();
499
                String complement = "";
500
                for (int i = 1; i < sVoies.length; i++) {
501
                    complement += sVoies[i].trim() + " ";
502
                }
503
                if (complement.length() > 0) {
504
                    complement = complement.substring(0, complement.length() - 1);
505
                }
506
 
507
                n4ds.write("S30.G01.00.008.001", complement);
508
            }
509
        }
510
 
511
        // Numéro, extension, nature et libellé de la voie
512
        n4ds.write("S30.G01.00.008.006", voie);
513
 
514
        // Code postal
515
        n4ds.write("S30.G01.00.008.010", ville.getCodepostal());
516
 
517
        // Commune
518
        String villeFormat = normalizeString2(ville.getName());
519
        n4ds.write("S30.G01.00.008.012", villeFormat);
520
 
521
        // Date de naissance
522
        Date d = rowEtatCivil.getDate("DATE_NAISSANCE").getTime();
523
        n4ds.write("S30.G01.00.009", format.format(d));
524
 
525
        // Commune de naissance
526
        String villeFormat2 = normalizeString2(rowEtatCivil.getString("COMMUNE_NAISSANCE"));
527
        n4ds.write("S30.G01.00.010", villeFormat2);
528
 
529
        SQLRow rowDept = rowEtatCivil.getForeignRow("ID_DEPARTEMENT_NAISSANCE");
530
 
531
        // Code departement de naissance
532
        n4ds.write("S30.G01.00.011", rowDept.getString("NUMERO"));
533
 
534
        SQLRow rowPays = rowEtatCivil.getForeignRow("ID_PAYS_NAISSANCE");
535
 
536
        // Pays naissance
537
        String pays = rowPays.getString("NOM").toUpperCase();
538
        n4ds.write("S30.G01.00.012", pays);
539
 
540
        // Pays
541
        n4ds.write("S30.G01.00.013", pays);
542
 
543
        // Matricule Salarie
41 ilm 544
        n4ds.write("S30.G01.00.019", rowSalarie.getString("CODE"));
25 ilm 545
    }
546
 
547
    public static String normalizeString2(String s) {
548
        s = s.toUpperCase();
549
        String temp = Normalizer.normalize(s, Form.NFC);
550
        temp = temp.replaceAll("-", " ");
551
        return temp.replaceAll("[^\\p{ASCII}]", "");
552
    }
553
 
554
    private String getNumeroVoie(String voie) {
555
        String numero = "";
556
        voie = voie.trim();
557
        for (int i = 0; i < voie.trim().length(); i++) {
558
            char c = voie.charAt(i);
559
            if (c >= '0' && c <= '9') {
560
                numero += c;
561
            } else {
562
                break;
563
            }
564
        }
565
        return numero;
566
    }
567
 
568
    private String getVoieWithoutNumber(String voie) {
569
        voie = voie.trim();
570
        String resultVoie = new String(voie);
571
 
572
        for (int i = 0; i < voie.trim().length(); i++) {
573
            char c = voie.charAt(i);
574
            if (c >= '0' && c <= '9') {
575
                resultVoie = resultVoie.substring(1);
576
            } else {
577
                break;
578
            }
579
        }
580
        return resultVoie.trim();
581
    }
582
 
583
}