Essa semana desenvolvi uma classe para gerar escalas de plantão na instituição onde trabalho. Segue o código
<?php
/**
* plantao.class.php
*
* Classe para gerar escala de plantão
*
* @author Rodrigo Medina Zem <digaoguitarra@gmail.com>
* @version 1.0 $ 2013-06-27 11:55:13 $
*/
class plantao
{
var $name = array();
var $day = array();
var $dayOff = array();
var $code = "";
# insert a name on the scale
function addName($name)
{
$this->name[] = $name;
return $this;
}
# insert a day on the scale (from 0 to 6) that represent the week days
function addDay($day)
{
$this->day[] = $day;
return $this;
}
# when inserted names and days, you can create the scale
function createScale($dtIni,$ndays)
{
// initial date
$dateIni = new DateTime($dtIni);
//total of names inserted
$nrName = sizeof($this->name);
$daysOff = array();
foreach($this->dayOff as $aDayOff)
{
$dtIniDayOff = new DateTime($aDayOff['dtIni']);
$dtEndDayOff = new DateTime($aDayOff['dtFim']);
# number of days between initial and final date
$diff = $dtEndDayOff->diff(new DateTime($dtIniDayOff->format('Y-m-d')));
for($x=0;$x<=$diff->d;$x++)
{
$daysOff[] = array($aDayOff['nome'],$dtIniDayOff->format('Y-m-d'));
$dtIniDayOff->add( new DateInterval("P1D"));
}
}
$this->code .= "<ul style=\"list-style:none;margin:0;padding:0;\">";
$days = array();
$x=0;
for($d=0;$d<$ndays;$d++)
{
$dateIni->format('w');
if(in_array($dateIni->format('w'),$this->day))
{
if(!in_array(array($this->name[$x % $nrName],$dateIni->format('Y-m-d')),$daysOff))
{ $this->code .= "<li style=\"padding:3px;width:250px\" >";
$this->code .= "<ul style=\"list-style:none;margin:0;padding:0; background-color:c7c7c7;\">";
$this->code .= "<li style=\"#000;width:50px;margin:2px; float:left;padding:2px; background-color:f7f7f7;\">".$dateIni->format('d/m')."</li>";
$this->code .= "<li style=\"#000;width:40px;margin:2px; float:left;padding:2px; background-color:f7f7f7;\">".$this->weekday($dateIni->format('w'))."</li>";
$this->code .= "<li style=\"#000;width:130px;margin:2px; float:left; padding:2px; background-color:f7f7f7;\">".$this->name[$x % $nrName]."</li>";
$this->code .= "</ul>";
$this->code .= "</li>";
$dateIni->add( new DateInterval("P1D"));
}else{
$d--;
}
}else{
$dateIni->add( new DateInterval("P1D"));
}
++$x;
}
$this->code .= "</ul>";
return $this;
}
# Add days off to a period. The name chosen will not appear on the scale.
function addDayOff($name,$dtIni,$dtFim)
{
$this->dayOff[] = (array('nome' => $name, 'dtIni' => $dtIni, 'dtFim' => $dtFim));
return $this;
}
function show()
{
echo $this->code;
return $this;
}
# Return the day of week
function weekday($d)
{
switch($d)
{
case '0': $d = "<span style=color:red>Dom</span>"; break;
case '1': $d = "Seg"; break;
case '2': $d = "Ter"; break;
case '3': $d = "Qua"; break;
case '4': $d = "Qui"; break;
case '5': $d = "Sex"; break;
case '6': $d = "<span style=color:red>Sab</span>"; break;
}
return $d;
}
}
# example
$escala = new plantao();
// add the days 0 = domingo (sunday), 1 = segunda (monday) ...
$escala->addDay(0)->addDay(1)->addDay(2)->addDay(3)->addDay(4)->addDay(5)->addDay(6);
// add the names
$escala->addName('Rodrigo');
$escala->addName('Erik');
$escala->addName('Rodolfo');
$escala->addName('Willian');
$escala->addName('Lidiane');
$escala->addName('Priscylla');
$escala->addName('Samuel');
$escala->addName('João Alves');
$escala->addName('Cristiano');
// will not appear (this period)
$escala->addDayOff('Erik','2013-02-14','2013-02-28');
$escala->addDayOff('Lidiane','2013-02-16','2013-02-16');
// create the scale
$escala->createScale('2013-08-01',30);
// show the scale
$escala->show();






0 comentários:
Postar um comentário