sufehmi icon

Automatic People-Area-Time Allocator (APATA)

sufehmi | PRO | 11/14/18 04:49:02 PM UTC | 0 ⭐ | 996 👁️ | Never ⏰ | []
PHP |

9.43 KB

|

None

|

0 👍

/

0 👎

<?php 
 
$sdm    = ['Budi','Dora','Dewi','Indro','Dono'];
 
$day        = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'];
$hari       = ['Senin','Selasa','Rabu','Kamis','Jumat','Sabtu','Ahad']; 
$month_list     = ['0','January','February','March','April','May','June','July','August','September','October','November','December'];
 
$slot_jadwal    = ['Pagi','Siang','Sore'];
 
$no_go      = ['Rabu Sore','Kamis Sore'];
$no_schedule    = [
        'Budi'  => ['Senin','Rabu Siang','Jumat Siang'],
        'Dora'  => ['Rabu Sore', 'Kamis Sore'],
        'Dewi'  => ['Rabu Sore','Kamis Pagi','Ahad'],
        'Indro' => ['Selasa Sore','Rabu Sore','Kamis Sore','Sabtu'],
        'Dono'  => ['Senin','Selasa','Rabu Sore','Kamis Sore','Jumat'],
        ];
$no_area    = [
        'Dewi'      => ['Jakarta Barat','noll']
        ];
 
$area       = ['Jakarta Barat','Pondok Aren','Ciputat','Pondok Labu','Kebayoran Lama'];
$area_detals    = ['Jakarta Barat'  => ['Grogol','Tanah Abang','Thamrin City'],
        'Pondok Aren'       => ['Ceger','Japos','Pondok Kacang'],
        'Ciputat'       => ['UIN','Kasino 1','Kasino 2','ZXC'],
        'Pondok Labu'       => ['ATK 1','ATK 2','Tex 1','Tex 2','MMM','Gandul 1','Gandul 2'],
        'Kebayoran Lama'    => ['ATK 1','ATK 2','ATK 3','Tex 1','Tex 2','Tex 3','Sepatu'],
        ];
 
$tahun = 2018;
$bulan = 1;
 
//===================
 
ApplyHeader($tahun);
 
$booked = [];
$twice  = [];
$kemarin= [];
$ctrKemarin = 0;
 
while ($bulan < 13) { 
 
  echo "<h1>Bulan : ".$month_list[$bulan]."</h1>\n\n";
  $tanggal = 1;
 
 
  // bikin header table bulan
  echo "
  <table class='greenTable'>
  <thead>
    <tr>
        <th>Senin</th>
        <th>Selasa</th>
        <th>Rabu</th>
        <th>Kamis</th>
        <th>Jumat</th>
        <th>Sabtu</th>
        <th>Ahad</th>
    </tr>
  </thead>
  <tbody>
    <tr>";
 
  $hari_ini = getDay($tanggal,$bulan,$tahun);
 
  // jika tanggal 1, bikin kolom-kolom kosong s/d ke kolom hari yang benar
  // hitung jumlah kolom yang perlu dikosongkan
  $skip = array_search($hari_ini, $hari);
  // kosongkan kolom
  for ($i = 1; $i <= $skip; $i++) {
    echo "<td></td>";
  };
 
  // pilih salah satu hari Sabtu
  $xSaturday    = getRandomSaturday($bulan, $tahun);
  // pilih salah satu hari Ahad
  $xSunday  = getRandomSunday($bulan, $tahun);
 
    // mulai buat daftar keliling bulan ini 
    while (checkdate ($bulan, $tanggal, $tahun)) {
 
        $hari_ini = getDay($tanggal,$bulan,$tahun);
 
        // jika hari Senin, bikin row baru
        if ($hari_ini == 'Senin') { 
            echo "</tr><tr>";
        };
          
        // kalau sabtu / minggu = skip
        if ( (($hari_ini == 'Sabtu') || ($hari_ini == 'Ahad')) && ($tanggal <> $xSunday) && ($tanggal <> $xSaturday) ) { 
 
            // do nothing  
            echo "<td>$tanggal</td>";
 
        } else {
 
        // bikin kolom hari
        echo "<td><h3>".$hari_ini." : ".$tanggal."</h3><br />\n\n";
 
        foreach ($area as &$daerah) {
    
 
            // dapatkan waktu
            do {
                $x  = getRandomNumber(0, sizeof($slot_jadwal)-1);
                $slot   = $slot_jadwal[$x];
 
                $slot_hari  = $hari_ini." ".$slot;
            } while ( in_array($slot_hari, $no_go) );
 
            // dapatkan personil
            $ctr        = 1;
            $dapat_sdm  = false;
            do {
                $nomor  = getRandomNumber(0, (sizeof($sdm)-1));
                $nama   = $sdm[$nomor];
 
                
                $ctr++;
                // jika $ctr > 10000, berarti ada infinite loop
                // pecahkan dengan cara sbb :
                if ($ctr > 1000) {
 
                    $nama = '';
                    // temukan orang yang belum ada di $booked[]
                    foreach ($sdm as &$n) { //echo "nama1 ".$n."/".$slot_hari;
                        if (!(in_array($n, $booked)) && !(AdaKonflikJadwal($n, $slot_hari, $no_schedule)) && !(in_array($daerah, $no_area["$n"])) && !(SudahKemarin($n,$daerah,$kemarin)) ) {
                            $nama = $n;
                        };
                    };
 
                    if ($nama <> '') { 
 
                        $booked[] = $nama; if ($nama == 'Devy') { $twice[] = $nama;};
 
                    // jika tidak ada, maka ambil dari $booked[]
                    } elseif ($nama == '') {
                        do {
                            $nomor      = getRandomNumber(0, (sizeof($booked)-1));
                            $nama       = $booked[$nomor];
                        } while ( (in_array($nama, $twice)) && SudahKemarin($nama,$daerah,$kemarin) );
                        $twice[]    = $nama;
                    }; // if ($nama == '') 
 
                    $dapat_sdm = true; 
 
                }; // if ($ctr > 10000)
 
                if ($dapat_sdm) { break;};
 
            } while ( (AdaKonflikJadwal($nama, $slot_hari, $no_schedule)) || (in_array($nama, $booked)) || (in_array($daerah, $no_area["$nama"])) || (in_array($nama, $twice)) || SudahKemarin($nama,$daerah,$kemarin) );
        
            $booked[] = $nama; if ($nama == 'Devy') { $twice[] = $nama;};
            $kemarin[$ctrKemarin] = [$nama,$daerah];
            $ctrKemarin++;
 
            // cetak nama & jadwal
            //echo $daerah." : ".$nama." - ".$slot."\n\n";
            echo $daerah." : ".$nama."<br />\n\n";
 
        }; // foreach ($area as &$daerah)
 
            // tutup kolom hari
            echo "</td>";
        }; // if (($hari == 'Sabtu') || $hari == 'Ahad') 
 
 
        $booked = [];
        $twice  = [];
        $tanggal++;
        
        if ( $ctrKemarin > (sizeof($sdm)+1) ) { $ctrKemarin = 0;};
 
    }; // while (checkdate ($bulan, $tanggal, $tahun)) {
    
    $bulan++;
    
    // bikin footer table bulan
    echo "</tr></tbody></table>";
 
}; // while (bulan < 13)
 
 
 
 
exit(); // end
//===================
 
function getRandomSunday($month, $year) {
 
$month_list     = ['0','January','February','March','April','May','June','July','August','September','October','November','December'];
$sunday_list    = [];
$today      = 1;
 
    // get a list of Sundays
    while (checkdate($month, $today, $year)) {
 
        $curdate = strtotime($today.' '.$month_list[$month].' '.$year); 
        if (date('l', $curdate) == 'Sunday') {
            $sunday_list[] = $today.'-'.$month_list[$month].'-'.$year;
        };
 
        $today++;
    };
 
    // pick a random Sunday
    $max    = sizeof($sunday_list) - 1;
    $result = getRandomNumber(0, $max);
 
    return $sunday_list[$result];  
};
 
 
function getRandomSaturday($month, $year) {
 
$month_list     = ['0','January','February','March','April','May','June','July','August','September','October','November','December'];
$sunday_list    = [];
$today      = 1;
 
    // get a list of Saturday
    while (checkdate($month, $today, $year)) {
 
        $curdate = strtotime($today.' '.$month_list[$month].' '.$year); 
        if (date('l', $curdate) == 'Saturday') {
            $sunday_list[] = $today.'-'.$month_list[$month].'-'.$year;
        };
 
        $today++;
    };
 
    // pick a random Sunday
    $max    = sizeof($sunday_list) - 1;
    $result = getRandomNumber(0, $max);
 
    return $sunday_list[$result];  
};
 
 
function getRandomNumber ($min, $max) {
 
    // better random seed
    $x  = openssl_random_pseudo_bytes(100);
    $x  = hash('crc32', $x);
    mt_srand(intval(hexdec($x)));
    
    $result = mt_rand($min,$max);
    //$result = random_int($min,$max);
 
    //$src = "https://www.random.org/integers/?num=1&min=".$min."&max=".$max."&col=1&base=10&format=plain&rnd=new";     $dh = fopen("$src",'r'); $result = fread($dh,1);
 
    return $result;
 
}
    
 
function getDay($tanggal, $bulan, $tahun) {
 
    $month_list     = ['0','January','February','March','April','May','June','July','August','September','October','November','December'];
    $day        = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'];
    $hari       = ['Senin','Selasa','Rabu','Kamis','Jumat','Sabtu','Ahad']; 
 
 
    // dapatkan hari
    $hari_ini = date('l', strtotime($tanggal.' '.$month_list[$bulan].' '.$tahun));
 
    // ubah jadi bahasa Indonesia
    $pos        = array_search($hari_ini, $day);
    $hari_ini   = $hari[$pos];
 
    return $hari_ini;
}
 
 
function AdaKonflikJadwal ($nama, $slot_hari, $no_schedule) {
 
    $oke = false;
    foreach ($no_schedule[$nama] as &$jadwal) {
        if (strpos($slot_hari, $jadwal) !== false) { 
            $oke = true; 
            //echo "NIH : ".$slot_hari."/".$jadwal;
        };
    };
 
    return $oke;
}
 
 
function SudahKemarin($nama,$daerah,$kemarin) {
 
    $sudah = false; 
    foreach ($kemarin as &$v) { 
        if ( ($v[0] == $nama) && ($v[1] == $daerah) ) { 
            $sudah = true; 
        };
    };
    return $sudah;
}
 
 
 
function ApplyHeader($tahun) {
 
?>
<html>
<body>
<style>
table.greenTable {
  font-family: Arial, Helvetica, sans-serif;
  border: 6px solid #24943A;
  background-color: #D4EED1;
  width: 100%;
  text-align: center;
}
table.greenTable td, table.greenTable th {
  border: 1px solid #24943A;
  padding: 3px 2px;
}
table.greenTable tbody td {
  font-size: 13px;
}
table.greenTable thead {
  background: #24943A;
  background: -moz-linear-gradient(top, #5baf6b 0%, #3a9e4d 66%, #24943A 100%);
  background: -webkit-linear-gradient(top, #5baf6b 0%, #3a9e4d 66%, #24943A 100%);
  background: linear-gradient(to bottom, #5baf6b 0%, #3a9e4d 66%, #24943A 100%);
  border-bottom: 0px solid #444444;
}
table.greenTable thead th {
  font-size: 19px;
  font-weight: bold;
  color: #F0F0F0;
  text-align: center;
  border-left: 2px solid #24943A;
}
table.greenTable thead th:first-child {
  border-left: none;
}
 
table.greenTable tfoot {
  font-size: 13px;
  font-weight: bold;
  color: #F0F0F0;
  background: #24943A;
  background: -moz-linear-gradient(top, #5baf6b 0%, #3a9e4d 66%, #24943A 100%);
  background: -webkit-linear-gradient(top, #5baf6b 0%, #3a9e4d 66%, #24943A 100%);
  background: linear-gradient(to bottom, #5baf6b 0%, #3a9e4d 66%, #24943A 100%);
  border-top: 1px solid #24943A;
}
table.greenTable tfoot td {
  font-size: 13px;
}
table.greenTable tfoot .links {
  text-align: right;
}
table.greenTable tfoot .links a{
  display: inline-block;
  background: #FFFFFF;
  color: #24943A;
  padding: 2px 8px;
  border-radius: 5px;
}
</style>
 
<h1><center>Jadwal Keliling tahun <?php echo $tahun; ?></center></h1>
 
<?php
 
}
 
 
function ApplyFooter() {
 
?>
 
</table>
</body>
</html>
 
<?php
 
 
}
 
 
 
?>

Comments