Anons79 Mini Shell

Directory : /home/aplikasiposinfo/public_html/coba.fixmate.id/app/Models/
Upload File :
Current File : /home/aplikasiposinfo/public_html/coba.fixmate.id/app/Models/Pelanggan.php

<?php

namespace App\Models;

use DateTime;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Pelanggan extends Model
{
    use HasFactory;
    use SoftDeletes;

    protected $fillable = [
        "nama_pelanggan",
        "telp_pelanggan",
        "alamat_pelanggan",
        "kecamatan_pelanggan",
        "pengguna_id"
    ];

    public function scopeRiwayatSum($query){
        return $query->join('riwayat_transaksis','riwayat_transaksis.pelanggan_id','=','pelanggans.id')
        ->select('pelanggans.*')
        ->selectRaw('SUM(riwayat_transaksis.biaya) as total');
    }

    public function scopeTotalSum($query){
        //sum penjualan dan service
        return $query->join('penjualans','penjualans.pelanggan_id','=','pelanggans.id')
        ->join('services',function($j){
            $j->where('services.pelanggan_id','=','pelanggans.id')->where('services.status_transaksi','=','success');
        })
        ->join('detail_services','detail_services.service_id','=','services.id')
        ->select('pelanggans.*')
        ->selectRaw('SUM(penjualans.total) as total_penjualan')
        ->selectRaw('SUM(services.total) as total_service')
        ->selectRaw('SUM(detail_services.total) as total_detail_service');
    }

    public function penjualan()
    {
        return $this->hasMany(Penjualan::class);
    }
    public function retur_penjualan()
    {
        return $this->hasMany(ReturPenjualan::class);
    }
    public function riwayat()
    {
        return $this->hasMany(RiwayatTransaksi::class);
    }

    public function service()
    {
        return $this->hasMany(Service::class);
    }
    public function scopeCari($query, $name)
    {
        return $query->where("nama_pelanggan", "like", "%" . $name . "%")
            ->orWhere("telp_pelanggan", "like", "%" . $name . "%")
            ->orWhere("alamat_pelanggan", "like", "%" . $name . "%");
    }
    public function scopeKecamatan($query, $kecamatan)
    {
        return $query->where("kecamatan_pelanggan", "like", "%" . $kecamatan . "%");
    }
    public function scopeTanggal($query, $begin, $end)
    {
        return $query->whereBetween("created_at", [$begin->format('Y-m-d H:i:s'), $end->format('Y-m-d H:i:s')]);
    }
    public static function boot()
    {
        parent::boot();
        self::deleting(function ($pelanggan) {
            $pelanggan->penjualan()->each(function ($penjualan) {
                $penjualan->delete();
            });
            $pelanggan->service()->each(function ($service) {
                $service->delete();
            });
            $pelanggan->retur_penjualan()->each(function ($retur_penjualan) {
                $retur_penjualan->delete();
            });
            $pelanggan->riwayat()->each(function ($riwayat) {
                $riwayat->delete();
            });
        });
    }

    public function getDurasiLabelAttribute()
    {   

        $date1 = (string)$this->created_at;
        if($this->created_at == null){
            if($this->service->count() > 0){
                $date1 = (string)$this->service->sortBy('id')->first()->created_at;
            } else if($this->penjualan->count() > 0){
                $date1 = (string)$this->penjualan->sortBy('id')->first()->created_at;
                
            }
        }

        if($date1 == null || $date1 == ""){
            return "-";
        }
        
        $date1 = new DateTime($date1);
        $date2 = now();

        $interval = $date1->diff($date2);
        $parts = [];
        if ($interval->y > 0) {
            $parts[] = $interval->y . ' tahun';
        }
        if ($interval->m > 0) {
            $parts[] = $interval->m . ' bulan';
        }
        if ($interval->d > 0) {
            $parts[] = $interval->d . ' hari';
        }
        $formatted = implode(', ', $parts);

        return $formatted;
    }

    public function getTotalReviewAttribute(){
        $jumlahReview = $this->review_pelanggans->count();
        $nialiReview = $this->review_pelanggans->sum('nilai_review');
        $totalReview = ($jumlahReview > 0)?$nialiReview/($jumlahReview*5):0;
        return $totalReview;
    }

    public function getJumlahReferralAttribute(){
        $jumlahReferral = Referralable::whereIn('referral_pelanggan_id',$this->referral_pelanggans->pluck('id')->toArray())->count();
        return $jumlahReferral;
    }

    public function getSkorLoyalitasAttribute(){
        $jumlah_transaksi = $this->jumlah_transaksi ?? 0;
        $total_nominal = $this->total_nominal ?? 0;
        $skorFrekuensi = ($jumlah_transaksi > 0)?min(5,$jumlah_transaksi)/5:0;

        $skorPengeluaran = ($total_nominal > 0)?min(3000000,$total_nominal)/3000000:0;

        $jumlahReferral = Referralable::whereIn('referral_pelanggan_id',$this->referral_pelanggans->pluck('id')->toArray())->count();
        $skorReferral = ($jumlahReferral > 0)?min(3,$jumlahReferral)/3:0;

        $date1 = new DateTime($this->created_at ?? @($this->service->sortByDesc('created_at')->first() ?? $this->penjualan->sortByDesc('created_at')->first())->created_at);
        $date2 = now();

        $interval = $date1->diff($date2);
        $skorDurasi = $interval->y > 0 ? min(5,$interval->y)/2: 0;

        $jumlahReview = $this->review_pelanggans->count();
        $nialiReview = $this->review_pelanggans->sum('nilai_review');
        $totalReview = ($jumlahReview > 0)?$nialiReview/($jumlahReview*5):0;
        $skorReview = $totalReview > 0?min(5,$totalReview)/5: 0;
        $skor = ($skorFrekuensi * 30) + ($skorPengeluaran * 25) + ($skorReferral * 20) + ($skorDurasi * 15) + ($skorReview * 10);

        return $skor;

    }

    public function referral_pelanggans(){
        return $this->hasMany(ReferralPelanggan::class);
    }

    public function review_pelanggans(){
        return $this->hasMany(ReviewPelanggan::class);
    }

    public function getKategoriPelangganAttribute(){
        $skor = $this->skor_loyalitas;
        if($skor > 80){
            return "Super Loyal";
        } else if($skor > 70){
            return "Loyal Aktif";
        } else if($skor > 40){
            return "Potensi Loyal";
        } else if($skor > 20){
            return "Pasif";
        } else {
            return "Baru";
        }
    }

    public function riwayat_poin_pelanggans(){
        return $this->hasMany(RiwayatPoinPelanggan::class);
    }

    public function getTotalPoinAttribute(){
        $poin = $this->riwayat_poin_pelanggans->sum('bertambah') - $this->riwayat_poin_pelanggans->sum('berkurang');
        // foreach ($this->referral_pelanggans as $rp) {
        //     foreach ($rp->referrables as $referrable) {
        //         $poin += $referrable->bonus_value;
        //     }
        // }

        return $poin;
    }
}

Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]