AA
TText não é exibido
Estou criando um formulário que terá alguns subformulários. Todos os campos TTexto não estão aparecendo. Alguma dica?
O código é longo:
O código é longo:
- <?php
- <?php
- /**
- * Este arquivo é parte do DPS - Departamento de Pessoal do Sistema PCES
- * A ideia aqui é que a evolução seja chamada por um botão no prontuário abrindo uma página modal
- */
- use Adianti\Control\TPage;
- use Adianti\Core\AdiantiCoreApplication;
- use Adianti\Database\TTransaction;
- use Adianti\Widget\Form\TForm;
- use Adianti\Widget\Form\TEntry;
- use Adianti\Widget\Dialog\TMessage;
- use Adianti\Widget\Dialog\TQuestion;
- use Adianti\Widget\Dialog\TToast;
- use Adianti\Widget\Form\TCombo;
- use Adianti\Widget\Form\THidden;
- use Adianti\Widget\Form\THtmlEditor;
- use Adianti\Widget\Wrapper\TDBUniqueSearch;
- use Adianti\Control\TAction;
- use Adianti\Widget\Form\TLabel;
- use Adianti\Widget\Form\TText;
- class FormProntuarioEncontrado extends TPage
- {
- private $form;
- private $datagrid; // listing
- private $pageNavigation;
- private $formAnexo;
- private $formLaudo;
- private $nome_pessoa;
- private $formgrid;
- private $paginaAtual;
- private $grid_anexo;
- use Adianti\Base\AdiantiStandardFormTrait; // Standard form methods
- use Adianti\base\AdiantiStandardListTrait;
- use Adianti\Base\Meutrait; // Trait com métodos auxiliares
- public function __construct($param = null)
- {
- parent::__construct();
- $this->setDatabase('dps'); // define o banco de dados
- $this->setActiveRecord('Prontuario'); // define o registro ativo
- $this->addFilterField('id', '=', 'id'); // filterField, operator, formField
- // cria o formulário de identificação $this->form
- $this->form = new BootstrapFormBuilder('form_prontuario_encontrado');
- $this->form->generateAria(); // automatic aria-label
- $this->form->setFieldSizes('100%');
- $this->form->setProperty('style', 'margin:0;border:0;margin-bottom:30px;');
- $this->form->setClientValidation(true);
- $achou = false; // variável para verificar se o prontuário já existe
- $tamanho_btn = "width: 120px; color: black";
- $prontuario = null; // Inicializa $prontuario como null para evitar warnings posteriores
- $id_prontuario = null;
- $id_pessoa_atual = null;
- // Verifica que página foi chamada
- if (isset($param['current_tab']) && $param['current_tab'] !== '') {
- TSession::setValue('pagina_atual', $param['current_tab']);
- }
- $this->paginaAtual = TSession::getValue('pagina_atual') ?? 2;
- $this->form->setCurrentPage($this->paginaAtual); // Define a página atual do formulário
- if (isset($param['key']) && $param['key']) {
- $id = $param['key'];
- TTransaction::open('dps'); // Abre a transação para acessar o banco de dados
- $prontuario = Prontuario::find($id); // Busca o prontuário pelo ID
- if ($prontuario) { // Verifica se o prontuário foi encontrado
- $achou = true;
- $id_prontuario = $prontuario->id;
- $id_pessoa_atual = $prontuario->id_pessoa;
- }
- TTransaction::close(); // Fecha a transação
- }
- if (isset($param['id_prontuario']) && $param['id_prontuario']) {
- $id_prontuario = $param['id_prontuario'];
- }
- // Criando campos
- $id = new THidden('id');
- $id_pessoa = new THidden('id_pessoa'); // campo oculto para o ID da pessoa
- $pessoa = new TEntry('pessoa');
- TTransaction::open('permission'); // Abre a transação para acessar o banco de dados
- if ($achou && $prontuario) { // Garante que $prontuario não é null aqui
- // Procura o nome da pessoa pelo id_pessoa na tabela Pessoa
- $this->nome_pessoa = $this->RetornaNome($prontuario->id);
- $id->setValue($prontuario->id); // Define o ID do prontuário no campo oculto
- $id_pessoa->setValue($prontuario->id_pessoa); // Define o ID da pessoa no campo oculto
- }
- //Cria uma div para exibir alguns dados da pessoa
- $div_pessoa = new TElement('div');
- $div_pessoa->setProperty('id', 'div_pessoa');
- $div_pessoa->setProperty('class', 'row'); // Define a classe CSS para a div
- $div_pessoa->style = 'margin-bottom: -20px;'; // Define o estilo de margem para a div
- if (isset($id_pessoa_atual) && $id_pessoa_atual) {
- $cfg_pessoa = 'background-color: #CCCCCC; color: #4d4d4dff; padding: 5px; border-radius: 6px;';
- $pessoa_obj = Pessoa::find($id_pessoa_atual); // Busca a pessoa pelo ID
- if ($pessoa_obj) { // Verifica se a pessoa_obj foi encontrada
- $genero = $pessoa_obj->sexo ?: 'Não Informado'; // Verifica se o gênero está definido
- $div_pessoa->add("<div class='col-sm-2'><div><strong>Gênero:</strong><br></div> <div style='{$cfg_pessoa}'>{$genero}</div> </div> ");
- $num_funcional = $pessoa_obj->numero_funcional ?: ' '; // Verifica se o número funcional está definido
- $div_pessoa->add("<div class='col-sm-2'><div><strong>Número Funcional:</strong><br></div> <div style='{$cfg_pessoa}'>{$num_funcional}</div> </div> ");
- // Acessa o método get_estado_civil() e verifica se o objeto retornado é válido antes de acessar a descrição
- $estado_civil_obj = $pessoa_obj->get_estado_civil();
- $estado_civil = $estado_civil_obj ? $estado_civil_obj->descricao : 'Não Informado';
- $div_pessoa->add("<div class='col-sm-2'><div><strong>Estado Civil:</strong><br></div> <div style='{$cfg_pessoa}'>{$estado_civil}</div> </div> ");
- // Acessa o método get_grau_instrucao() e verifica se o objeto retornado é válido antes de acessar a descrição
- $grau_instrucao_obj = $pessoa_obj->get_grau_instrucao();
- $grau_instrucao = $grau_instrucao_obj ? $grau_instrucao_obj->descricao : 'Não Informado';
- $div_pessoa->add("<div class='col-sm-4'><div><strong>Grau de Instrução:</strong><br></div> <div style='{$cfg_pessoa}'>{$grau_instrucao}</div> </div> ");
- //Converte a data de nascimento para o formato desejado
- if ($pessoa_obj->data_nascimento) {
- $data_nascimento = new DateTime($pessoa_obj->data_nascimento);
- $div_pessoa->add("<div class='col-sm-2'><div><strong>Data Nascimento:</strong><br></div> <div style='{$cfg_pessoa}'>" . $data_nascimento->format('d/m/Y') . "</div> </div> ");
- } else {
- $div_pessoa->add("<div class='col-sm-2'><div><strong>Data Nascimento:</strong><br></div> <div style='{$cfg_pessoa}'>Não Informada</div> </div> ");
- }
- } else {
- $div_pessoa->add("<div class='col-sm-12'><div style='color: red;'>Dados da Pessoa não encontrados.</div></div>");
- }
- }
- TTransaction::close(); // Fecha a transação
- $id_situacao = new TDBUniqueSearch('id_situacao', 'dps', 'Situacao', 'id', 'descricao');
- $id_situacao->setMinLength(0); // Define o tamanho mínimo de caracteres para pesquisa
- $id_situacao->setChangeAction(new TAction(array($this, 'onChangeSituacao'), ['static' => '1']));
- $outra_situacao = new TEntry('outra_situacao');
- $id_funcao = new TDBUniqueSearch('id_funcao', 'dps', 'Funcao', 'id', 'descricao');
- $id_funcao->setMinLength(0); // Define o tamanho mínimo de caracteres para pesquisa
- $id_chefia = new TDBUniqueSearch('id_chefia', 'permission', 'Pessoa', 'id', 'nome');
- $id_chefia->setMinLength(0); // Define o tamanho mínimo de caracteres para pesquisa
- $id_setor = new TDBUniqueSearch('id_setor', 'permission', 'Setor', 'id', 'nome');
- $id_setor->setMinLength(0); // Define o tamanho mínimo de caracteres para pesquisa
- $id_plano_saude = new TDBUniqueSearch('id_plano_saude', 'dps', 'PlanosSaude', 'id', 'nome');
- $id_plano_saude->setMinLength(0); // Define o tamanho mínimo de caracteres para pesquisa
- $exercicio = new TEntry('exercicio'); // Corrigido para 'exercicio' minúsculo para consistência
- $anamnese = new THtmlEditor('anamnese');
- $anamnese->setSize('100%', 500); // Define o tamanho do campo de anamnese
- $obs = new THtmlEditor('obs');
- $obs->setSize('100%', 200); // Define o tamanho do campo de observações
- // Definindo os placeholders
- $id_situacao->placeholder = 'Selecione uma situação';
- $outra_situacao->placeholder = 'Descreva outra situação';
- $id_funcao->placeholder = 'Selecione uma função';
- $id_chefia->placeholder = 'Selecione nome da chefia';
- $id_setor->placeholder = 'Selecione um setor';
- $id_plano_saude->placeholder = 'Selecione um plano de saúde';
- $espaco = 'margin-top: 20px;'; // define o tamanho do campo de exercício
- // insira os campos no formulário
- $this->form->appendPage('FICHA DE IDENTIFICAÇÃO'); // cria uma nova página no formulário
- //Possibilita controlar a aba corrente mantendo após salvar
- $div_outra_situacao = new TElement('div');
- $div_outra_situacao->setProperty('id', 'div_outra_situacao');
- $div_outra_situacao->add("<span>Outra Situação:</span><br>");
- $div_outra_situacao->add($outra_situacao);
- $this->form->setFields([$outra_situacao]); // Adiciona o campo ao formulário
- $div_outra_situacao->style = 'display: none;'; // Esconde o campo de outra situação inicialmente
- // Lê os dados do prontuário se já existir
- //Busca os dados da pessoa
- $this->form->addFields([$div_pessoa]); // Adiciona a div ao formulário
- $row = $this->form->addFields(['Função', $id_funcao], ['Situação', $id_situacao], [$div_outra_situacao]);
- $row->layout = ['col-sm-3', 'col-sm-2', 'col-sm-5']; // define o layout da linha
- $row = $this->form->addFields(['Chefia', $id_chefia], ['Setor', $id_setor], ['Plano de Saúde', $id_plano_saude], ['Exercício', $exercicio]);
- $row->layout = ['col-sm-4', 'col-sm-4', 'col-sm-2', 'col-sm-2']; // define o layout da linha
- $row->style = $espaco; // aplica o estilo de espaçamento
- $row = $this->form->addFields(['Observações', $obs]);
- $row->style = "$espaco width: 60%; margin-left: 20%;"; // aplica o estilo de espaçamento
- $this->form->appendPage('ANAMNESE'); // cria uma nova página no formulário
- $row = $this->form->addFields([$anamnese]);
- $this->form->addFields([$id, $id_pessoa]); // campo oculto para o ID do prontuário
- $this->form->addFields([new THidden('current_tab')]); //Cria um campo invisível para armazenar a aba corrente
- $this->form->setTabFunction("$('[name=current_tab]').val($(this).attr('data-current_page'));"); //Captura o valor da aba corrente
- $this->form->appendPage('PRONTUÁRIO E ANEXOS'); // cria uma nova página no formulário
- //Aqui teremos um subformulário para anexos e um datagrid para exibir os anexos já existentes
- $this->formAnexo = new BootstrapFormBuilder('subform_anexos');
- $id_anexo = new THidden('id_anexo'); // campo oculto para o ID do anexo
- $descricao_anexo = new TEntry('descricao');
- $descricao_anexo->setMaxLength(100);
- $descricao_anexo->setProperty('placeholder', 'Descrição do documento');
- $descricao_anexo->setTip('Informe uma breve descrição do documento');
- $obs_anexo = new TText('obs_anexo');
- $id_prontuario_anexo = new THidden('id_prontuario_anexo');
- $id_prontuario_anexo->setValue($id_prontuario);
- $dados_arquivo = new TFile('dados_arquivo');
- $dados_arquivo->setLabel('Anexar Documento');
- $dados_arquivo->setAllowedExtensions(['pdf', 'jpg', 'png', 'svg', 'gif'], 'Somente arquivos PDF, JPG, PNG, SVG e GIF são permitidos.');
- $enviar_arquivo = new TButton('enviar_arquivo');
- $enviar_arquivo->setLabel('Enviar');
- $enviar_arquivo->setAction(new TAction([$this, 'onEnviarArquivo'], ['id_prontuario' => $id_prontuario]), '');
- $enviar_arquivo->class = 'btn btn-sm btn-primary';
- $enviar_arquivo->style = 'width: 33px; margin-top: 2.55vh;'; // Define o estilo do botão
- $enviar_arquivo->title = 'Enviar arquivo';
- $enviar_arquivo->setImage('fa:upload');
- $enviar_arquivo->setProperty('id', 'btn_enviar_arquivo'); // Define o ID do botão para uso em JavaScript
- //Insere os campos no subformulário
- $this->formAnexo->addFields([$id_anexo], [$id_prontuario_anexo]);
- //Primeira linha do subformulário
- $div_descricao = $this->addCampo(new TLabel('Descrição do Documento:'), $descricao_anexo, '100%');
- $div_arquivo = $this->addCampo(new TLabel('Escolha o arquivo:'), $dados_arquivo, '100%');
- $row = $this->formAnexo->addFields([$div_descricao], [$div_arquivo], [$enviar_arquivo]); // Campo de observações do anexo
- $row->layout = ['col-sm-6', 'col-sm-5', 'col-sm-1']; // define o layout da linha
- //Cria datagrid com os anexos já existentes na tabela anexo
- // Preenche dataGrid com os anexos já existentes para o id_prontuario
- // Cria a grid para exibir os anexos
- $this->grid_anexo = new BootstrapDatagridWrapper(new TDataGrid);
- $this->grid_anexo->setId('datagrid_anexos');
- $this->grid_anexo->style = 'width: 100%';
- $this->grid_anexo->setHeight(250); // Define a altura da grid
- $this->grid_anexo->makeScrollable();
- $col_descricao = new TDataGridColumn('descricao', 'Descrição', 'left', '40%');
- $col_data = new TDataGridColumn('data_upload', 'Data/hora', 'center', '20%');
- $col_nome_arquivo = new TDataGridColumn('nome_arquivo', 'Nome do Arquivo', 'left', '40%');
- $col_data->setTransformer(function ($value, $object, $row) {
- if ($value) {
- $data = new DateTime($value);
- return $data->format('d/m/Y - H:i:s');
- }
- return '';
- });
- $this->grid_anexo->addColumn($col_descricao);
- $this->grid_anexo->addColumn($col_nome_arquivo);
- $this->grid_anexo->addColumn($col_data);
- $this->grid_anexo->addAction(new TDataGridAction([$this, 'onDownloadAnexo'], ['id' => '{id}', 'id_prontuario' => $id_prontuario]), 'Visualizar/baixar', 'fa:file-image green');
- $this->grid_anexo->addAction(new TDataGridAction([$this, 'onDeleteAnexo'], ['id' => '{id}', 'id_prontuario' => $id_prontuario]), 'Excluir', 'fa:trash red');
- $this->grid_anexo->createModel(); // Cria o modelo da grid
- $panel = new TPanelGroup('ANEXOS');
- $panel->add($this->grid_anexo);
- $panel->style = 'width: 95%; margin: auto;';
- $pesquisa = new TEntry('pesquisa');
- $pesquisa->setProperty('placeholder', 'Pesquisar...');
- $pesquisa->style = 'width: 300px; margin-right: 4px;';
- $pesquisa->setTip('Pesquisar anexos por parte da descrição ou parte do nome do arquivo');
- $pesquisa->setProperty('onkeypress', 'if(event.keyCode == 13) { document.getElementById("btn_find").click(); return false; }'); // Ação ao pressionar Enter
- $btnf = new TButton('find');
- $btnf->setAction(new TAction([$this, 'onCarrega'], ['id_prontuario' => $id_prontuario]), '');
- $btnf->style = 'height: 37px; margin-right:4px;';
- $btnf->setImage('fa:search');
- $btnf->setProperty('title', 'Pesquisar pela descrição ou nome do arquivo');
- $btnf->setProperty('id', 'btn_find'); // Define o ID do botão para uso em JavaScript
- $this->form->setFields([$pesquisa, $btnf]);
- $div_formgrid = new TElement('div');
- $div_formgrid->setProperty('id', 'div_formgrid');
- $div_formgrid->style = 'width: 100%; display: flex; justify-content: space-between; align-items: center;';
- $div_pesquisa = new TElement('div');
- $div_pesquisa->setProperty('id', 'div_pesquisa');
- $div_pesquisa->style = 'width: 80%; align-items: center;';
- $div_pesquisa->add($pesquisa);
- $div_btn = new TElement('div');
- $div_btn->setProperty('id', 'div_btn');
- $div_btn->style = 'width: 20%; display: flex; justify-content: flex-end;';
- $div_btn->add($btnf);
- $div_formgrid->add($div_pesquisa);
- $div_formgrid->add($div_btn);
- $panel->addHeaderWidget($div_formgrid); // Adiciona o painel de pesquisa ao cabeçalho do painel de anexos
- $pesquisa->setProperty('id', 'inp_pesquisa');
- $descricao_anexo->setProperty('id', 'inp_desc_anexo');
- $dados_arquivo->setProperty('id', 'inp_arquivo');
- $obs_anexo->setProperty('id', 'inp_obs_anexo');
- $this->formAnexo->addContent([$panel]);
- //Insere subform no formulário principal
- $this->form->addContent([$this->formAnexo]);
- $this->formAnexo->setFields([$descricao_anexo], [$dados_arquivo]);
- //Cria aba para emissão e controle de laudos
- $this->form->appendPage('CONTROLE DE LAUDOS');
- //Aqui teremos um subformulário para laudos e um datagrid para exibir os laudos já existentes
- $this->formLaudo = new BootstrapFormBuilder('subform_laudos');
- $id_laudo = new THidden('id_laudo'); // campo oculto para o ID do laudo
- $descricao_laudo = new TEntry('descricao');
- $descricao_laudo->setSize('100%');
- $descricao_laudo->setProperty('placeholder', 'Descrição do laudo');
- $descricao_laudo->setTip('Informe uma breve descrição do laudo');
- $obs_laudo = new TText('obs_laudo');
- $obs_laudo->setProperty('placeholder', 'Observações sobre o laudo');
- $obs_laudo->setTip('Informe observações adicionais sobre o laudo');
- $obs_laudo->setSize('100%', 100); // Define o tamanho do campo de observações do laudo
-
- $id_prontuario_laudo = new THidden('id_prontuario_laudo');
- $id_prontuario_laudo->setValue($id_prontuario);
- //Insere os campos no subformulário
- $this->formLaudo->addFields([$id_laudo], [$id_prontuario_laudo]);
- $this->formLaudo->addFields(['Descrição do laudo', $descricao_laudo]);
- $this->formLaudo->addFields(['Observações', $obs_laudo]); // <-- LINHA CORRIGIDA
- $this->form->addContent([$this->formLaudo]);
- // Define o método de ação do formulário principal
- $btn = $this->form->addAction('Salvar', new TAction([$this, 'onSalvaProntuario'], ['id_prontuario' => $id_prontuario]), 'fa:save');
- $btn->class = 'btn btn-sm btn-primary';
- $btn->style = $tamanho_btn;
- $btn = $this->form->addAction('Evoluções', new TAction(['ListaEvolucao', 'onEdit'], ['id_prontuario' => $id_prontuario]), 'fa:rectangle-list');
- $btn->class = 'btn btn-sm btn-info';
- $btn->style = $tamanho_btn;
- // Passa o id_prontuario para o botão "Evoluir" de forma segura
- $btn_novo = $this->form->addAction("<i class='fa-solid fa-plus'></i><span> Evoluir</span>", new TAction(['FormEvolucao', 'onEdit'], ['register_state' => 'false', 'id_prontuario' => $id_prontuario]), '');
- $btn_novo->class = 'btn btn-sm btn-success';
- $btn_novo->style = $tamanho_btn;
- // wrap the page content using vertical box
- $vbox = new TVBox;
- $vbox->style = 'width: 70%; margin: auto;';
- $vbox->add($this->form);
- TScript::create(<<<'JS'
- (function(){
- function isEnter(e){ return (e.key === 'Enter' || e.keyCode === 13); }
- // Evita submit “global” e decide para onde mandar
- $(document).on('keydown', 'input, textarea, select', function(e){
- if(!isEnter(e)) return;
- var name = this.getAttribute('name') || '';
- var formEl = $(this).closest('form');
- var handled = false;
- // 1) Se estiver no campo de PESQUISA dos anexos
- if (name === 'pesquisa') {
- $('#btn_find').trigger('click');
- handled = true;
- }
- // 2) Se estiver em campos do SUBFORM de anexos -> Enviar arquivo
- var camposSub = ['descricao','dados_arquivo','obs_anexo'];
- if (!handled && camposSub.indexOf(name) !== -1) {
- $('#btn_enviar_arquivo').trigger('click');
- handled = true;
- }
- // 3) Caso contrário: Salvar formulário principal
- if (!handled) {
- $('#btn_salvar').trigger('click');
- handled = true;
- }
- if (handled){
- e.preventDefault();
- e.stopPropagation();
- return false;
- }
- });
- // Bônus: no input de pesquisa, ENTER não deve submeter o form principal
- $(document).on('keydown', '#inp_pesquisa', function(e){
- if (e.key === 'Enter'){ e.preventDefault(); }
- });
- })();
- JS);
- // Finaliza a criação do formulário
- parent::add($vbox);
- }
- public function onSearchEvolucao($param)
- {
- try {
- // Acessar os campos do subformulário diretamente de $param.
- $data_subform = (object) $param;
- //Carrega o formulário principal com os dados do prontuário através do ID da pessoa usando loadPage
- if (isset($data_subform->id_prontuario) && $data_subform->id_prontuario) {
- TApplication::loadPage('FormProntuarioEncontrado', 'onEdit', ['id' => $data_subform->id_prontuario, 'key' => $data_subform->id_prontuario, 'current_tab' => 1, 'register_state' => 'false']);
- } else {
- throw new Exception('ID da pessoa não encontrado no subformulário. Certifique-se de que o prontuário principal foi salvo ou carregado.');
- }
- // Muda para a página do subformulário de evolução
- // Verifica se o ID do prontuário está definido
- if (isset($data_subform->id_prontuario) && $data_subform->id_prontuario) {
- // Redireciona para a página de pesquisa de evolução
- // TApplication::loadPage('ListaEvolucao', 'onSearch', ['id_prontuario' => $data_subform->id_prontuario]);
- // Para demonstração, vamos apenas exibir uma mensagem com o ID do prontuário.
- // new TMessage('info', 'Pesquisando evoluções para o prontuário ID: ' . $data_subform->id_prontuario); // Comentado para não exibir em produção
- if (isset($this->formAnexo)) { // Verifica se $this->formAnexo está inicializado
- $this->formAnexo->setData($data_subform); // Mantém os dados do subformulário no formulário principal
- }
- } else {
- new TMessage('warning', 'ID do prontuário não encontrado no subformulário. Certifique-se de que o prontuário principal foi salvo ou carregado.');
- }
- } catch (Exception $e) {
- new TMessage('error', $e->getMessage());
- }
- }
- // Adicione esta nova função para limpar o subformulário de evolução
- public function onClearSubformEvolucao($param)
- {
- // Cria um objeto vazio para limpar os campos
- $clear_data = new StdClass();
- $clear_data->id_evolucao = null;
- $clear_data->data_atendimento = null;
- $clear_data->id_tipo_atendimento = null;
- $clear_data->evolucao = null;
- $clear_data->id_profissional = null;
- $clear_data->id_motivo = null;
- // Mantém o id_prontuario se ele já estiver definido
- if (isset($param['id_prontuario'])) {
- $clear_data->id_prontuario = $param['id_prontuario'];
- } else {
- // Se o id_prontuario não estiver nos parâmetros, tenta obter do formulário principal
- $mainFormData = $this->form->getData();
- if (isset($mainFormData->id)) {
- $clear_data->id_prontuario = $mainFormData->id;
- }
- }
- if (isset($this->formAnexo)) { // Verifica se $this->formAnexo está inicializado
- $this->formAnexo->setData($clear_data);
- }
- TToast::show('info', 'Subformulário de evolução limpo.');
- }
- public function onSalvaProntuario($param)
- {
- try {
- $data = array_merge($param); // Combina os dados do formulário com os parâmetros recebidos
- TTransaction::open('dps');
- $object = new Prontuario;
- $object->id_pessoa = $param['id_pessoa'] ?? null; // Obtém o ID da pessoa do parâmetro ou do formulário
- $object->id = $param['id'] ?? null; // Obtém o ID do prontuário do parâmetro ou do formulário
- $object->id_situacao = $param['id_situacao'] ?? null; // Obtém o ID da situação do parâmetro ou do formulário
- $object->outra_situacao = $param['outra_situacao'] ?? null; // Obtém a outra situação do parâmetro ou do formulário
- $object->id_funcao = $param['id_funcao'] ?? null; // Obtém o ID da função do parâmetro ou do formulário
- $object->id_chefia = $param['id_chefia'] ?? null; // Obtém o ID da chefia do parâmetro ou do formulário
- $object->id_setor = $param['id_setor'] ?? null; // Obtém o ID do setor do parâmetro ou do formulário
- $object->id_plano_saude = $param['id_plano_saude'] ?? null; // Obtém o ID do plano de saúde do parâmetro ou do formulário
- $object->exercicio = $param['exercicio'] ?? null; // Obtém o exercício do parâmetro ou do formulário
- $object->anamnese = $param['anamnese'] ?? null; // Obtém a anamnese do parâmetro ou do formulário
- $object->obs = $param['obs'] ?? null; // Obtém as observações do parâmetro ou do formulário
- $object->store();
- TTransaction::close();
- $object->key = $object->id; // Define a chave do objeto para o ID do prontuário salvo
- // Atualiza o formulário com os dados salvos
- $this->onCarrega(['id_prontuario' => $param['id']]); // Recarrega os dados do prontuário
- $this->onCarregaOutraSituacao($param['id_situacao'] ?? null); // Chama o método para carregar outra situação
- TToast::show('success', 'Prontuário salvo com sucesso!');
- } catch (Exception $e) {
- TTransaction::rollback();
- new TMessage('error', $e->getMessage());
- }
- }
- public function onChangeSituacao($param)
- {
- $data = $this->form->getData(); // lê os dados do formulário
- $this->onCarregaOutraSituacao($param['id_situacao']);
- // Mantém os dados do formulário
- TForm::sendData('form_prontuario_encontrado', $data, false, false);
- }
- public function onCarregaOutraSituacao($id_situacao)
- {
- try {
- // Se id_situacao for igual a 4, exibe o campo de outra situação
- if ($id_situacao == '4') {
- TScript::create("
- document.getElementById('div_outra_situacao').style.display = 'inline-block';
- document.getElementById('div_outra_situacao').style.width = '100%';
-
- ");
- } else {
- TScript::create("
- document.getElementById('div_outra_situacao').style.display = 'none';
- ");
- }
- } catch (Exception $e) // in case of exception
- {
- // shows the exception error message
- new TMessage('error', $e->getMessage());
- // undo all pending operations
- TTransaction::rollback();
- }
- }
- public function onCarrega($param)
- {
- try {
- if (empty($this->database)) {
- throw new Exception(AdiantiCoreTranslator::translate('^1 was not defined. You must call ^2 in ^3', AdiantiCoreTranslator::translate('Database'), 'setDatabase()', AdiantiCoreTranslator::translate('Constructor')));
- }
- if (empty($this->activeRecord)) {
- throw new Exception(AdiantiCoreTranslator::translate('^1 was not defined. You must call ^2 in ^3', 'Active Record', 'setActiveRecord()', AdiantiCoreTranslator::translate('Constructor')));
- }
- if (isset($param['id_prontuario'])) {
- // get the parameter $id_prontuario
- $param['key'] = $param['id_prontuario'];
- }
- // open a transaction with database
- TTransaction::open($this->database);
- $class = $this->activeRecord;
- // instantiates object
- $object = new $class($param['key']); // Cria uma nova instância do objeto com o ID fornecido
- if ($object) { // Verifica se o objeto Prontuario foi encontrado
- // fill the form with the active record data
- $this->form->setFormTitle("<span style='font-size: 1.5em; text-transform: uppercase;'><strong>PRONTUÁRIO DE {$this->RetornaNome($object->id)}</strong></span>");
- if (isset($param['key'])) {
- // get the parameter $key
- $key = $param['key'];
- // pegue o current_tab atual do request ou do form/sessão
- $tabAtual = $param['current_tab'] ?? 0;
- // garanta que o objeto enviado ao front tem o campo
- $object->current_tab = $tabAtual;
- // IMPORTANTE: use os dois últimos parâmetros para não disparar eventos e manter os campos
- TForm::sendData('form_prontuario_encontrado', $object, false, true);
- // $this->form->setData($object);
- // close the transaction
- $this->onCarregaOutraSituacao($object->id_situacao); // Chama o método para carregar arma com o ID do objeto
- } else {
- new TMessage('warning', 'Prontuário não encontrado para o ID fornecido.');
- $this->form->clear(true);
- }
- //fecha a transação
- TTransaction::close(); // Fecha a transação
- // Carrega os anexos do prontuário
- $this->grid_anexo->clear();
- $parametros = [];
- $parametros['id_prontuario'] = $key; // Define o ID do prontuário para filtrar os anexos
- $parametros['pesquisa'] = $param['pesquisa'] ?? ''; // Obtém o termo de pesquisa, se fornecido
- $parametros['current_tab'] = $tabAtual;
- $this->onRecarregaAnexos($parametros); // Chama o método para recarregar os anexos do prontuário
- // Mantem a aba corrente após carregar os dados
- if (isset($param['current_tab']) && $param['current_tab'] !== '') {
- $this->form->setCurrentPage($param['current_tab']); // Muda para a página do prontuário
- } else {
- $this->form->setCurrentPage(0); // Muda para a primeira página se current_tab não estiver definido
- }
- TTransaction::close(); // Fecha a transação
- return $object;
- } else {
- $this->form->clear(true);
- }
- } catch (Exception $e) // in case of exception
- {
- // shows the exception error message
- new TMessage('error', $e->getMessage());
- // undo all pending operations
- TTransaction::rollback();
- }
- }
- public function onEnviarArquivo($param)
- {
- try {
- $arquivo_temporario = '';
- $id = null;
- $id_prontuario = $param['id_prontuario'] ?? null;
- if (empty($param['descricao'])) {
- throw new Exception('Descrição do arquivo não informada.');
- }
- if (empty($param['dados_arquivo'])) {
- throw new Exception('Arquivo não informado.');
- }
- // Determina o tipo MIME com base na extensão do arquivo
- $extensao = pathinfo($param['dados_arquivo'], PATHINFO_EXTENSION);
- $tipos_permitidos = [
- 'pdf' => 'application/pdf',
- 'jpg' => 'image/jpeg',
- 'jpeg' => 'image/jpeg',
- 'png' => 'image/png',
- 'svg' => 'image/svg+xml',
- 'gif' => 'image/gif'
- ];
- $param['tipo_mime'] = $tipos_permitidos[strtolower($extensao)] ?? null;
- if ($param['tipo_mime'] === null) {
- throw new Exception('Tipo de arquivo não informado.');
- }
- if (!array_key_exists(strtolower($extensao), $tipos_permitidos)) {
- throw new Exception('Tipo de arquivo não permitido. Apenas PDF, JPG, PNG, SVG e GIF são aceitos.');
- }
- $arquivo_temporario = 'tmp/' . $param['dados_arquivo']; // Obtém o caminho do arquivo temporário
- if (!file_exists($arquivo_temporario)) {
- throw new Exception('Arquivo temporário não encontrado.');
- }
- $binary_content = file_get_contents($arquivo_temporario);
- TTransaction::open('dps'); // abre transação
- $conn = TTransaction::get(); // pega conexão PDO
- $conid = TTransaction::get(); // pega o nome do banco de dados
- $id = null;
- $id = $conid->query('SELECT MAX(id) AS max_id FROM dps.tb_anexos')->fetch(PDO::FETCH_ASSOC);
- $sql = 'INSERT INTO dps.tb_anexos
- (id, id_prontuario, descricao, obs, tipo_mime, dados_arquivo, data_upload, nome_arquivo, id_system_users)
- VALUES (:id, :id_prontuario, :descricao, :obs, :tipo_mime, :dados_arquivo, :data_upload, :nome_arquivo, :id_system_users)';
- $stmt = $conn->prepare($sql);
- $stmt->bindValue(':id', $id['max_id'] + 1, PDO::PARAM_INT);
- $stmt->bindValue(':id_prontuario', $param['id_prontuario_anexo']);
- $stmt->bindValue(':descricao', $param['descricao']);
- $stmt->bindValue(':obs', $param['obs_anexo'] ?? null);
- $stmt->bindValue(':tipo_mime', $param['tipo_mime']);
- $stmt->bindValue(':data_upload', date('Y-m-d H:i:s'));
- $stmt->bindParam(':dados_arquivo', $binary_content, PDO::PARAM_LOB);
- $stmt->bindValue(':nome_arquivo', $param['dados_arquivo']);
- $stmt->bindValue(':id_system_users', TSession::getValue('userid'), PDO::PARAM_INT); // Obtém o ID do usuário logado
- $stmt->execute();
- TTransaction::close(); // fecha transação
- TToast::show('success', 'Arquivo salvo com sucesso!');
- // Exclui o arquivo temporário após o upload
- if (file_exists($arquivo_temporario)) {
- unlink($arquivo_temporario);
- }
- // Redireciona para a página do prontuário com o ID do prontuário anexo
- // Isso garante que a página seja recarregada com os dados atualizados
- } catch (Exception $e) {
- TTransaction::rollback();
- new TMessage('error', $e->getMessage());
- }
- $this->onCarrega(['id_prontuario' => $id_prontuario, 'current_tab' => 2]); // Recarrega os dados do prontuário
- TForm::sendData('form_prontuario_encontrado', (object) $param, false, true);
- }
- public function onRecarregaAnexos($param)
- {
- try {
- $this->grid_anexo->clear(); // Limpa a grid antes de adicionar os novos anexos
- if (isset($param['id_prontuario']) && $param['id_prontuario']) {
- $id_prontuario_anexo = $param['id_prontuario'];
- TTransaction::open('dps'); // Abre a transação para acessar o banco de dados
- $criteria = new TCriteria();
- $criteria->add(new TFilter('id_prontuario', '=', $id_prontuario_anexo)); // Filtra os anexos pelo ID do prontuário
- // Define filtro pela descricao ou nome do arquivo, se fornecido
- if (isset($param['pesquisa']) && $param['pesquisa'] !== '' && $param['pesquisa'] !== null) {
- $crit_pesquisa = new TCriteria();
- $crit_pesquisa->add(new TFilter('descricao', 'ilike', "%{$param['pesquisa']}%"));
- $crit_pesquisa->add(new TFilter('nome_arquivo', 'ilike', "%{$param['pesquisa']}%"), TExpression::OR_OPERATOR);
- $criteria->add($crit_pesquisa); // Adiciona o critério de pesquisa ao critério principal
- }
- $criteria->setProperty('order', 'data_upload DESC'); // Ordena por data de upload
- $repository = new TRepository('Anexo_dps');
- $anexos = $repository->load($criteria); // Carrega os anexos
- if ($anexos) { // Verifica se existem anexos
- foreach ($anexos as $anexo) {
- $this->grid_anexo->addItem($anexo); // Adiciona cada anexo à grid
- }
- TTransaction::close(); // Fecha a transação
- //recarega a grid de anexos
- return $this->grid_anexo; // Retorna a grid atualizada
- } else {
- TToast::show('warning', 'Nenhum anexo encontrado para o prontuário informado.');
- }
- } else {
- new TMessage('error', 'ID do prontuário não informado.');
- }
- } catch (Exception $e) {
- TTransaction::rollback();
- new TMessage('error', $e->getMessage());
- }
- }
- public function onDeleteAnexo($param)
- {
- try {
- $usuarioatual = TSession::getValue('userid'); // Obtém o ID do usuário logado
- if (isset($param['id_prontuario'])) {
- $id_prontuario = $param['id_prontuario'] ?? null;
- }
- //Verifica se quem gravou é um mesmo usuário
- if (isset($param['id']) && $param['id']) {
- $id = $param['id'];
- } else {
- throw new Exception('ID do anexo não informado.');
- }
- TTransaction::open('dps'); // Abre a transação para acessar o banco de dados
- $anexo = Anexo_dps::find($id); // Busca o anexo pelo ID
- if ($anexo && $anexo->id_system_users != $usuarioatual) { // Verifica se o anexo foi encontrado e se o usuário é o mesmo que gravou
- throw new Exception('Você não tem permissão para excluir este anexo. Somente o usuário que o anexou pode excluí-lo.');
- }
- TTransaction::close();
- //Questiona a exclusão do anexo
- // cria a ação para resposta positiva
- $action = new TAction([$this, 'onAnexoDeletado']);
- $action->setParameters($param); // repassa parâmetros recebidos para a ação
- // exibe o diálogo para o usuário
- new TQuestion('Deseja excluir o registro?', $action);
- } catch (Exception $e) {
- TTransaction::rollback();
- new TMessage('error', $e->getMessage());
- }
- $this->onCarrega(['id_prontuario' => $id_prontuario, 'current_tab' => 2]); // Recarrega os dados do prontuário
- TForm::sendData('form_prontuario_encontrado', (object) $param, false, true);
- }
- public function onAnexoDeletado($param)
- {
- try {
- if (isset($param['id_prontuario'])) {
- $id_prontuario = $param['id_prontuario'] ?? null;
- }
- if ($id_prontuario == null) {
- throw new Exception('ID do prontuário não informado.');
- }
- if (isset($param['id']) && $param['id']) {
- $id = $param['id'];
- TTransaction::open('dps'); // Abre a transação para acessar o banco de dados
- $anexo = Anexo_dps::find($id); // Busca o anexo pelo ID
- if ($anexo) { // Verifica se o anexo foi encontrado
- $anexo->delete(); // Deleta o anexo
- TToast::show('info', 'Anexo deletado com sucesso.');
- } else {
- new TMessage('warning', 'Anexo não encontrado para o ID fornecido.');
- }
- TTransaction::close();
- } else {
- new TMessage('error', 'ID do anexo não informado.');
- }
- $this->onCarrega(['id_prontuario' => $id_prontuario, 'current_tab' => 2]); // Recarrega os dados do prontuário
- TForm::sendData('form_prontuario_encontrado', (object) $param, false, true);
- } catch (Exception $e) {
- TTransaction::rollback();
- new TMessage('error', $e->getMessage());
- }
- }
- public function onDownloadAnexo($param)
- {
- try {
- if (empty($param['id'])) {
- throw new Exception('Parâmetro "id" ausente.');
- }
- $id = (int) $param['id'];
- TTransaction::open('dps');
- $conn = TTransaction::get();
- $stmt = $conn->prepare('SELECT nome_arquivo, tipo_mime, dados_arquivo
- FROM dps.tb_anexos
- WHERE id = :id');
- $stmt->execute([':id' => $id]);
- $row = $stmt->fetch(PDO::FETCH_ASSOC);
- TTransaction::close();
- if (!$row) {
- throw new Exception('Arquivo não encontrado.');
- }
- $filename = $row['nome_arquivo'] ?: "arquivo_$id";
- $filename = basename($filename);
- $mime = $row['tipo_mime'] ?: 'application/pdf';
- $data = $row['dados_arquivo'];
- if (is_resource($data)) {
- $data = stream_get_contents($data);
- }
- $outDir = 'app/output';
- if (!is_dir($outDir)) {
- @mkdir($outDir, 0775, true);
- }
- $file_path = $outDir . '/' . $filename;
- file_put_contents($file_path, $data);
- $pessoa = $this->RetornaNome($param['id_prontuario']) ?: '';
- $window = TWindow::create('ARQUIVO ANEXO AO PRONTUÁRIO DE ' . $pessoa, 0.8, 0.8);
- if (strpos($mime, 'image/') === 0) {
- // -------- IMAGEM: download + imprimir + preview --------
- $container = new TElement('div');
- $container->style = 'display:flex; flex-direction:column; height:100%; ';
- // Barra de ações
- $toolbar = new TElement('div');
- $toolbar->style = 'padding: 8px 20px; display:flex; gap:5px; border-bottom: 4px double #1a1818ff; justify-content: right; background: #3C3C3C;';
- // Botão salvar
- $estilo_btn = 'display:inline-block; padding:8px 14px; border-radius:8px; background: transparent; color: #FFFFFF; text-decoration:none; font-weight:600;';
- $btnSalvar = new TElement('a');
- $btnSalvar->href = $file_path;
- $btnSalvar->download = $filename;
- $btnSalvar->style = $estilo_btn;
- $btnSalvar->title = 'Baixar Arquivo';
- $btnSalvar->add("<i class='fa-solid fa-download'></i>");
- // Botão imprimir (abre nova aba e chama window.print)
- $btnImprimir = new TElement('a');
- $btnImprimir->href = '#';
- $btnImprimir->style = $estilo_btn;
- $btnImprimir->title = 'Imprimir arquivo';
- $btnImprimir->add("<i class='fa-solid fa-print'></i>");
- // JS seguro com json_encode para evitar problemas de escape
- $jsPrint = "var src=" . json_encode($file_path) . ";";
- $jsPrint .= "var title=" . json_encode('Impressão - ' . $filename) . ";";
- $jsPrint .= "var w=window.open('', '_blank');";
- $jsPrint .= "w.document.write('<!doctype html><html><head><meta charset=\"utf-8\"><title>'+title+'</title></head>";
- $jsPrint .= "<body style=\"margin:0;text-align:center;background:#fff;\">";
- $jsPrint .= "<img src=\"'+src+'\" alt=\"'+title+'\" style=\"max-width:100%;height:auto;\" onload=\"window.focus();window.print();\">";
- $jsPrint .= "</body></html>');";
- $jsPrint .= "w.document.close();";
- $btnImprimir->onclick = $jsPrint . ' return false;';
- // Link abrir em nova aba
- $linkNovaAba = new TElement('a');
- $linkNovaAba->href = $file_path;
- $linkNovaAba->target = '_blank';
- $linkNovaAba->style = $estilo_btn;
- $linkNovaAba->title = 'Abrir em nova aba';
- $linkNovaAba->add("<i class='fa-solid fa-external-link-alt'></i>");
- $toolbar->add($btnSalvar);
- $toolbar->add($btnImprimir);
- $toolbar->add($linkNovaAba);
- // Área de visualização
- $viewerWrap = new TElement('div');
- $viewerWrap->style = 'flex:1; overflow:auto;';
- $img = new TElement('img');
- $img->src = $file_path;
- $img->alt = $filename;
- $img->style = 'max-width:100%; height:auto; display:block;';
- $viewerWrap->add($img);
- $container->add($toolbar);
- $container->add($viewerWrap);
- $window->add($container);
- } elseif ($mime === 'application/pdf' || preg_match('/\.pdf$/i', $filename)) {
- // -------- PDF: mantém como está --------
- $object = new TElement('object');
- $object->data = $file_path;
- $object->type = 'application/pdf';
- $object->style = "width: 100%; height:calc(100% - 10px)";
- $object->add('O navegador não suporta a exibição deste conteúdo, <a style="color:#007bff;" target=_newwindow href="' . $object->data . '">clique aqui para baixar</a>...');
- $window->add($object);
- } else {
- // -------- Outros tipos: oferece download --------
- $box = new TElement('div');
- $box->style = 'padding:10px;';
- $msg = new TElement('div');
- $msg->style = 'margin-bottom:10px;';
- $msg->add('Tipo de arquivo não visualizável. Você pode baixá-lo abaixo:');
- $a = new TElement('a');
- $a->href = $file_path;
- $a->download = $filename;
- $a->style = 'display:inline-block; padding:8px 14px; border-radius:8px; background:#28a745; color:#fff; text-decoration:none; font-weight:600;';
- $a->add('Baixar arquivo');
- $box->add($msg);
- $box->add($a);
- $window->add($box);
- }
- $window->show();
- $this->onCarrega(['id_prontuario' => $param['id_prontuario'], 'current_tab' => 2]);
- } catch (Exception $e) {
- if (TTransaction::get()) {
- TTransaction::rollback();
- }
- new TMessage('error', $e->getMessage());
- }
- }
- public function RetornaNome($id_prontuario)
- {
- TTransaction::open('dps'); // Abre a transação para acessar o banco de dados
- $pessoa_achada = Prontuario::find($id_prontuario); // Busca a pessoa pelo ID
- if ($pessoa_achada) { // Verifica se a pessoa foi encontrada
- $pessoa = $pessoa_achada->get_pessoa(); // Obtém a pessoa associada ao prontuário
- if ($pessoa) {
- return $pessoa->nome; // Retorna o nome da pessoa
- } else {
- return 'Pessoa Não Encontrada';
- }
- } else {
- return 'Pessoa Não Encontrada';
- }
- TTransaction::close();
- }
- }
- ?>
Resolvido.