sexta-feira, 12 de julho de 2013

Classe para gerar escala de plantão

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