feat: khởi tạo/huỷ domain Plesk qua job, gửi mail hoá đơn qua queue, đính kèm triển khai

- ProvisionDnsDomainJob/SuspendDnsDomainJob: tạo domain admin lên Plesk, huỷ = suspend (is_created=3)
- Khách xem zone DNS được gán ở /dich-vu/domain, quản lý bản ghi A/AAAA/CNAME/TXT/MX/SRV
- send-mail hoá đơn đẩy SendInvoiceMailJob, preview + sửa nội dung, ghi mail.order_id
- invoice_attachments.type (payment_proof/deployment)
- CacheService xoá theo SCAN pattern, Redis không persistent mặc định
- Backfill transactions.public_code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
baodev0
2026-10-11 09:56:18 +07:00
co-authored by Claude Opus 5.5
parent 30898ea46f
commit 94614d9cb3
55 changed files with 1190 additions and 236 deletions
+22 -1
View File
@@ -2,11 +2,14 @@
namespace App\Models;
use App\Services\Cache\CacheServiceInterface;
use App\Traits\LogsActivity;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Str;
use App\Traits\HasUuid;
class Transaction extends Model
@@ -30,6 +33,24 @@ class Transaction extends Model
protected $appends = ['direction', 'proof_image_urls'];
protected static function booted(): void
{
static::creating(function (Transaction $transaction) {
$transaction->public_code ??= self::newPublicCode('TXN');
});
$flushListCache = fn () => DB::afterCommit(
fn () => app(CacheServiceInterface::class)->clearByModule('transaction')
);
static::saved($flushListCache);
static::deleted($flushListCache);
}
public static function newPublicCode(string $prefix): string
{
return $prefix . '-' . now()->format('Ymd') . '-' . strtoupper(Str::random(6));
}
public function customer()
{
return $this->belongsTo(Customer::class, 'customer_id');
@@ -53,7 +74,7 @@ class Transaction extends Model
'admin_add_total', 'admin_add_credit', 'manual', 'refund' => 'credit',
'admin_deduct_credit' => 'debit',
'balance' => 'debit',
'transfer' => 'neutral',
'transfer', 'admin_record' => 'neutral',
'invoice' => str_starts_with((string) $this->note, 'Admin xác nhận')
? 'neutral'
: 'debit',