Line 23... |
Line 23... |
23 |
import org.openconcerto.sql.model.SQLRowAccessor;
|
23 |
import org.openconcerto.sql.model.SQLRowAccessor;
|
24 |
import org.openconcerto.sql.model.SQLRowValues;
|
24 |
import org.openconcerto.sql.model.SQLRowValues;
|
25 |
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
|
25 |
import org.openconcerto.sql.model.SQLRowValuesListFetcher;
|
26 |
import org.openconcerto.sql.model.SQLSelect;
|
26 |
import org.openconcerto.sql.model.SQLSelect;
|
27 |
import org.openconcerto.sql.model.SQLTable;
|
27 |
import org.openconcerto.sql.model.SQLTable;
|
- |
|
28 |
import org.openconcerto.sql.model.SQLTableEvent;
|
- |
|
29 |
import org.openconcerto.sql.model.SQLTableEvent.Mode;
|
28 |
import org.openconcerto.sql.model.Where;
|
30 |
import org.openconcerto.sql.model.Where;
|
29 |
import org.openconcerto.sql.utils.SQLUtils;
|
31 |
import org.openconcerto.sql.utils.SQLUtils;
|
30 |
import org.openconcerto.utils.DecimalUtils;
|
32 |
import org.openconcerto.utils.DecimalUtils;
|
31 |
import org.openconcerto.utils.ExceptionHandler;
|
33 |
import org.openconcerto.utils.ExceptionHandler;
|
32 |
import org.openconcerto.utils.ListMap;
|
34 |
import org.openconcerto.utils.ListMap;
|
Line 152... |
Line 154... |
152 |
|
154 |
|
153 |
final List<? extends ResultSetHandler> handlers = new ArrayList<ResultSetHandler>(requests.size());
|
155 |
final List<? extends ResultSetHandler> handlers = new ArrayList<ResultSetHandler>(requests.size());
|
154 |
for (String s : requests) {
|
156 |
for (String s : requests) {
|
155 |
handlers.add(null);
|
157 |
handlers.add(null);
|
156 |
}
|
158 |
}
|
157 |
// FIXME FIRE TABLE CHANGED TO UPDATE ILISTE ??
|
- |
|
158 |
try {
|
159 |
try {
|
159 |
SQLUtils.executeAtomic(stockTable.getDBSystemRoot().getDataSource(), new ConnectionHandlerNoSetup<Object, IOException>() {
|
160 |
SQLUtils.executeAtomic(stockTable.getDBSystemRoot().getDataSource(), new ConnectionHandlerNoSetup<Object, IOException>() {
|
160 |
@Override
|
161 |
@Override
|
161 |
public Object handle(SQLDataSource ds) throws SQLException, IOException {
|
162 |
public Object handle(SQLDataSource ds) throws SQLException, IOException {
|
162 |
SQLUtils.executeMultiple(stockTable.getDBSystemRoot(), requests, handlers);
|
163 |
SQLUtils.executeMultiple(stockTable.getDBSystemRoot(), requests, handlers);
|
- |
|
164 |
// FIXME FIRE ONLY CHANGED ROWS
|
- |
|
165 |
stockTable.fire(new SQLTableEvent(stockTable, SQLRow.NONEXISTANT_ID, Mode.ROW_UPDATED));
|
163 |
return null;
|
166 |
return null;
|
164 |
}
|
167 |
}
|
165 |
});
|
168 |
});
|
166 |
} catch (IOException e) {
|
169 |
} catch (IOException e) {
|
167 |
ExceptionHandler.handle("Erreur de la mise à jour des stocks!", e);
|
170 |
ExceptionHandler.handle("Erreur de la mise à jour des stocks!", e);
|
Line 262... |
Line 265... |
262 |
handlers.add(null);
|
265 |
handlers.add(null);
|
263 |
}
|
266 |
}
|
264 |
SQLUtils.executeMultiple(table.getDBSystemRoot(), multipleRequests, handlers);
|
267 |
SQLUtils.executeMultiple(table.getDBSystemRoot(), multipleRequests, handlers);
|
265 |
}
|
268 |
}
|
266 |
|
269 |
|
267 |
private void fillProductComponent(List<ProductComponent> productComponents, int qte, int index, int level) {
|
- |
|
268 |
if (level > 0) {
|
- |
|
269 |
for (int i = index; i < items.size(); i++) {
|
- |
|
270 |
SQLRowAccessor r = items.get(i);
|
- |
|
271 |
|
- |
|
272 |
if (!r.getTable().contains("NIVEAU") || r.getInt("NIVEAU") >= level) {
|
- |
|
273 |
// On ne calcul pas les stocks pour les éléments ayant des fils (le mouvement de
|
- |
|
274 |
// stock
|
- |
|
275 |
// des fils impactera les stocks automatiquement)
|
- |
|
276 |
if (r.getTable().contains("NIVEAU")) {
|
- |
|
277 |
if (i + 1 < items.size()) {
|
- |
|
278 |
SQLRowAccessor rNext = items.get(i + 1);
|
- |
|
279 |
if (rNext.getInt("NIVEAU") > r.getInt("NIVEAU")) {
|
- |
|
280 |
fillProductComponent(productComponents, qte * r.getInt("QTE"), i + 1, rNext.getInt("NIVEAU"));
|
- |
|
281 |
continue;
|
- |
|
282 |
}
|
- |
|
283 |
}
|
- |
|
284 |
}
|
- |
|
285 |
if ((!r.getTable().contains("NIVEAU") || r.getInt("NIVEAU") == level) && !r.isForeignEmpty("ID_ARTICLE") && r.getForeign("ID_ARTICLE") != null) {
|
- |
|
286 |
productComponents.add(ProductComponent.createFrom(r, qte, r));
|
- |
|
287 |
}
|
- |
|
288 |
} else if (r.getInt("NIVEAU") < level) {
|
- |
|
289 |
// BREAK si on sort de l'article composé
|
- |
|
290 |
break;
|
- |
|
291 |
}
|
- |
|
292 |
}
|
- |
|
293 |
}
|
- |
|
294 |
}
|
- |
|
295 |
|
- |
|
296 |
/**
|
270 |
/**
|
297 |
* Récupére les stocks associés aux articles non composés (inclus les fils des nomenclatures) et
|
271 |
* Récupére les stocks associés aux articles non composés (inclus les fils des nomenclatures) et
|
298 |
* les met à jour
|
272 |
* les met à jour
|
299 |
*
|
273 |
*
|
300 |
* @return la liste des stocks à jour
|
274 |
* @return la liste des stocks à jour
|
Line 303... |
Line 277... |
303 |
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
277 |
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
|
304 |
Map<Number, StockItem> stockItems = new HashMap<Number, StockItem>();
|
278 |
Map<Number, StockItem> stockItems = new HashMap<Number, StockItem>();
|
305 |
|
279 |
|
306 |
String mvtStockTableQuoted = rowSource.getTable().getTable("MOUVEMENT_STOCK").getSQLName().quote();
|
280 |
String mvtStockTableQuoted = rowSource.getTable().getTable("MOUVEMENT_STOCK").getSQLName().quote();
|
307 |
|
281 |
|
- |
|
282 |
ProductHelper helper = new ProductHelper(rowSource.getTable().getDBRoot());
|
308 |
// Liste des éléments à mettre à jour
|
283 |
// Liste des éléments à mettre à jour
|
309 |
List<ProductComponent> productComponents = new ArrayList<ProductComponent>();
|
284 |
List<ProductComponent> productComponents = new ArrayList<ProductComponent>();
|
310 |
fillProductComponent(productComponents, 1, 0, 1);
|
285 |
helper.fillProductComponent(this.items, productComponents, 1, 0, 1);
|
311 |
// for (int i = 0; i < items.size(); i++) {
|
286 |
// for (int i = 0; i < items.size(); i++) {
|
312 |
// SQLRowAccessor r = items.get(i);
|
287 |
// SQLRowAccessor r = items.get(i);
|
313 |
//
|
288 |
//
|
314 |
// // On ne calcul pas les stocks pour les éléments ayant des fils (le mouvement de stock
|
289 |
// // On ne calcul pas les stocks pour les éléments ayant des fils (le mouvement de stock
|
315 |
// // des fils impactera les stocks automatiquement)
|
290 |
// // des fils impactera les stocks automatiquement)
|
Line 325... |
Line 300... |
325 |
// productComponents.add(ProductComponent.createFrom(r));
|
300 |
// productComponents.add(ProductComponent.createFrom(r));
|
326 |
// }
|
301 |
// }
|
327 |
// }
|
302 |
// }
|
328 |
|
303 |
|
329 |
// Liste des articles non composés à mettre à jour (avec les fils des nomenclatures)
|
304 |
// Liste des articles non composés à mettre à jour (avec les fils des nomenclatures)
|
330 |
ProductHelper helper = new ProductHelper(rowSource.getTable().getDBRoot());
|
- |
|
331 |
List<ProductComponent> boms = helper.getChildWithQtyFrom(productComponents);
|
305 |
List<ProductComponent> boms = helper.getChildWithQtyFrom(productComponents);
|
332 |
|
306 |
|
333 |
for (ProductComponent productComp : boms) {
|
307 |
for (ProductComponent productComp : boms) {
|
334 |
|
308 |
|
335 |
if (productComp.getProduct().getBoolean("GESTION_STOCK") && productComp.getQty().signum() != 0) {
|
309 |
if (productComp.getProduct().getBoolean("GESTION_STOCK") && productComp.getQty().signum() != 0) {
|