diff --git a/hesabixCore/config/services.yaml b/hesabixCore/config/services.yaml index 164c059..f7bc1f3 100644 --- a/hesabixCore/config/services.yaml +++ b/hesabixCore/config/services.yaml @@ -83,7 +83,7 @@ services: twigFunctions: class: App\Service\twigFunctions - arguments: [ '@doctrine.orm.entity_manager' ] + arguments: [ '@doctrine.orm.entity_manager', '@request_stack', '@registryMGR' ] registryMGR: class: App\Service\registryMGR diff --git a/hesabixCore/src/Controller/CostController.php b/hesabixCore/src/Controller/CostController.php index 5dca999..322a4c9 100644 --- a/hesabixCore/src/Controller/CostController.php +++ b/hesabixCore/src/Controller/CostController.php @@ -9,6 +9,9 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; +use Symfony\Component\HttpFoundation\BinaryFileResponse; +use App\Service\Provider; +use App\Entity\HesabdariDoc; class CostController extends AbstractController { @@ -311,4 +314,155 @@ class CostController extends AbstractController 'limit' => $limit ]); } + + #[Route('/api/costs/list/print', name: 'app_costs_list_print')] + public function app_costs_list_print( + Provider $provider, + Request $request, + Access $access, + EntityManagerInterface $entityManager + ): JsonResponse { + $acc = $access->hasRole('cost'); + if (!$acc) { + throw $this->createAccessDeniedException(); + } + + $params = json_decode($request->getContent(), true) ?? []; + + // دریافت آیتم‌های انتخاب شده یا همه آیتم‌ها + if (!isset($params['items'])) { + $items = $entityManager->getRepository(HesabdariDoc::class)->findBy([ + 'bid' => $acc['bid'], + 'type' => 'cost', + 'year' => $acc['year'], + 'money' => $acc['money'] + ]); + } else { + $items = []; + foreach ($params['items'] as $param) { + $doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([ + 'id' => $param['id'], + 'bid' => $acc['bid'], + 'type' => 'cost', + 'year' => $acc['year'], + 'money' => $acc['money'] + ]); + if ($doc) { + $items[] = $doc; + } + } + } + + $pid = $provider->createPrint( + $acc['bid'], + $this->getUser(), + $this->renderView('pdf/costs.html.twig', [ + 'page_title' => 'فهرست هزینه‌ها', + 'bid' => $acc['bid'], + 'items' => $items + ]) + ); + + return $this->json(['id' => $pid]); + } + + #[Route('/api/costs/list/excel', name: 'app_costs_list_excel')] + public function app_costs_list_excel( + Provider $provider, + Request $request, + Access $access, + EntityManagerInterface $entityManager + ): BinaryFileResponse { + $acc = $access->hasRole('cost'); + if (!$acc) { + throw $this->createAccessDeniedException(); + } + + $params = json_decode($request->getContent(), true) ?? []; + + // دریافت آیتم‌های انتخاب شده یا همه آیتم‌ها + if (!isset($params['items'])) { + $items = $entityManager->getRepository(HesabdariDoc::class)->findBy([ + 'bid' => $acc['bid'], + 'type' => 'cost', + 'year' => $acc['year'], + 'money' => $acc['money'] + ]); + } else { + $items = []; + foreach ($params['items'] as $param) { + $doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([ + 'id' => $param['id'], + 'bid' => $acc['bid'], + 'type' => 'cost', + 'year' => $acc['year'], + 'money' => $acc['money'] + ]); + if ($doc) { + $items[] = $doc; + } + } + } + + // ایجاد فایل اکسل + $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + $sheet->setRightToLeft(true); + + // تنظیم هدرها + $sheet->setCellValue('A1', 'ردیف') + ->setCellValue('B1', 'شماره سند') + ->setCellValue('C1', 'تاریخ') + ->setCellValue('D1', 'شرح') + ->setCellValue('E1', 'مرکز هزینه') + ->setCellValue('F1', 'مرکز پرداخت') + ->setCellValue('G1', 'مبلغ (ریال)'); + + // پر کردن داده‌ها + $rowNumber = 2; + foreach ($items as $index => $item) { + // محاسبه مراکز هزینه + $costCenters = []; + foreach ($item->getHesabdariRows() as $row) { + if ($row->getRef()) { + $costCenters[] = $row->getRef()->getName(); + } + } + $costCenterNames = implode('، ', array_unique($costCenters)); + + // محاسبه مرکز پرداخت + $paymentCenter = null; + foreach ($item->getHesabdariRows() as $row) { + if (!$paymentCenter) { + if ($row->getBank()) { + $paymentCenter = $row->getBank()->getName(); + } elseif ($row->getCashdesk()) { + $paymentCenter = $row->getCashdesk()->getName(); + } elseif ($row->getSalary()) { + $paymentCenter = $row->getSalary()->getName(); + } elseif ($row->getCommodity()) { + $paymentCenter = $row->getCommodity()->getName(); + } elseif ($row->getPerson()) { + $paymentCenter = $row->getPerson()->getNikename(); + } + } + } + + $sheet->setCellValue('A' . $rowNumber, $index + 1) + ->setCellValue('B' . $rowNumber, $item->getCode()) + ->setCellValue('C' . $rowNumber, $item->getDate()) + ->setCellValue('D' . $rowNumber, $item->getDes()) + ->setCellValue('E' . $rowNumber, $costCenterNames) + ->setCellValue('F' . $rowNumber, $paymentCenter) + ->setCellValue('G' . $rowNumber, number_format($item->getAmount())); + $rowNumber++; + } + + // ذخیره فایل اکسل + $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); + $filePath = __DIR__ . '/../../var/' . uniqid() . '.xlsx'; + $writer->save($filePath); + + return new BinaryFileResponse($filePath); + } } \ No newline at end of file diff --git a/hesabixCore/src/Controller/System/RegistrySettingsController.php b/hesabixCore/src/Controller/System/RegistrySettingsController.php index f75a338..71e3f5b 100644 --- a/hesabixCore/src/Controller/System/RegistrySettingsController.php +++ b/hesabixCore/src/Controller/System/RegistrySettingsController.php @@ -51,6 +51,8 @@ final class RegistrySettingsController extends AbstractController 'smsAlertEnabled' => filter_var($registryMGR->get($rootSystem, 'sms_alert_enabled'), FILTER_VALIDATE_BOOLEAN), 'smsAlertMobile' => $registryMGR->get($rootTicket, 'managerMobile'), 'sponsorMessage' => $registryMGR->get('system', 'sponsers'), + 'footerLeft' => $registryMGR->get('system', 'footerLeft'), + 'footerRight' => $registryMGR->get('system', 'footerRight'), ]; @@ -78,7 +80,8 @@ final class RegistrySettingsController extends AbstractController $registryMGR->update($rootSystem, 'sms_alert_enabled', $data['smsAlertEnabled'] ? '1' : '0'); $registryMGR->update($rootTicket, 'managerMobile', $data['smsAlertMobile'] ?? ''); $registryMGR->update('system', 'sponsers', $data['sponsorMessage'] ?? ''); - + $registryMGR->update('system', 'footerLeft', $data['footerLeft'] ?? ''); + $registryMGR->update('system', 'footerRight', $data['footerRight'] ?? ''); return new JsonResponse([ 'result' => 1, diff --git a/hesabixCore/src/Service/twigFunctions.php b/hesabixCore/src/Service/twigFunctions.php index 0b8fbb4..b6be92a 100644 --- a/hesabixCore/src/Service/twigFunctions.php +++ b/hesabixCore/src/Service/twigFunctions.php @@ -18,15 +18,22 @@ class twigFunctions protected $request; protected RequestStack $requestStack; - + protected registryMGR $registryMGR; function __construct( EntityManagerInterface $entityManager, - RequestStack $request + RequestStack $request, + registryMGR $registryMGR ) { $this->request = $request->getCurrentRequest(); $this->em = $entityManager; + $this->registryMGR = $registryMGR; } + //get static data from registry + public function getStaticData($root,$key) + { + return $this->registryMGR->get($root, $key); + } public function md5($val) { diff --git a/hesabixCore/templates/pdf/costs.html.twig b/hesabixCore/templates/pdf/costs.html.twig new file mode 100644 index 0000000..b6ea00d --- /dev/null +++ b/hesabixCore/templates/pdf/costs.html.twig @@ -0,0 +1,72 @@ +{% extends 'pdf/base.html.twig' %} + +{% block body %} + + + + + + + + + + + + {% for item in items %} + + + + + + + + + + {% endfor %} + + {# جمع کل #} + + + + + +
ردیفشماره سندتاریخشرحمرکز هزینهمرکز پرداختمبلغ (ریال)
{{ loop.index }}{{ item.code }}{{ item.date }}{{ item.des }} + {% set costCenters = [] %} + {% for row in item.hesabdariRows %} + {% if row.ref %} + {% if not row.bank and not row.commodity and not row.cheque and not row.salary and not row.cashdesk and not row.person %} + {% set costCenters = costCenters|merge([row.ref.name]) %} + {% endif %} + {% endif %} + {% endfor %} + {{ costCenters|join('، ') }} + + {% set paymentCenter = null %} + {% for row in item.hesabdariRows %} + {% if not paymentCenter %} + {% if row.bank %} + {% set paymentCenter = row.bank.name %} + {% elseif row.cashdesk %} + {% set paymentCenter = row.cashdesk.name %} + {% elseif row.salary %} + {% set paymentCenter = row.salary.name %} + {% elseif row.commodity %} + {% set paymentCenter = row.commodity.name %} + {% elseif row.person %} + {% set paymentCenter = row.person.nikename %} + {% endif %} + {% endif %} + {% endfor %} + {{ paymentCenter }} + {{ item.amount|number_format }}
جمع کل: + {{ items|reduce((sum, item) => sum + item.amount, 0)|number_format }} +
+ +{# اطلاعات تکمیلی #} +
+

تعداد اسناد: {{ items|length }} مورد

+ {% if items|length > 0 %} +

از تاریخ: {{ items|first.date }} تا تاریخ: {{ items|last.date }}

+ {% endif %} +
+{% endblock %} \ No newline at end of file diff --git a/hesabixCore/templates/pdf/footer.html.twig b/hesabixCore/templates/pdf/footer.html.twig index 9f191c6..7c66935 100644 --- a/hesabixCore/templates/pdf/footer.html.twig +++ b/hesabixCore/templates/pdf/footer.html.twig @@ -12,7 +12,7 @@ - حسابداری آنلاین حسابیکس + {{ twigFunctions.getStaticData('system', 'footerLeft') }} صفحه: @@ -21,7 +21,7 @@ {nbpg} - Hesabix.ir + {{ twigFunctions.getStaticData('system', 'footerRight') }}