Jump to content
Fórum Script Brasil
  • 0

Projeto Polo Portaria usando classes


Frank K Hosaka

Question

O projeto original trabalhava com quatro campos, manhãHoraEntrada, manhãHoraSaída, TardeHoraEntrada, TardeHoraSaída, eu simplifiquei em apenas dois campos, e assim consegui registrar várias entradas no mesmo dia e até saída no dia seguinte (o relatório ficou péssimo, mas dá para entender mais ou menos o movimento do colaborador ao longo do dia). O projeto original tinha rotina de login, CSS, e o meu projeto não tem nada disso. Aqui o meu foco é o banco de dados e como o PHP é bastante útil dentro do HTML.


arquivo /Polo/Controles/ControlePortaria.php
<?php

$projeto="/Polo";
require_once $_SERVER['DOCUMENT_ROOT']."$projeto/Modelos/Config.php";

class ControlePortaria
{
    private $Conexao;

    public function __construct()
    {
        $this->Conexao=new Conexao;
    }

    public function cadastroNovo()
    {
        if(isset($_POST['nome']))
        {
            $nome=$_POST['nome'];
            $verificar=$this->Conexao->select("nome from cadastros where nome='$nome'")[0]->nome;
            if($verificar)
            {
                $mensagem="Já existe $verificar no cadastro";
                return view('Mensagem',['mensagem'=>$mensagem]);
            }
            $id=$_POST['id'];
            $imagem=file_get_contents($_FILES['foto']['tmp_name']);
            $extensao = pathinfo($_FILES['foto']['name'], PATHINFO_EXTENSION);
            $arquivo="Fotos/$id.$extensao";
            file_put_contents($arquivo,$imagem);
            $this->Conexao->insert("cadastros (nome,foto) values ('$nome','$arquivo')");
            return header("location:index.php");
        }
        $id=$this->Conexao->select("max(id) as maximo from cadastros")[0]->maximo+1;
        return view('CadastroNovo',['id'=>$id]);
    }

    public function entrada($id)
    {
        $agora=date('Y-m-d H:i');
        $this->Conexao->update("movimentos set horaentrada='$agora'
            where id=$id");
        return header("location:index.php");
    }

    public function inicio()
    {
        $hoje=date('d/m/y');
        $verifica=$this->Conexao->select("* from cadastros");
        foreach($verifica as $ver)
        {
            $teste=$this->Conexao->select("* from movimentos 
                where idCadastro=$ver->id and horasaida is null");
            if(!$teste)
            {
                $this->Conexao->insert("movimentos (idCadastro) values ($ver->id)");
            }
        }
        $cadastros=$this->Conexao->select("cadastros.id, nome, foto, movimentos.id as iid, 
            idCadastro, horaentrada, horasaida from cadastros 
            join movimentos on cadastros.id = movimentos.idCadastro
            where horasaida is null order by cadastros.nome");
        $mensagem="";
        if(count($cadastros)==0)
        {
            $mensagem="Ninguém foi cadastrado, ainda!";
        }
        return view('Movimento',['cadastros'=>$cadastros,'mensagem'=>$mensagem,'hoje'=>$hoje]);
    }

    public function relatorio($dia = null)
    {
        $dia=($dia) ? $dia : date('Y-m-d');
        $movimentos=$this->Conexao->select("* from movimentos join cadastros 
            on movimentos.idCadastro = cadastros.id where 
            date(horaentrada)='$dia' order by cadastros.nome");
        $mensagem="";
        if(count($movimentos)==0)
        {
            $mensagem="Não houve movimento nesse dia.";
        }
        return view('Relatorio',['dia'=>$dia,'movimentos'=>$movimentos,'mensagem'=>$mensagem]);
    }

    public function saida($id)
    {
        $agora=date('Y-m-d H:i');
        $this->Conexao->update("movimentos set horasaida='$agora' where id=$id");
        $this->inicio();
    }
}

arquivo /Polo/Fotos/1.png
arquivo /Polo/Fotos/2.jpeg
arquivo /Polo/Fotos/padrão.jpg
arquivo /Polo/Modelos/Conexao.php
<?php
class Conexao 
{
    private static $pdo;

    
    public static function instancia()
    {
        if (!self::$pdo) 
        {   // Veririca se o banco de dados existe
            $dbName = DBNAME;
            $checkDbExistsQuery = "SELECT * FROM sys.schema_table_statistics WHERE table_schema = '$dbName'";
            try 
            {
                $tempPdo = new PDO("mysql:host=" . HOST, USER, PASSWORD);
                $result = $tempPdo->query($checkDbExistsQuery);
                $dbExists = $result->fetchColumn() === $dbName;
                $tempPdo = null; // fecha a conexão temporária do PDO
            } 
            catch (PDOException $e)
            {
                die("Erro ao procurar o banco de dados: " . $e->getMessage());
            }
        
            // Criar o banco de dados se ele não existe
            if (!$dbExists) 
            {
                $createDbQuery = "CREATE DATABASE $dbName";
                try 
                {
                    $pdo = new PDO("mysql:host=" . HOST, USER, PASSWORD);
                    $pdo->exec($createDbQuery);
                    $pdo->exec("USE ". DBNAME);
                    $pdo->exec("CREATE TABLE `cadastros` (`id` int NOT NULL AUTO_INCREMENT,
                        `nome` varchar(45) NOT NULL,`foto` varchar(45) NOT NULL,PRIMARY KEY (`id`)) 
                        ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci");
                    $pdo->exec("CREATE TABLE `movimentos` (`id` int NOT NULL AUTO_INCREMENT,
                        `idCadastro` int NOT NULL,`horaentrada` varchar(20) DEFAULT NULL,
                        `horasaida` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`))
                        ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci");                 
                } 
                catch (PDOException $e) 
                {
                    die("Erro ao criar o banco de dados: " . $e->getMessage());
                }
            }
        
            // fazer a conexão com o banco de dados
            self::$pdo = new PDO("mysql:host=" . HOST . ";dbname=" . DBNAME, USER, PASSWORD);
        }
        
        return self::$pdo;
    }

    public function delete($sql)
    {
        return $this->instancia()->query("delete from $sql");
    }
    
    public function exec($sql)
    {
        return $this->instancia()->query($sql);
    }
    
    public function insert($sql)
    {
        return $this->instancia()->query("insert into $sql");
    }
    
    public function select($sql)
    {   
        $stmt=$this->instancia()->query("select $sql");
        return $stmt->fetchAll(PDO::FETCH_OBJ);
    }
    
    public function update($sql)
    {
        return $this->instancia()->query("update $sql");
    }
        
}

arquivo /Polo/Modelos/Config.php
<?php
date_default_timezone_set('America/Sao_Paulo');

$baseDir = $_SERVER['DOCUMENT_ROOT'].'/Polo/';
define('PROJETO', $baseDir);
define('CONTROLES', PROJETO.'/Controles/');
define('FOTOS',PROJETO.'/Fotos/');
define('MODELOS', PROJETO.'/Modelos/');
define('VISOES', PROJETO.'/Visoes/');
define('HOST', 'localhost');
define('DBNAME','polo');
define('USER','root');
define('PASSWORD','');

spl_autoload_register(function ($classe) 
{
    $diretorios = ['Controles', 'Modelos', 'Visoes'];
    foreach ($diretorios as $diretorio) 
    {
        $arquivo = PROJETO . DIRECTORY_SEPARATOR . $diretorio . DIRECTORY_SEPARATOR . $classe . '.php';
        if (file_exists($arquivo)) 
        {
            require_once $arquivo;
            return;
        }
    }
    throw new Exception("Erro ao carregar a classe '{$classe}'. Arquivo não encontrado.");
});

function view($arquivo, $array = null)
    {
        if (!is_null($array)) 
        {
            foreach ($array as $var => $value) 
            {
                ${$var} = $value;
            }
        }
        include VISOES . $arquivo . ".php";
    }


arquivo /Polo/Visoes/CadastroNovo.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Formulário de Cadastro</title>
<script>
function atualizarImagem() 
{
  file = document.getElementById('foto').files[0]
  reader = new FileReader()
  reader.onload = function(event) 
  {
    imageURL = event.target.result;
    document.getElementById('imagemPreview').src = imageURL;
  }
  reader.readAsDataURL(file);
}
</script>
</head>
<body style="width:500px;margin:0 auto">
<fieldset>
<legend><h3>Formulário de Cadastros id=<?=$id?></h3></legend>
<div style=float:left;width:190px>
<img src="Fotos/padrão.jpg" height="190" width="150" id=imagemPreview>
</div>
<div style=float:left;width:250px>
<form action="?ControlePortaria.cadastroNovo" method="post" enctype='multipart/form-data'>
	<table>
	<tr><td><label for=foto style=display:block>Selecione uma foto</label>
	<tr><td><input type="file" name="foto" id="foto" onchange="atualizarImagem()">
	<tr style=height:20px>
	<tr><td>Nome:
	<tr><td><input name="nome" placeholder="Informe o Nome" size=30 required>
			<input type=hidden name=id value=<?=$id?>>
	<tr><td><input type=submit value=Gravar>
	<tr><td><a href='?ControlePortaria.inicio'>Cancelar</a>
	</table>
</form>
</div>
</fieldset>

arquivo /Polo/Visoes/Mensagem.php
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Mensagem</title>
</head>
<body style="width:500px;margin:0 auto">
<fieldset>
	<legend><h3>Mensagem</h3></legend>
	<h4><?=$mensagem?></h4>
	<h4><a href=index.php>Voltar</a></h4>
</fieldset>

arquivo /Polo/Visoes/Movimento.php
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Movimento na Portaria</title>
	<script>
		function altera(imagem)
		{
			if (imagem.height === 10) 
			{
    			imagem.height = 190;
  			} 
			else 
			{
   				 imagem.height = 10;
 			}
		}
	</script>
</head>
<body style="width:500px;margin:0 auto">
<fieldset>
	<legend><h3>Movimento na Portaria em <?=$hoje?> </h3></legend>
	<form>
		<input name=nome placeholder="Busca por nome" onchange=submit()>
		<a href='?ControlePortaria.cadastroNovo'>Cadastrar Pessoas</a>
		<a href='?ControlePortaria.relatorio'> Relatório</a>
	</form>
	<h4><?=$mensagem?></h4>
	<table>
	<tr><th>id<th>Pessoa<th>Entrada<th>Saída<th>Foto
	<?php foreach($cadastros as $c): ?>
	<tr><td><?=$c->id?><td><?=$c->nome?>
	<?php if(is_null($c->horaentrada)): 
		$entrada="<input type=submit value='Confirmar' 
			onclick=location.replace('?ControlePortaria.entrada.$c->iid')>";
		$saida=null;
		else: 
		$entrada=date('H:i',strtotime($c->horaentrada));
		$saida="<input type=submit value='Confirmar'
			onclick=location.replace('?ControlePortaria.saida.$c->iid')>"; 
		endif; ?>
	<td style=text-align:center><?=$entrada?><td><?=$saida?>
	<td><img src=<?=$c->foto?> height="10" width="150" id=imagem onclick=altera(imagem)>
	<?php endforeach; ?>
</fieldset>

arquivo /Polo/Visoes/Relatorio.php
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>Relatorio</title>
	
</head>
<body style="width:500px;margin:0 auto">
<fieldset>
	<legend>
		<h3>
		Relatorio de 
		<input type=date value=<?=$dia?> 
			onchange='location.replace("?ControlePortaria.relatorio."+this.value)'>
		<a href=index.php> Voltar</a>
		</h3>
	</legend>
	<h3><?=$mensagem?></h3>
	<table><th>Nome, Entrada => Saída
	<?php 
	foreach($movimentos as $m): 
	if(!isset($controle)): $controle=$m->nome; $controle2=0; ?>
		<tr><td><?=$m->nome?>
	<?php endif;
	if($controle!==$m->nome): $controle=$m->nome; $controle2=0; ?>
		<tr><td><?=$m->nome?>
	<?php endif;
	$he=date('H:i',strtotime($m->horaentrada));
	$hs=($m->horasaida) ? date('H:i',strtotime($m->horasaida)) : null;
	$de=date('Y-m-d',strtotime($m->horaentrada));
	$ds=($m->horasaida) ?date('Y-m-d',strtotime($m->horasaida)) : null;
	if($de!==$ds): $hs=($m->horasaida) ?date('d/m H:i',strtotime($m->horasaida)) : null; endif;
	$controle2++;
	if($controle2>2): $controle2=0; ?>
	<tr><td>
	<?php endif; ?>
	, <?=$he." => ".$hs?>
	<?php endforeach; ?>
</fieldset>

arquivo /Polo/index.php
<?php
ini_set('display_errors', 1);
require __DIR__ . '/Modelos/Config.php';
$rota='ControlePortaria_inicio';
if($_GET)
{
    if(strpos(key($_GET),"_")==0)
    {
        exit;
    }
    $rota=isset($_GET) ? key($_GET) : $rota;
}
$segmentos=explode('_',$rota);
$nomeControle=$segmentos[0] ?? 'ControlePortaria';
$metodo=$segmentos[1] ?? 'inicio';
$parametro=$segmentos[2] ?? null;
$controle=new $nomeControle();
$controle->$metodo($parametro);

 

 

 

 

Captura de tela 2024-04-18 131908.png

Captura de tela 2024-04-18 132013.png

 

Captura de tela 2024-04-18 231400.png

Captura de tela 2024-04-19 122651.png

Edited by Frank K Hosaka
Link to comment
Share on other sites

1 answer to this question

Recommended Posts

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.7k
×
×
  • Create New...