bug fix in ghesta,persons,etc
This commit is contained in:
parent
b9c3201b9f
commit
1783aacfd4
|
@ -448,6 +448,7 @@ class AdminController extends AbstractController
|
||||||
$resp['footer'] = $item->getFooter();
|
$resp['footer'] = $item->getFooter();
|
||||||
$resp['activeGateway'] = $registryMGR->get('system', key: 'activeGateway');
|
$resp['activeGateway'] = $registryMGR->get('system', key: 'activeGateway');
|
||||||
$resp['parsianGatewayAPI'] = $registryMGR->get('system', key: 'parsianGatewayAPI');
|
$resp['parsianGatewayAPI'] = $registryMGR->get('system', key: 'parsianGatewayAPI');
|
||||||
|
$resp['paypingKey'] = $registryMGR->get('system', key: 'paypingKey');
|
||||||
return $this->json($resp);
|
return $this->json($resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,6 +471,7 @@ class AdminController extends AbstractController
|
||||||
$item->setFooter($params['footer']);
|
$item->setFooter($params['footer']);
|
||||||
$registryMGR->update('system', 'activeGateway', $params['activeGateway']);
|
$registryMGR->update('system', 'activeGateway', $params['activeGateway']);
|
||||||
$registryMGR->update('system', 'parsianGatewayAPI', $params['parsianGatewayAPI']);
|
$registryMGR->update('system', 'parsianGatewayAPI', $params['parsianGatewayAPI']);
|
||||||
|
$registryMGR->update('system', 'paypingKey', $params['paypingKey']);
|
||||||
$entityManager->persist($item);
|
$entityManager->persist($item);
|
||||||
$entityManager->flush();
|
$entityManager->flush();
|
||||||
return $this->json(['result' => 1]);
|
return $this->json(['result' => 1]);
|
||||||
|
|
|
@ -124,16 +124,23 @@ class PersonsController extends AbstractController
|
||||||
//check exist before
|
//check exist before
|
||||||
if (!$person) {
|
if (!$person) {
|
||||||
$person = new Person();
|
$person = new Person();
|
||||||
|
$maxAttempts = 10; // حداکثر تعداد تلاش برای تولید کد جدید
|
||||||
|
$code = null;
|
||||||
|
|
||||||
|
for ($i = 0; $i < $maxAttempts; $i++) {
|
||||||
$code = $provider->getAccountingCode($acc['bid'], 'person');
|
$code = $provider->getAccountingCode($acc['bid'], 'person');
|
||||||
$exist = $entityManager->getRepository(Person::class)->findOneBy([
|
$exist = $entityManager->getRepository(Person::class)->findOneBy([
|
||||||
'code' => $code
|
'code' => $code
|
||||||
]);
|
]);
|
||||||
while ($exist) {
|
if (!$exist) {
|
||||||
$code = $provider->getAccountingCode($acc['bid'], 'person');
|
break;
|
||||||
$exist = $entityManager->getRepository(Person::class)->findOneBy([
|
|
||||||
'code' => $code
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($code === null) {
|
||||||
|
throw new \Exception('نمیتوان کد جدیدی برای شخص تولید کرد');
|
||||||
|
}
|
||||||
|
|
||||||
$person->setCode($code);
|
$person->setCode($code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,16 +277,23 @@ class PersonsController extends AbstractController
|
||||||
//check exist before
|
//check exist before
|
||||||
if (!$person) {
|
if (!$person) {
|
||||||
$person = new Person();
|
$person = new Person();
|
||||||
|
$maxAttempts = 10; // حداکثر تعداد تلاش برای تولید کد جدید
|
||||||
|
$code = null;
|
||||||
|
|
||||||
|
for ($i = 0; $i < $maxAttempts; $i++) {
|
||||||
$code = $provider->getAccountingCode($acc['bid'], 'person');
|
$code = $provider->getAccountingCode($acc['bid'], 'person');
|
||||||
$exist = $entityManager->getRepository(Person::class)->findOneBy([
|
$exist = $entityManager->getRepository(Person::class)->findOneBy([
|
||||||
'code' => $code
|
'code' => $code
|
||||||
]);
|
]);
|
||||||
while ($exist) {
|
if (!$exist) {
|
||||||
$code = $provider->getAccountingCode($acc['bid'], 'person');
|
break;
|
||||||
$exist = $entityManager->getRepository(Person::class)->findOneBy([
|
|
||||||
'code' => $code
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($code === null) {
|
||||||
|
throw new \Exception('نمیتوان کد جدیدی برای شخص تولید کرد');
|
||||||
|
}
|
||||||
|
|
||||||
$person->setCode($code);
|
$person->setCode($code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -520,7 +534,7 @@ class PersonsController extends AbstractController
|
||||||
// جستوجو (بهبود دادهشده)
|
// جستوجو (بهبود دادهشده)
|
||||||
if (!empty($search) || $search === '0') { // برای اطمینان از کار با "0" یا خالی
|
if (!empty($search) || $search === '0') { // برای اطمینان از کار با "0" یا خالی
|
||||||
$search = trim($search); // حذف فضای خالی اضافی
|
$search = trim($search); // حذف فضای خالی اضافی
|
||||||
$queryBuilder->andWhere('p.nikename LIKE :search OR p.name LIKE :search OR p.code LIKE :search')
|
$queryBuilder->andWhere('p.nikename LIKE :search OR p.name LIKE :search OR p.code LIKE :search OR p.mobile LIKE :search')
|
||||||
->setParameter('search', "%$search%");
|
->setParameter('search', "%$search%");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1567,16 +1581,23 @@ class PersonsController extends AbstractController
|
||||||
//check exist before
|
//check exist before
|
||||||
if (!$person) {
|
if (!$person) {
|
||||||
$person = new Person();
|
$person = new Person();
|
||||||
|
$maxAttempts = 10; // حداکثر تعداد تلاش برای تولید کد جدید
|
||||||
|
$code = null;
|
||||||
|
|
||||||
|
for ($i = 0; $i < $maxAttempts; $i++) {
|
||||||
$code = $provider->getAccountingCode($acc['bid'], 'person');
|
$code = $provider->getAccountingCode($acc['bid'], 'person');
|
||||||
$exist = $entityManager->getRepository(Person::class)->findOneBy([
|
$exist = $entityManager->getRepository(Person::class)->findOneBy([
|
||||||
'code' => $code
|
'code' => $code
|
||||||
]);
|
]);
|
||||||
while ($exist) {
|
if (!$exist) {
|
||||||
$code = $provider->getAccountingCode($acc['bid'], 'person');
|
break;
|
||||||
$exist = $entityManager->getRepository(Person::class)->findOneBy([
|
|
||||||
'code' => $code
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($code === null) {
|
||||||
|
throw new \Exception('نمیتوان کد جدیدی برای شخص تولید کرد');
|
||||||
|
}
|
||||||
|
|
||||||
$person->setCode($code);
|
$person->setCode($code);
|
||||||
$person->setNikename($item[0]);
|
$person->setNikename($item[0]);
|
||||||
$person->setBid($acc['bid']);
|
$person->setBid($acc['bid']);
|
||||||
|
|
|
@ -13,6 +13,10 @@ use App\Entity\HesabdariDoc;
|
||||||
use App\Entity\Person;
|
use App\Entity\Person;
|
||||||
use App\Service\Access;
|
use App\Service\Access;
|
||||||
use App\Service\Provider;
|
use App\Service\Provider;
|
||||||
|
use App\Service\Printers;
|
||||||
|
use App\Entity\PrintOptions;
|
||||||
|
use App\Service\Log;
|
||||||
|
use App\Entity\Business;
|
||||||
|
|
||||||
class PlugGhestaController extends AbstractController
|
class PlugGhestaController extends AbstractController
|
||||||
{
|
{
|
||||||
|
@ -416,4 +420,72 @@ class PlugGhestaController extends AbstractController
|
||||||
], 500);
|
], 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Route('/api/plugins/ghesta/print', name: 'plugin_ghesta_print', methods: ['POST'])]
|
||||||
|
public function plugin_ghesta_print(Printers $printers, Provider $provider, Request $request, Access $access, Log $log, EntityManagerInterface $entityManager): JsonResponse
|
||||||
|
{
|
||||||
|
$acc = $access->hasRole('plugGhestaManager');
|
||||||
|
if (!$acc)
|
||||||
|
throw $this->createAccessDeniedException();
|
||||||
|
|
||||||
|
$params = json_decode($request->getContent(), true);
|
||||||
|
$params['pdf'] = $params['pdf'] ?? true;
|
||||||
|
|
||||||
|
// دریافت تنظیمات پیشفرض از PrintOptions
|
||||||
|
$printSettings = $entityManager->getRepository(PrintOptions::class)->findOneBy(['bid' => $acc['bid']]);
|
||||||
|
|
||||||
|
// تنظیم مقادیر پیشفرض از تنظیمات ذخیره شده
|
||||||
|
$defaultOptions = [
|
||||||
|
'note' => $printSettings ? $printSettings->isSellNote() : true,
|
||||||
|
'bidInfo' => $printSettings ? $printSettings->isSellBidInfo() : true,
|
||||||
|
'paper' => $printSettings ? $printSettings->getSellPaper() : 'A4-L',
|
||||||
|
'businessStamp' => $printSettings ? $printSettings->isSellBusinessStamp() : true
|
||||||
|
];
|
||||||
|
|
||||||
|
// اولویت با پارامترهای ارسالی است
|
||||||
|
$printOptions = array_merge($defaultOptions, $params['printOptions'] ?? []);
|
||||||
|
|
||||||
|
$doc = $entityManager->getRepository(PlugGhestaDoc::class)->findOneBy([
|
||||||
|
'id' => $params['id'],
|
||||||
|
'bid' => $acc['bid']
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!$doc)
|
||||||
|
throw $this->createNotFoundException();
|
||||||
|
|
||||||
|
$pdfPid = 0;
|
||||||
|
if ($params['pdf'] == true) {
|
||||||
|
$note = '';
|
||||||
|
if ($printSettings) {
|
||||||
|
$note = $printSettings->getSellNoteString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// دریافت اطلاعات کسب و کار
|
||||||
|
$business = $entityManager->getRepository(Business::class)->find($acc['bid']);
|
||||||
|
|
||||||
|
$pdfPid = $provider->createPrint(
|
||||||
|
$acc['bid'],
|
||||||
|
$this->getUser(),
|
||||||
|
$this->renderView('pdf/plugins/ghesta/report.html.twig', [
|
||||||
|
'bid' => $business,
|
||||||
|
'doc' => $doc,
|
||||||
|
'items' => array_map(function($item) {
|
||||||
|
return [
|
||||||
|
'date' => $item->getDate(),
|
||||||
|
'amount' => $item->getAmount(),
|
||||||
|
'num' => $item->getNum(),
|
||||||
|
'hesabdariDoc' => $item->getHesabdariDoc()
|
||||||
|
];
|
||||||
|
}, $doc->getPlugGhestaItems()->toArray()),
|
||||||
|
'person' => $doc->getPerson(),
|
||||||
|
'printOptions' => $printOptions,
|
||||||
|
'note' => $note
|
||||||
|
]),
|
||||||
|
false,
|
||||||
|
$printOptions['paper']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->json(['id' => $pdfPid]);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -24,6 +24,7 @@ use Symfony\Component\HttpFoundation\JsonResponse;
|
||||||
use Symfony\Component\HttpFoundation\StreamedResponse;
|
use Symfony\Component\HttpFoundation\StreamedResponse;
|
||||||
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use App\Entity\PrintOptions;
|
||||||
|
|
||||||
class ReportController extends AbstractController
|
class ReportController extends AbstractController
|
||||||
{
|
{
|
||||||
|
@ -581,4 +582,116 @@ class ReportController extends AbstractController
|
||||||
return $this->json(['error' => 'An error occurred: ' . $e->getMessage()], 500);
|
return $this->json(['error' => 'An error occurred: ' . $e->getMessage()], 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[Route('/api/report/person/buysell/export/pdf', name: 'app_report_person_buysell_export_pdf')]
|
||||||
|
public function app_report_person_buysell_export_pdf(Provider $provider, Access $access, Request $request, EntityManagerInterface $entityManagerInterface): BinaryFileResponse|JsonResponse|StreamedResponse
|
||||||
|
{
|
||||||
|
$acc = $access->hasRole('report');
|
||||||
|
if (!$acc)
|
||||||
|
throw $this->createAccessDeniedException();
|
||||||
|
$params = [];
|
||||||
|
if ($content = $request->getContent()) {
|
||||||
|
$params = json_decode($content, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$items = [];
|
||||||
|
foreach ($params['items'] as $param) {
|
||||||
|
$prs = $entityManagerInterface->getRepository(HesabdariRow::class)->findOneBy([
|
||||||
|
'id' => $param['rowId'],
|
||||||
|
'bid' => $acc['bid']
|
||||||
|
]);
|
||||||
|
if ($prs)
|
||||||
|
$items[] = $prs;
|
||||||
|
}
|
||||||
|
|
||||||
|
// دریافت اطلاعات شخص از اولین آیتم
|
||||||
|
$person = null;
|
||||||
|
if (count($items) > 0) {
|
||||||
|
foreach ($items[0]->getDoc()->getHesabdariRows() as $row) {
|
||||||
|
if ($row->getPerson()) {
|
||||||
|
$person = $row->getPerson();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$response = [];
|
||||||
|
foreach ($items as $item) {
|
||||||
|
$temp = [
|
||||||
|
'id' => $item->getCommodity()->getId(),
|
||||||
|
'code' => $item->getCommodity()->getCode(),
|
||||||
|
'khadamat' => $item->getCommodity()->isKhadamat(),
|
||||||
|
'name' => $item->getCommodity()->getName(),
|
||||||
|
'unit' => $item->getCommodity()->getUnit()->getName(),
|
||||||
|
'count' => $item->getCommdityCount(),
|
||||||
|
'date' => $item->getDoc()->getDate(),
|
||||||
|
'docCode' => $item->getDoc()->getCode(),
|
||||||
|
'type' => $item->getDoc()->getType()
|
||||||
|
];
|
||||||
|
if ($item->getDoc()->getType() == 'buy') {
|
||||||
|
$temp['priceAll'] = $item->getBd();
|
||||||
|
} elseif ($item->getDoc()->getType() == 'sell') {
|
||||||
|
$temp['priceAll'] = $item->getBs();
|
||||||
|
}
|
||||||
|
if ($temp['count'] != 0) {
|
||||||
|
$temp['priceOne'] = $temp['priceAll'] / $temp['count'];
|
||||||
|
$temp['priceAll'] = number_format($temp['priceAll']);
|
||||||
|
$temp['priceOne'] = number_format($temp['priceOne']);
|
||||||
|
$temp['count'] = number_format($temp['count']);
|
||||||
|
$response[] = $temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// اضافه کردن شماره ردیف به دادهها
|
||||||
|
$responseWithRow = [];
|
||||||
|
foreach ($response as $index => $item) {
|
||||||
|
$responseWithRow[] = [
|
||||||
|
'row' => $index + 1,
|
||||||
|
'code' => $item['code'],
|
||||||
|
'name' => $item['name'],
|
||||||
|
'unit' => $item['unit'],
|
||||||
|
'count' => $item['count'],
|
||||||
|
'priceOne' => $item['priceOne'],
|
||||||
|
'priceAll' => $item['priceAll'],
|
||||||
|
'date' => $item['date'],
|
||||||
|
'docCode' => $item['docCode'],
|
||||||
|
'type' => $item['type'],
|
||||||
|
'khadamat' => $item['khadamat']
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// دریافت تنظیمات چاپ
|
||||||
|
$printSettings = $entityManagerInterface->getRepository(PrintOptions::class)->findOneBy(['bid' => $acc['bid']]);
|
||||||
|
|
||||||
|
// تنظیم مقادیر پیشفرض از تنظیمات ذخیره شده
|
||||||
|
$defaultOptions = [
|
||||||
|
'note' => $printSettings ? $printSettings->isSellNote() : true,
|
||||||
|
'bidInfo' => $printSettings ? $printSettings->isSellBidInfo() : true,
|
||||||
|
'taxInfo' => $printSettings ? $printSettings->isSellTaxInfo() : true,
|
||||||
|
'discountInfo' => $printSettings ? $printSettings->isSellDiscountInfo() : true,
|
||||||
|
'pays' => $printSettings ? $printSettings->isSellPays() : true,
|
||||||
|
'paper' => $printSettings ? $printSettings->getSellPaper() : 'A4-L',
|
||||||
|
'invoiceIndex' => $printSettings ? $printSettings->isSellInvoiceIndex() : true,
|
||||||
|
'businessStamp' => $printSettings ? $printSettings->isSellBusinessStamp() : true
|
||||||
|
];
|
||||||
|
|
||||||
|
// اولویت با پارامترهای ارسالی است
|
||||||
|
$printOptions = array_merge($defaultOptions, $params['printOptions'] ?? []);
|
||||||
|
|
||||||
|
$pdfPid = $provider->createPrint(
|
||||||
|
$acc['bid'],
|
||||||
|
$this->getUser(),
|
||||||
|
$this->renderView('pdf/printers/buysell_report.html.twig', [
|
||||||
|
'bid' => $acc['bid'],
|
||||||
|
'items' => $responseWithRow,
|
||||||
|
'printOptions' => $printOptions,
|
||||||
|
'note' => $printSettings ? $printSettings->getSellNoteString() : '',
|
||||||
|
'person' => $person
|
||||||
|
]),
|
||||||
|
false,
|
||||||
|
$printOptions['paper']
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->json(['id' => $pdfPid]);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -747,27 +747,53 @@ class SellController extends AbstractController
|
||||||
$this->renderView('pdf/printers/sell.html.twig', [
|
$this->renderView('pdf/printers/sell.html.twig', [
|
||||||
'bid' => $acc['bid'],
|
'bid' => $acc['bid'],
|
||||||
'doc' => $doc,
|
'doc' => $doc,
|
||||||
'rows' => $doc->getHesabdariRows(),
|
'rows' => array_map(function($row) {
|
||||||
|
return [
|
||||||
|
'commodity' => $row->getCommodity(),
|
||||||
|
'commodityCount' => $row->getCommdityCount(),
|
||||||
|
'des' => $row->getDes(),
|
||||||
|
'bs' => $row->getBs(),
|
||||||
|
'tax' => $row->getTax(),
|
||||||
|
'discount' => $row->getDiscount(),
|
||||||
|
'showPercentDiscount' => $row->getDiscountType() === 'percent',
|
||||||
|
'discountPercent' => $row->getDiscountPercent()
|
||||||
|
];
|
||||||
|
}, $doc->getHesabdariRows()->toArray()),
|
||||||
'person' => $person,
|
'person' => $person,
|
||||||
'printInvoice' => $params['printers'],
|
'printInvoice' => $params['printers'],
|
||||||
'discount' => $discount,
|
'discount' => $discount,
|
||||||
'transfer' => $transfer,
|
'transfer' => $transfer,
|
||||||
'printOptions' => $printOptions,
|
'printOptions' => $printOptions,
|
||||||
'note' => $note
|
'note' => $note,
|
||||||
|
'showPercentDiscount' => $doc->getDiscountType() === 'percent',
|
||||||
|
'discountPercent' => $doc->getDiscountPercent()
|
||||||
]),
|
]),
|
||||||
false,
|
false,
|
||||||
$printOptions['paper']
|
$printOptions['paper']
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if ($params['posPrint'] == true) {
|
if ($params['posPrint'] == true) {
|
||||||
|
|
||||||
$pid = $provider->createPrint(
|
$pid = $provider->createPrint(
|
||||||
$acc['bid'],
|
$acc['bid'],
|
||||||
$this->getUser(),
|
$this->getUser(),
|
||||||
$this->renderView('pdf/posPrinters/justSell.html.twig', [
|
$this->renderView('pdf/posPrinters/justSell.html.twig', [
|
||||||
'bid' => $acc['bid'],
|
'bid' => $acc['bid'],
|
||||||
'doc' => $doc,
|
'doc' => $doc,
|
||||||
'rows' => $doc->getHesabdariRows(),
|
'rows' => array_map(function($row) {
|
||||||
|
return [
|
||||||
|
'commodity' => $row->getCommodity(),
|
||||||
|
'commodityCount' => $row->getCommdityCount(),
|
||||||
|
'des' => $row->getDes(),
|
||||||
|
'bs' => $row->getBs(),
|
||||||
|
'tax' => $row->getTax(),
|
||||||
|
'discount' => $row->getDiscount(),
|
||||||
|
'showPercentDiscount' => $row->getDiscountType() === 'percent',
|
||||||
|
'discountPercent' => $row->getDiscountPercent()
|
||||||
|
];
|
||||||
|
}, $doc->getHesabdariRows()->toArray()),
|
||||||
|
'discount' => $discount,
|
||||||
|
'showPercentDiscount' => $doc->getDiscountType() === 'percent',
|
||||||
|
'discountPercent' => $doc->getDiscountPercent()
|
||||||
]),
|
]),
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
|
|
|
@ -79,6 +79,58 @@ class PayMGR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} elseif ($activeGateway == 'payping') {
|
||||||
|
$data = array(
|
||||||
|
'amount' => $price,
|
||||||
|
'returnUrl' => $callback_url,
|
||||||
|
'description' => $des,
|
||||||
|
'clientRefId' => $orderID
|
||||||
|
);
|
||||||
|
|
||||||
|
$ch = curl_init('https://api.payping.ir/v2/pay');
|
||||||
|
curl_setopt_array($ch, array(
|
||||||
|
CURLOPT_RETURNTRANSFER => true,
|
||||||
|
CURLOPT_ENCODING => "",
|
||||||
|
CURLOPT_MAXREDIRS => 10,
|
||||||
|
CURLOPT_TIMEOUT => 45,
|
||||||
|
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
||||||
|
CURLOPT_CUSTOMREQUEST => "POST",
|
||||||
|
CURLOPT_POSTFIELDS => json_encode($data),
|
||||||
|
CURLOPT_HTTPHEADER => array(
|
||||||
|
"accept: application/json",
|
||||||
|
"authorization: Bearer " . $this->registry->get('system', 'paypingKey'),
|
||||||
|
"cache-control: no-cache",
|
||||||
|
"content-type: application/json",
|
||||||
|
),
|
||||||
|
));
|
||||||
|
|
||||||
|
$response = curl_exec($ch);
|
||||||
|
$err = curl_error($ch);
|
||||||
|
$header = curl_getinfo($ch);
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
if ($err) {
|
||||||
|
$res['message'] = 'خطا در ارتباط با پیپینگ: ' . $err;
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($header['http_code'] == 200) {
|
||||||
|
$response = json_decode($response, true);
|
||||||
|
if (isset($response['code'])) {
|
||||||
|
$res['code'] = 100;
|
||||||
|
$res['Success'] = true;
|
||||||
|
$res['gate'] = 'payping';
|
||||||
|
$res['message'] = 'OK';
|
||||||
|
$res['authkey'] = $response['code'];
|
||||||
|
$res['targetURL'] = 'https://api.payping.ir/v2/pay/gotoipg/' . $response['code'];
|
||||||
|
} else {
|
||||||
|
$res['message'] = 'خطا در دریافت کد پرداخت از پیپینگ';
|
||||||
|
}
|
||||||
|
} elseif ($header['http_code'] == 400) {
|
||||||
|
$res['message'] = 'خطا در درخواست پرداخت: ' . $response;
|
||||||
|
} else {
|
||||||
|
$res['message'] = 'خطا در ارتباط با پیپینگ. کد خطا: ' . $header['http_code'];
|
||||||
|
}
|
||||||
} elseif ($activeGateway == 'pec') {
|
} elseif ($activeGateway == 'pec') {
|
||||||
ini_set("soap.wsdl_cache_enabled", "0");
|
ini_set("soap.wsdl_cache_enabled", "0");
|
||||||
$url = "https://pec.shaparak.ir/NewIPGServices/Sale/SaleService.asmx?WSDL";
|
$url = "https://pec.shaparak.ir/NewIPGServices/Sale/SaleService.asmx?WSDL";
|
||||||
|
@ -150,6 +202,53 @@ class PayMGR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} elseif ($activeGateway == 'payping') {
|
||||||
|
$refid = $request->get('refid');
|
||||||
|
if (!$refid) {
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = array(
|
||||||
|
'amount' => $price,
|
||||||
|
'refId' => $refid
|
||||||
|
);
|
||||||
|
|
||||||
|
$ch = curl_init('https://api.payping.ir/v2/pay/verify');
|
||||||
|
curl_setopt_array($ch, array(
|
||||||
|
CURLOPT_RETURNTRANSFER => true,
|
||||||
|
CURLOPT_ENCODING => "",
|
||||||
|
CURLOPT_MAXREDIRS => 10,
|
||||||
|
CURLOPT_TIMEOUT => 45,
|
||||||
|
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
||||||
|
CURLOPT_CUSTOMREQUEST => "POST",
|
||||||
|
CURLOPT_POSTFIELDS => json_encode($data),
|
||||||
|
CURLOPT_HTTPHEADER => array(
|
||||||
|
"accept: application/json",
|
||||||
|
"authorization: Bearer " . $this->registry->get('system', 'paypingKey'),
|
||||||
|
"cache-control: no-cache",
|
||||||
|
"content-type: application/json",
|
||||||
|
),
|
||||||
|
));
|
||||||
|
|
||||||
|
$response = curl_exec($ch);
|
||||||
|
$err = curl_error($ch);
|
||||||
|
$header = curl_getinfo($ch);
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
if ($err) {
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($header['http_code'] == 200) {
|
||||||
|
$response = json_decode($response, true);
|
||||||
|
if (isset($refid) && $refid != '') {
|
||||||
|
$res['Success'] = true;
|
||||||
|
$res['status'] = 100;
|
||||||
|
$res['refID'] = $refid;
|
||||||
|
$res['card_pan'] = ''; // PayPing این اطلاعات را برنمیگرداند
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
}
|
||||||
} elseif ($activeGateway == 'pec') {
|
} elseif ($activeGateway == 'pec') {
|
||||||
$confirmUrl = 'https://pec.shaparak.ir/NewIPGServices/Confirm/ConfirmService.asmx?WSDL';
|
$confirmUrl = 'https://pec.shaparak.ir/NewIPGServices/Confirm/ConfirmService.asmx?WSDL';
|
||||||
$params = array(
|
$params = array(
|
||||||
|
|
|
@ -55,6 +55,12 @@ class pdfMGR
|
||||||
],
|
],
|
||||||
'default_font' => 'vazirmatn',
|
'default_font' => 'vazirmatn',
|
||||||
'tempDir' => $tempDir,
|
'tempDir' => $tempDir,
|
||||||
|
'margin_left' => 5,
|
||||||
|
'margin_right' => 5,
|
||||||
|
'margin_top' => 5,
|
||||||
|
'margin_bottom' => 5,
|
||||||
|
'margin_header' => 2,
|
||||||
|
'margin_footer' => 2,
|
||||||
'autoArabic' => true,
|
'autoArabic' => true,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
225
hesabixCore/templates/pdf/plugins/ghesta/report.html.twig
Normal file
225
hesabixCore/templates/pdf/plugins/ghesta/report.html.twig
Normal file
|
@ -0,0 +1,225 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fa" direction="rtl">
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||||
|
<style>
|
||||||
|
.center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.text-white {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
.stimol td,
|
||||||
|
.stimol th {
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
.item {
|
||||||
|
height: 30px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
h4 {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body style="direction:rtl; width:100%">
|
||||||
|
<div class="block-content pt-1 pb-3 d-none d-sm-block">
|
||||||
|
<div class="c-print container-xl">
|
||||||
|
<div class="tg-wrap" style="width:100%; border:1px solid black;border-radius: 8px;">
|
||||||
|
<table class="rounded" style="width:100%;">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td style="width:20%">
|
||||||
|
<img src="{{ url('front_avatar_file_get', {id: bid.id},)}}" width="65"/>
|
||||||
|
</td>
|
||||||
|
<td style="width:60%; text-align:center">
|
||||||
|
<h4>{{ bid.name }}</h4>
|
||||||
|
<h3 class="">گزارش اقساط</h3>
|
||||||
|
</td>
|
||||||
|
<td style="width:20%">
|
||||||
|
<h4>
|
||||||
|
<b>شماره فاکتور:</b>
|
||||||
|
{{ doc.mainDoc.code }}</h4>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="width:100%; border:1px solid black;border-radius: 8px;margin-top:5px;text-align:center;">
|
||||||
|
<div class="tg-wrap" style="width:100%;border-radius: 8px 8px 0px 0px;text-align:center;background-color:gray">
|
||||||
|
<b style="color:white;">خریدار</b>
|
||||||
|
</div>
|
||||||
|
<table style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr style="text-align:center;">
|
||||||
|
<td class="">
|
||||||
|
<p>
|
||||||
|
<b>نام:</b>
|
||||||
|
{% if person.prelabel is not null %}{{ person.prelabel.label }}{% endif %}
|
||||||
|
{{ person.nikename }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>شناسه ملی:</b>
|
||||||
|
{{ person.shenasemeli }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>شماره ثبت:</b>
|
||||||
|
{{ person.sabt }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>شماره اقتصادی:</b>
|
||||||
|
{{ person.codeeghtesadi }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>تلفن / نمابر:</b>
|
||||||
|
{{ person.tel }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="" colspan="1">
|
||||||
|
<p>
|
||||||
|
<b>کد پستی:</b>
|
||||||
|
{{ person.postalcode }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="" colspan="3">
|
||||||
|
<p>
|
||||||
|
<b>آدرس:</b>
|
||||||
|
استان {{ person.ostan }}، شهر {{ person.shahr }}، {{ person.address }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="width:100%; border:1px solid black;border-radius: 8px;margin-top:5px;text-align:center;">
|
||||||
|
<div class="tg-wrap" style="width:100%;border-radius: 8px 8px 0px 0px;text-align:center;background-color:gray">
|
||||||
|
<b style="color:white;">اطلاعات اقساط</b>
|
||||||
|
</div>
|
||||||
|
<table style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr style="text-align:center;">
|
||||||
|
<td class="">
|
||||||
|
<p>
|
||||||
|
<b>تعداد اقساط:</b>
|
||||||
|
{{ doc.count }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>درصد سود:</b>
|
||||||
|
{{ doc.profitPercent }}%
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>مبلغ سود:</b>
|
||||||
|
{{ doc.profitAmount|number_format }} ریال
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>نوع سود:</b>
|
||||||
|
{% if doc.profitType == 'yearly' %}
|
||||||
|
سالانه
|
||||||
|
{% elseif doc.profitType == 'monthly' %}
|
||||||
|
ماهانه
|
||||||
|
{% else %}
|
||||||
|
روزانه
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>جریمه روزانه:</b>
|
||||||
|
{{ doc.daysPay }}%
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="width:100%;margin-top:5px;text-align:center;">
|
||||||
|
<table style="width:100%;">
|
||||||
|
<thead>
|
||||||
|
<tr class="stimol" style="background-color:gray;">
|
||||||
|
<th class="text-white" style="width:80px">شماره قسط</th>
|
||||||
|
<th class="text-white">تاریخ</th>
|
||||||
|
<th class="text-white">مبلغ</th>
|
||||||
|
<th class="text-white">وضعیت</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for item in items %}
|
||||||
|
<tr class="stimol">
|
||||||
|
<td class="center item">{{ item.num }}</td>
|
||||||
|
<td class="center item">{{ item.date|date('Y/m/d') }}</td>
|
||||||
|
<td class="center item">{{ item.amount|number_format }} ریال</td>
|
||||||
|
<td class="center item">
|
||||||
|
{% if item.hesabdariDoc %}
|
||||||
|
<span style="color: green;">پرداخت شده ({{ item.hesabdariDoc.code }})</span>
|
||||||
|
{% else %}
|
||||||
|
<span style="color: red;">پرداخت نشده</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if printOptions.note and note %}
|
||||||
|
<div style="width:100%;margin-top:5px;text-align:center;">
|
||||||
|
<table style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr class="stimol">
|
||||||
|
<td class="item" style="padding:1%">
|
||||||
|
<h4>توضیحات:</h4>
|
||||||
|
{{ note|nl2br }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div style="width:40%;margin-top:0px;text-align:center;float:left;">
|
||||||
|
<table style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td class="center" style="height:90px">
|
||||||
|
<h4>مهر و امضا خریدار</h4>
|
||||||
|
</td>
|
||||||
|
<td class="center" style="height:90px">
|
||||||
|
<h4>مهر و امضا فروشنده:</h4>
|
||||||
|
<br>
|
||||||
|
{% if printOptions.businessStamp %}
|
||||||
|
<img src="{{ url('front_seal_file_get', {id: bid.id},)}}" width="160"/>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -6,7 +6,7 @@
|
||||||
body {
|
body {
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
font-size: 100%;
|
font-size: 11px;
|
||||||
}
|
}
|
||||||
|
|
||||||
table {
|
table {
|
||||||
|
@ -19,10 +19,12 @@
|
||||||
th,
|
th,
|
||||||
td {
|
td {
|
||||||
border: 1px solid black !important;
|
border: 1px solid black !important;
|
||||||
|
font-size: 11px;
|
||||||
}
|
}
|
||||||
h1 {
|
h1 {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#logo {
|
#logo {
|
||||||
|
@ -60,7 +62,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.items .heading {
|
.items .heading {
|
||||||
font-size: 12.5px;
|
font-size: 11px;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
border-top: 1px solid black;
|
border-top: 1px solid black;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
|
@ -75,7 +77,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.items td {
|
.items td {
|
||||||
font-size: 12px;
|
font-size: 11px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
vertical-align: bottom;
|
vertical-align: bottom;
|
||||||
}
|
}
|
||||||
|
@ -89,7 +91,7 @@
|
||||||
text-align: right !important;
|
text-align: right !important;
|
||||||
}
|
}
|
||||||
.total {
|
.total {
|
||||||
font-size: 13px;
|
font-size: 11px;
|
||||||
border-top: 1px dashed black !important;
|
border-top: 1px dashed black !important;
|
||||||
border-bottom: 1px dashed black !important;
|
border-bottom: 1px dashed black !important;
|
||||||
}
|
}
|
||||||
|
@ -110,7 +112,7 @@
|
||||||
}
|
}
|
||||||
section,
|
section,
|
||||||
footer {
|
footer {
|
||||||
font-size: 12px;
|
font-size: 11px;
|
||||||
}
|
}
|
||||||
tbody,
|
tbody,
|
||||||
thead,
|
thead,
|
||||||
|
@ -150,6 +152,7 @@
|
||||||
<th class="heading name">کالا</th>
|
<th class="heading name">کالا</th>
|
||||||
<th class="heading qty">تعداد</th>
|
<th class="heading qty">تعداد</th>
|
||||||
<th class="heading rate">فی</th>
|
<th class="heading rate">فی</th>
|
||||||
|
<th class="heading amount">قبل تخفیف</th>
|
||||||
<th class="heading amount">جمع</th>
|
<th class="heading amount">جمع</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@ -159,8 +162,29 @@
|
||||||
{% if row.commodity != null %}
|
{% if row.commodity != null %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{row.commodity.name}}</td>
|
<td>{{row.commodity.name}}</td>
|
||||||
<td>{{row.commdityCount}}</td>
|
<td>{{row.commodityCount}}</td>
|
||||||
<td class="price">{{(row.bs / row.commdityCount) | number_format}}</td>
|
<td class="price">
|
||||||
|
{% if row.commodityCount > 0 %}
|
||||||
|
{% if row.showPercentDiscount %}
|
||||||
|
{% set originalPrice = row.bs / (1 - (row.discountPercent / 100)) %}
|
||||||
|
{% set unitPrice = originalPrice / row.commodityCount %}
|
||||||
|
{% else %}
|
||||||
|
{% set originalPrice = row.bs + row.discount %}
|
||||||
|
{% set unitPrice = originalPrice / row.commodityCount %}
|
||||||
|
{% endif %}
|
||||||
|
{{ unitPrice|round|number_format }}
|
||||||
|
{% else %}
|
||||||
|
0
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td class="price">
|
||||||
|
{% if row.showPercentDiscount %}
|
||||||
|
{% set originalPrice = row.bs / (1 - (row.discountPercent / 100)) %}
|
||||||
|
{{ originalPrice|round|number_format }}
|
||||||
|
{% else %}
|
||||||
|
{{ (row.bs + row.discount)|number_format }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
<td class="price">{{row.bs | number_format}}</td>
|
<td class="price">{{row.bs | number_format}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -169,6 +193,19 @@
|
||||||
<th colspan="3" class="total text">جمع فاکتور</th>
|
<th colspan="3" class="total text">جمع فاکتور</th>
|
||||||
<th class="total price">{{doc.amount | number_format}}</th>
|
<th class="total price">{{doc.amount | number_format}}</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
{% if discount > 0 %}
|
||||||
|
<tr>
|
||||||
|
<th colspan="3" class="total text">تخفیف</th>
|
||||||
|
<th class="total price">
|
||||||
|
{% if showPercentDiscount %}
|
||||||
|
{{ discountPercent }}%
|
||||||
|
({{ (doc.amount * discountPercent / 100)|round|number_format }})
|
||||||
|
{% else %}
|
||||||
|
{{ discount | number_format }}
|
||||||
|
{% endif %}
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
{% endif %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<section style="margin-bottom:10px;margin-top:10px;text-align:center;">
|
<section style="margin-bottom:10px;margin-top:10px;text-align:center;">
|
||||||
|
|
|
@ -276,7 +276,7 @@
|
||||||
{{transfer | number_format}}
|
{{transfer | number_format}}
|
||||||
</h4>
|
</h4>
|
||||||
<h4>
|
<h4>
|
||||||
مبلغ کل بدون تخفیف:
|
جمع بدون تخفیف:
|
||||||
{{ (doc.amount + discount) | number_format}}
|
{{ (doc.amount + discount) | number_format}}
|
||||||
</h4>
|
</h4>
|
||||||
<h4>
|
<h4>
|
||||||
|
|
187
hesabixCore/templates/pdf/printers/buysell_report.html.twig
Normal file
187
hesabixCore/templates/pdf/printers/buysell_report.html.twig
Normal file
|
@ -0,0 +1,187 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fa" direction="rtl">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>گزارش خرید و فروش</title>
|
||||||
|
<style>
|
||||||
|
.center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.text-white {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
.stimol td,
|
||||||
|
.stimol th {
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
|
.item {
|
||||||
|
height: 30px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
h4 {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body style="direction:rtl; width:100%">
|
||||||
|
<div class="block-content pt-1 pb-3 d-none d-sm-block">
|
||||||
|
<div class="c-print container-xl">
|
||||||
|
<div class="tg-wrap" style="width:100%; border:1px solid black;border-radius: 8px;">
|
||||||
|
<table class="rounded" style="width:100%;">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td style="width:20%">
|
||||||
|
{% if printOptions.invoiceIndex %}
|
||||||
|
<img src="{{ url('front_avatar_file_get', {id: bid.id},)}}" width="65"/>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td style="width:60%; text-align:center">
|
||||||
|
<h3 class="">{{ bid.legalName }}</h3>
|
||||||
|
<h3 class="">گزارش خرید و فروش</h3>
|
||||||
|
</td>
|
||||||
|
<td style="width:20%">
|
||||||
|
<h4>
|
||||||
|
<b>تاریخ چاپ:</b>
|
||||||
|
{{ "now"|date("Y/m/d") }}</h4>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% if printOptions.bidInfo %}
|
||||||
|
<div style="width:100%; border:1px solid black;border-radius: 8px;margin-top:5px;text-align:center;">
|
||||||
|
<div class="tg-wrap" style="width:100%;border-radius: 8px 8px 0px 0px;text-align:center;background-color:gray">
|
||||||
|
<b style="color:white;">اطلاعات شخص</b>
|
||||||
|
</div>
|
||||||
|
<table style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr style="text-align:center;">
|
||||||
|
<td class="">
|
||||||
|
<p>
|
||||||
|
<b>نام:</b>
|
||||||
|
{% if person.prelabel is not null %}{{ person.prelabel.label }}{% endif %}
|
||||||
|
{{ person.nikename }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>شناسه ملی:</b>
|
||||||
|
{{ person.shenasemeli }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>شماره ثبت:</b>
|
||||||
|
{{ person.sabt }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>شماره اقتصادی:</b>
|
||||||
|
{{ person.codeeghtesadi }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="center">
|
||||||
|
<p>
|
||||||
|
<b>تلفن / نمابر:</b>
|
||||||
|
{{ person.tel }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="" colspan="1">
|
||||||
|
<p>
|
||||||
|
<b>کد پستی:</b>
|
||||||
|
{{ person.postalcode }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
<td class="" colspan="3">
|
||||||
|
<p>
|
||||||
|
<b>آدرس:</b>
|
||||||
|
استان {{ person.ostan }}، شهر {{ person.shahr }}، {{ person.address }}
|
||||||
|
</p>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div style="width:100%;margin-top:5px;text-align:center;">
|
||||||
|
<table style="width:100%;">
|
||||||
|
<thead>
|
||||||
|
<tr class="stimol" style="background-color:gray;">
|
||||||
|
<th class="text-white" style="width:40px">ردیف</th>
|
||||||
|
<th class="text-white">کد کالا</th>
|
||||||
|
<th class="text-white">نام کالا</th>
|
||||||
|
<th class="text-white">واحد</th>
|
||||||
|
<th class="text-white">تعداد</th>
|
||||||
|
<th class="text-white">قیمت واحد</th>
|
||||||
|
<th class="text-white">قیمت کل</th>
|
||||||
|
<th class="text-white">تاریخ</th>
|
||||||
|
<th class="text-white">شماره سند</th>
|
||||||
|
<th class="text-white">نوع سند</th>
|
||||||
|
<th class="text-white">نوع</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for item in items %}
|
||||||
|
<tr class="stimol">
|
||||||
|
<td class="center item">{{ item.row }}</td>
|
||||||
|
<td class="center item">{{ item.code }}</td>
|
||||||
|
<td class="center item">{{ item.name }}</td>
|
||||||
|
<td class="center item">{{ item.unit }}</td>
|
||||||
|
<td class="center item">{{ item.count }}</td>
|
||||||
|
<td class="center item">{{ item.priceOne }}</td>
|
||||||
|
<td class="center item">{{ item.priceAll }}</td>
|
||||||
|
<td class="center item">{{ item.date }}</td>
|
||||||
|
<td class="center item">{{ item.docCode }}</td>
|
||||||
|
<td class="center item">
|
||||||
|
{% if item.type == 'buy' %}
|
||||||
|
خرید
|
||||||
|
{% elseif item.type == 'sell' %}
|
||||||
|
فروش
|
||||||
|
{% elseif item.type == 'rfbuy' %}
|
||||||
|
برگشت از خرید
|
||||||
|
{% elseif item.type == 'rfsell' %}
|
||||||
|
برگشت از فروش
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td class="center item">
|
||||||
|
{% if item.khadamat %}
|
||||||
|
خدمات
|
||||||
|
{% else %}
|
||||||
|
کالا
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="width:40%;margin-top:5px;text-align:center;float:left;">
|
||||||
|
<table style="width:100%;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td class="center" style="height:90px">
|
||||||
|
<h4>مهر و امضا</h4>
|
||||||
|
{% if printOptions.businessStamp %}
|
||||||
|
<img src="{{ url('front_seal_file_get', {id: bid.id},)}}" width="160"/>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -276,7 +276,7 @@
|
||||||
{{transfer | number_format}}
|
{{transfer | number_format}}
|
||||||
</h4>
|
</h4>
|
||||||
<h4>
|
<h4>
|
||||||
مبلغ کل بدون تخفیف:
|
جمع بدون تخفیف:
|
||||||
{{ (doc.amount + discount) | number_format}}
|
{{ (doc.amount + discount) | number_format}}
|
||||||
</h4>
|
</h4>
|
||||||
<h4>
|
<h4>
|
||||||
|
|
|
@ -276,7 +276,7 @@
|
||||||
{{transfer | number_format}}
|
{{transfer | number_format}}
|
||||||
</h4>
|
</h4>
|
||||||
<h4>
|
<h4>
|
||||||
مبلغ کل بدون تخفیف:
|
جمع بدون تخفیف:
|
||||||
{{ (doc.amount + discount) | number_format}}
|
{{ (doc.amount + discount) | number_format}}
|
||||||
</h4>
|
</h4>
|
||||||
<h4>
|
<h4>
|
||||||
|
|
|
@ -15,6 +15,16 @@
|
||||||
}
|
}
|
||||||
.item {
|
.item {
|
||||||
height: 30px;
|
height: 30px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
h4 {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
p {
|
||||||
|
font-size: 11px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
@ -191,6 +201,7 @@
|
||||||
<th class="text-white">مبلغ واحد</th>
|
<th class="text-white">مبلغ واحد</th>
|
||||||
{% if printOptions.discountInfo %}
|
{% if printOptions.discountInfo %}
|
||||||
<th class="text-white">تخفیف</th>
|
<th class="text-white">تخفیف</th>
|
||||||
|
<th class="text-white">قبل تخفیف</th>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if printOptions.taxInfo %}
|
{% if printOptions.taxInfo %}
|
||||||
<th class="text-white">مالیات</th>
|
<th class="text-white">مالیات</th>
|
||||||
|
@ -213,18 +224,40 @@
|
||||||
{{ item.commodity.name }}</td>
|
{{ item.commodity.name }}</td>
|
||||||
<td class="center item">{{ item.des }}</td>
|
<td class="center item">{{ item.des }}</td>
|
||||||
<td class="center item">
|
<td class="center item">
|
||||||
{{ item.commdityCount }}
|
{{ item.commodityCount }}
|
||||||
{{ item.commodity.unit.name }}
|
{{ item.commodity.unit.name }}
|
||||||
</td>
|
</td>
|
||||||
<td class="center item">
|
<td class="center item">
|
||||||
{% if item.commdityCount > 0 %}
|
{% if item.commodityCount > 0 %}
|
||||||
{{ ((item.bs|number_format(0, '.', '') - item.tax|number_format(0, '.', '') + item.discount|number_format(0, '.', '')) / item.commdityCount) | number_format }}
|
{% if item.showPercentDiscount %}
|
||||||
|
{% set originalPrice = item.bs / (1 - (item.discountPercent / 100)) %}
|
||||||
|
{% set unitPrice = originalPrice / item.commodityCount %}
|
||||||
|
{% else %}
|
||||||
|
{% set originalPrice = item.bs + item.discount %}
|
||||||
|
{% set unitPrice = originalPrice / item.commodityCount %}
|
||||||
|
{% endif %}
|
||||||
|
{{ unitPrice|round|number_format }}
|
||||||
{% else %}
|
{% else %}
|
||||||
0
|
0
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
{% if printOptions.discountInfo %}
|
{% if printOptions.discountInfo %}
|
||||||
<td class="center item">{{ item.discount | number_format }}</td>
|
<td class="center item">
|
||||||
|
{% if item.showPercentDiscount %}
|
||||||
|
{{ item.discountPercent }}%
|
||||||
|
({{ (item.bs * item.commodityCount * item.discountPercent / 100)|round|number_format }})
|
||||||
|
{% else %}
|
||||||
|
{{ item.discount|number_format }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td class="center item">
|
||||||
|
{% if item.showPercentDiscount %}
|
||||||
|
{% set originalPrice = item.bs / (1 - (item.discountPercent / 100)) %}
|
||||||
|
{{ originalPrice|round|number_format }}
|
||||||
|
{% else %}
|
||||||
|
{{ (item.bs + item.discount)|number_format }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if printOptions.taxInfo %}
|
{% if printOptions.taxInfo %}
|
||||||
<td class="center item">{{ item.tax | number_format}}</td>
|
<td class="center item">{{ item.tax | number_format}}</td>
|
||||||
|
@ -285,7 +318,7 @@
|
||||||
</h4>
|
</h4>
|
||||||
{% if doc.amount != (doc.amount + discount) %}
|
{% if doc.amount != (doc.amount + discount) %}
|
||||||
<h4>
|
<h4>
|
||||||
مبلغ کل بدون تخفیف:
|
جمع بدون تخفیف:
|
||||||
{{ (doc.amount + discount) | number_format}}
|
{{ (doc.amount + discount) | number_format}}
|
||||||
</h4>
|
</h4>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -286,6 +286,7 @@ const fa_lang = {
|
||||||
fetch_data_error: "خطا در گرفتن داده از {url}"
|
fetch_data_error: "خطا در گرفتن داده از {url}"
|
||||||
},
|
},
|
||||||
dialog: {
|
dialog: {
|
||||||
|
person_with_det_report: 'گزارش تفضیلی اشخاص',
|
||||||
change_password_label: 'تغییر کلمه عبور',
|
change_password_label: 'تغییر کلمه عبور',
|
||||||
download: 'دانلود',
|
download: 'دانلود',
|
||||||
delete_group: 'حذف گروهی',
|
delete_group: 'حذف گروهی',
|
||||||
|
@ -793,6 +794,7 @@ const fa_lang = {
|
||||||
keywords: "کلیدواژهها با کاما (,) از هم جدا شوند",
|
keywords: "کلیدواژهها با کاما (,) از هم جدا شوند",
|
||||||
zarinpal_api: "کد API زرینپال",
|
zarinpal_api: "کد API زرینپال",
|
||||||
parsian_api: "کد API درگاه پارسیان",
|
parsian_api: "کد API درگاه پارسیان",
|
||||||
|
payping_api: "کد API درگاه پیپینگ",
|
||||||
scripts: "اسکریپتها",
|
scripts: "اسکریپتها",
|
||||||
footer_scripts: "اسکریپتهای فوتر سایت(مثلا اسکریپت شمارنده گوگل و ...)",
|
footer_scripts: "اسکریپتهای فوتر سایت(مثلا اسکریپت شمارنده گوگل و ...)",
|
||||||
site_footer: "فوتر سایت با پشتیبانی از HTML",
|
site_footer: "فوتر سایت با پشتیبانی از HTML",
|
||||||
|
|
|
@ -298,6 +298,12 @@ const router = createRouter({
|
||||||
component: () =>
|
component: () =>
|
||||||
import('../views/acc/reports/persons/buysellByPerson.vue'),
|
import('../views/acc/reports/persons/buysellByPerson.vue'),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'reports/persons/withdet',
|
||||||
|
name: 'person_withdet',
|
||||||
|
component: () =>
|
||||||
|
import('../views/acc/reports/persons/withdet.vue'),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: 'costs/list',
|
path: 'costs/list',
|
||||||
name: 'costs_list',
|
name: 'costs_list',
|
||||||
|
|
|
@ -933,13 +933,6 @@ export default {
|
||||||
this.isCalculating = true;
|
this.isCalculating = true;
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
|
|
||||||
// اگر در حالت ویرایش هستیم و اقساط قبلاً محاسبه شدهاند، از آنها استفاده کن
|
|
||||||
if (this.$route.params.id && this.installments.length > 0) {
|
|
||||||
this.isCalculating = false;
|
|
||||||
this.loading = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const totalAmount = this.remainingAmount;
|
const totalAmount = this.remainingAmount;
|
||||||
const prepayment = Number(this.installmentData.prepayment) || 0;
|
const prepayment = Number(this.installmentData.prepayment) || 0;
|
||||||
const remainingAmount = totalAmount - prepayment;
|
const remainingAmount = totalAmount - prepayment;
|
||||||
|
@ -1121,6 +1114,13 @@ export default {
|
||||||
},
|
},
|
||||||
immediate: true
|
immediate: true
|
||||||
},
|
},
|
||||||
|
'installmentData.count': {
|
||||||
|
handler(newVal) {
|
||||||
|
if (newVal && this.installmentData.calculationType === 'count') {
|
||||||
|
this.calculateInstallments();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
'installmentData.interestRate': {
|
'installmentData.interestRate': {
|
||||||
handler(newVal, oldVal) {
|
handler(newVal, oldVal) {
|
||||||
if (newVal && !oldVal) {
|
if (newVal && !oldVal) {
|
||||||
|
@ -1181,4 +1181,91 @@ export default {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
background-color: rgb(var(--v-theme-surface));
|
background-color: rgb(var(--v-theme-surface));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.vpd-main) {
|
||||||
|
position: fixed !important;
|
||||||
|
z-index: 999999 !important;
|
||||||
|
top: 50% !important;
|
||||||
|
left: 50% !important;
|
||||||
|
transform: translate(-50%, -50%) !important;
|
||||||
|
pointer-events: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.vpd-wrapper) {
|
||||||
|
position: fixed !important;
|
||||||
|
z-index: 999999 !important;
|
||||||
|
top: 50% !important;
|
||||||
|
left: 50% !important;
|
||||||
|
transform: translate(-50%, -50%) !important;
|
||||||
|
pointer-events: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.vpd-container) {
|
||||||
|
position: fixed !important;
|
||||||
|
z-index: 999999 !important;
|
||||||
|
top: 50% !important;
|
||||||
|
left: 50% !important;
|
||||||
|
transform: translate(-50%, -50%) !important;
|
||||||
|
pointer-events: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.vpd-content) {
|
||||||
|
position: fixed !important;
|
||||||
|
z-index: 999999 !important;
|
||||||
|
top: 50% !important;
|
||||||
|
left: 50% !important;
|
||||||
|
transform: translate(-50%, -50%) !important;
|
||||||
|
pointer-events: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.vpd-overlay) {
|
||||||
|
position: fixed !important;
|
||||||
|
top: 0 !important;
|
||||||
|
left: 0 !important;
|
||||||
|
right: 0 !important;
|
||||||
|
bottom: 0 !important;
|
||||||
|
background: rgba(0, 0, 0, 0.5) !important;
|
||||||
|
z-index: 999998 !important;
|
||||||
|
pointer-events: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.v-application) {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.v-application--wrap) {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.v-main) {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.v-main__wrap) {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.v-container) {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.v-row) {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.v-col) {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.v-card) {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.v-field) {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.v-field__input) {
|
||||||
|
position: relative !important;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
|
@ -8,6 +8,11 @@
|
||||||
</v-tooltip>
|
</v-tooltip>
|
||||||
</template>
|
</template>
|
||||||
<v-spacer></v-spacer>
|
<v-spacer></v-spacer>
|
||||||
|
<v-tooltip text="چاپ گزارش اقساط" location="bottom">
|
||||||
|
<template v-slot:activator="{ props }">
|
||||||
|
<v-btn v-bind="props" variant="text" icon="mdi-printer" @click="printReport" :loading="loading" />
|
||||||
|
</template>
|
||||||
|
</v-tooltip>
|
||||||
</v-toolbar>
|
</v-toolbar>
|
||||||
|
|
||||||
<div class="pa-0">
|
<div class="pa-0">
|
||||||
|
@ -640,6 +645,40 @@ export default {
|
||||||
} finally {
|
} finally {
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
async printReport() {
|
||||||
|
try {
|
||||||
|
this.loading = true;
|
||||||
|
const response = await axios.post('/api/plugins/ghesta/print', {
|
||||||
|
id: this.$route.params.id,
|
||||||
|
pdf: true
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.data && response.data.id) {
|
||||||
|
// دریافت فایل PDF
|
||||||
|
const pdfResponse = await axios({
|
||||||
|
method: 'get',
|
||||||
|
url: '/front/print/' + response.data.id,
|
||||||
|
responseType: 'arraybuffer'
|
||||||
|
});
|
||||||
|
|
||||||
|
// ایجاد لینک دانلود
|
||||||
|
const fileURL = window.URL.createObjectURL(new Blob([pdfResponse.data]));
|
||||||
|
const fileLink = document.createElement('a');
|
||||||
|
fileLink.href = fileURL;
|
||||||
|
fileLink.setAttribute('download', `گزارش اقساط ${this.invoice.code}.pdf`);
|
||||||
|
document.body.appendChild(fileLink);
|
||||||
|
fileLink.click();
|
||||||
|
} else {
|
||||||
|
throw new Error('خطا در دریافت شناسه چاپ');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('خطا در چاپ گزارش:', error);
|
||||||
|
this.error = 'خطا در چاپ گزارش';
|
||||||
|
this.errorDialog = true;
|
||||||
|
} finally {
|
||||||
|
this.loading = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
|
|
|
@ -10,6 +10,29 @@
|
||||||
</template>
|
</template>
|
||||||
<v-spacer />
|
<v-spacer />
|
||||||
|
|
||||||
|
<v-menu>
|
||||||
|
<template v-slot:activator="{ props }">
|
||||||
|
<v-btn v-bind="props" icon="" color="red">
|
||||||
|
<v-tooltip activator="parent" :text="$t('dialog.export_pdf')" location="bottom" />
|
||||||
|
<v-icon icon="mdi-file-pdf-box" />
|
||||||
|
</v-btn>
|
||||||
|
</template>
|
||||||
|
<v-list>
|
||||||
|
<v-list-subheader color="primary">{{ $t('dialog.export_pdf') }}</v-list-subheader>
|
||||||
|
<v-list-item :disabled="!itemsSelected.length" class="text-dark" :title="$t('dialog.selected')"
|
||||||
|
@click="pdfOutput(false)">
|
||||||
|
<template v-slot:prepend>
|
||||||
|
<v-icon color="red-darken-4" icon="mdi-check" />
|
||||||
|
</template>
|
||||||
|
</v-list-item>
|
||||||
|
<v-list-item class="text-dark" :title="$t('dialog.all')" @click="pdfOutput(true)">
|
||||||
|
<template v-slot:prepend>
|
||||||
|
<v-icon color="indigo-darken-4" icon="mdi-expand-all" />
|
||||||
|
</template>
|
||||||
|
</v-list-item>
|
||||||
|
</v-list>
|
||||||
|
</v-menu>
|
||||||
|
|
||||||
<v-menu>
|
<v-menu>
|
||||||
<template v-slot:activator="{ props }">
|
<template v-slot:activator="{ props }">
|
||||||
<v-btn v-bind="props" icon="" color="green">
|
<v-btn v-bind="props" icon="" color="green">
|
||||||
|
@ -276,7 +299,7 @@ export default {
|
||||||
var fileLink = document.createElement('a');
|
var fileLink = document.createElement('a');
|
||||||
|
|
||||||
fileLink.href = fileURL;
|
fileLink.href = fileURL;
|
||||||
fileLink.setAttribute('download', 'buysell-report-list.xlsx');
|
fileLink.setAttribute('download', `${this.selectedPerson.nikename} - گزارش خرید و فروش.xlsx`);
|
||||||
document.body.appendChild(fileLink);
|
document.body.appendChild(fileLink);
|
||||||
fileLink.click();
|
fileLink.click();
|
||||||
})
|
})
|
||||||
|
@ -301,18 +324,44 @@ export default {
|
||||||
var fileLink = document.createElement('a');
|
var fileLink = document.createElement('a');
|
||||||
|
|
||||||
fileLink.href = fileURL;
|
fileLink.href = fileURL;
|
||||||
fileLink.setAttribute('download', 'buysell-report-list.xlsx');
|
fileLink.setAttribute('download', `${this.selectedPerson.nikename} - گزارش خرید و فروش.xlsx`);
|
||||||
document.body.appendChild(fileLink);
|
document.body.appendChild(fileLink);
|
||||||
fileLink.click();
|
fileLink.click();
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
print(AllItems = true) {
|
pdfOutput(AllItems = true) {
|
||||||
if (AllItems) {
|
if (AllItems) {
|
||||||
axios.post('/api/person/list/print').then((response) => {
|
axios({
|
||||||
this.printID = response.data.id;
|
method: 'post',
|
||||||
window.open(this.$API_URL + '/front/print/' + this.printID, '_blank', 'noreferrer');
|
url: '/api/report/person/buysell/export/pdf',
|
||||||
|
data: {
|
||||||
|
items: this.items,
|
||||||
|
printOptions: {
|
||||||
|
paper: 'A4-L',
|
||||||
|
bidInfo: true,
|
||||||
|
taxInfo: true,
|
||||||
|
discountInfo: true,
|
||||||
|
pays: true,
|
||||||
|
invoiceIndex: true,
|
||||||
|
businessStamp: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).then((response) => {
|
||||||
|
axios({
|
||||||
|
method: 'get',
|
||||||
|
url: '/front/print/' + response.data.id,
|
||||||
|
responseType: 'arraybuffer'
|
||||||
|
}).then((pdfResponse) => {
|
||||||
|
var fileURL = window.URL.createObjectURL(new Blob([pdfResponse.data]));
|
||||||
|
var fileLink = document.createElement('a');
|
||||||
|
|
||||||
|
fileLink.href = fileURL;
|
||||||
|
fileLink.setAttribute('download', `${this.selectedPerson.nikename} - گزارش خرید و فروش.pdf`);
|
||||||
|
document.body.appendChild(fileLink);
|
||||||
|
fileLink.click();
|
||||||
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -324,9 +373,35 @@ export default {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
axios.post('/api/person/list/print', { items: this.itemsSelected }).then((response) => {
|
axios({
|
||||||
this.printID = response.data.id;
|
method: 'post',
|
||||||
window.open(this.$API_URL + '/front/print/' + this.printID, '_blank', 'noreferrer');
|
url: '/api/report/person/buysell/export/pdf',
|
||||||
|
data: {
|
||||||
|
items: this.itemsSelected,
|
||||||
|
printOptions: {
|
||||||
|
paper: 'A4-L',
|
||||||
|
bidInfo: true,
|
||||||
|
taxInfo: true,
|
||||||
|
discountInfo: true,
|
||||||
|
pays: true,
|
||||||
|
invoiceIndex: true,
|
||||||
|
businessStamp: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).then((response) => {
|
||||||
|
axios({
|
||||||
|
method: 'get',
|
||||||
|
url: '/front/print/' + response.data.id,
|
||||||
|
responseType: 'arraybuffer'
|
||||||
|
}).then((pdfResponse) => {
|
||||||
|
var fileURL = window.URL.createObjectURL(new Blob([pdfResponse.data]));
|
||||||
|
var fileLink = document.createElement('a');
|
||||||
|
|
||||||
|
fileLink.href = fileURL;
|
||||||
|
fileLink.setAttribute('download', `${this.selectedPerson.nikename} - گزارش خرید و فروش.pdf`);
|
||||||
|
document.body.appendChild(fileLink);
|
||||||
|
fileLink.click();
|
||||||
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
67
webUI/src/views/acc/reports/persons/withdet.vue
Normal file
67
webUI/src/views/acc/reports/persons/withdet.vue
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<template>
|
||||||
|
<v-toolbar color="toolbar" :title="$t('dialog.person_with_det_report')">
|
||||||
|
<template v-slot:prepend>
|
||||||
|
<v-tooltip :text="$t('dialog.back')" location="bottom">
|
||||||
|
<template v-slot:activator="{ props }">
|
||||||
|
<v-btn v-bind="props" @click="$router.back()" class="d-none d-sm-flex" variant="text"
|
||||||
|
icon="mdi-arrow-right" />
|
||||||
|
</template>
|
||||||
|
</v-tooltip>
|
||||||
|
</template>
|
||||||
|
</v-toolbar>
|
||||||
|
<v-container fluid>
|
||||||
|
<v-row>
|
||||||
|
<v-col cols="12" md="4">
|
||||||
|
<Hpersonsearch
|
||||||
|
v-model="selectedPerson"
|
||||||
|
label="شخص"
|
||||||
|
:rules="[v => !!v || 'انتخاب شخص الزامی است']"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
<v-col cols="12" md="4">
|
||||||
|
<Hdatepicker
|
||||||
|
v-model="startDate"
|
||||||
|
label="تاریخ شروع"
|
||||||
|
:rules="[v => !!v || 'تاریخ شروع الزامی است']"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
<v-col cols="12" md="4">
|
||||||
|
<Hdatepicker
|
||||||
|
v-model="endDate"
|
||||||
|
label="تاریخ پایان"
|
||||||
|
:rules="[v => !!v || 'تاریخ پایان الزامی است']"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
</v-container>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Hpersonsearch from '@/components/forms/Hpersonsearch.vue'
|
||||||
|
import Hdatepicker from '@/components/forms/Hdatepicker.vue'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'PersonWithDetReport',
|
||||||
|
components: {
|
||||||
|
Hpersonsearch,
|
||||||
|
Hdatepicker
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
selectedPerson: null,
|
||||||
|
startDate: '',
|
||||||
|
endDate: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
// متدهای مورد نیاز گزارش
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
// کدهای اجرایی در زمان بارگذاری کامپوننت
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/* استایلهای مورد نیاز */
|
||||||
|
</style>
|
|
@ -1,79 +1,96 @@
|
||||||
<template>
|
<template>
|
||||||
<v-toolbar flat color="grey-lighten-3" class="">
|
<v-toolbar flat color="toolbar" class="">
|
||||||
<v-toolbar-title class="primary--text">گزارشات</v-toolbar-title>
|
<v-toolbar-title class="primary--text">گزارشات</v-toolbar-title>
|
||||||
</v-toolbar>
|
</v-toolbar>
|
||||||
<v-container fluid class="">
|
<v-container fluid class="reports-container">
|
||||||
<v-row>
|
<v-row>
|
||||||
<!-- اشخاص -->
|
<!-- اشخاص -->
|
||||||
<v-col cols="12" md="6">
|
<v-col cols="12" md="6" lg="4">
|
||||||
<v-card outlined color="grey-lighten-2">
|
<v-card outlined class="report-card">
|
||||||
<v-card-subtitle class="pb-0">
|
<v-card-subtitle class="card-title">
|
||||||
<v-icon small left>mdi-account</v-icon>
|
<v-icon class="mr-2">mdi-account</v-icon>
|
||||||
اشخاص
|
اشخاص
|
||||||
</v-card-subtitle>
|
</v-card-subtitle>
|
||||||
<v-list dense color="grey-lighten-2">
|
<v-list dense class="report-list">
|
||||||
<v-list-item v-for="item in personReports" :key="item.to" :to="item.to">
|
<template v-for="item in personReports" :key="item.to">
|
||||||
<v-list-item-content>{{ item.text }}</v-list-item-content>
|
<v-list-item v-if="item && (!item.showIf || isPluginActive(item.showIf))" :to="item.to" class="list-item">
|
||||||
|
<template v-slot:default>
|
||||||
|
<v-icon small class="mr-2">mdi-chevron-left</v-icon>
|
||||||
|
{{ item.text }}
|
||||||
|
</template>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
|
</template>
|
||||||
</v-list>
|
</v-list>
|
||||||
</v-card>
|
</v-card>
|
||||||
</v-col>
|
</v-col>
|
||||||
|
|
||||||
<!-- بانکداری -->
|
<!-- بانکداری -->
|
||||||
<v-col cols="12" md="6">
|
<v-col cols="12" md="6" lg="4">
|
||||||
<v-card outlined color="grey-lighten-2">
|
<v-card outlined class="report-card">
|
||||||
<v-card-subtitle class="pb-0">
|
<v-card-subtitle class="card-title">
|
||||||
<v-icon small left>mdi-bank</v-icon>
|
<v-icon class="mr-2">mdi-bank</v-icon>
|
||||||
بانکداری
|
بانکداری
|
||||||
</v-card-subtitle>
|
</v-card-subtitle>
|
||||||
<v-list dense color="grey-lighten-2">
|
<v-list dense class="report-list">
|
||||||
<v-list-item v-for="item in bankReports" :key="item.to" :to="item.to">
|
<v-list-item v-for="item in bankReports" :key="item.to" :to="item.to" class="list-item">
|
||||||
<v-list-item-content>{{ item.text }}</v-list-item-content>
|
<template v-slot:default>
|
||||||
|
<v-icon small class="mr-2">mdi-chevron-left</v-icon>
|
||||||
|
{{ item.text }}
|
||||||
|
</template>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
</v-list>
|
</v-list>
|
||||||
</v-card>
|
</v-card>
|
||||||
</v-col>
|
</v-col>
|
||||||
|
|
||||||
<!-- گزارشات پایه -->
|
<!-- گزارشات پایه -->
|
||||||
<v-col cols="12" md="6">
|
<v-col cols="12" md="6" lg="4">
|
||||||
<v-card outlined color="grey-lighten-2">
|
<v-card outlined class="report-card">
|
||||||
<v-card-subtitle class="pb-0">
|
<v-card-subtitle class="card-title">
|
||||||
<v-icon small left>mdi-cog</v-icon>
|
<v-icon class="mr-2">mdi-cog</v-icon>
|
||||||
گزارشات پایه
|
گزارشات پایه
|
||||||
</v-card-subtitle>
|
</v-card-subtitle>
|
||||||
<v-list dense color="grey-lighten-2">
|
<v-list dense class="report-list">
|
||||||
<v-list-item to="/acc/business/logs">
|
<v-list-item to="/acc/business/logs" class="list-item">
|
||||||
<v-list-item-content>تاریخچه رویدادها</v-list-item-content>
|
<template v-slot:default>
|
||||||
|
<v-icon small class="mr-2">mdi-chevron-left</v-icon>
|
||||||
|
تاریخچه رویدادها
|
||||||
|
</template>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
</v-list>
|
</v-list>
|
||||||
</v-card>
|
</v-card>
|
||||||
</v-col>
|
</v-col>
|
||||||
|
|
||||||
<!-- کالا و خدمات -->
|
<!-- کالا و خدمات -->
|
||||||
<v-col cols="12" md="6">
|
<v-col cols="12" md="6" lg="4">
|
||||||
<v-card outlined color="grey-lighten-2">
|
<v-card outlined class="report-card">
|
||||||
<v-card-subtitle class="pb-0">
|
<v-card-subtitle class="card-title">
|
||||||
<v-icon small left>mdi-package-variant</v-icon>
|
<v-icon class="mr-2">mdi-package-variant</v-icon>
|
||||||
کالا و خدمات
|
کالا و خدمات
|
||||||
</v-card-subtitle>
|
</v-card-subtitle>
|
||||||
<v-list dense color="grey-lighten-2">
|
<v-list dense class="report-list">
|
||||||
<v-list-item to="/acc/reports/commodity/buysell">
|
<v-list-item to="/acc/reports/commodity/buysell" class="list-item">
|
||||||
<v-list-item-content>خرید و فروش به تفکیک کالا</v-list-item-content>
|
<template v-slot:default>
|
||||||
|
<v-icon small class="mr-2">mdi-chevron-left</v-icon>
|
||||||
|
خرید و فروش به تفکیک کالا
|
||||||
|
</template>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
</v-list>
|
</v-list>
|
||||||
</v-card>
|
</v-card>
|
||||||
</v-col>
|
</v-col>
|
||||||
|
|
||||||
<!-- حسابداری (conditional) -->
|
<!-- حسابداری (conditional) -->
|
||||||
<v-col v-if="isPluginActive('accpro')" cols="12" md="6">
|
<v-col v-if="isPluginActive('accpro')" cols="12" md="6" lg="4">
|
||||||
<v-card outlined color="grey-lighten-2">
|
<v-card outlined class="report-card">
|
||||||
<v-card-subtitle class="pb-0">
|
<v-card-subtitle class="card-title">
|
||||||
<v-icon small left>mdi-format-list-bulleted</v-icon>
|
<v-icon class="mr-2">mdi-format-list-bulleted</v-icon>
|
||||||
حسابداری
|
حسابداری
|
||||||
</v-card-subtitle>
|
</v-card-subtitle>
|
||||||
<v-list dense color="grey-lighten-2">
|
<v-list dense class="report-list">
|
||||||
<v-list-item v-for="item in accountingReports" :key="item.to" :to="item.to">
|
<v-list-item v-for="item in accountingReports" :key="item.to" :to="item.to" class="list-item">
|
||||||
<v-list-item-content>{{ item.text }}</v-list-item-content>
|
<template v-slot:default>
|
||||||
|
<v-icon small class="mr-2">mdi-chevron-left</v-icon>
|
||||||
|
{{ item.text }}
|
||||||
|
</template>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
</v-list>
|
</v-list>
|
||||||
</v-card>
|
</v-card>
|
||||||
|
@ -91,10 +108,11 @@ export default {
|
||||||
return {
|
return {
|
||||||
plugins: [],
|
plugins: [],
|
||||||
personReports: [
|
personReports: [
|
||||||
{ text: 'کارت حساب', to: '/acc/persons/card/view/' },
|
{ text: 'کارت حساب', to: '/acc/persons/card/view/', showIf: null },
|
||||||
{ text: 'بدهکاران', to: '/acc/reports/persons/debtors' },
|
{ text: 'بدهکاران', to: '/acc/reports/persons/debtors', showIf: null },
|
||||||
{ text: 'بستانکاران', to: '/acc/reports/persons/depositors' },
|
{ text: 'بستانکاران', to: '/acc/reports/persons/depositors', showIf: null },
|
||||||
{ text: 'خرید و فروش های اشخاص', to: '/acc/reports/persons/buysell' }
|
{ text: 'خرید و فروش های اشخاص', to: '/acc/reports/persons/buysell', showIf: null },
|
||||||
|
{ text: 'گزارش تفضیلی اشخاص', to: '/acc/reports/persons/withdet', showIf: 'accpro' }
|
||||||
],
|
],
|
||||||
bankReports: [
|
bankReports: [
|
||||||
{ text: 'گردش حساب بانک', to: '/acc/banks/card/view/' },
|
{ text: 'گردش حساب بانک', to: '/acc/banks/card/view/' },
|
||||||
|
@ -124,10 +142,81 @@ export default {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.v-card {
|
.reports-container {
|
||||||
transition: all 0.2s;
|
padding: 32px;
|
||||||
|
background: linear-gradient(135deg, #f8fafc, #f1f5f9);
|
||||||
|
min-height: calc(100vh - 64px);
|
||||||
}
|
}
|
||||||
.v-card:hover {
|
|
||||||
filter: brightness(95%);
|
.report-card {
|
||||||
|
height: 100%;
|
||||||
|
border-radius: 16px;
|
||||||
|
background-color: white;
|
||||||
|
border: 1px solid #e2e8f0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.report-card:hover {
|
||||||
|
border-color: #3b82f6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-title {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
font-weight: 600;
|
||||||
|
padding: 16px 20px;
|
||||||
|
background: linear-gradient(135deg, #f8fafc, #f1f5f9);
|
||||||
|
color: #334155;
|
||||||
|
border-radius: 16px 16px 0 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
border-bottom: 1px solid #e2e8f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-title::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
width: 3px;
|
||||||
|
height: 100%;
|
||||||
|
background: linear-gradient(to bottom, #2563eb, #3b82f6);
|
||||||
|
border-radius: 0 16px 16px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-title .v-icon {
|
||||||
|
color: #2563eb;
|
||||||
|
margin-left: 12px;
|
||||||
|
background-color: #eff6ff;
|
||||||
|
padding: 8px;
|
||||||
|
border-radius: 10px;
|
||||||
|
box-shadow: 0 2px 4px rgba(37, 99, 235, 0.1);
|
||||||
|
font-size: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.report-card:hover .card-title .v-icon {
|
||||||
|
background-color: #dbeafe;
|
||||||
|
box-shadow: 0 4px 6px rgba(37, 99, 235, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
.report-list {
|
||||||
|
padding: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-item {
|
||||||
|
margin: 4px 8px;
|
||||||
|
border-radius: 10px;
|
||||||
|
color: #475569;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-item:hover {
|
||||||
|
background: linear-gradient(135deg, #eff6ff, #f0f7ff);
|
||||||
|
color: #2563eb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v-icon {
|
||||||
|
color: #2563eb;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
|
@ -570,11 +570,43 @@ export default defineComponent({
|
||||||
'pdf': pdf,
|
'pdf': pdf,
|
||||||
'printers': cloudePrinters,
|
'printers': cloudePrinters,
|
||||||
'printOptions': this.printOptions
|
'printOptions': this.printOptions
|
||||||
}).then((response) => {
|
}).then(async (response) => {
|
||||||
|
try {
|
||||||
|
if (response.data && response.data.id) {
|
||||||
|
// دریافت فایل PDF
|
||||||
|
const pdfResponse = await axios({
|
||||||
|
method: 'get',
|
||||||
|
url: '/front/print/' + response.data.id,
|
||||||
|
responseType: 'arraybuffer'
|
||||||
|
});
|
||||||
|
|
||||||
|
// ایجاد لینک دانلود
|
||||||
|
var fileURL = window.URL.createObjectURL(new Blob([pdfResponse.data]));
|
||||||
|
var fileLink = document.createElement('a');
|
||||||
|
fileLink.href = fileURL;
|
||||||
|
fileLink.setAttribute('download', `فاکتور فروش ${this.printOptions.selectedPrintCode}.pdf`);
|
||||||
|
document.body.appendChild(fileLink);
|
||||||
|
fileLink.click();
|
||||||
|
} else {
|
||||||
|
throw new Error('خطا در دریافت شناسه چاپ');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('خطا در دریافت فایل PDF:', error);
|
||||||
|
Swal.fire({
|
||||||
|
text: 'خطا در دریافت فایل PDF',
|
||||||
|
icon: 'error',
|
||||||
|
confirmButtonText: 'قبول'
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
window.open(this.$API_URL + '/front/print/' + response.data.id, '_blank', 'noreferrer');
|
}
|
||||||
}).catch(() => {
|
}).catch((error) => {
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
|
Swal.fire({
|
||||||
|
text: 'خطا در ایجاد نسخه PDF',
|
||||||
|
icon: 'error',
|
||||||
|
confirmButtonText: 'قبول'
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
deleteItem(code) {
|
deleteItem(code) {
|
||||||
|
|
|
@ -1019,8 +1019,20 @@ export default {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (printResponse.data && printResponse.data.id) {
|
if (printResponse.data && printResponse.data.id) {
|
||||||
// باز کردن PDF در پنجره جدید
|
// دریافت فایل PDF
|
||||||
window.open(this.$API_URL + '/front/print/' + printResponse.data.id, '_blank', 'noreferrer');
|
const pdfResponse = await axios({
|
||||||
|
method: 'get',
|
||||||
|
url: '/front/print/' + printResponse.data.id,
|
||||||
|
responseType: 'arraybuffer'
|
||||||
|
});
|
||||||
|
|
||||||
|
// ایجاد لینک دانلود
|
||||||
|
var fileURL = window.URL.createObjectURL(new Blob([pdfResponse.data]));
|
||||||
|
var fileLink = document.createElement('a');
|
||||||
|
fileLink.href = fileURL;
|
||||||
|
fileLink.setAttribute('download', `فاکتور فروش ${response.data.data.code}.pdf`);
|
||||||
|
document.body.appendChild(fileLink);
|
||||||
|
fileLink.click();
|
||||||
} else {
|
} else {
|
||||||
throw new Error('خطا در دریافت شناسه چاپ');
|
throw new Error('خطا در دریافت شناسه چاپ');
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<v-container fluid class="pa-0">
|
<v-container fluid class="pa-0">
|
||||||
<v-card>
|
<v-card>
|
||||||
<v-toolbar
|
<v-toolbar color="grey-lighten-4" flat title="سرویس پیامک و افزایش اعتبار" class="text-primary-dark">
|
||||||
color="grey-lighten-4"
|
|
||||||
flat
|
|
||||||
title="سرویس پیامک و افزایش اعتبار"
|
|
||||||
class="text-primary-dark"
|
|
||||||
>
|
|
||||||
<template v-slot:prepend>
|
<template v-slot:prepend>
|
||||||
<v-tooltip :text="$t('dialog.back')" location="bottom">
|
<v-tooltip :text="$t('dialog.back')" location="bottom">
|
||||||
<template v-slot:activator="{ props }">
|
<template v-slot:activator="{ props }">
|
||||||
|
@ -17,6 +12,15 @@
|
||||||
</template>
|
</template>
|
||||||
</v-toolbar>
|
</v-toolbar>
|
||||||
|
|
||||||
|
<v-snackbar v-model="snackbar.show" :color="snackbar.color" :timeout="3000">
|
||||||
|
{{ snackbar.text }}
|
||||||
|
<template v-slot:actions>
|
||||||
|
<v-btn variant="text" @click="snackbar.show = false">
|
||||||
|
بستن
|
||||||
|
</v-btn>
|
||||||
|
</template>
|
||||||
|
</v-snackbar>
|
||||||
|
|
||||||
<v-tabs v-model="activeTab" bg-color="primary" align-tabs="center" grow>
|
<v-tabs v-model="activeTab" bg-color="primary" align-tabs="center" grow>
|
||||||
<v-tab value="home">
|
<v-tab value="home">
|
||||||
<v-icon start>mdi-plus-circle</v-icon>
|
<v-icon start>mdi-plus-circle</v-icon>
|
||||||
|
@ -40,27 +44,78 @@
|
||||||
<v-window-item value="home" class="pa-4">
|
<v-window-item value="home" class="pa-4">
|
||||||
<v-row>
|
<v-row>
|
||||||
<v-col cols="12">
|
<v-col cols="12">
|
||||||
<h4 class="mb-3">مبلغ اعتبار</h4>
|
<v-alert type="info" variant="tonal" class="mb-4" border="start" color="primary">
|
||||||
<v-alert type="info" variant="tonal" class="mb-4">
|
<template v-slot:prepend>
|
||||||
به مبالغ زیر ۱۰ درصد مالیات بر ارزش افزوده اضافه میگردد.
|
<v-icon icon="mdi-information-outline" color="primary" size="24"></v-icon>
|
||||||
|
</template>
|
||||||
|
<div class="text-body-1">
|
||||||
|
<div class="d-flex align-center mb-2">
|
||||||
|
<v-icon icon="mdi-currency-usd" size="18" color="primary" class="ml-1"></v-icon>
|
||||||
|
<span class="font-weight-medium">اطلاعات مالی:</span>
|
||||||
|
</div>
|
||||||
|
<ul class="mb-0 ps-4">
|
||||||
|
<li class="mb-2">به مبالغ انتخاب شده ۱۰ درصد مالیات بر ارزش افزوده اضافه میگردد.</li>
|
||||||
|
<li class="mb-2">اعتبار خریداری شده بلافاصله به حساب شما اضافه خواهد شد.</li>
|
||||||
|
<li>این اعتبار صرفاً برای استفاده از سرویس پیامک کوتاه قابل استفاده است و برای سایر خدمات قابل استفاده نمیباشد.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</v-alert>
|
</v-alert>
|
||||||
<v-radio-group v-model="smsCharge" inline>
|
|
||||||
<v-radio label="100,000 ریال" value="100000"></v-radio>
|
<v-row>
|
||||||
<v-radio label="500,000 ریال" value="500000"></v-radio>
|
<v-col cols="12" sm="6" md="3" v-for="(amount, index) in chargeAmounts" :key="index">
|
||||||
<v-radio label="1,000,000 ریال" value="1000000"></v-radio>
|
<v-card :class="['charge-card', { 'selected': smsCharge === amount.value }]"
|
||||||
<v-radio label="2,000,000 ریال" value="2000000"></v-radio>
|
@click="smsCharge = amount.value" :elevation="smsCharge === amount.value ? 4 : 1" class="h-100"
|
||||||
</v-radio-group>
|
:color="smsCharge === amount.value ? 'primary' : 'surface'" variant="elevated">
|
||||||
|
<v-card-text class="text-center">
|
||||||
|
<div class="text-h6 mb-2" :class="{ 'text-white': smsCharge === amount.value }">{{ amount.label }}
|
||||||
|
</div>
|
||||||
|
<div class="text-subtitle-1"
|
||||||
|
:class="{ 'text-white': smsCharge === amount.value, 'text-medium-emphasis': smsCharge !== amount.value }">
|
||||||
|
{{ formatPrice(amount.value) }} تومان
|
||||||
|
</div>
|
||||||
|
<div class="text-caption mt-2"
|
||||||
|
:class="{ 'text-white': smsCharge === amount.value, 'text-medium-emphasis': smsCharge !== amount.value }">
|
||||||
|
با احتساب مالیات: {{ formatPrice(amount.value * 1.1) }} تومان
|
||||||
|
</div>
|
||||||
|
</v-card-text>
|
||||||
|
</v-card>
|
||||||
|
</v-col>
|
||||||
|
<v-col cols="12" sm="6" md="3">
|
||||||
|
<v-card :class="['charge-card', { 'selected': isCustomAmount }]"
|
||||||
|
:elevation="isCustomAmount ? 4 : 1" class="h-100"
|
||||||
|
:color="isCustomAmount ? 'primary' : 'surface'" variant="elevated">
|
||||||
|
<v-card-text class="text-center">
|
||||||
|
<div class="text-h6 mb-2" :class="{ 'text-white': isCustomAmount }">مبلغ دلخواه</div>
|
||||||
|
<v-text-field
|
||||||
|
v-model="customAmount"
|
||||||
|
type="number"
|
||||||
|
density="compact"
|
||||||
|
variant="outlined"
|
||||||
|
hide-details
|
||||||
|
class="mt-2"
|
||||||
|
:class="{ 'custom-amount-input': isCustomAmount }"
|
||||||
|
placeholder="مبلغ را وارد کنید"
|
||||||
|
@click="selectCustomAmount"
|
||||||
|
@input="handleCustomAmountInput"
|
||||||
|
></v-text-field>
|
||||||
|
<div v-if="customAmount" class="text-caption mt-2"
|
||||||
|
:class="{ 'text-white': isCustomAmount, 'text-medium-emphasis': !isCustomAmount }">
|
||||||
|
با احتساب مالیات: {{ formatPrice(Number(customAmount) * 1.1) }} تومان
|
||||||
|
</div>
|
||||||
|
</v-card-text>
|
||||||
|
</v-card>
|
||||||
</v-col>
|
</v-col>
|
||||||
</v-row>
|
</v-row>
|
||||||
<v-btn
|
</v-col>
|
||||||
color="primary"
|
</v-row>
|
||||||
:loading="loading"
|
<v-row class="mt-6">
|
||||||
class="mt-4"
|
<v-col cols="12" class="text-center">
|
||||||
@click="pay"
|
<v-btn color="primary" :loading="loading" size="large" :disabled="!smsCharge" @click="pay" class="px-8">
|
||||||
>
|
|
||||||
<v-icon start>mdi-credit-card-outline</v-icon>
|
<v-icon start>mdi-credit-card-outline</v-icon>
|
||||||
پرداخت آنلاین
|
پرداخت آنلاین
|
||||||
</v-btn>
|
</v-btn>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
</v-window-item>
|
</v-window-item>
|
||||||
|
|
||||||
<v-window-item value="profile" class="pa-4">
|
<v-window-item value="profile" class="pa-4">
|
||||||
|
@ -69,55 +124,29 @@
|
||||||
در نظر داشته باشید در صورت اتمام اعتبار سرویس پیامک کسب و کار شما، این تنظیمات نادیده گرفته میشود.
|
در نظر داشته باشید در صورت اتمام اعتبار سرویس پیامک کسب و کار شما، این تنظیمات نادیده گرفته میشود.
|
||||||
<ul>
|
<ul>
|
||||||
<li>پیامکهای ارسالی به شماره ثبت شده در بخش اشخاص (تلفن همراه) ارسال میشود.</li>
|
<li>پیامکهای ارسالی به شماره ثبت شده در بخش اشخاص (تلفن همراه) ارسال میشود.</li>
|
||||||
<li>در صورت ثبت نکردن شماره تلفن در بخش اشخاص پیامک ارسال نمی شود و هزینه ای نیز از حساب شما کسر نخواهد شد.</li>
|
<li>در صورت ثبت نکردن شماره تلفن در بخش اشخاص پیامک ارسال نمی شود و هزینه ای نیز از حساب شما کسر نخواهد
|
||||||
|
شد.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</v-alert>
|
</v-alert>
|
||||||
<v-col cols="12" md="6">
|
<v-col cols="12" md="6">
|
||||||
<v-checkbox
|
<v-checkbox v-model="settings.sendAfterSell" @change="saveSettings(settings)"
|
||||||
v-model="settings.sendAfterSell"
|
label="ارسال پیامک به مشتری بعد از صدور فاکتور فروش"></v-checkbox>
|
||||||
@change="saveSettings(settings)"
|
<v-checkbox v-model="settings.sendAfterSellPayOnline" @change="saveSettings(settings)"
|
||||||
label="ارسال پیامک به مشتری بعد از صدور فاکتور فروش"
|
label="ارسال پیامک به مشتری جهت پرداخت آنلاین فاکتور فروش" disabled></v-checkbox>
|
||||||
></v-checkbox>
|
|
||||||
<v-checkbox
|
|
||||||
v-model="settings.sendAfterSellPayOnline"
|
|
||||||
@change="saveSettings(settings)"
|
|
||||||
label="ارسال پیامک به مشتری جهت پرداخت آنلاین فاکتور فروش"
|
|
||||||
disabled
|
|
||||||
></v-checkbox>
|
|
||||||
<v-divider class="my-2"></v-divider>
|
<v-divider class="my-2"></v-divider>
|
||||||
<v-checkbox
|
<v-checkbox v-model="settings.sendAfterBuy" @change="saveSettings(settings)"
|
||||||
v-model="settings.sendAfterBuy"
|
label="ارسال پیامک به تامین کننده بعد از صدور فاکتور خرید" disabled></v-checkbox>
|
||||||
@change="saveSettings(settings)"
|
<v-checkbox v-model="settings.sendAfterBuyToUser" @change="saveSettings(settings)"
|
||||||
label="ارسال پیامک به تامین کننده بعد از صدور فاکتور خرید"
|
label="ارسال پیامک به تامین کننده بعد از ثبت پرداخت فاکتور خرید" disabled></v-checkbox>
|
||||||
disabled
|
|
||||||
></v-checkbox>
|
|
||||||
<v-checkbox
|
|
||||||
v-model="settings.sendAfterBuyToUser"
|
|
||||||
@change="saveSettings(settings)"
|
|
||||||
label="ارسال پیامک به تامین کننده بعد از ثبت پرداخت فاکتور خرید"
|
|
||||||
disabled
|
|
||||||
></v-checkbox>
|
|
||||||
</v-col>
|
</v-col>
|
||||||
</v-window-item>
|
</v-window-item>
|
||||||
|
|
||||||
<v-window-item value="pays" class="pa-4">
|
<v-window-item value="pays" class="pa-4">
|
||||||
<v-text-field
|
<v-text-field v-model="payssearchValue" prepend-inner-icon="mdi-magnify" placeholder="جست و جو ..."
|
||||||
v-model="payssearchValue"
|
variant="outlined" class="mb-4" density="compact"></v-text-field>
|
||||||
prepend-inner-icon="mdi-magnify"
|
<v-data-table :headers="paysheaders" :items="paysitems" :search="payssearchValue" :loading="loading"
|
||||||
placeholder="جست و جو ..."
|
:header-props="{ class: 'custom-header' }" loading-text="در حال بارگذاری..."
|
||||||
variant="outlined"
|
no-data-text="اطلاعاتی برای نمایش وجود ندارد">
|
||||||
class="mb-4"
|
|
||||||
density="compact"
|
|
||||||
></v-text-field>
|
|
||||||
<v-data-table
|
|
||||||
:headers="paysheaders"
|
|
||||||
:items="paysitems"
|
|
||||||
:search="payssearchValue"
|
|
||||||
:loading="loading"
|
|
||||||
:header-props="{ class: 'custom-header' }"
|
|
||||||
loading-text="در حال بارگذاری..."
|
|
||||||
no-data-text="اطلاعاتی برای نمایش وجود ندارد"
|
|
||||||
>
|
|
||||||
<template v-slot:item.status="{ item }">
|
<template v-slot:item.status="{ item }">
|
||||||
<span :class="item.status === 0 ? 'text-danger' : 'text-success'">
|
<span :class="item.status === 0 ? 'text-danger' : 'text-success'">
|
||||||
{{ item.status === 0 ? 'پرداخت نشده' : 'پرداخت شده' }}
|
{{ item.status === 0 ? 'پرداخت نشده' : 'پرداخت شده' }}
|
||||||
|
@ -127,23 +156,11 @@
|
||||||
</v-window-item>
|
</v-window-item>
|
||||||
|
|
||||||
<v-window-item value="contact" class="pa-4">
|
<v-window-item value="contact" class="pa-4">
|
||||||
<v-text-field
|
<v-text-field v-model="searchValue" prepend-inner-icon="mdi-magnify" placeholder="جست و جو ..."
|
||||||
v-model="searchValue"
|
variant="outlined" class="mb-4" density="compact"></v-text-field>
|
||||||
prepend-inner-icon="mdi-magnify"
|
<v-data-table :headers="headers" :items="items" :header-props="{ class: 'custom-header' }"
|
||||||
placeholder="جست و جو ..."
|
:search="searchValue" :loading="loading" loading-text="در حال بارگذاری..."
|
||||||
variant="outlined"
|
no-data-text="اطلاعاتی برای نمایش وجود ندارد"></v-data-table>
|
||||||
class="mb-4"
|
|
||||||
density="compact"
|
|
||||||
></v-text-field>
|
|
||||||
<v-data-table
|
|
||||||
:headers="headers"
|
|
||||||
:items="items"
|
|
||||||
:header-props="{ class: 'custom-header' }"
|
|
||||||
:search="searchValue"
|
|
||||||
:loading="loading"
|
|
||||||
loading-text="در حال بارگذاری..."
|
|
||||||
no-data-text="اطلاعاتی برای نمایش وجود ندارد"
|
|
||||||
></v-data-table>
|
|
||||||
</v-window-item>
|
</v-window-item>
|
||||||
</v-window>
|
</v-window>
|
||||||
</v-card>
|
</v-card>
|
||||||
|
@ -164,7 +181,20 @@ export default defineComponent({
|
||||||
sendAfterBuy: false,
|
sendAfterBuy: false,
|
||||||
sendAfterBuyToUser: false,
|
sendAfterBuyToUser: false,
|
||||||
},
|
},
|
||||||
|
snackbar: {
|
||||||
|
show: false,
|
||||||
|
text: '',
|
||||||
|
color: 'error'
|
||||||
|
},
|
||||||
smsCharge: 100000,
|
smsCharge: 100000,
|
||||||
|
customAmount: '',
|
||||||
|
isCustomAmount: false,
|
||||||
|
chargeAmounts: [
|
||||||
|
{ label: '۱۰ هزار تومان', value: 10000 },
|
||||||
|
{ label: '۵۰ هزار تومان', value: 50000 },
|
||||||
|
{ label: '۱۰۰ هزار تومان', value: 100000 },
|
||||||
|
{ label: '۲۰۰ هزار تومان', value: 200000 }
|
||||||
|
],
|
||||||
searchValue: '',
|
searchValue: '',
|
||||||
loading: true,
|
loading: true,
|
||||||
items: [],
|
items: [],
|
||||||
|
@ -177,7 +207,7 @@ export default defineComponent({
|
||||||
paysitems: [] as Array<{ dateSubmit: string; price: number; des: string; status: number }>,
|
paysitems: [] as Array<{ dateSubmit: string; price: number; des: string; status: number }>,
|
||||||
paysheaders: [
|
paysheaders: [
|
||||||
{ title: "تاریخ", key: "dateSubmit" },
|
{ title: "تاریخ", key: "dateSubmit" },
|
||||||
{ title: "مبلغ (ریال)", key: "price" },
|
{ title: "مبلغ (تومان)", key: "price" },
|
||||||
{ title: "توضیحات", key: "des" },
|
{ title: "توضیحات", key: "des" },
|
||||||
{ title: "وضعیت", key: "status" },
|
{ title: "وضعیت", key: "status" },
|
||||||
]
|
]
|
||||||
|
@ -205,8 +235,21 @@ export default defineComponent({
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
if (response.data.Success === true) {
|
if (response.data.Success === true) {
|
||||||
window.location.href = response.data.targetURL;
|
window.location.href = response.data.targetURL;
|
||||||
|
} else {
|
||||||
|
this.snackbar.text = response.data.message || 'خطا در ایجاد درخواست پرداخت';
|
||||||
|
this.snackbar.color = 'error';
|
||||||
|
this.snackbar.show = true;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
this.snackbar.text = 'خطا در ارتباط با سرور';
|
||||||
|
this.snackbar.color = 'error';
|
||||||
|
this.snackbar.show = true;
|
||||||
|
console.error('Error:', error);
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
this.loading = false;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
saveSettings(settings: { sendAfterSell: boolean; sendAfterSellPayOnline: boolean; sendAfterBuy: boolean; sendAfterBuyToUser: boolean; }) {
|
saveSettings(settings: { sendAfterSell: boolean; sendAfterSellPayOnline: boolean; sendAfterBuy: boolean; sendAfterBuyToUser: boolean; }) {
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
|
@ -214,8 +257,20 @@ export default defineComponent({
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
formatPrice(price: number): string {
|
||||||
|
return new Intl.NumberFormat('fa-IR').format(price);
|
||||||
|
},
|
||||||
|
selectCustomAmount() {
|
||||||
|
this.isCustomAmount = true;
|
||||||
|
this.smsCharge = Number(this.customAmount);
|
||||||
|
},
|
||||||
|
handleCustomAmountInput() {
|
||||||
|
if (this.isCustomAmount) {
|
||||||
|
this.smsCharge = Number(this.customAmount);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
},
|
||||||
beforeMount() {
|
beforeMount() {
|
||||||
this.loadData();
|
this.loadData();
|
||||||
}
|
}
|
||||||
|
@ -223,5 +278,106 @@ export default defineComponent({
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
/* استایلهای دلخواهت رو اینجا بذار */
|
.charge-card {
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
border: 2px solid transparent;
|
||||||
|
background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);
|
||||||
|
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.charge-card:hover {
|
||||||
|
transform: translateY(-4px);
|
||||||
|
box-shadow: 0 8px 25px 0 rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.charge-card.selected {
|
||||||
|
border-color: transparent;
|
||||||
|
background: linear-gradient(135deg, #2196F3 0%, #1976D2 100%);
|
||||||
|
color: white;
|
||||||
|
box-shadow: 0 8px 25px 0 rgba(33, 150, 243, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.charge-card .v-card-text {
|
||||||
|
padding: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.charge-card:not(.selected):hover {
|
||||||
|
border-color: #2196F3;
|
||||||
|
background: linear-gradient(135deg, #ffffff 0%, #E3F2FD 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* اضافه کردن انیمیشن برای تغییر رنگ */
|
||||||
|
.charge-card {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.charge-card::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: linear-gradient(135deg, rgba(33, 150, 243, 0.1) 0%, rgba(25, 118, 210, 0.1) 100%);
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 0.3s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.charge-card:hover::after {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.charge-card.selected::after {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-card {
|
||||||
|
background: linear-gradient(135deg, #ffffff 0%, #f8f9fa 100%);
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-card .v-card-text {
|
||||||
|
background: #ffffff;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v-alert {
|
||||||
|
background-color: rgba(var(--v-theme-primary), 0.05) !important;
|
||||||
|
border-left: 4px solid rgb(var(--v-theme-primary)) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v-alert ul {
|
||||||
|
list-style-type: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v-alert ul li {
|
||||||
|
position: relative;
|
||||||
|
padding-right: 1.5rem;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.v-alert ul li::before {
|
||||||
|
content: "•";
|
||||||
|
color: rgb(var(--v-theme-primary));
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-amount-input :deep(.v-field__input) {
|
||||||
|
color: white !important;
|
||||||
|
caret-color: white !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-amount-input :deep(.v-field__input::placeholder) {
|
||||||
|
color: rgba(255, 255, 255, 0.7) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-amount-input :deep(.v-field__outline) {
|
||||||
|
border-color: rgba(255, 255, 255, 0.7) !important;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
|
@ -18,6 +18,11 @@ export default defineComponent({
|
||||||
value: 'pec',
|
value: 'pec',
|
||||||
props: { subtitle: 'pec.ir' },
|
props: { subtitle: 'pec.ir' },
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: 'پیپینگ',
|
||||||
|
value: 'payping',
|
||||||
|
props: { subtitle: 'payping.ir' },
|
||||||
|
},
|
||||||
],
|
],
|
||||||
systemInfo: {
|
systemInfo: {
|
||||||
keywords: '',
|
keywords: '',
|
||||||
|
@ -26,6 +31,7 @@ export default defineComponent({
|
||||||
appSite: '',
|
appSite: '',
|
||||||
activeGateway:'zarinpal',
|
activeGateway:'zarinpal',
|
||||||
parsianGatewayAPI: '',
|
parsianGatewayAPI: '',
|
||||||
|
paypingKey: '',
|
||||||
},
|
},
|
||||||
loading: true,
|
loading: true,
|
||||||
}
|
}
|
||||||
|
@ -86,6 +92,10 @@ export default defineComponent({
|
||||||
<v-text-field class="" hide-details="auto" :label="$t('pages.manager.parsian_api')"
|
<v-text-field class="" hide-details="auto" :label="$t('pages.manager.parsian_api')"
|
||||||
v-model="systemInfo.parsianGatewayAPI" type="text" prepend-inner-icon="mdi-text"></v-text-field>
|
v-model="systemInfo.parsianGatewayAPI" type="text" prepend-inner-icon="mdi-text"></v-text-field>
|
||||||
</v-col>
|
</v-col>
|
||||||
|
<v-col cols="12" sm="12" md="4">
|
||||||
|
<v-text-field class="" hide-details="auto" :label="$t('pages.manager.payping_api')"
|
||||||
|
v-model="systemInfo.paypingKey" type="text" prepend-inner-icon="mdi-text"></v-text-field>
|
||||||
|
</v-col>
|
||||||
<v-col cols="12" sm="12" md="12">
|
<v-col cols="12" sm="12" md="12">
|
||||||
<v-btn type="submit" @click="submit()" color="primary" prepend-icon="mdi-content-save" :loading="loading">
|
<v-btn type="submit" @click="submit()" color="primary" prepend-icon="mdi-content-save" :loading="loading">
|
||||||
{{ $t('dialog.save') }}
|
{{ $t('dialog.save') }}
|
||||||
|
|
Loading…
Reference in a new issue