Merge remote-tracking branch 'origin/develop' into develop
All checks were successful
IntegryManagementSystem_Multi/pipeline/head This commit looks good

This commit is contained in:
2025-06-20 17:12:40 +02:00
21 changed files with 1412 additions and 154 deletions

View File

@@ -128,7 +128,7 @@ public class MinIOService implements IObjectStorageService {
@Override
public void disconnect() {
if(mMinioClient != null) {
if (mMinioClient != null) {
try {
mMinioClient.close();
} catch (Exception e) {
@@ -163,17 +163,17 @@ public class MinIOService implements IObjectStorageService {
}
@Override
public byte[] downloadObject(@Nonnull String objectName) throws Exception {
public byte[] downloadObject(@Nonnull String objectName) throws ServerException, InsufficientDataException, MinIONotEnabledException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
return internalDownloadObject(objectName, mDefaultBucketName);
}
@Override
public byte[] downloadObject(@Nonnull String objectName, @Nonnull MultiDBTransactionManager multiDBTransactionManager) throws Exception {
public byte[] downloadObject(@Nonnull String objectName, @Nonnull MultiDBTransactionManager multiDBTransactionManager) throws ServerException, SQLException, InsufficientDataException, MinIONotEnabledException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, PrimaryDatabaseNotPresentException, InternalException {
return internalDownloadObject(objectName, getBucketName(multiDBTransactionManager));
}
@Override
public byte[] downloadObject(@Nonnull String objectName, @Nonnull Connection connection) throws Exception {
public byte[] downloadObject(@Nonnull String objectName, @Nonnull Connection connection) throws ServerException, SQLException, InsufficientDataException, MinIONotEnabledException, ErrorResponseException, NoSuchAlgorithmException, IOException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
return internalDownloadObject(objectName, getBucketName(connection));
}
@@ -195,7 +195,7 @@ public class MinIOService implements IObjectStorageService {
return objectName;
}
private byte[] internalDownloadObject(@Nonnull String objectName, @Nonnull String bucketName) throws Exception {
private byte[] internalDownloadObject(@Nonnull String objectName, @Nonnull String bucketName) throws MinIONotEnabledException, ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
this.checkStatus();
this.checkConnection();

View File

@@ -10,7 +10,7 @@ import com.fasterxml.jackson.databind.annotation.JsonTypeResolver;
import com.google.common.base.Joiner;
import com.microsoft.sqlserver.jdbc.SQLServerConnection;
import com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement;
import io.minio.errors.ErrorResponseException;
import io.minio.errors.*;
import it.integry.common.var.CommonConstants;
import it.integry.common.var.EmsDBConst;
import it.integry.ems._context.ApplicationContextProvider;
@@ -492,7 +492,7 @@ public abstract class EntityBase implements Serializable, Cloneable, EntityInter
return false;
}
public EntityBase selectAndMergeEntity(Connection connection, EntityBase entity) throws IllegalAccessException, IOException, FieldMissingException, SQLException, ConverterNotConfiguredException, MergeEntityDBToObjectException, XmlPullParserException, NoSuchAlgorithmException, InvalidKeyException, MinIONotEnabledException {
public EntityBase selectAndMergeEntity(Connection connection, EntityBase entity) throws IllegalAccessException, IOException, FieldMissingException, SQLException, ConverterNotConfiguredException, MergeEntityDBToObjectException, XmlPullParserException, NoSuchAlgorithmException, InvalidKeyException, MinIONotEnabledException, ServerException, InsufficientDataException, ErrorResponseException, InvalidResponseException, XmlParserException, InternalException {
String where;
if (!entity.getOnlyPkMaster() && entity.getOperation() == OperationType.SELECT_OBJECT) {
@@ -556,7 +556,7 @@ public abstract class EntityBase implements Serializable, Cloneable, EntityInter
} else throw new Exception("Impossibile confrontare le entity");
}
private EntityBase mergeEntityDBToObject(Connection connection, HashMap<String, Object> datiDb, EntityBase entity) throws IllegalAccessException, ConverterNotConfiguredException, SQLException, XmlPullParserException, NoSuchAlgorithmException, IOException, InvalidKeyException, MergeEntityDBToObjectException, MinIONotEnabledException {
private EntityBase mergeEntityDBToObject(Connection connection, HashMap<String, Object> datiDb, EntityBase entity) throws ServerException, SQLException, InsufficientDataException, MinIONotEnabledException, ErrorResponseException, NoSuchAlgorithmException, IOException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException, IllegalAccessException, MergeEntityDBToObjectException, ConverterNotConfiguredException {
if (UtilityHashMap.isPresent(datiDb)) {
MinIOService minIOService = ApplicationContextProvider.getApplicationContext().getBean(MinIOService.class);
@@ -632,14 +632,15 @@ public abstract class EntityBase implements Serializable, Cloneable, EntityInter
}
field.set(entity, columnValue);
} catch (SQLException | MinIONotEnabledException | XmlPullParserException |
NoSuchAlgorithmException |
IOException | InvalidKeyException e) {
} catch (SQLException | MinIONotEnabledException |
NoSuchAlgorithmException | IOException | InvalidKeyException | ServerException |
InsufficientDataException | ErrorResponseException | InvalidResponseException |
XmlParserException | InternalException | IllegalAccessException e) {
if (!UtilityDebug.isDebugExecution() && !UtilityDebug.isIntegryServer()) {
throw e;
} else {
logger.error(e);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

View File

@@ -9,6 +9,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.kie.api.definition.type.PropertyReactive;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -37,10 +38,10 @@ public class GtbAnagNote extends EntityBase {
private String note;
@SqlField(value = "data_ins", nullable = false, defaultObjectValue = CommonConstants.SYSDATE)
private Date dataIns;
private LocalDate dataIns;
@SqlField(value = "data_scad", format = CommonConstants.SYSDATE)
private Date dataScad;
private LocalDate dataScad;
@SqlField(value = "flag_segn_scad", maxLength = 1, nullable = false, defaultObjectValue = "N")
private String flagSegnScad;
@@ -94,20 +95,20 @@ public class GtbAnagNote extends EntityBase {
return this;
}
public Date getDataIns() {
public LocalDate getDataIns() {
return dataIns;
}
public GtbAnagNote setDataIns(Date dataIns) {
public GtbAnagNote setDataIns(LocalDate dataIns) {
this.dataIns = dataIns;
return this;
}
public Date getDataScad() {
public LocalDate getDataScad() {
return dataScad;
}
public GtbAnagNote setDataScad(Date dataScad) {
public GtbAnagNote setDataScad(LocalDate dataScad) {
this.dataScad = dataScad;
return this;
}

View File

@@ -61,7 +61,9 @@ public class SqlFieldHolder {
private static SpelExpressionParser pp;
private static StandardEvaluationContext ctx;
private static final ResponseJSONObjectMapper jsonObjectMapper = ApplicationContextProvider.getApplicationContext().getBean(ResponseJSONObjectMapper.class);
private static final ResponseJSONObjectMapper jsonObjectMapper = ApplicationContextProvider.getApplicationContext() != null ?
ApplicationContextProvider.getApplicationContext().getBean(ResponseJSONObjectMapper.class)
: new ResponseJSONObjectMapper();
private static final TypeReference<List<String>> STRING_LIST_TYPE_REF = new TypeReference<List<String>>() {
};

View File

@@ -16,6 +16,7 @@ import it.integry.ems_model.exception.DataConverterNotFoundException;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.types.TypeDbObject;
import it.integry.ems_model.utility.dto.IndexTableDTO;
import it.integry.ems_model.utility.dto.PageableRequestDTO;
import it.integry.ems_model.utility.dto.PaginatedDTO;
import org.apache.commons.lang3.StringUtils;
@@ -548,7 +549,29 @@ public class UtilityDB {
return executeSimpleQueryDTO(conn, querySql, clazz, null);
}
public static <T> PaginatedDTO<T> executePaginatedQueryDTO(Connection conn, String querySql, Class<T> clazz, int page, int pageSize) throws SQLException, DataConverterNotFoundException, InstantiationException, IllegalAccessException {
public static <T> PaginatedDTO<T> executePaginatedQueryDTO(Connection conn, String querySql, Class<T> clazz, PageableRequestDTO pageableRequestDTO) throws SQLException {
final String paginatedQuery = UtilityQuery.generatePaginatedSelect(querySql, pageableRequestDTO);
final List<HashMap<String, Object>> result = executeSimpleQuery(conn, paginatedQuery);
int totalCount = 0;
if (!result.isEmpty()) {
totalCount = UtilityHashMap.getValueIfExists(result.get(0), "rows_count");
}
final List<T> resultList = UtilityHashMap.mapListToObjects(result, clazz);
PaginatedDTO<T> paginatedDTO = new PaginatedDTO<>();
paginatedDTO
.setData(resultList)
.setTotalCount(totalCount);
return paginatedDTO;
}
public static <T> PaginatedDTO<T> executePaginatedQueryDTO(Connection conn, String querySql, Class<T> clazz, int page, int pageSize) throws SQLException {
final String paginatedQuery = UtilityQuery.generatePaginatedSelect(querySql, page, pageSize);
final List<HashMap<String, Object>> result = executeSimpleQuery(conn, paginatedQuery);
@@ -675,9 +698,6 @@ public class UtilityDB {
break;
case Types.TINYINT:
result = Byte.class;
break;
case Types.SMALLINT:
result = Short.class;
break;

View File

@@ -2,12 +2,14 @@ package it.integry.ems_model.utility;
import it.integry.ems_model.annotation.SqlField;
import it.integry.ems_model.utility.dto.FilterDTO;
import it.integry.ems_model.utility.dto.SortDTO;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -52,7 +54,7 @@ public class UtilityFilter {
return where;
}
String value = (String) subFilter.getValue();
String value = String.valueOf(subFilter.getValue());
try {
if (value.matches("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.*")) {
@@ -137,4 +139,25 @@ public class UtilityFilter {
return "(" + sql + ")";
}
public static String processSort(SortDTO[] sort) {
return processSort(sort, false);
}
public static String processSort(SortDTO[] sort, boolean reverse) {
List<String> arraySort = Arrays.stream(sort)
.map(sortDTO ->
String.format(
"%s %s",
sortDTO.getField(),
sortDTO.getDir()
)
)
.collect(Collectors.toList());
if (reverse) {
Collections.reverse(arraySort);
}
return String.join(", ", arraySort);
}
}

View File

@@ -5,6 +5,7 @@ import it.integry.common.var.CommonConstants;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems_model.annotation.SqlField;
import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.utility.dto.PageableRequestDTO;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Field;
@@ -20,6 +21,51 @@ import java.util.HashMap;
import java.util.List;
public class UtilityQuery {
public static String generatePaginatedSelect(String query, PageableRequestDTO pageableRequestDTO) {
String sql = query;
if (!query.contains("WITH")) {
sql = String.format(
"WITH TempResult AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_number,\n" +
" *\n" +
" FROM (%s) t" +
" WHERE [filter]),\n" +
" TempCount AS (SELECT COUNT(*) AS rows_count\n" +
" FROM TempResult)\n" +
"SELECT TempResult.*,\n" +
" TempCount.*\n" +
"FROM TempResult,\n" +
" TempCount\n" +
"ORDER BY [orderBy]",
query
);
}
String filter = "1 = 1";
String sort = "row_number";
if (pageableRequestDTO != null) {
if (pageableRequestDTO.getFilter() != null) {
filter = UtilityFilter.processFilters(pageableRequestDTO.getFilter());
}
if (pageableRequestDTO.getSort() != null) {
sort = UtilityFilter.processSort(pageableRequestDTO.getSort());
}
if (pageableRequestDTO.getPage() != null && pageableRequestDTO.getPageSize() != null) {
sort += "\nOFFSET ([pageNum] - 1) * [pageSize] ROWS FETCH NEXT [pageSize] ROWS ONLY";
sort = sort.replace("[pageNum]", String.valueOf(pageableRequestDTO.getPage()));
sort = sort.replace("[pageSize]", String.valueOf(pageableRequestDTO.getPageSize()));
}
}
sql = sql.replace("[filter]", filter);
sql = sql.replace("[orderBy]", sort);
return sql;
}
public static String generatePaginatedSelect(String query, int pageNumber, int pageSize) {
String sql = "WITH TempResult AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_number, " +

View File

@@ -0,0 +1,47 @@
package it.integry.ems_model.utility.dto;
public class PageableRequestDTO {
private FilterDTO filter;
private Integer page;
private Integer pageSize;
private SortDTO[] sort;
public FilterDTO getFilter() {
return filter;
}
public PageableRequestDTO setFilter(FilterDTO filter) {
this.filter = filter;
return this;
}
public Integer getPage() {
return page;
}
public PageableRequestDTO setPage(Integer page) {
this.page = page;
return this;
}
public Integer getPageSize() {
return pageSize;
}
public PageableRequestDTO setPageSize(Integer pageSize) {
this.pageSize = pageSize;
return this;
}
public SortDTO[] getSort() {
return sort;
}
public PageableRequestDTO setSort(SortDTO[] sort) {
this.sort = sort;
return this;
}
}

View File

@@ -0,0 +1,25 @@
package it.integry.ems_model.utility.dto;
public class SortDTO {
String field;
String dir;
public String getField() {
return field;
}
public SortDTO setField(String field) {
this.field = field;
return this;
}
public String getDir() {
return dir;
}
public SortDTO setDir(String dir) {
this.dir = dir;
return this;
}
}

File diff suppressed because one or more lines are too long

View File

@@ -164,4 +164,14 @@ when
then
String codVvet = AnagRules.completeCodVvet(conn, $vtbVett);
modify ( $vtbVett ) { setCodVvet(codVvet) }
end
rule "completeDataInsGtbAnagNote"
no-loop
when
eval(completeRulesEnabled)
$entity: GtbAnagNote(dataIns == null)
then
modify ( $entity ) { setDataIns(UtilityLocalDate.getNow()) }
end

View File

@@ -180,7 +180,7 @@ public class PassiveInvoiceRecapObject {
DettaglioPagamentoType dettPag =
dati.getDettaglioPagamento().stream().filter(p -> p.getIBAN() != null).findFirst().orElse(null);
if (dettPag != null) {
object.setIban(dettPag.getIBAN());
object.setIban(dettPag.getIBAN().toUpperCase());
//break;
}

View File

@@ -153,7 +153,6 @@ public class PassiveInvoiceService {
message = null;
}
//saveIbanForn(recapObject.getCodAnag(), recapObject.getIban());
saveAnagForn(recapObject);
String prefixDesc = String.format("[%s - %s]", recapObject.getCodAnag(), recapObject.getRagSoc());
@@ -176,7 +175,9 @@ public class PassiveInvoiceService {
if (recapObject.getNumDoc() != null) {
String iban = recapObject.getIban();
if (iban != null){iban.toUpperCase();}
if (iban != null) {
iban.toUpperCase();
}
additionalAttachmentInfo.put(DATA_DOC_KEY, recapObject.getDate());
additionalAttachmentInfo.put(NUM_DOC_KEY, recapObject.getNumDoc());
additionalAttachmentInfo.put(TOT_DOC_KEY, recapObject.getTotDoc());
@@ -188,10 +189,10 @@ public class PassiveInvoiceService {
if (!recapObject.getScadenze().isEmpty()) {
additionalAttachmentInfo.put(SCADENZE_KEY, recapObject.getScadenze());
}
if (!recapObject.getIva().isEmpty()){
if (!recapObject.getIva().isEmpty()) {
additionalAttachmentInfo.put(CASTELLETTO_IVA_KEY, recapObject.getIva());
}
if (!recapObject.getDdt().isEmpty()){
if (!recapObject.getDdt().isEmpty()) {
additionalAttachmentInfo.put(DDT_KEY, recapObject.getDdt());
}
@@ -260,7 +261,7 @@ public class PassiveInvoiceService {
return dtbDocXml;
}).toList();
if(dtbDoxXmlList == null || dtbDoxXmlList.isEmpty()){
if (dtbDoxXmlList == null || dtbDoxXmlList.isEmpty()) {
return;
}
@@ -378,7 +379,7 @@ public class PassiveInvoiceService {
Date dataDoc = UtilityHashMap.getValueIfExists(additionalInfo, DATA_DOC_KEY);
String numDoc = UtilityHashMap.getValueIfExists(additionalInfo, NUM_DOC_KEY);
if ( parentId == null ) {
if (parentId == null) {
String regexName = ".{0,}([A-Z]{2}[a-z,A-Z,0-9]{2,28}[_][a-z,A-Z,0-9]{1,5}).{0,}";
Pattern pattern = Pattern.compile(regexName);
Matcher matcher = pattern.matcher(description);
@@ -433,7 +434,7 @@ public class PassiveInvoiceService {
}
String iban = UtilityHashMap.<String>getValueIfExists(additionalInfo, IBAN_KEY);
if ( iban != null ) {
if (iban != null) {
iban = iban.toUpperCase();
}
DtbFatturePassive fatturePassive = new DtbFatturePassive()
@@ -495,35 +496,20 @@ public class PassiveInvoiceService {
return nextId;
}
private void saveIbanForn(String codForn, String iban) throws Exception {
if (!UtilityString.isNullOrEmpty(codForn) && codForn.length() <= 5 && !UtilityString.isNullOrEmpty(iban)) {
GtbAnag gtbAnag = new GtbAnag();
gtbAnag.setCodAnag(codForn);
gtbAnag.setOperation(OperationType.NO_OP);
AtbForn atbForn = new AtbForn();
atbForn.setOperation(OperationType.UPDATE);
atbForn.setCodAnag(codForn);
atbForn.setIban(iban);
gtbAnag.setAtbForn(atbForn);
entityProcessor.processEntity(gtbAnag, true, multiDBTransactionManager);
}
}
private void saveAnagForn(PassiveInvoiceRecapObject recapObject) throws Exception {
Boolean saveIban = setupGest.getSetupBoolean(multiDBTransactionManager.getPrimaryConnection(), "DATI_AZIENDA", "FATTURAZIONE_ELETTRONICA", "SALVA_IBAN_FORN");
if (UtilityString.isNullOrEmpty(recapObject.getCodAnag()) || recapObject.getCodAnag().equalsIgnoreCase(recapObject.getErrorCodAnag())) {
GtbAnag gtbAnag = recapObject.getGtbAnag();
gtbAnag.setOperation(OperationType.INSERT);
AtbForn atbForn = new AtbForn();
atbForn.setOperation(OperationType.INSERT);
atbForn.setIban(recapObject.getIban());
GtbAnagNote gtbAnagNote = new GtbAnagNote();
gtbAnagNote.setTipoNote("CODIFICA_AUTOMATICA");
gtbAnagNote.setNote("Codice Anagrafico codificato automaticamente, verifiare che i dati siano completi");
gtbAnagNote.setFlagSegnCmov("S");
gtbAnagNote.setFlagSegnScad("S");
gtbAnagNote.setDataIns(new Date());
if (saveIban)
atbForn.setIban(recapObject.getIban());
GtbAnagNote gtbAnagNote = new GtbAnagNote()
.setTipoNote("CODIFICA_AUTOMATICA")
.setNote("Codice Anagrafico codificato automaticamente, verifiare che i dati siano completi")
.setFlagSegnCmov("S")
.setFlagSegnScad("S");
gtbAnag.getGtbAnagNote().add(gtbAnagNote);
gtbAnag.setAtbForn(atbForn);
@@ -548,19 +534,19 @@ public class PassiveInvoiceService {
throw new Exception("Il file selezionato non contiene la partita iva di quest'azienda");
}
}
for(FatturePassiveCsvDTO f: fatturePassiveCsvDTOS) {
String partIvaForn = f.getPartitaIvaFornitore().replace("'","");
for (FatturePassiveCsvDTO f : fatturePassiveCsvDTOS) {
String partIvaForn = f.getPartitaIvaFornitore().replace("'", "");
String numFattura = f.getNumFattura().replace("'", "");
Date dataDoc = f.getDataEmissione();
String progressivoSdi = f.getSdi().replace("'", "");
String sql = Query.format(
"SELECT CAST(COUNT(*) AS BIT)\n" +
"FROM dtb_fatture_passive\n" +
"WHERE part_iva = %s\n" +
" AND num_doc = %s\n" +
" AND data_doc = %s\n" +
" AND identificativo_sdi = %S",
"FROM dtb_fatture_passive\n" +
"WHERE part_iva = %s\n" +
" AND num_doc = %s\n" +
" AND data_doc = %s\n" +
" AND identificativo_sdi = %S",
partIvaForn,
numFattura,
dataDoc,
@@ -571,12 +557,12 @@ public class PassiveInvoiceService {
if (!existDoc) {
anomalie.add(AnomalieDTO.error(
String.format("%s n. %s del %s fornitore: %s progressivo sdi: %s non presente nel sistema.",
f.getTipoDocumento().replace("'", ""),
numFattura,
new SimpleDateFormat(CommonConstants.DATE_FORMAT_DMY).format(dataDoc),
f.getDenominazioneFornitore().replace("'", ""),
progressivoSdi)
));
f.getTipoDocumento().replace("'", ""),
numFattura,
new SimpleDateFormat(CommonConstants.DATE_FORMAT_DMY).format(dataDoc),
f.getDenominazioneFornitore().replace("'", ""),
progressivoSdi)
));
}
}

View File

@@ -49,6 +49,19 @@ public class AgribookOrderController {
}
@RequestMapping(value = "v2", method = RequestMethod.GET)
public @ResponseBody
ServiceRestResponse paginatedRetrieveOrders(@RequestBody(required = false) AgribookRetrieveOrdersRequestDTO agribookRetrieveOrdersRequestDTO) throws Exception {
return ServiceRestResponse.createPositiveResponse(agribookOrderService.paginatedRetrieveOrders(agribookRetrieveOrdersRequestDTO));
}
@PutMapping
public @ResponseBody
ServiceRestResponse updateOrders(@RequestBody ArrayList<AgribookOrderDTO> agribookOrderDTOList) throws Exception {
agribookOrderService.updateOrders(agribookOrderDTOList);
return ServiceRestResponse.createPositiveResponse();
}
@RequestMapping(value = "updatePercClassi", method = RequestMethod.POST)
public @ResponseBody

View File

@@ -16,6 +16,7 @@ import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.*;
import it.integry.ems_model.utility.dto.IndirizzoDTO;
import it.integry.ems_model.utility.dto.PaginatedDTO;
import org.apache.commons.text.StringSubstitutor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
@@ -116,7 +117,7 @@ public class AgribookOrderService {
" mtb_aart.cod_mtip,\n" +
" mtb_tipi.descrizione AS macro_varieta,\n" +
" CAST(ISNULL(mtb_partita_mag_carat.val_carat, 0) AS INT) AS num_piante,\n" +
" CAST(ISNULL(carat_superficie.val_carat, 0) AS FLOAT) AS superficie,\n" +
" CAST(ISNULL(carat_superficie.val_carat, 0) AS NUMERIC(7, 2)) AS superficie,\n" +
" evase_totalmente\n" +
" FROM opened_orders\n" +
" INNER JOIN gtb_anag ON opened_orders.cod_anag = gtb_anag.cod_anag\n" +
@@ -409,6 +410,423 @@ public class AgribookOrderService {
return results;
}
public PaginatedDTO<AgribookOrderDTO> paginatedRetrieveOrders(AgribookRetrieveOrdersRequestDTO agribookRetrieveOrdersRequestDTO) throws Exception {
String sql = Query.format(
"WITH opened_orders AS (SELECT dtb_ordt.gestione,\n" +
" dtb_ordt.data_ord,\n" +
" dtb_ordt.num_ord,\n" +
" dtb_ordt.cod_anag,\n" +
" dtb_ordt.cod_vdes,\n" +
" dtb_ordt.cod_mdep,\n" +
" dtb_ordt.netto_merce,\n" +
" dtb_ordr.cod_mart,\n" +
" dtb_ordr.descrizione AS varieta,\n" +
" dtb_ordr.partita_mag,\n" +
" dtb_ordr.unt_ord,\n" +
" MIN(dtb_ordr.data_cons) AS data_cons_min,\n" +
" MAX(dtb_ordr.data_cons) AS data_cons_max,\n" +
" SUM(dtb_ordr.qta_ord) AS qta_prevista,\n" +
" SUM(dtb_ordr.qta_evasa) AS qta_evasa,\n" +
" CASE\n" +
" WHEN SUM(dtb_ordr.qta_ord - dtb_ordr.qta_evasa) < 0 THEN 0\n" +
" ELSE SUM(dtb_ordr.qta_ord - dtb_ordr.qta_evasa) END AS qta_residua,\n" +
" CAST(CASE\n" +
" WHEN\n" +
" COUNT(CASE WHEN flag_evaso = 'I' THEN 1 END) = 0\n" +
" THEN 1\n" +
" ELSE 0\n" +
" END AS BIT) AS evase_totalmente\n" +
" FROM dtb_ordt\n" +
" INNER JOIN dtb_ordr ON dtb_ordt.gestione = dtb_ordr.gestione AND\n" +
" dtb_ordt.data_ord = dtb_ordr.data_ord AND\n" +
" dtb_ordt.num_ord = dtb_ordr.num_ord\n" +
" WHERE dtb_ordt.gestione = 'A'\n" +
" AND dtb_ordt.gestione_rif IS NULL\n" +
" AND dtb_ordr.flag_evaso <> 'A'\n" +
" GROUP BY dtb_ordt.cod_anag, dtb_ordt.cod_vdes, dtb_ordt.cod_mdep,\n" +
" dtb_ordr.unt_ord, dtb_ordt.gestione, dtb_ordt.data_ord, dtb_ordt.num_ord,\n" +
" dtb_ordr.cod_mart,\n" +
" dtb_ordr.descrizione, dtb_ordr.partita_mag,\n" +
" dtb_ordt.netto_merce),\n" +
" result AS (SELECT CONCAT(gestione, '-', data_ord, '-', num_ord) AS id,\n" +
" gestione,\n" +
" data_ord,\n" +
" YEAR(data_ord) AS anno,\n" +
" num_ord,\n" +
" opened_orders.cod_anag,\n" +
" cod_vdes,\n" +
" cod_mdep,\n" +
" netto_merce,\n" +
" opened_orders.cod_mart,\n" +
" varieta,\n" +
" opened_orders.partita_mag,\n" +
" unt_ord,\n" +
" data_cons_min,\n" +
" data_cons_max,\n" +
" qta_prevista,\n" +
" qta_attesa AS qta_prevista_iniziale,\n" +
" qta_evasa,\n" +
" qta_residua,\n" +
" mtb_aart.cod_mtip,\n" +
" mtb_tipi.descrizione AS macro_varieta,\n" +
" CAST(ISNULL(mtb_partita_mag_carat.val_carat, 0) AS INT) AS num_piante,\n" +
" CAST(ISNULL(carat_superficie.val_carat, 0) AS NUMERIC(7, 2)) AS superficie,\n" +
" evase_totalmente\n" +
" FROM opened_orders\n" +
" INNER JOIN gtb_anag ON opened_orders.cod_anag = gtb_anag.cod_anag\n" +
" LEFT OUTER JOIN mtb_aart ON opened_orders.cod_mart = mtb_aart.cod_mart\n" +
" LEFT OUTER JOIN mtb_tipi ON mtb_aart.cod_mtip = mtb_tipi.cod_mtip\n" +
" LEFT OUTER JOIN mtb_partita_mag\n" +
" ON opened_orders.partita_mag = mtb_partita_mag.partita_mag AND\n" +
" opened_orders.cod_mart = mtb_partita_mag.cod_mart\n" +
" LEFT OUTER JOIN mtb_partita_mag_carat\n" +
" ON opened_orders.partita_mag = mtb_partita_mag_carat.partita_mag AND\n" +
" opened_orders.cod_mart = mtb_partita_mag_carat.cod_mart AND\n" +
" mtb_partita_mag_carat.carat = 'n-piante'\n" +
" LEFT OUTER JOIN mtb_partita_mag_carat carat_superficie\n" +
" ON opened_orders.partita_mag = carat_superficie.partita_mag AND\n" +
" opened_orders.cod_mart = carat_superficie.cod_mart AND\n" +
" carat_superficie.carat = 'superficie'\n" +
" WHERE mtb_aart.cod_mgrp = dbo.getGestSetup('CRUSCOTTO_PRODUZIONE', 'SETUP', 'COD_MGRP_MP')),\n" +
" activities AS (SELECT MAX(estimated_time) AS estimated_time,\n" +
" cod_anag,\n" +
" cod_vdes,\n" +
" cod_mart,\n" +
" partita_mag\n" +
" FROM stb_activity\n" +
" WHERE estimated_endtime IS NULL\n" +
" AND activity_type_id = 'RILEVAZIONE'\n" +
" GROUP BY cod_anag,\n" +
" cod_vdes,\n" +
" cod_mart,\n" +
" partita_mag),\n" +
" my_activities AS (SELECT DISTINCT user_name,\n" +
" cod_anag,\n" +
" cod_vdes,\n" +
" cod_mart,\n" +
" partita_mag,\n" +
" 1 AS any_activity\n" +
" FROM stb_activity\n" +
" WHERE estimated_endtime IS NULL\n" +
" AND activity_type_id = 'RILEVAZIONE'\n" +
" AND user_name = %s),\n" +
" attachments AS (SELECT mrl_partita_mag_attached.cod_mart,\n" +
" mrl_partita_mag_attached.partita_mag,\n" +
" COUNT(*) AS attachment_number\n" +
" FROM mrl_partita_mag_attached\n" +
" GROUP BY mrl_partita_mag_attached.cod_mart, mrl_partita_mag_attached.partita_mag),\n" +
" TempResult AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_number,\n" +
" *\n" +
" FROM (SELECT result.*,\n" +
" activities.estimated_time AS next_activity,\n" +
" CAST(ISNULL(my_activities.any_activity, 0) AS BIT) AS any_activity,\n" +
" ISNULL(attachments.attachment_number, 0) AS attachments_count\n" +
" FROM result\n" +
" LEFT OUTER JOIN activities ON\n" +
" result.cod_mart = activities.cod_mart AND\n" +
" result.partita_mag = activities.partita_mag AND\n" +
" result.cod_anag = activities.cod_anag AND\n" +
" result.cod_vdes = activities.cod_vdes\n" +
" LEFT OUTER JOIN my_activities ON\n" +
" result.cod_mart = my_activities.cod_mart AND\n" +
" result.partita_mag = my_activities.partita_mag AND\n" +
" result.cod_anag = my_activities.cod_anag AND\n" +
" result.cod_vdes = my_activities.cod_vdes\n" +
" LEFT OUTER JOIN attachments ON\n" +
" attachments.cod_mart = result.cod_mart AND\n" +
" attachments.partita_mag = result.partita_mag) t\n" +
" WHERE [filter]),\n" +
" TempCount AS (SELECT COUNT(*) AS rows_count\n" +
" FROM TempResult)\n" +
"SELECT TempCount.*,\n" +
" TempResult.*\n" +
"FROM TempResult,\n" +
" TempCount\n" +
"ORDER BY [orderBy]",
userSession.getUsername()
);
PaginatedDTO<AgribookOrderDTO> results = UtilityDB.executePaginatedQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, AgribookOrderDTO.class, agribookRetrieveOrdersRequestDTO);
//Filling mtbPartitaMag
List<MtbPartitaMag> partitaMagList = Stream.of(results.getData())
.map(x -> {
MtbPartitaMag mtbPartitaMag = new MtbPartitaMag()
.setCodMart(x.getCodMart())
.setPartitaMag(x.getPartitaMag());
mtbPartitaMag.setOperation(OperationType.SELECT_OBJECT);
return mtbPartitaMag;
})
.distinct()
.toList();
entityProcessor.processEntityList(partitaMagList, true);
//Filling vtbDest
List<VtbDest> vtbDestList = Stream.of(results.getData())
.map(x -> {
VtbDest vtbDest = new VtbDest()
.setCodVdes(x.getCodVdes())
.setCodAnag(x.getCodAnag());
vtbDest.setOperation(OperationType.SELECT_OBJECT);
return vtbDest;
})
.distinct()
.toList();
entityProcessor.processEntityList(vtbDestList, true);
//Filling gtbAnag
List<GtbAnag> gtbAnagList = Stream.of(results.getData())
.map(x -> {
GtbAnag gtbAnag = new GtbAnag()
.setCodAnag(x.getCodAnag());
gtbAnag.setOperation(OperationType.SELECT_OBJECT);
return gtbAnag;
})
.distinct()
.toList();
entityProcessor.processEntityList(gtbAnagList, true);
//Filling mtbDepo
List<String> mtbDepoSearchList = Stream.of(results.getData())
.map(AgribookOrderDTO::getCodMdep)
.distinct()
.withoutNulls()
.toList();
List<MtbDepo> mtbDepoList = null;
List<MtbDepoPosizioni> mtbDepoPosizioniList = null;
if (!mtbDepoSearchList.isEmpty()) {
mtbDepoList = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(),
"SELECT * FROM mtb_depo WHERE cod_mdep IN (" + UtilityQuery.concatStringFieldsWithSeparator(mtbDepoSearchList, ", ") + ")", MtbDepo.class);
mtbDepoPosizioniList = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(),
"SELECT * FROM " + MtbDepoPosizioni.ENTITY + " WHERE cod_mdep IN (" + UtilityQuery.concatStringFieldsWithSeparator(mtbDepoSearchList, ", ") + ")", MtbDepoPosizioni.class);
}
if (mtbDepoPosizioniList == null) mtbDepoPosizioniList = new ArrayList<>();
List<Object> idPosizioniToLook = Stream.of(mtbDepoPosizioniList)
.map(x -> (Object) x.getIdPosizione())
.distinct()
.withoutNulls()
.toList();
if (!idPosizioniToLook.isEmpty()) {
List<StbPosizioni> stbPosizioniList = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(),
"SELECT * FROM " + StbPosizioni.ENTITY + " WHERE id IN (" + UtilityQuery.concatObjectFieldsWithSeparator(idPosizioniToLook, ", ") + ")", StbPosizioni.class);
if (stbPosizioniList != null)
for (MtbDepoPosizioni mtbDepoPosizioni : mtbDepoPosizioniList) {
mtbDepoPosizioni.setStbPosizioni(Stream.of(stbPosizioniList).filter(x -> Objects.equals(x.getId(), mtbDepoPosizioni.getIdPosizione())).findFirst().orElse(null));
}
}
List<AgribookReportDTO> allReports = null;
if (agribookRetrieveOrdersRequestDTO != null && agribookRetrieveOrdersRequestDTO.isLoadReports()) {
allReports = agribookReportService.retrieveReports(results.getData(), true);
}
List<AgribookRaccoltaDTO> allRaccolte = null;
if (agribookRetrieveOrdersRequestDTO != null && agribookRetrieveOrdersRequestDTO.isLoadRaccolte()) {
allRaccolte = agribookReportService.retrieveRaccolte(results.getData());
}
for (AgribookOrderDTO agribookOrderDTO : results.getData()) {
if (mtbDepoList != null) {
//MtbDepo
Optional<MtbDepo> foundMtbDepo = Stream.of(mtbDepoList)
.filter(x -> x.getCodMdep().equalsIgnoreCase(agribookOrderDTO.getCodMdep()))
.findFirst();
if (foundMtbDepo.isPresent()) {
agribookOrderDTO.setMtbDepo(foundMtbDepo.get());
}
}
//MtbPartitaMag
Optional<MtbPartitaMag> foundMtbPartMag = Stream.of(partitaMagList)
.filter(x -> x.getCodMart().equals(agribookOrderDTO.getCodMart()) &&
x.getPartitaMag().equals(agribookOrderDTO.getPartitaMag()))
.findFirst();
if (foundMtbPartMag.isPresent()) {
agribookOrderDTO.setMtbPartitaMag(foundMtbPartMag.get());
String campo = foundMtbPartMag.get().getPosizione();
if (!UtilityString.isNullOrEmpty(campo)) {
MtbDepoPosizioni mtbDepoPosizione = Stream.of(mtbDepoPosizioniList)
.filter(x -> x.getPosizione().equalsIgnoreCase(campo))
.findFirst().orElse(null);
if (mtbDepoPosizione != null && mtbDepoPosizione.getStbPosizioni() != null) {
agribookOrderDTO.setDestinatario(AgribookDestinatarioDTO.fromStbPosizione(mtbDepoPosizione.getStbPosizioni()));
}
}
}
//VtbDest
if (agribookOrderDTO.getCodVdes() != null) {
Optional<VtbDest> foundVtbDest = Stream.of(vtbDestList)
.filter(x -> ((x.getCodVdes() == null && agribookOrderDTO.getCodVdes() == null) || (x.getCodVdes() != null && x.getCodVdes().equals(agribookOrderDTO.getCodVdes()))) &&
x.getCodAnag().equals(agribookOrderDTO.getCodAnag()))
.findFirst();
if (foundVtbDest.isPresent()) {
if (agribookOrderDTO.getDestinatario() == null)
agribookOrderDTO.setDestinatario(AgribookDestinatarioDTO.fromVtbDest(foundVtbDest.get()));
else {
agribookOrderDTO.getDestinatario().setDestinatario(foundVtbDest.get().getDestinatario())
.setNumeroTelefono(foundVtbDest.get().getTel())
.setSocieta(false)
.setCap(foundVtbDest.get().getCap())
.setCitta(foundVtbDest.get().getCitta())
.setIndirizzo(foundVtbDest.get().getIndirizzo())
.setProv(foundVtbDest.get().getProv());
}
}
} else {
Optional<GtbAnag> foundGtbAnag = Stream.of(gtbAnagList)
.filter(x -> x.getCodAnag().equals(agribookOrderDTO.getCodAnag()))
.findFirst();
if (foundGtbAnag.isPresent()) {
if (agribookOrderDTO.getDestinatario() == null)
agribookOrderDTO.setDestinatario(AgribookDestinatarioDTO.fromGtbAnag(foundGtbAnag.get()));
else {
agribookOrderDTO.getDestinatario().setDestinatario(foundGtbAnag.get().getRagSoc())
.setNumeroTelefono(foundGtbAnag.get().getTelefono())
.setSocieta(true)
.setCap(foundGtbAnag.get().getCap())
.setCitta(foundGtbAnag.get().getCitta())
.setIndirizzo(foundGtbAnag.get().getIndirizzo())
.setProv(foundGtbAnag.get().getProv());
}
}
}
final short initialWeekDayShort = Short.parseShort(setupGest.getSetup("PVM", "DELIVERY_PLAN", "GIORNO_INIZIO_SETTIMANA"));
if (allReports != null) {
List<AgribookReportDTO> reports = allReports.stream()
.filter(x -> x.getCodMart().equalsIgnoreCase(agribookOrderDTO.getCodMart())
&& x.getPartitaMag().equalsIgnoreCase(agribookOrderDTO.getPartitaMag())
).collect(Collectors.toList());
agribookOrderDTO.setPrevisioniRaccolta(
Stream.of(reports)
.filter(x -> x.getPrevRaccNumSett() != null && x.getPrevRaccNumSett() >= UtilityDate.dateToWeekNumber(LocalDate.now(), initialWeekDayShort))
.groupBy(agribookReportDTO -> agribookReportDTO.getPrevRaccNumSett() == null ? "" : agribookReportDTO.getPrevRaccNumSett().toString())
.map(reportsGroup -> {
AgribookReportDTO lastReport = Iterables.getLast(reportsGroup.getValue());
int lastPrevRaccQtaSett = lastReport.getPrevRaccQtaSett() == null ? 0 : lastReport.getPrevRaccQtaSett();
int sumQtaClassePremium = lastPrevRaccQtaSett
* lastReport.getPrevRaccPercClassePremium() / 100;
int sumQtaClasse1 = lastPrevRaccQtaSett
* lastReport.getPrevRaccPercClasse1() / 100;
int sumQtaClasse2 = lastPrevRaccQtaSett
* lastReport.getPrevRaccPercClasse2() / 100;
return new AgribookPrevRaccoltaDTO()
.setDataRilevazione(lastReport.getDataRilevazione())
.setNumSettimana(reportsGroup.getKey().equalsIgnoreCase("") ? null : Integer.valueOf(reportsGroup.getKey()))
.setQtaSettimana(lastPrevRaccQtaSett)
.setPercClassePremium(Float.valueOf((float) sumQtaClassePremium / lastPrevRaccQtaSett * 100).intValue())
.setPercClasse1(Float.valueOf((float) sumQtaClasse1 / lastPrevRaccQtaSett * 100).intValue())
.setPercClasse2(Float.valueOf((float) sumQtaClasse2 / lastPrevRaccQtaSett * 100).intValue());
})
.toList()
);
}
sql = Query.format(
"SELECT mtb_colr.data_collo AS 'data', SUM(mtb_colr.qta_col) AS 'qta', jtb_flav.nome AS 'squadra'\n" +
"FROM dtb_ordr\n" +
" INNER JOIN dtb_ordt ON dtb_ordr.gestione = dtb_ordt.gestione AND\n" +
" dtb_ordr.data_ord = dtb_ordt.data_ord AND\n" +
" dtb_ordr.num_ord = dtb_ordt.num_ord\n" +
" INNER JOIN gtb_anag ON dtb_ordt.cod_anag = gtb_anag.cod_anag\n" +
" INNER JOIN azienda ON azienda.part_iva <> ISNULL(gtb_anag.part_iva, '')\n" +
" INNER JOIN mtb_colt ON mtb_colt.gestione = dtb_ordt.gestione AND\n" +
" mtb_colt.data_ord = dtb_ordt.data_ord AND\n" +
" mtb_colt.num_ord = dtb_ordt.num_ord\n" +
" INNER JOIN mtb_colr ON mtb_colt.gestione = mtb_colr.gestione AND\n" +
" mtb_colt.data_collo = mtb_colr.data_collo AND\n" +
" mtb_colt.ser_collo = mtb_colr.ser_collo AND\n" +
" mtb_colt.num_collo = mtb_colr.num_collo\n" +
" INNER JOIN jtb_lotr ON jtb_lotr.num_ord = dtb_ordr.num_ord AND\n" +
" jtb_lotr.data_ord = dtb_ordr.data_ord AND\n" +
" jtb_lotr.gestione = dtb_ordr.gestione\n" +
" INNER JOIN jtb_lott ON jtb_lott.id_lotto = jtb_lotr.id_lotto AND\n" +
" jtb_lott.cod_jfas = jtb_lotr.cod_jfas\n" +
" INNER JOIN jtb_flav ON jtb_lott.cod_jflav = jtb_flav.cod_jflav\n" +
"WHERE dtb_ordr.gestione = 'L'\n" +
" AND dtb_ordr.cod_mart = %s\n" +
" AND dtb_ordr.partita_mag = %s\n" +
" AND mtb_colt.segno = 1\n" +
" AND YEAR(dtb_ordr.data_ord) = YEAR(%s)\n" +
"GROUP BY mtb_colr.data_collo, jtb_flav.nome",
agribookOrderDTO.getCodMart(),
agribookOrderDTO.getPartitaMag(),
agribookOrderDTO.getDataOrd());
agribookOrderDTO.setStoricoRaccolta(UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, AgribookHarvestHistoryDTO.class));
if (allRaccolte != null) {
List<AgribookRaccoltaDTO> raccolte = allRaccolte.stream()
.filter(x -> x.getCodMart().equalsIgnoreCase(agribookOrderDTO.getCodMart())
&& x.getPartitaMag().equalsIgnoreCase(agribookOrderDTO.getPartitaMag())
).collect(Collectors.toList());
agribookOrderDTO.setRaccolte(raccolte);
}
}
return results;
}
public void updateOrders(ArrayList<AgribookOrderDTO> agribookOrderDTOList) throws Exception {
for (AgribookOrderDTO order : agribookOrderDTOList) {
DtbOrdr dtbOrdr = new DtbOrdr()
.setRigaOrd(1)
.setQtaOrd(order.getQtaPrevista());
dtbOrdr.setOperation(OperationType.UPDATE);
DtbOrdt dtbOrdt = new DtbOrdt()
.setGestione(order.getGestione())
.setDataOrd(order.getDataOrd())
.setNumOrd(order.getNumOrd())
.setDtbOrdr(new ArrayList<>());
dtbOrdt.setOperation(OperationType.NO_OP);
dtbOrdt.getDtbOrdr().add(dtbOrdr);
entityProcessor.processEntity(dtbOrdt, true, multiDBTransactionManager);
MtbPartitaMag mtbPartitaMag = new MtbPartitaMag()
.setPartitaMag(order.getPartitaMag())
.setCodMart(order.getCodMart())
.setNote(order.getMtbPartitaMag().getNote());
mtbPartitaMag.setOperation(OperationType.INSERT_OR_UPDATE);
entityProcessor.processEntity(mtbPartitaMag, true, multiDBTransactionManager);
this.savePiantePartita(order.getCodMart(), order.getPartitaMag(), order.getCodAnag(), order.getCodVdes(), order.getNumPiante());
this.saveSuperficie(order.getCodMart(), order.getPartitaMag(), order.getCodAnag(), order.getCodVdes(), order.getSuperficie());
}
}
public void updatePercClassi(String codMart, String partitaMag, int newPercClasse1, int newPercClasse2, int newPercClassePremium) throws Exception {
LocalDateTime dataRilevazione = UtilityLocalDate.getNowTime();
@@ -494,26 +912,6 @@ public class AgribookOrderService {
}
public void savePiantePartita(String codMart, String partitaMag, String codAnag, String codVdes, int piantePartita) throws Exception {
StbActivity stbActivity = agribookActivityService.postActivity(
OperationType.INSERT,
codAnag,
codVdes,
codMart,
partitaMag,
null,
null,
null,
"Aggiornamento numero piante a " + piantePartita,
null
);
MtbPartitaMagCarat caratActivityId = new MtbPartitaMagCarat()
.setDataRilevazione(UtilityLocalDate.getNowTime())
.setCarat("activity-id")
.setValCarat(stbActivity.getActivityId());
caratActivityId.setOperation(OperationType.INSERT);
String sql = "SELECT CASE\n" +
" WHEN\n" +
" (SELECT mtb_partita_mag_carat.id_riga\n" +
@@ -533,15 +931,45 @@ public class AgribookOrderService {
" WHERE cod_mart = '${codMart}'\n" +
" AND partita_mag = '${partitaMag}'\n" +
" GROUP BY cod_mart, partita_mag), 0) + 1)\n" +
" END id_riga;\n";
" END id_riga,\n" +
" (SELECT CAST(mtb_partita_mag_carat.val_carat AS INTEGER)\n" +
" FROM mtb_partita_mag_carat\n" +
" WHERE cod_mart = '${codMart}'\n" +
" AND partita_mag = '${partitaMag}'\n" +
" AND carat = 'n-piante') AS val_carat";
Map<String, String> valuesMap = ImmutableMap.of("codMart", codMart, "partitaMag", partitaMag);
StringSubstitutor substitutor = new StringSubstitutor(valuesMap);
Integer idRiga = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), substitutor.replace(sql));
HashMap<String, Object> rowNPiante = UtilityDB.executeSimpleQueryOnlyFirstRow(multiDBTransactionManager.getPrimaryConnection(), substitutor.replace(sql));
Integer valCarat = UtilityHashMap.getValueIfExists(rowNPiante, "val_carat");
if (valCarat != null && valCarat == piantePartita) {
return;
}
StbActivity stbActivity = agribookActivityService.postActivity(
OperationType.INSERT,
codAnag,
codVdes,
codMart,
partitaMag,
null,
null,
null,
"Aggiornamento numero piante a " + piantePartita,
null
);
MtbPartitaMagCarat caratActivityId = new MtbPartitaMagCarat()
.setDataRilevazione(UtilityLocalDate.getNowTime())
.setCarat("activity-id")
.setValCarat(stbActivity.getActivityId());
caratActivityId.setOperation(OperationType.INSERT);
MtbPartitaMagCarat caratNPiante = new MtbPartitaMagCarat()
.setIdRiga(idRiga)
.setIdRiga(UtilityHashMap.getValueIfExists(rowNPiante, "id_riga"))
.setCarat("n-piante")
.setValCarat(String.valueOf(piantePartita))
.setDataRilevazione(UtilityLocalDate.getNowTime());
@@ -558,7 +986,85 @@ public class AgribookOrderService {
mtbPartitaMag.getMtbPartitaMagCarat().add(caratNPiante);
mtbPartitaMag.getMtbPartitaMagCarat().add(caratActivityId);
entityProcessor.processEntity(mtbPartitaMag, multiDBTransactionManager);
entityProcessor.processEntity(mtbPartitaMag, true, multiDBTransactionManager);
}
public void saveSuperficie(String codMart, String partitaMag, String codAnag, String codVdes, BigDecimal superficie) throws Exception {
String sql = "SELECT CASE\n" +
" WHEN\n" +
" (SELECT mtb_partita_mag_carat.id_riga\n" +
" FROM mtb_partita_mag_carat\n" +
" WHERE cod_mart = '${codMart}'\n" +
" AND partita_mag = '${partitaMag}'\n" +
" AND carat = 'superficie') IS NOT NULL\n" +
" THEN\n" +
" (SELECT mtb_partita_mag_carat.id_riga\n" +
" FROM mtb_partita_mag_carat\n" +
" WHERE cod_mart = '${codMart}'\n" +
" AND partita_mag = '${partitaMag}'\n" +
" AND carat = 'superficie')\n" +
" ELSE\n" +
" (SELECT ISNULL((SELECT MAX(id_riga)\n" +
" FROM mtb_partita_mag_carat\n" +
" WHERE cod_mart = '${codMart}'\n" +
" AND partita_mag = '${partitaMag}'\n" +
" GROUP BY cod_mart, partita_mag), 0) + 1)\n" +
" END id_riga,\n" +
" (SELECT CAST(mtb_partita_mag_carat.val_carat AS NUMERIC(7, 2))\n" +
" FROM mtb_partita_mag_carat\n" +
" WHERE cod_mart = '${codMart}'\n" +
" AND partita_mag = '${partitaMag}'\n" +
" AND carat = 'superficie') AS val_carat";
Map<String, String> valuesMap = ImmutableMap.of("codMart", codMart, "partitaMag", partitaMag);
StringSubstitutor substitutor = new StringSubstitutor(valuesMap);
HashMap<String, Object> rowSuperficie = UtilityDB.executeSimpleQueryOnlyFirstRow(multiDBTransactionManager.getPrimaryConnection(), substitutor.replace(sql));
BigDecimal valCarat = UtilityHashMap.getValueIfExists(rowSuperficie, "val_carat");
if (UtilityBigDecimal.equalsTo(valCarat, superficie)) {
return;
}
StbActivity stbActivity = agribookActivityService.postActivity(
OperationType.INSERT,
codAnag,
codVdes,
codMart,
partitaMag,
null,
null,
null,
"Aggiornamento superficie a " + superficie,
null
);
MtbPartitaMagCarat caratActivityId = new MtbPartitaMagCarat()
.setDataRilevazione(UtilityLocalDate.getNowTime())
.setCarat("activity-id")
.setValCarat(stbActivity.getActivityId());
caratActivityId.setOperation(OperationType.INSERT);
MtbPartitaMagCarat caratSuperficie = new MtbPartitaMagCarat()
.setIdRiga(UtilityHashMap.getValueIfExists(rowSuperficie, "id_riga"))
.setCarat("superficie")
.setValCarat(String.valueOf(superficie))
.setDataRilevazione(UtilityLocalDate.getNowTime());
caratSuperficie.setOperation(OperationType.INSERT_OR_UPDATE);
MtbPartitaMag mtbPartitaMag = new MtbPartitaMag()
.setCodMart(codMart)
.setPartitaMag(partitaMag)
.setMtbPartitaMagCarat(new ArrayList<>());
mtbPartitaMag.setOperation(OperationType.NO_OP);
mtbPartitaMag.getMtbPartitaMagCarat().add(caratSuperficie);
mtbPartitaMag.getMtbPartitaMagCarat().add(caratActivityId);
entityProcessor.processEntity(mtbPartitaMag, true, multiDBTransactionManager);
}
public List<EntityBase> syncQtaResidua(@Nullable List<DtbOrdr> orders) throws Exception {

View File

@@ -5,10 +5,7 @@ import com.annimon.stream.Stream;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.json.ResponseJSONObjectMapper;
import it.integry.ems.media.MimeTypesHandler;
import it.integry.ems.production.agribook.model.AgribookMediaAttachmentDTO;
import it.integry.ems.production.agribook.model.AgribookOrderDTO;
import it.integry.ems.production.agribook.model.AgribookReportDTO;
import it.integry.ems.production.agribook.model.AgribookReportPostResponseDTO;
import it.integry.ems.production.agribook.model.*;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.entity.MtbPartitaMag;
@@ -16,10 +13,7 @@ import it.integry.ems_model.entity.MtbPartitaMagCarat;
import it.integry.ems_model.entity.StbActivity;
import it.integry.ems_model.entity.StbActivityFile;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityLocalDate;
import it.integry.ems_model.utility.UtilityQuery;
import it.integry.ems_model.utility.UtilityString;
import it.integry.ems_model.utility.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.http.MediaType;
@@ -53,6 +47,21 @@ public class AgribookReportService {
@Autowired
private RequestDataDTO requestDataDTO;
public static final class ReportKeys {
public static final String CALIBRO_KEY = "calibro";
public static final String BRIX_KEY = "grado-brix";
public static final String COLORE_KEY = "colore";
public static final String PESO_KEY = "peso";
public static final String DESTINAZIONE_KEY = "destinazione";
public static final String PREV_RACC_NUM_SETT_KEY = "prev-racc-num-sett";
public static final String PREV_RACC_QTA_KEY = "prev-racc-qta";
public static final String PREV_RACC_PERC_CLASSE_PREMIUM_KEY = "prev-racc-perc-classe-premium";
public static final String PREV_RACC_PERC_CLASSE_1_KEY = "prev-racc-perc-classe-1";
public static final String PREV_RACC_PERC_CLASSE_2_KEY = "prev-racc-perc-classe-2";
public static final String NOTE_KEY = "note";
public static final String ACTIVITY_ID_KEY = "activity-id";
}
public List<AgribookReportDTO> retrieveReports(List<AgribookOrderDTO> orders) throws Exception {
return this.retrieveReports(orders, true);
}
@@ -295,7 +304,6 @@ public class AgribookReportService {
return optNote.isPresent() ? optNote.get().getValCarat() : null;
}
private MtbPartitaMagCarat createCaratValue(String key, String value, AgribookReportDTO agribookReportDTO, boolean update) throws Exception {
MtbPartitaMagCarat mtbPartitaMagCarat = new MtbPartitaMagCarat()
@@ -340,18 +348,43 @@ public class AgribookReportService {
return mtbPartitaMagCarat;
}
public static final class ReportKeys {
public static final String CALIBRO_KEY = "calibro";
public static final String BRIX_KEY = "grado-brix";
public static final String COLORE_KEY = "colore";
public static final String PESO_KEY = "peso";
public static final String DESTINAZIONE_KEY = "destinazione";
public static final String PREV_RACC_NUM_SETT_KEY = "prev-racc-num-sett";
public static final String PREV_RACC_QTA_KEY = "prev-racc-qta";
public static final String PREV_RACC_PERC_CLASSE_PREMIUM_KEY = "prev-racc-perc-classe-premium";
public static final String PREV_RACC_PERC_CLASSE_1_KEY = "prev-racc-perc-classe-1";
public static final String PREV_RACC_PERC_CLASSE_2_KEY = "prev-racc-perc-classe-2";
public static final String NOTE_KEY = "note";
public static final String ACTIVITY_ID_KEY = "activity-id";
public List<AgribookRaccoltaDTO> retrieveRaccolte(List<AgribookOrderDTO> orders) throws Exception {
if (UtilityList.isNullOrEmpty(orders)) {
return new ArrayList<>();
}
String sql = "SELECT DISTINCT ddr.cod_anag,\n" +
" ddr.cod_dtip,\n" +
" ddr.data_doc,\n" +
" ddr.ser_doc,\n" +
" ddr.num_doc,\n" +
" CAST(DATEPART(ISO_WEEK, ddr.data_doc) AS TINYINT) AS settimana,\n" +
" ddr.unt_doc,\n" +
" SUM(ddr.qta_doc) AS qta_doc,\n" +
" do.cod_mart,\n" +
" do.partita_mag\n" +
"FROM dtb_docr ddr\n" +
" INNER JOIN dtb_ordr do ON ddr.data_ord = do.data_ord AND ddr.num_ord = do.num_ord\n" +
"WHERE do.gestione = 'A'\n";
List<HashMap<String, Object>> filter = Stream.of(orders)
.map(x -> {
HashMap<String, Object> tmp = new HashMap<>();
tmp.put("do.cod_mart", x.getCodMart());
tmp.put("do.partita_mag", x.getPartitaMag());
return tmp;
}).toList();
sql += "AND (" + UtilityQuery.concatFieldListInWhereCond(filter) + ")\n";
sql += "GROUP BY ddr.cod_anag, ddr.cod_dtip, ddr.data_doc, ddr.ser_doc, ddr.num_doc, ddr.unt_doc, do.cod_mart, do.partita_mag\n";
sql += "ORDER BY ddr.data_doc, ddr.num_doc";
List<AgribookRaccoltaDTO> raccolte = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, AgribookRaccoltaDTO.class);
if (raccolte == null) {
raccolte = new ArrayList<>();
}
return raccolte;
}
}

View File

@@ -1,6 +1,7 @@
package it.integry.ems.production.agribook.model;
import it.integry.ems_model.annotation.SqlField;
import it.integry.ems_model.annotation.Table;
import it.integry.ems_model.base.ComposedEntityBase;
import it.integry.ems_model.entity.MtbDepo;
import it.integry.ems_model.entity.MtbPartitaMag;
@@ -12,12 +13,15 @@ import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Table(AgribookOrderDTO.ENTITY)
public class AgribookOrderDTO extends ComposedEntityBase {
private final static Logger logger = LogManager.getLogger();
public static final String ENTITY = "agribook_order_composed";
@SqlField("id")
private String id;
@SqlField("gestione")
private String gestione;
@SqlField("data_ord")
@@ -83,12 +87,22 @@ public class AgribookOrderDTO extends ComposedEntityBase {
private List<AgribookOrderAttachmentDTO> attachments;
private List<AgribookRaccoltaDTO> raccolte;
public AgribookOrderDTO() {
super(logger);
onlyPkMaster = false;
setOperation(OperationType.SELECT_OBJECT);
}
public String getId() {
return id;
}
public AgribookOrderDTO setId(String id) {
this.id = id;
return this;
}
public String getGestione() {
return gestione;
@@ -377,4 +391,13 @@ public class AgribookOrderDTO extends ComposedEntityBase {
this.storicoRaccolta = storicoRaccolta;
return this;
}
public List<AgribookRaccoltaDTO> getRaccolte() {
return raccolte;
}
public AgribookOrderDTO setRaccolte(List<AgribookRaccoltaDTO> raccolte) {
this.raccolte = raccolte;
return this;
}
}

View File

@@ -0,0 +1,116 @@
package it.integry.ems.production.agribook.model;
import it.integry.ems_model.annotation.SqlField;
import java.math.BigDecimal;
import java.time.LocalDate;
public class AgribookRaccoltaDTO {
@SqlField("cod_anag")
private String codAnag;
@SqlField("cod_dtip")
private String codDtip;
@SqlField("data_doc")
private LocalDate dataDoc;
@SqlField("num_doc")
private Integer numDoc;
@SqlField("settimana")
private Short settimana;
@SqlField("unt_doc")
private String untDoc;
@SqlField("qta_doc")
private BigDecimal qtaDoc;
@SqlField("cod_mart")
private String codMart;
@SqlField("partita_mag")
private String partitaMag;
public String getCodAnag() {
return codAnag;
}
public AgribookRaccoltaDTO setCodAnag(String codAnag) {
this.codAnag = codAnag;
return this;
}
public String getCodDtip() {
return codDtip;
}
public AgribookRaccoltaDTO setCodDtip(String codDtip) {
this.codDtip = codDtip;
return this;
}
public LocalDate getDataDoc() {
return dataDoc;
}
public AgribookRaccoltaDTO setDataDoc(LocalDate dataDoc) {
this.dataDoc = dataDoc;
return this;
}
public Integer getNumDoc() {
return numDoc;
}
public AgribookRaccoltaDTO setNumDoc(Integer numDoc) {
this.numDoc = numDoc;
return this;
}
public Short getSettimana() {
return settimana;
}
public AgribookRaccoltaDTO setSettimana(Short settimana) {
this.settimana = settimana;
return this;
}
public String getUntDoc() {
return untDoc;
}
public AgribookRaccoltaDTO setUntDoc(String untDoc) {
this.untDoc = untDoc;
return this;
}
public BigDecimal getQtaDoc() {
return qtaDoc;
}
public AgribookRaccoltaDTO setQtaDoc(BigDecimal qtaDoc) {
this.qtaDoc = qtaDoc;
return this;
}
public String getCodMart() {
return codMart;
}
public AgribookRaccoltaDTO setCodMart(String codMart) {
this.codMart = codMart;
return this;
}
public String getPartitaMag() {
return partitaMag;
}
public AgribookRaccoltaDTO setPartitaMag(String partitaMag) {
this.partitaMag = partitaMag;
return this;
}
}

View File

@@ -0,0 +1,26 @@
package it.integry.ems.production.agribook.model;
import it.integry.ems_model.utility.dto.PageableRequestDTO;
public class AgribookRetrieveOrdersRequestDTO extends PageableRequestDTO {
private boolean loadReports = false;
private boolean loadRaccolte = false;
public boolean isLoadReports() {
return loadReports;
}
public AgribookRetrieveOrdersRequestDTO setLoadReports(boolean loadReports) {
this.loadReports = loadReports;
return this;
}
public boolean isLoadRaccolte() {
return loadRaccolte;
}
public AgribookRetrieveOrdersRequestDTO setLoadRaccolte(boolean loadRaccolte) {
this.loadRaccolte = loadRaccolte;
return this;
}
}

View File

@@ -157,7 +157,7 @@ public class WMSGenericController {
WMSVersionDTO wmsVersionDTO = new WMSVersionDTO()
.setLatestVersion(versionString)
.setLatestVersionCode(versionCode)
.setUrl("/wms/android-release" + suffix + ".apk");
.setUrl("wms/android-release" + suffix + ".apk");
lines.stream()

File diff suppressed because one or more lines are too long