diff --git a/hesabixCore/src/Controller/PersonsController.php b/hesabixCore/src/Controller/PersonsController.php index e3a8e60..c105c8a 100644 --- a/hesabixCore/src/Controller/PersonsController.php +++ b/hesabixCore/src/Controller/PersonsController.php @@ -1116,6 +1116,94 @@ class PersonsController extends AbstractController ]); } + #[Route('/api/approval/approve/receive/{code}', name: 'app_approval_approve_receive', methods: ['POST'])] + public function approveReceiveDoc(string $code, Request $request, Access $access, EntityManagerInterface $entityManager): JsonResponse + { + $acc = $access->hasRole('getpay'); + if (!$acc) throw $this->createAccessDeniedException(); + + $doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([ + 'bid' => $acc['bid']->getId(), + 'code' => $code, + 'money' => $acc['money']->getId(), + 'type' => 'person_receive' + ]); + if (!$doc) { + throw $this->createNotFoundException( + 'سند دریافت یافت نشد' + . 'code ' . $code + . ' money ' . $acc['money']->getId() + . ' year ' . $acc['year']->getId() + . ' bid ' . $acc['bid']->getId() + ); + } + + $doc->setIsPreview(false); + $doc->setIsApproved(true); + $doc->setApprovedBy($this->getUser()); + $entityManager->persist($doc); + $entityManager->flush(); + + return $this->json(['success' => true, 'message' => 'سند دریافت تایید شد']); + } + + #[Route('/api/approval/unapprove/receive/{code}', name: 'app_approval_unapprove_receive', methods: ['POST'])] + public function unapproveReceiveDoc(string $code, Request $request, Access $access, EntityManagerInterface $entityManager): JsonResponse + { + $acc = $access->hasRole('getpay'); + if (!$acc) throw $this->createAccessDeniedException(); + + $doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([ + 'bid' => $acc['bid']->getId(), + 'code' => $code, + 'money' => $acc['money']->getId(), + 'type' => 'person_receive' + ]); + if (!$doc) throw $this->createNotFoundException('سند دریافت یافت نشد'); + + $doc->setIsPreview(true); + $doc->setIsApproved(false); + $doc->setApprovedBy(null); + $entityManager->persist($doc); + $entityManager->flush(); + + return $this->json(['success' => true, 'message' => 'تایید سند دریافت لغو شد']); + } + + #[Route('/api/approval/approve/group/receive', name: 'app_approval_approve_group_receive', methods: ['POST'])] + public function approveGroupReceiveDocs(Request $request, Access $access, EntityManagerInterface $entityManager): JsonResponse + { + $acc = $access->hasRole('getpay'); + if (!$acc) throw $this->createAccessDeniedException(); + + $params = json_decode($request->getContent(), true) ?? []; + $docIds = $params['docIds'] ?? []; + + if (empty($docIds)) { + return $this->json(['success' => false, 'message' => 'هیچ سندی انتخاب نشده است']); + } + + $docs = $entityManager->getRepository(HesabdariDoc::class)->findBy([ + 'bid' => $acc['bid']->getId(), + 'code' => $docIds, + 'money' => $acc['money']->getId(), + 'type' => 'person_receive' + ]); + if (empty($docs)) { + return $this->json(['success' => false, 'message' => 'سند دریافت یافت نشد']); + } + foreach ($docs as $doc) { + $doc->setIsPreview(false); + $doc->setIsApproved(true); + $doc->setApprovedBy($this->getUser()); + $entityManager->persist($doc); + } + + $entityManager->flush(); + + return $this->json(['success' => true, 'message' => 'اسناد دریافت تایید شدند']); + } + #[Route('/api/person/receive/list/search', name: 'app_persons_receive_list_search', methods: ['POST'])] public function app_persons_receive_list_search( Request $request, @@ -1134,6 +1222,7 @@ class PersonsController extends AbstractController $itemsPerPage = (int) ($params['itemsPerPage'] ?? 10); $search = $params['search'] ?? ''; $dateFilter = $params['dateFilter'] ?? 'all'; + $approvalFilter = $params['approvalFilter'] ?? 'all'; // جدید: فیلتر وضعیت تایید // پردازش پارامترهای سورت $sortBy = 'id'; @@ -1157,17 +1246,33 @@ class PersonsController extends AbstractController // کوئری پایه برای اسناد $queryBuilder = $entityManager->getRepository(HesabdariDoc::class) ->createQueryBuilder('d') - ->select('DISTINCT d.id, d.date, d.code, d.des, d.amount') + ->select('DISTINCT d.id, d.date, d.code, d.des, d.amount, d.isPreview, d.isApproved') + ->addSelect('u.fullName as submitter') + ->addSelect('approver.fullName as approvedByName, approver.id as approvedById, approver.email as approvedByEmail') + ->leftJoin('d.submitter', 'u') + ->leftJoin('d.approvedBy', 'approver') ->where('d.bid = :bid') ->andWhere('d.type = :type') ->andWhere('d.year = :year') ->andWhere('d.money = :money') - ->andWhere('d.isApproved = :isApproved') ->setParameter('bid', $acc['bid']) ->setParameter('type', 'person_receive') ->setParameter('year', $acc['year']) - ->setParameter('money', $acc['money']) - ->setParameter('isApproved', true); + ->setParameter('money', $acc['money']); + + // اعمال فیلتر وضعیت تایید + if ($approvalFilter === 'approved') { + $queryBuilder->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } elseif ($approvalFilter === 'pending') { + $queryBuilder->andWhere('d.isPreview = :isPreview AND d.isApproved = :isApproved') + ->setParameter('isPreview', true) + ->setParameter('isApproved', false); + } else { + // حالت قدیمی: فقط اسناد تایید شده + $queryBuilder->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } // جست‌وجو if (!empty($search)) { @@ -1218,12 +1323,24 @@ class PersonsController extends AbstractController ->andWhere('d.type = :type') ->andWhere('d.year = :year') ->andWhere('d.money = :money') - ->andWhere('d.isApproved = :isApproved') ->setParameter('bid', $acc['bid']) ->setParameter('type', 'person_receive') ->setParameter('year', $acc['year']) - ->setParameter('money', $acc['money']) - ->setParameter('isApproved', true); + ->setParameter('money', $acc['money']); + + // اعمال فیلتر وضعیت تایید برای کوئری تعداد + if ($approvalFilter === 'approved') { + $totalQueryBuilder->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } elseif ($approvalFilter === 'pending') { + $totalQueryBuilder->andWhere('d.isPreview = :isPreview AND d.isApproved = :isApproved') + ->setParameter('isPreview', true) + ->setParameter('isApproved', false); + } else { + // حالت قدیمی: فقط اسناد تایید شده + $totalQueryBuilder->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } // اعمال فیلترهای جست‌وجو و تاریخ برای کوئری تعداد if (!empty($search)) { @@ -1389,6 +1506,14 @@ class PersonsController extends AbstractController 'amount' => $doc['amount'], 'persons' => $persons[$doc['id']] ?? [], 'accounts' => $accounts[$doc['id']] ?? [], + 'isPreview' => $doc['isPreview'], + 'isApproved' => $doc['isApproved'], + 'submitter' => $doc['submitter'], + 'approvedBy' => $doc['approvedByName'] ? [ + 'fullName' => $doc['approvedByName'], + 'id' => $doc['approvedById'], + 'email' => $doc['approvedByEmail'] + ] : null, ]; } diff --git a/webUI/src/views/acc/persons/receive/list.vue b/webUI/src/views/acc/persons/receive/list.vue index e68ace0..31e4455 100755 --- a/webUI/src/views/acc/persons/receive/list.vue +++ b/webUI/src/views/acc/persons/receive/list.vue @@ -14,6 +14,12 @@ + + + + +
+ + اسناد تایید شده + اسناد در انتظار تایید + +
سند حسابداری + + + + + +