OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

Rev 174 | Rev 182 | 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.sales.quote.component;
15
 
41 ilm 16
import static org.openconcerto.utils.CollectionUtils.createSet;
142 ilm 17
 
18 ilm 18
import org.openconcerto.erp.config.ComptaPropsConfiguration;
63 ilm 19
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
18 ilm 20
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
73 ilm 21
import org.openconcerto.erp.core.common.ui.AbstractArticleItemTable;
83 ilm 22
import org.openconcerto.erp.core.common.ui.AbstractVenteArticleItemTable.TypeCalcul;
23
import org.openconcerto.erp.core.common.ui.Acompte;
24
import org.openconcerto.erp.core.common.ui.AcompteField;
25
import org.openconcerto.erp.core.common.ui.AcompteRowItemView;
18 ilm 26
import org.openconcerto.erp.core.common.ui.DeviseField;
27
import org.openconcerto.erp.core.common.ui.TotalPanel;
93 ilm 28
import org.openconcerto.erp.core.customerrelationship.customer.ui.AddressChoiceUI;
29
import org.openconcerto.erp.core.customerrelationship.customer.ui.AdresseType;
174 ilm 30
import org.openconcerto.erp.core.customerrelationship.customer.ui.CategorieComptableChoiceUI;
144 ilm 31
import org.openconcerto.erp.core.finance.tax.model.TaxeCache;
18 ilm 32
import org.openconcerto.erp.core.sales.quote.element.EtatDevisSQLElement;
33
import org.openconcerto.erp.core.sales.quote.report.DevisXmlSheet;
34
import org.openconcerto.erp.core.sales.quote.ui.DevisItemTable;
21 ilm 35
import org.openconcerto.erp.panel.PanelOOSQLComponent;
93 ilm 36
import org.openconcerto.erp.preferences.GestionClientPreferencePanel;
94 ilm 37
import org.openconcerto.erp.preferences.GestionCommercialeGlobalPreferencePanel;
73 ilm 38
import org.openconcerto.map.ui.ITextComboVilleViewer;
18 ilm 39
import org.openconcerto.sql.Configuration;
40
import org.openconcerto.sql.element.BaseSQLComponent;
41
import org.openconcerto.sql.element.SQLElement;
42
import org.openconcerto.sql.model.SQLBackgroundTableCache;
43
import org.openconcerto.sql.model.SQLRow;
44
import org.openconcerto.sql.model.SQLRowAccessor;
45
import org.openconcerto.sql.model.SQLRowValues;
90 ilm 46
import org.openconcerto.sql.model.SQLSelect;
18 ilm 47
import org.openconcerto.sql.model.SQLTable;
65 ilm 48
import org.openconcerto.sql.model.UndefinedRowValuesCache;
73 ilm 49
import org.openconcerto.sql.model.Where;
93 ilm 50
import org.openconcerto.sql.preferences.SQLPreferences;
18 ilm 51
import org.openconcerto.sql.sqlobject.ElementComboBox;
52
import org.openconcerto.sql.sqlobject.JUniqueTextField;
142 ilm 53
import org.openconcerto.sql.sqlobject.SQLRequestComboBox;
18 ilm 54
import org.openconcerto.sql.sqlobject.SQLTextCombo;
55
import org.openconcerto.sql.ui.RadioButtons;
56
import org.openconcerto.sql.users.UserManager;
142 ilm 57
import org.openconcerto.sql.users.rights.UserRightsManager;
18 ilm 58
import org.openconcerto.sql.view.EditFrame;
59
import org.openconcerto.ui.DefaultGridBagConstraints;
25 ilm 60
import org.openconcerto.ui.FormLayouter;
18 ilm 61
import org.openconcerto.ui.JDate;
62
import org.openconcerto.ui.TitledSeparator;
63
import org.openconcerto.ui.VFlowLayout;
64
import org.openconcerto.ui.component.ITextArea;
65
import org.openconcerto.utils.ExceptionHandler;
90 ilm 66
import org.openconcerto.utils.GestionDevise;
73 ilm 67
import org.openconcerto.utils.cc.ITransformer;
90 ilm 68
import org.openconcerto.utils.checks.ValidState;
18 ilm 69
import org.openconcerto.utils.text.SimpleDocumentListener;
70
 
71
import java.awt.Color;
72
import java.awt.Dimension;
73
import java.awt.GridBagConstraints;
74
import java.awt.GridBagLayout;
75
import java.awt.Insets;
73 ilm 76
import java.awt.event.ItemEvent;
77
import java.awt.event.ItemListener;
90 ilm 78
import java.awt.event.MouseEvent;
19 ilm 79
import java.beans.PropertyChangeEvent;
80
import java.beans.PropertyChangeListener;
18 ilm 81
import java.sql.SQLException;
19 ilm 82
import java.util.Calendar;
90 ilm 83
import java.util.Date;
84
import java.util.HashSet;
18 ilm 85
import java.util.List;
90 ilm 86
import java.util.Set;
18 ilm 87
 
88
import javax.swing.BorderFactory;
89
import javax.swing.ButtonGroup;
73 ilm 90
import javax.swing.JCheckBox;
18 ilm 91
import javax.swing.JLabel;
19 ilm 92
import javax.swing.JOptionPane;
18 ilm 93
import javax.swing.JPanel;
94
import javax.swing.JRadioButton;
95
import javax.swing.JScrollPane;
73 ilm 96
import javax.swing.JTabbedPane;
18 ilm 97
import javax.swing.JTextField;
98
import javax.swing.SwingConstants;
99
import javax.swing.SwingUtilities;
142 ilm 100
import javax.swing.SwingWorker;
18 ilm 101
import javax.swing.event.ChangeEvent;
102
import javax.swing.event.ChangeListener;
103
import javax.swing.event.DocumentEvent;
104
import javax.swing.event.TableModelEvent;
105
import javax.swing.event.TableModelListener;
106
 
107
public class DevisSQLComponent extends BaseSQLComponent {
73 ilm 108
    private AbstractArticleItemTable table;
18 ilm 109
    private JUniqueTextField numeroUniqueDevis;
110
    private final SQLTable tableNum = getTable().getBase().getTable("NUMEROTATION_AUTO");
111
    private final ITextArea infos = new ITextArea();
112
    private final RadioButtons radioEtat = new RadioButtons("NOM");
113
    private JTextField textPourcentRemise, textPoidsTotal;
114
    private DeviseField textRemiseHT;
115
    private DeviseField fieldHT;
21 ilm 116
    private PanelOOSQLComponent panelOO;
18 ilm 117
 
73 ilm 118
    // Site d'intervention
119
    final JTextField telSite = new JTextField(20);
120
    final ITextComboVilleViewer villeSite = new ITextComboVilleViewer();
121
    final JTextField faxSite = new JTextField(20);
122
    final JTextField telPSite = new JTextField(20);
123
    final JTextField mailSite = new JTextField(20);
124
    final JTextField contactSite = new JTextField(20);
125
    final JTextField desSite = new JTextField(20);
126
    final ITextArea adrSite = new ITextArea();
127
 
128
    // Donneur d'ordre
129
    final JTextField telDonneur = new JTextField(20);
130
    final JTextField sirenDonneur = new JTextField(20);
131
    final ITextComboVilleViewer villeDonneur = new ITextComboVilleViewer();
132
    final JTextField faxDonneur = new JTextField(20);
133
    final JTextField telPDonneur = new JTextField(20);
134
    final JTextField mailDonneur = new JTextField(20);
135
    final JTextField contactDonneur = new JTextField(20);
136
    final JTextField desDonneur = new JTextField(20);
137
    final ITextArea adrDonneur = new ITextArea();
93 ilm 138
    private final boolean displayDpt;
73 ilm 139
 
93 ilm 140
    private final ElementComboBox comboDpt = new ElementComboBox(false, 25);
141
 
18 ilm 142
    public DevisSQLComponent(final SQLElement elt) {
143
        super(elt);
93 ilm 144
        SQLPreferences prefs = SQLPreferences.getMemCached(getTable().getDBRoot());
145
        this.displayDpt = prefs.getBoolean(GestionClientPreferencePanel.DISPLAY_CLIENT_DPT, false);
18 ilm 146
    }
147
 
73 ilm 148
    public AbstractArticleItemTable getRowValuesTable() {
61 ilm 149
        return this.table;
150
    }
151
 
18 ilm 152
    @Override
90 ilm 153
    public Set<String> getPartialResetNames() {
154
        Set<String> s = new HashSet<String>();
155
        s.add("OBJET");
156
        s.add("NUMERO");
157
        return s;
158
    }
159
 
93 ilm 160
    private final JDate dateDevis = new JDate(true);
161
 
90 ilm 162
    @Override
18 ilm 163
    public void addViews() {
164
        setLayout(new GridBagLayout());
165
        final GridBagConstraints c = new DefaultGridBagConstraints();
166
 
25 ilm 167
        // Champ Module
168
        c.gridx = 0;
169
        c.gridy++;
170
        c.gridwidth = GridBagConstraints.REMAINDER;
63 ilm 171
        final JPanel addP = ComptaSQLConfElement.createAdditionalPanel();
41 ilm 172
        this.setAdditionalFieldsPanel(new FormLayouter(addP, 2));
25 ilm 173
        this.add(addP, c);
174
 
175
        c.gridy++;
176
        c.gridwidth = 1;
18 ilm 177
        final JLabel labelNumero = new JLabel(getLabelFor("NUMERO"));
178
        labelNumero.setHorizontalAlignment(SwingConstants.RIGHT);
179
        this.add(labelNumero, c);
180
 
181
        // Ligne 1: Numero du devis
182
 
183
        c.gridx++;
184
        c.weightx = 1;
185
        c.fill = GridBagConstraints.NONE;
142 ilm 186
            this.numeroUniqueDevis = new JUniqueTextField(15) {
187
                @Override
188
                public String getAutoRefreshNumber() {
189
                    if (getMode() == Mode.INSERTION) {
190
                        return NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), dateDevis.getDate());
191
                    } else {
192
                        return null;
193
                    }
194
                }
195
            };
90 ilm 196
 
18 ilm 197
        DefaultGridBagConstraints.lockMinimumSize(this.numeroUniqueDevis);
198
        DefaultGridBagConstraints.lockMaximumSize(this.numeroUniqueDevis);
199
        this.add(this.numeroUniqueDevis, c);
200
 
201
        // Date
202
 
203
        c.gridx++;
204
        c.weightx = 0;
205
        c.fill = GridBagConstraints.HORIZONTAL;
206
        final JLabel labelDate = new JLabel(getLabelFor("DATE"));
207
 
208
        labelDate.setHorizontalAlignment(SwingConstants.RIGHT);
209
 
210
        this.add(labelDate, c);
211
        c.gridx++;
212
 
213
        c.weightx = 1;
214
 
215
        c.fill = GridBagConstraints.NONE;
93 ilm 216
        this.add(this.dateDevis, c);
18 ilm 217
 
93 ilm 218
        this.dateDevis.addValueListener(new PropertyChangeListener() {
219
 
220
            @Override
221
            public void propertyChange(PropertyChangeEvent evt) {
222
                if (!isFilling() && dateDevis.getValue() != null) {
223
                    table.setDateDevise(dateDevis.getValue());
224
                }
225
            }
226
        });
227
 
18 ilm 228
        // Etat devis
229
        this.radioEtat.setLayout(new VFlowLayout());
230
        this.radioEtat.setBorder(BorderFactory.createTitledBorder(getLabelFor("ID_ETAT_DEVIS")));
231
        c.gridwidth = GridBagConstraints.REMAINDER;
61 ilm 232
        c.gridheight = 5;
18 ilm 233
        c.weightx = 0;
234
        c.fill = GridBagConstraints.NONE;
235
        c.anchor = GridBagConstraints.EAST;
236
        c.gridx += 2;
73 ilm 237
        this.radioEtat.initLocalization(new ITransformer<String, String>() {
238
            @Override
239
            public String transformChecked(String id) {
240
                return id;
241
                // return TranslationManager.getInstance().getTranslationForItem(id);
242
            }
243
        });
18 ilm 244
        this.add(this.radioEtat, c);
41 ilm 245
        // this.radioEtat.setVisible(false);
18 ilm 246
 
247
        // Ligne 2: Reference
248
        c.gridx = 0;
249
        c.gridy++;
250
        c.gridwidth = 1;
251
        c.gridheight = 1;
252
        c.fill = GridBagConstraints.HORIZONTAL;
253
 
254
        c.weightx = 0;
255
 
256
        final JLabel labelObjet = new JLabel(getLabelFor("OBJET"));
257
        labelObjet.setHorizontalAlignment(SwingConstants.RIGHT);
258
 
259
        this.add(labelObjet, c);
260
 
261
        final SQLTextCombo textObjet = new SQLTextCombo();
262
        c.gridx++;
263
        c.weightx = 1;
264
        c.gridwidth = 1;
265
        c.fill = GridBagConstraints.BOTH;
266
        this.add(textObjet, c);
267
 
268
        String field;
269
            field = "ID_COMMERCIAL";
270
        // Commercial
271
        final JLabel labelCommercial = new JLabel(getLabelFor(field));
272
        labelCommercial.setHorizontalAlignment(SwingConstants.RIGHT);
273
        c.gridx++;
274
        c.fill = GridBagConstraints.HORIZONTAL;
275
        c.weightx = 0;
276
 
277
        this.add(labelCommercial, c);
278
 
279
        final ElementComboBox comboCommercial = new ElementComboBox(false, 25);
280
 
281
        comboCommercial.setListIconVisible(false);
282
        c.gridx++;
283
        c.weightx = 1;
284
        c.fill = GridBagConstraints.NONE;
285
        c.anchor = GridBagConstraints.WEST;
286
 
287
        this.add(comboCommercial, c);
288
        addRequiredSQLObject(comboCommercial, field);
289
 
290
        // Ligne 3: Client
291
        c.gridx = 0;
292
        c.gridy++;
293
        c.gridwidth = 1;
294
        final JLabel labelClient = new JLabel(getLabelFor("ID_CLIENT"));
295
        labelClient.setHorizontalAlignment(SwingConstants.RIGHT);
296
        c.weightx = 0;
297
        c.gridwidth = 1;
298
        c.fill = GridBagConstraints.HORIZONTAL;
299
        this.add(labelClient, c);
300
 
301
        final ElementComboBox comboClient = new ElementComboBox();
302
        c.gridx++;
19 ilm 303
        c.gridwidth = 1;
18 ilm 304
        c.weightx = 0;
305
        c.weighty = 0;
306
        c.fill = GridBagConstraints.NONE;
307
        this.add(comboClient, c);
73 ilm 308
        addRequiredSQLObject(comboClient, "ID_CLIENT");
309
 
94 ilm 310
        comboClient.addModelListener("wantedID", new PropertyChangeListener() {
311
 
312
            @Override
313
            public void propertyChange(PropertyChangeEvent evt) {
314
                int wantedID = comboClient.getWantedID();
315
 
316
                if (wantedID != SQLRow.NONEXISTANT_ID && wantedID >= SQLRow.MIN_VALID_ID) {
317
                    final SQLRow rowClient = getTable().getForeignTable("ID_CLIENT").getRow(wantedID);
318
                    if (!rowClient.isForeignEmpty("ID_COMMERCIAL")) {
319
                        comboCommercial.setValue(rowClient.getForeignID("ID_COMMERCIAL"));
320
                    }
321
                }
322
            }
323
        });
93 ilm 324
        if (this.displayDpt) {
325
            c.gridx++;
326
            c.gridwidth = 1;
327
            final JLabel labelDpt = new JLabel(getLabelFor("ID_CLIENT_DEPARTEMENT"));
328
            labelDpt.setHorizontalAlignment(SwingConstants.RIGHT);
329
            c.weightx = 0;
330
            c.gridwidth = 1;
331
            c.fill = GridBagConstraints.HORIZONTAL;
332
            this.add(labelDpt, c);
333
 
334
            c.gridx++;
335
            c.gridwidth = 1;
336
            c.weightx = 0;
337
            c.weighty = 0;
338
            c.fill = GridBagConstraints.NONE;
339
            this.add(this.comboDpt, c);
340
            DefaultGridBagConstraints.lockMinimumSize(this.comboDpt);
341
            addSQLObject(this.comboDpt, "ID_CLIENT_DEPARTEMENT");
342
 
343
            comboClient.addModelListener("wantedID", new PropertyChangeListener() {
344
 
345
                @Override
346
                public void propertyChange(PropertyChangeEvent evt) {
347
                    int wantedID = comboClient.getWantedID();
348
 
349
                    if (wantedID != SQLRow.NONEXISTANT_ID && wantedID >= SQLRow.MIN_VALID_ID) {
350
                        final SQLRow rowClient = getTable().getForeignTable("ID_CLIENT").getRow(wantedID);
351
                        comboDpt.getRequest().setWhere(new Where(comboDpt.getRequest().getPrimaryTable().getField("ID_CLIENT"), "=", rowClient.getID()));
352
                    } else {
353
                        comboDpt.getRequest().setWhere(null);
354
                    }
355
                }
356
            });
357
 
358
        }
149 ilm 359
        final SQLPreferences prefs = SQLPreferences.getMemCached(getTable().getDBRoot());
93 ilm 360
 
19 ilm 361
        final ElementComboBox boxTarif = new ElementComboBox();
149 ilm 362
 
94 ilm 363
            if (prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.ADDRESS_SPEC, true)) {
93 ilm 364
 
94 ilm 365
                final SQLElement adrElement = getElement().getForeignElement("ID_ADRESSE");
366
                final AddressChoiceUI addressUI = new AddressChoiceUI();
367
                addressUI.addToUI(this, c);
368
                comboClient.addModelListener("wantedID", new PropertyChangeListener() {
93 ilm 369
 
94 ilm 370
                    @Override
371
                    public void propertyChange(PropertyChangeEvent evt) {
372
                        int wantedID = comboClient.getWantedID();
373
                        System.err.println("SET WHERE ID_CLIENT = " + wantedID);
374
                        if (wantedID != SQLRow.NONEXISTANT_ID && wantedID >= SQLRow.MIN_VALID_ID) {
93 ilm 375
 
132 ilm 376
                            addressUI.getComboAdrF().getRequest().setWhere(
377
                                    new Where(adrElement.getTable().getField("ID_CLIENT"), "=", wantedID).and(new Where(adrElement.getTable().getField("TYPE"), "=", AdresseType.Invoice.getId())));
378
                            addressUI.getComboAdrL().getRequest().setWhere(
379
                                    new Where(adrElement.getTable().getField("ID_CLIENT"), "=", wantedID).and(new Where(adrElement.getTable().getField("TYPE"), "=", AdresseType.Delivery.getId())));
94 ilm 380
                        } else {
381
                            addressUI.getComboAdrF().getRequest().setWhere(Where.FALSE);
382
                            addressUI.getComboAdrL().getRequest().setWhere(Where.FALSE);
383
                        }
93 ilm 384
                    }
94 ilm 385
                });
386
            }
174 ilm 387
            if (prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.CATEGORIE_COMPTABLE_SPEC, false)) {
388
                // cat spe
389
                final CategorieComptableChoiceUI catUI = new CategorieComptableChoiceUI();
390
                catUI.addToUI(this, c);
391
                catUI.getCombo().addModelListener("wantedID", new PropertyChangeListener() {
392
 
393
                    @Override
394
                    public void propertyChange(PropertyChangeEvent evt) {
395
                        int wantedID = catUI.getCombo().getWantedID();
396
                        if (wantedID != SQLRow.NONEXISTANT_ID && wantedID >= SQLRow.MIN_VALID_ID) {
397
                            table.setRowCatComptable(catUI.getCombo().getElement().getTable().getRow(wantedID));
398
                        } else {
399
                            table.setRowCatComptable(null);
400
                        }
401
                    }
402
                });
403
            }
83 ilm 404
            if (getTable().contains("ID_CONTACT")) {
405
                // Contact Client
406
                c.gridx = 0;
407
                c.gridy++;
408
                c.gridwidth = 1;
409
                final JLabel labelContact = new JLabel(getLabelFor("ID_CONTACT"));
410
                labelContact.setHorizontalAlignment(SwingConstants.RIGHT);
411
                c.weightx = 0;
412
                c.gridwidth = 1;
413
                c.fill = GridBagConstraints.HORIZONTAL;
414
                this.add(labelContact, c);
18 ilm 415
 
83 ilm 416
                final ElementComboBox comboContact = new ElementComboBox();
417
                c.gridx++;
418
                c.gridwidth = 1;
419
                c.weightx = 0;
420
                c.weighty = 0;
421
                c.fill = GridBagConstraints.NONE;
422
                this.add(comboContact, c);
423
                final SQLElement contactElement = getElement().getForeignElement("ID_CONTACT");
424
                comboContact.init(contactElement, contactElement.getComboRequest(true));
93 ilm 425
                comboContact.getRequest().setWhere(Where.FALSE);
83 ilm 426
                DefaultGridBagConstraints.lockMinimumSize(comboContact);
427
                this.addView(comboContact, "ID_CONTACT");
428
                comboClient.addModelListener("wantedID", new PropertyChangeListener() {
429
 
430
                    @Override
431
                    public void propertyChange(PropertyChangeEvent evt) {
432
                        int wantedID = comboClient.getWantedID();
433
                        System.err.println("SET WHERE ID_CLIENT = " + wantedID);
434
                        if (wantedID != SQLRow.NONEXISTANT_ID && wantedID >= SQLRow.MIN_VALID_ID) {
435
 
436
                            final SQLRow rowClient = getTable().getForeignTable("ID_CLIENT").getRow(wantedID);
437
                            int idClient = rowClient.getID();
438
                            comboContact.getRequest().setWhere(new Where(contactElement.getTable().getField("ID_CLIENT"), "=", idClient));
174 ilm 439
 
180 ilm 440
                            table.setClient(rowClient, !isFilling());
441
 
83 ilm 442
                        } else {
93 ilm 443
                            comboContact.getRequest().setWhere(Where.FALSE);
174 ilm 444
                            if (!isFilling()) {
445
                                table.setClient(null, true);
446
                            }
83 ilm 447
                            DevisSQLComponent.this.table.setTarif(null, false);
448
                        }
449
                    }
450
                });
451
 
452
            }
453
 
19 ilm 454
        if (getTable().getFieldsName().contains("DATE_VALIDITE")) {
455
            c.gridx++;
93 ilm 456
            c.fill = GridBagConstraints.HORIZONTAL;
457
            this.add(new JLabel(getLabelFor("DATE_VALIDITE"), SwingConstants.RIGHT), c);
458
            c.fill = GridBagConstraints.NONE;
19 ilm 459
            c.gridx++;
460
            JDate dateValidite = new JDate();
461
            this.add(dateValidite, c);
462
            this.addView(dateValidite, "DATE_VALIDITE");
463
        }
464
 
465
        // Tarif
466
        if (this.getTable().getFieldsName().contains("ID_TARIF")) {
467
            // TARIF
468
            c.gridy++;
469
            c.gridx = 0;
470
            c.weightx = 0;
471
            c.weighty = 0;
472
            c.gridwidth = 1;
93 ilm 473
            c.fill = GridBagConstraints.HORIZONTAL;
474
            JLabel comp = new JLabel(getLabelFor("ID_TARIF"), SwingConstants.RIGHT);
61 ilm 475
            this.add(comp, c);
19 ilm 476
            c.gridx++;
93 ilm 477
            c.fill = GridBagConstraints.NONE;
19 ilm 478
            c.weightx = 1;
479
            this.add(boxTarif, c);
480
            this.addView(boxTarif, "ID_TARIF");
481
            DefaultGridBagConstraints.lockMinimumSize(boxTarif);
73 ilm 482
            boxTarif.addModelListener("wantedID", new PropertyChangeListener() {
19 ilm 483
 
484
                @Override
485
                public void propertyChange(PropertyChangeEvent evt) {
73 ilm 486
 
487
                    SQLRow selectedRow = boxTarif.getRequest().getPrimaryTable().getRow(boxTarif.getWantedID());
488
                    table.setTarif(selectedRow, !isFilling());
19 ilm 489
                }
490
            });
93 ilm 491
            if (this.getTable().getFieldsName().contains("DUNNING_DATE")) {
492
                c.gridx++;
493
                c.weightx = 0;
151 ilm 494
                c.fill = GridBagConstraints.HORIZONTAL;
93 ilm 495
                this.add(new JLabel(getLabelFor("DUNNING_DATE"), SwingConstants.RIGHT), c);
496
                c.gridx++;
151 ilm 497
                c.fill = GridBagConstraints.NONE;
93 ilm 498
                JDate dateRelance = new JDate();
499
                this.add(dateRelance, c);
500
                if (getTable().getDBRoot().contains("TARIF_AGENCE")) {
501
                    this.addView(dateRelance, "DUNNING_DATE", REQ);
502
                } else {
503
                    this.addView(dateRelance, "DUNNING_DATE");
504
                }
505
            }
506
 
19 ilm 507
        }
508
 
18 ilm 509
        // Table d'élément
73 ilm 510
            this.table = new DevisItemTable();
511
 
83 ilm 512
            final AcompteField acompteField = new AcompteField();
513
            acompteField.getDocument().addDocumentListener(new SimpleDocumentListener() {
514
 
515
                @Override
516
                public void update(DocumentEvent e) {
517
                    Acompte a = acompteField.getValue();
518
                    ((DevisItemTable) table).calculPourcentage(a, TypeCalcul.CALCUL_REMISE);
519
                }
520
            });
521
 
522
            // Remise
523
            c.gridy++;
524
            c.gridx = 0;
525
            c.weightx = 0;
526
            c.weighty = 0;
527
            c.gridwidth = 1;
528
            JLabel comp = new JLabel(getLabelFor("MONTANT_REMISE"), SwingConstants.RIGHT);
529
            // this.add(comp, c);
530
            c.gridx++;
531
            c.gridwidth = GridBagConstraints.REMAINDER;
532
 
533
            c.weightx = 1;
534
            // this.add(acompteField, c);
535
            this.addView(new AcompteRowItemView(acompteField), "MONTANT_REMISE,POURCENT_REMISE", null);
536
 
537
 
18 ilm 538
        c.fill = GridBagConstraints.BOTH;
539
        c.gridx = 0;
73 ilm 540
        c.gridy += 5;
18 ilm 541
        c.weighty = 1;
542
        c.gridwidth = GridBagConstraints.REMAINDER;
543
        this.add(this.table, c);
73 ilm 544
        this.addView(this.table.getRowValuesTable(), "");
18 ilm 545
 
546
        // Panel en bas
547
        final JPanel bottomPanel = new JPanel(new GridBagLayout());
548
        final GridBagConstraints cBottom = new DefaultGridBagConstraints();
549
        // 1ere Colonne : Infos
550
        cBottom.weightx = 1;
551
        bottomPanel.add(new TitledSeparator(getLabelFor("INFOS")), cBottom);
552
        cBottom.gridy++;
553
        cBottom.fill = GridBagConstraints.BOTH;
554
        cBottom.weighty = 0;
555
 
556
        final JScrollPane scrollPane = new JScrollPane(this.infos);
557
        scrollPane.setBorder(null);
558
        bottomPanel.add(scrollPane, cBottom);
559
 
560
        // 2eme Colonne : Poids total
561
        final JPanel panel = new JPanel(new GridBagLayout());
562
 
563
        this.textPoidsTotal = new JTextField(8);
564
        this.textPoidsTotal.setText("0.0");
565
        final GridBagConstraints cPanel = new DefaultGridBagConstraints();
566
        panel.add(new JLabel(getLabelFor("T_POIDS")), cPanel);
567
        cPanel.weightx = 0;
568
        cPanel.gridx++;
569
        panel.add(this.textPoidsTotal, cPanel);
570
        this.textPoidsTotal.setEnabled(false);
571
        this.textPoidsTotal.setEditable(false);
572
        this.textPoidsTotal.setHorizontalAlignment(SwingConstants.RIGHT);
573
        this.textPoidsTotal.setDisabledTextColor(Color.BLACK);
574
 
575
        // Port
576
 
577
        final DeviseField textPortHT = new DeviseField();
144 ilm 578
        SQLRequestComboBox boxTaxePort = new SQLRequestComboBox(false, 8);
18 ilm 579
 
144 ilm 580
        if (getTable().contains("ID_TAXE_PORT")) {
581
 
582
            JLabel labelPortHT = new JLabel(getLabelFor("PORT_HT"));
583
            labelPortHT.setHorizontalAlignment(SwingConstants.RIGHT);
584
            cPanel.gridx = 0;
585
            cPanel.gridy++;
586
            panel.add(labelPortHT, cPanel);
587
            cPanel.gridx++;
588
            panel.add(textPortHT, cPanel);
589
 
590
            JLabel labelTaxeHT = new JLabel(getLabelFor("ID_TAXE_PORT"));
591
            labelTaxeHT.setHorizontalAlignment(SwingConstants.RIGHT);
592
            cPanel.gridx = 0;
593
            cPanel.gridy++;
594
            panel.add(labelTaxeHT, cPanel);
595
            cPanel.gridx++;
596
            panel.add(boxTaxePort, cPanel);
597
            this.addView(boxTaxePort, "ID_TAXE_PORT", REQ);
598
 
599
        }
600
 
18 ilm 601
        // Remise HT
602
        final JRadioButton radioEuros = new JRadioButton("en €");
603
        final JRadioButton radioPourCent = new JRadioButton("en %");
604
        final ButtonGroup radioGroup = new ButtonGroup();
605
        radioGroup.add(radioEuros);
606
        radioGroup.add(radioPourCent);
607
        radioEuros.setSelected(true);
608
 
609
        final JPanel panelRemise = new JPanel(new GridBagLayout());
610
        final GridBagConstraints cRemise = new DefaultGridBagConstraints();
611
        cRemise.insets = new Insets(0, 0, 1, 0);
612
        final JLabel labelRemise = new JLabel(getLabelFor("REMISE_HT"));
613
        panelRemise.add(labelRemise, cRemise);
132 ilm 614
        // cRemise.gridx++;
615
        // panelRemise.add(radioEuros, cRemise);
18 ilm 616
 
617
        cRemise.gridx++;
618
        cRemise.weightx = 0;
619
        this.textRemiseHT = new DeviseField();
620
        panelRemise.add(this.textRemiseHT, cRemise);
151 ilm 621
        this.textRemiseHT.setMinimumSize(new Dimension(150, this.textRemiseHT.getMinimumSize().height));
622
        this.textRemiseHT.setPreferredSize(new Dimension(150, this.textRemiseHT.getPreferredSize().height));
18 ilm 623
 
149 ilm 624
        if (prefs.getBoolean(GestionCommercialeGlobalPreferencePanel.ACOMPTE_DEVIS, false)) {
625
            // Acompte
626
            cRemise.gridy++;
627
            cRemise.gridx = 0;
628
            cRemise.weightx = 0;
629
            cRemise.weighty = 0;
630
            cRemise.gridwidth = 1;
631
            JLabel compAcompte = new JLabel(getLabelFor("T_ACOMPTE"), SwingConstants.RIGHT);
632
            panelRemise.add(compAcompte, cRemise);
633
            cRemise.gridx++;
634
            cRemise.gridwidth = GridBagConstraints.REMAINDER;
635
            DeviseField fieldAcompte = new DeviseField();
636
            fieldAcompte.setEnabled(false);
637
            cRemise.weightx = 1;
638
            panelRemise.add(fieldAcompte, cRemise);
639
            this.addView(fieldAcompte, "T_ACOMPTE");
640
        }
641
 
132 ilm 642
        // cRemise.gridx = 1;
643
        // cRemise.gridy++;
644
        // cRemise.weightx = 0;
645
        // panelRemise.add(radioPourCent, cRemise);
646
        //
18 ilm 647
        this.textPourcentRemise = new JTextField(5);
132 ilm 648
        // DefaultGridBagConstraints.lockMinimumSize(this.textPourcentRemise);
649
        // cRemise.gridx++;
650
        // panelRemise.add(this.textPourcentRemise, cRemise);
18 ilm 651
 
652
        cPanel.gridx = 0;
653
        cPanel.gridy++;
654
        cPanel.gridwidth = 2;
655
        panel.add(panelRemise, cPanel);
656
 
657
        cBottom.gridy = 0;
658
        cBottom.gridx++;
659
        cBottom.weighty = 0;
660
        cBottom.weightx = 1;
661
        cBottom.gridheight = 2;
662
        cBottom.fill = GridBagConstraints.HORIZONTAL;
663
        cBottom.anchor = GridBagConstraints.NORTHEAST;
664
        DefaultGridBagConstraints.lockMinimumSize(panel);
132 ilm 665
        bottomPanel.add(panel, cBottom);
18 ilm 666
 
667
        addSQLObject(this.textRemiseHT, "REMISE_HT");
668
        addSQLObject(textPortHT, "PORT_HT");
669
        // this.checkImpression.setSelected(true);
670
 
671
        // Total
672
        this.fieldHT = new DeviseField();
673
        final DeviseField fieldTVA = new DeviseField();
674
        final DeviseField fieldTTC = new DeviseField();
142 ilm 675
        final DeviseField fieldEco = new DeviseField();
19 ilm 676
        final DeviseField fieldDevise = new DeviseField();
18 ilm 677
        final DeviseField fieldService = new DeviseField();
73 ilm 678
        this.fieldHT.setEditable(false);
18 ilm 679
        fieldTVA.setEditable(false);
680
        fieldTTC.setEditable(false);
681
        fieldService.setEditable(false);
142 ilm 682
        fieldEco.setEditable(false);
18 ilm 683
 
142 ilm 684
        addSQLObject(fieldEco, "T_ECO_CONTRIBUTION");
18 ilm 685
        addRequiredSQLObject(this.fieldHT, "T_HT");
686
        addRequiredSQLObject(fieldTVA, "T_TVA");
19 ilm 687
        addSQLObject(fieldDevise, "T_DEVISE");
18 ilm 688
        addRequiredSQLObject(fieldTTC, "T_TTC");
689
        addRequiredSQLObject(fieldService, "T_SERVICE");
19 ilm 690
        JTextField poids = new JTextField();
691
        // addSQLObject(poids, "T_POIDS");
41 ilm 692
 
693
        // FIXME Field add field T_HA dans installation avec recalcul des devis deja saisis
694
        final DeviseField fieldHA = new DeviseField();
695
 
61 ilm 696
        if (getTable().contains("PREBILAN")) {
697
            addSQLObject(fieldHA, "PREBILAN");
698
        } else if (getTable().contains("T_HA")) {
699
 
41 ilm 700
            addSQLObject(fieldHA, "T_HA");
701
        }
702
 
144 ilm 703
        final TotalPanel totalTTC = new TotalPanel(this.table, fieldEco, this.fieldHT, fieldTVA, fieldTTC, textPortHT, this.textRemiseHT, fieldService, fieldHA, fieldDevise, poids, null,
704
                (getTable().contains("ID_TAXE_PORT") ? boxTaxePort : null), null);
18 ilm 705
        cBottom.gridy = 0;
706
        cBottom.gridx += 2;
707
        cBottom.gridheight = 2;
708
        cBottom.gridwidth = 1;
709
        cBottom.fill = GridBagConstraints.NONE;
710
        cBottom.weightx = 0;
711
        cBottom.anchor = GridBagConstraints.NORTHEAST;
712
        DefaultGridBagConstraints.lockMinimumSize(totalTTC);
713
        bottomPanel.add(totalTTC, cBottom);
714
 
715
        c.gridy++;
716
        c.gridx = 0;
717
        c.weighty = 0;
718
        c.fill = GridBagConstraints.HORIZONTAL;
719
        c.gridwidth = GridBagConstraints.REMAINDER;
720
        this.add(bottomPanel, c);
721
 
722
        c.gridx = 0;
723
        c.gridy++;
724
        c.weighty = 0;
725
        c.fill = GridBagConstraints.NONE;
726
        c.anchor = GridBagConstraints.SOUTHEAST;
727
 
21 ilm 728
        this.panelOO = new PanelOOSQLComponent(this);
729
        this.add(this.panelOO, c);
730
 
144 ilm 731
        boxTaxePort.addValueListener(new PropertyChangeListener() {
732
 
733
            @Override
734
            public void propertyChange(PropertyChangeEvent evt) {
735
                totalTTC.updateTotal();
736
            }
737
        });
738
 
18 ilm 739
        textPortHT.getDocument().addDocumentListener(new SimpleDocumentListener() {
740
 
741
            @Override
742
            public void update(final DocumentEvent e) {
743
                totalTTC.updateTotal();
744
            }
745
        });
746
 
747
        this.textRemiseHT.getDocument().addDocumentListener(new SimpleDocumentListener() {
748
 
749
            @Override
750
            public void update(final DocumentEvent e) {
751
                totalTTC.updateTotal();
752
            }
753
        });
754
 
755
        this.textPourcentRemise.getDocument().addDocumentListener(new SimpleDocumentListener() {
756
 
757
            @Override
758
            public void update(final DocumentEvent e) {
759
                calculPourcentage();
760
            }
761
        });
762
 
763
        radioEuros.addChangeListener(new ChangeListener() {
764
 
765
            public void stateChanged(final ChangeEvent e) {
766
                DevisSQLComponent.this.textRemiseHT.setEnabled(radioEuros.isSelected());
767
                DevisSQLComponent.this.textPourcentRemise.setEnabled(!radioEuros.isSelected());
768
            }
769
        });
770
 
771
        this.table.getModel().addTableModelListener(new TableModelListener() {
772
 
773
            public void tableChanged(final TableModelEvent e) {
774
                DevisSQLComponent.this.textPoidsTotal.setText(String.valueOf(DevisSQLComponent.this.table.getPoidsTotal()));
775
            }
776
        });
777
 
778
        addSQLObject(textObjet, "OBJET");
779
        addSQLObject(this.textPoidsTotal, "T_POIDS");
780
        addRequiredSQLObject(dateDevis, "DATE");
781
        addRequiredSQLObject(this.radioEtat, "ID_ETAT_DEVIS");
782
        addRequiredSQLObject(this.numeroUniqueDevis, "NUMERO");
783
        addSQLObject(this.infos, "INFOS");
73 ilm 784
        comboClient.addModelListener("wantedID", new PropertyChangeListener() {
18 ilm 785
 
73 ilm 786
            @Override
787
            public void propertyChange(PropertyChangeEvent arg0) {
788
                if (!isFilling()) {
789
                    Integer id = comboClient.getWantedID();
790
 
791
                    if (id > 1) {
792
 
793
                        SQLRow row = comboClient.getElement().getTable().getRow(id);
794
                        if (comboClient.getElement().getTable().getFieldsName().contains("ID_TARIF")) {
795
 
796
                            SQLRowAccessor foreignRow = row.getForeignRow("ID_TARIF");
797
                            if (!foreignRow.isUndefined() && (boxTarif.getSelectedRow() == null || boxTarif.getSelectedId() != foreignRow.getID())
798
                                    && JOptionPane.showConfirmDialog(null, "Appliquer les tarifs associés au client?") == JOptionPane.YES_OPTION) {
799
                                boxTarif.setValue(foreignRow.getID());
800
                                // SaisieVenteFactureSQLComponent.this.tableFacture.setTarif(foreignRow,
801
                                // true);
802
                            } else {
803
                                boxTarif.setValue(foreignRow.getID());
804
                            }
805
 
806
                            // SQLRowAccessor foreignRow = row.getForeignRow("ID_TARIF");
807
                            // if (foreignRow.isUndefined() &&
808
                            // !row.getForeignRow("ID_DEVISE").isUndefined()) {
809
                            // SQLRowValues rowValsD = new SQLRowValues(foreignRow.getTable());
810
                            // rowValsD.put("ID_DEVISE", row.getObject("ID_DEVISE"));
811
                            // foreignRow = rowValsD;
812
                            //
813
                            // }
814
                            // table.setTarif(foreignRow, true);
815
                        }
816
                    }
817
                }
818
 
819
            }
820
        });
18 ilm 821
        DefaultGridBagConstraints.lockMinimumSize(comboCommercial);
822
        DefaultGridBagConstraints.lockMinimumSize(comboClient);
823
    }
824
 
73 ilm 825
    private enum Type_Diff {
826
        SITE("SITE"), DONNEUR_ORDRE("DONNEUR");
827
        private final String name;
828
 
829
        private Type_Diff(String name) {
830
            this.name = name;
831
        }
832
 
833
        public String getName() {
834
            return this.name;
835
        }
836
    }
837
 
90 ilm 838
    private ValidState validStateContact = ValidState.getTrueInstance();
839
 
840
    @Override
841
    public synchronized ValidState getValidState() {
842
        assert SwingUtilities.isEventDispatchThread();
843
        return super.getValidState().and(this.validStateContact);
844
    }
845
 
132 ilm 846
    private JPanel createGestionSaisieRapport() {
847
        GridBagConstraints cTabSite = new DefaultGridBagConstraints();
848
        JPanel tabSite = new JPanel(new GridBagLayout());
849
 
850
        if (getTable().contains("RAPPORT_A_SAISIR")) {
851
            cTabSite.gridx = 0;
852
            cTabSite.gridy++;
853
            cTabSite.gridheight = 1;
854
            cTabSite.fill = GridBagConstraints.HORIZONTAL;
855
            cTabSite.weightx = 0;
856
 
142 ilm 857
            // Coche
858
            cTabSite.gridx = 0;
859
            cTabSite.gridwidth = 2;
860
            cTabSite.weightx = 0;
861
            JCheckBox boxAsaisir = new JCheckBox("Rapport à saisir");
862
            tabSite.add(boxAsaisir, cTabSite);
863
 
132 ilm 864
            // Type Rapport
865
            JLabel labelRapport = new JLabel(getLabelFor("TYPE_RAPPORT"));
142 ilm 866
            cTabSite.gridx = 2;
132 ilm 867
            tabSite.add(labelRapport, cTabSite);
868
            SQLTextCombo comboType = new SQLTextCombo();
869
            cTabSite.gridwidth = GridBagConstraints.REMAINDER;
870
            cTabSite.gridx++;
142 ilm 871
            cTabSite.weightx = 1;
132 ilm 872
            tabSite.add(comboType, cTabSite);
873
            cTabSite.gridwidth = 1;
874
 
142 ilm 875
            // Nb Rapport
132 ilm 876
            cTabSite.gridx = 0;
877
            cTabSite.gridy++;
142 ilm 878
            cTabSite.weightx = 0;
879
            tabSite.add(new JLabel(getLabelFor("NB_RAPPORT_A_SAISIR")), cTabSite);
880
            cTabSite.gridx++;
881
            cTabSite.weightx = 1;
882
            JTextField fieldNbRapportASaisir = new JTextField(5);
883
            tabSite.add(fieldNbRapportASaisir, cTabSite);
884
 
885
            // Date
886
            cTabSite.gridx++;
887
            cTabSite.weightx = 0;
132 ilm 888
            tabSite.add(new JLabel(getLabelFor("DATE_DEMANDE_SAISIE")), cTabSite);
889
            cTabSite.gridx++;
142 ilm 890
            cTabSite.weightx = 0;
132 ilm 891
            JDate dateDmdSaisie = new JDate();
892
            tabSite.add(dateDmdSaisie, cTabSite);
893
 
894
            cTabSite.gridx++;
895
            cTabSite.gridwidth = 2;
142 ilm 896
            cTabSite.weightx = 0;
132 ilm 897
            JCheckBox boxAcceptSaisie = new JCheckBox("Accepté en saisie");
898
            tabSite.add(boxAcceptSaisie, cTabSite);
899
            cTabSite.gridwidth = 1;
900
 
142 ilm 901
            cTabSite.gridy++;
132 ilm 902
            cTabSite.gridx = 0;
142 ilm 903
            cTabSite.weightx = 0;
904
            tabSite.add(new JLabel(getLabelFor("NB_RAPPORT_SAISI")), cTabSite);
905
            cTabSite.gridx++;
906
            cTabSite.weightx = 1;
907
            JTextField fieldNbRapportSaisi = new JTextField(5);
908
            tabSite.add(fieldNbRapportSaisi, cTabSite);
909
 
910
            cTabSite.gridx++;
911
            cTabSite.weightx = 0;
912
            tabSite.add(new JLabel(getLabelFor("DATE_SAISIE")), cTabSite);
913
            cTabSite.gridx++;
914
            cTabSite.weightx = 0;
915
            JDate dateSaisie = new JDate();
916
            tabSite.add(dateSaisie, cTabSite);
917
            if (!UserRightsManager.getCurrentUserRights().haveRight("VOIR_DEVIS_4_SEMAINES")) {
918
                cTabSite.gridx++;
919
                cTabSite.weightx = 0;
920
                tabSite.add(new JLabel(getLabelFor("DATE_SAISIE_REELLE")), cTabSite);
921
                cTabSite.gridx++;
922
                cTabSite.weightx = 0;
923
                JDate dateSaisieR = new JDate();
924
                tabSite.add(dateSaisieR, cTabSite);
925
                this.addView(dateSaisieR, "DATE_SAISIE_REELLE");
926
            }
132 ilm 927
            cTabSite.gridy++;
142 ilm 928
            cTabSite.weightx = 0;
929
            cTabSite.gridx = 0;
930
            tabSite.add(new JLabel(getLabelFor("TEMPS_SAISIE")), cTabSite);
132 ilm 931
            cTabSite.gridx++;
142 ilm 932
            cTabSite.weightx = 1;
933
            JTextField fieldTpsSaisi = new JTextField(5);
934
            tabSite.add(fieldTpsSaisi, cTabSite);
132 ilm 935
 
936
            cTabSite.gridx++;
142 ilm 937
            cTabSite.weightx = 0;
938
            tabSite.add(new JLabel(getLabelFor("ID_USER_COMMON_SAISIE")), cTabSite);
132 ilm 939
            cTabSite.gridx++;
142 ilm 940
            cTabSite.weightx = 1;
941
            SQLRequestComboBox boxUserSaisi = new SQLRequestComboBox();
942
            tabSite.add(boxUserSaisi, cTabSite);
132 ilm 943
 
944
            // Date de demande
945
            // Nb rapport a saisie
946
            // Type
947
            // Nb Rapport saisie
948
            this.addView(fieldNbRapportASaisir, "NB_RAPPORT_A_SAISIR");
949
            this.addView(fieldNbRapportSaisi, "NB_RAPPORT_SAISI");
950
 
951
            this.addView(dateDmdSaisie, "DATE_DEMANDE_SAISIE");
952
            this.addView(comboType, "TYPE_RAPPORT");
953
            this.addView(dateSaisie, "DATE_SAISIE");
954
            this.addView(boxAcceptSaisie, "ACCEPTE_EN_SAISIE");
955
            this.addView(boxAsaisir, "RAPPORT_A_SAISIR");
142 ilm 956
            this.addView(boxUserSaisi, "ID_USER_COMMON_SAISIE");
957
            this.addView(fieldTpsSaisi, "TEMPS_SAISIE");
132 ilm 958
        }
959
        return tabSite;
960
    }
961
 
73 ilm 962
    private JPanel createPanelDiff(final Type_Diff type) {
963
 
964
        GridBagConstraints cTabSite = new DefaultGridBagConstraints();
965
        JPanel tabSite = new JPanel(new GridBagLayout());
966
 
967
        cTabSite.weightx = 1;
968
        cTabSite.fill = GridBagConstraints.HORIZONTAL;
969
        cTabSite.gridwidth = 2;
970
 
971
        final String name = type.getName();
972
        final JCheckBox boxSiteDiff = new JCheckBox(getLabelFor(name + "_DIFF"));
973
 
974
        tabSite.add(boxSiteDiff, cTabSite);
975
        this.addView(boxSiteDiff, name + "_DIFF");
976
 
977
        final String fieldSiren = "SIREN_" + name;
978
        if (getTable().contains(fieldSiren)) {
979
            final JLabel labelSrenSite = new JLabel(getLabelFor(fieldSiren));
980
            labelSrenSite.setHorizontalAlignment(SwingConstants.RIGHT);
981
            cTabSite.gridwidth = 1;
982
            cTabSite.gridx = 2;
983
            cTabSite.weightx = 0;
984
            tabSite.add(labelSrenSite, cTabSite);
985
 
986
            cTabSite.gridx++;
987
            cTabSite.weightx = 1;
988
            if (type == Type_Diff.SITE) {
989
                throw new IllegalArgumentException("Le siren n'est pas à renseigné pour le site");
990
            }
991
            final JTextField siren = this.sirenDonneur;
992
            tabSite.add(siren, cTabSite);
993
            this.addView(siren, fieldSiren);
994
            DefaultGridBagConstraints.lockMinimumSize(siren);
995
        }
996
        cTabSite.gridy++;
997
        cTabSite.gridx = 0;
998
        cTabSite.weightx = 0;
999
        cTabSite.fill = GridBagConstraints.HORIZONTAL;
1000
        cTabSite.gridwidth = 1;
1001
        final JLabel labelSiteDes = new JLabel(getLabelFor("DESIGNATION_" + name));
1002
 
1003
        labelSiteDes.setHorizontalAlignment(SwingConstants.RIGHT);
1004
 
1005
        tabSite.add(labelSiteDes, cTabSite);
1006
        cTabSite.gridx++;
1007
        cTabSite.weightx = 1;
1008
        final JTextField designation = type == Type_Diff.SITE ? this.desSite : this.desDonneur;
1009
        tabSite.add(designation, cTabSite);
1010
        this.addView(designation, "DESIGNATION_" + name);
1011
        DefaultGridBagConstraints.lockMinimumSize(designation);
1012
 
1013
        final JLabel labelTelSite = new JLabel(getLabelFor("TEL_" + name));
1014
        labelTelSite.setHorizontalAlignment(SwingConstants.RIGHT);
1015
        cTabSite.gridx++;
1016
        cTabSite.weightx = 0;
1017
        tabSite.add(labelTelSite, cTabSite);
1018
 
1019
        cTabSite.gridx++;
1020
        cTabSite.weightx = 1;
1021
        final JTextField tel = type == Type_Diff.SITE ? this.telSite : this.telDonneur;
1022
        tabSite.add(tel, cTabSite);
1023
        this.addView(tel, "TEL_" + name);
1024
        DefaultGridBagConstraints.lockMinimumSize(tel);
1025
 
1026
        final JLabel labelSiteAdr = new JLabel(getLabelFor("ADRESSE_" + name));
1027
        labelSiteAdr.setHorizontalAlignment(SwingConstants.RIGHT);
1028
        cTabSite.gridy++;
1029
        cTabSite.gridx = 0;
1030
        cTabSite.weightx = 0;
1031
        tabSite.add(labelSiteAdr, cTabSite);
1032
 
1033
        cTabSite.gridx++;
1034
        cTabSite.weightx = 1;
1035
        final ITextArea adresse = type == Type_Diff.SITE ? this.adrSite : this.adrDonneur;
1036
        tabSite.add(adresse, cTabSite);
1037
        this.addView(adresse, "ADRESSE_" + name);
1038
        DefaultGridBagConstraints.lockMinimumSize(adresse);
1039
 
1040
        final JLabel labelTelPSite = new JLabel(getLabelFor("TEL_P_" + name));
1041
        labelTelPSite.setHorizontalAlignment(SwingConstants.RIGHT);
1042
        cTabSite.gridx++;
1043
        cTabSite.weightx = 0;
1044
        tabSite.add(labelTelPSite, cTabSite);
1045
 
1046
        cTabSite.gridx++;
1047
        cTabSite.weightx = 1;
1048
        final JTextField telP = type == Type_Diff.SITE ? this.telPSite : this.telPDonneur;
1049
        tabSite.add(telP, cTabSite);
1050
        this.addView(telP, "TEL_P_" + name);
1051
 
1052
        cTabSite.gridy++;
1053
        cTabSite.gridx = 0;
1054
        cTabSite.weightx = 0;
1055
        final JLabel labelVilleAdr = new JLabel(getLabelFor("VILLE_" + name));
1056
        labelVilleAdr.setHorizontalAlignment(SwingConstants.RIGHT);
1057
        tabSite.add(labelVilleAdr, cTabSite);
1058
 
1059
        cTabSite.gridx++;
1060
        cTabSite.weightx = 1;
1061
        final ITextComboVilleViewer ville = type == Type_Diff.SITE ? this.villeSite : this.villeDonneur;
1062
        tabSite.add(ville, cTabSite);
1063
        this.addView(ville, "VILLE_" + name);
1064
        DefaultGridBagConstraints.lockMinimumSize(ville);
1065
 
1066
        cTabSite.gridx++;
1067
        cTabSite.weightx = 0;
1068
 
1069
        final JLabel labelFaxSite = new JLabel(getLabelFor("FAX_" + name));
1070
        labelFaxSite.setHorizontalAlignment(SwingConstants.RIGHT);
1071
        tabSite.add(labelFaxSite, cTabSite);
1072
 
1073
        cTabSite.gridx++;
1074
        cTabSite.weightx = 1;
1075
        final JTextField fax = type == Type_Diff.SITE ? this.faxSite : this.faxDonneur;
1076
        tabSite.add(fax, cTabSite);
1077
        this.addView(fax, "FAX_" + name);
1078
        DefaultGridBagConstraints.lockMinimumSize(fax);
1079
 
1080
        cTabSite.gridy++;
1081
        cTabSite.gridx = 0;
1082
        cTabSite.weightx = 0;
1083
 
1084
        final JLabel labelContactSite = new JLabel(getLabelFor("CONTACT_" + name));
1085
        labelContactSite.setHorizontalAlignment(SwingConstants.RIGHT);
1086
        tabSite.add(labelContactSite, cTabSite);
1087
 
1088
        cTabSite.gridx++;
1089
        cTabSite.weightx = 1;
1090
        final JTextField contact = type == Type_Diff.SITE ? this.contactSite : this.contactDonneur;
1091
        tabSite.add(contact, cTabSite);
1092
        this.addView(contact, "CONTACT_" + name);
1093
 
1094
        cTabSite.gridx++;
1095
        cTabSite.weightx = 0;
1096
 
1097
        final JLabel labelMailSite = new JLabel(getLabelFor("MAIL_" + name));
1098
        labelMailSite.setHorizontalAlignment(SwingConstants.RIGHT);
1099
        tabSite.add(labelMailSite, cTabSite);
1100
 
1101
        cTabSite.gridx++;
1102
        cTabSite.weightx = 1;
1103
        final JTextField mail = type == Type_Diff.SITE ? this.mailSite : this.mailDonneur;
1104
        tabSite.add(mail, cTabSite);
1105
        this.addView(mail, "MAIL_" + name);
1106
 
1107
        boxSiteDiff.addItemListener(new ItemListener() {
1108
 
1109
            @Override
1110
            public void itemStateChanged(ItemEvent e) {
1111
                final boolean selected = boxSiteDiff.isSelected();
1112
                setSiteEnabled(selected, type);
1113
                if (!selected) {
1114
                    clearFieldDiff(type);
1115
                }
1116
            }
1117
        });
1118
        return tabSite;
1119
    }
1120
 
1121
    private void clearFieldDiff(Type_Diff type) {
1122
        if (type == Type_Diff.SITE) {
1123
            this.desSite.setText("");
1124
            this.adrSite.setText("");
1125
            this.villeSite.setValue(null);
1126
            this.telPSite.setText("");
1127
            this.telSite.setText("");
1128
            this.mailSite.setText("");
1129
            this.contactSite.setText("");
1130
            this.faxSite.setText("");
1131
        } else {
1132
            this.sirenDonneur.setText("");
1133
            this.desDonneur.setText("");
1134
            this.adrDonneur.setText("");
1135
            this.villeDonneur.setValue(null);
1136
            this.telPDonneur.setText("");
1137
            this.telDonneur.setText("");
1138
            this.mailDonneur.setText("");
1139
            this.contactDonneur.setText("");
1140
            this.faxDonneur.setText("");
1141
        }
1142
    }
1143
 
1144
    private void setSiteEnabled(boolean b, Type_Diff type) {
1145
        if (type == Type_Diff.SITE) {
1146
            this.desSite.setEditable(b);
1147
            this.adrSite.setEditable(b);
1148
            this.villeSite.setEnabled(b);
1149
            this.telPSite.setEditable(b);
1150
            this.telSite.setEditable(b);
1151
            this.mailSite.setEditable(b);
1152
            this.contactSite.setEditable(b);
1153
            this.faxSite.setEditable(b);
1154
        } else {
90 ilm 1155
            b = false;
1156
 
73 ilm 1157
            this.sirenDonneur.setEditable(b);
1158
            this.desDonneur.setEditable(b);
1159
            this.adrDonneur.setEditable(b);
1160
            this.villeDonneur.setEnabled(b);
1161
            this.telPDonneur.setEditable(b);
1162
            this.telDonneur.setEditable(b);
1163
            this.mailDonneur.setEditable(b);
1164
            this.contactDonneur.setEditable(b);
1165
            this.faxDonneur.setEditable(b);
1166
        }
1167
    }
1168
 
18 ilm 1169
    @Override
1170
    protected SQLRowValues createDefaults() {
1171
        System.err.println("Create defaults");
73 ilm 1172
 
1173
        setSiteEnabled(false, Type_Diff.DONNEUR_ORDRE);
1174
        setSiteEnabled(false, Type_Diff.SITE);
1175
 
18 ilm 1176
        // Numero incremental auto
1177
        final SQLRowValues rowVals = new SQLRowValues(getTable());
90 ilm 1178
        rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(getElement().getClass()));
18 ilm 1179
 
1180
        // User
1181
        // final SQLSelect sel = new SQLSelect(Configuration.getInstance().getBase());
1182
        final SQLElement eltComm = Configuration.getInstance().getDirectory().getElement("COMMERCIAL");
1183
        final int idUser = UserManager.getInstance().getCurrentUser().getId();
1184
        //
1185
        // sel.addSelect(eltComm.getTable().getKey());
1186
        // sel.setWhere(new Where(eltComm.getTable().getField("ID_USER_COMMON"), "=", idUser));
1187
        // final List<SQLRow> rowsComm = (List<SQLRow>)
1188
        // Configuration.getInstance().getBase().getDataSource().execute(sel.asString(), new
1189
        // SQLRowListRSH(eltComm.getTable()));
1190
 
1191
        SQLRow rowsComm = SQLBackgroundTableCache.getInstance().getCacheForTable(eltComm.getTable()).getFirstRowContains(idUser, eltComm.getTable().getField("ID_USER_COMMON"));
1192
 
1193
        if (rowsComm != null) {
1194
            rowVals.put("ID_COMMERCIAL", rowsComm.getID());
1195
        }
90 ilm 1196
 
41 ilm 1197
        if (getTable().getUndefinedID() == SQLRow.NONEXISTANT_ID) {
1198
            rowVals.put("ID_ETAT_DEVIS", EtatDevisSQLElement.EN_ATTENTE);
1199
        } else {
65 ilm 1200
            SQLRowValues foreign = UndefinedRowValuesCache.getInstance().getDefaultRowValues(getTable());
132 ilm 1201
            if (foreign != null && !foreign.isUndefined() && !foreign.isForeignEmpty("ID_ETAT_DEVIS")) {
1202
                rowVals.put("ID_ETAT_DEVIS", foreign.getForeignID("ID_ETAT_DEVIS"));
41 ilm 1203
            } else {
1204
                rowVals.put("ID_ETAT_DEVIS", EtatDevisSQLElement.EN_ATTENTE);
1205
            }
1206
        }
18 ilm 1207
        rowVals.put("T_HT", Long.valueOf(0));
1208
        rowVals.put("T_TVA", Long.valueOf(0));
1209
        rowVals.put("T_SERVICE", Long.valueOf(0));
1210
        rowVals.put("T_TTC", Long.valueOf(0));
144 ilm 1211
        if (getTable().contains("ID_TAXE_PORT")) {
1212
            SQLRow taxeDefault = TaxeCache.getCache().getFirstTaxe();
1213
            rowVals.put("ID_TAXE_PORT", taxeDefault.getID());
1214
        }
156 ilm 1215
        if (getTable().contains("ID_TAXE_FRAIS_DOCUMENT")) {
1216
            SQLRow taxeDefault = TaxeCache.getCache().getFirstTaxe();
1217
            rowVals.put("ID_TAXE_FRAIS_DOCUMENT", taxeDefault.getID());
1218
        }
19 ilm 1219
        if (getTable().getFieldsName().contains("DATE_VALIDITE")) {
1220
            Calendar cal = Calendar.getInstance();
1221
            cal.add(Calendar.MONTH, 1);
142 ilm 1222
            rowVals.put("DATE_VALIDITE", new java.sql.Date(cal.getTimeInMillis()));
19 ilm 1223
        }
18 ilm 1224
        return rowVals;
1225
    }
1226
 
1227
    private void calculPourcentage() {
1228
        final String remiseP = this.textPourcentRemise.getText().replace(',', '.');
73 ilm 1229
        Long totalHT = this.fieldHT.getValue();
1230
        Long remiseHT = this.textRemiseHT.getValue();
18 ilm 1231
 
1232
        totalHT = totalHT == null ? Long.valueOf(0) : totalHT;
1233
        remiseHT = remiseHT == null ? Long.valueOf(0) : remiseHT;
1234
 
1235
        try {
1236
            final int valueRemise = Integer.valueOf(remiseP);
1237
 
1238
            final long remise = valueRemise * (totalHT.longValue() + remiseHT.longValue()) / 100;
1239
            if (remiseHT != remise) {
73 ilm 1240
                this.textRemiseHT.setValue(remise);
18 ilm 1241
            }
1242
 
1243
        } catch (final NumberFormatException e) {
1244
            ExceptionHandler.handle("Erreur durant le calcul de la remise", e);
1245
        }
1246
 
1247
    }
1248
 
1249
    @Override
1250
    public int insert(final SQLRow order) {
1251
 
25 ilm 1252
        final int idDevis;
142 ilm 1253
        int attempt = 0;
18 ilm 1254
        // on verifie qu'un devis du meme numero n'a pas été inséré entre temps
142 ilm 1255
        if (!this.numeroUniqueDevis.checkValidation(false)) {
1256
            while (attempt < JUniqueTextField.RETRY_COUNT) {
1257
                String num = NumerotationAutoSQLElement.getNextNumero(getElement().getClass(), dateDevis.getDate());
1258
                this.numeroUniqueDevis.setText(num);
1259
                attempt++;
1260
                if (this.numeroUniqueDevis.checkValidation(false)) {
1261
                    System.err.println("ATEMPT " + attempt + " SUCCESS WITH NUMERO " + num);
1262
                    break;
1263
                }
1264
                try {
1265
                    Thread.sleep(JUniqueTextField.SLEEP_WAIT_MS);
1266
                } catch (InterruptedException e) {
1267
                    e.printStackTrace();
1268
                }
1269
            }
1270
        }
1271
        final String num = this.numeroUniqueDevis.getText();
1272
        if (attempt == JUniqueTextField.RETRY_COUNT) {
1273
            idDevis = getSelectedID();
1274
            ExceptionHandler.handle("Impossible d'ajouter, numéro de devis existant.");
1275
            final Object root = SwingUtilities.getRoot(this);
1276
            if (root instanceof EditFrame) {
1277
                final EditFrame frame = (EditFrame) root;
1278
                frame.getPanel().setAlwaysVisible(true);
1279
            }
1280
        } else {
18 ilm 1281
 
1282
            idDevis = super.insert(order);
1283
            this.table.updateField("ID_DEVIS", idDevis);
1284
            // Création des articles
1285
            this.table.createArticle(idDevis, getElement());
1286
 
1287
            // generation du document
25 ilm 1288
            try {
1289
                final DevisXmlSheet sheet = new DevisXmlSheet(getTable().getRow(idDevis));
1290
                sheet.createDocumentAsynchronous();
1291
                sheet.showPrintAndExportAsynchronous(DevisSQLComponent.this.panelOO.isVisualisationSelected(), DevisSQLComponent.this.panelOO.isImpressionSelected(), true);
1292
            } catch (Exception e) {
1293
                ExceptionHandler.handle("Impossible de créer le devis", e);
1294
            }
18 ilm 1295
 
1296
            // incrémentation du numéro auto
90 ilm 1297
            if (NumerotationAutoSQLElement.getNextNumero(getElement().getClass()).equalsIgnoreCase(this.numeroUniqueDevis.getText().trim())) {
18 ilm 1298
                final SQLRowValues rowVals = new SQLRowValues(this.tableNum);
90 ilm 1299
                int val = this.tableNum.getRow(2).getInt(NumerotationAutoSQLElement.getLabelNumberFor(getElement().getClass()));
18 ilm 1300
                val++;
90 ilm 1301
                rowVals.put(NumerotationAutoSQLElement.getLabelNumberFor(getElement().getClass()), new Integer(val));
18 ilm 1302
                try {
1303
                    rowVals.update(2);
1304
                } catch (final SQLException e) {
1305
                    e.printStackTrace();
1306
                }
1307
            }
142 ilm 1308
            if (attempt > 0) {
1309
                SwingUtilities.invokeLater(new Runnable() {
1310
                    public void run() {
1311
                        JOptionPane.showMessageDialog(null, "Le numéro a été actualisé en " + num);
1312
                    }
1313
                });
18 ilm 1314
            }
1315
        }
1316
 
1317
        return idDevis;
1318
    }
1319
 
1320
    @Override
1321
    public void select(final SQLRowAccessor r) {
41 ilm 1322
        if (r == null || r.getIDNumber() == null)
1323
            super.select(r);
1324
        else {
1325
            System.err.println(r);
132 ilm 1326
            final SQLRowValues rVals = r.asRowValues().deepCopy();
41 ilm 1327
            final SQLRowValues vals = new SQLRowValues(r.getTable());
1328
            vals.load(rVals, createSet("ID_CLIENT"));
1329
            vals.setID(rVals.getID());
1330
            System.err.println("Select CLIENT");
1331
 
1332
            super.select(vals);
1333
            rVals.remove("ID_CLIENT");
1334
            super.select(rVals);
1335
        }
1336
 
1337
        // super.select(r);
18 ilm 1338
        if (r != null) {
1339
            this.table.insertFrom("ID_DEVIS", r.getID());
41 ilm 1340
            // this.radioEtat.setVisible(r.getID() > getTable().getUndefinedID());
73 ilm 1341
            if (getTable().contains("SITE_DIFF"))
1342
                setSiteEnabled(r.getBoolean("SITE_DIFF"), Type_Diff.SITE);
1343
 
1344
            if (getTable().contains("DONNEUR_DIFF"))
1345
                setSiteEnabled(r.getBoolean("DONNEUR_DIFF"), Type_Diff.DONNEUR_ORDRE);
18 ilm 1346
        }
73 ilm 1347
 
18 ilm 1348
    }
1349
 
1350
    @Override
1351
    public void update() {
1352
 
1353
        if (!this.numeroUniqueDevis.checkValidation()) {
1354
            ExceptionHandler.handle("Impossible de modifier, numéro de devis existant.");
1355
            final Object root = SwingUtilities.getRoot(this);
1356
            if (root instanceof EditFrame) {
1357
                final EditFrame frame = (EditFrame) root;
1358
                frame.getPanel().setAlwaysVisible(true);
1359
            }
1360
            return;
1361
        }
1362
        super.update();
1363
        this.table.updateField("ID_DEVIS", getSelectedID());
1364
        this.table.createArticle(getSelectedID(), getElement());
1365
 
1366
        // generation du document
25 ilm 1367
 
1368
        try {
1369
            final DevisXmlSheet sheet = new DevisXmlSheet(getTable().getRow(getSelectedID()));
1370
            sheet.createDocumentAsynchronous();
1371
            sheet.showPrintAndExportAsynchronous(DevisSQLComponent.this.panelOO.isVisualisationSelected(), DevisSQLComponent.this.panelOO.isImpressionSelected(), true);
1372
        } catch (Exception e) {
1373
            ExceptionHandler.handle("Impossible de créer le devis", e);
1374
        }
1375
 
18 ilm 1376
    }
1377
 
1378
    /**
1379
     * Création d'un devis à partir d'un devis existant
1380
     *
1381
     * @param idDevis
1382
     *
1383
     */
1384
    public void loadDevisExistant(final int idDevis) {
1385
 
1386
        final SQLElement devis = Configuration.getInstance().getDirectory().getElement("DEVIS");
1387
        final SQLElement devisElt = Configuration.getInstance().getDirectory().getElement("DEVIS_ELEMENT");
1388
 
1389
        // On duplique le devis
1390
        if (idDevis > 1) {
1391
            final SQLRow row = devis.getTable().getRow(idDevis);
1392
            final SQLRowValues rowVals = new SQLRowValues(devis.getTable());
1393
            rowVals.put("ID_CLIENT", row.getInt("ID_CLIENT"));
156 ilm 1394
            if (row.getObject("ID_TARIF") != null && !row.isForeignEmpty("ID_TARIF")) {
1395
                rowVals.put("ID_TARIF", row.getInt("ID_TARIF"));
1396
            }
90 ilm 1397
            rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(getElement().getClass()));
73 ilm 1398
 
1399
 
18 ilm 1400
            this.select(rowVals);
1401
        }
1402
 
1403
        // On duplique les elements de devis
1404
        final List<SQLRow> myListItem = devis.getTable().getRow(idDevis).getReferentRows(devisElt.getTable());
1405
 
1406
        if (myListItem.size() != 0) {
1407
            this.table.getModel().clearRows();
1408
 
1409
            for (final SQLRow rowElt : myListItem) {
1410
 
1411
                final SQLRowValues rowVals = rowElt.createUpdateRow();
1412
                rowVals.clearPrimaryKeys();
1413
                this.table.getModel().addRow(rowVals);
1414
                final int rowIndex = this.table.getModel().getRowCount() - 1;
1415
                this.table.getModel().fireTableModelModified(rowIndex);
1416
            }
1417
        } else {
1418
            this.table.getModel().clearRows();
1419
        }
1420
        this.table.getModel().fireTableDataChanged();
1421
        this.table.repaint();
1422
    }
93 ilm 1423
 
18 ilm 1424
}