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
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.core.common.ui;
15
 
16
import org.openconcerto.erp.config.ComptaPropsConfiguration;
17
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
18
import org.openconcerto.erp.core.sales.product.element.ReferenceArticleSQLElement;
19
import org.openconcerto.erp.core.sales.product.ui.ArticleRowValuesRenderer;
19 ilm 20
import org.openconcerto.erp.core.sales.product.ui.QteMultipleRowValuesRenderer;
61 ilm 21
import org.openconcerto.erp.core.sales.product.ui.QteUnitRowValuesRenderer;
18 ilm 22
import org.openconcerto.erp.preferences.DefaultNXProps;
61 ilm 23
import org.openconcerto.erp.preferences.GestionArticleGlobalPreferencePanel;
18 ilm 24
import org.openconcerto.sql.Configuration;
25
import org.openconcerto.sql.element.SQLElement;
19 ilm 26
import org.openconcerto.sql.model.SQLField;
27
import org.openconcerto.sql.model.SQLRow;
28
import org.openconcerto.sql.model.SQLRowAccessor;
18 ilm 29
import org.openconcerto.sql.model.SQLRowValues;
30
import org.openconcerto.sql.model.SQLTable;
80 ilm 31
import org.openconcerto.sql.model.UndefinedRowValuesCache;
18 ilm 32
import org.openconcerto.sql.model.Where;
61 ilm 33
import org.openconcerto.sql.preferences.SQLPreferences;
83 ilm 34
import org.openconcerto.sql.sqlobject.ITextArticleWithCompletionCellEditor;
61 ilm 35
import org.openconcerto.sql.sqlobject.ITextWithCompletion;
18 ilm 36
import org.openconcerto.sql.view.list.AutoCompletionManager;
37
import org.openconcerto.sql.view.list.CellDynamicModifier;
38
import org.openconcerto.sql.view.list.RowValuesTable;
39
import org.openconcerto.sql.view.list.RowValuesTableModel;
40
import org.openconcerto.sql.view.list.SQLTableElement;
65 ilm 41
import org.openconcerto.sql.view.list.ValidStateChecker;
18 ilm 42
 
80 ilm 43
import java.awt.Component;
19 ilm 44
import java.math.BigDecimal;
61 ilm 45
import java.math.MathContext;
67 ilm 46
import java.math.RoundingMode;
18 ilm 47
import java.util.ArrayList;
19 ilm 48
import java.util.Collection;
28 ilm 49
import java.util.HashMap;
18 ilm 50
import java.util.List;
28 ilm 51
import java.util.Map;
18 ilm 52
import java.util.Vector;
53
 
54
import javax.swing.JButton;
80 ilm 55
import javax.swing.JLabel;
19 ilm 56
import javax.swing.JOptionPane;
80 ilm 57
import javax.swing.JTable;
58
import javax.swing.SwingUtilities;
18 ilm 59
import javax.swing.ToolTipManager;
80 ilm 60
import javax.swing.table.DefaultTableCellRenderer;
18 ilm 61
import javax.swing.table.TableCellRenderer;
62
 
63
public abstract class AbstractVenteArticleItemTable extends AbstractArticleItemTable {
64
 
21 ilm 65
    public static final String ARTICLE_SHOW_DEVISE = "ArticleShowDevise";
28 ilm 66
    public static final String ARTICLE_SERVICE = "ArticleService";
83 ilm 67
    private final BigDecimal tauxConversionLocale;
19 ilm 68
 
18 ilm 69
    public AbstractVenteArticleItemTable() {
70
        super();
83 ilm 71
        SQLRow deviseSociete = ComptaPropsConfiguration.getInstanceCompta().getRowSociete().getForeign("ID_DEVISE");
72
        this.tauxConversionLocale = (deviseSociete == null ? BigDecimal.ONE : deviseSociete.getBigDecimal("TAUX"));
18 ilm 73
    }
74
 
75
    public AbstractVenteArticleItemTable(List<JButton> buttons) {
76
        super(buttons);
83 ilm 77
        SQLRow deviseSociete = ComptaPropsConfiguration.getInstanceCompta().getRowSociete().getForeign("ID_DEVISE");
78
        this.tauxConversionLocale = (deviseSociete == null ? BigDecimal.ONE : deviseSociete.getBigDecimal("TAUX"));
18 ilm 79
    }
80
 
83 ilm 81
    private boolean isCellNiveauEditable(SQLRowValues vals) {
82
        int index = model.row2index(vals);
83
        int niveau = vals.getInt("NIVEAU");
84
 
85
        return index + 1 == model.getRowCount() || niveau >= model.getRowValuesAt(index + 1).getInt("NIVEAU");
86
    }
87
 
80 ilm 88
    SQLTableElement tableElementFacturable;
83 ilm 89
    SQLTableElement tableElementRemise;
80 ilm 90
 
83 ilm 91
    public enum TypeCalcul {
92
        CALCUL_FACTURABLE("MONTANT_FACTURABLE", "POURCENT_FACTURABLE"), CALCUL_REMISE("MONTANT_REMISE", "POURCENT_REMISE");
93
 
94
        String fieldMontant, fieldPourcent;
95
 
96
        TypeCalcul(String fieldMontant, String fieldPourcent) {
97
            this.fieldMontant = fieldMontant;
98
            this.fieldPourcent = fieldPourcent;
99
        }
100
 
101
        public String getFieldMontant() {
102
            return fieldMontant;
103
        }
104
 
105
        public String getFieldPourcent() {
106
            return fieldPourcent;
107
        }
108
    };
109
 
110
    public void calculPourcentage(final Acompte a, final TypeCalcul type) {
80 ilm 111
        Runnable r = new Runnable() {
112
 
113
            @Override
114
            public void run() {
115
                SwingUtilities.invokeLater(new Runnable() {
116
 
117
                    @Override
118
                    public void run() {
83 ilm 119
                        SQLTableElement tableElement = (type == TypeCalcul.CALCUL_FACTURABLE ? tableElementFacturable : tableElementRemise);
120
 
80 ilm 121
                        if (a == null) {
122
                            for (int i = 0; i < model.getRowCount(); i++) {
83 ilm 123
                                model.putValue(null, i, type.getFieldMontant());
124
                                model.putValue(null, i, type.getFieldPourcent());
125
                                tableElement.fireModification(model.getRowValuesAt(i));
80 ilm 126
                            }
127
                        } else if (a.getPercent() != null) {
128
                            for (int i = 0; i < model.getRowCount(); i++) {
83 ilm 129
                                model.putValue(a.getPercent(), i, type.getFieldPourcent());
130
                                model.putValue(null, i, type.getFieldMontant());
131
                                tableElement.fireModification(model.getRowValuesAt(i));
80 ilm 132
                            }
133
                        } else {
134
                            // FIXME repartition du montant sur chaque ligne
135
                            BigDecimal totalHT = BigDecimal.ZERO;
83 ilm 136
                            for (SQLRowValues rowVals : getRowValuesAtLevel(1)) {
80 ilm 137
                                int qte = rowVals.getInt("QTE");
138
                                BigDecimal qteU = rowVals.getBigDecimal("QTE_UNITAIRE");
139
                                BigDecimal pU = rowVals.getBigDecimal("PV_HT");
140
 
141
                                BigDecimal totalLine = pU.multiply(qteU, MathContext.DECIMAL128).multiply(new BigDecimal(qte), MathContext.DECIMAL128).setScale(2, RoundingMode.HALF_UP);
142
 
83 ilm 143
                                // BigDecimal lremise = (type == TypeCalcul.CALCUL_FACTURABLE ?
144
                                // rowVals.getBigDecimal("POURCENT_REMISE") : BigDecimal.ZERO);
145
                                //
146
                                // if (lremise.compareTo(BigDecimal.ZERO) > 0 &&
147
                                // lremise.compareTo(BigDecimal.valueOf(100)) < 100) {
148
                                // totalLine =
149
                                // totalLine.multiply(BigDecimal.valueOf(100).subtract(lremise),
150
                                // MathContext.DECIMAL128).movePointLeft(2);
151
                                // }
152
                                if (type == TypeCalcul.CALCUL_FACTURABLE) {
153
                                    if (rowVals.getTable().getFieldsName().contains("MONTANT_REMISE")) {
154
                                        final BigDecimal acomptePercent = rowVals.getBigDecimal("POURCENT_REMISE");
155
                                        final BigDecimal acompteMontant = rowVals.getBigDecimal("MONTANT_REMISE");
156
                                        Remise remise = new Remise(acomptePercent, acompteMontant);
157
                                        totalLine = remise.getResultFrom(totalLine);
158
                                    }
80 ilm 159
                                }
160
                                totalHT = totalHT.add(totalLine);
161
                            }
162
 
163
                            for (int i = 0; i < model.getRowCount(); i++) {
83 ilm 164
                                // Restrict to level 1
165
                                if (model.getRowValuesAt(i).getInt("NIVEAU") != 1) {
166
                                    continue;
167
                                }
168
                                model.putValue(null, i, type.getFieldPourcent());
80 ilm 169
                                SQLRowValues rowVals = model.getRowValuesAt(i);
170
                                int qte = rowVals.getInt("QTE");
171
                                BigDecimal qteU = rowVals.getBigDecimal("QTE_UNITAIRE");
172
                                BigDecimal pU = rowVals.getBigDecimal("PV_HT");
173
 
174
                                BigDecimal totalLine = pU.multiply(qteU, MathContext.DECIMAL128).multiply(new BigDecimal(qte), MathContext.DECIMAL128).setScale(2, RoundingMode.HALF_UP);
175
 
83 ilm 176
                                // BigDecimal lremise = (type == TypeCalcul.CALCUL_FACTURABLE ?
177
                                // rowVals.getBigDecimal("POURCENT_REMISE") : BigDecimal.ZERO);
178
                                //
179
                                // if (lremise.compareTo(BigDecimal.ZERO) > 0 &&
180
                                // lremise.compareTo(BigDecimal.valueOf(100)) < 100) {
181
                                // totalLine =
182
                                // totalLine.multiply(BigDecimal.valueOf(100).subtract(lremise),
183
                                // MathContext.DECIMAL128).movePointLeft(2);
184
                                // }
185
                                if (rowVals.getTable().getFieldsName().contains("MONTANT_REMISE")) {
186
                                    final BigDecimal acomptePercent = rowVals.getBigDecimal("POURCENT_REMISE");
187
                                    final BigDecimal acompteMontant = rowVals.getBigDecimal("MONTANT_REMISE");
188
                                    Remise remise = new Remise(acomptePercent, acompteMontant);
189
                                    totalLine = remise.getResultFrom(totalLine);
80 ilm 190
                                }
191
 
83 ilm 192
                                BigDecimal percent = (totalHT.signum() != 0 ? totalLine.divide(totalHT, MathContext.DECIMAL128) : BigDecimal.ZERO);
80 ilm 193
 
83 ilm 194
                                model.putValue(a.getMontant().multiply(percent, MathContext.DECIMAL128).setScale(6, RoundingMode.HALF_UP), i, type.getFieldMontant());
195
                                tableElement.fireModification(model.getRowValuesAt(i));
80 ilm 196
                            }
197
                        }
198
                        model.fireTableDataChanged();
199
                    }
200
                });
201
            }
202
        };
203
        model.submit(r);
204
 
205
    }
206
 
28 ilm 207
    private static Map<String, Boolean> visibilityMap = new HashMap<String, Boolean>();
208
 
209
    public static Map<String, Boolean> getVisibilityMap() {
210
        return visibilityMap;
211
    }
212
 
19 ilm 213
    private SQLTable tableArticleTarif = Configuration.getInstance().getBase().getTable("ARTICLE_TARIF");
61 ilm 214
    private SQLTable tableArticle = Configuration.getInstance().getBase().getTable("ARTICLE");
19 ilm 215
 
18 ilm 216
    protected void init() {
217
 
67 ilm 218
        SQLPreferences prefs = SQLPreferences.getMemCached(getSQLElement().getTable().getDBRoot());
61 ilm 219
        final boolean selectArticle = prefs.getBoolean(GestionArticleGlobalPreferencePanel.USE_CREATED_ARTICLE, false);
220
        final boolean createAuto = prefs.getBoolean(GestionArticleGlobalPreferencePanel.CREATE_ARTICLE_AUTO, true);
221
 
18 ilm 222
        final SQLElement e = getSQLElement();
223
 
224
        final List<SQLTableElement> list = new Vector<SQLTableElement>();
83 ilm 225
        final SQLTableElement eNiveau = new SQLTableElement(e.getTable().getField("NIVEAU")) {
226
            @Override
227
            public void setValueFrom(SQLRowValues row, Object value) {
228
                super.setValueFrom(row, value);
229
                calculTarifNomenclature(model.row2index(row));
230
            }
231
        };
232
        eNiveau.setRenderer(new NiveauTableCellRender());
233
        eNiveau.setEditor(new NiveauTableCellEditor());
234
        list.add(eNiveau);
235
 
18 ilm 236
        list.add(new SQLTableElement(e.getTable().getField("ID_STYLE")));
28 ilm 237
 
61 ilm 238
        // Article
67 ilm 239
        SQLTableElement tableElementArticle = new SQLTableElement(e.getTable().getField("ID_ARTICLE"), true, true, true);
61 ilm 240
        list.add(tableElementArticle);
28 ilm 241
 
242
        // Code article
83 ilm 243
        final SQLTableElement tableElementCode = new SQLTableElement(e.getTable().getField("CODE"), String.class, new ITextArticleWithCompletionCellEditor(e.getTable().getTable("ARTICLE"), e
244
                .getTable().getTable("ARTICLE_FOURNISSEUR")));
18 ilm 245
        list.add(tableElementCode);
83 ilm 246
 
18 ilm 247
        // Désignation de l'article
248
        final SQLTableElement tableElementNom = new SQLTableElement(e.getTable().getField("NOM"));
249
        list.add(tableElementNom);
250
 
41 ilm 251
        if (e.getTable().getFieldsName().contains("COLORIS")) {
252
            final SQLTableElement tableElementColoris = new SQLTableElement(e.getTable().getField("COLORIS"));
253
            list.add(tableElementColoris);
254
        }
255
 
21 ilm 256
        if (e.getTable().getFieldsName().contains("DESCRIPTIF")) {
257
            final SQLTableElement tableElementDesc = new SQLTableElement(e.getTable().getField("DESCRIPTIF"));
258
            list.add(tableElementDesc);
259
        }
260
 
19 ilm 261
        if (DefaultNXProps.getInstance().getBooleanValue(ARTICLE_SHOW_DEVISE, false)) {
262
            // Code Douanier
263
            final SQLTableElement tableElementCodeDouane = new SQLTableElement(e.getTable().getField("CODE_DOUANIER"));
264
            list.add(tableElementCodeDouane);
265
        }
266
        if (DefaultNXProps.getInstance().getBooleanValue(ARTICLE_SHOW_DEVISE, false)) {
267
            final SQLTableElement tableElementPays = new SQLTableElement(e.getTable().getField("ID_PAYS"));
268
            list.add(tableElementPays);
269
        }
270
 
18 ilm 271
        // Valeur des métriques
272
        final SQLTableElement tableElement_ValeurMetrique2 = new SQLTableElement(e.getTable().getField("VALEUR_METRIQUE_2"), Float.class) {
273
            @Override
274
            public boolean isCellEditable(SQLRowValues vals) {
275
                Number modeNumber = (Number) vals.getObject("ID_MODE_VENTE_ARTICLE");
276
                // int mode = vals.getInt("ID_MODE_VENTE_ARTICLE");
277
                if (modeNumber != null
278
                        && (modeNumber.intValue() == ReferenceArticleSQLElement.A_LA_PIECE || modeNumber.intValue() == ReferenceArticleSQLElement.AU_POID_METRECARRE || modeNumber.intValue() == ReferenceArticleSQLElement.AU_METRE_LONGUEUR)) {
279
                    return false;
280
                } else {
281
                    return super.isCellEditable(vals);
282
                }
283
            }
284
 
285
            @Override
286
            public TableCellRenderer getTableCellRenderer() {
287
 
288
                return new ArticleRowValuesRenderer(null);
289
            }
290
        };
291
        list.add(tableElement_ValeurMetrique2);
292
        final SQLTableElement tableElement_ValeurMetrique3 = new SQLTableElement(e.getTable().getField("VALEUR_METRIQUE_3"), Float.class) {
293
            @Override
294
            public boolean isCellEditable(SQLRowValues vals) {
295
 
296
                Number modeNumber = (Number) vals.getObject("ID_MODE_VENTE_ARTICLE");
297
                if (modeNumber != null && (!(modeNumber.intValue() == ReferenceArticleSQLElement.AU_POID_METRECARRE))) {
298
                    return false;
299
                } else {
300
                    return super.isCellEditable(vals);
301
                }
302
            }
303
 
304
            @Override
305
            public TableCellRenderer getTableCellRenderer() {
306
 
307
                return new ArticleRowValuesRenderer(null);
308
            }
309
        };
310
        list.add(tableElement_ValeurMetrique3);
311
        final SQLTableElement tableElement_ValeurMetrique1 = new SQLTableElement(e.getTable().getField("VALEUR_METRIQUE_1"), Float.class) {
312
            @Override
313
            public boolean isCellEditable(SQLRowValues vals) {
314
 
315
                Number modeNumber = (Number) vals.getObject("ID_MODE_VENTE_ARTICLE");
316
                if (modeNumber != null
317
                        && (modeNumber.intValue() == ReferenceArticleSQLElement.A_LA_PIECE || modeNumber.intValue() == ReferenceArticleSQLElement.AU_POID_METRECARRE || modeNumber.intValue() == ReferenceArticleSQLElement.AU_METRE_LARGEUR)) {
318
                    return false;
319
                } else {
320
                    return super.isCellEditable(vals);
321
                }
322
            }
323
 
324
            @Override
325
            public TableCellRenderer getTableCellRenderer() {
326
 
327
                return new ArticleRowValuesRenderer(null);
328
            }
329
        };
330
        list.add(tableElement_ValeurMetrique1);
331
 
41 ilm 332
        // Prébilan
61 ilm 333
 
41 ilm 334
        if (e.getTable().getFieldsName().contains("PREBILAN")) {
67 ilm 335
            prebilan = new SQLTableElement(e.getTable().getField("PREBILAN"), BigDecimal.class);
41 ilm 336
            list.add(prebilan);
337
        }
338
 
18 ilm 339
        // Prix d'achat HT de la métrique 1
73 ilm 340
        final SQLTableElement tableElement_PrixMetrique1_AchatHT = new SQLTableElement(e.getTable().getField("PRIX_METRIQUE_HA_1"), BigDecimal.class) {
341
            protected Object getDefaultNullValue() {
342
                return BigDecimal.ZERO;
343
            }
83 ilm 344
 
345
            @Override
346
            public boolean isCellEditable(SQLRowValues vals) {
347
                return isCellNiveauEditable(vals);
348
            }
349
 
73 ilm 350
        };
351
        tableElement_PrixMetrique1_AchatHT.setRenderer(new DeviseTableCellRenderer());
18 ilm 352
        list.add(tableElement_PrixMetrique1_AchatHT);
353
 
19 ilm 354
        SQLTableElement eltDevise = null;
355
        SQLTableElement eltUnitDevise = null;
356
        if (DefaultNXProps.getInstance().getBooleanValue(ARTICLE_SHOW_DEVISE, false)) {
357
            // Devise
358
            eltDevise = new SQLTableElement(e.getTable().getField("ID_DEVISE"));
359
            list.add(eltDevise);
360
 
361
            // Prix vente devise
83 ilm 362
            eltUnitDevise = new SQLTableElement(e.getTable().getField("PV_U_DEVISE"), BigDecimal.class) {
363
                @Override
364
                public boolean isCellEditable(SQLRowValues vals) {
365
                    return isCellNiveauEditable(vals);
366
                }
367
            };
73 ilm 368
            eltUnitDevise.setRenderer(new DeviseTableCellRenderer());
19 ilm 369
            list.add(eltUnitDevise);
370
        }
18 ilm 371
        // Prix de vente HT de la métrique 1
73 ilm 372
 
67 ilm 373
        SQLField field = e.getTable().getField("PRIX_METRIQUE_VT_1");
73 ilm 374
        final DeviseNumericHTConvertorCellEditor editorPVHT = new DeviseNumericHTConvertorCellEditor(field);
18 ilm 375
 
83 ilm 376
        final SQLTableElement tableElement_PrixMetrique1_VenteHT = new SQLTableElement(field, BigDecimal.class, editorPVHT) {
377
            @Override
378
            public boolean isCellEditable(SQLRowValues vals) {
379
                return isCellNiveauEditable(vals);
380
            }
381
        };
73 ilm 382
        tableElement_PrixMetrique1_VenteHT.setRenderer(new DeviseTableCellRenderer());
18 ilm 383
        list.add(tableElement_PrixMetrique1_VenteHT);
19 ilm 384
 
18 ilm 385
        // // Prix d'achat HT de la métrique 1
61 ilm 386
 
387
        SQLTableElement qteU = new SQLTableElement(e.getTable().getField("QTE_UNITAIRE"), BigDecimal.class) {
388
            @Override
389
            public boolean isCellEditable(SQLRowValues vals) {
390
 
391
                SQLRowAccessor row = vals.getForeign("ID_UNITE_VENTE");
392
                if (row != null && !row.isUndefined() && row.getBoolean("A_LA_PIECE")) {
393
                    return false;
394
                } else {
395
                    return super.isCellEditable(vals);
396
                }
397
            }
398
 
399
            @Override
400
            public TableCellRenderer getTableCellRenderer() {
401
                return new QteUnitRowValuesRenderer();
402
            }
67 ilm 403
 
404
            protected Object getDefaultNullValue() {
405
                return BigDecimal.ZERO;
406
            }
61 ilm 407
        };
408
        list.add(qteU);
409
 
410
        SQLTableElement uniteVente = new SQLTableElement(e.getTable().getField("ID_UNITE_VENTE"));
411
        list.add(uniteVente);
412
 
18 ilm 413
        // Quantité
21 ilm 414
        this.qte = new SQLTableElement(e.getTable().getField("QTE"), Integer.class, new QteCellEditor()) {
19 ilm 415
            protected Object getDefaultNullValue() {
416
                return Integer.valueOf(0);
417
            }
418
 
419
            public TableCellRenderer getTableCellRenderer() {
420
                if (getSQLElement().getTable().getFieldsName().contains("QTE_ACHAT")) {
421
                    return new QteMultipleRowValuesRenderer();
422
                } else {
423
                    return super.getTableCellRenderer();
424
                }
425
            }
426
        };
18 ilm 427
        this.qte.setPreferredSize(20);
428
        list.add(this.qte);
429
 
430
        // Mode de vente
431
        final SQLTableElement tableElement_ModeVente = new SQLTableElement(e.getTable().getField("ID_MODE_VENTE_ARTICLE"));
432
        list.add(tableElement_ModeVente);
433
 
434
        // // Prix d'achat unitaire HT
73 ilm 435
 
436
        final SQLField prixAchatHTField = e.getTable().getField("PA_HT");
437
        final DeviseNumericCellEditor editorPAchatHT = new DeviseNumericCellEditor(prixAchatHTField);
438
        this.ha = new SQLTableElement(e.getTable().getField("PA_HT"), BigDecimal.class, editorPAchatHT) {
439
            protected Object getDefaultNullValue() {
440
                return BigDecimal.ZERO;
441
            }
83 ilm 442
 
443
            @Override
444
            public boolean isCellEditable(SQLRowValues vals) {
445
                return isCellNiveauEditable(vals);
446
            }
73 ilm 447
        };
83 ilm 448
        this.ha = new SQLTableElement(prixAchatHTField, BigDecimal.class, editorPAchatHT) {
449
            @Override
450
            public boolean isCellEditable(SQLRowValues vals) {
451
                return isCellNiveauEditable(vals);
452
            }
453
        };
73 ilm 454
        this.ha.setRenderer(new DeviseTableCellRenderer());
455
 
18 ilm 456
        list.add(this.ha);
457
 
458
        // Prix de vente unitaire HT
73 ilm 459
        final SQLField prixVenteHTField = e.getTable().getField("PV_HT");
460
        final DeviseNumericCellEditor editorPVenteHT = new DeviseNumericCellEditor(prixAchatHTField);
83 ilm 461
        final SQLTableElement tableElement_PrixVente_HT = new SQLTableElement(prixVenteHTField, BigDecimal.class, editorPVenteHT) {
462
            @Override
463
            public boolean isCellEditable(SQLRowValues vals) {
464
                return isCellNiveauEditable(vals);
465
            }
466
        };
73 ilm 467
        tableElement_PrixVente_HT.setRenderer(new DeviseTableCellRenderer());
18 ilm 468
        list.add(tableElement_PrixVente_HT);
469
 
470
        // TVA
61 ilm 471
        this.tableElementTVA = new SQLTableElement(e.getTable().getField("ID_TAXE"));
472
        this.tableElementTVA.setPreferredSize(20);
473
        list.add(this.tableElementTVA);
18 ilm 474
        // Poids piece
80 ilm 475
        SQLTableElement tableElementPoids = new SQLTableElement(e.getTable().getField("POIDS"), Float.class) {
476
            protected Object getDefaultNullValue() {
477
                return 0F;
478
            }
479
 
480
            @Override
481
            public TableCellRenderer getTableCellRenderer() {
482
                return new QteUnitRowValuesRenderer();
483
            }
484
 
485
        };
18 ilm 486
        tableElementPoids.setPreferredSize(20);
487
        list.add(tableElementPoids);
488
 
489
        // Poids total
80 ilm 490
        this.tableElementPoidsTotal = new SQLTableElement(e.getTable().getField("T_POIDS"), Float.class) {
491
            @Override
492
            public TableCellRenderer getTableCellRenderer() {
493
                return new QteUnitRowValuesRenderer();
494
            }
495
        };
496
        this.tableElementPoidsTotal.setEditable(false);
18 ilm 497
        list.add(this.tableElementPoidsTotal);
498
 
80 ilm 499
        // Packaging
500
        if (prefs.getBoolean(GestionArticleGlobalPreferencePanel.ITEM_PACKAGING, false)) {
501
 
502
            SQLTableElement poidsColis = new SQLTableElement(e.getTable().getField("POIDS_COLIS_NET"), BigDecimal.class) {
503
                @Override
504
                public TableCellRenderer getTableCellRenderer() {
505
                    return new QteUnitRowValuesRenderer();
506
                }
507
 
508
            };
509
            list.add(poidsColis);
510
 
511
            SQLTableElement nbColis = new SQLTableElement(e.getTable().getField("NB_COLIS"), Integer.class);
512
            list.add(nbColis);
513
 
514
            final SQLTableElement totalPoidsColis = new SQLTableElement(e.getTable().getField("T_POIDS_COLIS_NET"), BigDecimal.class) {
515
                @Override
516
                public TableCellRenderer getTableCellRenderer() {
517
                    return new QteUnitRowValuesRenderer();
518
                }
519
 
520
            };
521
            list.add(totalPoidsColis);
522
 
523
            poidsColis.addModificationListener(totalPoidsColis);
524
            nbColis.addModificationListener(totalPoidsColis);
525
            totalPoidsColis.setModifier(new CellDynamicModifier() {
526
                public Object computeValueFrom(final SQLRowValues row) {
527
                    final Object o2 = row.getObject("POIDS_COLIS_NET");
528
                    final Object o3 = row.getObject("NB_COLIS");
529
                    if (o2 != null && o3 != null) {
530
                        BigDecimal poids = (BigDecimal) o2;
531
                        int nb = (Integer) o3;
532
                        return poids.multiply(new BigDecimal(nb), MathContext.DECIMAL128).setScale(totalPoidsColis.getDecimalDigits(), RoundingMode.HALF_UP);
533
                    } else {
534
                        return row.getObject("T_POIDS_COLIS_NET");
535
                    }
536
                }
537
            });
538
 
539
        }
540
 
18 ilm 541
        // Service
19 ilm 542
        if (DefaultNXProps.getInstance().getBooleanValue(ARTICLE_SERVICE, false)) {
18 ilm 543
            this.service = new SQLTableElement(e.getTable().getField("SERVICE"), Boolean.class);
544
            list.add(this.service);
545
        }
546
 
83 ilm 547
        this.totalHT = new SQLTableElement(e.getTable().getField("T_PV_HT"), BigDecimal.class) {
548
            @Override
549
            public boolean isCellEditable(SQLRowValues vals) {
550
                return isCellNiveauEditable(vals);
551
            }
552
        };
73 ilm 553
        this.totalHT.setRenderer(new DeviseTableCellRenderer());
61 ilm 554
        this.totalHT.setEditable(false);
80 ilm 555
        if (e.getTable().getFieldsName().contains("MONTANT_FACTURABLE")) {
556
            // SQLTableElement tableElementAcompte = new
557
            // SQLTableElement(e.getTable().getField("POURCENT_ACOMPTE"));
558
            // list.add(tableElementAcompte);
559
 
560
            this.tableElementFacturable = new SQLTableElement(e.getTable().getField("POURCENT_FACTURABLE"), Acompte.class, new AcompteCellEditor("POURCENT_FACTURABLE", "MONTANT_FACTURABLE")) {
561
                @Override
562
                public void setValueFrom(SQLRowValues row, Object value) {
563
 
564
                    if (value != null) {
565
                        Acompte a = (Acompte) value;
566
                        row.put("MONTANT_FACTURABLE", a.getMontant());
567
                        row.put("POURCENT_FACTURABLE", a.getPercent());
568
                    } else {
569
                        row.put("MONTANT_FACTURABLE", null);
570
                        row.put("POURCENT_FACTURABLE", BigDecimal.ONE.movePointRight(2));
571
                    }
572
                    fireModification(row);
573
                }
574
            };
575
            tableElementFacturable.setRenderer(new DefaultTableCellRenderer() {
576
                @Override
577
                public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
578
                    SQLRowValues rowVals = ((RowValuesTable) table).getRowValuesTableModel().getRowValuesAt(row);
579
                    JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
580
                    BigDecimal percent = rowVals.getBigDecimal("POURCENT_FACTURABLE");
581
                    BigDecimal amount = rowVals.getBigDecimal("MONTANT_FACTURABLE");
582
                    Acompte a = new Acompte(percent, amount);
583
                    label.setText(a.toString());
584
                    return label;
585
                }
586
            });
587
            tableElementFacturable.addModificationListener(this.totalHT);
588
            list.add(tableElementFacturable);
28 ilm 589
        }
73 ilm 590
 
83 ilm 591
        final SQLField fieldRemise = e.getTable().getField("POURCENT_REMISE");
592
 
593
        if (e.getTable().getFieldsName().contains("MONTANT_REMISE")) {
594
            tableElementRemise = new SQLTableElement(e.getTable().getField("POURCENT_REMISE"), Acompte.class, new AcompteCellEditor("POURCENT_REMISE", "MONTANT_REMISE")) {
595
                @Override
596
                public void setValueFrom(SQLRowValues row, Object value) {
597
 
598
                    if (value != null) {
599
                        Acompte a = (Acompte) value;
600
                        row.put("MONTANT_REMISE", a.getMontant());
601
                        row.put("POURCENT_REMISE", a.getPercent());
602
                    } else {
603
                        row.put("MONTANT_REMISE", null);
604
                        row.put("POURCENT_REMISE", BigDecimal.ZERO);
605
                    }
606
                    fireModification(row);
607
                }
608
            };
609
            tableElementRemise.setRenderer(new DefaultTableCellRenderer() {
610
                @Override
611
                public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
612
                    SQLRowValues rowVals = ((RowValuesTable) table).getRowValuesTableModel().getRowValuesAt(row);
613
                    JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
614
                    BigDecimal percent = rowVals.getBigDecimal("POURCENT_REMISE");
615
                    BigDecimal amount = rowVals.getBigDecimal("MONTANT_REMISE");
616
                    Remise a = new Remise(percent, amount);
617
                    label.setText(a.toString());
618
                    return label;
619
                }
620
            });
621
        } else {
622
            tableElementRemise = new SQLTableElement(fieldRemise) {
623
                protected Object getDefaultNullValue() {
624
                    return BigDecimal.ZERO;
625
                }
626
            };
627
        }
19 ilm 628
        list.add(tableElementRemise);
28 ilm 629
        SQLTableElement tableElementRG = null;
630
        if (e.getTable().getFieldsName().contains("POURCENT_RG")) {
631
            tableElementRG = new SQLTableElement(e.getTable().getField("POURCENT_RG"));
632
            list.add(tableElementRG);
633
        }
634
 
18 ilm 635
        // Total HT
67 ilm 636
        this.totalHA = new SQLTableElement(e.getTable().getField("T_PA_HT"), BigDecimal.class);
73 ilm 637
        this.totalHA.setRenderer(new DeviseTableCellRenderer());
67 ilm 638
        this.totalHA.setEditable(false);
639
        list.add(this.totalHA);
18 ilm 640
 
19 ilm 641
        if (DefaultNXProps.getInstance().getBooleanValue(ARTICLE_SHOW_DEVISE, false)) {
642
            // Total HT
83 ilm 643
            this.tableElementTotalDevise = new SQLTableElement(e.getTable().getField("PV_T_DEVISE"), BigDecimal.class) {
644
                @Override
645
                public boolean isCellEditable(SQLRowValues vals) {
646
                    return isCellNiveauEditable(vals);
647
                }
648
            };
73 ilm 649
            this.tableElementTotalDevise.setRenderer(new DeviseTableCellRenderer());
19 ilm 650
            list.add(tableElementTotalDevise);
651
        }
21 ilm 652
 
653
        // Marge HT
654
        if (e.getTable().getFieldsName().contains("MARGE_HT")) {
655
 
67 ilm 656
            final SQLTableElement marge = new SQLTableElement(e.getTable().getField("MARGE_HT"), BigDecimal.class);
73 ilm 657
            marge.setRenderer(new DeviseTableCellRenderer());
21 ilm 658
            marge.setEditable(false);
659
            list.add(marge);
660
            this.totalHT.addModificationListener(marge);
67 ilm 661
            this.totalHA.addModificationListener(marge);
21 ilm 662
            marge.setModifier(new CellDynamicModifier() {
663
                @Override
664
                public Object computeValueFrom(SQLRowValues row) {
665
 
67 ilm 666
                    BigDecimal vt = (BigDecimal) row.getObject("T_PV_HT");
21 ilm 667
 
67 ilm 668
                    BigDecimal ha = (BigDecimal) row.getObject("T_PA_HT");
21 ilm 669
 
80 ilm 670
                    final BigDecimal acomptePercent = row.getBigDecimal("POURCENT_FACTURABLE");
671
                    final BigDecimal acompteMontant = row.getBigDecimal("MONTANT_FACTURABLE");
672
                    Acompte acompte = new Acompte(acomptePercent, acompteMontant);
673
                    ha = acompte.getResultFrom(ha);
674
                    vt = acompte.getResultFrom(vt);
28 ilm 675
 
67 ilm 676
                    return vt.subtract(ha).setScale(marge.getDecimalDigits(), RoundingMode.HALF_UP);
21 ilm 677
                }
678
 
679
            });
680
 
681
        }
682
 
61 ilm 683
        if (e.getTable().getFieldsName().contains("MARGE_PREBILAN_HT")) {
684
 
67 ilm 685
            final SQLTableElement marge = new SQLTableElement(e.getTable().getField("MARGE_PREBILAN_HT"), Long.class, new DeviseCellEditor());
61 ilm 686
            marge.setRenderer(new MargeTableCellRenderer());
687
            marge.setEditable(false);
688
            list.add(marge);
689
            this.totalHT.addModificationListener(marge);
690
            prebilan.addModificationListener(marge);
691
            marge.setModifier(new CellDynamicModifier() {
692
                @Override
693
                public Object computeValueFrom(SQLRowValues row) {
694
 
67 ilm 695
                    BigDecimal vt = (BigDecimal) row.getObject("T_PV_HT");
61 ilm 696
 
67 ilm 697
                    BigDecimal ha = row.getObject("PREBILAN") == null ? BigDecimal.ZERO : (BigDecimal) row.getObject("PREBILAN");
61 ilm 698
 
80 ilm 699
                    final BigDecimal acomptePercent = row.getBigDecimal("POURCENT_FACTURABLE");
700
                    final BigDecimal acompteMontant = row.getBigDecimal("MONTANT_FACTURABLE");
701
                    Acompte acompte = new Acompte(acomptePercent, acompteMontant);
702
                    ha = acompte.getResultFrom(ha);
703
                    vt = acompte.getResultFrom(vt);
67 ilm 704
                    return vt.subtract(ha).setScale(marge.getDecimalDigits(), RoundingMode.HALF_UP);
61 ilm 705
                }
706
 
707
            });
708
 
709
        }
710
 
18 ilm 711
        // Total HT
73 ilm 712
 
67 ilm 713
        this.totalHT.setEditable(false);
18 ilm 714
        list.add(this.totalHT);
715
        // Total TTC
65 ilm 716
        // FIXME add a modifier -> T_TTC modify P_VT_METRIQUE_1 + fix CellDynamicModifier not fire
717
        // if value not changed
83 ilm 718
        this.tableElementTotalTTC = new SQLTableElement(e.getTable().getField("T_PV_TTC"), BigDecimal.class) {
719
            @Override
720
            public boolean isCellEditable(SQLRowValues vals) {
721
                return isCellNiveauEditable(vals);
722
            }
723
        };
73 ilm 724
        this.tableElementTotalTTC.setRenderer(new DeviseTableCellRenderer());
67 ilm 725
        this.tableElementTotalTTC.setEditable(false);
18 ilm 726
        list.add(this.tableElementTotalTTC);
727
 
80 ilm 728
        SQLRowValues defautRow = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(e.getTable()));
729
        defautRow.put("ID_TAXE", TaxeCache.getCache().getFirstTaxe().getID());
83 ilm 730
        defautRow.put("CODE", "");
731
        defautRow.put("NOM", "");
80 ilm 732
        this.model = new RowValuesTableModel(e, list, e.getTable().getField("NOM"), false, defautRow);
18 ilm 733
 
734
        this.table = new RowValuesTable(this.model, getConfigurationFile());
735
        ToolTipManager.sharedInstance().unregisterComponent(this.table);
736
        ToolTipManager.sharedInstance().unregisterComponent(this.table.getTableHeader());
737
 
738
        // Autocompletion
739
        SQLTable sqlTableArticle = ((ComptaPropsConfiguration) Configuration.getInstance()).getRootSociete().getTable("ARTICLE");
28 ilm 740
        List<String> completionField = new ArrayList<String>();
19 ilm 741
 
742
        if (DefaultNXProps.getInstance().getBooleanValue(ARTICLE_SHOW_DEVISE, false)) {
28 ilm 743
 
744
            completionField.add("CODE_DOUANIER");
19 ilm 745
        }
746
        if (DefaultNXProps.getInstance().getBooleanValue(ARTICLE_SHOW_DEVISE, false)) {
28 ilm 747
            completionField.add("ID_PAYS");
19 ilm 748
        }
61 ilm 749
        completionField.add("ID_UNITE_VENTE");
28 ilm 750
        completionField.add("PA_HT");
751
        completionField.add("PV_HT");
752
        completionField.add("ID_TAXE");
753
        completionField.add("POIDS");
754
        completionField.add("PRIX_METRIQUE_HA_1");
755
        completionField.add("PRIX_METRIQUE_HA_2");
756
        completionField.add("PRIX_METRIQUE_HA_3");
757
        completionField.add("VALEUR_METRIQUE_1");
758
        completionField.add("VALEUR_METRIQUE_2");
759
        completionField.add("VALEUR_METRIQUE_3");
760
        completionField.add("ID_MODE_VENTE_ARTICLE");
761
        completionField.add("PRIX_METRIQUE_VT_1");
762
        completionField.add("PRIX_METRIQUE_VT_2");
763
        completionField.add("PRIX_METRIQUE_VT_3");
764
        completionField.add("SERVICE");
21 ilm 765
        if (getSQLElement().getTable().getFieldsName().contains("DESCRIPTIF")) {
28 ilm 766
            completionField.add("DESCRIPTIF");
21 ilm 767
        }
19 ilm 768
        if (DefaultNXProps.getInstance().getBooleanValue(ARTICLE_SHOW_DEVISE, false)) {
28 ilm 769
            completionField.add("ID_DEVISE");
19 ilm 770
        }
771
        if (DefaultNXProps.getInstance().getBooleanValue(ARTICLE_SHOW_DEVISE, false)) {
28 ilm 772
            completionField.add("PV_U_DEVISE");
19 ilm 773
        }
774
        if (getSQLElement().getTable().getFieldsName().contains("QTE_ACHAT") && sqlTableArticle.getTable().getFieldsName().contains("QTE_ACHAT")) {
28 ilm 775
            completionField.add("QTE_ACHAT");
19 ilm 776
        }
18 ilm 777
 
28 ilm 778
        final AutoCompletionManager m = new AutoCompletionManager(tableElementCode, sqlTableArticle.getField("CODE"), this.table, this.table.getRowValuesTableModel()) {
779
            @Override
780
            protected Object getValueFrom(SQLRow row, String field) {
781
                Object res = tarifCompletion(row, field);
782
                if (res == null) {
783
                    return super.getValueFrom(row, field);
784
                } else {
785
                    return res;
786
                }
787
            }
788
        };
789
        m.fill("NOM", "NOM");
61 ilm 790
        m.fill("ID", "ID_ARTICLE");
28 ilm 791
        for (String string : completionField) {
792
            m.fill(string, string);
793
        }
18 ilm 794
        m.setWhere(new Where(sqlTableArticle.getField("OBSOLETE"), "=", Boolean.FALSE));
28 ilm 795
 
19 ilm 796
        final AutoCompletionManager m2 = new AutoCompletionManager(tableElementNom, sqlTableArticle.getField("NOM"), this.table, this.table.getRowValuesTableModel()) {
797
            @Override
798
            protected Object getValueFrom(SQLRow row, String field) {
799
                Object res = tarifCompletion(row, field);
800
                if (res == null) {
801
                    return super.getValueFrom(row, field);
802
                } else {
803
                    return res;
804
                }
805
            }
806
 
807
        };
18 ilm 808
        m2.fill("CODE", "CODE");
61 ilm 809
        m2.fill("ID", "ID_ARTICLE");
28 ilm 810
        for (String string : completionField) {
811
            m2.fill(string, string);
19 ilm 812
        }
813
 
18 ilm 814
        m2.setWhere(new Where(sqlTableArticle.getField("OBSOLETE"), "=", Boolean.FALSE));
815
 
61 ilm 816
        final AutoCompletionManager m3 = new AutoCompletionManager(tableElementArticle, sqlTableArticle.getField("NOM"), this.table, this.table.getRowValuesTableModel(),
65 ilm 817
                ITextWithCompletion.MODE_CONTAINS, true, true, new ValidStateChecker()) {
61 ilm 818
            @Override
819
            protected Object getValueFrom(SQLRow row, String field) {
820
                Object res = tarifCompletion(row, field);
821
                if (res == null) {
822
                    return super.getValueFrom(row, field);
823
                } else {
824
                    return res;
825
                }
826
            }
28 ilm 827
 
61 ilm 828
        };
829
        m3.fill("CODE", "CODE");
830
        m3.fill("NOM", "NOM");
831
        for (String string : completionField) {
832
            m3.fill(string, string);
833
        }
28 ilm 834
 
61 ilm 835
        m3.setWhere(new Where(sqlTableArticle.getField("OBSOLETE"), "=", Boolean.FALSE));
836
 
67 ilm 837
        // Deselection de l'article si le code est modifié
61 ilm 838
        tableElementCode.addModificationListener(tableElementArticle);
839
        tableElementArticle.setModifier(new CellDynamicModifier() {
840
            @Override
841
            public Object computeValueFrom(SQLRowValues row) {
83 ilm 842
                try {
843
                    SQLRowAccessor foreign = row.getForeign("ID_ARTICLE");
844
                    if (foreign != null && !foreign.isUndefined() && foreign.getObject("CODE") != null && foreign.getString("CODE").equals(row.getString("CODE"))) {
845
                        return foreign.getID();
846
                    } else {
847
                        return tableArticle.getUndefinedID();
848
                    }
849
                } catch (Exception e) {
61 ilm 850
                    return tableArticle.getUndefinedID();
851
                }
852
            }
853
        });
854
 
18 ilm 855
        // Calcul automatique du total HT
856
        this.qte.addModificationListener(this.totalHT);
67 ilm 857
        this.qte.addModificationListener(this.totalHA);
61 ilm 858
        qteU.addModificationListener(this.totalHT);
67 ilm 859
        qteU.addModificationListener(this.totalHA);
28 ilm 860
        if (tableElementRG != null) {
861
            tableElementRG.addModificationListener(this.totalHT);
862
        }
19 ilm 863
        tableElementRemise.addModificationListener(this.totalHT);
28 ilm 864
 
18 ilm 865
        tableElement_PrixVente_HT.addModificationListener(this.totalHT);
19 ilm 866
        // tableElement_PrixVente_HT.addModificationListener(tableElement_PrixMetrique1_VenteHT);
67 ilm 867
        this.ha.addModificationListener(this.totalHA);
18 ilm 868
 
869
        this.totalHT.setModifier(new CellDynamicModifier() {
870
            public Object computeValueFrom(final SQLRowValues row) {
19 ilm 871
 
83 ilm 872
                BigDecimal lremise = BigDecimal.ZERO;
28 ilm 873
 
874
                if (row.getTable().getFieldsName().contains("POURCENT_RG")) {
875
                    final Object o3 = row.getObject("POURCENT_RG");
67 ilm 876
                    if (o3 != null)
877
                        lremise.add(((BigDecimal) o3));
28 ilm 878
                }
879
 
19 ilm 880
                int qte = (row.getObject("QTE") == null) ? 0 : Integer.parseInt(row.getObject("QTE").toString());
61 ilm 881
                BigDecimal b = (row.getObject("QTE_UNITAIRE") == null) ? BigDecimal.ONE : (BigDecimal) row.getObject("QTE_UNITAIRE");
67 ilm 882
                BigDecimal f = (BigDecimal) row.getObject("PV_HT");
883
                BigDecimal r = b.multiply(f.multiply(BigDecimal.valueOf(qte), MathContext.DECIMAL128), MathContext.DECIMAL128);
884
                if (lremise.compareTo(BigDecimal.ZERO) > 0 && lremise.compareTo(BigDecimal.valueOf(100)) < 100) {
885
                    r = r.multiply(BigDecimal.valueOf(100).subtract(lremise), MathContext.DECIMAL128).movePointLeft(2);
19 ilm 886
                }
83 ilm 887
 
888
                if (row.getTable().getFieldsName().contains("MONTANT_REMISE")) {
889
                    final BigDecimal acomptePercent = row.getBigDecimal("POURCENT_REMISE");
890
                    final BigDecimal acompteMontant = row.getBigDecimal("MONTANT_REMISE");
891
                    Remise remise = new Remise(acomptePercent, acompteMontant);
892
                    r = remise.getResultFrom(r);
893
                }
894
 
80 ilm 895
                if (row.getTable().getFieldsName().contains("POURCENT_FACTURABLE")) {
896
                    final BigDecimal acomptePercent = row.getBigDecimal("POURCENT_FACTURABLE");
897
                    final BigDecimal acompteMontant = row.getBigDecimal("MONTANT_FACTURABLE");
898
                    Acompte acompte = new Acompte(acomptePercent, acompteMontant);
899
                    r = acompte.getResultFrom(r);
900
                }
901
 
67 ilm 902
                return r.setScale(totalHT.getDecimalDigits(), BigDecimal.ROUND_HALF_UP);
18 ilm 903
            }
904
        });
67 ilm 905
        this.totalHA.setModifier(new CellDynamicModifier() {
18 ilm 906
            @Override
907
            public Object computeValueFrom(SQLRowValues row) {
908
                int qte = Integer.parseInt(row.getObject("QTE").toString());
61 ilm 909
                BigDecimal b = (row.getObject("QTE_UNITAIRE") == null) ? BigDecimal.ONE : (BigDecimal) row.getObject("QTE_UNITAIRE");
67 ilm 910
                BigDecimal f = (BigDecimal) row.getObject("PA_HT");
73 ilm 911
                BigDecimal r = b.multiply(new BigDecimal(qte), MathContext.DECIMAL128).multiply(f, MathContext.DECIMAL128).setScale(6, BigDecimal.ROUND_HALF_UP);
67 ilm 912
                return r.setScale(totalHA.getDecimalDigits(), BigDecimal.ROUND_HALF_UP);
18 ilm 913
            }
83 ilm 914
 
915
            @Override
916
            public void setValueFrom(SQLRowValues row, Object value) {
917
                super.setValueFrom(row, value);
918
                calculTarifNomenclature(model.row2index(row));
919
            }
18 ilm 920
        });
921
 
19 ilm 922
        if (DefaultNXProps.getInstance().getBooleanValue(ARTICLE_SHOW_DEVISE, false)) {
923
            this.qte.addModificationListener(tableElementTotalDevise);
61 ilm 924
            qteU.addModificationListener(tableElementTotalDevise);
80 ilm 925
            if (eltUnitDevise != null) {
926
                eltUnitDevise.addModificationListener(tableElementTotalDevise);
927
            }
21 ilm 928
            tableElementRemise.addModificationListener(this.tableElementTotalDevise);
19 ilm 929
            tableElementTotalDevise.setModifier(new CellDynamicModifier() {
930
                @Override
931
                public Object computeValueFrom(SQLRowValues row) {
932
                    int qte = Integer.parseInt(row.getObject("QTE").toString());
67 ilm 933
                    BigDecimal f = (BigDecimal) row.getObject("PV_U_DEVISE");
61 ilm 934
                    BigDecimal b = (row.getObject("QTE_UNITAIRE") == null) ? BigDecimal.ONE : (BigDecimal) row.getObject("QTE_UNITAIRE");
67 ilm 935
                    BigDecimal r = b.multiply(f.multiply(BigDecimal.valueOf(qte)), MathContext.DECIMAL128);
936
 
83 ilm 937
                    if (row.getTable().getFieldsName().contains("MONTANT_REMISE")) {
938
                        final BigDecimal acomptePercent = row.getBigDecimal("POURCENT_REMISE");
939
                        final BigDecimal acompteMontant = row.getBigDecimal("MONTANT_REMISE");
940
                        Remise remise = new Remise(acomptePercent, acompteMontant);
941
                        r = remise.getResultFrom(r);
21 ilm 942
                    }
83 ilm 943
 
944
                    // if (lremise.compareTo(BigDecimal.ZERO) > 0 &&
945
                    // lremise.compareTo(BigDecimal.valueOf(100)) < 100) {
946
                    // r = r.multiply(BigDecimal.valueOf(100).subtract(lremise),
947
                    // MathContext.DECIMAL128).movePointLeft(2);
948
                    // }
67 ilm 949
                    return r.setScale(tableElementTotalDevise.getDecimalDigits(), BigDecimal.ROUND_HALF_UP);
19 ilm 950
                }
951
            });
952
        }
18 ilm 953
        // Calcul automatique du total TTC
73 ilm 954
 
18 ilm 955
        this.totalHT.addModificationListener(this.tableElementTotalTTC);
61 ilm 956
        this.tableElementTVA.addModificationListener(this.tableElementTotalTTC);
18 ilm 957
        this.tableElementTotalTTC.setModifier(new CellDynamicModifier() {
958
            @Override
959
            public Object computeValueFrom(SQLRowValues row) {
21 ilm 960
 
73 ilm 961
                BigDecimal ht = (BigDecimal) row.getObject("T_PV_HT");
18 ilm 962
                int idTaux = Integer.parseInt(row.getObject("ID_TAXE").toString());
963
 
964
                Float resultTaux = TaxeCache.getCache().getTauxFromId(idTaux);
965
 
966
                if (resultTaux == null) {
80 ilm 967
                    SQLRow rowTax = TaxeCache.getCache().getFirstTaxe();
968
                    row.put("ID_TAXE", rowTax.getID());
969
                    resultTaux = rowTax.getFloat("TAUX");
18 ilm 970
                }
971
 
972
                float taux = (resultTaux == null) ? 0.0F : resultTaux.floatValue();
73 ilm 973
                editorPVHT.setTaxe(taux);
974
 
975
                BigDecimal r = ht.multiply(BigDecimal.valueOf(taux).movePointLeft(2).add(BigDecimal.ONE), MathContext.DECIMAL128);
976
                final BigDecimal resultTTC = r.setScale(tableElementTotalTTC.getDecimalDigits(), BigDecimal.ROUND_HALF_UP);
83 ilm 977
 
73 ilm 978
                return resultTTC;
18 ilm 979
            }
980
 
83 ilm 981
            @Override
982
            public void setValueFrom(SQLRowValues row, Object value) {
983
                super.setValueFrom(row, value);
984
                calculTarifNomenclature(model.row2index(row));
985
            }
986
 
18 ilm 987
        });
21 ilm 988
 
18 ilm 989
        // Calcul automatique du poids unitaire
990
        tableElement_ValeurMetrique1.addModificationListener(tableElementPoids);
991
        tableElement_ValeurMetrique2.addModificationListener(tableElementPoids);
992
        tableElement_ValeurMetrique3.addModificationListener(tableElementPoids);
993
        tableElementPoids.setModifier(new CellDynamicModifier() {
994
            public Object computeValueFrom(SQLRowValues row) {
995
                return new Float(ReferenceArticleSQLElement.getPoidsFromDetails(row));
996
            }
997
 
998
        });
999
        // Calcul automatique du poids total
1000
        tableElementPoids.addModificationListener(this.tableElementPoidsTotal);
61 ilm 1001
        qteU.addModificationListener(tableElementPoidsTotal);
18 ilm 1002
        this.qte.addModificationListener(this.tableElementPoidsTotal);
1003
        this.tableElementPoidsTotal.setModifier(new CellDynamicModifier() {
1004
            public Object computeValueFrom(SQLRowValues row) {
1005
                Number f = (Number) row.getObject("POIDS");
80 ilm 1006
                if (f == null) {
1007
                    f = 0;
1008
                }
18 ilm 1009
                int qte = Integer.parseInt(row.getObject("QTE").toString());
61 ilm 1010
                BigDecimal b = (row.getObject("QTE_UNITAIRE") == null) ? BigDecimal.ONE : (BigDecimal) row.getObject("QTE_UNITAIRE");
1011
                // FIXME convertir en float autrement pour éviter une valeur non valeur transposable
1012
                // avec floatValue ou passer POIDS en bigDecimal
1013
                return b.multiply(new BigDecimal(f.floatValue() * qte)).floatValue();
18 ilm 1014
            }
1015
 
1016
        });
61 ilm 1017
        uniteVente.addModificationListener(qteU);
1018
        qteU.setModifier(new CellDynamicModifier() {
1019
            public Object computeValueFrom(SQLRowValues row) {
1020
                SQLRowAccessor rowUnite = row.getForeign("ID_UNITE_VENTE");
1021
                if (rowUnite != null && !rowUnite.isUndefined() && rowUnite.getBoolean("A_LA_PIECE")) {
1022
                    return BigDecimal.ONE;
1023
                } else {
1024
                    return row.getObject("QTE_UNITAIRE");
1025
                }
1026
            }
1027
 
1028
        });
19 ilm 1029
        if (DefaultNXProps.getInstance().getBooleanValue(ARTICLE_SHOW_DEVISE, false)) {
80 ilm 1030
            if (eltUnitDevise != null) {
1031
                eltUnitDevise.addModificationListener(tableElement_PrixMetrique1_VenteHT);
1032
            }
19 ilm 1033
            tableElement_PrixMetrique1_VenteHT.setModifier(new CellDynamicModifier() {
1034
                public Object computeValueFrom(SQLRowValues row) {
1035
                    if (!row.getForeign("ID_DEVISE").isUndefined()) {
1036
                        BigDecimal t = (BigDecimal) row.getForeign("ID_DEVISE").getObject("TAUX");
67 ilm 1037
                        BigDecimal bigDecimal = (BigDecimal) row.getObject("PV_U_DEVISE");
83 ilm 1038
 
1039
                        BigDecimal result = (t.equals(BigDecimal.ZERO) ? row.getBigDecimal("PRIX_METRIQUE_VT_1") : bigDecimal.divide(t));
1040
                        result = tauxConversionLocale.multiply(result, MathContext.DECIMAL128);
1041
                        return result;
19 ilm 1042
                    }
1043
                    return row.getObject("PRIX_METRIQUE_VT_1");
1044
                }
1045
 
1046
            });
1047
        }
1048
 
18 ilm 1049
        // Calcul automatique du prix de vente unitaire HT
1050
        tableElement_ValeurMetrique1.addModificationListener(tableElement_PrixVente_HT);
1051
        tableElement_ValeurMetrique2.addModificationListener(tableElement_PrixVente_HT);
1052
        tableElement_ValeurMetrique3.addModificationListener(tableElement_PrixVente_HT);
1053
        tableElement_PrixMetrique1_VenteHT.addModificationListener(tableElement_PrixVente_HT);
1054
        tableElement_PrixVente_HT.setModifier(new CellDynamicModifier() {
1055
            public Object computeValueFrom(SQLRowValues row) {
1056
                if (row.getInt("ID_MODE_VENTE_ARTICLE") == ReferenceArticleSQLElement.A_LA_PIECE) {
67 ilm 1057
                    return row.getObject("PRIX_METRIQUE_VT_1");
18 ilm 1058
                } else {
1059
 
67 ilm 1060
                    final BigDecimal prixVTFromDetails = ReferenceArticleSQLElement.getPrixVTFromDetails(row);
1061
                    return prixVTFromDetails.setScale(tableElement_PrixVente_HT.getDecimalDigits(), RoundingMode.HALF_UP);
18 ilm 1062
                }
1063
            }
1064
        });
1065
 
1066
        // Calcul automatique du prix d'achat unitaire HT
1067
        tableElement_ValeurMetrique1.addModificationListener(this.ha);
1068
        tableElement_ValeurMetrique2.addModificationListener(this.ha);
1069
        tableElement_ValeurMetrique3.addModificationListener(this.ha);
1070
        tableElement_PrixMetrique1_AchatHT.addModificationListener(this.ha);
1071
        this.ha.setModifier(new CellDynamicModifier() {
1072
            public Object computeValueFrom(SQLRowValues row) {
1073
                if (row.getInt("ID_MODE_VENTE_ARTICLE") == ReferenceArticleSQLElement.A_LA_PIECE) {
67 ilm 1074
                    return row.getObject("PRIX_METRIQUE_HA_1");
18 ilm 1075
                } else {
1076
 
67 ilm 1077
                    final BigDecimal prixHAFromDetails = ReferenceArticleSQLElement.getPrixHAFromDetails(row);
1078
                    return prixHAFromDetails.setScale(ha.getDecimalDigits(), RoundingMode.HALF_UP);
18 ilm 1079
                }
1080
            }
1081
 
1082
        });
1083
 
1084
        this.table.readState();
1085
 
28 ilm 1086
        setColumnVisible(this.model.getColumnForField("T_PA_HT"), true);
18 ilm 1087
 
80 ilm 1088
        // Packaging
1089
        if (prefs.getBoolean(GestionArticleGlobalPreferencePanel.ITEM_PACKAGING, false)) {
1090
            setColumnVisible(this.model.getColumnForField("T_POIDS_COLIS_NET"), false);
1091
        }
1092
 
18 ilm 1093
        // Mode Gestion article avancé
21 ilm 1094
        final boolean modeAvance = DefaultNXProps.getInstance().getBooleanValue("ArticleModeVenteAvance", false);
1095
        setColumnVisible(this.model.getColumnForField("VALEUR_METRIQUE_1"), modeAvance);
1096
        setColumnVisible(this.model.getColumnForField("VALEUR_METRIQUE_2"), modeAvance);
1097
        setColumnVisible(this.model.getColumnForField("VALEUR_METRIQUE_3"), modeAvance);
1098
        setColumnVisible(this.model.getColumnForField("PV_HT"), modeAvance);
28 ilm 1099
        setColumnVisible(this.model.getColumnForField("PA_HT"), modeAvance);
21 ilm 1100
        setColumnVisible(this.model.getColumnForField("ID_MODE_VENTE_ARTICLE"), modeAvance);
18 ilm 1101
 
61 ilm 1102
        // Gestion des unités de vente
1103
        final boolean gestionUV = prefs.getBoolean(GestionArticleGlobalPreferencePanel.UNITE_VENTE, true);
1104
        setColumnVisible(this.model.getColumnForField("QTE_UNITAIRE"), gestionUV);
1105
        setColumnVisible(this.model.getColumnForField("ID_UNITE_VENTE"), gestionUV);
1106
 
1107
        setColumnVisible(this.model.getColumnForField("ID_ARTICLE"), selectArticle);
1108
        setColumnVisible(this.model.getColumnForField("CODE"), !selectArticle || (selectArticle && createAuto));
1109
        setColumnVisible(this.model.getColumnForField("NOM"), !selectArticle || (selectArticle && createAuto));
1110
 
18 ilm 1111
        // Voir le poids
21 ilm 1112
        final boolean showPoids = DefaultNXProps.getInstance().getBooleanValue("ArticleShowPoids", false);
1113
        setColumnVisible(this.model.getColumnForField("POIDS"), showPoids);
1114
        setColumnVisible(this.model.getColumnForField("T_POIDS"), showPoids);
18 ilm 1115
 
1116
        // Voir le style
61 ilm 1117
        setColumnVisible(this.model.getColumnForField("ID_STYLE"), DefaultNXProps.getInstance().getBooleanValue("ArticleShowStyle", true));
80 ilm 1118
        setColumnVisible(this.model.getColumnForField("POURCENT_FACTURABLE"), false);
18 ilm 1119
 
28 ilm 1120
 
1121
        for (String string : visibilityMap.keySet()) {
1122
            setColumnVisible(this.model.getColumnForField(string), visibilityMap.get(string));
1123
        }
1124
 
41 ilm 1125
        Map<String, Boolean> mapCustom = getCustomVisibilityMap();
1126
        if (mapCustom != null) {
1127
            for (String string : mapCustom.keySet()) {
1128
                setColumnVisible(this.model.getColumnForField(string), mapCustom.get(string));
1129
            }
1130
        }
1131
 
18 ilm 1132
        // On réécrit la configuration au cas ou les preferences aurait changé (ajout ou suppression
1133
        // du mode de vente specifique)
1134
        this.table.writeState();
1135
    }
1136
 
41 ilm 1137
    protected Map<String, Boolean> getCustomVisibilityMap() {
1138
        return null;
1139
    }
1140
 
73 ilm 1141
    protected Object tarifCompletion(SQLRowAccessor row, String field) {
19 ilm 1142
 
73 ilm 1143
        if (getTarif() != null && !getTarif().isUndefined()) {
28 ilm 1144
            Collection<? extends SQLRowAccessor> rows = row.getReferentRows(tableArticleTarif);
19 ilm 1145
 
28 ilm 1146
            SQLRowAccessor rowTarif = null;
1147
            for (SQLRowAccessor rowVals : rows) {
19 ilm 1148
                if (rowVals.getInt("ID_TARIF") == getTarif().getID()) {
1149
                    rowTarif = rowVals;
1150
                }
1151
            }
1152
 
1153
            if (rowTarif == null) {
1154
                if (!getTarif().getForeign("ID_DEVISE").isUndefined()) {
1155
                    if ((field.equalsIgnoreCase("ID_DEVISE"))) {
1156
                        return getTarif().getObject("ID_DEVISE");
1157
                    } else if ((field.equalsIgnoreCase("PV_U_DEVISE"))) {
1158
                        BigDecimal t = (BigDecimal) getTarif().getForeign("ID_DEVISE").getObject("TAUX");
1159
 
83 ilm 1160
                        BigDecimal result = row.getBigDecimal("PRIX_METRIQUE_VT_1").divide(tauxConversionLocale, MathContext.DECIMAL128);
1161
                        result = result.multiply(t);
1162
                        return result.setScale(row.getTable().getField(field).getType().getDecimalDigits(), RoundingMode.HALF_UP);
1163
 
19 ilm 1164
                    }
1165
                }
1166
                return null;
1167
            }
1168
            if (field.equalsIgnoreCase("PRIX_METRIQUE_VT_1")) {
1169
                if (rowTarif.getInt("ID_DEVISE") == SQLRow.UNDEFINED_ID)
1170
                    return rowTarif.getObject(field);
1171
                else {
28 ilm 1172
                    BigDecimal t = (BigDecimal) rowTarif.getForeign("ID_DEVISE").getObject("TAUX");
83 ilm 1173
                    BigDecimal result = rowTarif.getBigDecimal(field).divide(t, MathContext.DECIMAL128);
1174
                    result = result.multiply(tauxConversionLocale);
1175
                    return result.setScale(row.getTable().getField(field).getType().getDecimalDigits(), RoundingMode.HALF_UP);
19 ilm 1176
                }
1177
 
1178
            } else if ((field.equalsIgnoreCase("ID_DEVISE"))) {
1179
 
1180
                return rowTarif.getObject("ID_DEVISE");
1181
            }
1182
 
1183
            else if ((field.equalsIgnoreCase("PV_U_DEVISE"))) {
1184
 
1185
                return rowTarif.getObject("PRIX_METRIQUE_VT_1");
1186
 
1187
            } else if ((field.equalsIgnoreCase("ID_TAXE"))) {
1188
 
1189
                if (rowTarif.getInt("ID_TAXE") != SQLRow.UNDEFINED_ID) {
1190
                    return rowTarif.getObject("ID_TAXE");
1191
 
1192
                }
1193
            }
1194
        }
1195
        return null;
1196
    }
1197
 
1198
    @Override
1199
    public void setTarif(SQLRowAccessor rowValuesTarif, boolean ask) {
1200
        if (rowValuesTarif == null || getTarif() == null || rowValuesTarif.getID() != getTarif().getID()) {
1201
            super.setTarif(rowValuesTarif, ask);
73 ilm 1202
            if (ask && getRowValuesTable().getRowCount() > 0 && JOptionPane.showConfirmDialog(null, "Appliquer les tarifs associés au client sur les lignes déjà présentes?") == JOptionPane.YES_OPTION) {
19 ilm 1203
                int nbRows = this.table.getRowCount();
1204
                for (int i = 0; i < nbRows; i++) {
1205
                    SQLRowValues rowVals = getRowValuesTable().getRowValuesTableModel().getRowValuesAt(i);
1206
 
1207
                    // on récupére l'article qui lui correspond
1208
                    SQLRowValues rowValsArticle = new SQLRowValues(tableArticle);
1209
                    for (SQLField field : tableArticle.getFields()) {
1210
                        if (rowVals.getTable().getFieldsName().contains(field.getName())) {
1211
                            rowValsArticle.put(field.getName(), rowVals.getObject(field.getName()));
1212
                        }
1213
                    }
28 ilm 1214
 
19 ilm 1215
                    int idArticle = ReferenceArticleSQLElement.getIdForCNM(rowValsArticle, true);
1216
                    SQLRow rowArticle = tableArticle.getRow(idArticle);
73 ilm 1217
 
28 ilm 1218
                    Collection<? extends SQLRowAccessor> rows = rowArticle.getReferentRows(tableArticleTarif);
19 ilm 1219
                    boolean tarifFind = false;
1220
                    if (getTarif() != null) {
28 ilm 1221
                        for (SQLRowAccessor rowValsTarif : rows) {
19 ilm 1222
                            if (rowValsTarif.getInt("ID_TARIF") == getTarif().getID()) {
1223
                                if (rowValsTarif.getForeign("ID_DEVISE").isUndefined()) {
1224
                                    if (!rowValsTarif.getForeign("ID_TAXE").isUndefined()) {
1225
                                        getRowValuesTable().getRowValuesTableModel().putValue(rowValsTarif.getObject("ID_TAXE"), i, "ID_TAXE");
1226
                                    }
1227
                                    getRowValuesTable().getRowValuesTableModel().putValue(rowValsTarif.getObject("PRIX_METRIQUE_VT_1"), i, "PRIX_METRIQUE_VT_1");
1228
                                } else {
1229
                                    if (!rowValsTarif.getForeign("ID_TAXE").isUndefined()) {
1230
                                        getRowValuesTable().getRowValuesTableModel().putValue(rowValsTarif.getObject("ID_TAXE"), i, "ID_TAXE");
1231
                                    }
1232
                                    getRowValuesTable().getRowValuesTableModel().putValue(rowValsTarif.getObject("ID_DEVISE"), i, "ID_DEVISE");
1233
                                    getRowValuesTable().getRowValuesTableModel().putValue(tarifCompletion(rowArticle, "PV_U_DEVISE"), i, "PV_U_DEVISE");
1234
                                    getRowValuesTable().getRowValuesTableModel().putValue(tarifCompletion(rowArticle, "PRIX_METRIQUE_VT_1"), i, "PRIX_METRIQUE_VT_1");
1235
                                }
1236
                                tarifFind = true;
1237
                                break;
1238
                            }
1239
                        }
1240
                    }
1241
                    if (!tarifFind) {
1242
                        getRowValuesTable().getRowValuesTableModel().putValue(rowArticle.getObject("PRIX_METRIQUE_VT_1"), i, "PRIX_METRIQUE_VT_1");
1243
 
1244
                    }
1245
                }
1246
            }
18 ilm 1247
        }
1248
    }
1249
}