File manager - Edit - /home/webapp69.cm.in.th/u69319090028/Shop/app/Services/PaymentAccountService.php
Back
<?php /** * PaymentAccountService * Admin-only: Manage platform payment receiving accounts (PromptPay / BankTransfer) */ require_once __DIR__ . '/../Models/PaymentAccount.php'; require_once __DIR__ . '/../Models/AdminAuditLog.php'; class PaymentAccountService { private PaymentAccount $accountModel; private AdminAuditLog $auditLog; public function __construct() { $this->accountModel = new PaymentAccount(); $this->auditLog = new AdminAuditLog(); } public function getAll(): array { return $this->accountModel->getAllAccounts(); } public function getActive(): array { return $this->accountModel->getActiveAccounts(); } public function findById(int $id): ?array { return $this->accountModel->findById($id); } public function create(array $data, int $adminId): array { $errors = $this->validate($data); if (!empty($errors)) { return ['success' => false, 'errors' => $errors]; } // Handle QR image upload if provided $qrFilename = null; if (!empty($data['_qr_file']) && $data['_qr_file']['error'] === UPLOAD_ERR_OK) { $upload = $this->uploadQrImage($data['_qr_file']); if (!$upload['success']) { return ['success' => false, 'message' => $upload['message']]; } $qrFilename = $upload['filename']; } unset($data['_qr_file']); $record = [ 'method' => $data['method'], 'account_name' => trim($data['account_name']), 'account_number' => trim($data['account_number']), 'bank_name' => trim($data['bank_name'] ?? ''), 'bank_branch' => trim($data['bank_branch'] ?? ''), 'qr_image' => $qrFilename, 'is_default' => (int)($data['is_default'] ?? 0), 'is_active' => 1, 'note' => trim($data['note'] ?? ''), 'created_by' => $adminId, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ]; // If setting as default, unset other defaults first if ($record['is_default']) { $this->accountModel->setDefault(0, $record['method']); // unset all } $id = $this->accountModel->insert($record); if ($record['is_default']) { $this->accountModel->setDefault($id, $record['method']); } $this->auditLog->record($adminId, 'payment_account.create', 'payment', 'payment_account', $id, json_encode(['method' => $record['method'], 'account_number' => $record['account_number']])); return ['success' => true, 'id' => $id, 'message' => 'เพิ่มบัญชีรับเงินเรียบร้อยแล้ว']; } public function update(int $id, array $data, int $adminId): array { $account = $this->accountModel->findById($id); if (!$account) { return ['success' => false, 'message' => 'ไม่พบบัญชีรับเงิน']; } $errors = $this->validate($data); if (!empty($errors)) { return ['success' => false, 'errors' => $errors]; } // Handle QR image upload $qrFilename = $account['qr_image']; if (!empty($data['_qr_file']) && $data['_qr_file']['error'] === UPLOAD_ERR_OK) { $upload = $this->uploadQrImage($data['_qr_file']); if (!$upload['success']) { return ['success' => false, 'message' => $upload['message']]; } $qrFilename = $upload['filename']; } unset($data['_qr_file']); $record = [ 'account_name' => trim($data['account_name']), 'account_number' => trim($data['account_number']), 'bank_name' => trim($data['bank_name'] ?? ''), 'bank_branch' => trim($data['bank_branch'] ?? ''), 'qr_image' => $qrFilename, 'note' => trim($data['note'] ?? ''), 'updated_by' => $adminId, 'updated_at' => date('Y-m-d H:i:s'), ]; $this->accountModel->update($id, $record); // Handle default setting if (!empty($data['is_default'])) { $this->accountModel->setDefault($id, $account['method']); } $this->auditLog->record($adminId, 'payment_account.update', 'payment', 'payment_account', $id, json_encode(array_diff_key($record, ['updated_at' => 1, 'updated_by' => 1]))); return ['success' => true, 'message' => 'แก้ไขบัญชีรับเงินเรียบร้อยแล้ว']; } public function toggleActive(int $id, int $adminId): array { $account = $this->accountModel->findById($id); if (!$account) { return ['success' => false, 'message' => 'ไม่พบบัญชีรับเงิน']; } $this->accountModel->toggleActive($id, $adminId); $newState = (int)$account['is_active'] === 1 ? 'ปิดใช้งาน' : 'เปิดใช้งาน'; $this->auditLog->record($adminId, 'payment_account.toggle', 'payment', 'payment_account', $id, $newState); return ['success' => true, 'message' => "{$newState}บัญชีรับเงินเรียบร้อยแล้ว"]; } public function setDefault(int $id, int $adminId): array { $account = $this->accountModel->findById($id); if (!$account) { return ['success' => false, 'message' => 'ไม่พบบัญชีรับเงิน']; } $this->accountModel->setDefault($id, $account['method']); $this->auditLog->record($adminId, 'payment_account.set_default', 'payment', 'payment_account', $id, 'Set default for method: ' . $account['method']); return ['success' => true, 'message' => 'ตั้งเป็นบัญชีหลักเรียบร้อยแล้ว']; } private function validate(array $data): array { $errors = []; if (empty($data['method']) || !in_array($data['method'], ['PromptPay', 'BankTransfer'], true)) { $errors[] = 'กรุณาเลือกประเภทบัญชีที่ถูกต้อง'; } if (empty($data['account_name'])) { $errors[] = 'กรุณากรอกชื่อบัญชี'; } if (empty($data['account_number'])) { $errors[] = 'กรุณากรอกหมายเลขบัญชี'; } if (!empty($data['method']) && $data['method'] === 'BankTransfer' && empty($data['bank_name'])) { $errors[] = 'กรุณากรอกชื่อธนาคาร'; } return $errors; } private function uploadQrImage(array $fileData): array { $allowedTypes = ['image/jpeg', 'image/jpg', 'image/png']; $maxSize = 2 * 1024 * 1024; if ($fileData['size'] > $maxSize) { return ['success' => false, 'message' => 'ขนาดไฟล์ QR ต้องไม่เกิน 2MB']; } $finfo = finfo_open(FILEINFO_MIME_TYPE); $mimeType = finfo_file($finfo, $fileData['tmp_name']); finfo_close($finfo); if (!in_array($mimeType, $allowedTypes, true)) { return ['success' => false, 'message' => 'รองรับเฉพาะไฟล์ JPG/PNG สำหรับ QR Code']; } $ext = ($mimeType === 'image/png') ? 'png' : 'jpg'; $filename = 'qr_' . bin2hex(random_bytes(12)) . '.' . $ext; $uploadDir = __DIR__ . '/../../uploads/payment/'; if (!is_dir($uploadDir)) { mkdir($uploadDir, 0755, true); } if (!move_uploaded_file($fileData['tmp_name'], $uploadDir . $filename)) { return ['success' => false, 'message' => 'ไม่สามารถบันทึกไฟล์ QR ได้']; } return ['success' => true, 'filename' => $filename]; } }
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.24 |
proxy
|
phpinfo
|
Settings