Ir para conteúdo
Fórum Script Brasil
  • 0

Projeto Polo Portaria usando classes


Frank K Hosaka

Pergunta

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

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...