File manager - Edit - /home/webapp69.cm.in.th/u69319090039/Shop39/app/Services/TrackingService.php
Back
<?php interface CarrierInterface { public function getCarrierName(): string; public function getCarrierCode(): string; public function getTrackingUrl(string $trackingNumber): string; } class ThailandPostCarrier implements CarrierInterface { public function getCarrierName(): string { return 'ไปรษณีย์ไทย (Thailand Post)'; } public function getCarrierCode(): string { return 'Thailand Post'; } public function getTrackingUrl(string $trackingNumber): string { return 'https://track.thailandpost.co.th/?trackNumber=' . urlencode(trim($trackingNumber)); } } class FlashExpressCarrier implements CarrierInterface { public function getCarrierName(): string { return 'Flash Express'; } public function getCarrierCode(): string { return 'Flash Express'; } public function getTrackingUrl(string $trackingNumber): string { return 'https://www.flashexpress.co.th/tracking/?se=' . urlencode(trim($trackingNumber)); } } class JTExpressCarrier implements CarrierInterface { public function getCarrierName(): string { return 'J&T Express'; } public function getCarrierCode(): string { return 'J&T Express'; } public function getTrackingUrl(string $trackingNumber): string { return 'https://www.jtexpress.co.th/index/query/gzquery.html?bill_code=' . urlencode(trim($trackingNumber)); } } class KerryExpressCarrier implements CarrierInterface { public function getCarrierName(): string { return 'KEX / Kerry Express'; } public function getCarrierCode(): string { return 'Kerry Express'; } public function getTrackingUrl(string $trackingNumber): string { return 'https://th.kerryexpress.com/th/track/?track=' . urlencode(trim($trackingNumber)); } } class DHLCarrier implements CarrierInterface { public function getCarrierName(): string { return 'DHL Express'; } public function getCarrierCode(): string { return 'DHL'; } public function getTrackingUrl(string $trackingNumber): string { return 'https://www.dhl.com/th-th/home/tracking.html?tracking-id=' . urlencode(trim($trackingNumber)); } } class FedExCarrier implements CarrierInterface { public function getCarrierName(): string { return 'FedEx'; } public function getCarrierCode(): string { return 'FedEx'; } public function getTrackingUrl(string $trackingNumber): string { return 'https://www.fedex.com/fedextrack/?trknbr=' . urlencode(trim($trackingNumber)); } } class GenericCarrier implements CarrierInterface { private string $name; public function __construct(string $name = 'Standard Shipping') { $this->name = $name; } public function getCarrierName(): string { return $this->name; } public function getCarrierCode(): string { return $this->name; } public function getTrackingUrl(string $trackingNumber): string { return ''; } } class TrackingService { private static array $carriers = []; public static function registerCarrier(CarrierInterface $carrier): void { self::$carriers[strtolower($carrier->getCarrierCode())] = $carrier; } public static function getCarrier(string $carrierCode): CarrierInterface { $key = strtolower(trim($carrierCode)); // Fuzzy match carrier key if (strpos($key, 'thailand post') !== false || strpos($key, 'ไปรษณีย์') !== false) { return self::$carriers['thailand post'] ?? new ThailandPostCarrier(); } if (strpos($key, 'flash') !== false) { return self::$carriers['flash express'] ?? new FlashExpressCarrier(); } if (strpos($key, 'j&t') !== false || strpos($key, 'jt') !== false) { return self::$carriers['j&t express'] ?? new JTExpressCarrier(); } if (strpos($key, 'kerry') !== false || strpos($key, 'kex') !== false) { return self::$carriers['kerry express'] ?? new KerryExpressCarrier(); } if (strpos($key, 'dhl') !== false) { return self::$carriers['dhl'] ?? new DHLCarrier(); } if (strpos($key, 'fedex') !== false) { return self::$carriers['fedex'] ?? new FedExCarrier(); } if (isset(self::$carriers[$key])) { return self::$carriers[$key]; } return new GenericCarrier(!empty($carrierCode) ? $carrierCode : 'ขนส่งทั่วไป'); } public static function buildTrackingUrl(?string $carrierName, ?string $trackingNumber): string { $trackingNumber = trim((string)$trackingNumber); $carrierName = trim((string)$carrierName); if (empty($trackingNumber)) { return ''; } $carrier = self::getCarrier($carrierName); return $carrier->getTrackingUrl($trackingNumber); } public static function init(): void { self::registerCarrier(new ThailandPostCarrier()); self::registerCarrier(new FlashExpressCarrier()); self::registerCarrier(new JTExpressCarrier()); self::registerCarrier(new KerryExpressCarrier()); self::registerCarrier(new DHLCarrier()); self::registerCarrier(new FedExCarrier()); } public static function getTrackingInfo(int $orderId): array { $db = Database::getInstance(); // Fetch order details $stmt = $db->prepare("SELECT id, order_number, user_id, status, tracking_number, carrier FROM orders WHERE id = :oid LIMIT 1"); $stmt->execute(['oid' => $orderId]); $order = $stmt->fetch(); if (!$order) { return [ 'success' => false, 'message' => 'ไม่พบข้อมูลคำสั่งซื้อ' ]; } $trackingNumber = trim((string)($order['tracking_number'] ?? '')); if (empty($trackingNumber)) { return [ 'success' => true, 'has_tracking' => false, 'tracking_number' => null, 'carrier' => null, 'current_stage' => 0, 'events' => [], 'message' => 'ยังไม่มีหมายเลขติดตามพัสดุ' ]; } $carrierObj = self::getCarrier($order['carrier'] ?? 'Thailand Post'); // Fetch tracking logs from database $logStmt = $db->prepare("SELECT status_key, status_name, location, description, event_time FROM order_tracking_logs WHERE order_id = :oid ORDER BY event_time DESC, id DESC"); $logStmt->execute(['oid' => $orderId]); $logs = $logStmt->fetchAll(); // Calculate progress stage (1: รับเข้าระบบ, 2: ระหว่างขนส่ง, 3: กำลังนำจ่าย, 4: นำจ่ายสำเร็จ) $orderStatus = strtolower($order['status']); $currentStage = 1; $statusMessage = 'รับเข้าระบบ'; $isFailed = ($orderStatus === 'cancelled' || $orderStatus === 'failed' || $orderStatus === 'returned'); if ($orderStatus === 'delivered') { $currentStage = 4; $statusMessage = 'นำจ่ายสำเร็จ'; } elseif (!empty($logs)) { $latestKey = strtolower($logs[0]['status_key']); if (in_array($latestKey, ['delivered', 'success'])) { $currentStage = 4; $statusMessage = 'นำจ่ายสำเร็จ'; } elseif (in_array($latestKey, ['arriving', 'out_for_delivery'])) { $currentStage = 3; $statusMessage = 'กำลังนำจ่าย'; } elseif (in_array($latestKey, ['in_transit', 'transporting', 'accepted'])) { $currentStage = ($latestKey === 'accepted') ? 1 : 2; $statusMessage = $logs[0]['status_name']; } } elseif ($orderStatus === 'shipping') { $currentStage = 2; $statusMessage = 'อยู่ระหว่างการขนส่ง'; } $formattedEvents = []; foreach ($logs as $log) { $timestamp = strtotime($log['event_time']); $formattedEvents[] = [ 'date' => date('d/m/Y', $timestamp), 'time' => date('H:i', $timestamp) . ' น.', 'location' => $log['location'], 'status_name' => $log['status_name'], 'status_key' => $log['status_key'], 'description' => $log['description'] ]; } return [ 'success' => true, 'has_tracking' => true, 'tracking_number' => $trackingNumber, 'carrier_name' => $carrierObj->getCarrierName(), 'carrier_url' => $carrierObj->getTrackingUrl($trackingNumber), 'current_stage' => $currentStage, 'current_status_name' => $statusMessage, 'is_failed' => $isFailed, 'events' => $formattedEvents ]; } } TrackingService::init();
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.27 |
proxy
|
phpinfo
|
Settings