diff --git a/hesabixCore/src/Controller/AdminController.php b/hesabixCore/src/Controller/AdminController.php index ffef7b9..705f21b 100644 --- a/hesabixCore/src/Controller/AdminController.php +++ b/hesabixCore/src/Controller/AdminController.php @@ -449,6 +449,7 @@ class AdminController extends AbstractController $resp['activeGateway'] = $registryMGR->get('system', key: 'activeGateway'); $resp['parsianGatewayAPI'] = $registryMGR->get('system', key: 'parsianGatewayAPI'); $resp['paypingKey'] = $registryMGR->get('system', key: 'paypingKey'); + $resp['bitpayKey'] = $registryMGR->get('system', key: 'bitpayKey'); return $this->json($resp); } @@ -472,6 +473,7 @@ class AdminController extends AbstractController $registryMGR->update('system', 'activeGateway', $params['activeGateway']); $registryMGR->update('system', 'parsianGatewayAPI', $params['parsianGatewayAPI']); $registryMGR->update('system', 'paypingKey', $params['paypingKey']); + $registryMGR->update('system', 'bitpayKey', $params['bitpayKey']); $entityManager->persist($item); $entityManager->flush(); return $this->json(['result' => 1]); diff --git a/hesabixCore/src/Controller/PersonsController.php b/hesabixCore/src/Controller/PersonsController.php index ccacc90..98eba9d 100644 --- a/hesabixCore/src/Controller/PersonsController.php +++ b/hesabixCore/src/Controller/PersonsController.php @@ -665,9 +665,21 @@ class PersonsController extends AbstractController if (!$acc) throw $this->createAccessDeniedException(); + $data = json_decode($request->getContent(), true); + $selectedItems = $data['items'] ?? []; + + // اگر آیتم‌های انتخاب شده وجود دارند، فقط آنها را دریافت کن + if (!empty($selectedItems)) { + $persons = $entityManager->getRepository(Person::class)->findBy([ + 'bid' => $acc['bid'], + 'code' => $selectedItems + ]); + } else { $persons = $entityManager->getRepository(Person::class)->findBy([ 'bid' => $acc['bid'] ]); + } + $response = $provider->ArrayEntity2Array($persons, 0); foreach ($persons as $key => $person) { $rows = $entityManager->getRepository(HesabdariRow::class)->findBy([ @@ -690,6 +702,7 @@ class PersonsController extends AbstractController array_push($result, $person); } } + $pid = $provider->createPrint( $acc['bid'], $this->getUser(), @@ -699,6 +712,7 @@ class PersonsController extends AbstractController 'persons' => $result ]) ); + return $this->json(['id' => $pid]); } @@ -1769,4 +1783,149 @@ class PersonsController extends AbstractController ] ]); } + + #[Route('/api/person/list/debtors/excel/{id}', name: 'app_persons_debtors_list_excel', methods: ['POST'])] + public function app_persons_debtors_list_excel(Request $request, $id, Access $access, EntityManagerInterface $entityManager): Response + { + try { + $acc = $access->hasRole('person'); + if (!$acc) + throw $this->createAccessDeniedException(); + + $data = json_decode($request->getContent(), true); + $selectedItems = $data['items'] ?? []; + + // اگر آیتم‌های انتخاب شده وجود دارند، فقط آنها را دریافت کن + if (!empty($selectedItems)) { + $persons = $entityManager->getRepository(Person::class)->findBy([ + 'bid' => $acc['bid'], + 'code' => $selectedItems + ]); + } else { + $persons = $entityManager->getRepository(Person::class)->findBy([ + 'bid' => $acc['bid'] + ]); + } + + $response = []; + foreach ($persons as $key => $person) { + $rows = $entityManager->getRepository(HesabdariRow::class)->findBy([ + 'person' => $person, + 'bid' => $acc['bid'] + ]); + $bs = 0; + $bd = 0; + foreach ($rows as $row) { + $bs += $row->getBs(); + $bd += $row->getBd(); + } + $response[$key] = [ + 'code' => $person->getCode(), + 'nikename' => $person->getNikename(), + 'name' => $person->getName(), + 'birthday' => $person->getBirthday(), + 'company' => $person->getCompany(), + 'shenasemeli' => $person->getShenasemeli(), + 'codeeghtesadi' => $person->getCodeeghtesadi(), + 'sabt' => $person->getSabt(), + 'keshvar' => $person->getKeshvar(), + 'ostan' => $person->getOstan(), + 'shahr' => $person->getShahr(), + 'postalcode' => $person->getPostalcode(), + 'tel' => $person->getTel(), + 'mobile' => $person->getMobile(), + 'email' => $person->getEmail(), + 'website' => $person->getWebsite(), + 'fax' => $person->getFax(), + 'bs' => $bs, + 'bd' => $bd, + 'balance' => $bs - $bd + ]; + } + + // ایجاد فایل اکسل + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + // تنظیم راست به چپ + $sheet->setRightToLeft(true); + + // تنظیم هدرها + $headers = [ + 'A1' => 'کد', + 'B1' => 'نام مستعار', + 'C1' => 'وضعیت حساب', + 'D1' => 'تراز حساب', + 'E1' => 'نام و نام خانوادگی', + 'F1' => 'تاریخ تولد/ثبت', + 'G1' => 'شرکت', + 'H1' => 'شناسه ملی', + 'I1' => 'کد اقتصادی', + 'J1' => 'شماره ثبت', + 'K1' => 'کشور', + 'L1' => 'استان', + 'M1' => 'شهر', + 'N1' => 'کد پستی', + 'O1' => 'تلفن', + 'P1' => 'تلفن همراه', + 'Q1' => 'ایمیل', + 'R1' => 'وب سایت', + 'S1' => 'فکس' + ]; + + // اعمال هدرها + foreach ($headers as $cell => $value) { + $sheet->setCellValue($cell, $value); + } + + // اضافه کردن داده‌ها + $row = 2; + foreach ($response as $item) { + $sheet->setCellValue('A' . $row, $item['code']); + $sheet->setCellValue('B' . $row, $item['nikename']); + $sheet->setCellValue('C' . $row, $item['balance'] < 0 ? 'بدهکار' : 'بستانکار'); + $sheet->setCellValue('D' . $row, $item['balance']); + $sheet->setCellValue('E' . $row, $item['name']); + $sheet->setCellValue('F' . $row, $item['birthday']); + $sheet->setCellValue('G' . $row, $item['company']); + $sheet->setCellValue('H' . $row, $item['shenasemeli']); + $sheet->setCellValue('I' . $row, $item['codeeghtesadi']); + $sheet->setCellValue('J' . $row, $item['sabt']); + $sheet->setCellValue('K' . $row, $item['keshvar']); + $sheet->setCellValue('L' . $row, $item['ostan']); + $sheet->setCellValue('M' . $row, $item['shahr']); + $sheet->setCellValue('N' . $row, $item['postalcode']); + $sheet->setCellValue('O' . $row, $item['tel']); + $sheet->setCellValue('P' . $row, $item['mobile']); + $sheet->setCellValue('Q' . $row, $item['email']); + $sheet->setCellValue('R' . $row, $item['website']); + $sheet->setCellValue('S' . $row, $item['fax']); + $row++; + } + + // تنظیم عرض ستون‌ها + foreach (range('A', 'S') as $col) { + $sheet->getColumnDimension($col)->setAutoSize(true); + } + + // ایجاد فایل اکسل + $writer = new Xlsx($spreadsheet); + $fileName = 'گزارش_بدهکاران_' . date('Y-m-d') . '.xlsx'; + + // تنظیم هدرهای پاسخ + $response = new Response(); + $response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + $response->headers->set('Content-Disposition', 'attachment;filename="' . $fileName . '"'); + $response->headers->set('Cache-Control', 'max-age=0'); + + // ذخیره فایل در حافظه + ob_start(); + $writer->save('php://output'); + $response->setContent(ob_get_clean()); + + return $response; + } catch (\Exception $e) { + return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_INTERNAL_SERVER_ERROR); + } + } } diff --git a/hesabixCore/src/Service/PayMGR.php b/hesabixCore/src/Service/PayMGR.php index a0acacc..072d7ec 100644 --- a/hesabixCore/src/Service/PayMGR.php +++ b/hesabixCore/src/Service/PayMGR.php @@ -159,6 +159,30 @@ class PayMGR } catch (\Exception $ex) { } + } elseif ($activeGateway == 'bitpay') { + $url = 'https://bitpay.ir/payment/gateway-send'; + $api = $this->registry->get('system', 'bitpayKey'); + $amount = $price; + $redirect = $callback_url; + $factorId = $orderID; + $name = ''; + $email = ''; + $description = $des; + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POSTFIELDS, "api=$api&amount=$amount&redirect=$redirect&factorId=$factorId&name=$name&email=$email&description=$description"); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $result = curl_exec($ch); + curl_close($ch); + if ($result > 0 && is_numeric($result)) { + $res['code'] = 100; + $res['Success'] = true; + $res['gate'] = 'bitpay'; + $res['message'] = 'OK'; + $res['authkey'] = $result; + $res['targetURL'] = "https://bitpay.ir/payment/gateway-$result-get"; + } } return $res; } @@ -267,6 +291,27 @@ class PayMGR $res['refID'] = $result->ConfirmPaymentResult->RRN; $res['card_pan'] = $result->ConfirmPaymentResult->CardNumberMasked; } + } elseif ($activeGateway == 'bitpay') { + $url = 'https://bitpay.ir/payment/gateway-result-second'; + $api = $this->registry->get('system', 'bitpayKey'); + $trans_id = $request->get('trans_id'); + $id_get = $request->get('id_get'); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POSTFIELDS, "api=$api&id_get=$id_get&trans_id=$trans_id&json=1"); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $result = curl_exec($ch); + curl_close($ch); + + $parseDecode = json_decode($result); + if ($parseDecode->status == 1) { + $res['Success'] = true; + $res['status'] = 100; + $res['refID'] = $trans_id; + $res['card_pan'] = $parseDecode->cardNum; + } } return $res; } diff --git a/webUI/src/i18n/fa_lang.ts b/webUI/src/i18n/fa_lang.ts index e86d377..47d7037 100644 --- a/webUI/src/i18n/fa_lang.ts +++ b/webUI/src/i18n/fa_lang.ts @@ -795,6 +795,7 @@ const fa_lang = { zarinpal_api: "کد API زرین‌پال", parsian_api: "کد API درگاه پارسیان", payping_api: "کد API درگاه پی‌پینگ", + bitpay_api: "کد API درگاه بیت‌پی", scripts: "اسکریپت‌ها", footer_scripts: "اسکریپت‌های فوتر سایت(مثلا اسکریپت شمارنده گوگل و ...)", site_footer: "فوتر سایت با پشتیبانی از HTML", diff --git a/webUI/src/views/acc/reports/persons/debtors.vue b/webUI/src/views/acc/reports/persons/debtors.vue index 3fa92f0..d59745f 100644 --- a/webUI/src/views/acc/reports/persons/debtors.vue +++ b/webUI/src/views/acc/reports/persons/debtors.vue @@ -1,195 +1,337 @@