Merge branch 'develop'
All checks were successful
IntegryManagementSystem_Multi/pipeline/head This commit looks good

This commit is contained in:
jenkins
2025-06-08 07:41:35 +02:00
61 changed files with 36263 additions and 18383 deletions

View File

@@ -60,49 +60,6 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>cz.habarta.typescript-generator</groupId>
<artifactId>typescript-generator-maven-plugin</artifactId>
<version>3.2.1263</version>
<executions>
<execution>
<id>generate</id>
<goals>
<goal>generate</goal>
</goals>
<phase>process-classes</phase>
</execution>
</executions>
<configuration>
<jsonLibrary>jackson2</jsonLibrary>
<classPatterns>it.integry.ems_model.entity.*</classPatterns>
<classes>
<class>it.integry.ems.response.ServiceRestResponse</class>
</classes>
<excludeClasses>
<excludeClass>it.integry.ems_model.base.EntityInterface</excludeClass>
</excludeClasses>
<outputFile>../ts/ems-core.module.ts</outputFile>
<outputKind>module</outputKind>
<outputFileType>implementationFile</outputFileType>
<customTypeNaming>
<naming>it.integry.ems_model.entity.AtbOfft$StatoOfferta:AtbOfftStatoOfferta</naming>
<naming>it.integry.ems_model.entity.VtbOfft$StatoOfferta:VtbOfftStatoOfferta</naming>
<naming>it.integry.ems_model.entity.GrlAnagJrept$Tipo:GrlAnagJreptTipo</naming>
<naming>it.integry.ems_model.entity.WtbJreptSetup$Tipo:WtbJreptSetupTipo</naming>
<naming>it.integry.ems_model.entity.MtbColr$Causale:MtbColrCausale</naming>
<naming>it.integry.ems_model.entity.MtbCols$Causale:MtbColsCausale</naming>
</customTypeNaming>
<generateConstructors>true</generateConstructors>
<mapClasses>asClasses</mapClasses>
<mapEnum>asEnum</mapEnum>
<optionalProperties>useLibraryDefinition</optionalProperties>
<optionalPropertiesDeclaration>questionMarkAndNullableType</optionalPropertiesDeclaration>
<sortDeclarations>true</sortDeclarations>
<sortTypeDeclarations>true</sortTypeDeclarations>
<tsNoCheck>true</tsNoCheck>
</configuration>
</plugin>
</plugins>
</build>

View File

@@ -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" +

View File

@@ -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 {
}
}

View File

@@ -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 {
}
}

View File

@@ -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 {
}
}

View File

@@ -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 {
}
}

View File

@@ -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 {
}
}

View File

@@ -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;

View File

@@ -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<CtbMovi> 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)) {

View File

@@ -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<CtbMovi> castelletto, Boolean flagIvaInclusa) {
private static void addCastellettoIva(BigDecimal importoRiga, String codAliq, Boolean
ventilazione, List<CtbMovi> castelletto, Boolean flagIvaInclusa) {
java.util.Optional<CtbMovi> 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<MtbColt> colli, List<MtbColt> colliFromDB) throws Exception {
public static void setNumColliPeso(EntityBase testata, String calcColli, DatiTrasportoDTO
datiTrasp, List<MtbColt> colli, List<MtbColt> 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<CostiDTO> addCosti(final DtbDocr dtbDocr, List<BigDecimal> sconti, List<CostiDTO> listaCosti, String codJfasTestata) throws Exception {
private static List<CostiDTO> addCosti(final DtbDocr dtbDocr, List<
BigDecimal> sconti, List<CostiDTO> 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<CtbMovi> castelletto, List<DtbDocs> speseCalc,
Integer maxRigaSpesa, String whereCondExcSpese, BigDecimal totDoc, Boolean ventilazione) throws Exception {
private static Integer addImpostaBollo(Connection connection, DtbDoct
testata, List<CtbMovi> castelletto, List<DtbDocs> 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");

View File

@@ -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;
}

View File

@@ -1,87 +0,0 @@
package it.integry.ems.rules.completing.dto;
import java.math.BigDecimal;
import java.util.Date;
public class CostiDTO /*implements Comparable<CostiDTO> */ {
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);
} */
}

View File

@@ -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();
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<String> codiciAlternativi;
public GenerateCodiceFiscaleResultDTO(String codicePrincipale, List<String> 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<String> 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);
}
}

View File

@@ -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<Character, Integer> CARATTERI_DISPARI = new HashMap<>();
private static final Map<Character, Integer> 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<String> 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<String> generaCodiciAlternativi(String nome, String cognome, LocalDate dataNascita,
char sesso, String codiceCatastale) {
List<String> alternativi = new ArrayList<>();
try {
// Variazioni sicure per il nome e cognome
List<String> variazioniNome = generaVariazioniSicure(nome);
List<String> 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<String> generaVariazioniSicure(String nome) {
List<String> variazioni = new ArrayList<>();
if (nome == null || nome.trim().isEmpty()) {
return variazioni;
}
String nomeNormalizzato = nome.trim().toUpperCase();
// Sostituzioni vocali comuni
Map<Character, Character[]> 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");
}
}

View File

@@ -0,0 +1,27 @@
package it.integry.ems.service.dto.production;
import java.util.List;
public class AvailableClassMercDTO {
private String codMgrp;
private List<String> codMsgr;
public String getCodMgrp() {
return codMgrp;
}
public AvailableClassMercDTO setCodMgrp(String codMgrp) {
this.codMgrp = codMgrp;
return this;
}
public List<String> getCodMsgr() {
return codMsgr;
}
public AvailableClassMercDTO setCodMsgr(List<String> codMsgr) {
this.codMsgr = codMsgr;
return this;
}
}

View File

@@ -1076,28 +1076,4 @@ public class OrdineLavorazioneDTO {
this.availableClassMerc = availableClassMerc;
return this;
}
public static class AvailableClassMercDTO {
private String codMgrp;
private List<String> codMsgr;
public String getCodMgrp() {
return codMgrp;
}
public AvailableClassMercDTO setCodMgrp(String codMgrp) {
this.codMgrp = codMgrp;
return this;
}
public List<String> getCodMsgr() {
return codMsgr;
}
public AvailableClassMercDTO setCodMsgr(List<String> codMsgr) {
this.codMsgr = codMsgr;
return this;
}
}
}

View File

@@ -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<String, List<OrdineInevasoGroupMercDTO>> entry : groups.entrySet()) {
order.getAvailableClassMerc()
.add(new OrdineLavorazioneDTO.AvailableClassMercDTO()
.add(new AvailableClassMercDTO()
.setCodMgrp(entry.getKey())
.setCodMsgr(entry.getValue().stream()
.map(OrdineInevasoGroupMercDTO::getCodMsgr)

View File

@@ -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();

View File

@@ -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();

View File

@@ -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;
}
}

View File

@@ -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> 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();

View File

@@ -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<Row> readXlsxFile(ImportRequestDTO requestDTO) throws Exception {
return readXlsxFile(requestDTO, true);
public static <T> Iterator<T> readXlsxFile(ImportRequestDTO requestDTO, Class<T> 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<Row> readXlsxFile(ImportRequestDTO requestDTO, boolean ignoreHeader) throws Exception {
public static <T> Iterator<T> readXlsxFile(ImportRequestDTO requestDTO, boolean ignoreHeader, Class<T> 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<Row> 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 <T> Iterator<T> readXlsxFile(InputStream stream, boolean ignoreHeader, Class<T> clazz) throws Exception {
if (clazz.equals(Row.class)) {
@SuppressWarnings("unchecked")
Iterator<T> rowIterator = (Iterator<T>) readXlsxFileReturnRow(stream, ignoreHeader);
return rowIterator;
} else if (clazz.equals(Sheet.class)) {
@SuppressWarnings("unchecked")
Iterator<T> rowIterator = (Iterator<T>) readXlsxReturnSheet(stream);
return rowIterator;
}
throw new Exception("Tipo di classe non supportato: " + clazz.getName());
}
private static Iterator<Sheet> readXlsxReturnSheet(InputStream stream) throws Exception {
OPCPackage pkg = OPCPackage.open(stream);
Workbook workbook = new XSSFWorkbook(pkg);
Sheet sheet = workbook.getSheetAt(0);
Iterator<Sheet> sheetIterator = workbook.sheetIterator();
pkg.close();
return sheetIterator;
}
private static Iterator<Row> readXlsxFileReturnRow(InputStream stream, boolean ignoreHeader) throws Exception {
Iterator<Sheet> 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<Row> getRowIterator(Sheet sheet, boolean ignoreHeader) throws Exception {
Iterator<Row> 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;
}

View File

@@ -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;
}
}

View File

@@ -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<WtbUserDeviceToken> 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<WtbUserDeviceToken> devices = new ArrayList<>();
public List<WtbUserDeviceToken> 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<String> getUserAssociatedTopics(String userName) throws Exception {

View File

@@ -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())

View File

@@ -19,6 +19,7 @@
</properties>
<build>
<finalName>${ems.war.name}-api</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
@@ -35,14 +36,13 @@
<artifactId>maven-war-plugin</artifactId>
<version>3.4.0</version>
<configuration>
<warName>${ems.war.name}-api</warName>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>cz.habarta.typescript-generator</groupId>
<artifactId>typescript-generator-maven-plugin</artifactId>
<version>3.2.1263</version>
<version>2.37.1128</version>
<executions>
<execution>
<id>generate</id>
@@ -54,22 +54,61 @@
</executions>
<configuration>
<jsonLibrary>jackson2</jsonLibrary>
<classes>
<class>it.integry.ems.response.ServiceRestResponse</class>
</classes>
<classPatterns>
<classPattern>it.integry.ems.product.dto.*</classPattern>
<classPattern>it.integry.ems.production.dto.*</classPattern>
<classPattern>it.integry.ems.retail.wms.generic.dto.articolo.*</classPattern>
<classPattern>it.integry.ems.logistic.conSegna.dto.*</classPattern>
<classPattern>it.integry.**.dto.*</classPattern>
<classPattern>it.integry.**DTO**</classPattern>
<classPattern>it.integry.ems_model.entity.*</classPattern>
</classPatterns>
<customTypeNaming>
<naming>it.integry.ems_model.entity.AtbOfft$StatoOfferta:AtbOfftStatoOfferta</naming>
<naming>it.integry.ems_model.entity.VtbOfft$StatoOfferta:VtbOfftStatoOfferta</naming>
<naming>it.integry.ems_model.entity.GrlAnagJrept$Tipo:GrlAnagJreptTipo</naming>
<naming>it.integry.ems_model.entity.WtbJreptSetup$Tipo:WtbJreptSetupTipo</naming>
<naming>it.integry.ems_model.entity.MtbColr$Causale:MtbColrCausale</naming>
<naming>it.integry.ems_model.entity.MtbCols$Causale:MtbColsCausale</naming>
<naming>it.integry.ems.response.MessageDTO:ResponseMessageDTO</naming>
<naming>it.integry.ems.Import.dto.AnomalieDTO$Type:AnomalieDTOType</naming>
<naming>it.integry.ems.customizations.production.dto.CaricoLavorazioneDTO:ProdCaricoLavorazioneDTO</naming>
<naming>it.integry.ems.document.dto.FilterDTO:DocFilterDTO</naming>
<naming>it.integry.ems.document.farm_mes.dto.ImportLog:FarmMesImportLog</naming>
<naming>it.integry.ems.order.puddy.dto.ImportLog:PuddyImportLog</naming>
<naming>it.integry.ems.dto.EntityHierarchy$Field:EntityHierarchyField</naming>
<naming>it.integry.ems.logistic.dto.ClienteDTO:LogisticClienteDTO</naming>
<naming>it.integry.ems.order.conquist.dto.ClienteDTO:ConquistClienteDTO</naming>
<naming>it.integry.ems.order.conquist.dto.OrdineDTO:ConquistOrdineDTO</naming>
<naming>it.integry.ems.order.Import.dto.DialogoJsonDTO$AnagraficaDTO:DialogoJsonDTOAnagraficaDTO</naming>
<naming>it.integry.ems.ordikids.dto.AnagraficaDTO:OrdikidsAnagraficaDTO</naming>
<naming>it.integry.ems.ordikids.dto.ArticoliDTO:OrdikidsArticoliDTO</naming>
<naming>it.integry.ems.retail.wms.ordini_acquisto.dto.OrdiniAcquistoGrigliaDTO$ArticoliDTO:OrdiniAcquistoGrigliaDTOArticoliDTO</naming>
<naming>it.integry.ems.retail.wms.ordini_acquisto.dto.OrdiniAcquistoGrigliaDTO$ListiniDTO:OrdiniAcquistiGrigliaDTOListiniDTO</naming>
<naming>it.integry.ems.production.dto.AttachmentDTO:ProdAttachmentDTO</naming>
<naming>it.integry.ems.retail.pvmRetail.dto.AccettazioneDTO$Ordine:AccettazioneDTOOrdine</naming>
<naming>it.integry.ems.retail.wms.lavorazione.dto.RecuperaMaterialiRequestDTO$Ordine:RecuperaMaterialiRequestDTOOrdine</naming>
<naming>it.integry.ems.order.Import.dto.DialogoJsonDTO$IndirizzoDTO:DialogoJsonDTOIndirizzoDTO</naming>
<naming>it.integry.ems.sync.MultiDBTransaction.Connection:MultiDBTransactionConnection</naming>
<naming>it.integry.WooCommerce.dto.local.ArticoloDTO:WooCommerceArticoloDTO</naming>
<naming>it.integry.ems.logistic.dto.ArticoloDTO:LogisticArticoloDTO</naming>
<naming>it.integry.ems.document.export.dto.DocumentiDialogoDTO$Export:DocumentiDialogoDTOExport</naming>
<naming>it.integry.ems.order.Import.dto.OrdiniDialogoDTO$Export:OrdiniDialogoDTOExport</naming>
<naming>it.integry.ems.document.export.dto.DocumentiDialogoDTO$Import:DocumentiDialogoDTOImport</naming>
<naming>it.integry.ems.order.Import.dto.OrdiniDialogoDTO$Import:OrdiniDialogoDTOImport</naming>
<naming>it.integry.ems.logistic.dto.ColloDTO:LogisticColloDTO</naming>
<naming>it.integry.ems.response.AttachmentDTO:ResponseAttachmentDTO</naming>
<naming>it.integry.ems.system.imports.dto.OrdineDTO:ImportsOrdineDTO</naming>
</customTypeNaming>
<excludeClasses>
<excludeClass>it.integry.ems_model.base.EntityInterface</excludeClass>
</excludeClasses>
<excludeClassPatterns>
<excludeClassPattern>it.integry.ems.contabil.**</excludeClassPattern>
<excludeClassPattern>it.integry.ems.order.amazon.**</excludeClassPattern>
</excludeClassPatterns>
<outputFile>../ts/ems-engine.module.ts</outputFile>
<outputKind>module</outputKind>
<outputFileType>implementationFile</outputFileType>
<customTypeNaming>
<naming>it.integry.ems_model.entity.MtbColr$Causale:MtbColrCausale</naming>
<naming>it.integry.ems_model.entity.MtbCols$Causale:MtbColsCausale</naming>
</customTypeNaming>
<generateConstructors>true</generateConstructors>
<mapClasses>asClasses</mapClasses>
<mapEnum>asEnum</mapEnum>

View File

@@ -21,7 +21,6 @@ import org.springframework.stereotype.Service;
import java.io.File;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -247,47 +246,72 @@ public class LogService {
PreparedStatement ps = connection.prepareStatement(sql)) {
int deletedRows = ps.executeUpdate();
logger.trace(String.format("Rimossi %d record dal log_db per obsolescenza", deletedRows));
vacuumDatabase(connection);
}
}
@Scheduled(fixedDelay = 5, timeUnit = TimeUnit.MINUTES, zone = "Europe/Rome")
public void checkLogSize() throws Exception {
String maxSize = settingsModel.getLoggerConfiguration().getDbMaxSize();
if (UtilityString.isNullOrEmpty(maxSize)) {
maxSize = "1G"; // Valore predefinito
}
// Trova il valore numerico e l'unità di misura
String pattern = "([\\d.]+)\\s*(M|MB|G|GB)?";
java.util.regex.Pattern r = java.util.regex.Pattern.compile(pattern);
java.util.regex.Matcher m = r.matcher(maxSize);
BigDecimal numericValue = BigDecimal.ONE;
String um = "G";
if (!UtilityString.isNullOrEmpty(maxSize)) {
um = Arrays.stream(maxSize.split("[0-9-.]")).filter(x -> !UtilityString.isNullOrEmpty(x)).findFirst().orElse(null);
if (UtilityString.isNullOrEmpty(um)) {
numericValue = new BigDecimal(maxSize);
um = "G";
} else if (!Arrays.asList("M", "MB", "G", "GB").contains(um.toUpperCase().trim()) || maxSize.indexOf(um) == 0) {
um = "G";
} else {
numericValue = new BigDecimal(maxSize.substring(0, maxSize.indexOf(um)));
String um = "G"; // Default
if (m.find()) {
numericValue = new BigDecimal(m.group(1));
if (m.group(2) != null) {
um = m.group(2).toUpperCase();
}
}
int pow = 3;
if (Arrays.asList("M", "MB").contains(um.toUpperCase().trim())) {
pow = 2;
}
// Calcola il fattore di moltiplicazione in base all'unità
int pow = um.startsWith("M") ? 2 : 3;
// Calcola il massimo numero di byte
long maxBytes = numericValue.multiply(BigDecimal.valueOf(1024).pow(pow)).longValue();
// Verifica la dimensione del file e pulisci se necessario
File logDbFile = new File(UtilityDirs.getConfigPath() + "logs.db");
if (logDbFile.length() > maxBytes) {
if (logDbFile.exists() && logDbFile.length() > maxBytes) {
int deletedRows = cleanOlderLogs();
logger.trace(String.format("Rimossi %d record dal log_db per eccesso di spazio", deletedRows));
logger.trace("Rimossi {} record dal log_db per eccesso di spazio", deletedRows);
}
}
private int cleanOlderLogs() throws Exception {
int hours = 6;
//Cancello 6 ore alla volta
String sql = String.format("DELETE FROM app_logs\n" +
" WHERE entry_date < (SELECT entry_date FROM app_logs ORDER BY entry_date LIMIT 1) + (%d * 3600000)", hours);
try (Connection connection = ConnectionFactory.getDatabaseConnection();
PreparedStatement ps = connection.prepareStatement(sql)) {
return ps.executeUpdate();
try (Connection connection = ConnectionFactory.getDatabaseConnection()) {
PreparedStatement ps = connection.prepareStatement(sql);
int deletedRows = ps.executeUpdate();
ps.close();
vacuumDatabase(connection);
return deletedRows;
}
}
}
private void vacuumDatabase(Connection connection) throws Exception {
PreparedStatement ps = connection.prepareStatement("pragma wal_checkpoint(full);");
ps.execute();
ps.close();
ps = connection.prepareStatement("VACUUM;");
ps.execute();
ps.close();
}
}

View File

@@ -70,7 +70,7 @@ public class ActivityController {
@RequestParam(CommonConstants.PROFILE_DB) String configuration,
@RequestParam(required = false) String userCreator,
@RequestBody List<PlanActivityDTO> 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()")

View File

@@ -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;
}
}

View File

@@ -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<StbActivityFile> stbActivityFiles = new ArrayList<>();
@@ -555,178 +568,215 @@ public class ActivityService {
}
public void planActivities(String userCreator, List<PlanActivityDTO> planActivityDTOList) throws Exception {
public void planActivities(List<PlanActivityDTO> planActivityDTOList) throws Exception {
Connection conn = multiDBTransactionManager.getPrimaryConnection();
List<EntityBase> 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<String, Object> dati = UtilityDB.executeSimpleQueryOnlyFirstRow(multiDBTransactionManager.getPrimaryConnection(), query);
Map<String, Object> 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<ActivityCommessaDTO> getCommesse(String username) throws Exception {
public List<ActivityCommessaDTO> 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 && !oldActivity.getActivityResultId().equalsIgnoreCase(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);
}

View File

@@ -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 😁🙌"))

View File

@@ -422,7 +422,7 @@ public class ContabilImportService {
public List<EntityBase> importPartiteScadSinfoOne(String type, String format, ImportRequestDTO requestDTO, List<AnomalieDTO> listAnomalie) throws Exception {
Map<String, String> setup = setupGest.getImportSetupSection(multiDBTransactionManager.getPrimaryConnection(), type, format);
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO);
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO, Row.class);
//Ignoro le prime tre righe di intestazione
for (int i = 0; i < 3; i++) {
if (rowIterator.hasNext()) {

View File

@@ -73,7 +73,7 @@ public class ToscaSalesService {
}
private List<ToscaOrdineVenditaDTO> parseFile(InputStream inputStream) throws Exception {
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(inputStream, true);
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(inputStream, true, Row.class);
List<ToscaOrdineVenditaDTO> ordiniDaImportare = new ArrayList<>();
List<Long> diacodNotFound = new ArrayList<>();

View File

@@ -913,7 +913,7 @@ public class DocumentiAcquistoImportService {
throw new Exception("File con data antecedente alla data prevista per l'importazione");
}
}
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO);
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO, Row.class);
List<RifOrdApuliaDTO> rifOrdApuliaList = new ArrayList<>();
while (rowIterator.hasNext()) {

View File

@@ -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);

View File

@@ -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<EntityBase> cambioTipoDoc(String codDtip, List<CambioTipoDocDTO> documenti) throws Exception {
List<EntityBase> 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<DrlDocAttached> drlDocAttacheds = new ArrayList<>();
for (CambioTipoDocDTO.Allegati allegato : doc.getAllegati()) {

View File

@@ -82,7 +82,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) {

View File

@@ -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<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO);
Iterator<Sheet> sheetIterator = UtilityExcel.readXlsxFile(requestDTO, Sheet.class);
String codMart = null;
boolean hasHeaderPassed = false;
while (sheetIterator.hasNext()) {
Sheet sheet = sheetIterator.next();
Iterator<Row> 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<Object> rowData =
stream(((Iterable<Cell>) row::cellIterator).spliterator(), false)
.map(x -> {
Object s = cellToString(x);
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
if (!UtilityString.isNullOrEmpty(s)) {
return s;
}
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (rowData.size() >= 7) {
String barcodeUl = (String) rowData.get(2);
String lotto = (String) rowData.get(3);
String qta = (String) rowData.get(6);
barcodeUl = barcodeUl.replace("*", "");
if (barcodeUl.length() > 18) {
barcodeUl = barcodeUl.substring(2);
if (!hasHeaderPassed) {
if (codMart == null) {
codMart = findCodMart(row);
} else {
hasHeaderPassed = UtilityExcel.getCellAsString(row, 0, false).equalsIgnoreCase("origine");
}
} else {
List<Object> rowData =
stream(((Iterable<Cell>) row::cellIterator).spliterator(), false)
.map(x -> {
Object s = cellToString(x);
String sql = Query.format(
"WITH getOrder AS (SELECT dtb_ordr.num_ord,\n" +
" dtb_ordr.data_ord,\n" +
" dtb_ordr.riga_ord,\n" +
" dtb_ordr.cod_mdep,\n" +
" DENSE_RANK() OVER (ORDER BY data_cons DESC, dtb_ordt.data_ord, dtb_ordt.num_ord) AS dr\n" +
" FROM dtb_ordt\n" +
" INNER JOIN dtb_ordr ON dtb_ordt.num_ord = dtb_ordr.num_ord\n" +
" AND dtb_ordr.data_ord = dtb_ordt.data_ord\n" +
" AND dtb_ordt.gestione = dtb_ordr.gestione\n" +
" WHERE cod_anag = %s\n" +
" AND dtb_ordt.gestione = 'A'\n" +
" AND flag_annulla = 'N'\n" +
" AND flag_evaso = 'I'\n" +
" AND cod_mart = %s\n" +
" AND data_cons <= %s)\n" +
"SELECT *\n" +
"FROM getOrder\n" +
"WHERE dr = 1",
codAnag, codMart, new Date()
);
DtbOrdr dtbOrdr = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn, sql, DtbOrdr.class);
if (!UtilityString.isNullOrEmpty(s)) {
return s;
}
MtbColt udc = wmsAccettazioneService.createUDC(
new CreateUDCRequestDTO()
.setCodMdep(dtbOrdr.getCodMdep())
.setCodAnag(codAnag)
.setBarcodeUl(barcodeUl)
.setDataCollo(LocalDate.now())
);
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
udc.getMtbCols().forEach(x -> x.setOperation(OperationType.NO_OP));
if (rowData.size() >= 7) {
String barcodeUl = (String) rowData.get(2);
String lotto = (String) rowData.get(3);
BigDecimal qta = UtilityString.stringToBigDecimal(
rowData.get(6)
.toString()
.replace(".", "")
);
wmsAccettazioneService.insertUDCRow(
new InsertUDCRowRequestDTO()
.setTargetMtbColt(udc)
.setCodMart(codMart)
.setPartitaMag(lotto)
.setQtaTot(UtilityString.stringToBigDecimal(qta))
.setDataOrd(UtilityLocalDate.localDateFromDate(dtbOrdr.getDataOrd()))
.setNumOrd(dtbOrdr.getNumOrd())
.setRigaOrd(dtbOrdr.getRigaOrd())
);
barcodeUl = barcodeUl.replace("*", "");
wmsAccettazioneService.closeUDC(new CloseUDCRequestDTO().setMtbColt(udc));
if (barcodeUl.length() > 18) {
barcodeUl = barcodeUl.substring(2);
}
entityBases.add(udc);
String sql = Query.format(
"WITH getOrder AS (SELECT dtb_ordr.num_ord,\n" +
" dtb_ordr.data_ord,\n" +
" dtb_ordr.riga_ord,\n" +
" dtb_ordr.cod_mdep,\n" +
" DENSE_RANK() OVER (ORDER BY data_cons DESC, dtb_ordt.data_ord, dtb_ordt.num_ord) AS dr\n" +
" FROM dtb_ordt\n" +
" INNER JOIN dtb_ordr ON dtb_ordt.num_ord = dtb_ordr.num_ord\n" +
" AND dtb_ordr.data_ord = dtb_ordt.data_ord\n" +
" AND dtb_ordt.gestione = dtb_ordr.gestione\n" +
" WHERE cod_anag = %s\n" +
" AND dtb_ordt.gestione = 'A'\n" +
" AND flag_annulla = 'N'\n" +
" AND flag_evaso = 'I'\n" +
" AND cod_mart = %s\n" +
" AND data_cons <= %s)\n" +
"SELECT *\n" +
"FROM getOrder\n" +
"WHERE dr = 1",
codAnag, codMart, new Date()
);
DtbOrdr dtbOrdr = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(conn, sql, DtbOrdr.class);
if (dtbOrdr == null) {
throw new Exception("Nessun ordine trovato per il codice anagrafica: " + codAnag + " e codice articolo: " + codMart);
} else if (dtbOrdr.getCodMdep() == null) {
throw new Exception("Nessun deposito trovato per l'ordine: " + dtbOrdr.getNumOrd() + " del cliente: " + codAnag);
}
MtbColt udc = wmsAccettazioneService.createUDC(
new CreateUDCRequestDTO()
.setCodMdep(dtbOrdr.getCodMdep())
.setCodAnag(codAnag)
.setBarcodeUl(barcodeUl)
.setDataCollo(LocalDate.now())
);
udc.getMtbCols().forEach(x -> x.setOperation(OperationType.NO_OP));
wmsAccettazioneService.insertUDCRow(
new InsertUDCRowRequestDTO()
.setTargetMtbColt(udc)
.setCodMart(codMart)
.setPartitaMag(lotto)
.setQtaTot(qta)
.setDataOrd(UtilityLocalDate.localDateFromDate(dtbOrdr.getDataOrd()))
.setNumOrd(dtbOrdr.getNumOrd())
.setRigaOrd(dtbOrdr.getRigaOrd())
);
wmsAccettazioneService.closeUDC(new CloseUDCRequestDTO().setMtbColt(udc));
entityBases.add(udc);
}
}
}
}

View File

@@ -15,9 +15,11 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDate;
import java.util.List;
@RestController
@@ -95,4 +97,28 @@ public class CrmController {
}
return response;
}
@RequestMapping(value = "getActivityCrm", method = RequestMethod.GET)
public ServiceRestResponse getActivity(@RequestParam(CommonConstants.PROFILE_DB) String profileDB,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate dateFilter) throws Exception {
return ServiceRestResponse.createPositiveResponse(crmService.getActivity(dateFilter));
}
@RequestMapping(value = "getCommesseCrm", method = RequestMethod.GET)
public ServiceRestResponse getCommesse(@RequestParam(CommonConstants.PROFILE_DB) String profileDB,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate dateFilter) throws Exception {
return ServiceRestResponse.createPositiveResponse(crmService.getCommesse(dateFilter));
}
@RequestMapping(value = "getProspectCrm", method = RequestMethod.GET)
public ServiceRestResponse getProspect(@RequestParam(CommonConstants.PROFILE_DB) String profileDB,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate dateFilter) throws Exception {
return ServiceRestResponse.createPositiveResponse(crmService.getProspect(dateFilter));
}
@RequestMapping(value = "getAnagClieCrm", method = RequestMethod.GET)
public ServiceRestResponse getAnagClie(@RequestParam(CommonConstants.PROFILE_DB) String profileDB,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate dateFilter) throws Exception {
return ServiceRestResponse.createPositiveResponse(crmService.getAnagClie(dateFilter));
}
}

View File

@@ -0,0 +1,309 @@
package it.integry.ems.order.crm.dto;
import it.integry.ems_model.annotation.SqlField;
import java.math.BigDecimal;
import java.util.Date;
public class AnagClieDTO {
@SqlField(value = "cod_anag")
private String codAnag;
@SqlField(value = "rag_soc")
private String ragSoc;
@SqlField(value = "cod_vtip")
private String CodVtip;
@SqlField(value = "cod_vage")
private String CodVage;
@SqlField(value = "indirizzo")
private String indirizzo;
@SqlField(value = "cap")
private String cap;
@SqlField(value = "citta")
private String citta;
@SqlField(value = "prov")
private String prov;
@SqlField(value = "nazione")
private String nazione;
@SqlField(value = "telefono")
private String telefono;
@SqlField(value = "fax")
private String fax;
@SqlField(value = "part_iva")
private String partIva;
@SqlField(value = "cod_fisc" )
private String codFisc;
@SqlField(value = "note" )
private String note;
@SqlField(value = "persona_rif")
private String personaRif;
@SqlField(value = "e_mail")
private String eMail;
@SqlField(value = "e_mail_pec")
private String eMailPec;
@SqlField(value = "nome")
private String nome;
@SqlField(value = "data_ins")
private Date dataIns;
@SqlField(value = "num_cell")
private String numCell;
@SqlField(value = "cognome")
private String cognome;
@SqlField(value = "diacod")
private String diacod;
@SqlField(value = "lat")
private BigDecimal lat;
@SqlField(value = "lng")
private BigDecimal lng;
@SqlField(value = "data_mod")
private Date dataMod;
public String getCodAnag() {
return codAnag;
}
public AnagClieDTO setCodAnag(String codAnag) {
this.codAnag = codAnag;
return this;
}
public String getRagSoc() {
return ragSoc;
}
public AnagClieDTO setRagSoc(String ragSoc) {
this.ragSoc = ragSoc;
return this;
}
public String getCodVtip() {
return CodVtip;
}
public AnagClieDTO setCodVtip(String codVtip) {
CodVtip = codVtip;
return this;
}
public String getCodVage() {
return CodVage;
}
public AnagClieDTO setCodVage(String codVage) {
CodVage = codVage;
return this;
}
public String getIndirizzo() {
return indirizzo;
}
public AnagClieDTO setIndirizzo(String indirizzo) {
this.indirizzo = indirizzo;
return this;
}
public String getCap() {
return cap;
}
public AnagClieDTO setCap(String cap) {
this.cap = cap;
return this;
}
public String getCitta() {
return citta;
}
public AnagClieDTO setCitta(String citta) {
this.citta = citta;
return this;
}
public String getProv() {
return prov;
}
public AnagClieDTO setProv(String prov) {
this.prov = prov;
return this;
}
public String getNazione() {
return nazione;
}
public AnagClieDTO setNazione(String nazione) {
this.nazione = nazione;
return this;
}
public String getTelefono() {
return telefono;
}
public AnagClieDTO setTelefono(String telefono) {
this.telefono = telefono;
return this;
}
public String getFax() {
return fax;
}
public AnagClieDTO setFax(String fax) {
this.fax = fax;
return this;
}
public String getPartIva() {
return partIva;
}
public AnagClieDTO setPartIva(String partIva) {
this.partIva = partIva;
return this;
}
public String getCodFisc() {
return codFisc;
}
public AnagClieDTO setCodFisc(String codFisc) {
this.codFisc = codFisc;
return this;
}
public String getNote() {
return note;
}
public AnagClieDTO setNote(String note) {
this.note = note;
return this;
}
public String getPersonaRif() {
return personaRif;
}
public AnagClieDTO setPersonaRif(String personaRif) {
this.personaRif = personaRif;
return this;
}
public String geteMail() {
return eMail;
}
public AnagClieDTO seteMail(String eMail) {
this.eMail = eMail;
return this;
}
public String geteMailPec() {
return eMailPec;
}
public AnagClieDTO seteMailPec(String eMailPec) {
this.eMailPec = eMailPec;
return this;
}
public String getNome() {
return nome;
}
public AnagClieDTO setNome(String nome) {
this.nome = nome;
return this;
}
public Date getDataIns() {
return dataIns;
}
public AnagClieDTO setDataIns(Date dataIns) {
this.dataIns = dataIns;
return this;
}
public String getNumCell() {
return numCell;
}
public AnagClieDTO setNumCell(String numCell) {
this.numCell = numCell;
return this;
}
public String getCognome() {
return cognome;
}
public AnagClieDTO setCognome(String cognome) {
this.cognome = cognome;
return this;
}
public String getDiacod() {
return diacod;
}
public AnagClieDTO setDiacod(String diacod) {
this.diacod = diacod;
return this;
}
public BigDecimal getLat() {
return lat;
}
public AnagClieDTO setLat(BigDecimal lat) {
this.lat = lat;
return this;
}
public BigDecimal getLng() {
return lng;
}
public AnagClieDTO setLng(BigDecimal lng) {
this.lng = lng;
return this;
}
public Date getDataMod() {
return dataMod;
}
public AnagClieDTO setDataMod(Date dataMod) {
this.dataMod = dataMod;
return this;
}
}

View File

@@ -0,0 +1,62 @@
package it.integry.ems.order.crm.dto;
import it.integry.ems_model.entity.PtbPros;
import it.integry.ems_model.entity.PtbProsRif;
import it.integry.ems_model.entity.VtbCliePersRif;
import it.integry.ems_model.entity.VtbDest;
import java.util.List;
public class CRMSyncResponseDTO {
private List<AnagClieDTO> anagClie;
private List<VtbDest> vtbDest;
private List<VtbCliePersRif> vtbCliePersRif;
private List<PtbPros> ptbPros;
private List<PtbProsRif> ptbProsRif;
public List<AnagClieDTO> getAnagClie() {
return anagClie;
}
public CRMSyncResponseDTO setAnagClie(List<AnagClieDTO> anagClie) {
this.anagClie = anagClie;
return this;
}
public List<VtbDest> getVtbDest() {
return vtbDest;
}
public CRMSyncResponseDTO setVtbDest(List<VtbDest> vtbDest) {
this.vtbDest = vtbDest;
return this;
}
public List<VtbCliePersRif> getVtbCliePersRif() {
return vtbCliePersRif;
}
public CRMSyncResponseDTO setVtbCliePersRif(List<VtbCliePersRif> vtbCliePersRif) {
this.vtbCliePersRif = vtbCliePersRif;
return this;
}
public List<PtbPros> getPtbPros() {
return ptbPros;
}
public CRMSyncResponseDTO setPtbPros(List<PtbPros> ptbPros) {
this.ptbPros = ptbPros;
return this;
}
public List<PtbProsRif> getPtbProsRif() {
return ptbProsRif;
}
public CRMSyncResponseDTO setPtbProsRif(List<PtbProsRif> ptbProsRif) {
this.ptbProsRif = ptbProsRif;
return this;
}
}

View File

@@ -16,6 +16,7 @@ import it.integry.ems_model.db.ResultSetMapper;
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.Query;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityDate;
import it.integry.ems_model.utility.UtilityString;
@@ -30,6 +31,7 @@ import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
@@ -1351,4 +1353,114 @@ public class CrmService {
}
return entities;
}
public List<StbActivity> getActivity(LocalDate dateFilter) throws Exception {
String sql = Query.format("SELECT *\n" +
"FROM stb_activity\n" +
"WHERE ora_mod_act >= %s\n" +
" OR data_ins_act >= %s",
dateFilter, dateFilter
);
return UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, StbActivity.class);
}
public List<JtbComt> getCommesse(LocalDate dateFilter) throws Exception {
if (dateFilter != null) return null;
String sql = "SELECT * FROM jtb_comt";
return UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, JtbComt.class);
}
public CRMSyncResponseDTO getProspect(LocalDate dateFilter) throws Exception {
CRMSyncResponseDTO taskSyncResponse = new CRMSyncResponseDTO();
String sql = "SELECT * FROM ptb_pros WHERE cod_anag IS NULL";
if (dateFilter != null){
sql += " WHERE data_ins >= " + UtilityDB.valueToString(dateFilter);
}
taskSyncResponse.setPtbPros(
UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, PtbPros.class)
);
if (dateFilter == null){
sql = "SELECT *\n" +
"FROM ptb_pros_rif\n" +
"WHERE EXISTS(SELECT * FROM ptb_pros WHERE ptb_pros.cod_anag IS NULL AND ptb_pros.cod_ppro = ptb_pros_rif.cod_ppro)";
} else {
sql = Query.format(
"SELECT *\n" +
"FROM ptb_pros_rif\n" +
"WHERE EXISTS(SELECT * FROM ptb_pros WHERE ptb_pros.cod_anag IS NULL\n" +
" AND data_ins >= %s\n" +
" AND ptb_pros.cod_ppro = ptb_pros_rif.cod_ppro)",
dateFilter
);
}
taskSyncResponse.setPtbProsRif(
UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, PtbProsRif.class)
);
return taskSyncResponse;
}
public CRMSyncResponseDTO getAnagClie(LocalDate dateFilter) throws Exception {
CRMSyncResponseDTO taskSyncResponse = new CRMSyncResponseDTO();
String sql = "SELECT gtb_anag.cod_anag,\n" +
" vtb_clie.cod_vtip,\n" +
" vtb_clie.cod_vage,\n" +
" rag_soc,\n" +
" indirizzo,\n" +
" cap,\n" +
" citta,\n" +
" prov,\n" +
" nazione,\n" +
" telefono,\n" +
" fax,\n" +
" part_iva,\n" +
" cod_fisc,\n" +
" gtb_anag.note,\n" +
" persona_rif,\n" +
" e_mail,\n" +
" nome,\n" +
" data_ins,\n" +
" num_cell,\n" +
" e_mail_pec,\n" +
" cognome,\n" +
" diacod,\n" +
" lat,\n" +
" lng,\n" +
" data_mod\n" +
"FROM gtb_anag\n" +
" INNER JOIN vtb_clie ON gtb_anag.cod_anag = vtb_clie.cod_anag";
if (dateFilter != null){
sql += " WHERE data_ins >= " + UtilityDB.valueToString(dateFilter) + " OR data_mod >= " + UtilityDB.valueToString(dateFilter);
}
taskSyncResponse.setAnagClie(
UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, AnagClieDTO.class)
);
if (dateFilter == null){
sql = "SELECT *\n" +
"FROM vtb_dest\n" +
"WHERE EXISTS(SELECT * FROM vtb_clie WHERE vtb_clie.cod_anag = vtb_dest.cod_anag)";
taskSyncResponse.setVtbDest(
UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, VtbDest.class)
);
sql = "SELECT *\n" +
"FROM vtb_clie_pers_rif\n" +
"WHERE EXISTS(SELECT * FROM vtb_clie WHERE vtb_clie.cod_anag = vtb_clie_pers_rif.cod_anag)";
taskSyncResponse.setVtbCliePersRif(
UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, VtbCliePersRif.class)
);
}
return taskSyncResponse;
}
}

View File

@@ -40,7 +40,7 @@ public class ImportGrigliaAcquistoService {
Connection conn = multiDBTransactionManager.getPrimaryConnection();
Map<String, String> setup = setupGest.getImportSetupSection(conn, type, format);
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO);
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO, Row.class);
List<AtbGriglieArt> atbGriglieArtList = new ArrayList<>();

View File

@@ -38,7 +38,7 @@ public class ImportGrigliaVenditaService {
List<VtbGriglia> vtbGrigliaList = new ArrayList<>();
HashMap<String, List<String>> hashMap = new HashMap<>();
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO);
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO, Row.class);
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
String codGriglia = UtilityExcel.getCellAsString(row, 0, true);

View File

@@ -316,7 +316,7 @@ public class ImportListiniVenditaService {
if (UtilityString.isNullOrEmpty(fileName))
fileName = setup.get("FILE_FILTER");
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO);
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO, Row.class);
while (rowIterator.hasNext()) {
Row row = rowIterator.next();

View File

@@ -0,0 +1,83 @@
package it.integry.ems.product.importaz.service;
import java.time.LocalDate;
import java.util.Date;
public class RipianificaOrdineLavRequestDTO {
private String gestione;
private Date dataOrd;
private Integer numOrd;
private Integer idLotto;
private String codJfasOld;
private String codJfasNew;
private Date dataPianificazione;
public String getGestione() {
return gestione;
}
public RipianificaOrdineLavRequestDTO setGestione(String gestione) {
this.gestione = gestione;
return this;
}
public Date getDataOrd() {
return dataOrd;
}
public RipianificaOrdineLavRequestDTO setDataOrd(Date dataOrd) {
this.dataOrd = dataOrd;
return this;
}
public Integer getNumOrd() {
return numOrd;
}
public RipianificaOrdineLavRequestDTO setNumOrd(Integer numOrd) {
this.numOrd = numOrd;
return this;
}
public Integer getIdLotto() {
return idLotto;
}
public RipianificaOrdineLavRequestDTO setIdLotto(Integer idLotto) {
this.idLotto = idLotto;
return this;
}
public String getCodJfasOld() {
return codJfasOld;
}
public RipianificaOrdineLavRequestDTO setCodJfasOld(String codJfasOld) {
this.codJfasOld = codJfasOld;
return this;
}
public String getCodJfasNew() {
return codJfasNew;
}
public RipianificaOrdineLavRequestDTO setCodJfasNew(String codJfasNew) {
this.codJfasNew = codJfasNew;
return this;
}
public Date getDataPianificazione() {
return dataPianificazione;
}
public RipianificaOrdineLavRequestDTO setDataPianificazione(Date dataPianificazione) {
this.dataPianificazione = dataPianificazione;
return this;
}
}

View File

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import it.integry.common.var.CommonConstants;
import it.integry.ems.document.dto.ChiusuraLavorazioneDTO;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.product.importaz.service.RipianificaOrdineLavRequestDTO;
import it.integry.ems.production.dto.*;
import it.integry.ems.production.service.MesProductionServiceV2;
import it.integry.ems.production.service.ProductionLineService;
@@ -15,6 +16,7 @@ import it.integry.ems.service.dto.production.OrdineLavorazioneDTO;
import it.integry.ems.service.production.ProductionOrderDataHandlerService;
import it.integry.ems.status.ServiceChecker;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.business_logic.GeneraOrdLav;
import it.integry.ems_model.config.EmsRestConstants;
import it.integry.ems_model.entity.MtbColt;
import it.integry.ems_model.types.OperationType;
@@ -474,6 +476,13 @@ public class MesProductionControllerV2 {
ServiceRestResponse reopenOrdineLav(@RequestBody ReopenOrdineLavRequestDTO dto) throws Exception {
productionOrdersLifecycleService.reopenOrdineLav(dto);
return ServiceRestResponse.createPositiveResponse();
}
@PostMapping(value = "ordine/ripianifica")
public @ResponseBody
ServiceRestResponse ripianifica(@RequestBody RipianificaOrdineLavRequestDTO dto) throws Exception {
productionOrdersLifecycleService.ripianificaOrdLav(dto);
return ServiceRestResponse.createPositiveResponse();
}
}

View File

@@ -1,90 +0,0 @@
package it.integry.ems.production.dto;
public class CartellinoDTO {
private String cod_style, cod_col, cod_tagl, cod_mdep, cod_barre,
flag_saldi, flag_tipo_negozio;
private Double prz_vend, prz_vend_sug, perc_sco;
public String getCod_style() {
return cod_style;
}
public void setCod_style(String cod_style) {
this.cod_style = cod_style;
}
public String getCod_col() {
return cod_col;
}
public void setCod_col(String cod_col) {
this.cod_col = cod_col;
}
public String getCod_tagl() {
return cod_tagl;
}
public void setCod_tagl(String cod_tagl) {
this.cod_tagl = cod_tagl;
}
public String getCod_mdep() {
return cod_mdep;
}
public void setCod_mdep(String cod_mdep) {
this.cod_mdep = cod_mdep;
}
public String getCod_barre() {
return cod_barre;
}
public void setCod_barre(String cod_barre) {
this.cod_barre = cod_barre;
}
public String getFlag_saldi() {
return flag_saldi;
}
public void setFlag_saldi(String flag_saldi) {
this.flag_saldi = flag_saldi;
}
public String getFlag_tipo_negozio() {
return flag_tipo_negozio;
}
public void setFlag_tipo_negozio(String flag_tipo_negozio) {
this.flag_tipo_negozio = flag_tipo_negozio;
}
public Double getPrz_vend() {
return prz_vend;
}
public void setPrz_vend(Double prz_vend) {
this.prz_vend = prz_vend;
}
public Double getPrz_vend_sug() {
return prz_vend_sug;
}
public void setPrz_vend_sug(Double prz_vend_sug) {
this.prz_vend_sug = prz_vend_sug;
}
public Double getPerc_sco() {
return perc_sco;
}
public void setPerc_sco(Double perc_sco) {
this.perc_sco = perc_sco;
}
}

View File

@@ -9,6 +9,7 @@ import it.integry.ems.document.dto.RientroLavorazioneDTO;
import it.integry.ems.document.dto.ScaricoLavorazioneDTO;
import it.integry.ems.exception.MissingDataException;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.product.importaz.service.RipianificaOrdineLavRequestDTO;
import it.integry.ems.production.dto.ReopenOrdineLavRequestDTO;
import it.integry.ems.service.AziendaService;
import it.integry.ems.service.EntityProcessor;
@@ -16,10 +17,7 @@ import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.utility.UtilityDebug;
import it.integry.ems.utility.UtilityEntity;
import it.integry.ems_model.config.EmsRestConstants;
import it.integry.ems_model.entity.DtbDoct;
import it.integry.ems_model.entity.DtbOrdt;
import it.integry.ems_model.entity.JtbLotr;
import it.integry.ems_model.entity.JtbLott;
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.*;
@@ -30,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@@ -332,4 +331,101 @@ public class ProductionOrdersLifecycleService {
throw e;
}
}
public void ripianificaOrdLav(RipianificaOrdineLavRequestDTO ripianificaOrdineLavRequestDTO) throws Exception {
DtbOrdt dtbOrdtP = new DtbOrdt()
.setCodJfas(UtilityString.isNull(ripianificaOrdineLavRequestDTO.getCodJfasNew(), ripianificaOrdineLavRequestDTO.getCodJfasOld()))
.setDataOrd(ripianificaOrdineLavRequestDTO.getDataPianificazione() == null ?
ripianificaOrdineLavRequestDTO.getDataOrd() :
ripianificaOrdineLavRequestDTO.getDataPianificazione()
)
.setGestione("A")
.setGestioneRif("A")
.setGeneraOrdLavDaProd(false)
.setOrdTrasf(false);
dtbOrdtP.setOperation(OperationType.SELECT_OBJECT);
dtbOrdtP.setOnlyPkMaster(false);
entityProcessor.processEntity(dtbOrdtP, multiDBTransactionManager);
if (dtbOrdtP.getNumOrd() == null) {
String sql =
Query.format(
"SELECT * " +
" FROM dtb_ordt " +
"WHERE EXISTS (SELECT * FROM dtb_ordt orl WHERE dtb_ordt.gestione = orl.gestione_rif AND dtb_ordt.data_ord = orl.data_ord_rif AND " +
"dtb_ordt.num_ord = orl.num_ord_rif and gestione = %s and data_ord = %s and num_ord = %s)",
ripianificaOrdineLavRequestDTO.getGestione(),
ripianificaOrdineLavRequestDTO.getDataOrd(),
ripianificaOrdineLavRequestDTO.getNumOrd()
);
dtbOrdtP = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, DtbOrdt.class);
dtbOrdtP
.setCodJfas(ripianificaOrdineLavRequestDTO.getCodJfasNew() == null ? dtbOrdtP.getCodJfas() : ripianificaOrdineLavRequestDTO.getCodJfasNew())
.setDataOrd(ripianificaOrdineLavRequestDTO.getDataPianificazione() == null ? dtbOrdtP.getDataOrd() : ripianificaOrdineLavRequestDTO.getDataPianificazione())
.setNumOrd(null)
.setGeneraOrdLavDaProd(false)
.setOrdTrasf(false);
dtbOrdtP.setOperation(OperationType.INSERT);
entityProcessor.processEntity(dtbOrdtP, true, multiDBTransactionManager);
}
String sql =
Query.format("SELECT ISNULL(MAX(riga_ord), 0) + 1 FROM dtb_ordr WHERE gestione = %s AND data_ord = %s AND num_ord = %s",
dtbOrdtP.getGestione(),
dtbOrdtP.getDataOrd(),
dtbOrdtP.getNumOrd());
Integer rigaOrdProd = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql);
HashMap<String, Object> oldPk = new HashMap<>();
Date dataOrd = ripianificaOrdineLavRequestDTO.getDataOrd();
if (ripianificaOrdineLavRequestDTO.getDataPianificazione() != null &&
!ripianificaOrdineLavRequestDTO.getDataOrd().equals(ripianificaOrdineLavRequestDTO.getDataPianificazione())) {
oldPk.put("dataOrd", ripianificaOrdineLavRequestDTO.getDataOrd());
dataOrd = ripianificaOrdineLavRequestDTO.getDataPianificazione();
}
DtbOrdt dtbOrdl = new DtbOrdt()
.setDataOrd(dataOrd)
.setGestione(ripianificaOrdineLavRequestDTO.getGestione())
.setNumOrd(ripianificaOrdineLavRequestDTO.getNumOrd())
.setGestioneRif(dtbOrdtP.getGestione())
.setDataOrdRif(dtbOrdtP.getDataOrd())
.setNumOrdRif(dtbOrdtP.getNumOrd())
.setRigaOrdRif(rigaOrdProd);
if (!oldPk.isEmpty()) {
dtbOrdl.setOldPk(oldPk);
dtbOrdl.setOperation(OperationType.SUBSTITUTE);
} else {
dtbOrdl.setOperation(OperationType.UPDATE);
}
if (UtilityString.equalsIgnoreCase(ripianificaOrdineLavRequestDTO.getCodJfasNew(), ripianificaOrdineLavRequestDTO.getCodJfasOld())) {
sql =
Query.format(
"SELECT * FROM dtb_ords WHERE gestione = %s AND data_ord = %s AND num_ord = %s ORDER BY data_fine desc",
ripianificaOrdineLavRequestDTO.getGestione(),
ripianificaOrdineLavRequestDTO.getDataOrd(),
ripianificaOrdineLavRequestDTO.getNumOrd());
DtbOrdSteps lastStep = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, DtbOrdSteps.class);
lastStep.setFlagStepAttivo("N");
lastStep.setOperation(OperationType.UPDATE);
dtbOrdl.getDtbOrdSteps().add(lastStep);
DtbOrdSteps dtbOrdSteps = (DtbOrdSteps) lastStep.deepClone();
dtbOrdSteps
.setCodJfas(ripianificaOrdineLavRequestDTO.getCodJfasNew())
.setIdRiga(null)
.setDataIniz(null)
.setDataFine(null);
dtbOrdSteps.setOperation(OperationType.INSERT);
dtbOrdl.getDtbOrdSteps().add(dtbOrdSteps);
}
entityProcessor.processEntity(dtbOrdl, true, multiDBTransactionManager);
}
}

View File

@@ -3,6 +3,7 @@ package it.integry.ems.retail.pvmRetail.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import it.integry.ems.adapter.JsonDateAdapterSerializer;
import it.integry.ems.service.dto.production.AvailableClassMercDTO;
import it.integry.ems_model.annotation.SqlField;
import java.math.BigDecimal;
@@ -623,30 +624,6 @@ public class OrdineInevasoDTO {
return this;
}
public static class AvailableClassMercDTO {
private String codMgrp;
private List<String> codMsgr;
public String getCodMgrp() {
return codMgrp;
}
public AvailableClassMercDTO setCodMgrp(String codMgrp) {
this.codMgrp = codMgrp;
return this;
}
public List<String> getCodMsgr() {
return codMsgr;
}
public AvailableClassMercDTO setCodMsgr(List<String> codMsgr) {
this.codMsgr = codMsgr;
return this;
}
}
public String getCodVdes() {
return codVdes;
}

View File

@@ -1,8 +1,6 @@
package it.integry.ems.retail.wms.generic.dto.articolo;
import it.integry.common.var.CommonConstants;
import it.integry.ems_model.annotation.SqlField;
import it.integry.ems_model.config.EmsRestConstants;
import it.integry.ems_model.entity.MtbAart;
import it.integry.ems_model.utility.UtilityString;

View File

@@ -30,6 +30,7 @@ import it.integry.ems.rules.completing.PackagesRules;
import it.integry.ems.service.AziendaService;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.PrinterService;
import it.integry.ems.service.dto.production.AvailableClassMercDTO;
import it.integry.ems.service.dto.production.OrdineInevasoGroupMercDTO;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.user.UserSession;
@@ -268,7 +269,7 @@ public class WMSGenericService {
for (Map.Entry<String, List<OrdineInevasoGroupMercDTO>> entry : groups.entrySet()) {
order.getAvailableClassMerc()
.add(new OrdineInevasoDTO.AvailableClassMercDTO()
.add(new AvailableClassMercDTO()
.setCodMgrp(entry.getKey())
.setCodMsgr(entry.getValue().stream()
.map(OrdineInevasoGroupMercDTO::getCodMsgr)

View File

@@ -1,15 +0,0 @@
package it.integry.ems.system.dto.syncronization;
public class InsertPublicationGroupRequestDTO {
private String description;
public String getDescription() {
return description;
}
public InsertPublicationGroupRequestDTO setDescription(String description) {
this.description = description;
return this;
}
}

View File

@@ -1,15 +0,0 @@
package it.integry.ems.system.dto.syncronization;
public class InsertPublicationGroupResponseDTO {
private long id;
public long getId() {
return id;
}
public InsertPublicationGroupResponseDTO setId(long id) {
this.id = id;
return this;
}
}

View File

@@ -1,65 +0,0 @@
package it.integry.ems.system.dto.syncronization;
public class PublicationDTO {
private long id;
private String entityName;
private String whereCondSql;
private String recalcColumns;
private boolean syncronize;
private String whereCond;
public long getId() {
return id;
}
public PublicationDTO setId(long id) {
this.id = id;
return this;
}
public String getEntityName() {
return entityName;
}
public PublicationDTO setEntityName(String entityName) {
this.entityName = entityName;
return this;
}
public String getWhereCondSql() {
return whereCondSql;
}
public PublicationDTO setWhereCondSql(String whereCondSql) {
this.whereCondSql = whereCondSql;
return this;
}
public String getRecalcColumns() {
return recalcColumns;
}
public PublicationDTO setRecalcColumns(String recalcColumns) {
this.recalcColumns = recalcColumns;
return this;
}
public boolean isSyncronize() {
return syncronize;
}
public PublicationDTO setSyncronize(boolean syncronize) {
this.syncronize = syncronize;
return this;
}
public String getWhereCond() {
return whereCond;
}
public PublicationDTO setWhereCond(String whereCond) {
this.whereCond = whereCond;
return this;
}
}

View File

@@ -1,39 +0,0 @@
package it.integry.ems.system.dto.syncronization;
import java.util.ArrayList;
import java.util.List;
public class PublicationGroupDTO {
private long id;
private String description;
private List<PublicationDTO> publications = new ArrayList<>();
public long getId() {
return id;
}
public PublicationGroupDTO setId(long id) {
this.id = id;
return this;
}
public String getDescription() {
return description;
}
public PublicationGroupDTO setDescription(String description) {
this.description = description;
return this;
}
public List<PublicationDTO> getPublications() {
return publications;
}
public PublicationGroupDTO setPublications(List<PublicationDTO> publications) {
this.publications = publications;
return this;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long