From 70e12e556bd1e61bb8b8117897603cc2f2bc9291 Mon Sep 17 00:00:00 2001 From: ValerioC Date: Tue, 12 Nov 2024 15:13:31 +0100 Subject: [PATCH] cherry pick servizio di attribuzione costi materiali per hotfix --- .../it/integry/ems_model/entity/DtbDoct.java | 9 + .../controller/ProductionController.java | 53 ++++- .../dto/ArticoloPartitaCommessaDTO.java | 82 +++++++ .../ems/production/dto/DettaglioCostiDTO.java | 131 +++++++++++ .../production/service/ProductionService.java | 209 ++++++++++++++++++ 5 files changed, 482 insertions(+), 2 deletions(-) create mode 100644 ems-engine/src/main/java/it/integry/ems/production/dto/ArticoloPartitaCommessaDTO.java create mode 100644 ems-engine/src/main/java/it/integry/ems/production/dto/DettaglioCostiDTO.java diff --git a/ems-core/src/main/java/it/integry/ems_model/entity/DtbDoct.java b/ems-core/src/main/java/it/integry/ems_model/entity/DtbDoct.java index 749c3452c7..534840278f 100644 --- a/ems-core/src/main/java/it/integry/ems_model/entity/DtbDoct.java +++ b/ems-core/src/main/java/it/integry/ems_model/entity/DtbDoct.java @@ -402,6 +402,15 @@ public class DtbDoct extends DtbBaseDocT implements EquatableEntityInterface getDettaglioCostiProd(String codProd, String partitaMag, String codJcom) throws Exception { + + String sql = "WITH ordini AS (SELECT dtb_ordt.cod_prod,\n" + + " dtb_ordt.partita_mag AS partita_mag_prod,\n" + + " dtb_ord_steps.cod_jfas,\n" + + " dtb_ord_steps.data_iniz,\n" + + " dtb_ord_steps.data_fine,\n" + + " dtb_ordt.gestione,\n" + + " dtb_ordt.cod_jcom,\n" + + " dtb_ordt.data_ord,\n" + + " dtb_ordt.num_ord,\n" + + " IIF(dtb_ordt.qta_evasa_prod = 0, dtb_ordt.qta_prod, dtb_ordt.qta_evasa_prod) *\n" + + " dtb_ordt.rap_conv_prod AS qta_prod\n" + + " FROM dtb_ordt\n" + + " INNER JOIN dtb_ord_steps\n" + + " ON dtb_ordt.gestione = dtb_ord_steps.gestione AND\n" + + " dtb_ordt.data_ord = dtb_ord_steps.data_ord AND\n" + + " dtb_ordt.num_ord = dtb_ord_steps.num_ord\n" + + " WHERE dtb_ordt.gestione = 'L'),\n" + + " produzioni_commessa AS (SELECT cod_jfas,\n" + + " cod_jcom,\n" + + " data_lav,\n" + + " SUM(qta_prod) AS qta_prod\n" + + " FROM (SELECT DISTINCT cod_jfas,\n" + + " cod_jcom,\n" + + " CAST(data_iniz AS DATE) AS data_lav,\n" + + " qta_prod\n" + + " FROM ordini) ord\n" + + "\n" + + " GROUP BY cod_jfas, cod_jcom, data_lav)\n" + + " ,\n" + + " rapportini AS (SELECT jtb_rlavr.cod_jfas,\n" + + " jtb_rlavr.cod_jcom,\n" + + " jtb_rlavr.cod_jflav,\n" + + " jtb_rlavr.ore,\n" + + " jvw_timbrature.ingresso,\n" + + " jvw_timbrature.uscita,\n" + + " ordini.cod_prod,\n" + + " ordini.partita_mag_prod,\n" + + " ordini.qta_prod,\n" + + " produzioni_commessa.qta_prod AS prd_comm,\n" + + " ROUND((ordini.qta_prod / produzioni_commessa.qta_prod) *\n" + + " jtb_rlavr.ore,\n" + + " 5) ora_lav_ord,\n" + + " ROUND(ordini.qta_prod / produzioni_commessa.qta_prod *\n" + + " jtb_rlavr.ore, 5) *\n" + + " jtb_flav.costo_ord AS costo_lav,\n" + + " ordini.data_ord,\n" + + " ordini.num_ord\n" + + " FROM jtb_rlavt\n" + + " INNER JOIN jtb_rlavr ON jtb_rlavt.cod_jflav = jtb_rlavr.cod_jflav AND\n" + + " jtb_rlavt.data_lav = jtb_rlavr.data_lav\n" + + " INNER JOIN jtb_flav ON jtb_rlavt.cod_jflav = jtb_flav.cod_jflav\n" + + " LEFT OUTER JOIN jvw_timbrature ON jtb_rlavt.cod_jflav = jvw_timbrature.cod_jflav AND\n" + + " jtb_rlavt.data_lav = jvw_timbrature.data_lav\n" + + " INNER JOIN ordini ON jtb_rlavr.cod_jcom = ordini.cod_jcom AND\n" + + " jtb_rlavr.cod_jfas = ordini.cod_jfas AND\n" + + " ((jtb_rlavt.data_lav BETWEEN CAST(ordini.data_iniz AS DATE) AND CAST(ordini.data_fine AS DATE))\n" + + " OR (jtb_rlavt.data_lav <= CAST(ordini.data_iniz AS DATE) AND\n" + + " ordini.data_fine IS NULL))\n" + + " INNER JOIN produzioni_commessa ON jtb_rlavr.cod_jfas = produzioni_commessa.cod_jfas AND\n" + + " jtb_rlavr.cod_jcom = produzioni_commessa.cod_jcom AND\n" + + " jtb_rlavr.data_lav = produzioni_commessa.data_lav\n" + + " WHERE jtb_rlavr.ore <> 0)" + + " , doc_l AS (SELECT dtb_docr.cod_mart,\n" + + " dtb_docr.partita_mag,\n" + + " dtb_docr.data_ord,\n" + + " dtb_docr.num_ord,\n" + + " SUM(dtb_docr.qta_doc) AS qta_doc,\n" + + " SUM(dtb_docr.qta_doc * IIF(dtb_docr.partita_mag IS NULL,\n" + + " [dbo].[f_GetCostoUltArt_depo](dtb_doct.data_reg, dtb_doct.cod_mdep,\n" + + " dtb_docr.cod_mart),\n" + + " mtb_partita_mag.costo_unt_um_mag)) AS val_doc\n" + + " FROM dtb_doct\n" + + " INNER JOIN dtb_docr ON dtb_doct.cod_anag = dtb_docr.cod_anag AND\n" + + " dtb_doct.cod_dtip = dtb_docr.cod_dtip AND\n" + + " dtb_doct.data_doc = dtb_docr.data_doc AND\n" + + " dtb_doct.ser_doc = dtb_docr.ser_doc AND\n" + + " dtb_doct.num_doc = dtb_docr.num_doc\n" + + " INNER JOIN dtb_tipi ON dtb_doct.cod_dtip = dtb_tipi.cod_dtip\n" + + " LEFT OUTER JOIN mtb_partita_mag ON dtb_docr.cod_mart = mtb_partita_mag.cod_mart AND\n" + + " dtb_docr.partita_mag = mtb_partita_mag.partita_mag\n" + + " WHERE dtb_doct.gestione = 'L'\n" + + " AND (dtb_tipi.segno_qta_car < 0 OR dtb_tipi.segno_qta_scar > 0)\n" + + " GROUP BY dtb_docr.cod_mart,\n" + + " dtb_docr.partita_mag,\n" + + " dtb_docr.data_ord,\n" + + " dtb_docr.num_ord)\n" + + "\n" + + "SELECT 'M' AS gruppo,\n" + + " dtb_ordt.cod_jcom,\n" + + " dtb_ordt.cod_prod,\n" + + " dtb_ordt.partita_mag AS partitaMagProd,\n" + + " IIF(dtb_ordt.qta_evasa_prod = 0, dtb_ordt.qta_prod, dtb_ordt.qta_evasa_prod) * dtb_ordt.rap_conv_prod AS qta_prod,\n" + + " doc_l.cod_mart,\n" + + " doc_l.partita_mag,\n" + + " doc_l.qta_doc,\n" + + " doc_l.val_doc,\n" + + " dtb_ordt.data_ord,\n" + + " dtb_ordt.num_ord\n" + + "FROM dtb_ordt\n" + + " INNER JOIN doc_l ON dtb_ordt.data_ord = doc_l.data_ord AND dtb_ordt.num_ord = doc_l.num_ord\n" + + "WHERE cod_prod = " + UtilityDB.valueToString(codProd) + "\n" + + " AND cod_jcom = " + UtilityDB.valueToString(codJcom) + "\n" + + " AND (" + UtilityDB.valueToString(partitaMag) + " IS NULL OR dtb_ordt.partita_mag = " + UtilityDB.valueToString(partitaMag) + ")\n" + + " AND dtb_ordt.gestione = 'L'\n" + + "UNION ALL\n" + + "SELECT DISTINCT 'R' AS gruppo,\n" + + " cod_jcom,\n" + + " rapportini.cod_prod,\n" + + " rapportini.partita_mag_prod AS partitaMagProd,\n" + + " rapportini.qta_prod,\n" + + " rapportini.cod_jflav AS cod_mart,\n" + + " rapportini.cod_jfas AS partita_mag,\n" + + " ora_lav_ord,\n" + + " costo_lav,\n" + + " data_ord,\n" + + " num_ord\n" + + "FROM rapportini\n" + + "WHERE cod_prod = " + UtilityDB.valueToString(codProd) + "\n" + + " AND cod_jcom = " + UtilityDB.valueToString(codJcom) + "\n" + + " AND (" + UtilityDB.valueToString(partitaMag) + " IS NULL OR rapportini.partita_mag_prod = " + UtilityDB.valueToString(partitaMag) + ")\n" + + "UNION ALL\n" + + "SELECT 'T' AS gruppo,\n" + + " dtb_ordt.cod_jcom,\n" + + " dtb_ordt.cod_prod,\n" + + " dtb_ordt.partita_mag AS partitaMagProd,\n" + + " IIF(dtb_ordt.qta_evasa_prod = 0, dtb_ordt.qta_prod, dtb_ordt.qta_evasa_prod) AS qta_prod,\n" + + " dtb_ords.cod_spes,\n" + + " NULL,\n" + + " IIF(dtb_ordt.qta_evasa_prod = 0, dtb_ordt.qta_prod, dtb_ordt.qta_evasa_prod) AS qta_doc,\n" + + " IIF(dtb_ordt.qta_evasa_prod = 0, dtb_ordt.qta_prod, dtb_ordt.qta_evasa_prod) * dtb_ords.val_unt AS val_doc,\n" + + " dtb_ordt.data_ord,\n" + + " dtb_ordt.num_ord\n" + + "FROM dtb_ordt\n" + + " INNER JOIN dtb_ords ON dtb_ordt.data_ord = dtb_ords.data_ord AND dtb_ordt.num_ord = dtb_ords.num_ord AND\n" + + " dtb_ordt.gestione = dtb_ords.gestione\n" + + " INNER JOIN gtb_anag ON dtb_ordt.cod_anag = gtb_anag.cod_anag\n" + + "WHERE cod_prod = " + UtilityDB.valueToString(codProd) + "\n" + + " AND cod_jcom = " + UtilityDB.valueToString(codJcom) + "\n" + + " AND (" + UtilityDB.valueToString(partitaMag) + " IS NULL OR dtb_ordt.partita_mag = " + UtilityDB.valueToString(partitaMag) + ")\n" + + " AND dtb_ordt.gestione = 'L'\n" + + " AND NOT EXISTS(SELECT * FROM azienda WHERE azienda.part_iva = gtb_anag.part_iva)\n" + + "ORDER BY data_ord, num_ord, cod_jcom, cod_prod, 4, gruppo"; + return UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, DettaglioCostiDTO.class); + } + + public void attribuzioneCostoMaterialiLavorazione(Date dataIniz, Date dataFine, String codProd, String partitaMag, String codJcom) throws Exception { + String codDtipLav = setupGest.getSetup(multiDBTransactionManager.getPrimaryConnection(), "W_PORDI_RC", "SETUP_DOCUMENTI", "COD_DTIP_CAR"); + //cerco tutti i documenti di lavorazione creati nel periodo selezionato + String sql = "SELECT dtb_docr.*\n" + + "FROM dtb_docr\n" + + " INNER JOIN dtb_doct ON dtb_docr.cod_anag = dtb_doct.cod_anag AND dtb_docr.cod_dtip = dtb_doct.cod_dtip AND\n" + + " dtb_docr.data_doc = dtb_doct.data_doc AND dtb_docr.ser_doc = dtb_doct.ser_doc AND\n" + + " dtb_docr.num_doc = dtb_doct.num_doc AND dtb_docr.cod_mart = dtb_doct.cod_prod\n" + + "WHERE dtb_doct.data_doc BETWEEN " + UtilityDB.valueToString(dataIniz) + " AND " + UtilityDB.valueToString(dataFine) + "\n" + + " AND dtb_doct.cod_dtip = " + UtilityDB.valueToString(codDtipLav) + "\n" + + " AND (" + UtilityDB.valueToString(codProd) + " IS NULL OR dtb_doct.cod_prod = " + UtilityDB.valueToString(codProd) + ")\n" + + " AND (" + UtilityDB.valueToString(codJcom) + " IS NULL OR dtb_doct.cod_jcom = " + UtilityDB.valueToString(codJcom) + ")\n" + + " AND (" + UtilityDB.valueToString(partitaMag) + " IS NULL OR dtb_doct.partita_mag = " + UtilityDB.valueToString(partitaMag) + ")"; + List documentiLav = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, DtbDocr.class); + + if (UtilityList.isNullOrEmpty(documentiLav)) + return; + + // raggruppo per articolo/commessa/partita/ordine + List listToCheck = documentiLav + .stream() + .map(x -> new ArticoloPartitaCommessaDTO(x.getCodMart(), x.getCodJcom(), x.getPartitaMag(), x.getDataOrd(), x.getNumOrd())) + .distinct() + .collect(Collectors.toList()); + + for (ArticoloPartitaCommessaDTO dataToCheck : listToCheck) { + //prendo dettaglio costi per articolo commessa partita + List dettaglioCosti = getDettaglioCostiProd(dataToCheck.getCodMart(), dataToCheck.getPartitaMag(), dataToCheck.getCodJcom()); + if (UtilityList.isNullOrEmpty(dettaglioCosti)) + continue; + //filtro solo i costi dell'ordine richiesto + List costiOrdine = dettaglioCosti.stream() + .filter(c -> + Objects.equals(UtilityLocalDate.localDateToDate(c.getDataOrd()), dataToCheck.getDataOrd()) && + Objects.equals(c.getNumOrd(), dataToCheck.getNumOrd()) + ) + .collect(Collectors.toList()); + // il costoUnitario è la somma dei costi divisi per la quantità prodotta nell'ordine + BigDecimal costoProdUnt = costiOrdine.stream() + .map(x -> x.getValDoc().divide(x.getQtaProd(), 5, RoundingMode.HALF_UP)) + .reduce(BigDecimal.ZERO, BigDecimal::add); + + //aggiorno le righe dei vari documenti (mantenendo lo stesso filtro ovviamente) + List righeDaAggiornare = documentiLav.stream() + .filter(x -> new ArticoloPartitaCommessaDTO(x.getCodMart(), x.getCodJcom(), x.getPartitaMag(), x.getDataOrd(), x.getNumOrd()).equals(dataToCheck)) + .peek(r -> { + r.setValUnt(costoProdUnt) + .setCostoUnt(costoProdUnt) + .setOperation(OperationType.UPDATE); + }).collect(Collectors.toList()); + List docDaAggiornare = righeDaAggiornare.stream().map(r -> new DtbDoct(r.getCodAnag(), r.getCodDtip(), r.getDataDoc(), r.getNumDoc(), r.getSerDoc())).distinct().collect(Collectors.toList()); + docDaAggiornare = docDaAggiornare.stream().peek(d -> { + d.setDtbDocr(righeDaAggiornare.stream() + .filter(r -> d.equals(new DtbDoct(r.getCodAnag(), r.getCodDtip(), r.getDataDoc(), r.getNumDoc(), r.getSerDoc()))) + .collect(Collectors.toList())); + }).collect(Collectors.toList()); + + entityProcessor.processEntityList(docDaAggiornare, true); + } + } } \ No newline at end of file