forked from morrning/hesabixCore
159 lines
6.3 KiB
PHP
159 lines
6.3 KiB
PHP
<?php
|
|
|
|
namespace App\Service;
|
|
|
|
use App\Entity\PostalCodeInquiry;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
|
|
class Inquiry
|
|
{
|
|
public function __construct(private EntityManagerInterface $entityManager)
|
|
{
|
|
}
|
|
|
|
public function postalCodeToAddress($postalCode)
|
|
{
|
|
// ابتدا بررسی دیتابیس
|
|
$existingInquiry = $this->entityManager->getRepository(PostalCodeInquiry::class)->findByPostalCode($postalCode);
|
|
|
|
if ($existingInquiry) {
|
|
// اگر در دیتابیس موجود است، از آن استفاده کن
|
|
$addressData = $existingInquiry->getAddressData();
|
|
return [
|
|
'result' => 1,
|
|
'response_body' => [
|
|
'data' => [
|
|
'address' => $addressData
|
|
],
|
|
'message' => 'موفق (از کش)',
|
|
'error_code' => null
|
|
]
|
|
];
|
|
}
|
|
|
|
// اگر در دیتابیس موجود نیست، از API استفاده کن
|
|
$registryMGR = new RegistryMGR($this->entityManager);
|
|
$inquiryPanel = $registryMGR->get('system', key: 'inquiryPanel');
|
|
if($inquiryPanel == 'zohal'){
|
|
$inquiryZohalAPIKey = $registryMGR->get('system', key: 'inquiryZohalAPIKey');
|
|
|
|
// بررسی وجود API Key
|
|
if (empty($inquiryZohalAPIKey)) {
|
|
return [
|
|
'result' => 0,
|
|
'message' => 'API Key تنظیم نشده است',
|
|
'error_code' => 'API_KEY_MISSING'
|
|
];
|
|
}
|
|
|
|
// استفاده از API جدید زحل
|
|
$url = "https://service.zohal.io/api/v0/services/inquiry/postal_code_inquiry";
|
|
|
|
// آمادهسازی دادههای JSON
|
|
$postData = json_encode([
|
|
'postal_code' => $postalCode
|
|
]);
|
|
|
|
// تنظیمات cURL
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_POST, true);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
|
'Content-Type: application/json',
|
|
'Content-Length: ' . strlen($postData),
|
|
'Authorization: Bearer ' . $inquiryZohalAPIKey,
|
|
'X-API-Key: ' . $inquiryZohalAPIKey
|
|
]);
|
|
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
$curlError = curl_error($ch);
|
|
curl_close($ch);
|
|
|
|
// بررسی خطای cURL
|
|
if ($curlError) {
|
|
return [
|
|
'result' => 0,
|
|
'message' => 'خطا در ارتباط با سرور: ' . $curlError,
|
|
'error_code' => 'CURL_ERROR'
|
|
];
|
|
}
|
|
|
|
if ($httpCode === 200) {
|
|
$data = json_decode($response, true);
|
|
|
|
// بررسی کدهای result
|
|
if (isset($data['result'])) {
|
|
switch ($data['result']) {
|
|
case 1:
|
|
// موفق - ذخیره در دیتابیس
|
|
if (isset($data['response_body']['data']['address'])) {
|
|
$this->saveToDatabase($postalCode, $data['response_body']['data']['address']);
|
|
}
|
|
return $data;
|
|
case 4:
|
|
return [
|
|
'result' => 4,
|
|
'message' => 'توکن غیر فعال شده است',
|
|
'error_code' => 'TOKEN_INACTIVE'
|
|
];
|
|
case 5:
|
|
return [
|
|
'result' => 5,
|
|
'message' => 'سرویس در دسترسی نمیباشد',
|
|
'error_code' => 'SERVICE_UNAVAILABLE'
|
|
];
|
|
case 6:
|
|
return [
|
|
'result' => 6,
|
|
'message' => 'فراخوانی وبسرویس با پارامترهای ورودی صحیح نمیباشد',
|
|
'error_code' => 'INVALID_PARAMETERS'
|
|
];
|
|
default:
|
|
return [
|
|
'result' => $data['result'],
|
|
'message' => $data['message'] ?? 'خطای نامشخص',
|
|
'error_code' => $data['error_code'] ?? 'UNKNOWN_ERROR'
|
|
];
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
} else {
|
|
return [
|
|
'result' => 0,
|
|
'message' => 'خطا در ارتباط با سرویس استعلام کد پستی (کد خطا: ' . $httpCode . ')',
|
|
'error_code' => 'HTTP_ERROR_' . $httpCode
|
|
];
|
|
}
|
|
}
|
|
|
|
return [
|
|
'result' => 0,
|
|
'message' => 'سرویس استعلام کد پستی فعال نیست',
|
|
'error_code' => 'SERVICE_NOT_ACTIVE'
|
|
];
|
|
}
|
|
|
|
private function saveToDatabase(string $postalCode, array $addressData): void
|
|
{
|
|
try {
|
|
$inquiry = new PostalCodeInquiry();
|
|
$inquiry->setPostalCode($postalCode);
|
|
$inquiry->setAddressData($addressData);
|
|
$inquiry->setUpdatedAt(new \DateTimeImmutable());
|
|
|
|
$this->entityManager->persist($inquiry);
|
|
$this->entityManager->flush();
|
|
|
|
// ثبت لاگ ذخیره موفق در دیتابیس
|
|
error_log("کد پستی {$postalCode} با موفقیت در کش ذخیره شد");
|
|
} catch (\Exception $e) {
|
|
// در صورت خطا در ذخیره، فقط لاگ کن و ادامه بده
|
|
error_log('خطا در ذخیره استعلام کد پستی: ' . $e->getMessage());
|
|
}
|
|
}
|
|
}
|