Skip to content

Instantly share code, notes, and snippets.

@insign
Created October 8, 2013 03:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save insign/6879185 to your computer and use it in GitHub Desktop.
Save insign/6879185 to your computer and use it in GitHub Desktop.
Cálculo de Prescrição (simulação)
<?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();
<?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;
}
}
<!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