From b7f943f1a0eacc636df1d53dbca925941f801af2 Mon Sep 17 00:00:00 2001 From: Lucas Awade Date: Wed, 27 Sep 2023 12:14:39 +0000 Subject: [PATCH] =?UTF-8?q?corre=C3=A7=C3=B5es=20de=20realtorios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cadastros/motivosPausa/motivosPausaDelete.php | 13 +- cadastros/motivosPausa/motivosPausaSelect.php | 7 +- cadastros/pesquisa/pesquisaFuncoes.php | 2 +- relatorios/callcenter/geral/rechamadas.php | 2 +- .../callcenter/geral/relMsgWhatsapp.php | 305 ------------------ .../geral/relMsgWhatsappDetalhado.php | 294 ----------------- scriptApl/functions15.js | 2 +- templates/seguranca/trocaSenha.tpl | 2 +- 8 files changed, 22 insertions(+), 605 deletions(-) delete mode 100644 relatorios/callcenter/geral/relMsgWhatsapp.php delete mode 100644 relatorios/callcenter/geral/relMsgWhatsappDetalhado.php diff --git a/cadastros/motivosPausa/motivosPausaDelete.php b/cadastros/motivosPausa/motivosPausaDelete.php index 95c222b1..6def6400 100644 --- a/cadastros/motivosPausa/motivosPausaDelete.php +++ b/cadastros/motivosPausa/motivosPausaDelete.php @@ -13,6 +13,17 @@ $query = "select count(*) from pbx_eventos_agentes where id_motivo_pausa = $id"; $result = pg_query($dbcon, $query); +$query1 = "SELECT * FROM pbx_motivos_pausas WHERE id = $id;"; +$result1 = pg_query($dbcon, $query1); +$res = pg_fetch_assoc($result1); + +if($id && $res['flag'] == 0){ + $query = "update pbx_motivos_pausas set flag = '1' where id = $id"; + $result = pg_query($dbcon, $query); + echo "OK; Registro foi ativado."; + return; +} + if ($result) { // Verifica se existem usuário incluidos neste grupo $row = @pg_fetch_row($result); @@ -36,7 +47,7 @@ if ($result) { echo "ERRO; Não é possível excluir este registro! Erro: " . pg_last_error(); } } else { - echo "ERRO; Não é possível excluir o registro, o mesmo está sendo utilizado para auditorias! O registro será desativado."; + echo "OK; Não é possível excluir o registro, o mesmo está sendo utilizado para auditorias! O registro será desativado."; $query = "update pbx_motivos_pausas set flag = '0' where id = $id"; $result = pg_query($dbcon, $query); } diff --git a/cadastros/motivosPausa/motivosPausaSelect.php b/cadastros/motivosPausa/motivosPausaSelect.php index 9cb55353..c8a04ba8 100644 --- a/cadastros/motivosPausa/motivosPausaSelect.php +++ b/cadastros/motivosPausa/motivosPausaSelect.php @@ -57,7 +57,12 @@ while (($result) && ($dados = @pg_fetch_array($result))) { $imgEdit = GetLinkFormUpdate("&id=$id", "updMotivosPausa"); $status = $dados["flag"] ? $imgYes : $imgNo; - $delete = GetLinkFormDelete($id . '|' . $params, 'DeltetaMotivoPausa'); + if($dados["flag"] == 0){ + $delete = ""; + } else { + $delete = GetLinkFormDelete($id . '|' . $params, 'DeltetaMotivoPausa'); + } + SetDimensoes(610, 275); $pausaGrupo = " $imgPausaGrupo"; $pausaGrupo = UsePausaGrupo() ? "$pausaGrupo" : ""; diff --git a/cadastros/pesquisa/pesquisaFuncoes.php b/cadastros/pesquisa/pesquisaFuncoes.php index 44c83903..fa004fbf 100644 --- a/cadastros/pesquisa/pesquisaFuncoes.php +++ b/cadastros/pesquisa/pesquisaFuncoes.php @@ -66,7 +66,7 @@ function GetPesquisaDac($db, $idDac) { return $ret; } -function GetPesquisaAgente($db, $plId, $matricula, $idDac, $dtIni, $dtFim, $incTodos) { +function GetPesquisaAgente($db, $plId, $matricula, $idDac, $dtIni, $dtFim, $incTodos = 0) { $ret = ""; $sel = ""; $dataIni = soNumero($dtIni) == "" ? "null" : "'$dtIni'"; diff --git a/relatorios/callcenter/geral/rechamadas.php b/relatorios/callcenter/geral/rechamadas.php index 3882a070..cdfe7cb5 100644 --- a/relatorios/callcenter/geral/rechamadas.php +++ b/relatorios/callcenter/geral/rechamadas.php @@ -101,7 +101,7 @@ class RelRechamadas extends Relatorios { protected function ___GetDadosDb() { $dataIni = FormatDtMssql($this->___dataIni); - $dataFim = FormatDtHoraBD($this->___dataFim); + $dataFim = FormatDtMssql($this->___dataFim); $dac = $this->___dac; $srv = $this->___servico; $origem = soNumero($this->___origem); diff --git a/relatorios/callcenter/geral/relMsgWhatsapp.php b/relatorios/callcenter/geral/relMsgWhatsapp.php deleted file mode 100644 index 1fa17fd6..00000000 --- a/relatorios/callcenter/geral/relMsgWhatsapp.php +++ /dev/null @@ -1,305 +0,0 @@ -___agente = isset($_POST['agente']) ? $_POST['agente'] : ''; - $this->___fila = isset($_POST['fila']) ? $_POST['fila'] : ''; - } - - function ___FiltrosRelatorio() { - $agente = $this->getAgente($this->___agente); - if ($this->___media != MEDIA_PRINT_GRID) { - /* - * Recupera os filtros da sessão do usuário. - */ - list($this->___dataIni, $this->___dataFim, $this->___tipoRelatorio) = $_SESSION["SSstorageFiltros"]; - - if ($this->___media == MEDIA_PRINT_HTML) { - $fila = $this->GetIncDac() ? 'Fila: ' . GetDacDesc($this->GetDbCon(), $this->GetIdProg() . ' ') : ''; - return sprintf("%sData Inicial: %s Data Final: %s Tipo: %s", $fila, $this->___dataIni, $this->___dataFim, ($this->___tipoRelatorio ? 'Analítico' : 'Sintético')); - } - - $fltCsv = array(); - if ($this->GetIncDac()) { - $fltCsv[] = 'Fila:' . GetDacDesc($this->GetDbCon(), $this->___dac); - } - $fltCsv[] = "Data Inicial:" . $this->___dataIni; - $fltCsv[] = "Data Final:" . $this->___dataFim; - $fltCsv[] = "Data Emissao:" . date('d/m/Y H:i:s'); - $fltCsv[] = "Emitido Por:" . GetLogin(); - return $fltCsv; - } - - if ($this->GetIncDac()) { - $dacs = GetDac($this->GetDbCon(), $this->___dac, "", 0, 1, 0, 0, 1); - } - - $lkPrint = ""; - if ($this->___dataCount) { - $prt = 'Clique aqui para imprimir!'; - //$prtHtml = "\"Clique"; - $lkPrint .= sprintf($prtHtml, $this->GetidProg(), MEDIA_PRINT_HTML, $this->___tipoRelatorio, substr(LimpaString(GetDispProgSel($this->GetIdProg())), 0, 20), 'print.gif'); - //$lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_EXCEL, $this->___tipoRelatorio, 'prt-xls.png'); - // $lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_PDF, $this->___tipoRelatorio, 'prt-pdf.png'); - //$lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_CSV, $this->___tipoRelatorio, 'prt-csv.png'); - } - - // $tipoRel = !$this->___tipoRelatorio ? '' : 'checked="checked"'; - /* - * Personalise esta função se necessitar de outras op��es de filtro. - */ - $filtro = ''; - /* - * Rotulos. - */ - $filtro .= ''; - $filtro .= ''; - $filtro .= ''; - $filtro .= ''; - $filtro .= ''; - $filtro .= ''; - $filtro .= ''; - - /* - * Valores. - */ - $filtro .= ''; - $filtro .= sprintf('', $this->getDac($this->___fila)); - $filtro .= ''; - $filtro .= ''; - $filtro .= sprintf('', $agente); - $filtro .= ''; - $filtro .= ''; - $filtro .= ''; - $filtro .= '
FilaData InicialData Final Agente 
%s%s%s
'; - - /* - * Guarda os filtros passados para recuperar na emissão dos relatóios para impressão. - */ - $_SESSION["SSstorageFiltros"] = array($this->___dataIni, $this->___dataFim, $this->___tipoRelatorio); - - return sprintf($filtro, $this->___dataIni, $this->___dataFim, $lkPrint); - } - - protected function ___GetDadosDb() { - $dataIni = FormatDtMssql($this->___dataIni); - $dataFim = FormatDtMssql($this->___dataFim); - $agente = $this->___agente; - $fila = $this->___fila; - - $query = "SELECT DISTINCT a.uniqueid, cliente_id, fila, a.nome, a.matricula, evento, a.data_reg, a.context - FROM md_atendimento a - INNER JOIN md_evento b ON a.uniqueid = b.uniqueid - INNER JOIN pbx_usuarios c ON c.matricula = b.matricula - INNER JOIN pbx_queues_grupos d ON d.nome = b.fila - WHERE a.data_reg::DATE >= '$dataIni' AND a.data_reg::DATE <= '$dataFim' - AND evento = 'START' "; - - if ($agente) { - $query .= " AND a.nome = '$agente' "; - } - - if ($fila) { - $query .= " AND b.fila = '$fila' "; - } - - $query .= " ORDER BY a.data_reg"; - - $result = $this->___GetQuery($query); - $row = pg_fetch_all($result); - - if (!$agente && !$fila) { - $_SESSION['SSDataWPP'] = $row; - } - - $this->SetData($row ? $row : array()); - - $queryDac = "SELECT * FROM pbx_queues_grupos WHERE midiafila = 'S';"; - $resultDac = $this->___GetQuery($queryDac); - $rowDac = pg_fetch_all($resultDac); - $this->SetData($rowDac ? $rowDac : array()); - } - - protected function ___PreparaCsv() { - - } - - protected function ___PreparaExcel() { - - } - - protected function ___PreparaGrid() { - $dataRel = array(); - $dadosCabecalio = array( - 'Data/Hora' => 'align="center"', - 'Origem' => 'align="center"', - 'Matricula' => 'align="center"', - 'Fila' => 'align=center', - 'Perfil' => 'align=center', - 'Plataforma' => 'align=center', - 'Status' => 'align=center', - 'Visualizar' => 'align=center' - ); - $dadosField = array( - 'data_reg' => 'align="center"', - 'cliente_id' => 'align="center"', - 'matricula' => 'align="center"', - 'fila' => 'align="center"', - 'nome' => 'align="center"', - 'context' => 'align=center', - 'evento' => 'align="center"', - 'detalhes' => 'align=center' - ); - - /* - * Inicia o relatório. - */ - $dataRel[] = ''; - - /* - * Monta a linha de cabecalio. - */ - - $linha = ''; - $linha .= ""; - $linha .= ""; - $dataRel[] = $linha; - - /* - * Verifica se retornou dados - */ - if (!IsPostBack() || !count($this->GetData()[0])) { - $dataRel[] = sprintf("
Atendimento WhatsApp
%s
", count($dadosCabecalio), (!IsPostBack() ? 'Informe os parametros e clique em consultar!' : 'Nenhum registro encontado!')); - $this->___dataRel[] = $dataRel; - return; - } - - $linhaC = ""; - foreach ($dadosCabecalio as $key => $value) { - $linhaC .= sprintf("%s", $value, $key); - } - $linhaC .= ""; - $dataRel[] = $linhaC; - - /* - * Linhas de dados. - */ - $count = 0; - $imgrel = "\"Detalhes"; - foreach ($this->GetData()[0] as $row) { - $count++; - $linkRel = sprintf("%s", base64_encode($row['uniqueid']), $imgrel); - $row['data_reg'] = date('d/m/Y H:i:s', strtotime($row['data_reg'])); - $row['detalhes'] = $linkRel; - $row['nome'] = utf8_decode($row['nome']); - $row['context'] = strtoupper($row['context']); - // Formata linha de dados. - $linha = ""; - foreach ($dadosField as $key => $value) { - $linha .= sprintf("%s", $value, $row["$key"]); - } - $linha .= ""; - $dataRel[] = $linha; - } - $dataRel[] = "Total: {$count}"; - $dataRel[] = ''; - $this->___dataRel[] = $dataRel; - } - - protected function ___PreparaHtml() { - - } - - protected function ___PreparaPdf() { - - } - - private function getAgente($select = null) { - $agentes = array(); - - foreach ($_SESSION['SSDataWPP'] as $agente) { - if (!in_array($agente['nome'], $agentes)) { - array_push($agentes, $agente['nome']); - } - } - - $opt = ""; - return $opt; - } - - private function getDac($select = null) { - $filas = array(); - - foreach ($this->GetData()[1] as $fila) { - if (!in_array($fila['nome'], $filas)) { - array_push($filas, $fila['nome']); - } - } - - $opt = ""; - return $filas ? $opt : null; - } - - public function ExecutaRelatorio() { - global $jsStartup, $jsJQuery, $smarty; - try { - - /* - * Use esta função para validar dados do formulário. - */ - $this->___ValidaForm(); - - /* - * Recupera os dados do banco. - */ - $this->___ConteudoRelatorio(); - - /* - * Imprime relatório de acordo com a media passada. - */ - $conteudoRelatorio = $this->___ImprimeRelatorio(); - } catch (Exception $exc) { - $this->SetMsg($exc->getMessage()); - $jsStartup[] = sprintf("alert('%s');", $this->GetMsg()); - $this->___GravaLog(); - } - - $jsJQuery[] = "\$('#dataIni').keypress(function(){formataDataHora(this);}) "; - $jsJQuery[] = "\$('#dataFim').keypress(function(){formataDataHora(this);}) "; - - $smarty->assign('filtros', $this->___FiltrosRelatorio()); - $smarty->assign('conteudo', $conteudoRelatorio); - $smarty->assign('msg', $this->GetMsg()); - GetTemplate($smarty, 'relatoriosGrid.tpl'); - } - - } - - $relMsgWhatsapp = new RelMsgWhatsapp($idProg, $dbcon, 0); - $relMsgWhatsapp->ExecutaRelatorio(); -?> \ No newline at end of file diff --git a/relatorios/callcenter/geral/relMsgWhatsappDetalhado.php b/relatorios/callcenter/geral/relMsgWhatsappDetalhado.php deleted file mode 100644 index a34edd9f..00000000 --- a/relatorios/callcenter/geral/relMsgWhatsappDetalhado.php +++ /dev/null @@ -1,294 +0,0 @@ -___uid = isset($_GET['uid']) ? base64_decode($_GET['uid']) : ''; - } - - function ___FiltrosRelatorio() { - if ($this->___media != MEDIA_PRINT_GRID) { - /* - * Recupera os filtros da sessão do usuário. - */ - list($this->___dataIni, $this->___dataFim, $this->___tipoRelatorio) = $_SESSION["SSstorageFiltros"]; - - if ($this->___media == MEDIA_PRINT_HTML) { - $fila = $this->GetIncDac() ? 'Fila: ' . GetDacDesc($this->GetDbCon(), $this->GetIdProg() . ' ') : ''; - return sprintf("%sData Inicial: %s Data Final: %s Tipo: %s", $fila, $this->___dataIni, $this->___dataFim, ($this->___tipoRelatorio ? 'Analítico' : 'Sintético')); - } - - $fltCsv = array(); - if ($this->GetIncDac()) { - $fltCsv[] = 'Fila:' . GetDacDesc($this->GetDbCon(), $this->___dac); - } - $fltCsv[] = "Data Inicial:" . $this->___dataIni; - $fltCsv[] = "Data Final:" . $this->___dataFim; - $fltCsv[] = "Data Emissao:" . date('d/m/Y H:i:s'); - $fltCsv[] = "Emitido Por:" . GetLogin(); - return $fltCsv; - } - - if ($this->GetIncDac()) { - $dacs = GetDac($this->GetDbCon(), $this->___dac, "", 0, 1, 0, 0, 1); - } - - $lkPrint = ""; - if ($this->___dataCount) { - $prt = 'Clique aqui para imprimir!'; - //$prtHtml = "\"Clique"; - $lkPrint .= sprintf($prtHtml, $this->GetidProg(), MEDIA_PRINT_HTML, $this->___tipoRelatorio, substr(LimpaString(GetDispProgSel($this->GetIdProg())), 0, 20), 'print.gif'); - $lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_EXCEL, $this->___tipoRelatorio, 'prt-xls.png'); - // $lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_PDF, $this->___tipoRelatorio, 'prt-pdf.png'); - //$lkPrint .= sprintf($prt, $this->GetidProg(), MEDIA_PRINT_CSV, $this->___tipoRelatorio, 'prt-csv.png'); - } - - // $tipoRel = !$this->___tipoRelatorio ? '' : 'checked="checked"'; - /* - * Personalise esta função se necessitar de outras op��es de filtro. - */ - $filtro = ''; - /* - * Rotulos. - */ - $filtro .= ''; - $filtro .= ''; - $filtro .= ''; - $filtro .= ''; - $filtro .= ''; - - /* - * Valores. - */ - $filtro .= ''; - $filtro .= ''; - $filtro .= ''; - $filtro .= ''; - $filtro .= '
Data Inicial Data Final  

%s

'; - $filtro .= '

%s

%s
'; - - /* - * Guarda os filtros passados para recuperar na emissão dos relatóios para impressão. - */ - $_SESSION["SSstorageFiltros"] = array($this->___dataIni, $this->___dataFim, $this->___tipoRelatorio); - - return sprintf($filtro, $this->___dataIni, $this->___dataFim, $lkPrint); - } - - protected function ___GetDadosDb() { - $uid = $this->___uid; - - $query = "SELECT * FROM md_message WHERE uniqueid = '$uid' ORDER BY id"; - - $result = $this->___GetQuery($query); - $row = pg_fetch_all($result); - $this->SetData($row ? $row : array()); - } - - protected function ___PreparaCsv() { - - } - - protected function ___PreparaExcel() { - $dataRel = array(); - $filtro = $this->___FiltrosRelatorio(); - - /* - * Inicia o relatório. - */ - - /* - * Cria os filtros - */ - $linha = array('LABEL'); - foreach ($filtro as $values) { - list($label, $value) = explode(":", $values); - $linha[] = $label; - } - $dataRel[] = $linha; - - $linha = array('DADOS'); - foreach ($filtro as $values) { - list($label, $value) = explode(":", $values); - $linha[] = $value; - } - - $dataRel[] = $linha; - - $dadosCabecalio = array( - 'Data/Hora', - 'Autor', - 'Origem', - 'Destino', - 'Tipo', - 'Mensagem' - ); - $dadosField = array( - 'msg_date', - 'profile_name', - 'src', - 'dst', - 'type', - 'content' - ); - - - /* - * Monta a linha de cabecalio. - */ - $linha = array('LABEL'); - foreach ($dadosCabecalio as $value) { - $linha[] = $value; - } - $dataRel[] = $linha; - - /* - * Linhas de dados. - */ - $count = 0; - foreach ($this->GetData()[0] as $row) { - $count++; - $row['msg_date'] = date('d/m/Y H:i:s', strtotime($row['msg_date'])); - //$row['content'] = $this->decrypt($row['content']); - - // Formata linha de dados. - $linha = array('DADOS'); - foreach ($dadosField as $key) { - $linha[] = $row["$key"]; - } - $dataRel[] = $linha; - } - $dataRel[] = array('LABEL', 'Total Mensagens: ' . $count, '', '',''); - $this->___dataRel[] = $dataRel; - - } - - protected function ___PreparaGrid() { - $dataRel = array(); - $dadosCabecalio = array( - 'Data/Hora' => 'align="center"', - 'Autor' => 'align="center"', - 'Origem' => 'align="center"', - 'Destino' => 'align="center"', - 'Tipo' => 'align="center"', - 'Mensagem' => 'align=center' - ); - $dadosField = array( - 'msg_date' => 'align="center"', - 'profile_name' => 'align="center"', - 'src' => 'align="center"', - 'dst' => 'align="center"', - 'type' => 'align="center"', - 'content' => 'align="center"' - ); - - /* - * Inicia o relatório. - */ - $dataRel[] = ''; - - /* - * Monta a linha de cabecalio. - */ - - $linha = ''; - $linha .= ""; - $linha .= ""; - $dataRel[] = $linha; - - $linhaC = ""; - foreach ($dadosCabecalio as $key => $value) { - $linhaC .= sprintf("", $value, $key); - } - $linhaC .= ""; - $dataRel[] = $linhaC; - - /* - * Linhas de dados. - */ - $count = 0; - - foreach ($this->GetData()[0] as $row) { - $count++; - $row['msg_date'] = date('d/m/Y H:i:s', strtotime($row['msg_date'])); - //$row['content'] = $this->decrypt($row['content']); - - // Formata linha de dados. - $linha = ""; - foreach ($dadosField as $key => $value) { - $linha .= sprintf("", $value, $row["$key"]); - } - $linha .= ""; - $dataRel[] = $linha; - } - $dataRel[] = ""; - $dataRel[] = '
Mensagem WhatsApp
%s
%s
Total: {$count}
'; - $this->___dataRel[] = $dataRel; - } - - protected function ___PreparaHtml() { - - } - - protected function ___PreparaPdf() { - - } - - private function decrypt($plaintext, $key = null) { - $c = base64_decode($plaintext); - $ivlen = openssl_cipher_iv_length($cipher = "aes-256-cbc"); - $iv = substr($c, 0, $ivlen); - $hmac = substr($c, $ivlen, $sha2len = 32); - $ciphertext_raw = substr($c, $ivlen + $sha2len); - $original_plaintext = openssl_decrypt($ciphertext_raw, $cipher, $key, $options = OPENSSL_RAW_DATA, $iv); - $calcmac = hash_hmac('sha256', $ciphertext_raw, $key, $as_binary = true); - if (hash_equals($hmac, $calcmac)) { - return utf8_decode($original_plaintext); - } - } - - public function ExecutaRelatorio() { - global $jsStartup, $jsJQuery, $smarty; - try { - - /* - * Use esta função para validar dados do formulário. - */ - $this->___ValidaForm(); - - /* - * Recupera os dados do banco. - */ - $this->___ConteudoRelatorio(); - - /* - * Imprime relatório de acordo com a media passada. - */ - $conteudoRelatorio = $this->___ImprimeRelatorio(); - } catch (Exception $exc) { - $this->SetMsg($exc->getMessage()); - $jsStartup[] = sprintf("alert('%s');", $this->GetMsg()); - $this->___GravaLog(); - } - - $jsJQuery[] = "\$('#dataIni').keypress(function(){formataDataHora(this);}) "; - $jsJQuery[] = "\$('#dataFim').keypress(function(){formataDataHora(this);}) "; - - $smarty->assign('filtros', $this->___FiltrosRelatorio()); - $smarty->assign('conteudo', $conteudoRelatorio); - $smarty->assign('msg', $this->GetMsg()); - GetTemplate($smarty, 'relatoriosGrid.tpl'); - } - - } - - $relMsgWhatsappDetalhado = new RelMsgWhatsappDetalhado($idProg, $dbcon, 1); - $relMsgWhatsappDetalhado->ExecutaRelatorio(); -?> \ No newline at end of file diff --git a/scriptApl/functions15.js b/scriptApl/functions15.js index 02c23a36..6a434f78 100644 --- a/scriptApl/functions15.js +++ b/scriptApl/functions15.js @@ -2035,7 +2035,7 @@ function DeletaClassificacaoItem(id) function DeltetaMotivoPausa(id, params) { - if (confirm('Esta ação irá excluir item selecionado! Deseja continuar?')) + if (confirm('Esta operação pode trazer modificações no seu sistema. Tem certeza que deseja continuar?')) { try { diff --git a/templates/seguranca/trocaSenha.tpl b/templates/seguranca/trocaSenha.tpl index 6d2350a8..bdc48020 100644 --- a/templates/seguranca/trocaSenha.tpl +++ b/templates/seguranca/trocaSenha.tpl @@ -19,7 +19,7 @@

Especificações da senha

- Sua senha deve possuir um conjunto total de 8 caracteres. + Sua senha deve possuir no mínimo de 8 caracteres. 1 caracteres especial ($*&@#_!.%?). 1 numeral (0 a 9). 1 letra maiúscula.