Created
October 8, 2013 03:48
-
-
Save insign/6879185 to your computer and use it in GitHub Desktop.
Cálculo de Prescrição (simulação)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
require_once 'cdp.class.php'; | |
$cdp = new CalculoDePrescricao; | |
$cdp->data_do_crime = $_POST['data_do_crime']; | |
$cdp->data_da_denuncia = $_POST['data_da_denuncia']; | |
$cdp->idade_criminoso = $_POST['idade_criminoso']; | |
$cdp->pena_maxima = $_POST['pena_maxima']; | |
$cdp->resultado(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
date_default_timezone_set('America/Belem'); | |
class CalculoDePrescricao { | |
public | |
$data_do_crime | |
, $data_da_denuncia | |
, $idade_criminoso | |
, $pena_maxima | |
, $data_do_crime_obj | |
, $data_da_denuncia_obj | |
, $entre_crime_denuncia_obj | |
, $prescricao_em_meses | |
, $prescricao_em_meses_obj | |
, $prescricao_obj | |
, $hoje | |
; | |
public function __construct() { | |
$this->hoje = new DateTime; | |
} | |
# Imprime o resultado do cálculo | |
public function resultado() { | |
$this->validar(); | |
$this->calcular(); | |
} | |
# Executa de fato, toda a lógica do cálculo | |
public function calcular() { | |
$pena_maxima_em_meses = $this->ano2mes($this->pena_maxima['anos']) + $this->pena_maxima['meses']; | |
# Pena superior a 12 anos | |
if ($pena_maxima_em_meses > $this->ano2mes(12)) { | |
$this->prescricao_em_meses = $this->ano2mes(20); // 20 anos para prescrever | |
} | |
# Penas entre 8+ e 12 anos | |
elseif ($pena_maxima_em_meses > $this->ano2mes(8)) { | |
$this->prescricao_em_meses = $this->ano2mes(16); // 16 anos para prescrever | |
} | |
# Penas entre 4+ e 8 anos | |
elseif ($pena_maxima_em_meses > $this->ano2mes(4)) { | |
$this->prescricao_em_meses = $this->ano2mes(12); // 12 anos para prescrever | |
} | |
# Penas entre 2+ e 4 anos | |
elseif ($pena_maxima_em_meses > $this->ano2mes(2)) { | |
$this->prescricao_em_meses = $this->ano2mes(8); // 8 anos para prescrever | |
} | |
# Penas entre 1+ e 2 anos | |
elseif ($pena_maxima_em_meses > $this->ano2mes(1)) { | |
$this->prescricao_em_meses = $this->ano2mes(4); // 4 anos para prescrever | |
} | |
# Penas menores que 1 ano | |
else { | |
$this->prescricao_em_meses = $this->ano2mes(2); // 2 anos para prescrever | |
} | |
# Menor de idade no dia do crime, divide pela metade | |
if ($this->idade_criminoso < 18) { | |
$this->prescricao_em_meses = $this->prescricao_em_meses / 2; | |
} | |
$this->prescricao_em_meses_obj = new DateInterval("P{$this->prescricao_em_meses}M"); | |
// exit("Com pena máxima de $pena_maxima_em_meses meses, o crime prescreverá em $prescricao_em_meses meses"); | |
$this->entre_crime_denuncia_obj = $this->data_do_crime_obj->diff($this->data_da_denuncia_obj); | |
# Dia da prescrição baseada no manual PDF (somar data da denuncia com tempo da prescrição) | |
$this->prescricao_obj = new DateTime($this->data_da_denuncia); | |
$this->prescricao_obj->add($this->prescricao_em_meses_obj); | |
if ($this->prescricao_obj > $this->hoje) { | |
echo "<h2>O crime prescreverá em {$this->prescricao_obj->format('d-m-Y')}</h2>"; | |
} else { | |
echo "<h2>O crime prescreveu em {$this->prescricao_obj->format('d-m-Y')}</h2>"; | |
} | |
# Verifica se a denuncia foi feita quando o crime já estava prescrito | |
// if (date_add($this->hoje, $this->entre_crime_denuncia_obj) > date_add($this->hoje, $this->prescricao_em_meses_obj)) { | |
// echo "{$this->entre_crime_denuncia_obj->format('%m')} - {$this->prescricao_em_meses_obj->format('%m')}<h2>O crime já estava prescrito quando denunciado</h2>"; | |
// } | |
} | |
# Válida dados fornecidos e para o script caso esteja em desacordo | |
private function validar() { | |
# Valida data do crime | |
extract(date_parse($this->data_do_crime)); | |
if (!checkdate($month, $day, $year)) { | |
$this->falha('Data do crime não é uma data válida.'); | |
} | |
# Valida data da denúncia | |
extract(date_parse($this->data_da_denuncia)); | |
if (!checkdate($month, $day, $year)) { | |
$this->falha('Data da denúncia não é uma data válida.'); | |
} | |
# Invalida crimes que ocorreram após denúncia | |
$this->data_do_crime_obj = new DateTime($this->data_do_crime); | |
$this->data_da_denuncia_obj = new DateTime($this->data_da_denuncia); | |
if ($this->data_do_crime_obj > $this->data_da_denuncia_obj) { | |
$this->falha('Data do crime não pode ser depois da denúncia.'); | |
} | |
# Valida idade do criminoso | |
$this->idade_criminoso = abs((int) $this->idade_criminoso); | |
if (!$this->idade_criminoso) { | |
$this->falha('Idade do criminoso é inválida.'); | |
} | |
# Valida pena máxima | |
$this->pena_maxima['anos'] = abs((int) $this->pena_maxima['anos']); | |
$this->pena_maxima['meses'] = abs((int) $this->pena_maxima['meses']); | |
if (!is_array($this->pena_maxima) || !$this->pena_maxima['anos'] || !in_array($this->pena_maxima['meses'], range(0, 12))) { | |
$this->falha('Pena máxima inválida'); | |
} | |
} | |
private function falha($falha = 'Ocorreu um erro na validação dos dados, tente novamente.') { | |
header('Location: index.php?erro=' . base64_encode($falha)); | |
exit(); | |
} | |
# Converte anos para meses | |
private function ano2mes($anos) { | |
return ((int) $anos) * 12; | |
} | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="UTF-8"> <!-- maneira html5 --> | |
<title>Cálculo de Prescrição</title> | |
<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet"> | |
</head> | |
<body> | |
<div class="container"> | |
<div class="col-md-offset-2 col-md-8 jumbotron"> | |
<h1>Cálculo de Prescrição</h1> | |
<?php if (isset($_GET['erro']) && $erro = $_GET['erro']): ?> | |
<div class="alert alert-warning"><?= base64_decode($erro) ?></div> | |
<?php endif; ?> | |
<form role="form" action="calcular.php" method="POST"> | |
<div class="form-group"> | |
<label for="data_do_crime">Data do crime</label> | |
<input type="date" required="required" class="form-control" id="data_do_crime" name="data_do_crime" placeholder="data em que o evento ocorreu"> | |
</div> | |
<div class="form-group"> | |
<label for="data_da_denuncia">Data do recebimento da denúncia</label> | |
<input type="date" required="required" class="form-control" id="data_da_denuncia" name="data_da_denuncia" placeholder="data em que a denúncia foi feita"> | |
</div> | |
<div class="form-group"> | |
<label for="idade_criminoso">Idade do criminoso no dia do evento</label> | |
<input type="number" required="required" class="form-control" id="idade_criminoso" name="idade_criminoso" placeholder="idade que o criminoso no dia do evento"> | |
</div> | |
<div class="form-group"> | |
<label for="pena_maxima_anos">Pena máxima para o crime</label> | |
<div class="row"> | |
<div class="col-lg-2"> | |
<input type="number" required="required" class="form-control" id="pena_maxima_anos" name="pena_maxima[anos]" placeholder="anos"> | |
</div> | |
<div class="col-lg-2"> | |
<input type="number" required="required" class="form-control" id="pena_maxima_meses" name="pena_maxima[meses]" placeholder="meses"> | |
</div> | |
</div> | |
</div> | |
<button type="submit" class="btn btn-primary">Calcular</button> | |
</form> | |
</div> | |
</div> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment