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
18 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.
18 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.config.ComptaPropsConfiguration;
93 ilm 17
import org.openconcerto.erp.core.finance.accounting.model.CurrencyConverter;
18 ilm 18
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
142 ilm 19
import org.openconcerto.erp.core.sales.pos.io.BarcodeReader;
20
import org.openconcerto.erp.core.sales.pos.ui.BarcodeListener;
18 ilm 21
import org.openconcerto.erp.core.sales.product.element.ReferenceArticleSQLElement;
94 ilm 22
import org.openconcerto.erp.core.sales.product.element.UniteVenteArticleSQLElement;
23
import org.openconcerto.erp.core.sales.product.ui.CurrencyWithSymbolRenderer;
174 ilm 24
import org.openconcerto.erp.core.sales.product.ui.DeliveredQtyRowValuesRenderer;
61 ilm 25
import org.openconcerto.erp.core.sales.product.ui.QteUnitRowValuesRenderer;
177 ilm 26
import org.openconcerto.erp.core.supplychain.stock.element.DepotStockSQLElement;
27
import org.openconcerto.erp.core.supplychain.stock.element.StockSQLElement;
18 ilm 28
import org.openconcerto.erp.preferences.DefaultNXProps;
61 ilm 29
import org.openconcerto.erp.preferences.GestionArticleGlobalPreferencePanel;
18 ilm 30
import org.openconcerto.sql.Configuration;
31
import org.openconcerto.sql.element.SQLElement;
94 ilm 32
import org.openconcerto.sql.model.FieldPath;
19 ilm 33
import org.openconcerto.sql.model.SQLRow;
34
import org.openconcerto.sql.model.SQLRowAccessor;
142 ilm 35
import org.openconcerto.sql.model.SQLRowListRSH;
18 ilm 36
import org.openconcerto.sql.model.SQLRowValues;
142 ilm 37
import org.openconcerto.sql.model.SQLSelect;
41 ilm 38
import org.openconcerto.sql.model.SQLTable;
80 ilm 39
import org.openconcerto.sql.model.UndefinedRowValuesCache;
41 ilm 40
import org.openconcerto.sql.model.Where;
94 ilm 41
import org.openconcerto.sql.model.graph.Path;
61 ilm 42
import org.openconcerto.sql.preferences.SQLPreferences;
83 ilm 43
import org.openconcerto.sql.sqlobject.ITextArticleWithCompletionCellEditor;
61 ilm 44
import org.openconcerto.sql.sqlobject.ITextWithCompletion;
177 ilm 45
import org.openconcerto.sql.view.EditFrame;
46
import org.openconcerto.sql.view.EditPanel.EditMode;
18 ilm 47
import org.openconcerto.sql.view.list.AutoCompletionManager;
48
import org.openconcerto.sql.view.list.CellDynamicModifier;
49
import org.openconcerto.sql.view.list.RowValuesTable;
50
import org.openconcerto.sql.view.list.RowValuesTableModel;
51
import org.openconcerto.sql.view.list.SQLTableElement;
65 ilm 52
import org.openconcerto.sql.view.list.ValidStateChecker;
177 ilm 53
import org.openconcerto.ui.preferences.DefaultProps;
90 ilm 54
import org.openconcerto.utils.DecimalUtils;
182 ilm 55
import org.openconcerto.utils.ExceptionHandler;
142 ilm 56
import org.openconcerto.utils.Tuple3;
94 ilm 57
import org.openconcerto.utils.i18n.TranslationManager;
18 ilm 58
 
174 ilm 59
import java.awt.Component;
132 ilm 60
import java.awt.event.ActionEvent;
177 ilm 61
import java.awt.event.ActionListener;
142 ilm 62
import java.awt.event.HierarchyEvent;
63
import java.awt.event.HierarchyListener;
64
import java.awt.event.KeyEvent;
132 ilm 65
import java.awt.event.MouseAdapter;
66
import java.awt.event.MouseEvent;
67
import java.math.BigDecimal;
68
import java.math.RoundingMode;
69
import java.util.ArrayList;
70
import java.util.Arrays;
71
import java.util.Calendar;
72
import java.util.HashMap;
73
import java.util.HashSet;
74
import java.util.List;
75
import java.util.Map;
76
import java.util.Set;
77
import java.util.Vector;
78
 
79
import javax.swing.AbstractAction;
177 ilm 80
import javax.swing.JButton;
142 ilm 81
import javax.swing.JFrame;
174 ilm 82
import javax.swing.JLabel;
132 ilm 83
import javax.swing.JOptionPane;
84
import javax.swing.JPopupMenu;
85
import javax.swing.JTable;
86
import javax.swing.SwingUtilities;
87
import javax.swing.ToolTipManager;
88
import javax.swing.event.TableModelEvent;
89
import javax.swing.event.TableModelListener;
174 ilm 90
import javax.swing.table.DefaultTableCellRenderer;
132 ilm 91
import javax.swing.table.TableCellRenderer;
92
 
18 ilm 93
public abstract class AbstractAchatArticleItemTable extends AbstractArticleItemTable {
94
 
73 ilm 95
    private AutoCompletionManager m;
96
    private AutoCompletionManager m2, m3;
97
    private AutoCompletionManager m4;
98
    private final SQLTable tableArticle = getSQLElement().getTable().getTable("ARTICLE");
99
    private SQLRowAccessor rowDevise;
100
    private boolean supplierCode;
101
 
18 ilm 102
    public AbstractAchatArticleItemTable() {
103
        super();
104
    }
105
 
94 ilm 106
    @Override
182 ilm 107
    public AutoCompletionManager getCodeCompletionManager() {
108
        return this.m;
109
    }
110
 
111
    @Override
94 ilm 112
    protected void setModel(RowValuesTableModel model) {
113
        super.setModel(model);
114
        model.addTableModelListener(new TableModelListener() {
115
 
116
            @Override
117
            public void tableChanged(TableModelEvent e) {
118
 
119
                calculTarifNomenclature();
120
 
121
            }
122
        });
123
    }
124
 
18 ilm 125
    protected void init() {
126
 
127
        final SQLElement e = getSQLElement();
132 ilm 128
        final SQLPreferences prefs = SQLPreferences.getMemCached(getSQLElement().getTable().getDBRoot());
61 ilm 129
        final boolean selectArticle = prefs.getBoolean(GestionArticleGlobalPreferencePanel.USE_CREATED_ARTICLE, false);
130
        final boolean createAuto = prefs.getBoolean(GestionArticleGlobalPreferencePanel.CREATE_ARTICLE_AUTO, true);
142 ilm 131
        final boolean showEco = prefs.getBoolean(AbstractVenteArticleItemTable.SHOW_ECO_CONTRIBUTION_COLUMNS, false);
149 ilm 132
        final boolean showDmdAchat = prefs.getBoolean(GestionArticleGlobalPreferencePanel.ACTIVE_DEMANDE_ACHAT, false);
156 ilm 133
        final boolean showDevise = prefs.getBoolean(AbstractVenteArticleItemTable.ARTICLE_SHOW_DEVISE, false);
67 ilm 134
        this.supplierCode = prefs.getBoolean(GestionArticleGlobalPreferencePanel.SUPPLIER_PRODUCT_CODE, false);
182 ilm 135
        final boolean withDeclinaison = prefs.getBoolean(GestionArticleGlobalPreferencePanel.ACTIVER_DECLINAISON, false);
61 ilm 136
 
18 ilm 137
        final List<SQLTableElement> list = new Vector<SQLTableElement>();
94 ilm 138
        final SQLTableElement eNiveau = new SQLTableElement(e.getTable().getField("NIVEAU")) {
139
            @Override
140
            public void setValueFrom(SQLRowValues row, Object value) {
141
                super.setValueFrom(row, value);
142
            }
143
        };
144
        eNiveau.setRenderer(new NiveauTableCellRender());
145
        eNiveau.setEditor(new NiveauTableCellEditor());
146
        list.add(eNiveau);
18 ilm 147
        list.add(new SQLTableElement(e.getTable().getField("ID_STYLE")));
28 ilm 148
 
149 ilm 149
        SQLTableElement dmdElt = null;
150
        if (showDmdAchat && e.getTable().contains("ID_DEMANDE_ACHAT_ELEMENT")) {
151
            dmdElt = new SQLTableElement(e.getTable().getField("ID_DEMANDE_ACHAT_ELEMENT"));
152
            list.add(dmdElt);
153
        }
154
 
174 ilm 155
        if (e.getTable().contains("ID_AFFAIRE")) {
156
            list.add(new SQLTableElement(e.getTable().getField("ID_AFFAIRE")));
157
        }
158
 
67 ilm 159
        SQLTableElement tableElementCodeFournisseur = null;
160
 
161
        if (e.getTable().contains("ID_CODE_FOURNISSEUR") && supplierCode) {
162
            tableElementCodeFournisseur = new SQLTableElement(e.getTable().getField("ID_CODE_FOURNISSEUR"), true, true, true);
163
            list.add(tableElementCodeFournisseur);
164
        }
165
 
174 ilm 166
        if (e.getTable().contains("ID_COMPTE_PCE")) {
167
            list.add(new SQLTableElement(e.getTable().getField("ID_COMPTE_PCE")));
168
        }
169
 
142 ilm 170
        SQLTableElement tableElementArticle = new SQLTableElement(e.getTable().getField("ID_ARTICLE"), true, true, true) {
180 ilm 171
 
142 ilm 172
            @Override
173
            public boolean isCellEditable(SQLRowValues vals, int rowIndex, int columnIndex) {
174
                boolean b = super.isCellEditable(vals, rowIndex, columnIndex);
175
 
180 ilm 176
                return b && !isFromTranferred(vals);
177
 
142 ilm 178
            }
180 ilm 179
 
142 ilm 180
        };
61 ilm 181
        list.add(tableElementArticle);
28 ilm 182
 
156 ilm 183
        // Article
184
        SQLTableElement tableElementDepot = new SQLTableElement(e.getTable().getField("ID_DEPOT_STOCK"), true, true, true);
185
        list.add(tableElementDepot);
186
 
182 ilm 187
        Set<String> fieldsName = e.getTable().getFieldsName();
188
        if (fieldsName.contains("ID_FAMILLE_ARTICLE")) {
28 ilm 189
            final SQLTableElement tableFamille = new SQLTableElement(e.getTable().getField("ID_FAMILLE_ARTICLE"));
190
            list.add(tableFamille);
191
        }
192
 
182 ilm 193
        if (fieldsName.contains("ID_ECO_CONTRIBUTION")) {
142 ilm 194
            this.tableElementEcoID = new SQLTableElement(e.getTable().getField("ID_ECO_CONTRIBUTION"));
195
            list.add(this.tableElementEcoID);
196
        }
197
 
182 ilm 198
        if (fieldsName.contains("INCOTERM")) {
94 ilm 199
            final SQLTableElement tableElementInco = new SQLTableElement(e.getTable().getField("INCOTERM"));
200
            tableElementInco.setEditable(false);
201
            list.add(tableElementInco);
202
        }
203
 
182 ilm 204
        if (fieldsName.contains("PREBILAN")) {
93 ilm 205
            final SQLTableElement tableElementPre = new SQLTableElement(e.getTable().getField("PREBILAN"), BigDecimal.class);
206
            tableElementPre.setRenderer(new DeviseTableCellRenderer());
28 ilm 207
            list.add(tableElementPre);
208
        }
209
 
18 ilm 210
        // Code article
94 ilm 211
        final SQLTableElement tableElementCode = new SQLTableElement(e.getTable().getField("CODE"), String.class,
182 ilm 212
                new ITextArticleWithCompletionCellEditor(e.getTable().getTable("ARTICLE"), e.getTable().getTable("ARTICLE_FOURNISSEUR"), withDeclinaison)) {
142 ilm 213
            @Override
214
            public boolean isCellEditable(SQLRowValues vals, int rowIndex, int columnIndex) {
215
                boolean b = super.isCellEditable(vals, rowIndex, columnIndex);
180 ilm 216
                return b && !isFromTranferred(vals);
142 ilm 217
 
218
            }
219
        };
18 ilm 220
        list.add(tableElementCode);
221
        // Désignation de l'article
142 ilm 222
        final SQLTableElement tableElementNom = new SQLTableElement(e.getTable().getField("NOM")) {
223
            @Override
224
            public boolean isCellEditable(SQLRowValues vals, int rowIndex, int columnIndex) {
225
                boolean b = super.isCellEditable(vals, rowIndex, columnIndex);
180 ilm 226
                return b && !isFromTranferred(vals);
142 ilm 227
 
228
            }
229
        };
18 ilm 230
        list.add(tableElementNom);
142 ilm 231
 
182 ilm 232
        List<String> fieldDecl = new ArrayList<>();
233
 
234
        if (withDeclinaison) {
235
 
236
            for (String string : fieldsName) {
237
                if (string.startsWith("ID_ARTICLE_DECLINAISON")) {
238
                    final SQLTableElement tableElementDeclinaison = new SQLTableElement(e.getTable().getField(string));
239
                    tableElementDeclinaison.setEditable(false);
240
                    fieldDecl.add(string);
241
                    list.add(tableElementDeclinaison);
242
                }
243
            }
244
        }
245
        if (fieldsName.contains("DESCRIPTIF")) {
73 ilm 246
            final SQLTableElement tableElementDesc = new SQLTableElement(e.getTable().getField("DESCRIPTIF"));
247
            list.add(tableElementDesc);
248
        }
182 ilm 249
        if (fieldsName.contains("COLORIS")) {
41 ilm 250
            final SQLTableElement tableElementColoris = new SQLTableElement(e.getTable().getField("COLORIS"));
251
            list.add(tableElementColoris);
252
        }
182 ilm 253
 
254
        if (fieldsName.contains("ID_FABRICANT")) {
255
            SQLTableElement fab = new SQLTableElement(e.getTable().getField("ID_FABRICANT"));
256
            list.add(fab);
257
        }
258
 
18 ilm 259
        // Valeur des métriques
260
        final SQLTableElement tableElement_ValeurMetrique2 = new SQLTableElement(e.getTable().getField("VALEUR_METRIQUE_2"), Float.class);
261
        list.add(tableElement_ValeurMetrique2);
262
        final SQLTableElement tableElement_ValeurMetrique3 = new SQLTableElement(e.getTable().getField("VALEUR_METRIQUE_3"), Float.class);
263
        list.add(tableElement_ValeurMetrique3);
264
        final SQLTableElement tableElement_ValeurMetrique1 = new SQLTableElement(e.getTable().getField("VALEUR_METRIQUE_1"), Float.class);
265
        list.add(tableElement_ValeurMetrique1);
266
        // Prix d'achat HT de la métrique 1
156 ilm 267
        final DeviseNumericHTConvertorCellEditor editorPAHT = new DeviseNumericHTConvertorCellEditor(e.getTable().getField("PRIX_METRIQUE_HA_1"));
268
        final SQLTableElement tableElement_PrixMetrique1_AchatHT = new SQLTableElement(e.getTable().getField("PRIX_METRIQUE_HA_1"), BigDecimal.class, editorPAHT);
94 ilm 269
        tableElement_PrixMetrique1_AchatHT.setRenderer(new CurrencyWithSymbolRenderer());
18 ilm 270
        list.add(tableElement_PrixMetrique1_AchatHT);
19 ilm 271
 
182 ilm 272
        if (fieldsName.contains("ECO_CONTRIBUTION")) {
142 ilm 273
            this.tableElementEco = new SQLTableElement(e.getTable().getField("ECO_CONTRIBUTION"));
274
            list.add(this.tableElementEco);
275
        }
276
 
19 ilm 277
        final SQLTableElement tableElement_Devise = new SQLTableElement(e.getTable().getField("ID_DEVISE"));
94 ilm 278
        tableElement_Devise.setEditable(false);
67 ilm 279
        final SQLTableElement tableElement_PA_Devise = new SQLTableElement(e.getTable().getField("PA_DEVISE"), BigDecimal.class);
94 ilm 280
        Path p = new Path(getSQLElement().getTable()).addForeignField("ID_DEVISE");
281
        tableElement_PA_Devise.setRenderer(new CurrencyWithSymbolRenderer(new FieldPath(p, "CODE")));
156 ilm 282
        if (showDevise) {
28 ilm 283
            // Devise
284
            list.add(tableElement_Devise);
19 ilm 285
 
28 ilm 286
            // Prix d'achat HT devise
287
            list.add(tableElement_PA_Devise);
288
        }
18 ilm 289
        // Mode de vente
290
        final SQLTableElement tableElement_ModeVente = new SQLTableElement(e.getTable().getField("ID_MODE_VENTE_ARTICLE"));
291
        list.add(tableElement_ModeVente);
19 ilm 292
 
18 ilm 293
        // Prix d'achat unitaire HT
67 ilm 294
        this.ha = new SQLTableElement(e.getTable().getField("PA_HT"), BigDecimal.class);
94 ilm 295
        this.ha.setRenderer(new CurrencyWithSymbolRenderer());
18 ilm 296
        list.add(this.ha);
19 ilm 297
 
61 ilm 298
        SQLTableElement qteU = new SQLTableElement(e.getTable().getField("QTE_UNITAIRE"), BigDecimal.class) {
299
            @Override
132 ilm 300
            public boolean isCellEditable(SQLRowValues vals, int rowIndex, int columnIndex) {
61 ilm 301
 
302
                SQLRowAccessor row = vals.getForeign("ID_UNITE_VENTE");
303
                if (row != null && !row.isUndefined() && row.getBoolean("A_LA_PIECE")) {
304
                    return false;
305
                } else {
132 ilm 306
                    return super.isCellEditable(vals, rowIndex, columnIndex);
61 ilm 307
                }
308
            }
309
 
310
            @Override
311
            public TableCellRenderer getTableCellRenderer() {
312
                return new QteUnitRowValuesRenderer();
313
            }
67 ilm 314
 
315
            protected Object getDefaultNullValue() {
316
                return BigDecimal.ZERO;
317
            }
61 ilm 318
        };
319
        list.add(qteU);
320
 
321
        SQLTableElement uniteVente = new SQLTableElement(e.getTable().getField("ID_UNITE_VENTE"));
322
        list.add(uniteVente);
323
 
174 ilm 324
        SQLTableElement tableCmdElt = null;
325
        if (e.getTable().contains("ID_COMMANDE_ELEMENT")) {
326
            tableCmdElt = new SQLTableElement(e.getTable().getField("ID_COMMANDE_ELEMENT"));
327
            tableCmdElt.setRenderer(new DefaultTableCellRenderer() {
328
                @Override
329
                public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
330
                    SQLRowValues rowVals = getRowValuesTable().getRowValuesTableModel().getRowValuesAt(row);
331
 
332
                    JLabel tableCellRendererComponent = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
333
                    tableCellRendererComponent.setText("");
334
                    if (rowVals.getObject("ID_COMMANDE_ELEMENT") != null && !rowVals.isForeignEmpty("ID_COMMANDE_ELEMENT")) {
335
                        SQLRowAccessor rowCmdItem = rowVals.getForeign("ID_COMMANDE_ELEMENT");
336
                        int qte = rowCmdItem.getInt("QTE");
337
                        BigDecimal qteU = rowCmdItem.getBigDecimal("QTE_UNITAIRE");
338
                        BigDecimal qteR = rowCmdItem.getBigDecimal("QTE_RECUE");
339
                        qteU = qteU.multiply(new BigDecimal(qte));
340
                        if (qteR != null) {
341
                            tableCellRendererComponent.setText(qteU.subtract(qteR).setScale(2, RoundingMode.HALF_UP).toString());
342
                        } else {
343
                            tableCellRendererComponent.setText(qteU.setScale(2, RoundingMode.HALF_UP).toString());
344
                        }
345
                    }
346
 
347
                    return tableCellRendererComponent;
348
                }
349
            });
350
            tableCmdElt.setEditable(false);
351
            list.add(tableCmdElt);
352
        }
353
 
180 ilm 354
        if (e.getTable().contains("ID_BON_RECEPTION_ELEMENT")) {
355
            SQLTableElement tableBrElt = null;
356
            tableBrElt = new SQLTableElement(e.getTable().getField("ID_BON_RECEPTION_ELEMENT"));
357
            tableBrElt.setEditable(false);
358
            list.add(tableBrElt);
359
        }
360
 
182 ilm 361
        if (fieldsName.contains("QTE_ORIGINE")) {
149 ilm 362
            final SQLTableElement tableQteO = new SQLTableElement(e.getTable().getField("QTE_ORIGINE"));
363
            tableQteO.setEditable(false);
364
            list.add(tableQteO);
365
        }
366
 
19 ilm 367
        // Quantité
368
        final SQLTableElement qteElement = new SQLTableElement(e.getTable().getField("QTE"), Integer.class) {
369
            protected Object getDefaultNullValue() {
370
                return Integer.valueOf(0);
371
            }
372
        };
182 ilm 373
        if (fieldsName.contains("QTE_ORIGINE")) {
174 ilm 374
            qteElement.setRenderer(new DeliveredQtyRowValuesRenderer(false));
375
        }
19 ilm 376
        list.add(qteElement);
18 ilm 377
        // TVA
61 ilm 378
        this.tableElementTVA = new SQLTableElement(e.getTable().getField("ID_TAXE"));
379
        list.add(this.tableElementTVA);
18 ilm 380
        // Poids piece
381
        SQLTableElement tableElementPoids = new SQLTableElement(e.getTable().getField("POIDS"), Float.class);
382
        list.add(tableElementPoids);
383
 
384
        // Poids total
385
        this.tableElementPoidsTotal = new SQLTableElement(e.getTable().getField("T_POIDS"), Float.class);
386
        list.add(this.tableElementPoidsTotal);
177 ilm 387
        // Packaging
388
        if (e.getTable().contains("POIDS_COLIS_NET") && prefs.getBoolean(GestionArticleGlobalPreferencePanel.ITEM_PACKAGING, false)) {
18 ilm 389
 
177 ilm 390
            SQLTableElement tareColis = new SQLTableElement(e.getTable().getField("TARE"), BigDecimal.class) {
391
                @Override
392
                public TableCellRenderer getTableCellRenderer() {
393
                    return new QteUnitRowValuesRenderer();
394
                }
395
 
396
            };
397
            list.add(tareColis);
398
 
399
            SQLTableElement poidsColis = new SQLTableElement(e.getTable().getField("POIDS_COLIS_NET"), BigDecimal.class) {
400
                @Override
401
                public TableCellRenderer getTableCellRenderer() {
402
                    return new QteUnitRowValuesRenderer();
403
                }
404
 
405
            };
406
            list.add(poidsColis);
407
 
408
            SQLTableElement nbColis = new SQLTableElement(e.getTable().getField("NB_COLIS"), Integer.class);
409
            list.add(nbColis);
410
 
411
            final SQLTableElement totalPoidsColis = new SQLTableElement(e.getTable().getField("T_POIDS_COLIS_NET"), BigDecimal.class) {
412
                @Override
413
                public TableCellRenderer getTableCellRenderer() {
414
                    return new QteUnitRowValuesRenderer();
415
                }
416
 
417
            };
418
            list.add(totalPoidsColis);
419
 
420
            poidsColis.addModificationListener(totalPoidsColis);
421
            nbColis.addModificationListener(totalPoidsColis);
422
            totalPoidsColis.setModifier(new CellDynamicModifier() {
423
                public Object computeValueFrom(final SQLRowValues row, SQLTableElement source) {
424
                    final BigDecimal pdsColis = row.getBigDecimal("POIDS_COLIS_NET");
425
                    final Object o3 = row.getObject("NB_COLIS");
426
 
427
                    BigDecimal pdsColisTotal = BigDecimal.ZERO;
428
 
429
                    if (pdsColis != null && o3 != null) {
430
                        int nb = (Integer) o3;
431
                        pdsColisTotal = pdsColis.multiply(new BigDecimal(nb), DecimalUtils.HIGH_PRECISION);
432
                    }
433
                    return pdsColisTotal.setScale(totalPoidsColis.getDecimalDigits(), RoundingMode.HALF_UP);
434
                }
435
            });
436
 
437
            final SQLTableElement totalPoidsBrut = new SQLTableElement(e.getTable().getField("T_POIDS_BRUT"), BigDecimal.class) {
438
                @Override
439
                public TableCellRenderer getTableCellRenderer() {
440
                    return new QteUnitRowValuesRenderer();
441
                }
442
 
443
            };
444
            list.add(totalPoidsBrut);
445
 
446
            tareColis.addModificationListener(totalPoidsBrut);
447
            poidsColis.addModificationListener(totalPoidsBrut);
448
            nbColis.addModificationListener(totalPoidsBrut);
449
            this.tableElementPoidsTotal.addModificationListener(totalPoidsBrut);
450
            totalPoidsBrut.setModifier(new CellDynamicModifier() {
451
                public Object computeValueFrom(final SQLRowValues row, SQLTableElement source) {
452
                    final BigDecimal tare = row.getBigDecimal("TARE");
453
                    final int qte = row.getInt("QTE");
454
                    final BigDecimal pdsColis = row.getBigDecimal("POIDS_COLIS_NET");
455
                    final Object o3 = row.getObject("NB_COLIS");
456
 
457
                    BigDecimal pdsBrutTotal = BigDecimal.ZERO;
458
 
459
                    if (row.getObject("T_POIDS") != null) {
460
                        pdsBrutTotal = new BigDecimal(row.getFloat("T_POIDS"));
461
                    }
462
 
463
                    if (tare != null) {
464
                        pdsBrutTotal = pdsBrutTotal.add(tare.multiply(new BigDecimal(qte)));
465
                    }
466
 
467
                    if (pdsColis != null && o3 != null) {
468
                        int nb = (Integer) o3;
469
                        pdsBrutTotal = pdsBrutTotal.add(pdsColis.multiply(new BigDecimal(nb), DecimalUtils.HIGH_PRECISION));
470
                    }
471
                    // return row.getObject("T_POIDS_COLIS_NET");
472
                    return pdsBrutTotal.setScale(totalPoidsBrut.getDecimalDigits(), RoundingMode.HALF_UP);
473
                }
474
            });
475
 
476
        }
18 ilm 477
        // Service
478
        String val = DefaultNXProps.getInstance().getStringProperty("ArticleService");
479
        Boolean b = Boolean.valueOf(val);
480
        if (b != null && b.booleanValue()) {
481
            this.service = new SQLTableElement(e.getTable().getField("SERVICE"), Boolean.class);
482
            list.add(this.service);
483
        }
484
 
156 ilm 485
        if (showDevise) {
28 ilm 486
            // Prix d'achat HT devise
67 ilm 487
            this.tableElementTotalDevise = new SQLTableElement(e.getTable().getField("PA_DEVISE_T"), BigDecimal.class);
174 ilm 488
            CurrencyWithSymbolRenderer deviseTotalRenderer = new CurrencyWithSymbolRenderer(new FieldPath(p, "CODE"));
489
            deviseTotalRenderer.setHideZeroValue(true);
490
            this.tableElementTotalDevise.setRenderer(deviseTotalRenderer);
28 ilm 491
            list.add(tableElementTotalDevise);
492
        }
67 ilm 493
 
494
        SQLTableElement tableElementRemise = null;
495
        if (e.getTable().contains("POURCENT_REMISE")) {
496
            tableElementRemise = new SQLTableElement(e.getTable().getField("POURCENT_REMISE"));
497
            list.add(tableElementRemise);
498
        }
499
 
182 ilm 500
        if (fieldsName.contains("T_ECO_CONTRIBUTION")) {
142 ilm 501
            this.tableElementEcoTotal = new SQLTableElement(e.getTable().getField("T_ECO_CONTRIBUTION"));
502
            list.add(this.tableElementEcoTotal);
503
        }
504
 
18 ilm 505
        // Total HT
67 ilm 506
        this.totalHT = new SQLTableElement(e.getTable().getField("T_PA_HT"), BigDecimal.class);
174 ilm 507
        DeviseTableCellRenderer totalRenderer = new DeviseTableCellRenderer();
508
        totalRenderer.setHideZeroValue(true);
509
        this.totalHT.setRenderer(totalRenderer);
65 ilm 510
        this.totalHT.setEditable(false);
73 ilm 511
        if (e.getTable().contains("POURCENT_REMISE") && tableElementRemise != null) {
67 ilm 512
            tableElementRemise.addModificationListener(this.totalHT);
513
        }
18 ilm 514
        list.add(this.totalHT);
67 ilm 515
        this.totalHA = this.totalHT;
18 ilm 516
        // Total TTC
67 ilm 517
        this.tableElementTotalTTC = new SQLTableElement(e.getTable().getField("T_PA_TTC"), BigDecimal.class);
174 ilm 518
        this.tableElementTotalTTC.setRenderer(totalRenderer);
18 ilm 519
        list.add(this.tableElementTotalTTC);
520
 
94 ilm 521
        this.defaultRowVals = new SQLRowValues(UndefinedRowValuesCache.getInstance().getDefaultRowValues(e.getTable()));
177 ilm 522
        this.defaultRowVals.put("ID_TAXE", TaxeCache.getCache().getFirstTaxeAchat().getID());
94 ilm 523
        this.defaultRowVals.put("CODE", "");
524
        this.defaultRowVals.put("NOM", "");
525
        this.defaultRowVals.put("QTE", 1);
526
        this.defaultRowVals.put("QTE_UNITAIRE", BigDecimal.ONE);
527
        this.defaultRowVals.put("ID_UNITE_VENTE", UniteVenteArticleSQLElement.A_LA_PIECE);
528
        this.defaultRowVals.put("ID_MODE_VENTE_ARTICLE", ReferenceArticleSQLElement.A_LA_PIECE);
177 ilm 529
 
530
        if (e.getTable().contains("ID_DEPOT_STOCK")) {
531
            DefaultProps props = DefaultNXProps.getInstance();
532
            Integer depotDefault = props.getIntProperty("DepotStockDefault", DepotStockSQLElement.DEFAULT_ID);
533
            this.defaultRowVals.put("ID_DEPOT_STOCK", depotDefault);
534
        }
535
 
180 ilm 536
        final RowValuesTableModel model = new RowValuesTableModel(e, list, e.getTable().getField("QTE"), false, this.defaultRowVals) {
177 ilm 537
            @Override
538
            public void commitData() {
539
                super.commitData(true);
540
            }
541
        };
542
 
93 ilm 543
        setModel(model);
80 ilm 544
 
93 ilm 545
        this.table = new RowValuesTable(model, getConfigurationFile());
18 ilm 546
        ToolTipManager.sharedInstance().unregisterComponent(this.table);
547
        ToolTipManager.sharedInstance().unregisterComponent(this.table.getTableHeader());
177 ilm 548
        if (getSQLElement().getTable().getName().equals("COMMANDE_ELEMENT")) {
549
            this.table.getClearCloneTableElement().add("QTE_RECUE");
550
            this.table.getClearCloneTableElement().add("RECU");
551
            this.table.getClearCloneTableElement().add("RECU_FORCED");
552
        } else if (getSQLElement().getTable().getName().equals("BON_RECEPTION_ELEMENT")) {
553
            this.table.getClearCloneTableElement().add("ID_COMMANDE_ELEMENT");
180 ilm 554
        } else if (getSQLElement().getTable().getName().equals("FACTURE_FOURNISSEUR_ELEMENT")) {
555
            if (getSQLElement().getTable().contains("ID_COMMANDE_ELEMENT")) {
556
                this.table.getClearCloneTableElement().add("ID_COMMANDE_ELEMENT");
557
            }
558
            if (getSQLElement().getTable().contains("ID_BON_RECEPTION_ELEMENT")) {
559
                this.table.getClearCloneTableElement().add("ID_BON_RECEPTION_ELEMENT");
560
            }
177 ilm 561
        }
18 ilm 562
 
94 ilm 563
        table.addMouseListener(new MouseAdapter() {
564
            @Override
565
            public void mouseReleased(MouseEvent e) {
132 ilm 566
                handlePopup(e);
567
            }
568
 
569
            @Override
570
            public void mousePressed(MouseEvent e) {
571
                handlePopup(e);
572
            }
573
 
574
            public void handlePopup(MouseEvent e) {
94 ilm 575
                final int rowindex = table.getSelectedRow();
576
                if (rowindex < 0)
577
                    return;
578
                if (e.isPopupTrigger() && e.getComponent() instanceof JTable) {
579
                    JPopupMenu popup = new JPopupMenu();
132 ilm 580
                    if (prefs.getBoolean(GestionArticleGlobalPreferencePanel.CAN_EXPAND_NOMENCLATURE_HA, true)) {
581
                        popup.add(new AbstractAction(TranslationManager.getInstance().getTranslationForItem("product.bom.expand")) {
94 ilm 582
 
132 ilm 583
                            @Override
584
                            public void actionPerformed(ActionEvent arg0) {
585
                                expandNomenclature(rowindex, m, EXPAND_TYPE.EXPAND);
586
                            }
587
                        });
588
                        popup.add(new AbstractAction(TranslationManager.getInstance().getTranslationForItem("product.bom.expose")) {
94 ilm 589
 
132 ilm 590
                            @Override
591
                            public void actionPerformed(ActionEvent arg0) {
592
                                expandNomenclature(rowindex, m, EXPAND_TYPE.VIEW_ONLY);
593
                            }
594
                        });
595
                        popup.add(new AbstractAction(TranslationManager.getInstance().getTranslationForItem("product.bom.flat")) {
94 ilm 596
 
132 ilm 597
                            @Override
598
                            public void actionPerformed(ActionEvent arg0) {
599
                                expandNomenclature(rowindex, m, EXPAND_TYPE.FLAT);
600
                            }
601
                        });
602
                    }
94 ilm 603
                    for (AbstractAction action : getAdditionnalMouseAction(rowindex)) {
604
                        popup.add(action);
605
                    }
606
 
607
                    popup.show(e.getComponent(), e.getX(), e.getY());
608
                }
609
            }
610
        });
611
 
18 ilm 612
        // Autocompletion
149 ilm 613
        if (dmdElt != null) {
614
            AutoCompletionManager dmd = new AutoCompletionManager(dmdElt, ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete().getField("DEMANDE_ACHAT_ELEMENT.ID"), this.table,
615
                    this.table.getRowValuesTableModel(), ITextWithCompletion.MODE_CONTAINS, true, true, new ValidStateChecker());
616
            dmd.fill("ID_FAMILLE_ARTICLE", "ID_FAMILLE_ARTICLE");
617
        }
28 ilm 618
        List<String> completionFields = new ArrayList<String>();
182 ilm 619
        if (fieldsName.contains("INCOTERM")) {
132 ilm 620
            completionFields.add("INCOTERM");
621
        }
182 ilm 622
        if (fieldsName.contains("ID_ECO_CONTRIBUTION")) {
142 ilm 623
            completionFields.add("ID_ECO_CONTRIBUTION");
624
        }
61 ilm 625
        completionFields.add("ID_UNITE_VENTE");
156 ilm 626
        completionFields.add("QTE_UNITAIRE");
28 ilm 627
        completionFields.add("PA_HT");
628
        completionFields.add("PV_HT");
629
        completionFields.add("POIDS");
630
        completionFields.add("ID_TAXE");
631
        completionFields.add("PRIX_METRIQUE_HA_1");
632
        completionFields.add("PRIX_METRIQUE_HA_2");
633
        completionFields.add("PRIX_METRIQUE_HA_3");
634
        completionFields.add("VALEUR_METRIQUE_1");
635
        completionFields.add("VALEUR_METRIQUE_2");
636
        completionFields.add("VALEUR_METRIQUE_3");
637
        completionFields.add("ID_MODE_VENTE_ARTICLE");
638
        completionFields.add("PRIX_METRIQUE_VT_1");
639
        completionFields.add("PRIX_METRIQUE_VT_2");
640
        completionFields.add("PRIX_METRIQUE_VT_3");
641
        completionFields.add("SERVICE");
642
        completionFields.add("ID_DEVISE");
643
        completionFields.add("PA_DEVISE");
182 ilm 644
        completionFields.addAll(fieldDecl);
645
        if (fieldsName.contains("COLORIS")) {
41 ilm 646
            completionFields.add("COLORIS");
647
        }
132 ilm 648
 
182 ilm 649
        if (fieldsName.contains("DESCRIPTIF")) {
73 ilm 650
            completionFields.add("DESCRIPTIF");
651
        }
182 ilm 652
        if (fieldsName.contains("ID_FAMILLE_ARTICLE")) {
28 ilm 653
            completionFields.add("ID_FAMILLE_ARTICLE");
654
        }
177 ilm 655
        final SQLTable sqlTableArticle = e.getTable().getTable("ARTICLE");
656
        if (getSQLElement().getTable().getFieldsName().contains("POIDS_COLIS_NET") && sqlTableArticle.getTable().getFieldsName().contains("POIDS_COLIS_NET")) {
657
            completionFields.add("POIDS_COLIS_NET");
658
        }
659
        if (getSQLElement().getTable().getFieldsName().contains("TARE") && sqlTableArticle.getTable().getFieldsName().contains("TARE")) {
660
            completionFields.add("TARE");
661
        }
662
        this.m = new AutoCompletionManager(tableElementCode, sqlTableArticle.getField("CODE"), this.table, this.table.getRowValuesTableModel()) {
19 ilm 663
            @Override
93 ilm 664
            protected Object getValueFrom(SQLRow row, String field, SQLRowAccessor rowDest) {
19 ilm 665
                Object res = tarifCompletion(row, field);
666
                if (res == null) {
182 ilm 667
                    if (field.equalsIgnoreCase("ID_CODE_FOURNISSEUR")) {
668
                        return null;
669
                    } else {
670
                        return super.getValueFrom(row, field, rowDest);
671
                    }
19 ilm 672
                } else {
673
                    return res;
674
                }
675
            }
676
        };
18 ilm 677
        m.fill("NOM", "NOM");
61 ilm 678
        m.fill("ID", "ID_ARTICLE");
177 ilm 679
        if (e.getTable().contains("ID_CODE_FOURNISSEUR") && supplierCode) {
680
            m.fill("ID_CODE_FOURNISSEUR", "ID_CODE_FOURNISSEUR");
681
        }
28 ilm 682
        for (String string : completionFields) {
683
            m.fill(string, string);
684
        }
93 ilm 685
        final Where w = new Where(sqlTableArticle.getField("OBSOLETE"), "=", Boolean.FALSE);
686
        m.setWhere(w);
687
 
41 ilm 688
        this.m2 = new AutoCompletionManager(tableElementNom, ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete().getField("ARTICLE.NOM"), this.table,
19 ilm 689
                this.table.getRowValuesTableModel()) {
690
            @Override
93 ilm 691
            protected Object getValueFrom(SQLRow row, String field, SQLRowAccessor rowDest) {
19 ilm 692
                Object res = tarifCompletion(row, field);
693
                if (res == null) {
93 ilm 694
                    return super.getValueFrom(row, field, rowDest);
19 ilm 695
                } else {
696
                    return res;
697
                }
698
            }
699
        };
18 ilm 700
        m2.fill("CODE", "CODE");
61 ilm 701
        m2.fill("ID", "ID_ARTICLE");
28 ilm 702
        for (String string : completionFields) {
703
            m2.fill(string, string);
704
        }
93 ilm 705
        m2.setWhere(w);
28 ilm 706
 
61 ilm 707
        this.m3 = new AutoCompletionManager(tableElementArticle, ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete().getField("ARTICLE.NOM"), this.table,
65 ilm 708
                this.table.getRowValuesTableModel(), ITextWithCompletion.MODE_CONTAINS, true, true, new ValidStateChecker()) {
61 ilm 709
            @Override
93 ilm 710
            protected Object getValueFrom(SQLRow row, String field, SQLRowAccessor rowDest) {
61 ilm 711
                Object res = tarifCompletion(row, field);
712
                if (res == null) {
93 ilm 713
                    return super.getValueFrom(row, field, rowDest);
61 ilm 714
                } else {
715
                    return res;
716
                }
717
            }
718
        };
719
        m3.fill("CODE", "CODE");
720
        m3.fill("NOM", "NOM");
721
        for (String string : completionFields) {
722
            m3.fill(string, string);
723
        }
93 ilm 724
        m3.setWhere(w);
28 ilm 725
 
67 ilm 726
        if (e.getTable().contains("ID_CODE_FOURNISSEUR") && supplierCode) {
727
            this.m4 = new AutoCompletionManager(tableElementCodeFournisseur, ((ComptaPropsConfiguration) Configuration.getInstance()).getSQLBaseSociete().getField("ARTICLE.NOM"), this.table,
728
                    this.table.getRowValuesTableModel(), ITextWithCompletion.MODE_CONTAINS, true, true, new ValidStateChecker()) {
729
                @Override
93 ilm 730
                protected Object getValueFrom(SQLRow row, String field, SQLRowAccessor rowDest) {
67 ilm 731
                    Object res = tarifCompletion(row, field);
732
                    if (res == null) {
93 ilm 733
                        return super.getValueFrom(row, field, rowDest);
67 ilm 734
                    } else {
735
                        return res;
736
                    }
737
                }
738
            };
177 ilm 739
            m4.fill("ID", "ID_ARTICLE");
67 ilm 740
            m4.fill("CODE", "CODE");
741
            m4.fill("NOM", "NOM");
742
            for (String string : completionFields) {
743
                m4.fill(string, string);
744
            }
745
        }
746
 
747
        tableElementCode.addModificationListener(tableElementArticle);
748
        tableElementArticle.setModifier(new CellDynamicModifier() {
749
            @Override
93 ilm 750
            public Object computeValueFrom(SQLRowValues row, SQLTableElement source) {
83 ilm 751
                try {
752
                    SQLRowAccessor foreign = row.getForeign("ID_ARTICLE");
753
                    if (foreign != null && !foreign.isUndefined() && foreign.getObject("CODE") != null && foreign.getString("CODE").equals(row.getString("CODE"))) {
754
                        return foreign.getID();
755
                    } else {
756
                        return tableArticle.getUndefinedID();
757
                    }
758
                } catch (Exception e) {
67 ilm 759
                    return tableArticle.getUndefinedID();
760
                }
761
            }
762
        });
763
 
142 ilm 764
        // ECO Contribution
765
        if (this.tableElementEco != null && this.tableElementEcoTotal != null && this.tableElementEcoID != null) {
766
            qteElement.addModificationListener(this.tableElementEcoTotal);
767
            this.tableElementEco.addModificationListener(this.tableElementEcoTotal);
768
            this.tableElementEcoTotal.setModifier(new CellDynamicModifier() {
769
                public Object computeValueFrom(final SQLRowValues row, SQLTableElement source) {
770
 
771
                    int qte = Integer.parseInt(row.getObject("QTE").toString());
772
                    BigDecimal f = (row.getObject("ECO_CONTRIBUTION") == null) ? BigDecimal.ZERO : (BigDecimal) row.getObject("ECO_CONTRIBUTION");
773
                    return f.multiply(new BigDecimal(qte));
774
                }
775
 
776
            });
777
            this.tableElementEcoID.addModificationListener(this.tableElementEco);
778
            this.tableElementEco.setModifier(new CellDynamicModifier() {
779
                public Object computeValueFrom(final SQLRowValues row, SQLTableElement source) {
780
 
781
                    if (source.equals(tableElementEcoID)) {
782
                        return row.getForeign("ID_ECO_CONTRIBUTION").getBigDecimal("TAUX");
783
                    } else {
784
                        return row.getObject("ECO_CONTRIBUTION");
785
                    }
786
                }
787
            });
788
        }
789
 
18 ilm 790
        // Calcul automatique du total HT
791
        qteElement.addModificationListener(this.totalHT);
61 ilm 792
        qteU.addModificationListener(this.totalHT);
18 ilm 793
        this.ha.addModificationListener(this.totalHT);
794
        this.totalHT.setModifier(new CellDynamicModifier() {
93 ilm 795
            public Object computeValueFrom(final SQLRowValues row, SQLTableElement source) {
18 ilm 796
 
797
                int qte = Integer.parseInt(row.getObject("QTE").toString());
83 ilm 798
                BigDecimal f = (row.getObject("PA_HT") == null) ? BigDecimal.ZERO : (BigDecimal) row.getObject("PA_HT");
61 ilm 799
                BigDecimal b = (row.getObject("QTE_UNITAIRE") == null) ? BigDecimal.ONE : (BigDecimal) row.getObject("QTE_UNITAIRE");
90 ilm 800
                BigDecimal r = b.multiply(f.multiply(BigDecimal.valueOf(qte)), DecimalUtils.HIGH_PRECISION).setScale(totalHT.getDecimalDigits(), BigDecimal.ROUND_HALF_UP);
67 ilm 801
 
802
                if (row.getTable().contains("POURCENT_REMISE")) {
803
                    final Object o2 = row.getObject("POURCENT_REMISE");
804
 
805
                    BigDecimal lremise = (o2 == null) ? BigDecimal.ZERO : ((BigDecimal) o2);
806
                    if (lremise.compareTo(BigDecimal.ZERO) >= 0 && lremise.compareTo(BigDecimal.valueOf(100)) < 0) {
807
 
808
                        r = r.multiply(new BigDecimal(100).subtract(lremise).movePointLeft(2)).setScale(totalHT.getDecimalDigits(), BigDecimal.ROUND_HALF_UP);
809
                    }
810
                }
811
 
812
                return r;
18 ilm 813
            }
814
 
815
        });
156 ilm 816
        if (showDevise) {
93 ilm 817
 
818
            if (tableElement_PA_Devise != null) {
819
                tableElement_PA_Devise.addModificationListener(tableElement_PrixMetrique1_AchatHT);
820
            }
821
 
822
            if (tableElement_PA_Devise != null) {
823
                tableElement_PrixMetrique1_AchatHT.addModificationListener(tableElement_PA_Devise);
824
 
825
                tableElement_PA_Devise.setModifier(new CellDynamicModifier() {
826
                    public Object computeValueFrom(SQLRowValues row, SQLTableElement source) {
827
                        if (source != null && source.getField().getName().equals("PA_DEVISE")) {
828
                            return row.getObject("PA_DEVISE");
829
                        } else {
182 ilm 830
                            if (row.contains("ID_DEVISE") && !row.isForeignEmpty("ID_DEVISE")) {
93 ilm 831
                                String devCode = row.getForeign("ID_DEVISE").getString("CODE");
832
                                BigDecimal bigDecimal = (BigDecimal) row.getObject("PRIX_METRIQUE_HA_1");
833
 
834
                                CurrencyConverter c = new CurrencyConverter();
94 ilm 835
                                BigDecimal result = convert(bigDecimal, devCode, true);
93 ilm 836
                                if (result == null) {
837
                                    JOptionPane.showMessageDialog(AbstractAchatArticleItemTable.this, "Unable to convert " + bigDecimal + " from " + c.getCompanyCurrencyCode() + " to " + devCode);
838
                                    return BigDecimal.ZERO;
839
                                }
840
                                return result;
841
                            } else if (source != null && source.getField().getName().equalsIgnoreCase("PRIX_METRIQUE_HA_1")) {
842
                                return row.getObject("PRIX_METRIQUE_HA_1");
843
                            }
844
                            return row.getObject("PA_DEVISE");
845
                        }
846
                    }
847
 
848
                });
849
            }
850
 
28 ilm 851
            qteElement.addModificationListener(this.tableElementTotalDevise);
61 ilm 852
            qteU.addModificationListener(this.tableElementTotalDevise);
28 ilm 853
            tableElement_PA_Devise.addModificationListener(this.tableElementTotalDevise);
73 ilm 854
            if (e.getTable().contains("POURCENT_REMISE") && tableElementRemise != null) {
67 ilm 855
                tableElementRemise.addModificationListener(this.tableElementTotalDevise);
856
            }
28 ilm 857
            this.tableElementTotalDevise.setModifier(new CellDynamicModifier() {
93 ilm 858
                public Object computeValueFrom(final SQLRowValues row, SQLTableElement source) {
28 ilm 859
                    int qte = Integer.parseInt(row.getObject("QTE").toString());
67 ilm 860
                    BigDecimal f = (BigDecimal) row.getObject("PA_DEVISE");
61 ilm 861
                    BigDecimal b = (row.getObject("QTE_UNITAIRE") == null) ? BigDecimal.ONE : (BigDecimal) row.getObject("QTE_UNITAIRE");
90 ilm 862
                    BigDecimal r = b.multiply(f.multiply(BigDecimal.valueOf(qte)), DecimalUtils.HIGH_PRECISION).setScale(tableElementTotalDevise.getDecimalDigits(), BigDecimal.ROUND_HALF_UP);
67 ilm 863
 
864
                    if (row.getTable().contains("POURCENT_REMISE")) {
865
                        final Object o2 = row.getObject("POURCENT_REMISE");
866
                        BigDecimal lremise = (o2 == null) ? BigDecimal.ZERO : ((BigDecimal) o2);
867
                        if (lremise.compareTo(BigDecimal.ZERO) >= 0 && lremise.compareTo(BigDecimal.valueOf(100)) < 0) {
868
 
869
                            r = r.multiply(new BigDecimal(100).subtract(lremise).movePointLeft(2)).setScale(tableElementTotalDevise.getDecimalDigits(), BigDecimal.ROUND_HALF_UP);
870
                        }
871
                    }
61 ilm 872
                    return r;
28 ilm 873
                }
19 ilm 874
 
28 ilm 875
            });
876
        }
18 ilm 877
        // Calcul automatique du total TTC
878
        qteElement.addModificationListener(this.tableElementTotalTTC);
61 ilm 879
        qteU.addModificationListener(this.tableElementTotalTTC);
18 ilm 880
        this.ha.addModificationListener(this.tableElementTotalTTC);
61 ilm 881
        this.tableElementTVA.addModificationListener(this.tableElementTotalTTC);
18 ilm 882
        this.tableElementTotalTTC.setModifier(new CellDynamicModifier() {
883
            @Override
93 ilm 884
            public Object computeValueFrom(SQLRowValues row, SQLTableElement source) {
18 ilm 885
                int qte = Integer.parseInt(row.getObject("QTE").toString());
67 ilm 886
                BigDecimal f = (BigDecimal) row.getObject("PA_HT");
18 ilm 887
                int idTaux = Integer.parseInt(row.getObject("ID_TAXE").toString());
177 ilm 888
                Float resultTaux = TaxeCache.getCache().getTauxFromId(idTaux);
889
                if (resultTaux == null) {
890
                    SQLRow rowTax = TaxeCache.getCache().getFirstTaxe();
891
                    row.put("ID_TAXE", rowTax.getID());
892
                    resultTaux = rowTax.getFloat("TAUX");
18 ilm 893
                }
156 ilm 894
                editorPAHT.setTaxe(resultTaux);
61 ilm 895
                BigDecimal b = (row.getObject("QTE_UNITAIRE") == null) ? BigDecimal.ONE : (BigDecimal) row.getObject("QTE_UNITAIRE");
90 ilm 896
                BigDecimal r = b.multiply(f.multiply(BigDecimal.valueOf(qte), DecimalUtils.HIGH_PRECISION), DecimalUtils.HIGH_PRECISION).setScale(tableElementTotalTTC.getDecimalDigits(),
67 ilm 897
                        BigDecimal.ROUND_HALF_UP);
73 ilm 898
                float taux = (resultTaux == null) ? 0.0F : resultTaux.floatValue();
67 ilm 899
 
900
                BigDecimal total = r.multiply(BigDecimal.ONE.add(new BigDecimal(taux / 100f))).setScale(tableElementTotalTTC.getDecimalDigits(), RoundingMode.HALF_UP);
61 ilm 901
                return total;
18 ilm 902
            }
903
 
904
        });
905
 
906
        this.table.readState();
907
 
908
        // Mode Gestion article avancé
909
        String valModeAvanceVt = DefaultNXProps.getInstance().getStringProperty("ArticleModeVenteAvance");
910
        Boolean bModeAvance = Boolean.valueOf(valModeAvanceVt);
28 ilm 911
        boolean view = !(bModeAvance != null && !bModeAvance.booleanValue());
93 ilm 912
        setColumnVisible(model.getColumnForField("VALEUR_METRIQUE_1"), view);
913
        setColumnVisible(model.getColumnForField("VALEUR_METRIQUE_2"), view);
914
        setColumnVisible(model.getColumnForField("VALEUR_METRIQUE_3"), view);
915
        setColumnVisible(model.getColumnForField("PRIX_METRIQUE_VT_1"), view);
916
        setColumnVisible(model.getColumnForField("ID_MODE_VENTE_ARTICLE"), view);
917
        setColumnVisible(model.getColumnForField("PA_HT"), view);
18 ilm 918
 
142 ilm 919
        if (e.getTable().contains("ID_COMMANDE_ELEMENT")) {
920
            setColumnVisible(model.getColumnForField("ID_COMMANDE_ELEMENT"), false);
921
        }
922
 
180 ilm 923
        if (e.getTable().contains("ID_BON_RECEPTION_ELEMENT")) {
924
            setColumnVisible(model.getColumnForField("ID_BON_RECEPTION_ELEMENT"), false);
925
        }
926
 
61 ilm 927
        // Gestion des unités de vente
928
        final boolean gestionUV = prefs.getBoolean(GestionArticleGlobalPreferencePanel.UNITE_VENTE, true);
93 ilm 929
        setColumnVisible(model.getColumnForField("QTE_UNITAIRE"), gestionUV);
930
        setColumnVisible(model.getColumnForField("ID_UNITE_VENTE"), gestionUV);
61 ilm 931
 
93 ilm 932
        setColumnVisible(model.getColumnForField("ID_STYLE"), DefaultNXProps.getInstance().getBooleanValue("ArticleShowStyle", true));
61 ilm 933
 
142 ilm 934
        if (this.tableElementEco != null && this.tableElementEcoTotal != null && this.tableElementEcoID != null) {
935
            setColumnVisible(model.getColumnForField("ID_ECO_CONTRIBUTION"), showEco);
936
            setColumnVisible(model.getColumnForField("ECO_CONTRIBUTION"), showEco);
937
            setColumnVisible(model.getColumnForField("T_ECO_CONTRIBUTION"), showEco);
938
        }
939
 
93 ilm 940
        setColumnVisible(model.getColumnForField("ID_ARTICLE"), selectArticle);
941
        setColumnVisible(model.getColumnForField("CODE"), !selectArticle || (selectArticle && createAuto));
942
        setColumnVisible(model.getColumnForField("NOM"), !selectArticle || (selectArticle && createAuto));
61 ilm 943
 
156 ilm 944
        setColumnVisible(model.getColumnForField("ID_DEPOT_STOCK"), prefs.getBoolean(GestionArticleGlobalPreferencePanel.STOCK_MULTI_DEPOT, false));
945
 
177 ilm 946
        setColumnVisible(model.getColumnForField("T_POIDS_COLIS_NET"), false);
947
        setColumnVisible(model.getColumnForField("T_POIDS_BRUT"), false);
948
 
18 ilm 949
        // Calcul automatique du poids unitaire
950
        tableElement_ValeurMetrique1.addModificationListener(tableElementPoids);
951
        tableElement_ValeurMetrique2.addModificationListener(tableElementPoids);
952
        tableElement_ValeurMetrique3.addModificationListener(tableElementPoids);
953
        tableElementPoids.setModifier(new CellDynamicModifier() {
93 ilm 954
            public Object computeValueFrom(SQLRowValues row, SQLTableElement source) {
18 ilm 955
                return new Float(ReferenceArticleSQLElement.getPoidsFromDetails(row));
956
            }
957
 
958
        });
959
        // Calcul automatique du poids total
960
        tableElementPoids.addModificationListener(this.tableElementPoidsTotal);
961
        qteElement.addModificationListener(this.tableElementPoidsTotal);
61 ilm 962
        qteU.addModificationListener(this.tableElementPoidsTotal);
18 ilm 963
        this.tableElementPoidsTotal.setModifier(new CellDynamicModifier() {
93 ilm 964
            public Object computeValueFrom(SQLRowValues row, SQLTableElement source) {
73 ilm 965
 
65 ilm 966
                Number f = (row.getObject("POIDS") == null) ? 0 : (Number) row.getObject("POIDS");
18 ilm 967
                int qte = Integer.parseInt(row.getObject("QTE").toString());
61 ilm 968
 
969
                BigDecimal b = (row.getObject("QTE_UNITAIRE") == null) ? BigDecimal.ONE : (BigDecimal) row.getObject("QTE_UNITAIRE");
970
                // FIXME convertir en float autrement pour éviter une valeur non transposable
971
                // avec floatValue ou passer POIDS en bigDecimal
972
                return b.multiply(new BigDecimal(f.floatValue() * qte)).floatValue();
18 ilm 973
            }
974
 
975
        });
976
 
93 ilm 977
        tableElement_PrixMetrique1_AchatHT.setModifier(new CellDynamicModifier() {
978
            public Object computeValueFrom(SQLRowValues row, SQLTableElement source) {
979
                if (source != null && source.getField().getName().equals("PRIX_METRIQUE_HA_1")) {
980
                    return row.getObject("PRIX_METRIQUE_HA_1");
981
                } else {
982
                    if (source != null && source.getField().getName().equals("PA_DEVISE")) {
182 ilm 983
                        if (row.contains("ID_DEVISE") && !row.isForeignEmpty("ID_DEVISE")) {
93 ilm 984
                            String devCode = row.getForeign("ID_DEVISE").getString("CODE");
985
                            BigDecimal bigDecimal = (BigDecimal) row.getObject("PA_DEVISE");
986
 
94 ilm 987
                            return convert(bigDecimal, devCode, false);
93 ilm 988
                        } else {
989
                            return row.getObject("PRIX_METRIQUE_HA_1");
990
                        }
991
                    }
992
                    return row.getObject("PRIX_METRIQUE_HA_1");
993
                }
994
            }
995
 
996
        });
997
 
18 ilm 998
        // Calcul automatique du prix d'achat unitaire HT
999
        tableElement_ValeurMetrique1.addModificationListener(this.ha);
1000
        tableElement_ValeurMetrique2.addModificationListener(this.ha);
1001
        tableElement_ValeurMetrique3.addModificationListener(this.ha);
1002
        tableElement_PrixMetrique1_AchatHT.addModificationListener(this.ha);
1003
        this.ha.setModifier(new CellDynamicModifier() {
93 ilm 1004
            public Object computeValueFrom(SQLRowValues row, SQLTableElement source) {
18 ilm 1005
 
93 ilm 1006
                if (row.isForeignEmpty("ID_MODE_VENTE_ARTICLE") || row.getInt("ID_MODE_VENTE_ARTICLE") == ReferenceArticleSQLElement.A_LA_PIECE) {
67 ilm 1007
                    return row.getObject("PRIX_METRIQUE_HA_1");
18 ilm 1008
                } else {
1009
 
67 ilm 1010
                    final BigDecimal prixHAFromDetails = ReferenceArticleSQLElement.getPrixHAFromDetails(row);
1011
                    return prixHAFromDetails.setScale(ha.getDecimalDigits(), RoundingMode.HALF_UP);
18 ilm 1012
                }
1013
 
1014
            }
1015
 
1016
        });
1017
 
61 ilm 1018
        uniteVente.addModificationListener(qteU);
1019
        qteU.setModifier(new CellDynamicModifier() {
93 ilm 1020
            public Object computeValueFrom(SQLRowValues row, SQLTableElement source) {
61 ilm 1021
                SQLRowAccessor rowUnite = row.getForeign("ID_UNITE_VENTE");
1022
                if (rowUnite != null && !rowUnite.isUndefined() && rowUnite.getBoolean("A_LA_PIECE")) {
1023
                    return BigDecimal.ONE;
1024
                } else {
1025
                    return row.getObject("QTE_UNITAIRE");
1026
                }
1027
            }
1028
 
1029
        });
132 ilm 1030
        // La devise est renseignée globalement dans la commande et est reportée automatiquement sur
1031
        // les lignes
1032
        setColumnVisible(model.getColumnIndexForElement(tableElement_Devise), false);
28 ilm 1033
        for (String string : visibilityMap.keySet()) {
93 ilm 1034
            setColumnVisible(model.getColumnForField(string), visibilityMap.get(string));
28 ilm 1035
        }
1036
 
142 ilm 1037
        // Barcode reader
1038
        final BarcodeReader barcodeReader = ComptaPropsConfiguration.getInstanceCompta().getBarcodeReader();
1039
        if (barcodeReader != null) {
1040
 
1041
            final BarcodeListener l = new BarcodeListener() {
1042
 
1043
                @Override
1044
                public void keyReceived(KeyEvent ee) {
1045
                    // TODO Auto-generated method stub
1046
                }
1047
 
1048
                @Override
1049
                public void barcodeRead(String code) {
1050
                    if (((JFrame) SwingUtilities.getRoot(getRowValuesTable())).isActive()) {
1051
                        final SQLSelect selArticle = new SQLSelect();
1052
                        final SQLTable tableArticle = getSQLElement().getForeignElement("ID_ARTICLE").getTable();
1053
                        selArticle.addSelectStar(tableArticle);
1054
                        Where w = new Where(tableArticle.getField("OBSOLETE"), "=", Boolean.FALSE);
1055
                        w = w.and(new Where(tableArticle.getField("CODE_BARRE"), "=", code));
1056
                        selArticle.setWhere(w);
1057
                        List<SQLRow> l2 = SQLRowListRSH.execute(selArticle);
1058
                        if (l2.size() > 0) {
1059
                            System.err.println("ARTICLE " + l2.get(0).getString("NOM"));
1060
                            Tuple3<Double, String, String> art = Tuple3.create(1.0D, l2.get(0).getString("CODE"), l2.get(0).getString("NOM"));
1061
                            List<Tuple3<Double, String, String>> l = new ArrayList<Tuple3<Double, String, String>>();
1062
                            l.add(art);
1063
                            insertFromDrop(l, m);
1064
                        } else {
1065
                            System.err.println("ARTICLE NOT FOUND !");
1066
                        }
1067
                    }
1068
 
1069
                }
1070
            };
1071
            getRowValuesTable().addHierarchyListener(new HierarchyListener() {
1072
                public void hierarchyChanged(HierarchyEvent e) {
1073
                    if ((e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0)
1074
                        if (getRowValuesTable().isDisplayable()) {
1075
                            barcodeReader.addBarcodeListener(l);
1076
                        } else {
1077
                            barcodeReader.removeBarcodeListener(l);
1078
                        }
1079
                }
1080
            });
1081
 
1082
        }
1083
 
19 ilm 1084
        // On réécrit la configuration au cas ou les preferences aurait changé
18 ilm 1085
        this.table.writeState();
177 ilm 1086
 
1087
        if (this.table.getRowValuesTableModel().getColumnForField("ID_DEPOT_STOCK") >= 0 && this.table.getRowValuesTableModel().getColumnForField("ID_ARTICLE") >= 0) {
1088
            if (this.buttons == null) {
1089
                this.buttons = new ArrayList<>();
1090
            }
1091
 
1092
            JButton buttonStock = new JButton("Consulter le stock");
1093
            buttonStock.addActionListener(new ActionListener() {
1094
                public void actionPerformed(ActionEvent event) {
182 ilm 1095
                    try {
1096
                        SQLRowValues rowValsSel = table.getSelectedRowValues();
1097
                        if (rowValsSel != null) {
1098
                            SQLRowAccessor foreignArt = rowValsSel.getForeign("ID_ARTICLE");
1099
                            if (foreignArt != null && !foreignArt.isUndefined()) {
1100
                                SQLRowAccessor rowValsStock = StockSQLElement.getStock(rowValsSel);
1101
                                if (rowValsStock != null && !rowValsStock.isUndefined()) {
1102
                                    EditFrame frame = new EditFrame(table.getRowValuesTableModel().getSQLElement().getDirectory().getElement("STOCK"), EditMode.READONLY);
1103
                                    frame.selectionId(rowValsStock.getID());
1104
                                    frame.setVisible(true);
1105
                                }
177 ilm 1106
                            }
1107
                        }
182 ilm 1108
                    } catch (Exception e) {
1109
                        ExceptionHandler.handle("Erreur d'accès au stock", e);
177 ilm 1110
                    }
1111
                }
1112
            });
1113
 
1114
            this.buttons.add(buttonStock);
1115
 
1116
        }
18 ilm 1117
    }
1118
 
28 ilm 1119
    private static Map<String, Boolean> visibilityMap = new HashMap<String, Boolean>();
1120
 
1121
    public static Map<String, Boolean> getVisibilityMap() {
1122
        return visibilityMap;
1123
    }
1124
 
132 ilm 1125
    private String incoterm = "";
1126
 
1127
    public void setIncoterms(String incoterm) {
1128
        if (incoterm == null) {
1129
            incoterm = "";
1130
        }
1131
        this.incoterm = incoterm;
1132
    }
1133
 
1134
    private SQLRow rowFournisseur = null;
1135
 
67 ilm 1136
    public void setFournisseur(SQLRow rowFournisseur) {
132 ilm 1137
        this.rowFournisseur = rowFournisseur;
67 ilm 1138
        if (getSQLElement().getTable().contains("ID_CODE_FOURNISSEUR") && this.supplierCode) {
1139
 
1140
            if (rowFournisseur != null && !rowFournisseur.isUndefined()) {
1141
                Where w = new Where(getSQLElement().getTable().getTable("CODE_FOURNISSEUR").getField("ID_FOURNISSEUR"), "=", rowFournisseur.getID());
1142
                this.m4.setWhere(w);
1143
            } else {
1144
                this.m4.setWhere(null);
1145
            }
1146
        }
1147
    }
1148
 
93 ilm 1149
    private BigDecimal getPrice(final SQLRowAccessor r, List<String> list) {
1150
        BigDecimal result = r.getBigDecimal(list.get(0));
1151
 
1152
        for (int i = 1; i < list.size(); i++) {
1153
            BigDecimal m0 = r.getBigDecimal(list.get(i));
1154
            if (m0 != null && m0.floatValue() > 0) {
1155
                result = result.divide(m0, 2, RoundingMode.HALF_UP);
1156
            }
1157
        }
1158
        return result;
1159
    }
1160
 
149 ilm 1161
    public Object tarifCompletion(SQLRow row, String field) {
132 ilm 1162
        final SQLTable tTarifFournisseur = this.getSQLElement().getTable().getDBRoot().getTable("ARTICLE_TARIF_FOURNISSEUR");
94 ilm 1163
 
177 ilm 1164
        if (row != null && !row.isUndefined() && (field.equalsIgnoreCase("ID_CODE_FOURNISSEUR")) && this.rowFournisseur != null && !this.rowFournisseur.isUndefined()) {
1165
            final SQLTable foreignTableCodeF = getSQLElement().getTable().getForeignTable("ID_CODE_FOURNISSEUR");
1166
            List<SQLRow> resultCode = row.getReferentRows(foreignTableCodeF);
1167
            for (SQLRow sqlRow : resultCode) {
1168
                if (sqlRow.getForeignID("ID_FOURNISSEUR") == this.rowFournisseur.getID()) {
1169
                    return sqlRow.getID();
1170
                }
1171
 
1172
            }
182 ilm 1173
            return foreignTableCodeF.getUndefinedIDNumber();
177 ilm 1174
        }
1175
        if (field.equalsIgnoreCase("ID_CODE_FOURNISSEUR")) {
1176
            final SQLTable foreignTableCodeF = getSQLElement().getTable().getForeignTable("ID_CODE_FOURNISSEUR");
182 ilm 1177
            return foreignTableCodeF.getUndefinedIDNumber();
177 ilm 1178
        }
1179
 
174 ilm 1180
        if (row != null && !row.isUndefined() && (field.equalsIgnoreCase("PRIX_METRIQUE_HA_1") || field.equalsIgnoreCase("PA_HT")) && tTarifFournisseur != null) {
132 ilm 1181
            List<String> incoTerms;
1182
 
1183
            if (this.incoterm != null && this.incoterm.equalsIgnoreCase("CPT")) {
1184
                incoTerms = Arrays.asList("PRIX_ACHAT", "COEF_TRANSPORT_PORT");
1185
            } else if (this.incoterm != null && this.incoterm.equalsIgnoreCase("DDP")) {
1186
                incoTerms = Arrays.asList("PRIX_ACHAT", "COEF_TRANSPORT_PORT", "COEF_TAXE_D");
1187
            } else {
1188
                incoTerms = Arrays.asList("PRIX_ACHAT");
1189
            }
93 ilm 1190
            List<SQLRow> rows = row.getReferentRows(tTarifFournisseur);
177 ilm 1191
            if (row.getBoolean("AUTO_PRIX_ACHAT_NOMENCLATURE") && row.getTable().getDBRoot().contains("ARTICLE_PRIX_REVIENT")) {
19 ilm 1192
 
132 ilm 1193
                List<SQLRow> rowsElt = row.getReferentRows(row.getTable().getTable("ARTICLE_ELEMENT").getField("ID_ARTICLE_PARENT"));
1194
                BigDecimal price = BigDecimal.ZERO;
1195
                final Set<String> tarifNotFound = new HashSet<String>();
1196
                for (SQLRow sqlRow : rowsElt) {
1197
                    List<SQLRow> rowsT = sqlRow.getForeign("ID_ARTICLE").getReferentRows(tTarifFournisseur);
94 ilm 1198
 
132 ilm 1199
                    boolean priceFound = false;
1200
                    boolean tarifFound = false;
1201
                    if (rowsT.size() > 0) {
1202
                        BigDecimal min = BigDecimal.ZERO;
1203
 
174 ilm 1204
                        BigDecimal defaultPrice = sqlRow.getForeign("ID_ARTICLE").getBigDecimal("PRIX_METRIQUE_HA_1");
132 ilm 1205
                        Calendar c = null;
1206
                        for (SQLRow sqlRowT : rowsT) {
1207
                            if (this.rowFournisseur != null && this.rowFournisseur.getID() == sqlRowT.getForeignID("ID_FOURNISSEUR")) {
1208
                                BigDecimal priceT = getPrice(sqlRowT, incoTerms);
1209
                                defaultPrice = priceT;
1210
                                final Calendar datePrice = sqlRowT.getDate("DATE_PRIX");
142 ilm 1211
                                datePrice.set(Calendar.HOUR, 0);
1212
                                datePrice.set(Calendar.MINUTE, 0);
1213
                                datePrice.set(Calendar.SECOND, 0);
1214
                                datePrice.set(Calendar.MILLISECOND, 0);
132 ilm 1215
                                if (datePrice == null || (this.getDateDevise() != null && !this.getDateDevise().before(datePrice.getTime()))) {
1216
                                    if (c == null || c.before(datePrice)) {
1217
 
1218
                                        min = priceT;
1219
                                        c = datePrice;
1220
                                        priceFound = true;
1221
                                    } else if (c != null) {
1222
                                        defaultPrice = priceT;
1223
                                    }
1224
                                }
1225
                                tarifFound = true;
1226
                            }
1227
                        }
1228
 
1229
                        if (priceFound) {
1230
                            price = price.add(min.multiply(sqlRow.getBigDecimal("QTE_UNITAIRE").multiply(new BigDecimal(sqlRow.getInt("QTE"), DecimalUtils.HIGH_PRECISION))));
1231
                        } else {
1232
                            price = price.add(defaultPrice.multiply(sqlRow.getBigDecimal("QTE_UNITAIRE").multiply(new BigDecimal(sqlRow.getInt("QTE"), DecimalUtils.HIGH_PRECISION))));
1233
                        }
1234
                    }
1235
                    if (!tarifFound) {
1236
                        tarifNotFound.add(sqlRow.getForeign("ID_ARTICLE").getString("CODE"));
1237
                    }
93 ilm 1238
                }
132 ilm 1239
                if (!tarifNotFound.isEmpty()) {
1240
                    SwingUtilities.invokeLater(new Runnable() {
93 ilm 1241
 
132 ilm 1242
                        @Override
1243
                        public void run() {
1244
                            JOptionPane.showMessageDialog(AbstractAchatArticleItemTable.this.table,
1245
                                    "Attention, impossible de calculer le tarif.\nLes articles suivants n'ont pas de tarif associé :\n" + tarifNotFound);
1246
                        }
1247
                    });
1248
                }
1249
                return price;
1250
            } else if (!rows.isEmpty()) {
174 ilm 1251
 
1252
                BigDecimal min = row.getBigDecimal("PRIX_METRIQUE_HA_1");
1253
 
132 ilm 1254
                Calendar c = null;
93 ilm 1255
                for (SQLRow sqlRow : rows) {
132 ilm 1256
                    if (this.rowFournisseur != null && this.rowFournisseur.getID() == sqlRow.getForeignID("ID_FOURNISSEUR")) {
1257
                        BigDecimal price = getPrice(sqlRow, incoTerms);
1258
                        final Calendar datePrice = sqlRow.getDate("DATE_PRIX");
1259
                        if (datePrice == null || (this.getDateDevise() != null && !this.getDateDevise().before(datePrice.getTime()))) {
1260
                            if (c == null || c.before(datePrice)) {
1261
                                min = price;
1262
                                c = datePrice;
1263
                            }
1264
                        }
93 ilm 1265
                    }
1266
                }
94 ilm 1267
                return min.setScale(2, RoundingMode.HALF_UP);
93 ilm 1268
            }
1269
        }
94 ilm 1270
        if (field.equalsIgnoreCase("INCOTERM")) {
132 ilm 1271
            // if (tTarifFournisseur != null) {
1272
            // List<SQLRow> rows = row.getReferentRows(tTarifFournisseur);
1273
            // if (!rows.isEmpty()) {
1274
            // final SQLRow sqlRow0 = rows.get(0);
1275
            // return sqlRow0.getString("CONDITIONS");
1276
            // }
1277
            // }
1278
            return this.incoterm;
94 ilm 1279
        }
93 ilm 1280
 
19 ilm 1281
        if (getDevise() != null && !getDevise().isUndefined()) {
1282
            if ((field.equalsIgnoreCase("ID_DEVISE") || field.equalsIgnoreCase("ID_DEVISE_HA"))) {
1283
                return getDevise().getID();
1284
            } else if ((field.equalsIgnoreCase("PA_DEVISE"))) {
132 ilm 1285
                if (row.getBigDecimal("PA_DEVISE") != null && row.getBigDecimal("PA_DEVISE").signum() != 0 && this.incoterm.length() == 0) {
93 ilm 1286
                    return row.getBigDecimal("PA_DEVISE");
1287
                } else {
132 ilm 1288
                    String devCode = getDevise().getString("CODE");
93 ilm 1289
 
132 ilm 1290
                    BigDecimal tarifCompletion = (BigDecimal) tarifCompletion(row, "PRIX_METRIQUE_HA_1");
1291
                    if (tarifCompletion == null) {
1292
                        tarifCompletion = row.getBigDecimal("PRIX_METRIQUE_HA_1");
93 ilm 1293
                    }
132 ilm 1294
                    if (tarifCompletion == null) {
1295
                        return null;
1296
                    } else {
1297
                        // Remove set scale 2 --> if scale ex : PA = 95.74MAD --> 0.76592€
1298
                        // with Scale 0.77€ so put 96.25MAD in PA
1299
                        return convert(tarifCompletion, devCode, true);
1300
                    }
93 ilm 1301
                }
132 ilm 1302
 
19 ilm 1303
            }
1304
        } else {
1305
            if ((field.equalsIgnoreCase("ID_DEVISE") || field.equalsIgnoreCase("ID_DEVISE_HA"))) {
1306
                return Configuration.getInstance().getDirectory().getElement("DEVISE").getTable().getUndefinedID();
1307
            } else if ((field.equalsIgnoreCase("PA_DEVISE"))) {
1308
 
67 ilm 1309
                return BigDecimal.ZERO;
19 ilm 1310
            }
156 ilm 1311
 
19 ilm 1312
        }
156 ilm 1313
        if (field.equalsIgnoreCase("ID_TAXE") && this.rowCatComptable != null) {
1314
            return this.rowCatComptable.getForeignID("ID_TAXE_VENTE");
1315
        }
19 ilm 1316
        return null;
132 ilm 1317
 
19 ilm 1318
    }
1319
 
93 ilm 1320
    @Override
1321
    protected void refreshDeviseAmount() {
1322
        int count = getRowValuesTable().getRowCount();
1323
        final int columnForField = getRowValuesTable().getRowValuesTableModel().getColumnForField("PA_DEVISE");
1324
        if (columnForField >= 0) {
1325
            SQLTableElement eltDevise = getRowValuesTable().getRowValuesTableModel().getSQLTableElementAt(columnForField);
1326
            for (int i = 0; i < count; i++) {
1327
                SQLRowValues rowVals = getRowValuesTable().getRowValuesTableModel().getRowValuesAt(i);
1328
                // getRowValuesTable().getRowValuesTableModel().putValue(rowVals.getObject("PV_U_DEVISE"),
1329
                // i, "PV_U_DEVISE", true);
1330
                eltDevise.setValueFrom(rowVals, rowVals.getObject("PA_DEVISE"));
1331
                getRowValuesTable().getRowValuesTableModel().fireTableChanged(new TableModelEvent(getRowValuesTable().getRowValuesTableModel(), i, i, columnForField));
1332
            }
1333
        }
1334
    }
1335
 
19 ilm 1336
    public SQLRowAccessor getDevise() {
1337
        return this.rowDevise;
1338
    }
1339
 
1340
    public void setDevise(SQLRowAccessor deviseRow) {
1341
        this.rowDevise = deviseRow;
94 ilm 1342
        if (deviseRow == null) {
1343
            getDefaultRowValues().put("ID_DEVISE", null);
1344
        } else {
1345
            getDefaultRowValues().put("ID_DEVISE", this.rowDevise.getID());
1346
        }
19 ilm 1347
    }
41 ilm 1348
 
94 ilm 1349
    private BigDecimal tauxConversion = null;
1350
 
1351
    public void setTauxConversion(BigDecimal tauxConversion) {
1352
        if (tauxConversion != null && tauxConversion.signum() == 0) {
1353
            tauxConversion = null;
1354
        }
1355
        this.tauxConversion = tauxConversion;
1356
        refreshDeviseAmount();
1357
    }
1358
 
1359
    public BigDecimal convert(BigDecimal val, String devCode, boolean fromCompanyCurrency) {
1360
        if (val == null) {
1361
            return val;
1362
        }
1363
        if (this.tauxConversion == null) {
1364
            CurrencyConverter c = new CurrencyConverter();
1365
            if (fromCompanyCurrency) {
1366
                return c.convert(val, c.getCompanyCurrencyCode(), devCode, getDateDevise(), isUsedBiasedDevise());
1367
            } else {
1368
                return c.convert(val, devCode, c.getCompanyCurrencyCode(), getDateDevise(), isUsedBiasedDevise());
1369
            }
1370
        } else {
1371
            if (fromCompanyCurrency) {
1372
                return val.divide(this.tauxConversion, DecimalUtils.HIGH_PRECISION).setScale(val.scale(), RoundingMode.HALF_UP);
1373
            } else {
1374
                return val.multiply(this.tauxConversion, DecimalUtils.HIGH_PRECISION).setScale(val.scale(), RoundingMode.HALF_UP);
1375
            }
1376
        }
1377
    }
1378
 
41 ilm 1379
    public void setFournisseurFilterOnCompletion(SQLRow row) {
93 ilm 1380
        final SQLTable sqlTableArticle = ((ComptaPropsConfiguration) Configuration.getInstance()).getRootSociete().getTable("ARTICLE");
1381
        Where w = new Where(sqlTableArticle.getField("OBSOLETE"), "=", Boolean.FALSE);
41 ilm 1382
        if (row != null && !row.isUndefined()) {
93 ilm 1383
            w = w.and(new Where(this.tableArticle.getField("ID_FOURNISSEUR"), "=", row.getID()));
41 ilm 1384
        }
93 ilm 1385
        this.m.setWhere(w);
1386
        this.m2.setWhere(w);
1387
        this.m3.setWhere(w);
41 ilm 1388
    }
1389
 
142 ilm 1390
    private void insertFromDrop(List<Tuple3<Double, String, String>> articles, AutoCompletionManager m) {
94 ilm 1391
 
142 ilm 1392
        List<String> code = new ArrayList<String>(articles.size());
1393
        for (int i = articles.size() - 1; i >= 0; i--) {
94 ilm 1394
 
142 ilm 1395
            Tuple3<Double, String, String> tuple = articles.get(i);
1396
            code.add(tuple.get1());
1397
        }
94 ilm 1398
 
142 ilm 1399
        int rowCount = getRowValuesTable().getRowValuesTableModel().getRowCount();
1400
        Map<Integer, Integer> mapRows = new HashMap<Integer, Integer>();
1401
        for (int i = 0; i < rowCount; i++) {
1402
            SQLRowValues rowVals = getRowValuesTable().getRowValuesTableModel().getRowValuesAt(i);
1403
            if (rowVals.getObject("ID_ARTICLE") != null && !rowVals.isForeignEmpty("ID_ARTICLE")) {
1404
                mapRows.put(rowVals.getForeignID("ID_ARTICLE"), i);
1405
            }
1406
        }
94 ilm 1407
 
142 ilm 1408
        SQLSelect sel = new SQLSelect();
1409
        final SQLTable articleTable = getSQLElement().getTable().getForeignTable("ID_ARTICLE");
1410
        sel.addSelectStar(articleTable);
1411
        sel.setWhere(new Where(articleTable.getField("CODE"), code));
1412
        List<SQLRow> matchCode = SQLRowListRSH.execute(sel);
1413
        Map<String, SQLRow> mapCode = new HashMap<String, SQLRow>();
1414
        for (SQLRow sqlRow : matchCode) {
1415
            mapCode.put(sqlRow.getString("CODE"), sqlRow);
1416
        }
1417
        Set<String> fieldsFrom = m.getFieldsFrom();
1418
        fieldsFrom.remove("POURCENT_REMISE");
1419
        for (int i = articles.size() - 1; i >= 0; i--) {
94 ilm 1420
 
142 ilm 1421
            Tuple3<Double, String, String> tuple = articles.get(i);
94 ilm 1422
 
142 ilm 1423
            SQLRow article = mapCode.get(tuple.get1());
1424
            if (article != null && mapRows.containsKey(article.getID())) {
1425
                Integer index = mapRows.get(article.getID());
1426
                SQLRowValues rowVals = getRowValuesTable().getRowValuesTableModel().getRowValuesAt(index);
1427
                getRowValuesTable().getRowValuesTableModel().putValue(rowVals.getInt("QTE") + 1, index, "QTE");
1428
            } else {
1429
                final SQLRowValues row2Insert = new SQLRowValues(getRowValuesTable().getRowValuesTableModel().getDefaultRowValues());
1430
 
1431
                // Completion depuis l'article trouvé
1432
                if (article != null) {
1433
                    m.fillRowValues(article, fieldsFrom, row2Insert);
1434
                    // Fill prix total
1435
                    row2Insert.put("ID_ARTICLE", article.getID());
1436
                    row2Insert.put("CODE", article.getObject("CODE"));
1437
                    row2Insert.put("NOM", article.getObject("NOM"));
1438
                } else {
1439
                    row2Insert.put("CODE", tuple.get1());
1440
                    row2Insert.put("NOM", tuple.get2());
1441
                }
1442
 
1443
                row2Insert.put("QTE", Math.round(tuple.get0().floatValue()));
1444
 
1445
                row2Insert.put("PA_HT", row2Insert.getObject("PRIX_METRIQUE_HA_1"));
1446
                //
1447
                final BigDecimal resultTotalHT = row2Insert.getBigDecimal("PA_HT").multiply(new BigDecimal(row2Insert.getInt("QTE")));
1448
                row2Insert.put("T_PA_HT", resultTotalHT);
1449
 
1450
                Float resultTaux = TaxeCache.getCache().getTauxFromId(row2Insert.getForeignID("ID_TAXE"));
1451
 
1452
                if (resultTaux == null) {
177 ilm 1453
                    SQLRow rowTax = TaxeCache.getCache().getFirstTaxeAchat();
142 ilm 1454
                    resultTaux = rowTax.getFloat("TAUX");
1455
                }
1456
 
1457
                float taux = (resultTaux == null) ? 0.0F : resultTaux.floatValue();
1458
 
1459
                BigDecimal r = resultTotalHT.multiply(BigDecimal.valueOf(taux).movePointLeft(2).add(BigDecimal.ONE), DecimalUtils.HIGH_PRECISION);
1460
 
1461
                row2Insert.put("T_PA_TTC", r);
1462
                // row2Insert.put("ID_STYLE", allStyleByName.get("Composant"));
1463
                getRowValuesTable().getRowValuesTableModel().addRowAt(0, row2Insert);
1464
            }
94 ilm 1465
        }
1466
    }
1467
 
180 ilm 1468
    private final List<String> trFields = Arrays.asList("ID_COMMANDE_ELEMENT", "ID_BON_RECEPTION_ELEMENT");
1469
 
1470
    private boolean isFromTranferred(SQLRowValues vals) {
1471
 
1472
        for (String trField : this.trFields) {
1473
            if (vals.getTable().contains(trField)) {
1474
                boolean noCmdElt = vals.getObject(trField) == null || vals.isForeignEmpty(trField);
1475
                if (!noCmdElt) {
1476
                    return true;
1477
                }
1478
            }
1479
        }
1480
        return false;
1481
    }
1482
 
18 ilm 1483
}