OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

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

Rev Author Line No. Line
67 ilm 1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
182 ilm 4
 * Copyright 2011-2019 OpenConcerto, by ILM Informatique. All rights reserved.
67 ilm 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.common.ui;
15
 
16
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
17
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
149 ilm 18
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
67 ilm 19
import org.openconcerto.sql.Configuration;
156 ilm 20
import org.openconcerto.sql.model.SQLBackgroundTableCache;
21
import org.openconcerto.sql.model.SQLBackgroundTableCacheItem;
67 ilm 22
import org.openconcerto.sql.model.SQLRow;
23
import org.openconcerto.sql.model.SQLRowAccessor;
182 ilm 24
import org.openconcerto.sql.model.SQLRowValues;
25
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
67 ilm 26
import org.openconcerto.sql.model.SQLTable;
182 ilm 27
import org.openconcerto.sql.model.Where;
149 ilm 28
import org.openconcerto.sql.preferences.SQLPreferences;
90 ilm 29
import org.openconcerto.utils.DecimalUtils;
142 ilm 30
import org.openconcerto.utils.Tuple2;
67 ilm 31
 
32
import java.math.BigDecimal;
33
import java.math.RoundingMode;
156 ilm 34
import java.util.Collection;
67 ilm 35
import java.util.HashMap;
73 ilm 36
import java.util.HashSet;
182 ilm 37
import java.util.List;
67 ilm 38
import java.util.Map;
73 ilm 39
import java.util.Set;
67 ilm 40
 
41
public class TotalCalculator {
42
 
43
    private static String FIELD_SERVICE = "SERVICE";
73 ilm 44
    private static String FIELD_POIDS = "T_POIDS";
67 ilm 45
    private final String fieldHT, fieldHA, fieldDevise;
149 ilm 46
    private boolean imputEcart = true;
80 ilm 47
    private SQLRowAccessor rowDefaultCptProduit, rowDefaultCptService, rowDefaultCptTVACollecte, rowDefaultCptTVADeductible, rowDefaultCptAchat;
67 ilm 48
 
156 ilm 49
    private final SQLRowAccessor rowCatComptable;
50
 
93 ilm 51
    private SQLRowAccessor rowDefaultCptProduitStandard;
52
 
73 ilm 53
    private double totalPoids;
67 ilm 54
 
55
    private BigDecimal totalDevise, totalDeviseSel;
56
    private BigDecimal totalHA, totalHASel;
142 ilm 57
    private BigDecimal totalEco, totalEcoSel;
67 ilm 58
    private BigDecimal totalService, totalServiceSel;
142 ilm 59
    private BigDecimal totalHTSansFActurable, totalTTC, totalTTCSel;
67 ilm 60
    private long remiseHT, remiseRestante;
80 ilm 61
    private final boolean achat;
67 ilm 62
 
63
    // Total des HT par comptes
64
    private Map<SQLRowAccessor, BigDecimal> mapHt = new HashMap<SQLRowAccessor, BigDecimal>();
65
    private Map<SQLRowAccessor, BigDecimal> mapHtSel = new HashMap<SQLRowAccessor, BigDecimal>();
66
 
67
    // Total des TVA par comptes
68
    private Map<SQLRowAccessor, BigDecimal> mapHtTVA = new HashMap<SQLRowAccessor, BigDecimal>();
144 ilm 69
    private Map<SQLRowAccessor, Map<SQLRowAccessor, BigDecimal>> mapHtTaxeCompl = new HashMap<SQLRowAccessor, Map<SQLRowAccessor, BigDecimal>>();
142 ilm 70
    private Map<SQLRowAccessor, BigDecimal> mapHtTVAIntra = new HashMap<SQLRowAccessor, BigDecimal>();
67 ilm 71
    private Map<SQLRowAccessor, BigDecimal> mapHtTVASel = new HashMap<SQLRowAccessor, BigDecimal>();
142 ilm 72
 
73
    // Total HT par TVA
74
    private Map<SQLRowAccessor, Tuple2<BigDecimal, BigDecimal>> mapHtTVARowTaux = new HashMap<SQLRowAccessor, Tuple2<BigDecimal, BigDecimal>>();
73 ilm 75
    private int[] selectedRows;
67 ilm 76
 
77
    private Boolean bServiceActive;
78
    private BigDecimal totalHTAvantRemise;
142 ilm 79
    private boolean intraComm = false;
67 ilm 80
 
156 ilm 81
    public TotalCalculator(String fieldHA, String fieldHT, String fieldDeviseTotal, SQLRowAccessor rowCatComptable) {
82
        this(fieldHA, fieldHT, fieldDeviseTotal, false, null, rowCatComptable);
80 ilm 83
    }
67 ilm 84
 
90 ilm 85
    public void setRowDefaultCptService(SQLRowAccessor rowDefaultCptService) {
86
        this.rowDefaultCptService = rowDefaultCptService;
87
    }
88
 
142 ilm 89
    public void setIntraComm(boolean intraComm) {
90
        this.intraComm = intraComm;
91
    }
92
 
156 ilm 93
    public TotalCalculator(String fieldHA, String fieldHT, String fieldDeviseTotal, boolean achat, SQLRowAccessor defaultCompte, SQLRowAccessor rowCatComptable) {
80 ilm 94
 
95
        this.achat = achat;
67 ilm 96
        initValues();
97
 
98
        this.fieldDevise = fieldDeviseTotal;
99
        this.fieldHA = fieldHA;
100
        this.fieldHT = fieldHT;
91 ilm 101
        final SQLTable tablePrefCompte = Configuration.getInstance().getRoot().findTable("PREFS_COMPTE");
156 ilm 102
        final SQLBackgroundTableCacheItem cacheForTablePref = SQLBackgroundTableCache.getInstance().getCacheForTable(tablePrefCompte);
103
        final SQLBackgroundTableCacheItem cacheForTableCompte = SQLBackgroundTableCache.getInstance().getCacheForTable(tablePrefCompte.getTable("COMPTE_PCE"));
104
        final SQLRow rowPrefsCompte = cacheForTablePref.getRowFromId(2);
105
 
149 ilm 106
        SQLPreferences prefs = SQLPreferences.getMemCached(tablePrefCompte.getDBRoot());
107
        this.imputEcart = prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.IMPUT_ECART, true);
108
 
142 ilm 109
        // FIXME faire un fetcher pour ne pas faire 5 requetes (1 par getForeign)
67 ilm 110
        // Comptes par défaut
156 ilm 111
        this.rowDefaultCptService = cacheForTableCompte.getRowFromId(rowPrefsCompte.getForeignID("ID_COMPTE_PCE_VENTE_SERVICE"));
67 ilm 112
        if (this.rowDefaultCptService == null || this.rowDefaultCptService.isUndefined()) {
113
            try {
114
                this.rowDefaultCptService = ComptePCESQLElement.getRowComptePceDefault("VentesServices");
115
            } catch (Exception e) {
116
                e.printStackTrace();
117
            }
118
        }
119
 
156 ilm 120
        this.rowCatComptable = rowCatComptable;
121
 
93 ilm 122
        if (defaultCompte == null || defaultCompte.isUndefined()) {
156 ilm 123
 
124
            if (rowCatComptable != null && !rowCatComptable.isUndefined() && !rowCatComptable.isForeignEmpty("ID_COMPTE_PCE_VENTE")) {
125
                this.rowDefaultCptProduit = cacheForTableCompte.getRowFromId(rowCatComptable.getForeignID("ID_COMPTE_PCE_VENTE"));
126
            } else {
127
                this.rowDefaultCptProduit = cacheForTableCompte.getRowFromId(rowPrefsCompte.getForeignID("ID_COMPTE_PCE_VENTE_PRODUIT"));
128
                if (this.rowDefaultCptProduit == null || this.rowDefaultCptProduit.isUndefined()) {
129
                    try {
130
                        this.rowDefaultCptProduit = ComptePCESQLElement.getRowComptePceDefault("VentesProduits");
131
                    } catch (Exception e) {
132
                        e.printStackTrace();
133
                    }
93 ilm 134
                }
67 ilm 135
            }
93 ilm 136
        } else {
137
            this.rowDefaultCptProduit = defaultCompte;
67 ilm 138
        }
93 ilm 139
        this.rowDefaultCptProduitStandard = this.rowDefaultCptProduit;
67 ilm 140
 
156 ilm 141
        this.rowDefaultCptTVACollecte = cacheForTableCompte.getRowFromId(rowPrefsCompte.getForeignID("ID_COMPTE_PCE_TVA_VENTE"));
80 ilm 142
        if (this.rowDefaultCptTVACollecte == null || this.rowDefaultCptTVACollecte.isUndefined()) {
67 ilm 143
            try {
80 ilm 144
                this.rowDefaultCptTVACollecte = ComptePCESQLElement.getRowComptePceDefault("TVACollectee");
67 ilm 145
            } catch (Exception e) {
146
                e.printStackTrace();
147
            }
148
        }
149
 
156 ilm 150
        this.rowDefaultCptTVADeductible = cacheForTableCompte.getRowFromId(rowPrefsCompte.getForeignID("ID_COMPTE_PCE_TVA_ACHAT"));
80 ilm 151
        if (this.rowDefaultCptTVADeductible == null || this.rowDefaultCptTVADeductible.isUndefined()) {
152
            try {
153
                this.rowDefaultCptTVADeductible = ComptePCESQLElement.getRowComptePceDefault("TVADeductible");
154
            } catch (Exception e) {
155
                e.printStackTrace();
156
            }
157
        }
158
 
159
        if (defaultCompte == null || defaultCompte.isUndefined()) {
156 ilm 160
            if (rowCatComptable != null && !rowCatComptable.isUndefined() && !rowCatComptable.isForeignEmpty("ID_COMPTE_PCE_ACHAT")) {
161
                this.rowDefaultCptProduit = cacheForTableCompte.getRowFromId(rowCatComptable.getForeignID("ID_COMPTE_PCE_ACHAT"));
162
            } else {
163
                this.rowDefaultCptAchat = cacheForTableCompte.getRowFromId(rowPrefsCompte.getForeignID("ID_COMPTE_PCE_ACHAT"));
164
                if (this.rowDefaultCptAchat == null || this.rowDefaultCptAchat.isUndefined()) {
165
                    try {
166
                        this.rowDefaultCptAchat = ComptePCESQLElement.getRowComptePceDefault("Achats");
167
                    } catch (Exception e) {
168
                        e.printStackTrace();
169
                    }
80 ilm 170
                }
171
            }
172
        } else {
173
            this.rowDefaultCptAchat = defaultCompte;
174
        }
175
 
67 ilm 176
    }
177
 
93 ilm 178
    public void setRowDefaultCptProduit(SQLRowAccessor rowDefaultCptProduit) {
179
        this.rowDefaultCptProduit = rowDefaultCptProduit;
180
    }
181
 
182
    public void retoreRowDefaultCptProduit() {
174 ilm 183
        this.rowDefaultCptProduit = this.rowDefaultCptProduitStandard;
93 ilm 184
    }
185
 
67 ilm 186
    /**
187
     * Définition d'une remise HT à appliquer
188
     *
189
     * @param remiseHT montant de la remise en cents
190
     * @param totalHTAvantRemise montant de la facture avant remise
191
     */
192
    public void setRemise(long remiseHT, BigDecimal totalHTAvantRemise) {
193
        this.remiseHT = remiseHT;
194
        this.remiseRestante = remiseHT;
195
        this.totalHTAvantRemise = totalHTAvantRemise;
196
    }
197
 
174 ilm 198
    public void addTVAAdjust(BigDecimal tvaFix) {
199
 
200
        final SQLBackgroundTableCacheItem cacheForTableCompte = SQLBackgroundTableCache.getInstance().getCacheForTable(this.compteTable);
201
 
202
        SQLRowAccessor tva = TaxeCache.getCache().getFirstTaxe();
203
 
204
        SQLRowAccessor rowCptTva;
205
        if (this.intraComm) {
206
 
207
            // Intra comm TTC=HT et solde de TVA
208
            rowCptTva = cacheForTableCompte.getRowFromId(tva.getForeignID("ID_COMPTE_PCE_DED_INTRA"));
209
            if (rowCptTva == null || rowCptTva.isUndefined()) {
210
                rowCptTva = this.rowDefaultCptTVADeductible;
211
            }
212
 
213
            SQLRowAccessor rowCptTvaIntra = cacheForTableCompte.getRowFromId(tva.getForeignID("ID_COMPTE_PCE_COLLECTE_INTRA"));
214
            if (rowCptTvaIntra == null || rowCptTvaIntra.isUndefined()) {
215
                rowCptTvaIntra = this.rowDefaultCptTVADeductible;
216
            }
217
 
218
            if (this.mapHtTVAIntra.get(rowCptTvaIntra) == null) {
219
                this.mapHtTVAIntra.put(rowCptTvaIntra, tvaFix);
220
            } else {
221
                BigDecimal l = this.mapHtTVAIntra.get(rowCptTvaIntra);
222
                this.mapHtTVAIntra.put(rowCptTvaIntra, l.add(tvaFix));
223
            }
224
 
225
        } else if (this.achat) {
226
            rowCptTva = cacheForTableCompte.getRowFromId(tva.getForeignID("ID_COMPTE_PCE_DED"));
227
            if (rowCptTva == null || rowCptTva.isUndefined()) {
228
                rowCptTva = this.rowDefaultCptTVADeductible;
229
            }
230
        } else {
231
            rowCptTva = cacheForTableCompte.getRowFromId(tva.getForeignID("ID_COMPTE_PCE_COLLECTE"));
232
            if (rowCptTva == null || rowCptTva.isUndefined()) {
233
                rowCptTva = this.rowDefaultCptTVACollecte;
234
            }
235
        }
236
        if (this.mapHtTVA.get(rowCptTva) == null) {
237
            this.mapHtTVA.put(rowCptTva, tvaFix);
238
        } else {
239
            BigDecimal l = this.mapHtTVA.get(rowCptTva);
240
            this.mapHtTVA.put(rowCptTva, l.add(tvaFix));
241
        }
242
 
243
        this.totalTTC = this.totalTTC.add(tvaFix);
244
 
245
    }
246
 
67 ilm 247
    /**
248
     * Gestion de la vente de service
249
     *
250
     * @param b
251
     */
252
    public void setServiceActive(boolean b) {
253
        this.bServiceActive = b;
254
    }
255
 
256
    /**
257
     * Remise à zéro des valeurs de calcul
258
     */
259
    public void initValues() {
260
        this.remiseHT = 0;
261
        this.remiseRestante = 0;
262
        this.totalHTAvantRemise = BigDecimal.ZERO;
263
 
264
        this.selectedRows = null;
265
 
142 ilm 266
        this.totalHTSansFActurable = BigDecimal.ZERO;
67 ilm 267
        this.totalTTC = BigDecimal.ZERO;
268
        this.totalTTCSel = BigDecimal.ZERO;
269
 
142 ilm 270
        this.totalEco = BigDecimal.ZERO;
271
        this.totalEcoSel = BigDecimal.ZERO;
272
 
67 ilm 273
        this.totalHA = BigDecimal.ZERO;
274
        this.totalHASel = BigDecimal.ZERO;
275
 
276
        this.totalService = BigDecimal.ZERO;
277
        this.totalServiceSel = BigDecimal.ZERO;
278
 
279
        this.totalDeviseSel = BigDecimal.ZERO;
280
        this.totalDevise = BigDecimal.ZERO;
281
 
282
        this.totalPoids = 0;
283
 
284
        // Total des HT par comptes
285
        this.mapHt.clear();
286
        this.mapHtSel.clear();
287
 
288
        // Total des TVA par comptes
289
        this.mapHtTVA.clear();
142 ilm 290
        this.mapHtTaxeCompl.clear();
291
        this.mapHtTVAIntra.clear();
292
        this.mapHtTVARowTaux.clear();
67 ilm 293
        this.mapHtTVASel.clear();
294
 
295
    }
296
 
297
    public void setSelectedRows(int[] selectedRows) {
298
        this.selectedRows = selectedRows;
299
    }
300
 
301
    public void addEchantillon(BigDecimal ht, SQLRowAccessor tva) {
142 ilm 302
        addHT(ht, ht, tva, this.rowDefaultCptProduit, false);
67 ilm 303
    }
304
 
149 ilm 305
    // Cache de TVA
306
    private static Map<Integer, SQLRowAccessor> mapTVA;
307
    private static long lastTVAfetchedTime = 0;
308
 
67 ilm 309
    final SQLTable tvaTable = Configuration.getInstance().getRoot().findTable("TAXE");
310
    final SQLTable compteTable = Configuration.getInstance().getRoot().findTable("COMPTE_PCE");
311
 
312
    /**
313
     * Mise en cache des comptes de TVA
314
     */
315
    private void fetchTVA() {
316
        mapTVA = new HashMap<Integer, SQLRowAccessor>();
174 ilm 317
        Set<SQLRowAccessor> taxes = TaxeCache.getCache().getAllTaxe();
318
        for (SQLRowAccessor sqlRowAccessor : taxes) {
319
            mapTVA.put(sqlRowAccessor.getID(), sqlRowAccessor);
142 ilm 320
        }
174 ilm 321
        // SQLRowValues rowVals = new SQLRowValues(this.tvaTable);
322
        // SQLRowValues rowValsC1 = new SQLRowValues(this.compteTable);
323
        // rowValsC1.put("NUMERO", null);
324
        // rowValsC1.put("ID", null);
325
        //
326
        // SQLRowValues rowValsC2 = new SQLRowValues(this.compteTable);
327
        // rowValsC2.put("NUMERO", null);
328
        // rowValsC2.put("ID", null);
329
        //
330
        // SQLRowValues rowValsC3 = new SQLRowValues(this.compteTable);
331
        // rowValsC3.put("NUMERO", null);
332
        // rowValsC3.put("ID", null);
333
        // SQLRowValues rowValsC4 = new SQLRowValues(this.compteTable);
334
        // rowValsC4.put("NUMERO", null);
335
        // rowValsC4.put("ID", null);
336
        //
337
        // rowVals.put(this.tvaTable.getKey().getName(), null);
338
        // rowVals.put("ID_COMPTE_PCE_COLLECTE", rowValsC1);
339
        // rowVals.put("ID_COMPTE_PCE_DED", rowValsC2);
340
        // rowVals.put("ID_COMPTE_PCE_VENTE", rowValsC3);
341
        // rowVals.put("ID_COMPTE_PCE_VENTE_SERVICE", rowValsC4);
342
        //
343
        // if (this.tvaTable.contains("ID_COMPTE_PCE_COLLECTE_INTRA")) {
344
        // SQLRowValues rowValsC1Intra = new SQLRowValues(this.compteTable);
345
        // rowValsC1Intra.put("NUMERO", null);
346
        // rowValsC1Intra.put("ID", null);
347
        // rowVals.put("ID_COMPTE_PCE_COLLECTE_INTRA", rowValsC1Intra);
348
        // SQLRowValues rowValsC2Intra = new SQLRowValues(this.compteTable);
349
        // rowValsC2Intra.put("NUMERO", null);
350
        // rowValsC2Intra.put("ID", null);
351
        // rowVals.put("ID_COMPTE_PCE_DED_INTRA", rowValsC2Intra);
352
        // }
353
        // SQLRowValuesListFetcher fetch = SQLRowValuesListFetcher.create(rowVals);
354
        // List<SQLRowValues> rowValsList = fetch.fetch();
355
        //
356
        // for (SQLRowValues sqlRowValues : rowValsList) {
357
        // mapTVA.put(sqlRowValues.getID(), sqlRowValues);
358
        // }
149 ilm 359
        lastTVAfetchedTime = System.currentTimeMillis();
67 ilm 360
    }
361
 
142 ilm 362
    private void addHT(BigDecimal ht, BigDecimal htSansFacturable, SQLRowAccessor tva, SQLRowAccessor cptArticle, boolean selection) {
67 ilm 363
 
364
        BigDecimal ttc;
365
        BigDecimal totalTVA;
156 ilm 366
        final SQLBackgroundTableCacheItem cacheForTableCompte = SQLBackgroundTableCache.getInstance().getCacheForTable(cptArticle.getTable());
67 ilm 367
 
368
        if (tva == null || tva.isUndefined()) {
369
            ttc = ht;
370
            totalTVA = BigDecimal.ZERO;
371
        } else {
372
            BigDecimal tauxTVA = BigDecimal.valueOf(TaxeCache.getCache().getTauxFromId(tva.getID())).movePointLeft(2);
90 ilm 373
            ttc = tauxTVA.add(BigDecimal.ONE).multiply(ht, DecimalUtils.HIGH_PRECISION);
67 ilm 374
            totalTVA = ttc.subtract(ht);
375
        }
376
 
377
        if (tva != null && !tva.isUndefined()) {
80 ilm 378
            SQLRowAccessor rowCptTva;
142 ilm 379
            if (this.intraComm) {
380
 
381
                // Intra comm TTC=HT et solde de TVA
156 ilm 382
                rowCptTva = cacheForTableCompte.getRowFromId(tva.getForeignID("ID_COMPTE_PCE_DED_INTRA"));
142 ilm 383
                if (rowCptTva == null || rowCptTva.isUndefined()) {
384
                    rowCptTva = this.rowDefaultCptTVADeductible;
385
                }
386
 
156 ilm 387
                SQLRowAccessor rowCptTvaIntra = cacheForTableCompte.getRowFromId(tva.getForeignID("ID_COMPTE_PCE_COLLECTE_INTRA"));
142 ilm 388
                if (rowCptTvaIntra == null || rowCptTvaIntra.isUndefined()) {
389
                    rowCptTvaIntra = this.rowDefaultCptTVADeductible;
390
                }
156 ilm 391
 
174 ilm 392
                if (this.mapHtTVAIntra.get(rowCptTvaIntra) == null) {
393
                    this.mapHtTVAIntra.put(rowCptTvaIntra, totalTVA);
156 ilm 394
                } else {
174 ilm 395
                    BigDecimal l = this.mapHtTVAIntra.get(rowCptTvaIntra);
396
                    this.mapHtTVAIntra.put(rowCptTvaIntra, l.add(totalTVA));
142 ilm 397
                }
398
 
156 ilm 399
                ttc = ht;
142 ilm 400
            } else if (this.achat) {
156 ilm 401
                rowCptTva = cacheForTableCompte.getRowFromId(tva.getForeignID("ID_COMPTE_PCE_DED"));
80 ilm 402
                if (rowCptTva == null || rowCptTva.isUndefined()) {
403
                    rowCptTva = this.rowDefaultCptTVADeductible;
404
                }
405
            } else {
156 ilm 406
                rowCptTva = cacheForTableCompte.getRowFromId(tva.getForeignID("ID_COMPTE_PCE_COLLECTE"));
80 ilm 407
                if (rowCptTva == null || rowCptTva.isUndefined()) {
408
                    rowCptTva = this.rowDefaultCptTVACollecte;
409
                }
67 ilm 410
            }
174 ilm 411
            if (this.mapHtTVA.get(rowCptTva) == null) {
412
                this.mapHtTVA.put(rowCptTva, totalTVA);
67 ilm 413
            } else {
174 ilm 414
                BigDecimal l = this.mapHtTVA.get(rowCptTva);
415
                this.mapHtTVA.put(rowCptTva, l.add(totalTVA));
67 ilm 416
            }
142 ilm 417
            if (ht.signum() != 0) {
174 ilm 418
                if (this.mapHtTVARowTaux.get(tva) == null) {
419
                    this.mapHtTVARowTaux.put(tva, Tuple2.create(ht, totalTVA));
142 ilm 420
                } else {
174 ilm 421
                    Tuple2<BigDecimal, BigDecimal> l = this.mapHtTVARowTaux.get(tva);
422
                    this.mapHtTVARowTaux.put(tva, Tuple2.create(ht.add(l.get0()), l.get1().add(totalTVA)));
142 ilm 423
                }
424
            }
67 ilm 425
            if (selection) {
174 ilm 426
                if (this.mapHtTVASel.get(rowCptTva) == null) {
427
                    this.mapHtTVASel.put(rowCptTva, totalTVA);
67 ilm 428
                } else {
174 ilm 429
                    BigDecimal l = this.mapHtTVASel.get(rowCptTva);
430
                    this.mapHtTVASel.put(rowCptTva, l.add(totalTVA));
67 ilm 431
                }
432
            }
433
        }
434
 
174 ilm 435
        if (this.mapHt.get(cptArticle) == null) {
436
            this.mapHt.put(cptArticle, ht);
67 ilm 437
        } else {
174 ilm 438
            BigDecimal l = this.mapHt.get(cptArticle);
439
            this.mapHt.put(cptArticle, l.add(ht));
67 ilm 440
        }
441
 
442
        this.totalTTC = this.totalTTC.add(ttc);
142 ilm 443
        this.totalHTSansFActurable = this.totalHTSansFActurable.add(htSansFacturable);
67 ilm 444
        if (selection) {
445
 
174 ilm 446
            if (this.mapHtSel.get(cptArticle) == null) {
447
                this.mapHtSel.put(cptArticle, ht);
67 ilm 448
            } else {
174 ilm 449
                BigDecimal l = this.mapHtSel.get(cptArticle);
450
                this.mapHtSel.put(cptArticle, l.add(ht));
67 ilm 451
            }
452
            this.totalTTCSel = this.totalTTCSel.add(ttc);
453
        }
454
    }
455
 
456
    private static boolean containsInt(int[] tab, int i) {
457
        if (tab == null) {
458
            return false;
459
        }
460
 
461
        for (int j = 0; j < tab.length; j++) {
462
            if (tab[j] == i) {
463
                return true;
464
            }
465
        }
466
        return false;
467
    }
468
 
469
    public void addLine(SQLRowAccessor rowAccessorLine, SQLRowAccessor article, int lineNumber, boolean last) {
470
 
142 ilm 471
        if (rowAccessorLine.getFields().contains("NIVEAU") && rowAccessorLine.getInt("NIVEAU") != 1) {
472
            return;
473
        }
474
 
67 ilm 475
        // Total HT de la ligne
174 ilm 476
        BigDecimal totalLineHT = rowAccessorLine.getObject(this.fieldHT) == null ? BigDecimal.ZERO : (BigDecimal) rowAccessorLine.getObject(this.fieldHT);
142 ilm 477
        BigDecimal totalLineEco = rowAccessorLine.getObject("T_ECO_CONTRIBUTION") == null ? BigDecimal.ZERO : (BigDecimal) rowAccessorLine.getObject("T_ECO_CONTRIBUTION");
67 ilm 478
 
142 ilm 479
        BigDecimal totalLineHTSansFacturable = totalLineHT;
174 ilm 480
        if (!this.achat) {
142 ilm 481
            totalLineHTSansFacturable = rowAccessorLine.getObject("PV_HT") == null ? BigDecimal.ZERO : (BigDecimal) rowAccessorLine.getObject("PV_HT");
482
            BigDecimal qteUV = rowAccessorLine.getObject("QTE_UNITAIRE") == null ? BigDecimal.ZERO : (BigDecimal) rowAccessorLine.getObject("QTE_UNITAIRE");
483
            int qte = rowAccessorLine.getInt("QTE");
484
            totalLineHTSansFacturable = totalLineHTSansFacturable.multiply(qteUV).multiply(new BigDecimal(qte));
485
        }
67 ilm 486
        // Prix Unitaire de la ligne
487
        // TODO voir pour passer le prix total et non le prix unitaire
174 ilm 488
        BigDecimal totalHALigne = rowAccessorLine.getObject(this.fieldHA) == null ? BigDecimal.ZERO : (BigDecimal) rowAccessorLine.getObject(this.fieldHA);
67 ilm 489
 
490
        Boolean service = rowAccessorLine.getBoolean(FIELD_SERVICE);
491
 
174 ilm 492
        BigDecimal totalLineDevise = (this.fieldDevise == null || rowAccessorLine.getObject(this.fieldDevise) == null) ? BigDecimal.ZERO : (BigDecimal) rowAccessorLine.getObject(this.fieldDevise);
67 ilm 493
 
494
        Number nPoids = (Number) rowAccessorLine.getObject(FIELD_POIDS);
495
 
496
        // Si il y a une remise à appliquer
83 ilm 497
        if (this.remiseHT != 0 && this.remiseRestante > 0 && this.totalHTAvantRemise != null && this.totalHTAvantRemise.signum() != 0) {
67 ilm 498
 
499
            // Si c'est la derniere ligne, on applique le restant de la remise
500
            if (last) {
501
                totalLineHT = totalLineHT.subtract(new BigDecimal(this.remiseRestante).movePointLeft(2));
142 ilm 502
                totalLineHTSansFacturable = totalLineHTSansFacturable.subtract(new BigDecimal(this.remiseRestante).movePointLeft(2));
67 ilm 503
                this.remiseRestante = 0;
504
            } else {
90 ilm 505
                BigDecimal percent = totalLineHT.divide(this.totalHTAvantRemise, DecimalUtils.HIGH_PRECISION);
67 ilm 506
 
90 ilm 507
                BigDecimal remiseApply = percent.multiply(new BigDecimal(this.remiseHT), DecimalUtils.HIGH_PRECISION).setScale(0, RoundingMode.HALF_UP);
67 ilm 508
                totalLineHT = totalLineHT.subtract(remiseApply.movePointLeft(2));
142 ilm 509
                totalLineHTSansFacturable = totalLineHTSansFacturable.subtract(remiseApply.movePointLeft(2));
67 ilm 510
                this.remiseRestante -= remiseApply.longValue();
511
            }
512
        }
513
 
149 ilm 514
        // TODO : generaliser le cache
515
        if (mapTVA == null || lastTVAfetchedTime + 30 * 1000 < System.currentTimeMillis()) {
94 ilm 516
            fetchTVA();
517
        }
518
        Integer idTVA = null;
156 ilm 519
        if (rowAccessorLine.getObject("ID_TAXE") != null && !rowAccessorLine.isForeignEmpty("ID_TAXE")) {
520
            idTVA = rowAccessorLine.getForeignID("ID_TAXE");
521
        } else {
522
            final SQLRowAccessor foreignTVA = rowAccessorLine.getForeign("ID_TAXE");
523
            if (foreignTVA != null) {
524
                idTVA = foreignTVA.getID();
525
            }
94 ilm 526
        }
527
        SQLRowAccessor tva = mapTVA.get(idTVA);
528
 
174 ilm 529
        SQLRowAccessor cpt = (this.achat ? this.rowDefaultCptAchat : this.rowDefaultCptProduit);
156 ilm 530
        final SQLBackgroundTableCacheItem cacheForTableCompte = SQLBackgroundTableCache.getInstance().getCacheForTable(cpt.getTable());
182 ilm 531
        boolean compteCategorieTaxeSpecifique = false;
174 ilm 532
        if (!this.achat) {
94 ilm 533
            // Total Service
174 ilm 534
            if (this.bServiceActive != null && this.bServiceActive && service != null && service.booleanValue()) {
535
                this.totalService = this.totalService.add(totalLineHT);
94 ilm 536
                cpt = this.rowDefaultCptService;
537
                if (tva != null && !tva.isForeignEmpty("ID_COMPTE_PCE_VENTE_SERVICE")) {
156 ilm 538
                    cpt = cacheForTableCompte.getRowFromId(tva.getForeignID("ID_COMPTE_PCE_VENTE_SERVICE"));
94 ilm 539
                }
540
            } else {
541
                // Compte defini par défaut dans la TVA
542
                if (tva != null && !tva.isForeignEmpty("ID_COMPTE_PCE_VENTE")) {
156 ilm 543
                    cpt = cacheForTableCompte.getRowFromId(tva.getForeignID("ID_COMPTE_PCE_VENTE"));
94 ilm 544
                }
545
 
546
            }
182 ilm 547
 
548
            // Récupération du compte par défaut dans les liaisons taxe catégorie comptable (ex
549
            // utilisé pour la caisse Altena)
550
            if (tva != null && !tva.isUndefined() && this.rowCatComptable != null && !this.rowCatComptable.isUndefined()) {
551
                final SQLTable tableTaxeCat = this.rowCatComptable.getTable().getTable("TAXE_CATEGORIE_COMPTABLE");
552
                SQLRowValues rowVals = new SQLRowValues(tableTaxeCat);
553
                rowVals.putNulls(tableTaxeCat.getFieldsName());
554
                final List<SQLRowValues> fetchTaxeCat = SQLRowValuesListFetcher.create(rowVals)
555
                        .fetch(new Where(tableTaxeCat.getField("ID_CATEGORIE_COMPTABLE"), "=", this.rowCatComptable.getID()).and(new Where(tableTaxeCat.getField("ID_TAXE"), "=", tva.getID())));
556
                if (!fetchTaxeCat.isEmpty()) {
557
 
558
                    final Number foreignID = fetchTaxeCat.get(0).getNonEmptyForeignIDNumber("ID_COMPTE_PCE_VENTE");
559
                    if (foreignID != null) {
560
                        cpt = cacheForTableCompte.getRowFromId(foreignID.intValue());
561
                        compteCategorieTaxeSpecifique = true;
562
                    }
563
                }
564
            }
94 ilm 565
        }
174 ilm 566
 
567
        // Compte PCE défini directement sur la ligne
568
        boolean compteSpec = false;
569
        if (rowAccessorLine.getTable().contains("ID_COMPTE_PCE") && rowAccessorLine.getObject("ID_COMPTE_PCE") != null && !rowAccessorLine.isForeignEmpty("ID_COMPTE_PCE")) {
570
            compteSpec = true;
571
            cpt = cacheForTableCompte.getRowFromId(rowAccessorLine.getForeignID("ID_COMPTE_PCE"));
572
        }
67 ilm 573
        if (article != null && !article.isUndefined()) {
174 ilm 574
            if (!compteSpec) {
182 ilm 575
                SQLRowAccessor cptCatComptable = compteCategorieTaxeSpecifique ? cpt : null;
174 ilm 576
                // TODO Optimiser les requetes
182 ilm 577
                if (!compteCategorieTaxeSpecifique && this.rowCatComptable != null && !this.rowCatComptable.isUndefined()) {
174 ilm 578
                    String suffix = (this.achat ? "_ACHAT" : "_VENTE");
177 ilm 579
                    if (!this.rowCatComptable.isForeignEmpty("ID_COMPTE_PCE" + suffix)) {
580
                        cptCatComptable = cacheForTableCompte.getRowFromId(this.rowCatComptable.getForeignID("ID_COMPTE_PCE" + suffix));
581
                    }
174 ilm 582
                    Collection<? extends SQLRowAccessor> rows = article.getReferentRows(this.compteTable.getTable("ARTICLE_CATEGORIE_COMPTABLE"));
583
                    for (SQLRowAccessor sqlRowAccessor : rows) {
584
                        if (sqlRowAccessor.getForeignID("ID_CATEGORIE_COMPTABLE") == this.rowCatComptable.getID()) {
177 ilm 585
                            if (!sqlRowAccessor.isForeignEmpty("ID_COMPTE_PCE" + suffix)) {
586
                                cptCatComptable = cacheForTableCompte.getRowFromId(sqlRowAccessor.getForeignID("ID_COMPTE_PCE" + suffix));
587
                            }
174 ilm 588
                        }
156 ilm 589
                    }
590
                }
174 ilm 591
                if (cptCatComptable == null) {
592
                    String suffix = (this.achat ? "_ACHAT" : "");
593
                    SQLRowAccessor compteArticle = cacheForTableCompte.getRowFromId(article.getForeignID("ID_COMPTE_PCE" + suffix));
594
                    if (compteArticle != null && !compteArticle.isUndefined()) {
595
                        cpt = compteArticle;
596
                    } else {
180 ilm 597
                        final SQLBackgroundTableCacheItem cacheForTableFamille = SQLBackgroundTableCache.getInstance().getCacheForTable(article.getTable().getForeignTable("ID_FAMILLE_ARTICLE"));
598
 
599
                        SQLRowAccessor familleArticle = cacheForTableFamille.getRowFromId(article.getForeignID("ID_FAMILLE_ARTICLE"));
174 ilm 600
                        Set<SQLRowAccessor> unique = new HashSet<SQLRowAccessor>();
601
                        while (familleArticle != null && !familleArticle.isUndefined() && !unique.contains(familleArticle)) {
156 ilm 602
 
174 ilm 603
                            unique.add(familleArticle);
604
                            if (familleArticle.getObject("ID_COMPTE_PCE" + suffix) != null && !familleArticle.isForeignEmpty("ID_COMPTE_PCE" + suffix)) {
605
                                SQLRowAccessor compteFamilleArticle = cacheForTableCompte.getRowFromId(familleArticle.getForeignID("ID_COMPTE_PCE" + suffix));
606
                                if (compteFamilleArticle != null && !compteFamilleArticle.isUndefined()) {
607
                                    cpt = compteFamilleArticle;
608
                                    break;
609
                                }
156 ilm 610
                            }
180 ilm 611
                            familleArticle = cacheForTableFamille.getRowFromId(familleArticle.getForeignID("ID_FAMILLE_ARTICLE_PERE"));
156 ilm 612
                        }
67 ilm 613
                    }
174 ilm 614
                } else {
615
                    cpt = cptCatComptable;
67 ilm 616
                }
617
            }
174 ilm 618
            if (!this.achat) {
144 ilm 619
                SQLRowAccessor taxeCompl = (article.getFields().contains("ID_TAXE_COMPLEMENTAIRE") && article.getObject("ID_TAXE_COMPLEMENTAIRE") != null
620
                        && !article.isForeignEmpty("ID_TAXE_COMPLEMENTAIRE") ? article.getForeign("ID_TAXE_COMPLEMENTAIRE") : null);
142 ilm 621
                if (taxeCompl != null && !taxeCompl.isUndefined()) {
144 ilm 622
 
623
                    Map<SQLRowAccessor, BigDecimal> mapCptTaxeValue = this.mapHtTaxeCompl.get(cpt);
624
                    if (mapCptTaxeValue == null) {
625
                        mapCptTaxeValue = new HashMap<SQLRowAccessor, BigDecimal>();
626
                        this.mapHtTaxeCompl.put(cpt, mapCptTaxeValue);
627
                    }
628
                    BigDecimal b = mapCptTaxeValue.get(taxeCompl);
142 ilm 629
                    if (b == null) {
630
                        b = BigDecimal.ZERO;
631
                    }
632
                    b = b.add(totalLineHT);
144 ilm 633
                    mapCptTaxeValue.put(taxeCompl, b);
142 ilm 634
                }
635
            }
67 ilm 636
        }
637
 
174 ilm 638
        if (!compteSpec) {
94 ilm 639
            // Total Service
174 ilm 640
            if (this.bServiceActive != null && this.bServiceActive) {
94 ilm 641
                if (service != null && service.booleanValue()) {
174 ilm 642
                    this.totalService = this.totalService.add(totalLineHT);
94 ilm 643
                    cpt = this.rowDefaultCptService;
644
                }
67 ilm 645
            }
646
        }
647
 
648
        // Total HA
649
        this.totalHA = this.totalHA.add(totalHALigne);
650
 
651
        // Total Devise
652
        if (totalLineDevise != null) {
174 ilm 653
            this.totalDevise = this.totalDevise.add(totalLineDevise);
67 ilm 654
        }
655
 
656
        // Total Poids
657
 
174 ilm 658
        this.totalPoids += nPoids == null ? 0 : nPoids.doubleValue();
67 ilm 659
 
142 ilm 660
        // Eco-contribution
661
        this.totalEco = this.totalEco.add(totalLineEco);
662
 
67 ilm 663
        // Calcul total sélectionné
174 ilm 664
        boolean selection = containsInt(this.selectedRows, lineNumber);
67 ilm 665
        if (selection) {
666
 
174 ilm 667
            this.totalHASel = this.totalHASel.add(totalHALigne);
67 ilm 668
 
174 ilm 669
            if (this.bServiceActive != null && this.bServiceActive) {
73 ilm 670
                if (service != null && service.booleanValue()) {
174 ilm 671
                    this.totalServiceSel = this.totalServiceSel.add(totalLineHT);
67 ilm 672
                }
673
            }
142 ilm 674
            this.totalEcoSel = this.totalEcoSel.add(totalLineEco);
67 ilm 675
 
676
            if (totalLineDevise != null) {
174 ilm 677
                this.totalDeviseSel = this.totalDeviseSel.add(totalLineDevise);
67 ilm 678
            }
679
        }
680
 
142 ilm 681
        addHT(totalLineHT, totalLineHTSansFacturable, tva, cpt, selection);
67 ilm 682
    }
683
 
684
    /**
685
     * Vérifie si ht + tva = ttc
686
     */
687
    public void checkResult() {
688
        BigDecimal ht = getTotalHT();
689
        BigDecimal tva = getTotalTVA();
690
        BigDecimal totalTTC2 = getTotalTTC();
691
        BigDecimal reste = totalTTC2.subtract(ht.add(tva));
174 ilm 692
        if (!this.intraComm && reste.compareTo(BigDecimal.ZERO) != 0) {
73 ilm 693
            System.err.print("Ecarts: " + reste + "(HT:" + ht);
694
            System.err.print(" TVA:" + tva);
695
            System.err.println(" TTC:" + totalTTC2);
149 ilm 696
 
67 ilm 697
            // TODO Check if row already exist in MAP ??
149 ilm 698
            if (!this.imputEcart) {
699
                for (SQLRowAccessor rHT : this.mapHt.keySet()) {
700
                    BigDecimal input = this.mapHt.get(rHT);
701
                    if (input != null && input.signum() != 0) {
702
                        this.mapHt.put(rHT, input.add(reste));
703
                        break;
704
                    }
705
                }
706
            } else {
707
                SQLRow row = ComptePCESQLElement.getRow("758", "Ecarts arrondis");
708
                this.mapHt.put(row, reste);
709
            }
67 ilm 710
        }
711
    }
712
 
713
    public BigDecimal getTotalDevise() {
174 ilm 714
        return this.totalDevise;
67 ilm 715
    }
716
 
717
    public BigDecimal getTotalDeviseSel() {
174 ilm 718
        return this.totalDeviseSel;
67 ilm 719
    }
720
 
721
    public BigDecimal getTotalHA() {
174 ilm 722
        return this.totalHA;
67 ilm 723
    }
724
 
725
    public BigDecimal getTotalHASel() {
174 ilm 726
        return this.totalHASel;
67 ilm 727
    }
728
 
729
    public double getTotalPoids() {
174 ilm 730
        return this.totalPoids;
67 ilm 731
    }
732
 
733
    public BigDecimal getTotalService() {
174 ilm 734
        return this.totalService;
67 ilm 735
    }
736
 
737
    public BigDecimal getTotalServiceSel() {
174 ilm 738
        return this.totalServiceSel;
67 ilm 739
    }
740
 
144 ilm 741
    public Map<SQLRowAccessor, Map<SQLRowAccessor, BigDecimal>> getMapHtTaxeCompl() {
174 ilm 742
        return this.mapHtTaxeCompl;
142 ilm 743
    }
744
 
67 ilm 745
    public BigDecimal getTotalHT() {
746
        BigDecimal ht = BigDecimal.ZERO;
747
        for (SQLRowAccessor row : this.mapHt.keySet()) {
748
            ht = ht.add(this.mapHt.get(row).setScale(2, RoundingMode.HALF_UP));
749
        }
750
 
751
        return ht;
752
    }
753
 
754
    public BigDecimal getTotalTVA() {
755
        BigDecimal tva = BigDecimal.ZERO;
756
        for (SQLRowAccessor row : this.mapHtTVA.keySet()) {
757
            tva = tva.add(this.mapHtTVA.get(row).setScale(2, RoundingMode.HALF_UP));
758
        }
759
        return tva;
760
    }
761
 
142 ilm 762
    public BigDecimal getTotalEco() {
763
        return this.totalEco.setScale(2, RoundingMode.HALF_UP);
764
    }
765
 
766
    public BigDecimal getTotalEcoSel() {
767
        return this.totalEcoSel.setScale(2, RoundingMode.HALF_UP);
768
    }
769
 
770
    public BigDecimal getTotalHTSansFActurable() {
174 ilm 771
        return this.totalHTSansFActurable;
142 ilm 772
    }
773
 
67 ilm 774
    public BigDecimal getTotalTTC() {
775
        return this.totalTTC.setScale(2, RoundingMode.HALF_UP);
776
    }
777
 
778
    public BigDecimal getTotalHTSel() {
779
        BigDecimal ht = BigDecimal.ZERO;
780
        for (SQLRowAccessor row : this.mapHtSel.keySet()) {
781
            ht = ht.add(this.mapHtSel.get(row).setScale(2, RoundingMode.HALF_UP));
782
        }
783
 
784
        return ht;
785
    }
786
 
787
    public BigDecimal getTotalTVASel() {
788
        BigDecimal tva = BigDecimal.ZERO;
789
        for (SQLRowAccessor row : this.mapHtTVASel.keySet()) {
790
            tva = tva.add(this.mapHtTVASel.get(row).setScale(2, RoundingMode.HALF_UP));
791
        }
792
        return tva;
793
    }
794
 
795
    public BigDecimal getTotalTTCSel() {
796
 
797
        return this.totalTTCSel.setScale(2, RoundingMode.HALF_UP);
798
    }
799
 
800
    public Map<SQLRowAccessor, BigDecimal> getMapHt() {
174 ilm 801
        return this.mapHt;
67 ilm 802
    }
803
 
142 ilm 804
    public Map<SQLRowAccessor, Tuple2<BigDecimal, BigDecimal>> getMapHtTVARowTaux() {
174 ilm 805
        return this.mapHtTVARowTaux;
142 ilm 806
    }
807
 
67 ilm 808
    public Map<SQLRowAccessor, BigDecimal> getMapHtTVA() {
174 ilm 809
        return this.mapHtTVA;
67 ilm 810
    }
142 ilm 811
 
812
    public Map<SQLRowAccessor, BigDecimal> getMapHtTVAIntra() {
174 ilm 813
        return this.mapHtTVAIntra;
142 ilm 814
    }
67 ilm 815
}