Helper.php 9.41 KB
<?php

/**
 * @Author: irul
 * @Date:   2019-09-21 00:45:29
 * @Last Modified by:   irul
 * @Last Modified time: 2019-10-01 23:45:02
 */

namespace Integrasi\Reklame\Base;

use \Integrasi\Reklame\Helper\DateFn;
use \Illuminate\Database\Capsule\Manager as DB;

/**
 * Class Helper digunakan untuk mendefinisikan fungsi-fungsi
 * yang sering digunakan oleh Class yang lain.
 */
class Helper extends AbstractClass
{
	/**
	 * Fungsi untuk menambah/mengupdate OP.
	 * Diletakan di sini (di class Reklame bukan di class CustomerUsaha)
	 * karena tidak untuk konsumsi publik.
	 */
	public static function updateOrCreateCustomerUsaha($payload)
	{
		$op = null;

		/**
		 * Update data OP jika sudah ada, Create jika belum ada.
		 */
		$op = call_user_func(self::getParentNamespace() . '\Models\CustomerUsaha::updateOrCreate',
			array(
				'customer_id'  => $payload['customer_id'],
				'def_pajak_id' => $payload['def_pajak_id'],
				'usaha_id'     => $payload['usaha_id'],
			),
			array(
				'so'                 => strtoupper($payload['so']),
				'reg_date'           => date('Y-m-d H:i:s', strtotime($payload['reg_date'])),
				'opnm'               => $payload['opnm'],
				'opalamat'           => $payload['opalamat'],
				'kelurahan_id'       => $payload['kelurahan_id'],
				'kecamatan_id'       => $payload['kecamatan_id'],
				'customer_status_id' => 1,
				'enabled'            => 1,
			)
		);

		if ($op) {
			return call_user_func(self::getParentNamespace() . '\Models\CustomerUsaha::find', $op->id);
		}

		return null;
	}

	/**
	 * Fungsi untuk mengecek table sptpd.
	 * Kalo ada table sptpd disimpulkan 1 SKPD dengan beberapa titik reklame
	 */
	public static function sptpdExist()
	{
		try {
			$cnt = DB::table('pad_sptpd')->count();
		} catch (\PDOException $e) {
			return false;
		}
		return true;
	}

	/**
	 * Fungsi untuk mengecek penetapan.
	 * @param  mixed $iprId IPR Id dari perizinan
	 * @return boolean]
	 */
	public static function skpdAssigned($iprId)
	{
		if (!self::sptpdExist()) {
			$skpd = DB::table('pad_kohir')
				->join('pad_spt', 'pad_spt.id', '=', 'pad_kohir.spt_id')
				->where('pad_spt.r_iprid', $iprId)
				->first();
			if ($skpd) {
				return true;
			}
		} else {
			$skpd = DB::table('pad_kohir')
				->join('pad_sptpd', 'pad_sptpd.id', '=', 'pad_kohir.sptpd_id')
				->where('pad_sptpd.r_iprid', $iprId)
				->first();
			if ($skpd) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Fungsi untuk mengecek pembayaran.
	 * @param  mixed $iprId IPR Id dari perizinan
	 * @return boolean]
	 */
	public static function sspdAssigned($iprId)
	{
		if (!self::sptpdExist()) {
			$sspd = DB::table('pad_sspd')
				->join('pad_spt', 'pad_spt.id', '=', 'pad_sspd.spt_id')
				->where('pad_spt.r_iprid', $iprId)
				->where('pad_sspd.is_valid', 1)
				->first();
			if ($sspd) {
				return true;
			}
		} else {
			$sspd = DB::table('pad_sspd')
				->join('pad_spt', 'pad_spt.id', '=', 'pad_sspd.spt_id')
				->join('pad_sptpd', 'pad_sptpd.id', '=', 'pad_spt.sptpd_id')
				->where('pad_sptpd.r_iprid', $iprId)
				->where('pad_sspd.is_valid', 1)
				->first();
			if ($sspd) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Mendapatkan informasi SKPD dan SSPD menggunakan key IPR ID.
	 */
	public static function sudahAdaSkpdAtauSspd($iprId, &$data)
	{
		if (self::skpdAssigned($iprId) || self::sspdAssigned($iprId)) {
			$data = self::getPendataanByIprId($iprId);
			return true;
		}
		return false;
	}

	/**
	 * Fungsi untuk mendapatkan data spd/sptpd berdasarkan ID.
	 * @param  mixed $iprId IPR Id dari perizinan
	 * @return record
	 */
	public static function getPendataanById($id)
	{
		if (self::sptpdExist()) {
			return call_user_func(self::getParentNamespace() . '\Models\Sptpd::with', 'customer', 'kohir', 'spt.sspd')
				->whereId($id)
				->first();
		} else {
			return call_user_func(self::getParentNamespace() . '\Models\Spt::with', 'customer', 'kohir', 'sspd')
				->whereId($id)
				->first();
		}
	}

	/**
	 * Fungsi untuk mendapatkan data spd/sptpd berdasarkan ipr id.
	 * @param  mixed $iprId IPR Id dari perizinan
	 * @return record
	 */
	public static function getPendataanByIprId($iprId)
	{
		if (self::sptpdExist()) {
			return call_user_func(self::getParentNamespace() . '\Models\Sptpd::with', 'customer', 'kohir', 'spt.sspd')
				->where('r_iprid', $iprId)
				->first();
		} else {
			return call_user_func(self::getParentNamespace() . '\Models\Spt::with', 'customer', 'kohir', 'sspd')
				->where('r_iprid', $iprId)
				->first();
		}
	}

	/**
	 * Fungsi untuk mendapatkan data spd/sptpd berdasarkan Nomor Bayar.
	 * @param  mixed $iprId IPR Id dari perizinan
	 * @return record
	 */
	public static function getPendataanByInvoiceNumber($invoiceNumber)
	{
		if (self::sptpdExist()) {
			$spt = call_user_func(self::getParentNamespace() . '\Models\Spt::findBySptno', $invoiceNumber)
				->first();

			if (!$spt) {
				return null;
			}
			return self::getPendataanById($spt->sptpd_id);

		} else {
			return call_user_func(self::getParentNamespace() . '\Models\Spt::with', 'customer', 'kohir', 'sspd')
				->findBySptno($invoiceNumber)
				->first();
		}
	}

	public static function pajakInfo($data)
	{
		if (self::sptpdExist()) {
			return array(
				'id'           => $data->id,
				'ipr_id'       => $data->r_iprid,
				'ipr_no'       => $data->r_iprno,
				'ipr_tgl'      => date('Y-m-d', strtotime($data->r_iprtgl)),
				'npwpd'        => $data->customer->npwpd,
				'wp_nama'      => $data->customer->customernm,
				'no_bayar'     => $data->spt ? $data->spt->sptno : null,
				'no_skpd'      => $data->kohir ? $data->kohir->kohirno : null,
				'tgl_skpd'     => $data->kohir ? date('Y-m-d', strtotime($data->kohir->kohirtgl)) : null,
				'nominal'      => $data->spt ? $data->spt->pajak_terhutang : 0,
				'status_bayar' => $data->spt && $data->spt->sspd && $data->spt->sspd->is_valid == 1 ? 1 : 0,
				'tgl_bayar'    => $data->spt && $data->spt->sspd && $data->spt->sspd->sspdtgl ? date('Y-m-d', strtotime($data->spt->sspd->sspdtgl)) : null,
			);
		} else {
			return array(
				'id'           => $data->id,
				'ipr_id'       => $data->r_iprid,
				'ipr_no'       => $data->r_iprno,
				'ipr_tgl'      => date('Y-m-d', strtotime($data->r_iprtgl)),
				'npwpd'        => $data->customer->npwpd,
				'wp_nama'      => $data->customer->customernm,
				'no_bayar'     => $data->kohir ? $data->sptno : null,
				'no_skpd'      => $data->kohir ? $data->kohir->kohirno : null,
				'tgl_skpd'     => $data->kohir ? date('Y-m-d', strtotime($data->kohir->kohirtgl)) : null,
				'nominal'      => $data->kohir ? $data->pajak_terhutang : 0,
				'status_bayar' => $data->sspd && $data->sspd->is_valid == 1 ? 1 : 0,
				'tgl_bayar'    => $data->sspd && $data->sspd->sspdtgl ? date('Y-m-d', strtotime($data->sspd->sspdtgl)) : null,
			);
		}
	}

	// ===================================================================== //

	/**
	 * Fungsi untuk mendapatkan jumlah toleransi hari antara dua tanggal
	 * yang mana dalam satu bulan dibulatkan menjadi 30 hari.
	 * @param  date $dateStart Tanggal awal
	 * @param  date $dateEnd   Tanggal akhir
	 * @return int
	 */
	public static function toleransiHari($dateStart, $dateEnd)
	{
		$FIXED_DAYS = 30;
		$yearStart  = date('Y', strtotime($dateStart));
		$yearEnd    = date('Y', strtotime($dateEnd));
		$monthStart = date('m', strtotime($dateStart));
		$monthEnd   = (12 * ($yearEnd - $yearStart)) + date('m', strtotime($dateEnd));

		$countDays = 0;
		for ($i = $monthStart; $i < $monthEnd; $i++) {
			$_month = ($i % 12);
			$_year  = floor($yearStart + ($i / 12));
			$countDays += DateFn::daysInMonth($_month, $_year);
		}

		$totalMonths    = DateFn::monthDiff($dateStart, $dateEnd);
		$totalFixedDays = $totalMonths * $FIXED_DAYS;

		$toleransi = $countDays - $totalFixedDays;
		return $toleransi < 0 ? 0 : $toleransi;
	}

	/**
	 * Fungsi untuk mendapatkan jumlah termin berdasarkan tanggal masa
	 * dan masapajak terpilih.
	 * @param  date $dateStart Tanggal awal
	 * @param  date $dateEnd   Tanggal akhir
	 * @param  int  $masaPajak Masapajak
	 * @return int
	 */
	public static function hitungTermin($dateStart, $dateEnd, $masaPajak)
	{
		$toleransiHari = self::toleransiHari($dateStart, $dateEnd);
		$selisihHari   = DateFn::dayDiff($dateStart, $dateEnd) + 1;

		switch ($masaPajak) {
			/* tahunan */
			case 1:
				$jumlahHari  = 360;
				$termin      = intval($selisihHari / $jumlahHari) ?: 1;
				$selisihHari = $selisihHari - ($termin * $jumlahHari);
				if ($selisihHari > $toleransiHari) {
					$termin++;
				}
				break;

			/* semesteran */
			case 2:
				$jumlahHari  = 180;
				$termin      = intval($selisihHari / $jumlahHari) ?: 1;
				$selisihHari = $selisihHari - ($termin * $jumlahHari);
				if ($selisihHari > $toleransiHari) {
					$termin++;
				}
				break;

			/* triwulanan */
			case 3:
				$jumlahHari  = 90;
				$termin      = intval($selisihHari / $jumlahHari) ?: 1;
				$selisihHari = $selisihHari - ($termin * $jumlahHari);
				if ($selisihHari > $toleransiHari) {
					$termin++;
				}
				break;

			/* bulanan */
			case 4:
				$jumlahHari  = 30;
				$termin      = intval($selisihHari / $jumlahHari) ?: 1;
				$selisihHari = $selisihHari - ($termin * $jumlahHari);
				if ($selisihHari > $toleransiHari) {
					$termin++;
				}
				break;

			/* mingguan */
			case 5:
				$jumlahHari  = 7;
				$termin      = intval($selisihHari / $jumlahHari) ?: 1;
				$selisihHari = $selisihHari - ($termin * $jumlahHari);
				if ($selisihHari > $toleransiHari) {
					$termin++;
				}
				break;

			/* harian */
			case 6:
				$termin = $selisihHari;
				break;
		}
		return $termin;
	}
}