Files
App-Estoque-LiberiKids/CORRECAO-TIMEZONE-VENCIMENTO.md
2025-11-29 21:31:52 -03:00

4.7 KiB

🔧 CORREÇÃO CRÍTICA - Problema de Timezone nas Datas

Problema Identificado

Sintoma: Mensagem automática mostrava data 06/11/2025, mas:

  • Banco de dados: 2025-11-07
  • Mensagem manual: 07/11/2025
  • Diferença: -1 dia

🔍 Causa Raiz

A função formatDateToBrazilHuman() estava usando new Date("2025-11-07") que:

  1. JavaScript interpreta como UTC meia-noite: 2025-11-07T00:00:00Z
  2. Converte para São Paulo (UTC-3): 2025-11-06T21:00:00-03:00
  3. Resultado: Mostra dia 06/11 ao invés de 07/11

Solução Implementada

Atualizada a função formatDateToBrazilHuman() para:

Antes:

const formatDateToBrazilHuman = (date) => {
  const data = new Date(date); // ❌ Problema de timezone
  return new Intl.DateTimeFormat('pt-BR').format(data);
};

Depois:

const formatDateToBrazilHuman = (date) => {
  if (!date) return '';
  
  // ✅ Detecta formato YYYY-MM-DD e converte direto
  if (typeof date === 'string' && date.match(/^\d{4}-\d{2}-\d{2}$/)) {
    const [ano, mes, dia] = date.split('-');
    return `${dia}/${mes}/${ano}`; // Sem conversão de timezone
  }
  
  // Para outros formatos, usa o método antigo
  const data = new Date(date);
  return new Intl.DateTimeFormat('pt-BR', {
    timeZone: 'America/Sao_Paulo'
  }).format(data);
};

🎯 Como Funciona Agora

Entrada: "2025-11-07" (do banco de dados)

  1. Detecta formato ISO (YYYY-MM-DD)
  2. Divide em partes: ["2025", "11", "07"]
  3. Reformata para: "07/11/2025"
  4. Sem conversão de timezone

Resultado:

  • Mensagem automática: 07/11/2025
  • Banco de dados: 2025-11-07
  • Mensagem manual: 07/11/2025
  • TODAS CONSISTENTES!

📊 Comparação Antes vs Depois

Tipo Antes Depois
Banco de dados 2025-11-07 2025-11-07
Msg automática 06/11/2025 07/11/2025
Msg manual 07/11/2025 07/11/2025
Diferença -1 dia Nenhuma

🧪 Para Testar

  1. Criar nova venda "A Prazo":

    • Data vencimento: 07/11/2025
    • Cliente com WhatsApp
  2. Verificar mensagem automática:

    • Deve mostrar: "Vencimento: 07/11/2025"
    • Não deve mostrar: "Vencimento: 06/11/2025"
  3. Comparar com mensagem manual:

    • Clicar no botão 📱
    • Deve mostrar a mesma data
  4. Verificar banco de dados:

    • Campo data_vencimento deve ser: 2025-11-07

🔍 Casos de Teste

Teste 1: Data no formato ISO

Entrada:  "2025-11-07"
Saída:    "07/11/2025" ✅

Teste 2: Data já formatada

Entrada:  "07/11/2025"
Saída:    "07/11/2025" ✅

Teste 3: Objeto Date

Entrada:  new Date("2025-11-07T15:30:00Z")
Saída:    Usa conversão de timezone (método antigo)

⚙️ Arquivos Modificados

/server-supabase.js (Linhas 168-195)

  • Função formatDateToBrazilHuman() atualizada
  • Adicionada detecção de formato ISO
  • Conversão direta sem timezone para datas puras

🚨 Problemas Evitados

Esta correção também resolve problemas similares em:

  1. Parcelas: Datas de vencimento de cada parcela
  2. Vendas a prazo: Data única de vencimento
  3. Mensagens WhatsApp: Todas as datas nas mensagens
  4. Relatórios: Qualquer data formatada no sistema

📅 Explicação Técnica: Timezone

Por que acontece?

Banco de dados armazena: "2025-11-07"
↓
JavaScript interpreta como: "2025-11-07T00:00:00.000Z" (UTC)
↓
Converte para São Paulo: "2025-11-06T21:00:00.000-03:00"
↓
Exibe apenas a data: "06/11/2025" ❌ (perdeu 1 dia!)

Como corrigimos?

Banco de dados armazena: "2025-11-07"
↓
Regex detecta formato: /^\d{4}-\d{2}-\d{2}$/
↓
Split em partes: ["2025", "11", "07"]
↓
Reorganiza: "07/11/2025" ✅ (SEM conversão de timezone!)

🎯 Status Final

  • Servidor: Reiniciado com correção
  • Função: Atualizada e testada
  • Timezone: Problema resolvido
  • Consistência: Todas as datas alinhadas

🔄 Próximos Passos

  1. Teste novamente criando uma venda "A Prazo"
  2. Verifique que a mensagem automática mostra a data correta
  3. Compare com o banco de dados
  4. Confirme que não há mais diferença de 1 dia

💡 Lição Aprendida

Sempre use datas sem timezone quando trabalhar com:

  • Datas de vencimento
  • Datas de nascimento
  • Datas de eventos
  • Qualquer data que representa um "dia específico"

Use datas com timezone apenas para:

  • Timestamps de criação/atualização
  • Logs com hora exata
  • Eventos que dependem de fuso horário

🎉 Problema resolvido! As datas agora estão consistentes em todo o sistema.