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-01-30 17:31:57 +01:00
49 changed files with 825 additions and 417 deletions

View File

@@ -7,6 +7,10 @@
<option name="HOST" value="serverdev" />
<option name="PORT" value="8002" />
<option name="AUTO_RESTART" value="false" />
<RunnerSettings RunnerId="Debug">
<option name="DEBUG_PORT" value="8002" />
<option name="LOCAL" value="false" />
</RunnerSettings>
<method v="2" />
</configuration>
</component>

View File

@@ -1,5 +1,7 @@
package it.integry.common.var;
import it.integry.ems._context.ApplicationContextProvider;
import it.integry.ems.settings.Model.SettingsModel;
import it.integry.ems_model.entity.Azienda;
import org.springframework.stereotype.Service;
@@ -12,8 +14,17 @@ public class EmsDBConst {
private HashMap<String, Const> datiAziendaBindingTable = new HashMap<String, Const>() {{
}};
public Const getConsts(String profileDb) {
String aziendaUp = profileDb.toUpperCase();
public Const getConstsByProfile(String profileDb) {
profileDb = profileDb.toUpperCase();
final SettingsModel settingsModel = ApplicationContextProvider.getApplicationContext().getBean(SettingsModel.class);
final String dbName = settingsModel.getDbNameFromProfileDb(profileDb);
return getConsts(dbName);
}
public Const getConsts(String dbName) {
String aziendaUp = dbName.toUpperCase();
if (!datiAziendaBindingTable.containsKey(aziendaUp)) {
datiAziendaBindingTable.put(aziendaUp, new Const());
@@ -27,7 +38,7 @@ public class EmsDBConst {
}
public class Const {
public static class Const {
private String applicationDbName;
private String nomeAzienda;

View File

@@ -25,8 +25,6 @@ import java.sql.DriverManager;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import static org.reflections.scanners.Scanners.TypesAnnotated;
@@ -104,7 +102,7 @@ public class EmsCoreContext {
private void onPostDBLoaded(MultiDBTransactionManager multiDBTransactionManager, Runnable onDone) throws InterruptedException {
final ExecutorService executorService = Executors.newSingleThreadExecutor();
// final ExecutorService executorService = Executors.newSingleThreadExecutor();
new Thread(() -> {
try {

View File

@@ -95,11 +95,9 @@ public class EmsCoreDBLoader {
// return exists;
// }
private void discoverAllConnections(MultiDBTransactionManager multiDBTransactionManager) {
private void discoverAllConnections(MultiDBTransactionManager multiDBTransactionManager) throws Exception {
for (AvailableConnectionsModel model : settingsModel.getAvailableConnections()) {
if (!model.getInternalDb())
continue;
for (AvailableConnectionsModel model : settingsModel.getAvailableConnectionsWithoutDuplicatedProfiles(true, settingsController.getHistoryProfileDb())) {
try {
final DataSource ds = connectionPool.getConnection(model.getProfileName());
@@ -120,29 +118,27 @@ public class EmsCoreDBLoader {
for (final AdvancedDataSource advancedDataSource : multiDBTransactionManager.getActiveConnections()) {
try {
Connection conn = advancedDataSource.getConnection();
if (advancedDataSource.isInternalDb()) {
Azienda azienda = Azienda.getDefaultAzienda(conn);
Azienda azienda = Azienda.getDefaultAzienda(conn);
if (azienda != null) {
String applicationDbName = azienda.getApplicationName();
String nomeAzienda = azienda.getNomeDitta();
if (azienda != null) {
String applicationDbName = azienda.getApplicationName();
String nomeAzienda = azienda.getNomeDitta();
if (UtilityString.isNullOrEmpty(applicationDbName)) {
throw new Exception("Impostare il campo \"Application Name\"");
}
HashMap<String, String> gestSetupValues =
setupGest.getSetupSection(conn, "DATI_AZIENDA", "FATTURAZIONE_ELETTRONICA");
emsDBConst.getConsts(advancedDataSource.getDataSource().getProfile())
.setApplicationDbName(applicationDbName)
.setNomeAzienda(nomeAzienda)
.setAzienda(azienda)
.setGestSetupDatiAzienda(gestSetupValues);
} else {
throw new Exception("Non è stato possibile leggere i dati dalla tabella azienda");
if (UtilityString.isNullOrEmpty(applicationDbName)) {
throw new Exception("Impostare il campo \"Application Name\"");
}
HashMap<String, String> gestSetupValues =
setupGest.getSetupSection(conn, "DATI_AZIENDA", "FATTURAZIONE_ELETTRONICA");
emsDBConst.getConsts(advancedDataSource.getDataSource().getDbName())
.setApplicationDbName(applicationDbName)
.setNomeAzienda(nomeAzienda)
.setAzienda(azienda)
.setGestSetupDatiAzienda(gestSetupValues);
} else {
throw new Exception("Non è stato possibile leggere i dati dalla tabella azienda");
}
} catch (Exception ex) {
ex.printStackTrace();

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.IntegryCustomerDB;
import it.integry.ems.migration._base.MigrationModelInterface;
public class Migration_20250128113218 extends BaseMigration implements MigrationModelInterface {
@Override
public void up() throws Exception {
if (isHistoryDB())
return;
if (isCustomerDb(IntegryCustomerDB.Carelli_Murgia))
createOrUpdateView("gvw_part_iva_infragroup",
"CREATE VIEW [dbo].[gvw_part_iva_infragroup] AS\n" +
" SELECT part_iva\n" +
" FROM murgia.dbo.azienda\n");
else if (isCustomerDb(IntegryCustomerDB.Carelli_Format))
createOrUpdateView("gvw_part_iva_infragroup",
"CREATE VIEW [dbo].[gvw_part_iva_infragroup] AS\n" +
" SELECT part_iva\n" +
" FROM format.dbo.azienda\n");
}
@Override
public void down() throws Exception {
}
}

View File

@@ -0,0 +1,28 @@
package it.integry.ems.migration.model;
import it.integry.ems.migration._base.BaseMigration;
import it.integry.ems.migration._base.MigrationModelInterface;
public class Migration_20250128123943 extends BaseMigration implements MigrationModelInterface {
@Override
public void up() throws Exception {
if (isHistoryDB())
return;
createSetup("W_VLIST_AGG_LAST_DOC_DISP", "DATAWINDOW", "D_VLIST_AGG_ULTC_REP", null,
null, false, null, false, false,
false, false, false, null, false, null);
createSetup("W_VLIST_AGG_LAST_DOC_DISP", "DATAWINDOW", "D_VLIST_AGG_LAST_DOC_REP", null,
null, false, null, false, false,
false, false, false, null, false, null);
}
@Override
public void down() throws Exception {
}
}

View File

@@ -0,0 +1,91 @@
package it.integry.ems.migration.model;
import it.integry.ems.migration._base.BaseMigration;
import it.integry.ems.migration._base.MigrationModelInterface;
public class Migration_20250128152927 extends BaseMigration implements MigrationModelInterface {
@Override
public void up() throws Exception {
if (isHistoryDB())
return;
createOrUpdateFunction("getsitartadataDett", "CREATE FUNCTION [dbo].[getsitartadataDett](@adt_adata datetime, @codMdep varchar(8000)) RETURNS TABLE AS \n" +
"return \n" +
"with anno as (\n" +
"select case\n" +
" when year(IsNull(@adt_adata, GetDate()) + 1) <= azienda.anno_magaz\n" +
" then year(IsNull(@adt_adata, GetDate()) + 1) \n" +
" else azienda.anno_magaz end as anno_iniz FROM azienda ),\n" +
"periodo as \n" +
"(select data_iniz from gtb_periodo_fisc inner join anno on gtb_periodo_fisc.anno = anno.anno_iniz) ,\n" +
"movimenti as (\n" +
"select mtb_sart.cod_mdep,\n" +
" mtb_sart.cod_mart,\n" +
" mtb_sart_dt.partita_mag,\n" +
" mtb_sart_dt.cod_col,\n" +
" mtb_sart_dt.cod_tagl,\n" +
" mtb_sart_dt.qta_iniz,\n" +
" CONVERT(numeric(20, 5), 0) as qta_car,\n" +
" CONVERT(numeric(20, 5), 0) as qta_scar,\n" +
" mtb_sart_dt.num_iniz,\n" +
" CONVERT(numeric(20, 5), 0) as num_car,\n" +
" CONVERT(numeric(20, 5), 0) as num_scar\n" +
" from mtb_sart\n" +
" INNER JOIN mtb_aart ON mtb_sart.cod_mart = mtb_aart.cod_mart\n" +
" INNER JOIN mtb_grup ON mtb_aart.cod_mgrp = mtb_grup.cod_mgrp\n" +
" INNER JOIN mtb_depo ON mtb_sart.cod_mdep = mtb_depo.cod_mdep\n" +
" INNER JOIN mtb_sart_dt ON mtb_sart.cod_mdep = mtb_sart_dt.cod_mdep\n" +
" and mtb_sart.cod_mart = mtb_sart_dt.cod_mart\n" +
" and mtb_sart.anno = mtb_sart_dt.anno\n" +
" where (@codMdep is null or mtb_depo.cod_mdep IN (SELECT value_string as cod_mdep FROM ParseStringIntoArray(@codMdep, ',')))\n" +
" and mtb_grup.flag_val_mag = 'S'\n" +
" and mtb_sart.anno IN (select anno_iniz from anno ) \n" +
" UNION ALL\n" +
" select mtb_movi.cod_mdep,\n" +
" mtb_movi.cod_mart,\n" +
" mtb_movi.partita_mag,\n" +
" mtb_movi.cod_col,\n" +
" mtb_movi.cod_tagl,\n" +
" 0 as qta_iniz,\n" +
" sum(mtb_movi.qta_car) as qta_car,\n" +
" sum(mtb_movi.qta_scar) as qta_scar,\n" +
" CONVERT(numeric(20, 5), 0) as num_iniz,\n" +
" SUM(mtb_movi.num_car) as num_car,\n" +
" SUM(mtb_movi.num_scar) as num_scar\n" +
" from mtb_movi \n" +
" INNER JOIN mtb_aart ON mtb_movi.cod_mart = mtb_aart.cod_mart\n" +
" INNER JOIN mtb_grup ON mtb_aart.cod_mgrp = mtb_grup.cod_mgrp\n" +
" INNER JOIN mtb_depo ON mtb_movi.cod_mdep = mtb_depo.cod_mdep\n" +
" where (@codMdep is null or mtb_depo.cod_mdep IN (SELECT value_string as cod_mdep FROM ParseStringIntoArray(@codMdep, ',')))\n" +
" and mtb_grup.flag_val_mag = 'S'\n" +
" and mtb_movi.data_reg between (select data_iniz from periodo) and IsNull(@adt_adata, GetDate())\n" +
" group by mtb_movi.cod_mdep, mtb_movi.cod_mart, mtb_movi.partita_mag, mtb_movi.cod_col,\n" +
" mtb_movi.cod_tagl,\n" +
" mtb_movi.data_reg )\n" +
"\n" +
"\n" +
" SELECT cod_mdep,\n" +
" cod_mart,\n" +
" partita_mag,\n" +
" cod_col,\n" +
" cod_tagl,\n" +
" SUM(qta_iniz) as qta_iniz,\n" +
" SUM(qta_car) as qta_car,\n" +
" SUM(qta_scar) as qta_scar,\n" +
" SUM(qta_iniz) + SUM(qta_car) - SUM(qta_scar) as qta_fine,\n" +
" SUM(num_iniz) as num_iniz,\n" +
" SUM(num_car) as num_car,\n" +
" SUM(num_scar) as num_scar,\n" +
" SUM(num_iniz) + SUM(num_car) - SUM(num_scar) as num_fine\n" +
" FROM movimenti sart_iniz_movi_fine\n" +
" GROUP BY cod_mdep, cod_mart, partita_mag, cod_col, cod_tagl");
}
@Override
public void down() throws Exception {
}
}

View File

@@ -0,0 +1,20 @@
package it.integry.ems.migration.model;
import it.integry.ems.migration._base.BaseMigration;
import it.integry.ems.migration._base.MigrationModelInterface;
public class Migration_20250128172026 extends BaseMigration implements MigrationModelInterface {
@Override
public void up() throws Exception {
if (isHistoryDB())
return;
executeStatement("update atb_list_data set flag_riversa_promo = 1 where flag_riversa_promo is null");
addDefault("atb_list_data", "flag_riversa_promo", 1 );
executeStatement("alter table atb_list_data alter column flag_riversa_promo bit not null");
}
@Override
public void down() throws Exception {
}
}

View File

@@ -0,0 +1,28 @@
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_20250129152213 extends BaseMigration implements MigrationModelInterface {
@Override
public void up() throws Exception {
if (isHistoryDB())
return;
createSetupQuery("SI_NO", "SI_NO", "SELECT 'S' UNION ALL SELECT 'N'");
createSetup("PVM", "CONTO_ECONOMICO_PRODOTTO", "FILTRA_EQUIVALENTI", "N",
"visualizza solo uno degli articoli equivalenti", false, "SI_NO", false, false,
false, false, false, null, false, "SELECT 'S' UNION ALL SELECT 'N'");
if (isCustomer(IntegryCustomer.RossoGargano))
updateSetupValue("PVM", "CONTO_ECONOMICO_PRODOTTO", "FILTRA_EQUIVALENTI", "S");
}
@Override
public void down() throws Exception {
}
}

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_20250129162852 extends BaseMigration implements MigrationModelInterface {
@Override
public void up() throws Exception {
if (isHistoryDB())
return;
executeStatement("CREATE TABLE srl_user_attached (user_name varchar(40) not null, id_attach varchar(40) not null, \n" +
"CONSTRAINT PK_srl_user_attached PRIMARY KEY (user_name,id_attach),\n" +
"FOREIGN KEY (user_name) REFERENCES stb_user(user_name),\n" +
"FOREIGN KEY (id_attach) REFERENCES stb_files_attached(id_attach));");
}
@Override
public void down() throws Exception {
}
}

View File

@@ -0,0 +1,20 @@
package it.integry.ems.migration.model;
import it.integry.ems.migration._base.BaseMigration;
import it.integry.ems.migration._base.MigrationModelInterface;
public class Migration_20250130110105 extends BaseMigration implements MigrationModelInterface {
@Override
public void up() throws Exception {
if (isHistoryDB())
return;
executeStatement("update vtb_dist set flag_cont = 'S'\n" +
"where num_cmov is not null and flag_cont = 'N'");
}
@Override
public void down() throws Exception {
}
}

View File

@@ -348,7 +348,7 @@ public class MailService {
.append("<br /><br /></p>");
String nomeAzienda = emsDBConst.getConsts(multiDBTransactionManager.getPrimaryDatasource().getProfile())
String nomeAzienda = emsDBConst.getConstsByProfile(multiDBTransactionManager.getPrimaryDatasource().getProfile())
.getNomeAzienda();
subject = String.format("[%s] %s", nomeAzienda, subject);
@@ -402,7 +402,7 @@ public class MailService {
.append(".<br /><br /></p>");
String nomeAzienda = emsDBConst.getConsts(multiDBTransactionManager.getPrimaryDatasource().getProfile())
String nomeAzienda = emsDBConst.getConstsByProfile(multiDBTransactionManager.getPrimaryDatasource().getProfile())
.getNomeAzienda();
String subject = String.format("[%s] Errore durante operazione di %s su %s", nomeAzienda, action, InetAddress.getLocalHost().getHostName());

View File

@@ -7,6 +7,7 @@ import it.integry.ems.report.dto.ReportTypeDTO;
import it.integry.ems.report.dto.SubreportDTO;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.user.UserSession;
import it.integry.ems.utility.UtilityDirs;
import it.integry.ems.utility.UtilityFile;
import it.integry.ems.utility.UtilityPdf;
@@ -57,10 +58,10 @@ public class ReportProcessor {
private MultiDBTransactionManager multiDBTransactionManager;
@Autowired
private ResponseJSONObjectMapper jsonObjectMapper;
private SetupGest setupGest;
@Autowired
private SetupGest setupGest;
private UserSession userSession;
private static final Logger logger = LogManager.getLogger();
@@ -287,6 +288,19 @@ public class ReportProcessor {
}
hm_parameters.put("api_webservices", url);
String firmaUtente;
String sql =
Query.format(
"SELECT id_attach FROM srl_user_attached WHERE user_name = %s", userSession.getUsername());
String idAttach = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql);
if ( !UtilityString.isNullOrEmpty(idAttach) ) {
firmaUtente = String.format("http://%s/ems-api/downloadStbFileAttachment/%s/firma_utente.png?profileDb=%s",
url, idAttach, multiDBTransactionManager.getPrimaryDatasource().getProfile());
hm_parameters.put("firma_utente", firmaUtente);
}
completeParameter(jasperDTO, hm_parameters);
JasperReportsContext jasperReportsContext = DefaultJasperReportsContext.getInstance();

View File

@@ -9,6 +9,7 @@ import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -106,6 +107,18 @@ public class SettingsModel implements InitializingBean {
.collect(Collectors.toList());
}
public List<AvailableConnectionsModel> getAvailableConnectionsWithoutDuplicatedProfiles(boolean onlyInternal, String historyProfileDb) {
Map<String, List<AvailableConnectionsModel>> databases = getAvailableConnections(onlyInternal)
.stream()
.filter(AvailableConnectionsModel::getInternalDb)
.filter(x -> !historyProfileDb.equalsIgnoreCase(x.getProfileName()))
.collect(Collectors.groupingBy(AvailableConnectionsModel::getDbName));
return databases.keySet().stream()
.map(key -> databases.get(key).get(0))
.collect(Collectors.toList());
}
public void addAvailableConnection(AvailableConnectionsModel availableConnectionsModel) {
availableConnections.add(availableConnectionsModel);
}

View File

@@ -5,7 +5,6 @@ import it.integry.ems.settings.Model.AvailableConnectionsModel;
import it.integry.ems.settings.Model.SettingsModel;
import it.integry.ems.sync.MultiDBTransaction.exception.UnexpectedConnectionSwitchException;
import it.integry.ems.utility.UtilityDebug;
import it.integry.ems_model.utility.UtilityString;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
@@ -169,11 +168,11 @@ public class BasicConnectionPool {
}
if (!currentCatalog.equalsIgnoreCase(model.getDbName())) {
handleCatalogMismatch(ds, model, currentCatalog);
handleCatalogMismatch(ds, currentCatalog);
return false;
}
return handleConnectionRelease(ds, model);
return handleConnectionRelease(ds);
} finally {
poolLock.unlock();
}
@@ -214,19 +213,19 @@ public class BasicConnectionPool {
.orElse(null);
}
private void handleCatalogMismatch(DataSource ds, AvailableConnectionsModel model, String currentCatalog)
private void handleCatalogMismatch(DataSource ds, String currentCatalog)
throws UnexpectedConnectionSwitchException, SQLException, IOException {
String connectionName = ds.getApplicationName();
usedConnections.get(model.getDbName()).remove(ds);
activeConnectionNames.get(model.getDbName()).remove(connectionName);
usedConnections.get(currentCatalog).remove(ds);
activeConnectionNames.get(currentCatalog).remove(connectionName);
ds.forceClose();
throw new UnexpectedConnectionSwitchException(model.getDbName(), currentCatalog);
throw new UnexpectedConnectionSwitchException(ds.getConnection().getCatalog(), currentCatalog);
}
private boolean handleConnectionRelease(DataSource ds, AvailableConnectionsModel model)
private boolean handleConnectionRelease(DataSource ds)
throws SQLException {
String connectionName = ds.getApplicationName();
String dbName = model.getDbName();
String dbName = ds.getDbName();
if (connectionName.startsWith("EMS Extra Connection #")) {
activeConnectionNames.get(dbName).remove(connectionName);

View File

@@ -89,7 +89,6 @@ public class MultiDBTransactionManager implements AutoCloseable {
public void Destroy() throws Exception {
this.commitAll();
this.closeAll();
this.dbDatasources.clear();
this.dbPrimary = null;
}

View File

@@ -215,7 +215,7 @@ public class SyncManager {
}
public String getDistributoreProfileDb(String profileDb) {
return emsDBConst.getConsts(profileDb)
return emsDBConst.getConstsByProfile(profileDb)
.getAzienda().getDbDistributore();
}

View File

@@ -75,10 +75,10 @@ public class SystemRequisiteCheckInterceptor extends HandlerInterceptorAdapter {
if (foundName != null) {
if (emsDBConst.getConsts(foundName).getApplicationDbName() == null) {
if (emsDBConst.getConstsByProfile(foundName).getApplicationDbName() == null) {
throw new SystemNotInitializedException(553, "Application Name not initialized");
}
if (emsDBConst.getConsts(foundName).getNomeAzienda() == null) {
if (emsDBConst.getConstsByProfile(foundName).getNomeAzienda() == null) {
throw new SystemNotInitializedException(554, "Nome azienda not initialized");
}
}

View File

@@ -57,10 +57,6 @@ public class UserSession {
return currentUser != null && currentUser.isAttivo();
}
public String getType() {
return currentUser.getType();
}
public MtbDepo getDefaultDepo() {
return currentUserDepo;
}

View File

@@ -1,13 +1,16 @@
package it.integry.ems.user;
import it.integry.ems._context.ApplicationContextProvider;
import it.integry.ems.dto.EntityPermissionsDTO;
import it.integry.ems.exception.PrimaryDatabaseNotPresentException;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.user.dto.UserDTO;
import it.integry.ems.user.exception.InvalidUserException;
import it.integry.ems.user.service.UserCacheService;
import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.entity.MtbDepo;
import it.integry.ems_model.entity.StbUser;
import it.integry.ems_model.entity.WtbDepo;
import it.integry.ems_model.exception.DataConverterNotFoundException;
import it.integry.ems_model.utility.UtilityDB;
@@ -17,9 +20,6 @@ import org.apache.logging.log4j.Logger;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import java.io.IOException;
import it.integry.ems.sync.MultiDBTransaction.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -52,21 +52,12 @@ public class UtilityUser {
public static UserDTO getCurrentUser(MultiDBTransactionManager multiDBTransactionManager, String username) {
if (UtilityString.isNullOrEmpty(username)) return null;
String sql =
"SELECT User_name, " +
" e_mail AS email, " +
" Full_name, " +
" key_group, " +
" CAST(CASE WHEN flag_attivo = 'S' THEN 1 ELSE 0 END AS bit) AS attivo, " +
" 'internal' AS type " +
"FROM " + StbUser.ENTITY + " " +
"WHERE user_name = " + UtilityDB.valueToString(username);
final UserCacheService userCacheService = ApplicationContextProvider.getApplicationContext().getBean(UserCacheService.class);
final RequestDataDTO requestData = ApplicationContextProvider.getApplicationContext().getBean(RequestDataDTO.class);
try {
List<UserDTO> result = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, UserDTO.class);
if (result == null || result.isEmpty()) return null;
return result.get(0);
final UserDTO userDTO = userCacheService.retrieveUserData(multiDBTransactionManager.getPrimaryDatasource().getProfile(), username, requestData.getApplication());
return userDTO;
} catch (Exception exception) {
logger.error("User validation", exception);
return null;

View File

@@ -1,5 +1,6 @@
package it.integry.ems.user.dto;
import com.fasterxml.jackson.annotation.JsonIgnore;
import it.integry.ems_model.annotation.SqlField;
public class UserDTO {
@@ -7,20 +8,36 @@ public class UserDTO {
@SqlField("user_name")
private String username;
@SqlField("email")
private String email;
@SqlField("full_name")
private String fullname;
@JsonIgnore
@SqlField("password_hash")
private String passwordHash;
@SqlField("key_group")
private Integer keyGroup;
@SqlField("attivo")
@SqlField("full_name")
private String fullname;
@SqlField("e_mail")
private String email;
@SqlField("is_password_expired")
private boolean passwordExpired;
@SqlField("user_code")
private String userCode;
@SqlField("cod_mdep")
private String codMdep;
@SqlField("is_attivo")
private boolean attivo;
@SqlField("type")
private String type;
@SqlField("is_internal")
private boolean internal;
@SqlField("is_web")
private boolean web;
public String getUsername() {
return username;
@@ -31,24 +48,6 @@ public class UserDTO {
return this;
}
public String getEmail() {
return email;
}
public UserDTO setEmail(String email) {
this.email = email;
return this;
}
public String getFullname() {
return fullname;
}
public UserDTO setFullname(String fullname) {
this.fullname = fullname;
return this;
}
public Integer getKeyGroup() {
return keyGroup;
}
@@ -58,6 +57,51 @@ public class UserDTO {
return this;
}
public String getFullname() {
return fullname;
}
public UserDTO setFullname(String fullname) {
this.fullname = fullname;
return this;
}
public String getEmail() {
return email;
}
public UserDTO setEmail(String email) {
this.email = email;
return this;
}
public boolean isPasswordExpired() {
return passwordExpired;
}
public UserDTO setPasswordExpired(boolean passwordExpired) {
this.passwordExpired = passwordExpired;
return this;
}
public String getUserCode() {
return userCode;
}
public UserDTO setUserCode(String userCode) {
this.userCode = userCode;
return this;
}
public String getCodMdep() {
return codMdep;
}
public UserDTO setCodMdep(String codMdep) {
this.codMdep = codMdep;
return this;
}
public boolean isAttivo() {
return attivo;
}
@@ -67,12 +111,30 @@ public class UserDTO {
return this;
}
public String getType() {
return type;
public boolean isInternal() {
return internal;
}
public UserDTO setType(String type) {
this.type = type;
public UserDTO setInternal(boolean internal) {
this.internal = internal;
return this;
}
public boolean isWeb() {
return web;
}
public UserDTO setWeb(boolean web) {
this.web = web;
return this;
}
public String getPasswordHash() {
return passwordHash;
}
public UserDTO setPasswordHash(String passwordHash) {
this.passwordHash = passwordHash;
return this;
}
}

View File

@@ -3,6 +3,7 @@ package it.integry.ems.user.service;
import it.integry.annotations.PostContextConstruct;
import it.integry.ems.expansion.RunnableThrowable;
import it.integry.ems.looper.service.LooperService;
import it.integry.ems.model.IntegryApplicationEnum;
import it.integry.ems.settings.Model.AvailableConnectionsModel;
import it.integry.ems.settings.Model.SettingsModel;
import it.integry.ems.sync.MultiDBTransaction.AdvancedDataSource;
@@ -12,12 +13,14 @@ import it.integry.ems.user.dto.UserDTO;
import it.integry.ems.utility.UtilityDebug;
import it.integry.ems_model.entity.StbUser;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityHash;
import it.integry.ems_model.utility.UtilityThread;
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 javax.annotation.Nullable;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
@@ -46,11 +49,10 @@ public class UserCacheService {
}
private void internalCheck() {
Map<String, List<AvailableConnectionsModel>> availableConnectionsModels = settingsModel.getAvailableConnections(true).stream()
Map<String, List<AvailableConnectionsModel>> availableConnectionsModels = settingsModel.getAvailableConnections(true).stream()
.collect(Collectors.groupingBy(AvailableConnectionsModel::getDbName));
try (MultiDBTransactionManager multiDBTransactionManager = new MultiDBTransactionManager()) {
for (Map.Entry<String, List<AvailableConnectionsModel>> profiles : availableConnectionsModels.entrySet()) {
final AvailableConnectionsModel firstModel = profiles.getValue().get(0);
@@ -99,6 +101,51 @@ public class UserCacheService {
return profiles;
}
public @Nullable UserDTO retrieveUser(String profileDb, String username, String password, IntegryApplicationEnum application) {
String dbName = settingsModel.getDbNameFromProfileDb(profileDb);
List<UserDTO> users = cachedUsers.getOrDefault(dbName, null);
if (users == null || users.isEmpty())
return null;
if (password == null || password.isEmpty())
return null;
String finalPasswordHex = UtilityHash.generateHash(password.toUpperCase());
final Optional<UserDTO> foundUser = users.stream()
.filter(x -> x.getUsername().equalsIgnoreCase(username) &&
x.getPasswordHash().contentEquals(finalPasswordHex) &&
(application == null ||
(application == IntegryApplicationEnum.PVM && x.isWeb()) ||
(application == IntegryApplicationEnum.CONSEGNA && x.isWeb()) ||
(application == IntegryApplicationEnum.WMS && x.isWeb()) ||
(application == IntegryApplicationEnum.GESTIONALE_BASE && x.isInternal())))
.findFirst();
return foundUser.orElse(null);
}
public @Nullable UserDTO retrieveUserData(String profileDb, String username, IntegryApplicationEnum application) {
String dbName = settingsModel.getDbNameFromProfileDb(profileDb);
List<UserDTO> users = cachedUsers.getOrDefault(dbName, null);
if (users == null || users.isEmpty())
return null;
final Optional<UserDTO> foundUser = users.stream()
.filter(x -> x.getUsername().equalsIgnoreCase(username) &&
(application == null ||
(application == IntegryApplicationEnum.PVM && x.isWeb()) ||
(application == IntegryApplicationEnum.CONSEGNA && x.isWeb()) ||
(application == IntegryApplicationEnum.WMS && x.isWeb()) ||
(application == IntegryApplicationEnum.GESTIONALE_BASE && x.isInternal())))
.findFirst();
return foundUser.orElse(null);
}
public void discoverAllUsers(MultiDBTransactionManager multiDBTransactionManager) throws Exception {
cacheLock.lock();
@@ -109,14 +156,25 @@ public class UserCacheService {
try {
Connection conn = advancedDataSource.getConnection();
String sql =
"SELECT User_name, " +
" e_mail as email, " +
" Full_name, " +
" CAST(CASE WHEN flag_attivo = 'S' THEN 1 ELSE 0 END AS bit) AS attivo, " +
" 'internal' AS type " +
"FROM " + StbUser.ENTITY + " " +
"WHERE ( " + StbUser.ENTITY + ".flag_intra_user = 'S' OR " + StbUser.ENTITY + ".flag_extra_user = 'S') ";
String sql = "SELECT su.user_name,\n" +
" CONVERT(varchar(max), HASHBYTES('SHA2_512', UPPER(dbo.sys_dcd_pss(su.password))),2) AS password_hash,\n" +
" su.key_group,\n" +
" su.full_name,\n" +
" su.e_mail,\n" +
" su.last_access_datetime,\n" +
" su.password_endtime,\n" +
" CAST(IIF(su.destruction_datetime IS NOT NULL AND\n" +
" DATEDIFF(DAY, su.destruction_datetime, GETDATE()) > 0 AND su.flag_password_expiring = 'S', 1,\n" +
" 0) AS BIT) AS is_password_expired,\n" +
" IIF(su.key_group = '3' AND su.user_code IS NULL, wc.cod_anag, su.user_code) AS user_code,\n" +
" wd.cod_mdep,\n" +
" CAST(IIF(ISNULL(su.flag_attivo, 'N') = 'S', 1, 0) AS BIT) AS is_attivo,\n" +
" CAST(IIF(su.flag_intra_user = 'S' OR su.flag_dba = 'S', 1, 0) AS BIT) AS is_internal,\n" +
" CAST(IIF(su.flag_intra_user = 'S' OR su.flag_extra_user = 'S', 1, 0) AS BIT) AS is_web\n" +
"FROM " + StbUser.ENTITY + " su " +
" LEFT OUTER JOIN wtb_clie wc ON su.user_name = wc.user_name\n" +
" LEFT OUTER JOIN wtb_depo wd ON su.user_name = wd.user_name\n" +
" LEFT OUTER JOIN mtb_depo md ON wd.cod_mdep = md.cod_mdep";
final List<UserDTO> userDTOS = UtilityDB.executeSimpleQueryDTO(conn, sql, UserDTO.class);

View File

@@ -117,31 +117,5 @@ public class UserService {
}
return profiles;
//
// for (String profile : profiles) {
// multiDBTransactionManager.closeAll();
// multiDBTransactionManager.setPrimaryDs(profile);
//
// try {
// StbUser tmpUserData = this.getUser(username, password, multiDBTransactionManager);
//
// if (tmpUserData != null) {
// UserDTO userDTO = new UserDTO()
// .setUsername(tmpUserData.getUsername())
// .setEmail(tmpUserData.geteMail())
// .setFullname(tmpUserData.getFullName())
// .setType("web")
// .setAttivo("S".equalsIgnoreCase(tmpUserData.getFlagAttivo()));
//
// userCacheService.cache(profile, userDTO);
//
// userData.setUser(tmpUserData);
//
// profilesWhereUserFound.add(profile);
// }
// } finally {
// multiDBTransactionManager.closeAll();
// }
// }
}
}

View File

@@ -305,7 +305,7 @@ public abstract class EntityBase implements Serializable, Cloneable, EntityInter
public void setApplicationNameDB(String profileDb) {
EmsDBConst emsDBConst = ApplicationContextProvider.getApplicationContext().getBean(EmsDBConst.class);
this.setApplicationName(emsDBConst.getConsts(profileDb).getApplicationDbName());
this.setApplicationName(emsDBConst.getConstsByProfile(profileDb).getApplicationDbName());
}
@Override

View File

@@ -81,7 +81,7 @@ public class AtbListData extends EntityBase {
@SqlField(value = "costo_trasp")
private BigDecimal costoTrasp;
@SqlField(value = "flag_riversa_promo")
@SqlField(value = "flag_riversa_promo", defaultObjectValue = "1")
private Boolean flagRiversaPromo;
// //////////

View File

@@ -9,8 +9,10 @@ import it.integry.ems.rules.businessLogic.enums.TipoPartita;
import it.integry.ems.rules.completing.AccountingRules;
import it.integry.ems_model.annotation.*;
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.types.OperationType;
import it.integry.ems_model.utility.Query;
import it.integry.ems_model.utility.UtilityDB;
import it.integry.ems_model.utility.UtilityString;
import org.apache.logging.log4j.LogManager;
@@ -140,13 +142,6 @@ public class CtbMovt extends EntityBase {
@JsonProperty("codAnagTitolo")
private String codAnagTitolo;
// riferimento alla distinta effetti
@JsonProperty("dataDist")
private Date dataDist;
@JsonProperty("rifDist")
private Integer rifDist;
@JsonProperty("iban")
private String iban;
@@ -693,24 +688,6 @@ public class CtbMovt extends EntityBase {
return this;
}
public Date getDataDist() {
return dataDist;
}
public CtbMovt setDataDist(Date dataDist) {
this.dataDist = dataDist;
return this;
}
public Integer getRifDist() {
return rifDist;
}
public CtbMovt setRifDist(Integer rifDist) {
this.rifDist = rifDist;
return this;
}
public String getIban() {
return iban;
}
@@ -775,12 +752,7 @@ public class CtbMovt extends EntityBase {
ps.executeUpdate();
ps.close();
}
if (numCmov != null && numCmov > 0 && !UtilityString.isNullOrEmpty(dataDist) && !UtilityString.isNullOrEmpty(rifDist) && rifDist > 0) {
query = "UPDATE vtb_dist " + "SET num_cmov = " + UtilityDB.valueToString(numCmov) + " " + "WHERE data_dist = " + UtilityDB.valueDateToString(dataDist, CommonConstants.DATE_FORMAT_YMD) + " " + " AND rif_dist = " + UtilityDB.valueToString(rifDist);
ps = connection.prepareStatement(query);
ps.executeUpdate();
ps.close();
}
for (CrlMovAttached crlMovAttached : getCrlMovAttached()) {
if (crlMovAttached.getOperation() == OperationType.DELETE) {
crlMovAttached.manageWithParentConnection(connection, crlMovAttached.getOperation(), dataCompleting, entityHolder);
@@ -835,19 +807,31 @@ public class CtbMovt extends EntityBase {
ps.executeUpdate();
ps.close();
}
// SGANCIO DA EVENTUALI DISTINTA INCASSO
query = "UPDATE vtb_dist_incat SET num_cmov = null WHERE num_cmov = " + getNumCmov();
ps = connection.prepareStatement(query);
ps.executeUpdate();
ps.close();
query = "UPDATE ctb_titoli SET num_cmov = null WHERE num_cmov = " + getNumCmov();
ps = connection.prepareStatement(query);
ps.executeUpdate();
ps.close();
query = "UPDATE vtb_dist SET num_cmov = null, flag_cont = 'N' WHERE num_cmov = " + getNumCmov();
ps = connection.prepareStatement(query);
ps.executeUpdate();
ps.close();
query = Query.format("SELECT * FROM vtb_dist_incat WHERE num_cmov = %s", getNumCmov());
VtbDistIncat vtbDistIncat = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(connection, query, VtbDistIncat.class);
if (vtbDistIncat != null) {
vtbDistIncat.setNumCmov(EmsRestConstants.INTEGER_NULL);
vtbDistIncat.setOperation(OperationType.UPDATE);
vtbDistIncat.manageWithParentConnection(connection);
}
query = Query.format("SELECT * FROM ctb_titoli WHERE num_cmov = %s", getNumCmov());
CtbTitoli ctbTitoli = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(connection, query, CtbTitoli.class);
if (ctbTitoli != null) {
ctbTitoli.setNumCmov(EmsRestConstants.INTEGER_NULL);
ctbTitoli.setOperation(OperationType.UPDATE);
ctbTitoli.manageWithParentConnection(connection);
}
query = Query.format("SELECT * FROM vtb_dist WHERE num_cmov = %s", getNumCmov());
VtbDist vtbDist = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(connection, query, VtbDist.class);
if (vtbDist != null) {
vtbDist.setNumCmov(EmsRestConstants.INTEGER_NULL);
vtbDist.setOperation(OperationType.UPDATE);
vtbDist.manageWithParentConnection(connection);
}
// Aggiornamento plafond cliente
DocumentBusinessLogic.updatePlafondIVAMov(connection, this);
if (getGtbAnag() != null) {
@@ -890,11 +874,11 @@ public class CtbMovt extends EntityBase {
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);
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(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);
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, iban, numCmovRif, numCmovRc, numDocRc, numProtRc, tipoPartita, totImponib, totIva, acconto, codPaga, codVage, flagCheckPlafond, isAutofattura, ctbMovr, ctbMovi, crlMovAttached, ctbPart, ctbScad, vtbDistIncat, ctbMovtRc, ctbInum, gtbAnag);
}
}

View File

@@ -39,6 +39,9 @@ public class NtbTipiInca extends EntityBase {
@SqlField(value = "cod_ccon_storno_corr", maxLength = 6)
private String codCconStornoCorr;
@SqlField(value = "cod_aliq", maxLength = 6)
private String codAliq;
@SqlField(value = "flag_tipo_inca", maxLength = 1)
private String flagTipoInca;
@@ -55,56 +58,72 @@ public class NtbTipiInca extends EntityBase {
return codMdep;
}
public void setCodMdep(String codMdep) {
public NtbTipiInca setCodMdep(String codMdep) {
this.codMdep = codMdep;
return this;
}
public String getTipoInca() {
return tipoInca;
}
public void setTipoInca(String tipoInca) {
public NtbTipiInca setTipoInca(String tipoInca) {
this.tipoInca = tipoInca;
return this;
}
public String getCodCcon() {
return codCcon;
}
public void setCodCcon(String codCcon) {
public NtbTipiInca setCodCcon(String codCcon) {
this.codCcon = codCcon;
return this;
}
public String getDescrizione() {
return descrizione;
}
public void setDescrizione(String descrizione) {
public NtbTipiInca setDescrizione(String descrizione) {
this.descrizione = descrizione;
return this;
}
public String getFlagBuoni() {
return flagBuoni;
}
public void setFlagBuoni(String flagBuoni) {
public NtbTipiInca setFlagBuoni(String flagBuoni) {
this.flagBuoni = flagBuoni;
return this;
}
public String getCodCconStornoCorr() {
return codCconStornoCorr;
}
public void setCodCconStornoCorr(String codCconStornoCorr) {
public NtbTipiInca setCodCconStornoCorr(String codCconStornoCorr) {
this.codCconStornoCorr = codCconStornoCorr;
return this;
}
public String getCodAliq() {
return codAliq;
}
public NtbTipiInca setCodAliq(String codAliq) {
this.codAliq = codAliq;
return this;
}
public String getFlagTipoInca() {
return flagTipoInca;
}
public void setFlagTipoInca(String flagTipoInca) {
public NtbTipiInca setFlagTipoInca(String flagTipoInca) {
this.flagTipoInca = flagTipoInca;
return this;
}
public String getCodPaga() {

View File

@@ -0,0 +1,53 @@
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;
@Master()
@PropertyReactive()
@Table(value = SrlUserAttached.ENTITY)
@JsonTypeName(value = SrlUserAttached.ENTITY)
public class SrlUserAttached extends EntityBase {
public final static String ENTITY = "srl_user_attached";
private final static Long serialVersionUID = 1L;
private final static Logger logger = LogManager.getLogger();
public SrlUserAttached() {
super(logger);
}
@PK()
@SqlField(value = "user_name", maxLength = 40, nullable = false)
@FK(tableName = StbUser.ENTITY, columnName = "user_name")
private String userName;
@PK()
@SqlField(value = "id_attach", maxLength = 40, nullable = false)
@FK(tableName = StbFilesAttached.ENTITY, columnName = "id_attach")
private String idAttach;
public String getUserName() {
return userName;
}
public SrlUserAttached setUserName(String userName) {
this.userName = userName;
return this;
}
public String getIdAttach() {
return idAttach;
}
public SrlUserAttached setIdAttach(String idAttach) {
this.idAttach = idAttach;
return this;
}
}

View File

@@ -7,12 +7,14 @@ import it.integry.ems_model.annotation.*;
import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.utility.Query;
import it.integry.ems_model.utility.UtilityDB;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.kie.api.definition.type.PropertyReactive;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Master
@PropertyReactive
@@ -88,7 +90,7 @@ public class StbUser extends EntityBase {
private String details;
@SqlField(value = "Last_access_datetime")
private Date lastAccessDatetime;
private LocalDateTime lastAccessDatetime;
@SqlField(value = "last_passwords", maxLength = 255)
private String lastPasswords;
@@ -399,11 +401,11 @@ public class StbUser extends EntityBase {
return this;
}
public Date getLastAccessDatetime() {
public LocalDateTime getLastAccessDatetime() {
return lastAccessDatetime;
}
public StbUser setLastAccessDatetime(Date lastAccessDatetime) {
public StbUser setLastAccessDatetime(LocalDateTime lastAccessDatetime) {
this.lastAccessDatetime = lastAccessDatetime;
return this;
}

View File

@@ -5,12 +5,14 @@ import it.integry.common.var.CommonConstants;
import it.integry.ems_model.annotation.*;
import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.types.OperationType;
import org.kie.api.definition.type.PropertyReactive;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.kie.api.definition.type.PropertyReactive;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Master
@PropertyReactive
@@ -50,7 +52,7 @@ public class WtbUsers extends EntityBase {
private Integer keyGroup;
@SqlField(value = "Last_access_datetime")
private Date lastAccessDatetime;
private LocalDateTime lastAccessDatetime;
@SqlField(value = "last_passwords", maxLength = 255)
private String lastPasswords;
@@ -184,11 +186,11 @@ public class WtbUsers extends EntityBase {
return this;
}
public Date getLastAccessDatetime() {
public LocalDateTime getLastAccessDatetime() {
return lastAccessDatetime;
}
public WtbUsers setLastAccessDatetime(Date lastAccessDatetime) {
public WtbUsers setLastAccessDatetime(LocalDateTime lastAccessDatetime) {
this.lastAccessDatetime = lastAccessDatetime;
return this;
}

View File

@@ -0,0 +1,43 @@
package it.integry.ems_model.utility;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
public class UtilityHash {
private static final char[] HEX_ARRAY = "0123456789abcdefABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
public static String generateHash(String password) {
try {
// Creo l'oggetto MessageDigest con algoritmo SHA-512
MessageDigest digest = MessageDigest.getInstance("SHA-512");
byte[] hash = digest.digest(password.getBytes(StandardCharsets.US_ASCII));
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) {
hexString.append('0');
}
hexString.append(hex);
}
return hexString.toString().toUpperCase();
} catch (Exception e) {
throw new RuntimeException("Errore nel calcolo dell'hash", e);
}
}
}

View File

@@ -3,9 +3,9 @@ package it.integry.security.controller;
import it.integry.common.var.CommonConstants;
import it.integry.ems.exception.AuthorizationExpriredException;
import it.integry.ems.response.ServiceRestResponse;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.entity.StbAuthToken;
import it.integry.ems_model.utility.UtilityLocalDate;
import it.integry.ems_model.utility.UtilityString;
import it.integry.security.cache.JwtTokenCacheComponent;
import it.integry.security.dto.LoginRequestDTO;
import it.integry.security.dto.LogoutRequestDTO;
@@ -35,20 +35,22 @@ public class AuthController {
@Autowired
private AuthService authService;
@Autowired
private JwtTokenCacheComponent jwtTokenCacheComponent;
@Autowired
private RefreshTokenService refreshTokenService;
@Autowired
private MultiDBTransactionManager multiDBTransactionManager;
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ServiceRestResponse login(HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = CommonConstants.PROFILE_DB, required = false) String profileDb,
@RequestBody LoginRequestDTO loginRequestDTO) {
try {
if(UtilityString.isNullOrEmpty(loginRequestDTO.getProfileDb()))
loginRequestDTO.setProfileDb(profileDb);
return ServiceRestResponse.createPositiveResponse(authService.login(loginRequestDTO));
String profileDb = multiDBTransactionManager.getPrimaryDatasource().getProfile();
return ServiceRestResponse.createPositiveResponse(authService.login(profileDb, loginRequestDTO));
} catch (AuthorizationExpriredException ex) {
logger.error(request.getRequestURI(), ex);
response.setStatus(420);
@@ -63,7 +65,7 @@ public class AuthController {
@PreAuthorize("isAuthenticated()")
public ServiceRestResponse user(HttpServletRequest request,
@RequestParam(CommonConstants.PROFILE_DB) String profileDb) throws Exception {
return ServiceRestResponse.createPositiveResponse(authService.getUser(profileDb));
return ServiceRestResponse.createPositiveResponse(authService.getUserDetails());
}
@RequestMapping(value = "/refresh", method = RequestMethod.POST)

View File

@@ -4,7 +4,6 @@ public class LoginRequestDTO {
private String username;
private String password;
private String profileDb;
private String deviceId;
private String md5User;
@@ -27,15 +26,6 @@ public class LoginRequestDTO {
return this;
}
public String getProfileDb() {
return profileDb;
}
public LoginRequestDTO setProfileDb(String profileDb) {
this.profileDb = profileDb;
return this;
}
public String getDeviceId() {
return deviceId;
}

View File

@@ -1,28 +0,0 @@
package it.integry.security.dto;
import it.integry.ems_model.entity.StbUser;
import java.util.List;
public class UserDataDTO {
private StbUser user;
private List<String> availableProfiles;
public StbUser getUser() {
return user;
}
public UserDataDTO setUser(StbUser user) {
this.user = user;
return this;
}
public List<String> getAvailableProfiles() {
return availableProfiles;
}
public UserDataDTO setAvailableProfiles(List<String> availableProfiles) {
this.availableProfiles = availableProfiles;
return this;
}
}

View File

@@ -1,61 +1,66 @@
package it.integry.security.service;
import it.integry.ems.exception.AuthorizationExpriredException;
import it.integry.ems.exception.PrimaryDatabaseNotPresentException;
import it.integry.ems.javabeans.RequestDataDTO;
import it.integry.ems.service.EntityProcessor;
import it.integry.ems.settings.Model.SettingsModel;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems.user.dto.UserDTO;
import it.integry.ems.user.service.UserCacheService;
import it.integry.ems.user.service.UserService;
import it.integry.ems_model.entity.StbAuthToken;
import it.integry.ems_model.entity.StbDevices;
import it.integry.ems_model.entity.StbUser;
import it.integry.ems_model.exception.DataConverterNotFoundException;
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.UtilityLocalDate;
import it.integry.ems_model.utility.UtilityString;
import it.integry.security.dto.AuthTokenDetails;
import it.integry.security.dto.LoginRequestDTO;
import it.integry.security.dto.LogoutRequestDTO;
import it.integry.security.dto.UserDataDTO;
import it.integry.security.event.TokenCreateEvent;
import it.integry.security.event.TokenExpireEvent;
import it.integry.security.jwt.AccessTokenProvider;
import it.integry.security.response.JwtResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Scope;
import org.springframework.http.HttpStatus;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import javax.ws.rs.NotAuthorizedException;
import java.io.IOException;
import java.sql.SQLException;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.List;
@Service
@Scope("request")
public class AuthService {
@Autowired
private UserCacheService userCacheService;
@Autowired
private UserService userService;
@Autowired
private SettingsModel settingsModel;
@Autowired
private MultiDBTransactionManager multiDBTransactionManager;
@Autowired
private EntityProcessor entityProcessor;
@Autowired
private AccessTokenProvider accessTokenProvider;
@Autowired
private DeviceService deviceService;
@Autowired
private RefreshTokenService refreshTokenService;
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@Autowired
private RequestDataDTO requestDataDTO;
public JwtResponse login(LoginRequestDTO loginRequestDTO) throws Exception {
public JwtResponse login(String profileDb, LoginRequestDTO loginRequestDTO) throws Exception {
if (UtilityString.isNullOrEmpty(loginRequestDTO.getUsername())) {
throw new Exception("Username mancante.");
}
@@ -71,140 +76,58 @@ public class AuthService {
String username = loginRequestDTO.getUsername();
String password = loginRequestDTO.getPassword();
String deviceId = loginRequestDTO.getDeviceId();
String profileDb = loginRequestDTO.getProfileDb();
UserDataDTO userData = new UserDataDTO();
final UserDTO foundUser = userCacheService.retrieveUser(profileDb, username, password, requestDataDTO.getApplication());
if (UtilityString.isNullOrEmpty(profileDb)) {
List<String> profiles = userService.retrieveAvailableProfiles(username);
userData.setAvailableProfiles(profiles);
if (profiles != null && profiles.size() == 1) {
profileDb = userData.getAvailableProfiles().get(0);
}
}
if (!UtilityString.isNullOrEmpty(profileDb)) { // SELEZIONE DB DIRETTO
multiDBTransactionManager.closeAll();
multiDBTransactionManager.setPrimaryDs(profileDb);
userData.setUser(this.getUser(username, password, multiDBTransactionManager));
}
if (userData.getUser() == null) {
if (foundUser == null) {
throw new Exception("Credenziali non valide");
} else if (userData.getUser().getFlagAttivo().equalsIgnoreCase("N")) {
} else if (!foundUser.isAttivo()) {
throw new Exception("Utente non attivo");
} else if (userData.getUser().getPasswordEndtime() != null &&
userData.getUser().getPasswordEndtime().before(new Date())) {
} else if (foundUser.isPasswordExpired()) {
throw new AuthorizationExpriredException("Password scaduta", HttpStatus.UNAUTHORIZED);
}
if (multiDBTransactionManager != null) {
StbUser stbUser = new StbUser()
.setUserName(userData.getUser().getUserName())
.setLastAccessDatetime(new Date());
StbUser stbUser = new StbUser()
.setUserName(foundUser.getUsername())
.setLastAccessDatetime(UtilityLocalDate.getNowTime());
stbUser.setOperation(OperationType.UPDATE);
stbUser.setOperation(OperationType.UPDATE);
entityProcessor.processEntity(stbUser, multiDBTransactionManager);
entityProcessor.processEntity(stbUser, multiDBTransactionManager);
StbDevices stbDevices = deviceService.createIfNotExist(requestDataDTO.getApplication().toString(), deviceId);
StbDevices stbDevices = deviceService.createIfNotExist(requestDataDTO.getApplication().toString(), deviceId);
// Ottengo access_token se token già creato per device id
String sql = String.format(
"SELECT access_token FROM %s WHERE user_name = %s AND device_id = %d",
StbAuthToken.ENTITY,
UtilityDB.valueToString(userData.getUser().getUserName()),
stbDevices.getId()
);
String oldAccessToken = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql);
String primaryProfileDb = multiDBTransactionManager.getPrimaryDatasource().getProfile();
if (!UtilityString.isNullOrEmpty(oldAccessToken)) {
applicationEventPublisher.publishEvent(new TokenExpireEvent(primaryProfileDb, oldAccessToken));
}
// Ricreo token di accesso e refresh
StbAuthToken stbAuthToken = refreshTokenService.createRefreshTokenIfNotExists(
username,
password,
userData.getUser().getKeyGroup(),
primaryProfileDb,
stbDevices.getId()
);
applicationEventPublisher.publishEvent(new TokenCreateEvent(primaryProfileDb, stbAuthToken));
return new JwtResponse()
.setAccessToken(stbAuthToken.getAccessToken())
.setRefreshToken(stbAuthToken.getRefreshToken())
.setExpiryDate(stbAuthToken.getExpiryDate())
.setExpireIn(ChronoUnit.SECONDS.between(UtilityLocalDate.getNowTime(), stbAuthToken.getExpiryDate()));
}
return null;
}
public StbUser getUser(String profileDb) throws Exception {
return this.getUser(requestDataDTO.getUsername(), null, profileDb);
}
public StbUser getUser(String username, String profileDb) throws Exception {
return this.getUser(username, null, profileDb);
}
public StbUser getUser(String username, String password, String profileDb) throws Exception {
return this.getUser(username, password, new MultiDBTransactionManager(profileDb));
}
public StbUser getUser(String username, String password, MultiDBTransactionManager multiDBTransactionManager) throws Exception {
if (UtilityString.isNullOrEmpty(username)) {
throw new Exception("Username mancante in getUserData.");
}
String sql = String.format("SELECT su.user_name,\n" +
" su.key_group,\n" +
" su.full_name,\n" +
" su.password_endtime,\n" +
" su.e_mail,\n" +
" su.Last_access_datetime,\n" +
" su.flag_password_expiring,\n" +
" CASE\n" +
" WHEN su.key_group = '3' AND su.user_code IS NULL THEN wc.cod_anag\n" +
" ELSE su.user_code END AS user_code,\n" +
" wd.cod_mdep,\n" +
" CASE\n" +
" WHEN su.destruction_datetime IS NOT NULL AND\n" +
" DATEDIFF(DAY, su.destruction_datetime, GETDATE()) > 0 AND su.flag_password_expiring = 'S'\n" +
" THEN 'N'\n" +
" ELSE ISNULL(su.flag_attivo, 'N')\n" +
" END AS flag_attivo\n" +
"FROM stb_user su\n" +
" LEFT OUTER JOIN wtb_clie wc ON su.user_name = wc.user_name\n" +
" LEFT OUTER JOIN wtb_depo wd ON su.user_name = wd.user_name\n" +
" LEFT OUTER JOIN mtb_depo md ON wd.cod_mdep = md.cod_mdep\n" +
"WHERE su.user_name = '%s'\n",
username
// Ottengo access_token se token già creato per device id
String sql = Query.format(
"SELECT access_token FROM " + StbAuthToken.ENTITY + " WHERE user_name = {} AND device_id = {}",
foundUser.getUsername(),
stbDevices.getId()
);
switch (requestDataDTO.getApplication()) {
case GESTIONALE_BASE:
sql += " AND ( su.flag_intra_user = 'S' OR su.flag_dba = 's') ";
break;
case PVM:
sql += " AND ( su.flag_intra_user = 'S' OR su.flag_extra_user = 's') ";
break;
String oldAccessToken = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(), sql);
String primaryProfileDb = multiDBTransactionManager.getPrimaryDatasource().getProfile();
if (!UtilityString.isNullOrEmpty(oldAccessToken)) {
applicationEventPublisher.publishEvent(new TokenExpireEvent(primaryProfileDb, oldAccessToken));
}
if (password != null) {
sql += String.format("AND su.password = dbo.sys_enc_pss('%s')\n", password.toLowerCase());
}
// Ricreo token di accesso e refresh
StbAuthToken stbAuthToken = refreshTokenService.createRefreshTokenIfNotExists(
username,
password,
foundUser.getKeyGroup(),
primaryProfileDb,
stbDevices.getId()
);
return UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, StbUser.class);
applicationEventPublisher.publishEvent(new TokenCreateEvent(primaryProfileDb, stbAuthToken));
return new JwtResponse()
.setAccessToken(stbAuthToken.getAccessToken())
.setRefreshToken(stbAuthToken.getRefreshToken())
.setExpiryDate(stbAuthToken.getExpiryDate())
.setExpireIn(ChronoUnit.SECONDS.between(UtilityLocalDate.getNowTime(), stbAuthToken.getExpiryDate()));
}
public void logout(String profileDb, LogoutRequestDTO logoutRequestDTO) throws Exception {
@@ -212,4 +135,19 @@ public class AuthService {
TokenExpireEvent tokenExpireEvent = new TokenExpireEvent(profileDb, logoutRequestDTO.getToken());
applicationEventPublisher.publishEvent(tokenExpireEvent);
}
public StbUser getUserDetails() throws SQLException, IOException, PrimaryDatabaseNotPresentException, DataConverterNotFoundException, InstantiationException, IllegalAccessException {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || authentication instanceof AnonymousAuthenticationToken) {
throw new NotAuthorizedException("Devi effettuare la login prima di procedere");
}
final AuthTokenDetails authTokenDetails = (AuthTokenDetails) authentication.getDetails();
UserDTO userData = authTokenDetails.getUserDTO();
String sql = Query.format("SELECT * FROM " + StbUser.ENTITY + " WHERE user_name = {}", userData.getUsername());
return UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, StbUser.class);
}
}

View File

@@ -435,4 +435,13 @@ when
$vtbDistIncat : VtbDistIncat(numCmov !=null && operation == OperationType.DELETE)
then
throw new CheckConstraintException("Non è possibile cancellare una distinta già registrata.");
end
rule "checkVtbDistDelete"
no-loop
when
eval(checkRulesEnabled)
$vtbDist : VtbDist(numCmov !=null && operation == OperationType.DELETE )
then
throw new CheckConstraintException("Non è possibile cancellare una distinta già registrata.");
end

View File

@@ -712,3 +712,16 @@ when
then
modify ( $entity ) { setUltDataStp(UtilityDate.dateFromPart($entity.getAnno() -1, 12, 13))}
end
rule "completeFlagContVtbDist"
no-loop
when
eval(completeRulesEnabled)
$entity : VtbDist(operation != OperationType.DELETE)
then
modify ( $entity ) {
setFlagCont($entity.getNumCmov()==null?"N":"S")
}
end

View File

@@ -521,9 +521,7 @@ public class ContabilService {
.setCodCcau(datiMov.getCodCcau())
.setDescrizioneCaus(descrCaus.toUpperCase())
.setImporto(distinta.getImpTot().divide(distinta.getCambioDiviCont()).setScale(5, RoundingMode.HALF_UP))
.setAnnoComp(datiMov.getAnnoComp())
.setDataDist(distinta.getDataDist())
.setRifDist(distinta.getRifDist());
.setAnnoComp(datiMov.getAnnoComp());
ctbMovt.setOperation(OperationType.INSERT);
@@ -744,6 +742,14 @@ public class ContabilService {
if (ctbMovt.getException() != null) {
throw ctbMovt.getException();
}
VtbDist vtbDist =
new VtbDist()
.setDataDist(datiMov.getDataDist())
.setRifDist(datiMov.getRifDist())
.setNumCmov(ctbMovt.getNumCmov());
distinta.setOperation(OperationType.UPDATE);
entityProcessor.processEntity(vtbDist, multiDBTransactionManager);
}
return ctbMovt;
}

View File

@@ -1280,9 +1280,11 @@ public class DocumentiAcquistoImportService {
sql = Query.format(
"SELECT cod_mdep\n" +
"FROM mtb_depo_intercode\n" +
"WHERE intercode = %s AND cod_forn = %s %s",
intercode, codAnag, (UtilityString.isNullOrEmpty(codVdes)?"":"AND cod_vdes = " + UtilityDB.valueToString(codVdes))
);
"WHERE intercode = %s AND cod_forn = %s",
intercode, codAnag);
if (!UtilityString.isNullOrEmpty(codVdes))
sql = sql + "AND cod_vdes = " + UtilityDB.valueToString(codVdes);
String codMdep = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(conn, sql);
if (UtilityString.isNullOrEmpty(codMdep)) {

View File

@@ -61,7 +61,7 @@ public class DigitalInvoiceManager {
if(!UtilityString.isNullOrEmpty(requestDataDTO.getProfileDB())) {
EmsDBConst.Const aziendaVars = emsDBConst.getConsts(requestDataDTO.getProfileDB());
EmsDBConst.Const aziendaVars = emsDBConst.getConstsByProfile(requestDataDTO.getProfileDB());
partitaIva = aziendaVars.getAzienda().getPartIva();
codFiscale = UtilityString.isNull(aziendaVars.getAzienda().getCodFiscale(), aziendaVars.getAzienda().getPartIva());
@@ -89,19 +89,19 @@ public class DigitalInvoiceManager {
}
public String getEmailNotification() {
return emsDBConst.getConsts(requestDataDTO.getProfileDB())
return emsDBConst.getConstsByProfile(requestDataDTO.getProfileDB())
.getGestSetupDatiAzienda()
.get("EMAIL_NOTIFICATION");
}
public String getEmailForLog() {
return emsDBConst.getConsts(requestDataDTO.getProfileDB())
return emsDBConst.getConstsByProfile(requestDataDTO.getProfileDB())
.getGestSetupDatiAzienda()
.get("EMAIL_FOR_LOG");
}
public boolean isInivoRiepilogo() {
return emsDBConst.getConsts(requestDataDTO.getProfileDB())
return emsDBConst.getConstsByProfile(requestDataDTO.getProfileDB())
.getGestSetupDatiAzienda()
.get("INVIO_RIEPILOGO")
.equalsIgnoreCase("S");

View File

@@ -541,7 +541,6 @@ public class TrasformaPrevServices {
pStmt.close();
multiDBTransactionManager.commitAll();
multiDBTransactionManager.closeAll();
}

View File

@@ -11,7 +11,6 @@ import it.integry.ems.service.EntityProcessor;
import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager;
import it.integry.ems_model.base.EntityBase;
import it.integry.ems_model.base.EntityNotFound;
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;
@@ -107,25 +106,15 @@ public class DistribuzioneColliService {
String sqlSelectMtbColrs = "SELECT mtb_colr.*, mtb_aart.flag_qta_cnf_fissa as flagQtaCnfFissa " +
"FROM mtb_colr, mtb_aart WHERE mtb_colr.cod_mart = mtb_aart.cod_mart AND " + UtilityQuery.concatFieldListInWhereCond(mtbColtData);
PreparedStatement psMtbColr = multiDBTransactionManager.prepareStatement(sqlSelectMtbColrs);
psMtbColr.setQueryTimeout(30);
ResultSet rsMtbColr = psMtbColr.executeQuery();
ResultSetMapper rsMapperMtbColr = new ResultSetMapper();
List<MtbColr> sourceMtbColrs = rsMapperMtbColr.mapResultSetToList(rsMtbColr, MtbColr.class, OperationType.SELECT_OBJECT);
rsMtbColr.close();
psMtbColr.close();
List<MtbColr> sourceMtbColrs = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sqlSelectMtbColrs, MtbColr.class);
if (sourceMtbColrs == null) return null;
//Carico tutte le informazioni riguardanti gli articoli
List<String> codMarts = Stream.of(sourceMtbColrs)
.withoutNulls()
List<String> codMarts = sourceMtbColrs.stream()
.filter(mtbColr -> mtbColr != null && !UtilityString.isNullOrEmpty(mtbColr.getCodMart()))
.map(MtbColr::getCodMart)
.toList();
.collect(Collectors.toList());
List<MtbAart> mtbAarts = productServices.getArticoliByCodMarts(codMarts);
@@ -800,7 +789,7 @@ public class DistribuzioneColliService {
private List<MtbColt> splitMtbColrsByCodJfas(MtbColt inputMtbColt, List<DtbOrdt> inputOrders, List<MtbColr> inputMtbColrs) {
final Map<Object, List<HashMap<String, Object>>> ordersByCodJfas = inputOrders.stream()
.map(x -> new HashMap<String, Object>() {{
put("data_ord", x.getDataOrd());
put("data_ord", UtilityLocalDate.localDateFromDate(x.getDataOrd()));
put("num_ord", x.getNumOrd());
put("gestione", x.getGestione());
put("cod_jfas", x.getCodJfas());

View File

@@ -43,6 +43,7 @@ import java.util.List;
public class InventarioService {
@Autowired
private MultiDBTransactionManager multiDBTransactionManager;
@Autowired
private SetupGest setupGest;
@@ -458,8 +459,6 @@ public class InventarioService {
// CANCELLAZIONE TABELLE TEMPORANEE
UtilityDB.dropTmpTable(conn, tmpTable);
multiDBTransactionManager.closeAll();
return mtbInvent;
}

View File

@@ -592,8 +592,8 @@ public class SmartLogisticService {
String dataOrd = "";
Integer numOrd = 0;
String dataVers = "";
if (!UtilityString.isNullOrEmpty(collo.getDataOrd()))
dataOrd = CommonConstants.DATETIME_YMD_DASHED_FORMATTER.format(collo.getDataOrd());
if (collo.getDataOrd() != null)
dataOrd = CommonConstants.DATE_YMD_DASHED_FORMATTER.format(collo.getDataOrd());
if (!UtilityString.isNullOrEmpty(collo.getNumOrd()))
numOrd = collo.getNumOrd();
if (!UtilityString.isNullOrEmpty(collo.getDataVers()))

View File

@@ -38,6 +38,8 @@ import it.integry.ems_model.exception.GestSetupNotFoundException;
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.BarcodeEan128.Ean128Model;
import it.integry.ems_model.utility.BarcodeEan128.UtilityBarcodeEan128;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.http.entity.ContentType;
import org.apache.logging.log4j.LogManager;
@@ -1314,7 +1316,10 @@ public class MesProductionServiceV2 {
// continue;
}
if (rowArt.getCodMgrp().equalsIgnoreCase(codMgrpSL) && matchLottoSlToOrdine && !UtilityString.isNullOrEmpty(ordineLav.getPartitaMag()) && !ordineLav.getPartitaMag().equalsIgnoreCase(row.getPartitaMag())) {
if (rowArt.getCodMgrp().equalsIgnoreCase(codMgrpSL) &&
matchLottoSlToOrdine &&
!UtilityString.isNullOrEmpty(ordineLav.getPartitaMag()) &&
!ordineLav.getPartitaMag().startsWith(row.getPartitaMag())) {
anomalie.add(AnomalieDTO.warning(String.format("La partita di semilavorato che si vuole versare (%s) non corrisponde a quella dell'ordine (%s), per concludere la procedura di versamento verrà creato un nuovo ordine di lavorazione con la partita selezionata!", row.getPartitaMag(), ordineLav.getPartitaMag())));
response.setNewOrderRequired(true);
continue;
@@ -1328,6 +1333,15 @@ public class MesProductionServiceV2 {
}
private MaterialeVersatoSuOrdineDTO getVersamentoBarcodeSuOrdine(DtbOrdt ordine, String barcode) throws Exception {
Ean128Model model;
try{
model = UtilityBarcodeEan128.decode(barcode.getBytes());
}catch (Exception e){
model = new Ean128Model();
}
String sscc = UtilityString.isNull(model.Sscc,barcode);
String sql = Query.format("SELECT mtb_colt.data_collo, mtb_colt.num_collo, mtb_colt.ser_collo, mtb_colt.gestione, mtb_colr.cod_mart, mtb_aart.unt_mis,mtb_colr.partita_mag, SUM(qta_col) AS qta_versata,mtb_colr.data_ord, mtb_colr.num_ord\n" +
"FROM mtb_colr\n" +
" INNER JOIN mtb_aart ON mtb_aart.cod_mart = mtb_colr.cod_mart\n" +
@@ -1340,8 +1354,8 @@ public class MesProductionServiceV2 {
" AND mtb_colt.segno = -1\n" +
" AND mtb_colr.data_ord = {}\n" +
" AND mtb_colr.num_ord = {}\n" +
" AND rif.barcode_ul = {}\n" +
"GROUP BY mtb_colt.data_collo, mtb_colt.num_collo, mtb_colt.ser_collo, mtb_colt.gestione, mtb_colr.cod_mart, mtb_aart.unt_mis,mtb_colr.partita_mag,mtb_colr.data_ord, mtb_colr.num_ord", ordine.getDataOrd(), ordine.getNumOrd(), barcode);
" AND (rif.barcode_ul = {} or rif.barcode_ul ={})\n" +
"GROUP BY mtb_colt.data_collo, mtb_colt.num_collo, mtb_colt.ser_collo, mtb_colt.gestione, mtb_colr.cod_mart, mtb_aart.unt_mis,mtb_colr.partita_mag,mtb_colr.data_ord, mtb_colr.num_ord", ordine.getDataOrd(), ordine.getNumOrd(), barcode, sscc);
MaterialeVersatoSuOrdineDTO rowVersamento = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, MaterialeVersatoSuOrdineDTO.class);
@@ -1460,13 +1474,21 @@ public class MesProductionServiceV2 {
.setOperation(OperationType.SELECT_OBJECT);
entityProcessor.processEntity(partitaSL, multiDBTransactionManager);
String partitaMagPf = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(multiDBTransactionManager.getPrimaryConnection(),Query.format("with datiPartita as (\n" +
" select MAX(ASCII(right(partita_mag,LEN(partita_mag) - LEN({})))) + 1 as nextProgressivo\n" +
" from mtb_partita_mag where cod_mart = {} and partita_mag like {}\n" +
")\n" +
"select concat({},ISNULL(CHAR(nextProgressivo),'A'))\n" +
"from datiPartita", partitaSL.getPartitaMag(), ordine.getCodProd(),partitaSL.getPartitaMag()+"%",partitaSL.getPartitaMag()));
partitaMagPf = UtilityString.isNull(partitaMagPf,partitaSL.getPartitaMag());
MtbPartitaMag partitaPf = new MtbPartitaMag();
partitaPf.setCodMart(ordine.getCodProd())
.setPartitaMag(partitaSL.getPartitaMag())
.setPartitaMag(partitaMagPf)
.setDataScad(partitaSL.getDataScad())
.setOperation(OperationType.INSERT_OR_UPDATE);
entityProcessor.processEntity(partitaPf, true, multiDBTransactionManager);
ordine.setPartitaMag(partitaSL.getPartitaMag())
ordine.setPartitaMag(partitaMagPf)
.setOperation(OperationType.UPDATE);
entityProcessor.processEntity(ordine, true, multiDBTransactionManager);

View File

@@ -48,6 +48,8 @@ import it.integry.ems_model.service.SetupGest;
import it.integry.ems_model.types.OperationType;
import it.integry.ems_model.types.TypeDbObject;
import it.integry.ems_model.utility.*;
import it.integry.ems_model.utility.BarcodeEan128.Ean128Model;
import it.integry.ems_model.utility.BarcodeEan128.UtilityBarcodeEan128;
import it.integry.firebase.dto.MessageDTO;
import it.integry.firebase.dto.webpush.WebpushConfigDTO;
import it.integry.firebase.dto.webpush.WebpushNotificationDTO;
@@ -1597,9 +1599,19 @@ public class PvmService {
}
private MtbColt getColloByExternalBarcode(String barcode) throws Exception {
Ean128Model model;
try{
model = UtilityBarcodeEan128.decode(barcode.getBytes());
}catch (Exception e){
model = new Ean128Model();
}
String sql = Query.format("SELECT * FROM " + MtbColt.ENTITY +
" WHERE barcode_ul = %s", barcode);
if (!UtilityString.isNullOrEmpty(model.Sscc) && !model.Sscc.equalsIgnoreCase(barcode)) {
sql += " OR barcode_ul = " + UtilityDB.valueToString(model.Sscc);
}
return UtilityDB.executeSimpleQueryOnlyFirstRowDTO(multiDBTransactionManager.getPrimaryConnection(), sql, MtbColt.class);
}

View File

@@ -112,7 +112,6 @@ public class WMSAccettazioneBollaService {
" (SELECT CAST(count(*) as bit) FROM mtb_comp WHERE wdtb_docr.cod_mart = mtb_comp.cod_comp)as componente\n" +
" FROM Wdtb_docr left outer join mtb_aart on Wdtb_docr.cod_mart = mtb_aart.cod_mart \n" +
" left outer join mtb_grup on mtb_aart.cod_mgrp = mtb_grup.cod_mgrp \n" +
" left outer join mtb_grup on mtb_aart.cod_mgrp = mtb_grup.cod_mgrp \n" +
" WHERE wdtb_docr.cod_art_for is not null AND \n" +
" wdtb_docr.cod_mart is not null AND \n" +
" ( mtb_grup.tipo_mgrp is null or mtb_grup.tipo_mgrp <> 'FTT') \n" +

View File

@@ -532,7 +532,6 @@ public class SystemController {
username = UtilityString.isNull(loginRequestDTO.getUsername(), username);
password = UtilityString.isNull(loginRequestDTO.getPassword(), password);
md5User = UtilityString.isNull(loginRequestDTO.getMd5User(), md5User);
profileDb = UtilityString.isNull(loginRequestDTO.getProfileDb(), profileDb);
}
return ServiceRestResponse.createPositiveResponse(systemService.login(username, password, md5User, profileDb));
} catch (Exception e) {

View File

@@ -341,7 +341,7 @@ public class SystemService {
.setUsername(UtilityHashMap.getValueIfExists(tmpUserData, "user_name"))
.setEmail(UtilityHashMap.getValueIfExists(tmpUserData, "e_mail"))
.setFullname(UtilityHashMap.getValueIfExists(tmpUserData, "full_name"))
.setType("web")
.setWeb(true)
.setAttivo("S".equalsIgnoreCase(UtilityHashMap.getValueIfExists(tmpUserData, "flag_attivo")));
userCacheService.cache(settingsModel.getDbNameFromProfileDb(profile), userDTO);
@@ -368,7 +368,7 @@ public class SystemService {
StbUser stbUser = new StbUser();
stbUser.setOperation(OperationType.UPDATE);
stbUser.setUserName((String) userData.get("user_name"));
stbUser.setLastAccessDatetime(new Date());
stbUser.setLastAccessDatetime(UtilityLocalDate.getNowTime());
multiDBTransactionManager.setPrimaryDs((String) userData.get("profile_db"));
requestDataDTO.setUsername((String) userData.get("user_name"));
entityProcessor.processEntity(stbUser, true, multiDBTransactionManager);