OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

Rev 132 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
93 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.ui;
15
 
16
import static org.openconcerto.utils.CollectionUtils.createSet;
17
import org.openconcerto.erp.config.ComptaPropsConfiguration;
18
import org.openconcerto.erp.core.common.element.NumerotationAutoSQLElement;
19
import org.openconcerto.erp.core.common.ui.AbstractArticleItemTable;
20
import org.openconcerto.erp.core.common.ui.DeviseField;
21
import org.openconcerto.erp.core.common.ui.TotalPanel;
22
import org.openconcerto.erp.core.sales.quote.element.EtatDevisSQLElement;
23
import org.openconcerto.erp.core.sales.quote.report.DevisXmlSheet;
24
import org.openconcerto.erp.panel.PanelOOSQLComponent;
25
import org.openconcerto.map.ui.ITextComboVilleViewer;
26
import org.openconcerto.sql.Configuration;
27
import org.openconcerto.sql.element.GlobalMapper;
28
import org.openconcerto.sql.element.GroupSQLComponent;
29
import org.openconcerto.sql.element.SQLElement;
30
import org.openconcerto.sql.model.SQLBackgroundTableCache;
31
import org.openconcerto.sql.model.SQLRow;
32
import org.openconcerto.sql.model.SQLRowAccessor;
33
import org.openconcerto.sql.model.SQLRowValues;
34
import org.openconcerto.sql.model.SQLTable;
35
import org.openconcerto.sql.model.UndefinedRowValuesCache;
36
import org.openconcerto.sql.sqlobject.JUniqueTextField;
37
import org.openconcerto.sql.ui.RadioButtons;
38
import org.openconcerto.sql.users.UserManager;
39
import org.openconcerto.sql.view.EditFrame;
40
import org.openconcerto.ui.DefaultGridBagConstraints;
41
import org.openconcerto.ui.JDate;
42
import org.openconcerto.ui.component.ITextArea;
43
import org.openconcerto.ui.group.Group;
44
import org.openconcerto.utils.ExceptionHandler;
45
import org.openconcerto.utils.checks.ValidState;
46
 
47
import java.awt.GridBagConstraints;
48
import java.awt.GridBagLayout;
49
import java.awt.event.ItemEvent;
50
import java.awt.event.ItemListener;
51
import java.sql.SQLException;
52
import java.util.Calendar;
53
import java.util.Date;
54
import java.util.HashSet;
55
import java.util.List;
56
import java.util.Set;
57
 
58
import javax.swing.JCheckBox;
59
import javax.swing.JComponent;
60
import javax.swing.JLabel;
61
import javax.swing.JPanel;
62
import javax.swing.JTextField;
63
import javax.swing.SwingConstants;
64
import javax.swing.SwingUtilities;
65
 
66
public class QuoteSQLComponent extends GroupSQLComponent {
67
 
68
    public static final String ID = "sales.quote";
69
    protected DevisItemTable table = new DevisItemTable();
70
 
71
    private JUniqueTextField numeroUniqueDevis;
72
    private final SQLTable tableNum = getTable().getBase().getTable("NUMEROTATION_AUTO");
73
    private final ITextArea infos = new ITextArea();
74
    private final RadioButtons radioEtat = new RadioButtons("NOM");
75
    private JTextField textPourcentRemise, textPoidsTotal;
76
    private DeviseField textRemiseHT;
77
    private DeviseField fieldHT;
78
    private PanelOOSQLComponent panelOO;
79
 
80
    // Site d'intervention
81
    final JTextField telSite = new JTextField(20);
82
    final ITextComboVilleViewer villeSite = new ITextComboVilleViewer();
83
    final JTextField faxSite = new JTextField(20);
84
    final JTextField telPSite = new JTextField(20);
85
    final JTextField mailSite = new JTextField(20);
86
    final JTextField contactSite = new JTextField(20);
87
    final JTextField desSite = new JTextField(20);
88
    final ITextArea adrSite = new ITextArea();
89
 
90
    // Donneur d'ordre
91
    final JTextField telDonneur = new JTextField(20);
92
    final JTextField sirenDonneur = new JTextField(20);
93
    final ITextComboVilleViewer villeDonneur = new ITextComboVilleViewer();
94
    final JTextField faxDonneur = new JTextField(20);
95
    final JTextField telPDonneur = new JTextField(20);
96
    final JTextField mailDonneur = new JTextField(20);
97
    final JTextField contactDonneur = new JTextField(20);
98
    final JTextField desDonneur = new JTextField(20);
99
    final ITextArea adrDonneur = new ITextArea();
100
 
101
    public QuoteSQLComponent(SQLElement element) {
102
        super(element);
103
    }
104
 
105
    @Override
106
    public Set<String> getPartialResetNames() {
107
        Set<String> s = new HashSet<String>();
108
        s.add("OBJET");
109
        s.add("NUMERO");
110
        return s;
111
    }
112
 
113
    // @Override
114
    // protected Set<String> createRequiredNames() {
115
    // final Set<String> s = new HashSet<String>();
116
    // s.add("NOM");
117
    // s.add("ID_ADRESSE");
118
    // s.add("ID_MODE_REGLEMENT");
119
    // return s;
120
    // }
121
 
122
    @Override
123
    public JComponent createEditor(String id) {
124
        if (id.equals("sales.quote.number")) {
125
            this.numeroUniqueDevis = new JUniqueTextField(15);
126
            return this.numeroUniqueDevis;
127
        } else if (id.equals("panel.oo")) {
128
            this.panelOO = new PanelOOSQLComponent(this);
129
            return this.panelOO;
130
        } else if (id.equals("DATE")) {
131
            return new JDate(true);
132
        } else if (id.equals("sales.quote.state")) {
133
            return new RadioButtons("NOM");
134
        } else if (id.equals("sales.quote.items.list")) {
135
            return this.table;
136
        } else if (id.equals("T_POIDS")) {
137
            return new JTextField(10);
138
        } else if (id.equals("sales.quote.total.amount")) {
139
            final AbstractArticleItemTable items = (AbstractArticleItemTable) getEditor("sales.quote.items.list");
140
 
141
            final DeviseField totalHT = (DeviseField) getEditor("T_HT");
142
            final DeviseField totalService = (DeviseField) getEditor("T_SERVICE");
143
            final DeviseField totalSupply = (getTable().contains("PREBILAN") ? (DeviseField) getEditor("PREBILAN") : (DeviseField) getEditor("T_HA"));
144
            final DeviseField totalDevise = (DeviseField) getEditor("T_DEVISE");
145
            final JTextField totalWeight = (JTextField) getEditor("T_POIDS");
146
            final DeviseField totalTTC = (DeviseField) getEditor("T_TTC");
147
            final DeviseField totalTVA = (DeviseField) getEditor("T_TVA");
148
            final DeviseField totalRemise = (DeviseField) getEditor("REMISE_HT");
149
            final DeviseField totalPORT = (DeviseField) getEditor("PORT_HT");
150
 
151
            return new TotalPanel(items, totalHT, totalTVA, totalTTC, totalRemise, totalPORT, totalService, totalSupply, totalDevise, totalWeight, null);
152
        } else if (id.startsWith("T_")) {
153
            return new DeviseField();
154
        } else if (id.equals("REMISE_HT") || id.equals("PORT_HT") || id.equals("PREBILAN")) {
155
            return new DeviseField();
156
        } else if (id.equals("sales.quote.info.general")) {
157
            return new ITextArea(4, 40);
158
        }
159
        return super.createEditor(id);
160
    }
161
 
162
    private enum Type_Diff {
163
        SITE("SITE"), DONNEUR_ORDRE("DONNEUR");
164
        private final String name;
165
 
166
        private Type_Diff(String name) {
167
            this.name = name;
168
        }
169
 
170
        public String getName() {
171
            return this.name;
172
        }
173
    }
174
 
175
    private ValidState validStateContact = ValidState.getTrueInstance();
176
 
177
    @Override
178
    public synchronized ValidState getValidState() {
179
        assert SwingUtilities.isEventDispatchThread();
180
        return super.getValidState().and(this.validStateContact);
181
    }
182
 
183
    private JPanel createPanelDiff(final Type_Diff type) {
184
 
185
        GridBagConstraints cTabSite = new DefaultGridBagConstraints();
186
        JPanel tabSite = new JPanel(new GridBagLayout());
187
 
188
        cTabSite.weightx = 1;
189
        cTabSite.fill = GridBagConstraints.HORIZONTAL;
190
        cTabSite.gridwidth = 2;
191
 
192
        final String name = type.getName();
193
        final JCheckBox boxSiteDiff = new JCheckBox(getLabelFor(name + "_DIFF"));
194
 
195
        tabSite.add(boxSiteDiff, cTabSite);
196
        this.addView(boxSiteDiff, name + "_DIFF");
197
 
198
        final String fieldSiren = "SIREN_" + name;
199
        if (getTable().contains(fieldSiren)) {
200
            final JLabel labelSrenSite = new JLabel(getLabelFor(fieldSiren));
201
            labelSrenSite.setHorizontalAlignment(SwingConstants.RIGHT);
202
            cTabSite.gridwidth = 1;
203
            cTabSite.gridx = 2;
204
            cTabSite.weightx = 0;
205
            tabSite.add(labelSrenSite, cTabSite);
206
 
207
            cTabSite.gridx++;
208
            cTabSite.weightx = 1;
209
            if (type == Type_Diff.SITE) {
210
                throw new IllegalArgumentException("Le siren n'est pas à renseigné pour le site");
211
            }
212
            final JTextField siren = this.sirenDonneur;
213
            tabSite.add(siren, cTabSite);
214
            this.addView(siren, fieldSiren);
215
            DefaultGridBagConstraints.lockMinimumSize(siren);
216
        }
217
        cTabSite.gridy++;
218
        cTabSite.gridx = 0;
219
        cTabSite.weightx = 0;
220
        cTabSite.fill = GridBagConstraints.HORIZONTAL;
221
        cTabSite.gridwidth = 1;
222
        final JLabel labelSiteDes = new JLabel(getLabelFor("DESIGNATION_" + name));
223
 
224
        labelSiteDes.setHorizontalAlignment(SwingConstants.RIGHT);
225
 
226
        tabSite.add(labelSiteDes, cTabSite);
227
        cTabSite.gridx++;
228
        cTabSite.weightx = 1;
229
        final JTextField designation = type == Type_Diff.SITE ? this.desSite : this.desDonneur;
230
        tabSite.add(designation, cTabSite);
231
        this.addView(designation, "DESIGNATION_" + name);
232
        DefaultGridBagConstraints.lockMinimumSize(designation);
233
 
234
        final JLabel labelTelSite = new JLabel(getLabelFor("TEL_" + name));
235
        labelTelSite.setHorizontalAlignment(SwingConstants.RIGHT);
236
        cTabSite.gridx++;
237
        cTabSite.weightx = 0;
238
        tabSite.add(labelTelSite, cTabSite);
239
 
240
        cTabSite.gridx++;
241
        cTabSite.weightx = 1;
242
        final JTextField tel = type == Type_Diff.SITE ? this.telSite : this.telDonneur;
243
        tabSite.add(tel, cTabSite);
244
        this.addView(tel, "TEL_" + name);
245
        DefaultGridBagConstraints.lockMinimumSize(tel);
246
 
247
        final JLabel labelSiteAdr = new JLabel(getLabelFor("ADRESSE_" + name));
248
        labelSiteAdr.setHorizontalAlignment(SwingConstants.RIGHT);
249
        cTabSite.gridy++;
250
        cTabSite.gridx = 0;
251
        cTabSite.weightx = 0;
252
        tabSite.add(labelSiteAdr, cTabSite);
253
 
254
        cTabSite.gridx++;
255
        cTabSite.weightx = 1;
256
        final ITextArea adresse = type == Type_Diff.SITE ? this.adrSite : this.adrDonneur;
257
        tabSite.add(adresse, cTabSite);
258
        this.addView(adresse, "ADRESSE_" + name);
259
        DefaultGridBagConstraints.lockMinimumSize(adresse);
260
 
261
        final JLabel labelTelPSite = new JLabel(getLabelFor("TEL_P_" + name));
262
        labelTelPSite.setHorizontalAlignment(SwingConstants.RIGHT);
263
        cTabSite.gridx++;
264
        cTabSite.weightx = 0;
265
        tabSite.add(labelTelPSite, cTabSite);
266
 
267
        cTabSite.gridx++;
268
        cTabSite.weightx = 1;
269
        final JTextField telP = type == Type_Diff.SITE ? this.telPSite : this.telPDonneur;
270
        tabSite.add(telP, cTabSite);
271
        this.addView(telP, "TEL_P_" + name);
272
 
273
        cTabSite.gridy++;
274
        cTabSite.gridx = 0;
275
        cTabSite.weightx = 0;
276
        final JLabel labelVilleAdr = new JLabel(getLabelFor("VILLE_" + name));
277
        labelVilleAdr.setHorizontalAlignment(SwingConstants.RIGHT);
278
        tabSite.add(labelVilleAdr, cTabSite);
279
 
280
        cTabSite.gridx++;
281
        cTabSite.weightx = 1;
282
        final ITextComboVilleViewer ville = type == Type_Diff.SITE ? this.villeSite : this.villeDonneur;
283
        tabSite.add(ville, cTabSite);
284
        this.addView(ville, "VILLE_" + name);
285
        DefaultGridBagConstraints.lockMinimumSize(ville);
286
 
287
        cTabSite.gridx++;
288
        cTabSite.weightx = 0;
289
 
290
        final JLabel labelFaxSite = new JLabel(getLabelFor("FAX_" + name));
291
        labelFaxSite.setHorizontalAlignment(SwingConstants.RIGHT);
292
        tabSite.add(labelFaxSite, cTabSite);
293
 
294
        cTabSite.gridx++;
295
        cTabSite.weightx = 1;
296
        final JTextField fax = type == Type_Diff.SITE ? this.faxSite : this.faxDonneur;
297
        tabSite.add(fax, cTabSite);
298
        this.addView(fax, "FAX_" + name);
299
        DefaultGridBagConstraints.lockMinimumSize(fax);
300
 
301
        cTabSite.gridy++;
302
        cTabSite.gridx = 0;
303
        cTabSite.weightx = 0;
304
 
305
        final JLabel labelContactSite = new JLabel(getLabelFor("CONTACT_" + name));
306
        labelContactSite.setHorizontalAlignment(SwingConstants.RIGHT);
307
        tabSite.add(labelContactSite, cTabSite);
308
 
309
        cTabSite.gridx++;
310
        cTabSite.weightx = 1;
311
        final JTextField contact = type == Type_Diff.SITE ? this.contactSite : this.contactDonneur;
312
        tabSite.add(contact, cTabSite);
313
        this.addView(contact, "CONTACT_" + name);
314
 
315
        cTabSite.gridx++;
316
        cTabSite.weightx = 0;
317
 
318
        final JLabel labelMailSite = new JLabel(getLabelFor("MAIL_" + name));
319
        labelMailSite.setHorizontalAlignment(SwingConstants.RIGHT);
320
        tabSite.add(labelMailSite, cTabSite);
321
 
322
        cTabSite.gridx++;
323
        cTabSite.weightx = 1;
324
        final JTextField mail = type == Type_Diff.SITE ? this.mailSite : this.mailDonneur;
325
        tabSite.add(mail, cTabSite);
326
        this.addView(mail, "MAIL_" + name);
327
 
328
        boxSiteDiff.addItemListener(new ItemListener() {
329
 
330
            @Override
331
            public void itemStateChanged(ItemEvent e) {
332
                final boolean selected = boxSiteDiff.isSelected();
333
                setSiteEnabled(selected, type);
334
                if (!selected) {
335
                    clearFieldDiff(type);
336
                }
337
            }
338
        });
339
        return tabSite;
340
    }
341
 
342
    private void clearFieldDiff(Type_Diff type) {
343
        if (type == Type_Diff.SITE) {
344
            this.desSite.setText("");
345
            this.adrSite.setText("");
346
            this.villeSite.setValue(null);
347
            this.telPSite.setText("");
348
            this.telSite.setText("");
349
            this.mailSite.setText("");
350
            this.contactSite.setText("");
351
            this.faxSite.setText("");
352
        } else {
353
            this.sirenDonneur.setText("");
354
            this.desDonneur.setText("");
355
            this.adrDonneur.setText("");
356
            this.villeDonneur.setValue(null);
357
            this.telPDonneur.setText("");
358
            this.telDonneur.setText("");
359
            this.mailDonneur.setText("");
360
            this.contactDonneur.setText("");
361
            this.faxDonneur.setText("");
362
        }
363
    }
364
 
365
    private void setSiteEnabled(boolean b, Type_Diff type) {
366
        if (type == Type_Diff.SITE) {
367
            this.desSite.setEditable(b);
368
            this.adrSite.setEditable(b);
369
            this.villeSite.setEnabled(b);
370
            this.telPSite.setEditable(b);
371
            this.telSite.setEditable(b);
372
            this.mailSite.setEditable(b);
373
            this.contactSite.setEditable(b);
374
            this.faxSite.setEditable(b);
375
        } else {
376
            b = false;
377
 
378
            this.sirenDonneur.setEditable(b);
379
            this.desDonneur.setEditable(b);
380
            this.adrDonneur.setEditable(b);
381
            this.villeDonneur.setEnabled(b);
382
            this.telPDonneur.setEditable(b);
383
            this.telDonneur.setEditable(b);
384
            this.mailDonneur.setEditable(b);
385
            this.contactDonneur.setEditable(b);
386
            this.faxDonneur.setEditable(b);
387
        }
388
    }
389
 
390
    @Override
391
    protected SQLRowValues createDefaults() {
392
        System.err.println("Create defaults");
393
 
394
        // setSiteEnabled(false, Type_Diff.DONNEUR_ORDRE);
395
        // setSiteEnabled(false, Type_Diff.SITE);
396
 
397
        // Numero incremental auto
398
        final SQLRowValues rowVals = new SQLRowValues(getTable());
399
        rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(getElement().getClass()));
400
 
401
        // User
402
        final SQLElement eltComm = Configuration.getInstance().getDirectory().getElement("COMMERCIAL");
403
        final int idUser = UserManager.getInstance().getCurrentUser().getId();
404
 
405
        SQLRow rowsComm = SQLBackgroundTableCache.getInstance().getCacheForTable(eltComm.getTable()).getFirstRowContains(idUser, eltComm.getTable().getField("ID_USER_COMMON"));
406
 
407
        if (rowsComm != null) {
408
            rowVals.put("ID_COMMERCIAL", rowsComm.getID());
409
        }
410
 
411
        if (getTable().getUndefinedID() == SQLRow.NONEXISTANT_ID) {
412
            rowVals.put("ID_ETAT_DEVIS", EtatDevisSQLElement.EN_ATTENTE);
413
        } else {
414
            SQLRowValues foreign = UndefinedRowValuesCache.getInstance().getDefaultRowValues(getTable());
415
            if (foreign != null && !foreign.isUndefined()) {
416
                rowVals.put("ID_ETAT_DEVIS", foreign.getObject("ID_ETAT_DEVIS"));
417
            } else {
418
                rowVals.put("ID_ETAT_DEVIS", EtatDevisSQLElement.EN_ATTENTE);
419
            }
420
 
421
        }
422
        rowVals.put("DATE", new Date());
423
        rowVals.put("T_HT", Long.valueOf(0));
424
        rowVals.put("T_TVA", Long.valueOf(0));
425
        rowVals.put("T_SERVICE", Long.valueOf(0));
426
        rowVals.put("T_TTC", Long.valueOf(0));
427
 
428
        if (getTable().getFieldsName().contains("DATE_VALIDITE")) {
429
            Calendar cal = Calendar.getInstance();
430
            cal.add(Calendar.MONTH, 1);
431
            rowVals.put("DATE_VALIDITE", cal.getTime());
432
        }
433
        return rowVals;
434
    }
435
 
436
    private void calculPourcentage() {
437
        final String remiseP = this.textPourcentRemise.getText().replace(',', '.');
438
        Long totalHT = this.fieldHT.getValue();
439
        Long remiseHT = this.textRemiseHT.getValue();
440
 
441
        totalHT = totalHT == null ? Long.valueOf(0) : totalHT;
442
        remiseHT = remiseHT == null ? Long.valueOf(0) : remiseHT;
443
 
444
        try {
445
            final int valueRemise = Integer.valueOf(remiseP);
446
 
447
            final long remise = valueRemise * (totalHT.longValue() + remiseHT.longValue()) / 100;
448
            if (remiseHT != remise) {
449
                this.textRemiseHT.setValue(remise);
450
            }
451
 
452
        } catch (final NumberFormatException e) {
453
            ExceptionHandler.handle("Erreur durant le calcul de la remise", e);
454
        }
455
 
456
    }
457
 
458
    @Override
459
    protected void addViews() {
460
 
461
        super.addViews();
462
 
463
        final DeviseField totalHT = (DeviseField) getEditor("T_HT");
464
        final DeviseField totalService = (DeviseField) getEditor("T_SERVICE");
465
        final DeviseField totalSupply = (DeviseField) getEditor("T_HA");
466
        final DeviseField totalDevise = (DeviseField) getEditor("T_DEVISE");
467
        final JTextField totalWeight = (JTextField) getEditor("T_POIDS");
468
        final DeviseField totalTTC = (DeviseField) getEditor("T_TTC");
469
        final DeviseField totalTVA = (DeviseField) getEditor("T_TVA");
470
        final DeviseField totalRemise = (DeviseField) getEditor("REMISE_HT");
471
        final DeviseField totalPORT = (DeviseField) getEditor("PORT_HT");
472
 
473
        if (getTable().contains("PREBILAN")) {
474
            this.addView(getEditor("PREBILAN"), "PREBILAN");
475
        }
476
 
477
        this.addView(totalPORT, "PORT_HT");
478
        this.addView(totalRemise, "REMISE_HT");
479
        this.addView(totalTVA, "T_TVA");
480
        this.addView(totalTTC, "T_TTC");
481
        this.addView(totalWeight, "T_POIDS");
482
        this.addView(totalDevise, "T_DEVISE");
483
        this.addView(totalSupply, "T_HA");
484
        this.addView(totalService, "T_SERVICE");
485
        this.addView(totalHT, "T_HT");
486
    }
487
 
488
    @Override
489
    public JComponent getLabel(String id) {
490
        if (id.equals("sales.quote.total.amount")) {
491
            return new JLabel();
492
        } else if (id.equals("panel.oo")) {
493
            return new JLabel();
494
        } else {
495
            return super.getLabel(id);
496
        }
497
    }
498
 
499
    @Override
500
    public int insert(final SQLRow order) {
501
 
502
        final int idDevis;
503
        // on verifie qu'un devis du meme numero n'a pas été inséré entre temps
504
        if (this.numeroUniqueDevis.checkValidation()) {
505
 
506
            idDevis = super.insert(order);
507
            this.table.updateField("ID_DEVIS", idDevis);
508
            // Création des articles
509
            this.table.createArticle(idDevis, getElement());
510
 
511
            // generation du document
512
            try {
513
                final DevisXmlSheet sheet = new DevisXmlSheet(getTable().getRow(idDevis));
514
                sheet.createDocumentAsynchronous();
515
                sheet.showPrintAndExportAsynchronous(QuoteSQLComponent.this.panelOO.isVisualisationSelected(), QuoteSQLComponent.this.panelOO.isImpressionSelected(), true);
516
            } catch (Exception e) {
517
                ExceptionHandler.handle("Impossible de créer le devis", e);
518
            }
519
 
520
            // incrémentation du numéro auto
521
            if (NumerotationAutoSQLElement.getNextNumero(getElement().getClass()).equalsIgnoreCase(this.numeroUniqueDevis.getText().trim())) {
522
                final SQLRowValues rowVals = new SQLRowValues(this.tableNum);
523
                int val = this.tableNum.getRow(2).getInt(NumerotationAutoSQLElement.getLabelNumberFor(getElement().getClass()));
524
                val++;
525
                rowVals.put(NumerotationAutoSQLElement.getLabelNumberFor(getElement().getClass()), new Integer(val));
526
                try {
527
                    rowVals.update(2);
528
                } catch (final SQLException e) {
529
                    e.printStackTrace();
530
                }
531
            }
532
        } else {
533
            idDevis = getSelectedID();
534
            ExceptionHandler.handle("Impossible d'ajouter, numéro de devis existant.");
535
            final Object root = SwingUtilities.getRoot(this);
536
            if (root instanceof EditFrame) {
537
                final EditFrame frame = (EditFrame) root;
538
                frame.getPanel().setAlwaysVisible(true);
539
            }
540
        }
541
 
542
        return idDevis;
543
    }
544
 
545
    @Override
546
    public void select(final SQLRowAccessor r) {
547
        if (r == null || r.getIDNumber() == null)
548
            super.select(r);
549
        else {
550
            System.err.println(r);
551
            final SQLRowValues rVals = r.asRowValues();
552
            final SQLRowValues vals = new SQLRowValues(r.getTable());
553
            vals.load(rVals, createSet("ID_CLIENT"));
554
            vals.setID(rVals.getID());
555
            System.err.println("Select CLIENT");
556
 
557
            super.select(vals);
558
            rVals.remove("ID_CLIENT");
559
            super.select(rVals);
560
        }
561
 
562
        // super.select(r);
563
        if (r != null) {
564
            this.table.insertFrom("ID_DEVIS", r.getID());
565
            // this.radioEtat.setVisible(r.getID() > getTable().getUndefinedID());
566
            if (getTable().contains("SITE_DIFF"))
567
                setSiteEnabled(r.getBoolean("SITE_DIFF"), Type_Diff.SITE);
568
 
569
            if (getTable().contains("DONNEUR_DIFF"))
570
                setSiteEnabled(r.getBoolean("DONNEUR_DIFF"), Type_Diff.DONNEUR_ORDRE);
571
        }
572
 
573
    }
574
 
575
    @Override
576
    public void update() {
577
 
578
        if (!this.numeroUniqueDevis.checkValidation()) {
579
            ExceptionHandler.handle("Impossible de modifier, numéro de devis existant.");
580
            final Object root = SwingUtilities.getRoot(this);
581
            if (root instanceof EditFrame) {
582
                final EditFrame frame = (EditFrame) root;
583
                frame.getPanel().setAlwaysVisible(true);
584
            }
585
            return;
586
        }
587
        super.update();
588
        this.table.updateField("ID_DEVIS", getSelectedID());
589
        this.table.createArticle(getSelectedID(), getElement());
590
 
591
        // generation du document
592
 
593
        try {
594
            final DevisXmlSheet sheet = new DevisXmlSheet(getTable().getRow(getSelectedID()));
595
            sheet.createDocumentAsynchronous();
596
            sheet.showPrintAndExportAsynchronous(QuoteSQLComponent.this.panelOO.isVisualisationSelected(), QuoteSQLComponent.this.panelOO.isImpressionSelected(), true);
597
        } catch (Exception e) {
598
            ExceptionHandler.handle("Impossible de créer le devis", e);
599
        }
600
 
601
    }
602
 
603
    /**
604
     * Création d'un devis à partir d'un devis existant
605
     *
606
     * @param idDevis
607
     *
608
     */
609
    public void loadDevisExistant(final int idDevis) {
610
 
611
        final SQLElement devis = Configuration.getInstance().getDirectory().getElement("DEVIS");
612
        final SQLElement devisElt = Configuration.getInstance().getDirectory().getElement("DEVIS_ELEMENT");
613
 
614
        // On duplique le devis
615
        if (idDevis > 1) {
616
            final SQLRow row = devis.getTable().getRow(idDevis);
617
            final SQLRowValues rowVals = new SQLRowValues(devis.getTable());
618
            rowVals.put("ID_CLIENT", row.getInt("ID_CLIENT"));
619
            rowVals.put("NUMERO", NumerotationAutoSQLElement.getNextNumero(getElement().getClass()));
620
 
621
 
622
            this.select(rowVals);
623
        }
624
 
625
        // On duplique les elements de devis
626
        final List<SQLRow> myListItem = devis.getTable().getRow(idDevis).getReferentRows(devisElt.getTable());
627
 
628
        if (myListItem.size() != 0) {
629
            this.table.getModel().clearRows();
630
 
631
            for (final SQLRow rowElt : myListItem) {
632
 
633
                final SQLRowValues rowVals = rowElt.createUpdateRow();
634
                rowVals.clearPrimaryKeys();
635
                this.table.getModel().addRow(rowVals);
636
                final int rowIndex = this.table.getModel().getRowCount() - 1;
637
                this.table.getModel().fireTableModelModified(rowIndex);
638
            }
639
        } else {
640
            this.table.getModel().clearRows();
641
        }
642
        this.table.getModel().fireTableDataChanged();
643
        this.table.repaint();
644
    }
645
 
646
}