OpenConcerto

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

svn://code.openconcerto.org/openconcerto

Rev

Rev 177 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
156 ilm 1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
182 ilm 4
 * Copyright 2011-2019 OpenConcerto, by ILM Informatique. All rights reserved.
156 ilm 5
 *
6
 * The contents of this file are subject to the terms of the GNU General Public License Version 3
7
 * only ("GPL"). You may not use this file except in compliance with the License. You can obtain a
8
 * copy of the License at http://www.gnu.org/licenses/gpl-3.0.html See the License for the specific
9
 * language governing permissions and limitations under the License.
10
 *
11
 * When distributing the software, include this License Header Notice in each file.
12
 */
13
 
14
 package org.openconcerto.erp.core.supplychain.stock.element;
15
 
16
import org.openconcerto.sql.model.DBRoot;
17
import org.openconcerto.sql.model.SQLRow;
177 ilm 18
import org.openconcerto.sql.model.SQLRowAccessor;
156 ilm 19
import org.openconcerto.sql.model.SQLRowListRSH;
20
import org.openconcerto.sql.model.SQLRowValues;
21
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
22
import org.openconcerto.sql.model.SQLSelect;
23
import org.openconcerto.sql.model.SQLTable;
24
import org.openconcerto.sql.model.Where;
25
import org.openconcerto.utils.DecimalUtils;
26
import org.openconcerto.utils.ExceptionHandler;
27
import org.openconcerto.utils.cc.ITransformer;
28
 
29
import java.math.BigDecimal;
30
import java.sql.SQLException;
31
import java.util.Date;
32
import java.util.HashMap;
33
import java.util.List;
34
import java.util.Map;
35
 
36
public class EtatStockSnapshotCreator {
37
 
38
    private final Date d;
39
    private final DBRoot root;
177 ilm 40
    private final SQLRowAccessor depot;
182 ilm 41
    private final boolean withAllProducts;
156 ilm 42
 
182 ilm 43
    public EtatStockSnapshotCreator(SQLRowAccessor depot, Date d, DBRoot root, boolean withAllProducts) {
156 ilm 44
        this.d = d;
177 ilm 45
        this.depot = depot;
156 ilm 46
        this.root = root;
182 ilm 47
        this.withAllProducts = withAllProducts;
156 ilm 48
    }
49
 
50
    public void create() {
51
        // Récupération des inventaires
52
        SQLTable tableEtatStock = this.root.getTable("ETAT_STOCK");
53
        SQLSelect sel = new SQLSelect();
54
        sel.addSelectStar(tableEtatStock);
55
        Where wEtat = new Where(tableEtatStock.getField("INVENTAIRE"), "=", Boolean.TRUE);
182 ilm 56
        wEtat = wEtat.and(new Where(tableEtatStock.getField("ID_DEPOT_STOCK"), "=", this.depot.getID()));
156 ilm 57
        sel.setWhere(wEtat);
58
        List<SQLRow> rowsEtatStock = SQLRowListRSH.execute(sel);
59
        Map<Integer, Integer> mapEtatStock = new HashMap<Integer, Integer>();
60
        for (SQLRow sqlRow : rowsEtatStock) {
61
            SQLTable tableMvtStock = this.root.getTable("MOUVEMENT_STOCK");
177 ilm 62
            SQLTable tableStock = this.root.getTable("STOCK");
156 ilm 63
            SQLSelect selMvt = new SQLSelect();
64
            selMvt.addSelect(tableMvtStock.getKey(), "MIN");
65
            Where wMvt = new Where(tableMvtStock.getField("OUVERTURE"), "=", Boolean.TRUE);
177 ilm 66
            wMvt = wMvt.and(new Where(tableMvtStock.getField("ID_ETAT_STOCK"), "=", sqlRow.getID()));
67
            wMvt = wMvt.and(new Where(tableMvtStock.getField("ID_STOCK"), "=", tableStock.getKey()));
182 ilm 68
            wMvt = wMvt.and(new Where(tableStock.getField("ID_DEPOT_STOCK"), "=", depot.getID()));
156 ilm 69
            selMvt.setWhere(wMvt);
70
            Integer idMvt = (Integer) tableMvtStock.getDBSystemRoot().getDataSource().executeScalar(selMvt.asString());
71
            if (idMvt != null) {
72
                mapEtatStock.put(sqlRow.getID(), idMvt);
73
            }
74
        }
75
 
76
        Map<Integer, EtatStock> mapStockSnap = new HashMap<Integer, EtatStock>();
77
        {
182 ilm 78
            final SQLTable tableMvtStock = this.root.getTable("MOUVEMENT_STOCK");
156 ilm 79
 
182 ilm 80
            final SQLRowValues vals = new SQLRowValues(tableMvtStock);
156 ilm 81
 
82
            vals.put("QTE", null);
182 ilm 83
            if (tableMvtStock.contains("PRICE")) {
156 ilm 84
                vals.put("PRICE", null);
85
            }
86
            vals.put("ID_ARTICLE", null);
177 ilm 87
            vals.putRowValues("ID_STOCK").putNulls("QTE_REEL").putRowValues("ID_DEPOT_STOCK").putNulls("ID", "NOM", "CODE");
182 ilm 88
 
156 ilm 89
            // Calendar cal0116 = Calendar.getInstance();
90
            // cal0116.set(2016, Calendar.JANUARY, 1, 0, 0, 0);
91
            // final Date dateDeb = cal0116.getTime();
92
 
93
            // Récupération du dernier etat de stock
94
            SQLSelect selEtatD = new SQLSelect();
95
            selEtatD.addSelectStar(tableEtatStock);
96
            Where wEtatD = new Where(tableEtatStock.getField("INVENTAIRE"), "=", Boolean.TRUE);
182 ilm 97
            wEtatD = wEtatD.and(new Where(tableEtatStock.getField("ID_DEPOT_STOCK"), "=", this.depot.getID()));
156 ilm 98
            selEtatD.setWhere(wEtatD);
99
            List<SQLRow> rowsEtatStockD = SQLRowListRSH.execute(selEtatD);
100
            SQLRow rowEtatStockDeb = null;
101
            for (SQLRow sqlRow : rowsEtatStockD) {
102
 
103
                if (sqlRow.getDate("DATE").getTime().before(this.d)) {
104
                    if (rowEtatStockDeb == null || rowEtatStockDeb.getDate("DATE").before(sqlRow.getDate("DATE"))) {
105
                        rowEtatStockDeb = sqlRow;
106
                    }
107
                }
108
 
109
            }
110
            final Date dateDeb;
111
            final Integer idMvtStockDeb;
112
            if (rowEtatStockDeb != null) {
113
                dateDeb = rowEtatStockDeb.getDate("DATE").getTime();
114
                idMvtStockDeb = mapEtatStock.get(rowEtatStockDeb.getID());
115
            } else {
116
                dateDeb = null;
117
                idMvtStockDeb = null;
118
            }
119
 
120
            final SQLRowValuesListFetcher fetcher = SQLRowValuesListFetcher.create(vals);
121
            fetcher.setSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
122
 
123
                @Override
124
                public SQLSelect transformChecked(SQLSelect sel) {
125
 
182 ilm 126
                    Where w = (new Where(tableMvtStock.getField("DATE"), "<=", d));
156 ilm 127
 
128
                    if (dateDeb != null) {
182 ilm 129
                        w = w.and(new Where(tableMvtStock.getField("DATE"), ">=", dateDeb));
130
                        w = w.and(new Where(tableMvtStock.getKey(), ">=", idMvtStockDeb));
131
                        w = w.and(new Where(tableMvtStock.getField("CLOTURE"), "!=", Boolean.TRUE));
156 ilm 132
                    }
182 ilm 133
                    w = w.and(new Where(tableMvtStock.getField("REEL"), "=", Boolean.TRUE));
134
                    w = w.and(new Where(sel.getJoin(tableMvtStock.getField("ID_STOCK")).getJoinedTable().getField("ID_DEPOT_STOCK"), "=", depot.getID()));
156 ilm 135
 
136
                    sel.setWhere(w);
137
                    return sel;
138
                }
139
            });
140
 
141
            List<SQLRowValues> list = fetcher.fetch();
142
 
143
            BigDecimal totalHT = BigDecimal.ZERO;
144
            for (int i = 0; i < list.size(); i++) {
145
                SQLRowValues rowVF = list.get(i);
146
                if (!rowVF.isForeignEmpty("ID_ARTICLE") && rowVF.getForeignID("ID_ARTICLE") > rowVF.getForeign("ID_ARTICLE").getTable().getUndefinedID()) {
147
                    final int foreignIDArt = rowVF.getForeignID("ID_ARTICLE");
148
                    if (!mapStockSnap.containsKey(foreignIDArt)) {
149
                        mapStockSnap.put(foreignIDArt, new EtatStock(rowVF.getForeign("ID_ARTICLE")));
150
                    }
151
                    EtatStock et = mapStockSnap.get(foreignIDArt);
152
                    et.setQte(et.getQte().add(new BigDecimal(rowVF.getFloat("QTE"))));
153
                    BigDecimal bigDecimal = BigDecimal.ZERO;
182 ilm 154
                    if (tableMvtStock.contains("PRICE")) {
156 ilm 155
                        bigDecimal = rowVF.getBigDecimal("PRICE");
156
                    }
157
                    et.setPa(bigDecimal);
158
                    totalHT = totalHT.add(bigDecimal.multiply(new BigDecimal(rowVF.getFloat("QTE"), DecimalUtils.HIGH_PRECISION)));
159
                }
160
            }
161
 
182 ilm 162
            // Ajout des articles sans mouvement de stock sur la période
163
            final SQLTable tableStock = tableMvtStock.getTable("STOCK");
164
            final SQLRowValues valsStock = new SQLRowValues(tableStock);
165
            valsStock.putRowValues("ID_ARTICLE").putNulls("CODE", "NOM", "OBSOLETE");
166
            valsStock.putNulls("QTE_REEL").putRowValues("ID_DEPOT_STOCK").putNulls("ID", "NOM", "CODE");
167
            SQLRowValuesListFetcher fetcherStock = SQLRowValuesListFetcher.create(valsStock);
168
            SQLTable tableArt = tableStock.getForeignTable("ID_ARTICLE");
169
            fetcherStock.addSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
170
                @Override
171
                public SQLSelect transformChecked(SQLSelect input) {
172
                    Where w = new Where(tableStock.getField("ID_DEPOT_STOCK"), "=", depot.getID());
173
                    w = w.and(new Where(input.getAlias(tableArt).getField("OBSOLETE"), "=", Boolean.FALSE));
174
                    input.setWhere(w);
175
                    System.err.println(input.asString());
176
                    return input;
177
                }
178
            }, 0);
179
            List<SQLRowValues> resultAllStock = fetcherStock.fetch();
180
 
181
            for (SQLRowValues sqlRowValues : resultAllStock) {
182
                final int foreignIDArt = sqlRowValues.getForeignID("ID_ARTICLE");
183
                if (!mapStockSnap.containsKey(foreignIDArt)) {
184
                    mapStockSnap.put(foreignIDArt, new EtatStock(sqlRowValues.getForeign("ID_ARTICLE")));
185
                }
186
            }
187
 
188
            if (this.withAllProducts) {
189
                // Ajout de tous les articles non obsoletes
190
                final SQLRowValues valsArt = new SQLRowValues(tableArt);
191
                valsArt.putNulls("CODE", "NOM", "OBSOLETE");
192
                SQLRowValuesListFetcher fetcherArt = SQLRowValuesListFetcher.create(valsArt);
193
                fetcherArt.addSelTransf(new ITransformer<SQLSelect, SQLSelect>() {
194
                    @Override
195
                    public SQLSelect transformChecked(SQLSelect input) {
196
                        Where w = new Where(tableArt.getField("VIRTUEL"), "=", Boolean.FALSE);
197
                        w = w.and(new Where(tableArt.getField("OBSOLETE"), "=", Boolean.FALSE));
198
                        input.setWhere(w);
199
                        System.err.println(input.asString());
200
                        return input;
201
                    }
202
                }, 0);
203
                List<SQLRowValues> resultArt = fetcherArt.fetch();
204
 
205
                for (SQLRowValues sqlRowValues : resultArt) {
206
                    final int idArt = sqlRowValues.getID();
207
                    if (!mapStockSnap.containsKey(idArt)) {
208
                        mapStockSnap.put(idArt, new EtatStock(sqlRowValues));
209
                    }
210
                }
211
 
212
            }
213
 
156 ilm 214
            SQLRowValues rowVals = new SQLRowValues(tableEtatStock);
215
            rowVals.put("DATE", d);
216
            rowVals.put("MONTANT_HA", totalHT);
177 ilm 217
            rowVals.put("ID_DEPOT_STOCK", depot.getID());
156 ilm 218
 
219
            for (EtatStock etatItem : mapStockSnap.values()) {
220
                SQLRowValues rowValsItem = new SQLRowValues(tableEtatStock.getTable("ETAT_STOCK_ELEMENT"));
221
                rowValsItem.put("ID_ETAT_STOCK", rowVals);
222
                rowValsItem.put("PA", etatItem.getPa());
223
                rowValsItem.put("PV", etatItem.getPv());
224
                rowValsItem.put("QTE", etatItem.getQte());
225
                rowValsItem.put("T_PA", etatItem.getTotalPA());
226
                rowValsItem.put("T_PV", etatItem.getTotalPV());
227
                rowValsItem.put("CODE", etatItem.getArticle().getString("CODE"));
228
                rowValsItem.put("NOM", etatItem.getArticle().getString("NOM"));
229
                rowValsItem.put("ID_ARTICLE", etatItem.getArticle().getID());
230
            }
231
            try {
232
                rowVals.commit();
233
            } catch (SQLException e) {
234
                ExceptionHandler.handle("Erreur lors de la création de l'état", e);
235
            }
236
        }
237
    }
238
 
239
}