OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

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

Rev Author Line No. Line
18 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.generationEcritures;
15
 
67 ilm 16
import org.openconcerto.erp.core.common.ui.TotalCalculator;
18 ilm 17
import org.openconcerto.erp.core.finance.accounting.element.ComptePCESQLElement;
18
import org.openconcerto.erp.core.finance.accounting.element.JournalSQLElement;
67 ilm 19
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProvider;
20
import org.openconcerto.erp.generationEcritures.provider.AccountingRecordsProviderManager;
18 ilm 21
import org.openconcerto.erp.model.PrixTTC;
22
import org.openconcerto.sql.model.SQLRow;
67 ilm 23
import org.openconcerto.sql.model.SQLRowAccessor;
18 ilm 24
import org.openconcerto.sql.model.SQLRowValues;
25
import org.openconcerto.sql.model.SQLTable;
26
import org.openconcerto.utils.ExceptionHandler;
27
 
67 ilm 28
import java.math.BigDecimal;
29
import java.math.RoundingMode;
18 ilm 30
import java.util.Date;
31
import java.util.Map;
32
 
33
// FIXME probleme lors de certaines generation tout reste figer
34
 
35
/**
36
 * Génération des ecritures associées à une saisie de vente avec facture. Entaine la génération du
37
 * reglement de la vente
38
 */
39
public class GenerationMvtSaisieVenteFacture extends GenerationEcritures implements Runnable {
40
 
67 ilm 41
    public static final String ID = "accounting.records.invoice.sales";
18 ilm 42
    private static final String source = "SAISIE_VENTE_FACTURE";
43
    public static final Integer journal = Integer.valueOf(JournalSQLElement.VENTES);
44
    private int idSaisieVenteFacture;
83 ilm 45
    private boolean useComptePCEVente;
18 ilm 46
    private static final SQLTable saisieVFTable = base.getTable("SAISIE_VENTE_FACTURE");
47
    private static final SQLTable mvtTable = base.getTable("MOUVEMENT");
67 ilm 48
    private static final SQLTable ecrTable = base.getTable("ECRITURE");
18 ilm 49
    private static final SQLTable tablePrefCompte = base.getTable("PREFS_COMPTE");
50
    private static final SQLRow rowPrefsCompte = tablePrefCompte.getRow(2);
51
 
52
    /**
53
     * Generation de la comptabilité associée à la modification d'une saisie de vente facture
54
     *
55
     * @param idSaisieVenteFacture
56
     * @param idMvt id du mouvement qui est dejà associé à la facture
57
     */
83 ilm 58
    public GenerationMvtSaisieVenteFacture(int idSaisieVenteFacture, int idMvt, boolean useComptePCEVente) {
18 ilm 59
        System.err.println("********* init GeneRation");
60
        this.idMvt = idMvt;
61
        this.idSaisieVenteFacture = idSaisieVenteFacture;
83 ilm 62
        this.useComptePCEVente = useComptePCEVente;
18 ilm 63
        new Thread(GenerationMvtSaisieVenteFacture.this).start();
64
    }
65
 
83 ilm 66
    public GenerationMvtSaisieVenteFacture(int idSaisieVenteFacture, int idMvt) {
67
        this(idSaisieVenteFacture, idMvt, false);
68
    }
69
 
18 ilm 70
    /**
71
     * Generation de la comptabilité associée à la création d'une saisie de vente facture
72
     *
73
     * @param idSaisieVenteFacture
74
     */
75
    public GenerationMvtSaisieVenteFacture(int idSaisieVenteFacture) {
73 ilm 76
        this(idSaisieVenteFacture, 1);
18 ilm 77
    }
78
 
73 ilm 79
    private void genereMouvement() throws Exception {
18 ilm 80
 
81
        SQLRow saisieRow = GenerationMvtSaisieVenteFacture.saisieVFTable.getRow(this.idSaisieVenteFacture);
82
        SQLRow clientRow = saisieRow.getForeignRow("ID_CLIENT");
83
 
84
        // Calcul des montants
85
        PrixTTC prixTTC = new PrixTTC(((Long) saisieRow.getObject("T_TTC")).longValue());
65 ilm 86
        // Total des acomptes déjà versés sur la facture
87
        long montantAcompteTTC = 0;
18 ilm 88
 
65 ilm 89
        int idCompteClient = clientRow.getInt("ID_COMPTE_PCE");
90
 
91
        Boolean acompte = saisieRow.getBoolean("ACOMPTE");
92
        if (acompte != null && acompte) {
93
            this.nom = "Fact. acompte client" + saisieRow.getObject("NUMERO").toString();
94
        } else {
95
            this.nom = "Fact. vente " + saisieRow.getObject("NUMERO").toString();
96
        }
67 ilm 97
 
98
        // iniatilisation des valeurs de la map
99
        this.date = (Date) saisieRow.getObject("DATE");
100
        AccountingRecordsProvider provider = AccountingRecordsProviderManager.get(ID);
101
        provider.putLabel(saisieRow, this.mEcritures);
102
 
18 ilm 103
        this.mEcritures.put("DATE", this.date);
104
        this.mEcritures.put("ID_JOURNAL", GenerationMvtSaisieVenteFacture.journal);
105
        this.mEcritures.put("ID_MOUVEMENT", Integer.valueOf(1));
106
 
107
        // on calcule le nouveau numero de mouvement
108
        if (this.idMvt == 1) {
67 ilm 109
            SQLRowValues rowValsPiece = new SQLRowValues(pieceTable);
110
            provider.putPieceLabel(saisieRow, rowValsPiece);
111
            getNewMouvement(GenerationMvtSaisieVenteFacture.source, this.idSaisieVenteFacture, 1, rowValsPiece);
18 ilm 112
        } else {
113
            this.mEcritures.put("ID_MOUVEMENT", Integer.valueOf(this.idMvt));
65 ilm 114
            SQLRowValues rowValsPiece = mvtTable.getRow(idMvt).getForeign("ID_PIECE").asRowValues();
67 ilm 115
            provider.putPieceLabel(saisieRow, rowValsPiece);
73 ilm 116
            rowValsPiece.update();
18 ilm 117
        }
118
 
67 ilm 119
        SQLTable tableEchantillon = null;
120
        if (saisieVFTable.getDBRoot().contains("ECHANTILLON_ELEMENT")) {
121
            tableEchantillon = saisieVFTable.getTable("ECHANTILLON_ELEMENT");
122
        }
123
        BigDecimal portHT = BigDecimal.valueOf(saisieRow.getLong("PORT_HT")).movePointLeft(2);
124
        TotalCalculator calc = getValuesFromElement(saisieRow, saisieVFTable.getTable("SAISIE_VENTE_FACTURE_ELEMENT"), portHT, saisieRow.getForeign("ID_TAXE_PORT"), tableEchantillon);
125
 
65 ilm 126
        // On génére les ecritures si la facture n'est pas un acompte
67 ilm 127
        long ttcLongValue = calc.getTotalTTC().movePointRight(2).longValue();
65 ilm 128
        if (acompte == null || !acompte) {
18 ilm 129
 
67 ilm 130
            for (SQLRowAccessor row : calc.getMapHt().keySet()) {
131
                long b = calc.getMapHt().get(row).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
132
                if (b != 0) {
83 ilm 133
                    final Integer idComptePCE;
134
                    if (this.useComptePCEVente) {
135
                        // Utilise le compte de la facture
136
                        idComptePCE = saisieRow.getInt("ID_COMPTE_PCE_VENTE");
137
                    } else {
138
                        idComptePCE = Integer.valueOf(row.getID());
139
                    }
140
                    this.mEcritures.put("ID_COMPTE_PCE", idComptePCE);
65 ilm 141
                    this.mEcritures.put("DEBIT", Long.valueOf(0));
67 ilm 142
                    this.mEcritures.put("CREDIT", Long.valueOf(b));
83 ilm 143
                    SQLRow rowEcr = ajoutEcriture();
144
                    addAssocAnalytiqueFromProvider(rowEcr, saisieRow);
18 ilm 145
                }
146
            }
147
 
67 ilm 148
            Map<SQLRowAccessor, BigDecimal> tvaMap = calc.getMapHtTVA();
149
            for (SQLRowAccessor rowAc : tvaMap.keySet()) {
150
                long longValue = tvaMap.get(rowAc).setScale(2, RoundingMode.HALF_UP).movePointRight(2).longValue();
151
                if (longValue != 0) {
152
                    this.mEcritures.put("ID_COMPTE_PCE", rowAc.getID());
18 ilm 153
                    this.mEcritures.put("DEBIT", Long.valueOf(0));
67 ilm 154
                    this.mEcritures.put("CREDIT", longValue);
18 ilm 155
                    ajoutEcriture();
156
                }
67 ilm 157
            }
65 ilm 158
 
159
            // compte Clients
18 ilm 160
 
161
            if (idCompteClient <= 1) {
65 ilm 162
                idCompteClient = rowPrefsCompte.getInt("ID_COMPTE_PCE_CLIENT");
163
                if (idCompteClient <= 1) {
73 ilm 164
                    idCompteClient = ComptePCESQLElement.getIdComptePceDefault("Clients");
18 ilm 165
                }
166
            }
65 ilm 167
            this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCompteClient));
67 ilm 168
            if (ecrTable.contains("CODE_CLIENT")) {
169
                this.mEcritures.put("CODE_CLIENT", clientRow.getString("CODE"));
170
            }
171
            this.mEcritures.put("DEBIT", ttcLongValue);
65 ilm 172
            this.mEcritures.put("CREDIT", Long.valueOf(0));
173
            ajoutEcriture();
174
 
175
            // TODO Gestion des factures d'acomptes
176
            // Solde des acomptes
177
            // List<SQLRow> rowsAcompte =
178
            // saisieRow.getReferentRows(saisieVFTable.getField("ID_SAISIE_VENTE_FACTURE_ACOMPTE"));
179
            // if (rowsAcompte != null && rowsAcompte.size() > 0) {
180
            // // Compte acompte
181
            // int idCompteAcompteClient = ComptePCESQLElement.getId("4191",
182
            // "Clients - Avances et acomptes reçus sur commandes");
183
            // int idTVAAcompte = ComptePCESQLElement.getId("44587",
184
            // "Taxes sur le chiffre d'affaire à régulariser ou en attente");
185
            // for (SQLRow sqlRow : rowsAcompte) {
186
            // long acompteTTC = sqlRow.getLong("T_TTC");
187
            // long acompteHT = sqlRow.getLong("T_HT");
188
            // this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCompteAcompteClient));
189
            // this.mEcritures.put("DEBIT", acompteTTC);
190
            // this.mEcritures.put("CREDIT", Long.valueOf(0));
191
            // ajoutEcriture();
192
            // this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCompteClient));
193
            // this.mEcritures.put("DEBIT", Long.valueOf(0));
194
            // this.mEcritures.put("CREDIT", acompteTTC);
195
            // ajoutEcriture();
196
            //
197
            // montantAcompteTTC += acompteTTC;
198
            //
199
            // long tva = acompteTTC - acompteHT;
200
            // if (tva > 0) {
201
            //
202
            //
203
            // this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idTVAAcompte));
204
            // this.mEcritures.put("DEBIT", Long.valueOf(0));
205
            // this.mEcritures.put("CREDIT", Long.valueOf(tva));
206
            // ajoutEcriture();
207
            //
208
            // Map<Integer, Long> m = getMultiTVAFromRow(saisieRow,
209
            // saisieVFTable.getTable("SAISIE_VENTE_FACTURE_ELEMENT"), true);
210
            // long allTaxe = 0;
211
            // for (Integer i : m.keySet()) {
212
            // Long l = m.get(i);
213
            // if (l != null && l > 0) {
214
            // // FIXME
215
            // int idCpt = i;
216
            // if (idCpt <= 1) {
217
            // idCpt = idCompteTVA;
218
            // }
219
            // this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCpt));
220
            // this.mEcritures.put("DEBIT", Long.valueOf(0));
221
            // this.mEcritures.put("CREDIT", Long.valueOf(l));
222
            // ajoutEcriture();
223
            // allTaxe += l;
224
            // }
225
            // }
226
            // if (allTaxe < prixTVA.getLongValue()) {
227
            // this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(idCompteTVA));
228
            // this.mEcritures.put("DEBIT", Long.valueOf(0));
229
            // this.mEcritures.put("CREDIT", Long.valueOf(prixTVA.getLongValue() - allTaxe));
230
            // ajoutEcriture();
231
            // }
232
            //
233
            // this.mEcritures.put("ID_COMPTE_PCE", Integer.valueOf(compteDebitTvaAcompte));
234
            // this.mEcritures.put("DEBIT", Long.valueOf(tva));
235
            // this.mEcritures.put("CREDIT", Long.valueOf(0));
236
            // ajoutEcriture();
237
            // }
238
            // }
239
            // }
18 ilm 240
        }
73 ilm 241
 
242
        {
243
            SQLRowValues valSasieVF = new SQLRowValues(GenerationMvtSaisieVenteFacture.saisieVFTable);
244
            valSasieVF.put("DATE_REGLEMENT", null);
245
            valSasieVF.update(this.idSaisieVenteFacture);
246
        }
247
 
18 ilm 248
            // Génération du reglement
249
            SQLRow modeRegl = saisieRow.getForeignRow("ID_MODE_REGLEMENT");
250
            final SQLRow typeRegRow = modeRegl.getForeignRow("ID_TYPE_REGLEMENT");
65 ilm 251
            String label = this.nom + " (" + typeRegRow.getString("NOM") + ")";
18 ilm 252
            int idAvoir = saisieRow.getInt("ID_AVOIR_CLIENT");
253
            if (idAvoir > 1) {
254
                // SQLRow avoirRow = base.getTable("AVOIR_CLIENT").getRow(idAvoir);
255
                long l = ((Number) saisieRow.getObject("T_AVOIR_TTC")).longValue();
256
                prixTTC = new PrixTTC(((Long) saisieRow.getObject("T_TTC")).longValue() - l);
257
            }
65 ilm 258
            prixTTC = new PrixTTC(prixTTC.getLongValue() - montantAcompteTTC);
18 ilm 259
            if (prixTTC.getLongValue() > 0) {
260
                new GenerationReglementVenteNG(label, clientRow, prixTTC, this.date, modeRegl, saisieRow, mvtTable.getRow(idMvt));
261
            }
262
        // Mise à jour de mouvement associé à la facture
263
 
264
        SQLRowValues valSasieVF = new SQLRowValues(GenerationMvtSaisieVenteFacture.saisieVFTable);
265
        valSasieVF.put("ID_MOUVEMENT", Integer.valueOf(this.idMvt));
266
 
73 ilm 267
        if (valSasieVF.getInvalid() == null) {
268
            valSasieVF.update(this.idSaisieVenteFacture);
80 ilm 269
            displayMvtNumber();
73 ilm 270
        }
18 ilm 271
 
272
    }
273
 
274
    public void run() {
275
        try {
276
            genereMouvement();
73 ilm 277
        } catch (Exception e) {
18 ilm 278
            ExceptionHandler.handle("Erreur pendant la générations des écritures comptables", e);
73 ilm 279
 
18 ilm 280
        }
281
    }
282
}