예제 #1
0
    def story(self):
        documento = []

        image_path = os.path.join(settings.BASE_DIR, "templates", "publico",
                                  "img", "logo-ifba-new.jpg")
        image = pdf.Image(image_path,
                          width=49.6 * pdf.mm,
                          height=13.0 * pdf.mm)
        documento.append(image)
        documento.append(
            pdf.para(
                "ANÁLISE DOCUMENTAL DE PRÉ-MATRÍCULA PARTICIPANTE DE COTA",
                "h2",
                align="c",
            ))
        documento.append(
            pdf.para(f"Campus: {self.curso.campus.nome}", "h3", align="c"))
        documento.append(pdf.space(10))

        documento.append(
            pdf.para(
                f"{self.tipo.nome} - Setor Responsável: {self.tipo.setor_responsavel}",
                "h4",
                align="l",
            ))
        documento.append(
            pdf.para(f"<font size=8>{self.tipo.descricao}</font>"))
        documento.append(pdf.space(10))

        dados_vaga = []
        status = ""
        if not self.avaliacao.situacao:
            status = "Não "
        dados_vaga.append([
            "<i>Candidato(a): </i>",
            f"<b>{self.inscricao.candidato.pessoa.nome.upper()}</b>",
        ])
        dados_vaga.append([
            "<i>Curso: </i>",
            f"<b>{self.curso.nome.upper()} ({self.curso.get_formacao_display()})</b>",
        ])
        dados_vaga.append(["<i>Situação: </i>", f"<b>{status}Atende</b>"])
        dados_vaga.append([
            "<i>Observações: </i>",
            f'<b>{self.avaliacao.observacao or "Não houveram"}</b>',
        ])
        tbl_dados_vaga = pdf.table(dados_vaga,
                                   a=["l", "l"],
                                   w=[30, 156],
                                   grid=0,
                                   fontSize=10)
        documento.append(tbl_dados_vaga)
        documento.append(pdf.space(15))

        documento.append(
            pdf.para("___________________________, _____/ _____/ _________",
                     align="c"))
        documento.append(pdf.para("Responsável pela avaliação", align="c"))

        return documento
예제 #2
0
def gerar_declaracao_ppi(candidato, cidade):
    nome_candidato = candidato.nome.upper()
    cidade_e_data = f'{cidade}, {datetime.now().strftime("%d de %B de %Y")}.'
    documento = []

    documento.append(pdf.space(15))
    documento.append(
        pdf.para(
            "DECLARAÇÃO DE PERTENCIMENTO AOS GRUPOS ÉTNICOS PRETO, PARDO OU INDÍGENA",
            style="h1",
            align="c",
        ))
    documento.append(pdf.space(25))
    texto_0 = (
        f"Eu, <b>{nome_candidato}</b>, inscrito(a) no CPF de número <b>{candidato.cpf}</b>, declaro, para "
        "os devidos fins de direito, que pertenço ao grupo étnico informado abaixo, sendo, portanto, "
        "detentor dos direitos abrigados pela Lei nº 12.711, de 29 de agosto de 2012."
    )
    documento.append(pdf.para(texto_0))
    documento.append(pdf.space(5))

    texto_1 = "Grupo étnico ao qual pertenço:"
    documento.append(pdf.para(texto_1))
    documento.append(pdf.space(5))

    documento.append(pdf.para("____ Preto"))
    documento.append(pdf.space(5))

    documento.append(pdf.para("____ Pardo"))
    documento.append(pdf.space(5))

    documento.append(pdf.para("____ Indígena"))
    documento.append(pdf.space(20))

    documento.append(pdf.para(cidade_e_data, align="r"))
    documento.append(pdf.space(15))
    documento.append(
        pdf.para(
            "___________________________________________<br/>Assinatura do(a) Declarante",
            align="c",
        ))

    return documento
예제 #3
0
    def _generate_file(self, inscricao):
        documento = []

        tipos = models.TipoAnalise.objects.filter(modalidade=self.modalidade)

        image_path = os.path.join(settings.BASE_DIR, "templates", "publico",
                                  "img", "logo-ifba-new.jpg")
        image = pdf.Image(image_path,
                          width=49.6 * pdf.mm,
                          height=13.0 * pdf.mm)
        str_cabecalho = f"<i>Campus: </i><i>{self.campus.nome}</i>"

        tbl_cabechalho = pdf.table(
            rows=[[image, str_cabecalho]],
            a=["r", "l"],
            w=[118, 70],
            grid=0,
            fontSize=10,
        )
        documento.append(tbl_cabechalho)
        documento.append(pdf.space(5))

        tbl_dados_vaga = pdf.table(
            [[
                "<b>ANÁLISE DOCUMENTAL DE PRÉ-MATRÍCULA PARTICIPANTE DE COTA</b>"
            ]],
            w=[195],
            grid=1,
            head=1,
            fontSize=8,
        )
        documento.append(tbl_dados_vaga)

        dados_vaga = []
        dados_vaga.append([
            f"<i>Candidato: </i><b>{inscricao.candidato.pessoa.nome.upper()}</b>",
            f"<i>Curso: </i><b>{self.curso.nome.upper()} ({self.curso.get_formacao_display()})</b>",
        ])
        tbl_dados_vaga = pdf.table(dados_vaga,
                                   a=["l", "l"],
                                   w=[100, 95],
                                   grid=1,
                                   fontSize=8)
        documento.append(tbl_dados_vaga)
        documento.append(pdf.space(5))
        item = 0

        contador = 0

        for tipo in tipos:
            dados = []
            if tipo.nome == "DOCUMENTAÇÃO BÁSICA":
                tbl_dados = pdf.table(
                    [["<b>DOCUMENTAÇÃO BÁSICA</b>"]],
                    w=[195],
                    grid=1,
                    head=1,
                    fontSize=8,
                )
                documento.append(tbl_dados)
                lista = tipo.descricao.split(";")
                lista_itens = []
                d = dict()
                for l in lista:
                    lista_itens.append(l)
                    contador += 1
                    if (contador % 4) == 0:
                        d[item] = lista_itens
                        item += 1
                        lista_itens = []

                d[item] = lista_itens

                for k in d.keys():
                    texto = []
                    contador = 0
                    for i in d[k]:
                        texto.extend([f"<b> (  ) {i}</b>"])
                        contador += 1

                    for y in range(len(d[k]), 4):
                        texto.extend(["<b></b>"])
                    dados.append(texto)

                tbl_dados_alunos = pdf.table(
                    dados,
                    a=["l", "l", "l", "l"],
                    w=[45, 50, 50, 50],
                    grid=0,
                    zebra=0,
                    fontSize=6,
                )
                documento.append(tbl_dados_alunos)
            else:
                analise = [[
                    f"<b>{tipo.nome} [SETOR - {tipo.setor_responsavel}]</b>",
                    "<b>SITUAÇÃO</b>",
                ]]
                tbl_dados_vaga = pdf.table(analise,
                                           a=["l", "l"],
                                           w=[150, 45],
                                           grid=1,
                                           head=1,
                                           fontSize=8)
                documento.append(tbl_dados_vaga)
                dados.append([
                    f"{tipo.descricao}",
                    "( ) ATENDE<br/>( ) NÃO ATENDE<br/><br/>___/ ___/ ______",
                ])
                dados.append([
                    "<b>Observação: </b>",
                    "<br/>___________________________<br/>Assinatura com carimbo<br/>",
                ])
                tbl_dados_alunos = pdf.table(dados,
                                             a=["l", "l"],
                                             w=[150, 45],
                                             grid=1,
                                             zebra=0,
                                             fontSize=7)
                documento.append(tbl_dados_alunos)
            documento.append(pdf.space(5))

        tbl_sit_final = pdf.table(
            [["<b>SITUAÇÃO FINAL DA PRÉ-MATRÍCULA</b>"]],
            w=[195],
            grid=1,
            head=1,
            fontSize=8,
        )
        documento.append(tbl_sit_final)

        dados = [[
            "<b><br/>Diante do exposto acima a pré-matrícula se apresenta: ( ) DEFERIDA ( ) INDEFERIDA<br/><br/></b>"
        ]]
        tbl_dados = pdf.table(dados,
                              a=["c"],
                              w=[195],
                              grid=1,
                              zebra=0,
                              fontSize=7)
        documento.append(tbl_dados)

        dados = []
        dados.append([
            "<br/><br/>___________________________, _____/ _____/ _________<br/><br/>"
        ])
        dados.append(
            ["_______________________________________________________"])
        dados.append(["Coordenação de Controle Acadêmico"])
        tbl_dados = pdf.table(dados,
                              a=["c"],
                              w=[195],
                              grid=0,
                              zebra=0,
                              fontSize=7)
        documento.append(tbl_dados)

        return documento
예제 #4
0
    def _generate_file(self, campus=None):
        documento = []
        etapa = self.etapa

        # cabecalho
        image_path = os.path.join(settings.BASE_DIR, "templates", "publico",
                                  "img", "logo-ifba-new.jpg")
        image = pdf.Image(image_path,
                          width=49.6 * pdf.mm,
                          height=13.0 * pdf.mm)
        if campus:
            str_cabecalho = (
                f"<i>{etapa.edicao}</i><br/><i>{etapa.nome} - Campus {campus}</i><br/>"
            )
        else:
            str_cabecalho = f"<i>{etapa.edicao}</i><br/><i>{etapa.nome}</i><br/>"
        str_cabecalho += f"<b>{self.title}</b>"

        cabecalho = {
            "height":
            17,
            "story": [
                pdf.table(
                    rows=[[image, str_cabecalho]],
                    a=["c", "c"],
                    w=[50, 135],
                    grid=0,
                    fontSize=11,
                )
            ],
        }

        if campus:
            chamadas = etapa.chamadas.filter(curso__campus=campus)
        else:
            chamadas = etapa.chamadas
        order_by_params = [
            "curso__campus__nome",
            "curso__curso__nome",
            "curso__turno",
            "modalidade",
        ]
        curso_atual = ""
        primeira_pagina = True
        for chamada in chamadas.order_by(*order_by_params):
            if self.has_output(chamada):
                if curso_atual != chamada.curso:
                    if not primeira_pagina:
                        documento.append(pdf.page_break())
                    else:
                        primeira_pagina = False

                    curso_atual = chamada.curso
                    str_curso = (
                        f"<b>Curso:</b> {chamada.curso.nome} "
                        f"({chamada.curso.get_formacao_display()})"
                        f" - <b>Turno:</b> {chamada.curso.get_turno_display()}"
                    )
                    documento.append(pdf.para(str_curso, align="center"))
                    documento.append(pdf.space(5))

                lista_chamadas = [[f"<b>Modalidade:</b> {chamada.modalidade}"]]
                documento.append(
                    pdf.table(lista_chamadas, a=["l"], w=[170], fontSize=10))
                documento.append(self.get_table(chamada))
                documento.append(pdf.space(5))
            else:
                continue

        return pdf.PdfReport(body=documento,
                             header_args=cabecalho,
                             pages_count=0).generate()
예제 #5
0
    def _generate_file(self, campus=None):
        documento = []
        etapa = self.etapa

        # cabecalho
        image_path = os.path.join(settings.BASE_DIR, "templates", "publico",
                                  "img", "logo-ifba-new.jpg")
        image = pdf.Image(image_path,
                          width=49.6 * pdf.mm,
                          height=13.0 * pdf.mm)
        if campus:
            str_cabecalho = "<i>{}</i><br/><i>{} - Campus {}</i><br/>".format(
                etapa.edicao, etapa.nome, campus)
        else:
            str_cabecalho = f"<i>{etapa.edicao}</i><br/><i>{etapa.nome}</i><br/>"
        str_cabecalho += f"<br/><b>Resultado Final - {self.title}</b>"

        tbl_cabecalho = pdf.table(
            rows=[[image, str_cabecalho]],
            a=["c", "c"],
            w=[50, 135],
            grid=0,
            fontSize=12,
        )
        documento.append(tbl_cabecalho)
        documento.append(pdf.space(5))

        # Listagem de situacao documental
        documento.append(
            pdf.para(f"Obs. {self.ordering_msg}", style="Italic", size="8"))
        documento.append(pdf.space(1))

        order_by_params = [
            "curso__campus__nome",
            "curso__curso__nome",
            "curso__turno",
            "modalidade",
        ]
        if campus:
            chamadas = etapa.chamadas.filter(curso__campus=campus)
        else:
            chamadas = etapa.chamadas

        for chamada in chamadas.order_by(*order_by_params):
            if self.has_output(
                    chamada) or self.status == Status.DEFERIDO.value:
                modalidade = chamada.modalidade.nome
                if chamada.curso.is_tecnico:
                    modalidade = modalidade.replace("ensino médio",
                                                    "ensino fundamental")
                lista_chamadas = [[
                    f"<b>Curso:</b> {chamada.curso.nome} ({chamada.curso.get_formacao_display()})"
                    f" - <b>Turno:</b> {chamada.curso.get_turno_display()}<br/>"
                    f"<b>Modalidade:</b> {modalidade}"
                ]]
                documento.append(pdf.table(lista_chamadas, a=["l"], w=[188]))
                documento.append(self.get_table(chamada))
                documento.append(pdf.space(5))
            else:
                continue

        # rodapé
        str_rodape = (
            "________________________________________________________________________________________"
            "<br/>INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DA PARAÍBA - IFPB"
            "<br/>Campus {}"
            "<br/>Coordenação de Controle Acadêmico".format(campus
                                                            or etapa.campus))
        documento.append(pdf.para(str_rodape, align="center"))
        datahora = datetime.now()
        rodape = {
            "height":
            5,
            "story": [
                pdf.para(
                    "<b>Gerado em:</b> {} às {}".format(
                        datahora.strftime("%d/%m/%Y"),
                        datahora.strftime("%H:%M:%S")),
                    alignment="left",
                    size=8,
                )
            ],
        }

        return pdf.PdfReport(body=documento, footer_args=rodape,
                             pages_count=0).generate()
예제 #6
0
def imprimir_lista_analise_documental(etapa, queryset_chamadas, campus=None):
    """
    - Lista da situação documental dos candidatos da chamada - mostra a situação de todos os candidatos, inclusive os que
    nao entregaram a documentação
    - Divide por grupo na exibição da lista
    """

    documento = []

    # cabecalho
    image_path = os.path.join(settings.BASE_DIR, "templates", "publico", "img",
                              "logo-ifba-new.jpg")
    image = pdf.Image(image_path, width=49.6 * pdf.mm, height=13.0 * pdf.mm)
    if campus:
        str_cabecalho = "<i>{}</i><br/><i>{} - Campus {}</i><br/>".format(
            etapa.edicao, etapa.nome, campus)
    else:
        str_cabecalho = f"<i>{etapa.edicao}</i><br/><i>{etapa.nome}</i><br/>"
    str_cabecalho += (
        "<b>Lista de candidatos com status de acordo com a análise da documentação</b>"
    )
    tbl_cabechalho = pdf.table(rows=[[image, str_cabecalho]],
                               a=["c", "c"],
                               w=[50, 135],
                               grid=0,
                               fontSize=12)
    documento.append(tbl_cabechalho)
    documento.append(pdf.space(1))

    # Listagem de sitaucao documental
    documento.append(
        pdf.para(
            "<b>Atenção:</b> Verificar situação da documentação. Candidatos <b>indeferidos</b> têm direito a entrar com recurso <br/>"
            " Obs. Listagem em ordem alfabética por Curso e Modalidade e ordem de classificação por Candidatos.",
            style="Italic",
            size="8",
        ))
    documento.append(pdf.space(1))

    for c in queryset_chamadas:
        lista_chamadas = [[
            "<b>Curso:</b> {} <br/> <b>Modalidade:</b> {}".format(
                c.curso.nome, c.modalidade.nome)
        ]]
        tbl_chamadas = pdf.table(lista_chamadas,
                                 a=["l"],
                                 w=[188],
                                 grid=1,
                                 zebra=0,
                                 fontSize=8)
        documento.append(tbl_chamadas)

        lista_deferido = []
        lista_indeferido = []
        lista_nao_entregue = []

        qtd_deferido = qtd_indeferido = qtd_nao_entregue = 0

        inscricoes = c.inscricoes.all()

        for inscricao in inscricoes:
            analise = models.AnaliseDocumental.objects.filter(
                confirmacao_interesse__inscricao=inscricao).first()

            qtd_nao_entregue += 1
            if analise:
                if analise.situacao_final:
                    qtd_deferido += 1
                    texto = "DOCUMENTAÇÃO VÁLIDA"
                    lista_deferido.append([
                        str(qtd_deferido),
                        str(inscricao.candidato),
                        texto,
                        analise.observacao,
                    ])
                else:
                    qtd_indeferido += 1
                    texto = "DOCUMENTAÇÃO INVÁLIDA"
                    lista_indeferido.append([
                        str(qtd_indeferido),
                        str(inscricao.candidato),
                        texto,
                        analise.observacao,
                    ])
            else:
                texto = "DOCUMENTAÇÃO NÃO ENTREGUE"
                obs = "DOCUMENTAÇÃO NÃO ENTREGUE"
                lista_nao_entregue.append([
                    str(qtd_nao_entregue),
                    str(inscricao.candidato),
                    texto,
                    "DOCUMENTAÇÃO NÃO ENTREGUE",
                ])

        if not lista_deferido:
            tbl_listagem_deferido = pdf.table(
                [["<b>Nenhum candidato com documentação deferida</b>"]],
                a=["c"],
                w=[188],
                grid=1,
                zebra=1,
                fontSize=8,
            )
        else:
            tabela_lista = pdf.table(
                [["<b>Candidatos com documentação deferida</b>"]],
                a=["c"],
                w=[188],
                grid=1,
                zebra=1,
                fontSize=8,
            )
            documento.append(tabela_lista)

            tbl_listagem_deferido = pdf.table(
                lista_deferido,
                a=["c", "l", "c", "c"],
                w=[7, 70, 43, 68],
                grid=1,
                zebra=1,
                fontSize=8,
            )

        documento.append(tbl_listagem_deferido)
        documento.append(pdf.space(2))

        if not lista_indeferido:
            tbl_listagem_indeferido = pdf.table(
                [["<b>Nenhum candidato com documentação indeferida</b>"]],
                a=["c"],
                w=[188],
                grid=1,
                zebra=1,
                fontSize=8,
            )
        else:
            tabela_lista = pdf.table(
                [["<b>Candidatos com documentação indeferida</b>"]],
                a=["c"],
                w=[188],
                grid=1,
                zebra=0,
                fontSize=8,
                title_red=True,
            )
            documento.append(tabela_lista)

            tbl_listagem_indeferido = pdf.table(
                lista_indeferido,
                a=["c", "l", "c", "c"],
                w=[7, 70, 43, 68],
                grid=1,
                zebra=1,
                fontSize=8,
            )

        documento.append(tbl_listagem_indeferido)
        documento.append(pdf.space(2))

    dados_rodape = []
    str_rodape = (
        "________________________________________________________________________________________<br/><br/>"
        "INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DA PARAÍBA - IFPB<br/>"
        "Campus {}<br/>"
        "Coordenação de Controle Acadêmico".format(campus or etapa.campus))
    dados_rodape.append(
        [f"{str_rodape} - {datetime.now().strftime('%d/%m/%Y')}"])
    tbl_rodape = pdf.table(dados_rodape, a=["c"], w=[188], grid=0, fontSize=9)
    documento.append(tbl_rodape)

    return pdf.PdfReport(body=documento, pages_count=0).generate()
예제 #7
0
    def generate_file(self, campus):
        documento = []
        edital = self.fase.edital
        # cabecalho
        image_logo_path = os.path.join(settings.BASE_DIR, "templates",
                                       "publico", "img", "logo-ifba-new.jpg")
        image_logo = pdf.Image(image_logo_path,
                               width=49.6 * pdf.mm,
                               height=13.0 * pdf.mm)
        str_cabecalho = (
            "PROCESSO SELETIVO PARA CURSOS TÉCNICOS - EDITAL Nº {}/{}<br/>".
            format(edital.numero, edital.ano) + f"<b>{self.render.title}</b>")

        tbl_cabecalho = pdf.table(
            rows=[[image_logo, str_cabecalho]],
            a=["c", "c"],
            w=[40, 155],
            grid=0,
            fontSize=10,
        )
        documento.append(tbl_cabecalho)
        documento.append(pdf.space(10))

        campus_nome = f"<b>CAMPUS {campus.nome.upper()}</b>"
        documento.append(pdf.para(campus_nome, align="center"))

        documento.append(pdf.space(15))

        for curso in self.fase.edital.processo_inscricao.cursos.filter(
                campus=campus):

            curso_nome = "<b>CURSO {} - TURNO {}</b>".format(
                curso.curso.nome.upper(),
                curso.get_turno_display().upper())
            documento.append(pdf.para(curso_nome, align="center"))
            documento.append(pdf.space(5))

            for modalidade in inscricao_models.Modalidade.objects.all():

                if not self.render.has_output(curso, modalidade):
                    continue

                documento.append(pdf.para(f"<b>{modalidade}</b>"))
                documento.append(pdf.space(5))
                documento.append(self.render.get_table(curso, modalidade))
                documento.append(pdf.space(5))

            documento.append(pdf.space(15))

        # rodapé
        datahora = datetime.now()
        rodape = {
            "height":
            5,
            "story": [
                pdf.para(
                    "<b>Gerado em:</b> {} às {}".format(
                        datahora.strftime("%d/%m/%Y"),
                        datahora.strftime("%H:%M:%S")),
                    alignment="left",
                    size=8,
                )
            ],
        }

        return pdf.PdfReport(body=documento,
                             footer_args=rodape,
                             pages_count=1,
                             paper=self.render.paper()).generate()
예제 #8
0
def gerar_declaracao_renda(candidato, caracterizacao, cidade):
    # Definições
    nome_candidato = candidato.nome.upper()
    renda = pdf.moeda_real_display(caracterizacao.renda_bruta_familiar)
    cidade_e_data = f'{cidade}, {datetime.now().strftime("%d de %B de %Y")}.'
    NR_ATIVIDADES = 3
    NR_TESTEMUNHAS = 2

    documento = []

    documento.append(pdf.space(10))
    documento.append(
        pdf.para("DECLARAÇÃO DE RENDA FAMILIAR", style="h1", align="c"))
    documento.append(pdf.space(10))
    texto_0 = (
        "Eu, ___________________________________________________________, CPF nº _____________________, "
        f"declaro que a renda familiar do aluno(a) {nome_candidato} é de R$ {renda} mensais, referente "
        "aos ganhos obtidos no trabalho de nossa família, em atividades de "
        "____________________________________________________________________, conforme abaixo discriminadas:"
    )
    documento.append(pdf.para(texto_0))
    documento.append(pdf.space(5))

    for count in range(1, NR_ATIVIDADES + 1):
        atividade = (
            f"Atividade {count}: ____________________________________________________________ <br/>"
            "Endereço do trabalho: Rua________________________________________ Nº ______ <br/>"
            "Bairro: ___________________________ Município: ___________________________."
        )
        documento.append(pdf.para(atividade))
        documento.append(pdf.space(3))

    texto_1 = (
        "Declaro ainda que, o valor acima apresentado é verdadeiro e estou ciente de que a omissão de "
        "informações ou a apresentação de dados ou documentos falsos e/ou divergentes implicam no "
        "cancelamento da matrícula no IFPB.")
    documento.append(pdf.para(texto_1))
    texto_2 = (
        "As informações constantes nesta declaração são de minha responsabilidade e, caso sejam inverídicas, "
        "responderei em conformidade com a legislação vigente.")
    documento.append(pdf.para(texto_2))

    documento.append(pdf.space(10))
    documento.append(pdf.para(cidade_e_data, align="r"))
    documento.append(pdf.space(10))
    documento.append(
        pdf.para(
            "___________________________________________<br/>Assinatura do(a) Declarante",
            align="c",
        ))

    documento.append(pdf.space(10))
    documento.append(pdf.para("Testemunhas:"))
    documento.append(pdf.space(5))
    for count in range(NR_TESTEMUNHAS):
        documento.append(
            pdf.para(
                "Nome ________________________________________________ CPF Nº ____________________"
            ))
        documento.append(pdf.space(5))

    return documento
예제 #9
0
def imprimir_formulario_matricula(request, candidato_id, chamada_id):
    candidato = models_base.PessoaFisica.objects.get(id=candidato_id)
    caract = Caracterizacao.objects.get(candidato__id=candidato_id)
    chamada = Chamada.objects.select_related("curso", "etapa",
                                             "modalidade").get(id=chamada_id)
    curso = chamada.curso
    cidade = curso.campus.cidade
    nome_curso = f"{curso.get_formacao_display()} em {curso.curso.nome}"
    """
    Retorna o PdfReport referente ao parâmetro ****
    """
    documento = []

    solicitante = request.user

    # cabecalho
    image_path = os.path.join(settings.BASE_DIR, "templates", "publico", "img",
                              "logo-ifba-new.jpg")
    image = pdf.Image(image_path, width=49.6 * pdf.mm, height=13.0 * pdf.mm)
    str_cabecalho = (
        f"<b>Formulário de Pré-Matrícula</b><br/><i>Campus {curso.campus.nome}</i>"
    )
    foto = pdf.Rect(width=60, height=60, text="Fotografia")
    documento.append(
        pdf.table(
            rows=[[image, str_cabecalho, foto]],
            a=["c", "l", "r"],
            w=[70, 95, 25],
            grid=0,
            fontSize=12,
        ))
    documento.append(pdf.space(1))

    documento.append(
        pdf.table([["<b>INFORMAÇÕES SOBRE A VAGA</b>"]],
                  w=[190],
                  grid=1,
                  head=1,
                  fontSize=8))

    if chamada.modalidade.is_ampla_concorrencia():
        cotista = "NÃO"
    else:
        cotista = chamada.modalidade.resumo
    documento.append(
        pdf.table(
            [[
                f"<i>Curso:</i><br/><b>{nome_curso.upper()} ({curso.get_modalidade_display().upper()})</b>"
            ]],
            w=[190],
            grid=1,
            fontSize=8,
        ))
    dados_vaga = [[
        f"<i>Turno:</i><br/><b>{curso.get_turno_display().upper()}</b>",
        f"<i>Cotista:</i><br/><b>{cotista}</b>",
    ]]
    documento.append(
        pdf.table(dados_vaga, a=["l", "l"], w=[95, 95], grid=1, fontSize=8))

    documento.append(
        pdf.table([["<b>DADOS BÁSICOS</b>"]],
                  w=[190],
                  grid=1,
                  head=1,
                  fontSize=8))

    dados_row_1 = [[
        f"<i>Nome: </i><br/><b>{candidato.nome.upper()}</b>",
        f"<i>CPF: </i><br/><b>{candidato.cpf}</b>",
        f'<i>Data de Nasc.: </i><br/><b>{candidato.nascimento.strftime("%d/%m/%Y")}</b>',
        f"<i>Sexo: </i><br/><b>{candidato.sexo}</b>",
        f"<i>Tipo Sanguíneo: </i><br/><b>{candidato.get_tipo_sanguineo_display()}</b>",
    ]]
    documento.append(
        pdf.table(
            dados_row_1,
            a=["l", "l", "l", "l", "l"],
            w=[95, 25, 25, 15, 30],
            grid=1,
            fontSize=8,
        ))

    dados_row_2 = [[
        f"<i>Certidão Civil de <b>{candidato.get_certidao_tipo_display()}</b>: </i><br/>"
        f"<b>Nº {candidato.certidao}, FL {candidato.certidao_folha} do "
        f"livro {candidato.certidao_livro}</b>",
        f"<i>RG - Órgão Emissor/UF - Data de Emissão: </i><br/>"
        f"<b>{candidato.rg_completo}</b>",
    ]]
    documento.append(
        pdf.table(dados_row_2,
                  a=["l", "l"],
                  w=[95, 95],
                  grid=1,
                  zebra=0,
                  fontSize=8))

    dados_row_3 = [[
        f"<i>Título de Eleitor - Zona - Seção: </i><br/><b>{candidato.titulo_eleitor}</b>",
        f"<i>Nacionalidade: </i><br/><b>{candidato.nacionalidade.upper()}</b>",
        f"<i>Naturalidade/UF: </i><br/><b>{candidato.naturalidade_completa}</b>",
    ]]
    documento.append(
        pdf.table(dados_row_3,
                  a=["l", "l", "l"],
                  w=[95, 30, 65],
                  grid=1,
                  zebra=0,
                  fontSize=8))

    dados_pais = [[
        f'<i>Nome do Pai: </i><br/><b>{candidato.nome_pai or "Não Informado"}</b>',
        f'<i>Nome da Mãe: </i><br/><b>{candidato.nome_mae or "Não Informado"}</b>',
    ]]
    documento.append(
        pdf.table(dados_pais,
                  a=["l", "l"],
                  w=[95, 95],
                  grid=1,
                  zebra=0,
                  fontSize=8))

    dados_row_4, dados_row_4_align, dados_row_4_width = [], [], []
    if caract.possui_necessidade_especial:
        necessidades = caract.necessidade_especial.values_list("descricao",
                                                               flat=True)
        str_necessidades = utils.human_list(necessidades).upper()
        dados_row_4.append([
            f"<i>Etnia: </i><br/><b>{str(caract.raca).upper()}</b>",
            "<i>Pessoa com Deficiência - PcD: </i><br/><b>SIM</b>",
            f"<i>Descrição da Necessidade:</i><br/><b>{str_necessidades}</b>",
        ])
        dados_row_4_align, dados_row_4_width = ["l", "l", "l"], [50, 45, 95]
    else:
        dados_row_4.append([
            f"<i>Etnia: </i><br/><b>{str(caract.raca).upper()}</b>",
            "<i>Pessoa com Deficiência - PcD: </i><br/><b>NÃO</b>",
        ])
        dados_row_4_align, dados_row_4_width = ["l", "l"], [50, 140]
    documento.append(
        pdf.table(
            dados_row_4,
            a=dados_row_4_align,
            w=dados_row_4_width,
            grid=1,
            zebra=0,
            fontSize=8,
        ))

    dados_row_5 = [[
        f'<i>Tel. Resid.: </i><br/><b>{candidato.telefone or "-"}</b>',
        f'<i>Celular: </i><br/><b>{candidato.telefone2 or "-"}</b>',
        f"<i>E-mail: </i><br/><b>{candidato.email.lower()}</b>",
    ]]
    documento.append(
        pdf.table(dados_row_5,
                  a=["l", "l", "l"],
                  w=[50, 45, 95],
                  grid=1,
                  zebra=0,
                  fontSize=8))

    dados_row_6 = [[
        f"<i>Endereço: </i><br/><b>{candidato.logradouro.upper()}</b>",
        f"<i>Número: </i><br/><b>{candidato.numero_endereco.upper()}</b>",
        f'<i>Complemento: </i><br/><b>{candidato.complemento_endereco or "-"}</b>',
    ]]
    documento.append(
        pdf.table(dados_row_6,
                  a=["l", "l", "l"],
                  w=[95, 25, 70],
                  grid=1,
                  fontSize=8))

    dados_row_7 = [[
        f"<i>Bairro: </i><br/><b>{candidato.bairro.upper()}</b>",
        f"<i>CEP: </i><br/><b>{candidato.cep}</b>",
        f"<i>Cidade: </i><br/><b>{candidato.municipio.upper()}</b>",
        f"<i>UF: </i><br/><b>{candidato.uf}</b><br/>",
    ]]
    documento.append(
        pdf.table(
            dados_row_7,
            a=["l", "l", "l", "l"],
            w=[75, 20, 80, 15],
            grid=1,
            zebra=2,
            fontSize=8,
        ))

    documento.append(
        pdf.table([["<b>DADOS SOCIOECONÔMICOS</b>"]],
                  w=[190],
                  grid=1,
                  head=1,
                  fontSize=8))

    dados_row_8 = [[
        f"<i>Estado Civil: </i><br/><b>{caract.estado_civil}</b>",
        f"<i>Companhia domiciliar: </i><br/><b>{caract.companhia_domiciliar}</b>",
        f"<i>Nº de Membros da Família: </i><br/><b>{caract.qtd_pessoas_domicilio}</b>",
        f"<i>Renda Bruta Familiar: </i><br/><b>R$ {pdf.moeda_real_display(caract.renda_bruta_familiar)}</b>",
        f"<i>Renda Per Capita: </i><br/><b>R$ {pdf.moeda_real_display(caract.renda_per_capita)}</b>",
    ]]
    documento.append(
        pdf.table(
            dados_row_8,
            a=["l", "l", "l", "l", "l"],
            w=[30, 50, 45, 35, 30],
            grid=1,
            zebra=0,
            fontSize=8,
        ))

    dados_row_9 = [[
        f"<i>Est. Civil do Pai: </i><br/><b>{caract.estado_civil_pai}</b>",
        f"<i>Pai falecido: </i><br/><b>{pdf.human_str(caract.pai_falecido)}</b>",
        f"<i>Est. Civil da Mãe: </i><br/><b>{caract.estado_civil_mae}</b>",
        f"<i>Mãe falecida: </i><br/><b>{pdf.human_str(caract.mae_falecida)}</b>",
        f"<i>Grau de Escolaridade: </i><br/><b>{caract.escolaridade}</b>",
    ]]
    documento.append(
        pdf.table(
            dados_row_9,
            a=["l", "l", "l", "l", "l"],
            w=[30, 20, 30, 25, 85],
            grid=1,
            zebra=0,
            fontSize=8,
        ))

    if not curso.is_tecnico_integrado and caract.nome_escola_ensino_medio:
        escola_instit = caract.nome_escola_ensino_medio
        escola_ano = caract.ensino_medio_conclusao
        escola_tipo = caract.escola_ensino_medio
        escola_localizacao = caract.tipo_area_escola_ensino_medio
    elif caract.nome_escola_ensino_fundamental:
        escola_instit = caract.nome_escola_ensino_fundamental
        escola_ano = caract.ensino_fundamental_conclusao
        escola_tipo = caract.escola_ensino_fundamental
        escola_localizacao = caract.tipo_area_escola_ensino_fundamental
    else:
        escola_instit = "Não Informado"
        escola_ano = "Não Informado"
        escola_tipo = "Não Informado"

    dados_row_10 = [[
        f"<i>Instituição Educacional de Origem: </i><br/><b>{escola_instit}</b>",
        f"<i>Ano de Conclusão: </i><br/><b>{escola_ano}</b>",
        f"<i>Tipo de Escola: </i><br/><b>{escola_tipo} - {escola_localizacao}</b>",
    ]]
    documento.append(
        pdf.table(
            dados_row_10,
            a=["l", "l", "l"],
            w=[100, 30, 60],
            grid=1,
            zebra=0,
            fontSize=8,
        ))
    documento.append(pdf.space(2))

    observacao = [[
        "<b>OBSERVAÇÃO:</b><br/>"
        "<i>O aluno, neste ato, fica ciente que, deverá manter atualizados seu endereço, telefones,"
        " e-mails e demais dados cadastrais, junto a esta Instituição de Ensino, sendo de sua"
        " responsabilidade os prejuízos decorrentes da não atualização destas informações.</i>"
    ]]
    documento.append(
        pdf.table(observacao, a=["l"], w=[190], grid=1, zebra=0, fontSize=8))

    declaracao = [[
        f"<b>DECLARAÇÃO: </b><br/>"
        f"<i>1. DECLARO, para fins de direito, não possuir existência de vínculo na condição de"
        f" estudante em outra Instituição de Ensino Superior Pública, conforme determina a Lei "
        f" nº 12.089, de 11 de novembro de 2009.</i><br/>"
        f"<i>2. DECLARO, para fins de direito, sob as penas da lei, que as informações e os "
        f" documentos que apresento para pré-matrícula no IFPB, relativa ao ano letivo de "
        f" {chamada.etapa.edicao.ano}, são fiéis à verdade e condizentes com a realidade dos "
        f" fatos. Fico ciente, portanto, que a falsidade desta declaração configura-se em crime "
        f" previsto no Código Penal Brasileiro e passível de apuração na forma da Lei.</i>"
    ]]
    documento.append(
        pdf.table(declaracao, a=["l"], w=[190], grid=1, zebra=0, fontSize=8))
    documento.append(pdf.space(7))

    assinatura = []
    assinatura.append([
        "_________________________________________<br/>Assinatura do(a) Responsável<br/>",
        "_________________________________________<br/>Assinatura do(a) Candidato(a)",
    ])
    assinatura.append([
        f"CPF:________________________ Tel.: (____) _________________<br/>"
        f"Responsável pelo(a) aluno(a) <b>(se menor de idade ou por procuração)</b>",
        f'<br/>{cidade}, {datetime.now().strftime("%d/%m/%Y")}',
    ])
    documento.append(
        pdf.table(assinatura,
                  a=["c", "c"],
                  w=[105, 85],
                  grid=0,
                  zebra=0,
                  fontSize=8))
    documento.append(pdf.space(1))

    # rodapé
    documento.append(
        pdf.para(
            "----------------------------------------------------------------------------------------"
            "------------------------------------------------------------------",
            alignment="center",
        ))
    dados_rodape = []
    edicao = chamada.etapa.edicao
    str_rodape = (
        f"<font size=12><b>Comprovante de Pré-Matrícula - "
        f"<i>Campus {curso.campus.nome}</i></b></font>"
        f"<br/><br/><i>Curso: </i><b>{nome_curso} - {curso.get_turno_display()}</b><br/>"
        f"<i>Aluno(a): </i><b>{candidato.nome.upper()}</b><br/>"
        f"<i>Ano/Período Letivo: </i><b>{edicao.ano}.{edicao.semestre}</b>")
    image_path_rodape = os.path.join(settings.BASE_DIR, "templates", "publico",
                                     "img", "logo-ifpb-vertical.png")
    image_rodape = pdf.Image(image_path_rodape,
                             width=18.1 * pdf.mm,
                             height=22.0 * pdf.mm)
    dados_rodape.append([
        image_rodape,
        str_rodape,
        f"<br/><br/>_________________________<br/>"
        f"Funcionário(a)<br/>"
        f'{cidade}, {datetime.now().strftime("%d/%m/%Y")}',
    ])
    documento.append(
        pdf.table(dados_rodape,
                  a=["c", "l", "c"],
                  w=[25, 115, 50],
                  grid=0,
                  fontSize=9))

    if chamada.modalidade.is_cota_renda():
        documento.append(pdf.page_break())
        documento.extend(gerar_declaracao_renda(candidato, caract, cidade))

    if chamada.modalidade.is_cota_racial():
        documento.append(pdf.page_break())
        documento.extend(gerar_declaracao_ppi(candidato, cidade))

    return pdf.PdfReport(body=documento, pages_count=0).generate()