-- ---------------------------------------------------------------------------
-- Os caixas que ficaram abertos, e quais deles vao travar alguem (D28).
--
--   docker compose exec -T mysql mysql -uroot -proot franquiabv_dev \
--     < scripts/medir-caixas-abertos.sql
--
-- POR QUE ESTE ARQUIVO EXISTE. Em 31/08/2026 a regra de negocio foi enunciada:
-- o caixa nao atravessa a virada do dia. `VendaPagamentoService::finalizar()`
-- passou a recusar a venda quando o caixa aberto e de data anterior, e a tela
-- diz ao operador para fechar aquele caixa e abrir um novo.
--
-- Isso cria um problema de estreia: os caixas que JA estavam abertos antes da
-- regra existir. Medidos na copia da producao em 31/08/2026:
--
--     137 caixas abertos, o mais antigo de 20/10/2015
--      36 deles pertencem a usuario ATIVO  <- sao estes que travam alguem
--     101 pertencem a usuario inativo      <- ninguem vai tentar vender neles
--
-- O QUE FECHAR UM CAIXA SIGNIFICA, e e mais simples do que parece:
-- `CaixaService::fechar()` faz `setStatus(false)` e nada mais. O `valor_final`
-- ja e mantido durante a operacao por `atualizar()`, a cada pagamento e cada
-- retirada. Fechar NAO recalcula dinheiro -- so encerra o caixa com o saldo que
-- ele ja tem.
--
-- ESTE ARQUIVO NAO FECHA NADA. Ele mede e emite o comando, para ser conferido
-- antes de rodar. O UPDATE esta comentado no fim de proposito: mexer no
-- registro de dinheiro de 137 caixas nao e coisa que um roteiro deva fazer
-- sozinho, e a producao esta congelada de qualquer forma.
-- ---------------------------------------------------------------------------

SELECT '=== 1. QUANTOS SAO, E DE QUEM ===' AS '';

SELECT
    SUM(u.status = 1)                     AS de_usuario_ativo,
    SUM(u.status = 0 OR u.status IS NULL) AS de_usuario_inativo,
    COUNT(*)                              AS total,
    MIN(DATE(c.data_criacao))             AS mais_antigo
FROM caixas c
JOIN usuarios u ON u.id = c.usuario
WHERE c.id < 90000000
  AND (c.status = 1 OR c.data_alteracao IS NULL);

SELECT '=== 2. POR ANO DE ABERTURA ===' AS '';

SELECT
    YEAR(c.data_criacao) AS ano,
    COUNT(*)             AS abertos,
    SUM(u.status = 1)    AS de_usuario_ativo
FROM caixas c
JOIN usuarios u ON u.id = c.usuario
WHERE c.id < 90000000
  AND (c.status = 1 OR c.data_alteracao IS NULL)
GROUP BY YEAR(c.data_criacao)
ORDER BY ano;

SELECT '=== 3. OS DE USUARIO ATIVO, UM A UM -- SAO ESTES QUE TRAVAM ALGUEM ===' AS '';

SELECT
    c.id,
    DATE(c.data_criacao)                          AS aberto_em,
    DATEDIFF(CURDATE(), DATE(c.data_criacao))     AS dias_aberto,
    u.nome                                        AS usuario,
    ROUND(c.valor_inicial, 2)                     AS valor_inicial,
    ROUND(COALESCE(c.valor_final, 0), 2)          AS valor_final
FROM caixas c
JOIN usuarios u ON u.id = c.usuario
WHERE c.id < 90000000
  AND (c.status = 1 OR c.data_alteracao IS NULL)
  AND u.status = 1
ORDER BY c.data_criacao;

SELECT '=== 4. O COMANDO, PARA CONFERIR ANTES DE RODAR ===' AS '';

-- Fecha apenas os de usuario ativo, que sao os que travam. Os 101 de usuario
-- inativo nao atrapalham ninguem, e mexer neles seria alterar registro de
-- dinheiro sem necessidade nenhuma.
--
-- O DINHEIRO CONTADO (03/11/2026, a fatia 72; o D664): este UPDATE nao grava
-- `valor_contado` -- ninguem contou a gaveta destes caixas --, e o relatorio de
-- Caixa os mostra "sem registro", sem quebra. Fecha-los pela tela pediria uma
-- contagem, e o zero digitado daria um "faltou" com a gaveta esperada inteira.
--
-- DESCOMENTE PARA EXECUTAR, e so depois de olhar a listagem 3:
--
-- UPDATE caixas c
--   JOIN usuarios u ON u.id = c.usuario
--   SET c.status = 0, c.data_alteracao = NOW()
--   WHERE c.id < 90000000
--     AND (c.status = 1 OR c.data_alteracao IS NULL)
--     AND u.status = 1;

SELECT 'O UPDATE esta comentado no fim deste arquivo. Confira a listagem 3 antes.' AS '';
