<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\DB;
class Sekolah extends Model
{
use HasFactory, SoftDeletes;
// protected $guarded = [];
protected $fillable = [
'npsn',
'nama_sekolah',
'bentuk_pendidikan',
'status_sekolah',
'daya_tampung', //tambahkan field daya tampung
'kelurahan_id',
'lintang',
'bujur',
'alamat'
];
public function kelurahan()
{
return $this->belongsTo(Kelurahan::class);
}
//kuota_zonasi
//sd 75% dari daya tampung
//smp 60% daya tampung
public function getKuotaZonasiAttribute()
{
$kuota = 0;
switch ($this->bentuk_pendidikan) {
case "SD":
$kuota = $this->daya_tampung * 75 / 100;
break;
case "SMP":
$kuota = $this->daya_tampung * 60 / 100;
break;
default:
$kuota = 0;
break;
}
return round($kuota);
}
//kuota_afirmasi
//sd 20% dari daya tampung
//smp 15% daya tampung
public function getKuotaAfirmasiAttribute()
{
$kuota = 0;
switch ($this->bentuk_pendidikan) {
case "SD":
$kuota = $this->daya_tampung * 20 / 100;
break;
case "SMP":
$kuota = $this->daya_tampung * 15 / 100;
break;
default:
$kuota = 0;
break;
}
return round($kuota);
}
//belongsToMany Siswa::class with SekolahSiswa::class
public function siswas()
{
return $this->belongsToMany(Siswa::class,"sekolah_siswas")->withPivot("nomor_pilihan");
}
//siswa_afirmasi
public function getSiswaAfirmasiAttribute(){
$sekolah_id = $this->id;
$siswas = $this->siswas()->where('jalur_pendaftaran','Afirmasi')->where('status','diverifikasi');
//where siswa have media kartu_keluargas, have (kartu_keluarga_sejahtera or program_keluarga_harapan or kartu_indonesia_pintar)
$siswas = $siswas
->with('media')
//get age in year
->select('siswas.*',DB::raw("TIMESTAMPDIFF(day, DATE(tanggal_lahir), CURDATE()) as age_date"))
// ->withCount('media')
//berkas lengkap
->whereHas('media',function($query){
$query->where('collection_name','kartu_keluargas');
})
//berkas keterangan tidak mampu
->whereHas('media',function($query){
$query->whereIn('collection_name',['kartu_keluraga_sejahteras','program_keluarga_harapans','kartu_indonesia_pintars']);
});
$result = $siswas
// ->orderBy('media_count','DESC')
->orderBy('pivot_nomor_pilihan','ASC')
->orderBy('age_date','DESC')
->orderBy('created_at','ASC')->get()->map(function($item)use($sekolah_id){
$lolos_lain = $item->lolos_afirmasi;
$tempat_lain = false;
foreach ($lolos_lain as $urutan => $value) {
if($value['id'] != $sekolah_id && $value['lolos'] && $urutan < $item->pivot->nomor_pilihan){
$tempat_lain = true;
}
}
$item->tempat_lain = $tempat_lain;
return $item;
})->sortByDesc(function($item){
return !$item->tempat_lain;
});
return $result;
}
//siswa_afirmasi_lolos
public function getSiswaAfirmasiLolosAttribute(){
$limit = $this->kuota_afirmasi;
$siswas = $this->siswas()->where('jalur_pendaftaran','Afirmasi')->where('status','diverifikasi');
//where siswa have media kartu_keluargas, have (kartu_keluarga_sejahtera or program_keluarga_harapan or kartu_indonesia_pintar)
$siswas = $siswas
->with('media')
//get age in year
->select('siswas.*',DB::raw("TIMESTAMPDIFF(day, DATE(tanggal_lahir), CURDATE()) as age_date"))
// ->withCount('media')
//berkas lengkap
->whereHas('media',function($query){
$query->where('collection_name','kartu_keluargas');
})
//berkas keterangan tidak mampu
->whereHas('media',function($query){
$query->whereIn('collection_name',['kartu_keluraga_sejahteras','program_keluarga_harapans','kartu_indonesia_pintars']);
});
$result = $siswas
->orderBy('pivot_nomor_pilihan','ASC')
->orderBy('age_date','DESC')
->orderBy('created_at','ASC')
->limit($limit)->get();
return $result;
}
public function getSiswaZonasiAttribute() {
$sekolah_id = $this->id;
// (
// 6371 * 2
// * ASIN(SQRT(POWER(SIN((_latitude_value - _latitude_name) * pi()/180 / 2), 2)
// + COS(_latitude_value * pi()/180 )
// * COS(_latitude_name * pi()/180)
// * POWER(SIN((_longitude_value - _longitude_name) * pi()/180 / 2), 2) ))
// );
$siswas = $this->siswas()->where('jalur_pendaftaran','Zonasi')->where('status','diverifikasi');
//where siswa have media kartu_keluargas, have (kartu_keluarga_sejahtera or program_keluarga_harapan or kartu_indonesia_pintar)
$siswas = $siswas
->with('media')
//berkas lengkap
->whereHas('media',function($query){
$query->where('collection_name','kartu_keluargas');
})
//berkas keterangan tidak mampu
// ->whereHas('media',function($query){
// $query->whereIn('collection_name',['kartu_keluraga_sejahteras','program_keluarga_harapans','kartu_indonesia_pintars']);
// })
//calculate distance siswas.lintang siswas.bujur sekolah.lintang sekolah.bujur
->select('siswas.*',DB::raw("TIMESTAMPDIFF(day, DATE(tanggal_lahir), CURDATE()) as age_date"),DB::raw("(
6371 * 2
* ASIN(SQRT(POWER(SIN((siswas.lintang - ".$this->lintang.") * pi()/180 / 2), 2)
+ COS(siswas.lintang * pi()/180 )
* COS(".$this->lintang." * pi()/180)
* POWER(SIN((siswas.bujur - ".$this->bujur.") * pi()/180 / 2), 2) ))
) as distance"))
;
$result = $siswas
// ->orderBy('media_count','DESC')
->orderBy('pivot_nomor_pilihan','ASC')
->orderBy('distance','ASC')
->orderBy('age_date','DESC')
->orderBy('created_at','ASC')->get()->map(function($item)use($sekolah_id){
$lolos_lain = $item->lolos_zonasi;
$tempat_lain = false;
foreach ($lolos_lain as $urutan => $value) {
if($value['id'] != $sekolah_id && $value['lolos'] && $urutan < $item->pivot->nomor_pilihan){
$tempat_lain = true;
}
}
$item->tempat_lain = $tempat_lain;
return $item;
})->sortByDesc(function($item){
return !$item->tempat_lain;
});
return $result;
}
//siswa_zonasi_lolos
public function getSiswaZonasiLolosAttribute() {
$limit = $this->kuota_zonasi;
// (
// 6371 * 2
// * ASIN(SQRT(POWER(SIN((_latitude_value - _latitude_name) * pi()/180 / 2), 2)
// + COS(_latitude_value * pi()/180 )
// * COS(_latitude_name * pi()/180)
// * POWER(SIN((_longitude_value - _longitude_name) * pi()/180 / 2), 2) ))
// );
$siswas = $this->siswas()->where('jalur_pendaftaran','Zonasi')->where('status','diverifikasi');
//where siswa have media kartu_keluargas, have (kartu_keluarga_sejahtera or program_keluarga_harapan or kartu_indonesia_pintar)
$siswas = $siswas
->with('media')
//berkas lengkap
->whereHas('media',function($query){
$query->where('collection_name','kartu_keluargas');
})
//berkas keterangan tidak mampu
// ->whereHas('media',function($query){
// $query->whereIn('collection_name',['kartu_keluraga_sejahteras','program_keluarga_harapans','kartu_indonesia_pintars']);
// })
//calculate distance siswas.lintang siswas.bujur sekolah.lintang sekolah.bujur
->select('siswas.*',DB::raw("TIMESTAMPDIFF(day, DATE(tanggal_lahir), CURDATE()) as age_date"),DB::raw("(
6371 * 2
* ASIN(SQRT(POWER(SIN((siswas.lintang - ".$this->lintang.") * pi()/180 / 2), 2)
+ COS(siswas.lintang * pi()/180 )
* COS(".$this->lintang." * pi()/180)
* POWER(SIN((siswas.bujur - ".$this->bujur.") * pi()/180 / 2), 2) ))
) as distance"));
$result = $siswas
// ->orderBy('media_count','DESC')
->orderBy('pivot_nomor_pilihan','ASC')
->orderBy('distance','ASC')
->orderBy('age_date','DESC')
->orderBy('created_at','ASC')
->limit($limit)
->get();
return $result;
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]