HEX
Server: nginx/1.24.0
System: Linux prod-btpayments-io 6.14.0-1018-aws #18~24.04.1-Ubuntu SMP Mon Nov 24 19:46:27 UTC 2025 x86_64
User: ubuntu (1000)
PHP: 8.3.19
Disabled: NONE
Upload Files
File: /var/www/BtPayments/BtPayments-platform/app/Models/Payment/Payment.php
<?php

namespace App\Models\Payment;

use App\Models\Model;
use App\Models\CoinPal\CoinPalNotifyRecord;
use App\Models\CoinPal\CoinPalPaymentRecord;
use App\Models\Merchant;
use Illuminate\Database\Eloquent\Concerns\HasUlids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;

class Payment extends Model
{
    use HasUlids;
    use HasFactory;
    use PaymentAttrs;
    use PaymentExtend;
    use PaymentCallback;
    use PaymentCreate;

    const FROM_SHOPIFY = 'shopify';
    const FROM_WOOCOMMERCE = 'woocommerce';

    protected $guarded = [];

    protected function casts(): array
    {
        return [
            'order_remark'          =>  'object',

            'order_amount'                  =>  'decimal:8',
            'total_paid_amount'             =>  'decimal:8',
            'total_paid_amount_usdt'        =>  'decimal:8',
            'payer_paid_amount'             =>  'decimal:8',
            'payer_due_amount'              =>  'decimal:8',
        ];
    }

    /**
     * 关联商户
     */
    public function merchant(): BelongsTo
    {
        return $this->belongsTo(Merchant::class, 'merchant_id');
    }

    /**
     * 关联 PaymentRecord
     */
    public function paymentRecord(): HasOne
    {
        return $this->hasOne(CoinPalPaymentRecord::class, 'payment_id', 'id');
    }

    /**
     * 关联 付款记录
     */
    public function notifyRecords(): HasMany
    {
        return $this->hasMany(CoinPalNotifyRecord::class, 'payment_id', 'id');
    }

    /**
     * scope: 未支付的
     */
    public function scopeUnpaid($query)
    {
        return $query->whereIn('status', [
            self::STATUS_CREATED,
            self::STATUS_UNPAID,
        ]);
    }

    /**
     * scope: 不足额支付的
     */
    public function scopeUnderpaid($query)
    {
        return $query
            ->where('total_paid_amount', '>', 0)
            ->whereRaw('total_paid_amount < order_amount');
    }

    /**
     * scope: 超额支付的
     */
    public function scopeOverpaid($query)
    {
        return $query
            ->where('total_paid_amount', '>', 0)
            ->whereRaw('total_paid_amount > order_amount');
    }
}