OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

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

Rev Author Line No. Line
80 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.panel.compta;
15
 
16
import org.openconcerto.sql.model.DBRoot;
17
import org.openconcerto.sql.model.SQLRow;
18
import org.openconcerto.sql.model.SQLSelect;
19
import org.openconcerto.sql.model.SQLTable;
20
import org.openconcerto.utils.StringUtils;
21
 
22
import java.io.IOException;
23
import java.io.OutputStream;
24
import java.io.OutputStreamWriter;
25
import java.io.Writer;
26
import java.math.BigDecimal;
27
import java.nio.charset.Charset;
28
import java.text.DateFormat;
29
import java.text.DecimalFormat;
30
import java.text.DecimalFormatSymbols;
31
import java.text.SimpleDateFormat;
32
import java.util.ArrayList;
33
import java.util.Arrays;
34
import java.util.Date;
35
import java.util.List;
36
import java.util.Locale;
37
 
38
import org.apache.commons.dbutils.handlers.ArrayListHandler;
39
 
40
public class ExportFEC extends AbstractExport {
41
    static private final Charset CHARSET = StringUtils.ISO8859_15;
42
    static private final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("##0.00", DecimalFormatSymbols.getInstance(Locale.FRANCE));
43
 
44
    static private final List<String> COLS = Arrays.asList("JournalCode", "JournalLib", "EcritureNum", "EcritureDate", "CompteNum", "CompteLib", "CompAuxNum", "CompAuxLib", "PieceRef", "PieceDate",
45
            "EcritureLib", "Debit", "Credit", "EcritureLet", "DateLet", "ValidDate", "Montantdevise", "Idevise");
46
 
47
    static private String formatCents(final Number n) {
48
        return DECIMAL_FORMAT.format(BigDecimal.valueOf(n.longValue()).movePointLeft(2));
49
    }
50
 
51
    private List<Object[]> data;
52
    private final char zoneSep = '\t';
53
    private final char recordSep = '\n';
54
    private final char replacement = ' ';
55
 
56
    public ExportFEC(DBRoot rootSociete) {
57
        super(rootSociete, "FEC", ".csv");
58
    }
59
 
60
    @Override
61
    protected int fetchData(Date from, Date to, SQLRow selectedJournal, boolean onlyNew) {
62
        final SQLTable tableEcriture = getEcritureT();
63
        final SQLTable tableMouvement = tableEcriture.getForeignTable("ID_MOUVEMENT");
64
        final SQLTable tableCompte = tableEcriture.getForeignTable("ID_COMPTE_PCE");
65
        final SQLTable tableJrnl = tableEcriture.getForeignTable("ID_JOURNAL");
66
        final SQLTable tablePiece = tableMouvement.getForeignTable("ID_PIECE");
67
 
68
        final SQLSelect sel = createSelect(from, to, selectedJournal, onlyNew);
69
        sel.addSelect(tableJrnl.getField("CODE"));
70
        sel.addSelect(tableJrnl.getField("NOM"));
71
        sel.addSelect(tableMouvement.getField("NUMERO"));
72
        sel.addSelect(tableEcriture.getField("DATE"));
73
        sel.addSelect(tableCompte.getField("NUMERO"));
74
        sel.addSelect(tableCompte.getField("NOM"));
75
        sel.addSelect(tablePiece.getField("NOM"));
76
        // TODO ID_MOUVEMENT_PERE* ; SOURCE.DATE
77
        sel.addSelect(tableEcriture.getField("NOM"));
78
        sel.addSelect(tableEcriture.getField("DEBIT"));
79
        sel.addSelect(tableEcriture.getField("CREDIT"));
83 ilm 80
        sel.addSelect(tableEcriture.getField("DATE_LETTRAGE"));
81
        sel.addSelect(tableEcriture.getField("LETTRAGE"));
82
        sel.addSelect(tableEcriture.getField("DATE_VALIDE"));
80 ilm 83
 
84
        sel.addFieldOrder(tableEcriture.getField("DATE"));
85
        sel.addFieldOrder(tableMouvement.getField("NUMERO"));
86
 
87
        @SuppressWarnings("unchecked")
88
        final List<Object[]> l = (List<Object[]>) this.getRootSociete().getDBSystemRoot().getDataSource().execute(sel.asString(), new ArrayListHandler());
89
        this.data = l;
90
        return l == null ? 0 : l.size();
91
    }
92
 
93
    private final void addEmptyField(final List<String> line) {
94
        line.add(null);
95
    }
96
 
97
    private final void addAmountField(final List<String> line, final Number cents) {
98
        line.add(formatCents(cents));
99
    }
100
 
101
    private final void addField(final List<String> line, final String s) {
102
        if (this.zoneSep == this.replacement || this.recordSep == this.replacement)
103
            throw new IllegalStateException("Wrong separators");
104
        // TODO remove \r
105
        line.add(s.trim().replace(this.zoneSep, this.replacement).replace(this.recordSep, this.replacement));
106
    }
107
 
108
    @Override
109
    protected void export(OutputStream out) throws IOException {
110
        final Writer bufOut = new OutputStreamWriter(out, CHARSET);
111
        final DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
112
        final int fieldsCount = COLS.size();
113
 
114
        for (final String colName : COLS) {
115
            bufOut.write(colName);
116
            bufOut.write(this.zoneSep);
117
        }
118
        bufOut.write(this.recordSep);
119
 
120
        final List<String> line = new ArrayList<String>(fieldsCount);
121
        for (final Object[] array : this.data) {
122
            line.clear();
123
 
124
            // JournalCode
125
            addField(line, (String) array[0]);
126
            // JournalLib
127
            addField(line, (String) array[1]);
128
            // EcritureNum
129
            addField(line, String.valueOf(array[2]));
130
            // EcritureDate
131
            final String ecritureDate = dateFormat.format(array[3]);
132
            line.add(ecritureDate);
133
            // CompteNum
134
            addField(line, (String) array[4]);
135
            // CompteLib
136
            addField(line, (String) array[5]);
137
            // CompAuxNum
138
            addEmptyField(line);
139
            // CompAuxLib
140
            addEmptyField(line);
141
            // PieceRef
142
            addField(line, (String) array[6]);
143
            // PieceDate TODO ID_MOUVEMENT_PERE* ; SOURCE.DATE
144
            line.add(ecritureDate);
145
            // EcritureLib
146
            addField(line, (String) array[7]);
147
            // Debit
148
            addAmountField(line, (Number) array[8]);
149
            // Credit
150
            addAmountField(line, (Number) array[9]);
151
            // EcritureLet
83 ilm 152
            addField(line, (String) array[11]);
153
 
80 ilm 154
            // DateLet
83 ilm 155
            if (array[10] != null) {
156
                final String ecritureDateLettrage = dateFormat.format(array[10]);
157
                line.add(ecritureDateLettrage);
158
            } else {
159
                line.add("");
160
            }
80 ilm 161
            // ValidDate
83 ilm 162
            if (array[12] != null) {
163
                final String ecritureDateValid = dateFormat.format(array[12]);
164
                line.add(ecritureDateValid);
165
            } else {
166
                line.add("");
167
            }
80 ilm 168
            // Montantdevise
169
            addEmptyField(line);
170
            // Idevise
171
            addEmptyField(line);
172
 
173
            assert line.size() == fieldsCount;
174
            for (int i = 0; i < fieldsCount; i++) {
175
                final String zone = line.get(i);
176
                // blank field
177
                if (zone != null)
178
                    bufOut.write(zone);
179
                if (i < fieldsCount - 1)
180
                    bufOut.write(this.zoneSep);
181
            }
182
            bufOut.write(this.recordSep);
183
        }
83 ilm 184
        bufOut.close();
80 ilm 185
    }
186
}