MIF_E31210863/app/Models/Payment.php

82 lines
2.1 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Payment extends Model
{
use HasFactory;
protected $guarded = [];
public const PAYMENT_CHANNELS = ['credit_card', 'mandiri_clickpay', 'cimb_clicks',
'bca_klikbca', 'bca_klikpay', 'bri_epay', 'echannel', 'permata_va',
'bca_va', 'bni_va', 'other_va', 'gopay', 'indomaret',
'danamon_online', 'akulaku'];
public const EXPIRY_DURATION = 1;
public const EXPIRY_UNIT = 'days';
public const CHALLENGE = 'challenge';
public const SUCCESS = 'success';
public const SETTLEMENT = 'settlement';
public const PENDING = 'pending';
public const DENY = 'deny';
public const EXPIRE = 'expire';
public const CANCEL = 'cancel';
public const PAYMENTCODE = 'PAY';
public static function integerToRoman($integer)
{
$integer = intval($integer);
$result = '';
// Create a lookup array that contains all of the Roman numerals.
$lookup = ['M' => 1000, 'CM' => 900, 'D' => 500, 'CD' => 400, 'C' => 100, 'XC' => 90, 'L' => 50, 'XL' => 40, 'X' => 10, 'IX' => 9, 'V' => 5, 'IV' => 4, 'I' => 1];
foreach ($lookup as $roman => $value) {
$matches = intval($integer/$value);
$result .= str_repeat($roman, $matches);
$integer = $integer % $value;
}
return $result;
}
public static function generateCode()
{
$dateCode = self::PAYMENTCODE . '/' . date('Ymd') . '/' . self::integerToRoman(date('m')). '/' . self::integerToRoman(date('d')). '/';
$lastOrder = self::select([\DB::raw('MAX(payments.number) AS last_code')])
->where('number', 'like', $dateCode . '%')
->first();
$lastOrderCode = !empty($lastOrder) ? $lastOrder['last_code'] : null;
$orderCode = $dateCode . '00001';
if ($lastOrderCode) {
$lastOrderNumber = str_replace($dateCode, '', $lastOrderCode);
$nextOrderNumber = sprintf('%05d', (int)$lastOrderNumber + 1);
$orderCode = $dateCode . $nextOrderNumber;
}
if (self::_isOrderCodeExists($orderCode)) {
return generateOrderCode();
}
return $orderCode;
}
private static function _isOrderCodeExists($orderCode)
{
return Order::where('code', '=', $orderCode)->exists();
}
}