diff --git a/ems-core/pom.xml b/ems-core/pom.xml
index 363fdfb795..821fda2524 100644
--- a/ems-core/pom.xml
+++ b/ems-core/pom.xml
@@ -60,49 +60,6 @@
-
- cz.habarta.typescript-generator
- typescript-generator-maven-plugin
- 3.2.1263
-
-
- generate
-
- generate
-
- process-classes
-
-
-
- jackson2
- it.integry.ems_model.entity.*
-
- it.integry.ems.response.ServiceRestResponse
-
-
- it.integry.ems_model.base.EntityInterface
-
- ../ts/ems-core.module.ts
- module
- implementationFile
-
- it.integry.ems_model.entity.AtbOfft$StatoOfferta:AtbOfftStatoOfferta
- it.integry.ems_model.entity.VtbOfft$StatoOfferta:VtbOfftStatoOfferta
- it.integry.ems_model.entity.GrlAnagJrept$Tipo:GrlAnagJreptTipo
- it.integry.ems_model.entity.WtbJreptSetup$Tipo:WtbJreptSetupTipo
- it.integry.ems_model.entity.MtbColr$Causale:MtbColrCausale
- it.integry.ems_model.entity.MtbCols$Causale:MtbColsCausale
-
- true
- asClasses
- asEnum
- useLibraryDefinition
- questionMarkAndNullableType
- true
- true
- true
-
-
diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250530161424.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250530161424.java
index 76b6d88b2a..adee4714c8 100644
--- a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250530161424.java
+++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250530161424.java
@@ -10,6 +10,8 @@ public class Migration_20250530161424 extends BaseMigration implements Migration
if (isHistoryDB())
return;
+ if (isDMS()) return;
+
createOrUpdateFunction("pvm_getassortimentoClientePedane", "CREATE FUNCTION [dbo].[pvm_getassortimentoClientePedane](\n" +
" @codAnag VARCHAR(5), @codVlis VARCHAR(5), @codVdes VARCHAR(5), @dataValidita DATETIME, @viewPromo BIT,\n" +
" @pedane INT = 0\n" +
diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250603105803.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250603105803.java
new file mode 100644
index 0000000000..6de8515fb5
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250603105803.java
@@ -0,0 +1,22 @@
+package it.integry.ems.migration.model;
+
+import it.integry.ems.migration._base.BaseMigration;
+import it.integry.ems.migration._base.MigrationModelInterface;
+
+public class Migration_20250603105803 extends BaseMigration implements MigrationModelInterface {
+
+ @Override
+ public void up() throws Exception {
+ if (isHistoryDB())
+ return;
+
+ executeStatement("ALTER TABLE dtb_tipi\n" +
+ " ADD flag_set_pro bit default 0",
+ "UPDATE dtb_tipi SET flag_set_pro = 0",
+ "ALTER TABLE dtb_tipi ALTER COLUMN flag_set_pro bit NOT NULL;");
+ }
+
+ @Override
+ public void down() throws Exception {
+ }
+}
\ No newline at end of file
diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250603123528.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250603123528.java
new file mode 100644
index 0000000000..90a98d2ba5
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250603123528.java
@@ -0,0 +1,32 @@
+package it.integry.ems.migration.model;
+
+import it.integry.ems.migration._base.BaseMigration;
+import it.integry.ems.migration._base.MigrationModelInterface;
+
+public class Migration_20250603123528 extends BaseMigration implements MigrationModelInterface {
+
+ @Override
+ public void up() throws Exception {
+ if (isHistoryDB())
+ return;
+
+ executeStatement("CREATE TABLE dtb_docp (\n" +
+ "\tid BIGINT IDENTITY NOT NULL, \n" +
+ "\tcod_anag VARCHAR(5) NOT NULL,\n" +
+ "\tcod_dtip VARCHAR(5) NOT NULL,\n" +
+ "\tdata_doc DATETIME NOT NULL,\n" +
+ "\tser_doc VARCHAR(2) NOT NULL,\n" +
+ "\tnum_doc INT NOT NULL,\n" +
+ "\tnum_prot INT NOT NULL DEFAULT 0,\n" +
+ "\n" +
+ "\tUNIQUE (cod_anag, cod_dtip, data_doc, ser_doc, num_doc),\n" +
+ "\tCONSTRAINT PK_dtb_docp PRIMARY KEY (id),\n" +
+ "\tCONSTRAINT FK_dtb_docp_dtb_doct FOREIGN KEY (cod_anag, cod_dtip, data_doc, ser_doc, num_doc)\n" +
+ "\t\tREFERENCES dtb_doct (cod_anag, cod_dtip, data_doc, ser_doc, num_doc)\n" +
+ ");");
+ }
+
+ @Override
+ public void down() throws Exception {
+ }
+}
\ No newline at end of file
diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250604121422.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250604121422.java
new file mode 100644
index 0000000000..8847e0f62f
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250604121422.java
@@ -0,0 +1,19 @@
+package it.integry.ems.migration.model;
+
+import it.integry.ems.migration._base.BaseMigration;
+import it.integry.ems.migration._base.MigrationModelInterface;
+
+public class Migration_20250604121422 extends BaseMigration implements MigrationModelInterface {
+
+ @Override
+ public void up() throws Exception {
+ if (isHistoryDB())
+ return;
+
+ executeStatement("exec sp_rename 'dtb_tipi.flag_set_pro', 'flag_set_num_prot';");
+ }
+
+ @Override
+ public void down() throws Exception {
+ }
+}
\ No newline at end of file
diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250606121111.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250606121111.java
new file mode 100644
index 0000000000..69a6d94950
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250606121111.java
@@ -0,0 +1,24 @@
+package it.integry.ems.migration.model;
+
+import it.integry.ems.migration._base.BaseMigration;
+import it.integry.ems.migration._base.MigrationModelInterface;
+
+public class Migration_20250606121111 extends BaseMigration implements MigrationModelInterface {
+
+ @Override
+ public void up() throws Exception {
+ if (isHistoryDB())
+ return;
+
+
+ createSetup("GTB_ANAG", "SETUP", "COD_SDI_OBBLIGATORIO", "S",
+"Se impostato ad S il codice SDI è obbligatorio al salvataggio dell'anagrafica cliente", false, null, false, false,
+false, false, false, null, false, null);
+ }
+
+ @Override
+ public void down() throws Exception {
+
+ }
+
+}
diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250606124345.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250606124345.java
new file mode 100644
index 0000000000..d596e35daf
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20250606124345.java
@@ -0,0 +1,30 @@
+package it.integry.ems.migration.model;
+
+import it.integry.ems.migration._base.BaseMigration;
+import it.integry.ems.migration._base.IntegryCustomer;
+import it.integry.ems.migration._base.MigrationModelInterface;
+
+public class Migration_20250606124345 extends BaseMigration implements MigrationModelInterface {
+
+ @Override
+ public void up() throws Exception {
+ if (isHistoryDB())
+ return;
+
+ if (isCustomer(IntegryCustomer.Dulciar)) {
+
+ updateSetupValue("GTB_ANAG", "SETUP", "COD_SDI_OBBLIGATORIO", "N",
+ "Se impostato ad S il codice SDI è obbligatorio al salvataggio dell'anagrafica cliente", false, null, false, false, false,
+ false, false, null, false, null);
+
+ }
+
+
+ }
+
+ @Override
+ public void down() throws Exception {
+
+ }
+
+}
diff --git a/ems-core/src/main/java/it/integry/ems/model/IntegryApplicationEnum.java b/ems-core/src/main/java/it/integry/ems/model/IntegryApplicationEnum.java
index e1a71d1d3d..0ac7818b38 100644
--- a/ems-core/src/main/java/it/integry/ems/model/IntegryApplicationEnum.java
+++ b/ems-core/src/main/java/it/integry/ems/model/IntegryApplicationEnum.java
@@ -1,10 +1,12 @@
package it.integry.ems.model;
public enum IntegryApplicationEnum {
+ //Generato tramite uuid
GESTIONALE_BASE("5858a2a0-1188-4edd-8f71-d7da5bfb350d"),
PVM("845da2d9-f2f9-4f8d-ad5b-34b65a91eb6d"),
WMS("fa3a21af-606b-4129-a22b-aedc2a52c7b6"),
TASK("478f3a4c51824ad23cb50c1c60670c0f"),
+ CRM("f0484398-1f8b-42f5-ab79-5282c164e1d8"),
CONSEGNA("c012124f-4f11-471c-ae12-81bd4a97626c");
private String text;
diff --git a/ems-core/src/main/java/it/integry/ems/rules/businessLogic/DocumentBusinessLogic.java b/ems-core/src/main/java/it/integry/ems/rules/businessLogic/DocumentBusinessLogic.java
index 0e0e2bb3ff..678ee793cb 100644
--- a/ems-core/src/main/java/it/integry/ems/rules/businessLogic/DocumentBusinessLogic.java
+++ b/ems-core/src/main/java/it/integry/ems/rules/businessLogic/DocumentBusinessLogic.java
@@ -580,7 +580,7 @@ public class DocumentBusinessLogic {
throw new Exception ("Attenzione nel castelletto iva sono presenti delle righe con imponibile ma senza aliquota, è necessario correggere il castelletto iva prima di procedere con la registrazione");
}
List castelletto = dtbDoct.getCtbMovi().stream().filter(x -> x.getCodAliq() != null).collect(Collectors.toList());
- for (CtbMovi iva : castelletto) {
+ for (CtbMovi iva : dtbDoct.getCtbMovi()) {
BigDecimal impDare = BigDecimal.ZERO;
BigDecimal impAvere = BigDecimal.ZERO;
if (!iva.getCodAliq().equals(codAliqSplit)) {
diff --git a/ems-core/src/main/java/it/integry/ems/rules/completing/DocOrdCalTotaliRules.java b/ems-core/src/main/java/it/integry/ems/rules/completing/DocOrdCalTotaliRules.java
index 176f65811f..f488f04092 100644
--- a/ems-core/src/main/java/it/integry/ems/rules/completing/DocOrdCalTotaliRules.java
+++ b/ems-core/src/main/java/it/integry/ems/rules/completing/DocOrdCalTotaliRules.java
@@ -10,6 +10,7 @@ import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.config.EmsRestConstants;
import it.integry.ems_model.db.ResultSetMapper;
import it.integry.ems_model.entity.*;
+import it.integry.ems_model.entity.common.DtbBaseDocR;
import it.integry.ems_model.entity.common.DtbDocOrdR;
import it.integry.ems_model.entity.common.DtbDocOrdT;
import it.integry.ems_model.rules.util.DroolsUtil;
@@ -439,7 +440,7 @@ public class DocOrdCalTotaliRules extends QueryRules {
}
private static boolean checkQtaChange(DtbDocOrdT testata, DtbDocOrdR row) {
- if (testata instanceof DtbDoct){
+ if (testata instanceof DtbDoct) {
Integer idRiga = ((DtbDocr) row).getIdRiga();
if (idRiga != null && testata.getOriginalEntity() != null) {
DtbDocr dtbDocr = ((DtbDoct) testata.getOriginalEntity())
@@ -447,13 +448,13 @@ public class DocOrdCalTotaliRules extends QueryRules {
.stream()
.filter(x -> Objects.equals(x.getIdRiga(), idRiga)).findFirst().orElse(null);
- if ( dtbDocr != null &&
- (Objects.equals(UtilityBigDecimal.isNull(dtbDocr.getQta(), dtbDocr.getQta()), dtbDocr.getQta()) &&
- Objects.equals(UtilityBigDecimal.isNull(dtbDocr.getNumCnf(), dtbDocr.getNumCnf()), dtbDocr.getNumCnf()) &&
- Objects.equals(UtilityBigDecimal.isNull(dtbDocr.getPesoLordo(), dtbDocr.getPesoLordo()), dtbDocr.getPesoLordo()) &&
- Objects.equals(UtilityBigDecimal.isNull(dtbDocr.getPesoNetto(), dtbDocr.getPesoNetto()), dtbDocr.getPesoNetto()))) {
+ if (dtbDocr != null &&
+ (Objects.equals(UtilityBigDecimal.isNull(dtbDocr.getQta(), dtbDocr.getQta()), dtbDocr.getQta()) &&
+ Objects.equals(UtilityBigDecimal.isNull(dtbDocr.getNumCnf(), dtbDocr.getNumCnf()), dtbDocr.getNumCnf()) &&
+ Objects.equals(UtilityBigDecimal.isNull(dtbDocr.getPesoLordo(), dtbDocr.getPesoLordo()), dtbDocr.getPesoLordo()) &&
+ Objects.equals(UtilityBigDecimal.isNull(dtbDocr.getPesoNetto(), dtbDocr.getPesoNetto()), dtbDocr.getPesoNetto()))) {
return false;
- } else if ( dtbDocr == null && row.getOperation() == OperationType.SELECT_OBJECT)
+ } else if (dtbDocr == null && row.getOperation() == OperationType.SELECT_OBJECT)
return false;
}
}
@@ -634,8 +635,33 @@ public class DocOrdCalTotaliRules extends QueryRules {
if (qta.compareTo(BigDecimal.ZERO) != 0) {
boolean ventilazione = false;
- if ( row instanceof DtbDocr) ventilazione = ((DtbDocr) row).getVentilazione();
- addCastellettoIva(flagIvaInclusa?impRigaIva:importoRiga, codAliq, ventilazione, castelletto, flagIvaInclusa);
+ if (row instanceof DtbDocr) ventilazione = ((DtbDocr) row).getVentilazione();
+ BigDecimal imponibile = flagIvaInclusa ? impRigaIva : importoRiga;
+ if (!UtilityString.isNullOrEmpty(row.getCodAliq())) {
+ addCastellettoIva(imponibile, codAliq, ventilazione, castelletto, flagIvaInclusa);
+ } else if (UtilityString.isNullOrEmpty(row.getCodAliq()) && imponibile.compareTo(BigDecimal.ZERO) != 0) {
+ Integer riga = 0;
+ if (isOrdine) {
+ if (row instanceof DtbOrdr) {
+ riga = ((DtbOrdr) row).getPosRiga();
+ } else if (row instanceof WdtbOrdr) {
+ riga = ((WdtbOrdr) row).getPosRiga();
+ }
+ throw new Exception(String.format(
+ "Impossibile salvare l'ordine %s del %s n. %s, riga %s senza aliquota IVA",
+ gestione, UtilityDate.formatDate(row.getDataOrd(), CommonConstants.DATE_FORMAT_DMY), row.getNumOrd(), riga));
+ } else {
+ riga = ((DtbBaseDocR) row).getIdRiga();
+ throw new Exception(String.format(
+ "Impossibile salvare il documento %s del %s n. %s/%s, riga %s senza aliquota IVA",
+ ((DtbBaseDocR) row).getCodDtip(),
+ UtilityDate.formatDate(((DtbBaseDocR) row).getDataDoc(), CommonConstants.DATE_FORMAT_DMY),
+ ((DtbBaseDocR) row).getSerDoc(),
+ ((DtbBaseDocR) row).getNumDoc(), riga
+ ));
+ }
+
+ }
}
/**************************
@@ -649,7 +675,7 @@ public class DocOrdCalTotaliRules extends QueryRules {
if (row instanceof DtbDocr && (((DtbDocr) row).getCostoUnt() == null || ((DtbDocr) row).getCostoUnt().compareTo(BigDecimal.ZERO) == 0)) {
boolean flagValCosto = ((DtbDoct) testata).getDtbTipi().getFlagCosto().equalsIgnoreCase("S");
BigDecimal costo = BigDecimal.ZERO;
- if ("A".equals(gestione) ) {
+ if ("A".equals(gestione)) {
costo = DocumentRules.completeCostoUntDocA(conn, ((DtbDocr) row));
} else if ("L".equals(gestione)) {
costo = DocumentRules.completeCostoUntDocL(conn, ((DtbDocr) row), flagValCosto);
@@ -743,7 +769,7 @@ public class DocOrdCalTotaliRules extends QueryRules {
}
Boolean ventilazione = false;
- if ( testata instanceof DtbDoct) {
+ if (testata instanceof DtbDoct) {
String sql =
Query.format(
"SELECT CAST(COUNT(*) AS BIT)\n" +
@@ -758,7 +784,7 @@ public class DocOrdCalTotaliRules extends QueryRules {
/******************************************
ASSEGNAZIONE NUM_COLLI e PESO A DOCUMENTO
******************************************/
- if ( changeQta)
+ if (changeQta)
setNumColliPeso(testata, calcColli, datiTrasp, colli, colliFromDB);
//CALCOLO TOTALI E CASTELLETTO IVA
@@ -766,7 +792,7 @@ public class DocOrdCalTotaliRules extends QueryRules {
//Prima di calcolare l'acconto estrerre l'elenco delle bolle agganciate alla fatture differita
if (testata instanceof DtbDoct && ((DtbDoct) testata).getDtbTipi().getTipoEmissioneEnum() == TipoEmissione.DIFFERITA) {
- DocumentRules.setDatiBolla(conn, (DtbDoct) testata);
+ DocumentRules.setDatiBolla(conn, (DtbDoct) testata);
}
/*Calcola acconti*/
@@ -917,12 +943,13 @@ public class DocOrdCalTotaliRules extends QueryRules {
}
}
- castellettoIva.removeIf(x->x.getTipoIva() != null && x.getTipoIva().equalsIgnoreCase("IVA COMPOSTA"));
+ castellettoIva.removeIf(x -> x.getTipoIva() != null && x.getTipoIva().equalsIgnoreCase("IVA COMPOSTA"));
testata.setTotImponib(totImponib).setTotIva(totImposta);
}
- private static void addCastellettoIva(BigDecimal importoRiga, String codAliq, Boolean ventilazione, List castelletto, Boolean flagIvaInclusa) {
+ private static void addCastellettoIva(BigDecimal importoRiga, String codAliq, Boolean
+ ventilazione, List castelletto, Boolean flagIvaInclusa) {
java.util.Optional first =
castelletto.stream()
.filter(x -> UtilityString.equalsIgnoreCase(x.getCodAliq(), codAliq) && x.getVentilazione() == ventilazione &&
@@ -943,7 +970,8 @@ public class DocOrdCalTotaliRules extends QueryRules {
castelletto.add(ctbMovi);
}
- public static BigDecimal calcImposta(Connection conn, BigDecimal totImponib, BigDecimal percAliq, String tipoIva, Integer cifreDec)
+ public static BigDecimal calcImposta(Connection conn, BigDecimal totImponib, BigDecimal percAliq, String
+ tipoIva, Integer cifreDec)
throws Exception {
BigDecimal totImposta = BigDecimal.ZERO;
@@ -1026,7 +1054,8 @@ public class DocOrdCalTotaliRules extends QueryRules {
datiTrasp.setPesoNetto(pesoNettoKgTot);
}
- public static void setNumColliPeso(EntityBase testata, String calcColli, DatiTrasportoDTO datiTrasp, List colli, List colliFromDB) throws Exception {
+ public static void setNumColliPeso(EntityBase testata, String calcColli, DatiTrasportoDTO
+ datiTrasp, List colli, List colliFromDB) throws Exception {
String peso = null, numColli = null;
BigDecimal pesoKgTot = datiTrasp.getPesoKg();
BigDecimal colliTot = datiTrasp.getColli();
@@ -1101,7 +1130,7 @@ public class DocOrdCalTotaliRules extends QueryRules {
((DtbDoct) testata).setPesoNettoKg(pesoNettoKgTot);
}
- if (testata instanceof DtbDoct && ((DtbDoct) testata).getPostiPallet() == null) {
+ if (testata instanceof DtbDoct && ((DtbDoct) testata).getPostiPallet() == null) {
((DtbDoct) testata).setPostiPallet(datiTrasp.getPedane());
} else if (testata instanceof DtbOrdt && ((DtbOrdt) testata).getPostiPallet() == null) {
((DtbOrdt) testata).setPostiPallet(datiTrasp.getPedane());
@@ -1116,7 +1145,8 @@ public class DocOrdCalTotaliRules extends QueryRules {
return calcImportRiga(entity, entity.getValUntIva(), cifreDec);
}
- private static BigDecimal calcImportRiga(DtbDocOrdR entity, BigDecimal valUnt, Integer cifreDec) throws Exception {
+ private static BigDecimal calcImportRiga(DtbDocOrdR entity, BigDecimal valUnt, Integer cifreDec) throws
+ Exception {
BigDecimal qta = entity.getQta();
if (UtilityBigDecimal.isNullOrZero(qta))
return BigDecimal.ZERO;
@@ -1148,7 +1178,8 @@ public class DocOrdCalTotaliRules extends QueryRules {
return CommonRules.roundValue(importoRiga, cifreDec);
}
- private static List addCosti(final DtbDocr dtbDocr, List sconti, List listaCosti, String codJfasTestata) throws Exception {
+ private static List addCosti(final DtbDocr dtbDocr, List<
+ BigDecimal> sconti, List listaCosti, String codJfasTestata) throws Exception {
BigDecimal importo = dtbDocr.getImportoRiga();
for (BigDecimal sconto : sconti) {
if (sconto != null) {
@@ -1327,7 +1358,7 @@ public class DocOrdCalTotaliRules extends QueryRules {
(!UtilityString.isNullOrEmpty(testata.getCodPaga()) || !UtilityString.isNullOrEmpty(costoEsenzione) || !UtilityString.isNullOrEmpty(testata.getCodVvet()))) {
maxRigaSpesa = addAltreSpese(connection, testata, castelletto, speseCalc, maxRigaSpesa, whereCondExcSpese, cifreDec, ventilazione, flagPrzIva);
- if ( maxRigaSpesa > 0)
+ if (maxRigaSpesa > 0)
calcTotImponib(testata, connection, castelletto, cifreDec);
}
@@ -1427,8 +1458,10 @@ public class DocOrdCalTotaliRules extends QueryRules {
return maxRigaSpesa;
}
- private static Integer addImpostaBollo(Connection connection, DtbDoct testata, List castelletto, List speseCalc,
- Integer maxRigaSpesa, String whereCondExcSpese, BigDecimal totDoc, Boolean ventilazione) throws Exception {
+ private static Integer addImpostaBollo(Connection connection, DtbDoct
+ testata, List castelletto, List speseCalc,
+ Integer maxRigaSpesa, String whereCondExcSpese, BigDecimal totDoc, Boolean ventilazione) throws
+ Exception {
final String tipoCalcolo = "BOLLO";
String impMinDoc = setupGest.getSetup(connection, "EXPORT_DOCUMENTI VENDITA", "FATTURE_FPR", "DATI_BOLLO_IMP_MIN");
diff --git a/ems-core/src/main/java/it/integry/ems/rules/completing/DocOrdRules.java b/ems-core/src/main/java/it/integry/ems/rules/completing/DocOrdRules.java
index e146de7aee..33c37bb93a 100644
--- a/ems-core/src/main/java/it/integry/ems/rules/completing/DocOrdRules.java
+++ b/ems-core/src/main/java/it/integry/ems/rules/completing/DocOrdRules.java
@@ -1009,11 +1009,11 @@ public class DocOrdRules extends QueryRules {
.setCodTcolUl(dtbOrdt.getCodTcolUl())
.setCodTcolUi(dtbOrdt.getCodTcolUi())
.setNumCnf(dtbOrdt.getNumCnfProd());
- dtbOrdrProd.setOperation(OperationType.UPDATE);
+
+ dtbOrdrProd.setOperation(OperationType.INSERT_OR_UPDATE);
}
dtbOrdtProd.addDtbOrdr(dtbOrdrProd);
-
return dtbOrdtProd;
}
diff --git a/ems-core/src/main/java/it/integry/ems/rules/completing/dto/CostiDTO.java b/ems-core/src/main/java/it/integry/ems/rules/completing/dto/CostiDTO.java
deleted file mode 100644
index 47689847b3..0000000000
--- a/ems-core/src/main/java/it/integry/ems/rules/completing/dto/CostiDTO.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package it.integry.ems.rules.completing.dto;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-public class CostiDTO /*implements Comparable */ {
- private String codCcon, codJcom, codJfas, codMtip, matricola;
- private Date dataInizComp, dataFineComp;
- private BigDecimal importo;
-
- public String getCodCcon() {
- return codCcon;
- }
-
- public void setCodCcon(String codCcon) {
- this.codCcon = codCcon;
- }
-
- public String getCodJcom() {
- return codJcom;
- }
-
- public void setCodJcom(String codJcom) {
- this.codJcom = codJcom;
- }
-
- public String getCodJfas() {
- return codJfas;
- }
-
- public void setCodJfas(String codJfas) {
- this.codJfas = codJfas;
- }
-
- public String getCodMtip() {
- return codMtip;
- }
-
- public void setCodMtip(String codMtip) {
- this.codMtip = codMtip;
- }
-
- public String getMatricola() {
- return matricola;
- }
-
- public void setMatricola(String matricola) {
- this.matricola = matricola;
- }
-
- public Date getDataInizComp() {
- return dataInizComp;
- }
-
- public void setDataInizComp(Date dataInizComp) {
- this.dataInizComp = dataInizComp;
- }
-
- public Date getDataFineComp() {
- return dataFineComp;
- }
-
- public void setDataFineComp(Date dataFineComp) {
- this.dataFineComp = dataFineComp;
- }
-
- public BigDecimal getImporto() {
- return importo;
- }
-
- public void setImporto(BigDecimal importo) {
- this.importo = importo;
- }
-
-
- public boolean compare(CostiDTO object1, CostiDTO object2) {
- return object1.getCodCcon().compareTo((object2.getCodCcon())) < 0;
- }
- /*
- @Override
- public int compareTo(CostiDTO o) {
- CostiDTO k = (CostiDTO) o;
- String codCcon = k.getCodCcon();
- return this.getCodCcon().compareTo(codCcon);
-
- } */
-}
diff --git a/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/controller/CodiceFiscaleController.java b/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/controller/CodiceFiscaleController.java
new file mode 100644
index 0000000000..b8df09087f
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/controller/CodiceFiscaleController.java
@@ -0,0 +1,49 @@
+package it.integry.ems.service.codice_fiscale.controller;
+
+import it.integry.ems.response.ServiceRestResponse;
+import it.integry.ems.service.codice_fiscale.dto.GenerateCodiceFiscaleRequestDTO;
+import it.integry.ems.service.codice_fiscale.service.CodiceFiscaleService;
+import it.integry.ems.service.comuni.service.UnitaTerritorialiService;
+import it.integry.ems_model.utility.UtilityString;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@Scope("request")
+@RequestMapping("system/codice-fiscale")
+public class CodiceFiscaleController {
+
+ @Autowired
+ private CodiceFiscaleService codiceFiscaleService;
+
+ @PostMapping(value = "generate")
+ public ServiceRestResponse generate(@RequestBody GenerateCodiceFiscaleRequestDTO requestDTO) throws Exception {
+ if (requestDTO == null || requestDTO.getNome() == null || requestDTO.getCognome() == null || requestDTO.getDataNascita() == null ||
+ UtilityString.isNull(requestDTO.getCodiceCatastale(), requestDTO.getComuneNascita()) == null) {
+ throw new Exception("Invalid input data");
+ }
+
+ return ServiceRestResponse.createPositiveResponse(
+ codiceFiscaleService.generaCodiceFiscale(
+ requestDTO.getNome(),
+ requestDTO.getCognome(),
+ requestDTO.getDataNascita(),
+ requestDTO.getSesso(),
+ requestDTO.getCodiceCatastale(),
+ requestDTO.getComuneNascita()));
+ }
+
+ @PostMapping(value = "reverse")
+ public ServiceRestResponse reverse(@RequestParam String codiceFiscale) throws Exception {
+ return ServiceRestResponse.createPositiveResponse(
+ codiceFiscaleService.reverseCodiceFiscale(codiceFiscale));
+ }
+
+ @GetMapping(value = "validate")
+ public ServiceRestResponse validate(@RequestParam String codiceFiscale) throws Exception {
+ codiceFiscaleService.validate(codiceFiscale);
+ return ServiceRestResponse.createPositiveResponse();
+ }
+
+}
diff --git a/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/dto/CodiceFiscaleResultDTO.java b/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/dto/CodiceFiscaleResultDTO.java
new file mode 100644
index 0000000000..7101bd27a8
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/dto/CodiceFiscaleResultDTO.java
@@ -0,0 +1,77 @@
+package it.integry.ems.service.codice_fiscale.dto;
+
+import java.time.LocalDate;
+
+public class CodiceFiscaleResultDTO {
+
+ private String nome;
+ private String cognome;
+ private LocalDate dataNascita;
+ private String sesso;
+ private String comuneNascita;
+ private String provinciaNascita;
+ private String codiceCatastale;
+
+ public String getNome() {
+ return nome;
+ }
+
+ public CodiceFiscaleResultDTO setNome(String nome) {
+ this.nome = nome;
+ return this;
+ }
+
+ public String getCognome() {
+ return cognome;
+ }
+
+ public CodiceFiscaleResultDTO setCognome(String cognome) {
+ this.cognome = cognome;
+ return this;
+ }
+
+ public LocalDate getDataNascita() {
+ return dataNascita;
+ }
+
+ public CodiceFiscaleResultDTO setDataNascita(LocalDate dataNascita) {
+ this.dataNascita = dataNascita;
+ return this;
+ }
+
+ public String getSesso() {
+ return sesso;
+ }
+
+ public CodiceFiscaleResultDTO setSesso(String sesso) {
+ this.sesso = sesso;
+ return this;
+ }
+
+ public String getComuneNascita() {
+ return comuneNascita;
+ }
+
+ public CodiceFiscaleResultDTO setComuneNascita(String comuneNascita) {
+ this.comuneNascita = comuneNascita;
+ return this;
+ }
+
+ public String getProvinciaNascita() {
+ return provinciaNascita;
+ }
+
+ public CodiceFiscaleResultDTO setProvinciaNascita(String provinciaNascita) {
+ this.provinciaNascita = provinciaNascita;
+ return this;
+ }
+
+ public String getCodiceCatastale() {
+ return codiceCatastale;
+ }
+
+ public CodiceFiscaleResultDTO setCodiceCatastale(String codiceCatastale) {
+ this.codiceCatastale = codiceCatastale;
+ return this;
+ }
+}
diff --git a/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/dto/GenerateCodiceFiscaleRequestDTO.java b/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/dto/GenerateCodiceFiscaleRequestDTO.java
new file mode 100644
index 0000000000..05be128681
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/dto/GenerateCodiceFiscaleRequestDTO.java
@@ -0,0 +1,67 @@
+package it.integry.ems.service.codice_fiscale.dto;
+
+import java.time.LocalDate;
+
+public class GenerateCodiceFiscaleRequestDTO {
+
+ private String nome;
+ private String cognome;
+ private LocalDate dataNascita;
+ private char sesso;
+ private String comuneNascita;
+ private String codiceCatastale;
+
+ public String getNome() {
+ return nome;
+ }
+
+ public GenerateCodiceFiscaleRequestDTO setNome(String nome) {
+ this.nome = nome;
+ return this;
+ }
+
+ public String getCognome() {
+ return cognome;
+ }
+
+ public GenerateCodiceFiscaleRequestDTO setCognome(String cognome) {
+ this.cognome = cognome;
+ return this;
+ }
+
+ public LocalDate getDataNascita() {
+ return dataNascita;
+ }
+
+ public GenerateCodiceFiscaleRequestDTO setDataNascita(LocalDate dataNascita) {
+ this.dataNascita = dataNascita;
+ return this;
+ }
+
+ public char getSesso() {
+ return sesso;
+ }
+
+ public GenerateCodiceFiscaleRequestDTO setSesso(char sesso) {
+ this.sesso = sesso;
+ return this;
+ }
+
+ public String getCodiceCatastale() {
+ return codiceCatastale;
+ }
+
+ public GenerateCodiceFiscaleRequestDTO setCodiceCatastale(String codiceCatastale) {
+ this.codiceCatastale = codiceCatastale;
+ return this;
+ }
+
+ public String getComuneNascita() {
+ return comuneNascita;
+ }
+
+ public GenerateCodiceFiscaleRequestDTO setComuneNascita(String comuneNascita) {
+ this.comuneNascita = comuneNascita;
+ return this;
+ }
+}
diff --git a/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/dto/GenerateCodiceFiscaleResultDTO.java b/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/dto/GenerateCodiceFiscaleResultDTO.java
new file mode 100644
index 0000000000..761da532aa
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/dto/GenerateCodiceFiscaleResultDTO.java
@@ -0,0 +1,66 @@
+package it.integry.ems.service.codice_fiscale.dto;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+public class GenerateCodiceFiscaleResultDTO {
+
+ private final String codicePrincipale;
+ private final List codiciAlternativi;
+
+ public GenerateCodiceFiscaleResultDTO(String codicePrincipale, List codiciAlternativi) {
+ if (codicePrincipale == null || codicePrincipale.trim().isEmpty()) {
+ throw new IllegalArgumentException("Il codice fiscale principale non può essere null o vuoto");
+ }
+
+ this.codicePrincipale = codicePrincipale;
+ this.codiciAlternativi = codiciAlternativi != null ?
+ new ArrayList<>(codiciAlternativi) : new ArrayList<>();
+ }
+
+ public String getCodicePrincipale() {
+ return codicePrincipale;
+ }
+
+ public List getCodiciAlternativi() {
+ return new ArrayList<>(codiciAlternativi);
+ }
+
+ public boolean hasAlternativi() {
+ return !codiciAlternativi.isEmpty();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("=== CODICE FISCALE ===\n");
+ sb.append("Codice Fiscale Principale: ").append(codicePrincipale).append("\n");
+
+ if (!codiciAlternativi.isEmpty()) {
+ sb.append("\nCodici Alternativi per Omonimia (").append(codiciAlternativi.size()).append("):\n");
+ for (int i = 0; i < codiciAlternativi.size(); i++) {
+ sb.append(" ").append(i + 1).append(". ").append(codiciAlternativi.get(i)).append("\n");
+ }
+ } else {
+ sb.append("Nessun codice alternativo disponibile\n");
+ }
+
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null || getClass() != obj.getClass()) return false;
+
+ GenerateCodiceFiscaleResultDTO that = (GenerateCodiceFiscaleResultDTO) obj;
+ return Objects.equals(codicePrincipale, that.codicePrincipale) &&
+ Objects.equals(codiciAlternativi, that.codiciAlternativi);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(codicePrincipale, codiciAlternativi);
+ }
+}
diff --git a/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/service/CodiceFiscaleService.java b/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/service/CodiceFiscaleService.java
new file mode 100644
index 0000000000..2a53348f22
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems/service/codice_fiscale/service/CodiceFiscaleService.java
@@ -0,0 +1,624 @@
+package it.integry.ems.service.codice_fiscale.service;
+
+import it.integry.ems.service.codice_fiscale.dto.CodiceFiscaleResultDTO;
+import it.integry.ems.service.codice_fiscale.dto.GenerateCodiceFiscaleResultDTO;
+import it.integry.ems.service.comuni.entities.Comune;
+import it.integry.ems.service.comuni.service.UnitaTerritorialiService;
+import it.integry.ems_model.utility.UtilityDate;
+import it.integry.ems_model.utility.UtilityLocalDate;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+
+/**
+ * Generatore di Codice Fiscale Italiano con controlli completi di validazione
+ * Supporta la generazione del codice fiscale standard e dei codici alternativi per casi di omonimia
+ *
+ * @author gscorrano
+ * @version 1.0
+ * @since 2025-06-03
+ */
+
+@Service
+public class CodiceFiscaleService {
+
+
+ private final Logger logger = LogManager.getLogger();
+
+ @Autowired
+ private UnitaTerritorialiService unitaTerritorialiService;
+
+
+ // Costanti per la validazione
+ private static final int MIN_YEAR = 1900;
+ private static final int MAX_YEAR = 2100;
+ private static final int MIN_NAME_LENGTH = 1;
+ private static final int MAX_NAME_LENGTH = 50;
+ private static final Pattern VALID_NAME_PATTERN = Pattern.compile("^[a-zA-ZÀ-ÿ\\s'-]+$");
+ private static final Pattern CODICE_CATASTALE_PATTERN = Pattern.compile("^[A-Z][0-9]{3}$");
+
+ // Tabella dei mesi per il codice fiscale
+ private static final String[] MESI = {"A", "B", "C", "D", "E", "H", "L", "M", "P", "R", "S", "T"};
+
+ // Vocali e consonanti per l'elaborazione di nomi e cognomi
+ private static final String VOCALI = "AEIOU";
+ private static final String CONSONANTI = "BCDFGHJKLMNPQRSTVWXYZ";
+
+ // Tabella per il calcolo del carattere di controllo
+ private static final Map CARATTERI_DISPARI = new HashMap<>();
+ private static final Map CARATTERI_PARI = new HashMap<>();
+ private static final String CARATTERI_CONTROLLO = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ static {
+ inizializzaTabelleControllo();
+ }
+
+ /**
+ * Genera il codice fiscale principale con validazione completa degli input
+ *
+ * @param nome Nome della persona
+ * @param cognome Cognome della persona
+ * @param dataNascita Data di nascita
+ * @param sesso Sesso ('M' o 'F', case insensitive)
+ * @param codiceCatastale Codice catastale del comune di nascita
+ * @return Risultato contenente codice principale e alternativi
+ * @throws IllegalArgumentException se gli input non sono validi
+ * @throws NullPointerException se uno degli input obbligatori è null
+ */
+ public GenerateCodiceFiscaleResultDTO generaCodiceFiscale(String nome, String cognome,
+ LocalDate dataNascita, char sesso,
+ String codiceCatastale, String comuneNascita) {
+
+ if (codiceCatastale == null && comuneNascita != null) {
+ // Se il codice catastale non è fornito ma il comune di nascita è specificato, ottieni il codice catastale
+ codiceCatastale = unitaTerritorialiService.getComuni().stream().filter(x -> x.getNome().equalsIgnoreCase(comuneNascita))
+ .findFirst()
+ .map(x -> x.getCodiceCatastale())
+ .orElseThrow(() -> new IllegalArgumentException("Comune di nascita non trovato: " + comuneNascita));
+ }
+
+ // Validazione completa degli input
+ validaInput(nome, cognome, dataNascita, sesso, codiceCatastale);
+
+ // Normalizzazione degli input
+ String nomeNormalizzato = normalizzaNome(nome);
+ String cognomeNormalizzato = normalizzaNome(cognome);
+ char sessoNormalizzato = Character.toUpperCase(sesso);
+ String codiceCatastaleNormalizzato = codiceCatastale.toUpperCase().trim();
+
+ try {
+ String codicePrincipale = calcolaCodiceFiscale(nomeNormalizzato, cognomeNormalizzato,
+ dataNascita, sessoNormalizzato,
+ codiceCatastaleNormalizzato);
+
+ List codiciAlternativi = generaCodiciAlternativi(nomeNormalizzato, cognomeNormalizzato,
+ dataNascita, sessoNormalizzato,
+ codiceCatastaleNormalizzato);
+
+ codiciAlternativi.removeIf(x -> x.equalsIgnoreCase(codicePrincipale));
+
+ return new GenerateCodiceFiscaleResultDTO(codicePrincipale, codiciAlternativi);
+
+ } catch (Exception e) {
+ throw new RuntimeException("Errore durante la generazione del codice fiscale: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Valida tutti gli input forniti
+ */
+ private void validaInput(String nome, String cognome, LocalDate dataNascita,
+ char sesso, String codiceCatastale) {
+
+ // Controllo null
+ if (nome == null) {
+ throw new NullPointerException("Il nome non può essere null");
+ }
+ if (cognome == null) {
+ throw new NullPointerException("Il cognome non può essere null");
+ }
+ if (dataNascita == null) {
+ throw new NullPointerException("La data di nascita non può essere null");
+ }
+ if (codiceCatastale == null) {
+ throw new NullPointerException("Il codice catastale non può essere null");
+ }
+
+ // Validazione nome
+ validaNome(nome, "nome");
+ validaNome(cognome, "cognome");
+
+ // Validazione data di nascita
+ validaDataNascita(dataNascita);
+
+ // Validazione sesso
+ validaSesso(sesso);
+
+ // Validazione codice catastale
+ validaCodiceCatastale(codiceCatastale);
+ }
+
+ /**
+ * Valida un nome o cognome
+ */
+ private void validaNome(String nome, String tipo) {
+ String nomeTrimmed = nome.trim();
+
+ if (nomeTrimmed.isEmpty()) {
+ throw new IllegalArgumentException("Il " + tipo + " non può essere vuoto");
+ }
+
+ if (nomeTrimmed.length() < MIN_NAME_LENGTH) {
+ throw new IllegalArgumentException("Il " + tipo + " deve contenere almeno " + MIN_NAME_LENGTH + " carattere");
+ }
+
+ if (nomeTrimmed.length() > MAX_NAME_LENGTH) {
+ throw new IllegalArgumentException("Il " + tipo + " non può superare " + MAX_NAME_LENGTH + " caratteri");
+ }
+
+ if (!VALID_NAME_PATTERN.matcher(nomeTrimmed).matches()) {
+ throw new IllegalArgumentException("Il " + tipo + " contiene caratteri non validi. " +
+ "Sono ammessi solo lettere, spazi, apostrofi e trattini");
+ }
+
+ // Controllo che non sia composto solo da spazi, apostrofi e trattini
+ String nomePulito = nomeTrimmed.replaceAll("[\\s'-]", "");
+ if (nomePulito.isEmpty()) {
+ throw new IllegalArgumentException("Il " + tipo + " deve contenere almeno una lettera");
+ }
+
+ // Controllo sequenze eccessive di caratteri speciali
+ if (nomeTrimmed.contains("--") || nomeTrimmed.contains("''") || nomeTrimmed.contains(" ")) {
+ throw new IllegalArgumentException("Il " + tipo + " contiene sequenze non valide di caratteri speciali");
+ }
+ }
+
+ /**
+ * Valida la data di nascita
+ */
+ private void validaDataNascita(LocalDate dataNascita) {
+ LocalDate oggi = LocalDate.now();
+
+ if (dataNascita.isAfter(oggi)) {
+ throw new IllegalArgumentException("La data di nascita non può essere futura");
+ }
+
+ if (dataNascita.getYear() < MIN_YEAR) {
+ throw new IllegalArgumentException("La data di nascita non può essere precedente al " + MIN_YEAR);
+ }
+
+ if (dataNascita.getYear() > MAX_YEAR) {
+ throw new IllegalArgumentException("La data di nascita non può essere successiva al " + MAX_YEAR);
+ }
+
+ // Controllo età massima ragionevole (150 anni)
+ if (dataNascita.isBefore(oggi.minusYears(150))) {
+ throw new IllegalArgumentException("La data di nascita indica un'età superiore a 150 anni");
+ }
+ }
+
+ /**
+ * Valida il sesso
+ */
+ private void validaSesso(char sesso) {
+ char sessoUpper = Character.toUpperCase(sesso);
+ if (sessoUpper != 'M' && sessoUpper != 'F') {
+ throw new IllegalArgumentException("Il sesso deve essere 'M' (maschio) o 'F' (femmina), ricevuto: '" + sesso + "'");
+ }
+ }
+
+ /**
+ * Valida il codice catastale
+ */
+ private void validaCodiceCatastale(String codiceCatastale) {
+ String codiceTrimmed = codiceCatastale.trim().toUpperCase();
+
+ if (codiceTrimmed.isEmpty()) {
+ throw new IllegalArgumentException("Il codice catastale non può essere vuoto");
+ }
+
+ if (!CODICE_CATASTALE_PATTERN.matcher(codiceTrimmed).matches()) {
+ throw new IllegalArgumentException("Il codice catastale deve essere nel formato: 1 lettera seguita da 3 cifre (es: H501). " +
+ "Ricevuto: '" + codiceCatastale + "'");
+ }
+ }
+
+ /**
+ * Normalizza un nome rimuovendo caratteri non necessari e standardizzando il formato
+ */
+ private String normalizzaNome(String nome) {
+ if (nome == null) return "";
+
+ // Rimuove spazi multipli e trim
+ String normalizzato = nome.trim().replaceAll("\\s+", " ");
+
+ // Rimuove caratteri speciali per il calcolo del CF ma mantiene apostrofi e trattini
+ // che potrebbero essere significativi
+ return normalizzato;
+ }
+
+ /**
+ * Calcola il codice fiscale standard con gestione degli errori
+ */
+ private String calcolaCodiceFiscale(String nome, String cognome, LocalDate dataNascita,
+ char sesso, String codiceCatastale) {
+
+ try {
+ StringBuilder cf = new StringBuilder();
+
+ // 1. Cognome (3 caratteri)
+ cf.append(elaboraCognome(cognome));
+
+ // 2. Nome (3 caratteri)
+ cf.append(elaboraNome(nome));
+
+ // 3. Anno di nascita (2 caratteri)
+ cf.append(String.format("%02d", dataNascita.getYear() % 100));
+
+ // 4. Mese di nascita (1 carattere)
+ cf.append(MESI[dataNascita.getMonthValue() - 1]);
+
+ // 5. Giorno di nascita e sesso (2 caratteri)
+ int giorno = dataNascita.getDayOfMonth();
+ if (sesso == 'F') {
+ giorno += 40;
+ }
+ cf.append(String.format("%02d", giorno));
+
+ // 6. Codice catastale (4 caratteri)
+ cf.append(codiceCatastale);
+
+ // 7. Carattere di controllo
+ cf.append(calcolaCarattereControllo(cf.toString()));
+
+ return cf.toString();
+
+ } catch (Exception e) {
+ throw new RuntimeException("Errore nel calcolo del codice fiscale: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Genera codici fiscali alternativi per casi di omonimia con gestione sicura
+ */
+ private List generaCodiciAlternativi(String nome, String cognome, LocalDate dataNascita,
+ char sesso, String codiceCatastale) {
+
+ List alternativi = new ArrayList<>();
+
+ try {
+ // Variazioni sicure per il nome e cognome
+ List variazioniNome = generaVariazioniSicure(nome);
+ List variazioniCognome = generaVariazioniSicure(cognome);
+
+ // Genera codici alternativi per variazioni del nome
+ for (String variazione : variazioniNome) {
+ try {
+ String cfAlternativo = calcolaCodiceFiscale(variazione, cognome, dataNascita, sesso, codiceCatastale);
+ if (!alternativi.contains(cfAlternativo)) {
+ alternativi.add(cfAlternativo);
+ }
+ } catch (Exception e) {
+ // Ignora variazioni che causano errori
+ logger.warn("Warning: Impossibile generare codice alternativo per nome '" + variazione + "': " + e.getMessage());
+ }
+ }
+
+ // Genera codici alternativi per variazioni del cognome
+ for (String variazione : variazioniCognome) {
+ try {
+ String cfAlternativo = calcolaCodiceFiscale(nome, variazione, dataNascita, sesso, codiceCatastale);
+ if (!alternativi.contains(cfAlternativo)) {
+ alternativi.add(cfAlternativo);
+ }
+ } catch (Exception e) {
+ // Ignora variazioni che causano errori
+ logger.warn("Warning: Impossibile generare codice alternativo per cognome '" + variazione + "': " + e.getMessage());
+ }
+ }
+
+ } catch (Exception e) {
+ logger.warn("Warning: Errore nella generazione dei codici alternativi: " + e.getMessage());
+ }
+
+ return alternativi.stream().distinct().limit(10).collect(Collectors.toList()); // Limita a 10 alternativi
+ }
+
+ /**
+ * Genera variazioni sicure di un nome per evitare errori
+ */
+ private List generaVariazioniSicure(String nome) {
+ List variazioni = new ArrayList<>();
+
+ if (nome == null || nome.trim().isEmpty()) {
+ return variazioni;
+ }
+
+ String nomeNormalizzato = nome.trim().toUpperCase();
+
+ // Sostituzioni vocali comuni
+ Map sostituzioniVocali = new HashMap<>();
+ sostituzioniVocali.put('A', new Character[]{'E', 'I'});
+ sostituzioniVocali.put('E', new Character[]{'A', 'I'});
+ sostituzioniVocali.put('I', new Character[]{'E', 'O'});
+ sostituzioniVocali.put('O', new Character[]{'U', 'A'});
+ sostituzioniVocali.put('U', new Character[]{'O', 'I'});
+
+ // Genera variazioni per ogni posizione
+ for (int i = 0; i < Math.min(nomeNormalizzato.length(), 3); i++) {
+ char carattereOriginale = nomeNormalizzato.charAt(i);
+
+ if (sostituzioniVocali.containsKey(carattereOriginale)) {
+ for (Character sostituzione : sostituzioniVocali.get(carattereOriginale)) {
+ try {
+ StringBuilder variazione = new StringBuilder(nomeNormalizzato);
+ variazione.setCharAt(i, sostituzione);
+ String nuovaVariazione = variazione.toString();
+
+ // Verifica che la variazione sia valida
+ if (isVariazioneValida(nuovaVariazione) && !variazioni.contains(nuovaVariazione)) {
+ variazioni.add(nuovaVariazione);
+ }
+ } catch (Exception e) {
+ // Ignora variazioni che causano problemi
+ }
+ }
+ }
+ }
+
+ return variazioni;
+ }
+
+ /**
+ * Verifica se una variazione è valida
+ */
+ private boolean isVariazioneValida(String variazione) {
+ if (variazione == null || variazione.trim().isEmpty()) {
+ return false;
+ }
+
+ // Verifica che contenga almeno una lettera
+ String varPulita = variazione.replaceAll("[^A-Z]", "");
+ return varPulita.length() > 0;
+ }
+
+ /**
+ * Elabora il cognome secondo le regole del codice fiscale con controlli aggiuntivi
+ */
+ private String elaboraCognome(String cognome) {
+ return elaboraStringa(cognome, false);
+ }
+
+ /**
+ * Elabora il nome secondo le regole del codice fiscale con controlli aggiuntivi
+ */
+ private String elaboraNome(String nome) {
+ return elaboraStringa(nome, true);
+ }
+
+ /**
+ * Elabora una stringa (nome o cognome) secondo le regole del CF con validazione
+ */
+ private String elaboraStringa(String stringa, boolean isNome) {
+ if (stringa == null || stringa.trim().isEmpty()) {
+ return "XXX";
+ }
+
+ // Normalizza la stringa: maiuscolo, rimuove caratteri non alfabetici
+ String normalizzata = stringa.toUpperCase()
+ .replaceAll("[^A-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞŸ]", "")
+ .replaceAll("[ÀÁÂÃÄÅÆ]", "A")
+ .replaceAll("[ÇČĆ]", "C")
+ .replaceAll("[ÈÉÊË]", "E")
+ .replaceAll("[ÌÍÎÏ]", "I")
+ .replaceAll("[ÑŃ]", "N")
+ .replaceAll("[ÒÓÔÕÖØ]", "O")
+ .replaceAll("[ÙÚÛÜ]", "U")
+ .replaceAll("[ÝÞŸ]", "Y");
+
+ if (normalizzata.isEmpty()) {
+ return "XXX";
+ }
+
+ StringBuilder consonanti = new StringBuilder();
+ StringBuilder vocali = new StringBuilder();
+
+ for (char c : normalizzata.toCharArray()) {
+ if (CONSONANTI.indexOf(c) != -1) {
+ consonanti.append(c);
+ } else if (VOCALI.indexOf(c) != -1) {
+ vocali.append(c);
+ }
+ }
+
+ StringBuilder risultato = new StringBuilder();
+
+ try {
+ if (isNome && consonanti.length() >= 4) {
+ // Per il nome: se ci sono 4+ consonanti, prendi 1a, 3a, 4a
+ risultato.append(consonanti.charAt(0));
+ risultato.append(consonanti.charAt(2));
+ risultato.append(consonanti.charAt(3));
+ } else {
+ // Regola standard: prima le consonanti, poi le vocali
+ risultato.append(consonanti);
+ risultato.append(vocali);
+ }
+
+ // Completa con X se necessario
+ while (risultato.length() < 3) {
+ risultato.append('X');
+ }
+
+ return risultato.substring(0, 3);
+
+ } catch (Exception e) {
+ // In caso di errore, ritorna XXX
+ return "XXX";
+ }
+ }
+
+ /**
+ * Calcola il carattere di controllo con gestione degli errori
+ */
+ private char calcolaCarattereControllo(String cf) {
+ if (cf == null || cf.length() != 15) {
+ throw new IllegalArgumentException("Codice fiscale parziale non valido per il calcolo del controllo: " + cf);
+ }
+
+ try {
+ int somma = 0;
+
+ for (int i = 0; i < cf.length(); i++) {
+ char c = cf.charAt(i);
+
+ if (i % 2 == 0) {
+ // Posizione dispari (1, 3, 5, ...)
+ if (!CARATTERI_DISPARI.containsKey(c)) {
+ throw new IllegalArgumentException("Carattere non valido in posizione dispari: " + c);
+ }
+ somma += CARATTERI_DISPARI.get(c);
+ } else {
+ // Posizione pari (2, 4, 6, ...)
+ if (!CARATTERI_PARI.containsKey(c)) {
+ throw new IllegalArgumentException("Carattere non valido in posizione pari: " + c);
+ }
+ somma += CARATTERI_PARI.get(c);
+ }
+ }
+
+ return CARATTERI_CONTROLLO.charAt(somma % 26);
+
+ } catch (Exception e) {
+ throw new RuntimeException("Errore nel calcolo del carattere di controllo: " + e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Inizializza le tabelle per il calcolo del carattere di controllo
+ */
+ private static void inizializzaTabelleControllo() {
+ // Valori per posizioni dispari
+ String lettereDispari = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ int[] valoriDispari = {1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23};
+
+ for (int i = 0; i < lettereDispari.length(); i++) {
+ CARATTERI_DISPARI.put(lettereDispari.charAt(i), valoriDispari[i]);
+ }
+
+ // Valori per numeri in posizioni dispari
+ for (int i = 0; i <= 9; i++) {
+ CARATTERI_DISPARI.put(Character.forDigit(i, 10), valoriDispari[i]);
+ }
+
+ // Valori per posizioni pari (lettere)
+ for (int i = 0; i < 26; i++) {
+ CARATTERI_PARI.put((char) ('A' + i), i);
+ }
+
+ // Valori per numeri in posizioni pari
+ for (int i = 0; i <= 9; i++) {
+ CARATTERI_PARI.put(Character.forDigit(i, 10), i);
+ }
+ }
+
+ public CodiceFiscaleResultDTO reverseCodiceFiscale(String codiceFiscale) throws Exception {
+
+ validate(codiceFiscale);
+
+ CodiceFiscaleResultDTO codiceFiscaleResultDTO = new CodiceFiscaleResultDTO();
+
+ // Anno
+ int anno = Integer.parseInt(codiceFiscale.substring(6, 8));
+ anno += (anno >= 0 && anno <= UtilityLocalDate.getNow().getYear()) ? 2000 : 1900;
+ String meseChar = String.valueOf(codiceFiscale.charAt(8));
+ int mese = 0;
+ for (int i = 1; i <= MESI.length; i++) {
+ if (MESI[i].equalsIgnoreCase(meseChar)) {
+ mese = i;
+ break;
+ }
+ }
+
+ // Giorno e sesso
+ int giornoNum = Integer.parseInt(codiceFiscale.substring(9, 11));
+ String sesso = giornoNum > 31 ? "F" : "M";
+ int giorno = (sesso.equals("F")) ? giornoNum - 40 : giornoNum;
+
+ String codiceComune = codiceFiscale.substring(11, 15);
+
+
+ Comune comune = unitaTerritorialiService.getComuni().stream().filter(x -> x.getCodiceCatastale().equalsIgnoreCase(codiceComune))
+ .findFirst()
+ .orElse(null);
+
+ codiceFiscaleResultDTO
+ .setNome(codiceFiscale.substring(3, 6))
+ .setCognome(codiceFiscale.substring(0, 3))
+ .setDataNascita(LocalDate.of(anno, mese + 1, giorno))
+ .setSesso(sesso)
+ .setCodiceCatastale(codiceComune)
+ .setComuneNascita(comune !=null?comune.getNome():null)
+ .setProvinciaNascita(comune!=null?comune.getSigla():null);
+
+
+ return codiceFiscaleResultDTO;
+
+
+ }
+
+ public void validate(String codiceFiscale) throws Exception {
+ if (codiceFiscale == null || codiceFiscale.length() != 16)
+ throw new Exception("Codice fiscale non valido");
+
+ codiceFiscale = codiceFiscale.toUpperCase();
+
+ // Controllo caratteri ammessi
+ if (!codiceFiscale.matches("^[A-Z0-9]{16}$"))
+ throw new Exception("Codice fiscale contiene caratteri non validi");
+
+ // Controllo anno (posizioni 6-7)
+ String annoStr = codiceFiscale.substring(6, 8);
+ if (!annoStr.matches("\\d{2}"))
+ throw new Exception("Anno di nascita non valido nel codice fiscale");
+
+ // Controllo mese (posizione 8)
+ String meseLettera = codiceFiscale.substring(8, 9);
+ boolean meseValido = false;
+ for (String mese : MESI) {
+ if (mese.equals(meseLettera)) {
+ meseValido = true;
+ break;
+ }
+ }
+ if (!meseValido)
+ throw new Exception("Mese di nascita non valido nel codice fiscale");
+
+ // Controllo giorno/sesso (posizioni 9-10)
+ String giornoStr = codiceFiscale.substring(9, 11);
+ int giorno;
+ try {
+ giorno = Integer.parseInt(giornoStr);
+ } catch (NumberFormatException e) {
+ throw new Exception("Giorno di nascita non valido nel codice fiscale");
+ }
+ if (giorno < 1 || (giorno > 31 && giorno < 41) || giorno > 71)
+ throw new Exception("Giorno di nascita non valido nel codice fiscale");
+
+ // Controllo codice catastale (posizioni 11-14)
+ String codiceComune = codiceFiscale.substring(11, 15);
+ if (!codiceComune.matches("^[A-Z]\\d{3}$"))
+ throw new Exception("Codice catastale non valido nel codice fiscale");
+ }
+
+}
diff --git a/ems-core/src/main/java/it/integry/ems/service/dto/production/AvailableClassMercDTO.java b/ems-core/src/main/java/it/integry/ems/service/dto/production/AvailableClassMercDTO.java
new file mode 100644
index 0000000000..dd8308d5f9
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems/service/dto/production/AvailableClassMercDTO.java
@@ -0,0 +1,27 @@
+package it.integry.ems.service.dto.production;
+
+import java.util.List;
+
+public class AvailableClassMercDTO {
+
+ private String codMgrp;
+ private List codMsgr;
+
+ public String getCodMgrp() {
+ return codMgrp;
+ }
+
+ public AvailableClassMercDTO setCodMgrp(String codMgrp) {
+ this.codMgrp = codMgrp;
+ return this;
+ }
+
+ public List getCodMsgr() {
+ return codMsgr;
+ }
+
+ public AvailableClassMercDTO setCodMsgr(List codMsgr) {
+ this.codMsgr = codMsgr;
+ return this;
+ }
+}
diff --git a/ems-core/src/main/java/it/integry/ems/service/dto/production/OrdineLavorazioneDTO.java b/ems-core/src/main/java/it/integry/ems/service/dto/production/OrdineLavorazioneDTO.java
index d25ab5bd15..489944b37f 100644
--- a/ems-core/src/main/java/it/integry/ems/service/dto/production/OrdineLavorazioneDTO.java
+++ b/ems-core/src/main/java/it/integry/ems/service/dto/production/OrdineLavorazioneDTO.java
@@ -1076,28 +1076,4 @@ public class OrdineLavorazioneDTO {
this.availableClassMerc = availableClassMerc;
return this;
}
-
- public static class AvailableClassMercDTO {
-
- private String codMgrp;
- private List codMsgr;
-
- public String getCodMgrp() {
- return codMgrp;
- }
-
- public AvailableClassMercDTO setCodMgrp(String codMgrp) {
- this.codMgrp = codMgrp;
- return this;
- }
-
- public List getCodMsgr() {
- return codMsgr;
- }
-
- public AvailableClassMercDTO setCodMsgr(List codMsgr) {
- this.codMsgr = codMsgr;
- return this;
- }
- }
}
\ No newline at end of file
diff --git a/ems-core/src/main/java/it/integry/ems/service/production/ProductionOrderDataHandlerService.java b/ems-core/src/main/java/it/integry/ems/service/production/ProductionOrderDataHandlerService.java
index c5af418f4d..8cdd591ae4 100644
--- a/ems-core/src/main/java/it/integry/ems/service/production/ProductionOrderDataHandlerService.java
+++ b/ems-core/src/main/java/it/integry/ems/service/production/ProductionOrderDataHandlerService.java
@@ -1,6 +1,7 @@
package it.integry.ems.service.production;
import com.annimon.stream.Stream;
+import it.integry.ems.service.dto.production.AvailableClassMercDTO;
import it.integry.ems.service.dto.production.OrdineInevasoGroupMercDTO;
import it.integry.ems.service.dto.production.OrdineLavorazioneDTO;
import it.integry.ems.settings.Model.AvailableConnectionsModel;
@@ -267,7 +268,7 @@ public class ProductionOrderDataHandlerService {
for (Map.Entry> entry : groups.entrySet()) {
order.getAvailableClassMerc()
- .add(new OrdineLavorazioneDTO.AvailableClassMercDTO()
+ .add(new AvailableClassMercDTO()
.setCodMgrp(entry.getKey())
.setCodMsgr(entry.getValue().stream()
.map(OrdineInevasoGroupMercDTO::getCodMsgr)
diff --git a/ems-core/src/main/java/it/integry/ems/sync/controller/RemoteSynchronizationController.java b/ems-core/src/main/java/it/integry/ems/sync/controller/RemoteSynchronizationController.java
index 56d976aadb..14f2e49b14 100644
--- a/ems-core/src/main/java/it/integry/ems/sync/controller/RemoteSynchronizationController.java
+++ b/ems-core/src/main/java/it/integry/ems/sync/controller/RemoteSynchronizationController.java
@@ -4,9 +4,9 @@ import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.sync.service.RemoteSynchronizationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
+import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@@ -17,20 +17,20 @@ public class RemoteSynchronizationController {
@Autowired
private RemoteSynchronizationService remoteSynchronizationService;
- @RequestMapping(value = "publications/{groupId}/start", method = RequestMethod.GET)
+ @GetMapping(value = "publications/{groupId}/start")
public ServiceRestResponse startPublication(@PathVariable long groupId) throws Exception {
remoteSynchronizationService.startPublication(groupId);
return ServiceRestResponse.createPositiveResponse();
}
- @RequestMapping(value = "publications/status", method = RequestMethod.GET)
+ @GetMapping(value = "publications/status")
public ServiceRestResponse statusPublication() {
return ServiceRestResponse.createPositiveResponse(remoteSynchronizationService.getPublicationStatus());
}
- @RequestMapping(value = "subscription/{subscriptionId}/run", method = RequestMethod.GET)
+ @GetMapping(value = "subscription/{subscriptionId}/run")
public ServiceRestResponse runSubscription(@PathVariable long subscriptionId) throws Exception {
remoteSynchronizationService.runSubscription(subscriptionId);
return ServiceRestResponse.createPositiveResponse();
diff --git a/ems-core/src/main/java/it/integry/ems/user/service/UserCacheService.java b/ems-core/src/main/java/it/integry/ems/user/service/UserCacheService.java
index 876b513646..ae877a75ed 100644
--- a/ems-core/src/main/java/it/integry/ems/user/service/UserCacheService.java
+++ b/ems-core/src/main/java/it/integry/ems/user/service/UserCacheService.java
@@ -147,6 +147,7 @@ public class UserCacheService {
(application == IntegryApplicationEnum.CONSEGNA && x.isWeb()) ||
(application == IntegryApplicationEnum.WMS && x.isWeb()) ||
(application == IntegryApplicationEnum.TASK && x.isWeb()) ||
+ (application == IntegryApplicationEnum.CRM && x.isWeb()) ||
(application == IntegryApplicationEnum.GESTIONALE_BASE && x.isInternal())))
.findFirst();
@@ -173,6 +174,7 @@ public class UserCacheService {
(application == IntegryApplicationEnum.CONSEGNA && x.isWeb()) ||
(application == IntegryApplicationEnum.WMS && x.isWeb()) ||
(application == IntegryApplicationEnum.TASK && x.isWeb()) ||
+ (application == IntegryApplicationEnum.CRM && x.isWeb()) ||
(application == IntegryApplicationEnum.GESTIONALE_BASE && x.isInternal())))
.findFirst();
diff --git a/ems-core/src/main/java/it/integry/ems_model/entity/DtbDocp.java b/ems-core/src/main/java/it/integry/ems_model/entity/DtbDocp.java
new file mode 100644
index 0000000000..a9a198c941
--- /dev/null
+++ b/ems-core/src/main/java/it/integry/ems_model/entity/DtbDocp.java
@@ -0,0 +1,118 @@
+package it.integry.ems_model.entity;
+
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import it.integry.ems_model.annotation.*;
+import it.integry.ems_model.base.EntityBase;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.kie.api.definition.type.PropertyReactive;
+
+import java.util.Date;
+
+@Master()
+@PropertyReactive()
+@Table(value = DtbDocp.ENTITY)
+@JsonTypeName(value = DtbDocp.ENTITY)
+public class DtbDocp extends EntityBase {
+
+ public final static String ENTITY = "dtb_docp";
+
+ private final static Long serialVersionUID = 1L;
+
+ private final static Logger logger = LogManager.getLogger();
+
+ public DtbDocp() {
+ super(logger);
+ }
+
+ @PK()
+ @Identity()
+ @SqlField(value = "id", nullable = false)
+ private Long id;
+
+ @SqlField(value = "cod_anag", maxLength = 5, nullable = false)
+ @FK(tableName = DtbDoct.ENTITY, columnName = "cod_anag")
+ private String codAnag;
+
+ @SqlField(value = "cod_dtip", maxLength = 5, nullable = false)
+ @FK(tableName = DtbDoct.ENTITY, columnName = "cod_dtip")
+ private String codDtip;
+
+ @SqlField(value = "data_doc", nullable = false)
+ @FK(tableName = DtbDoct.ENTITY, columnName = "data_doc")
+ private Date dataDoc;
+
+ @SqlField(value = "ser_doc", maxLength = 2, nullable = false)
+ @FK(tableName = DtbDoct.ENTITY, columnName = "ser_doc")
+ private String serDoc;
+
+ @SqlField(value = "num_doc", nullable = false)
+ @FK(tableName = DtbDoct.ENTITY, columnName = "num_doc")
+ private Integer numDoc;
+
+ @SqlField(value = "num_prot", nullable = false)
+ private Integer numProt;
+
+ public Long getId() {
+ return id;
+ }
+
+ public DtbDocp setId(Long id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getCodAnag() {
+ return codAnag;
+ }
+
+ public DtbDocp setCodAnag(String codAnag) {
+ this.codAnag = codAnag;
+ return this;
+ }
+
+ public String getCodDtip() {
+ return codDtip;
+ }
+
+ public DtbDocp setCodDtip(String codDtip) {
+ this.codDtip = codDtip;
+ return this;
+ }
+
+ public Date getDataDoc() {
+ return dataDoc;
+ }
+
+ public DtbDocp setDataDoc(Date dataDoc) {
+ this.dataDoc = dataDoc;
+ return this;
+ }
+
+ public String getSerDoc() {
+ return serDoc;
+ }
+
+ public DtbDocp setSerDoc(String serDoc) {
+ this.serDoc = serDoc;
+ return this;
+ }
+
+ public Integer getNumDoc() {
+ return numDoc;
+ }
+
+ public DtbDocp setNumDoc(Integer numDoc) {
+ this.numDoc = numDoc;
+ return this;
+ }
+
+ public Integer getNumProt() {
+ return numProt;
+ }
+
+ public DtbDocp setNumProt(Integer numProt) {
+ this.numProt = numProt;
+ return this;
+ }
+}
diff --git a/ems-core/src/main/java/it/integry/ems_model/entity/DtbTipi.java b/ems-core/src/main/java/it/integry/ems_model/entity/DtbTipi.java
index cb02878ade..c00d0d3e8f 100644
--- a/ems-core/src/main/java/it/integry/ems_model/entity/DtbTipi.java
+++ b/ems-core/src/main/java/it/integry/ems_model/entity/DtbTipi.java
@@ -213,6 +213,9 @@ public class DtbTipi extends EntityBase {
@SqlField(value = "cod_ccau_coan", maxLength = 5)
private String codCcauCoan;
+ @SqlField(value = "flag_set_num_prot", nullable = false, defaultObjectValue = "0")
+ private Boolean flagSetNumProt;
+
@EntityChild
private List dtbTipiAnag = new ArrayList<>();
@@ -834,6 +837,15 @@ public class DtbTipi extends EntityBase {
return this;
}
+ public Boolean getFlagSetNumProt() {
+ return flagSetNumProt;
+ }
+
+ public DtbTipi setFlagSetNumProt(Boolean flagSetNumProt) {
+ this.flagSetNumProt = flagSetNumProt;
+ return this;
+ }
+
@Override
protected void deleteChilds() throws Exception {
DtbTipiAnag dtbTipiAnag = new DtbTipiAnag();
diff --git a/ems-core/src/main/java/it/integry/ems_model/utility/UtilityExcel.java b/ems-core/src/main/java/it/integry/ems_model/utility/UtilityExcel.java
index a2bfe9baa0..06bc4e4021 100644
--- a/ems-core/src/main/java/it/integry/ems_model/utility/UtilityExcel.java
+++ b/ems-core/src/main/java/it/integry/ems_model/utility/UtilityExcel.java
@@ -1,6 +1,8 @@
package it.integry.ems_model.utility;
import it.integry.ems.Import.dto.ImportRequestDTO;
+import it.integry.ems_model.entity.PtbDest;
+import it.integry.ems_model.entity.VtbDest;
import org.apache.commons.codec.binary.Base64;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.*;
@@ -10,6 +12,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.nio.file.Files;
import java.sql.Timestamp;
+import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
@@ -74,61 +77,99 @@ public class UtilityExcel {
}
/**
- * Reads an XLSX file from the provided ImportRequestDTO and returns an iterator over the rows.
+ * Reads an XLSX file and returns an iterator over the rows or sheets.
*
- * @param requestDTO the import request containing the base64 encoded content of the XLSX file
- * @return an iterator over the rows of the first sheet in the XLSX file
- * @throws Exception if an error occurs while reading the file or if the file is empty
+ * @param requestDTO the import request containing file information
+ * @param clazz the class type to return (Row or Sheet)
+ * @return an iterator over the specified class type ignoring the header row
+ * @throws Exception if there is an error reading the file
*/
- public static Iterator readXlsxFile(ImportRequestDTO requestDTO) throws Exception {
- return readXlsxFile(requestDTO, true);
+ public static Iterator readXlsxFile(ImportRequestDTO requestDTO, Class clazz) throws Exception {
+ return readXlsxFile(requestDTO, true, clazz);
}
/**
- * Reads an XLSX file from the provided ImportRequestDTO and returns an iterator over the rows.
+ * Reads an XLSX file and returns an iterator over the rows or sheets.
*
- * @param requestDTO the import request containing the base64 encoded content of the XLSX file
- * @param ignoreHeader whether to ignore the first row (header) of the sheet
- * @return an iterator over the rows of the first sheet in the XLSX file
- * @throws Exception if an error occurs while reading the file or if the file is empty
+ * @param requestDTO the import request containing file information
+ * @param ignoreHeader whether to ignore the header row
+ * @param clazz the class type to return (Row or Sheet)
+ * @return an iterator over the specified class type
+ * @throws Exception if there is an error reading the file
*/
- public static Iterator readXlsxFile(ImportRequestDTO requestDTO, boolean ignoreHeader) throws Exception {
+ public static Iterator readXlsxFile(ImportRequestDTO requestDTO, boolean ignoreHeader, Class clazz) throws Exception {
InputStream stream;
if (requestDTO.getRawContentB64() != null)
stream = new ByteArrayInputStream(Base64.decodeBase64(requestDTO.getRawContentB64()));
else if (requestDTO.getPathFile() != null && requestDTO.getFileName() != null) {
File file = new File(requestDTO.getPathFile());
- if ( file.isDirectory()) {
+ if (file.isDirectory()) {
file = new File(requestDTO.getPathFile() + "/" + requestDTO.getFileName());
}
stream = Files.newInputStream(file.toPath());
} else
throw new Exception("Errore nella lettura del file");
- return readXlsxFile(stream, ignoreHeader);
+ return readXlsxFile(stream, ignoreHeader, clazz);
}
- public static Iterator readXlsxFile(InputStream stream, boolean ignoreHeader) throws Exception {
+ /**
+ * Reads an XLSX file from an InputStream and returns an iterator over the rows or sheets.
+ *
+ * @param stream the InputStream of the XLSX file
+ * @param ignoreHeader whether to ignore the header row
+ * @param clazz the class type to return (Row or Sheet)
+ * @return an iterator over the specified class type
+ * @throws Exception if there is an error reading the file
+ */
+ public static Iterator readXlsxFile(InputStream stream, boolean ignoreHeader, Class clazz) throws Exception {
+ if (clazz.equals(Row.class)) {
+ @SuppressWarnings("unchecked")
+ Iterator rowIterator = (Iterator) readXlsxFileReturnRow(stream, ignoreHeader);
+ return rowIterator;
+ } else if (clazz.equals(Sheet.class)) {
+ @SuppressWarnings("unchecked")
+ Iterator rowIterator = (Iterator) readXlsxReturnSheet(stream);
+ return rowIterator;
+ }
+ throw new Exception("Tipo di classe non supportato: " + clazz.getName());
+ }
+
+ private static Iterator readXlsxReturnSheet(InputStream stream) throws Exception {
OPCPackage pkg = OPCPackage.open(stream);
Workbook workbook = new XSSFWorkbook(pkg);
- Sheet sheet = workbook.getSheetAt(0);
+ Iterator sheetIterator = workbook.sheetIterator();
pkg.close();
+ return sheetIterator;
+ }
+
+ private static Iterator readXlsxFileReturnRow(InputStream stream, boolean ignoreHeader) throws Exception {
+ Iterator sheetIterator = readXlsxReturnSheet(stream);
+ return getRowIterator(sheetIterator.next(), ignoreHeader);
+ }
+
+ /**
+ * Returns an iterator over the rows of a given sheet, optionally ignoring the header row.
+ *
+ * @param sheet the sheet to iterate over
+ * @param ignoreHeader whether to ignore the first row (header)
+ * @return an iterator over the rows of the sheet
+ * @throws Exception if the sheet is empty or there is an error processing it
+ */
+ public static Iterator getRowIterator(Sheet sheet, boolean ignoreHeader) throws Exception {
Iterator rowIterator = sheet.iterator();
// Ignora la prima riga (header)
- if (ignoreHeader) {
- if (rowIterator.hasNext()) {
+ if (ignoreHeader)
+ if (rowIterator.hasNext())
rowIterator.next();
- }
- }
// Verifica se il foglio di lavoro è vuoto
- if (!rowIterator.hasNext()) {
+ if (!rowIterator.hasNext())
throw new Exception("Il file è vuoto.");
- }
return rowIterator;
}
diff --git a/ems-core/src/main/java/it/integry/firebase/dto/MessageDTO.java b/ems-core/src/main/java/it/integry/firebase/dto/MessageDTO.java
index fdd53aec13..4b02bfd5a2 100644
--- a/ems-core/src/main/java/it/integry/firebase/dto/MessageDTO.java
+++ b/ems-core/src/main/java/it/integry/firebase/dto/MessageDTO.java
@@ -2,6 +2,7 @@ package it.integry.firebase.dto;
import com.google.firebase.messaging.FcmOptions;
import com.google.firebase.messaging.Message;
+import it.integry.ems_model.entity.WtbUserDeviceToken;
import it.integry.firebase.dto.android.AndroidConfigDTO;
import it.integry.firebase.dto.apns.ApnsConfigDTO;
import it.integry.firebase.dto.webpush.WebpushConfigDTO;
@@ -19,6 +20,7 @@ public class MessageDTO {
private String condition;
private String analyticsLabel;
private String userName;
+ private WtbUserDeviceToken.AppName appName;
public Message.Builder toBuilder() {
Message.Builder builder = Message.builder();
@@ -151,4 +153,13 @@ public class MessageDTO {
this.userName = userName;
return this;
}
+
+ public WtbUserDeviceToken.AppName getAppName() {
+ return appName;
+ }
+
+ public MessageDTO setAppName(WtbUserDeviceToken.AppName appName) {
+ this.appName = appName;
+ return this;
+ }
}
diff --git a/ems-core/src/main/java/it/integry/firebase/service/DeviceTokenService.java b/ems-core/src/main/java/it/integry/firebase/service/DeviceTokenService.java
index 41cfce0e1e..f445857e08 100644
--- a/ems-core/src/main/java/it/integry/firebase/service/DeviceTokenService.java
+++ b/ems-core/src/main/java/it/integry/firebase/service/DeviceTokenService.java
@@ -7,6 +7,7 @@ import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.entity.WtbDeviceTokenTopic;
import it.integry.ems_model.entity.WtbUserDeviceToken;
import it.integry.ems_model.types.OperationType;
+import it.integry.ems_model.utility.Query;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityHashMap;
import it.integry.firebase.enums.SubscribeOperation;
@@ -124,29 +125,21 @@ public class DeviceTokenService {
}
public List getUserDevices(String userName) throws Exception {
- String sql = "SELECT * from wtb_user_device_tokens where user_name = " + UtilityDB.valueToString(userName);
+ return getUserDevices(userName, null);
+ }
- Connection connection = multiDBTransactionManager.getPrimaryConnection();
- PreparedStatement ps = connection.prepareStatement(sql);
- ResultSet rs = ps.executeQuery();
- List devices = new ArrayList<>();
+ public List getUserDevices(String userName, WtbUserDeviceToken.AppName appName) throws Exception {
+ Integer appnameValue = appName == null ? null : appName.getValue();
- while (rs.next()) {
- WtbUserDeviceToken device = new WtbUserDeviceToken();
+ String sql = Query.format(
+ "SELECT *\n" +
+ "FROM wtb_user_device_tokens\n" +
+ "WHERE user_name = %s\n" +
+ " AND (%s IS NULL OR app_name = %s)",
+ userName, appnameValue, appnameValue
+ );
- device.setDeviceToken(rs.getString("device_token"));
- device.setAppName(WtbUserDeviceToken.AppName.from(rs.getInt("app_name")));
- device.setId(rs.getLong("id"));
- device.setPlatform(rs.getString("platform"));
- device.setUserName(rs.getString("user_name"));
-
- devices.add(device);
- }
-
- rs.close();
- ps.close();
-
- return devices;
+ return UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, WtbUserDeviceToken.class);
}
public List getUserAssociatedTopics(String userName) throws Exception {
diff --git a/ems-core/src/main/java/it/integry/firebase/service/NotificationService.java b/ems-core/src/main/java/it/integry/firebase/service/NotificationService.java
index 05abc15ae4..6736ddf3b9 100644
--- a/ems-core/src/main/java/it/integry/firebase/service/NotificationService.java
+++ b/ems-core/src/main/java/it/integry/firebase/service/NotificationService.java
@@ -547,7 +547,7 @@ public class NotificationService {
throw new Exception("Username nullo in sendNotificationToUserDevices.");
}
- for (WtbUserDeviceToken device : deviceTokenService.getUserDevices(messageDTO.getUserName())) {
+ for (WtbUserDeviceToken device : deviceTokenService.getUserDevices(messageDTO.getUserName(), messageDTO.getAppName())) {
try {
Message message = messageDTO.toBuilder()
.setToken(device.getDeviceToken())
diff --git a/ems-engine/pom.xml b/ems-engine/pom.xml
index f968681722..5cbeeae114 100644
--- a/ems-engine/pom.xml
+++ b/ems-engine/pom.xml
@@ -19,6 +19,7 @@
+ ${ems.war.name}-api
org.apache.maven.plugins
@@ -35,14 +36,13 @@
maven-war-plugin
3.4.0
- ${ems.war.name}-api
false
cz.habarta.typescript-generator
typescript-generator-maven-plugin
- 3.2.1263
+ 2.37.1128
generate
@@ -54,22 +54,61 @@
jackson2
+
+ it.integry.ems.response.ServiceRestResponse
+
- it.integry.ems.product.dto.*
- it.integry.ems.production.dto.*
- it.integry.ems.retail.wms.generic.dto.articolo.*
- it.integry.ems.logistic.conSegna.dto.*
+ it.integry.**.dto.*
+ it.integry.**DTO**
+ it.integry.ems_model.entity.*
+
+ it.integry.ems_model.entity.AtbOfft$StatoOfferta:AtbOfftStatoOfferta
+ it.integry.ems_model.entity.VtbOfft$StatoOfferta:VtbOfftStatoOfferta
+ it.integry.ems_model.entity.GrlAnagJrept$Tipo:GrlAnagJreptTipo
+ it.integry.ems_model.entity.WtbJreptSetup$Tipo:WtbJreptSetupTipo
+ it.integry.ems_model.entity.MtbColr$Causale:MtbColrCausale
+ it.integry.ems_model.entity.MtbCols$Causale:MtbColsCausale
+ it.integry.ems.response.MessageDTO:ResponseMessageDTO
+ it.integry.ems.Import.dto.AnomalieDTO$Type:AnomalieDTOType
+ it.integry.ems.customizations.production.dto.CaricoLavorazioneDTO:ProdCaricoLavorazioneDTO
+ it.integry.ems.document.dto.FilterDTO:DocFilterDTO
+ it.integry.ems.document.farm_mes.dto.ImportLog:FarmMesImportLog
+ it.integry.ems.order.puddy.dto.ImportLog:PuddyImportLog
+ it.integry.ems.dto.EntityHierarchy$Field:EntityHierarchyField
+ it.integry.ems.logistic.dto.ClienteDTO:LogisticClienteDTO
+ it.integry.ems.order.conquist.dto.ClienteDTO:ConquistClienteDTO
+ it.integry.ems.order.conquist.dto.OrdineDTO:ConquistOrdineDTO
+ it.integry.ems.order.Import.dto.DialogoJsonDTO$AnagraficaDTO:DialogoJsonDTOAnagraficaDTO
+ it.integry.ems.ordikids.dto.AnagraficaDTO:OrdikidsAnagraficaDTO
+ it.integry.ems.ordikids.dto.ArticoliDTO:OrdikidsArticoliDTO
+ it.integry.ems.retail.wms.ordini_acquisto.dto.OrdiniAcquistoGrigliaDTO$ArticoliDTO:OrdiniAcquistoGrigliaDTOArticoliDTO
+ it.integry.ems.retail.wms.ordini_acquisto.dto.OrdiniAcquistoGrigliaDTO$ListiniDTO:OrdiniAcquistiGrigliaDTOListiniDTO
+ it.integry.ems.production.dto.AttachmentDTO:ProdAttachmentDTO
+ it.integry.ems.retail.pvmRetail.dto.AccettazioneDTO$Ordine:AccettazioneDTOOrdine
+ it.integry.ems.retail.wms.lavorazione.dto.RecuperaMaterialiRequestDTO$Ordine:RecuperaMaterialiRequestDTOOrdine
+ it.integry.ems.order.Import.dto.DialogoJsonDTO$IndirizzoDTO:DialogoJsonDTOIndirizzoDTO
+ it.integry.ems.sync.MultiDBTransaction.Connection:MultiDBTransactionConnection
+ it.integry.WooCommerce.dto.local.ArticoloDTO:WooCommerceArticoloDTO
+ it.integry.ems.logistic.dto.ArticoloDTO:LogisticArticoloDTO
+ it.integry.ems.document.export.dto.DocumentiDialogoDTO$Export:DocumentiDialogoDTOExport
+ it.integry.ems.order.Import.dto.OrdiniDialogoDTO$Export:OrdiniDialogoDTOExport
+ it.integry.ems.document.export.dto.DocumentiDialogoDTO$Import:DocumentiDialogoDTOImport
+ it.integry.ems.order.Import.dto.OrdiniDialogoDTO$Import:OrdiniDialogoDTOImport
+ it.integry.ems.logistic.dto.ColloDTO:LogisticColloDTO
+ it.integry.ems.response.AttachmentDTO:ResponseAttachmentDTO
+ it.integry.ems.system.imports.dto.OrdineDTO:ImportsOrdineDTO
+
it.integry.ems_model.base.EntityInterface
+
+ it.integry.ems.contabil.**
+ it.integry.ems.order.amazon.**
+
../ts/ems-engine.module.ts
module
implementationFile
-
- it.integry.ems_model.entity.MtbColr$Causale:MtbColrCausale
- it.integry.ems_model.entity.MtbCols$Causale:MtbColsCausale
-
true
asClasses
asEnum
diff --git a/ems-engine/src/main/java/it/integry/ems/activity/controller/ActivityController.java b/ems-engine/src/main/java/it/integry/ems/activity/controller/ActivityController.java
index 4752bacc44..01351a1492 100644
--- a/ems-engine/src/main/java/it/integry/ems/activity/controller/ActivityController.java
+++ b/ems-engine/src/main/java/it/integry/ems/activity/controller/ActivityController.java
@@ -70,7 +70,7 @@ public class ActivityController {
@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestParam(required = false) String userCreator,
@RequestBody List body) throws Exception {
- activityService.planActivities(userCreator, body);
+ activityService.planActivities(body);
return ServiceRestResponse.createPositiveResponse();
}
@@ -220,9 +220,10 @@ public class ActivityController {
@RequestMapping(value = EmsRestConstants.PATH_ACTIVITY_COMMESSE, method = RequestMethod.GET)
public ServiceRestResponse getCommesse(HttpServletRequest request,
@RequestParam(CommonConstants.PROFILE_DB) String config,
- @RequestParam(required = false) String username) throws Exception {
+ @RequestParam(required = false) String username,
+ @RequestParam(required = false) boolean commesseOrfane) throws Exception {
- return ServiceRestResponse.createPositiveResponse(activityService.getCommesse(username));
+ return ServiceRestResponse.createPositiveResponse(activityService.getCommesse(username, commesseOrfane));
}
@PreAuthorize("isAuthenticated()")
diff --git a/ems-engine/src/main/java/it/integry/ems/activity/dto/PersoneRifDTO.java b/ems-engine/src/main/java/it/integry/ems/activity/dto/PersoneRifDTO.java
index 243d9901eb..f57d2be08d 100644
--- a/ems-engine/src/main/java/it/integry/ems/activity/dto/PersoneRifDTO.java
+++ b/ems-engine/src/main/java/it/integry/ems/activity/dto/PersoneRifDTO.java
@@ -6,15 +6,22 @@ public class PersoneRifDTO {
@SqlField("persona_rif")
private String personaRif;
+
@SqlField("cod_jcom")
private String codJcom;
+
@SqlField("persona_cod_jcom")
private String personaCodJcom;
+
@SqlField("e_mail")
private String eMail;
+
@SqlField("cod_anag")
private String codAnag;
+ @SqlField("tipo_indirizzo")
+ private String tipoIndirizzo;
+
public String getPersonaRif() {
return personaRif;
}
@@ -59,4 +66,13 @@ public class PersoneRifDTO {
this.codAnag = codAnag;
return this;
}
+
+ public String getTipoIndirizzo() {
+ return tipoIndirizzo;
+ }
+
+ public PersoneRifDTO setTipoIndirizzo(String tipoIndirizzo) {
+ this.tipoIndirizzo = tipoIndirizzo;
+ return this;
+ }
}
diff --git a/ems-engine/src/main/java/it/integry/ems/activity/service/ActivityService.java b/ems-engine/src/main/java/it/integry/ems/activity/service/ActivityService.java
index 0bd3bfa8f6..4723e7b246 100644
--- a/ems-engine/src/main/java/it/integry/ems/activity/service/ActivityService.java
+++ b/ems-engine/src/main/java/it/integry/ems/activity/service/ActivityService.java
@@ -9,8 +9,10 @@ import it.integry.ems.media.MediaVideoService;
import it.integry.ems.media.MimeTypesHandler;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.settings.SettingsController;
+import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.user.UtilityUser;
+import it.integry.ems.user.service.UserService;
import it.integry.ems.utility.UtilityEntity;
import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.config.EmsRestConstants;
@@ -19,6 +21,14 @@ import it.integry.ems_model.entity.*;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.*;
+import it.integry.firebase.dto.MessageDTO;
+import it.integry.firebase.dto.NotificationDTO;
+import it.integry.firebase.dto.android.AndroidConfigDTO;
+import it.integry.firebase.dto.android.AndroidNotificationDTO;
+import it.integry.firebase.dto.apns.ApnsConfigDTO;
+import it.integry.firebase.dto.apns.ApsDTO;
+import it.integry.firebase.dto.webpush.WebpushConfigDTO;
+import it.integry.firebase.service.NotificationService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
@@ -64,6 +74,9 @@ public class ActivityService {
@Autowired
private SetupGest gestSetup;
+ @Autowired
+ private NotificationService notificationService;
+
public StbActivity uploadAttachment(String activityId, MultipartFile... files) throws Exception {
List stbActivityFiles = new ArrayList<>();
@@ -555,178 +568,215 @@ public class ActivityService {
}
- public void planActivities(String userCreator, List planActivityDTOList) throws Exception {
-
+ public void planActivities(List planActivityDTOList) throws Exception {
+ Connection conn = multiDBTransactionManager.getPrimaryConnection();
List entityList = new ArrayList<>();
- for (PlanActivityDTO planActivityDTO : planActivityDTOList) {
+ try {
+ for (PlanActivityDTO planActivityDTO : planActivityDTOList) {
- StbActivity parentStbActivity = new StbActivity();
- parentStbActivity.setOperation(OperationType.SELECT_OBJECT);
- parentStbActivity.setActivityId(planActivityDTO.getActivityId());
+ StbActivity parentStbActivity = new StbActivity();
+ parentStbActivity.setOperation(OperationType.SELECT_OBJECT);
+ parentStbActivity.setActivityId(planActivityDTO.getActivityId());
- entityProcessor.processEntity(parentStbActivity, multiDBTransactionManager);
+ entityProcessor.processEntity(parentStbActivity, multiDBTransactionManager);
- if (parentStbActivity == null) {
- throw new Exception("Nessun obiettivo o ticket trovato con l'ID: " + planActivityDTO.getActivityId());
- }
+ if (parentStbActivity == null) {
+ throw new Exception("Nessun obiettivo o ticket trovato con l'ID: " + planActivityDTO.getActivityId());
+ }
- Date startDateParent = UtilityDate.getWeekStartDate(planActivityDTO.getAgenda().get(0).getData());
- Date endDateParent = UtilityDate.getWeekEndDate(planActivityDTO.getAgenda().get(planActivityDTO.getAgenda().size() - 1).getData());
+ Date startDateParent = UtilityDate.getWeekStartDate(planActivityDTO.getAgenda().get(0).getData());
+ Date endDateParent = UtilityDate.getWeekEndDate(planActivityDTO.getAgenda().get(planActivityDTO.getAgenda().size() - 1).getData());
- if (parentStbActivity.getEstimatedDate() == null ||
- (parentStbActivity.getEstimatedDate() != null && parentStbActivity.getEstimatedDate().after(startDateParent))) {
- parentStbActivity.setEstimatedDate(startDateParent);
- }
+ if (parentStbActivity.getEstimatedDate() == null ||
+ (parentStbActivity.getEstimatedDate() != null && parentStbActivity.getEstimatedDate().after(startDateParent))) {
+ parentStbActivity.setEstimatedDate(startDateParent);
+ }
- if (parentStbActivity.getEstimatedEnddate() == null ||
- (parentStbActivity.getEstimatedEnddate() != null && parentStbActivity.getEstimatedEnddate().before(endDateParent))) {
- parentStbActivity.setEstimatedEnddate(endDateParent);
- }
+ if (parentStbActivity.getEstimatedEnddate() == null ||
+ (parentStbActivity.getEstimatedEnddate() != null && parentStbActivity.getEstimatedEnddate().before(endDateParent))) {
+ parentStbActivity.setEstimatedEnddate(endDateParent);
+ }
- String sql = "SELECT user_name FROM stb_activity WHERE activity_id = " + UtilityDB.valueToString(parentStbActivity.getActivityId());
- String userNameP = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql);
+ String sql = "SELECT user_name FROM stb_activity WHERE activity_id = " + UtilityDB.valueToString(parentStbActivity.getActivityId());
+ String userNameP = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
- if ((userNameP.equalsIgnoreCase("DEV") ||
- userNameP.equalsIgnoreCase("T0001") ||
- userNameP.equalsIgnoreCase("T0003"))) {
- parentStbActivity.setUserName(planActivityDTO.getUsers().get(0).getUsername());
- }
+ if ((userNameP.equalsIgnoreCase("DEV") ||
+ userNameP.equalsIgnoreCase("T0001") ||
+ userNameP.equalsIgnoreCase("T0003"))) {
+ parentStbActivity.setUserName(planActivityDTO.getUsers().get(0).getUsername());
+ }
- parentStbActivity.setOperation(OperationType.UPDATE);
- entityList.add(parentStbActivity);
+ parentStbActivity.setOperation(OperationType.UPDATE);
+ entityList.add(parentStbActivity);
- //Date startDate = UtilityDate.getWeekStartDate(planActivityDTO.getData());
+ if ("S".equalsIgnoreCase(planActivityDTO.getCreaAttivita())) {
+ boolean modifyUser = !planActivityDTO.getUsers().isEmpty();
+ if (modifyUser) parentStbActivity.setUserName(planActivityDTO.getUsers().get(0).getUsername());
+ for (PlanActivityDTO.User user : planActivityDTO.getUsers()) {
+ for (PlanActivityDTO.Agenda agenda : planActivityDTO.getAgenda()) {
+ Date startDate = agenda.getData();
- if ("S".equalsIgnoreCase(planActivityDTO.getCreaAttivita())) {
- boolean modifyUser = !planActivityDTO.getUsers().isEmpty();
- if (modifyUser) parentStbActivity.setUserName(planActivityDTO.getUsers().get(0).getUsername());
- for (PlanActivityDTO.User user : planActivityDTO.getUsers()) {
- for (PlanActivityDTO.Agenda agenda : planActivityDTO.getAgenda()) {
- Date startDate = agenda.getData();
+ SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+ Date startHour = null;
+ Date endHour = null;
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
- Date startHour = null;
- Date endHour = null;
+ if (agenda.getOraInizio() != null) {
+ startHour = sdf.parse(agenda.getOraInizio());
+ }
+ if (agenda.getOraFine() != null) {
+ endHour = sdf.parse(agenda.getOraFine());
+ }
- if (agenda.getOraInizio() != null) {
- startHour = sdf.parse(agenda.getOraInizio());
- }
- if (agenda.getOraFine() != null) {
- endHour = sdf.parse(agenda.getOraFine());
- }
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(startDate);
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(startDate);
-
- if (startHour != null) {
- Calendar cStartHour = Calendar.getInstance();
- cStartHour.setTime(startHour);
- calendar.set(Calendar.HOUR_OF_DAY, cStartHour.get(Calendar.HOUR_OF_DAY));
- calendar.set(Calendar.MINUTE, cStartHour.get(Calendar.MINUTE));
- } else if (calendar.get(Calendar.HOUR) == 0) {
- calendar.set(Calendar.HOUR_OF_DAY, 9);
- }
- startDate = calendar.getTime();
+ if (startHour != null) {
+ Calendar cStartHour = Calendar.getInstance();
+ cStartHour.setTime(startHour);
+ calendar.set(Calendar.HOUR_OF_DAY, cStartHour.get(Calendar.HOUR_OF_DAY));
+ calendar.set(Calendar.MINUTE, cStartHour.get(Calendar.MINUTE));
+ } else if (calendar.get(Calendar.HOUR) == 0) {
+ calendar.set(Calendar.HOUR_OF_DAY, 9);
+ }
+ startDate = calendar.getTime();
- if (parentStbActivity.getEffectiveDate() == null) {
- parentStbActivity.setEffectiveTime(startHour);
- }
+ if (parentStbActivity.getEffectiveDate() == null) {
+ parentStbActivity.setEffectiveTime(startHour);
+ }
- if (endHour != null) {
- Calendar cEndHour = Calendar.getInstance();
- cEndHour.setTime(endHour);
- calendar.set(Calendar.HOUR_OF_DAY, cEndHour.get(Calendar.HOUR_OF_DAY));
- calendar.set(Calendar.MINUTE, cEndHour.get(Calendar.MINUTE));
- } else {
- calendar.add(Calendar.HOUR_OF_DAY, 1);
- }
+ if (endHour != null) {
+ Calendar cEndHour = Calendar.getInstance();
+ cEndHour.setTime(endHour);
+ calendar.set(Calendar.HOUR_OF_DAY, cEndHour.get(Calendar.HOUR_OF_DAY));
+ calendar.set(Calendar.MINUTE, cEndHour.get(Calendar.MINUTE));
+ } else {
+ calendar.add(Calendar.HOUR_OF_DAY, 1);
+ }
- Date endDate = calendar.getTime();
+ Date endDate = calendar.getTime();
- sql =
- "SELECT activity_id " +
- " FROM stb_activity " +
- " WHERE stb_activity.parent_activity_id = " + UtilityDB.valueToString(parentStbActivity.getActivityId()) + " AND " +
- "stb_activity.user_name = " + UtilityDB.valueToString(user.getUsername()) + " AND " +
- "stb_activity.estimated_time = " + UtilityDB.valueDateToString(startDate, CommonConstants.DATETIME_FORMAT_YMD) +
- (!UtilityString.isNullOrEmpty(planActivityDTO.getDescription())?
- " AND " +
- "stb_activity.activity_description = " + UtilityDB.valueToString(planActivityDTO.getDescription()):"");
+ sql =
+ "SELECT activity_id " +
+ " FROM stb_activity " +
+ " WHERE stb_activity.parent_activity_id = " + UtilityDB.valueToString(parentStbActivity.getActivityId()) + " AND " +
+ "stb_activity.user_name = " + UtilityDB.valueToString(user.getUsername()) + " AND " +
+ "stb_activity.estimated_time = " + UtilityDB.valueDateToString(startDate, CommonConstants.DATETIME_FORMAT_YMD) +
+ (!UtilityString.isNullOrEmpty(planActivityDTO.getDescription()) ?
+ " AND " +
+ "stb_activity.activity_description = " + UtilityDB.valueToString(planActivityDTO.getDescription()) : "");
- String activityId = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql);
+ String activityId = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
- if (activityId == null) {
- String query =
- "SELECT activity_type_id_next, " +
- "count(*) over (partition by activity_type_id) as conta " +
- " FROM srl_activity_type " +
- " WHERE activity_type_id = " + UtilityDB.valueToString(parentStbActivity.getActivityTypeId());
+ if (activityId == null) {
+ String query =
+ "SELECT activity_type_id_next, " +
+ "count(*) over (partition by activity_type_id) as conta " +
+ " FROM srl_activity_type " +
+ " WHERE activity_type_id = " + UtilityDB.valueToString(parentStbActivity.getActivityTypeId());
- Map dati = UtilityDB.executeSimpleQueryOnlyFirstRow(multiDBTransactionManager.getPrimaryConnection(), query);
+ Map dati = UtilityDB.executeSimpleQueryOnlyFirstRow(conn, query);
- String activityTypeId = planActivityDTO.getActivityTypeId();
- if (activityTypeId == null) {
- if (((Integer) dati.get("conta")).intValue() == 1) {
- activityTypeId = (String) dati.get("activity_type_id_next");
- } else if ("OBIETTIVO".equalsIgnoreCase(parentStbActivity.getActivityTypeId())) {
- activityTypeId = "PROGRAMMAZIONE";
- } else if ("TICKET".equalsIgnoreCase(parentStbActivity.getActivityTypeId())) {
- activityTypeId = "TEST,CORREZIONI";
+ String activityTypeId = planActivityDTO.getActivityTypeId();
+ if (activityTypeId == null) {
+ if (((Integer) dati.get("conta")).intValue() == 1) {
+ activityTypeId = (String) dati.get("activity_type_id_next");
+ } else if ("OBIETTIVO".equalsIgnoreCase(parentStbActivity.getActivityTypeId())) {
+ activityTypeId = "PROGRAMMAZIONE";
+ } else if ("TICKET".equalsIgnoreCase(parentStbActivity.getActivityTypeId())) {
+ activityTypeId = "TEST,CORREZIONI";
+ }
+ }
+
+ String description = planActivityDTO.getDescription();
+ if (description == null || description.isEmpty()) {
+ description = parentStbActivity.getActivityDescription();
+ }
+
+ StbActivity newStbActivity = new StbActivity()
+ .setParentActivityId(parentStbActivity.getActivityId())
+ .setUserName(user.getUsername())
+ .setEstimatedTime(startDate)
+ .setEstimatedEndtime(endDate)
+ .setActivityType(activityTypeId)
+ .setFlagTipologia("A")
+ .setActivityDescription(description)
+ .setUserCreator(requestDataDTO.getUsername())
+ .setActivityResultId("DA FARE");
+
+ newStbActivity.setOperation(OperationType.INSERT);
+ entityProcessor.processEntity(newStbActivity, true, multiDBTransactionManager);
+
+ if (!user.getUsername().equalsIgnoreCase(requestDataDTO.getUsername())) {
+ sql = Query.format(
+ "SELECT descrizione\n" +
+ "FROM jtb_comt\n" +
+ "WHERE cod_jcom = %s",
+ newStbActivity.getCodJcom()
+ );
+ String commessa = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
+
+ sql = Query.format(
+ "SELECT full_name\n" +
+ "FROM stb_user\n" +
+ "WHERE user_name = %s",
+ requestDataDTO.getUsername()
+ );
+ String fullname = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
+
+ String title = String.format("Nuova attività pianificata su: %s", commessa);
+ String message = String.format("Ti è stata pianificata un'attività da: %s (#%s)", fullname, newStbActivity.getActivityId());
+ String link = String.format("/activity/task/%s", newStbActivity.getActivityId());
+
+ notificationService.sendNotificationToUserDevices(new MessageDTO()
+ .setUserName(user.getUsername())
+ .setAppName(WtbUserDeviceToken.AppName.TASK)
+ .setNotification(new NotificationDTO()
+ .setTitle(title)
+ .setBody(message)
+ )
+ .setApns(new ApnsConfigDTO()
+ .setAps(new ApsDTO()
+ .setSound("default")
+ .setContentAvailable(true)
+ )
+ )
+ );
}
}
- String description = planActivityDTO.getDescription();
- if (description == null || description.isEmpty()) {
- description = parentStbActivity.getActivityDescription();
+ sql =
+ " SELECT activity_result_id " +
+ " FROM stb_activity " +
+ " WHERE stb_activity.activity_id = " + UtilityDB.valueToString(parentStbActivity.getActivityId());
+
+ String resultId = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
+ if (UtilityString.isNullOrEmpty(resultId)) {
+ parentStbActivity.setActivityResult("DA FARE");
+ parentStbActivity.setOperation(OperationType.UPDATE);
+ entityList.add(parentStbActivity);
+ } else if (UtilityString.equalsIgnoreCase(planActivityDTO.getActivityTypeId(), "TEST NUOVE FUNZIONALITA' SOFWARE")) {
+ parentStbActivity.setActivityResult("TEST");
+ parentStbActivity.setOperation(OperationType.UPDATE);
+ entityList.add(parentStbActivity);
+
}
-
- StbActivity newStbActivity = new StbActivity();
- newStbActivity.setOperation(OperationType.INSERT);
- newStbActivity
- .setParentActivityId(parentStbActivity.getActivityId())
- .setUserName(user.getUsername())
- .setEstimatedTime(startDate)
- .setEstimatedEndtime(endDate)
- .setActivityType(activityTypeId)
- .setFlagTipologia("A")
- .setActivityDescription(description)
- .setUserCreator(userCreator)
- .setActivityResultId("DA FARE");
-
- entityList.add(newStbActivity);
-
- logger.trace(String.format("Inserita attività #%s all'utente %s", newStbActivity.getActivityId(), user.getUsername()));
- }
-
- sql =
- " SELECT activity_result_id " +
- " FROM stb_activity " +
- " WHERE stb_activity.activity_id = " + UtilityDB.valueToString(parentStbActivity.getActivityId());
-
- String resultId = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql);
- if (UtilityString.isNullOrEmpty(resultId)) {
- parentStbActivity.setActivityResult("DA FARE");
- parentStbActivity.setOperation(OperationType.UPDATE);
- entityList.add(parentStbActivity);
- } else if (UtilityString.equalsIgnoreCase(planActivityDTO.getActivityTypeId(), "TEST NUOVE FUNZIONALITA' SOFWARE")) {
- parentStbActivity.setActivityResult("TEST");
- parentStbActivity.setOperation(OperationType.UPDATE);
- entityList.add(parentStbActivity);
-
}
}
}
+
}
- }
+ if (!entityList.isEmpty()) {
+ entityProcessor.processEntityList(entityList, true);
+ }
- if (!entityList.isEmpty()) {
- entityProcessor.processEntityList(entityList, true);
+ } catch (Exception e) {
+ multiDBTransactionManager.rollbackAll();
+ throw e;
}
-
}
public ActivityDTO changeCodJcom(String activityId, String codJcom, String parentActivityId) throws Exception {
@@ -1211,13 +1261,15 @@ public class ActivityService {
return UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, ActivityProductsDTO.class);
}
- public List getCommesse(String username) throws Exception {
+ public List getCommesse(String username, boolean commesseOrfane) throws Exception {
String sql = "SELECT cod_jcom, descrizione \n" +
"FROM jtb_comt \n" +
"WHERE stato_commessa IN ('IN CORSO', 'POST VENDITA', 'TRATTATIVA') \n";
if (username != null && !username.isEmpty()) {
sql += Query.format("AND cod_jflav_tec = %s \n", username);
+ } else if (commesseOrfane) {
+ sql += "AND cod_jflav_tec IS NULL \n";
}
sql += "ORDER BY cod_jcom ASC";
@@ -1226,20 +1278,22 @@ public class ActivityService {
}
public void insertOrUpdateActivity(ActivityDTO activity) throws Exception {
+ Connection conn = multiDBTransactionManager.getPrimaryConnection();
String codAnagPersRif, codAnag;
+
if (!UtilityString.isNullOrEmpty(activity.getEmailRichiedente())) {
String query = "SELECT vtb_clie_pers_rif.cod_anag FROM vtb_clie_pers_rif, vtb_clie "
+ "WHERE vtb_clie_pers_rif.cod_anag = vtb_clie.cod_anag AND "
+ "vtb_clie.flag_stato = 'A' AND vtb_clie_pers_rif.e_mail = "
+ UtilityDB.valueToString(activity.getEmailRichiedente());
- codAnagPersRif = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), query);
+ codAnagPersRif = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, query);
if (UtilityString.isNullOrEmpty(codAnagPersRif)) {
query = "SELECT cod_anag FROM jtb_comt WHERE cod_jcom = "
+ UtilityDB.valueToString(activity.getCommessa());
- codAnag = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), query);
+ codAnag = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, query);
String domainIntegry = "integry.it";
if (!UtilityString.isNullOrEmpty(codAnag) && !activity.getEmailRichiedente().toUpperCase().contains(domainIntegry.toUpperCase())) {
@@ -1267,7 +1321,7 @@ public class ActivityService {
activity.getFlagTipologia()
);
- String codJfas = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql);
+ String codJfas = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
StbActivity stbActivity = new StbActivity();
stbActivity.setOperation(OperationType.INSERT_OR_UPDATE);
@@ -1290,7 +1344,72 @@ public class ActivityService {
.setParentActivityId(activity.getParentActivityId())
.setCodJfas(codJfas);
- entityProcessor.processEntity(stbActivity, true, multiDBTransactionManager);
+ sql = Query.format(
+ "SELECT * FROM stb_activity WHERE activity_id = %s",
+ activity.getIdAttivita()
+ );
+ StbActivity oldActivity = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn, sql, StbActivity.class);
+
+ if (oldActivity != null && !UtilityString.equalsIgnoreCase(oldActivity.getActivityResultId(), activity.getEsito())) {
+ if (!activity.getEsito().equalsIgnoreCase(EmsRestConstants.NULL)) {
+ sql = Query.format(
+ "SELECT CAST(IIF(flag_invio_notifica = 'N', 0, 1) AS BIT)\n" +
+ "FROM stb_activity_result\n" +
+ "WHERE activity_result_id = %s",
+ activity.getEsito()
+ );
+ boolean sendNotification = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
+
+ if (sendNotification) {
+ String username = null;
+
+ sql = Query.format(
+ "SELECT cod_jflav_tec\n" +
+ "FROM jtb_comt\n" +
+ "WHERE stato_commessa IN ('IN CORSO', 'POST VENDITA', 'TRATTATIVA')\n" +
+ " AND cod_jcom = %s",
+ activity.getCommessa()
+ );
+ String responsabile = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
+
+ if (responsabile != null) {
+ username = responsabile;
+ } else {
+ username = oldActivity.getUserCreator();
+ }
+
+ if (username != null || (!username.equalsIgnoreCase(requestDataDTO.getUsername()))) {
+ sql = Query.format(
+ "SELECT full_name\n" +
+ "FROM stb_user\n" +
+ "WHERE user_name = %s",
+ requestDataDTO.getUsername()
+ );
+ String fullname = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
+
+ String title = String.format("%s ha aggiornato un'attività", fullname);
+ String message = String.format("L'attività: #%s è stata aggiornata con esito %s.", activity.getIdAttivita(), activity.getEsito());
+
+ notificationService.sendNotificationToUserDevices(new MessageDTO()
+ .setUserName(username)
+ .setAppName(WtbUserDeviceToken.AppName.TASK)
+ .setNotification(new NotificationDTO()
+ .setTitle(title)
+ .setBody(message)
+ )
+ .setApns(new ApnsConfigDTO()
+ .setAps(new ApsDTO()
+ .setSound("default")
+ .setContentAvailable(true)
+ )
+ )
+ );
+ }
+ }
+ }
+ }
+
+ entityProcessor.processEntity(stbActivity, multiDBTransactionManager);
}
public void updateActivityTask(ActivityTaskDTO activity) throws Exception {
@@ -1801,14 +1920,14 @@ public class ActivityService {
}
if (utentiDb == null) {
utentiDb = new ArrayList<>();
- }else{
+ } else {
utentiDb.forEach(x -> x.setOperation(OperationType.DELETE));
plan.getSrlActivityPlanUser().addAll(utentiDb);
}
for (String username : dto.getUsers()) {
SrlActivityPlanUser user = utentiDb.stream().filter(x -> x.getUserName().equalsIgnoreCase(username)).findFirst().orElse(null);
- if (user == null){
+ if (user == null) {
user = new SrlActivityPlanUser();
plan.getSrlActivityPlanUser().add(user);
}
diff --git a/ems-engine/src/main/java/it/integry/ems/activity/service/UserWorkHoursService.java b/ems-engine/src/main/java/it/integry/ems/activity/service/UserWorkHoursService.java
index 4f25ea87bb..0ffb26b52e 100644
--- a/ems-engine/src/main/java/it/integry/ems/activity/service/UserWorkHoursService.java
+++ b/ems-engine/src/main/java/it/integry/ems/activity/service/UserWorkHoursService.java
@@ -14,6 +14,7 @@ import it.integry.ems.user.service.UserService;
import it.integry.ems.utility.service.UtilityService;
import it.integry.ems_model.entity.JtbRLavr;
import it.integry.ems_model.entity.JtbRLavt;
+import it.integry.ems_model.entity.WtbUserDeviceToken;
import it.integry.ems_model.exception.DataConverterNotFoundException;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
@@ -236,6 +237,7 @@ public class UserWorkHoursService {
notificationService.sendNotificationToUserDevices(new MessageDTO()
.setUserName(user.getUsername())
+ .setAppName(WtbUserDeviceToken.AppName.WINCLOCK)
.setNotification(new NotificationDTO()
.setTitle("Brav*")
.setBody("Hai completato le tue 8 ore di lavoro giornaliere 😁🙌"))
diff --git a/ems-engine/src/main/java/it/integry/ems/contabil/Import/service/ContabilImportService.java b/ems-engine/src/main/java/it/integry/ems/contabil/Import/service/ContabilImportService.java
index bb7a53bd87..46fc867618 100644
--- a/ems-engine/src/main/java/it/integry/ems/contabil/Import/service/ContabilImportService.java
+++ b/ems-engine/src/main/java/it/integry/ems/contabil/Import/service/ContabilImportService.java
@@ -422,7 +422,7 @@ public class ContabilImportService {
public List importPartiteScadSinfoOne(String type, String format, ImportRequestDTO requestDTO, List listAnomalie) throws Exception {
Map setup = setupGest.getImportSetupSection(multiDBTransactionManager.getPrimaryConnection(), type, format);
- Iterator rowIterator = UtilityExcel.readXlsxFile(requestDTO);
+ Iterator rowIterator = UtilityExcel.readXlsxFile(requestDTO, Row.class);
//Ignoro le prime tre righe di intestazione
for (int i = 0; i < 3; i++) {
if (rowIterator.hasNext()) {
diff --git a/ems-engine/src/main/java/it/integry/ems/customizations/sales/service/ToscaSalesService.java b/ems-engine/src/main/java/it/integry/ems/customizations/sales/service/ToscaSalesService.java
index 0049e5c7e1..4ddbd95c7a 100644
--- a/ems-engine/src/main/java/it/integry/ems/customizations/sales/service/ToscaSalesService.java
+++ b/ems-engine/src/main/java/it/integry/ems/customizations/sales/service/ToscaSalesService.java
@@ -73,7 +73,7 @@ public class ToscaSalesService {
}
private List parseFile(InputStream inputStream) throws Exception {
- Iterator rowIterator = UtilityExcel.readXlsxFile(inputStream, true);
+ Iterator rowIterator = UtilityExcel.readXlsxFile(inputStream, true, Row.class);
List ordiniDaImportare = new ArrayList<>();
List diacodNotFound = new ArrayList<>();
diff --git a/ems-engine/src/main/java/it/integry/ems/document/Import/service/DocumentiAcquistoImportService.java b/ems-engine/src/main/java/it/integry/ems/document/Import/service/DocumentiAcquistoImportService.java
index 6a56161d38..6fcf89661f 100644
--- a/ems-engine/src/main/java/it/integry/ems/document/Import/service/DocumentiAcquistoImportService.java
+++ b/ems-engine/src/main/java/it/integry/ems/document/Import/service/DocumentiAcquistoImportService.java
@@ -913,7 +913,7 @@ public class DocumentiAcquistoImportService {
throw new Exception("File con data antecedente alla data prevista per l'importazione");
}
}
- Iterator rowIterator = UtilityExcel.readXlsxFile(requestDTO);
+ Iterator rowIterator = UtilityExcel.readXlsxFile(requestDTO, Row.class);
List rifOrdApuliaList = new ArrayList<>();
while (rowIterator.hasNext()) {
diff --git a/ems-engine/src/main/java/it/integry/ems/document/farm_mes/service/FarmMesIsaporcService.java b/ems-engine/src/main/java/it/integry/ems/document/farm_mes/service/FarmMesIsaporcService.java
index 1befb7dcda..bc2ed89820 100644
--- a/ems-engine/src/main/java/it/integry/ems/document/farm_mes/service/FarmMesIsaporcService.java
+++ b/ems-engine/src/main/java/it/integry/ems/document/farm_mes/service/FarmMesIsaporcService.java
@@ -652,6 +652,7 @@ public class FarmMesIsaporcService {
Connection conn = multiDBTransactionManager.getPrimaryConnection();
PreparedStatement info;
ResultSet res;
+ BigDecimal qtaInProd = BigDecimal.ZERO;
String codJcom = jsonBody.get("codJcom").asText();
String lottoProv = jsonBody.get("lottoProv").asText();
@@ -715,11 +716,11 @@ public class FarmMesIsaporcService {
res.close();
info.close();
- if (dataOrdRistallo == null) {
+ /* if (dataOrdRistallo == null) {
throw new Exception("Non è stato possibile individuare l'ordine di RISTALLO " + bandaRistallo);
} else if (dataOrdRistallo.after(dataTrasf)) {
throw new Exception("La data di trsferimento da RISTALLO alla soccida " + codJcom + " è antecedente alla data del ristallo.");
- }
+ }*/
// Aggiornamento documenti di caricno/scarico sostituendo il lotto specificato dall'operatore in fase
// di immissione in produzione su FARMMES con il lotto di RISTALLO
@@ -769,7 +770,8 @@ public class FarmMesIsaporcService {
sql = "select dtb_ord_steps.id_riga, " +
"dtb_ord_steps.id_step, " +
"dtb_ord_steps.num_fase, " +
- "dtb_ord_steps.cod_jfas " +
+ "dtb_ord_steps.cod_jfas, " +
+ "dtb_ord_steps.qta_in_prod " +
"from dtb_ord_Steps, dtb_ordt " +
"where dtb_ord_steps.data_fine is null and " +
"dtb_ordt.gestione = 'L' and " +
@@ -785,6 +787,7 @@ public class FarmMesIsaporcService {
idStep = res.getInt(2);
numFase = res.getInt(3);
codJfasRow = res.getString(4);
+ qtaInProd = res.getBigDecimal(5);
}
res.close();
info.close();
@@ -810,6 +813,11 @@ public class FarmMesIsaporcService {
ordSteps.setCodJfas(codJfasRow);
ordSteps.setDataIniz(dataTrasf);
ordSteps.setNote("TRASFERIMENTO A SOCCIDA " + codJcom);
+
+ if (qtaTrasf.compareTo(qtaInProd) > 0){
+ String exceptionMsg = "La quantità da trasferire (" + UtilityString.BigDecimalToString(qtaTrasf, "###0") + " capi) è superiore ai capi presenti in produzione (" + UtilityString.BigDecimalToString(qtaInProd, "###0") + " capi) è necessario verificare ed eventualmente modificare il documento DDTL di carico.";
+ throw new Exception(exceptionMsg);
+ }
ordSteps.setQtaTrasferite(qtaTrasf);
ordLav.getDtbOrdSteps().add(ordSteps);
diff --git a/ems-engine/src/main/java/it/integry/ems/document/service/CambioTipoDocService.java b/ems-engine/src/main/java/it/integry/ems/document/service/CambioTipoDocService.java
index be4abd720b..b1abf1b353 100644
--- a/ems-engine/src/main/java/it/integry/ems/document/service/CambioTipoDocService.java
+++ b/ems-engine/src/main/java/it/integry/ems/document/service/CambioTipoDocService.java
@@ -11,6 +11,7 @@ import it.integry.ems_model.entity.DtbDoct;
import it.integry.ems_model.entity.DtbDoctCambioTipoDoc;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
+import it.integry.ems_model.utility.UtilityDate;
import it.integry.ems_model.utility.UtilityString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
@@ -35,6 +36,7 @@ public class CambioTipoDocService {
private SetupGest setupGest;
@Autowired
private RequestDataDTO requestDataDTO;
+
public List cambioTipoDoc(String codDtip, List documenti) throws Exception {
List entityList = new ArrayList<>();
final String gestName = "W_ACAMBIO_COD_DTIP_DISP";
@@ -46,8 +48,8 @@ public class CambioTipoDocService {
if (UtilityString.isNullOrEmpty(emailForLog))
throw new Exception(String.format("Email a cui inviare il log non configurata -> %s ->%s -> EMAIL_FOR_LOG", gestName, section));
- if ( pianifica ) {
- for (CambioTipoDocDTO c: documenti ){
+ if (pianifica) {
+ for (CambioTipoDocDTO c : documenti) {
DtbDoctCambioTipoDoc dtbDoctCambioTipoDoc =
new DtbDoctCambioTipoDoc()
.setCodAnag(c.getCodAnag())
@@ -65,7 +67,7 @@ public class CambioTipoDocService {
if (c.getAllegati() != null && !c.getAllegati().isEmpty()) {
for (CambioTipoDocDTO.Allegati a : c.getAllegati()) {
- if ( dtbDoctCambioTipoDoc.getIdAllegato() == null ) {
+ if (dtbDoctCambioTipoDoc.getIdAllegato() == null) {
dtbDoctCambioTipoDoc.setIdAllegato(a.getIdAllegato());
entityList.add(dtbDoctCambioTipoDoc);
} else {
@@ -107,13 +109,19 @@ public class CambioTipoDocService {
newDoc.setOperation(OperationType.SELECT_OBJECT);
newDoc = entityProcessor.processEntity(newDoc, multiDBTransactionManager);
loadRow(newDoc);
+ Date dataCmov = doc.getDataCmov();
+ if (dataCmov.before(UtilityDate.getTodayWithoutTime())) {
+ dataCmov = UtilityDate.getTodayWithoutTime();
+ }
+
newDoc
- .setCodDtip(doc.getCodDtipNew())
- .setPrevistaFat(null)
- .setNumDocForn(doc.getNumDocForn());
+ .setCodDtip(doc.getCodDtipNew())
+ .setPrevistaFat(null)
+ .setDataCmov(dataCmov)
+ .setNumDocForn(doc.getNumDocForn());
newDoc.setOperation(OperationType.INSERT);
- newDoc.getDtbDocr().stream().forEach(r->r.setOperation(OperationType.INSERT));
+ newDoc.getDtbDocr().stream().forEach(r -> r.setOperation(OperationType.INSERT));
if (doc.getAllegati() != null && !doc.getAllegati().isEmpty()) {
List drlDocAttacheds = new ArrayList<>();
for (CambioTipoDocDTO.Allegati allegato : doc.getAllegati()) {
diff --git a/ems-engine/src/main/java/it/integry/ems/document/service/DocumentiDirettiService.java b/ems-engine/src/main/java/it/integry/ems/document/service/DocumentiDirettiService.java
index 0759c34ced..ece35b003a 100644
--- a/ems-engine/src/main/java/it/integry/ems/document/service/DocumentiDirettiService.java
+++ b/ems-engine/src/main/java/it/integry/ems/document/service/DocumentiDirettiService.java
@@ -88,7 +88,9 @@ public class DocumentiDirettiService {
}
//controllo packingList documento per eventuali trasferimenti
- checkUDSForTransfer(dtbDoct, entityList, isInsert);
+ if (dtbDoct.getGestione().equalsIgnoreCase("V")) {
+ checkUDSForTransfer(dtbDoct, entityList, isInsert);
+ }
if (UtilityString.equalsIgnoreCase((String) datiTipoDoc.get("gestione"), "A")) {
if (!isInsert && dtbDoct.getOldPk() != null) {
diff --git a/ems-engine/src/main/java/it/integry/ems/logistic/service/ColliEviosysImportService.java b/ems-engine/src/main/java/it/integry/ems/logistic/service/ColliEviosysImportService.java
index 657fa47d22..ac1081952d 100644
--- a/ems-engine/src/main/java/it/integry/ems/logistic/service/ColliEviosysImportService.java
+++ b/ems-engine/src/main/java/it/integry/ems/logistic/service/ColliEviosysImportService.java
@@ -2,7 +2,6 @@ package it.integry.ems.logistic.service;
import it.integry.ems.Import.dto.AnomalieDTO;
import it.integry.ems.Import.dto.ImportRequestDTO;
-import it.integry.ems.logistic.dto.sm2.FiltroDistribuzioneColloDTO;
import it.integry.ems.retail.wms.accettazione.service.WMSAccettazioneService;
import it.integry.ems.retail.wms.dto.CloseUDCRequestDTO;
import it.integry.ems.retail.wms.dto.CreateUDCRequestDTO;
@@ -12,19 +11,17 @@ import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.entity.DtbOrdr;
-import it.integry.ems_model.entity.MtbColr;
import it.integry.ems_model.entity.MtbColt;
import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.*;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellType;
-import org.apache.poi.ss.usermodel.DateUtil;
-import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.*;
+import org.bouncycastle.crypto.engines.BlowfishEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
+import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
@@ -54,93 +51,108 @@ public class ColliEviosysImportService {
String codAnag = setup.get("COD_ANAG");
- Iterator rowIterator = UtilityExcel.readXlsxFile(requestDTO);
+ Iterator sheetIterator = UtilityExcel.readXlsxFile(requestDTO, Sheet.class);
- String codMart = null;
- boolean hasHeaderPassed = false;
+ while (sheetIterator.hasNext()) {
+ Sheet sheet = sheetIterator.next();
+ Iterator rowIterator = UtilityExcel.getRowIterator(sheet, true);
- while (rowIterator.hasNext()) {
- Row row = rowIterator.next();
+ String codMart = null;
+ boolean hasHeaderPassed = false;
- if (!hasHeaderPassed) {
- if (codMart == null) {
- codMart = findCodMart(row);
- } else {
- hasHeaderPassed = UtilityExcel.getCellAsString(row, 0, false).equalsIgnoreCase("origine");
- }
- } else {
- List