package com.dacrt.SBIABackend.controler;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Optional;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.servlet.http.HttpServletRequest;

import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.dacrt.SBIABackend.security.dto.AuditAllDto;
import com.dacrt.SBIABackend.security.dto.AuditAllResponseDto;
import com.dacrt.SBIABackend.security.dto.AuditDtoMod;
import com.dacrt.SBIABackend.security.dto.AuditModResponseDto;
import com.dacrt.SBIABackend.security.dto.AuditRequestDto;
import com.dacrt.SBIABackend.security.dto.MenuResponseDto;
import com.dacrt.SBIABackend.dto.SuppliersDto;
import com.dacrt.SBIABackend.dto.SuppliersDto3;
import com.dacrt.SBIABackend.dto.SuppliersDtoStatus;
import com.dacrt.SBIABackend.dto.SuppliersGetOneDto;
import com.dacrt.SBIABackend.dto.SuppliersRespondeDto3;
import com.dacrt.SBIABackend.dto.TypesDto;
import com.dacrt.SBIABackend.dto.TypesUnitDto;
import com.dacrt.SBIABackend.dto.YesnoDto;
import com.dacrt.SBIABackend.dto.suppliersContactDto;
import com.dacrt.SBIABackend.dto.requestDto.FacilitiesRequestDto;
import com.dacrt.SBIABackend.dto.requestDto.SupplierRequestDto;
import com.dacrt.SBIABackend.dto.CampaignFormat2Dto;
import com.dacrt.SBIABackend.dto.ChannelsDtoStatus;
import com.dacrt.SBIABackend.dto.IdValueDto;
import com.dacrt.SBIABackend.dto.LineaDto;
import com.dacrt.SBIABackend.dto.OperationlineDto;
import com.dacrt.SBIABackend.dto.OperationlineSinStatusDto;
import com.dacrt.SBIABackend.dto.PeriodParResponseDto2;
import com.dacrt.SBIABackend.dto.PeriodsDto;
import com.dacrt.SBIABackend.dto.RecordCatalogoResponseDto;
import com.dacrt.SBIABackend.dto.RtoRecordSupplier2Dto;
import com.dacrt.SBIABackend.dto.RtoRecordSupplierDto;
import com.dacrt.SBIABackend.dto.RtoRecordSupplierDto2;
import com.dacrt.SBIABackend.dto.StatusDto;
import com.dacrt.SBIABackend.dto.StatusDto2;
import com.dacrt.SBIABackend.dto.SupplierDtoStatus;
import com.dacrt.SBIABackend.dto.responseDto.EntrySupliersDto;
import com.dacrt.SBIABackend.dto.responseDto.SuppliersRespondeDto;
import com.dacrt.SBIABackend.entity.Units;
import com.dacrt.SBIABackend.entity.Facilities;
import com.dacrt.SBIABackend.entity.Suppliers;
import com.dacrt.SBIABackend.security.dto.RespuestaDto;
import com.dacrt.SBIABackend.security.dto.RespuestaMsgDto;
import com.dacrt.SBIABackend.security.dto.RespuestaValueDto;
import com.dacrt.SBIABackend.security.dto.RoleDto;
import com.dacrt.SBIABackend.security.dto.UsersListDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesAllDto;
import com.dacrt.SBIABackend.security.dto.PrivilegesDto;
import com.dacrt.SBIABackend.security.dto.ParamsDto;
import com.dacrt.SBIABackend.security.dto.ParamsResponseDto;
import com.dacrt.SBIABackend.security.entity.Audit;
import com.dacrt.SBIABackend.security.entity.Params;
import com.dacrt.SBIABackend.security.entity.Roles;
import com.dacrt.SBIABackend.security.entity.Users;
import com.dacrt.SBIABackend.security.repository.ParamsRepository;
import com.dacrt.SBIABackend.security.repository.RolesPrivilegesRepository;
import com.dacrt.SBIABackend.security.repository.UsersRepository;
import com.dacrt.SBIABackend.security.service.UsersService;
import com.dacrt.SBIABackend.service.SuppliersService;
import com.dacrt.SBIABackend.security.service.MenuService;
import com.dacrt.SBIABackend.security.service.ParamsService;
import com.dacrt.SBIABackend.security.service.SecurityService;
import com.dacrt.SBIABackend.utils.HttpReqRespUtils;
import com.dacrt.SBIABackend.security.repository.AuditRepository;
import com.dacrt.SBIABackend.repository.SuppliersRepository;

@RestController
//@RequestMapping("/units")   
@CrossOrigin(origins = "*")

public class SuppliersController {

	@Autowired
	private ParamsRepository paramsRepository;

	@Autowired
	private UsersRepository usersRepository;

	@Autowired
	private AuditRepository auditRepository;

	@Autowired
	private RolesPrivilegesRepository rolesPrivilegesRepository;

	@Autowired
	UsersService usersService;

	@Autowired
	ParamsService paramsService;

	@Autowired
	SuppliersService suppliersService;

	@Autowired
	SecurityService securityService;

	@Autowired
	MenuService menuService;

	@PersistenceContext
	private EntityManager entityManager;

	@Autowired
	SuppliersRepository suppliersRepository;

	@Autowired
	private JdbcTemplate jdbcTemplate;

	@Value("${var.ambiente}")
	private String urlAmbiente;

	@Value("${spring.datasource.url}")
	private String conexion;

	@Value("${spring.datasource.username}")
	private String userbd;

	@Value("${spring.datasource.password}")
	private String passbd;

	@PostMapping("/suppliers")
	public ResponseEntity<?> suppliers(HttpServletRequest request, @RequestBody UsersListDto tiposfiltros)
			throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		SuppliersRespondeDto suppliersResponseDto = new SuppliersRespondeDto();
		SuppliersRespondeDto3 suppliersResponseDto3 = new SuppliersRespondeDto3();
		RecordCatalogoResponseDto suppliersFormatResponseDto = new RecordCatalogoResponseDto();
		// ParamsDto detalleParams;
		SuppliersDto detalleSuppliers;
		StatusDto detalleStatus;
		PrivilegesAllDto detallePrivilege;

		Long cuantosregistro = (long) 0;

		List<PrivilegesAllDto> listasPrivelege = new ArrayList<>();

		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);
		Date fechaDate = formatter.parse(dataFormattata);
		AuditRequestDto auditDto = new AuditRequestDto();

		String searchIn = "";
		String contentIn = "";
		String searchTypeSupplier;
		PeriodParResponseDto2 detallePerRto;
		PeriodParResponseDto2 detallePerRpo;
		RtoRecordSupplierDto2 detalleRto;
		RtoRecordSupplierDto2 detalleRpo;
		TypesUnitDto detalleRelated;
		TypesUnitDto detalleDataProcc;
		TypesUnitDto detalleBcp;
		CampaignFormat2Dto detalleCompaing2;

		// String searchModule = "";
		int searchStatus = 0;
		String suppliertypeparIn = "";
		String supportlineparIn = "";
		String bcpdrpyesnoparIn = "";
		String dataprocyesnoparIn = "";

		int idrol;
		String fechaComoCadena;
		int orderIn = 0;
		int offsetIn = 0;
		int formatList = 0;
		int numofrecordsIn = 0;
		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();

		if (sessionid == null) {
			String var = "";
			boolean bloked = false;
			RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
			respuestaDto.setBlocked(bloked);
			respuestaDto.setMsg("Sesión expirada o inválida");
			// Error 400
			return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
		} else {

			sessionid = sessionid.substring(7);
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			// String usuarioIN = encontreSessionUsuario.get().getUsr();
			// int position = usuarioIN.indexOf('(');

			if (encontreSessionUsuario.isPresent()) {

				Date FechaReg = encontreSessionUsuario.get().getValidthru();

				// fechaComoCadena = securityService.consultarSessionActiva(FechaReg,fecha2);
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());

				if (fechaComoCadena == "") {

					String var = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					// respuestaDto.setBlocked(bloked);
					respuestaDto.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);

				}
				// Este proceso permite obtener un listado de los proveedores. (Priv 440)
				formatList = tiposfiltros.getFormat();
				Roles roles = encontreSessionUsuario.get().getRolid();
				idrol = roles.getId();
				int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 440);
				if (formatList != 2) {
					if (rolisvalid == 0) {

						String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						// respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("No tiene los Privilegios");
						return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);

					}
				}
				//searchIn = tiposfiltros.getFilters().getSearch();
				searchIn = tiposfiltros.getFilters().getSearch();
				  String Salida = usersService.verificarCaracteresValidosConRegex(searchIn);
				  
				  if (Salida=="NOOK") {
					  String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						//respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Caracteres no permitidos en la busqueda"); 
						return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
				  }
				  searchIn = usersService.eliminarAcentosService(tiposfiltros.getFilters().getSearch());  
				suppliertypeparIn = tiposfiltros.getFilters().getSuppliertypepar();
				if (formatList==2) {
					supportlineparIn = "";
					bcpdrpyesnoparIn = "";
					dataprocyesnoparIn = "";
					
				} else
				{
					supportlineparIn = tiposfiltros.getFilters().getSupportlinepar();
					bcpdrpyesnoparIn = tiposfiltros.getFilters().getBcpdrpyesnopar();
					dataprocyesnoparIn = tiposfiltros.getFilters().getDataprocyesnopar();
				}
				

				searchStatus = tiposfiltros.getFilters().getStatus();
				searchTypeSupplier = tiposfiltros.getFilters().getSuppliertypepar();
				if (searchTypeSupplier==null) {
					searchTypeSupplier= "";
				} 
				orderIn = tiposfiltros.getOrder();

				offsetIn = tiposfiltros.getOffset();
				numofrecordsIn = tiposfiltros.getNumofrecords();
				contentIn = tiposfiltros.getContent();
				if (contentIn != null) {
					menuService.iscontentdiffnull(contentIn, encontreSessionUsuario.get().getId());
				}

			} else {
				String var = "";
				boolean bloked = false;
				RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
				respuestaDto.setBlocked(bloked);
				respuestaDto.setMsg("Sesión expirada o inválida");
				// Error 400
				return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
			}
		}

		try {

			String SentenciaBase;

			SentenciaBase = "SELECT "
					+ "	u.id,u.name,u.status,CASE WHEN u.status = 1 then 'Activo' ELSE 'Inactivo' END AS estatus,rtocontractual, "
					+ "	rpocontractual,pr.valor AS idrto, pr.descr AS descrto,pr1.valor1 AS idrpo, pr1.descr1 AS descrpo "
					+ " ,pr2.valor2 AS idrelatedcom, pr2.descr2 AS descrrelatedcom,pr3.valor3 AS iddatpro, pr3.descr3 AS descdatpro, "
					+ "	pr4.valor4 AS idbcp, pr4.descr4 AS descbcp,u.dsc,pr.filter AS filterRpo,pr1.filter AS filterRto,u.ref FROM main.Suppliers u "
					+ " LEFT JOIN (SELECT elemento ->> 'filter' AS filter,elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor "
					+ "							    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
					+ "					    WHERE p.paramname = 'EVALPROC_PERIOD') pr ON u.apoperiodpar = pr.valor "
					+ " LEFT JOIN (SELECT elemento ->> 'filter' AS filter,elemento ->> 'dsc' AS descr1,elemento ->> 'value' AS valor1 "
					+ "							    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento  "
					+ "					    WHERE p.paramname = 'EVALPROC_PERIOD') pr1 ON u.rtoperiodpar = pr1.valor1 "
					+ " LEFT JOIN (SELECT elemento ->> 'dsc' AS descr2,elemento ->> 'value' AS valor2 "
					+ "						    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
					+ "					    WHERE p.paramname = 'RELATEDCOMPANY_YESNO') pr2 ON u.relatedcompanyyesnopar = pr2.valor2 "
					+ " LEFT JOIN (SELECT elemento ->> 'dsc' AS descr3,elemento ->> 'value' AS valor3 "
					+ "						    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento  "
					+ "					    WHERE p.paramname = 'DATAPROCESS_YESNO') pr3 ON u.dataprocyesnopar = pr3.valor3 "
					+ " LEFT JOIN (SELECT elemento ->> 'dsc' AS descr4,elemento ->> 'value' AS valor4 "
					+ "						    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento  "
					+ "					    WHERE p.paramname = 'BCPDRP_YESNO') pr4 ON u.bcpdrpyesnopar = pr4.valor4 ";

			// + " (u.id,u.name,u.status,CASE WHEN u.status = 1 then 'Activo' ELSE
			// 'Inactivo' END AS estatus) FROM Suppliers u";

			String QueryTotal = "";
			String name = "u.name";
			String status = "u.status";
			String lowername = " main.sinacentos(LOWER(u.name))";
			String lowerdsc = " main.sinacentos(LOWER(u.dsc))";
			String lowerref = " main.sinacentos(LOWER(u.ref))";
			//String lowerdsc = "main.sinacentos(LOWER(ed.dsc))";
			String LowerSearch = searchIn.toLowerCase();

			switch (searchIn) {
			case "": // viene sin busqueda por el like
				// QueryTotal = SentenciaBase;
				// QueryTotal = SentenciaBase + " WHERE " + lowername + " LIKE " + "'%" + "" +
				// "%'";
				QueryTotal = SentenciaBase + " WHERE TRUE = TRUE";
				break;

			default: // viene con el parametro para buscar por el like
				QueryTotal = SentenciaBase + " WHERE (" + lowername + " LIKE  " + "'%" + LowerSearch + "%'" + " OR "
						+ lowerdsc + " LIKE  " + "'%" + LowerSearch + "%'" + "  OR " + lowerref + " LIKE " + "'%" + LowerSearch + "%'" +" )";

			}

			switch (searchTypeSupplier) {
			case "": // viene sin busqueda por el like
				QueryTotal = QueryTotal;
				break;

			default: // viene con el parametro para buscar por el like
				// QueryTotal = SentenciaBase + " WHERE " + lowername + " LIKE " + "'%" +
				// LowerSearch + "%'";
				QueryTotal = QueryTotal + " AND u.suppliertypepar = " + "'" + searchTypeSupplier + "'";

			}

			switch (supportlineparIn) {
			case "": // viene sin busqueda por el like
				QueryTotal = QueryTotal;
				break;

			default: // viene con el parametro para buscar por el like
				// QueryTotal = SentenciaBase + " WHERE " + lowername + " LIKE " + "'%" +
				// LowerSearch + "%'";
				QueryTotal = QueryTotal + " AND u.supportlinepar = " + "'" + supportlineparIn + "'";

			}

			switch (bcpdrpyesnoparIn) {
			case "": // viene sin busqueda por el like
				QueryTotal = QueryTotal;
				break;

			default: // viene con el parametro para buscar por el like
				// QueryTotal = SentenciaBase + " WHERE " + lowername + " LIKE " + "'%" +
				// LowerSearch + "%'";
				QueryTotal = QueryTotal + " AND u.bcpdrpyesnopar = " + "'" + bcpdrpyesnoparIn + "'";

			}

			switch (dataprocyesnoparIn) {
			case "": // viene sin busqueda por el like
				QueryTotal = QueryTotal;
				break;

			default: // viene con el parametro para buscar por el like
				// QueryTotal = SentenciaBase + " WHERE " + lowername + " LIKE " + "'%" +
				// LowerSearch + "%'";
				QueryTotal = QueryTotal + " AND u.dataprocyesnopar = " + "'" + dataprocyesnoparIn + "'";

			}

			switch (searchStatus) {
			case 0: // Busca por cualquier estatus
				QueryTotal = QueryTotal;
				break;
			case 1: // Busca por estatus activo

				QueryTotal = QueryTotal + " AND " + status + " = " + searchStatus;
				break;
			case 2: // Busca por estatus Inactivo

				// QueryTotal = QueryTotal + " AND " + status + " = " + searchStatus;
				QueryTotal = QueryTotal + " AND " + status + " = " + 0;
				break;

			default: // viene con el parametro para buscar por el like
				String var2 = "";
				boolean bloked = false;
				RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
				respuestaDto = new RespuestaMsgDto("Error interno del servidor");
				estatus = HttpStatus.INTERNAL_SERVER_ERROR;
				return new ResponseEntity(respuestaDto, estatus);

			}

			// TypedQuery<SuppliersDtoStatus> paramsCount=
			// entityManager.createQuery(QueryTotal, SuppliersDtoStatus.class);
			// cuantosregistro = (long) paramsCount.getResultList().size();
			Query query;
			if (formatList == 1) {
				query = entityManager.createNativeQuery(QueryTotal);
				cuantosregistro = (long) jdbcTemplate.queryForList(QueryTotal).size();
			}

			String ordena = "";
			if (orderIn == 1 || orderIn == 2 || orderIn == 3 || orderIn == 4 || orderIn == 99) {
				ordena = " ASC ";
			} else if (orderIn == -1 || orderIn == -2 || orderIn == -3 || orderIn == -4 || orderIn == -99) {
				ordena = " DESC ";
			} else {
				String var2 = "";
				boolean bloked = false;
				RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
				respuestaDto = new RespuestaMsgDto("Error interno del servidor");
				estatus = HttpStatus.INTERNAL_SERVER_ERROR;
				return new ResponseEntity(respuestaDto, estatus);
			}

			int absolutoOrden = Math.abs(orderIn);

			switch (absolutoOrden) {
			case 1: // ordena por name 
				QueryTotal = QueryTotal + " ORDER BY " + name + ordena;
				break;
				
			case 2:// ordena por status 
				QueryTotal = QueryTotal + " ORDER BY " + status + ordena;
				break;
				
			case 3:// ordena por ref 
				QueryTotal = QueryTotal + " ORDER BY " + " u.ref " + ordena;
				break;
			
			case 4:// ordena por dsc 
				QueryTotal = QueryTotal + " ORDER BY " + " u.dsc " + ordena;
				break;

			case 99: // ordena por id
				QueryTotal = QueryTotal + " ORDER BY " + "u.id" + ordena;
				break;

			}

			Query query3;
			List<Object[]> resultadosTypes;
			YesnoDto yesnoDto = new YesnoDto();
			String QueryTypes = "SELECT CAST(elem AS TEXT) " + "	FROM main.params pa, "
					+ "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elem "
					+ "	WHERE pa.paramname = 'EVALPROC_YESNO' ";

			query3 = entityManager.createNativeQuery(QueryTypes);
			List<YesnoDto> tipoyesNoList = new ArrayList();
			resultadosTypes = query3.getResultList();
			JSONObject jsonObject;
			String jsonStringTipo = "";
			if (resultadosTypes.size() > 0) {
				for (Object tipos : resultadosTypes) {
					jsonStringTipo = (String) tipos; // Recupera el JSON como String
					jsonObject = new JSONObject(jsonStringTipo); // Convierte String a JSONObject
					// Extrae los valores del JSONObject
					String dsc = jsonObject.getString("dsc");
					String value = jsonObject.getString("value");

					yesnoDto.setId(Integer.parseInt(value));
					yesnoDto.setValue(dsc);
					tipoyesNoList.add(yesnoDto);
					yesnoDto = new YesnoDto();
				}
			}

			Query query4;
			List<Object[]> resultadosTypesSuplliers;
			TypesDto typesDto = new TypesDto();
			String QueryTypesSuplliers = "SELECT CAST(elem AS TEXT) " + "	FROM main.params pa, "
					+ "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elem "
					+ "	WHERE pa.paramname = 'SUPPLIER_TYPE' ";

			query4 = entityManager.createNativeQuery(QueryTypesSuplliers);
			List<TypesDto> typesDtoList = new ArrayList();
			resultadosTypesSuplliers = query4.getResultList();
			JSONObject jsonObject2;
			String jsonStringTipo2 = "";
			if (resultadosTypesSuplliers.size() > 0) {
				for (Object tipos : resultadosTypesSuplliers) {
					jsonStringTipo2 = (String) tipos; // Recupera el JSON como String
					jsonObject2 = new JSONObject(jsonStringTipo2); // Convierte String a JSONObject
					// Extrae los valores del JSONObject
					String dsc = jsonObject2.getString("dsc");
					String value = jsonObject2.getString("value");

					typesDto.setId(Integer.parseInt(value));
					typesDto.setValue(dsc);
					typesDtoList.add(typesDto);
					typesDto = new TypesDto();
				}
			}

			Query query5;
			List<Object[]> resultadosLinea;
			LineaDto lineaDto = new LineaDto();
			String QueryLinea = "SELECT CAST(elem AS TEXT) " + "	FROM main.params pa, "
					+ "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elem "
					+ "	WHERE pa.paramname = 'SUPPLIER_LINES' ";

			query5 = entityManager.createNativeQuery(QueryLinea);
			List<LineaDto> lineaList = new ArrayList();
			resultadosLinea = query5.getResultList();
			JSONObject jsonObject3;
			String jsonStringTipo3 = "";
			if (resultadosLinea.size() > 0) {
				for (Object tipos : resultadosLinea) {
					jsonStringTipo3 = (String) tipos; // Recupera el JSON como String
					jsonObject3 = new JSONObject(jsonStringTipo3); // Convierte String a JSONObject
					// Extrae los valores del JSONObject
					String dsc = jsonObject3.getString("dsc");
					String value = jsonObject3.getString("value");

					lineaDto.setId(Integer.parseInt(value));
					lineaDto.setValue(dsc);
					lineaList.add(lineaDto);
					lineaDto = new LineaDto();
				}
			}

			Query query6;
			List<Object[]> resultadosPeriods;
			PeriodsDto periodDto = new PeriodsDto();
			String QueryPeriod = "SELECT CAST(elem AS TEXT) " + "	FROM main.params pa, "
					+ "	jsonb_array_elements(CAST(pa.value AS jsonb)) AS elem "
					+ "	WHERE pa.paramname = 'EVALPROC_PERIOD' ";

			query6 = entityManager.createNativeQuery(QueryPeriod);
			List<PeriodsDto> periodList = new ArrayList();
			resultadosPeriods = query6.getResultList();
			JSONObject jsonObject4;
			String jsonStringTipo4 = "";
			if (resultadosPeriods.size() > 0) {
				for (Object tipos : resultadosPeriods) {
					jsonStringTipo4 = (String) tipos; // Recupera el JSON como String
					jsonObject4 = new JSONObject(jsonStringTipo4); // Convierte String a JSONObject
					// Extrae los valores del JSONObject
					String dsc = jsonObject4.getString("dsc");
					String value = jsonObject4.getString("value");

					periodDto.setDsc(dsc);
					periodDto.setValue(value);
					periodList.add(periodDto);
					periodDto = new PeriodsDto();
				}
			}

			
			if (formatList != 2) {
				query = entityManager.createNativeQuery(QueryTotal);
				query.setFirstResult(offsetIn);
				query.setMaxResults(numofrecordsIn);
				List<Object[]> listacompleta = query.getResultList();

				List<SuppliersDto> listasSuppliers = new ArrayList<>();
				detalleSuppliers = new SuppliersDto();
				// Se de be hacer el ciclo para poder llenar el objeto de la descripcion del
				// estatus
				// for(SuppliersDtoStatus suppliers : listacompleta) {
				for (Object[] reg : listacompleta) {
					detalleSuppliers = new SuppliersDto();
					detallePerRto = new PeriodParResponseDto2();
					detallePerRpo = new PeriodParResponseDto2();
					detalleRto = new RtoRecordSupplierDto2();
					detalleRpo = new RtoRecordSupplierDto2();
					detalleRelated = new TypesUnitDto();
					detalleDataProcc = new TypesUnitDto();
					detalleBcp = new TypesUnitDto();

					detalleStatus = new StatusDto();
					detalleSuppliers.setId((int) reg[0]);
					detalleSuppliers.setName((String) reg[1]);
					detalleSuppliers.setRef((String) reg[19] == null ? "" : (String) reg[19]);
					detalleSuppliers.setDsc((String) reg[16] == null ? "" : (String) reg[16]);
					detalleStatus.setId((int) reg[2]);
					detalleStatus.setName((String) reg[3]);
					/////////////// rto ///////////
					detalleRto.setQty((Integer) reg[4] / Integer.parseInt((String) reg[18]));

					String idrtovalor = (String) reg[6];
					Integer valoridrto = Integer.parseInt(idrtovalor);

					detallePerRto.setId(Integer.parseInt(idrtovalor));
					detallePerRto.setName((String) reg[7]);
					detalleRto.setPeriodpar(detallePerRto);
					/////////////// rpo ///////////

					detalleRpo.setQty((Integer) reg[5] / Integer.parseInt((String) reg[17]));

					String idrpovalor = (String) reg[8];
					Integer valoridrpo = Integer.parseInt(idrpovalor);

					detallePerRpo.setId(valoridrpo);
					detallePerRpo.setName((String) reg[9]);
					detalleRpo.setPeriodpar(detallePerRpo);
					//////////////////////////////////////////////

					/////////// related//////////////
					detalleRelated.setDsc((String) reg[11]);
					detalleRelated.setValue((String) reg[10]);
					//////////////////////////////

					///////////// dataprocc/////////////////
					detalleDataProcc.setDsc((String) reg[13]);
					detalleDataProcc.setValue((String) reg[12]);
					///////////////////////////////////////

					////////////////////// BCP//////////////
					detalleBcp.setDsc((String) reg[15]);
					detalleBcp.setValue((String) reg[14]);
					///////////////////////////////////////

					detalleSuppliers.setRpocontractual(detalleRpo);
					detalleSuppliers.setRtocontractual(detalleRto);
					detalleSuppliers.setRelatedcompanypar(detalleRelated);
					detalleSuppliers.setDataprocesspar(detalleDataProcc);
					detalleSuppliers.setBcpdrppar(detalleBcp);

					detalleSuppliers.setStatus(detalleStatus);

					listasSuppliers.add(detalleSuppliers);
				}

				detallePrivilege = new PrivilegesAllDto();

				boolean tieneView = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol, 440);
				boolean tieneUpdate = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol, 441);
				boolean tieneAdd = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol, 442);
				boolean tieneDelete = rolesPrivilegesRepository.existsByRolidAndPrivilegeid(idrol, 443);
				// existsByRolidAndPrivilegeid

				detallePrivilege.setView(tieneView);
				detallePrivilege.setUpdate(tieneUpdate);
				detallePrivilege.setAdd(tieneAdd);
				detallePrivilege.setDelete(tieneDelete);

				suppliersResponseDto.setNumofrecords(cuantosregistro);
				suppliersResponseDto.setSessionvalidthru(fechaComoCadena);
				suppliersResponseDto.setRecords(listasSuppliers);
				suppliersResponseDto.setPrivileges(detallePrivilege);
				suppliersResponseDto.setLinea(lineaList);
				suppliersResponseDto.setTypes(typesDtoList);
				suppliersResponseDto.setPeriods(periodList);
				suppliersResponseDto.setYesno(tipoyesNoList);

				return ResponseEntity.ok(suppliersResponseDto);
			} else {

				query = entityManager.createNativeQuery(QueryTotal);
				// query.setFirstResult(offsetIn);
				// query.setMaxResults(numofrecordsIn);
				List<Object[]> listacompleta = query.getResultList();

				List<SuppliersDto> listasSuppliers = new ArrayList<>();
				SuppliersDto detalleSuppliers3 = new SuppliersDto();
				// Se de be hacer el ciclo para poder llenar el objeto de la descripcion del
				// estatus
				// for(SuppliersDtoStatus suppliers : listacompleta) {
				for (Object[] reg : listacompleta) {
					
					detalleSuppliers = new SuppliersDto();
					detallePerRto = new PeriodParResponseDto2();
					detallePerRpo = new PeriodParResponseDto2();
					detalleRto = new RtoRecordSupplierDto2();
					detalleRpo = new RtoRecordSupplierDto2();
					detalleRelated = new TypesUnitDto();
					detalleDataProcc = new TypesUnitDto();
					detalleBcp = new TypesUnitDto();

					detalleSuppliers3 = new SuppliersDto();

					detalleStatus = new StatusDto();
					detalleSuppliers3.setId((int) reg[0]);
					detalleSuppliers3.setName((String) reg[1]);
					detalleSuppliers3.setRef((String) reg[19] == null ? "" : (String) reg[19]);
					detalleSuppliers3.setDsc((String) reg[16] == null ? "" : (String) reg[16]);
					detalleStatus.setId((int) reg[2]);
					detalleStatus.setName((String) reg[3]);
					
		                    /////////////// rto ///////////
							detalleRto.setQty((Integer) reg[4] / Integer.parseInt((String) reg[18]));

							String idrtovalor = (String) reg[8];
							Integer valoridrto = Integer.parseInt(idrtovalor);

							detallePerRto.setId(Integer.parseInt(idrtovalor));
							detallePerRto.setName((String) reg[9]);
							detalleRto.setPeriodpar(detallePerRto);
							/////////////// rpo ///////////

							detalleRpo.setQty((Integer) reg[5] / Integer.parseInt((String) reg[17]));

							String idrpovalor = (String) reg[6];
							Integer valoridrpo = Integer.parseInt(idrpovalor);

							detallePerRpo.setId(valoridrpo);
							detallePerRpo.setName((String) reg[7]);
							detalleRpo.setPeriodpar(detallePerRpo);
							//////////////////////////////////////////////
							
					        /////////// related//////////////
							detalleRelated.setDsc((String) reg[11]);
							detalleRelated.setValue((String) reg[10]);
							//////////////////////////////

							///////////// dataprocc/////////////////
							detalleDataProcc.setDsc((String) reg[13]);
							detalleDataProcc.setValue((String) reg[12]);
							///////////////////////////////////////

							////////////////////// BCP//////////////
							detalleBcp.setDsc((String) reg[15]);
							detalleBcp.setValue((String) reg[14]);
							///////////////////////////////////////
							detalleSuppliers3.setRpocontractual(detalleRpo);
							detalleSuppliers3.setRtocontractual(detalleRto);
							detalleSuppliers3.setRelatedcompanypar(detalleRelated);
							detalleSuppliers3.setDataprocesspar(detalleDataProcc);
							detalleSuppliers3.setBcpdrppar(detalleBcp);


					detalleSuppliers3.setStatus(detalleStatus);

					listasSuppliers.add(detalleSuppliers3);
				}

				suppliersResponseDto3.setSessionvalidthru(fechaComoCadena);
				suppliersResponseDto3.setRecords(listasSuppliers);
				return ResponseEntity.ok(suppliersResponseDto3);

			}

		} catch (Exception e) {
			// Manejo de excepciones
			respuesta = new RespuestaDto("Error interno del servidor", false);
			estatus = HttpStatus.INTERNAL_SERVER_ERROR;
		} finally {
			if (entityManager != null && entityManager.isOpen()) {
				entityManager.close();
			}
		}

		return new ResponseEntity(respuesta, estatus);

	}

	@GetMapping("/suppliers/{supplierid}")
	public ResponseEntity<?> getOneSuppliers(HttpServletRequest request,
			@PathVariable("supplierid") final Integer supplierid) throws ParseException {
		RespuestaDto respuesta = new RespuestaDto("", false);
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		EntrySupliersDto suppliersResponseDto = new EntrySupliersDto();
		RecordCatalogoResponseDto suppliersFormatResponseDto = new RecordCatalogoResponseDto();
		// ParamsDto detalleParams;
		SuppliersGetOneDto detalleSuppliers;
		StatusDto detalleStatus;
		StatusDto detalleTypo;
		StatusDto detalleSupportLine;
		PrivilegesAllDto detallePrivilege;

		Long cuantosregistro = (long) 0;

		List<PrivilegesAllDto> listasPrivelege = new ArrayList<>();

		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);
		Date fechaDate = formatter.parse(dataFormattata);
		AuditRequestDto auditDto = new AuditRequestDto();

		String searchIn = "";
		String contentIn = "";
		String searchTypeSupplier;
		OperationlineSinStatusDto detallePerRto;
		OperationlineSinStatusDto detallePerRpo;
		OperationlineSinStatusDto detallePerAtt;
		OperationlineSinStatusDto detallePerResponse;
		RtoRecordSupplier2Dto detalleRto;
		RtoRecordSupplier2Dto detalleRpo;
		TypesUnitDto detalleRelated;
		TypesUnitDto detalleDataProcc;
		TypesUnitDto detalleBcp;
		TypesUnitDto detalleSolution;
		RtoRecordSupplier2Dto detalleResponseTime;
		RtoRecordSupplier2Dto detalleAtttime;
		suppliersContactDto detalleContact;
		IdValueDto detalleSupplierLine;
		IdValueDto detalleSupplier;
		IdValueDto detalleTypes;
		CampaignFormat2Dto detalleCompaing2;
		List<IdValueDto> listasTypes = new ArrayList<>();
		List<IdValueDto> listaSupplierT = new ArrayList<>();
		List<IdValueDto> listaSupplierLineT = new ArrayList<>();

		// String searchModule = "";
		int searchStatus = 0;
		int idrol;
		String fechaComoCadena;
		int orderIn = 0;
		int offsetIn = 0;
		int formatList = 0;
		int numofrecordsIn = 0;
		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();

		if (sessionid == null) {
			String var = "";
			boolean bloked = false;
			RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
			respuestaDto.setBlocked(bloked);
			respuestaDto.setMsg("Sesión expirada o inválida");
			// Error 400
			return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
		} else {

			sessionid = sessionid.substring(7);
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			// String usuarioIN = encontreSessionUsuario.get().getUsr();
			// int position = usuarioIN.indexOf('(');

			if (encontreSessionUsuario.isPresent()) {

				Date FechaReg = encontreSessionUsuario.get().getValidthru();

				// fechaComoCadena = securityService.consultarSessionActiva(FechaReg,fecha2);
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());

				if (fechaComoCadena == "") {

					String var = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					// respuestaDto.setBlocked(bloked);
					respuestaDto.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);

				}
				// Este proceso permite obtener un listado de los proveedores. (Priv 440)

				Roles roles = encontreSessionUsuario.get().getRolid();
				idrol = roles.getId();
				int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 440);
				if (formatList != 2) {
					if (rolisvalid == 0) {

						String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						// respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("No tiene los Privilegios");
						return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);

					}
				}

			} else {
				String var = "";
				boolean bloked = false;
				RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
				respuestaDto.setBlocked(bloked);
				respuestaDto.setMsg("Sesión expirada o inválida");
				// Error 400
				return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
			}
		}

		try {

			String SentenciaBase;

			SentenciaBase = "SELECT   "
					+ "	u.id,u.name,u.status,CASE WHEN u.status = 1 then 'Activo' ELSE 'Inactivo' END AS estatus,rtocontractual,  "
					+ "	rpocontractual,pr.valor AS idrto, pr.descr AS descrto,pr1.valor1 AS idrpo, pr1.descr1 AS descrpo  "
					+ "	,pr2.valor2 AS idrelatedcom, pr2.descr2 AS descrrelatedcom,pr3.valor3 AS iddatpro, pr3.descr3 AS descdatpro,  "
					+ "pr4.valor4 AS idbcp, pr4.descr4 AS descbcp,u.dsc,u.ref,u.ruc,u.contractinfo,coalesce(u.solutionsupportpar,'') as solutionsupportpar,pr5.descr5, "
					+ "	   u.atttime,coalesce(u.atttimeperiodpar,'') as atttimeperiodpar,pr6.descr6,u.responsetime,u.responsetimeperriodpar,pr7.descr7,  "
		+ "	   u.contactname,u.contactphone,u.contactemail,coalesce(u.suppliertypepar,'') as suppliertypepar,pr8.descr8,coalesce(u.supportlinepar,0) as supportlinepar,pr9.descr9,pr.filter AS filtrorpo,pr1.filter1 AS filtrorto,coalesce(pr6.filter6,'0') AS filtroatt,coalesce(pr7.filter7,'0') AS filtrort FROM main.Suppliers u   "
					+ "						  LEFT JOIN (SELECT elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor,elemento ->> 'filter' AS filter   "
					+ "						    							    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
					+ "						   		 					    WHERE p.paramname = 'EVALPROC_PERIOD') pr ON u.apoperiodpar = pr.valor   "
					+ "						  LEFT JOIN (SELECT elemento ->> 'dsc' AS descr1,elemento ->> 'value' AS valor1,elemento ->> 'filter' AS filter1   "
					+ "						    							    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento  "
					+ "						   		 					    WHERE p.paramname = 'EVALPROC_PERIOD') pr1 ON u.rtoperiodpar = pr1.valor1   "
					+ "						  LEFT JOIN (SELECT elemento ->> 'dsc' AS descr2,elemento ->> 'value' AS valor2   "
					+ "						   	 						    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
					+ "						   		 					    WHERE p.paramname = 'RELATEDCOMPANY_YESNO') pr2 ON u.relatedcompanyyesnopar = pr2.valor2 "
					+ "						  LEFT JOIN (SELECT elemento ->> 'dsc' AS descr3,elemento ->> 'value' AS valor3   "
					+ "						   	 						    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento    "
					+ "						   		 					    WHERE p.paramname = 'DATAPROCESS_YESNO') pr3 ON u.dataprocyesnopar = pr3.valor3 "
					+ "						  LEFT JOIN (SELECT elemento ->> 'dsc' AS descr4,elemento ->> 'value' AS valor4   "
					+ "						   	 						    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
					+ "						   		 					    WHERE p.paramname = 'BCPDRP_YESNO') pr4 ON u.bcpdrpyesnopar = pr4.valor4   "
					+ "                       LEFT JOIN (SELECT elemento ->> 'dsc' AS descr5,elemento ->> 'value' AS valor5 "
					+ "						   	 						    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
					+ "						   		 					    WHERE p.paramname = 'EVALPROC_YESNO') pr5 ON u.solutionsupportpar = pr5.valor5 "
					+ "                       LEFT JOIN (SELECT elemento ->> 'dsc' AS descr6,elemento ->> 'value' AS valor6,elemento ->> 'filter' AS filter6   "
					+ "						    							    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento "
					+ "						   		 					    WHERE p.paramname = 'EVALPROC_PERIOD') pr6 ON u.atttimeperiodpar = pr6.valor6 "
					+ "	                      LEFT JOIN (SELECT elemento ->> 'dsc' AS descr7,elemento ->> 'value' AS valor7, elemento ->> 'filter' AS filter7   "
					+ "						    							    FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento  "
					+ "						   		 					    WHERE p.paramname = 'EVALPROC_PERIOD') pr7 ON u.responsetimeperriodpar = pr7.valor7"
					+ "                       LEFT JOIN (SELECT elemento ->> 'dsc' AS descr8,elemento ->> 'value' AS valor8 "
					+ "			   	 		 						            FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento"
					+ "			   	 		 						   	    WHERE p.paramname = 'SUPPLIER_TYPE') pr8 ON u.suppliertypepar = pr8.valor8 "
					+ "                       LEFT JOIN (SELECT elemento ->> 'dsc' AS descr9,elemento ->> 'value' AS valor9 "
					+ "			   	 		 						    		FROM main.params p,jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento  "
					+ "			   	 		 						   		WHERE p.paramname = 'SUPPLIER_LINES') pr9 ON u.supportlinepar = cast(pr9.valor9 as integer) "
					+ " WHERE u.id = " + supplierid;

			String SetenciaEvalprocc = "";

			SetenciaEvalprocc = "SELECT  elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor "
					+ " FROM main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento WHERE paramname = 'EVALPROC_YESNO' ORDER BY valor ASC";

			Query queryTypes = entityManager.createNativeQuery(SetenciaEvalprocc);
			List<Object[]> listatipos = queryTypes.getResultList();
			for (Object[] types : listatipos) {
				detalleTypes = new IdValueDto();

				int idtype = Integer.parseInt((String) types[1]);
				detalleTypes.setId(idtype);
				detalleTypes.setValue((String) types[0]);
				listasTypes.add(detalleTypes);
			}

			String SetenciaSupplier = "";

			SetenciaSupplier = "SELECT  elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor "
					+ " FROM main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento WHERE paramname = 'SUPPLIER_TYPE' ORDER BY valor ASC";

			Query querySupplier = entityManager.createNativeQuery(SetenciaSupplier);
			List<Object[]> listaSupplier = querySupplier.getResultList();
			for (Object[] typesperi : listaSupplier) {
				detalleSupplier = new IdValueDto();

				int idsupplier = Integer.parseInt((String) typesperi[1]);
				detalleSupplier.setId(idsupplier);
				detalleSupplier.setValue((String) typesperi[0]);
				listaSupplierT.add(detalleSupplier);
			}

			String SetenciaSupplierLine = "";

			SetenciaSupplierLine = "SELECT  elemento ->> 'dsc' AS descr,elemento ->> 'value' AS valor "
					+ " FROM main.params p, jsonb_array_elements(CAST(p.value AS jsonb)) AS elemento WHERE paramname = 'SUPPLIER_LINES' ORDER BY valor ASC";

			Query querySupplierLine = entityManager.createNativeQuery(SetenciaSupplierLine);
			List<Object[]> listaquerySupplierLine = querySupplierLine.getResultList();
			for (Object[] typesperi : listaquerySupplierLine) {
				detalleSupplierLine = new IdValueDto();

				int idsupplierLine = Integer.parseInt((String) typesperi[1]);
				detalleSupplierLine.setId(idsupplierLine);
				detalleSupplierLine.setValue((String) typesperi[0]);
				listaSupplierLineT.add(detalleSupplierLine);
			}

			String QueryTotal = "";
			String name = "u.name";
			String status = "u.status";
			String lowername = "LOWER(u.name)";
			String LowerSearch = searchIn.toLowerCase();

			Query query;
			/*
			 * if (formatList==1) { query = entityManager.createNativeQuery(QueryTotal);
			 * cuantosregistro = (long) jdbcTemplate.queryForList(QueryTotal).size(); }
			 */

			query = entityManager.createNativeQuery(SentenciaBase);
			// query.setFirstResult(offsetIn);
			// query.setMaxResults(numofrecordsIn);
			List<Object[]> listacompleta = query.getResultList();

			List<SuppliersDto> listasSuppliers = new ArrayList<>();
			detalleSuppliers = new SuppliersGetOneDto();
			// Se de be hacer el ciclo para poder llenar el objeto de la descripcion del
			// estatus
			// for(SuppliersDtoStatus suppliers : listacompleta) {
			for (Object[] reg : listacompleta) {
				detalleSuppliers = new SuppliersGetOneDto();
				detallePerRto = new OperationlineSinStatusDto();
				detallePerRpo = new OperationlineSinStatusDto();
				detallePerAtt = new OperationlineSinStatusDto();
				detallePerResponse = new OperationlineSinStatusDto();
				detallePerResponse = new OperationlineSinStatusDto();
				detalleRto = new RtoRecordSupplier2Dto();
				detalleRpo = new RtoRecordSupplier2Dto();
				detalleRelated = new TypesUnitDto();
				detalleDataProcc = new TypesUnitDto();
				detalleBcp = new TypesUnitDto();
				detalleContact = new suppliersContactDto();
				detalleResponseTime = new RtoRecordSupplier2Dto();
				detalleAtttime = new RtoRecordSupplier2Dto();
				detalleSolution = new TypesUnitDto();

				detalleStatus = new StatusDto();
				detalleTypo = new StatusDto();
				detalleSupportLine = new StatusDto();

				detalleSuppliers.setId((int) reg[0]);
				detalleSuppliers.setRef((String) reg[17]);
				detalleSuppliers.setRuc((String) reg[18]);
				detalleSuppliers.setContractinfo((String) reg[19]);
				// detalleSuppliers.set
				detalleSuppliers.setName((String) reg[1]);
				detalleSuppliers.setDsc((String) reg[16]);

				// seteando el type//
				Integer idsuppliertype = Integer.parseInt((String) reg[31]);
				detalleTypo.setId(idsuppliertype);
				detalleTypo.setName((String) reg[32]);
				detalleSuppliers.setType(detalleTypo);
				////

				// seteando el supportline//
				// Integer idsupport = Integer.parseInt((String) reg[31]);
				detalleSupportLine.setId((int) reg[33]);
				detalleSupportLine.setName((String) reg[34]);
				detalleSuppliers.setSupportline(detalleSupportLine);
				////

				// seteando el solution//
				detalleSolution.setDsc((String) reg[21]);
				detalleSolution.setValue((String) reg[20]);
				detalleSuppliers.setSolutionsupportpar(detalleSolution);
				/////////////////////

				// seteando el atttime//
				//detalleAtttime.setQty((int) reg[22]);
				//boolean sonIguales = str1.equals(str2);
				String attimeperiodo = (String) reg[37];
				boolean sonIgualesatt =attimeperiodo.equals("0");
				
				if (sonIgualesatt) {
			//	if ((String) reg[37].equals())) {
					detalleAtttime.setQty(0);
				} else {
					detalleAtttime.setQty((Integer) reg[22] / Integer.parseInt((String) reg[37]));
				}
				
				Integer idperiodatt = Integer.parseInt((String) reg[23]);
				detallePerAtt.setId(idperiodatt);
				detallePerAtt.setName((String) reg[24]);
				detalleAtttime.setPeriodpar(detallePerAtt);
				detalleSuppliers.setAtttime(detalleAtttime);
				/////////////////////

				// seteando el responsetime//
				//detalleResponseTime.setQty((int) reg[25]);
				String rtimeperiodo = (String) reg[38];
				boolean sonIgualesrt =rtimeperiodo.equals("0");
				if (sonIgualesatt) {
					detalleResponseTime.setQty(0);
				} else {
					detalleResponseTime.setQty((Integer) reg[25] / Integer.parseInt((String) reg[38]));
				}
				
				Integer idresponse = Integer.parseInt((String) reg[26]);
				detallePerResponse.setId(idresponse);
				detallePerResponse.setName((String) reg[27]);
				detalleResponseTime.setPeriodpar(detallePerResponse);
				detalleSuppliers.setResponsetime(detalleResponseTime);
				/////////////////////

				// seteando el contact"//

				detalleContact.setName((String) reg[28]);
				detalleContact.setPhone((String) reg[29]);
				detalleContact.setEmail((String) reg[30]);
				detalleSuppliers.setContact(detalleContact);

				/////////////////////

				detalleStatus.setId((int) reg[2]);
				detalleStatus.setName((String) reg[3]);
				/////////////// rto ///////////
				//detalleRto.setQty((int) reg[4]);
				detalleRto.setQty((Integer) reg[4] / Integer.parseInt((String) reg[36]));

			    	   String idrtovalor = (String) reg[8];
				Integer valoridrto = Integer.parseInt(idrtovalor);

				detallePerRto.setId(valoridrto);
			    	   detallePerRto.setName((String) reg[9]);
				detalleRto.setPeriodpar(detallePerRto);
				/////////////// rpo ///////////

				//detalleRpo.setQty((int) reg[5]);
				detalleRpo.setQty((Integer) reg[5] / Integer.parseInt((String) reg[35]));

			    	   String idrpovalor = (String) reg[6];
				Integer valoridrpo = Integer.parseInt(idrpovalor);

				detallePerRpo.setId(valoridrpo);
		    		    detallePerRpo.setName((String) reg[7]);
				detalleRpo.setPeriodpar(detallePerRpo);
				//////////////////////////////////////////////

				/////////// related//////////////
				detalleRelated.setDsc((String) reg[11]);
				detalleRelated.setValue((String) reg[10]);
				//////////////////////////////

				///////////// dataprocc/////////////////
				detalleDataProcc.setDsc((String) reg[13]);
				detalleDataProcc.setValue((String) reg[12]);
				///////////////////////////////////////

				////////////////////// BCP//////////////
				detalleBcp.setDsc((String) reg[15]);
				detalleBcp.setValue((String) reg[14]);
				///////////////////////////////////////

				detalleSuppliers.setRpocontractual(detalleRpo);
				detalleSuppliers.setRtocontractual(detalleRto);
				detalleSuppliers.setRelatedcompanypar(detalleRelated);
				detalleSuppliers.setDataprocesspar(detalleDataProcc);
				detalleSuppliers.setBcpdrppar(detalleBcp);

				detalleSuppliers.setStatus(detalleStatus);

				// listasSuppliers.add(detalleSuppliers);
			}

			suppliersResponseDto.setEntry(detalleSuppliers);
			// paramsResponseDto.setValidthru(ValidThrufechaSalida);
			suppliersResponseDto.setYesno(listasTypes);
			suppliersResponseDto.setTypes(listaSupplierT);
			suppliersResponseDto.setLinea(listaSupplierLineT);

			return ResponseEntity.ok(suppliersResponseDto);

			

		} catch (Exception e) {
			// Manejo de excepciones
			respuesta = new RespuestaDto("Error interno del servidor", false);
			estatus = HttpStatus.INTERNAL_SERVER_ERROR;
		} finally {
			if (entityManager != null && entityManager.isOpen()) {
				entityManager.close();
			}
		}

		return new ResponseEntity(respuesta, estatus);

	}

	@PostMapping("/suppliers/{supplierid}")
	public ResponseEntity<ParamsResponseDto> SuppliersUpsert(HttpServletRequest request,
			@RequestBody SupplierRequestDto datosvp, @PathVariable("supplierid") final Integer supplierid)
			throws ParseException {
		// @GetMapping("/vicepresidencies/{vicepresidencyid}")

		RespuestaValueDto respuestaValueDto;
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		ParamsResponseDto paramsResponseDto = new ParamsResponseDto();
		ParamsDto detalleParams;
		PrivilegesDto detallePrivilege;
		List<ParamsDto> listasParams = new ArrayList<>();
		List<PrivilegesDto> listasPrivelege = new ArrayList<>();

		int idparametro = supplierid;

		int valor = idparametro;
		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);
		Date fechaDate = formatter.parse(dataFormattata);
		AuditRequestDto auditDto = new AuditRequestDto();
		Optional<Users> encontreSessionUsuario;
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();

		if (sessionid == null) {
			String var = "";
			boolean bloked = false;
			RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
			// respuestaDto.setBlocked(bloked);
			respuestaDto.setMsg("Llamada al servicio malformado");
			// Error 400
			return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
		} else {

			sessionid = sessionid.substring(7);
			encontreSessionUsuario = usersRepository.getBySessionid(sessionid);
			String fechaComoCadena;

			if (encontreSessionUsuario.isPresent()) {

				Date FechaReg = encontreSessionUsuario.get().getValidthru();
				// Llamada a la funcion que validad el tiempo de Session, retorna la fecha
				// sumandole el tiempo de session activa, y vacio si no esta activa

				// fechaComoCadena = securityService.consultarSessionActiva(FechaReg,fecha2);
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());
				if (fechaComoCadena == "") {

					String var = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
					// respuestaDto.setBlocked(bloked);
					respuestaDto.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);

				}
				
				//if (datosvp.getName()!="") {
				  String Salida = usersService.verificarCaracteresValidosConRegex(datosvp.getName());
					  
					  if (Salida=="NOOK") {
						  String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Caracteres no permitidos en la busqueda name"); 
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
					  }
			//	}  
	                 String SalidaDsc = usersService.verificarCaracteresValidosConRegex(datosvp.getDsc());
					  
					  if (SalidaDsc=="NOOK") {
						  String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Caracteres no permitidos en la busqueda Desc"); 
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
					  }
					  
                     String SalidaRuc = usersService.verificarCaracteresValidosConRegex(datosvp.getRuc());
					  
					  if (SalidaRuc=="NOOK") {
						  String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Caracteres no permitidos en la busqueda Ruc"); 
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
					  }
					  
                    String SalidaRef = usersService.verificarCaracteresValidosConRegex(datosvp.getRef());
					  
					  if (SalidaRef=="NOOK") {
						  String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Caracteres no permitidos en la busqueda Ref"); 
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
					  }
					  
                   String SalidaContacName = usersService.verificarCaracteresValidosConRegex(datosvp.getContact().getName());
					  
					  if (SalidaContacName=="NOOK") {
						  String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Caracteres no permitidos en la busqueda Contact Name"); 
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
					  }
					  
                  String SalidaContacEmail = usersService.verificarCaracteresValidosConRegex(datosvp.getContact().getEmail());
					  
					  if (SalidaContacEmail=="NOOK") {
						  String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Caracteres no permitidos en la busqueda Contact Email"); 
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
					  }
					  
                  String SalidaContacphone = usersService.verificarCaracteresValidosConRegex(datosvp.getContact().getPhone());
					  
					  if (SalidaContacphone=="NOOK") {
						  String var = "";
							boolean bloked = false;
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							//respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Caracteres no permitidos en la busqueda Contact Phone"); 
							return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);
					  }

				// Actualiza o Incluye un registro de un usuario. (Si el unitid es 0 se
				// incluye). (priv 111 MOD Y 112 INC)
				if (idparametro == 0) {
					// el permiso es el 632
					Roles roles = encontreSessionUsuario.get().getRolid();
					int idrol = roles.getId();
					int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 442);
					// rolisvalid = 3;
					if (rolisvalid == 0) {

						String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						// respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("No tiene los Privilegios");
						return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);

					}

				} else {

					Roles roles = encontreSessionUsuario.get().getRolid();
					int idrol = roles.getId();
					int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 441);
					// rolisvalid = 3;
					if (rolisvalid == 0) {

						String var = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						// respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("No tiene los Privilegios");
						return new ResponseEntity(respuestaDto, HttpStatus.FORBIDDEN);

					}

					boolean existeSup = suppliersRepository.existsById(idparametro);

					if (!existeSup) {

						String var = "";
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						// respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Registro No encontrado");
						// Error 400
						return new ResponseEntity(respuestaDto, HttpStatus.BAD_REQUEST);

					}
				}

				if (idparametro == 0) {

					if (datosvp.getName() != "") {

						// boolean existeName = unitsRepository.existsByName(datosUnidad.getName());
						String Query2 = "SELECT name FROM main.suppliers WHERE LOWER(name) = " + "'"
								+ datosvp.getName().toLowerCase() + "'";

						Long cuantosregistroname = (long) jdbcTemplate.queryForList(Query2).size();

						if (cuantosregistroname > 0) {
							String var = "";
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							// respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Registro Duplicado");
							// Error 40
							return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
						}
					}

					if (datosvp.getRef() != "") {

						// boolean existeName = unitsRepository.existsByName(datosUnidad.getName());
						String Query2 = "SELECT name FROM main.suppliers WHERE LOWER(ref) = " + "'"
								+ datosvp.getRef().toLowerCase() + "'";

						Long cuantosregistroname = (long) jdbcTemplate.queryForList(Query2).size();

						if (cuantosregistroname > 0) {
							String var = "";
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							// respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Registro Duplicado");
							// Error 40
							return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
						}
					}

					if (datosvp.getRuc() != "") {

						// boolean existeName = unitsRepository.existsByName(datosUnidad.getName());
						String Query2 = "SELECT name FROM main.suppliers WHERE LOWER(ruc) = " + "'"
								+ datosvp.getRuc().toLowerCase() + "'";

						Long cuantosregistroname = (long) jdbcTemplate.queryForList(Query2).size();

						if (cuantosregistroname > 0) {
							String var = "";
							RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
							// respuestaDto.setBlocked(bloked);
							respuestaDto.setMsg("Registro Duplicado");
							// Error 40
							return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);
						}
					}

				}

			} else {
				String var = "";
				boolean bloked = false;
				RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
				// respuestaDto.setBlocked(bloked);
				respuestaDto.setMsg("Sesión expirada o inválida");
				// Error 400
				return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);
			}
		}

		try {

			// Facilities tipofaci2=null;
			Suppliers tiposupl2 = null;
			// Facilities tipofaci=null;
			Suppliers tiposupl = null;
			// Facilities tipofaciNew2=null;
			Suppliers tiposuplNew2 = null;
			// Optional<Facilities> nuevoinsertado = null;
			Optional<Suppliers> nuevoinsertado = null;

			if (idparametro == 0) {

				// Facilities tipofaciNew = new Facilities();
				Suppliers tipoSuplNew = new Suppliers();
                int cantidadAlmacenarRTO = paramsService.converttoMinute(datosvp.getRtocontractual().getPeriodpar().toString(),datosvp.getRtocontractual().getQty());
                int cantidadAlmacenarRPO = paramsService.converttoMinute(datosvp.getRpocontractual().getPeriodpar().toString(),datosvp.getRpocontractual().getQty());
                int cantidadAlmacenarATT = paramsService.converttoMinute(datosvp.getAtttime().getPeriodpar().toString(),datosvp.getAtttime().getQty());
                int cantidadAlmacenarRT = paramsService.converttoMinute(datosvp.getResponsetime().getPeriodpar().toString(),datosvp.getResponsetime().getQty());
                
                if (cantidadAlmacenarRTO==-1) {
                	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
					estatus=HttpStatus.BAD_REQUEST;   
					return new ResponseEntity(respuestaDto, estatus);
                }
                
                if (cantidadAlmacenarRPO==-1) {
                	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
					estatus=HttpStatus.BAD_REQUEST;   
					return new ResponseEntity(respuestaDto, estatus);
                 } 
                if (cantidadAlmacenarATT==-1) {
                	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
					estatus=HttpStatus.BAD_REQUEST;   
					return new ResponseEntity(respuestaDto, estatus);
                 } 
                if (cantidadAlmacenarRT==-1) {
                	String var2 = "";
					boolean bloked = false;
					RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
					respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
					estatus=HttpStatus.BAD_REQUEST;   
					return new ResponseEntity(respuestaDto, estatus);
                 } 
				tipoSuplNew.setStatus(datosvp.getStatus());
				tipoSuplNew.setRef(datosvp.getRef());
				tipoSuplNew.setRuc(datosvp.getRuc());
				tipoSuplNew.setContractinfo(datosvp.getContractinfo());
				tipoSuplNew.setName(datosvp.getName());
				tipoSuplNew.setDsc(datosvp.getDsc());
				tipoSuplNew.setSuppliertypepar(datosvp.getSuppliertypepar());
				int idsupportlinepar = Integer.parseInt(datosvp.getSupportlinepar());
				tipoSuplNew.setSupportlinepar(idsupportlinepar);
				tipoSuplNew.setRelatedcompanyyesnopar(datosvp.getRelatedcompanyyesnopar());
				tipoSuplNew.setSolutionsupportpar(datosvp.getSolutionsupportpar());
				//tipoSuplNew.setAtttime(datosvp.getAtttime().getQty());
				tipoSuplNew.setAtttime(cantidadAlmacenarATT);
				tipoSuplNew.setAtttimeperiodpar(datosvp.getAtttime().getPeriodpar().toString());
				//tipoSuplNew.setResponsetime(datosvp.getResponsetime().getQty());
				tipoSuplNew.setResponsetime(cantidadAlmacenarRT);
				tipoSuplNew.setResponsetimeperriodpar(datosvp.getResponsetime().getPeriodpar().toString());
				tipoSuplNew.setDataprocyesnopar(datosvp.getDataprocyesnopar());
				//tipoSuplNew.setRtocontractual(datosvp.getRtocontractual().getQty());
				tipoSuplNew.setRtocontractual(cantidadAlmacenarRTO);
				tipoSuplNew.setRtoperiodpar(datosvp.getRtocontractual().getPeriodpar().toString());
				//tipoSuplNew.setRpocontractual(datosvp.getRpocontractual().getQty());
				tipoSuplNew.setRpocontractual(cantidadAlmacenarRPO);
				tipoSuplNew.setApoperiodpar(datosvp.getRpocontractual().getPeriodpar().toString());
				tipoSuplNew.setBcpdrpyesnopar(datosvp.getBcpdrpyesnopar());
				tipoSuplNew.setContactname(datosvp.getContact().getName());
				tipoSuplNew.setContactphone(datosvp.getContact().getPhone());
				tipoSuplNew.setContactemail(datosvp.getContact().getEmail());
				tipoSuplNew.setModifiedat(fechaDate);
				tipoSuplNew.setCreatedat(fechaDate);

				tiposuplNew2 = suppliersService.addIdSuppliers(tipoSuplNew);
				tiposupl2 = tiposuplNew2;
				nuevoinsertado = suppliersRepository.findByName(datosvp.getName());
				int idInsertado = nuevoinsertado.get().getId();
				int idmensaje = idInsertado;

				////////////////////////// INSERCION BLOQUE DE AUDITORIA///////////////////
				String module = "Proveedores";
				// String Descmodule = "Actualización de parametro del Sistema con id: " +
				// parmid ;
				String Descmodule = "Se agregó el Proveedor " + datosvp.getName() + " con Id:" + idInsertado;

				auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());

				String singo1 = "(";
				String singo2 = ")";
				String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
						.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
				auditDto.setUserref(usryemail);
				auditDto.setModule(module);
				auditDto.setDesc(Descmodule);
				auditDto.setCreatedat(fechaDate);
				usersService.registrarAuditSesion(auditDto);

				respuestaValueDto = new RespuestaValueDto(idmensaje);
				estatus = HttpStatus.OK;
				return new ResponseEntity(respuestaValueDto, estatus);

			} else {
				// tipoUsers = usersService.getUsersByid(idparametro);
				/// tipoUnits = workersService.getWorkersByid(idparametro);
				tiposupl = suppliersService.getSuppliersByid(idparametro);
				// Positions relaposition =
				// positionsRepository.getById(datosWorker.getPositionid());
				    
	                
	        int cantidadAlmacenarRTO=0;
	        int cantidadAlmacenarRPO=0;
	        int cantidadAlmacenarATT=0;
	        int cantidadAlmacenarRT=0;
	        
	              if  (datosvp.getRtocontractual().getQty()!=0) {
	            	   cantidadAlmacenarRTO = paramsService.converttoMinute(datosvp.getRtocontractual().getPeriodpar().toString(),datosvp.getRtocontractual().getQty());
	                 if (cantidadAlmacenarRTO==0) {
	                  	String var2 = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
						respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
						estatus=HttpStatus.BAD_REQUEST;   
						return new ResponseEntity(respuestaDto, estatus);
	                }
			      }   
	              if  (datosvp.getRpocontractual().getQty()!=0) {
	            	   cantidadAlmacenarRPO = paramsService.converttoMinute(datosvp.getRpocontractual().getPeriodpar().toString(),datosvp.getRpocontractual().getQty());
	                if (cantidadAlmacenarRPO==0) {
	                	String var2 = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
						respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
						estatus=HttpStatus.BAD_REQUEST;   
						return new ResponseEntity(respuestaDto, estatus);
	                 } 
	              }
	              if  (datosvp.getAtttime().getQty()!=0) {
	                   cantidadAlmacenarATT = paramsService.converttoMinute(datosvp.getAtttime().getPeriodpar().toString(),datosvp.getAtttime().getQty());
	                if (cantidadAlmacenarATT==0) {
	                	String var2 = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
						respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
						estatus=HttpStatus.BAD_REQUEST;   
						return new ResponseEntity(respuestaDto, estatus);
	                 } 
	              }
	              if  (datosvp.getResponsetime().getQty()!=0) {
		                 cantidadAlmacenarRT = paramsService.converttoMinute(datosvp.getResponsetime().getPeriodpar().toString(),datosvp.getResponsetime().getQty());

	                if (cantidadAlmacenarRT==0) {
	                	String var2 = "";
						boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var2);
						respuestaDto= new RespuestaMsgDto("Llamada al servicio malformado");
						estatus=HttpStatus.BAD_REQUEST;   
						return new ResponseEntity(respuestaDto, estatus);
	                 } 
	              } 
				tiposupl.setStatus(datosvp.getStatus());
				// tiposupl.setRef(datosvp.getRef());
				// tiposupl.setRuc(datosvp.getRuc());
				tiposupl.setContractinfo(datosvp.getContractinfo());
				// tiposupl.setName(datosvp.getName());
				tiposupl.setDsc(datosvp.getDsc());
				tiposupl.setSuppliertypepar(datosvp.getSuppliertypepar());
				int idsupportlinepar = Integer.parseInt(datosvp.getSupportlinepar());
				tiposupl.setSupportlinepar(idsupportlinepar);
				tiposupl.setRelatedcompanyyesnopar(datosvp.getRelatedcompanyyesnopar());
				tiposupl.setSolutionsupportpar(datosvp.getSolutionsupportpar());
				//tiposupl.setAtttime(datosvp.getAtttime().getQty());
				tiposupl.setAtttime(cantidadAlmacenarATT);
				tiposupl.setAtttimeperiodpar(datosvp.getAtttime().getPeriodpar().toString());
				//tiposupl.setResponsetime(datosvp.getResponsetime().getQty());
				tiposupl.setResponsetime(cantidadAlmacenarRT);
				tiposupl.setResponsetimeperriodpar(datosvp.getResponsetime().getPeriodpar().toString());
				tiposupl.setDataprocyesnopar(datosvp.getDataprocyesnopar());
				//tiposupl.setRtocontractual(datosvp.getRtocontractual().getQty());
				tiposupl.setRtocontractual(cantidadAlmacenarRTO);
				tiposupl.setRtoperiodpar(datosvp.getRtocontractual().getPeriodpar().toString());
			//	tiposupl.setRpocontractual(datosvp.getRpocontractual().getQty());
				tiposupl.setRpocontractual(cantidadAlmacenarRPO);
				tiposupl.setApoperiodpar(datosvp.getRpocontractual().getPeriodpar().toString());
				tiposupl.setBcpdrpyesnopar(datosvp.getBcpdrpyesnopar());
				tiposupl.setContactname(datosvp.getContact().getName());
				tiposupl.setContactphone(datosvp.getContact().getPhone());
				tiposupl.setContactemail(datosvp.getContact().getEmail());
				tiposupl.setModifiedat(fechaDate);
				tiposupl.setCreatedat(fechaDate);

				//// validacion del nombre que viene en el post para evitar duplicidad

				String vp1 = tiposupl.getName();
				String vp2 = datosvp.getName();
				if (vp1.equals(vp2)) {
					String Validausers = "El nombre es el mismo";

				} else {

					String QueryTotal = "SELECT name FROM main.suppliers WHERE LOWER(name) = " + "'"
							+ datosvp.getName().toString().toLowerCase() + "'";
					Long validaname = (long) jdbcTemplate.queryForList(QueryTotal).size();

					if (validaname > 0) {

						String var = "";
						// boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						// respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Registro Duplicado");
						// Error 400
						return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);

					} else {
						tiposupl.setName(datosvp.getName());
					}
				}
				/////////////////////////////////////////////////////////////////////////////////////
				//// validacion de la referencia que viene en el post para evitar duplicidad
				String ref1 = tiposupl.getRef();
				String ref2 = datosvp.getRef();
				if (ref1.equals(ref2)) {
					String Validausers = "La referencia es la misma";

				} else {

					String QueryTotal = "SELECT name FROM main.suppliers WHERE LOWER(ref) = " + "'"
							+ datosvp.getRef().toString().toLowerCase() + "'";
					Long validaref = (long) jdbcTemplate.queryForList(QueryTotal).size();

					if (validaref > 0) {

						String var = "";
						// boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						// respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Registro Duplicado");
						// Error 400
						return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);

					} else {
						tiposupl.setRef(datosvp.getRef());
					}
				}
				/////////////////////////////////////////////////////////////////////////////////
				//// validacion del ruc que viene en el post para evitar duplicidad
				String ruc1 = tiposupl.getRuc();
				String ruc2 = datosvp.getRuc();
				if (ruc1.equals(ruc2)) {
					String Validausers = "El ruf es el mismo";

				} else {

					String QueryTotal = "SELECT name FROM main.suppliers WHERE LOWER(ruc) = " + "'"
							+ datosvp.getRuc().toString().toLowerCase() + "'";
					Long validaruc = (long) jdbcTemplate.queryForList(QueryTotal).size();

					if (validaruc > 0) {

						String var = "";
						// boolean bloked = false;
						RespuestaMsgDto respuestaDto = new RespuestaMsgDto(var);
						// respuestaDto.setBlocked(bloked);
						respuestaDto.setMsg("Registro Duplicado");
						// Error 400
						return new ResponseEntity(respuestaDto, HttpStatus.CONFLICT);

					} else {
						tiposupl.setRuc(datosvp.getRuc());
					}
				}
				/////////////////////////////////////////////////////////////////////////////////

				tiposupl2 = suppliersService.addIdSuppliers(tiposupl);
				// tiposuplNew2=suppliersService.addIdSuppliers(tipoSuplNew);

				////////////////////////// INSERCION BLOQUE DE AUDITORIA///////////////////
				String module = "Proveedores";
				// String Descmodule = "Actualización de parametro del Sistema con id: " +
				// parmid ;
				String Descmodule = "Se actualizó el Proveedor: " + datosvp.getName() + " con Id:" + supplierid;

				auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());

				String singo1 = "(";
				String singo2 = ")";
				String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
						.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
				auditDto.setUserref(usryemail);
				auditDto.setModule(module);
				auditDto.setDesc(Descmodule);
				auditDto.setCreatedat(fechaDate);
				usersService.registrarAuditSesion(auditDto);
				////////////////////////// INSERCION BLOQUE DE AUDITORIA///////////////////
				int idmensaje = supplierid;
				respuestaValueDto = new RespuestaValueDto(idmensaje);
				estatus = HttpStatus.OK;
				return new ResponseEntity(respuestaValueDto, estatus);

			}

		} catch (Exception e) {
			// Manejo de excepciones
			respuesta = new RespuestaMsgDto("Error interno del servidor");
			estatus = HttpStatus.INTERNAL_SERVER_ERROR;
		} finally {
			if (entityManager != null && entityManager.isOpen()) {
				entityManager.close();
			}
		}

		return new ResponseEntity(respuesta, estatus);

	}

	@DeleteMapping("/suppliers/{supplierid}")
	public ResponseEntity<?> borrarSuppliers(HttpServletRequest request,
			@PathVariable("supplierid") final Integer supplierid) throws ParseException {
		RespuestaMsgDto respuesta = new RespuestaMsgDto("");
		HttpStatus estatus = HttpStatus.FORBIDDEN;
		RoleDto detalleRoles;
		PrivilegesAllDto detallePrivilege;

		String var = "";
		boolean bloked = false;
		RespuestaDto respuestaDto = new RespuestaDto(var, bloked);
		String sessionid = request.getHeader("Authorization");
		Date fecha = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataFormattata = formatter.format(fecha);
		Date fechaDate = formatter.parse(dataFormattata);
		AuditRequestDto auditDto = new AuditRequestDto();
		RespuestaValueDto respuestaValueDto;
		String searchIn = "";

		Optional<Params> deSessDuration = paramsRepository.findByParamname("SESSION_DURATION");
		String SessionDuration = deSessDuration.get().getValue();
		int duracionSession = Integer.parseInt(SessionDuration);
		Date fecha2 = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(fecha2); // tuFechaBase es un Date;
		// calendar.add(Calendar.MINUTE, minutosASumar); //minutosASumar es int.
		calendar.add(Calendar.MINUTE, duracionSession); // horasASumar es int.
		// lo que más quieras sumar
		Date ValidThrufechaSalida = calendar.getTime(); // Y ya tienes la fecha sumada.

		if (sessionid == null) {
			respuesta.setMsg("Llamada al servicio malformado");
			estatus = HttpStatus.BAD_REQUEST;
			return new ResponseEntity(respuesta, estatus);
		} else {
			sessionid = sessionid.substring(7);
			Optional<Users> encontreSessionUsuario = usersRepository.getBySessionid(sessionid);

			if (encontreSessionUsuario.isPresent()) {
				// Eliminar un registro de un usuario. (priv 633)

				String fechaComoCadena;
				Date FechaReg = encontreSessionUsuario.get().getValidthru();
				// Llamada a la funcion que validad el tiempo de Session, retorna la fecha
				// sumandole el tiempo de session activa, y vacio si no esta activa

				// fechaComoCadena = securityService.consultarSessionActiva(FechaReg,fecha2);
				fechaComoCadena = securityService.consultarSessionActiva(FechaReg, fecha2,
						encontreSessionUsuario.get().getId());
				if (fechaComoCadena == "") {

					String var2 = "";
					boolean bloked2 = false;
					RespuestaMsgDto respuestaDto2 = new RespuestaMsgDto(var2);
					// respuestaDto.setBlocked(bloked);
					respuestaDto2.setMsg("Sesión expirada o inválida");
					return new ResponseEntity(respuestaDto, HttpStatus.UNAUTHORIZED);

				}

				Roles roles = encontreSessionUsuario.get().getRolid();
				int idrol = roles.getId();
				int rolisvalid = auditRepository.getCantbyRolAndPrivi(idrol, 443);
				// rolisvalid = 3;
				if (rolisvalid == 0) {

					// boolean bloked = false;
					RespuestaMsgDto respuestaPrivDto = new RespuestaMsgDto(var);
					// respuestaDto.setBlocked(bloked);
					respuestaPrivDto.setMsg("No tiene los Privilegios");
					return new ResponseEntity(respuestaPrivDto, HttpStatus.FORBIDDEN);

				}

				try {

					if (suppliersRepository.existsById(supplierid)) {

						Optional<Suppliers> uniDelete = suppliersRepository.findById(supplierid);
						String module = "Proveedores";
						String Descmodule = "Se eliminó el Proveedor: " + uniDelete.get().getName() + " con Id: "
								+ uniDelete.get().getId();

						auditDto.setIpaddr(HttpReqRespUtils.getClientIpAddressIfServletRequestExist());

						String singo1 = "(";
						String singo2 = ")";
						String usryemail = encontreSessionUsuario.get().getUsr().concat(" ").concat(singo1)
								.concat(encontreSessionUsuario.get().getEmail().concat(singo2));
						auditDto.setUserref(usryemail);
						auditDto.setModule(module);
						auditDto.setDesc(Descmodule);
						auditDto.setCreatedat(fechaDate);
						usersService.registrarAuditSesion(auditDto);

						// Borro el rol boolean existeUsers = ;
						int valor = 0;
						try {
							// usersRepository.deleteusersbyid(userid,fechaDate,valor);
							suppliersRepository.deleteSuppliersid(supplierid);
							respuestaValueDto = new RespuestaValueDto(supplierid);

							estatus = HttpStatus.OK;
							return new ResponseEntity(respuestaValueDto, estatus);
						} catch (Exception e) {// Error Interno
							respuesta.setMsg("Error interno del servidor -conflicto. ");
							estatus = HttpStatus.CONFLICT;
							return new ResponseEntity(respuesta, estatus);
						}
					} else {// Registro no encontrado
						respuesta.setMsg("Registro no encontrado");
						estatus = HttpStatus.NOT_FOUND;
						return new ResponseEntity(respuesta, estatus);

					}

				} catch (Exception e) {// Error Interno
					// Manejo de excepciones
					respuesta.setMsg("Error interno del servidor");
					estatus = HttpStatus.INTERNAL_SERVER_ERROR;
					return new ResponseEntity(respuesta, estatus);
				} finally {
					if (entityManager != null && entityManager.isOpen()) {
						entityManager.close();
					}
				}
			} else {
				respuesta.setMsg("Sesión expirada o inválida");
				estatus = HttpStatus.UNAUTHORIZED;
				return new ResponseEntity(respuesta, estatus);

			}

		}

	}

}
