diff --git a/hesabixCore/src/Cog/AccountingDocService.php b/hesabixCore/src/Cog/AccountingDocService.php index b800e54..fdf6e59 100644 --- a/hesabixCore/src/Cog/AccountingDocService.php +++ b/hesabixCore/src/Cog/AccountingDocService.php @@ -51,12 +51,38 @@ class AccountingDocService ]); if (!$person) return ['error' => 'شخص یافت نشد']; - $data = $em->getRepository(\App\Entity\HesabdariRow::class)->findBy([ - 'person' => $person, - 'year' => $acc['year'] - ], [ - 'id' => 'ASC' - ]); + + // Check if we should include preview documents + $includePreview = $params['includePreview'] ?? false; + + if ($includePreview) { + $data = $em->getRepository(\App\Entity\HesabdariRow::class)->createQueryBuilder('r') + ->join('r.doc', 'd') + ->where('r.person = :person') + ->andWhere('r.year = :year') + ->andWhere('d.bid = :bid') + ->setParameter('person', $person) + ->setParameter('year', $acc['year']) + ->setParameter('bid', $acc['bid']) + ->orderBy('r.id', 'ASC') + ->getQuery() + ->getResult(); + } else { + // Default: only approved documents + $data = $em->getRepository(\App\Entity\HesabdariRow::class)->createQueryBuilder('r') + ->join('r.doc', 'd') + ->where('r.person = :person') + ->andWhere('r.year = :year') + ->andWhere('d.bid = :bid') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('person', $person) + ->setParameter('year', $acc['year']) + ->setParameter('bid', $acc['bid']) + ->setParameter('isApproved', true) + ->orderBy('r.id', 'ASC') + ->getQuery() + ->getResult(); + } } elseif ($params['type'] == 'bank') { $bank = $em->getRepository(\App\Entity\BankAccount::class)->findOneBy([ 'bid' => $acc['bid'], @@ -64,12 +90,38 @@ class AccountingDocService ]); if (!$bank) return ['error' => 'بانک یافت نشد']; - $data = $em->getRepository(\App\Entity\HesabdariRow::class)->findBy([ - 'bank' => $bank, - 'year' => $acc['year'] - ], [ - 'id' => 'ASC' - ]); + + // Check if we should include preview documents + $includePreview = $params['includePreview'] ?? false; + + if ($includePreview) { + $data = $em->getRepository(\App\Entity\HesabdariRow::class)->createQueryBuilder('r') + ->join('r.doc', 'd') + ->where('r.bank = :bank') + ->andWhere('r.year = :year') + ->andWhere('d.bid = :bid') + ->setParameter('bank', $bank) + ->setParameter('year', $acc['year']) + ->setParameter('bid', $acc['bid']) + ->orderBy('r.id', 'ASC') + ->getQuery() + ->getResult(); + } else { + // Default: only approved documents + $data = $em->getRepository(\App\Entity\HesabdariRow::class)->createQueryBuilder('r') + ->join('r.doc', 'd') + ->where('r.bank = :bank') + ->andWhere('r.year = :year') + ->andWhere('d.bid = :bid') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('bank', $bank) + ->setParameter('year', $acc['year']) + ->setParameter('bid', $acc['bid']) + ->setParameter('isApproved', true) + ->orderBy('r.id', 'ASC') + ->getQuery() + ->getResult(); + } } elseif ($params['type'] == 'cashdesk') { $cashdesk = $em->getRepository(\App\Entity\Cashdesk::class)->findOneBy([ 'bid' => $acc['bid'], @@ -77,12 +129,38 @@ class AccountingDocService ]); if (!$cashdesk) return ['error' => 'صندوق یافت نشد']; - $data = $em->getRepository(\App\Entity\HesabdariRow::class)->findBy([ - 'cashdesk' => $cashdesk, - 'year' => $acc['year'] - ], [ - 'id' => 'ASC' - ]); + + // Check if we should include preview documents + $includePreview = $params['includePreview'] ?? false; + + if ($includePreview) { + $data = $em->getRepository(\App\Entity\HesabdariRow::class)->createQueryBuilder('r') + ->join('r.doc', 'd') + ->where('r.cashdesk = :cashdesk') + ->andWhere('r.year = :year') + ->andWhere('d.bid = :bid') + ->setParameter('cashdesk', $cashdesk) + ->setParameter('year', $acc['year']) + ->setParameter('bid', $acc['bid']) + ->orderBy('r.id', 'ASC') + ->getQuery() + ->getResult(); + } else { + // Default: only approved documents + $data = $em->getRepository(\App\Entity\HesabdariRow::class)->createQueryBuilder('r') + ->join('r.doc', 'd') + ->where('r.cashdesk = :cashdesk') + ->andWhere('r.year = :year') + ->andWhere('d.bid = :bid') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('cashdesk', $cashdesk) + ->setParameter('year', $acc['year']) + ->setParameter('bid', $acc['bid']) + ->setParameter('isApproved', true) + ->orderBy('r.id', 'ASC') + ->getQuery() + ->getResult(); + } } elseif ($params['type'] == 'salary') { $salary = $em->getRepository(\App\Entity\Salary::class)->findOneBy([ 'bid' => $acc['bid'], @@ -90,12 +168,38 @@ class AccountingDocService ]); if (!$salary) return ['error' => 'حقوق یافت نشد']; - $data = $em->getRepository(\App\Entity\HesabdariRow::class)->findBy([ - 'salary' => $salary, - 'year' => $acc['year'] - ], [ - 'id' => 'ASC' - ]); + + // Check if we should include preview documents + $includePreview = $params['includePreview'] ?? false; + + if ($includePreview) { + $data = $em->getRepository(\App\Entity\HesabdariRow::class)->createQueryBuilder('r') + ->join('r.doc', 'd') + ->where('r.salary = :salary') + ->andWhere('r.year = :year') + ->andWhere('d.bid = :bid') + ->setParameter('salary', $salary) + ->setParameter('year', $acc['year']) + ->setParameter('bid', $acc['bid']) + ->orderBy('r.id', 'ASC') + ->getQuery() + ->getResult(); + } else { + // Default: only approved documents + $data = $em->getRepository(\App\Entity\HesabdariRow::class)->createQueryBuilder('r') + ->join('r.doc', 'd') + ->where('r.salary = :salary') + ->andWhere('r.year = :year') + ->andWhere('d.bid = :bid') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('salary', $salary) + ->setParameter('year', $acc['year']) + ->setParameter('bid', $acc['bid']) + ->setParameter('isApproved', true) + ->orderBy('r.id', 'ASC') + ->getQuery() + ->getResult(); + } } else { return ['error' => 'نوع پشتیبانی نمی‌شود']; } diff --git a/hesabixCore/src/Controller/HesabdariController.php b/hesabixCore/src/Controller/HesabdariController.php index 020c634..8dd50bd 100644 --- a/hesabixCore/src/Controller/HesabdariController.php +++ b/hesabixCore/src/Controller/HesabdariController.php @@ -52,12 +52,25 @@ class HesabdariController extends AbstractController $acc = $access->hasRole('accounting'); if (!$acc) throw $this->createAccessDeniedException(); - $doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([ - 'bid' => $acc['bid'], - 'year' => $acc['year'], - 'code' => $params['code'], - 'money' => $acc['money'] - ]); + // Check if we should include preview documents + $includePreview = $params['includePreview'] ?? false; + + if ($includePreview) { + $doc = $entityManager->getRepository(HesabdariDoc::class)->findOneByIncludePreview([ + 'bid' => $acc['bid'], + 'year' => $acc['year'], + 'code' => $params['code'], + 'money' => $acc['money'] + ]); + } else { + // Default: only approved documents + $doc = $entityManager->getRepository(HesabdariDoc::class)->findOneBy([ + 'bid' => $acc['bid'], + 'year' => $acc['year'], + 'code' => $params['code'], + 'money' => $acc['money'] + ]); + } if (!$doc) throw $this->createNotFoundException(); //add shortlink to doc @@ -208,6 +221,7 @@ class HesabdariController extends AbstractController // Build base query $queryBuilder = $entityManager->createQueryBuilder() ->select('DISTINCT d.id, d.dateSubmit, d.date, d.type, d.code, d.des, d.amount') + ->addSelect('d.isPreview, d.isApproved') ->addSelect('u.fullName as submitter') ->from('App\Entity\HesabdariDoc', 'd') ->leftJoin('d.submitter', 'u') @@ -220,6 +234,21 @@ class HesabdariController extends AbstractController ->setParameter('year', $acc['year']) ->setParameter('money', $acc['money']); + // Apply approval filters - if not specified, only show approved documents + if (isset($filters['isApproved'])) { + $queryBuilder->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', $filters['isApproved']); + } else { + // Default: only show approved documents + $queryBuilder->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + + if (isset($filters['isPreview'])) { + $queryBuilder->andWhere('d.isPreview = :isPreview') + ->setParameter('isPreview', $filters['isPreview']); + } + // Add type filter if not 'all' if ($type !== 'all') { $queryBuilder->andWhere('d.type = :type') @@ -323,6 +352,8 @@ class HesabdariController extends AbstractController 'des' => $doc['des'], 'amount' => $doc['amount'], 'submitter' => $doc['submitter'], + 'isPreview' => $doc['isPreview'], + 'isApproved' => $doc['isApproved'], ]; // Get related person info if applicable @@ -443,6 +474,21 @@ class HesabdariController extends AbstractController $doc->setSubmitter($this->getUser()); $doc->setMoney($acc['money']); $doc->setCode($provider->getAccountingCode($acc['bid'], 'accounting')); + + // Set approval status based on business settings + $business = $acc['bid']; + if ($business->getTwoStepApproval()) { + // Two-step approval is enabled + $doc->setIsPreview(true); + $doc->setIsApproved(false); + $doc->setApprovedBy(null); + } else { + // Two-step approval is disabled - auto approve + $doc->setIsPreview(false); + $doc->setIsApproved(true); + $doc->setApprovedBy($this->getUser()); + } + if (array_key_exists('refData', $params)) $doc->setRefData($params['refData']); if (array_key_exists('plugin', $params))