alerta_manutencao.php — leitura técnica completa

cron/alerta_manutencao.php
Seleciona registros cuja próxima manutenção é igual à data atual, tenta o envio e atualiza o estado do alerta quando o envio é aceito.

Automação / cronRotina agendada152 linhas

Responsabilidade do arquivo

Seleciona registros cuja próxima manutenção é igual à data atual, tenta o envio e atualiza o estado do alerta quando o envio é aceito.

Fonte conferida: cron/alerta_manutencao.php
SHA-256: 236611576f636b406e20c5b095cf1a22314765bb1d28d0409b3a98b6cadb3fbe

Dependências extraídas do arquivo:
Include: __DIR__ . '/timezone_cron.php'Include: __DIR__ . '/../sistema/conexao.php'Include: $arquivo_envio_originalInclude: $arquivo_envio_cronTabela: clientesTabela: proteses

Bytes inválidos em UTF-8 são exibidos como \xNN, sem alterar o arquivo original.

Tipo

Rotina agendada

Grupo

Automação / cron

Total de linhas

152

Código completo

1<?php 2@set_time_limit(0); 3 4if (is_file(__DIR__ . '/timezone_cron.php')) { 5 require_once __DIR__ . '/timezone_cron.php'; 6} 7 8require_once __DIR__ . '/../sistema/conexao.php'; 9 10$tabela = 'manutencoes_protese'; 11$hoje = function_exists('bb_cron_data_hoje') ? bb_cron_data_hoje() : date('Y-m-d'); 12 13/* 14 BarberBot em domínio próprio. 15 Rota padrão do agendamento: /agendamentos/ 16 Usa somente o domínio próprio configurado em /sistema/conexao.php. 17*/ 18$rota_agendamento = 'agendamentos/'; 19 20$nome_sistema_cron = 'BarberBot'; 21if (isset($nome_sistema) && $nome_sistema != '') { 22 $nome_sistema_cron = $nome_sistema; 23} 24 25$url_sistema_cron = function_exists('bb_cron_url_base') ? bb_cron_url_base($url_sistema ?? '') : (isset($url_sistema) ? rtrim($url_sistema, '/') . '/' : ''); 26 27$arquivo_envio_original = __DIR__ . '/../ajax/api-texto.php'; 28$arquivo_envio_cron = __DIR__ . '/texto.php'; 29 30if (!file_exists($arquivo_envio_original) && !file_exists($arquivo_envio_cron)) { 31 echo 'Arquivo de envio WhatsApp não encontrado'; 32 exit(); 33} 34 35/* 36 Envia o alerta somente na data exata da próxima manutenção. 37 Depois do envio, o campo alerta_manutencao_enviado recebe 1, evitando reenvio no mesmo dia. 38*/ 39$query = $pdo->prepare(" 40 SELECT 41 m.id, 42 m.cliente, 43 m.id_protese, 44 m.proxima_manutencao, 45 m.alerta_manutencao_enviado, 46 c.nome AS nome_cliente, 47 c.telefone, 48 p.modelo AS nome_protese 49 FROM $tabela m 50 LEFT JOIN clientes c ON m.cliente = c.id 51 LEFT JOIN proteses p ON m.id_protese = p.id 52 WHERE m.proxima_manutencao IS NOT NULL 53 AND m.proxima_manutencao != '0000-00-00' 54 AND m.proxima_manutencao = :hoje 55 AND (m.alerta_manutencao_enviado = 0 OR m.alerta_manutencao_enviado IS NULL) 56 ORDER BY m.proxima_manutencao ASC 57"); 58 59$query->bindValue(':hoje', $hoje); 60$query->execute(); 61$res = $query->fetchAll(PDO::FETCH_ASSOC); 62 63if (count($res) == 0) { 64 echo 'Nenhuma manutenção com vencimento hoje para alertar'; 65 exit(); 66} 67 68$total_enviados = 0; 69$total_ignorados = 0; 70 71for ($i = 0; $i < count($res); $i++) { 72 73 $id = $res[$i]['id']; 74 $cliente = $res[$i]['cliente']; 75 $id_protese = $res[$i]['id_protese']; 76 77 $nome = isset($res[$i]['nome_cliente']) ? trim($res[$i]['nome_cliente']) : ''; 78 $nome_protese = isset($res[$i]['nome_protese']) ? trim($res[$i]['nome_protese']) : ''; 79 $proxima_manutencao = isset($res[$i]['proxima_manutencao']) ? trim($res[$i]['proxima_manutencao']) : ''; 80 $telefone_cliente = isset($res[$i]['telefone']) ? trim($res[$i]['telefone']) : ''; 81 82 if ($telefone_cliente == '') { 83 $total_ignorados++; 84 continue; 85 } 86 87 $telefone = function_exists('bb_cron_normalizar_telefone') ? bb_cron_normalizar_telefone($telefone_cliente) : preg_replace('/[^0-9]/', '', $telefone_cliente); 88 89 if ($telefone == '') { 90 $total_ignorados++; 91 continue; 92 } 93 94 $data_ts = strtotime($proxima_manutencao); 95 if (!$data_ts) { 96 $total_ignorados++; 97 continue; 98 } 99 100 if ($nome == '') { 101 $nome = 'cliente'; 102 } 103 104 if ($nome_protese == '') { 105 $nome_protese = 'Prótese capilar'; 106 } 107 108 $data_proxima_f = date('d/m/Y', $data_ts); 109 110 $link_agendamento = $url_sistema_cron . ltrim($rota_agendamento, '/'); 111 $link_agendamento .= '?cliente=' . urlencode((string)$cliente) . '&id_protese=' . urlencode((string)$id_protese); 112 113 $mensagem = "👋 *Olá {$nome}*, tudo bem?%0A%0A"; 114 $mensagem .= "🚨 Identificamos que a sua *manutenção de prótese capilar* vence hoje.%0A%0A"; 115 $mensagem .= "📅 *Data prevista:* {$data_proxima_f}%0A"; 116 $mensagem .= "💇 *Prótese:* {$nome_protese}%0A%0A"; 117 $mensagem .= "Para manter o melhor resultado, recomendamos realizar o agendamento da sua próxima manutenção.%0A%0A"; 118 $mensagem .= "🔗 *Clique abaixo para agendar:*%0A"; 119 $mensagem .= "{$link_agendamento}%0A%0A"; 120 $mensagem .= "Atenciosamente,%0A*{$nome_sistema_cron}*"; 121 122 $status_mensagem = ''; 123 124 if (file_exists($arquivo_envio_original)) { 125 include($arquivo_envio_original); 126 } else { 127 include($arquivo_envio_cron); 128 } 129 130 $enviado = true; 131 if (isset($api) && $api == 'menuia') { 132 $enviado = (@$status_mensagem == 'Mensagem enviada com sucesso.' || @$status_mensagem == 'OK'); 133 } 134 135 if ($enviado) { 136 $query_update = $pdo->prepare(" 137 UPDATE $tabela SET 138 alerta_manutencao_enviado = 1, 139 data_alerta_manutencao = NOW() 140 WHERE id = :id 141 "); 142 $query_update->bindValue(':id', $id); 143 $query_update->execute(); 144 145 $total_enviados++; 146 } else { 147 $total_ignorados++; 148 } 149} 150 151echo 'Alertas enviados: ' . $total_enviados . ' | Ignorados: ' . $total_ignorados; 152?>

Leitura linha por linha

LinhaCódigoExplicação técnica
1<?phpAbre um bloco PHP executado no servidor.
2@set_time_limit(0);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3 Linha em branco usada para separar blocos do arquivo.
4if (is_file(__DIR__ . '/timezone_cron.php')) {Avalia a condição escrita nesta linha.
5 require_once __DIR__ . '/timezone_cron.php';Carrega o arquivo ou a dependência indicada na própria linha.
6}Fecha ou delimita a estrutura iniciada anteriormente.
7 Linha em branco usada para separar blocos do arquivo.
8require_once __DIR__ . '/../sistema/conexao.php';Carrega o arquivo ou a dependência indicada na própria linha.
9 Linha em branco usada para separar blocos do arquivo.
10$tabela = 'manutencoes_protese';Atribui o valor ou resultado exibido à variável.
11$hoje = function_exists('bb_cron_data_hoje') ? bb_cron_data_hoje() : date('Y-m-d');Atribui o valor ou resultado exibido à variável.
12 Linha em branco usada para separar blocos do arquivo.
13/*Comentário existente no código-fonte.
14 BarberBot em domínio próprio.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
15 Rota padrão do agendamento: /agendamentos/Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
16 Usa somente o domínio próprio configurado em /sistema/conexao.php.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
17*/Comentário existente no código-fonte.
18$rota_agendamento = 'agendamentos/';Atribui o valor ou resultado exibido à variável.
19 Linha em branco usada para separar blocos do arquivo.
20$nome_sistema_cron = 'BarberBot';Atribui o valor ou resultado exibido à variável.
21if (isset($nome_sistema) && $nome_sistema != '') {Avalia a condição escrita nesta linha.
22 $nome_sistema_cron = $nome_sistema;Atribui o valor ou resultado exibido à variável.
23}Fecha ou delimita a estrutura iniciada anteriormente.
24 Linha em branco usada para separar blocos do arquivo.
25$url_sistema_cron = function_exists('bb_cron_url_base') ? bb_cron_url_base($url_sistema ?? '') : (isset($url_sistema) ? rtrim($url_sistema, '/') . '/' : '');Atribui o valor ou resultado exibido à variável.
26 Linha em branco usada para separar blocos do arquivo.
27$arquivo_envio_original = __DIR__ . '/../ajax/api-texto.php';Atribui o valor ou resultado exibido à variável.
28$arquivo_envio_cron = __DIR__ . '/texto.php';Atribui o valor ou resultado exibido à variável.
29 Linha em branco usada para separar blocos do arquivo.
30if (!file_exists($arquivo_envio_original) && !file_exists($arquivo_envio_cron)) {Avalia a condição escrita nesta linha.
31 echo 'Arquivo de envio WhatsApp não encontrado';Envia conteúdo para a saída da requisição.
32 exit();Interrompe a execução neste ponto.
33}Fecha ou delimita a estrutura iniciada anteriormente.
34 Linha em branco usada para separar blocos do arquivo.
35/*Comentário existente no código-fonte.
36 Envia o alerta somente na data exata da próxima manutenção.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
37 Depois do envio, o campo alerta_manutencao_enviado recebe 1, evitando reenvio no mesmo dia.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
38*/Comentário existente no código-fonte.
39$query = $pdo->prepare("Prepara uma instrução SQL com PDO.
40 SELECT Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
41 m.id,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
42 m.cliente,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
43 m.id_protese,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
44 m.proxima_manutencao,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
45 m.alerta_manutencao_enviado,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
46 c.nome AS nome_cliente,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
47 c.telefone,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
48 p.modelo AS nome_proteseLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
49 FROM $tabela mLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
50 LEFT JOIN clientes c ON m.cliente = c.idLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
51 LEFT JOIN proteses p ON m.id_protese = p.idLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
52 WHERE m.proxima_manutencao IS NOT NULLLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
53 AND m.proxima_manutencao != '0000-00-00'Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
54 AND m.proxima_manutencao = :hojeLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
55 AND (m.alerta_manutencao_enviado = 0 OR m.alerta_manutencao_enviado IS NULL)Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
56 ORDER BY m.proxima_manutencao ASCLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
57");Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
58 Linha em branco usada para separar blocos do arquivo.
59$query->bindValue(':hoje', $hoje);Associa um valor ao parâmetro da consulta preparada.
60$query->execute();Executa a instrução preparada.
61$res = $query->fetchAll(PDO::FETCH_ASSOC);Lê dados retornados pela consulta.
62 Linha em branco usada para separar blocos do arquivo.
63if (count($res) == 0) {Avalia a condição escrita nesta linha.
64 echo 'Nenhuma manutenção com vencimento hoje para alertar';Envia conteúdo para a saída da requisição.
65 exit();Interrompe a execução neste ponto.
66}Fecha ou delimita a estrutura iniciada anteriormente.
67 Linha em branco usada para separar blocos do arquivo.
68$total_enviados = 0;Atribui o valor ou resultado exibido à variável.
69$total_ignorados = 0;Atribui o valor ou resultado exibido à variável.
70 Linha em branco usada para separar blocos do arquivo.
71for ($i = 0; $i < count($res); $i++) {Controla uma repetição conforme a expressão exibida.
72 Linha em branco usada para separar blocos do arquivo.
73 $id = $res[$i]['id'];Atribui o valor ou resultado exibido à variável.
74 $cliente = $res[$i]['cliente'];Atribui o valor ou resultado exibido à variável.
75 $id_protese = $res[$i]['id_protese'];Atribui o valor ou resultado exibido à variável.
76 Linha em branco usada para separar blocos do arquivo.
77 $nome = isset($res[$i]['nome_cliente']) ? trim($res[$i]['nome_cliente']) : '';Atribui o valor ou resultado exibido à variável.
78 $nome_protese = isset($res[$i]['nome_protese']) ? trim($res[$i]['nome_protese']) : '';Atribui o valor ou resultado exibido à variável.
79 $proxima_manutencao = isset($res[$i]['proxima_manutencao']) ? trim($res[$i]['proxima_manutencao']) : '';Atribui o valor ou resultado exibido à variável.
80 $telefone_cliente = isset($res[$i]['telefone']) ? trim($res[$i]['telefone']) : '';Atribui o valor ou resultado exibido à variável.
81 Linha em branco usada para separar blocos do arquivo.
82 if ($telefone_cliente == '') {Avalia a condição escrita nesta linha.
83 $total_ignorados++;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
84 continue;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
85 }Fecha ou delimita a estrutura iniciada anteriormente.
86 Linha em branco usada para separar blocos do arquivo.
87 $telefone = function_exists('bb_cron_normalizar_telefone') ? bb_cron_normalizar_telefone($telefone_cliente) : preg_replace('/[^0-9]/', '', $telefone_cliente);Atribui o valor ou resultado exibido à variável.
88 Linha em branco usada para separar blocos do arquivo.
89 if ($telefone == '') {Avalia a condição escrita nesta linha.
90 $total_ignorados++;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
91 continue;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
92 }Fecha ou delimita a estrutura iniciada anteriormente.
93 Linha em branco usada para separar blocos do arquivo.
94 $data_ts = strtotime($proxima_manutencao);Atribui o valor ou resultado exibido à variável.
95 if (!$data_ts) {Avalia a condição escrita nesta linha.
96 $total_ignorados++;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
97 continue;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
98 }Fecha ou delimita a estrutura iniciada anteriormente.
99 Linha em branco usada para separar blocos do arquivo.
100 if ($nome == '') {Avalia a condição escrita nesta linha.
101 $nome = 'cliente';Atribui o valor ou resultado exibido à variável.
102 }Fecha ou delimita a estrutura iniciada anteriormente.
103 Linha em branco usada para separar blocos do arquivo.
104 if ($nome_protese == '') {Avalia a condição escrita nesta linha.
105 $nome_protese = 'Prótese capilar';Atribui o valor ou resultado exibido à variável.
106 }Fecha ou delimita a estrutura iniciada anteriormente.
107 Linha em branco usada para separar blocos do arquivo.
108 $data_proxima_f = date('d/m/Y', $data_ts);Atribui o valor ou resultado exibido à variável.
109 Linha em branco usada para separar blocos do arquivo.
110 $link_agendamento = $url_sistema_cron . ltrim($rota_agendamento, '/');Atribui o valor ou resultado exibido à variável.
111 $link_agendamento .= '?cliente=' . urlencode((string)$cliente) . '&id_protese=' . urlencode((string)$id_protese);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
112 Linha em branco usada para separar blocos do arquivo.
113 $mensagem = "👋 *Olá {$nome}*, tudo bem?%0A%0A";Atribui o valor ou resultado exibido à variável.
114 $mensagem .= "🚨 Identificamos que a sua *manutenção de prótese capilar* vence hoje.%0A%0A";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
115 $mensagem .= "📅 *Data prevista:* {$data_proxima_f}%0A";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
116 $mensagem .= "💇 *Prótese:* {$nome_protese}%0A%0A";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
117 $mensagem .= "Para manter o melhor resultado, recomendamos realizar o agendamento da sua próxima manutenção.%0A%0A";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
118 $mensagem .= "🔗 *Clique abaixo para agendar:*%0A";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
119 $mensagem .= "{$link_agendamento}%0A%0A";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
120 $mensagem .= "Atenciosamente,%0A*{$nome_sistema_cron}*";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
121 Linha em branco usada para separar blocos do arquivo.
122 $status_mensagem = '';Atribui o valor ou resultado exibido à variável.
123 Linha em branco usada para separar blocos do arquivo.
124 if (file_exists($arquivo_envio_original)) {Avalia a condição escrita nesta linha.
125 include($arquivo_envio_original);Carrega o arquivo ou a dependência indicada na própria linha.
126 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
127 include($arquivo_envio_cron);Carrega o arquivo ou a dependência indicada na própria linha.
128 }Fecha ou delimita a estrutura iniciada anteriormente.
129 Linha em branco usada para separar blocos do arquivo.
130 $enviado = true;Atribui o valor ou resultado exibido à variável.
131 if (isset($api) && $api == 'menuia') {Avalia a condição escrita nesta linha.
132 $enviado = (@$status_mensagem == 'Mensagem enviada com sucesso.' || @$status_mensagem == 'OK');Atribui o valor ou resultado exibido à variável.
133 }Fecha ou delimita a estrutura iniciada anteriormente.
134 Linha em branco usada para separar blocos do arquivo.
135 if ($enviado) {Avalia a condição escrita nesta linha.
136 $query_update = $pdo->prepare("Prepara uma instrução SQL com PDO.
137 UPDATE $tabela SET Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
138 alerta_manutencao_enviado = 1,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
139 data_alerta_manutencao = NOW()Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
140 WHERE id = :idLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
141 ");Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
142 $query_update->bindValue(':id', $id);Associa um valor ao parâmetro da consulta preparada.
143 $query_update->execute();Executa a instrução preparada.
144 Linha em branco usada para separar blocos do arquivo.
145 $total_enviados++;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
146 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
147 $total_ignorados++;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
148 }Fecha ou delimita a estrutura iniciada anteriormente.
149}Fecha ou delimita a estrutura iniciada anteriormente.
150 Linha em branco usada para separar blocos do arquivo.
151echo 'Alertas enviados: ' . $total_enviados . ' | Ignorados: ' . $total_ignorados;Envia conteúdo para a saída da requisição.
152?>Fecha o bloco PHP.

Navegação entre arquivos do grupo