From 158269f6f37a77048cc8122da4f1f978d1dbb775 Mon Sep 17 00:00:00 2001 From: MinaR Date: Thu, 25 Jul 2024 13:11:07 +0200 Subject: [PATCH 1/3] correzioni su popolamento giacenza: errore di duplicazione di chiave nel salvataggio degli inventari e valorizzazione strana della data di inserimento --- .../it/integry/ems/retail/service/GiacenzaService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ems-engine/src/main/java/it/integry/ems/retail/service/GiacenzaService.java b/ems-engine/src/main/java/it/integry/ems/retail/service/GiacenzaService.java index 6de26705c4..6346e977e7 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/service/GiacenzaService.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/service/GiacenzaService.java @@ -219,7 +219,7 @@ public class GiacenzaService { private void popolaQtaCarInventario(String codMdep, Date dataIniz, String queryArt, List articoliSalvati, String codDtipRett) throws Exception { String sql = - Query.format("SELECT min(id_inventario) from carelli_giacenza_prog WHERE cod_mdep = %s and id_inventario is not null", codMdep); + Query.format("SELECT max(id_inventario) from carelli_giacenza_prog WHERE cod_mdep = %s and id_inventario is not null", codMdep); Integer maxIdInv = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql); @@ -299,10 +299,10 @@ public class GiacenzaService { sql = Query.format( - "SELECT art.cod_mart_mov as cod_mart " + + "SELECT DISTINCT art.cod_mart_mov as cod_mart " + " FROM mtb_aart " + " INNER JOIN (" + queryArt + ") art on mtb_aart.cod_mart = art.cod_mart\n" + - "WHERE exists(select * from mtb_sart where mtb_aart.cod_marT = mtb_sart.cod_mart and mtb_sart.cod_mdep = %s and \n" + + "WHERE exists(select * from mtb_sart where art.cod_mart_mov = mtb_sart.cod_mart and mtb_sart.cod_mdep = %s and \n" + "(qta_iniz <> 0 or qta_car <> 0 or qta_scar <> 0 ))", codMdep); sql = UtilityDB.addwhereCond(sql, whereCondFiltro, true); List datiArt = UtilityDB.executeSimpleQueryOnlyFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql); @@ -367,7 +367,7 @@ public class GiacenzaService { .setQtaScar(BigDecimal.ZERO) .setDataReg(dataCollo) .setTipoCar("R") - .setDataIns(new Date()); + .setDataIns(dataCollo); if (articoliSalvati.contains(codMart)) c.setOperation(OperationType.UPDATE); From 6f4d0f1072a6a33b01f635663359e7b210fa32c6 Mon Sep 17 00:00:00 2001 From: MinaR Date: Thu, 25 Jul 2024 13:19:00 +0200 Subject: [PATCH 2/3] RIPORTATE MODIFICHE FATTE NELL'HOTFIX --- .../it/integry/ems/retail/service/GiacenzaService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ems-engine/src/main/java/it/integry/ems/retail/service/GiacenzaService.java b/ems-engine/src/main/java/it/integry/ems/retail/service/GiacenzaService.java index e18bdf13ac..ec9b4b31ae 100644 --- a/ems-engine/src/main/java/it/integry/ems/retail/service/GiacenzaService.java +++ b/ems-engine/src/main/java/it/integry/ems/retail/service/GiacenzaService.java @@ -221,7 +221,7 @@ public class GiacenzaService { private void popolaQtaCarInventario(String codMdep, Date dataIniz, String queryArt, List articoliSalvati, String codDtipRett) throws Exception { String sql = - Query.format("SELECT min(id_inventario) from carelli_giacenza_prog WHERE cod_mdep = %s and id_inventario is not null", codMdep); + Query.format("SELECT max(id_inventario) from carelli_giacenza_prog WHERE cod_mdep = %s and id_inventario is not null", codMdep); Integer maxIdInv = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql); @@ -301,10 +301,10 @@ public class GiacenzaService { sql = Query.format( - "SELECT art.cod_mart_mov as cod_mart " + + "SELECT DISTINCT art.cod_mart_mov as cod_mart " + " FROM mtb_aart " + " INNER JOIN (" + queryArt + ") art on mtb_aart.cod_mart = art.cod_mart\n" + - "WHERE exists(select * from mtb_sart where mtb_aart.cod_marT = mtb_sart.cod_mart and mtb_sart.cod_mdep = %s and \n" + + "WHERE exists(select * from mtb_sart where art.cod_mart_mov = mtb_sart.cod_mart and mtb_sart.cod_mdep = %s and \n" + "(qta_iniz <> 0 or qta_car <> 0 or qta_scar <> 0 ))", codMdep); sql = UtilityDB.addwhereCond(sql, whereCondFiltro, true); List datiArt = UtilityDB.executeSimpleQueryOnlyFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql); @@ -369,7 +369,7 @@ public class GiacenzaService { .setQtaScar(BigDecimal.ZERO) .setDataReg(dataCollo) .setTipoCar("R") - .setDataIns(new Date()); + .setDataIns(dataCollo); if (articoliSalvati.contains(codMart)) c.setOperation(OperationType.UPDATE); From fce0b0e81ab8de50b8af52f1ca5f7d946919e9c3 Mon Sep 17 00:00:00 2001 From: AnthonyS Date: Thu, 25 Jul 2024 15:08:14 +0200 Subject: [PATCH 3/3] Miglioramento vista CRP_OF_FabbisognoOre_JSON per lentezza da Agricoper --- .../model/Migration_20240725150448.java | 528 ++++++++++++++++++ 1 file changed, 528 insertions(+) create mode 100644 ems-core/src/main/java/it/integry/ems/migration/model/Migration_20240725150448.java diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20240725150448.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20240725150448.java new file mode 100644 index 0000000000..291e54eb1d --- /dev/null +++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20240725150448.java @@ -0,0 +1,528 @@ +package it.integry.ems.migration.model; + +import it.integry.ems.migration._base.BaseMigration; +import it.integry.ems.migration._base.IntegryCustomerDB; +import it.integry.ems.migration._base.MigrationModelInterface; + +public class Migration_20240725150448 extends BaseMigration implements MigrationModelInterface { + + @Override + public void up() throws Exception { + if (isHistoryDB()) + return; + + if (!isCustomerDb(IntegryCustomerDB.Agricoper_Agricoper)) { + return; + } + + createOrUpdateView("CRP_OF_FabbisognoOre_JSON", "CREATE VIEW [dbo].[CRP_OF_FabbisognoOre_JSON] AS\n" + + " --Prende tutte le righe degli ordini di vendita da confezionare in sede ed produce una riga di raccolta per ogni varietà inclusa nel confezionamento\n" + + "/*SELECT CASE\n" + + " WHEN jtb_cicl.cod_jfas = 'COMA' AND jtb_dist_clav_dir.cod_jfas = 'CONF' THEN 'SEDE'\n" + + " ELSE 'CAMPAGNA' END AS luogo_lavoro,\n" + + " --ISNULL(dtb_ordt.cod_jcom, CONVERT(VARCHAR(8), (YEAR(dtb_ordt.data_ord) - 2000) * 100000 + dtb_ordt.num_ord)) AS cod_jcom,\n" + + " (SELECT DISTINCT ISNULL(ordV.cod_jcom,\n" + + " CONVERT(VARCHAR(8), (YEAR(ordV.data_ord) - 2000) * 100000 + ordV.num_ord)) AS cod_jcom,\n" + + " jc.descrizione AS desc_comm,\n" + + " (SELECT MAX(kg_ord)\n" + + " FROM (VALUES (ROUND((qta_ord - qta_evasa) * rap_conv * ma.peso_kg * distPF.perc_mp * 1.1, 0)),\n" + + " (0)) AS t(kg_ord)) AS kg_ord\n" + + " FROM dtb_ordt ordV\n" + + " INNER JOIN dtb_ordr OrdVr ON OrdV.gestione = OrdVr.gestione AND\n" + + " ordV.data_ord = OrdVr.data_ord AND\n" + + " ordV.num_ord = OrdVr.num_ord AND\n" + + " ordV.cod_anag = dtb_ordt.cod_anag AND\n" + + " ordVr.cod_mart = dtb_ordr.cod_mart AND\n" + + " ordVr.data_cons = dtb_ordr.data_cons\n" + + " INNER JOIN mtb_aart ma ON OrdVr.cod_mart = ma.cod_mart\n" + + " INNER JOIN jtb_comt jc ON ISNULL(ordV.cod_jcom,\n" + + " CONVERT(VARCHAR(8), (YEAR(ordV.data_ord) - 2000) * 100000 + ordV.num_ord)) =\n" + + " jc.cod_jcom\n" + + " FOR JSON PATH) AS cod_jcom,\n" + + " dtb_ordr.data_cons,\n" + + " dtb_ordt.cod_anag,\n" + + " gtb_anag.rag_soc,\n" + + " dtb_ordt.cod_anag + ' - ' + gtb_anag.rag_soc AS cliente,\n" + + " --ISNULL(vtb_dest.citta, gtb_anag.citta) AS citta,\n" + + " '' AS citta,\n" + + " dtb_ordr.cod_mart,\n" + + " dtb_ordr.descrizione_estesa AS descrizione,\n" + + " dtb_ordr.cod_mart + ' - ' + dtb_ordr.descrizione_estesa AS prodotto,\n" + + " CASE\n" + + " WHEN SUM(qta_ord - qta_evasa) < 0 THEN 0\n" + + " ELSE SUM((qta_ord - qta_evasa) * rap_conv) END *\n" + + " distPf.perc_mp *\n" + + " 1.1 AS qta_ord,\n" + + " ROUND(CASE\n" + + " WHEN SUM(qta_ord - qta_evasa) < 0 THEN 0\n" + + " ELSE SUM((qta_ord - qta_evasa) * rap_conv * mtb_aart.peso_kg) END * distPf.perc_mp * 1.1, 0) AS kg_ord,\n" + + " CEILING(CASE\n" + + " WHEN SUM(num_cnf - num_cnf_evasa) < 0 THEN 0\n" + + " ELSE SUM(dtb_ordr.num_cnf - dtb_ordr.num_cnf_evasa) END *\n" + + " distPf.perc_mp *\n" + + " 1.1) AS colli_ord,\n" + + " dtb_ordr.qta_cnf,\n" + + " CEILING(CASE\n" + + " WHEN SUM(num_cnf - num_cnf_evasa) < 0 THEN 0\n" + + " ELSE SUM((dtb_ordr.num_cnf - dtb_ordr.num_cnf_evasa) / dtb_ordr.colli_pedana) END *\n" + + " distPf.perc_mp *\n" + + " 1.1) AS pedane_ord,\n" + + " jtb_dist_clav_dir.cod_jfas,\n" + + " CASE\n" + + " WHEN jtb_cicl.cod_jfas = 'COMA' AND jtb_dist_clav_dir.cod_jfas = 'CONF' THEN 'COMA'\n" + + " ELSE 'CONF' END AS luogo,\n" + + " CASE\n" + + " WHEN SUM(qta_ord - qta_evasa) < 0 THEN 0\n" + + " ELSE ROUND(SUM(qta_ord * rap_conv * jtb_dist_clav_dir.hr_time /\n" + + " (jtb_cicl.qta_prod * jtb_cicl.rap_conv_prod)) / 3600,\n" + + " 2) END *\n" + + " distPf.perc_mp AS ore_uomo_necessarie,\n" + + " CASE\n" + + " WHEN jtb_dist_clav_dir.hr_time = 0 THEN 80\n" + + " ELSE ISNULL(ROUND(jtb_cicl.qta_prod * jtb_cicl.rap_conv_prod /\n" + + " (jtb_dist_clav_dir.hr_time / 3600), 0),\n" + + " 80) END AS produttivita,\n" + + " mtb_aart.unt_mis,\n" + + " dtb_ordt.flag_sospeso,\n" + + " (SELECT PF.cod_mart,\n" + + " mtb_aart.descrizione,\n" + + " (SELECT jtb_cicl.cod_jfas AS cod_jfas_sl,\n" + + " jtb_cicl.cod_prod AS cod_sl,\n" + + " jtb_cicl.descrizione_prod AS descr_sl,\n" + + " sl.qta_cnf,\n" + + " sl.colli_pedana,\n" + + " jtb_dist_mate.perc_sfrido,\n" + + " CONVERT(VARCHAR(20), CONVERT(INTEGER, ISNULL(mtb_part.qta_esistente, 0))) + ' ' +\n" + + " mtb_aart.unt_mis AS giacenza\n" + + " FROM jtb_cicl\n" + + " INNER JOIN jtb_dist_mate ON jtb_cicl.cod_prod = jtb_dist_mate.cod_prod\n" + + " INNER JOIN mtb_aart sl ON jtb_dist_mate.cod_prod = sl.cod_mart\n" + + " INNER JOIN mtb_aart ON jtb_dist_mate.cod_mart = mtb_aart.cod_mart\n" + + " INNER JOIN mtb_grup\n" + + " ON mtb_aart.cod_mgrp = mtb_grup.cod_mgrp AND\n" + + " mtb_grup.tipo_mgrp = 'MP'\n" + + " AND mtb_aart.cod_mart = PF.cod_mart\n" + + " LEFT OUTER JOIN mtb_part\n" + + " ON jtb_cicl.cod_mart = mtb_part.cod_mart AND mtb_part.cod_mdep =\n" + + " (SELECT DBO.getGestSetup('CRUSCOTTO_PRODUZIONE', 'SETUP', 'COD_MDEP_SCAR'))\n" + + " WHERE jtb_cicl.cod_jfas = 'RACC'\n" + + " AND sl.flag_stato = 'A'\n" + + " FOR JSON PATH) AS semilavorato\n" + + " FROM jtb_dist_mate PF\n" + + " INNER JOIN mtb_aart ON PF.cod_mart = mtb_aart.cod_mart\n" + + " INNER JOIN mtb_grup ON mtb_aart.cod_mgrp = mtb_grup.cod_mgrp AND mtb_grup.tipo_mgrp = 'MP'\n" + + " WHERE PF.cod_prod = distPF.cod_prod\n" + + " AND PF.cod_mart = distPF.cod_mart\n" + + " FOR JSON PATH) AS varieta,\n" + + " dtb_ordr.cod_tcol_UL\n" + + "FROM dtb_ordt\n" + + " INNER JOIN dtb_ordr ON dtb_ordt.gestione = dtb_ordr.gestione AND dtb_ordt.data_ord = dtb_ordr.data_ord AND\n" + + " dtb_ordt.num_ord = dtb_ordr.num_ord\n" + + " INNER JOIN jtb_cicl ON jtb_cicl.cod_prod = dtb_ordr.cod_mart\n" + + " INNER JOIN mtb_aart ON dtb_ordr.cod_mart = mtb_aart.cod_mart\n" + + " INNER JOIN jtb_dist_clav_dir\n" + + " ON jtb_dist_clav_dir.cod_prod = dtb_ordr.cod_mart AND jtb_dist_clav_dir.cod_jfas = 'RACC'\n" + + " INNER JOIN gtb_anag ON dtb_ordt.cod_anag = gtb_anag.cod_anag\n" + + " LEFT OUTER JOIN vtb_dest ON dtb_ordt.cod_anag = vtb_dest.cod_anag AND dtb_ordt.cod_vdes = vtb_dest.cod_vdes\n" + + " INNER JOIN\n" + + " (SELECT jtb_cicl.cod_prod, jtb_dist_mate.cod_mart, jtb_dist_mate.qta_std / jtb_cicl.qta_prod AS perc_mp\n" + + " FROM jtb_cicl\n" + + " INNER JOIN jtb_dist_mate ON jtb_cicl.cod_prod = jtb_dist_mate.cod_prod\n" + + " INNER JOIN mtb_aart ON jtb_dist_mate.cod_mart = mtb_aart.cod_mart\n" + + " INNER JOIN mtb_grup ON mtb_aart.cod_mgrp = mtb_grup.cod_mgrp AND mtb_grup.tipo_mgrp = 'MP') distPF\n" + + " ON dtb_ordr.cod_mart = distPF.cod_prod\n" + + "\n" + + "WHERE dtb_ordt.gestione = 'V'\n" + + " AND dtb_ordr.data_cons >= DATEADD(DAY, -1, GETDATE())\n" + + " AND flag_evaso = 'I'\n" + + " AND flag_annulla = 'N'\n" + + "--AND dtb_ordr.cod_mart = '150122-122' and data_cons = '2022/10/01'\n" + + "\n" + + "GROUP BY jtb_cicl.cod_jfas,\n" + + " dtb_ordr.data_cons, gtb_anag.rag_soc, gtb_anag.citta, --vtb_dest.citta,\n" + + " dtb_ordr.cod_mart,\n" + + " dtb_ordr.descrizione_estesa, jtb_dist_clav_dir.cod_jfas, jtb_dist_clav_dir.hr_time, flag_sospeso,\n" + + " dtb_ordt.cod_anag,\n" + + " mtb_aart.unt_mis, distPf.perc_mp, distPF.cod_mart,\n" + + " distPF.cod_mart, distPF.cod_prod,\n" + + " jtb_cicl.qta_prod,\n" + + " jtb_cicl.rap_conv_prod, dtb_ordr.cod_tcol_UL, dtb_ordr.qta_cnf*/\n" + + "\n" + + "WITH prodotti AS (SELECT PF.cod_mart,\n" + + " PF.cod_prod,\n" + + " mtb_aart.descrizione,\n" + + " (SELECT jtb_cicl.cod_jfas AS cod_jfas_sl,\n" + + " jtb_cicl.cod_prod AS cod_sl,\n" + + " jtb_cicl.descrizione_prod AS descr_sl,\n" + + " sl.qta_cnf,\n" + + " sl.colli_pedana,\n" + + " jtb_dist_mate.perc_sfrido,\n" + + " CONVERT(VARCHAR(20), CONVERT(INTEGER, ISNULL(mtb_part.qta_esistente, 0))) + ' ' +\n" + + " mtb_aart.unt_mis AS giacenza\n" + + " FROM jtb_cicl\n" + + " INNER JOIN jtb_dist_mate ON jtb_cicl.cod_prod = jtb_dist_mate.cod_prod\n" + + " INNER JOIN mtb_aart sl ON jtb_dist_mate.cod_prod = sl.cod_mart\n" + + " INNER JOIN mtb_aart ON jtb_dist_mate.cod_mart = mtb_aart.cod_mart\n" + + " INNER JOIN mtb_grup\n" + + " ON mtb_aart.cod_mgrp = mtb_grup.cod_mgrp AND\n" + + " mtb_grup.tipo_mgrp = 'MP'\n" + + " AND mtb_aart.cod_mart = PF.cod_mart\n" + + " LEFT OUTER JOIN mtb_part\n" + + " ON jtb_cicl.cod_mart = mtb_part.cod_mart AND mtb_part.cod_mdep =\n" + + " (SELECT DBO.getGestSetup('CRUSCOTTO_PRODUZIONE', 'SETUP', 'COD_MDEP_SCAR'))\n" + + " WHERE jtb_cicl.cod_jfas = 'RACC'\n" + + " AND sl.flag_stato = 'A'\n" + + " FOR JSON PATH) AS semilavorato\n" + + " FROM jtb_dist_mate PF\n" + + " INNER JOIN mtb_aart ON PF.cod_mart = mtb_aart.cod_mart\n" + + " INNER JOIN mtb_grup\n" + + " ON mtb_aart.cod_mgrp = mtb_grup.cod_mgrp AND mtb_grup.tipo_mgrp = 'MP'),\n" + + " varieta AS (SELECT prodotti.cod_mart,\n" + + " prodotti.cod_prod,\n" + + " prodotti.descrizione,\n" + + " (SELECT cod_mart, descrizione, semilavorato\n" + + " FROM prodotti varieta2\n" + + " WHERE varieta2.cod_prod = prodotti.cod_prod\n" + + " AND varieta2.cod_mart = prodotti.cod_mart\n" + + " FOR JSON PATH) AS json_varieta\n" + + " FROM prodotti),\n" + + " colliL AS (SELECT mtb_colr.cod_mart,\n" + + " mtb_colr.data_collo,\n" + + " SUM(mtb_colr.num_cnf) AS num_cnf,\n" + + " SUM(ma.qta_cnf * mtb_colr.num_cnf) AS qta_col_teo,\n" + + " SUM(mtb_colr.qta_col) AS qta_col_eff\n" + + " FROM mtb_colr\n" + + " INNER JOIN mtb_aart ma ON mtb_colr.cod_mart = ma.cod_mart\n" + + " INNER JOIN mtb_colt ON mtb_colr.gestione = mtb_colt.gestione AND\n" + + " mtb_colr.data_collo = mtb_colt.data_collo AND\n" + + " mtb_colr.ser_collo = mtb_colt.ser_collo AND\n" + + " mtb_colr.num_collo = mtb_colt.num_collo\n" + + " WHERE mtb_colr.gestione = 'L'\n" + + " AND mtb_colt.segno = 1\n" + + " GROUP BY mtb_colr.cod_mart, mtb_colr.data_collo),\n" + + " colliV AS (SELECT mtb_colr.cod_mart,\n" + + " mtb_colr.cod_jcom,\n" + + " mtb_colr.gestione,\n" + + " mtb_colr.data_ord,\n" + + " mtb_colr.num_ord,\n" + + " SUM(mtb_colr.num_cnf) AS num_cnf,\n" + + " SUM(ma.qta_cnf * mtb_colr.num_cnf) AS qta_col_teo,\n" + + " SUM(mtb_colr.qta_col) AS qta_col_eff\n" + + " FROM mtb_colr\n" + + " INNER JOIN mtb_aart ma ON mtb_colr.cod_mart = ma.cod_mart\n" + + " INNER JOIN mtb_colt ON mtb_colr.gestione = mtb_colt.gestione AND\n" + + " mtb_colr.data_collo = mtb_colt.data_collo AND\n" + + " mtb_colr.ser_collo = mtb_colt.ser_collo AND\n" + + " mtb_colr.num_collo = mtb_colt.num_collo\n" + + " WHERE mtb_colr.gestione = 'V'\n" + + " AND mtb_colt.segno = -1\n" + + " AND mtb_colt.data_doc IS NULL\n" + + " GROUP BY mtb_colr.cod_mart, mtb_colr.cod_jcom, mtb_colr.gestione, mtb_colr.data_ord, mtb_colr.num_ord),\n" + + " qtaPianConf AS (SELECT cod_prod,\n" + + " cod_jcom,\n" + + " MAX(flag_evaso_prod) AS flag_evaso_prod,\n" + + " SUM(qta_pian) AS qta_pian,\n" + + " SUM(colli_pian) AS colli_pian\n" + + " FROM (SELECT DISTINCT luogo_lavoro,\n" + + " dopp.cod_jfas,\n" + + " dopp.cod_anag,\n" + + " dopp.cod_prod,\n" + + " cod_sl,\n" + + " dopp.cod_jcom,\n" + + " dopp.cod_mart,\n" + + " magaz,\n" + + " CASE WHEN do.flag_evaso_prod = 'E' THEN 1 ELSE 0 END AS flag_evaso_prod,\n" + + " CEILING(SUM(CASE WHEN do.flag_evaso_prod = 'E' THEN 0 ELSE qta_ord END)\n" + + " OVER (PARTITION BY dopp.cod_jfas, do.num_ord, dopp.cod_prod, dopp.cod_jcom))\n" + + " AS qta_pian,\n" + + " CEILING(SUM(CASE WHEN do.flag_evaso_prod = 'E' THEN 0 ELSE qta_ord END /\n" + + " ma.qta_cnf)\n" + + " OVER (PARTITION BY dopp.cod_jfas, do.num_ord, dopp.cod_prod, dopp.cod_jcom))\n" + + " AS colli_pian,\n" + + " dopp.data_ord\n" + + " FROM dtb_ordr_pian_prod dopp\n" + + " LEFT OUTER JOIN dtb_ordt do\n" + + " ON dopp.gestione = do.gestione\n" + + " AND dopp.data_ord = do.data_ord\n" + + " AND do.num_ord = dopp.num_ord\n" + + " LEFT OUTER JOIN mtb_aart ma ON dopp.cod_prod = ma.cod_mart\n" + + " WHERE magaz = 0\n" + + " AND dopp.cod_jcom IS NOT NULL\n" + + " AND (data_piano >= CAST(GETDATE() AS DATE) OR do.num_ord IS NOT NULL)) t\n" + + " GROUP BY cod_prod, cod_jcom),\n" + + " qtaPianiRacc AS (SELECT cod_mart,\n" + + " data_piano,\n" + + " MAX(flag_evaso_prod) AS flag_evaso_prod,\n" + + " SUM(qta_pian) AS qta_pian\n" + + " FROM (SELECT DISTINCT dopp.cod_mart,\n" + + " CASE WHEN do.flag_evaso_prod = 'E' THEN 1 ELSE 0 END AS flag_evaso_prod,\n" + + " CEILING(SUM(CASE WHEN do.flag_evaso_prod = 'E' THEN 0 ELSE qta_ord END)\n" + + " OVER (PARTITION BY dopp.data_piano, dopp.cod_mart))\n" + + " AS qta_pian,\n" + + " dopp.data_piano\n" + + " FROM dtb_ordr_pian_prod dopp\n" + + " LEFT OUTER JOIN dtb_ordt do\n" + + " ON dopp.gestione = do.gestione\n" + + " AND dopp.data_ord = do.data_ord\n" + + " AND do.num_ord = dopp.num_ord\n" + + " WHERE dopp.cod_jfas = 'RACC'\n" + + " AND data_piano >= CAST(GETDATE() AS DATE)) t\n" + + " GROUP BY cod_mart, data_piano),\n" + + " ordiniResiduiConf AS (SELECT CASE\n" + + " WHEN jtb_cicl.cod_jfas = 'COMA' AND jtb_dist_clav_dir.cod_jfas = 'CONF'\n" + + " THEN 'SEDE'\n" + + " ELSE 'CAMPAGNA' END AS luogo_lavoro,\n" + + " ISNULL(dtb_ordt.cod_jcom,\n" + + " CONVERT(VARCHAR(8), (YEAR(dtb_ordt.data_ord) - 2000) * 100000 + dtb_ordt.num_ord)) AS cod_jcom,\n" + + " dtb_ordr.data_cons,\n" + + " dtb_ordt.cod_anag,\n" + + " gtb_anag.rag_soc,\n" + + " dtb_ordt.cod_anag + ' - ' + gtb_anag.rag_soc AS cliente,\n" + + " dtb_ordr.cod_mart,\n" + + " dtb_ordr.descrizione,\n" + + " dtb_ordr.cod_mart + ' - ' + dtb_ordr.descrizione AS prodotto,\n" + + " --MAX(qtaPian.flag_evaso_prod) AS flag_evaso_prod,\n" + + " (dtb_ordr.num_cnf - dtb_ordr.num_cnf_evasa) * mtb_aart.qta_cnf *\n" + + " mtb_aart.peso_kg AS kg_ord,\n" + + " qtaPianConf.qta_pian,\n" + + " calc.kg_residui AS kg_residui,\n" + + " qtaPianConf.colli_pian,\n" + + " calc.colli_residui AS colli_residui,\n" + + " mtb_aart.qta_cnf,\n" + + " dtb_ordr.colli_pedana,\n" + + " CEILING(qtaPianConf.colli_pian / dtb_ordr.colli_pedana) AS pedane_pian,\n" + + " CEILING(calc.colli_residui / dtb_ordr.colli_pedana) AS pedane_residue,\n" + + " jtb_dist_clav_dir.cod_jfas,\n" + + " CASE\n" + + " WHEN jtb_cicl.cod_jfas = 'COMA' AND jtb_dist_clav_dir.cod_jfas = 'CONF'\n" + + " THEN 'COMA'\n" + + " ELSE 'CONF' END AS luogo,\n" + + " ROUND(calc.kg_residui * jtb_dist_clav_dir.hr_time /\n" + + " (jtb_cicl.qta_prod * jtb_cicl.rap_conv_prod) / 3600,\n" + + " 2) AS ore_uomo_necessarie,\n" + + " CASE\n" + + " WHEN jtb_dist_clav_dir.hr_time = 0 THEN 80\n" + + " ELSE ISNULL(ROUND(jtb_cicl.qta_prod * jtb_cicl.rap_conv_prod /\n" + + " (jtb_dist_clav_dir.hr_time / 3600), 0),\n" + + " 80) END AS produttivita,\n" + + " mtb_aart.unt_mis,\n" + + " dtb_ordt.flag_sospeso,\n" + + " dtb_ordr.cod_tcol_UL,\n" + + " (SELECT MP.cod_mart, MP.descrizione, MP.perc_sfrido\n" + + " FROM (SELECT jtb_cicl.cod_jfas AS cod_jfas_sl,\n" + + " jtb_dist_mate.cod_mart,\n" + + " mtb_aart.descrizione,\n" + + " jtb_cicl.cod_prod AS cod_sl,\n" + + " jtb_cicl.descrizione_prod AS descr_sl,\n" + + " jtb_dist_mate.perc_sfrido\n" + + " FROM jtb_cicl\n" + + " INNER JOIN jtb_dist_mate ON jtb_cicl.cod_prod = jtb_dist_mate.cod_prod\n" + + " INNER JOIN mtb_aart ON jtb_dist_mate.cod_mart = mtb_aart.cod_mart\n" + + " INNER JOIN mtb_grup\n" + + " ON mtb_aart.cod_mgrp = mtb_grup.cod_mgrp AND mtb_grup.tipo_mgrp = 'MP'\n" + + " WHERE jtb_cicl.cod_prod = dtb_ordr.cod_mart) MP\n" + + " FOR JSON AUTO) varieta\n" + + " FROM dtb_ordt\n" + + " INNER JOIN dtb_ordr ON dtb_ordt.gestione = dtb_ordr.gestione AND\n" + + " dtb_ordt.data_ord = dtb_ordr.data_ord AND\n" + + " dtb_ordt.num_ord = dtb_ordr.num_ord\n" + + " INNER JOIN jtb_cicl ON jtb_cicl.cod_prod = dtb_ordr.cod_mart\n" + + " INNER JOIN mtb_aart ON dtb_ordr.cod_mart = mtb_aart.cod_mart\n" + + " LEFT OUTER JOIN jtb_dist_clav_dir\n" + + " ON jtb_dist_clav_dir.cod_prod = dtb_ordr.cod_mart AND\n" + + " jtb_dist_clav_dir.cod_jfas <> 'RACC'\n" + + " INNER JOIN gtb_anag ON dtb_ordt.cod_anag = gtb_anag.cod_anag\n" + + " LEFT OUTER JOIN vtb_dest ON dtb_ordt.cod_anag = vtb_dest.cod_anag AND\n" + + " dtb_ordt.cod_vdes = vtb_dest.cod_vdes\n" + + " LEFT OUTER JOIN colliV ON colliV.cod_mart = dtb_ordr.cod_mart AND\n" + + " colliV.cod_jcom = dtb_ordt.cod_jcom\n" + + " LEFT OUTER JOIN qtaPianConf ON dtb_ordr.cod_mart = qtaPianConf.cod_prod AND\n" + + " dtb_ordt.cod_jcom = qtaPianConf.cod_jcom\n" + + " CROSS APPLY(SELECT ROUND(CEILING(dtb_ordr.num_cnf - dtb_ordr.num_cnf_evasa -\n" + + " ISNULL(colliV.num_cnf, 0) -\n" + + " (ISNULL(qtaPianConf.colli_pian, 0))) *\n" + + " mtb_aart.qta_cnf *\n" + + " mtb_aart.peso_kg, 0) AS kg_residui,\n" + + " CEILING(dtb_ordr.num_cnf - dtb_ordr.num_cnf_evasa -\n" + + " ISNULL(colliV.num_cnf, 0) -\n" + + " (ISNULL(qtaPianConf.colli_pian, 0))) AS colli_residui) calc\n" + + " WHERE dtb_ordt.gestione = 'V'\n" + + " AND dtb_ordr.data_cons >= DATEADD(DAY, -1, GETDATE())\n" + + " AND flag_evaso = 'I'\n" + + " AND flag_annulla = 'N'),\n" + + " ordiniResidui AS (SELECT 'CAMPAGNA' AS luogo_lavoro,\n" + + " NULL AS cod_jcom,\n" + + " data_cons,\n" + + " NULL AS cod_anag,\n" + + " NULL AS rag_soc,\n" + + " NULL AS cliente,\n" + + " distPF.cod_mart,\n" + + " varieta.descrizione AS descrizione,\n" + + " distPF.cod_mart + ' - ' + varieta.descrizione AS prodotto,\n" + + " -- 0 AS flag_evaso_prod,\n" + + " qtaPianiRacc.qta_pian AS qta_pian,\n" + + " ROUND(IIF(SUM(ordiniResiduiConf.kg_ord *\n" + + " distPF.perc_mp * 1.1) - ISNULL(qtaPianiRacc.qta_pian, 0) > 0,\n" + + " SUM(ordiniResiduiConf.kg_ord *\n" + + " distPF.perc_mp * 1.1) - ISNULL(qtaPianiRacc.qta_pian, 0),\n" + + " 0),\n" + + " 0) AS kg_residui,\n" + + " 0 AS colli_pian,\n" + + " 0 AS colli_residui,\n" + + " semilavorato.qta_cnf,\n" + + " semilavorato.colli_pedana,\n" + + " 0 AS pedane_pian,\n" + + " 0 AS pedane_residue,\n" + + " 'RACC' AS cod_jfas,\n" + + " 'CONF' AS luogo,\n" + + " ROUND(IIF(ROUND(SUM((ordiniResiduiConf.kg_ord *\n" + + " distPF.perc_mp * 1.1)), 0) - ISNULL(qtaPianiRacc.qta_pian, 0) > 0,\n" + + " ROUND(SUM((ordiniResiduiConf.kg_ord *\n" + + " distPF.perc_mp * 1.1)), 0) - ISNULL(qtaPianiRacc.qta_pian, 0),\n" + + " 0) / 100\n" + + " , 2) AS ore_uomo_necessarie,\n" + + " 100 AS produttivita, -- Da perfezionare nel servizio dal calcolo: ROUND(jtb_cicl.qta_prod * jtb_cicl.rap_conv_prod / (jtb_dist_clav_dir.hr_time / 3600), 0)\n" + + " 'KG' AS unt_mis,\n" + + " 'N' AS flag_sospeso,\n" + + " NULL AS cod_tcol_UL,\n" + + " varieta.json_varieta AS varieta\n" + + " FROM ordiniResiduiConf\n" + + " INNER JOIN (SELECT jtb_cicl.cod_prod,\n" + + " jtb_dist_mate.cod_mart,\n" + + " mtb_aart.descrizione,\n" + + " mtb_aart.peso_kg,\n" + + " jtb_dist_mate.qta_std / jtb_cicl.qta_prod AS perc_mp\n" + + " FROM jtb_cicl\n" + + " INNER JOIN jtb_dist_mate ON jtb_cicl.cod_prod = jtb_dist_mate.cod_prod\n" + + " INNER JOIN mtb_aart ON jtb_dist_mate.cod_mart = mtb_aart.cod_mart\n" + + " INNER JOIN mtb_grup\n" + + " ON mtb_aart.cod_mgrp = mtb_grup.cod_mgrp AND mtb_grup.tipo_mgrp = 'MP') distPF\n" + + " ON ordiniResiduiConf.cod_mart = distPF.cod_prod\n" + + " INNER JOIN jtb_cicl ON jtb_cicl.cod_prod = ordiniResiduiConf.cod_mart\n" + + " INNER JOIN jtb_dist_clav_dir\n" + + " ON jtb_dist_clav_dir.cod_prod = ordiniResiduiConf.cod_mart AND\n" + + " jtb_dist_clav_dir.cod_jfas = 'RACC'\n" + + " INNER JOIN varieta ON varieta.cod_prod = distPF.cod_prod AND\n" + + " varieta.cod_mart = distPF.cod_mart\n" + + " CROSS APPLY OPENJSON(varieta.json_varieta, N'$') WITH (\n" + + " cod_mart VARCHAR(200),\n" + + " semilavorato NVARCHAR(MAX) AS JSON\n" + + " ) AS varieta2\n" + + " OUTER APPLY OPENJSON(varieta2.semilavorato, '$[0]')\n" + + " WITH (\n" + + " qta_cnf NUMERIC(15, 5),\n" + + " colli_pedana NUMERIC(15, 5)\n" + + " ) AS semilavorato\n" + + " LEFT OUTER JOIN colliL ON colliL.data_collo = ordiniResiduiConf.data_cons AND\n" + + " colliL.cod_mart = ordiniResiduiConf.cod_mart\n" + + " LEFT OUTER JOIN qtaPianiRacc ON distPF.cod_mart = qtaPianiRacc.cod_mart AND\n" + + " ordiniResiduiConf.data_cons = qtaPianiRacc.data_piano\n" + + " WHERE flag_sospeso = 'N'\n" + + " GROUP BY ordiniResiduiConf.data_cons,\n" + + " distPF.cod_mart,\n" + + " varieta.descrizione,\n" + + " varieta.json_varieta,\n" + + " semilavorato.qta_cnf,\n" + + " semilavorato.colli_pedana,\n" + + " qtaPianiRacc.qta_pian\n" + + "\n" + + " UNION ALL\n" + + "\n" + + "-- Prende tutte le righe degli ordini di vendita con i dati della distinta di confezionamento di sede o di campagna\n" + + " SELECT luogo_lavoro,\n" + + " cod_jcom,\n" + + " data_cons,\n" + + " cod_anag,\n" + + " rag_soc,\n" + + " cliente,\n" + + " cod_mart,\n" + + " descrizione,\n" + + " prodotto,\n" + + " qta_pian,\n" + + " kg_residui,\n" + + " colli_pian,\n" + + " colli_residui,\n" + + " qta_cnf,\n" + + " colli_pedana,\n" + + " pedane_pian,\n" + + " pedane_residue,\n" + + " cod_jfas,\n" + + " luogo,\n" + + " ore_uomo_necessarie,\n" + + " produttivita,\n" + + " unt_mis,\n" + + " flag_sospeso,\n" + + " cod_tcol_UL,\n" + + " varieta\n" + + " FROM ordiniResiduiConf)\n" + + "SELECT luogo_lavoro,\n" + + " (SELECT jc.cod_jcom,\n" + + " jc.descrizione AS desc_comm,\n" + + " kg_residui AS kg_ord,\n" + + " colli_residui AS colli_ord,\n" + + " pedane_residue AS pedane_ord\n" + + " FROM ordiniResidui orJson\n" + + " INNER JOIN jtb_comt jc ON orJson.cod_jcom = jc.cod_jcom\n" + + " WHERE orJson.cod_anag = ordiniResidui.cod_anag\n" + + " AND orJson.cod_mart = ordiniResidui.cod_mart\n" + + " AND orJson.data_cons = ordiniResidui.data_cons\n" + + " AND orJson.cod_tcol_UL = ordiniResidui.cod_tcol_UL\n" + + " AND orJson.colli_pedana = ordiniResidui.colli_pedana\n" + + " FOR JSON AUTO) AS cod_jcom,\n" + + " data_cons,\n" + + " cod_anag,\n" + + " rag_soc,\n" + + " cliente,\n" + + " ordiniResidui.cod_mart,\n" + + " ordiniResidui.descrizione,\n" + + " prodotto,\n" + + " SUM(qta_pian) AS qta_pian,\n" + + " SUM(kg_residui) AS kg_ord,\n" + + " SUM(colli_pian) AS colli_pian,\n" + + " SUM(colli_residui) AS colli_ord,\n" + + " ordiniResidui.qta_cnf,\n" + + " ordiniResidui.colli_pedana,\n" + + " SUM(pedane_pian) AS pedane_pian,\n" + + " SUM(pedane_residue) AS pedane_ord,\n" + + " cod_jfas,\n" + + " luogo,\n" + + " SUM(ore_uomo_necessarie) AS ore_uomo_necessarie,\n" + + " produttivita,\n" + + " ordiniResidui.unt_mis,\n" + + " flag_sospeso,\n" + + " ordiniResidui.cod_tcol_UL,\n" + + " mt.descrizione AS desc_pedana,\n" + + " varieta,\n" + + " ma.qta_cnf AS qta_cnf_prod,\n" + + " ma.colli_pedana AS colli_pedana_prod\n" + + "FROM ordiniResidui\n" + + " INNER JOIN mtb_aart ma ON ordiniResidui.cod_mart = ma.cod_mart\n" + + " LEFT OUTER JOIN mtb_tcol mt ON ordiniResidui.cod_tcol_UL = mt.cod_tcol\n" + + "GROUP BY luogo_lavoro,\n" + + " data_cons,\n" + + " cod_anag,\n" + + " rag_soc,\n" + + " cliente,\n" + + " ordiniResidui.cod_mart,\n" + + " ordiniResidui.descrizione,\n" + + " prodotto,\n" + + " ordiniResidui.qta_cnf,\n" + + " ordiniResidui.colli_pedana,\n" + + " cod_jfas,\n" + + " luogo,\n" + + " produttivita,\n" + + " ordiniResidui.unt_mis,\n" + + " flag_sospeso,\n" + + " ordiniResidui.cod_tcol_UL,\n" + + " mt.descrizione,\n" + + " varieta,\n" + + " ma.qta_cnf,\n" + + " ma.colli_pedana"); + } + + @Override + public void down() throws Exception { + + } + +}