Ocomon 6.0.1 - Problemas ao editar configurações estendidas

1. Ocomon 6.0.1 - Problemas ao editar configurações estendidas

Luiz Fernando
Magskull

(usa Debian)

Enviado em 03/04/2025 - 17:20h

Tomei coragem de atualizar a aplicação para versão: 6.0.1, tava indo tudo perfeito e bonito até que fui atualizar configurações estendidas e de primeira, um dos campos do formulario responsável por definir o canal padrão não carregou, tinha mexido nisso na versão 4, estou procurando a documentação do que fiz mais ainda não encontrei, mas de qualquer forma, existe um problema que retorna o seguinte erro na página:

Fatal error: Uncaught TypeError: getChannels(): Argument #2 ($id) must be of type ?int, string given, called in /var/www/html/ocomon/admin/geral/config_plus.php on line 80 and defined in /var/www/html/ocomon/includes/functions/dbFunctions.php:7657 Stack trace: #0 /var/www/html/ocomon/admin/geral/config_plus.php(80): getChannels() #1 {main} thrown in /var/www/html/ocomon/includes/functions/dbFunctions.php on line 7657

Tambem no log do Apache:

[Wed Apr 02 16:13:17.686505 2025] [php:error] [pid 15806:tid 15806] [client 200.212.74.55:15230] PHP Fatal error: Uncaught TypeError: getChannels(): Argument #2 ($id) must be of type ?int, string given, called in /var/www/html/ocomon/admin/geral/config_plus.php on line 80 and defined in /var/www/html/ocomon/includes/functions/dbFunctions.php:7657\nStack trace:\n#0 /var/www/html/ocomon/admin/geral/config_plus.php(80): getChannels()\n#1 {main}\n thrown in /var/www/html/ocomon/includes/functions/dbFunctions.php on line 7657, referer: https://helpdesk.grifon.com.br/ocomon/index.php


  


2. Re: Ocomon 6.0.1 - Problemas ao editar configurações estendidas

Buckminster
Buckminster

(usa Debian)

Enviado em 03/04/2025 - 23:30h

PHP:
Argument #2 ($id) must be of type ?int, string given,

Apache:
Argument #2 ($id) must be of type ?int, string given,

As mensagens dizem em Português:
"O argumento deve ser do tipo Inteiro, foi dada uma String."

Acredito que você já saiba disso.

Linha 80 e adjacentes do arquivo config_plus.php:
"/* Canal da Solicitação para chamados abertos por e-mail*/
80 - $channelToOpenTickets = getChannels($conn, $configs['API_TICKET_BY_MAIL_CHANNEL'])['name'];
/* Cliente de entrada para chamados abertos por e-mail */
$clientToOpenTickets = TRANS('FILL_EMPTY');"

Linha 7657 e adjacentes do arquivo dbFunctions.php:
"/**
* getChannels
* Retorna um array com a listagem dos canais de entrada ou do canal específico caso o id seja informado
* O $type filtra se os canais exibidos estão marcados como only_set_by_system:0|1 (de utilização por meios automatizados)
* @param \PDO $conn
* @param null|int $id
* @param null|string $type : restrict|open| null:todos => Tipos de canais
* @return array
*/
7657 - function getChannels (\PDO $conn, ?int $id = null, ?string $type = null): array
{
$return = [];

$terms = '';
$typeList = ["restrict", "open"];
..."

Veja esse trecho:
" * Retorna um array com a listagem dos canais de entrada ou do canal específico caso o id seja informado"
E se o ID não for informado?
Se o ID não for informado acredito que retorna uma string, vazia, mas uma string.
Talvez um is_numeric resolva, é somente um palpite, não me aprofundei.

Estou instalando o Apache2, PHP, etc, para executar o Ocomon.

Outro ponto:
No arquivo dbFunctions.php se o rowCount() for maior que zero e o código entra no foreach a variável $data[] é utilizada para armazenar os resultados, mas a primeira ocorrência da variável $data é em

function getTagsList(\PDO $conn, ?int $id = null): array
{
$data = [];
$terms = "";

na linha 210 do arquivo dbFunctions.php.

Não instalei o MySQL ainda, mas quando você tem um $id e também um $type, o código pode acabar gerando um SQL com WHERE duas vezes.
Para evitar isso você precisa concatenar as condições corretamente.
Então, ao invés de sobrescrever $terms diretamente na função

$terms = "";
if ($id) {
$terms = " WHERE id = :id ";

você pode fazer uma verificação, tipo assim:

A partir da linha 212 do arquivo dbFunctions.php em vez de

if ($id) {
$terms = "WHERE id = :id ";
}

Introduza

if ($type) {
if (in_array($type, $typeList)) {
$terms .= ($terms ? "AND " : "WHERE ") . "only_set_by_system = :type ";
$filter = ($type == "restrict" ? 1 : 0);
} else {
$return[] = "Invalid type for channel";
return $return;
}

E daí continua como está ali:
$sql = "SELECT id, tag_name FROM input_tags {$terms} ORDER BY tag_name";
etc, etc...
}
Isso garantirá que, independentemente se o id e o type forem passados, a cláusula WHERE será construída corretamente.

Também:
$terms inicializa vazia/null/semnada como "" (string) Linha 211:
$terms = "";

E depois retorna da consulta como um Inteiro na linha 213 (pois acredito que o id seja um inteiro):
$terms = " WHERE id = :id ";
na Linha 213 do arquivo dbFunctions.php.

Não sei se me fiz claro.


_________________________________________________________
Always listen the Buck!
Enquanto o cursor estiver pulsando, há vida!


3. Re: Ocomon 6.0.1 - Problemas ao editar configurações estendidas

Amarildo Sertorio dos Santos
amarildosertorio

(usa Fedora)

Enviado em 04/04/2025 - 08:38h

Sugiro que seja reportado ao mantenedor.

https://ocomon.com.br/site/atualizacao-versao-6-0-1/


4. Re: Ocomon 6.0.1 - Problemas ao editar configurações estendidas

Luiz Fernando
Magskull

(usa Debian)

Enviado em 04/04/2025 - 11:11h

Olá Buckminster, vou testar suas recomendações e retorno aqui mais tarde.


E sim, amarildosertorio, validando a correção, irei entrar em contato com o mantenedor, inclusive enviei uma issue no giuthub, mas ainda sem retorno.

Obrigado a todos.


5. Re: Ocomon 6.0.1 - Problemas ao editar configurações estendidas

Buckminster
Buckminster

(usa Debian)

Enviado em 04/04/2025 - 15:46h

Magskull escreveu:

Olá Buckminster, vou testar suas recomendações e retorno aqui mais tarde.


E sim, amarildosertorio, validando a correção, irei entrar em contato com o mantenedor, inclusive enviei uma issue no giuthub, mas ainda sem retorno.

Obrigado a todos.


Instalei o Ocomon completo aqui (Apache2, PHP8.4, Mysql, IMAP, LDAP, etc).
Alterei os registros e não deu mensagem nenhuma de erro aqui, localmente.
Configurações Estendidas > Editar > Fiz alterações nos campos LDAP > Confirmar: Registro alterado com sucesso.
Qual campo em específico do formulário que está dando erro?


_________________________________________________________
Always listen the Buck!
Enquanto o cursor estiver pulsando, há vida!


6. Re: Ocomon 6.0.1 - Problemas ao editar configurações estendidas

Luiz Fernando
Magskull

(usa Debian)

Enviado em 08/04/2025 - 12:16h

Caro Buckminster, infelizmente ajustei conforme suas orientações e nada resolvido, mas acabou me fazendo olhar o codigo de outra forma e eu forcei um parâmetro na chamada da função e deu certo.

O campo que esta falhando fica em: Admin > Configurações estendidas > Entrada dos chamados na fila > Canal da solicitação.
No entanto minha gambiarra elimina o erro, mas não popula o campo quando clico para editar...

function getChannels (\PDO $conn, ?int $id = null, ?string $type = null): array 

Fiz a chamada passando o valor 1 como padrão e tá rodando (pelo menos até eu resolver mexer nisso novamente).
/* Canal da Solicitação para chamados abertos por e-mail*/
$channelToOpenTickets = getChannels($conn, 1,$configs['API_TICKET_BY_MAIL_CHANNEL'])['name'];

A validação do metodo para o $id está falhando apesar da função tratar isso.
function getChannels (\PDO $conn, ?int $id = null, ?string $type = null): array
{
$return = [];

$terms = '';
$typeList = ["restrict", "open"];

if (!$id && !empty($type)) {
if (in_array($type, $typeList)) {
$terms = "WHERE only_set_by_system = :type ";
} else {
$return[] = "Invalid type for channel";
return $return;
}
$filter = ($type == "restrict" ? 1 : 0);
}

$terms = ($id ? "WHERE id = :id " : $terms); /* Se tiver $id não importa o $type */


$sql = "SELECT * FROM channels {$terms} ORDER BY name";
try {
$res = $conn->prepare($sql);
if ($id)
$res->bindParam(':id', $id, PDO::PARAM_INT);
elseif (!$id && $type)
$res->bindParam(':type', $filter, PDO::PARAM_INT);

$res->execute();

if ($res->rowCount()) {
foreach ($res->fetchAll() as $row) {
$data[] = $row;
}
if ($id)
return $data[0];
return $data;
}
return $return;
}
catch (Exception $e) {
return $return;
}

Buckminster escreveu:

Magskull escreveu:

Olá Buckminster, vou testar suas recomendações e retorno aqui mais tarde.


E sim, amarildosertorio, validando a correção, irei entrar em contato com o mantenedor, inclusive enviei uma issue no giuthub, mas ainda sem retorno.

Obrigado a todos.


Instalei o Ocomon completo aqui (Apache2, PHP8.4, Mysql, IMAP, LDAP, etc).
Alterei os registros e não deu mensagem nenhuma de erro aqui, localmente.
Configurações Estendidas > Editar > Fiz alterações nos campos LDAP > Confirmar: Registro alterado com sucesso.
Qual campo em específico do formulário que está dando erro?


_________________________________________________________
Always listen the Buck!
Enquanto o cursor estiver pulsando, há vida!




Depois de muito tempo afastado do mundo Linux, felizmente estou voltando.

Obrigado pela paciência caso você tenha.


7. Re: Ocomon 6.0.1 - Problemas ao editar configurações estendidas

Buckminster
Buckminster

(usa Debian)

Enviado em 08/04/2025 - 21:42h

"O campo que esta falhando fica em: Admin > Configurações estendidas > Entrada dos chamados na fila > Canal da solicitação."

Aqui o campo está populando, mas somente quando cadastro o campo como "Apenas uso interno" em Admin > Ocorrências > Canais de solicitação > Novo > e habilito "Apenas uso interno" > Confirma.
Tem por padrão 4 canais: Automático: via Email Padrão, Email, Sistema Web e Telefone.
No campo "Canal da solicitação" nas Configurações Estendidas aparece somente o canal "Automático: via Email" por ser o padrão.
Cadastrei um canal chamado "Interno" e habilitei "Apenas uso interno" e habilitei o canal "Email" como uso interno e os três (Automático: Email, Email e Interno) apareceram em Admin > Configurações Gerais > Configurações estendidas > Entrada dos chamados na fila > Canal da solicitação, nem precisei pesquisar.
Depois cadastrei o canal "Teste" sem ser de uso interno e não apareceu. Quando editei como "Apenas uso interno", apareceu.
Depois cadastrei um canal como "1" e também apareceu.

Veja, no banco, as tuplas dos cadastros "Interno", "Teste" e "1" que eu fiz no Ocomon.
Os outros vieram por padrão.

mysql> select * from channels;
+----+-----------------------+------------+--------------------+
| id | name | is_default | only_set_by_system |
+----+-----------------------+------------+--------------------+
| 1 | Sistema Web | 0 | 0 |
| 2 | Telefone | 0 | 0 |
| 3 | Autom�tico: via Email | 1 | 1 |
| 4 | Email | 0 | 1 |
| 5 | Interno | 0 | 1 |
| 6 | Teste | 0 | 1 |
| 7 | 1 | 0 | 1 |
+----+-----------------------+------------+--------------------+
7 rows in set (0.01 sec)

Veja que na função do arquivo dbFunctions já trata isso (linhas 7664 a 7674), como você disse:

if (!$id && !empty($type)) {
if (in_array($type, $typeList)) {
$terms = "WHERE only_set_by_system = :type ";
} else {
$return[] = "Invalid type for channel";
return $return;
}
$filter = ($type == "restrict" ? 1 : 0);
}

$terms = ($id ? "WHERE id = :id " : $terms); /* Se tiver $id não importa o $type */

Talvez você esqueceu de configurar alguma coisa.
Talvez você atualizou direto de uma versão anterior e por isso está dando problemas.
Eu aqui instalei do zero, baixei o Ocomon 6.0.1 do site.
Eu não mexi em nada no código, apenas instalei tudo e fiz o importe do banco como diz nas instruções:

mysql -u root -p < /caminho_para_o_ocomon_6.x/install/6.x/01-DB_OCOMON_6.x-FRESH_INSTALL_STRUCTURE_AND_BASIC_DATA.sql

e depois configurei o config.inc.php.
Habilitei o Display_errors no php.ini, etc.
Ou talvez eu não esteja entendendo o que você está querendo dizer com "o campo não está sendo populado".

Arquivo config_plus.php aqui, nas linhas que interessam ao caso (linhas 69 a 92):

* Chamados abertos por e-mail
*/

/* Nome de usuário para a abertura de chamados automáticos */
if ($configs['API_TICKET_BY_MAIL_USER']){
$userToOpenTickets = getUserInfo($conn, 1, $configs['API_TICKET_BY_MAIL_USER'])['login'];
} else {
$userToOpenTickets = "admin";
}

/* Canal da Solicitação para chamados abertos por e-mail*/
$channelToOpenTickets = getChannels($conn, $configs['API_TICKET_BY_MAIL_CHANNEL'])['name'];
/* Cliente de entrada para chamados abertos por e-mail */
$clientToOpenTickets = TRANS('FILL_EMPTY');
if (isset($configs['API_TICKET_BY_MAIL_CLIENT']) && $configs['API_TICKET_BY_MAIL_CLIENT'])
$clientToOpenTickets = getClients($conn, $configs['API_TICKET_BY_MAIL_CLIENT'])['nickname'];
/* Área de entrada para chamados abertos por e-mail */
$areaToOpenTickets = "";
if ($configs['API_TICKET_BY_MAIL_AREA'])
$areaToOpenTickets = getAreaInfo($conn, $configs['API_TICKET_BY_MAIL_AREA'])['area_name'];
/* Status de entrada para chamados abertos por e-mail */
$statusToOpenTickets = "";
if ($configs['API_TICKET_BY_MAIL_STATUS'])
$statusToOpenTickets = getStatusById($conn, $configs['API_TICKET_BY_MAIL_STATUS'])['status'];


_________________________________________________________
Always listen the Buck!
Enquanto o cursor estiver pulsando, há vida!


8. Re: Ocomon 6.0.1 - Problemas ao editar configurações estendidas

Luiz Fernando
Magskull

(usa Debian)

Enviado em 09/04/2025 - 14:36h

Olá Buckminster.

Um de seus comentários pode ser a razão do meu problema, atualizei da versão 4 para a versão atual e isso parece estar causando problemas, rodei o script para atualização, mas pode haver alguma inconsistência.

Meus logs não estão mais retornando falha alguma.


Att.
Luiz Fernando - Magskull
Obrigado pela paciência caso você tenha alguma disponível.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts