OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

Rev 73 | Rev 90 | 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.sql.Configuration;
18
import org.openconcerto.sql.element.SQLElement;
19
import org.openconcerto.sql.model.SQLRow;
20
import org.openconcerto.sql.model.SQLRowListRSH;
21
import org.openconcerto.sql.model.SQLSelect;
41 ilm 22
import org.openconcerto.sql.model.SQLTable;
25 ilm 23
import org.openconcerto.sql.model.Where;
41 ilm 24
import org.openconcerto.utils.ProductInfo;
80 ilm 25
import org.openconcerto.utils.StringUtils;
25 ilm 26
 
27
import java.io.File;
28
import java.io.IOException;
29
import java.io.PrintStream;
30
import java.text.DateFormat;
41 ilm 31
import java.text.DecimalFormat;
32
import java.text.DecimalFormatSymbols;
25 ilm 33
import java.text.Normalizer;
34
import java.text.Normalizer.Form;
35
import java.text.SimpleDateFormat;
36
import java.util.Date;
37
import java.util.List;
38
 
41 ilm 39
import javax.swing.JOptionPane;
40
import javax.swing.SwingUtilities;
41
 
25 ilm 42
public class N4DS {
43
 
44
    private static DateFormat format = new SimpleDateFormat("ddMMyyyy");
45
    private ComptaPropsConfiguration conf = ((ComptaPropsConfiguration) Configuration.getInstance());
41 ilm 46
    private double masseSalarialeBrute;
25 ilm 47
    private static final byte[] retour = "'\n".getBytes();
48
    private PrintStream stream = null;
49
 
41 ilm 50
    DecimalFormat decimalFormat = new DecimalFormat("0.00");
51
 
73 ilm 52
    Date dateDebut, dateFin;
53
 
25 ilm 54
    // FIXME Salarie renvoye
55
 
56
    /**
57
     * Déclaration normale (type 51)
58
     * */
59
    public N4DS() {
41 ilm 60
        DecimalFormatSymbols symbol = new DecimalFormatSymbols();
61
        symbol.setDecimalSeparator('.');
62
        this.decimalFormat.setDecimalFormatSymbols(symbol);
25 ilm 63
 
64
    }
65
 
41 ilm 66
    public File createDocument() {
67
        this.masseSalarialeBrute = 0;
25 ilm 68
        File f = new File("N4DS_" + format.format(new Date()) + ".txt");
69
 
70
        try {
71
 
41 ilm 72
            this.stream = new PrintStream(f, "ISO-8859-1");
25 ilm 73
 
74
            SQLElement eltSalarie = this.conf.getDirectory().getElement("SALARIE");
75
 
76
            // Infos emetteur
77
            SQLRow rowSociete = this.conf.getRowSociete();
78
 
41 ilm 79
            writeS10(this.stream, rowSociete);
25 ilm 80
 
41 ilm 81
            writeS20(this.stream, rowSociete);
25 ilm 82
 
73 ilm 83
            SQLSelect sel = new SQLSelect();
25 ilm 84
            sel.addSelect(eltSalarie.getTable().getKey());
85
 
86
            @SuppressWarnings("unchecked")
87
            List<SQLRow> l = (List<SQLRow>) this.conf.getBase().getDataSource().execute(sel.asString(), new SQLRowListRSH(eltSalarie.getTable()));
88
 
89
            for (SQLRow row : l) {
90
                N4DSSalarie s = new N4DSSalarie(this);
91
                s.write(row, rowSociete);
92
 
93
            }
41 ilm 94
            writeS80(this.stream, rowSociete);
95
            writeS90(this.stream);
25 ilm 96
 
97
        } catch (IOException e) {
98
            e.printStackTrace();
99
        } finally {
41 ilm 100
            if (this.stream != null) {
101
                this.stream.close();
25 ilm 102
            }
103
        }
41 ilm 104
        return f;
25 ilm 105
    }
106
 
107
    private void writeS80(PrintStream stream, SQLRow rowSociete) throws IOException {
108
 
80 ilm 109
        final String nic = StringUtils.limitLength(rowSociete.getString("NUM_SIRET").replaceAll(" ", ""), 9);
25 ilm 110
 
41 ilm 111
        // // SIREN
112
        // write("S80.G01.00.001.001", siren);
25 ilm 113
 
114
        // NIC
115
        write("S80.G01.00.001.002", nic);
116
 
117
        SQLRow rowAdr = rowSociete.getForeignRow("ID_ADRESSE_COMMON");
118
        String voie = rowAdr.getString("RUE");
119
 
120
        // Complement adresse
121
        if (voie.contains("\n")) {
122
            String[] sVoies = voie.split("\n");
123
            if (sVoies.length > 0) {
124
                voie = sVoies[0];
125
                String complement = "";
126
                for (int i = 1; i < sVoies.length; i++) {
127
                    complement += sVoies[i].trim() + " ";
128
                }
129
                if (complement.length() > 0) {
130
                    complement = complement.substring(0, complement.length() - 1);
131
                }
132
 
133
                write("S80.G01.00.003.001", complement);
134
            }
135
        }
136
 
137
        // Voie
138
        write("S80.G01.00.003.006", voie);
139
 
140
        // TODO Code INSEE, facultatif
141
        // stream.write("S80.G01.00.003.007",voie);
142
 
143
        // FIXME Service de distribution
144
        // stream.write("S80.G01.00.003.009",ville.getName());
145
 
146
        // Code postal
73 ilm 147
        write("S80.G01.00.003.010", rowAdr.getString("CODE_POSTAL"));
25 ilm 148
 
149
        // Localité
73 ilm 150
        write("S80.G01.00.003.012", rowAdr.getString("VILLE").toUpperCase());
25 ilm 151
 
152
        // Code Pays, ne doit pas être renseigné pour une adresse en France
153
        // TODO support des autres pays
154
        // write("S80.G01.00.003.013", "");
155
 
156
        // FIXME effectif déclaré
157
        write("S80.G01.00.004.001", String.valueOf(getEffectifDeclare()));
158
 
159
        // TODO Code établissement sans salarié
160
        // write( "S80.G01.00.004.001", "2");
161
 
162
        // TODO Code assujettis taxe sur salaires
163
        write("S80.G01.00.005", "01");
164
 
165
        // Code NAF etablissement
166
        write("S80.G01.00.006", rowSociete.getString("NUM_APE"));
167
 
168
        // FIXME Code section prud'homale
169
        write("S80.G01.00.007.001", "04");
170
 
171
        // TODO stecion principale dérogatoire
172
        // write( "S80.G01.00.004.001", "2");
173
 
174
        // TODO Institution Prevoyance sans salarie
175
        // write( "S80.G01.01.001", "P0012");
176
        // write( "S80.G01.01.002", "0003");
177
 
178
        // TODO Institution retraite sans salarie
179
        // write( "S80.G01.02.001", "G022");
180
 
181
        // FIXME Code assujettissement taxe et contribution apprentissage
73 ilm 182
        write("S80.G62.00.001", "01");
41 ilm 183
        double totalApprentissage = this.masseSalarialeBrute * 0.0068;
25 ilm 184
        System.err.println(this.masseSalarialeBrute);
73 ilm 185
        write("S80.G62.00.002", this.decimalFormat.format(totalApprentissage));
25 ilm 186
 
73 ilm 187
        write("S80.G62.00.003", "02");
25 ilm 188
        // FIXME Code assujettissement formation professionnelle continue
73 ilm 189
        write("S80.G62.00.005", "01");
41 ilm 190
        double totalFormation = this.masseSalarialeBrute * 0.0055;
73 ilm 191
        write("S80.G62.00.007", this.decimalFormat.format(totalFormation));
25 ilm 192
 
73 ilm 193
        write("S80.G62.00.008", "02");
194
 
25 ilm 195
    }
196
 
197
    private void writeS90(PrintStream stream) throws IOException {
198
        // Nombre total de rubrique + S90
199
        write("S90.G01.00.001", String.valueOf(this.nbRubrique + 2));
200
 
201
        // Nombre total de rubrique S20
202
        write("S90.G01.00.002", String.valueOf(1));
203
    }
204
 
205
    private int nbRubrique = 0;
206
 
207
    public void write(String rubriqueName, String value) throws IOException {
208
        String tmp = rubriqueName + ",'";
41 ilm 209
        this.stream.write(tmp.getBytes());
210
        this.stream.write(value.getBytes());
211
        this.stream.write(retour);
25 ilm 212
 
213
        // if (rubriqueName.startsWith("S20")) {
214
        // this.nbRubriqueS20++;
215
        // }
216
        this.nbRubrique++;
217
    }
218
 
219
    private int getEffectifDeclare() {
220
        // FIXME ne pas inclure les intérimaires
221
        SQLElement eltSalarie = this.conf.getDirectory().getElement("SALARIE");
222
        SQLElement eltInfos = this.conf.getDirectory().getElement("INFOS_SALARIE_PAYE");
80 ilm 223
        SQLSelect sel = new SQLSelect();
25 ilm 224
        sel.addSelect(eltSalarie.getTable().getKey());
73 ilm 225
        Date d2 = new Date(112, 11, 31);
25 ilm 226
        Where w = new Where(eltSalarie.getTable().getField("ID_INFOS_SALARIE_PAYE"), "=", eltInfos.getTable().getKey());
227
        w = w.and(new Where(eltInfos.getTable().getField("DATE_SORTIE"), "=", (Date) null).or(new Where(eltInfos.getTable().getField("DATE_SORTIE"), ">", d2)));
228
 
229
        sel.setWhere(w);
230
        System.err.println(sel.asString());
231
        List<SQLRow> l = (List<SQLRow>) this.conf.getBase().getDataSource().execute(sel.asString(), new SQLRowListRSH(eltSalarie.getTable()));
232
 
233
        return (l == null ? 0 : l.size());
234
    }
235
 
236
    public static String normalizeString2(String s) {
237
        s = s.toUpperCase();
238
        String temp = Normalizer.normalize(s, Form.NFC);
239
        temp = temp.replaceAll("-", " ");
240
        return temp.replaceAll("[^\\p{ASCII}]", "");
241
    }
242
 
243
    private void writeS20(PrintStream stream, SQLRow rowSociete) throws IOException {
244
 
245
        // Siren
246
 
80 ilm 247
        String siren = StringUtils.limitLength(rowSociete.getString("NUM_SIRET").replaceAll(" ", ""), 9);
248
        String nic = StringUtils.limitLength(rowSociete.getString("NUM_SIRET").replaceAll(" ", ""), 9);
25 ilm 249
        write("S20.G01.00.001", siren);
250
 
251
        // Raison sociale
252
        write("S20.G01.00.002", rowSociete.getString("NOM"));
253
 
254
        // FIXME Debut periode
80 ilm 255
        write("S20.G01.00.003.001", "01012013");
25 ilm 256
 
257
        // FIXME Fin periode
80 ilm 258
        write("S20.G01.00.003.002", "31122013");
25 ilm 259
 
260
        // Code nature
261
        write("S20.G01.00.004.001", "01");
262
 
263
        // FIXME Code type (complement, Rectificatif, ...)
264
        write("S20.G01.00.004.002", "51");
265
 
266
        // fraction
267
        write("S20.G01.00.005", "11");
268
 
269
        // TODO debut periode rattachement
270
        // stream.write("S20.G01.00.006.001,'","11");
271
 
272
        // fin periode rattachement
273
        // stream.write("S20.G01.00.006.002,'","11");
274
 
275
        // Code devise de la déclaration
276
        write("S20.G01.00.007", "01");
277
 
278
        // NIC
279
        write("S20.G01.00.008", nic);
280
 
281
        SQLRow rowAdr = rowSociete.getForeignRow("ID_ADRESSE_COMMON");
282
        String voie = rowAdr.getString("RUE");
283
 
284
        // Complement adresse
285
        if (voie.contains("\n")) {
286
            String[] sVoies = voie.split("\n");
287
            if (sVoies.length > 0) {
288
                voie = sVoies[0];
289
                String complement = "";
290
                for (int i = 1; i < sVoies.length; i++) {
291
                    complement += sVoies[i].trim() + " ";
292
                }
293
                if (complement.length() > 0) {
294
                    complement = complement.substring(0, complement.length() - 1);
295
                }
296
 
297
                write("S20.G01.00.009.001", complement);
298
            }
299
        }
300
 
301
        // Voie
302
        write("S20.G01.00.009.006", voie);
303
 
304
        // Code postal
73 ilm 305
        write("S20.G01.00.009.010", rowAdr.getString("CODE_POSTAL"));
25 ilm 306
 
307
        // Localité
73 ilm 308
        write("S20.G01.00.009.012", rowAdr.getString("VILLE").toUpperCase());
25 ilm 309
 
41 ilm 310
        write("S20.G01.00.013.002", "1");
25 ilm 311
 
312
        // Code periodicite
313
        write("S20.G01.00.018", "A00");
314
 
41 ilm 315
        write("S20.G01.05.014.001", siren);
316
        write("S20.G01.05.014.002", nic);
317
        write("S20.G01.05.016.001", rowSociete.getString("MAIL"));
318
 
25 ilm 319
    }
320
 
321
    /**
322
     * Strucuture S10, N4DS
323
     * */
324
    private void writeS10(PrintStream stream, SQLRow rowSociete) throws IOException {
325
 
326
        // Siren
327
 
80 ilm 328
        String siren = StringUtils.limitLength(rowSociete.getString("NUM_SIRET").replaceAll(" ", ""), 9);
329
        String nic = StringUtils.limitLength(rowSociete.getString("NUM_SIRET").replaceAll(" ", ""), 9);
25 ilm 330
        write("S10.G01.00.001.001", siren);
331
 
332
        // NIC
333
        write("S10.G01.00.001.002", nic);
334
 
335
        // Raison sociale
336
        write("S10.G01.00.002", rowSociete.getString("NOM"));
337
 
338
        SQLRow rowAdr = rowSociete.getForeignRow("ID_ADRESSE_COMMON");
339
        String voie = rowAdr.getString("RUE");
340
 
341
        // Complement adresse
342
        if (voie.contains("\n")) {
343
            String[] sVoies = voie.split("\n");
344
            if (sVoies.length > 0) {
345
                voie = sVoies[0];
346
                String complement = "";
347
                for (int i = 1; i < sVoies.length; i++) {
348
                    complement += sVoies[i] + " ";
349
                }
350
                if (complement.length() > 0) {
351
                    complement = complement.substring(0, complement.length() - 1);
352
                }
353
 
354
                write("S10.G01.00.003.001", complement);
355
            }
356
        }
357
 
358
        // Voie
359
        write("S10.G01.00.003.006", voie);
360
 
361
        // TODO Code INSEE, facultatif
362
        // stream.write("S10.G01.00.003.007",voie);
363
 
364
        // TODO: Service de distribution
73 ilm 365
        write("S10.G01.00.003.009", rowAdr.getString("VILLE"));
25 ilm 366
 
367
        // Code postal
73 ilm 368
        write("S10.G01.00.003.010", rowAdr.getString("CODE_POSTAL"));
25 ilm 369
 
370
        // Localité
73 ilm 371
        write("S10.G01.00.003.012", rowAdr.getString("VILLE").toUpperCase());
25 ilm 372
 
373
        // Code Pays, ne doit pas être renseigné pour une adresse en France
374
        // TODO support des autres pays
375
        // write("S10.G01.00.003.013", "");
376
 
377
        // FIXME Référence de l'envoi
378
        // Incrémenté le numéro
379
        write("S10.G01.00.004,'", "1");
380
 
381
        // Nom du logiciel
382
        write("S10.G01.00.005", "OpenConcerto");
383
 
384
        // Nom de l'éditeur
385
        write("S10.G01.00.006", "ILM Informatique");
386
 
387
        // Numéro version
41 ilm 388
        write("S10.G01.00.007", ProductInfo.getInstance().getVersion());
25 ilm 389
 
390
        // Code service choisi
391
        write("S10.G01.00.009", "40");
392
 
393
        // Code envoi du fichier essai ou réel
394
        write("S10.G01.00.010", "02");
395
 
396
        // Norme utilisée
80 ilm 397
        write("S10.G01.00.011", "V01X08");
25 ilm 398
 
399
        // Code table char
400
        write("S10.G01.00.012", "01");
401
 
402
        // TODO Contact pour DADS
403
        // Code civilite
404
        write("S10.G01.01.001.001", "01");
41 ilm 405
 
25 ilm 406
        // Nom Contact
41 ilm 407
        SQLTable table = Configuration.getInstance().getRoot().findTable("CONTACT_ADMINISTRATIF");
408
        SQLSelect selContact = new SQLSelect(table.getBase());
409
        selContact.addSelectStar(table);
410
        selContact.setWhere(new Where(table.getField("N4DS"), "=", Boolean.TRUE));
411
        List<SQLRow> l = SQLRowListRSH.execute(selContact);
412
        if (l.size() == 0) {
413
            SwingUtilities.invokeLater(new Runnable() {
25 ilm 414
 
41 ilm 415
                @Override
416
                public void run() {
417
                    JOptionPane.showMessageDialog(null, "Aucun contact administratif pour la N4DS. Veuillez en définir un.");
418
                }
419
            });
420
        } else {
421
            SQLRow rowContact = l.get(0);
25 ilm 422
 
41 ilm 423
            // TODO Contact pour DADS
424
            write("S10.G01.01.001.002", rowContact.getString("NOM") + " " + rowContact.getString("PRENOM"));
25 ilm 425
 
41 ilm 426
            // Code domaine
427
            write("S10.G01.01.002", "03");
25 ilm 428
 
41 ilm 429
            // Adresse mail
430
            // TODO Contact pour DADS
431
            write("S10.G01.01.005", rowContact.getString("EMAIL"));
432
 
433
            // Tel
434
            write("S10.G01.01.006", rowContact.getString("TEL_DIRECT"));
435
 
436
            // Fax
437
            write("S10.G01.01.007", rowContact.getString("FAX"));
438
        }
25 ilm 439
    }
440
 
441
    private String getNumeroVoie(String voie) {
442
        String numero = "";
443
        voie = voie.trim();
444
        for (int i = 0; i < voie.trim().length(); i++) {
445
            char c = voie.charAt(i);
446
            if (c >= '0' && c <= '9') {
447
                numero += c;
448
            } else {
449
                break;
450
            }
451
        }
452
        return numero;
453
    }
454
 
455
    private String getVoieWithoutNumber(String voie) {
456
        voie = voie.trim();
457
        String resultVoie = new String(voie);
458
 
459
        for (int i = 0; i < voie.trim().length(); i++) {
460
            char c = voie.charAt(i);
461
            if (c >= '0' && c <= '9') {
462
                resultVoie = resultVoie.substring(1);
463
            } else {
464
                break;
465
            }
466
        }
467
        return resultVoie.trim();
468
    }
469
 
41 ilm 470
    public void addMasseSalarialeBrute(double baseBrute) {
25 ilm 471
        this.masseSalarialeBrute += baseBrute;
472
 
473
    }
474
 
475
}