<file_sep><?php

class Disciplina
{
    /**
     * @var string
     */
    public $nome;

    /**
     * @var string
     */
    private $codigo;

    /**
     * @var int
     */
    public $creditos;

    /**
     * @var static
     */
    public static $ministrada;

    public static function ministrarDisciplina()
    {
        self::$ministrada++;
    }

    public function verDisciplina()
    {
        return "{$this->nome} ({$this->codigo}) - {$this->creditos} créditos - " . self::$ministrada;
    }

    /**
     * @return  string
     */
    public function getCodigo(): string
    {
        return $this->codigo;
    }

    /**
     * @param  string  $codigo
     * @return  void
     */
    public function setCodigo(string $codigo): void
    {
        $this->codigo = $codigo;
    }
}
<file_sep><?php

declare(strict_types=1);

error_reporting(E_ALL);
ini_set('display_errors', 'true');

?>
<!doctype html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Sistema de gestão acadêmica</title>
</head>

<body>
    <h2>Estudante</h2>
    <?php
    require './Pessoa.php';
    require './Estudante.php';
    require './Professor.php';
    require './Disciplina.php';

    $estudante = new Estudante('<EMAIL>');
    echo $estudante->disciplinasMatriculadas() . '<br>';

    echo '<br><hr>';

    $estudanteDados = $estudante->verEstudante();

    echo "Nome estudante: {$estudanteDados->nome} <br>";
    echo "Telefone: {$estudanteDados->telefone} <br>";
    echo "Email: {$estudanteDados->email} <br>";
    echo "Data nascimento: {$estudanteDados->data_nascimento} <br>";
    echo "Idade: {$estudante->calculaIdade($estudanteDados->data_nascimento)} <br>";
    echo "Matricula: {$estudanteDados->matricula} <br>";
    echo "IRA: {$estudanteDados->ira} <br>";
    echo utf8_decode("Avaliação do aluno: {$estudante->calculaAvaliacao()}") . '<br>';

    ?>

    <br>
    <hr><br>

    <h2>Disciplinas</h2>
    <?php
    $disciplinaMatematica = new Disciplina();
    $disciplinaMatematica->nome = 'Matematica';
    $disciplinaMatematica->setCodigo('MAT');
    $disciplinaMatematica->creditos = 4;
    Disciplina::ministrarDisciplina();
    $matematica = $disciplinaMatematica->verDisciplina();

    echo utf8_decode($matematica . PHP_EOL);
    ?>

    <br><br>

    <?php
    $disciplinaPortugues = new Disciplina();
    $disciplinaPortugues->nome = 'Portugues';
    $disciplinaPortugues->setCodigo('PORT');
    $disciplinaPortugues->creditos = 4;
    Disciplina::ministrarDisciplina();

    echo utf8_decode($disciplinaPortugues->verDisciplina());
    ?>

    <br>
    <hr><br>

    <h2>Professor</h2>
    <?php
    $conexao = new Connection();
    $professores = $conexao->listaProfessores();

    foreach ($professores as $professor) {
        echo utf8_decode($professor['nome']) . " <a href='editarEstudante.php?email={$professor['email']}'>Editar</a><br>";
    }
    ?>
</body>

</html><file_sep># LAMP Stack

* PHP Version 7.3.8
* Apache Version 2.4
* MySQL version 8.0.17
* Redis Version latest


## Installation

```shell 
git clone 
https://github.com/cafe-chopp/php-docker-environment.git
cd php-docker-environment
docker-compose up -d
```

## Ports from services Stack

`Ports`
`apache2:8080`
`mysql:3306`

## User and password From Services
users and passwords and the paths are within .env

You can access it via `http://localhost`.


### caso ocorra erros ao conectar com banco de dados:
### entrar dentro do container do mysql e executar comandos

$ mysql -u root -p

### digite a senha <PASSWORD>

$ ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '<PASSWORD>';
$ ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

### depois verifique se a conexao ocorreu

$ php -r "new PDO('mysql:host=mysql;dbname=api_base', 'root', 'root');"





<file_sep><?php

declare(strict_types=1);

class Connection
{
    private $dsn = 'mysql:unix_socket=/var/run/mysqld/mysqld.sock;host=mysql;port=3306;dbname=api_base';
    private $username = 'root';
    private $password = '<PASSWORD>';
    public $connect = null;
    private $options = array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
    );

    public function connect()
    {
        try {
            $this->connect = new PDO($this->dsn, $this->username, $this->password, $this->options);
            return $this->connect;
        } catch (PDOException $e) {
            throw new PDOException($e->getMessage(), (int)$e->getCode());
        } catch (Throwable $e) {
            throw $e;
        }
    }

    /**
     * @return array
     * @throws Throwable
     */
    public function listaProfessores(): array
    {
        $sql = "SELECT
                   nome,
                   email,
                   especialidade, 
                   salario, 
                   data_nascimento
                FROM professor p
                LEFT JOIN pessoa po on p.pessoa_id = po.ID";

        $conectar = $this->connect();
        $result = $conectar->prepare($sql);
        $result->execute();
        return $result->fetchAll();
    }
}
<file_sep><!doctype html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Editar Estudante</title>
</head>

<body>

    <h1>Edição de Estudante</h1>

    <?php
    require './Pessoa.php';
    require './Estudante.php';

    $estudante = new Estudante($_GET['email']);

    if (isset($_POST['editarEstudante'])) {
        $formData = filter_input_array(INPUT_POST, FILTER_DEFAULT);

        $estudante = new Estudante($formData['email']);
        $estudanteDados = $estudante->editarEstudante($formData);

        if ($estudanteDados) {
            echo "Estudante editado com sucesso!";
            echo "<a href='index.php'><br>Voltar</a>";
        } else {
            echo "Ocorreu um problema ao editar Estudante.";
        }
    } else {
        $estudanteDados = $estudante->verEstudante(); ?>

        <form name="EdicaoEstudante" action="" method="POST">
            <input type="hidden" name="id" value="<?= $estudanteDados->ID ?>">
            <p>
                <label>Nome</label>
                <input type="text" name="nome" required value="<?= $estudanteDados->nome ?>">
            </p>
            <p>
                <label>Telefone</label>
                <input type="text" name="telefone" value="<?= $estudanteDados->telefone ?>">
            </p>
            <p>
                <label>Email</label>
                <input type="text" name="email" value="<?= $estudanteDados->email ?>">
            </p>
            <p>
                <label>Data Nascimento</label>
                <input type="text" name="data_nascimento" value="<?= $estudanteDados->data_nascimento ?>">
            </p>
            <p>
                <label>Matrícula</label>
                <input type="text" name="matricula" value="<?= $estudanteDados->matricula ?>">
            </p>
            <input type="submit" value="Editar Estudante" name="editarEstudante">
        </form>
    <?php
    }
    ?>
    <br>

</body>

</html><file_sep><!doctype html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Cadastro Estudante</title>
</head>

<body>

    <h1>Cadastro de Estudante</h1>

    <?php
    require './Pessoa.php';
    require './Estudante.php';

    $formData = filter_input_array(INPUT_POST, FILTER_DEFAULT);

    if (!empty($formData)) {
        $estudante = new Estudante($formData['email']);
        $cadastro = $estudante->criarEstudante($formData);

        if ($cadastro) {
            echo "Estudante cadastrado com sucesso!";
        } else {
            echo "Ocorreu um problema ao cadastrar Estudante.";
        }
    }
    ?>

    <form name="CadastroEstudante" action="" method="POST">
        <p>
            <label>Nome</label>
            <input type="text" name="nome" required>
        </p>
        <p>
            <label>Telefone</label>
            <input type="text" name="telefone">
        </p>
        <p>
            <label>Email</label>
            <input type="text" name="email">
        </p>
        <p>
            <label>Data Nascimento</label>
            <input type="text" name="data_nascimento">
        </p>
        <p>
            <label>Matrícula</label>
            <input type="text" name="matricula">
        </p>
        <input type="submit" value="Cadastrar Estudante" name="CadastrarEstudante">
</body>

</html><file_sep><?php

declare(strict_types=1);

class Estudante extends Pessoa
{
    /**
     * @var string
     */
    public $matricula;

    /**
     * @var string
     */
    public $ira;

    /**
     * @return string
     */
    public function disciplinasMatriculadas(): string
    {
        return "POO - PHP Orientado a Objetos";
    }

    /**
     * @param int $nota
     * @return int
     */
    public function atualizaIRA(int $nota): int
    {
        $this->ira += $nota;
        return $this->ira;
    }

    /**
     * @return object
     * @throws Throwable
     */
    public function verEstudante(): object
    {
        $conn = new Connection();
        $conectar = $conn->connect();

        $sql = "SELECT 
                    ID,
                    nome, 
                    telefone, 
                    email,
                    data_nascimento,
                    matricula,
                    ira
                FROM api_base.estudante e
                LEFT JOIN api_base.pessoa p on e.pessoa_id = p.ID 
                WHERE email = :email";

        $result = $conectar->prepare($sql);
        $result->execute(array(':email' => $this->email));

        return $result->fetchObject();
    }

    /**
     * @return float
     */
    public function calculaAvaliacao(): float
    {
        $ira = 50;
        $porcentagemPresenca = 80;

        return ($ira * $porcentagemPresenca);
    }

    public function criarEstudante(array $estudante): bool
    {
        $conn = new Connection();
        $conexao = $conn->connect();

        $sql = "INSERT INTO pessoa(nome, telefone, email, data_nascimento)
                VALUES(:nome, :telefone, :email, :data_nascimento)";

        $result = $conexao->prepare($sql);
        $result->execute(
            array(
                ':nome' => $estudante['nome'],
                ':telefone' => $estudante['telefone'],
                ':email' => $estudante['email'],
                ':data_nascimento' => $estudante['data_nascimento']
            )
        );

        $estudanteId = $conexao->lastInsertId();

        if ($estudanteId) {
            $sql = "INSERT INTO estudante(pessoa_id, matricula)
                    VALUES(:pessoa_id, :matricula)";

            $result = $conexao->prepare($sql);
            $result->execute(array(
                ':pessoa_id' => $estudanteId,
                ':matricula' => $estudante['matricula']
            ));

            if ($result->rowCount()) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    public function editarEstudante(array $estudante): bool
    {
        $conn = new Connection();
        $conexao = $conn->connect();

        $sql = "UPDATE pessoa 
                    SET nome = :nome, 
                        telefone = :telefone, 
                        email = :email, 
                        data_nascimento = :data_nascimento
                WHERE ID = :id";

        $result = $conexao->prepare($sql);
        $resultStatus = $result->execute(array(
            ':nome' => $estudante['nome'],
            ':telefone' => $estudante['telefone'],
            ':email' => $estudante['email'],
            ':data_nascimento' => $estudante['data_nascimento'],
            ':id' => $estudante['id']
        ));

        if ($resultStatus) {
            $sql = "UPDATE estudante
                        SET matricula = :matricula
                    WHERE pessoa_id = :id";

            $result = $conexao->prepare($sql);
            $resultStatus = $result->execute(array(
                ':matricula' => $estudante['matricula'],
                ':id' => $estudante['id']
            ));

            if ($resultStatus) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
}
<file_sep><?php

declare(strict_types=1);

require './Connection.php';

abstract class Pessoa
{
    /**
     * @var int
     */
    public $id;

    /**
     * @var string
     */
    public $nome;

    /**
     * @var string
     */
    public $telefone;

    /**
     * @var string
     */
    public $email;

    /**
     * @var string
     */
    public $dataNascimento;

    public function __construct(
        string $email
    ) {
        $this->email = $email;
    }

    /**
     * @return object
     * @throws Throwable
     */
    public function verDados(): object
    {
        $conn = new Connection();
        $conectar = $conn->connect();

        $sql = "SELECT 
                    nome, 
                    telefone, 
                    email
                FROM api_base.pessoa
                WHERE email = :email";

        $result = $conectar->prepare($sql);
        $result->execute(array(':id' => $this->id));

        return $result->fetchObject();
    }

    public function calculaIdade(string $dataNascimento): int
    {
        $date = new DateTime($dataNascimento);
        $intervalo = $date->diff(new DateTime(date('Y-m-d')));
        return intval($intervalo->format('%Y'));
    }

    abstract public function calculaAvaliacao();
}
<file_sep><?php

declare(strict_types=1);

class Professor extends Pessoa
{
    /**
     * @var string
     */
    public $especialidade;

    /**
     * @var float
     */
    public $salario;

    public function verProfessor(): object
    {
        $conn = new Connection();
        $conectar = $conn->connect();

        $sql = "SELECT 
                    nome, 
                    telefone, 
                    email, 
                    especialidade, 
                    salario, 
                    data_nascimento
                FROM api_base.professor pr
                LEFT JOIN api_base.pessoa pe on pr.pessoa_id = pe.ID 
                WHERE email = :email";

        $result = $conectar->prepare($sql);
        $result->execute(array(':email' => $this->email));

        return $result->fetchObject();
    }

    /**
     * @return float
     */
    public function calculaAvaliacao(): float
    {
        $qtdDisciplinasMinistradas = 100;
        $qtdAnosInstituicao = 12;

        return ($qtdDisciplinasMinistradas * $qtdAnosInstituicao);
    }
}
