cimav.restrh.services.JustificacionREST.java Source code

Java tutorial

Introduction

Here is the source code for cimav.restrh.services.JustificacionREST.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cimav.restrh.services;

import cimav.restrh.entities.Asistente;
import cimav.restrh.entities.JustificacionRef;
import cimav.restrh.entities.Justificacion;
import cimav.restrh.tools.Numero_a_Letra;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.time.format.TextStyle;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.security.PermitAll;
import javax.ejb.Stateless;
import javax.money.MonetaryAmount;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.StreamingOutput;

/**
 *
 * @author calderon
 */
@Stateless
@Path("justificacion")
@PermitAll
public class JustificacionREST extends AbstractFacade<Justificacion> {

    private final static Logger logger = Logger.getLogger(JustificacionREST.class.getName());

    public JustificacionREST() {
        super(Justificacion.class);
    }

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    /*
    @GET
    @Path("one_by_id_empleado/{id_empleado}")
    @Produces("application/json")
    public Justificacion findOneByIdEmpleado(@PathParam("id_empleado") Integer idEmpleado) {
    Query query = getEntityManager().createQuery("SELECT j FROM Justificacion AS j WHERE j.empleado.id = :id_empleado", Justificacion.class);
    query.setParameter("id_empleado", idEmpleado);
    try {
        Justificacion justificacion = (Justificacion) query.getSingleResult();
        return justificacion;
    } catch (NoResultException | NonUniqueResultException nue) {
        Justificacion justificacion = new Justificacion();
        justificacion.setId(-1);
        return justificacion;
    }
    }
     */

    @GET
    @Path("all_by_id_empleado/{id_empleado}")
    @Produces("application/json")
    public List<Justificacion> findAllByIdEmpleado(@PathParam("id_empleado") Integer idEmpleado) {

        List<Justificacion> results = new ArrayList<Justificacion>();

        // Asistentes
        TypedQuery<Asistente> q = getEntityManager()
                .createQuery("SELECT a FROM Asistente AS a WHERE a.idAsistente = :id_asistente", Asistente.class);
        q.setParameter("id_asistente", idEmpleado);
        List<Asistente> asis = q.getResultList();
        if (asis.size() > 0) {
            // Por asistente
            for (Asistente a : asis) {
                int idEmpleadoAsistido = a.getIdEmpleado();
                TypedQuery<Justificacion> query = getEntityManager().createQuery(
                        "SELECT j FROM Justificacion AS j WHERE j.empleado.id = :id_empleado", Justificacion.class);
                query.setParameter("id_empleado", idEmpleadoAsistido);
                results.addAll(query.getResultList());
                Logger.getLogger(JustificacionREST.class.getName()).log(Level.INFO, ">>>> " + idEmpleadoAsistido);
            }
        }

        // Individual
        TypedQuery<Justificacion> query = getEntityManager().createQuery(
                "SELECT j FROM Justificacion AS j WHERE j.empleado.id = :id_empleado", Justificacion.class);
        query.setParameter("id_empleado", idEmpleado);
        results.addAll(query.getResultList());

        Collections.sort(results, new Comparator<Justificacion>() {
            @Override
            public int compare(Justificacion j1, Justificacion j2) {
                return j1.getEmpleado().getId().compareTo(j2.getEmpleado().getId());
            }
        });

        /*        
        /*
        TypedQuery<Justificacion> query = getEntityManager().createQuery("SELECT j FROM Justificacion AS j WHERE j.empleado.id = :id_empleado", Justificacion.class);
        query.setParameter("id_empleado", idEmpleado);
        List<Justificacion> results = query.getResultList();
        */

        /*
            
        CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
        CriteriaQuery cq = cb.createQuery();
        ParameterExpression<Integer> p = cb.parameter(Integer.class);
        Root<Justificacion> j = cq.from(JustificacionRef.class);
        cq.select(j).where(cb.gt(j.get("empleado.Id"), p));
            
        TypedQuery<Justificacion> query = getEntityManager().createQuery(cq);
        query.setParameter(p, idEmpleado);
        List<Justificacion> results = query.getResultList();
         */
        /*
               Query query = getEntityManager().createQuery("SELECT j FROM JustificacionRef AS j WHERE j.empleado.id = :id_empleado", JustificacionRef.class);
               query.setParameter("id_empleado", idEmpleado);
               List<Justificacion> result = new ArrayList<>();
               try {
        result= query.getResultList();
               } catch (NoResultException nue) {
               }
                */
        //List<Justificacion> emps = super.findAll();
        return results;
    }

    @POST
    @Consumes("application/json")
    @Produces("application/json")
    @Override
    public Justificacion insert(Justificacion entity) {
        super.insert(entity); // <-- regresa con el Id nuevo, code, consecutivo y resto de los campos
        return entity;
    }

    @PUT
    @Path("{id}")
    @Consumes("application/json")
    public void edit(@PathParam("id") Integer id, Justificacion entity) {
        super.edit(entity);
    }

    @DELETE
    @Path("{id}")
    public void remove(@PathParam("id") Integer id) {
        super.remove(super.find(id));
    }

    @GET
    @Path("{id}")
    @Produces("application/json")
    public JustificacionRef find(@PathParam("id") Integer id) {
        return super.find(id);
    }

    @GET
    @Override
    @Produces("application/json")
    public List<Justificacion> findAll() {
        return super.findAll();
    }

    @GET
    @Path("count")
    @Produces("text/plain")
    public String countREST() {
        return String.valueOf(super.count());
    }

    @GET
    @Path("pdficar")
    @Produces("application/pdf")
    public Response pdficar(@DefaultValue("0") @QueryParam("id") Integer id_param) {
        Justificacion justi = (Justificacion) JustificacionREST.this.find(id_param);

        String diasCorresponde = "corresponde a " + justi.getNumDiasPlazo() + " das";
        if (justi.getNumDiasPlazo() == 1) {
            diasCorresponde = "corresponde a un da";
        }

        // <editor-fold defaultstate="collapsed" desc="Constantes de texto">            
        HashMap<String, String> mapa = new HashMap();
        mapa.put("texto1_I",
                "No existan bienes o servicios alternativos o sustitutos tcnicamente razonables, o bien, que en el "
                        + "mercado slo existe un posible oferente, o se trate de una persona que posee la titularidad o el "
                        + "licenciamiento exclusivo de patentes, derechos de autor, u otros derechos exclusivos, o por "
                        + "tratarse de obras de arte.");
        mapa.put("texto1_III",
                "Existan circunstancias que puedan provocar prdidas o costos adicionales importantes, "
                        + "cuantificados y justificados.");
        mapa.put("texto1_XIV",
                "Se trate de los servicios prestados por una persona fsica a que se refiere la fraccin "
                        + "VII del artculo 3 de esta Ley, siempre que stos sean realizados por ella misma sin "
                        + "requerir de la utilizacin de ms de un especialista o tcnico.");
        mapa.put("texto1_XV",
                "Se trate de servicios de mantenimiento de bienes en los que no sea posible precisar "
                        + "su alcance, establecer las cantidades de trabajo o determinar las especificaciones "
                        + "correspondientes.");
        mapa.put("texto1_XVII",
                "Se trate de equipos especializados, sustancias y materiales de origen qumico, fsico "
                        + "qumico o bioqumico para ser utilizadas en actividades experimentales requeridas "
                        + "en proyectos de investigacin cientfica y desarrollo tecnolgico, siempre que dichos "
                        + "proyectos se encuentren autorizados por quien determine el titular de la dependencia "
                        + "o el rgano de gobierno de la entidad.");
        mapa.put("plazo_0", "El plazo en que se requiere el suministro de los " + justi.getBienServicioTxt()
                + ", corresponde al periodo del " + justi.getFechaInicio().getDayOfMonth() + " de "
                + justi.getFechaInicio().getMonth().getDisplayName(TextStyle.FULL, new Locale("es", "ES")) + " de "
                + justi.getFechaInicio().getYear() + " y hasta el " + justi.getFechaTermino().getDayOfMonth()
                + " de " + justi.getFechaTermino().getMonth().getDisplayName(TextStyle.FULL, new Locale("es", "ES"))
                + " de " + justi.getFechaTermino().getYear() + ". Las condiciones en las que se "
                + "entregarn los " + justi.getBienServicioTxt() + " son las siguientes:\n\n "
                + justi.getCondicionesPago());
        mapa.put("plazo_1", "La fecha en que se requiere el suministro de los " + justi.getBienServicioTxt()
                + ", corresponde al da " + justi.getFechaTermino().getDayOfMonth() + " de "
                + justi.getFechaTermino().getMonth().getDisplayName(TextStyle.FULL, new Locale("es", "ES")) + " de "
                + justi.getFechaTermino().getYear() + ". Las condiciones en las que se " + "entregarn los "
                + justi.getBienServicioTxt() + " son las siguientes:\n\n " + justi.getCondicionesPago());
        mapa.put("plazo_2",
                "El plazo en que se requiere el suministro de los " + justi.getBienServicioTxt() + ", "
                        + diasCorresponde + " despus de la elaboracin de este documento."
                        + " Las condiciones en las que se " + "entregarn los " + justi.getBienServicioTxt()
                        + " son las siguientes:\n\n " + justi.getCondicionesPago());
        mapa.put("nota_1",
                "Asimismo se hace constar mediante el sello y firma del responsable del rea de "
                        + "Almacn, la No Existencia de Bienes o Nivel de Inventario que demuestra que se "
                        + "cumpli con lo establecido en el artculo 27 del RLAASP.");
        mapa.put("transparencia_unico",
                "Para la integracin del procedimiento de contratacin por adjudicacin directa, los servidores "
                        + "pblicos de las reas requirentes han tenido acceso de manera oportuna, clara y completa de "
                        + "las caractersticas requeridas de los " + justi.getBienServicioTxt()
                        + " con el fin de demostrar que es " + "el nico proveedor que proporciona los "
                        + justi.getBienServicioTxt() + " que se pretenden contratar, en "
                        + "el entendido que para garantizar la transparencia del procedimiento de contratacin, la "
                        + "informacin respectiva ser incorporada al Sistema de Compras Gubernamentales "
                        + "(CompraNet), en los trminos de las disposiciones legales aplicables, "
                        + "Lo anterior de acuerdo con lo establecido en el numeral 4.2.4 (ADJUDICACIN DIRECTA) y "
                        + "numeral 4.2.4.1.1 (Verificar Acreditamiento de Excepcin) del Acuerdo por el que se modifica el "
                        + "Manual Administrativo de Aplicacin General en Materia de Adquisiciones, Arrendamientos y "
                        + "Servicios del Sector Pblico, publicado en el Diario Oficial de la Federacin el 21 de noviembre "
                        + "de 2012.");
        mapa.put("transparencia_no_unico",
                "Todas las personas que han presentado cotizacin para la integracin del procedimiento de "
                        + "contratacin por adjudicacin directa, han tenido acceso de manera oportuna, clara y completa "
                        + "de las caractersticas requeridas de los " + justi.getBienServicioTxt()
                        + ", en el entendido que para "
                        + "garantizar la transparencia del procedimiento de contratacin, la informacin respectiva ser "
                        + "incorporada al Sistema de Compras Gubernamentales (CompraNet), en los trminos de las "
                        + "disposiciones legales aplicables. "
                        + "Lo anterior de acuerdo con lo establecido en el numeral 4.2.4 (ADJUDICACIN DIRECTA) y "
                        + "numeral 4.2.4.1.1 (Verificar Acreditamiento de Excepcin) del Acuerdo por el que se modifica el "
                        + "Manual Administrativo de Aplicacin General en Materia de Adquisiciones, Arrendamientos y "
                        + "Servicios del Sector Pblico, publicado en el Diario Oficial de la Federacin el 21 de noviembre "
                        + "de 2012.");

        // </editor-fold>
        StreamingOutput streamingOutput = new StreamingOutput() {
            public void write(OutputStream outputStream) throws IOException, WebApplicationException {

                try {
                    String masIva = "";
                    if (justi.getIva() != 0) {
                        masIva = " ms IVA";
                    }
                    String datosBanco = "";
                    if (justi.getDatosBanco() != null) {
                        datosBanco = ", datos bancarios: " + justi.getDatosBanco();
                    }

                    //Create Document instance.
                    Document document = new Document();
                    PdfWriter.getInstance(document, outputStream);

                    document.addAuthor("Generador adquisiciones | " + justi.getEmpleado().getCuentaCimav());
                    String fileName1 = (justi.getRequisicion() + "-" + justi.getEmpleado().getCuentaCimav())
                            .replace(" ", "").replace(",", "");
                    document.addTitle("Justificacin: " + fileName1);
                    document.addSubject("Justificacin de Requisicin");

                    document.open();

                    Paragraph parrafo = new Paragraph("Centro de Investigacin en Materiales Avanzados S. C.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 17, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    document.add(parrafo);

                    parrafo = new Paragraph(
                            "JUSTIFICACIN PARA ACREDITAR Y FUNDAR PROCEDIMIENTOS DE "
                                    + "CONTRATACIN POR ADJUDICACIN DIRECTA, COMO EXCEPCIN AL DE "
                                    + "LICITACIN PBLICA EN EL SUPUESTO DEL ARTICULO 41 FRACCION "
                                    + justi.getRomano() + " DE LA "
                                    + "LEY DE ADQUISICIONES, ARRENDAMIENTOS Y SERVICIOS DEL SECTOR " + "PBLICO.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    document.add(parrafo);

                    parrafo = new Paragraph("COMIT DE ADQUISICIONES, ARRENDAMIENTOS Y SERVICIOS");
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setSpacingBefore(20);
                    parrafo.setIndentationLeft(80);
                    parrafo.setIndentationRight(80);
                    document.add(parrafo);

                    parrafo = new Paragraph("P R E S E N T E:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setIndentationLeft(30);
                    parrafo.setSpacingBefore(20);
                    document.add(parrafo);

                    parrafo = new Paragraph("Oficio nmero: ",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setIndentationLeft(300);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED_ALL);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);

                    Chunk frase = new Chunk(justi.getRequisicion() + "\n",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.add(frase);
                    frase = new Chunk(
                            "Asunto: Se emite justificacin por la que se "
                                    + "acredita y funda la contratacin por adjudicacin directa que se indica.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.add(frase);
                    document.add(parrafo);

                    parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);

                    frase = new Chunk(
                            "En cumplimiento a lo establecido en el segundo prrafo del artculo 40 de la Ley de "
                                    + "Adquisiciones, Arrendamientos y Servicios del Sector Pblico, as como en el artculo 71 del "
                                    + "Reglamento de la Ley de Adquisiciones, Arrendamientos y Servicios del Sector Pblico, y con el "
                                    + "carcter de Titular del ?rea Requirente, por este conducto hago constar el acreditamiento del o "
                                    + "de los criterios, razones, fundamentos y motivos para no llevar a cabo el procedimiento de "
                                    + "licitacin pblica y celebrar la contratacin a travs del procedimiento de adjudicacin directa en "
                                    + "los trminos establecidos en el artculo 41 Fraccin " + justi.getRomano()
                                    + " de la Ley de Adquisiciones, "
                                    + "Arrendamientos y Servicios del Sector Pblico",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    parrafo.add(frase);

                    /*
                    frase = new Chunk("Las dependencias y "
                        + "entidades, bajo su responsabilidad, podrn contratar adquisiciones, arrendamientos y "
                        + "servicios, sin sujetarse al procedimiento de licitacin pblica, a travs de los "
                        + "procedimientos de invitacin a cuando menos tres personas o de adjudicacin directa, "
                        + "cuando:\n" + mapa.get("texto1_" + justi.getRomano()),
                        new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    parrafo.add(frase); */
                    document.add(parrafo);

                    parrafo = new Paragraph("Para tal efecto presento la siguiente informacin:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(60);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    document.add(parrafo);

                    parrafo = new Paragraph("I.- DESCRIPCIN DE LOS " + justi.getBienServicioTxt().toUpperCase(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setSpacingAfter(10);
                    document.add(parrafo);

                    parrafo = new Paragraph(
                            "El/Los " + justi.getBienServicioTxt()
                                    + " que se pretende contratar, son los siguientes:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    parrafo.setIndentationLeft(30);
                    document.add(parrafo);

                    parrafo = new Paragraph(justi.getDescripcion(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    parrafo.setSpacingBefore(20);
                    parrafo.setLeading(15);
                    parrafo.setIndentationLeft(30);
                    document.add(parrafo);

                    parrafo = new Paragraph(
                            "II.- PLAZOS Y CONDICIONES DEL SUMINISTRO DE LOS "
                                    + justi.getBienServicioTxt().toUpperCase(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setSpacingBefore(20);
                    document.add(parrafo);

                    parrafo = new Paragraph(mapa.get("plazo_" + justi.getPlazo()),
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    parrafo.setSpacingBefore(20);
                    parrafo.setLeading(15);
                    parrafo.setIndentationLeft(30);
                    document.add(parrafo);

                    parrafo = new Paragraph("III.- RESULTADO DE LA INVESTIGACIN DE MERCADO",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setSpacingBefore(20);
                    document.add(parrafo);

                    parrafo = new Paragraph(
                            "La Investigacin de Mercado fue realizada en los trminos de los artculos 28, 29 y 30 del "
                                    + "Reglamento de la Ley de Adquisiciones, Arrendamientos y Servicios del Sector Pblico, en "
                                    + "forma conjunta por el ?rea Requirente y el ?rea Contratante, en la cual se verific previo al "
                                    + "inicio del procedimiento de contratacin, la existencia de oferta, en la cantidad, calidad y "
                                    + "oportunidad requeridas; la existencia de proveedores a nivel nacional o internacional con "
                                    + "posibilidad de cumplir con las necesidades de la contratacin, conocer el precio prevaleciente al "
                                    + "momento de llevar a cabo la Investigacin de mercado as como en la informacin disponible "
                                    + "en el Sistema informtico denominado COMPRANET:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    parrafo.setSpacingBefore(20);
                    parrafo.setSpacingAfter(20);
                    parrafo.setLeading(15);
                    parrafo.setIndentationLeft(30);
                    document.add(parrafo);

                    PdfPTable table = new PdfPTable(2); // 3 columns.

                    table.setWidths(new int[] { 100, 50 });

                    if (justi.getEsUnico()) {

                        PdfPCell cell1 = new PdfPCell(
                                new Paragraph("PROVEEDOR", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                        PdfPCell cell2 = new PdfPCell(new Paragraph("IMPORTE SIN IVA",
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                        cell1.setBorder(PdfPCell.NO_BORDER);
                        cell2.setBorder(PdfPCell.NO_BORDER);
                        cell2.setHorizontalAlignment(Element.ALIGN_RIGHT);
                        table.addCell(cell1);
                        table.addCell(cell2);

                        cell1 = new PdfPCell(new Paragraph(justi.getProveedorUno().toUpperCase(),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell2 = new PdfPCell(new Paragraph(montoFormatComas(justi.getMontoUno(), justi),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell1.setBorder(PdfPCell.NO_BORDER);
                        cell2.setBorder(PdfPCell.NO_BORDER);
                        cell2.setHorizontalAlignment(Element.ALIGN_RIGHT);
                        table.addCell(cell1);
                        table.addCell(cell2);
                        document.add(table);

                        /* Si es nico, no lleva motivo de seleccin
                        parrafo = new Paragraph(justi.getMotivoSeleccion().toUpperCase(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                        parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                        parrafo.setSpacingBefore(20);
                        parrafo.setLeading(15);
                        parrafo.setIndentationLeft(30);
                        document.add(parrafo);
                        */

                        parrafo = new Paragraph(
                                "Concluyendo que en conjunto es la nica oferta en cuanto a obtener las mejores condiciones, calidad, "
                                        + "precio, oportunidad y financiamiento, por ser el nico proveedor que proporcione los "
                                        + justi.getBienServicioTxt() + " que se pretende contratar la de "
                                        + justi.getProveedorUno().toUpperCase() + ". La referida "
                                        + "Investigacin de Mercado se acompaa a la presente justificacin para determinar que el "
                                        + "procedimiento de contratacin por adjudicacin directa es el idneo.",
                                new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                        parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                        parrafo.setSpacingBefore(20);
                        parrafo.setLeading(15);
                        parrafo.setIndentationLeft(30);
                        document.add(parrafo);

                    } else {
                        PdfPCell cell1 = new PdfPCell(
                                new Paragraph("PROVEEDOR", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                        PdfPCell cell2 = new PdfPCell(new Paragraph("IMPORTE SIN IVA",
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                        cell1.setBorder(PdfPCell.NO_BORDER);
                        cell2.setBorder(PdfPCell.NO_BORDER);
                        cell2.setHorizontalAlignment(Element.ALIGN_RIGHT);
                        table.addCell(cell1);
                        table.addCell(cell2);

                        cell1 = new PdfPCell(new Paragraph(justi.getProveedorUno().toUpperCase(),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                        cell2 = new PdfPCell(new Paragraph(montoFormatComas(justi.getMontoUno(), justi),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                        cell1.setBorder(PdfPCell.NO_BORDER);
                        cell2.setBorder(PdfPCell.NO_BORDER);
                        cell2.setHorizontalAlignment(Element.ALIGN_RIGHT);
                        table.addCell(cell1);
                        table.addCell(cell2);

                        cell1 = new PdfPCell(new Paragraph(justi.getProveedorDos().toUpperCase(),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell2 = new PdfPCell(new Paragraph(montoFormatComas(justi.getMontoDos(), justi),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell1.setBorder(PdfPCell.NO_BORDER);
                        cell2.setBorder(PdfPCell.NO_BORDER);
                        cell2.setHorizontalAlignment(Element.ALIGN_RIGHT);
                        table.addCell(cell1);
                        table.addCell(cell2);

                        if (justi.getProveedorTres() != null && justi.getProveedorTres().trim().length() > 0) {
                            cell1 = new PdfPCell(new Paragraph(justi.getProveedorTres().toUpperCase(),
                                    new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                            cell2 = new PdfPCell(new Paragraph(montoFormatComas(justi.getMontoTres(), justi),
                                    new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                            cell2.setHorizontalAlignment(Element.ALIGN_RIGHT);
                            cell1.setBorder(PdfPCell.NO_BORDER);
                            cell2.setBorder(PdfPCell.NO_BORDER);
                            table.addCell(cell1);
                            table.addCell(cell2);
                        }

                        document.add(table);

                        parrafo = new Paragraph("Motivo de la seleccin: " + justi.getMotivoSeleccion(),
                                new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                        parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                        parrafo.setIndentationLeft(30);
                        document.add(parrafo);

                        parrafo = new Paragraph(
                                "Siendo la oferta que en conjunto presenta las mejores condiciones en cuanto a calidad, precio, oportunidad  "
                                        + "y financiamiento, la de " + justi.getProveedorUno().toUpperCase() + ". "
                                        + "La referida Investigacin de Mercado se acompaa a la presente justificacin para determinar  "
                                        + "que el procedimiento de contratacin por adjudicacin directa es el idneo.",
                                new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                        parrafo.setSpacingBefore(20);
                        parrafo.setLeading(15);
                        parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                        parrafo.setIndentationLeft(30);
                        document.add(parrafo);
                    }

                    parrafo = new Paragraph("IV.- PROCEDIMIENTO DE CONTRATACIN PROPUESTO",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setSpacingBefore(20);
                    document.add(parrafo);

                    parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);

                    frase = new Chunk(
                            "El procedimiento de contratacin propuesto es el de adjudicacin directa, en virtud de que en el "
                                    + "presente caso la adjudicacin se llevara a cabo conforme la fraccin "
                                    + justi.getRomano() + " del artculo 41 el cual "
                                    + "menciona que este tipo de adjudicacin se puede llevar a cabo siempre y cuando: \n",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    parrafo.add(frase);

                    frase = new Chunk(mapa.get("texto1_" + justi.getRomano()),
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    parrafo.add(frase);

                    frase = new Chunk(" Actualizndose el supuesto de excepcin a la licitacin pblica "
                            + "establecido en la fraccin " + justi.getRomano()
                            + " del artculo 41 de la Ley de Adquisiciones, Arrendamientos y "
                            + "Servicios del Sector Pblico, en relacin con lo establecido en el artculo 72 de su Reglamento.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    parrafo.add(frase);
                    document.add(parrafo);

                    parrafo = new Paragraph("IV.1.     MOTIVACIN Y FUNDAMENTACIN LEGAL:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setSpacingBefore(20);
                    parrafo.setIndentationLeft(30);
                    document.add(parrafo);

                    parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(60);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);

                    frase = new Chunk("A)", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.add(frase);

                    frase = new Chunk("  MOTIVOS: ", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.add(frase);

                    frase = new Chunk("La contratacin de los " + justi.getBienServicioTxt()
                            + " objeto de la presente justificacin "
                            + "es necesaria para satisfacer los requerimientos del proyecto identificado por: "
                            + justi.getProyecto() + ".  " + justi.getRazonCompra() + "." + " \nPor lo anterior, la "
                            + "contratacin propuesta se adeca al supuesto de excepcin establecido en la Ley "
                            + "de Adquisiciones, Arrendamientos y Servicios del Sector Pblico en su artculo 41, "
                            + "fraccin " + justi.getRomano()
                            + "; adems de que se renen los requisitos previstos en el artculo 72 del "
                            + "Reglamento de la Ley de Adquisiciones, Arrendamientos y Servicios del Sector "
                            + "Pblico, tal y como se desprende de la informacin presentada en esta justificacin, "
                            + "as como de la Investigacin de Mercado; "
                            + "por lo que resulta procedente la contratacin bajo el procedimiento de adjudicacin "
                            + "directa previsto en el artculo 26, fraccin III de la Ley antes mencionada.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.add(frase);
                    document.add(parrafo);

                    parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(60);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);

                    frase = new Chunk("B)", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.add(frase);

                    frase = new Chunk("  FUNDAMENTOS: ", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.add(frase);

                    frase = new Chunk("La contratacin se encuentra debidamente fundada en el artculo "
                            + "134 de la Constitucin Poltica de los Estados Unidos Mexicanos; en los artculos 26 "
                            + "fraccin III, 40 y 41 fraccin " + justi.getRomano()
                            + " de la Ley de Adquisiciones, Arrendamientos y "
                            + "Servicios del Sector Pblico; as como en los artculos 71 y 72 del Reglamento de la "
                            + "Ley de Adquisiciones, Arrendamientos y Servicios del Sector Pblico.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.add(frase);
                    document.add(parrafo);

                    parrafo = new Paragraph("V.- MONTO ESTIMADO Y FORMA DE PAGO PROPUESTO:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setSpacingBefore(20);
                    document.add(parrafo);

                    parrafo = new Paragraph("V.1.      MONTO ESTIMADO:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setSpacingBefore(20);
                    parrafo.setIndentationLeft(30);
                    document.add(parrafo);

                    DecimalFormat decimalFormat = new DecimalFormat("0.00");
                    parrafo = new Paragraph("El monto estimado de la contratacin es la cantidad de "
                            + montoFormatComas(justi.getSubTotal(), justi) + " ("
                            + new Numero_a_Letra().Convertir(decimalFormat.format(justi.getSubTotal()), true) + " "
                            + /*codigoDivisa(justi)*/ justi.getMoneda().getCode() + ")" + masIva + ", mismo que "
                            + "result el ms conveniente de acuerdo con la Investigacin de Mercado"
                            + ", mediante la cual se verific previo al inicio del procedimiento "
                            + "de contratacin, la existencia de oferta de los " + justi.getBienServicioTxt()
                            + " en la cantidad, "
                            + "calidad y oportunidad requeridos en los trminos del artculo 28 del Reglamento de la Ley de "
                            + "Adquisiciones, Arrendamientos y Servicios del Sector Pblico.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    document.add(parrafo);

                    table = new PdfPTable(3); // 3 columns.

                    table.setWidths(new int[] { 30, 10, 10 });
                    PdfPCell cell1 = new PdfPCell(
                            new Paragraph("Subtotal:", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    PdfPCell cell2 = new PdfPCell(new Paragraph(montoFormatComas(justi.getSubTotal(), justi),
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    PdfPCell cell0 = new PdfPCell(
                            new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell0.setBorder(PdfPCell.NO_BORDER);
                    table.addCell(cell0);
                    cell1.setBorder(PdfPCell.NO_BORDER);
                    cell1.setHorizontalAlignment(Element.ALIGN_RIGHT);
                    cell2.setBorder(PdfPCell.NO_BORDER);
                    cell2.setHorizontalAlignment(Element.ALIGN_RIGHT);
                    table.addCell(cell1);
                    table.addCell(cell2);
                    cell1 = new PdfPCell(
                            new Paragraph("Iva:", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell2 = new PdfPCell(new Paragraph(montoFormatComas(justi.getIva(), justi),
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell0 = new PdfPCell(new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell0.setBorder(PdfPCell.NO_BORDER);
                    table.addCell(cell0);
                    cell1.setBorder(PdfPCell.NO_BORDER);
                    cell1.setHorizontalAlignment(Element.ALIGN_RIGHT);
                    cell2.setBorder(PdfPCell.NO_BORDER);
                    cell2.setHorizontalAlignment(Element.ALIGN_RIGHT);
                    table.addCell(cell1);
                    table.addCell(cell2);
                    cell1 = new PdfPCell(
                            new Paragraph("Total:", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                    cell2 = new PdfPCell(new Paragraph(montoFormatComas(justi.getImporte(), justi),
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                    cell0 = new PdfPCell(new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell0.setBorder(PdfPCell.NO_BORDER);
                    table.addCell(cell0);
                    cell1.setBorder(PdfPCell.NO_BORDER);
                    cell1.setHorizontalAlignment(Element.ALIGN_RIGHT);
                    cell2.setBorder(PdfPCell.NO_BORDER);
                    cell2.setHorizontalAlignment(Element.ALIGN_RIGHT);
                    table.addCell(cell1);
                    table.addCell(cell2);
                    document.add(table);

                    parrafo = new Paragraph("V.1.      FORMA DE PAGO PROPUESTA:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setSpacingBefore(20);
                    parrafo.setIndentationLeft(30);
                    document.add(parrafo);

                    parrafo = new Paragraph("El monto total ser pagado en " + justi.getNumPagos() + " pago/s de "
                            + montoFormatComas(justi.getSubTotal() / justi.getNumPagos(), justi) + " ("
                            + new Numero_a_Letra().Convertir(
                                    decimalFormat.format(justi.getSubTotal() / (justi.getNumPagos())).toString(),
                                    true)
                            + " " + /*codigoDivisa(justi)*/ justi.getMoneda().getCode() + ")" + masIva
                            + ". Los pagos se realizarn previa verificacin de la entrega y calidad de los "
                            + justi.getBienServicioTxt()
                            + " as como previo envo en formatos .pdf y .xml del Comprobante Fiscal "
                            + "Digital por Internet (CFDI) correspondiente que rena los requisitos fiscales respectivos. Los "
                            + "pagos se efectuarn mediante " + justi.getFormaPago(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    document.add(parrafo);

                    parrafo = new Paragraph("VI.- PERSONA PROPUESTA PARA LA ADJUDICACIN DIRECTA:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setSpacingBefore(20);
                    document.add(parrafo);

                    parrafo = new Paragraph(
                            "Por lo anteriormente expuesto y fundado, se propone a "
                                    + justi.getProveedorUno().toUpperCase() + ", con domicilio ubicado en "
                                    + justi.getDomicilio() + ", Registro Federal de Contribuyentes: "
                                    + justi.getRfc() + ", correo electrnico: " + justi.getCorreo()
                                    + " y nmero telefnico " + justi.getTelefono() + datosBanco,
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    document.add(parrafo);

                    parrafo = new Paragraph(
                            "VII.- ACREDITAMIENTO DEL O LOS CRITERIOS EN LOS QUE SE FUNDA Y MOTIVA LA "
                                    + "SELECCIN DEL PROCEDIMIENTO DE EXCEPCIN A LA LICITACIN PBLICA:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setLeading(15);
                    parrafo.setIndentationLeft(30);
                    parrafo.setSpacingBefore(20);
                    document.add(parrafo);

                    parrafo = new Paragraph(
                            "El procedimiento de contratacin por adjudicacin directa es el idneo, al actualizarse el "
                                    + "supuesto de excepcin al procedimiento de licitacin pblica previsto en el artculo 41, fraccin "
                                    + justi.getRomano()
                                    + " de la Ley de Adquisiciones, Arrendamientos y Servicios del Sector Pblico, aunado a que se "
                                    + "corrobor la capacidad y experiencia de la persona propuesta, quien por ser proveedor nico "
                                    + "present las mejores condiciones en cuanto a precio, calidad, financiamiento, oportunidad y "
                                    + "dems circunstancias pertinentes a efecto de asegurar a esta Entidad las mejores condiciones "
                                    + "para su contratacin, tal y como se acredita con la informacin presentada en esta justificacin, "
                                    + "as como con la Investigacin de Mercado.\n\n"
                                    + "El acreditamiento del o los criterios en los que se funda la excepcin de licitacin pblica, son "
                                    + "los siguientes:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    document.add(parrafo);

                    parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);

                    frase = new Chunk(" -  Economa\n", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.add(frase);
                    frase = new Chunk(
                            "Con la Investigacin de Mercado se establecieron precios y dems condiciones de calidad, "
                                    + "financiamiento y oportunidad, respecto de los " + justi.getBienServicioTxt()
                                    + " requeridos, con lo cual "
                                    + "se asegura cumplir con los principios del artculo 134 de la Constitucin Poltica de los Estados "
                                    + "Unidos Mexicanos y de la Ley de Adquisiciones, Arrendamientos y Servicios del Sector Pblico, "
                                    + "en cuanto a precio, calidad, financiamiento, oportunidad y dems circunstancias pertinentes, por "
                                    + "lo que el procedimiento de adjudicacin directa permite en contraposicin al procedimiento de "
                                    + "licitacin pblica, obtener con mayor oportunidad los "
                                    + justi.getBienServicioTxt() + " requeridos al "
                                    + "menor costo econmico para el CIMAV, S.C. segn lo detallado en la investigacin de mercado "
                                    + "que se realiz, generando ahorro de recursos por estar proponiendo la adjudicacin al "
                                    + "proveedor nico cuya propuesta se considera aceptable en cuanto a su solvencia. "
                                    + "Lo anterior de acuerdo con lo establecido en el numeral 4.2.4 (ADJUDICACIN DIRECTA) y "
                                    + "numeral 4.2.4.1.1 (Verificar Acreditamiento de Excepcin) del Acuerdo por el que se modifica el "
                                    + "Manual Administrativo de Aplicacin General en Materia de Adquisiciones, Arrendamientos y "
                                    + "Servicios del Sector Pblico, publicado en el Diario Oficial de la Federacin el 21 de noviembre "
                                    + "de 2012.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.add(frase);
                    document.add(parrafo);

                    parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);

                    frase = new Chunk(" -  Eficacia\n", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.add(frase);
                    frase = new Chunk(
                            "Con el procedimiento de contratacin por adjudicacin directa, se lograr obtener con "
                                    + "oportunidad los " + justi.getBienServicioTxt()
                                    + " atendiendo a las caractersticas requeridas en "
                                    + "contraposicin con el procedimiento de licitacin pblica, dado que se reducen tiempos y se "
                                    + "generan economas; aunado a que la persona propuesta cuenta con experiencia y capacidad "
                                    + "para satisfacer las necesidades requeridas, adems de que es el nico que ofrece las mejores "
                                    + "condiciones disponibles en cuanto a precio, calidad y oportunidad, con lo que se lograra el "
                                    + "cumplimiento de los objetivos y resultados deseados en el tiempo requerido, situacin que se "
                                    + "puede demostrar en base a la investigacin de mercado. "
                                    + "Lo anterior de acuerdo con lo establecido en el numeral 4.2.4 (ADJUDICACIN DIRECTA) y "
                                    + "numeral 4.2.4.1.1 (Verificar Acreditamiento de Excepcin) del Acuerdo por el que se modifica el "
                                    + "Manual Administrativo de Aplicacin General en Materia de Adquisiciones, Arrendamientos y "
                                    + "Servicios del Sector Pblico, publicado en el Diario Oficial de la Federacin el 21 de noviembre "
                                    + "de 2012.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.add(frase);
                    document.add(parrafo);

                    parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);

                    frase = new Chunk(" -  Eficiencia\n", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.add(frase);
                    frase = new Chunk(
                            "Con el procedimiento de adjudicacin directa, a diferencia del procedimiento de licitacin "
                                    + "pblica, se logra el uso racional de recursos con los que cuenta la Entidad para realizar la "
                                    + "contratacin, obteniendo las mejores condiciones de precio, calidad y oportunidad, evitando la "
                                    + "prdida de tiempo y recursos al Estado, lo cual se demuestra con la investigacin de mercado "
                                    + "que se realiz, quedando evidencia de su resultado ya que los recursos disponibles con los que "
                                    + "cuenta el CIMAV se aplican conforme a los lineamientos de racionalidad y austeridad "
                                    + "presupuestaria. "
                                    + "Lo anterior de acuerdo con lo establecido en el numeral 4.2.4 (ADJUDICACIN DIRECTA) y "
                                    + "numeral 4.2.4.1.1 (Verificar Acreditamiento de Excepcin) del Acuerdo por el que se modifica el "
                                    + "Manual Administrativo de Aplicacin General en Materia de Adquisiciones, Arrendamientos y "
                                    + "Servicios del Sector Pblico, publicado en el Diario Oficial de la Federacin el 21 de noviembre "
                                    + "de 2012.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.add(frase);
                    document.add(parrafo);

                    parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);

                    frase = new Chunk(" -  Imparcialidad\n", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.add(frase);
                    frase = new Chunk(
                            "El tipo de adjudicacin que se propone, se llev a cabo sin prejuicios ni situaciones que "
                                    + "pudieran afectar la imparcialidad, y sin que medie algn inters personal de los servidores "
                                    + "pblicos involucrados en la contratacin o de cualquier otra ndole que pudiera otorgar "
                                    + "condiciones ventajosas a alguna persona, en relacin con los dems ni limitar la libre "
                                    + "participacin, esto debido a que es proveedor nico, dicha situacin queda demostrada "
                                    + "conforme al resultado que se da con base a la investigacin de mercado. "
                                    + "Lo anterior de acuerdo con lo establecido en el numeral 4.2.4 (ADJUDICACIN DIRECTA) y "
                                    + "numeral 4.2.4.1.1 (Verificar Acreditamiento de Excepcin) del Acuerdo por el que se modifica el "
                                    + "Manual Administrativo de Aplicacin General en Materia de Adquisiciones, Arrendamientos y "
                                    + "Servicios del Sector Pblico, publicado en el Diario Oficial de la Federacin el 21 de noviembre "
                                    + "de 2012.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.add(frase);
                    document.add(parrafo);

                    parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);

                    frase = new Chunk(" -  Honradez\n", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.add(frase);
                    frase = new Chunk(
                            "La seleccin del procedimiento de adjudicacin directa tiene como nico fin contratar bajo "
                                    + "las mejores condiciones los " + justi.getBienServicioTxt()
                                    + " requeridos, actuando con rectitud, "
                                    + "responsabilidad e integridad y con apego estricto al marco jurdico aplicable, evitando as "
                                    + "incurrir en actos de corrupcin y conflictos de inters, ya que por parte de los servidores "
                                    + "pblicos que intervinieron en este procedimiento quedo evidenciado que no se ha favorecido a "
                                    + "persona alguna interesada en la contratacin ya que en base a la investigacin de mercado "
                                    + "queda demostrado que es proveedor nico.\n\n"
                                    + "Lo anterior de acuerdo con lo establecido en el numeral 4.2.4 (ADJUDICACIN DIRECTA) y "
                                    + "numeral 4.2.4.1.1 (Verificar Acreditamiento de Excepcin) del Acuerdo por el que se modifica el "
                                    + "Manual Administrativo de Aplicacin General en Materia de Adquisiciones, Arrendamientos y "
                                    + "Servicios del Sector Pblico, publicado en el Diario Oficial de la Federacin el 21 de noviembre "
                                    + "de 2012.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.add(frase);
                    document.add(parrafo);

                    if (justi.getEsUnico()) {
                        parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                        parrafo.setSpacingAfter(20);
                        parrafo.setIndentationLeft(30);
                        parrafo.setLeading(15);
                        parrafo.setSpacingBefore(20);
                        parrafo.setAlignment(Element.ALIGN_JUSTIFIED);

                        frase = new Chunk(" -  Transparencia\n",
                                new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                        parrafo.add(frase);
                        frase = new Chunk(mapa.get("transparencia_unico"),
                                new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                        parrafo.add(frase);
                        document.add(parrafo);
                    } else {
                        parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                        parrafo.setSpacingAfter(20);
                        parrafo.setIndentationLeft(30);
                        parrafo.setLeading(15);
                        parrafo.setSpacingBefore(20);
                        parrafo.setAlignment(Element.ALIGN_JUSTIFIED);

                        frase = new Chunk(" -  Transparencia\n",
                                new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                        parrafo.add(frase);
                        frase = new Chunk(mapa.get("transparencia_no_unico"),
                                new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                        parrafo.add(frase);
                        document.add(parrafo);
                    }

                    parrafo = new Paragraph("VIII.- LUGAR Y FECHA DE EMISIN:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    document.add(parrafo);

                    parrafo = new Paragraph("En la Ciudad de Chihuahua, Estado de Chihuahua a los "
                            + justi.getFechaElaboracion().getDayOfMonth() + " das del mes de "
                            + justi.getFechaElaboracion().getMonth().getDisplayName(TextStyle.FULL,
                                    new Locale("es", "ES"))
                            + " de " + justi.getFechaElaboracion().getYear()
                            + ", se emite la presente justificacin para los efectos legales a que haya lugar.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    parrafo.setLeading(15);
                    parrafo.setIndentationLeft(30);
                    parrafo.setSpacingBefore(20);
                    document.add(parrafo);

                    parrafo = new Paragraph(
                            "En cumplimiento a lo establecido en el penltimo prrafo del artculo 71 del Reglamento "
                                    + "de la Ley de Adquisiciones, Arrendamientos y Servicios del Sector Pblico, se acompaa a la "
                                    + "presente como ANEXO DOS?, la Requisicin o Solicitud de Contratacin (Requisicin) A la "
                                    + "cual se deber anexar, mediante sello del departamento de Presupuesto, la Constancia con la "
                                    + "que se acredita la existencia de recursos para iniciar el procedimiento de contratacin.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    parrafo.setLeading(15);
                    parrafo.setIndentationLeft(30);
                    parrafo.setSpacingBefore(20);
                    document.add(parrafo);

                    if (justi.getEsUnico()) {
                        parrafo = new Paragraph(mapa.get("nota_1"),
                                new Font(Font.FontFamily.TIMES_ROMAN, 13, Font.BOLD));
                        parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                        parrafo.setLeading(15);
                        parrafo.setIndentationLeft(30);
                        parrafo.setSpacingBefore(20);
                        document.add(parrafo);
                    }

                    parrafo = new Paragraph("ATENTAMENTE", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(60);
                    document.add(parrafo);

                    parrafo = new Paragraph(
                            justi.getAutoriza().getName() + "\n" + justi.getAutorizaCargo().toUpperCase(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(60);
                    document.add(parrafo);

                    document.close();
                    outputStream.close();

                } catch (DocumentException ex) {
                    Logger.getLogger(JustificacionREST.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        };

        ResponseBuilder response = Response.ok(streamingOutput);
        String fileName = ("inline; filename=" + justi.getRequisicion() + "-" + justi.getEmpleado().getCuentaCimav()
                + ".pdf").replace(" ", "").replace(",", "-");
        response.header("Content-Disposition", fileName);

        return response.build();
    }

    /*    
        //@Context private HttpServletResponse response;
        public String signoDivisa_(Justificacion justi) {
    String moneda = "$";
    switch (justi.getMoneda().getId()) {
        case 0:
        case 1:
            moneda = "$";
            break;
        case 2:
            moneda = "";
            break;
        case 3:
            moneda = "CHF";
            break;
    }
    return moneda;
        }
    */
    /*
    public String codigoDivisa_(Justificacion justi) {
    String codigo = "MXN";
    switch (justi.getMoneda().getId()) {
        case 0:
            codigo = "MXN";
            break;
        case 1:
            codigo = "USD";
            break;
        case 2:
            codigo = "EUR";
            break;
        case 3:
            codigo = "CHF";
            break;
    }
    return codigo;
    }
    */
    public String montoFormatComas(Double monto, Justificacion justi) {
        return /*codigoDivisa(justi)*/ justi.getMoneda().getCode() + " "
                + /*signoDivisa(justi)*/ justi.getMoneda().getSimbolo() + String.format("%,.2f", monto);
    }

    @GET
    @Path("tabla_mercado")
    @Produces("application/pdf")
    public Response tablaMercadoPorId(@DefaultValue("0") @QueryParam("id") Integer id_param) {
        return this.tablaMercado(id_param);
    }

    @GET
    @Path("tabla_mercado_by_requi/{requisicion}")
    @Produces("application/pdf")
    public Response tablaMercadoPorRequisicion(
            @DefaultValue("91919191") @PathParam("requisicion") String requisicion) {

        TypedQuery<Justificacion> query = getEntityManager().createQuery(
                "SELECT j FROM Justificacion AS j WHERE j.requisicion = :requisicion", Justificacion.class);
        query.setParameter("requisicion", requisicion);
        Justificacion justificacion = query.getSingleResult();
        if (justificacion != null) {
            return this.tablaMercado(justificacion.getId());
        }
        return Response.ok().build();
    }

    private Response tablaMercado(Integer id_param) {
        Justificacion justif = (Justificacion) JustificacionREST.this.find(id_param);

        StreamingOutput streamingOutput = new StreamingOutput() {
            public void write(OutputStream outputStream) throws IOException, WebApplicationException {

                try {
                    //Create Document instance.
                    Document document = new Document();
                    PdfWriter.getInstance(document, outputStream);

                    document.addAuthor("Generador adquisiciones | " + justif.getEmpleado().getCuentaCimav());
                    String fileName1 = (justif.getRequisicion() + "-" + justif.getEmpleado().getCuentaCimav())
                            .replace(" ", "").replace(",", "");
                    document.addTitle("Justificacin: " + fileName1);
                    document.addSubject("Justificacin de Requisicin");

                    document.open();

                    //Titulo del documento
                    Paragraph parrafo = new Paragraph("Centro de Investigacin en Materiales Avanzados S. C.",
                            new Font(Font.FontFamily.TIMES_ROMAN, 17, Font.BOLD));
                    parrafo.setAlignment(Element.ALIGN_CENTER);
                    parrafo.setSpacingAfter(20);
                    document.add(parrafo);

                    PdfPTable table = new PdfPTable(3); // 3 columns.

                    table.setWidths(new int[] { 30, 50, 100 });

                    PdfPCell cell0 = new PdfPCell(
                            new Paragraph("Fecha:", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    PdfPCell cell1 = new PdfPCell(new Paragraph(
                            justif.getFechaInicio().getDayOfMonth() + " de "
                                    + justif.getFechaInicio().getMonth().getDisplayName(TextStyle.FULL,
                                            new Locale("es", "ES"))
                                    + " de " + justif.getFechaInicio().getYear(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    PdfPCell cell2 = new PdfPCell(
                            new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell0.setBorder(PdfPCell.BOX);
                    cell1.setBorder(PdfPCell.BOX);
                    cell2.setBorder(PdfPCell.NO_BORDER);
                    cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
                    table.addCell(cell0);
                    table.addCell(cell1);
                    table.addCell(cell2);

                    cell0 = new PdfPCell(new Paragraph("No. de Requisicin:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell1 = new PdfPCell(new Paragraph(justif.getRequisicion(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell2 = new PdfPCell(new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell0.setBorder(PdfPCell.BOX);
                    cell1.setBorder(PdfPCell.BOX);
                    cell2.setBorder(PdfPCell.NO_BORDER);
                    cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
                    table.addCell(cell0);
                    table.addCell(cell1);
                    table.addCell(cell2);

                    cell0 = new PdfPCell(new Paragraph("Procedimiento:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell1 = new PdfPCell(new Paragraph("Adjudicacin Directa",
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell2 = new PdfPCell(new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell0.setBorder(PdfPCell.BOX);
                    cell1.setBorder(PdfPCell.BOX);
                    cell2.setBorder(PdfPCell.NO_BORDER);
                    cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
                    table.addCell(cell0);
                    table.addCell(cell1);
                    table.addCell(cell2);

                    cell0 = new PdfPCell(new Paragraph("Origen de los bienes:",
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell1 = new PdfPCell(new Paragraph(justif.esNacional(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell2 = new PdfPCell(new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell0.setBorder(PdfPCell.BOX);
                    cell1.setBorder(PdfPCell.BOX);
                    cell2.setBorder(PdfPCell.NO_BORDER);
                    cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
                    table.addCell(cell0);
                    table.addCell(cell1);
                    table.addCell(cell2);

                    document.add(table);

                    parrafo = new Paragraph("", new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    document.add(parrafo);

                    table = new PdfPTable(5);// 5 columns.
                    table.setWidthPercentage(90); //table size %

                    table.setWidths(new int[] { 'a', 'a', 'a', 'a', 'a' });

                    cell0 = new PdfPCell(
                            new Paragraph("PARTIDA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                    cell1 = new PdfPCell(
                            new Paragraph("DESCIPCIMAV", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                    cell2 = new PdfPCell(
                            new Paragraph("PROVEEDOR No. 1", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                    PdfPCell cell3 = new PdfPCell(
                            new Paragraph("PROVEEDOR No.2", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                    PdfPCell cell4 = new PdfPCell(
                            new Paragraph("PROVEEDOR No.3", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                    cell0.setBorder(PdfPCell.BOX);
                    cell1.setBorder(PdfPCell.BOX);
                    cell2.setBorder(PdfPCell.BOX);
                    cell3.setBorder(PdfPCell.BOX);
                    cell4.setBorder(PdfPCell.BOX);
                    cell0.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell4.setHorizontalAlignment(Element.ALIGN_CENTER);
                    table.addCell(cell0);
                    table.addCell(cell1);
                    table.addCell(cell2);
                    table.addCell(cell3);
                    table.addCell(cell4);

                    cell0 = new PdfPCell(
                            new Paragraph("Partida #1", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD)));
                    cell1 = new PdfPCell(new Paragraph(justif.getDescripcion(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell0.setBorder(PdfPCell.BOX);
                    cell1.setBorder(PdfPCell.BOX);
                    cell0.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell0.setVerticalAlignment(Element.ALIGN_MIDDLE);
                    cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
                    cell0.setRowspan(2);
                    cell1.setRowspan(2);
                    table.addCell(cell0);
                    table.addCell(cell1);

                    cell2 = new PdfPCell(new Paragraph(justif.getProveedorUno(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell3 = new PdfPCell(new Paragraph(justif.getProveedorDos(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell4 = new PdfPCell(new Paragraph(justif.getProveedorTres(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    cell2.setBorder(PdfPCell.BOX);
                    cell3.setBorder(PdfPCell.BOX);
                    cell4.setBorder(PdfPCell.BOX);
                    cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell4.setHorizontalAlignment(Element.ALIGN_CENTER);
                    table.addCell(cell2);
                    table.addCell(cell3);
                    table.addCell(cell4);

                    if (justif.getMontoUno() <= 1 && justif.getMontoDos() <= 1 && justif.getMontoTres() <= 1) {
                        cell2 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell3 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell4 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));

                    } else if (justif.getMontoUno() <= 1 && justif.getMontoDos() <= 1) {
                        cell2 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell3 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell4 = new PdfPCell(new Paragraph(montoFormatComas(justif.getMontoTres(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));

                    } else if (justif.getMontoUno() <= 1 && justif.getMontoTres() <= 1) {
                        cell2 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell3 = new PdfPCell(new Paragraph(montoFormatComas(justif.getMontoDos(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell4 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));

                    } else if (justif.getMontoDos() <= 1 && justif.getMontoTres() <= 1) {
                        cell2 = new PdfPCell(new Paragraph(montoFormatComas(justif.getMontoUno(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell3 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell4 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));

                    } else if (justif.getMontoUno() <= 1) {
                        cell2 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell3 = new PdfPCell(new Paragraph(montoFormatComas(justif.getMontoDos(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell4 = new PdfPCell(new Paragraph(montoFormatComas(justif.getMontoTres(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));

                    } else if (justif.getMontoDos() <= 1) {
                        cell2 = new PdfPCell(new Paragraph(
                                "Subtotal: " + justif.getSubTotal() + "\n" + "IVA: " + justif.getIva() + "\n"
                                        + "Total:" + "\n" + montoFormatComas(justif.getImporte(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell3 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell4 = new PdfPCell(new Paragraph(montoFormatComas(justif.getMontoTres(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));

                    } else if (justif.getMontoTres() <= 1) {
                        cell2 = new PdfPCell(new Paragraph(
                                "Subtotal: " + justif.getSubTotal() + "\n" + "IVA: " + justif.getIva() + "\n"
                                        + "Total:" + "\n" + montoFormatComas(justif.getImporte(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell3 = new PdfPCell(new Paragraph(montoFormatComas(justif.getMontoDos(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell4 = new PdfPCell(
                                new Paragraph("NO APLICA", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    } else {
                        cell2 = new PdfPCell(new Paragraph(
                                "Subtotal: " + justif.getSubTotal() + "\n" + "IVA: " + justif.getIva() + "\n"
                                        + "Total:" + "\n" + montoFormatComas(justif.getImporte(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell3 = new PdfPCell(new Paragraph(montoFormatComas(justif.getMontoDos(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                        cell4 = new PdfPCell(new Paragraph(montoFormatComas(justif.getMontoTres(), justif),
                                new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL)));
                    }
                    cell2.setBorder(PdfPCell.BOX);
                    cell3.setBorder(PdfPCell.BOX);
                    cell4.setBorder(PdfPCell.BOX);
                    cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell2.setVerticalAlignment(Element.ALIGN_MIDDLE);
                    cell3.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell3.setVerticalAlignment(Element.ALIGN_MIDDLE);
                    cell4.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell4.setVerticalAlignment(Element.ALIGN_MIDDLE);
                    table.addCell(cell2);
                    table.addCell(cell3);
                    table.addCell(cell4);
                    document.add(table);

                    parrafo = new Paragraph(
                            "Tal como lo establece el artculo 29 " + "del Reglamento de la Ley de Adquisiciones, "
                                    + "Arrendamientos y Servicios del Sector Pblico,"
                                    + " la investigacin de mercado arrojo los siguientes resultados:\n",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(20);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(10);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    document.add(parrafo);

                    parrafo = new Paragraph(
                            "Fraccin I, determinamos la existencia de oferta de los bienes requeridos.\n"
                                    + "Fraccin II, verificamos existencias de los mismos con los proveedores que nos proporcionaron cotizacin formal.\n"
                                    + "Fraccin III, conocimos los precios que prevalecan en el mercado nacional.\n",
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));

                    parrafo.setIndentationLeft(50);
                    parrafo.setLeading(15);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    document.add(parrafo);

                    parrafo = new Paragraph(
                            "A travs de la investigacin de mercado realizada, "
                                    + "concluimos que la mejor opcin de compra es la oferta del proveedor" + " "
                                    + justif.getProveedorUno(),
                            new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL));
                    parrafo.setSpacingAfter(10);
                    parrafo.setIndentationLeft(30);
                    parrafo.setLeading(15);
                    parrafo.setSpacingBefore(20);
                    parrafo.setAlignment(Element.ALIGN_JUSTIFIED);
                    document.add(parrafo);

                    document.close();
                    outputStream.close();

                } catch (DocumentException ex) {
                    Logger.getLogger(JustificacionREST.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        };
        ResponseBuilder response = Response.ok(streamingOutput);
        String fileName = ("inline; filename=" + justif.getRequisicion() + "-"
                + justif.getEmpleado().getCuentaCimav() + ".pdf").replace(" ", "").replace(",", "-");
        response.header("Content-Disposition", fileName);

        return response.build();
    }

}