[file name]: funcoes_quota.php
[file content begin]
<?php
/**
 * Função para verificar quota do tenant
 * @param int $tenant_id ID do tenant
 * @param int $tamanho_bytes Tamanho do arquivo em bytes
 * @return array Resultado da verificação
 */
function verificarQuotaTenant($tenant_id, $tamanho_bytes = 0) {
    global $conn;
    
    $stmt = $conn->prepare("
        SELECT 
            quota_total_mb,
            espaco_utilizado_total_mb,
            permite_aumento_quota,
            notificar_quota_80,
            notificar_quota_90
        FROM tenants 
        WHERE id = ?
    ");
    
    $stmt->bind_param("i", $tenant_id);
    $stmt->execute();
    $result = $stmt->get_result();
    
    if ($result->num_rows === 0) {
        return [
            'sucesso' => false,
            'mensagem' => 'Tenant não encontrado'
        ];
    }
    
    $tenant = $result->fetch_assoc();
    $stmt->close();
    
    // Converter bytes para MB
    $novo_arquivo_mb = $tamanho_bytes / 1048576.0;
    $total_apos_upload = $tenant['espaco_utilizado_total_mb'] + $novo_arquivo_mb;
    
    // Verificar se excede a quota
    if ($total_apos_upload > $tenant['quota_total_mb']) {
        $espaco_disponivel = $tenant['quota_total_mb'] - $tenant['espaco_utilizado_total_mb'];
        
        return [
            'sucesso' => false,
            'mensagem' => 'QUOTA_EXCEDIDA',
            'detalhes' => [
                'espaco_utilizado' => $tenant['espaco_utilizado_total_mb'],
                'quota_total' => $tenant['quota_total_mb'],
                'espaco_disponivel' => max(0, $espaco_disponivel),
                'tamanho_arquivo_mb' => $novo_arquivo_mb,
                'permite_aumento' => $tenant['permite_aumento_quota']
            ]
        ];
    }
    
    // Verificar notificações
    $percentual_uso = ($total_apos_upload / $tenant['quota_total_mb']) * 100;
    $notificar = false;
    $nivel_notificacao = '';
    
    if ($tenant['notificar_quota_90'] && $percentual_uso >= 90) {
        $notificar = true;
        $nivel_notificacao = 'CRITICO';
    } elseif ($tenant['notificar_quota_80'] && $percentual_uso >= 80) {
        $notificar = true;
        $nivel_notificacao = 'ALERTA';
    }
    
    return [
        'sucesso' => true,
        'mensagem' => 'QUOTA_OK',
        'detalhes' => [
            'espaco_utilizado' => $tenant['espaco_utilizado_total_mb'],
            'quota_total' => $tenant['quota_total_mb'],
            'espaco_disponivel' => $tenant['quota_total_mb'] - $total_apos_upload,
            'percentual_uso' => $percentual_uso,
            'notificar' => $notificar,
            'nivel_notificacao' => $nivel_notificacao
        ]
    ];
}

/**
 * Atualizar espaço usado pelo tenant
 * @param int $tenant_id ID do tenant
 * @param float $tamanho_mb Tamanho em MB (positivo para upload, negativo para delete)
 * @param int $usuario_id ID do usuário que fez a ação
 * @param int $arquivo_id ID do arquivo (opcional)
 * @param int $cliente_id ID do cliente (opcional)
 * @return bool Sucesso da operação
 */
function atualizarEspacoTenant($tenant_id, $tamanho_mb, $usuario_id = null, $arquivo_id = null, $cliente_id = null) {
    global $conn;
    
    $conn->begin_transaction();
    
    try {
        // Atualizar espaço no tenant
        $stmt = $conn->prepare("
            UPDATE tenants 
            SET espaco_utilizado_total_mb = GREATEST(0, espaco_utilizado_total_mb + ?),
                data_controle_espaco = NOW()
            WHERE id = ?
        ");
        
        $stmt->bind_param("di", $tamanho_mb, $tenant_id);
        
        if (!$stmt->execute()) {
            throw new Exception("Erro ao atualizar espaço do tenant: " . $stmt->error);
        }
        $stmt->close();
        
        // Registrar no histórico
        $stmt_historico = $conn->prepare("
            INSERT INTO tenant_uso_espaco 
            (tenant_id, acao, tamanho_alteracao_mb, espaco_total_mb, usuario_id, arquivo_id, cliente_id)
            SELECT 
                ?,
                CASE WHEN ? >= 0 THEN 'upload' ELSE 'delete' END,
                ?,
                espaco_utilizado_total_mb,
                ?,
                ?,
                ?
            FROM tenants 
            WHERE id = ?
        ");
        
        $stmt_historico->bind_param("isdiiii", 
            $tenant_id, 
            $tamanho_mb,
            $tamanho_mb,
            $usuario_id,
            $arquivo_id,
            $cliente_id,
            $tenant_id
        );
        
        if (!$stmt_historico->execute()) {
            throw new Exception("Erro ao registrar histórico: " . $stmt_historico->error);
        }
        $stmt_historico->close();
        
        $conn->commit();
        return true;
        
    } catch (Exception $e) {
        $conn->rollback();
        error_log("Erro ao atualizar espaço tenant: " . $e->getMessage());
        return false;
    }
}

/**
 * Obter relatório de uso por tenant
 * @param int $tenant_id ID do tenant
 * @return array Relatório detalhado
 */
function obterRelatorioQuotaTenant($tenant_id) {
    global $conn;
    
    $stmt = $conn->prepare("
        SELECT 
            t.*,
            COUNT(DISTINCT c.id) as total_clientes,
            COUNT(DISTINCT a.id) as total_arquivos,
            COALESCE(SUM(c.espaco_utilizado_mb), 0) as espaco_clientes,
            (SELECT COUNT(*) FROM tenant_uso_espaco WHERE tenant_id = t.id) as total_operacoes
        FROM tenants t
        LEFT JOIN clientes c ON t.id = c.tenant_id AND c.deletado_em IS NULL
        LEFT JOIN cliente_arquivos a ON c.id = a.cliente_id
        WHERE t.id = ?
        GROUP BY t.id
    ");
    
    $stmt->bind_param("i", $tenant_id);
    $stmt->execute();
    $result = $stmt->get_result();
    
    if ($result->num_rows === 0) {
        return null;
    }
    
    $relatorio = $result->fetch_assoc();
    $stmt->close();
    
    // Calcular percentuais
    $relatorio['percentual_uso'] = $relatorio['quota_total_mb'] > 0 
        ? ($relatorio['espaco_utilizado_total_mb'] / $relatorio['quota_total_mb']) * 100 
        : 0;
    
    $relatorio['espaco_disponivel'] = $relatorio['quota_total_mb'] - $relatorio['espaco_utilizado_total_mb'];
    
    // Obter histórico recente
    $stmt_historico = $conn->prepare("
        SELECT 
            acao,
            tamanho_alteracao_mb,
            espaco_total_mb,
            data_acao,
            u.nome as usuario_nome,
            c.Nome_Cliente as cliente_nome
        FROM tenant_uso_espaco te
        LEFT JOIN usuarios u ON te.usuario_id = u.id
        LEFT JOIN clientes c ON te.cliente_id = c.id
        WHERE te.tenant_id = ?
        ORDER BY te.data_acao DESC
        LIMIT 10
    ");
    
    $stmt_historico->bind_param("i", $tenant_id);
    $stmt_historico->execute();
    $relatorio['historico_recente'] = $stmt_historico->get_result()->fetch_all(MYSQLI_ASSOC);
    $stmt_historico->close();
    
    return $relatorio;
}
[file content end]