com.dominion.salud.mpr.negocio.service.tratamientos.impl.DispensacionesServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.dominion.salud.mpr.negocio.service.tratamientos.impl.DispensacionesServiceImpl.java

Source

/*
 * Copyright (C) 2016 Dominion Global
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.dominion.salud.mpr.negocio.service.tratamientos.impl;

import ca.uhn.hl7v2.model.v25.segment.OBX;
import ca.uhn.hl7v2.model.v25.segment.ORC;
import ca.uhn.hl7v2.model.v25.segment.PID;
import ca.uhn.hl7v2.model.v25.segment.PV1;
import ca.uhn.hl7v2.model.v25.segment.RXD;
import ca.uhn.hl7v2.model.v25.segment.TQ1;
import com.dominion.salud.empi.EMPIClient;
import com.dominion.salud.empi.response.EMPIResponse;
import com.dominion.salud.mpr.hl7.er7.ER7Parser;
import com.dominion.salud.mpr.hl7.v25.group.ZDS_O13_ORDER;
import com.dominion.salud.mpr.hl7.v25.message.ZDS_O13;
import com.dominion.salud.mpr.hl7.v25.segment.Z01;
import com.dominion.salud.mpr.negocio.configuration.MPRConstantes;
import com.dominion.salud.mpr.negocio.entities.acuerdos.Acuerdos;
import com.dominion.salud.mpr.negocio.entities.admin.Centros;
import com.dominion.salud.mpr.negocio.entities.equivalencias.FormasFarExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.IndicacionesExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.LineasTratExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.MarcaBioExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.PautasExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.ProgramasExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.ProtocolosExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.SecuenciasExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.ServiciosExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.SexosExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.SitClinicaExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.TiposUsoExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.UnidMedExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.ValMarcaBioExt;
import com.dominion.salud.mpr.negocio.entities.equivalencias.ValSitClinicaExt;
import com.dominion.salud.mpr.negocio.entities.maestros.Diagnosticos;
import com.dominion.salud.mpr.negocio.entities.maestros.Marcas;
import com.dominion.salud.mpr.negocio.entities.maestros.Medicos;
import com.dominion.salud.mpr.negocio.entities.tratamientos.Dispensaciones;
import com.dominion.salud.mpr.negocio.entities.tratamientos.EpiMarcaBio;
import com.dominion.salud.mpr.negocio.entities.tratamientos.EpiSitClinica;
import com.dominion.salud.mpr.negocio.entities.tratamientos.EpiValMarcaBio;
import com.dominion.salud.mpr.negocio.entities.tratamientos.EpiValSitClinica;
import com.dominion.salud.mpr.negocio.entities.tratamientos.Episodios;
import com.dominion.salud.mpr.negocio.entities.tratamientos.Pacientes;
import com.dominion.salud.mpr.negocio.entities.tratamientos.Prescripciones;
import com.dominion.salud.mpr.negocio.repositories.tratamientos.DispensacionesRepository;
import com.dominion.salud.mpr.negocio.service.acuerdos.AcuerdosService;
import com.dominion.salud.mpr.negocio.service.admin.CentrosService;
import com.dominion.salud.mpr.negocio.service.equivalencias.FormasFarExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.IndicacionesExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.LineasTratExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.MarcaBioExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.PautasExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.ProgramasExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.ProtocolosExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.SecuenciasExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.ServiciosExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.SexosExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.SitClinicaExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.TiposUsoExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.UnidMedExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.ValMarcaBioExtService;
import com.dominion.salud.mpr.negocio.service.equivalencias.ValSitClinicaExtService;
import com.dominion.salud.mpr.negocio.service.exception.NoExisteEquivalenciaException;
import com.dominion.salud.mpr.negocio.service.maestros.DiagnosticosService;
import com.dominion.salud.mpr.negocio.service.maestros.MarcasService;
import com.dominion.salud.mpr.negocio.service.maestros.MedicosService;
import com.dominion.salud.mpr.negocio.service.tratamientos.DispensacionesService;
import com.dominion.salud.mpr.negocio.service.tratamientos.EpiMarcaBioService;
import com.dominion.salud.mpr.negocio.service.tratamientos.EpiSitClinicaService;
import com.dominion.salud.mpr.negocio.service.tratamientos.EpisodiosService;
import com.dominion.salud.mpr.negocio.service.tratamientos.PacientesService;
import com.dominion.salud.mpr.negocio.service.tratamientos.PrescripcionesService;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.NoResultException;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author jcgonzalez
 */
@Service("dispensacionesService")
public class DispensacionesServiceImpl extends AbstractTratamientosServiceImpl<Dispensaciones, Long>
        implements DispensacionesService {

    private static final Logger logger = LoggerFactory.getLogger(DispensacionesServiceImpl.class);

    @Autowired
    private DispensacionesRepository dispensacionesRepository;

    @Autowired
    private AcuerdosService acuerdosService;
    @Autowired
    private CentrosService centrosService;

    //CRITERIOS DE INCLUSION
    @Autowired
    private SexosExtService sexosExtService;
    @Autowired
    private IndicacionesExtService indicacionesExtService;
    @Autowired
    private LineasTratExtService lineasTratExtService;
    @Autowired
    private SitClinicaExtService sitClinicaExtService;
    @Autowired
    private ValSitClinicaExtService valSitClinicaExtService;
    @Autowired
    private MarcaBioExtService marcaBioExtService;
    @Autowired
    private ValMarcaBioExtService valMarcaBioExtService;
    @Autowired
    private ProgramasExtService programasExtService;
    @Autowired
    private DiagnosticosService diagnosticosService;

    //MAESTROS
    @Autowired
    private TiposUsoExtService tiposUsoExtService;
    @Autowired
    private ProtocolosExtService protocolosExtService;
    @Autowired
    private ServiciosExtService serviciosExtService;
    @Autowired
    private SecuenciasExtService secuenciasExtService;
    @Autowired
    private PautasExtService pautasExtService;
    @Autowired
    private UnidMedExtService unidMedExtService;
    @Autowired
    private FormasFarExtService formasFarExtService;

    @Autowired
    private MedicosService medicosService;
    @Autowired
    private MarcasService marcasService;
    @Autowired
    private PacientesService pacientesService;
    @Autowired
    private EpisodiosService episodiosService;
    @Autowired
    private EpiMarcaBioService epiMarcaBioService;
    @Autowired
    private EpiSitClinicaService epiSitClinicaService;
    @Autowired
    private PrescripcionesService prescripcionesService;

    /**
     * Retorna una dispensacion por codigo de dispensacion
     *
     * @param dispensaciones con el codigo de dispensacion a buscar
     * @return la dispensacion obtenida
     */
    @Override
    public Dispensaciones findByCodDispensacion(Dispensaciones dispensaciones) {
        return dispensacionesRepository.findByCodDispensacion(dispensaciones);
    }

    /**
     *
     * @param message
     * @throws Exception
     */
    @Override
    @Transactional(noRollbackFor = { NoResultException.class }, rollbackFor = { Exception.class })
    public void processMessage(String message) throws Exception {
        logger.info("INICIANDO EL PROCESADO DEL MOVIMIENTO ENTRANTE");
        logger.info(message);

        //Resultado final del proceso
        List<String> resultado = new ArrayList<>();
        int contador = 0;

        try {
            ZDS_O13 hl7message = (ZDS_O13) new ER7Parser().parse(message);
            PID pid = hl7message.getPATIENT().getPID();
            PV1 pv1 = hl7message.getPATIENT().getPATIENT_VISIT().getPV1();

            List<ZDS_O13_ORDER> zds_o13_orders = hl7message.getORDERAll();
            for (ZDS_O13_ORDER zds_o13_order : zds_o13_orders) {
                ORC orc = zds_o13_order.getORC();
                TQ1 tq1 = zds_o13_order.getTIMING().getTQ1();
                RXD rxd = zds_o13_order.getRXD();
                Z01 z01 = (Z01) zds_o13_order.getZ01();
                OBX obx = zds_o13_order.getOBSERVATION().getOBX();

                //Z01.15 - Datos del Acuerdo
                logger.debug("     Procesando datos del ACUERDO (" + z01.getAcuerdo().getIdentifier().getValue()
                        + ") " + z01.getAcuerdo().getText().getValue());
                Acuerdos acuerdos = null;
                if (StringUtils.isNotBlank(z01.getAcuerdo().getIdentifier().getValue())) {
                    try {
                        acuerdos = new Acuerdos();
                        acuerdos.setCodAcuerdo(z01.getAcuerdo().getIdentifier().getValue());
                        acuerdos = acuerdosService.findByCodAcuerdo(acuerdos);
                        logger.debug("          Z01.15 - Datos del Acuerdo: "
                                + (acuerdos != null ? acuerdos.toString() : "null"));
                    } catch (NoResultException nre) {
                        acuerdos = null;
                        logger.debug("          El movimiento no coincide con ningun ACUERDO");
                    }
                } else {
                    logger.debug("          El movimiento no coincide con ningun ACUERDO");
                }

                //ORC.21.10 - Centro
                logger.debug("     Procesando datos del CENTRO ("
                        + orc.getOrderingFacilityName(0).getOrganizationIdentifier().getValue() + ") "
                        + orc.getOrderingFacilityName(0).getOrganizationName().getValue());
                Centros centros = new Centros();
                centros.setCodCentro(orc.getOrderingFacilityName(0).getOrganizationIdentifier().getValue()); //ORC.21.10
                try {
                    centros = centrosService.findByCodCentro(centros);
                    logger.debug("          ORC.21.10 - Centro: " + centros.toString());
                } catch (NoResultException nre) {
                    logger.error(
                            "          No se puede procesar el movimiento sin EQUIVALENCIA para el campo ORC.21.10 - CENTRO ("
                                    + orc.getOrderingFacilityName(0).getOrganizationIdentifier().getValue() + ")");
                    resultado.add("No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO: CENTRO ("
                            + orc.getOrderingFacilityName(0).getOrganizationIdentifier().getValue() + ")");
                }

                //PID.3 - Identificadores del paciente (NHC) y (CIPA)
                Integer nhc = null;
                String cipa = null;
                logger.debug("     Procesando el campo PID.3 - Identificadores del Paciente");
                for (int i = 0; i < pid.getPatientIdentifierList().length; i++) { // PID.3 - PatientIdentifierList
                    if (StringUtils.equalsIgnoreCase(
                            pid.getPatientIdentifierList(i).getIdentifierTypeCode().getValue(), "PI")) {
                        try {
                            nhc = NumberUtils
                                    .createInteger(pid.getPatientIdentifierList(i).getIDNumber().getValue());
                            logger.debug("               PID.3(PI): " + nhc);
                        } catch (Exception e) {
                            logger.warn("El campo PID.3(PI) - NHC ("
                                    + pid.getPatientIdentifierList(i).getIDNumber().getValue()
                                    + ") no es correcto");
                        }
                    } else if (StringUtils.equalsIgnoreCase(
                            pid.getPatientIdentifierList(i).getIdentifierTypeCode().getValue(), "CIPA")) {
                        if (StringUtils.isNotBlank(pid.getPatientIdentifierList(i).getIDNumber().getValue())) {
                            cipa = pid.getPatientIdentifierList(i).getIDNumber().getValue();
                            logger.debug("               PID.3(CIPA): " + cipa);
                        }
                    }
                }

                //PID.5 - Paciente
                logger.debug("     Procesando datos del PACIENTE ("
                        + pid.getPatientName(0).getFamilyName().getSurname().getValue() + " "
                        + pid.getMotherSMaidenName(0).getFamilyName().getSurname().getValue() + ", "
                        + pid.getPatientName(0).getGivenName().getValue() + ")");
                Pacientes pacientes = new Pacientes();
                pacientes.setCipa(cipa);
                pacientes.setTxtNombre(pid.getPatientName(0).getGivenName().getValue()); //PID.5.2
                pacientes.setTxtApellido1(pid.getPatientName(0).getFamilyName().getSurname().getValue()); //PID.5.1.1
                pacientes.setTxtApellido2(pid.getMotherSMaidenName(0).getFamilyName().getSurname().getValue()); //PID.6.1.1
                logger.debug("          PID.5 - Paciente: " + pacientes.toString());

                //Datos del Episodio
                Episodios episodios = new Episodios();
                //PV1.2 - Clase de Paciente
                logger.debug(
                        "     Procesando datos de la CLASE DE PACIENTE (" + pv1.getPatientClass().getValue() + ")"); //PV1.2
                if (StringUtils.isNotBlank(pv1.getPatientClass().getValue())) {
                    if (StringUtils.equals(pv1.getPatientClass().getValue(), "O")) { //Outpatient
                        //PV1.18 - Tipo de Paciente
                        logger.debug("          Procesando datos del TIPO DE PACIENTE ("
                                + pv1.getPatientType().getValue() + ")"); //PV1.18
                        if (StringUtils.isNotBlank(pv1.getPatientType().getValue())) {
                            episodios.setAmbito(pv1.getPatientType().getValue());
                        } else {
                            logger.error(
                                    "          No se puede procesar el movimiento sin INFORMACION en el CAMPO PV1.18 - TIPO DE PACIENTE ("
                                            + pv1.getPatientType().getValue() + ")");
                            resultado.add(
                                    "No se puede procesar el movimiento sin INFORMACION en el CAMPO: TIPO DE PACIENTE");
                        }
                    } else {
                        episodios.setAmbito("H");
                    }
                    logger.debug("          PV1.2 - Clase de Paciente y PV1.18 - Tipo de Paciente: "
                            + episodios.getAmbito());
                } else {
                    logger.error(
                            "          No se puede procesar el movimiento sin INFORMACION en el CAMPO PV1.2 - CLASE DE PACIENTE ("
                                    + pv1.getPatientClass().getValue() + ")");
                    resultado.add(
                            "No se puede procesar el movimiento sin INFORMACION en el CAMPO: CLASE DE PACIENTE");
                }

                //PV1.19.1 - Codigo de Episodio
                String cod_episodio = "";
                logger.debug("     Procesando datos del CODIGO DE EPISODIO ("
                        + pv1.getVisitNumber().getIDNumber().getValue() + ")"); //PV1.19.1
                if (StringUtils.isNotBlank(pv1.getVisitNumber().getIDNumber().getValue())) {
                    cod_episodio = pv1.getVisitNumber().getIDNumber().getValue();
                    logger.debug("          PV1.19.1 - Codigo de Episodio: " + cod_episodio);
                } else {
                    logger.error(
                            "          No se puede procesar el movimiento sin INFORMACION en el CAMPO PV1.19.1 - CODIGO DE EPISODIO ("
                                    + pv1.getVisitNumber().getIDNumber().getValue() + ")");
                    resultado.add(
                            "No se puede procesar el movimiento sin INFORMACION en el CAMPO: CODIGO DE EPISODIO");
                }

                //ORC.2.1 - Codigo de Prescripcion
                String cod_prescripcion = null;
                logger.debug("     Procesando CODIGO DE PRESCRIPCION ("
                        + orc.getPlacerOrderNumber().getEntityIdentifier().getValue() + ")"); //ORC.2.1
                if (StringUtils.isNotBlank(orc.getPlacerOrderNumber().getEntityIdentifier().getValue())) {
                    cod_prescripcion = orc.getPlacerOrderNumber().getEntityIdentifier().getValue();
                    logger.debug("          ORC.2.1 - Codigo de Prescripcion: " + cod_prescripcion);
                } else {
                    logger.error(
                            "          No se puede procesar el movimiento sin INFORMACION en el CAMPO ORC.2.1 - CODIGO DE PRESCRIPCION ("
                                    + orc.getPlacerOrderNumber().getEntityIdentifier().getValue() + ")");
                    resultado.add(
                            "No se puede procesar el movimiento sin INFORMACION en el CAMPO: CODIGO DE PRESCRIPCION");
                }

                //ORC.3.1 - Codigo de Dispensacion
                String cod_dispensacion = null;
                logger.debug("     Procesando CODIGO DE DISPENSACION ("
                        + orc.getFillerOrderNumber().getEntityIdentifier().getValue() + ")"); //ORC.2.1
                if (StringUtils.isNotBlank(orc.getFillerOrderNumber().getEntityIdentifier().getValue())) {
                    cod_dispensacion = orc.getFillerOrderNumber().getEntityIdentifier().getValue();
                    logger.debug("          ORC.3.1 - Codigo de Dispensacion: " + cod_dispensacion);
                } else {
                    logger.error(
                            "          No se puede procesar el movimiento sin INFORMACION en el CAMPO ORC.3.1 - CODIGO DE DISPENSACION ("
                                    + orc.getFillerOrderNumber().getEntityIdentifier().getValue() + ")");
                    resultado.add(
                            "No se puede procesar el movimiento sin INFORMACION en el CAMPO: CODIGO DE DISPENSACION");
                }

                //CRITERIOS DE INCLUSION
                //PID.8 - Sexo
                logger.debug("     Procesando datos del SEXO (" + pid.getAdministrativeSex().getValue() + ")");
                SexosExt sexosExt = new SexosExt();
                try {
                    sexosExt.setCentros(centros);
                    sexosExt.setCodSexoExt(pid.getAdministrativeSex().getValue()); //PID.8
                    sexosExt.setTxtSexoExt(pid.getAdministrativeSex().getValue()); //PID.8
                    sexosExt = sexosExtService.traducirEquivalencia(sexosExt);
                    logger.debug("          PID.8 - Sexo: " + sexosExt.toString());
                } catch (NoExisteEquivalenciaException neee) {
                    if (acuerdos != null) {
                        if (acuerdos.getSexos() != null) { //Es un criterio de inclusion del acuerdo
                            if (StringUtils.isNotBlank(pid.getAdministrativeSex().getValue())) {
                                logger.error(
                                        "               No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo PID.8 - SEXO ("
                                                + pid.getAdministrativeSex().getValue() + ")");
                                resultado.add(
                                        "No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: SEXO ("
                                                + pid.getAdministrativeSex().getValue() + ")");
                            } else {
                                logger.error(
                                        "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo PID.8 - SEXO");
                                resultado.add(
                                        "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: SEXO");
                            }
                        } else if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                            if (StringUtils.isNotBlank(pid.getAdministrativeSex().getValue())) {
                                logger.error(
                                        "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo PID.8 - SEXO ("
                                                + pid.getAdministrativeSex().getValue() + ")");
                                resultado.add(
                                        "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: SEXO ("
                                                + pid.getAdministrativeSex().getValue() + ")");
                            }
                        }
                    }
                }

                //Z01.6 - Indicacion
                logger.debug(
                        "     Procesando datos de la INDICACION (" + z01.getIndicacion().getIdentifier().getValue()
                                + ") " + z01.getIndicacion().getText().getValue());
                IndicacionesExt indicacionesExt = new IndicacionesExt();
                try {
                    indicacionesExt.setCentros(centros);
                    indicacionesExt.setCodIndicacionExt(z01.getIndicacion().getIdentifier().getValue()); //Z01.6.1
                    indicacionesExt.setTxtIndicacionExt(z01.getIndicacion().getText().getValue()); //Z01.6.2
                    indicacionesExt = indicacionesExtService.traducirEquivalenciaAndInsert(indicacionesExt);
                    logger.debug("          Z01.6 - Indicacion: " + indicacionesExt.toString());
                } catch (NoExisteEquivalenciaException neee) {
                    if (acuerdos != null) {
                        if (acuerdos.getAcuIndicacioneses() != null && !acuerdos.getAcuIndicacioneses().isEmpty()) { //Es un criterio de inclusion del acuerdo
                            if (StringUtils.isNotBlank(z01.getIndicacion().getIdentifier().getValue())) {
                                logger.error(
                                        "               No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.6 - INDICACION ("
                                                + z01.getIndicacion().getIdentifier().getValue() + ") "
                                                + z01.getIndicacion().getText().getValue());
                                resultado.add(
                                        "No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: INDICACION ("
                                                + z01.getIndicacion().getIdentifier().getValue() + ") "
                                                + z01.getIndicacion().getText().getValue());
                            } else {
                                logger.error(
                                        "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo Z01.6 - INDICACION");
                                resultado.add(
                                        "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: INDICACION");
                            }
                        } else if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                            if (StringUtils.isNotBlank(z01.getIndicacion().getIdentifier().getValue())) {
                                logger.error(
                                        "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.6 - INDICACION ("
                                                + z01.getIndicacion().getIdentifier().getValue() + ") "
                                                + z01.getIndicacion().getText().getValue());
                                resultado.add(
                                        "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: INDICACION ("
                                                + z01.getIndicacion().getIdentifier().getValue() + ") "
                                                + z01.getIndicacion().getText().getValue());
                            }
                        }
                    }
                }

                //Z01.5 - Linea de Tratamiento
                logger.debug("     Procesando datos de la LINEA DE TRATAMIENTO ("
                        + z01.getLineaTrat().getIdentifier().getValue() + ") "
                        + z01.getLineaTrat().getText().getValue());
                LineasTratExt lineasTratExt = new LineasTratExt();
                try {
                    lineasTratExt.setCentros(centros);
                    lineasTratExt.setCodLineaTratExt(z01.getLineaTrat().getIdentifier().getValue()); //Z01.5.1
                    lineasTratExt.setTxtLineaTratExt(z01.getLineaTrat().getText().getValue()); //Z01.5.2
                    lineasTratExt = lineasTratExtService.traducirEquivalenciaAndInsert(lineasTratExt);
                    logger.debug("          Z01.5 - Linea de Tratamiento: " + lineasTratExt.toString());
                } catch (NoExisteEquivalenciaException neee) {
                    if (acuerdos != null) {
                        if (acuerdos.getAcuLineasTrats() != null && !acuerdos.getAcuLineasTrats().isEmpty()) { //Es un criterio de inclusion del acuerdo
                            if (StringUtils.isNotBlank(z01.getLineaTrat().getIdentifier().getValue())) {
                                logger.error(
                                        "               No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.5 - LINEA DE TRATAMIENTO ("
                                                + z01.getLineaTrat().getIdentifier().getValue() + ") "
                                                + z01.getLineaTrat().getText().getValue());
                                resultado.add(
                                        "No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: LINEA DE TRATAMIENTO ("
                                                + z01.getLineaTrat().getIdentifier().getValue() + ") "
                                                + z01.getLineaTrat().getText().getValue());
                            } else {
                                logger.error(
                                        "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo Z01.5 - LINEA DE TRATAMIENTO");
                                resultado.add(
                                        "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: LINEA DE TRATAMIENTO");
                            }
                        } else if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                            if (StringUtils.isNotBlank(z01.getLineaTrat().getIdentifier().getValue())) {
                                logger.error(
                                        "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.5 - LINEA DE TRATAMIENTO ("
                                                + z01.getLineaTrat().getIdentifier().getValue() + ") "
                                                + z01.getLineaTrat().getText().getValue());
                                resultado.add(
                                        "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: LINEA DE TRATAMIENTO ("
                                                + z01.getLineaTrat().getIdentifier().getValue() + ") "
                                                + z01.getLineaTrat().getText().getValue());
                            }
                        }
                    }
                }

                //Z01.2[] - Situaciones Clinicas de Partida
                logger.debug(
                        "     Procesando SITUACIONES CLINICAS DE PARTIDA y VALORES DE SITUACION CLINICA DE PARTIDA");
                List<EpiSitClinica> epiSitClinicas = new ArrayList<>();
                if (z01.getSituacionClinica() != null && z01.getSituacionClinica().length > 0) {
                    for (int i = 0; i < z01.getSituacionClinica().length; i++) {
                        logger.debug("          Procesando SITUACION CLINICA DE PARTIDA ("
                                + z01.getSituacionClinica(i).getIdentifier().getValue() + ") "
                                + z01.getSituacionClinica(i).getText().getValue());

                        try {
                            SitClinicaExt sitClinicaExt = new SitClinicaExt();
                            sitClinicaExt.setCentros(centros);
                            sitClinicaExt
                                    .setCodSitClinicaExt(z01.getSituacionClinica(i).getIdentifier().getValue()); //Z01.2.1
                            sitClinicaExt.setTxtSitClinicaExt(z01.getSituacionClinica(i).getText().getValue()); //Z01.2.2
                            sitClinicaExt = sitClinicaExtService.traducirEquivalenciaAndInsert(sitClinicaExt);
                            logger.debug(
                                    "               Z01.2.(1,2) - Situacion Clinica: " + sitClinicaExt.toString());

                            EpiSitClinica epiSitClinica = new EpiSitClinica();
                            epiSitClinica.setEpisodios(episodios);
                            epiSitClinica.setSitClinica(sitClinicaExt.getSitClinica());
                            epiSitClinicas.add(epiSitClinica);

                            //Z01.2.(4,5) - Valores de Situacion Clinica de Partida
                            List<EpiValSitClinica> epiValSitClinicas = new ArrayList<>();
                            logger.debug("               Procesando VALOR DE SITUACION CLINICA DE PARTIDA ("
                                    + z01.getSituacionClinica(i).getAlternateIdentifier().getValue() + ") "
                                    + z01.getSituacionClinica(i).getAlternateText().getValue() + " ["
                                    + z01.getSituacionClinica(i).getNameOfAlternateCodingSystem() + "]");
                            if (StringUtils
                                    .isNotBlank(z01.getSituacionClinica(i).getAlternateIdentifier().getValue())) {
                                try {
                                    logger.debug("               Procesando VALOR DE SITUACION CLINICA DE PARTIDA ("
                                            + z01.getSituacionClinica(i).getAlternateIdentifier().getValue() + ") "
                                            + z01.getSituacionClinica(i).getAlternateText().getValue());
                                    ValSitClinicaExt valSitClinicaExt = new ValSitClinicaExt();
                                    valSitClinicaExt.setCentros(centros);
                                    valSitClinicaExt.setCodValSitClinicaExt(
                                            z01.getSituacionClinica(i).getAlternateIdentifier().getValue()); //Z01.2.4
                                    valSitClinicaExt.setTxtValSitClinicaExt(
                                            z01.getSituacionClinica(i).getAlternateText().getValue()); //Z01.2.5
                                    valSitClinicaExt = valSitClinicaExtService
                                            .traducirEquivalenciaAndInsert(valSitClinicaExt);
                                    logger.debug(
                                            "                    Z01.2.(4,5) - Valor de Situacion Clinica de Partida: "
                                                    + valSitClinicaExt.toString());

                                    EpiValSitClinica epiValSitClinica = new EpiValSitClinica();
                                    epiValSitClinica.setEpiSitClinica(epiSitClinica);
                                    epiValSitClinica.setValSitClinica(valSitClinicaExt.getValSitClinica());
                                    epiValSitClinicas.add(epiValSitClinica);
                                } catch (NoExisteEquivalenciaException neee) {
                                    if (acuerdos != null) {
                                        if (acuerdos.getAcuSitClinicas() != null
                                                && !acuerdos.getAcuSitClinicas().isEmpty()) { //Es un criterio de inclusion del acuerdo
                                            if (StringUtils.isNotBlank(z01.getSituacionClinica(i)
                                                    .getAlternateIdentifier().getValue())) {
                                                logger.error(
                                                        "               No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.2.(4,5) - VALOR DE SITUACION CLINICA DE PARTIDA ("
                                                                + z01.getSituacionClinica(i)
                                                                        .getAlternateIdentifier().getValue()
                                                                + ") " + z01.getSituacionClinica(i)
                                                                        .getAlternateText().getValue());
                                                resultado.add(
                                                        "No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: VALOR DE SITUACION CLINICA DE PARTIDA ("
                                                                + z01.getSituacionClinica(i)
                                                                        .getAlternateIdentifier().getValue()
                                                                + ") " + z01.getSituacionClinica(i)
                                                                        .getAlternateText().getValue());
                                            } else {
                                                logger.error(
                                                        "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo Z01.2.(4,5) - VALOR DE SITUACION CLINICA DE PARTIDA");
                                                resultado.add(
                                                        "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: VALOR DE SITUACION CLINICA DE PARTIDA");
                                            }
                                        } else if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                                            if (StringUtils.isNotBlank(z01.getSituacionClinica(i)
                                                    .getAlternateIdentifier().getValue())) {
                                                logger.error(
                                                        "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.2.(4,5) - VALOR DE SITUACION CLINICA DE PARTIDA ("
                                                                + z01.getSituacionClinica(i)
                                                                        .getAlternateIdentifier().getValue()
                                                                + ") " + z01.getSituacionClinica(i)
                                                                        .getAlternateText().getValue());
                                                resultado.add(
                                                        "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: VALOR DE SITUACION CLINICA DE PARTIDA ("
                                                                + z01.getSituacionClinica(i)
                                                                        .getAlternateIdentifier().getValue()
                                                                + ") " + z01.getSituacionClinica(i)
                                                                        .getAlternateText().getValue());
                                            }
                                        }
                                    }
                                }
                            } else if (StringUtils.isNotBlank(
                                    z01.getSituacionClinica(i).getNameOfAlternateCodingSystem().getValue())) {
                                logger.debug("               Procesando VALOR DE SITUACION CLINICA DE PARTIDA ("
                                        + z01.getSituacionClinica(i).getNameOfAlternateCodingSystem().getValue()
                                        + ")");
                                EpiValSitClinica epiValSitClinica = new EpiValSitClinica();
                                epiValSitClinica.setEpiSitClinica(epiSitClinica);
                                epiValSitClinica.setValor(
                                        z01.getSituacionClinica(i).getNameOfAlternateCodingSystem().getValue());
                                epiValSitClinicas.add(epiValSitClinica);
                            }
                            epiSitClinica.setEpiValSitClinicas(epiValSitClinicas);

                        } catch (NoExisteEquivalenciaException neee) {
                            if (acuerdos != null) {
                                if (acuerdos.getAcuSitClinicas() != null
                                        && !acuerdos.getAcuSitClinicas().isEmpty()) { //Es un criterio de inclusion del acuerdo
                                    if (StringUtils
                                            .isNotBlank(z01.getSituacionClinica(i).getIdentifier().getValue())) {
                                        logger.error(
                                                "               No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.2.(1,2) - SITUACION CLINICA DE PARTIDA ("
                                                        + z01.getSituacionClinica(i).getIdentifier().getValue()
                                                        + ") " + z01.getSituacionClinica(i).getText().getValue());
                                        resultado.add(
                                                "No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: SITUACION CLINICA DE PARTIDA ("
                                                        + z01.getSituacionClinica(i).getIdentifier().getValue()
                                                        + ") " + z01.getSituacionClinica(i).getText().getValue());
                                    } else {
                                        logger.error(
                                                "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo Z01.2.(1,2) - SITUACION CLINICA DE PARTIDA");
                                        resultado.add(
                                                "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: SITUACION CLINICA DE PARTIDA");
                                    }
                                } else if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                                    if (StringUtils
                                            .isNotBlank(z01.getSituacionClinica(i).getIdentifier().getValue())) {
                                        logger.error(
                                                "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.2.(1,2) - SITUACION CLINICA DE PARTIDA ("
                                                        + z01.getSituacionClinica(i).getIdentifier().getValue()
                                                        + ") " + z01.getSituacionClinica(i).getText().getValue());
                                        resultado.add(
                                                "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: SITUACION CLINICA DE PARTIDA ("
                                                        + z01.getSituacionClinica(i).getIdentifier().getValue()
                                                        + ") " + z01.getSituacionClinica(i).getText().getValue());
                                    }
                                }
                            }
                        }
                    }
                }

                //Z01.3[] - Marcadores Biologicos
                logger.debug("     Procesando MARCADORES BIOLOGICOS y VALORES DE MARCADOR BIOLOGICO");
                List<EpiMarcaBio> epiMarcaBios = new ArrayList<>();
                if (z01.getMarcadorBiologico() != null && z01.getMarcadorBiologico().length > 0) {
                    for (int i = 0; i < z01.getMarcadorBiologico().length; i++) {
                        logger.debug("          Procesando MARCADOR BIOLOGICO ("
                                + z01.getMarcadorBiologico(i).getIdentifier().getValue() + ") "
                                + z01.getMarcadorBiologico(i).getText().getValue());

                        try {
                            MarcaBioExt marcaBioExt = new MarcaBioExt();
                            marcaBioExt.setCentros(centros);
                            marcaBioExt.setCodMarcaBioExt(z01.getMarcadorBiologico(i).getIdentifier().getValue()); //Z01.2.1
                            marcaBioExt.setTxtMarcaBioExt(z01.getMarcadorBiologico(i).getText().getValue()); //Z01.2.2
                            marcaBioExt = marcaBioExtService.traducirEquivalenciaAndInsert(marcaBioExt);
                            logger.debug(
                                    "               Z01.3.(1,2) - Marcador Biologico: " + marcaBioExt.toString());

                            EpiMarcaBio epiMarcaBio = new EpiMarcaBio();
                            epiMarcaBio.setEpisodios(episodios);
                            epiMarcaBio.setMarcaBio(marcaBioExt.getMarcaBio());
                            epiMarcaBios.add(epiMarcaBio);

                            //Z01.3.(4,5) - Valores de Marcador Biologico
                            List<EpiValMarcaBio> epiValMarcaBios = new ArrayList<>();
                            logger.debug("               Procesando VALOR DE MARCADOR BIOLOGICO ("
                                    + z01.getMarcadorBiologico(i).getAlternateIdentifier().getValue() + ") "
                                    + z01.getMarcadorBiologico(i).getAlternateText().getValue() + " ["
                                    + z01.getMarcadorBiologico(i).getNameOfAlternateCodingSystem().getValue()
                                    + "]");
                            if (StringUtils
                                    .isNotBlank(z01.getMarcadorBiologico(i).getAlternateIdentifier().getValue())) {
                                try {
                                    logger.debug("               Procesando VALOR DE MARCADOR BIOLOGICO ("
                                            + z01.getMarcadorBiologico(i).getAlternateIdentifier().getValue() + ") "
                                            + z01.getMarcadorBiologico(i).getAlternateText().getValue());
                                    ValMarcaBioExt valMarcaBioExt = new ValMarcaBioExt();
                                    valMarcaBioExt.setCentros(centros);
                                    valMarcaBioExt.setCodValMarcaBioExt(
                                            z01.getMarcadorBiologico(i).getAlternateIdentifier().getValue()); //Z01.3.4
                                    valMarcaBioExt.setTxtValMarcaBioExt(
                                            z01.getMarcadorBiologico(i).getAlternateText().getValue()); //Z01.3.5
                                    valMarcaBioExt = valMarcaBioExtService
                                            .traducirEquivalenciaAndInsert(valMarcaBioExt);
                                    logger.debug("                    Z01.3.(4,5) - Valor de Marcador Biologico: "
                                            + valMarcaBioExt.toString());

                                    EpiValMarcaBio epiValMarcaBio = new EpiValMarcaBio();
                                    epiValMarcaBio.setEpiMarcaBio(epiMarcaBio);
                                    epiValMarcaBio.setValMarcaBio(valMarcaBioExt.getValMarcaBio());
                                    epiValMarcaBios.add(epiValMarcaBio);
                                } catch (NoExisteEquivalenciaException neee) {
                                    if (acuerdos != null) {
                                        if (acuerdos.getAcuMarcaBios() != null
                                                && !acuerdos.getAcuMarcaBios().isEmpty()) { //Es un criterio de inclusion del acuerdo
                                            if (StringUtils.isNotBlank(z01.getMarcadorBiologico(i)
                                                    .getAlternateIdentifier().getValue())) {
                                                logger.error(
                                                        "               No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.3.(4,5) - VALOR DE MARCADOR BIOLOGICO ("
                                                                + z01.getMarcadorBiologico(i)
                                                                        .getAlternateIdentifier().getValue()
                                                                + ") " + z01.getMarcadorBiologico(i)
                                                                        .getAlternateText().getValue());
                                                resultado.add(
                                                        "No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: VALOR DE MARCADOR BIOLOGICO ("
                                                                + z01.getMarcadorBiologico(i)
                                                                        .getAlternateIdentifier().getValue()
                                                                + ") " + z01.getMarcadorBiologico(i)
                                                                        .getAlternateText().getValue());
                                            } else {
                                                logger.error(
                                                        "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo Z01.3.(4,5) - VALOR DE MARCADOR BIOLOGICO");
                                                resultado.add(
                                                        "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: VALOR DE MARCADOR BIOLOGICO");
                                            }
                                        } else if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                                            if (StringUtils.isNotBlank(z01.getMarcadorBiologico(i)
                                                    .getAlternateIdentifier().getValue())) {
                                                logger.error(
                                                        "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.3.(4,5) - VALOR DE MARCADOR BIOLOGICO ("
                                                                + z01.getMarcadorBiologico(i)
                                                                        .getAlternateIdentifier().getValue()
                                                                + ") " + z01.getMarcadorBiologico(i)
                                                                        .getAlternateText().getValue());
                                                resultado.add(
                                                        "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: VALOR DE MARCADOR BIOLOGICO ("
                                                                + z01.getMarcadorBiologico(i)
                                                                        .getAlternateIdentifier().getValue()
                                                                + ") " + z01.getMarcadorBiologico(i)
                                                                        .getAlternateText().getValue());
                                            }
                                        }
                                    }
                                }
                            } else if (StringUtils.isNotBlank(
                                    z01.getMarcadorBiologico(i).getNameOfAlternateCodingSystem().getValue())) {
                                logger.debug("               Procesando VALOR DE MARCADOR BIOLOGICO ("
                                        + z01.getMarcadorBiologico(i).getNameOfAlternateCodingSystem().getValue()
                                        + ")");
                                EpiValMarcaBio epiValMarcaBio = new EpiValMarcaBio();
                                epiValMarcaBio.setEpiMarcaBio(epiMarcaBio);
                                epiValMarcaBio.setValor(
                                        z01.getMarcadorBiologico(i).getNameOfAlternateCodingSystem().getValue());
                                epiValMarcaBios.add(epiValMarcaBio);
                            }

                            epiMarcaBio.setEpiValMarcaBios(epiValMarcaBios);
                        } catch (NoExisteEquivalenciaException neee) {
                            if (acuerdos != null) {
                                if (acuerdos.getAcuMarcaBios() != null && !acuerdos.getAcuMarcaBios().isEmpty()) { //Es un criterio de inclusion del acuerdo
                                    if (StringUtils
                                            .isNotBlank(z01.getMarcadorBiologico(i).getIdentifier().getValue())) {
                                        logger.error(
                                                "               No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.3.(1,2) - MARCADOR BIOLOGICO ("
                                                        + z01.getMarcadorBiologico(i).getIdentifier().getValue()
                                                        + ") " + z01.getMarcadorBiologico(i).getText().getValue());
                                        resultado.add(
                                                "No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: MARCADOR BIOLOGICO ("
                                                        + z01.getMarcadorBiologico(i).getIdentifier().getValue()
                                                        + ") " + z01.getMarcadorBiologico(i).getText().getValue());
                                    } else {
                                        logger.error(
                                                "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo Z01.3.(1,2) - MARCADOR BIOLOGICO");
                                        resultado.add(
                                                "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: MARCADOR BIOLOGICO");
                                    }
                                } else if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                                    if (StringUtils
                                            .isNotBlank(z01.getMarcadorBiologico(i).getIdentifier().getValue())) {
                                        logger.error(
                                                "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo Z01.3.(1,2) - MARCADOR BIOLOGICO ("
                                                        + z01.getMarcadorBiologico(i).getIdentifier().getValue()
                                                        + ") " + z01.getMarcadorBiologico(i).getText().getValue());
                                        resultado.add(
                                                "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: MARCADOR BIOLOGICO ("
                                                        + z01.getMarcadorBiologico(i).getIdentifier().getValue()
                                                        + ") " + z01.getMarcadorBiologico(i).getText().getValue());
                                    }
                                }
                            }
                        }
                    }
                }

                //RXD.21 - Programas y Diagnosticos
                ProgramasExt programasExt = new ProgramasExt();
                Diagnosticos diagnosticos = null;
                for (int i = 0; i < rxd.getIndication().length; i++) {
                    if (StringUtils.equalsIgnoreCase(rxd.getIndication(i).getNameOfCodingSystem().getValue(),
                            "I9C")) { //RXD.21 - Diagnostico
                        logger.debug("     Procesando datos del DIAGNOSTICO ("
                                + rxd.getIndication(i).getIdentifier().getValue() + ") "
                                + rxd.getIndication(i).getText().getValue());
                        try {
                            diagnosticos = new Diagnosticos();
                            diagnosticos.setCodDiagnostico(rxd.getIndication(i).getIdentifier().getValue()); //RXD.21.1
                            diagnosticos.setTxtDiagnostico(rxd.getIndication(i).getText().getValue()); //RXD.21.2
                            diagnosticos = diagnosticosService.findByCodDiagnostico(diagnosticos);
                            logger.debug("          RXD.21(I9C) - Diagnostico: " + diagnosticos.toString());
                        } catch (NoResultException nre) {
                            diagnosticos = null;
                            if (acuerdos != null) {
                                if (acuerdos.getAcuDiagnosticoses() != null
                                        && !acuerdos.getAcuDiagnosticoses().isEmpty()) { //Es un criterio de inclusion del acuerdo
                                    if (StringUtils.isNotBlank(rxd.getIndication(i).getIdentifier().getValue())) {
                                        logger.error(
                                                "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo RXD.21(I9C) - DIAGNOSTICO ("
                                                        + rxd.getIndication(i).getIdentifier().getValue() + ") "
                                                        + rxd.getIndication(i).getText().getValue());
                                        resultado.add(
                                                "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: DIAGNOSTICO ("
                                                        + rxd.getIndication(i).getIdentifier().getValue() + ") "
                                                        + rxd.getIndication(i).getText().getValue());
                                    } else {
                                        logger.error(
                                                "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo RXD.21(I9C) - DIAGNOSTICO");
                                        resultado.add(
                                                "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: DIAGNOSTICO");
                                    }
                                }
                            }
                        }
                    } else if (StringUtils.equalsIgnoreCase(rxd.getIndication(i).getNameOfCodingSystem().getValue(),
                            "PRDSP")) { //RXD.21 - Programa
                        logger.debug("     Procesando datos del PROGRAMA ("
                                + rxd.getIndication(i).getIdentifier().getValue() + ") "
                                + rxd.getIndication(i).getText().getValue());
                        try {
                            programasExt.setCentros(centros);
                            programasExt.setCodProgramaExt(rxd.getIndication(i).getIdentifier().getValue()); //RXD.21.1
                            programasExt.setTxtProgramaExt(rxd.getIndication(i).getText().getValue()); //RXD.21.2
                            programasExt = programasExtService.traducirEquivalenciaAndInsert(programasExt);
                            logger.debug("          RXD.21(PRDSP) - PROGRAMA: " + programasExt.toString());
                        } catch (NoExisteEquivalenciaException neee) {
                            if (acuerdos != null) {
                                if (acuerdos.getAcuProgramases() != null
                                        && !acuerdos.getAcuProgramases().isEmpty()) { //Es un criterio de inclusion del acuerdo
                                    if (StringUtils.isNotBlank(rxd.getIndication(i).getIdentifier().getValue())) {
                                        logger.error(
                                                "               No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo RXD.21(PRDSP) - PROGRAMA ("
                                                        + rxd.getIndication(i).getIdentifier().getValue() + ") "
                                                        + rxd.getIndication(i).getText().getValue());
                                        resultado.add(
                                                "No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: PROGRAMA ("
                                                        + rxd.getIndication(i).getIdentifier().getValue() + ") "
                                                        + rxd.getIndication(i).getText().getValue());
                                    } else {
                                        logger.error(
                                                "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo RXD.21(PRDSP) - PROGRAMA");
                                        resultado.add(
                                                "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: PROGRAMA");
                                    }
                                } else if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                                    if (StringUtils.isNotBlank(rxd.getIndication(i).getIdentifier().getValue())) {
                                        logger.error(
                                                "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el criterio de inclusion en el campo RXD.21(PRDSP) - PROGRAMA ("
                                                        + rxd.getIndication(i).getIdentifier().getValue() + ") "
                                                        + rxd.getIndication(i).getText().getValue());
                                        resultado.add(
                                                "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CRITERIO DE INCLUSION: PROGRAMA ("
                                                        + rxd.getIndication(i).getIdentifier().getValue() + ") "
                                                        + rxd.getIndication(i).getText().getValue());
                                    }
                                }
                            }
                        }
                    }
                }

                //PID.7 - Edad (Fecha de Nacimiento)
                Date fechaNacimiento = null;
                logger.debug("     Procesando datos de la EDAD (Fecha de Nacimiento) ("
                        + pid.getDateTimeOfBirth().getTime().getValue() + ")");
                try {
                    fechaNacimiento = pid.getDateTimeOfBirth().getTime().getValueAsDate(); //PID.7
                    if (fechaNacimiento == null) {
                        throw new Exception("No se ha indicado la fecha de nacimiento");
                    }
                } catch (Exception e) {
                    if (acuerdos != null) {
                        if (acuerdos.getAcuEdadeses() != null && !acuerdos.getAcuEdadeses().isEmpty()) { //Es un criterio de inclusion del acuerdo
                            logger.error(
                                    "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo PID.7 - EDAD[Fecha de Nacimiento] ("
                                            + pid.getDateTimeOfBirth().getTime().getValue() + ")");
                            resultado.add(
                                    "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: EDAD [Fecha de Nacimiento]");
                        }
                    }
                }

                //OBX.3 - Peso
                Double peso = null;
                logger.debug("     Procesando datos del PESO ("
                        + obx.getObservationIdentifier().getText().getValue() + ")");
                try {
                    peso = NumberUtils.toDouble(obx.getObservationIdentifier().getText().getValue()); //OBX.3
                    if (peso == null) {
                        throw new Exception("No se ha indicado el peso");
                    }
                } catch (Exception e) {
                    if (acuerdos != null) {
                        if (acuerdos.getAcuPesoses() != null && !acuerdos.getAcuPesoses().isEmpty()) { //Es un criterio de inclusion del acuerdo
                            logger.error(
                                    "               No se puede procesar el movimiento sin INFORMACION para el criterio de inclusion en el campo OBX.3 - PESO ("
                                            + obx.getObservationIdentifier().getText().getValue() + ")");
                            resultado.add(
                                    "No se puede procesar el movimiento sin INFORMACION para el CRITERIO DE INCLUSION: PESO");
                        }
                    }
                }

                //MAESTROS GENERALES
                //Z01.1 - Tipo de Uso
                logger.debug("     Procesando datos del TIPO DE USO (" + z01.getTipoUso().getIdentifier().getValue()
                        + ") " + z01.getTipoUso().getText().getValue());
                TiposUsoExt tiposUsoExt = new TiposUsoExt();
                try {
                    tiposUsoExt.setCentros(centros);
                    tiposUsoExt.setCodTipoUsoExt(z01.getTipoUso().getIdentifier().getValue()); //Z01.1.1
                    tiposUsoExt.setTxtTipoUsoExt(z01.getTipoUso().getText().getValue()); //Z01.1.2
                    tiposUsoExt = tiposUsoExtService.traducirEquivalenciaAndInsert(tiposUsoExt);
                    logger.debug("          Z01.1 - Tipo de Uso: " + tiposUsoExt.toString());
                } catch (NoExisteEquivalenciaException neee) {
                    if (acuerdos != null) {
                        if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                            if (StringUtils.isNotBlank(z01.getTipoUso().getIdentifier().getValue())) {
                                logger.error(
                                        "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO Z01.6 - TIPO DE USO ("
                                                + z01.getTipoUso().getIdentifier().getValue() + ") "
                                                + z01.getTipoUso().getText().getValue());
                                resultado.add(
                                        "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO: TIPO DE USO ("
                                                + z01.getTipoUso().getIdentifier().getValue() + ") "
                                                + z01.getTipoUso().getText().getValue());
                            }
                        }
                    }
                }

                //ORC.10 - Medico Prescriptor
                logger.debug("     Procesando datos del MEDICO PRESCRIPTOR ("
                        + orc.getEnteredBy(0).getIDNumber().getValue() + ") "
                        + orc.getOrderingProvider(0).getGivenName().getValue() + " "
                        + orc.getOrderingProvider(0).getFamilyName().getSurname().getValue() + " "
                        + orc.getOrderingProvider(0).getSecondAndFurtherGivenNamesOrInitialsThereof().getValue());
                Medicos medicos = new Medicos();
                medicos.setCodMedico(orc.getEnteredBy(0).getIDNumber().getValue()); //ORC.10.1
                medicos.setTxtNombre(orc.getEnteredBy(0).getGivenName().getValue()); //ORC.10.3
                medicos.setTxtApellido1(orc.getEnteredBy(0).getFamilyName().getSurname().getValue()); //ORC.10.2.1
                medicos.setTxtApellido2(
                        orc.getEnteredBy(0).getSecondAndFurtherGivenNamesOrInitialsThereof().getValue()); //ORC.10.4
                medicos = medicosService.findByCodMedicoAndInsert(medicos);
                if (medicos != null) {
                    logger.debug("          ORC.10 - Medico Prescriptor: " + medicos.toString());
                } else {
                    logger.error(
                            "               No se puede procesar el movimiento sin INFORMACION en el CAMPO: ORC.10 - MEDICO PRESCRIPTOR ("
                                    + orc.getEnteredBy(0).getIDNumber().getValue() + ") "
                                    + orc.getOrderingProvider(0).getGivenName().getValue() + " "
                                    + orc.getOrderingProvider(0).getFamilyName().getSurname().getValue() + " "
                                    + orc.getOrderingProvider(0).getSecondAndFurtherGivenNamesOrInitialsThereof()
                                            .getValue());
                    resultado.add(
                            "No se puede procesar el movimiento sin INFORMACION en el CAMPO: MEDICO PRESCRIPTOR ("
                                    + orc.getEnteredBy(0).getIDNumber().getValue() + ") "
                                    + orc.getOrderingProvider(0).getGivenName().getValue() + " "
                                    + orc.getOrderingProvider(0).getFamilyName().getSurname().getValue() + " "
                                    + orc.getOrderingProvider(0).getSecondAndFurtherGivenNamesOrInitialsThereof()
                                            .getValue());
                }

                //RXD.5 - Formas Farmaceutica
                logger.debug("     Procesando la FORMA FARMACEUTICA DE LA DOSIS DISPENSADA ("
                        + rxd.getActualDispenseUnits().getIdentifier().getValue() + ") "
                        + rxd.getActualDispenseUnits().getText().getValue());
                FormasFarExt formasFarExt = new FormasFarExt();
                try {
                    formasFarExt.setCentros(centros);
                    formasFarExt.setCodFormaFarExt(rxd.getActualDispenseUnits().getIdentifier().getValue()); //RXD.5.1
                    formasFarExt.setTxtFormaFarExt(rxd.getActualDispenseUnits().getText().getValue()); //RXD.5.2
                    formasFarExt = formasFarExtService.traducirEquivalenciaAndInsert(formasFarExt);
                    logger.debug("          RXD.5 - Forma Farmaceutica de la Dosis Dispensada: "
                            + formasFarExt.toString());
                } catch (NoExisteEquivalenciaException neee) {
                    if (acuerdos != null) {
                        if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                            if (StringUtils.isNotBlank(rxd.getActualDispenseUnits().getIdentifier().getValue())) {
                                logger.error(
                                        "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO RXD.5 - FORMA FARMACEUTICA("
                                                + rxd.getActualDispenseUnits().getIdentifier().getValue() + ") "
                                                + rxd.getActualDispenseUnits().getText().getValue());
                                resultado.add(
                                        "El ACUERDO es REQUERIDO.No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO: FORMA FARMACEUTICA ("
                                                + rxd.getActualDispenseUnits().getIdentifier().getValue() + ") "
                                                + rxd.getActualDispenseUnits().getText().getValue());
                            }
                        }
                    }
                }

                //Z01.7 - Protocolos
                logger.debug("     Procesando datos del PROTOCOLO (" + z01.getProtocolo().getIdentifier().getValue()
                        + ") " + z01.getProtocolo().getText().getValue());
                ProtocolosExt protocolosExt = new ProtocolosExt();
                try {
                    protocolosExt.setCentros(centros);
                    protocolosExt.setCodProtocoloExt(z01.getProtocolo().getIdentifier().getValue()); //Z01.7.1
                    protocolosExt.setTxtProtocoloExt(z01.getProtocolo().getText().getValue()); //Z01.7.2
                    protocolosExt = protocolosExtService.traducirEquivalenciaAndInsert(protocolosExt);
                    logger.debug("          Z01.7 - Protocolo: " + protocolosExt.toString());
                } catch (NoExisteEquivalenciaException neee) {
                    if (acuerdos != null) {
                        if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                            if (StringUtils.isNotBlank(z01.getProtocolo().getIdentifier().getValue())) {
                                logger.error(
                                        "               El ACUERDO es REQUERIDO.No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO Z01.7 - PROTOCOLO ("
                                                + z01.getProtocolo().getIdentifier().getValue() + ") "
                                                + z01.getProtocolo().getText().getValue());
                                resultado.add(
                                        "EL ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO: PROTOCOLO ("
                                                + z01.getProtocolo().getIdentifier().getValue() + ") "
                                                + z01.getProtocolo().getText().getValue());
                            }
                        }
                    }
                }

                //Z01.8 - Servicios
                logger.debug("     Procesando datos del SERVICIO (" + z01.getServicio().getIdentifier().getValue()
                        + ") " + z01.getServicio().getText().getValue());
                ServiciosExt serviciosExt = new ServiciosExt();
                try {
                    serviciosExt.setCentros(centros);
                    serviciosExt.setCodServicioExt(z01.getServicio().getIdentifier().getValue()); //Z01.8.1
                    serviciosExt.setTxtServicioExt(z01.getServicio().getText().getValue()); //Z01.8.2
                    serviciosExt = serviciosExtService.traducirEquivalenciaAndInsert(serviciosExt);
                    logger.debug("          Z01.8 - Servicio: " + serviciosExt.toString());
                } catch (NoExisteEquivalenciaException neee) {
                    if (acuerdos != null) {
                        if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                            if (StringUtils.isNotBlank(z01.getServicio().getIdentifier().getValue())) {
                                logger.error(
                                        "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO Z01.8 - SERVICIO ("
                                                + z01.getServicio().getIdentifier().getValue() + ") "
                                                + z01.getServicio().getText().getValue());
                                resultado.add(
                                        "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO: SERVICIO ("
                                                + z01.getServicio().getIdentifier().getValue() + ") "
                                                + z01.getServicio().getText().getValue());
                            }
                        }
                    }
                }

                //Z01.10 - Unidad de Medida de la Dosis Prescrita
                logger.debug("     Procesando datos de la UNIDAD DE MEDIDA DE LA DOSIS PRESCRITA ("
                        + z01.getUnidMedDosisPrescrita().getIdentifier().getValue() + ") "
                        + z01.getUnidMedDosisPrescrita().getText().getValue());
                UnidMedExt unidMedExt = new UnidMedExt();
                try {
                    unidMedExt.setCentros(centros);
                    unidMedExt.setCodUnidMedExt(z01.getUnidMedDosisPrescrita().getIdentifier().getValue()); //Z01.10.1
                    unidMedExt.setTxtUnidMedExt(z01.getUnidMedDosisPrescrita().getText().getValue()); //Z01.10.2
                    unidMedExt = unidMedExtService.traducirEquivalenciaAndInsert(unidMedExt);
                    logger.debug(
                            "          Z01.10 - Unidad de Medida de la Dosis Prescrita: " + unidMedExt.toString());
                } catch (NoExisteEquivalenciaException neee) {
                    if (acuerdos != null) {
                        if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                            if (StringUtils.isNotBlank(z01.getUnidMedDosisPrescrita().getIdentifier().getValue())) {
                                logger.error(
                                        "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO Z01.10 - UNIDAD DE MEDIDA DE LA DOSIS PRESCRITA ("
                                                + z01.getUnidMedDosisPrescrita().getIdentifier().getValue() + ") "
                                                + z01.getUnidMedDosisPrescrita().getText().getValue());
                                resultado.add(
                                        "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO: UNIDAD DE MEDIDA DE LA DOSIS PRESCRITA ("
                                                + z01.getUnidMedDosisPrescrita().getIdentifier().getValue() + ") "
                                                + z01.getUnidMedDosisPrescrita().getText().getValue());
                            }
                        }
                    }
                }

                //Z01.13 - Secuencias
                logger.debug("     Procesando de la SECUENCIA (" + z01.getSecuencia().getIdentifier().getValue()
                        + ") " + z01.getSecuencia().getText().getValue());
                SecuenciasExt secuenciasExt = new SecuenciasExt();
                try {
                    secuenciasExt.setCentros(centros);
                    secuenciasExt.setCodSecuenciaExt(z01.getSecuencia().getIdentifier().getValue()); //Z01.15.1
                    secuenciasExt.setTxtSecuenciaExt(z01.getSecuencia().getText().getValue()); //Z01.15.2
                    secuenciasExt = secuenciasExtService.traducirEquivalenciaAndInsert(secuenciasExt);
                    logger.debug("          Z01.13 - Secuencia: " + secuenciasExt.toString());
                } catch (NoExisteEquivalenciaException neee) {
                    if (acuerdos != null) {
                        if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                            if (StringUtils.isNotBlank(z01.getSecuencia().getIdentifier().getValue())) {
                                logger.error(
                                        "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO Z01.15 - SECUENCIA ("
                                                + z01.getSecuencia().getIdentifier().getValue() + ") "
                                                + z01.getSecuencia().getText().getValue());
                                resultado.add(
                                        "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO: SECUENCIA ("
                                                + z01.getSecuencia().getIdentifier().getValue() + ") "
                                                + z01.getSecuencia().getText().getValue());
                            }
                        }
                    }
                }

                //Z01.14 - Pautas
                logger.debug("     Procesando de la PAUTA (" + z01.getPauta().getIdentifier().getValue() + ") "
                        + z01.getPauta().getText().getValue());
                PautasExt pautasExt = new PautasExt();
                try {
                    pautasExt.setCentros(centros);
                    pautasExt.setCodPautaExt(z01.getPauta().getIdentifier().getValue()); //Z01.16.1
                    pautasExt.setTxtPautaExt(z01.getPauta().getText().getValue()); //Z01.16.2
                    pautasExt = pautasExtService.traducirEquivalenciaAndInsert(pautasExt);
                    logger.debug("          Z01.14 - Pauta: " + pautasExt.toString());
                } catch (NoExisteEquivalenciaException neee) {
                    if (acuerdos != null) {
                        if (StringUtils.equals(acuerdos.getRequerido(), "S")) {
                            if (StringUtils.isNotBlank(z01.getPauta().getIdentifier().getValue())) {
                                logger.error(
                                        "               El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO Z01.14 - PAUTA ("
                                                + z01.getPauta().getIdentifier().getValue() + ") "
                                                + z01.getPauta().getText().getValue());
                                resultado.add(
                                        "El ACUERDO es REQUERIDO. No se puede procesar el movimiento sin EQUIVALENCIA para el CAMPO: PAUTA ("
                                                + z01.getPauta().getIdentifier().getValue() + ") "
                                                + z01.getPauta().getText().getValue());
                            }
                        }
                    }
                }

                //OTRAS VALIDACIONES SIN NORMALIZACION
                //TQ1.7 - Fecha de Inicio de la Prescripcion
                Date fecha_ini_prescripcion = null;
                logger.debug("     Procesando FECHA DE INICIO DE LA PRESCRIPCION ("
                        + tq1.getStartDateTime().getTime().getValue() + ")"); //TQ1.7
                if (StringUtils.isNotBlank(tq1.getStartDateTime().getTime().getValue())
                        && tq1.getStartDateTime().getTime().getValueAsDate() != null) {
                    fecha_ini_prescripcion = tq1.getStartDateTime().getTime().getValueAsDate();
                    logger.debug("          TQ1.7 - Fecha de Inicio de la Prescripcion: " + fecha_ini_prescripcion);
                } else {
                    logger.error(
                            "               No se puede procesar el movimiento sin INFORMACION en el CAMPO: TQ1.7 - FECHA DE INICIO DE LA PRESCRIPCION ("
                                    + tq1.getStartDateTime().getTime().getValue() + ")");
                    resultado.add(
                            "No se puede procesar el movimiento sin INFORMACION en el CAMPO: FECHA DE INICIO DE LA PRESCRIPCION ("
                                    + tq1.getStartDateTime().getTime().getValue() + ")");
                }

                //RXD.2 - Marca
                logger.debug("     Procesando de la MARCA (" + rxd.getDispenseGiveCode().getIdentifier().getValue()
                        + ") " + rxd.getDispenseGiveCode().getText().getValue());
                Marcas marcas = new Marcas();
                marcas.setCodNac(rxd.getDispenseGiveCode().getIdentifier().getValue()); //RXD.2.1
                marcas.setTxtMarca(rxd.getDispenseGiveCode().getText().getValue()); //RXD.2.2
                marcas = marcasService.findByCodNacAndInsert(marcas);
                if (marcas != null) {
                    logger.debug("          RXD.2 - Marca: " + marcas.toString());
                } else {
                    logger.error(
                            "               No se puede procesar el movimiento sin INFORMACION en el campo RXD.2 - MARCA ("
                                    + rxd.getDispenseGiveCode().getIdentifier().getValue() + ") "
                                    + rxd.getDispenseGiveCode().getText().getValue());
                    resultado.add("No se puede procesar el movimiento sin INFORMACION en el CAMPO: MARCA ("
                            + rxd.getDispenseGiveCode().getIdentifier().getValue() + ") "
                            + rxd.getDispenseGiveCode().getText().getValue());
                }

                //RXD.3 - Fecha de la Dispensacion
                Date fecha_dispensacion = null;
                logger.debug("     Procesando FECHA DE LA DISPENSACION ("
                        + rxd.getDateTimeDispensed().getTime().getValue() + ")"); //RXD.3
                if (StringUtils.isNotBlank(rxd.getDateTimeDispensed().getTime().getValue())
                        && rxd.getDateTimeDispensed().getTime().getValueAsDate() != null) {
                    fecha_dispensacion = rxd.getDateTimeDispensed().getTime().getValueAsDate();
                    logger.debug("          RXD.3 - Fecha de la Dispensacion: " + fecha_dispensacion);
                } else {
                    logger.error(
                            "               No se puede procesar el movimiento sin INFORMACION en el CAMPO: RXD.3 - FECHA DE LA DISPENSACION ("
                                    + rxd.getDateTimeDispensed().getTime().getValue() + ")");
                    resultado.add(
                            "No se puede procesar el movimiento sin INFORMACION en el CAMPO: FECHA DE LA DISPENSACION ("
                                    + rxd.getDateTimeDispensed().getTime().getValue() + ")");
                }

                //RXD.4 - Dosis Dispensada en Forma Farmaceutica
                Double dosis_dispensada = null;
                logger.debug("     Procesando datos de la DOSIS DISPENSADA ("
                        + rxd.getActualDispenseAmount().getValue() + ")");
                if (StringUtils.isNotBlank(rxd.getActualDispenseAmount().getValue())
                        && NumberUtils.isNumber(rxd.getActualDispenseAmount().getValue())) {
                    try {
                        dosis_dispensada = NumberUtils.createDouble(rxd.getActualDispenseAmount().getValue());
                        logger.debug("          RXD.4 - Dosis Dispensada: " + dosis_dispensada);
                    } catch (Exception e) {
                        resultado.add(
                                "No se puede procesar el movimiento porque los datos en el campo RXD.4 - DOSIS PRESCRITA ("
                                        + rxd.getActualDispenseAmount().getValue() + ") NO son correctos");
                    }
                } else {
                    logger.error(
                            "               No se puede procesar el movimiento sin INFORMACION en el CAMPO: RXD.4 - DOSIS PRESCRITA ("
                                    + rxd.getActualDispenseAmount().getValue() + ")");
                    resultado
                            .add("No se puede procesar el movimiento sin INFORMACION en el CAMPO: DOSIS PRESCRITA ("
                                    + rxd.getActualDispenseAmount().getValue() + ")");
                }

                //Z01.9 - Dosis Prescrita en Unidad de Medida
                Double dosis_prescrita = null;
                logger.debug(
                        "     Procesando datos de la DOSIS PRESCRITA (" + z01.getDosisPrescrita().getValue() + ")"); //Z01.9
                if (StringUtils.isNotBlank(z01.getDosisPrescrita().getValue())
                        && NumberUtils.isNumber(z01.getDosisPrescrita().getValue())) {
                    try {
                        dosis_prescrita = NumberUtils.createDouble(z01.getDosisPrescrita().getValue());
                        logger.debug("          Z01.9 - Dosis Prescrita: " + dosis_prescrita);
                    } catch (Exception e) {
                        logger.error(
                                "               No se puede procesar el movimiento porque la INFORMACION en el campo Z01.9 - DOSIS PRESCRITA ("
                                        + z01.getDosisPrescrita().getValue() + ") NO es correcta");
                        resultado.add(
                                "No se puede procesar el movimiento porque la INFORMACION en el CAMPO: DOSIS PRESCRITA ("
                                        + z01.getDosisPrescrita().getValue() + ") NO es correcta");
                    }
                } else {
                    logger.error(
                            "               No se puede procesar el movimiento sin INFORMACION en el CAMPO: Z01.9 - Dosis Prescrita ("
                                    + z01.getDosisPrescrita().getValue() + ")");
                    resultado
                            .add("No se puede procesar el movimiento sin INFORMACION en el CAMPO: Dosis Prescrita ("
                                    + z01.getDosisPrescrita().getValue() + ")");
                }

                //Z01.11 - Ciclo
                String ciclo = null;
                logger.debug("     Procesando datos de CICLO (" + z01.getCiclo().getValue() + ")");
                if (StringUtils.isNotBlank(z01.getCiclo().getValue())) {
                    ciclo = z01.getCiclo().getValue();
                    logger.debug("          Z01.11 - Ciclo: " + ciclo);
                }

                //Z01.12 - Dia Ciclo
                String dia_ciclo = null;
                logger.debug("     Procesando datos del DIA DE CICLO (" + z01.getDiaCiclo().getValue() + ")");
                if (StringUtils.isNotBlank(z01.getDiaCiclo().getValue())) {
                    dia_ciclo = z01.getDiaCiclo().getValue();
                    logger.debug("          Z01.12 - Dia de Ciclo: " + dia_ciclo);
                }

                //CONSULTA EMPI
                if (MPRConstantes._EMPI_ENABLE) {
                    try {
                        logger.debug("          Iniciando consulta EMPI (Usuario: " + MPRConstantes._EMPI_USUARIO
                                + ", Sistema: " + MPRConstantes._EMPI_SISTEMA + ", URL: " + MPRConstantes._EMPI_URL
                                + ")");
                        EMPIClient client = new EMPIClient(MPRConstantes._EMPI_USUARIO, MPRConstantes._EMPI_SISTEMA,
                                MPRConstantes._EMPI_URL);
                        logger.debug("               Obteniendo Registros por CIPA: (CIPA: " + pacientes.getCipa()
                                + ")");
                        EMPIResponse response = client.obtenerRegistrosByCIPA(pacientes.getCipa());
                        if (response != null && response.getPaciente() != null) {
                            logger.debug("               Respuesta obtenida: " + response.toString());

                            pacientes.setTxtNombre(response.getPaciente().getNombre());
                            pacientes.setTxtApellido1(response.getPaciente().getApellido1());
                            pacientes.setTxtApellido2(response.getPaciente().getApellido2());
                            fechaNacimiento = response.getPaciente().getFechaNacimiento().toGregorianCalendar()
                                    .getTime();
                        } else {
                            logger.debug(
                                    "          No se han obtenido datos de EMPI. Se emplearan los datos del mensaje HL7");
                        }
                    } catch (Exception e) {
                        logger.warn(
                                "Se han producido errores al obtener datos de EMPI. Se emplearan los datos del mensaje HL7: "
                                        + e.getMessage());
                    }
                }

                //RESULTADO GENERAL DEL PROCESADO DEL MOVIMIENTO
                String mensaje = "";
                if (!resultado.isEmpty()) {
                    logger.error("RESULTADO GENERAL DEL PROCESADO: ");
                    for (String linea : resultado) {
                        mensaje += "     - " + linea + "\n";
                    }
                    logger.error("     " + mensaje);
                }

                if (StringUtils.isNotBlank(mensaje)) {
                    throw new Exception(mensaje);
                }
                logger.info("FINALIZANDO EL PROCESADO DEL MOVIMIENTO ENTRANTE ENTRANTE");

                //ALMACENAMIENTO DEL MOVIMIENTO
                logger.info("INICIANDO EL ALMACENAMIENTO DEL MOVIMIENTO ENTRANTE");

                //PACIENTE
                try {
                    logger.debug("     Buscando PACIENTE por CIPA (" + pacientes.getCipa() + ")");
                    if (StringUtils.isNotBlank(pacientes.getCipa())) {
                        pacientes = pacientesService.findByCIPA(pacientes);
                    } else {
                        Episodios consulta = new Episodios();
                        consulta.setNhc(nhc);
                        consulta.setCentros(centros);
                        consulta = episodiosService.findByNHCIdCentro(consulta);
                        pacientes = consulta.getPacientes();
                    }
                } catch (NoResultException nre) {
                    logger.debug("          Almacenando datos del PACIENTE");
                    pacientes.setSexos(sexosExt.getSexos());
                    pacientes.setFechaNac(fechaNacimiento);
                    pacientes = pacientesService.save(pacientes);
                } finally {
                    logger.debug("          Paciente: " + pacientes.toString());
                }

                //EPISODIO
                try {
                    episodios.setNhc(nhc);
                    episodios.setCentros(centros);
                    episodios.setCodEpisodio(cod_episodio);
                    episodios.setPacientes(pacientes);
                    episodios.setProgramas(programasExt.getProgramas());
                    episodios.setServicio(serviciosExt.getServicios());

                    logger.debug("     Buscando EPISODIO por COD_EPISODIO (" + episodios.getCodEpisodio()
                            + "), NHC (" + episodios.getNhc() + "), PROGRAMA (" + episodios.getProgramas()
                            + "), CENTRO (" + episodios.getCentros() + ")");
                    episodios = episodiosService.findByCodEpisodioNHCIdProgramaIdCentro(episodios);
                } catch (NoResultException nre) {
                    logger.debug("          Almacenando datos del EPISODIO");
                    episodios = episodiosService.save(episodios);
                } finally {
                    if (contador == 0) { //Solo la primera vez
                        //EPI_MARCA_BIO y EPI_VAL_MARCA_BIO
                        epiMarcaBioService.delete(episodios.getEpiMarcaBios());
                        if (epiMarcaBios != null && !epiMarcaBios.isEmpty()) {
                            for (EpiMarcaBio epiMarcaBio : epiMarcaBios) {
                                logger.debug(
                                        "               Insertando Marcador Biologico: " + epiMarcaBio.toString());
                                epiMarcaBio.setEpisodios(episodios);
                                epiMarcaBioService.save(epiMarcaBio);
                            }
                        }

                        //EPI_SIT_CLINICA y EPI_VAL_SIT_CLINICA
                        epiSitClinicaService.delete(episodios.getEpiSitClinicas());
                        if (epiSitClinicas != null && !epiSitClinicas.isEmpty()) {
                            for (EpiSitClinica epiSitClinica : epiSitClinicas) {
                                logger.debug(
                                        "               Insertando Situacion Clinica: " + epiSitClinica.toString());
                                epiSitClinica.setEpisodios(episodios);
                                epiSitClinicaService.save(epiSitClinica);
                            }
                        }
                    }
                    logger.debug("          Episodio: " + episodios.toString());
                }

                //PRESCRIPCIONES
                Prescripciones prescripciones = new Prescripciones();
                try {
                    prescripciones.setCodPrescripcion(cod_prescripcion);
                    logger.debug("     Buscando PRESCRIPCION por COD_PRESCRIPCION ("
                            + prescripciones.getCodPrescripcion() + ")");
                    prescripciones = prescripcionesService.findByCodPrescripcion(prescripciones);
                } catch (NoResultException nre) {
                    logger.debug("          Almacenando datos de la PRESCRIPCION: (" + cod_prescripcion + ")");
                    Prescripciones prescripcionesOld = new Prescripciones();
                    prescripcionesOld
                            .setCodPrescripcion(StringUtils.split(prescripciones.getCodPrescripcion(), "-")[0] + "-"
                                    + StringUtils.split(prescripciones.getCodPrescripcion(), "-")[1] + "-"
                                    + StringUtils.split(prescripciones.getCodPrescripcion(), "-")[2] + "-"
                                    + StringUtils.split(prescripciones.getCodPrescripcion(), "-")[3] + "-"
                                    + StringUtils.split(prescripciones.getCodPrescripcion(), "-")[4]);
                    List<Prescripciones> prescripcioneses = prescripcionesService
                            .findLikeCodPrescripcion(prescripcionesOld);
                    for (Prescripciones prescripcionesUpd : prescripcioneses) {
                        if (StringUtils.equals(StringUtils.split(prescripcionesUpd.getCodPrescripcion(), "-")[8],
                                StringUtils.split(prescripciones.getCodPrescripcion(), "-")[8])) {
                            logger.debug("               Estableciendo fecha de fin en la prescripcion: "
                                    + prescripcionesUpd.toString());
                            prescripcionesUpd.setFechaFin(new Date());
                            prescripcionesService.save(prescripcionesUpd);
                        }
                    }

                    prescripciones.setEpisodios(episodios);
                    prescripciones.setMarcas(marcas);
                    prescripciones.setMedicos(medicos);
                    prescripciones.setDosis(dosis_prescrita);
                    prescripciones.setUnidMed(unidMedExt.getUnidMed());
                    prescripciones.setFechaIni(fecha_ini_prescripcion);
                    prescripciones.setPautas(pautasExt.getPautas());
                    prescripciones.setSecuencias(secuenciasExt.getSecuencias());
                    prescripciones = prescripcionesService.save(prescripciones);
                } finally {
                    logger.debug("          Prescripcion: " + prescripciones.toString());
                }

                //DISPENSACIONES
                logger.debug("     Almacenando datos de la DISPENSACION: (" + cod_dispensacion + ")");
                Dispensaciones dispensaciones = new Dispensaciones();
                try {
                    dispensaciones.setCodDispensacion(cod_dispensacion);
                    logger.debug("          Buscando DISPENSACION por COD_DISPENSACION ("
                            + dispensaciones.getCodDispensacion() + ")");
                    dispensaciones = findByCodDispensacion(dispensaciones);
                    dispensaciones.setCantidad(dosis_dispensada);
                    logger.debug(
                            "          Actualizando CANTIDAD DISPENSADA de la DISPENSACION con COD_DISPENSACION ("
                                    + dispensaciones.getCodDispensacion() + ")");
                } catch (NoResultException nre) {
                    dispensaciones.setAcuerdos(acuerdos);
                    dispensaciones.setPrescripciones(prescripciones);
                    dispensaciones.setCantidad(dosis_dispensada);
                    dispensaciones.setFormasFar(formasFarExt.getFormasFar());
                    dispensaciones.setFechaDisp(fecha_dispensacion);
                    dispensaciones.setDiagnosticos(diagnosticos);
                    dispensaciones.setIndicaciones(indicacionesExt.getIndicaciones());
                    dispensaciones.setLineasTrat(lineasTratExt.getLineasTrat());
                    dispensaciones.setProtocolos(protocolosExt.getProtocolos());
                    dispensaciones.setTiposUso(tiposUsoExt.getTiposUso());
                    dispensaciones.setPeso(peso);
                    dispensaciones.setCiclo(ciclo);
                    dispensaciones.setDiaCiclo(dia_ciclo);
                    logger.debug("          Insertando nueva DISPENSACION con COD_DISPENSACION ("
                            + dispensaciones.getCodDispensacion() + ")");
                } finally {
                    dispensaciones = save(dispensaciones);
                    logger.debug("          Dispensacion: " + dispensaciones.toString());
                }
                contador++;
                logger.info("FINALIZANDO EL ALMACENAMIENTO DEL MOVIMIENTO ENTRANTE");
            }
        } catch (Exception e) {
            throw new Exception("SE HAN PRODUCIDO ERRORES AL PROCESAR EL MOVIMIENTO: \n" + e.getMessage() != null
                    ? e.getMessage()
                    : e.toString());
        }
    }

    @Override
    public List<Dispensaciones> findListadoDispensaciones(Long idCentro, Long idAcuerdo, Date fecIniDisp,
            Date fecFinDisp) {
        return dispensacionesRepository.findListadoDispensaciones(idCentro, idAcuerdo, fecIniDisp, fecFinDisp);
    }

    @Override
    public List<Dispensaciones> findListadoDispensacionesDetallado(Long idCentro, Long idAcuerdo, Date fecIniDisp,
            Date fecFinDisp) {
        return dispensacionesRepository.findListadoDispensacionesDetallado(idCentro, idAcuerdo, fecIniDisp,
                fecFinDisp);
    }
}