OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

Rev 151 | Rev 174 | 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.order.element;
15
 
142 ilm 16
import org.openconcerto.erp.config.ComptaPropsConfiguration;
18 ilm 17
import org.openconcerto.erp.core.common.element.ComptaSQLConfElement;
142 ilm 18
import org.openconcerto.erp.core.sales.product.element.ReferenceArticleSQLElement;
19
import org.openconcerto.erp.core.supplychain.stock.element.MouvementStockSQLElement;
156 ilm 20
import org.openconcerto.erp.core.supplychain.stock.element.StockItemsUpdater;
21
import org.openconcerto.erp.core.supplychain.stock.element.StockItemsUpdater.TypeStockUpdate;
22
import org.openconcerto.erp.core.supplychain.stock.element.StockLabel;
23
import org.openconcerto.erp.core.supplychain.stock.element.StockSQLElement;
18 ilm 24
import org.openconcerto.sql.element.SQLComponent;
142 ilm 25
import org.openconcerto.sql.element.SQLElement;
18 ilm 26
import org.openconcerto.sql.element.UISQLComponent;
142 ilm 27
import org.openconcerto.sql.model.SQLInjector;
28
import org.openconcerto.sql.model.SQLRow;
29
import org.openconcerto.sql.model.SQLRowAccessor;
156 ilm 30
import org.openconcerto.sql.model.SQLRowListRSH;
142 ilm 31
import org.openconcerto.sql.model.SQLRowValues;
156 ilm 32
import org.openconcerto.sql.model.SQLSelect;
142 ilm 33
import org.openconcerto.sql.model.SQLTable;
156 ilm 34
import org.openconcerto.sql.model.Where;
35
import org.openconcerto.sql.request.ListSQLRequest;
36
import org.openconcerto.sql.request.UpdateBuilder;
18 ilm 37
import org.openconcerto.sql.sqlobject.ElementComboBox;
156 ilm 38
import org.openconcerto.sql.users.UserManager;
39
import org.openconcerto.sql.view.EditFrame;
40
import org.openconcerto.sql.view.EditPanel.EditMode;
142 ilm 41
import org.openconcerto.sql.view.list.IListe;
42
import org.openconcerto.sql.view.list.IListeAction.IListeEvent;
43
import org.openconcerto.sql.view.list.RowAction.PredicateRowAction;
156 ilm 44
import org.openconcerto.ui.FrameUtil;
142 ilm 45
import org.openconcerto.utils.DecimalUtils;
132 ilm 46
import org.openconcerto.utils.ListMap;
18 ilm 47
 
142 ilm 48
import java.awt.event.ActionEvent;
49
import java.math.BigDecimal;
156 ilm 50
import java.sql.SQLException;
18 ilm 51
import java.util.ArrayList;
142 ilm 52
import java.util.Arrays;
53
import java.util.HashSet;
18 ilm 54
import java.util.List;
142 ilm 55
import java.util.Set;
18 ilm 56
 
142 ilm 57
import javax.swing.AbstractAction;
19 ilm 58
import javax.swing.JTextField;
18 ilm 59
 
60
public class CommandeClientElementSQLElement extends ComptaSQLConfElement {
61
 
62
    public CommandeClientElementSQLElement() {
63
        super("COMMANDE_CLIENT_ELEMENT", "un element de commande", "éléments de commande");
142 ilm 64
 
65
        PredicateRowAction rowAction = new PredicateRowAction(new AbstractAction("Transfert vers commande fournisseur") {
66
 
67
            @Override
68
            public void actionPerformed(ActionEvent e) {
69
                final List<SQLRowValues> selectedRows = IListe.get(e).getSelectedRows();
70
                ComptaPropsConfiguration.getInstanceCompta().getNonInteractiveSQLExecutor().execute(new Runnable() {
71
 
72
                    @Override
73
                    public void run() {
74
 
156 ilm 75
                        createCommandeF(selectedRows);
142 ilm 76
                    }
77
                });
78
            }
79
 
80
        }, true);
81
        rowAction.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
82
        getRowActions().add(rowAction);
156 ilm 83
 
84
        PredicateRowAction rowActionCmd = new PredicateRowAction(new AbstractAction("Modifier la commande associée") {
85
 
86
            @Override
87
            public void actionPerformed(ActionEvent e) {
88
                SQLRowValues selectedRow = IListe.get(e).getSelectedRow();
89
                EditFrame f = new EditFrame(getForeignElement("ID_COMMANDE_CLIENT"), EditMode.MODIFICATION);
90
                f.getSQLComponent().select(selectedRow.getForeignID("ID_COMMANDE_CLIENT"));
91
                FrameUtil.showPacked(f);
92
            }
93
 
94
        }, true);
95
        rowActionCmd.setPredicate(IListeEvent.getSingleSelectionPredicate());
96
        getRowActions().add(rowActionCmd);
97
 
98
        if (getTable().getForeignTable("ID_USER_COMMON_CREATE").getRow(UserManager.getUserID()).getBoolean("ADMIN")) {
99
            PredicateRowAction rowActionForceLivr = new PredicateRowAction(new AbstractAction("Forcer la livraison") {
100
 
101
                @Override
102
                public void actionPerformed(ActionEvent e) {
103
                    updateForceLivrer(e, Boolean.TRUE);
104
 
105
                }
106
 
107
            }, true);
108
            rowActionForceLivr.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
109
            getRowActions().add(rowActionForceLivr);
110
 
111
            PredicateRowAction rowActionAnnuler = new PredicateRowAction(new AbstractAction("Annuler Forcer la livraison") {
112
 
113
                @Override
114
                public void actionPerformed(ActionEvent e) {
115
                    updateForceLivrer(e, Boolean.FALSE);
116
 
117
                }
118
 
119
            }, true);
120
            rowActionAnnuler.setPredicate(IListeEvent.getNonEmptySelectionPredicate());
121
            getRowActions().add(rowActionAnnuler);
122
 
123
            PredicateRowAction rowActionUpdateStockTh = new PredicateRowAction(new AbstractAction("Recalculer le stock théorique") {
124
 
125
                @Override
126
                public void actionPerformed(ActionEvent e) {
127
                    recalculStockTh();
128
 
129
                }
130
 
131
            }, true);
132
            rowActionUpdateStockTh.setPredicate(IListeEvent.createTotalRowCountPredicate(0, Integer.MAX_VALUE));
133
            getRowActions().add(rowActionUpdateStockTh);
134
 
135
        }
136
 
18 ilm 137
    }
138
 
156 ilm 139
    private void updateForceLivrer(ActionEvent e, Boolean state) {
140
        final List<SQLRowValues> selectedRows = IListe.get(e).getSelectedRows();
141
        final Set<Integer> ids = new HashSet<Integer>();
142
        for (SQLRowValues sqlRowValues : selectedRows) {
143
            ids.add(sqlRowValues.getID());
144
        }
145
        UpdateBuilder build = new UpdateBuilder(getTable());
146
        build.setObject("LIVRE_FORCED", state);
147
        build.setWhere(new Where(getTable().getKey(), ids));
148
        getTable().getDBSystemRoot().getDataSource().execute(build.asString());
149
        IListe.get(e).getModel().updateAll();
150
    }
151
 
152
    public void recalculStockTh() {
153
 
154
        // RAZ des stocks TH --> TH = REEL
155
        final SQLTable tableStock = getTable().getDBRoot().findTable("STOCK");
156
        String req = "UPDATE " + tableStock.getSQLName().quote() + " SET " + tableStock.getField("QTE_TH").getQuotedName() + " = " + tableStock.getField("QTE_REEL").getQuotedName() + ","
157
                + tableStock.getField("QTE_RECEPT_ATTENTE").getQuotedName() + " = 0," + tableStock.getField("QTE_LIV_ATTENTE").getQuotedName() + "=0";
158
        tableStock.getDBSystemRoot().getDataSource().execute(req);
159
 
160
        {
161
            SQLSelect selCmdElt = new SQLSelect();
162
            final SQLTable tableCmdElt = tableStock.getTable("COMMANDE_ELEMENT");
163
            selCmdElt.addSelectStar(tableCmdElt);
164
            Where w = new Where(tableCmdElt.getField("RECU_FORCED"), "=", Boolean.FALSE).and(new Where(tableCmdElt.getField("RECU"), "=", Boolean.FALSE));
165
            selCmdElt.setWhere(w);
166
            List<SQLRow> res = SQLRowListRSH.execute(selCmdElt);
167
            if (res != null && res.size() > 0) {
168
                StockItemsUpdater updater = new StockItemsUpdater(new StockLabel() {
169
 
170
                    @Override
171
                    public String getLabel(SQLRowAccessor rowOrigin, SQLRowAccessor rowElt) {
172
                        return "Commande fournisseur N°" + rowElt.getForeign("ID_COMMANDE").getString("NUMERO");
173
                    }
174
                }, res.get(0), res, TypeStockUpdate.VIRTUAL_RECEPT, false);
175
                try {
176
                    updater.update();
177
                } catch (SQLException e1) {
178
                    e1.printStackTrace();
179
                }
180
            }
181
        }
182
        {
183
            SQLSelect selCmdElt = new SQLSelect();
184
            final SQLTable tableCmdElt = tableStock.getTable("COMMANDE_CLIENT_ELEMENT");
185
            selCmdElt.addSelectStar(tableCmdElt);
186
            Where w = new Where(tableCmdElt.getField("LIVRE_FORCED"), "=", Boolean.FALSE).and(new Where(tableCmdElt.getField("LIVRE"), "=", Boolean.FALSE));
187
            selCmdElt.setWhere(w);
188
            List<SQLRow> res = SQLRowListRSH.execute(selCmdElt);
189
            if (res != null && res.size() > 0) {
190
                StockItemsUpdater updater = new StockItemsUpdater(new StockLabel() {
191
 
192
                    @Override
193
                    public String getLabel(SQLRowAccessor rowOrigin, SQLRowAccessor rowElt) {
194
                        return "Commande N°" + rowElt.getForeign("ID_COMMANDE_CLIENT").getString("NUMERO");
195
                    }
196
                }, res.get(0), res, TypeStockUpdate.VIRTUAL_DELIVER, false);
197
                try {
198
                    updater.update();
199
                } catch (SQLException e1) {
200
                    e1.printStackTrace();
201
                }
202
            }
203
        }
204
    }
205
 
132 ilm 206
    @Override
207
    protected String getParentFFName() {
208
        return "ID_COMMANDE_CLIENT";
209
    }
210
 
18 ilm 211
    protected List<String> getListFields() {
212
        final List<String> l = new ArrayList<String>();
213
        l.add("CODE");
214
        l.add("NOM");
142 ilm 215
        l.add("ID_COMMANDE_CLIENT");
216
        l.add("ID_ARTICLE");
18 ilm 217
        l.add("PA_HT");
218
        l.add("PV_HT");
151 ilm 219
        l.add("T_PA_HT");
220
        l.add("T_PV_HT");
221
        l.add("T_PV_TTC");
142 ilm 222
        l.add("QTE");
223
        l.add("QTE_UNITAIRE");
224
        l.add("QTE_LIVREE");
156 ilm 225
        l.add("LIVRE");
226
        l.add("LIVRE_FORCED");
18 ilm 227
        return l;
228
    }
229
 
142 ilm 230
    /**
231
     * Transfert d'une commande en commande fournisseur
232
     *
233
     * @param commandeID
234
     */
235
    public void transfertCommande(List<SQLRowValues> commandeClientEltsRows) {
236
 
237
        SQLTable tableCmdElt = getDirectory().getElement("COMMANDE_ELEMENT").getTable();
238
        SQLElement eltArticle = getDirectory().getElement("ARTICLE");
239
 
240
        final ListMap<SQLRow, SQLRowValues> map = new ListMap<SQLRow, SQLRowValues>();
241
        List<String> fields2copy = Arrays.asList("CODE", "NOM", "VALEUR_METRIQUE_1", "VALEUR_METRIQUE_2", "VALEUR_METRIQUE_3");
242
 
156 ilm 243
        // Set<Integer> art = new HashSet<Integer>();
142 ilm 244
        for (SQLRowValues sqlRow : commandeClientEltsRows) {
245
            // on récupére l'article qui lui correspond
246
            SQLRowValues rowArticle = new SQLRowValues(eltArticle.getTable());
247
            for (String field : fields2copy) {
248
                // if (sqlRow.getTable().getFieldsName().contains(field.getName())) {
249
                rowArticle.put(field, sqlRow.asRow().getObject(field));
250
                // }
251
            }
252
 
253
            int idArticle = ReferenceArticleSQLElement.getIdForCNM(rowArticle, true);
254
            SQLRow rowArticleFind = eltArticle.getTable().getRow(idArticle);
255
            if (rowArticleFind != null && !rowArticleFind.isUndefined()) {
256
                SQLInjector inj = SQLInjector.getInjector(rowArticle.getTable(), tableCmdElt);
257
                SQLRowValues rowValsElt = new SQLRowValues(inj.createRowValuesFrom(rowArticleFind));
258
                rowValsElt.put("ID_STYLE", sqlRow.getObject("ID_STYLE"));
259
 
260
                // if()
261
 
262
                rowValsElt.put("QTE", sqlRow.getObject("QTE"));
263
                rowValsElt.put("T_POIDS", rowValsElt.getLong("POIDS") * rowValsElt.getInt("QTE"));
264
                rowValsElt.put("T_PA_HT", ((BigDecimal) rowValsElt.getObject("PA_HT")).multiply(new BigDecimal(rowValsElt.getInt("QTE")), DecimalUtils.HIGH_PRECISION));
265
                rowValsElt.put("T_PA_TTC",
266
                        ((BigDecimal) rowValsElt.getObject("T_PA_HT")).multiply(new BigDecimal((rowValsElt.getForeign("ID_TAXE").getFloat("TAUX") / 100.0 + 1.0)), DecimalUtils.HIGH_PRECISION));
267
                // rowValsElt.put("ID_DEVISE",
268
                // rowCmd.getForeignRow("ID_TARIF").getForeignID("ID_DEVISE"));
269
                map.add(rowArticleFind.getForeignRow("ID_FOURNISSEUR"), rowValsElt);
270
            }
271
 
272
        }
273
        // TODO
274
        MouvementStockSQLElement.createCommandeF(map, null, "", false);
275
    }
276
 
156 ilm 277
    public void createCommandeF(final List<? extends SQLRowAccessor> rowsItems) {
142 ilm 278
 
279
        ComptaPropsConfiguration.getInstanceCompta().getNonInteractiveSQLExecutor().execute(new Runnable() {
280
 
281
            @Override
282
            public void run() {
283
                final ListMap<SQLRow, SQLRowValues> map = new ListMap<SQLRow, SQLRowValues>();
156 ilm 284
                final Set<Integer> stockChecked = new HashSet<Integer>();
285
                for (SQLRowAccessor rowItem : rowsItems) {
286
                    if (rowItem.getObject("ID_ARTICLE") != null && !rowItem.isForeignEmpty("ID_ARTICLE")) {
287
                        SQLRowAccessor rowArticleFind = rowItem.getForeign("ID_ARTICLE");
142 ilm 288
 
156 ilm 289
                        SQLRow row = rowArticleFind.asRow();
290
                        SQLRowAccessor rowStock = StockSQLElement.getStock(rowItem);
291
                        if (!stockChecked.contains(rowStock.getID())) {
292
                            stockChecked.add(rowStock.getID());
142 ilm 293
 
156 ilm 294
                            int value = -Math.round(rowStock.getFloat("QTE_TH") - rowStock.getFloat("QTE_MIN"));
142 ilm 295
 
156 ilm 296
                            if (value > 0) {
142 ilm 297
 
156 ilm 298
                                SQLInjector inj = SQLInjector.getInjector(row.getTable(), row.getTable().getTable("COMMANDE_ELEMENT"));
299
                                SQLRowValues rowValsElt = new SQLRowValues(inj.createRowValuesFrom(row));
300
 
301
                                rowValsElt.put("QTE", value);
302
                                rowValsElt.put("T_POIDS", rowValsElt.getLong("POIDS") * rowValsElt.getInt("QTE"));
303
                                rowValsElt.put("T_PA_HT", ((BigDecimal) rowValsElt.getObject("PA_HT")).multiply(new BigDecimal(rowValsElt.getInt("QTE")), DecimalUtils.HIGH_PRECISION));
304
                                rowValsElt.put("T_PA_TTC", ((BigDecimal) rowValsElt.getObject("T_PA_HT")).multiply(new BigDecimal((rowValsElt.getForeign("ID_TAXE").getFloat("TAUX") / 100.0 + 1.0)),
305
                                        DecimalUtils.HIGH_PRECISION));
306
                                // rowValsElt.put("ID_DEVISE",
307
                                // rowCmd.getForeignRow("ID_TARIF").getForeignID("ID_DEVISE"));
308
                                map.add(rowArticleFind.getForeign("ID_FOURNISSEUR").asRow(), rowValsElt);
309
                            }
310
                        }
142 ilm 311
                    }
312
                }
313
                MouvementStockSQLElement.createCommandeF(map, null, "", false);
314
            }
315
        });
316
 
317
    }
318
 
18 ilm 319
    protected List<String> getComboFields() {
320
        final List<String> l = new ArrayList<String>();
73 ilm 321
        if (getTable().contains("ID_ARTICLE")) {
322
            l.add("ID_ARTICLE");
323
        }
18 ilm 324
        l.add("NOM");
325
        l.add("PV_HT");
326
        return l;
327
    }
328
 
73 ilm 329
    @Override
156 ilm 330
    protected void _initListRequest(ListSQLRequest req) {
331
        super._initListRequest(req);
332
        req.addToGraphToFetch("ID_DEPOT_STOCK");
333
    }
334
 
335
    @Override
132 ilm 336
    public ListMap<String, String> getShowAs() {
337
        final ListMap<String, String> res = new ListMap<String, String>();
156 ilm 338
        res.putCollection("ID_COMMANDE_CLIENT", "NUMERO", "DATE", "DATE_LIVRAISON_PREV", "ID_CLIENT");
339
 
73 ilm 340
        if (getTable().contains("ID_ARTICLE")) {
142 ilm 341
            res.putCollection("ID_ARTICLE", "ID_FAMILLE_ARTICLE", "ID_FOURNISSEUR");
73 ilm 342
        }
132 ilm 343
        res.putCollection(null, "NOM");
73 ilm 344
        return res;
345
    }
346
 
18 ilm 347
    /*
348
     * (non-Javadoc)
349
     *
350
     * @see org.openconcerto.devis.SQLElement#getComponent()
351
     */
352
    public SQLComponent createComponent() {
353
        return new UISQLComponent(this) {
354
            public void addViews() {
355
                this.addRequiredSQLObject(new JTextField(), "NOM", "left");
356
                this.addRequiredSQLObject(new JTextField(), "CODE", "right");
357
 
358
                this.addSQLObject(new ElementComboBox(), "ID_STYLE", "left");
359
 
156 ilm 360
                this.addRequiredSQLObject(new JTextField(), "PA_HT", "left");
361
                this.addSQLObject(new JTextField(), "PV_HT", "right");
18 ilm 362
 
363
                this.addSQLObject(new JTextField(), "POIDS", "left");
364
                this.addSQLObject(new ElementComboBox(), "ID_TAXE", "right");
365
            }
366
        };
367
    }
57 ilm 368
 
369
    @Override
370
    protected String createCode() {
156 ilm 371
        return createCodeOfPackage() + ".item";
57 ilm 372
    }
18 ilm 373
}