feat: implement email notification system for 'Almoxarifado' alerts, enhancing user awareness of stock levels and alert statuses through automated email updates

This commit is contained in:
2025-12-21 08:02:14 -03:00
parent 500b7b362c
commit f0884a19a7
5 changed files with 419 additions and 15 deletions

View File

@@ -1005,6 +1005,177 @@ export const criarTemplatesPadrao = mutation({
],
categoria: 'email' as const,
tags: ['erro', '500', 'servidor', 'critico', 'notificacao', 'ti']
},
// ===================== ALMOXARIFADO - ALERTAS =====================
{
codigo: 'almoxarifado_alerta_criado',
nome: 'Almoxarifado - Alerta de Estoque Criado',
titulo: '⚠️ Alerta de Estoque: {{materialNome}}',
corpo:
'Olá,\n\n' +
'Um novo alerta de estoque foi criado no sistema:\n\n' +
'Material: {{materialNome}}\n' +
'Código: {{materialCodigo}}\n' +
'Tipo de Alerta: {{tipoAlerta}}\n' +
'Quantidade Atual: {{quantidadeAtual}} {{unidadeMedida}}\n' +
'Quantidade Mínima: {{quantidadeMinima}} {{unidadeMedida}}\n' +
'Diferença: {{diferenca}} {{unidadeMedida}}\n\n' +
'Por favor, verifique o estoque e realize a reposição necessária.',
htmlCorpo:
'<div style="max-width: 600px; margin: 0 auto; padding: 20px;">' +
'<div style="background: linear-gradient(135deg, #F59E0B 0%, #EF4444 100%); border-radius: 8px; padding: 20px; margin-bottom: 25px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);">' +
'<h2 style="color: #FFFFFF; margin: 0 0 10px 0; font-size: 24px; font-weight: bold;">⚠️ Alerta de Estoque</h2>' +
'<p style="color: #FFFFFF; margin: 0; font-size: 16px; font-weight: 500;">Material: <strong>{{materialNome}}</strong></p>' +
'</div>' +
'<p style="color: #333333; font-size: 16px; line-height: 1.6; margin: 0 0 20px 0;">Olá,</p>' +
'<p style="color: #333333; font-size: 16px; line-height: 1.6; margin: 0 0 20px 0;">Um novo alerta de estoque foi criado no sistema:</p>' +
'<div style="background-color: #FEF2F2; border-left: 4px solid #EF4444; padding: 20px; border-radius: 8px; margin: 20px 0;">' +
'<p style="margin: 0 0 15px 0; color: #991B1B; font-weight: bold; font-size: 16px;">📦 Informações do Material:</p>' +
'<table style="width: 100%; border-collapse: collapse;">' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold; width: 160px;">Material:</td><td style="padding: 8px 0; color: #333;">{{materialNome}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Código:</td><td style="padding: 8px 0; color: #333; font-family: monospace;">{{materialCodigo}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Tipo de Alerta:</td><td style="padding: 8px 0;"><span style="background-color: #EF4444; color: white; padding: 4px 12px; border-radius: 4px; font-weight: bold;">{{tipoAlerta}}</span></td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Quantidade Atual:</td><td style="padding: 8px 0; color: #DC2626; font-size: 18px; font-weight: bold;">{{quantidadeAtual}} {{unidadeMedida}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Quantidade Mínima:</td><td style="padding: 8px 0; color: #333;">{{quantidadeMinima}} {{unidadeMedida}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Diferença:</td><td style="padding: 8px 0; color: #F59E0B; font-weight: bold;">{{diferenca}} {{unidadeMedida}}</td></tr>' +
'</table>' +
'</div>' +
'<div style="background-color: #EFF6FF; border-left: 4px solid #2563EB; padding: 15px; border-radius: 4px; margin: 20px 0;">' +
'<p style="margin: 0; color: #1E40AF; font-size: 14px; line-height: 1.6;">' +
'<strong>💡 Ação Necessária:</strong> Por favor, verifique o estoque e realize a reposição necessária.' +
'</p>' +
'</div>' +
'<p style="margin-top: 30px;">' +
'<a href="{{urlSistema}}/almoxarifado/alertas" style="background-color: #EF4444; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block; font-weight: bold;">Ver Alertas</a>' +
'</p>' +
'<p style="color: #666666; font-size: 12px; margin-top: 30px; padding-top: 20px; border-top: 1px solid #E0E0E0;">' +
'Almoxarifado SGSE - Sistema de Gerenciamento de Secretaria' +
'</p>' +
'</div>',
variaveis: [
'materialNome',
'materialCodigo',
'tipoAlerta',
'quantidadeAtual',
'quantidadeMinima',
'unidadeMedida',
'diferenca',
'urlSistema'
],
categoria: 'email' as const,
tags: ['almoxarifado', 'alerta', 'estoque', 'reposicao']
},
{
codigo: 'almoxarifado_alerta_resolvido',
nome: 'Almoxarifado - Alerta de Estoque Resolvido',
titulo: '✅ Alerta de Estoque Resolvido: {{materialNome}}',
corpo:
'Olá,\n\n' +
'O alerta de estoque abaixo foi resolvido:\n\n' +
'Material: {{materialNome}}\n' +
'Código: {{materialCodigo}}\n' +
'Quantidade Atual: {{quantidadeAtual}} {{unidadeMedida}}\n' +
'Quantidade Mínima: {{quantidadeMinima}} {{unidadeMedida}}\n' +
'Resolvido por: {{resolvidoPor}}\n' +
'Data: {{dataResolucao}}\n\n' +
'O estoque está agora acima do mínimo configurado.',
htmlCorpo:
'<div style="max-width: 600px; margin: 0 auto; padding: 20px;">' +
'<div style="background: linear-gradient(135deg, #10B981 0%, #059669 100%); border-radius: 8px; padding: 20px; margin-bottom: 25px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);">' +
'<h2 style="color: #FFFFFF; margin: 0 0 10px 0; font-size: 24px; font-weight: bold;">✅ Alerta Resolvido</h2>' +
'<p style="color: #FFFFFF; margin: 0; font-size: 16px; font-weight: 500;">Material: <strong>{{materialNome}}</strong></p>' +
'</div>' +
'<p style="color: #333333; font-size: 16px; line-height: 1.6; margin: 0 0 20px 0;">Olá,</p>' +
'<p style="color: #333333; font-size: 16px; line-height: 1.6; margin: 0 0 20px 0;">O alerta de estoque abaixo foi resolvido:</p>' +
'<div style="background-color: #ECFDF5; border-left: 4px solid #10B981; padding: 20px; border-radius: 8px; margin: 20px 0;">' +
'<p style="margin: 0 0 15px 0; color: #065F46; font-weight: bold; font-size: 16px;">📦 Informações do Material:</p>' +
'<table style="width: 100%; border-collapse: collapse;">' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold; width: 160px;">Material:</td><td style="padding: 8px 0; color: #333;">{{materialNome}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Código:</td><td style="padding: 8px 0; color: #333; font-family: monospace;">{{materialCodigo}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Quantidade Atual:</td><td style="padding: 8px 0; color: #059669; font-size: 18px; font-weight: bold;">{{quantidadeAtual}} {{unidadeMedida}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Quantidade Mínima:</td><td style="padding: 8px 0; color: #333;">{{quantidadeMinima}} {{unidadeMedida}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Resolvido por:</td><td style="padding: 8px 0; color: #333;">{{resolvidoPor}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Data:</td><td style="padding: 8px 0; color: #333;">{{dataResolucao}}</td></tr>' +
'</table>' +
'</div>' +
'<div style="background-color: #F0FDF4; padding: 15px; border-radius: 4px; margin: 20px 0; text-align: center;">' +
'<p style="margin: 0; color: #166534; font-size: 14px; line-height: 1.6; font-weight: bold;">✅ O estoque está agora acima do mínimo configurado.</p>' +
'</div>' +
'<p style="margin-top: 30px;">' +
'<a href="{{urlSistema}}/almoxarifado/alertas" style="background-color: #10B981; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block; font-weight: bold;">Ver Alertas</a>' +
'</p>' +
'<p style="color: #666666; font-size: 12px; margin-top: 30px; padding-top: 20px; border-top: 1px solid #E0E0E0;">' +
'Almoxarifado SGSE - Sistema de Gerenciamento de Secretaria' +
'</p>' +
'</div>',
variaveis: [
'materialNome',
'materialCodigo',
'quantidadeAtual',
'quantidadeMinima',
'unidadeMedida',
'resolvidoPor',
'dataResolucao',
'urlSistema'
],
categoria: 'email' as const,
tags: ['almoxarifado', 'alerta', 'estoque', 'resolvido']
},
{
codigo: 'almoxarifado_alerta_ignorado',
nome: 'Almoxarifado - Alerta de Estoque Ignorado',
titulo: '⚠️ Alerta de Estoque Ignorado: {{materialNome}}',
corpo:
'Olá,\n\n' +
'O alerta de estoque abaixo foi ignorado:\n\n' +
'Material: {{materialNome}}\n' +
'Código: {{materialCodigo}}\n' +
'Tipo de Alerta: {{tipoAlerta}}\n' +
'Quantidade Atual: {{quantidadeAtual}} {{unidadeMedida}}\n' +
'Quantidade Mínima: {{quantidadeMinima}} {{unidadeMedida}}\n' +
'Data: {{dataIgnorado}}\n\n' +
'⚠️ Atenção: O estoque ainda está abaixo do mínimo configurado.',
htmlCorpo:
'<div style="max-width: 600px; margin: 0 auto; padding: 20px;">' +
'<div style="background: linear-gradient(135deg, #6B7280 0%, #4B5563 100%); border-radius: 8px; padding: 20px; margin-bottom: 25px; box-shadow: 0 4px 6px rgba(0,0,0,0.1);">' +
'<h2 style="color: #FFFFFF; margin: 0 0 10px 0; font-size: 24px; font-weight: bold;">⚠️ Alerta Ignorado</h2>' +
'<p style="color: #FFFFFF; margin: 0; font-size: 16px; font-weight: 500;">Material: <strong>{{materialNome}}</strong></p>' +
'</div>' +
'<p style="color: #333333; font-size: 16px; line-height: 1.6; margin: 0 0 20px 0;">Olá,</p>' +
'<p style="color: #333333; font-size: 16px; line-height: 1.6; margin: 0 0 20px 0;">O alerta de estoque abaixo foi ignorado:</p>' +
'<div style="background-color: #F3F4F6; border-left: 4px solid #6B7280; padding: 20px; border-radius: 8px; margin: 20px 0;">' +
'<p style="margin: 0 0 15px 0; color: #374151; font-weight: bold; font-size: 16px;">📦 Informações do Material:</p>' +
'<table style="width: 100%; border-collapse: collapse;">' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold; width: 160px;">Material:</td><td style="padding: 8px 0; color: #333;">{{materialNome}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Código:</td><td style="padding: 8px 0; color: #333; font-family: monospace;">{{materialCodigo}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Tipo de Alerta:</td><td style="padding: 8px 0;"><span style="background-color: #6B7280; color: white; padding: 4px 12px; border-radius: 4px; font-weight: bold;">{{tipoAlerta}}</span></td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Quantidade Atual:</td><td style="padding: 8px 0; color: #DC2626; font-size: 18px; font-weight: bold;">{{quantidadeAtual}} {{unidadeMedida}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Quantidade Mínima:</td><td style="padding: 8px 0; color: #333;">{{quantidadeMinima}} {{unidadeMedida}}</td></tr>' +
'<tr><td style="padding: 8px 0; color: #333; font-weight: bold;">Data:</td><td style="padding: 8px 0; color: #333;">{{dataIgnorado}}</td></tr>' +
'</table>' +
'</div>' +
'<div style="background-color: #FEF2F2; border-left: 4px solid #EF4444; padding: 15px; border-radius: 4px; margin: 20px 0;">' +
'<p style="margin: 0; color: #991B1B; font-size: 14px; line-height: 1.6; font-weight: bold;">⚠️ Atenção: O estoque ainda está abaixo do mínimo configurado.</p>' +
'</div>' +
'<p style="margin-top: 30px;">' +
'<a href="{{urlSistema}}/almoxarifado/alertas" style="background-color: #6B7280; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; display: inline-block; font-weight: bold;">Ver Alertas</a>' +
'</p>' +
'<p style="color: #666666; font-size: 12px; margin-top: 30px; padding-top: 20px; border-top: 1px solid #E0E0E0;">' +
'Almoxarifado SGSE - Sistema de Gerenciamento de Secretaria' +
'</p>' +
'</div>',
variaveis: [
'materialNome',
'materialCodigo',
'tipoAlerta',
'quantidadeAtual',
'quantidadeMinima',
'unidadeMedida',
'dataIgnorado',
'urlSistema'
],
categoria: 'email' as const,
tags: ['almoxarifado', 'alerta', 'estoque', 'ignorado']
}
];