almost finish postalcode to address

This commit is contained in:
Hesabix 2025-07-14 15:31:05 +00:00
parent 7762613814
commit 2cb7b8945c
10 changed files with 720 additions and 9 deletions

View file

@ -0,0 +1,37 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20241201000000 extends AbstractMigration
{
public function getDescription(): string
{
return 'Create postal_code_inquiry table';
}
public function up(Schema $schema): void
{
$this->addSql('CREATE TABLE postal_code_inquiry (
id INT AUTO_INCREMENT NOT NULL,
postal_code VARCHAR(10) NOT NULL,
address_data JSON NOT NULL,
created_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\',
updated_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\',
UNIQUE INDEX UNIQ_POSTAL_CODE (postal_code),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
}
public function down(Schema $schema): void
{
$this->addSql('DROP TABLE postal_code_inquiry');
}
}

View file

@ -454,6 +454,7 @@ class AdminController extends AbstractController
$resp['inquiryZohalAPIKey'] = $registryMGR->get('system', key: 'inquiryZohalAPIKey');
$resp['enablePostalCodeToAddress'] = $registryMGR->get('system', key: 'enablePostalCodeToAddress');
$resp['inquiryPanelEnable'] = $registryMGR->get('system', key: 'inquiryPanelEnable');
$resp['postalCodeToAddressFee'] = $registryMGR->get('system', key: 'postalCodeToAddressFee');
return $this->json($resp);
}
@ -482,6 +483,7 @@ class AdminController extends AbstractController
$registryMGR->update('system', 'inquiryZohalAPIKey', $params['inquiryZohalAPIKey']);
$registryMGR->update('system', 'enablePostalCodeToAddress', $params['enablePostalCodeToAddress']);
$registryMGR->update('system', 'inquiryPanelEnable', $params['inquiryPanelEnable']);
$registryMGR->update('system', 'postalCodeToAddressFee', $params['postalCodeToAddressFee']);
$entityManager->persist($item);
$entityManager->flush();
return $this->json(['result' => 1]);

View file

@ -17,6 +17,8 @@ use App\Service\Printers;
use App\Entity\PrintOptions;
use App\Service\Log;
use App\Entity\Business;
use App\Service\registryMGR;
use App\Service\Inquiry;
class PlugInquiryMainController extends AbstractController
{
@ -27,11 +29,105 @@ class PlugInquiryMainController extends AbstractController
$this->entityManager = $entityManager;
}
#[Route('/api/admin/plugins/inquiry/settings/get', name: 'plugin_inquiry_settings_get', methods: ['GET'])]
public function plugin_inquiry_settings_get(EntityManagerInterface $entityManager, Access $access) : JsonResponse
#[Route('/api/plugins/inquiry/settings/get', name: 'plugin_inquiry_settings_get', methods: ['GET'])]
public function plugin_inquiry_settings_get(registryMGR $registryMGR): JsonResponse
{
return $this->json([]);
$resp['inquiryPanel'] = $registryMGR->get('system', key: 'inquiryPanel');
$resp['enablePostalCodeToAddress'] = $registryMGR->get('system', key: 'enablePostalCodeToAddress');
$resp['inquiryPanelEnable'] = $registryMGR->get('system', key: 'inquiryPanelEnable');
$resp['postalCodeToAddressFee'] = $registryMGR->get('system', key: 'postalCodeToAddressFee');
return $this->json($resp);
}
#[Route('/api/plugins/inquiry/postalcode-to-address', name: 'plugin_inquiry_postalcode_to_address', methods: ['POST'])]
public function plugin_inquiry_postalcode_to_address(Inquiry $inquiry, Access $access, Request $request, registryMGR $registryMGR, Log $log): JsonResponse
{
$acc = $access->hasRole('join');
if (!$acc) {
return $this->json([
'success' => false,
'message' => 'شما دسترسی به این سرویس را ندارید'
]);
}
// دریافت کد پستی از درخواست
$data = json_decode($request->getContent(), true);
$postalCode = $data['postal_code'] ?? null;
if (!$postalCode) {
return $this->json([
'success' => false,
'message' => 'کد پستی ارسال نشده است'
]);
}
// فراخوانی سرویس استعلام کد پستی
$result = $inquiry->postalCodeToAddress($postalCode);
// بررسی نتیجه و بازگرداندن پاسخ مناسب
if (isset($result['result']) && $result['result'] == 1) {
$isFromCache = isset($result['response_body']['message']) &&
strpos($result['response_body']['message'], 'از کش') !== false;
// ثبت لاگ بر اساس منبع داده
$logMessage = $isFromCache
? "استعلام کد پستی {$postalCode} از کش (بدون کسر کارمزد)"
: "استعلام کد پستی {$postalCode} از API (کسر کارمزد: " . $registryMGR->get('system', key: 'postalCodeToAddressFee') . " ریال)";
$log->insert(
'استعلام',
$logMessage,
$acc['user'],
$acc['bid']
);
// فقط در صورت عدم وجود در کش، کارمزد کسر شود
if (!$isFromCache) {
if ($acc['bid']->getSmsCharge() < $registryMGR->get('system', key: 'postalCodeToAddressFee')) {
// ثبت لاگ عدم موجودی کافی
$log->insert(
'استعلام',
"عدم موجودی کافی برای استعلام کد پستی {$postalCode}",
$acc['user'],
$acc['bid']
);
return $this->json([
'success' => false,
'message' => 'موجودی شما برای این سرویس کافی نیست'
]);
}
$business = $acc['bid'];
$business->setSmsCharge($business->getSmsCharge() - $registryMGR->get('system', key: 'postalCodeToAddressFee'));
$this->entityManager->persist($business);
$this->entityManager->flush();
}
return $this->json([
'success' => true,
'data' => $result['response_body']['data']['address'] ?? null,
'message' => $result['response_body']['message'] ?? 'موفق',
'from_cache' => $isFromCache
]);
} else {
// ثبت لاگ خطا
$errorMessage = $result['message'] ?? 'خطا در استعلام کد پستی';
$log->insert(
'استعلام',
"خطا در استعلام کد پستی {$postalCode}: {$errorMessage}",
$acc['user'],
$acc['bid']
);
return $this->json([
'success' => false,
'message' => $errorMessage,
'error_code' => $result['error_code'] ?? null
]);
}
}
}

View file

@ -0,0 +1,83 @@
<?php
namespace App\Entity;
use App\Repository\PostalCodeInquiryRepository;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: PostalCodeInquiryRepository::class)]
#[ORM\Table(name: 'postal_code_inquiry')]
class PostalCodeInquiry
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 10, unique: true)]
private ?string $postalCode = null;
#[ORM\Column(type: 'json')]
private array $addressData = [];
#[ORM\Column]
private ?\DateTimeImmutable $createdAt = null;
#[ORM\Column]
private ?\DateTimeImmutable $updatedAt = null;
public function __construct()
{
$this->createdAt = new \DateTimeImmutable();
$this->updatedAt = new \DateTimeImmutable();
}
public function getId(): ?int
{
return $this->id;
}
public function getPostalCode(): ?string
{
return $this->postalCode;
}
public function setPostalCode(string $postalCode): static
{
$this->postalCode = $postalCode;
return $this;
}
public function getAddressData(): array
{
return $this->addressData;
}
public function setAddressData(array $addressData): static
{
$this->addressData = $addressData;
return $this;
}
public function getCreatedAt(): ?\DateTimeImmutable
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeImmutable $createdAt): static
{
$this->createdAt = $createdAt;
return $this;
}
public function getUpdatedAt(): ?\DateTimeImmutable
{
return $this->updatedAt;
}
public function setUpdatedAt(\DateTimeImmutable $updatedAt): static
{
$this->updatedAt = $updatedAt;
return $this;
}
}

View file

@ -0,0 +1,46 @@
<?php
namespace App\Repository;
use App\Entity\PostalCodeInquiry;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<PostalCodeInquiry>
*
* @method PostalCodeInquiry|null find($id, $lockMode = null, $lockVersion = null)
* @method PostalCodeInquiry|null findOneBy(array $criteria, array $orderBy = null)
* @method PostalCodeInquiry[] findAll()
* @method PostalCodeInquiry[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class PostalCodeInquiryRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, PostalCodeInquiry::class);
}
public function findByPostalCode(string $postalCode): ?PostalCodeInquiry
{
return $this->findOneBy(['postalCode' => $postalCode]);
}
public function save(PostalCodeInquiry $entity, bool $flush = false): void
{
$this->getEntityManager()->persist($entity);
if ($flush) {
$this->getEntityManager()->flush();
}
}
public function remove(PostalCodeInquiry $entity, bool $flush = false): void
{
$this->getEntityManager()->remove($entity);
if ($flush) {
$this->getEntityManager()->flush();
}
}
}

View file

@ -0,0 +1,158 @@
<?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());
}
}
}

View file

@ -0,0 +1,188 @@
<script>
import axios from "axios";
export default {
name: "PostalCode2Address",
props: {
postalCode: {
type: String,
default: ''
}
},
data() {
return {
dialog: false,
settings: {
inquiryPanelEnable: false,
enablePostalCodeToAddress: false,
postalCodeToAddressFee: 0
},
loading: false,
result: null,
error: null
};
},
computed: {
shouldShow() {
// اگر تنظیمات هنوز لود نشده، نمایش بده
if (!this.settings.inquiryPanelEnable && !this.settings.enablePostalCodeToAddress) {
return true;
}
return (this.settings.inquiryPanelEnable === '1' || this.settings.inquiryPanelEnable === true) &&
(this.settings.enablePostalCodeToAddress === '1' || this.settings.enablePostalCodeToAddress === true);
}
},
mounted() {
this.loadSettings();
},
methods: {
async loadSettings() {
try {
console.log('در حال دریافت تنظیمات...');
this.loading = true;
const response = await axios.get('/api/plugins/inquiry/settings/get');
console.log('تنظیمات دریافت شد:', response.data);
this.settings = response.data;
console.log('shouldShow:', this.shouldShow);
} catch (error) {
console.error('خطا در دریافت تنظیمات:', error);
} finally {
this.loading = false;
}
},
openDialog() {
this.dialog = true;
},
closeDialog() {
this.dialog = false;
},
async submitPostalCode() {
this.loading = true;
this.result = null;
this.error = null;
try {
console.log('ارسال درخواست برای کد پستی:', this.postalCode);
const response = await axios.post('/api/plugins/inquiry/postalcode-to-address', {
postal_code: this.postalCode
});
console.log('پاسخ دریافتی:', response.data);
if (response.data && response.data.success) {
this.result = response.data.data;
// ارسال دادهها به کامپوننت والد
const addressDataWithPostalCode = {
...response.data.data,
postalCode: this.postalCode
};
this.$emit('address-found', addressDataWithPostalCode);
// نمایش پیام مناسب بر اساس منبع داده
const message = response.data.from_cache
? 'اطلاعات آدرس از کش دریافت شد (بدون کسر کارمزد)'
: 'اطلاعات آدرس با موفقیت دریافت شد';
// بستن دیالوگ بعد از موفقیت
this.dialog = false;
// نمایش پیام موفقیت
this.$nextTick(() => {
this.showSnackbar(message, 'success');
});
} else {
this.error = (response.data && response.data.message) || "خطا در دریافت اطلاعات";
// مدیریت خطاهای خاص
if (response.data && response.data.error_code === 'HTTP_ERROR_504') {
this.error = "سرویس استعلام کد پستی در دسترس نیست. لطفاً بعداً تلاش کنید.";
}
}
} catch (e) {
console.error('خطا در ارسال درخواست:', e);
this.error = "خطا در ارتباط با سرور";
} finally {
this.loading = false;
}
},
showSnackbar(text, color = 'success', timeout = 3000) {
// ارسال event به کامپوننت والد برای نمایش snackbar
this.$emit('show-snackbar', { text, color, timeout });
}
},
};
</script>
<template>
<div v-if="shouldShow">
<v-tooltip text="تبدیل کد پستی به آدرس" location="top">
<template v-slot:activator="{ props }">
<v-btn v-bind="props" size="x-small" color="primary" variant="text" @click="openDialog" class="px-1">
<v-icon>mdi-map-marker</v-icon>
</v-btn>
</template>
</v-tooltip>
<v-dialog v-model="dialog" max-width="500px">
<v-card>
<v-toolbar color="primary" dark>
<v-toolbar-title>تبدیل کد پستی به آدرس</v-toolbar-title>
<v-spacer></v-spacer>
<v-btn icon @click="closeDialog">
<v-icon>mdi-close</v-icon>
</v-btn>
</v-toolbar>
<v-card-text class="pt-4">
<div class="mb-4">
<p class="text-body-2">
با استفاده از این سرویس میتوانید کد پستی را به آدرس کامل تبدیل کنید.
</p>
</div>
<v-alert type="info" variant="tonal" class="mb-4">
<template v-slot:prepend>
<v-icon>mdi-information</v-icon>
</template>
<div>
<strong>کارمزد سرویس:</strong> {{ settings.postalCodeToAddressFee.toLocaleString() }} ریال
<br>
<small class="text-caption">
💡 اگر این کد پستی قبلاً استعلام شده باشد، کارمزدی کسر نمیشود
</small>
</div>
</v-alert>
<v-text-field
:model-value="postalCode"
label="کد پستی"
placeholder="مثال: 1234567890"
prepend-inner-icon="mdi-mailbox"
hide-details
class="mb-4"
readonly
></v-text-field>
<v-btn
color="primary"
block
:loading="loading"
:disabled="!postalCode || postalCode.length < 10"
@click="submitPostalCode"
>
تبدیل به آدرس
</v-btn>
<!-- نمایش خطا -->
<v-alert
v-if="error"
type="error"
variant="tonal"
class="mt-4"
border="start"
>
{{ error }}
</v-alert>
</v-card-text>
</v-card>
</v-dialog>
</div>
</template>

View file

@ -817,6 +817,7 @@ const fa_lang = {
inquiry_zohal_api_key_placeholder: "کلید API زحل",
inquiry_zohal_api_key_label: "کلید API زحل",
enable_postalcode_to_address: "تبدیل کد پستی به آدرس",
postalcode_to_address_fee: "کارمزد تبدیل کد پستی به آدرس",
inquiry_panel_enable: "فعال سازی پنل سامانه استعلامات",
inquiry_panel: "پنل سامانه استعلامات",
inquiry_panel_zohal: "زحل",

View file

@ -141,7 +141,11 @@
</v-col>
<v-col cols="12" md="6">
<v-text-field v-model="person.postalcode" :label="$t('pages.person.postal_code')" dense
prepend-inner-icon="mdi-mailbox" hide-details />
prepend-inner-icon="mdi-mailbox" hide-details>
<template v-slot:append-inner>
<PostalCode2Address :postal-code="person.postalcode" @address-found="fillAddressFields" @show-snackbar="showSnackbarFromChild" />
</template>
</v-text-field>
</v-col>
<v-col cols="12">
<v-textarea v-model="person.address" :label="$t('pages.person.address')" dense
@ -211,15 +215,29 @@
<v-overlay :model-value="loading" contained class="align-center justify-center">
<v-progress-circular indeterminate size="64" />
</v-overlay>
<!-- Snackbar برای نمایش پیامها -->
<v-snackbar v-model="snackbar.show" :color="snackbar.color" :timeout="snackbar.timeout">
{{ snackbar.text }}
<template v-slot:actions>
<v-btn color="white" text @click="snackbar.show = false">
بستن
</v-btn>
</template>
</v-snackbar>
</template>
<script>
import Swal from "sweetalert2";
import axios from "axios";
import { ref } from "vue";
import PostalCode2Address from "@/components/widgets/inquiry/postalcode2address.vue";
export default {
name: "insert",
components: {
PostalCode2Address
},
data() {
return {
tabs: '0',
@ -250,6 +268,12 @@ export default {
accounts: [],
prelabel: ref(null),
speedAccess: false
},
snackbar: {
show: false,
text: '',
color: '',
timeout: 3000
}
};
},
@ -362,7 +386,7 @@ export default {
try {
const response = await axios.post('/api/person/mod/' + this.person.code, this.person);
this.loading = false;
if (response.data.result === 2) {
if (response.data && response.data.result === 2) {
Swal.fire({
text: this.$t('pages.person.already_exists'),
icon: 'error',
@ -386,7 +410,72 @@ export default {
});
}
}
}
},
showSnackbar(text, color = 'success', timeout = 3000) {
this.snackbar.show = true;
this.snackbar.text = text;
this.snackbar.color = color;
this.snackbar.timeout = timeout;
},
fillAddressFields(addressData) {
// پر کردن فیلدهای آدرس
this.person.keshvar = 'ایران'; // کشور به صورت پیشفرض ایران
this.person.ostan = addressData.province || '';
this.person.shahr = addressData.town || '';
this.person.postalcode = addressData.postalCode || '';
// ساخت آدرس کامل
let fullAddress = '';
if (addressData.district) {
fullAddress += addressData.district;
}
if (addressData.street) {
if (fullAddress) fullAddress += ' - ';
fullAddress += addressData.street;
}
if (addressData.street2) {
if (fullAddress) fullAddress += ' - ';
fullAddress += addressData.street2;
}
if (addressData.number) {
if (fullAddress) fullAddress += ' - پلاک ';
fullAddress += addressData.number;
}
if (addressData.floor && addressData.floor !== 'همکف') {
if (fullAddress) fullAddress += ' - طبقه ';
fullAddress += addressData.floor;
}
if (addressData.side_floor) {
if (fullAddress) fullAddress += ' - واحد ';
fullAddress += addressData.side_floor;
}
if (addressData.building_name) {
if (fullAddress) fullAddress += ' - ';
fullAddress += addressData.building_name;
}
if (addressData.description) {
if (fullAddress) fullAddress += ' - ';
fullAddress += addressData.description;
}
this.person.address = fullAddress;
// نمایش پیام موفقیت
this.$nextTick(() => {
this.showSnackbar('اطلاعات آدرس با موفقیت تکمیل شد', 'success');
});
},
showSnackbarFromChild(snackbarData) {
this.showSnackbar(snackbarData.text, snackbarData.color, snackbarData.timeout);
}
}
};
</script>

View file

@ -49,6 +49,7 @@ export default defineComponent({
inquiryZohalAPIKey: '',
enablePostalCodeToAddress: false,
inquiryPanelEnable: false,
postalCodeToAddressFee: 0,
},
loading: true,
}
@ -152,7 +153,7 @@ export default defineComponent({
<v-text-field class="" hide-details="auto" :label="$t('pages.manager.inquiry_zohal_api_key')"
v-model="systemInfo.inquiryZohalAPIKey" type="text" prepend-inner-icon="mdi-text"></v-text-field>
</v-col>
<v-col cols="12" sm="12" md="4">
<v-col cols="12" sm="12" md="12">
<v-switch
v-model="systemInfo.inquiryPanelEnable"
:label="$t('pages.manager.inquiry_panel_enable')"
@ -169,7 +170,17 @@ export default defineComponent({
hide-details="auto"
inset
></v-switch>
</v-col>
<v-col cols="12" sm="12" md="4">
<v-text-field
v-model.number="systemInfo.postalCodeToAddressFee"
:label="$t('pages.manager.postalcode_to_address_fee')"
type="number"
min="0"
prepend-inner-icon="mdi-currency-usd"
hide-details="auto"
suffix="ریال"
></v-text-field>
</v-col>
</v-row>
<v-row class="mb-2">