Inscrições abertas para nosso Webinar anual Adianti Framework 2024!
Clique aqui para saber mais
Checkboxes com seleção de valores de ids intermitentes Boa noite a todos, Estou tendo uma certa dificuldade com uma tela que estou criando. Eu tenho um datagrid com checkboxes que podem selecionar todos ou 1 por vez. Acontece que o comportamento está intermitente e nem sempre retorna os valores ids corretos dos checkboxes selecionados. A versão do framework que utilizo é a 7.4 minha classe. Método onSelecionados e o JavaScript no final do...
LS
Checkboxes com seleção de valores de ids intermitentes  
Boa noite a todos,

Estou tendo uma certa dificuldade com uma tela que estou criando. Eu tenho um datagrid com checkboxes que podem selecionar todos ou 1 por vez. Acontece que o comportamento está intermitente e nem sempre retorna os valores ids corretos dos checkboxes selecionados.

A versão do framework que utilizo é a 7.4

minha classe. Método onSelecionados e o JavaScript no final do construtor.


  1. <?php
  2. require 'vendor/autoload.php';
  3. use Dompdf\Dompdf;
  4. use Dompdf\Options;
  5. /**
  6.  * OrdemPagamentoPortobayConsulta Listing
  7.  * @author  <your name here>
  8.  */
  9. class OrdemPagamentoPortobayConsulta extends TStandardList
  10. {
  11.     protected $form;     // registration form
  12.     protected $datagrid// listing
  13.     protected $pageNavigation;
  14.     protected $formgrid;
  15.     protected $deleteButton;
  16.     protected $transformCallback;
  17.     const FORM_NUMBER 9;
  18.     private static $formName 'form_search_OrdemPagamentoPortobayConsulta';
  19.     /**
  20.      * Class constructor
  21.      * Creates the page, the form and the listing
  22.      */
  23.     public function __construct()
  24.     {
  25.         parent::__construct();
  26.         parent::setDatabase('permission');
  27.         parent::setActiveRecord('OrdemPagamentoPortobay');   // defines the active record
  28.         parent::setDefaultOrder('id''desc');         // defines the default order
  29.         $userid TSession::getValue('userid');
  30.         TTransaction::open('permission');
  31.         // creates the form
  32.         $this->form = new BootstrapFormBuilder(self::$formName);
  33.         $this->form->setFormTitle('Consulta - Ordem de Pagamento Portobay');
  34.         // create the form fields
  35.         $id = new TEntry('id');
  36.         $flagCheck = new THidden('flagCheck');
  37.         $razao_social = new TEntry('razao_social');
  38.         $cnpj = new TEntry('cnpj');
  39.         $cnpj->placeholder '99.999.999/9999-99';
  40.         $cnpj->setMask('99.999.999/9999-99');
  41.         $cpf = new TEntry('cpf');
  42.         $cpf->placeholder '999.999.999-99';
  43.         $cpf->setMask('999.999.999-99');
  44.         $centro_de_custo = new TEntry('centro_de_custo');
  45.         $conta_contabil = new TEntry('conta_contabil');
  46.         $numero_nf = new TEntry('numero_nf');
  47.         $data_vencimento_ini = new TDate('data_vencimento_ini');
  48.         $data_vencimento_ini->setMask('dd/mm/yyyy');
  49.         $data_vencimento_fim = new TDate('data_vencimento_fim');
  50.         $data_vencimento_fim->setMask('dd/mm/yyyy');
  51.         $valor_ini = new TEntry('valor_ini');
  52.         $valor_ini->setNumericMask(2',''.'true);
  53.         $valor_fim = new TEntry('valor_fim');
  54.         $valor_fim->setNumericMask(2',''.'true);
  55.         $etapa = new TCombo('etapa');
  56.         $etapa->addItems(HomeSolicitacao::getStatusList(self::FORM_NUMBER$userid));
  57.         $etapa->enableSearch();
  58.         $data_cadastro_ini = new TDate('data_cadastro_ini');
  59.         $data_cadastro_ini->setMask('dd/mm/yyyy');
  60.         $data_cadastro_fim = new TDate('data_cadastro_fim');
  61.         $data_cadastro_fim->setMask('dd/mm/yyyy');
  62.         $fk_id_emissor = new TDBMultiSearch('fk_id_emissor''permission''SystemUser''id''name');
  63.         $fk_id_emissor->setMinLength(0);
  64.         $fk_id_emissor->setMask('{name}');
  65.         $fk_id_emissor->setOperator('ilike');
  66.         $criteria = new TCriteria;
  67.         $criteria->add(new TFilter('fk_id_formulario''='self::FORM_NUMBER));
  68.         $fk_id_cadastro = new TDBMultiSearch('fk_id_cadastro''permission''CadastroEtapa''id''nome''nome'$criteria);
  69.         $fk_id_cadastro->setMinLength(0);
  70.         $fk_id_cadastro->setMask('{nome}');
  71.         $fk_id_cadastro->setOperator('ilike');
  72.         $id->setSize('100%');
  73.         $flagCheck->setSize('100%');
  74.         $razao_social->setSize('100%');
  75.         $cnpj->setSize('100%');
  76.         $cpf->setSize('100%');
  77.         $centro_de_custo->setSize('100%');
  78.         $conta_contabil->setSize('100%');
  79.         $numero_nf->setSize('100%');
  80.         $data_vencimento_ini->setSize('120');
  81.         $data_vencimento_fim->setSize('120');
  82.         $valor_ini->setSize('120');
  83.         $valor_fim->setSize('120');
  84.         $etapa->setSize('100%');
  85.         $data_cadastro_ini->setSize('120');
  86.         $data_cadastro_fim->setSize('120');
  87.         $fk_id_emissor->setSize('100%'30);
  88.         $fk_id_cadastro->setSize('100%'30);
  89.         // add the fields
  90.         $row $this->form->addFields(
  91.             [new TLabel("N° Ordem Pagamento"'''14px''b''100%'), $id],
  92.             [new TLabel("Razão Social"'''14px''b''100%'), $razao_social]
  93.         );
  94.         $row->layout = ['col-sm-3''col-sm-9'];
  95.         $row $this->form->addFields(
  96.             [new TLabel("CPF""",  '14px''b''100%'), $cpf],
  97.             [new TLabel("CNPJ"""'14px''b''100%'), $cnpj],
  98.             [new TLabel("Centro de Custo"'''14px''b''100%'), $centro_de_custo]
  99.         );
  100.         $row->layout = ['col-sm-3''col-sm-3''col-sm-6'];
  101.         $row $this->form->addFields(
  102.             [new TLabel("Conta Contábil"'''14px''b''100%'), $conta_contabil],
  103.             [new TLabel("Número da Nota"'''14px''b''100%'), $numero_nf],
  104.             [new TLabel("Status"'''14px''b''100%'), $etapa]
  105.         );
  106.         $row->layout = ['col-sm-3''col-sm-3''col-sm-6'];
  107.         $row $this->form->addFields(
  108.             [new TLabel("Data Cadastro"'''14px''b''100%'), $data_cadastro_ini'à'$data_cadastro_fim],
  109.             [new TLabel("Data Vencimento"'''14px''b''100%'), $data_vencimento_ini'à'$data_vencimento_fim],
  110.             [new TLabel("Valor"'''14px''b''100%'), $valor_ini'à'$valor_fim]
  111.         );
  112.         $row->layout = ['col-sm-4''col-sm-4''col-sm-4'];
  113.         $hasCreatePermission HomeSolicitacao::checkPermissions(self::FORM_NUMBER$userid, -2);
  114.         if ($hasCreatePermission) {
  115.             $row $this->form->addFields(
  116.                 [new TLabel("Emissor"'''14px''b''100%'), $fk_id_emissor],
  117.                 [new TLabel("Módulo"'''14px''b''100%'), $fk_id_cadastro]
  118.             );
  119.             $row->layout = ['col-sm-6''col-sm-6'];
  120.         } else {
  121.             $row $this->form->addFields([new TLabel("Módulo"'''14px''b''100%'), $fk_id_cadastro]);
  122.             $row->layout = ['col-sm-12'];
  123.         }
  124.         $this->form->addFields([$flagCheck]);
  125.        
  126.         // keep the form filled during navigation with session data
  127.         $this->form->setData(TSession::getValue('OrdemPagamentoPortobayConsulta_filter_data'));
  128.         $this->form->addAction(_t('Find'), new TAction(array($this'onSearch')), 'fa:search')->class 'btn btn-sm btn-primary';
  129.         $this->form->addAction(_t('Clear'), new TAction(array($this'onClear')), 'fa:eraser red');
  130.         $isFinanceiro SystemUserGroup::where('system_user_id''='$userid)->where('system_group_id''IN'"(SELECT id FROM permission.system_group WHERE name ILIKE '%Financeiro%Portobay%')")->count() > 0;
  131.         if ($isFinanceiro) {
  132.             $this->form->addAction(('Marcar como nota pendente'), new TAction(array($this'onMarkAsPending')), 'fa:file-invoice-dollar red');
  133.             $this->form->addAction(('Marcar como nota enviada'), new TAction(array($this'onMarkAsSent')), 'fa:file-invoice-dollar green');
  134.         }
  135.         TTransaction::close();
  136.         $this->form->addAction(('Gerar PDF Selecionados'), new TAction(array($this'onGenerateMultiple')), 'fa:check-square green');
  137.         // creates a Datagrid
  138.         $this->datagrid = new BootstrapDatagridWrapper(new TDataGrid);
  139.         $this->datagrid->datatable 'true';
  140.         $this->datagrid->id 'datagrid_list'// Adiciona um ID à datagrid
  141.         $this->datagrid->style 'width: 100%';
  142.         $this->datagrid->setHeight(320);
  143.         $checkall = new TElement('input');
  144.         $checkall->id 'checkbox_all';
  145.         $checkall->type 'checkbox';
  146.         $checkall->title 'Marcar/desmarcar todos';
  147.         $checkall->style 'height: 20px; width: 20px; background-color: transparent; border: 6px solid #5a5a5a;';
  148.         //$checkall->onclick = "selectAll(this);";
  149.         // creates the datagrid columns
  150.         $col_select = new TDataGridColumn('select'$checkall'center');
  151.         $column_id = new TDataGridColumn('id''N° OP''center');
  152.         $column_razao_social = new TDataGridColumn('razao_social''Razão Social''center');
  153.         $column_tipo_pessoa = new TDataGridColumn('tipo_pessoa''Tipo Pessoa''center');
  154.         $column_cpf_cnpj = new TDataGridColumn('cnpj''CPF/CNPJ''center');
  155.         $column_numero_nf = new TDataGridColumn('numero_nf''Nota Fiscal''center');
  156.         $column_data_vencimento = new TDataGridColumn('data_vencimento''Data de Vencimento''center');
  157.         $column_valor = new TDataGridColumn('valor''Valor''center');
  158.         $column_fk_id_emissor = new TDataGridColumn('fk_id_emissor''Emissor''center');
  159.         $column_data_cadastro = new TDataGridColumn('data_cadastro''Cadastrado em''center');
  160.         $column_etapa = new TDataGridColumn('etapa''Status''center');
  161.         $column_tipo = new TDataGridColumn('tipo''Módulo''center');
  162.         $column_nota_enviada = new TDataGridColumn('nota_enviada''Status Nota''center');
  163.         // add the columns to the Datagrid
  164.         $this->datagrid->addColumn($col_select);
  165.         $this->datagrid->addColumn($column_id,   new TAction([$this'onReload'], ['column' => 'id']));
  166.         $this->datagrid->addColumn($column_razao_social,   new TAction([$this'onReload'], ['column' => 'razao_social']));
  167.         $this->datagrid->addColumn($column_tipo_pessoa,   new TAction([$this'onReload'], ['column' => 'tipo_pessoa']));
  168.         $this->datagrid->addColumn($column_cpf_cnpj,   new TAction([$this'onReload'], ['column' => 'cnpj']));
  169.         $this->datagrid->addColumn($column_numero_nf,  new TAction([$this'onReload'], ['column' => 'numero_nf']));
  170.         $this->datagrid->addColumn($column_data_vencimento,  new TAction([$this'onReload'], ['column' => 'data_vencimento']));
  171.         $this->datagrid->addColumn($column_valor,  new TAction([$this'onReload'], ['column' => 'valor']));
  172.         $this->datagrid->addColumn($column_tipo);
  173.         $this->datagrid->addColumn($column_etapa);
  174.         $this->datagrid->addColumn($column_nota_enviada);
  175.         $this->datagrid->addColumn($column_fk_id_emissor,  new TAction([$this'onReload'], ['column' => 'fk_id_emissor']));
  176.         $this->datagrid->addColumn($column_data_cadastro,  new TAction([$this'onReload'], ['column' => 'data_cadastro']));
  177.         // define format function
  178.         $format_value = function ($value) {
  179.             if (is_numeric($value)) {
  180.                 return number_format($value2',''.') . ' R$';
  181.             }
  182.             return $value;
  183.         };
  184.         $column_valor->setTransformer($format_value);
  185.         $column_valor->setTotalFunction(function ($values) {
  186.             return array_sum((array) $values);
  187.         });
  188.         $this->datagrid->disableDefaultClick();
  189.         // create EDIT action
  190.         $action_edit = new TDataGridAction(array('OrdemPagamentoPortobayForm''onEdit'));
  191.         $action_edit->setButtonClass('btn btn-default');
  192.         $action_edit->setLabel('Editar');
  193.         $action_edit->setImage('far:edit fa-lg blue');
  194.         $action_edit->setField('id');
  195.         $action_edit->setDisplayCondition(array($this'enableEdit'));
  196.         $action_edit_financeiro = new TDataGridAction(array('OrdemPagamentoPortobayForm''onEditFinanceiro'));
  197.         $action_edit_financeiro->setButtonClass('btn btn-default');
  198.         $action_edit_financeiro->setLabel('Editar (Financeiro)');
  199.         $action_edit_financeiro->setImage('far:edit fa-lg blue');
  200.         $action_edit_financeiro->setField('id');
  201.         $action_edit_financeiro->setDisplayCondition(array($this'enableEditFinanceiro'));
  202.         $action_view = new TDataGridAction(array('OrdemPagamentoPortobayView''onViewFromConsulta'));
  203.         $action_view->setButtonClass('btn btn-default');
  204.         $action_view->setLabel('Visualizar');
  205.         $action_view->setImage('fa:eye fa-lg purple');
  206.         $action_view->setField('id');
  207.         $action_files = new TDataGridAction(array('OrdemPagamentoPortobayAnexosView''onView'));
  208.         $action_files->setButtonClass('btn btn-default');
  209.         $action_files->setLabel('Anexos');
  210.         $action_files->setImage('fa:paperclip grey fa-lg');
  211.         $action_files->setField('id');
  212.         $action_pdf = new TDataGridAction(array($this'onGenerateSingle'));
  213.         $action_pdf->setButtonClass('btn btn-default');
  214.         $action_pdf->setLabel(('Vizualizar PDF'));
  215.         $action_pdf->setImage('fa:file-pdf red fa-lg');
  216.         $action_pdf->setField('id');
  217.         $action_del = new TDataGridAction(array($this'onDelete'));
  218.         $action_del->setButtonClass('btn btn-default');
  219.         $action_del->setLabel('Remover');
  220.         $action_del->setImage('fa:trash fa-lg red');
  221.         $action_del->setField('id');
  222.         $action_del->setDisplayCondition(array($this'enableDelete'));
  223.         $action_group = new TDataGridActionGroup('Ações ''fa:th');
  224.         $action_group->addHeader('Opções');
  225.         $action_group->addAction($action_edit);
  226.         $action_group->addAction($action_edit_financeiro);
  227.         //$action_group->addAction($action_pdf);
  228.         $action_group->addAction($action_view);
  229.         $action_group->addAction($action_files);
  230.         //$action_group->addAction($action_del);
  231.         // add the actions to the datagrid
  232.         $this->datagrid->addActionGroup($action_group);
  233.         // create the datagrid model
  234.         $this->datagrid->createModel();
  235.         
  236.         // create the page navigation
  237.         $this->pageNavigation = new TPageNavigation;
  238.         $this->pageNavigation->setAction(new TAction(array($this'onReload')));
  239.         $this->pageNavigation->setWidth($this->datagrid->getWidth());
  240.         $panel = new TPanelGroup;
  241.         $panel->add($this->datagrid);
  242.         $panel->addFooter($this->pageNavigation);
  243.         // header actions
  244.         $dropdown = new TDropDown(TSession::getValue('OrdemPagamentoPortobayConsulta_limit') ?? '20''');
  245.         $dropdown->style 'height:37px';
  246.         $dropdown->setPullSide('right');
  247.         $dropdown->setButtonClass('btn btn-default waves-effect dropdown-toggle');
  248.         foreach ([102050100500] as $qty) {
  249.             $dropdown->addAction(
  250.                 $qty,
  251.                 new TAction(
  252.                     [$this'onChangeLimit'],
  253.                     [
  254.                         'register_state' => 'false',
  255.                         'static' => '1',
  256.                         'limit' => "{$qty}"
  257.                     ]
  258.                 )
  259.             );
  260.         }
  261.         $panel->addHeaderWidget(new TLabel('Listar &nbsp;'));
  262.         $panel->addHeaderWidget($dropdown);
  263.         $panel->addHeaderWidget(new TLabel('&nbsp; / página'));
  264.         $panel->addHeaderWidget(new TLabel('&nbsp;&nbsp;'));
  265.         $dropdown = new TDropDown(_t('Export'), 'fa:list');
  266.         $dropdown->setPullSide('right');
  267.         $dropdown->setButtonClass('btn btn-default waves-effect dropdown-toggle');
  268.         $dropdown->addAction(_t('Save as CSV'), new TAction([$this'onExportCSV'], ['register_state' => 'false''static' => '1']), 'fa:table fa-fw blue');
  269.         $dropdown->addAction(_t('Save as PDF'), new TAction([$this'onGenerateMultiple2'], ['register_state' => 'false''static' => '1']), 'far:file-pdf fa-fw red');
  270.         $panel->addHeaderWidget($dropdown);
  271.         // vertical box container
  272.         $container = new TVBox;
  273.         $container->style 'width: 100%';
  274.         $container->add(new TXMLBreadCrumb('menu.xml''OrdemPagamentoPortobayConsulta2'));
  275.         $container->add($this->form);
  276.         $container->add($panel);
  277.         parent::add($container);
  278.            
  279.         TScript::create("
  280.             let checkboxStates = {};
  281.             document.getElementById('checkbox_all').addEventListener('change', function () {
  282.                 const isChecked = this.checked;
  283.                 $('input[name^=\"check_select_\"]').each(function () {
  284.                     const key = $(this).val();
  285.                     $(this).prop('checked', isChecked);
  286.                     sendAjaxRequest(key, isChecked);
  287.                     console.log('atualização individual:', key);
  288.                 });
  289.                 console.log('Status do checkbox all:', isChecked);
  290.             });
  291.             $(document).on('change', 'input[name^=\"check_select_\"]', function () {
  292.                 const key = $(this).val();
  293.                 const isChecked = this.checked;
  294.                 sendAjaxRequest(key, isChecked);
  295.                 
  296.                 console.log('Status do checkbox individual:', key);
  297.                 const allChecked = $('input[name^=\"check_select_\"]').length === $('input[name^=\"check_select_\"]:checked').length;
  298.                 $('#checkbox_all').prop('checked', allChecked);
  299.             });
  300.             function sendAjaxRequest(key, isChecked) {
  301.                 if (checkboxStates[key] !== isChecked) {
  302.                     console.log('Enviando AJAX para a chave:', key, 'Com flagCheck:', !isChecked);
  303.                     __adianti_ajax_exec('class=OrdemPagamentoPortobayConsulta&method=onSelecionados&key=' + key + '&flagCheck=' + !isChecked);
  304.                     console.log('Chamada AJAX enviada.');
  305.                     checkboxStates[key] = isChecked; 
  306.                 }
  307.             }
  308.             $(document).ready(function(){
  309.                 $('#datagrid_list').parent().parent().addClass('margin_bottom_120');
  310.                
  311.             });
  312.         ");
  313.     }
  314.     public function enableEdit($object)
  315.     {
  316.         return $object->can_edit;
  317.     }
  318.     public function enableEditFinanceiro($object)
  319.     {
  320.         return $object->can_edit_financeiro;
  321.     }
  322.     public function enableDelete($object)
  323.     {
  324.         return $object->can_delete;
  325.     }
  326.     public static function onChangeLimit($param)
  327.     {
  328.         TSession::setValue('OrdemPagamentoPortobayConsulta_limit'$param['limit']);
  329.         AdiantiCoreApplication::loadPage(__CLASS__'onReload');
  330.     }
  331.     public function onEnter()
  332.     {
  333.         TSession::setValue('solicitacoes_selecionadas', []);
  334.         $this->onReload();
  335.     }
  336.     public static function onSelecionados($param)
  337.     {
  338.         // Obtém a lista de documentos selecionados da sessão ou inicializa como um array vazio
  339.         $documentosSelecionados TSession::getValue('solicitacoes_selecionadas') ?? [];
  340.         // Obter a chave e o estado do checkbox (flagCheck)
  341.         $key $param['key'] ?? null;
  342.         $flagCheck = isset($param['flagCheck']) ? filter_var($param['flagCheck'], FILTER_VALIDATE_BOOLEAN) : null;
  343.         // Exibir o estado do flagCheck para depuração
  344.         echo "Flag Check: " . ($flagCheck 'true' 'false') . "\n";
  345.         echo "<pre>"print_r($param); echo "</pre>";
  346.         echo "Flag Check: " . ($flagCheck 'true' 'false') . "<br>";
  347.         // Manipula a lista de documentos com base no estado do checkbox
  348.         if ($flagCheck)
  349.         {
  350.             // Remove o item se o flagCheck for true (marcado)
  351.             $documentosSelecionados array_diff($documentosSelecionados, [$key]);
  352.         }
  353.         else
  354.         {
  355.             // Adiciona o item se o flagCheck for false (não marcado) e não estiver presente
  356.             if (!in_array($key$documentosSelecionadostrue))
  357.             {
  358.                 $documentosSelecionados[] = $key;
  359.             }
  360.         }
  361.         // Atualiza a sessão com os itens selecionados
  362.         TSession::setValue('solicitacoes_selecionadas'array_values($documentosSelecionados));
  363.         // Exibir o array atualizado para depuração
  364.         echo "<pre>"print_r($documentosSelecionados); echo "</pre>";
  365.         // Envia dados do formulário
  366.         TForm::sendData(self::$formName$param);
  367.     }
  368.     public static function onGenerateMultiple($param)
  369.     {
  370.         $ordens TSession::getValue('solicitacoes_selecionadas');
  371.         if (empty($ordens)) {
  372.             new TMessage('error''Favor Selecionar algum item na lista!');
  373.         } else {
  374.             try {
  375.                 TTransaction::open('permission');
  376.                 $files = [];
  377.                 foreach ($ordens as $ordemId) {
  378.                     $files[] = "D:/htdocs/qualydocs/" self::createPDF($ordemId);
  379.                 }
  380.                 $files implode(" "$files);
  381.                 $output_file 'app/output/multiples_' date('Y_m_d_H_i_s') . "_" rand(099999) . ".pdf";
  382.                 $fullpath 'D:/htdocs/qualydocs/' $output_file;
  383.                 $command "D:/htdocs/qualydocs/gs/gswin32c.exe -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOUTPUTFILE=$fullpath $files 2>&1";
  384.                 $result shell_exec($command);
  385.                 TScript::create("console.log('$command');");
  386.                 TScript::create("console.log('$result');");
  387.                 if (file_exists($output_file)) {
  388.                     // open window to show pdf
  389.                     $window TWindow::create('Ordem de Pagamento'0.80.8);
  390.                     $object = new TElement('object');
  391.                     $object->data  $output_file;
  392.                     $object->type  'application/pdf';
  393.                     $object->style "width: 100%; height:calc(100% - 10px)";
  394.                     $window->add($object);
  395.                     $window->show();
  396.                 } else {
  397.                     new TMessage('error''Erro ao gerar pdf!');
  398.                 }
  399.                 TTransaction::close();
  400.             } catch (Exception $e) {
  401.                 new TMessage('error'$e->getMessage());
  402.                 TTransaction::rollback();
  403.             }
  404.         }
  405.         TSession::setValue('solicitacoes_selecionadas', []);
  406.     }
  407.     public static function onGenerateSingle($param)
  408.     {
  409.         try {
  410.             TTransaction::open('permission');
  411.             $output_file self::createPDF($param['id']);
  412.             if (file_exists($output_file)) {
  413.                 // open window to show pdf
  414.                 $window TWindow::create('Ordem de Pagamento'0.80.8);
  415.                 $object = new TElement('object');
  416.                 $object->data  $output_file;
  417.                 $object->type  'application/pdf';
  418.                 $object->style "width: 100%; height:calc(100% - 10px)";
  419.                 $window->add($object);
  420.                 $window->show();
  421.             } else {
  422.                 new TMessage('error''Erro ao gerar pdf!');
  423.             }
  424.             TTransaction::close();
  425.         } catch (Exception $e) {
  426.             new TMessage('error'$e->getMessage());
  427.             TTransaction::rollback();
  428.         }
  429.     }
  430.     public static function createPDF($id)
  431.     {
  432.         $ordem_pagamento = new OrdemPagamentoPortobay($id);
  433.         // replace the main section variables
  434.         $html = new THtmlRenderer('app/reports/relatorio.html');
  435.         $unidade_monetaria = array(=> 'R$'=> '$'=> '€'=> '£');
  436.         $data_vencimento = !empty($ordem_pagamento->data_vencimento) ? date('d/m/Y'strtotime($ordem_pagamento->data_vencimento)) : '';
  437.         $data_emissao_nf = !empty($ordem_pagamento->data_emissao_nf) ? date('d/m/Y'strtotime($ordem_pagamento->data_emissao_nf)) : '';
  438.         $data_cadastro = !empty($ordem_pagamento->data_cadastro) ? date('d/m/Y'strtotime($ordem_pagamento->data_cadastro)) : '';
  439.         $ordem_pagamento->inss_label number_format($ordem_pagamento->inss_label2',''.') . '%';
  440.         $ordem_pagamento->irrf_label number_format($ordem_pagamento->irrf_label2',''.') . '%';
  441.         $ordem_pagamento->irrf_2_label number_format($ordem_pagamento->irrf_2_label2',''.') . '%';
  442.         $ordem_pagamento->iss_label number_format($ordem_pagamento->iss_label2',''.') . '%';
  443.         $ordem_pagamento->pis_cofins_cssl_label number_format($ordem_pagamento->pis_cofins_cssl_label2',''.') . '%';
  444.         $unidade_monetaria = !empty($ordem_pagamento->unidade_monetaria) ? $unidade_monetaria[$ordem_pagamento->unidade_monetaria] . " " "";
  445.         $replace = [];
  446.         $replace['data_vencimento']  = $data_vencimento;
  447.         $replace['data_emissao_nf']  = $data_emissao_nf;
  448.         $replace['valor'] = "{$unidade_monetaria}number_format($ordem_pagamento->valor ?? '0'2',''.');
  449.         $replace['numero_nf']  = $ordem_pagamento->numero_nf;
  450.         $replace['razao_social']  = $ordem_pagamento->razao_social;
  451.         if ($ordem_pagamento->tipo_pessoa == && !empty($ordem_pagamento->cpf)) {
  452.             $ordem_pagamento->cnpj $ordem_pagamento->cpf;
  453.         } else if ($ordem_pagamento->tipo_pessoa == && !empty($ordem_pagamento->cnpj)) {
  454.             $ordem_pagamento->cnpj $ordem_pagamento->cnpj;
  455.         }
  456.         $replace['cnpj']  = $ordem_pagamento->cnpj;
  457.         $replace['telefone']  = $ordem_pagamento->telefone;
  458.         $replace['descricao_servico']  = $ordem_pagamento->descricao_servico;
  459.         $replace['op1'] = "[   ] BOLETO";
  460.         $replace['op2'] = "[   ] DEPÓSITO";
  461.         $replace['op3'] = "[   ] CÂMBIO";
  462.         $replace['op4'] = "[   ] OUTROS";
  463.         switch ($ordem_pagamento->forma_pagamento) {
  464.             case 'BOLETO':
  465.                 $replace['op1'] = "[ X ] BOLETO";
  466.                 break;
  467.             case 'DEPOSITO':
  468.                 $replace['op2'] = "[ X ] DEPÓSITO";
  469.                 break;
  470.             case 'CAMBIO':
  471.                 $replace['op3'] = "[ X ] CÂMBIO";
  472.                 break;
  473.             case 'OUTROS':
  474.                 $replace['op4'] = "[ X ] OUTROS";
  475.                 break;
  476.         }
  477.         $replace['credor']  = $ordem_pagamento->credor;
  478.         $replace['banco']  = $ordem_pagamento->banco;
  479.         $replace['agencia']  = $ordem_pagamento->agencia;
  480.         $replace['conta_corrente']  = $ordem_pagamento->numero_conta;
  481.         $replace['valor_bruto']  = "{$unidade_monetaria}number_format($ordem_pagamento->valor_bruto2',''.');
  482.         $replace['inss']  = 'R$ ' number_format($ordem_pagamento->inss2',''.');
  483.         $replace['irrf']  = 'R$ ' number_format($ordem_pagamento->irrf2',''.');
  484.         $replace['irrf_2']  = 'R$ ' number_format($ordem_pagamento->irrf_22',''.');
  485.         $replace['iss']  = 'R$ ' number_format($ordem_pagamento->iss2',''.');
  486.         $replace['pis_cofins_cssl']  = 'R$ ' number_format($ordem_pagamento->pis_cofins_cssl2',''.');
  487.         $replace['inss_label']  = strval(number_format(doubleval($ordem_pagamento->inss_label), 2',''.')) . '%';
  488.         $replace['irrf_label']  = strval(number_format(doubleval($ordem_pagamento->irrf_label), 2',''.')) . '%';
  489.         $replace['irrf_2_label']  = strval(number_format(doubleval($ordem_pagamento->irrf_2_label), 2',''.')) . '%';
  490.         $replace['iss_label']  = strval(number_format(doubleval($ordem_pagamento->iss_label), 2',''.')) . '%';
  491.         $replace['pis_cofins_cssl_label']  = strval(number_format(doubleval($ordem_pagamento->pis_cofins_cssl_label), 2',''.')) . '%';
  492.         $replace['descontos']  = 'R$ ' number_format($ordem_pagamento->descontos2',''.');
  493.         $replace['valor_liquido']  = "{$unidade_monetaria}number_format($ordem_pagamento->valor_liquido2',''.');
  494.         $replace['centro_de_custo']  = $ordem_pagamento->centro_de_custo;
  495.         $replace['conta_contabil']  = $ordem_pagamento->conta_contabil;
  496.         if ($ordem_pagamento->fk_id_emissor != null) {
  497.             $user = new SystemUser($ordem_pagamento->fk_id_emissor);
  498.             $replace['fk_id_emissor'] = $user->name;
  499.             $replace['data_emissor'] = $data_cadastro;
  500.             $replace['emissor'] = $ordem_pagamento->emissor;
  501.         }
  502.         $tipos = array("contabilidade""controller""diretoria");
  503.         foreach ($tipos as $tipo) {
  504.             $replace['fk_id_' $tipo] = '';
  505.             $replace['data_' $tipo] = '';
  506.             $replace[$tipo] = '';
  507.             if (!empty($ordem_pagamento->{"fk_id_{$tipo}"})) {
  508.                 $user = new SystemUser($ordem_pagamento->{"fk_id_{$tipo}"});
  509.                 $replace['fk_id_' $tipo] = $user->name;
  510.                 $replace['data_' $tipo] = !empty($ordem_pagamento->{"data_{$tipo}"}) ? date('d/m/Y H:i:s'strtotime($ordem_pagamento->{"data_{$tipo}"})) : '';
  511.                 $replace[$tipo] = $ordem_pagamento->contabilidade;
  512.             }
  513.         }
  514.         $html->enableSection('main'$replace);
  515.         $contents $html->getContents();
  516.         // converts the HTML template into PDF
  517.         $dompdf = new \Dompdf\Dompdf();
  518.         $dompdf->loadHtml($contents);
  519.         $dompdf->setPaper('A3''portrait');
  520.         $dompdf->render();
  521.         // write and open file
  522.         $docName date('Y_m_d_H_i_s') . "_" rand(19999) . ".pdf";
  523.         file_put_contents('app/output/' $docName$dompdf->output());
  524.         $files = ['D:/htdocs/qualydocs/app/output/first_' $docName];
  525.         $pdf = new PDFMerger;
  526.         $pdf->addPDF('app/output/' $docName'1');
  527.         $pdf->merge('file''app/output/first_' $docName);
  528.         $criterio = new TCriteria;
  529.         $criterio->add(new TFilter('fk_id_ordem_pagamento''='$ordem_pagamento->id));
  530.         $anexos OrdemPagamentoPortobayArquivo::getObjects($criterio);
  531.         $domPdfPath realpath('vendor/dompdf/dompdf');
  532.         \PhpOffice\PhpWord\Settings::setPdfRendererPath($domPdfPath);
  533.         \PhpOffice\PhpWord\Settings::setPdfRendererName('DomPDF');
  534.         foreach ($anexos as $anexo) {
  535.             if (file_exists($anexo->documento) && is_file($anexo->documento)) {
  536.                 $ext mb_strtolower(pathinfo($anexo->documentoPATHINFO_EXTENSION));
  537.                 if ($ext == 'pdf') {
  538.                     $files[] = 'D:/htdocs/qualydocs/' $anexo->documento;
  539.                 } elseif ($ext == 'txt') {
  540.                     $temp_txt file_get_contents($anexo->documento);
  541.                     $html = new THtmlRenderer('app/reports/texto.html');
  542.                     $replace = [];
  543.                     $replace['texto']  = $temp_txt;
  544.                     $html->enableSection('main'$replace);
  545.                     // converts the HTML template into PDF
  546.                     $dompdf = new \Dompdf\Dompdf();
  547.                     $dompdf->loadHtml($html->getContents());
  548.                     $dompdf->setPaper('A3''portrait');
  549.                     $dompdf->render();
  550.                     // write and open file
  551.                     $f "app/output/doc_" date('Y_m_d_H_i_s') . "_" rand(099999) . ".pdf";
  552.                     file_put_contents($f$dompdf->output());
  553.                     if (file_exists($f) && is_file($f)) {
  554.                         $files[] = 'D:/htdocs/qualydocs/' $f;
  555.                     }
  556.                 } elseif (in_array($ext, array('doc''docx'))) {
  557.                     $f "app/output/doc_" date('Y_m_d_H_i_s') . "_" rand(099999) . ".pdf";
  558.                     $phpWord = \PhpOffice\PhpWord\IOFactory::load($anexo->documento);
  559.                     $objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord"PDF");
  560.                     $objWriter->save($f);
  561.                     if (file_exists($f) && is_file($f)) {
  562.                         $files[] = 'D:/htdocs/qualydocs/' $f;
  563.                     }
  564.                 } elseif (in_array($ext, array('xls''xlsx'))) {
  565.                     $f "app/output/doc_" date('Y_m_d_H_i_s') . "_" rand(099999) . ".pdf";
  566.                     $phpExcel = \PhpOffice\PhpSpreadsheet\IOFactory::load($anexo->documento);
  567.                     $objWriter = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($phpExcel'Dompdf');
  568.                     $objWriter->save($f);
  569.                     if (file_exists($f) && is_file($f)) {
  570.                         $files[] = 'D:/htdocs/qualydocs/' $f;
  571.                     }
  572.                 }
  573.             }
  574.         }
  575.         $files implode(" "$files);
  576.         $output_file 'D:/htdocs/qualydocs/app/output/full_' $docName;
  577.         $command "D:/htdocs/qualydocs/gs/gswin32c.exe -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOUTPUTFILE=$output_file $files 2>&1";
  578.         $result shell_exec($command);
  579.         TScript::create("console.log('$command');");
  580.         TScript::create("console.log('$result');");
  581.         return 'app/output/full_' $docName;
  582.     }
  583.     private static function prepareDataHeader()
  584.     {
  585.         return [
  586.             'title' => "PATHFINDER EMPREENDIMENTOS E PARTICIPACOES LTDA",
  587.             'subtitle' => "Pagamentos em Aberto",
  588.             'subtitle2' => "Total de Solicitações",
  589.         ];
  590.     }
  591.     private static function prepareData($ordem)
  592.     {
  593.         $unidade_monetaria = [=> 'R$'=> '$'=> '€'=> '£'];
  594.         $data_vencimento = !empty($ordem->data_vencimento
  595.             ? date('d/m/Y'strtotime($ordem->data_vencimento)) 
  596.             : '';
  597.         $unidade_monetaria $unidade_monetaria[$ordem->unidade_monetaria] ?? '';
  598.         return [
  599.             'razao_social' => htmlspecialchars($ordem->razao_social ?? ''),
  600.             'cnpj' => htmlspecialchars($ordem->cnpj ?? ''),
  601.             'data_vencimento' => htmlspecialchars($data_vencimento),
  602.             'numero_nf' => htmlspecialchars($ordem->numero_nf ?? ''),
  603.             'valor' => "{$unidade_monetaria} " number_format(htmlspecialchars($ordem->valor ?? '0'), 2',''.'),
  604.             'etapa' => htmlspecialchars($ordem->etapa ?? ''),
  605.             'fk_id_emissor' => $ordem->fk_id_emissor htmlspecialchars((new SystemUser($ordem->fk_id_emissor))->name ?? '') : '',
  606.         ];
  607.     }
  608.         
  609.     private static function generateTableRows($ordens)
  610.     {
  611.         $rows "";
  612.         foreach ($ordens as $ordem)
  613.         {
  614.             $data self::prepareData($ordem);
  615.             $rows .= "
  616.                 <tr>
  617.                     <td>{$data['razao_social']}</td>
  618.                     <td>{$data['cnpj']}</td>
  619.                     <td>{$data['data_vencimento']}</td>
  620.                     <td>{$data['numero_nf']}</td>
  621.                     <td>{$data['valor']}</td>
  622.                     <td>{$data['etapa']}</td>
  623.                     <td>{$data['fk_id_emissor']}</td>
  624.                 </tr>";
  625.         }
  626.         return $rows;
  627.     }
  628.     private static function generateSummary($total)
  629.     {
  630.         return "
  631.             <section class='footer'>
  632.                 <ul class='summary-list'>
  633.                     <li>
  634.                         <span class='label'>Nº Total de Solicitações:</span>
  635.                         <span class='value'>{$total}</span>
  636.                     </li>                </ul>
  637.             </section>
  638.         ";
  639.     }
  640.     private static function ImageToDataUrl($filename)
  641.     {
  642.         if(!file_exists($filename))
  643.             throw new Exception('File not found.');
  644.         
  645.         $mime mime_content_type($filename);
  646.         if($mime === false
  647.             throw new Exception('Illegal MIME type.');
  648.     
  649.         $raw_data file_get_contents($filename);
  650.         if(empty($raw_data))
  651.             throw new Exception('File not readable or empty.');
  652.         
  653.         return "data:{$mime};base64," base64_encode($raw_data);
  654.     }
  655.     public static function generateHtml($ordens)
  656.     {
  657.         // Carrega o template HTML de um arquivo local.
  658.         $template file_get_contents('app/reports/relatorio2.html');
  659.         // Prepara os dados do cabeçalho e substitui os placeholders no template.
  660.         $headerData self::prepareDataHeader();
  661.         $placeholders = ['{$title}''{$subtitle}''{$subtitle2}'];
  662.         $headerValues = [$headerData['title'], $headerData['subtitle'], $headerData['subtitle2']];
  663.         $template str_replace($placeholders$headerValues$template);
  664.         // Gera as linhas da tabela com os dados das ordens e insere no template.
  665.         $items self::generateTableRows($ordens);
  666.         $template str_replace('<!-- [items] -->'$items$template);
  667.         // Conta o total de ordens e gera um resumo, inserindo-o no template.
  668.         $total count($ordens);
  669.         $summary self::generateSummary($total);
  670.         $template str_replace('<!-- [summary] -->'$summary$template);
  671.         $template str_replace('LOGO'self::ImageToDataUrl("app/images/portobay.png"), $template);
  672.         return $template;
  673.     }
  674.     public static function generatePdf($ordens)
  675.     {
  676.         $options = new Options();
  677.         $options->set('isHtml5ParserEnabled'true);
  678.         $options->set('isRemoteEnabled'true);
  679.         $dompdf = new Dompdf($options);
  680.         $total count($ordens);
  681.         $htmlContent "";
  682.         $htmlContent .= self::generateHtml($ordens);
  683.         $dompdf->loadHtml($htmlContent);
  684.         $dompdf->setPaper('A4''portrait');
  685.         $dompdf->render();
  686.         if (!is_dir('app/output/'))
  687.         {
  688.             mkdir('app/output/'0777true);
  689.         }
  690.         $fileName 'app/output/ordens_pagamento_' date('Y_m_d_H_i_s') . '.pdf';
  691.         file_put_contents($fileName$dompdf->output());
  692.         return $fileName;
  693.     }
  694.     private static function showPdf2($filePath)
  695.     {
  696.         $window TWindow::create('Ordem de Pagamento'0.80.8);
  697.         $object = new TElement('object');
  698.         $object->data  $filePath;
  699.         $object->type  'application/pdf';
  700.         $object->style "width: 100%; height:calc(100% - 10px)";
  701.         $window->add($object);
  702.         $window->show();
  703.     }
  704.     /**
  705.      * Cria os critérios de filtro e ordenação.
  706.      */
  707.     private static function createCriteria($filters$orderColumn$orderDirection$limit$userid$param)
  708.     {
  709.         $criteria = new TCriteria;
  710.         $criteria->setProperties($param);
  711.         $criteria->setProperty('order'$orderColumn);
  712.         $criteria->setProperty('direction'$orderDirection);
  713.         $criteria->setProperty('limit'$limit);
  714.         // Adiciona filtros da sessão, se houver
  715.         if ($filters)
  716.         {
  717.             foreach ($filters as $filter)
  718.             {
  719.                 $criteria->add($filter);
  720.             }
  721.         }
  722.         // Adiciona critérios de acesso e workflow
  723.         $criteria->add(HomeSolicitacao::getAccessCriteria($useridself::FORM_NUMBER 1));
  724.         $criteria->add(HomeSolicitacao::getWorkflowCriteria(self::FORM_NUMBER$userid));
  725.         return $criteria;
  726.     }
  727.     public static function onGenerateMultiple2($param)
  728.     {
  729.         $userid  TSession::getValue('userid');
  730.         $filters TSession::getValue('OrdemPagamentoPortobayConsulta_filters');
  731.         $limit   TSession::getValue('OrdemPagamentoPortobayConsulta_limit') ?? 10;
  732.         // Parâmetros de ordenação
  733.         $orderColumn    $param['column'] ?? 'id';
  734.         $orderDirection $param['direction'] ?? 'desc';
  735.         try 
  736.         {
  737.             // Inicia a transação com o banco de dados
  738.             TTransaction::open('permission');
  739.             $param $param ?? [];
  740.             // Repositório e critério
  741.             $repository = new TRepository('OrdemPagamentoPortobay');
  742.             $criteria   self::createCriteria($filters$orderColumn$orderDirection$limit$userid$param);
  743.             // Carrega os objetos de acordo com o critério
  744.             $ordens $repository->load($criteria);
  745.             if (!$ordens)
  746.             {
  747.                 throw new Exception('Nenhum registro encontrado.');
  748.             }
  749.             // Verifica se há solicitações selecionadas
  750.             $ordensSelecionadasIds TSession::getValue('solicitacoes_selecionadas');
  751.             // Se a sessão estiver vazia ou for um array vazio, usa os 10 registros carregados na página
  752.             if (empty($ordensSelecionadasIds))
  753.             {
  754.                 $ordensSelecionadas $ordens;  // Usa os registros carregados
  755.             }
  756.             else
  757.             {
  758.                 // Converte IDs para objetos, pois ele recebe IDs
  759.                 $ordensSelecionadas = [];
  760.                 foreach ($ordensSelecionadasIds as $id)
  761.                 {
  762.                     //pega a instância do objeto OrdemPagamentoPortoBayo necessário
  763.                     $ordem = new OrdemPagamentoPortobay($id);
  764.                     if (!empty($ordem))
  765.                     {
  766.                         $ordensSelecionadas[] = $ordem// pega o objeto fora do array
  767.                     }
  768.                 }
  769.             }
  770.             // Cria o PDF com todas as ordens selecionadas
  771.             $fileName self::generatePdf($ordensSelecionadas);
  772.             // Exibe o PDF gerado
  773.             self::showPdf2($fileName);
  774.             // Finaliza a transação
  775.             TTransaction::close();
  776.         } 
  777.         catch (Exception $e
  778.         {
  779.             new TMessage('error'$e->getMessage());
  780.             TTransaction::rollback();
  781.         }
  782.         // Limpa as solicitações selecionadas
  783.         TSession::setValue('solicitacoes_selecionadas', []);
  784.         TScript::create("
  785.             $('input[name^=\"check_select_\"]').each(function () {
  786.                     const key = $(this).val();
  787.                     $(this).prop('checked', false);
  788.                     console.log('desmarcando checkbox:', key);
  789.                 });
  790.         ");
  791.     }
  792.     /**
  793.      * Export datagrid as PDF
  794.      */
  795.     public function onExportPDF($param)
  796.     {
  797.         try {
  798.             $output 'app/output/' uniqid() . '.pdf';
  799.             $this->exportToPDF($output);
  800.             $window TWindow::create('Export'0.80.8);
  801.             $object = new TElement('object');
  802.             $object->{'data'}  = $output;
  803.             $object->{'type'}  = 'application/pdf';
  804.             $object->{'style'} = "width: 100%; height:calc(100% - 10px)";
  805.             $window->add($object);
  806.             $window->show();
  807.         } catch (Exception $e) {
  808.             new TMessage('error'$e->getMessage());
  809.         }
  810.     }
  811.     /**
  812.      * Export to PDF
  813.      * @param $output Output file
  814.      */
  815.     public function exportToPDF($output)
  816.     {
  817.         if ((!file_exists($output) && is_writable(dirname($output))) or is_writable($output)) {
  818.             $this->limit 0;
  819.             $this->datagrid->prepareForPrinting();
  820.             $this->onReload();
  821.             // string with HTML contents
  822.             $html = clone $this->datagrid;
  823.             $contents file_get_contents('app/resources/styles-print.html') . $html->getContents();
  824.             $options = new \Dompdf\Options();
  825.             $options->setChroot(getcwd());
  826.             // converts the HTML template into PDF
  827.             $dompdf = new \Dompdf\Dompdf($options);
  828.             $dompdf->loadHtml($contents);
  829.             $dompdf->setPaper('A4''landscape');
  830.             $dompdf->render();
  831.             // write and open file
  832.             file_put_contents($output$dompdf->output());
  833.         } else {
  834.             throw new Exception(AdiantiCoreTranslator::translate('Permission denied') . ': ' $output);
  835.         }
  836.     }
  837.     /**
  838.      * Export to CSV
  839.      */
  840.     public function onExportCSV($param)
  841.     {
  842.         try {
  843.             $output 'app/output/' uniqid() . '.csv';
  844.             $this->exportToCSV($output);
  845.             TPage::openFile($output);
  846.         } catch (Exception $e) {
  847.             return new TMessage('error'$e->getMessage());
  848.         }
  849.     }
  850.     /**
  851.      * Export to CSV
  852.      * @param $output Output file
  853.      */
  854.     public function exportToCSV($output)
  855.     {
  856.         if ((!file_exists($output) && is_writable(dirname($output))) or is_writable($output)) {
  857.             TTransaction::openFake($this->database);
  858.             // creates a criteria
  859.             $criteria = new TCriteria;
  860.             $userid TSession::getValue('userid');
  861.             $filters TSession::getValue('OrdemPagamentoPortobayConsulta_filters');
  862.             if ($filters != null) {
  863.                 foreach ($filters as $filtro) {
  864.                     $criteria->add($filtro);
  865.                 }
  866.             }
  867.             $criteria->add(HomeSolicitacao::getAccessCriteria($useridself::FORM_NUMBER 1));
  868.             // creates a repository for DadosDB
  869.             $repository = new TRepository('OrdemPagamentoPortobay');
  870.             // load the objects according to criteria
  871.             $objects $repository->load($criteriafalse);
  872.             $handler fopen($output'w');
  873.             $header = [
  874.                 'N° OP',
  875.                 'Razão Social',
  876.                 'Tipo Pessoa',
  877.                 'CPF/CNPJ',
  878.                 'Nota Fiscal',
  879.                 'Data de Vencimento',
  880.                 'Valor',
  881.                 'Módulo',
  882.                 'Status',
  883.                 'Status Nota',
  884.                 'Emissor',
  885.                 'Cadastrado em',
  886.             ];
  887.             
  888.             fputcsv($handler$header);
  889.             if ($objects) {
  890.                 $status = [1000 => 'Concluído'1001 => 'Reprovado'1002 => 'Reprovado'];
  891.                 $tipoPessoa = [=> 'Física'=> 'Jurídica'];
  892.                 foreach ($objects as $object) {
  893.                     $fluxo HomeSolicitacao::getFluxoByFormAndUser(
  894.                         self::FORM_NUMBER,
  895.                         $object->fluxo,
  896.                         $object->fk_id_emissor
  897.                     );
  898.                     $document "";
  899.                     if ($object->tipo_pessoa == && !empty($object->cpf)) {
  900.                         $document $object->cpf;
  901.                     } elseif ($object->tipo_pessoa == && !empty($object->cnpj)) {
  902.                         $document $object->cnpj;
  903.                     }
  904.                     $emissor = new SystemUser($object->fk_id_emissor);
  905.                     $row = [
  906.                         $object->id,
  907.                         $object->razao_social,
  908.                         $tipoPessoa[$object->tipo_pessoa],
  909.                         $document,
  910.                         $object->numero_nf,
  911.                         !empty($object->data_vencimento) ? date('d/m/Y'strtotime($object->data_vencimento)) : '',
  912.                         number_format($object->valor2',''.') . ' R$',
  913.                         $fluxo->nome,
  914.                         $status[$object->etapa_atual] ?? HomeSolicitacao::getCurrentStepLabel($fluxo$object->etapa_atual),
  915.                         $object->nota_enviada 'Enviada' 'Pendente',
  916.                         $emissor->name,
  917.                         !empty($object->data_cadastro) ? date('d/m/Y'strtotime($object->data_cadastro)) : '',
  918.                     ];
  919.                     fputcsv($handler$row);
  920.                 }
  921.             }
  922.             fclose($handler);
  923.             TTransaction::close();
  924.         } else {
  925.             throw new Exception(AdiantiCoreTranslator::translate('Permission denied') . ': ' $output);
  926.         }
  927.     }
  928.     /**
  929.      * Delete a record
  930.      */
  931.     public function Delete($param)
  932.     {
  933.         try {
  934.             $key $param['key']; // get the parameter $key
  935.             TTransaction::open('permission'); // open a transaction with database
  936.             $object = new OrdemPagamentoPortobay($key); // instantiates the Active Record
  937.             if ($object->fk_id_emissor != TSession::getValue('userid')) {
  938.                 TApplication::loadPage('OrdemPagamentoPortobayConsulta''showNotAllowed');
  939.                 return;
  940.             }
  941.             $anexos OrdemPagamentoPortobayArquivo::where('fk_id_ordem_pagamento''='$object->id)
  942.                 ->orderBy('id')->load();
  943.             if (!empty($anexos)) {
  944.                 foreach ($anexos as $documento) {
  945.                     if (file_exists($documento->documento) && is_file($documento->documento)) {
  946.                         unlink($documento->documento);
  947.                     }
  948.                     $documento->delete();
  949.                 }
  950.             }
  951.             $caminho "files/ordem_pagamento_portobay/" $object->id;
  952.             if (file_exists($caminho) && is_dir($caminho)) {
  953.                 rmdir($caminho);
  954.             }
  955.             $object->delete();
  956.             TTransaction::close(); // close the transaction
  957.             new TMessage('info'AdiantiCoreTranslator::translate('Record deleted')); // success message
  958.             $this->onReload($param); // reload the listing
  959.         } catch (Exception $e) {
  960.             new TMessage('error'$e->getMessage()); // shows the exception error message
  961.             TTransaction::rollback(); // undo all pending operations
  962.         }
  963.     }
  964.     public static function onMarkAsPending()
  965.     {
  966.         $solicitacoes TSession::getValue('solicitacoes_selecionadas');
  967.         if (!empty($solicitacoes)) {
  968.             try {
  969.                 TTransaction::open('permission');
  970.                 $userid TSession::getValue('userid');
  971.                 $dataAprovacao date('d/m/y H:i:s');
  972.                 foreach ($solicitacoes as $id) {
  973.                     OrdemPagamentoPortobay::where('id''='$id)
  974.                         ->set('nota_enviada''f')
  975.                         ->set('status_nota_modificado_por'$userid)
  976.                         ->set('status_nota_modificado_em'$dataAprovacao)
  977.                         ->update();
  978.                 }
  979.                 TSession::setValue('solicitacoes_selecionadas', []);
  980.                 TTransaction::close();
  981.                 AdiantiCoreApplication::loadPage('OrdemPagamentoPortobayConsulta''showMessagePendingReceipt');
  982.             } catch (Exception $e) {
  983.                 new TMessage('error'$e->getMessage());
  984.                 TTransaction::rollback();
  985.             }
  986.         } else {
  987.             new TMessage('error''Favor selecionar algum item na lista!');
  988.         }
  989.     }
  990.     public static function onMarkAsSent()
  991.     {
  992.         $solicitacoes TSession::getValue('solicitacoes_selecionadas');
  993.         if (!empty($solicitacoes)) {
  994.             try {
  995.                 TTransaction::open('permission');
  996.                 $userid TSession::getValue('userid');
  997.                 $dataAprovacao date('d/m/y H:i:s');
  998.                 foreach ($solicitacoes as $id) {
  999.                     OrdemPagamentoPortobay::where('id''='$id)
  1000.                         ->set('nota_enviada''t')
  1001.                         ->set('status_nota_modificado_por'$userid)
  1002.                         ->set('status_nota_modificado_em'$dataAprovacao)
  1003.                         ->update();
  1004.                 }
  1005.                 TSession::setValue('solicitacoes_selecionadas', []);
  1006.                 TTransaction::close();
  1007.                 AdiantiCoreApplication::loadPage('OrdemPagamentoPortobayConsulta''showMessageSentReceipt');
  1008.             } catch (Exception $e) {
  1009.                 new TMessage('error'$e->getMessage());
  1010.                 TTransaction::rollback();
  1011.             }
  1012.         } else {
  1013.             new TMessage('error''Favor selecionar algum item na lista!');
  1014.         }
  1015.     }
  1016.     function onClear()
  1017.     {
  1018.         // get the search form data
  1019.         $data $this->form->getData();
  1020.         TSession::setValue('OrdemPagamentoPortobayConsulta_filters',   null);
  1021.         TSession::setValue('solicitacoes_selecionadas', []);
  1022.         $data->id '';
  1023.         $data->razao_social '';
  1024.         $data->cnpj '';
  1025.         $data->cpf '';
  1026.         $data->centro_de_custo '';
  1027.         $data->conta_contabil '';
  1028.         $data->numero_nf '';
  1029.         $data->data_vencimento_ini '';
  1030.         $data->data_vencimento_fim '';
  1031.         $data->valor_ini '';
  1032.         $data->valor_fim '';
  1033.         $data->data_cadastro_ini '';
  1034.         $data->data_cadastro_fim '';
  1035.         $data->fk_id_emissor '';
  1036.         $data->etapa '';
  1037.         $data->fk_id_cadastro '';
  1038.         // fill the form with data again
  1039.         $this->form->setData($data);
  1040.         TSession::setValue('OrdemPagamentoPortobayConsulta_filter_data',   $data);
  1041.         $param = [];
  1042.         $param['offset']     = 0;
  1043.         $param['first_page'] = 1;
  1044.         $this->onReload($param);
  1045.     }
  1046.     /**
  1047.      * Função auxiliar para criar o filtro de etapa
  1048.      */
  1049.     private function createEtapaFilter($etapa)
  1050.     {
  1051.         if (strpos($etapa'-') !== false)
  1052.         {
  1053.             $parts explode('-'$etapa);
  1054.             $criteria = new TCriteria;
  1055.             $criteria->add(new TFilter('fluxo''='$parts[0]));
  1056.             $criteria->add(new TFilter('etapa_atual''='$parts[1]));
  1057.             return $criteria;
  1058.         }
  1059.         else
  1060.         {
  1061.             return new TFilter('etapa_atual''='"{$etapa}");
  1062.         }
  1063.     }
  1064.     /**
  1065.      * Register the filter in the session
  1066.      */
  1067.     public function onSearch($param NULL)
  1068.     {
  1069.         // Obtém os dados do formulário de busca
  1070.         $data $this->form->getData();
  1071.         // Limpa os filtros de sessão
  1072.         TSession::setValue('OrdemPagamentoPortobayConsulta_filters'NULL);
  1073.         $filters = [];
  1074.         // Mapeamento de campos e seus operadores
  1075.         $fields = [
  1076.             'id'                    => ['field' => 'id',                'operator' => '=',      'value' => $data->id],
  1077.             'razao_social'          => ['field' => 'razao_social',      'operator' => 'ilike',  'value' => $data->razao_social],
  1078.             'cnpj'                  => ['field' => 'cnpj',              'operator' => 'ilike',  'value' => $data->cnpj],
  1079.             'cpf'                   => ['field' => 'cpf',               'operator' => 'ilike',  'value' => $data->cpf],
  1080.             'centro_de_custo'       => ['field' => 'centro_de_custo',   'operator' => 'ilike',  'value' => $data->centro_de_custo],
  1081.             'conta_contabil'        => ['field' => 'conta_contabil',    'operator' => '=',      'value' => $data->conta_contabil],
  1082.             'numero_nf'             => ['field' => 'numero_nf',         'operator' => '=',      'value' => $data->numero_nf],
  1083.             'data_vencimento_ini'   => ['field' => 'data_vencimento',   'operator' => '>=',     'value' => $data->data_vencimento_ini],
  1084.             'data_vencimento_fim'   => ['field' => 'data_vencimento',   'operator' => '<=',     'value' => $data->data_vencimento_fim],
  1085.             'valor_ini'             => ['field' => 'valor',             'operator' => '>=',     'value' => $data->valor_ini],
  1086.             'valor_fim'             => ['field' => 'valor',             'operator' => '<=',     'value' => $data->valor_fim],
  1087.             'data_cadastro_ini'     => ['field' => 'data_cadastro',     'operator' => '>=',     'value' => $data->data_cadastro_ini],
  1088.             'data_cadastro_fim'     => ['field' => 'data_cadastro',     'operator' => '<=',     'value' => $data->data_cadastro_fim],
  1089.         ];
  1090.         // Adiciona filtros a partir do array de campos
  1091.         foreach ($fields as $field => $config)
  1092.         {
  1093.             if (isset($config['value']) && $config['value'] !== '')
  1094.             {
  1095.                 $value $config['operator'] == 'ilike' "%{$config['value']}%" "{$config['value']}";
  1096.                 $filters[] = new TFilter($config['field'], $config['operator'], $value);
  1097.             }
  1098.         }
  1099.         // Filtro de etapa
  1100.         if (isset($data->etapa) && strlen(trim($data->etapa)) > 0)
  1101.         {
  1102.             $filters[] = $this->createEtapaFilter($data->etapa);
  1103.         }
  1104.         // Filtros com valores múltiplos
  1105.         if (!empty($data->fk_id_emissor))
  1106.         {
  1107.             $filters[] = new TFilter('fk_id_emissor''IN'$data->fk_id_emissor);
  1108.         }
  1109.         if (!empty($data->fk_id_cadastro))
  1110.         {
  1111.             $modulos implode(','$data->fk_id_cadastro);
  1112.             $filters[] = new TFilter('fluxo''IN'"(SELECT fluxo FROM solicitacao.cadastro_etapas WHERE id IN ({$modulos}))");
  1113.         }
  1114.         // Define os filtros na sessão
  1115.         TSession::setValue('OrdemPagamentoPortobayConsulta_filters'$filters);
  1116.         // Preenche novamente o formulário com os dados
  1117.         $this->form->setData($data);
  1118.         // Armazena os dados de busca na sessão
  1119.         TSession::setValue('OrdemPagamentoPortobayConsulta_filter_data'$data);
  1120.         // Recarrega a lista com os novos parâmetros
  1121.         $param = [];
  1122.         $param['offset'] = 0;
  1123.         $param['first_page'] = 1;
  1124.         $this->onReload($param);
  1125.     }
  1126.     /**
  1127.      * Load the datagrid with data
  1128.      */
  1129.     public function onReload($param NULL)
  1130.     {
  1131.         $userid  TSession::getValue('userid');
  1132.         $filters TSession::getValue('OrdemPagamentoPortobayConsulta_filters');
  1133.         $limit   TSession::getValue('OrdemPagamentoPortobayConsulta_limit') ?? 10;
  1134.         
  1135.         // Parâmetros de ordenação
  1136.         $orderColumn    $param['column'] ?? 'id';
  1137.         $orderDirection $param['direction'] ?? 'desc';
  1138.         try
  1139.         {
  1140.             // Inicia uma transação com o banco de dados 'permission'
  1141.             TTransaction::open('permission');
  1142.             $documentosSelecionados TSession::getValue('solicitacoes_selecionadas');
  1143.             $param $param ?? [];
  1144.             // Cria um repositório para OrdemPagamentoPortobay
  1145.             $repository = new TRepository('OrdemPagamentoPortobay');
  1146.             // Cria os critérios de pesquisa
  1147.             $criteria self::createCriteria($filters$orderColumn$orderDirection$limit$userid$param);
  1148.             // Carrega os objetos de acordo com os critérios
  1149.             $objects $repository->load($criteriafalse);
  1150.             if (is_callable($this->transformCallback))
  1151.             {
  1152.                 call_user_func($this->transformCallback$objects$param);
  1153.             }
  1154.             $this->datagrid->clear();
  1155.             if ($objects)
  1156.             {
  1157.                 // Verifica se o usuário tem permissão no grupo Financeiro
  1158.                 $isFinanceiro SystemUserGroup::where('system_user_id''='$userid)
  1159.             ->where('system_group_id''IN'"(SELECT id FROM permission.system_group WHERE name ILIKE '%Financeiro%Master%Portobay%')")
  1160.             ->count() > 0;
  1161.                 $status = [1000 => 'Concluído'1001 => 'Reprovado'1002 => 'Reprovado'];
  1162.                 $label = [1000 => 'success'1001 => 'danger'1002 => 'danger'];
  1163.                 $data = new stdClass;
  1164.                 // Itera sobre a coleção de registros
  1165.                 foreach ($objects as $object)
  1166.                 {
  1167.                     $fluxo HomeSolicitacao::getFluxoByFormAndUser(
  1168.                         self::FORM_NUMBER,
  1169.                         $object->fluxo,
  1170.                         $object->fk_id_emissor
  1171.                     );
  1172.                     $idSelected $object->id;
  1173.                     $chave_select "validado_{$idSelected}";
  1174.                     $id_checkGroup "check_select_{$idSelected}";
  1175.                     // Cria o grupo de checkboxes
  1176.                     $object->select = new TCheckGroup($id_checkGroup);
  1177.                     
  1178.                     // A linha abaixo foi removida para evitar a atribuição manual de IDs duplicados
  1179.                     //$object->select->id = $chave_select;
  1180.                     $object->select->addItems(array($idSelected => ''));
  1181.                     $object->select->setChangeAction(new TAction([$this'onSelecionados']));
  1182.                     $this->form->addField($object->select);
  1183.                     if (!empty($documentosSelecionados) && in_array($object->id$documentosSelecionados))
  1184.                     {
  1185.                         $data->{$id_checkGroup} = [$idSelected];
  1186.                     }
  1187.                     // Ajusta o CNPJ/CPF dependendo do tipo de pessoa
  1188.                     $object->cnpj = ($object->tipo_pessoa == && !empty($object->cpf)) ? $object->cpf $object->cnpj;
  1189.                     $emissor = new SystemUser($object->fk_id_emissor);
  1190.                     $object->can_edit $object->etapa_atual == 1001 && $userid == $object->fk_id_emissor;
  1191.                     $object->can_edit_financeiro $isFinanceiro;
  1192.                     $object->can_generate $object->etapa_atual == 1000;
  1193.                     $object->can_delete $userid == $object->fk_id_emissor;
  1194.                     // Cria os links para exibição
  1195.                     $tipoPessoa = [=> 'Física'=> 'Jurídica'];
  1196.                     $object->razao_social self::createLink($object->razao_social$object->id);
  1197.                     $object->cnpj self::createLink(empty($object->cnpj) ? '-' $object->cnpj$object->id);
  1198.                     $object->numero_nf self::createLink($object->numero_nf$object->id);
  1199.                     $object->data_vencimento self::createLink(!empty($object->data_vencimento) ? date('d/m/Y'strtotime($object->data_vencimento)) : ''$object->id);
  1200.                     $object->fk_id_emissor self::createLink($emissor->name$object->id);
  1201.                     $object->data_cadastro self::createLink(!empty($object->data_cadastro) ? date('d/m/Y'strtotime($object->data_cadastro)) : ''$object->id);
  1202.                     $object->tipo self::createLink($fluxo->nome$object->id);
  1203.                     $object->tipo_pessoa self::createLink(!empty($object->tipo_pessoa)  ? $tipoPessoa[$object->tipo_pessoa] : 'Indefinido'$object->id);
  1204.                     // Adiciona os labels de status e nota enviada
  1205.                     $div = new TElement('span');
  1206.                     $div->class "label label-" . ($label[$object->etapa_atual] ?? "info");
  1207.                     $div->style "text-shadow:none; font-size:12px";
  1208.                     $div->add($status[$object->etapa_atual] ?? HomeSolicitacao::getCurrentStepLabel($fluxo$object->etapa_atual));  
  1209.                     $object->etapa $div;
  1210.                     $div = new TElement('span');
  1211.                     $div->class "label label-" . ($object->nota_enviada 'success' 'danger');
  1212.                     $div->style "text-shadow:none; font-size:12px; font-weight:lighter";
  1213.                     $div->add($object->nota_enviada 'Enviada' 'Pendente');
  1214.                     $object->nota_enviada $div;
  1215.                     // Adiciona o objeto ao datagrid
  1216.                     $this->datagrid->addItem($object);
  1217.                 }
  1218.                 $this->form->setData($data);
  1219.             }
  1220.             // Conta os registros
  1221.             $criteria->resetProperties();
  1222.             $count $repository->count($criteria);
  1223.             $this->pageNavigation->setCount($count);
  1224.             $this->pageNavigation->setProperties($param);
  1225.             $this->pageNavigation->setLimit($limit);
  1226.             // Fecha a transação
  1227.             TTransaction::close();
  1228.             $this->loaded true;
  1229.         }
  1230.         catch (Exception $e)
  1231.         {
  1232.             // Mostra a mensagem de erro
  1233.             new TMessage('error'$e->getMessage());
  1234.             // Desfaz as operações pendentes
  1235.             TTransaction::rollback();
  1236.         }
  1237.     }
  1238.     public static function createLink($text$id)
  1239.     {
  1240.         return TElement::tag(
  1241.             'a',
  1242.             $text,
  1243.             [
  1244.                 'href ' => (new TAction(['OrdemPagamentoPortobayView''onViewFromConsulta'], ['id' => $id'key' => $id]))->serialize(),
  1245.                 'generator' => 'adianti',
  1246.                 'style' => 'color: #212529;'
  1247.             ]
  1248.         );
  1249.     }
  1250.     /**
  1251.      * method show()
  1252.      * Shows the page
  1253.      */
  1254.     public function show()
  1255.     {
  1256.         // check if the datagrid is already loaded
  1257.         if (!$this->loaded and (!isset($_GET['method']) or !(in_array($_GET['method'],  array('onEnter''onReload''onSearch''onClear''Delete''showMessageReenviado''showNotAllowed''showNotFound''showNotAllowedCreate''showMessagePendingReceipt''showMessageSentReceipt'))))) {
  1258.             if (func_num_args() > 0) {
  1259.                 $this->onReload(func_get_arg(0));
  1260.             } else {
  1261.                 $this->onReload();
  1262.             }
  1263.         }
  1264.         $this->loaded true;
  1265.         parent::show();
  1266.     }
  1267.     function showMessageEnviado()
  1268.     {
  1269.         new TMessage('info''Ordem de pagamento Portobay foi enviada!');
  1270.         TSession::setValue('propostas_selecionadas', []);
  1271.         $this->onReload();
  1272.     }
  1273.     function showMessageReenviado()
  1274.     {
  1275.         new TMessage('info''Ordem de pagamento Portobay foi reenviada!');
  1276.         TSession::setValue('propostas_selecionadas', []);
  1277.         $this->onReload();
  1278.     }
  1279.     function showMessagePendingReceipt()
  1280.     {
  1281.         new TMessage('info''Ordens de Pagamento Portobay atualizadas como pendente nota com sucesso!');
  1282.         $this->onReload();
  1283.     }
  1284.     function showMessageSentReceipt()
  1285.     {
  1286.         new TMessage('info''Ordens de Pagamento Portobay atualizadas como nota enviada com sucesso!');
  1287.         $this->onReload();
  1288.     }
  1289.     function showNotAllowed()
  1290.     {
  1291.         new TMessage('error''Você não tem permissão para editar/remover esta proposta!');
  1292.         $this->onReload();
  1293.     }
  1294.     function showNotAllowedCreate()
  1295.     {
  1296.         new TMessage('error''Você não tem permissão para abrir propostas!');
  1297.         $this->onReload();
  1298.     }
  1299.     function showNotFound()
  1300.     {
  1301.         new TMessage('error''Proposta não encontrada!');
  1302.         $this->onReload();
  1303.     }
  1304. }
  1305. ?>


Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (2)


LS

Antes eu estava fazendo a chamada do JS dessa maneira
  1. <?php
  2. TScript::create("
  3.             function selectAll(el) {
  4.                 $('input[name^=\"check_select_\"]').each(function () {
  5.                     $(this).prop('checked', !el.checked);
  6.                     $(this).click();
  7.                 });
  8.             }
  9.             $(document).ready(function(){
  10.                 $('#datagrid_list').parent().parent().addClass('margin_bottom_120');
  11.             });
  12.         ");
  13. public static function onSelecionados($param)
  14.     {
  15.         $documentosSelecionados TSession::getValue('solicitacoes_selecionadas');
  16.         if (empty($documentosSelecionados)) {
  17.             $documentosSelecionados = [];
  18.         }
  19.         $key $param['key'];
  20.         $chave array_search($key$documentosSelecionados);
  21.         if ($chave !== false)
  22.         {
  23.             unset($documentosSelecionados[$chave]);
  24.         }
  25.         else
  26.         {
  27.             $documentosSelecionados[] = $key;
  28.         }
  29.         echo "<pre>"print_r($documentosSelecionados); echo "</pre>";
  30.         TSession::setValue('solicitacoes_selecionadas'$documentosSelecionados);
  31.     }
  32. ?>


O problema era quando clicava no botão para selecionar todos e ele nunca retornava os valores corretos.
Se algum de vocês puderem me ajudar
PD

Lucas,

Evita postar tanto código. Dificilmente alguém irá conseguir ajudar por que não irá conseguir simular (rodar o mesmo código) localmente. Foque as dúvidas relativas ao Framework, não à código javascript em si, visto que este espaço é exclusivo para dúvidas do framework.