Importazione movimenti contabili docfinance

This commit is contained in:
2024-10-04 17:28:07 +02:00
parent a24fab203e
commit 0531b865c4
10 changed files with 812 additions and 43 deletions

View File

@@ -0,0 +1,8 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="AutoCloseableResource" enabled="true" level="WARNING" enabled_by_default="true">
<option name="METHOD_MATCHER_CONFIG" value="java.util.Formatter,format,java.io.Writer,append,com.google.common.base.Preconditions,checkNotNull,org.hibernate.Session,close,java.io.PrintWriter,printf,java.io.PrintStream,printf,java.lang.foreign.Arena,ofAuto,java.lang.foreign.Arena,global,com.annimon.stream.Stream,of" />
</inspection_tool>
</profile>
</component>

View File

@@ -16,7 +16,7 @@ import java.util.List;
public class TxtMapper<T> {
private Logger logger = LogManager.getLogger();
private final Logger logger = LogManager.getLogger();
private String fieldsSplitChar = " ";
@@ -29,20 +29,10 @@ public class TxtMapper<T> {
public String serialize(T object) {
Class Tclass = object.getClass();
Class<?> Tclass = object.getClass();
List<Field> declaredFields = Arrays.asList(Tclass.getDeclaredFields());
List<Field> sortedFields = Stream.of(declaredFields)
.filter(x -> x.getAnnotation(DtoField.class) != null && x.getAnnotation(DtoField.class).startPosition() >= 0)
.sortBy(x -> x.getAnnotation(DtoField.class).startPosition())
.toList();
sortedFields.addAll(Stream.of(declaredFields)
.filter(x -> x.getAnnotation(DtoField.class) != null && x.getAnnotation(DtoField.class).startPosition() < 0)
.toList());
List<Field> sortedFields = sortFields(declaredFields);
StringBuilder stringBuilder = new StringBuilder();
@@ -52,18 +42,7 @@ public class TxtMapper<T> {
declaredField.setAccessible(true);
try {
// if(dtoField.startPosition() > stringBuilder.length()) {
// int spacesNeeded = dtoField.startPosition() - stringBuilder.length() - 1;
// int counter = 0;
// do {
// stringBuilder.append(" ");
// counter ++;
// } while (counter < spacesNeeded);
//
// stringBuilder.append(fieldsSplitChar);
// }
String value = applyDtoAnnotation(declaredField.get(object), dtoField);
String value = applyDtoAnnotationForSerialization(declaredField.get(object), dtoField);
if (value == null) {
value = "";
@@ -101,7 +80,7 @@ public class TxtMapper<T> {
public String serialize(List<T> objectList) {
if (objectList == null || objectList.size() == 0)
if (objectList == null || objectList.isEmpty())
return null;
StringBuilder stringBuilder = new StringBuilder();
@@ -109,12 +88,63 @@ public class TxtMapper<T> {
for (int i = 0; i < objectList.size(); i++) {
stringBuilder.append(serialize(objectList.get(i)));
if (i < objectList.size() - 1) stringBuilder.append(System.getProperty("line.separator"));
if (i < objectList.size() - 1) stringBuilder.append(System.lineSeparator());
}
return stringBuilder.toString();
}
public T deserialize(String line, Class<T> clazz) {
try {
T instance = clazz.getDeclaredConstructor().newInstance();
List<Field> declaredFields = Arrays.asList(clazz.getDeclaredFields());
List<Field> sortedFields = sortFields(declaredFields);
for (Field field : sortedFields) {
DtoField dtoField = field.getAnnotation(DtoField.class);
field.setAccessible(true);
String value = null;
if (ignorePosition) {
String[] tokens = line.split(fieldsSplitChar);
value = tokens[sortedFields.indexOf(field)];
} else {
int startPosition = dtoField.startPosition();
int endPosition = Math.min(line.length(), startPosition + dtoField.maxLength());
if (startPosition < endPosition && endPosition <= line.length()) {
value = line.substring(startPosition, endPosition).trim();
}
}
applyDtoAnnotationForDeserialization(field, instance, value, dtoField);
}
return instance;
} catch (Exception e) {
logger.error("Error during deserialization", e);
return null;
}
}
public List<T> deserialize(List<String> lines, Class<T> clazz) {
return Stream.of(lines)
.map(line -> deserialize(line, clazz))
.toList();
}
private List<Field> sortFields(List<Field> declaredFields) {
List<Field> sortedFields = Stream.of(declaredFields)
.filter(x -> x.getAnnotation(DtoField.class) != null && x.getAnnotation(DtoField.class).startPosition() >= 0)
.sortBy(x -> x.getAnnotation(DtoField.class).startPosition())
.toList();
sortedFields.addAll(Stream.of(declaredFields)
.filter(x -> x.getAnnotation(DtoField.class) != null && x.getAnnotation(DtoField.class).startPosition() < 0)
.toList());
return sortedFields;
}
public String getFieldsSplitChar() {
return fieldsSplitChar;
@@ -162,13 +192,11 @@ public class TxtMapper<T> {
}
private String applyDtoAnnotation(Object value, DtoField dtoField) {
private String applyDtoAnnotationForSerialization(Object value, DtoField dtoField) {
if (value != null) {
if (!UtilityString.isNullOrEmpty(dtoField.format()) && value instanceof Date) {
value = new SimpleDateFormat(dtoField.format()).format(value);
} else if (!UtilityString.isNullOrEmpty(dtoField.formula()) && value instanceof BigDecimal) {
// String regex = "[0-9]+\\.[0-9]{"+dtoField.scale()+"}+";
// if(Pattern.matches(regex, columnValue.toString())
value = ((BigDecimal) value).setScale(dtoField.scale(), RoundingMode.HALF_DOWN);
String formula = dtoField.formula().replaceAll("this", value.toString());
String[] opList = formula.split("\\*");
@@ -193,4 +221,29 @@ public class TxtMapper<T> {
return value != null ? value.toString() : null;
}
private void applyDtoAnnotationForDeserialization(Field field, T instance, String value, DtoField dtoField) throws Exception {
if (!UtilityString.isNullOrEmpty(value)) {
Class<?> fieldType = field.getType();
if (fieldType == Integer.class) {
field.set(instance, Integer.parseInt(value));
} else if (fieldType == BigDecimal.class) {
BigDecimal bigDecimalValue = new BigDecimal(value);
if (!UtilityString.isNullOrEmpty(dtoField.moltiplicatore())) {
bigDecimalValue = bigDecimalValue.divide(new BigDecimal(dtoField.moltiplicatore()));
}
field.set(instance, bigDecimalValue.setScale(dtoField.scale(), RoundingMode.HALF_DOWN));
} else if (fieldType == Boolean.class) {
field.set(instance, value.equalsIgnoreCase(defaultBooleanTrueValue));
} else if (fieldType == Date.class) {
if (!UtilityString.isNullOrEmpty(dtoField.format())) {
SimpleDateFormat sdf = new SimpleDateFormat(dtoField.format());
field.set(instance, sdf.parse(value));
}
} else {
field.set(instance, value);
}
}
}
}

View File

@@ -0,0 +1,44 @@
package it.integry.ems.migration.model;
import it.integry.ems.migration._base.BaseMigration;
import it.integry.ems.migration._base.MigrationModelInterface;
public class Migration_20241004102029 extends BaseMigration implements MigrationModelInterface {
@Override
public void up() throws Exception {
if (isHistoryDB())
return;
createSetup("IMPORT_MOVIMENTI CONTABILI", "DOCFINANCE", "ATTIVO", "N",
"Inserire S/N per attivare/disattivare il tipo di importazione", false, null, false, false,
false, false, false, null, false, null);
createSetup("IMPORT_MOVIMENTI CONTABILI", "DOCFINANCE", "EMAIL_FOR_LOG", null,
"Inserire il file l'indirizzo email per inviare il log dell'importazione", false, null, false, false,
false, false, false, null, false, null);
createSetup("IMPORT_MOVIMENTI CONTABILI", "DOCFINANCE", "FILE_FILTER", null,
"Inserire il criterio di filtro dei file o il nome del file specifio (seguire la sintassi di java)", false, null, false, false,
false, false, false, null, false, null);
createSetup("IMPORT_MOVIMENTI CONTABILI", "DOCFINANCE", "GG_CANC_FILE", null,
"Giorni per la cancellazione dei file dalla cartella di appoggio", false, null, false, false,
false, false, false, null, false, null);
createSetup("IMPORT_MOVIMENTI CONTABILI", "DOCFINANCE", "IMPORT_REST", "S",
"Inserire S/N per attivare/disattivare il salvataggio con i servizi REST", false, null, false, false,
false, false, false, null, false, null);
createSetup("IMPORT_MOVIMENTI CONTABILI", "DOCFINANCE", "LISTENING", "N",
"Se LISTENIG = 'N' la procedura di importazione non si potrà mai mettere in ascolto sulla directory perchè nella procedura vengono prese in considerazione più file.", false, null, false, false,
false, false, false, null, false, null);
createSetup("IMPORT_MOVIMENTI CONTABILI", "DOCFINANCE", "PATH_FILE", null,
"Directory contente i file da importare.", false, null, false, false,
false, false, false, null, false, null);
createSetup("IMPORT_MOVIMENTI CONTABILI", "DOCFINANCE", "PATH_FILE_IMPORTED", null,
"Directory dove vengono spostati i file dopo l'importazione.", false, null, false, false,
false, false, false, null, false, null);
}
@Override
public void down() throws Exception {
}
}

View File

@@ -0,0 +1,38 @@
package it.integry.ems.migration.model;
import it.integry.ems.migration._base.BaseMigration;
import it.integry.ems.migration._base.MigrationModelInterface;
public class Migration_20241004172307 extends BaseMigration implements MigrationModelInterface {
@Override
public void up() throws Exception {
if (isHistoryDB())
return;
createOrUpdateFunction("f_getChiaveCogeDocFinace", "CREATE FUNCTION [dbo].[f_getChiaveCogeDocFinace]\n" +
"(\n" +
" @annoPart int, @serDoc varchar(2), @numDoc int, @idRiga int, @tipoAnag varchar(1)\n" +
")\n" +
"RETURNS varchar(26)\n" +
"AS\n" +
"BEGIN\n" +
" -- Declare the return variable here\n" +
" DECLARE @chiaveCoge varchar(26)\n" +
"\n" +
" -- Add the T-SQL statements to compute the return value here\n" +
" SELECT @chiaveCoge = @tipoAnag + cast(@annoPart as varchar) + FORMAT(@numDoc, REPLICATE('0', 9)) + @serDoc + space(2 - LEN(@serDoc)) + FORMAT(@idRiga, '000')\n" +
"\n" +
" -- Return the result of the function\n" +
" RETURN @chiaveCoge\n" +
"\n" +
"END");
}
@Override
public void down() throws Exception {
}
}

View File

@@ -20,10 +20,8 @@ import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -876,4 +874,17 @@ public class CtbMovt extends EntityBase {
cs.execute();
cs.close();
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CtbMovt ctbMovt = (CtbMovt) o;
return Objects.equals(numCmov, ctbMovt.numCmov) && Objects.equals(dataCmov, ctbMovt.dataCmov) && Objects.equals(importo, ctbMovt.importo) && Objects.equals(annoComp, ctbMovt.annoComp) && Objects.equals(dataDoc, ctbMovt.dataDoc) && Objects.equals(serDoc, ctbMovt.serDoc) && Objects.equals(numDoc, ctbMovt.numDoc) && Objects.equals(codIreg, ctbMovt.codIreg) && Objects.equals(numIreg, ctbMovt.numIreg) && Objects.equals(numProt, ctbMovt.numProt) && Objects.equals(tipoAnag, ctbMovt.tipoAnag) && Objects.equals(stamGio, ctbMovt.stamGio) && Objects.equals(stamIva, ctbMovt.stamIva) && Objects.equals(descrizioneCaus, ctbMovt.descrizioneCaus) && Objects.equals(codAnag, ctbMovt.codAnag) && Objects.equals(codCcau, ctbMovt.codCcau) && Objects.equals(codJcom, ctbMovt.codJcom) && Objects.equals(codDiviCont, ctbMovt.codDiviCont) && Objects.equals(cambioDiviCont, ctbMovt.cambioDiviCont) && Objects.equals(inseritoDa, ctbMovt.inseritoDa) && Objects.equals(dataIns, ctbMovt.dataIns) && Objects.equals(modificatoDa, ctbMovt.modificatoDa) && Objects.equals(dataMod, ctbMovt.dataMod) && Objects.equals(dataRicezione, ctbMovt.dataRicezione) && Objects.equals(numDocForn, ctbMovt.numDocForn) && Objects.equals(dataCompIva, ctbMovt.dataCompIva) && Objects.equals(flagScorporo, ctbMovt.flagScorporo) && Objects.equals(tipoNumerazione, ctbMovt.tipoNumerazione) && Objects.equals(generaScad, ctbMovt.generaScad) && Objects.equals(generaReverseCharge, ctbMovt.generaReverseCharge) && Objects.equals(codCcauRc, ctbMovt.codCcauRc) && Objects.equals(idTitolo, ctbMovt.idTitolo) && Objects.equals(codAnagTitolo, ctbMovt.codAnagTitolo) && Objects.equals(dataDist, ctbMovt.dataDist) && Objects.equals(rifDist, ctbMovt.rifDist) && Objects.equals(iban, ctbMovt.iban) && Objects.equals(numCmovRif, ctbMovt.numCmovRif) && Objects.equals(numCmovRc, ctbMovt.numCmovRc) && Objects.equals(numDocRc, ctbMovt.numDocRc) && Objects.equals(numProtRc, ctbMovt.numProtRc) && Objects.equals(tipoPartita, ctbMovt.tipoPartita) && Objects.equals(totImponib, ctbMovt.totImponib) && Objects.equals(totIva, ctbMovt.totIva) && Objects.equals(acconto, ctbMovt.acconto) && Objects.equals(codPaga, ctbMovt.codPaga) && Objects.equals(codVage, ctbMovt.codVage) && Objects.equals(flagCheckPlafond, ctbMovt.flagCheckPlafond) && Objects.equals(isAutofattura, ctbMovt.isAutofattura) && Objects.equals(ctbMovr, ctbMovt.ctbMovr) && Objects.equals(ctbMovi, ctbMovt.ctbMovi) && Objects.equals(crlMovAttached, ctbMovt.crlMovAttached) && Objects.equals(ctbPart, ctbMovt.ctbPart) && Objects.equals(ctbScad, ctbMovt.ctbScad) && Objects.equals(vtbDistIncat, ctbMovt.vtbDistIncat) && Objects.equals(ctbMovtRc, ctbMovt.ctbMovtRc) && Objects.equals(ctbInum, ctbMovt.ctbInum) && Objects.equals(gtbAnag, ctbMovt.gtbAnag);
}
@Override
public int hashCode() {
return Objects.hash(numCmov, dataCmov, importo, annoComp, dataDoc, serDoc, numDoc, codIreg, numIreg, numProt, tipoAnag, stamGio, stamIva, descrizioneCaus, codAnag, codCcau, codJcom, codDiviCont, cambioDiviCont, inseritoDa, dataIns, modificatoDa, dataMod, dataRicezione, numDocForn, dataCompIva, flagScorporo, tipoNumerazione, generaScad, generaReverseCharge, codCcauRc, idTitolo, codAnagTitolo, dataDist, rifDist, iban, numCmovRif, numCmovRc, numDocRc, numProtRc, tipoPartita, totImponib, totIva, acconto, codPaga, codVage, flagCheckPlafond, isAutofattura, ctbMovr, ctbMovi, crlMovAttached, ctbPart, ctbScad, vtbDistIncat, ctbMovtRc, ctbInum, gtbAnag);
}
}

View File

@@ -27,6 +27,9 @@ public class ContabilImporter extends BaseEntityImporter<List<EntityBase>> imple
case SINFOONESCADENZE:
entities = contabilImportService.importPartiteScadSinfoOne(type, format, requestDto, anomalie);
break;
case DOCFINANCE:
entities = contabilImportService.importMovimentiContabiliDocfinance(type, format, requestDto, anomalie);
break;
default:
throw new Exception("Tipo " + format + " non supportato");
}
@@ -41,7 +44,8 @@ public class ContabilImporter extends BaseEntityImporter<List<EntityBase>> imple
public enum Format {
INFRAGRUPPO("INFRAGRUPPO"),
PAGHE_TEAMSYSTEM("PAGHE_TEAMSYSTEM"),
SINFOONESCADENZE("SINFO_ONE_SCADENZE");
SINFOONESCADENZE("SINFO_ONE_SCADENZE"),
DOCFINANCE("DOCFINANCE");
private String text;

View File

@@ -0,0 +1,502 @@
package it.integry.ems.contabil.Import.dto;
import it.integry.common.var.CommonConstants;
import it.integry.ems_model.annotation.DtoField;
import it.integry.ems_model.annotation.SqlField;
import it.integry.ems_model.entity.CtbMovt;
import it.integry.ems_model.utility.UtilityDate;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
public class MovimentiContabiliDocfinanceDTO {
@SqlField(value = "azienda")
@DtoField(startPosition = 0, maxLength = 10, fillChar = " ")
private String azienda;
@SqlField(value = "numeratore")
@DtoField(startPosition = 10, maxLength = 4, fillChar = " ")
private String numeratore;
@SqlField(value = "anno")
@DtoField(startPosition = 14, maxLength = 4, fillChar = " ")
private String anno;
@SqlField(value = "movimento")
@DtoField(startPosition = 18, maxLength = 10, fillChar = " ")
private String movimento;
@SqlField(value = "progressivo")
@DtoField(startPosition = 28, maxLength = 6, fillChar = " ")
private String progressivo;
@SqlField(value = "data_operazione")
@DtoField(startPosition = 34, maxLength = 8, fillChar = " ")
private String dataOperazione;
@SqlField(value = "banca")
@DtoField(startPosition = 42, maxLength = 8, fillChar = " ")
private String banca;
@SqlField(value = "rbn")
@DtoField(startPosition = 50, maxLength = 4, fillChar = " ")
private String rbn;
@SqlField(value = "data_registrazione")
@DtoField(startPosition = 54, maxLength = 8, fillChar = " ")
private String dataRegistrazione;
@SqlField(value = "causale_coge")
@DtoField(startPosition = 62, maxLength = 4, fillChar = " ")
private String causaleCoge;
@SqlField(value = "divisa")
@DtoField(startPosition = 66, maxLength = 5, fillChar = " ")
private String divisa;
@SqlField(value = "importo_in_divisa")
@DtoField(startPosition = 71, maxLength = 22, fillChar = " ")
private String importoInDivisa;
@SqlField(value = "divisa_azienda")
@DtoField(startPosition = 93, maxLength = 5, fillChar = " ")
private String divisaAzienda;
@SqlField(value = "controvalore")
@DtoField(startPosition = 98, maxLength = 22, fillChar = " ")
private String controvalore;
@SqlField(value = "data_valuta")
@DtoField(startPosition = 120, maxLength = 8, fillChar = " ")
private String dataValuta;
@SqlField(value = "note")
@DtoField(startPosition = 128, maxLength = 40, fillChar = " ")
private String note;
@SqlField(value = "tipo_documento")
@DtoField(startPosition = 168, maxLength = 2, fillChar = " ")
private String tipoDocumento;
@SqlField(value = "numero_partita")
@DtoField(startPosition = 170, maxLength = 10, fillChar = " ")
private String numeroPartita;
@SqlField(value = "piano_dei_conti")
@DtoField(startPosition = 180, maxLength = 16, fillChar = " ")
private String pianoDeiConti;
@SqlField(value = "sezione_aziendale")
@DtoField(startPosition = 196, maxLength = 6, fillChar = " ")
private String sezioneAziendale;
@SqlField(value = "voce")
@DtoField(startPosition = 202, maxLength = 6, fillChar = " ")
private String voce;
@SqlField(value = "chiave_coge")
@DtoField(startPosition = 208, maxLength = 26, fillChar = " ")
private String chiaveCoge;
@SqlField(value = "data_scadenza")
@DtoField(startPosition = 234, maxLength = 8, fillChar = " ")
private String dataScadenza;
@SqlField(value = "flag_acconto_saldo")
@DtoField(startPosition = 242, maxLength = 1, fillChar = " ")
private String flagAccontoSaldo;
@SqlField(value = "anno_coge")
@DtoField(startPosition = 243, maxLength = 4, fillChar = " ")
private String annoCoge;
@SqlField(value = "numero_ritorno_coge")
@DtoField(startPosition = 247, maxLength = 4, fillChar = " ")
private String numeroRitornoCoge;
@SqlField(value = "descrizione_operazione")
@DtoField(startPosition = 251, maxLength = 40, fillChar = " ")
private String descrizioneOperazione;
@SqlField(value = "flag_distinta")
@DtoField(startPosition = 291, maxLength = 1, fillChar = " ")
private String flagDistinta;
@SqlField(value = "numero_documento")
@DtoField(startPosition = 292, maxLength = 12, fillChar = " ")
private String numeroDocumento;
@SqlField(value = "importo_originario_scadenza")
@DtoField(startPosition = 304, maxLength = 16, fillChar = " ")
private String importoOriginarioScadenza;
@SqlField(value = "azienda_nome_conto")
@DtoField(startPosition = 320, maxLength = 10, fillChar = " ")
private String aziendaNomeConto;
@SqlField(value = "piano_dei_conti_nome_conto")
@DtoField(startPosition = 330, maxLength = 16, fillChar = " ")
private String pianoDeiContiNomeConto;
@SqlField(value = "piano_dei_conti_destinatario")
@DtoField(startPosition = 346, maxLength = 16, fillChar = " ")
private String pianoDeiContiDestinatario;
@SqlField(value = "data_documento_origine")
@DtoField(startPosition = 362, maxLength = 8, fillChar = " ")
private String dataDocumentoOrigine;
@SqlField(value = "Filler")
@DtoField(startPosition = 370, maxLength = 79, fillChar = " ")
private String Filler;
@SqlField(value = "note_cib")
@DtoField(startPosition = 449, maxLength = 570, fillChar = " ")
private String noteCib;
public String getAzienda() {
return azienda;
}
public MovimentiContabiliDocfinanceDTO setAzienda(String azienda) {
this.azienda = azienda;
return this;
}
public String getNumeratore() {
return numeratore;
}
public MovimentiContabiliDocfinanceDTO setNumeratore(String numeratore) {
this.numeratore = numeratore;
return this;
}
public String getAnno() {
return anno;
}
public MovimentiContabiliDocfinanceDTO setAnno(String anno) {
this.anno = anno;
return this;
}
public String getMovimento() {
return movimento;
}
public MovimentiContabiliDocfinanceDTO setMovimento(String movimento) {
this.movimento = movimento;
return this;
}
public String getProgressivo() {
return progressivo;
}
public MovimentiContabiliDocfinanceDTO setProgressivo(String progressivo) {
this.progressivo = progressivo;
return this;
}
public Date getDataOperazione() {
return UtilityDate.StringToDate(dataOperazione, "ddMMyyyy");
}
public MovimentiContabiliDocfinanceDTO setDataOperazione(String dataOperazione) {
this.dataOperazione = dataOperazione;
return this;
}
public String getBanca() {
return banca;
}
public MovimentiContabiliDocfinanceDTO setBanca(String banca) {
this.banca = banca;
return this;
}
public String getRbn() {
return rbn;
}
public MovimentiContabiliDocfinanceDTO setRbn(String rbn) {
this.rbn = rbn;
return this;
}
public String getDataRegistrazione() {
return dataRegistrazione;
}
public MovimentiContabiliDocfinanceDTO setDataRegistrazione(String dataRegistrazione) {
this.dataRegistrazione = dataRegistrazione;
return this;
}
public String getCausaleCoge() {
return causaleCoge;
}
public MovimentiContabiliDocfinanceDTO setCausaleCoge(String causaleCoge) {
this.causaleCoge = causaleCoge;
return this;
}
public String getDivisa() {
return divisa;
}
public MovimentiContabiliDocfinanceDTO setDivisa(String divisa) {
this.divisa = divisa;
return this;
}
public String getImportoInDivisa() {
return importoInDivisa;
}
public MovimentiContabiliDocfinanceDTO setImportoInDivisa(String importoInDivisa) {
this.importoInDivisa = importoInDivisa;
return this;
}
public String getDivisaAzienda() {
return divisaAzienda;
}
public MovimentiContabiliDocfinanceDTO setDivisaAzienda(String divisaAzienda) {
this.divisaAzienda = divisaAzienda;
return this;
}
public BigDecimal getControvalore() {
return new BigDecimal(controvalore.replace(",", ".").substring(1));
}
public char getSegno(){
return controvalore.charAt(0);
}
public MovimentiContabiliDocfinanceDTO setControvalore(String controvalore) {
this.controvalore = controvalore;
return this;
}
public String getDataValuta() {
return dataValuta;
}
public MovimentiContabiliDocfinanceDTO setDataValuta(String dataValuta) {
this.dataValuta = dataValuta;
return this;
}
public String getNote() {
return note;
}
public MovimentiContabiliDocfinanceDTO setNote(String note) {
this.note = note;
return this;
}
public String getTipoDocumento() {
return tipoDocumento;
}
public MovimentiContabiliDocfinanceDTO setTipoDocumento(String tipoDocumento) {
this.tipoDocumento = tipoDocumento;
return this;
}
public String getNumeroPartita() {
return numeroPartita;
}
public MovimentiContabiliDocfinanceDTO setNumeroPartita(String numeroPartita) {
this.numeroPartita = numeroPartita;
return this;
}
public String getPianoDeiConti() {
return pianoDeiConti;
}
public MovimentiContabiliDocfinanceDTO setPianoDeiConti(String pianoDeiConti) {
this.pianoDeiConti = pianoDeiConti;
return this;
}
public String getSezioneAziendale() {
return sezioneAziendale;
}
public MovimentiContabiliDocfinanceDTO setSezioneAziendale(String sezioneAziendale) {
this.sezioneAziendale = sezioneAziendale;
return this;
}
public String getVoce() {
return voce;
}
public MovimentiContabiliDocfinanceDTO setVoce(String voce) {
this.voce = voce;
return this;
}
public String getChiaveCoge() {
return chiaveCoge;
}
public MovimentiContabiliDocfinanceDTO setChiaveCoge(String chiaveCoge) {
this.chiaveCoge = chiaveCoge;
return this;
}
public String getDataScadenza() {
return dataScadenza;
}
public MovimentiContabiliDocfinanceDTO setDataScadenza(String dataScadenza) {
this.dataScadenza = dataScadenza;
return this;
}
public String getFlagAccontoSaldo() {
return flagAccontoSaldo;
}
public MovimentiContabiliDocfinanceDTO setFlagAccontoSaldo(String flagAccontoSaldo) {
this.flagAccontoSaldo = flagAccontoSaldo;
return this;
}
public String getAnnoCoge() {
return annoCoge;
}
public MovimentiContabiliDocfinanceDTO setAnnoCoge(String annoCoge) {
this.annoCoge = annoCoge;
return this;
}
public String getNumeroRitornoCoge() {
return numeroRitornoCoge;
}
public MovimentiContabiliDocfinanceDTO setNumeroRitornoCoge(String numeroRitornoCoge) {
this.numeroRitornoCoge = numeroRitornoCoge;
return this;
}
public String getDescrizioneOperazione() {
return descrizioneOperazione;
}
public MovimentiContabiliDocfinanceDTO setDescrizioneOperazione(String descrizioneOperazione) {
this.descrizioneOperazione = descrizioneOperazione;
return this;
}
public String getFlagDistinta() {
return flagDistinta;
}
public MovimentiContabiliDocfinanceDTO setFlagDistinta(String flagDistinta) {
this.flagDistinta = flagDistinta;
return this;
}
public String getNumeroDocumento() {
return numeroDocumento;
}
public MovimentiContabiliDocfinanceDTO setNumeroDocumento(String numeroDocumento) {
this.numeroDocumento = numeroDocumento;
return this;
}
public String getImportoOriginarioScadenza() {
return importoOriginarioScadenza;
}
public MovimentiContabiliDocfinanceDTO setImportoOriginarioScadenza(String importoOriginarioScadenza) {
this.importoOriginarioScadenza = importoOriginarioScadenza;
return this;
}
public String getAziendaNomeConto() {
return aziendaNomeConto;
}
public MovimentiContabiliDocfinanceDTO setAziendaNomeConto(String aziendaNomeConto) {
this.aziendaNomeConto = aziendaNomeConto;
return this;
}
public String getPianoDeiContiNomeConto() {
return pianoDeiContiNomeConto;
}
public MovimentiContabiliDocfinanceDTO setPianoDeiContiNomeConto(String pianoDeiContiNomeConto) {
this.pianoDeiContiNomeConto = pianoDeiContiNomeConto;
return this;
}
public String getPianoDeiContiDestinatario() {
return pianoDeiContiDestinatario;
}
public MovimentiContabiliDocfinanceDTO setPianoDeiContiDestinatario(String pianoDeiContiDestinatario) {
this.pianoDeiContiDestinatario = pianoDeiContiDestinatario;
return this;
}
public String getDataDocumentoOrigine() {
return dataDocumentoOrigine;
}
public MovimentiContabiliDocfinanceDTO setDataDocumentoOrigine(String dataDocumentoOrigine) {
this.dataDocumentoOrigine = dataDocumentoOrigine;
return this;
}
public String getFiller() {
return Filler;
}
public MovimentiContabiliDocfinanceDTO setFiller(String filler) {
Filler = filler;
return this;
}
public String getNoteCib() {
return noteCib;
}
public MovimentiContabiliDocfinanceDTO setNoteCib(String noteCib) {
this.noteCib = noteCib;
return this;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MovimentiContabiliDocfinanceDTO that = (MovimentiContabiliDocfinanceDTO) o;
return Objects.equals(azienda, that.azienda) && Objects.equals(numeratore, that.numeratore) && Objects.equals(anno, that.anno) && Objects.equals(movimento, that.movimento) && Objects.equals(progressivo, that.progressivo);
}
@Override
public int hashCode() {
return Objects.hash(azienda, numeratore, anno, movimento, progressivo);
}
public static CtbMovt fromMovimenti(MovimentiContabiliDocfinanceDTO mov){
return new CtbMovt().setDataCmov(mov.getDataOperazione()).setCodCcau(mov.getCausaleCoge()).setDescrizioneCaus(String.valueOf(mov.hashCode()));
}
}

View File

@@ -6,8 +6,11 @@ import it.integry.common.var.CommonConstants;
import it.integry.ems.Import.dto.AnomalieDTO;
import it.integry.ems.Import.dto.ImportRequestDTO;
import it.integry.ems.contabil.Import.dto.MovPagheDTO;
import it.integry.ems.contabil.Import.dto.MovimentiContabiliDocfinanceDTO;
import it.integry.ems.datasource.DataSource;
import it.integry.ems.file_formatter.csv.CsvMapper;
import it.integry.ems.file_formatter.txt.TxtMapper;
import it.integry.ems.rules.businessLogic.AccountingBusinessLogic;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.service.MailService;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
@@ -26,6 +29,7 @@ import java.math.BigDecimal;
import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@Service
@Scope("request")
@@ -413,7 +417,6 @@ public class ContabilImportService {
}
public List<EntityBase> importPartiteScadSinfoOne(String type, String format, ImportRequestDTO requestDTO, List<AnomalieDTO> listAnomalie) throws Exception {
List<EntityBase> listEntityBase = new ArrayList<>();
Map<String, String> setup = setupGest.getImportSetupSection(multiDBTransactionManager.getPrimaryConnection(), type, format);
Iterator<Row> rowIterator = UtilityExcel.readXlsxFile(requestDTO);
@@ -567,4 +570,111 @@ public class ContabilImportService {
return entityProcessor.processEntityList(ctbPartList, multiDBTransactionManager, true);
}
public List<EntityBase> importMovimentiContabiliDocfinance(String type, String format, ImportRequestDTO requestDTO, List<AnomalieDTO> listAnomalie) throws Exception {
Connection conn = multiDBTransactionManager.getPrimaryConnection();
if (requestDTO == null || requestDTO.getRawContent() == null)
throw new Exception("Nessun file da importare");
List<String> lines = UtilityString.splitStringToMultipleLine(requestDTO.getRawContent());
TxtMapper<MovimentiContabiliDocfinanceDTO> txtMapper = new TxtMapper<MovimentiContabiliDocfinanceDTO>()
.setFieldsSplitChar("");
List<MovimentiContabiliDocfinanceDTO> deserialize = txtMapper.deserialize(lines, MovimentiContabiliDocfinanceDTO.class);
Map<CtbMovt, List<MovimentiContabiliDocfinanceDTO>> movimenti = deserialize.stream().collect(Collectors.groupingBy(MovimentiContabiliDocfinanceDTO::fromMovimenti));
List<CtbMovt> ctbMovtList = new ArrayList<>();
for (CtbMovt ctbMovt : movimenti.keySet()) {
String codCcau = ctbMovt.getCodCcau();
String sql = Query.format("SELECT CAST(COUNT(*) AS BIT) FROM ctb_caus WHERE cod_ccau = %s", codCcau);
boolean codCcauExists = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
if (!codCcauExists) {
listAnomalie.add(AnomalieDTO.error(String.format("Codice ccau non trovato: %s", codCcau)));
continue;
}
boolean existsAnomalia = false;
for (MovimentiContabiliDocfinanceDTO mov : movimenti.get(ctbMovt)) {
String diacod = mov.getPianoDeiConti();
sql = Query.format(
"SELECT gtb_anag.cod_anag, ctb_anag.cod_ccon, IIF(vtb_clie.cod_anag IS NOT NULL, 'C', 'F') AS tipo_anag\n" +
"FROM gtb_anag\n" +
" INNER JOIN ctb_anag ON gtb_anag.cod_anag = ctb_anag.cod_anag\n" +
" LEFT OUTER JOIN vtb_clie ON gtb_anag.cod_anag = vtb_clie.cod_anag\n" +
"WHERE gtb_anag.diacod = %s\n" +
"UNION\n" +
"SELECT NULL, ctb_cont.cod_ccon, NULL\n" +
"FROM ctb_cont\n" +
"WHERE diacod = %s",
diacod, diacod
);
HashMap<String, Object> resultQuery = UtilityDB.executeSimpleQueryOnlyFirstRow(conn, sql);
if (resultQuery == null) {
listAnomalie.add(AnomalieDTO.error(String.format("Diacod non trovato: %s", diacod)));
existsAnomalia = true;
break;
}
BigDecimal controvalore = mov.getControvalore();
BigDecimal impAvere = null;
BigDecimal impDare = controvalore;
if (mov.getSegno() == '-') {
impAvere = controvalore;
impDare = null;
}
String codAnag = (String) resultQuery.get("cod_anag");
String tipoAnag = (String) resultQuery.get("tipo_anag");
CtbMovr ctbMovr = new CtbMovr()
.setCodCcon((String) resultQuery.get("cod_ccon"))
.setCodAnag(codAnag)
.setTipoAnag(tipoAnag)
.setImpAvere(impAvere)
.setImpDare(impDare)
.setDesAgg(mov.getNote());
String chiaveCoge = mov.getChiaveCoge();
if (!UtilityString.isNullOrEmpty(chiaveCoge)) {
sql = Query.format(
"SELECT *\n" +
"FROM ctb_scad\n" +
"WHERE (intercode = %s\n" +
" OR dbo.f_getChiaveCogeDocFinace(anno_part, ser_doc, num_doc, id_riga, tipo_anag) = %s)" +
" AND cod_anag = %s AND tipo_anag = %s"
, chiaveCoge, chiaveCoge, codAnag, tipoAnag
);
List<CtbScad> ctbScadList = UtilityDB.executeSimpleQueryDTO(conn, sql, CtbScad.class);
if (ctbScadList == null || ctbScadList.isEmpty()) {
listAnomalie.add(AnomalieDTO.warning(String.format("Chiave coge non trovato: %s", chiaveCoge)));
} else {
AccountingBusinessLogic.pagaScadenze(mov.getDataOperazione(), controvalore, ctbScadList);
ctbMovr.setCtbScad(ctbScadList);
ctbMovr.setAnnoPart(ctbScadList.get(0).getAnnoPart())
.setSerDoc(ctbScadList.get(0).getSerDoc())
.setNumDoc(ctbScadList.get(0).getNumDoc());
}
}
ctbMovt.getCtbMovr().add(ctbMovr);
}
if (!ctbMovt.getCtbMovr().isEmpty() && !existsAnomalia) {
ctbMovt.setDescrizioneCaus(null)
.setOperation(OperationType.INSERT);
ctbMovtList.add(ctbMovt);
}
}
if (listAnomalie.isEmpty() || listAnomalie.stream().noneMatch(AnomalieDTO::isError)){
return entityProcessor.processEntityList(ctbMovtList, true);
}
return new ArrayList<>();
}
}

View File

@@ -42,7 +42,7 @@ public class ScadenzeImportService {
private ProdottiLaranciaService prodottiLaranciaService;
public List<EntityBase> importDocFinance(String type, String format, ImportRequestDTO requestDTO, List<AnomalieDTO> listAnomalie) throws Exception {
List<EntityBase> entityList = new ArrayList<>();
List<EntityBase> entityList;
Connection conn = multiDBTransactionManager.getPrimaryConnection();
if (requestDTO == null || requestDTO.getRawContent() == null)

View File

@@ -60,12 +60,11 @@ public class ScadenzeExporterService {
" '' AS 'cambio_della_gestione',\n" +
" CAST(ctb_part.num_doc AS VARCHAR) AS 'numero_doc_origine',\n" +
" ISNULL(CTB_SCAD.INTERCODE,\n" +
" RIGHT(CAST(ctb_part.anno_part AS VARCHAR), 2) +\n" +
" IIF(ctb_part.tipo_anag = 'c', FORMAT(ctb_part.num_doc, REPLICATE('0', 5)),\n" +
" CAST(ctb_part.num_doc AS VARCHAR) + SPACE(5 - LEN(CAST(ctb_part.num_doc AS VARCHAR)))) +\n" +
" FORMAT(ctb_scad.id_riga, '000') +\n" +
" FORMAT(DENSE_RANK() OVER (PARTITION BY ctb_part.cod_anag, ctb_part.num_doc ORDER BY ctb_scad.data_doc),\n" +
" '000')) AS 'chiave_coge',\n" +
" dbo.f_getChiaveCogeDocFinace(ctb_scad.anno_part, \n" +
" ctb_scad.ser_doc, \n" +
" ctb_scad.num_doc, \n" +
" ctb_scad.id_riga,\n" +
" ctb_scad.tipo_anag)) AS 'chiave coge',\n" +
" 'ROSSOGARGA' AS 'azienda',\n" +
" Right(ctb_part.iban,12) AS 'numero_cc',\n" +
" SUBSTRING(ctb_part.iban, 5, 1) AS 'cin',\n" +