コード例 #1
0
def gera(ses, bt_ver, bt_fechar):
    sessao_id = sessao.obtem_identificador(ses)
    # Pega/monta atributos a mostrar:
    sessao_usuario = sessao.obtem_atributo(ses, 'usr')
    sessao_aberta = sessao.obtem_atributo(ses, 'abrt')
    sessao_cookie = sessao.obtem_atributo(ses, 'cookie')
    sessao_carrinho = sessao.obtem_atributo(ses, 'carrinho')
    sessao_data = sessao.obtem_atributo(ses, 'criacao')

    # Formata informações em HTML:
    ht_sessao_id = formata_texto(sessao_id)
    ht_codigo_usuario = formata_texto(
        usuario.obtem_identificador(sessao_usuario))
    ht_estado = formata_texto(sessao_esta_aberta(sessao_aberta))
    ht_cookie = formata_texto(sessao_cookie)
    ht_data = formata_texto(sessao_data)
    if sessao_carrinho == None:
        tx_carrinho = ""
    else:
        tx_carrinho = compra.obtem_identificador(sessao_carrinho)
    ht_carrinho = formata_texto(tx_carrinho)

    ht_campos = [
        ht_sessao_id, ht_codigo_usuario, ht_estado, ht_cookie, ht_carrinho,
        ht_data
    ]

    args_bt = {'id_sessao': sessao_id}  # Argumentos para os botões.
    cor_bt_admin = '#FFA700'  # Cor para botões de adminstrador.

    # O comando para tratar a url "ver_detalhes_sessao" ainda não existe, e deverá ser implementado
    # no futuro.
    if bt_ver:
        ht_bt_fechar = html_botao_simples.gera("Ver", 'ver_sessao', args_bt,
                                               cor_bt_admin)
        ht_campos.append(ht_bt_fechar)

    if bt_fechar and sessao_aberta:
        ht_bt_fechar = html_botao_simples.gera("Fechar", 'fechar_sessao',
                                               args_bt, cor_bt_admin)
        ht_campos.append(ht_bt_fechar)

    if sessao_carrinho != None:
        tx_carrinho = compra.obtem_identificador(sessao_carrinho)
        if tx_carrinho[-1] == "1":
            ht_bt_fechar = html_label.gera("Sessão Atual", None)
            ht_campos.append(ht_bt_fechar)

    return ht_campos
コード例 #2
0
def cria_testes(verb):
    global cache, nome_tb, letra_tb, colunas, diags
    inicializa(True)
    # Identificador de usuários e lista de poltronas de cada pedido de compra:
    lista_cupsf = \
      [
        ( "C-00000001", "U-00000001", "Amanda Almeida",  "45.246.235-2",   True, ),
        ( "C-00000002", "U-00000001", "Basílio Barros",  "234.764.987-23", True, ),
        ( "C-00000003", "U-00000002", "Carlos Costa",    "76.863.987-5",   True, ),
        ( "C-00000004", "U-00000002", "Diego Dias",      "654.987.098-09", False,),
        ( "C-00000005", "U-00000002", "Romario Silva",   "122.787.038-05", False,),
        ( "C-00000006", "U-00000001", "Fabio Santos",    "555.957.058-05", True, ),
        ( "C-00000007", "U-00000001", "Renato Augusto",  "111.227.338-03", False,),
        ( "C-00000008", "U-00000001", "Carlos Tevez",    "666.967.698-06", True, ),
        ( "C-00000009", "U-00000002", "André Santos",    "554.181.018-01", False,),
        ( "C-00000010", "U-00000002", "Victor Cantillo", "444.955.085-08", True, ),
      ]
    for id_cpr_esp, id_cliente, nome_pass, doc_pass, comprando in lista_cupsf:
        cliente = usuario.busca_por_identificador(id_cliente)

        cpr = cria(cliente, nome_pass, doc_pass)
        assert cpr != None and type(cpr) is compra.Objeto_Compra
        id_cpr = compra.obtem_identificador(cpr)
        if not comprando: compra.fecha(cpr)

        # Paranóia:
        assert id_cpr == id_cpr_esp
        cliente_1 = compra.obtem_cliente(cpr)
        id_cliente_1 = usuario.obtem_identificador(cliente_1)
        assert id_cliente_1 == id_cliente

        if verb:
            sys.stderr.write("compra %s de %s criada\n" % (id_cpr, id_cliente))
    return
コード例 #3
0
def gera(ses, cpr, erros):
  id_compra = compra.obtem_identificador(cpr);
  ht_form = html_form_escolher_pagamento.gera(cpr)
  ht_cancelar = html_botao_simples.gera("Cancelar", "principal", None, "#ffff00")
  ht_conteudo = html_form.gera(ht_form + " " + ht_cancelar)
  pag = html_pag_generica.gera(ses, ht_conteudo, erros)
  return pag
コード例 #4
0
def busca_por_compra(cpr):
  global cache, nome_tb, letra_tb, colunas, diags
  assert cpr != None and type(cpr) is compra.Objeto_Compra
  id_cpr = compra.obtem_identificador(cpr)
  unico = False
  ids_poltronas = objeto.busca_por_campo('id_compra', id_cpr, unico, cache, nome_tb, letra_tb, colunas)
  return ids_poltronas
def gera(ses):
    id_ses = sessao.obtem_identificador(ses)
    usr = sessao.obtem_usuario(ses)
    admin = usuario.obtem_atributo(usr, 'administrador')
    id_usr = usuario.obtem_identificador(usr)
    carr = sessao.obtem_carrinho(ses)
    id_cpr = compra.obtem_identificador(carr)
    abrt = sessao.aberta(ses)
    data_login = sessao.obtem_data_de_criacao(ses)

    atrs = {
        'id_ses': id_ses,
        'data_login': data_login,
        'id_usr': id_usr,
        'id_cpr': id_cpr,
        'abrt': "Sim" if abrt else "Não",
    }

    # Dados para {html_form_table.gera}
    # {(rotulo,tipo,chave,dica,visivel,editavel,obrigatorio)}
    dados_linhas = \
      (
        ( "ID sessão",        "text", "id_ses",     None,  True, False, False, ),
        ( "Criada em",        "text", "data_login", None,  True, False, False, ),
        ( "ID usuário",       "text", "id_usr",     None,  True, False, False, ),
        ( "ID carrinho",      "text", "id_cpr",     None,  True, False, False, ),
        ( "Status da sessão", "text", "abrt",       None,  True, admin, False, ),
      )

    ht_table = html_form_table.gera(dados_linhas, atrs)

    return ht_table
コード例 #6
0
def gera(cpr, ver, id_carrinho):

    id_cpr = compra.obtem_identificador(cpr)
    usr = compra.obtem_cliente(cpr)
    id_usr = usuario.obtem_identificador(usr)
    atrs_compra = compra.obtem_atributos(cpr)
    preco_tot = compra.calcula_preco(cpr)
    nome_pass = atrs_compra['nome_pass']
    doc_pass = atrs_compra['doc_pass']

    ids_poltronas = poltrona.busca_por_compra(cpr)
    num_poltronas = len(ids_poltronas)

    icone_carrinho = "<b>&#128722;</b>" if id_cpr == id_carrinho else ""

    # !!! Definir um estilo decente para os campos? Ou definir fora do {html_table}? !!!
    ht_carrinho = icone_carrinho
    ht_cpr = id_cpr
    ht_usr = id_usr
    ht_num_poltronas = str(num_poltronas)
    ht_preco_tot = str(preco_tot)
    ht_nome_pass = nome_pass
    ht_doc_pass = doc_pass

    campos = [
        ht_carrinho, ht_cpr, ht_usr, ht_num_poltronas, ht_nome_pass,
        ht_doc_pass, ht_preco_tot
    ]

    if ver:
        ht_ver = html_botao_simples.gera("Ver", "ver_compra",
                                         {'id_compra': id_cpr}, "#22ff22")
        campos.append(ht_ver)

    return campos
def gera(ids_poltronas, usr, carr):

    id_trc = None  # Identificador do trecho comum, ou None.

    admin = False if usr == None else usuario.obtem_atributo(
        usr, 'administrador')
    fazer_checkin = admin  # Por enquanto.
    embarcar = admin  #Por enquanto

    if admin or usr == None:
        assert carr == None  # Administrador e não-logado não tem carrinho.
    id_carr = None if carr == None else compra.obtem_identificador(carr)

    # Gera a linha de os cabeçalhos das colunas
    linha_cab = html_resumo_de_poltrona_de_trecho.gera_cabecalho(fazer_checkin)
    assert type(linha_cab) is list or type(linha_cab) is tuple  # Paranóia.

    # Gera as linhas da tabela.
    linhas = [].copy()
    for id_poltrona in ids_poltronas:
        pol = poltrona.busca_por_identificador(id_poltrona)

        # Obtem dados da poltrona:
        assert pol != None
        id_trc_pol = poltrona.obtem_atributo(pol, 'id_trecho')
        id_cpr_pol = poltrona.obtem_atributo(pol, 'id_compra')
        cpr_pol = None if id_cpr_pol == None else compra.busca_por_identificador(
            id_cpr_pol)
        usr_pol = None if cpr_pol == None else compra.obtem_cliente(cpr_pol)

        # Verifica se o trecho é o mesmo para todas as poltronas:
        if id_trc != None: assert id_trc_pol == id_trc
        id_trc = id_trc_pol

        # Decide que botões vai ter:
        alterar = admin
        comprar = (carr != None) and poltrona.pode_comprar(usr, pol, carr)
        excluir = (cpr_pol != None) and (usr_pol
                                         == usr) and poltrona.pode_excluir(
                                             usr, pol)

        # Gera os campos da linha:
        linha = html_resumo_de_poltrona_de_trecho.gera(pol, alterar, comprar,
                                                       excluir, fazer_checkin,
                                                       embarcar)
        assert type(linha) is list or type(linha) is tuple  # Paranóia.
        linhas.append(linha)

    ht_tabela = html_table.gera(linhas, linha_cab)
    ht_legenda = html_resumo_de_poltrona_de_trecho.gera_legenda(fazer_checkin)
    ht_res = ht_tabela + ht_legenda
    return ht_res
コード例 #8
0
def processa(ses, args):
    if ses == None or not sessao.aberta(ses):
        return html_pag_mensagem_de_erro.gera(ses,
                                              "Sessão deveria estar aberta")

    try:
        carrinho = sessao.obtem_carrinho(ses)
        id_carrinho = compra.obtem_identificador(
            carrinho) if carrinho != None else None
        if not sessao.eh_administrador(ses):
            # Usuário comum só pode buscar as próprias compras:
            usr = sessao.obtem_usuario(ses)  # Dono da sessao.
            usr_id = usuario.obtem_identificador(usr)
            if not (args['cliente'] == None or args['cliente'] == usr_id):
                raise ErroAtrib("Você não tem acesso a essa informação")
            args['cliente'] = usr_id

        # Se recebeu parâmetro genérico "passageiro", converte ele para "doc_pass" ou
        # "nome_pass"
        if 'passageiro' in args:
            matchList = re.findall(
                "([0-9]{2}[\.]?[0-9]{3}[\.]?[0-9]{3}[\/]?[0-9]{4}[-]?[0-9]{2})|([0-9]{3}[\.]?[0-9]{3}[\.]?[0-9]{3}[-]?[0-9]{2})",
                args['passageiro'])

            # É um documento
            if len(matchList) > 0:
                args['doc_pass'] = args['passageiro']
            # É um nome
            else:
                args['nome_pass'] = args['passageiro']

            del args['passageiro']

        campos = ['cliente', 'status', 'nome_pass', 'doc_pass']
        verifica_campos(args, campos)

        cprs_ids = compra.busca_por_campos(args)
        cprs = map(lambda id_compra: compra.busca_por_identificador(id_compra),
                   cprs_ids)
        ver = True if sessao.eh_administrador(
            ses) or args['cliente'] == sessao.obtem_usuario(ses) else False
        bloco = html_lista_de_compras.gera(cprs, ver, id_carrinho)
        pag = html_pag_generica.gera(ses, bloco, None)
        return pag

    except ErroAtrib as ex:
        erros = ex.args[0]
        # Repete a página com mensagem de erro:
        pag = html_pag_buscar_compras.gera(ses, args,
                                           sessao.eh_administrador(ses), erros)
        return pag
コード例 #9
0
def processa(ses, args):
  
  # Obtem usuário e carrinho de compras:
  assert ses != None # Comando não deveria ser acessível a usuário não logado. 
  usr_ses = sessao.obtem_usuario(ses)
  assert usr_ses != None # Paranóia.

  admin = usuario.obtem_atributo(usr_ses, 'administrador')
  assert not admin # Admnistrador não deveria ter acesso a este cmd.
  
  #Obtem a poltrona a comprar:
  id_pol = args['id_poltrona'] if 'id_poltrona' in args else None
  assert id_pol != None #  Paranóia (formulário ou botão deve fornecer)
  pol = poltrona.busca_por_identificador(id_pol)
  assert pol != None # Paranóia.

  # Obtém carrinho do usuário:
  carr = sessao.obtem_carrinho(ses)
  assert carr != None # Todo cliente comum deve ter carrinho.
  id_carr = compra.obtem_identificador(carr)

  try:
    if not poltrona.pode_comprar(usr, pol, carr):
      # Não deveria acontecer, mas em todo caso:
      raise ErroAtrib("Esta poltrona não está disponível") 
    
    # Muda a poltrona para comprada
    poltrona.muda_atributos(pol, { 'id_compra': id_carr })

    # Mostra o carrinho do usuário com a poltrona comprada:
    pag = html_pag_compra.gera(ses, cpr, excluir, None)
  except ErroAtrib as ex:
    erros = ex.args[0]
    # Se o trecho da poltrona estiver disponível, mostra o trecho para outra compra:
    id_trc = poltrona.obtem_atributo(pol, 'id_trecho')
    assert id_trc != None # Paranoia.
    trc = trecho.busca_por_identificador(id_trc)
    assert trc != None # Paranoia.
    if trecho.verificar_disponibilidade(trc) and trecho_eh_compativel(cpr, trc):
      # Usuário pode comprar outra poltrona deste trecho:
      pag = html_pag_trecho.gera(ses, trc, None, erros)
    else:
      # Usuário não pode comprar nenuma poltrona neste trecho.
      # Volte para a página principal.
      # !!! Deveria buscar e mostrar roteiros de mesma origem e destino !!!
      pag = html_pag_principal.gera(ses, erros)
  return pag
def processa(ses, args):
    assert ses != None
    pag = html_pag_mensagem_de_erro.gera(ses, "sessão corrente")
    assert sessao.aberta(ses)
    usr = sessao.obtem_usuario(ses)
    assert usr != None
    id_usr = usuario.obtem_identificador(usr)
    ids_compras = compra.busca_por_cliente(id_usr)
    ver_compra = True  # Queremos botão "Ver" em cada compra.

    carrinho = sessao.obtem_carrinho(ses)
    assert not (
        (carrinho != None) and sessao.eh_administrador(ses))  # Paranóia.
    id_carrinho = compra.obtem_identificador(
        carrinho) if carrinho != None else None

    ht_conteudo = html_lista_de_compras.gera(ids_compras, ver_compra,
                                             id_carrinho)
    pag = html_pag_generica.gera(ses, ht_conteudo, None)
    return pag
def gera(cpr):
    id_compra = compra.obtem_identificador(cpr)
    ht_titulo = html_label.gera("Selecione o método de pagamento", ": ")
    ht_opcoes = \
      html_botao_radio.gera("metodo", "paypau",   "PayPau")      + "<br/>" + \
      html_botao_radio.gera("metodo", "mrcard",   "MonsterCard") + "<br/>" + \
      html_botao_radio.gera("metodo", "boleto",   "Boleto")      + "<br/>" + \
      html_botao_radio.gera("metodo", "deposito", "Depósito")    + "<br/>" + \
      html_botao_radio.gera("metodo", "bois",     "Bois gordos") + "<br/>" + \
      html_botao_radio.gera("metodo", "balas",    "Balinhas")

    ht_submit = html_botao_submit.gera("Alterar", "alterar_pagamento",
                                       {'id_compra': id_compra}, '#55ee55')

    ht_campos = \
      ht_titulo + "<br/>" + \
      "" + "<br/>" + \
      ht_opcoes + "<br/>" + \
      "" + "<br/>" + \
      ht_submit
    return html_form.gera(ht_campos)
def processa(ses, args):
  assert ses != None

  pag = html_pag_mensagem_de_erro.gera(ses, "sessão corrente")
  assert sessao.aberta(ses)

  usr_ses = sessao.obtem_usuario(ses)
  assert usr_ses != None
  id_usr_ses = usuario.obtem_identificador(usr_ses)

  admin = sessao.eh_administrador(ses)

  # Usuário a examinar:
  if 'id' in args:
    id_usr = args['id']
    usr = usuario.busca_por_identificador(id_usr)
  else:
    usr = usr_ses
    id_usr = id_usr_ses
    
  if (id_usr != id_usr_ses) and not admin:
    pag = html_pag_mensagem_de_erro.gera(ses, ["Apenas administradores podem ver sessões por este comando"])
    return pag

  # Compra a identificar como "Seu carrinho":
  if id_usr == id_usr_ses:
    carrinho = sessao.obtem_carrinho(ses)
    id_carrinho = compra.obtem_identificador(carrinho) if carrinho != None else None
  else:
    carrinho = None  # Usuário pode ter várias sessões, não vale a pena marcar carrinho(s).
    id_carrinho = None

  ids_compras = compra.busca_por_cliente(id_usr)
  ver_compra = True  # Queremos botão "Ver" em cada compra.
  ht_conteudo = html_lista_de_compras.gera(ids_compras, ver_compra, id_carrinho)
  pag = html_pag_generica.gera(ses, ht_conteudo, None)
  return pag
コード例 #13
0
    pretty = False  # Se {True}, formata HTML para legibilidate (mas introduz brancos nos textos).
    utils_testes.testa_gera_html(modulo, funcao, rotulo, frag, pretty, *args)

testes = ( \
  ( "U-00000001", "T-00000001", ), # Cliente comum.
( "U-00000001", "T-00000002", ), # Cliente comum.
( "U-00000003", "T-00000003"  ), # Admin.
( "U-00000003", "T-00000004", ), # Admin.
( None,         "T-00000005", ), # Usuario deslogado.

          )
for usr_id, trc_id in testes:
    usr = None if usr_id == None else usuario.busca_por_identificador(usr_id)
    admin = False if usr == None else usuario.obtem_atributo(
        usr, 'administrador')
    usr_cprs = [] if usr == None else usuario.compras_abertas(usr)
    carr = None if len(usr_cprs) == 0 else usr_cprs[
        0]  # Faz de conta que a primeira compra é o carrinho.
    id_carr = None if carr == None else compra.obtem_identificador(carr)

    trc = None if trc_id == None else trecho.busca_por_identificador(trc_id)
    assert trc != None
    ids_pols = trecho.obtem_poltronas(trc)

    fazer_checkin = admin  #por enquanto

    rot = trc_id + "-" + str(usr_id) + "-" + str(id_carr)
    rot += "-admin" + str(admin)[0]
    rot += "-fzck" + str(fazer_checkin)[0]
    testa(rot, ids_pols, usr, carr)
コード例 #14
0
def gera(ses, cpr, atrs, erros):

    # Validação dos parâmetros:
    assert ses != None  # Paranóia (cliente deslogado não deve poder ver compra nenhuma).
    assert sessao.aberta(ses)  # Paranóia.
    usr_ses = sessao.obtem_usuario(ses)
    assert usr_ses != None  # Paranóia.
    admin = usuario.obtem_atributo(usr_ses, 'administrador')
    carr = None if admin or ses == None else sessao.obtem_carrinho(ses)

    if atrs == None: atrs = {}.copy()  # Por via das dúvidas.

    # Botões de acão:
    ht_submit = ""
    ht_bt_def_carr = ""
    ht_bt_cancel = ""
    args_bt = {'id_compra': id_cpr}

    if cpr == None:
        # Nova compra:
        assert not admin  # Paranóia (administrador não deve poder criar novas compras).
        id_cpr = None
        novo = True
        titulo = "Nova compra"
    else:
        assert type(cpr) is compra.Objeto_Compra
        usr_cpr = compra.obtem_cliente(cpr)
        assert usr_cpr != None  # Paranóia.
        assert admin or (
            usr_ses == usr_cpr
        )  # Paranóia (cliente comum só pode ver compras suas).

        id_cpr = compra.obtem_identificador(cpr)
        assert id_cpr != None  # Paranóia.

        # Título da página:
        if admin:
            titulo = f"Compra {id_compra}"
        elif cpr == carr:
            titulo = "Seu carrinho de compras"
        else:
            titulo = f"Sua compra {id_compra}"
            ht_bt_def_carr = html_botao_simples.gera("Definir como carrinho",
                                                     "definir_carrinho",
                                                     args_bt, "#44ff00")

        # Completa {atrs} com atributos de {cpr}:
        atrs_cpr = compra.obtem_atributos(cpr)
        assert atrs_cpr != None  # Paranóia
        for ch, val in atrs_cpr.items():
            if not ch in atrs: atrs[ch] = val

        # Botoes de ação:
        # O submit é "Alterar":
        ht_submit += html_botao_submit.gera("Alterar", "alterar_compra", None,
                                            "#ff0000")
        if not admin and (compra.obtem_status(cpr) == 'comprando'):
            # Tem botão submit de "Finalizar compra" que aplica alterações:
            ht_submit += html_botao_submit.gera("Finalizar",
                                                "finalizar_compra", None,
                                                "#55ff00")
            ht_bt_cancel = html_botao_simples.gera("Continuar comprando",
                                                   'principal', None,
                                                   "#ff2200")
        else:
            ht_bt_cancel = html_botao_simples.gera("Voltar", 'principal', None,
                                                   "#ff2200")

    ht_titulo = "<h2>" + titulo + "</h2>"

    # Constrói formulário com dados da compra:
    ht_dados_da_compra = html_form_dados_de_compra.gera(
        id_cpr, atrs, admin, ht_submit)

    # Constrói a lista de poltronas da compra:
    if novo:
        ht_dados_das_poltronas = ""
    else:
        ids_pols = poltrona.busca_por_compra(cpr)

        if len(ids_pols) == 0:
            # Não há poltronas a mostrar.
            estilo_aviso = "color:red;font-size:20;"
            ht_dados_das_poltronas = "<br/>" + html_span.gera(
                estilo_aviso, "Não há poltronas disponíveis")
        else:
            ht_dados_das_poltronas = html_lista_de_poltronas_de_compra.gera(
                ids_pols, usr_ses, carr)

        # Verifica tempos de baldeação:
        poltronas_invalidas = compra.verificar_baldeacao(cpr)
        if erros is None: erros = [].copy()
        for id_poltrona in poltronas_invalidas:
            erros.append(f'Poltrona sem tempo para baldeação: {id_poltrona}')

    ht_conteudo = \
      ht_titulo + "\n" + \
      ht_dados_da_compra + "<br/>\n" + \
      ht_bt_def_carr + "\n" + \
      ht_bt_cancel + "<br/>\n" + \
      ht_dados_das_poltronas

    pag = html_pag_generica.gera(ses, ht_conteudo, erros)
    return pag
コード例 #15
0
def gera(cpr, editavel, texto_bt, comando_bt):

    # Obtem atributos a mostrar:

    valores = {}.copy()
    id_cpr = compra.obtem_identificador(cpr)
    atrs_cpr = compra.obtem_atributos(cpr)

    # Atributos da compra em si
    valores['id_cpr'] = id_cpr
    valores['status'] = atrs_cpr['status']
    valores['nome_pass'] = atrs_cpr['nome_pass']
    valores['doc_pass'] = atrs_cpr['doc_pass']
    valores['preco_tot'] = ("%.2f" % compra.calcula_preco(cpr))
    # valores['pagamento'] = atrs_cpr['pagamento']

    # Cliente que está montando ou montou a compra:
    usr = compra.obtem_cliente(cpr)
    valores['id_usr'] = usuario.obtem_identificador(usr)
    atrs_usr = usuario.obtem_atributos(usr)
    valores['nome_usr'] = atrs_usr['nome']

    # Bilhetes da compra:
    ids_pols = compra.obtem_poltronas(cpr)
    num_trechos = len(ids_pols)
    valores['n_trechos'] = str(num_trechos)

    if (num_trechos >= 1):
        # Obtém origem, data, e hora de partida do primeiro trecho:
        pol_ini = poltrona.busca_por_identificador(ids_pols[0])
        id_trc_ini = poltrona.obtem_atributo(pol_ini, 'id_trecho')
        trc_ini = trecho.busca_por_identificador(id_trc_ini)
        origem = trecho.obtem_atributo(trc_ini, 'origem')
        dh_partida = trecho.obtem_dia_e_hora_de_partida(trc_ini)
        valores['partida'] = origem + " " + dh_partida

        # Obtém destino, data, e hora de chegada do último trecho:
        pol_fin = poltrona.busca_por_identificador(ids_pols[-1])
        id_trc_fin = poltrona.obtem_atributo(pol_fin, 'id_trecho')
        trc_fin = trecho.busca_por_identificador(id_trc_fin)
        destino = trecho.obtem_atributo(trc_fin, 'destino')
        dh_chegada = trecho.obtem_dia_e_hora_de_chegada(trc_fin)
        valores['chegada'] = destino + " " + dh_chegada

    # Linhas para {html_table.gera}:
    linhas = (
        html_cpr_campo("Compra", 'id_cpr', valores, 'text', None, False),
        html_cpr_campo("Cliente", 'id_usr', valores, 'text', None, False),
        html_cpr_campo("Nome do cliente", 'nome_usr', valores, 'text', None,
                       False),
        html_cpr_campo("Nome do passageiro", 'nome_pass', valores, 'text',
                       "Fulano da Silva", editavel),
        html_cpr_campo("Documento do passageiro", 'doc_pass', valores, 'text',
                       "123.456.789-10", editavel),
        html_cpr_campo("Número de trechos", 'n_trechos', valores, 'text', None,
                       False),
        html_cpr_campo("Preço total", 'preco_tot', valores, 'text', None,
                       False),
        html_cpr_campo("Estado", 'status', valores, 'text', None, False),
        html_cpr_campo("Partida", 'partida', valores, 'text', None, False),
        html_cpr_campo("Chegada", 'chegada', valores, 'text', None, False),
    )
    ht_campos = html_table.gera(linhas, ["", ""])

    # Botões:
    if editavel:
        args_submit = {
            'id_compra': id_cpr
        }  # Argumentos adicionais para submissão.
        ht_submit = html_botao_submit.gera(texto_bt, comando_bt, args_submit,
                                           "#44ff44")
        ht_campos += "<br/>" + ht_submit

    return html_form.gera(ht_campos)