This commit is contained in:
2026-03-30 20:23:38 +02:00
parent 70662afd2c
commit 5435209b08
26 changed files with 1949 additions and 160 deletions

View File

@@ -3,15 +3,16 @@ declare(strict_types=1);
namespace App\Modules\Shipments;
use App\Modules\Settings\AllegroApiClient;
use App\Modules\Settings\AllegroTokenManager;
use App\Modules\Settings\InpostIntegrationRepository;
use Throwable;
final class AllegroTrackingService implements ShipmentTrackingInterface
{
private const INPOST_API_PRODUCTION = 'https://api-shipx-pl.easypack24.net/v1';
private const INPOST_API_SANDBOX = 'https://sandbox-api-shipx-pl.easypack24.net/v1';
public function __construct(
private readonly AllegroApiClient $apiClient,
private readonly AllegroTokenManager $tokenManager
private readonly InpostIntegrationRepository $inpostRepository
) {
}
@@ -22,32 +23,122 @@ final class AllegroTrackingService implements ShipmentTrackingInterface
public function getDeliveryStatus(array $package): ?array
{
$shipmentId = trim((string) ($package['shipment_id'] ?? ''));
if ($shipmentId === '') {
$trackingNumber = trim((string) ($package['tracking_number'] ?? ''));
if ($trackingNumber === '') {
return null;
}
return $this->fetchStatus($shipmentId);
$carrierId = strtolower(trim((string) ($package['carrier_id'] ?? '')));
if (str_contains($carrierId, 'inpost') || str_contains($carrierId, 'paczkomat')) {
return $this->fetchInpostStatus($trackingNumber);
}
// Allegro Delivery (One Kurier), DHL, DPD via Allegro — brak publicznego API trackingu
return null;
}
private function fetchStatus(string $shipmentId): ?array
private function fetchInpostStatus(string $trackingNumber): ?array
{
try {
[$accessToken, $env] = $this->tokenManager->resolveToken();
$details = $this->apiClient->getShipmentDetails($env, $accessToken, $shipmentId);
$token = $this->resolveInpostToken();
if ($token === null) {
return null;
}
$rawStatus = strtoupper(trim((string) ($details['status'] ?? '')));
$settings = $this->inpostRepository->getSettings();
$env = (string) ($settings['environment'] ?? 'sandbox');
$baseUrl = strtolower(trim($env)) === 'production'
? self::INPOST_API_PRODUCTION
: self::INPOST_API_SANDBOX;
$url = $baseUrl . '/tracking/' . rawurlencode($trackingNumber);
$response = $this->apiRequest($url, $token);
$details = is_array($response['tracking_details'] ?? null) ? $response['tracking_details'] : [];
if ($details === []) {
return null;
}
$rawStatus = strtolower(trim((string) ($details[0]['status'] ?? '')));
if ($rawStatus === '') {
return null;
}
return [
'status' => DeliveryStatus::normalize('allegro_wza', $rawStatus),
'status' => DeliveryStatus::normalize('inpost', $rawStatus),
'status_raw' => $rawStatus,
'description' => DeliveryStatus::description('allegro_wza', $rawStatus),
'description' => DeliveryStatus::description('inpost', $rawStatus),
];
} catch (Throwable) {
return null;
}
}
private function resolveInpostToken(): ?string
{
try {
$token = $this->inpostRepository->getDecryptedToken();
return ($token !== null && trim($token) !== '') ? trim($token) : null;
} catch (Throwable) {
return null;
}
}
/**
* @return array<string, mixed>
*/
private function apiRequest(string $url, string $token): array
{
$ch = curl_init($url);
if ($ch === false) {
return [];
}
$opts = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Accept: application/json',
],
];
$caPath = $this->getCaBundlePath();
if ($caPath !== null) {
$opts[CURLOPT_CAINFO] = $caPath;
}
curl_setopt_array($ch, $opts);
$body = curl_exec($ch);
$httpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
$ch = null;
if ($body === false || $httpCode < 200 || $httpCode >= 300) {
return [];
}
$json = json_decode((string) $body, true);
return is_array($json) ? $json : [];
}
private function getCaBundlePath(): ?string
{
$candidates = [
(string) ($_ENV['CURL_CA_BUNDLE_PATH'] ?? ''),
(string) ini_get('curl.cainfo'),
'C:/xampp/apache/bin/curl-ca-bundle.crt',
'C:/xampp/php/extras/ssl/cacert.pem',
'/etc/ssl/certs/ca-certificates.crt',
];
foreach ($candidates as $path) {
if ($path !== '' && is_file($path)) {
return $path;
}
}
return null;
}
}