Documentação Técnica

O BP.PertCalc é uma aplicação de estimativa de projetos desenvolvida com arquitetura MVC simplificada, focada em performance e precisão matemática. Diferente de soluções "No-Code", este sistema foi codificado manualmente para garantir controle total sobre a lógica de negócios e segurança dos dados.

Esta documentação destina-se a desenvolvedores e avaliadores técnicos interessados na arquitetura interna do software.

Tech Stack

Backend Core

  • PHP 8.2 (Vanilla)
  • MySQL (InnoDB)
  • PDO (Database Abstraction)
  • FPDF / Dompdf (Reporting)

Frontend & UX

  • HTML5 Semântico
  • Tailwind CSS (Utility-first)
  • Chart.js (Data Visualization)
  • Lucide Icons

Modelagem de Dados

Utilizamos um banco relacional normalizado. Abaixo, o DDL da tabela principal de projetos, demonstrando o uso de chaves estrangeiras e tipos de dados otimizados.

SQL
CREATE TABLE projects (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    project_name VARCHAR(100),
    methodology VARCHAR(50) DEFAULT 'Scrum',
    hourly_rate DECIMAL(10, 2), -- Precisão financeira
    estimated_hours DECIMAL(10, 2),
    total_cost DECIMAL(10, 2),
    complexity_level ENUM('Baixa', 'Média', 'Alta'),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    -- Integridade Referencial (Cascade Delete)
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB;

O Algoritmo PERT

A precisão do sistema baseia-se na Média Ponderada (Beta Distribution). A lógica é aplicada tanto no Frontend (para feedback em tempo real) quanto validada no Backend.

PHP
// Trecho extraído de app/logic.php

function calculatePert($optimistic, $likely, $pessimistic) {
    // Aplica peso 4 ao cenário mais provável
    $weighted_avg = ($optimistic + (4 * $likely) + $pessimistic) / 6;
    
    // Retorna com precisão de 1 casa decimal
    return round($weighted_avg, 1);
}

// Exemplo de uso em loop de tarefas
$total_hours = 0;
foreach ($tasks as $task) {
    $total_hours += calculatePert($task['opt'], $task['ml'], $task['pess']);
}

Segurança

A aplicação implementa camadas de defesa em profundidade, não confiando em inputs do usuário.

  • Prepared Statements (PDO)

    Todas as queries utilizam binding de parâmetros para prevenir injeção de SQL (SQL Injection).

  • Password Hashing

    Senhas nunca são salvas em texto puro. Utilizamos password_hash() com algoritmo Bcrypt.