From 79b887041ed9822ed362baadb14dd5a8a992f61a Mon Sep 17 00:00:00 2001 From: Babak Alizadeh Date: Wed, 20 Aug 2025 18:00:04 +0000 Subject: [PATCH] more progress in changes with new columns in hesabdariDoc --- hesabixCore/src/Controller/CostController.php | 103 +++++++++++++++--- .../src/Controller/DirectHesabdariDoc.php | 17 +++ .../src/Controller/IncomeController.php | 103 +++++++++++++++--- 3 files changed, 187 insertions(+), 36 deletions(-) diff --git a/hesabixCore/src/Controller/CostController.php b/hesabixCore/src/Controller/CostController.php index e06e45a..b7bcc97 100644 --- a/hesabixCore/src/Controller/CostController.php +++ b/hesabixCore/src/Controller/CostController.php @@ -47,7 +47,7 @@ class CostController extends AbstractController $yearStart = $jdate->jdate('Y/m/d', $yearStartUnix); $yearEnd = $jdate->jdate('Y/m/d', $yearEndUnix); - // کوئری پایه - فقط جمع bd را محاسبه می‌کنیم + // کوئری پایه - فقط جمع bd را محاسبه می‌کنیم و فقط اسناد تایید شده $qb = $entityManager->createQueryBuilder() ->select('SUM(COALESCE(r.bd, 0)) as total') ->from('App\Entity\HesabdariDoc', 'd') @@ -56,10 +56,12 @@ class CostController extends AbstractController ->andWhere('d.money = :money') ->andWhere('d.type = :type') ->andWhere('d.year = :year') + ->andWhere('d.isApproved = :isApproved') ->setParameter('bid', $acc['bid']) ->setParameter('money', $acc['money']) ->setParameter('type', 'cost') - ->setParameter('year', $acc['year']); + ->setParameter('year', $acc['year']) + ->setParameter('isApproved', true); // هزینه امروز $todayCost = (clone $qb) @@ -126,7 +128,7 @@ class CostController extends AbstractController 'year' => $acc['year'], ]; - // کوئری پایه + // کوئری پایه - فقط اسناد تایید شده $qb = $entityManager->createQueryBuilder() ->select('t.name AS center_name, SUM(COALESCE(r.bd, 0)) AS total_cost') ->from('App\Entity\HesabdariDoc', 'd') @@ -136,13 +138,15 @@ class CostController extends AbstractController ->andWhere('d.money = :money') ->andWhere('d.type = :type') ->andWhere('d.year = :year') + ->andWhere('d.isApproved = :isApproved') ->andWhere('r.bd != 0') ->groupBy('t.id, t.name') ->orderBy('total_cost', 'DESC') ->setParameter('bid', $acc['bid']) ->setParameter('money', $acc['money']) ->setParameter('type', 'cost') - ->setParameter('year', $acc['year']); + ->setParameter('year', $acc['year']) + ->setParameter('isApproved', true); // اعمال فیلتر تاریخ فقط برای امروز و ماه if ($period === 'today') { @@ -203,6 +207,7 @@ class CostController 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') @@ -217,6 +222,14 @@ class CostController extends AbstractController ->setParameter('type', $type) ->setParameter('money', $acc['money']); + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + if (!$includePreview) { + // Default: only show approved documents + $queryBuilder->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + // Apply filters if (!empty($filters)) { // Text search @@ -313,6 +326,8 @@ class CostController extends AbstractController 'des' => $doc['des'], 'amount' => $doc['amount'], 'submitter' => $doc['submitter'], + 'isPreview' => $doc['isPreview'], + 'isApproved' => $doc['isApproved'], ]; // Get cost center details @@ -378,14 +393,30 @@ class CostController extends AbstractController $params = json_decode($request->getContent(), true) ?? []; + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + // دریافت آیتم‌های انتخاب شده یا همه آیتم‌ها if (!isset($params['items'])) { - $items = $entityManager->getRepository(HesabdariDoc::class)->findBy([ - 'bid' => $acc['bid'], - 'type' => 'cost', - 'year' => $acc['year'], - 'money' => $acc['money'] - ]); + $query = $entityManager->createQueryBuilder() + ->select('d') + ->from(HesabdariDoc::class, 'd') + ->where('d.bid = :bid') + ->andWhere('d.type = :type') + ->andWhere('d.year = :year') + ->andWhere('d.money = :money') + ->setParameter('bid', $acc['bid']) + ->setParameter('type', 'cost') + ->setParameter('year', $acc['year']) + ->setParameter('money', $acc['money']); + + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + + $items = $query->getQuery()->getResult(); } else { $items = []; foreach ($params['items'] as $param) { @@ -397,7 +428,10 @@ class CostController extends AbstractController 'money' => $acc['money'] ]); if ($doc) { - $items[] = $doc; + // Check if the document is approved (unless includePreview is true) + if ($includePreview || $doc->isApproved()) { + $items[] = $doc; + } } } } @@ -429,14 +463,30 @@ class CostController extends AbstractController $params = json_decode($request->getContent(), true) ?? []; + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + // دریافت آیتم‌های انتخاب شده یا همه آیتم‌ها if (!isset($params['items'])) { - $items = $entityManager->getRepository(HesabdariDoc::class)->findBy([ - 'bid' => $acc['bid'], - 'type' => 'cost', - 'year' => $acc['year'], - 'money' => $acc['money'] - ]); + $query = $entityManager->createQueryBuilder() + ->select('d') + ->from(HesabdariDoc::class, 'd') + ->where('d.bid = :bid') + ->andWhere('d.type = :type') + ->andWhere('d.year = :year') + ->andWhere('d.money = :money') + ->setParameter('bid', $acc['bid']) + ->setParameter('type', 'cost') + ->setParameter('year', $acc['year']) + ->setParameter('money', $acc['money']); + + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + + $items = $query->getQuery()->getResult(); } else { $items = []; foreach ($params['items'] as $param) { @@ -448,7 +498,10 @@ class CostController extends AbstractController 'money' => $acc['money'] ]); if ($doc) { - $items[] = $doc; + // Check if the document is approved (unless includePreview is true) + if ($includePreview || $doc->isApproved()) { + $items[] = $doc; + } } } } @@ -566,6 +619,20 @@ class CostController extends AbstractController $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()); + } + $entityManager->persist($doc); $entityManager->flush(); diff --git a/hesabixCore/src/Controller/DirectHesabdariDoc.php b/hesabixCore/src/Controller/DirectHesabdariDoc.php index f3f148a..b403c8e 100644 --- a/hesabixCore/src/Controller/DirectHesabdariDoc.php +++ b/hesabixCore/src/Controller/DirectHesabdariDoc.php @@ -42,6 +42,20 @@ class DirectHesabdariDoc extends AbstractController $hesabdariDoc->setCode($provider->getAccountingCode($acc['bid'], 'accounting')); $hesabdariDoc->setDateSubmit(time()); + // Set approval status based on business settings + $business = $acc['bid']; + if ($business->getTwoStepApproval()) { + // Two-step approval is enabled + $hesabdariDoc->setIsPreview(true); + $hesabdariDoc->setIsApproved(false); + $hesabdariDoc->setApprovedBy(null); + } else { + // Two-step approval is disabled - auto approve + $hesabdariDoc->setIsPreview(false); + $hesabdariDoc->setIsApproved(true); + $hesabdariDoc->setApprovedBy($this->getUser()); + } + //insert rows if (isset($prams['rows'])) { if (count($prams['rows']) < 2) { @@ -355,6 +369,9 @@ class DirectHesabdariDoc extends AbstractController 'date' => $hesabdariDoc->getDate(), 'des' => $hesabdariDoc->getDes(), 'code' => $hesabdariDoc->getCode(), + 'isPreview' => $hesabdariDoc->isPreview(), + 'isApproved' => $hesabdariDoc->isApproved(), + 'approvedBy' => $hesabdariDoc->getApprovedBy() ? $hesabdariDoc->getApprovedBy()->getFullName() : null, 'rows' => $rows ]; diff --git a/hesabixCore/src/Controller/IncomeController.php b/hesabixCore/src/Controller/IncomeController.php index 33a2e04..a6b202b 100644 --- a/hesabixCore/src/Controller/IncomeController.php +++ b/hesabixCore/src/Controller/IncomeController.php @@ -48,7 +48,7 @@ class IncomeController extends AbstractController $yearStart = $jdate->jdate('Y/m/d', $yearStartUnix); $yearEnd = $jdate->jdate('Y/m/d', $yearEndUnix); - // کوئری پایه - جمع bs را محاسبه می‌کنیم + // کوئری پایه - جمع bs را محاسبه می‌کنیم و فقط اسناد تایید شده $qb = $entityManager->createQueryBuilder() ->select('SUM(COALESCE(r.bs, 0)) as total') ->from('App\Entity\HesabdariDoc', 'd') @@ -57,11 +57,13 @@ class IncomeController extends AbstractController ->andWhere('d.money = :money') ->andWhere('d.type = :type') ->andWhere('d.year = :year') + ->andWhere('d.isApproved = :isApproved') ->andWhere('r.bs != 0') // فقط ردیف‌هایی که bs صفر نیست ->setParameter('bid', $acc['bid']) ->setParameter('money', $acc['money']) ->setParameter('type', 'income') - ->setParameter('year', $acc['year']); + ->setParameter('year', $acc['year']) + ->setParameter('isApproved', true); // درآمد امروز $todayIncome = (clone $qb) @@ -123,7 +125,7 @@ class IncomeController extends AbstractController $today = $jdate->jdate('Y/m/d', time()); $monthStart = $jdate->jdate('Y/m/01', time()); - // کوئری پایه + // کوئری پایه - فقط اسناد تایید شده $qb = $entityManager->createQueryBuilder() ->select('t.name AS center_name, SUM(COALESCE(r.bs, 0)) AS total_income') ->from('App\Entity\HesabdariDoc', 'd') @@ -133,13 +135,15 @@ class IncomeController extends AbstractController ->andWhere('d.money = :money') ->andWhere('d.type = :type') ->andWhere('d.year = :year') + ->andWhere('d.isApproved = :isApproved') ->andWhere('r.bs != 0') // فقط ردیف‌هایی که bs صفر نیست ->groupBy('t.id, t.name') ->orderBy('total_income', 'DESC') ->setParameter('bid', $acc['bid']) ->setParameter('money', $acc['money']) ->setParameter('type', 'income') - ->setParameter('year', $acc['year']); + ->setParameter('year', $acc['year']) + ->setParameter('isApproved', true); // اعمال فیلتر تاریخ فقط برای امروز و ماه if ($period === 'today') { @@ -200,6 +204,7 @@ class IncomeController 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') @@ -214,6 +219,14 @@ class IncomeController extends AbstractController ->setParameter('type', $type) ->setParameter('money', $acc['money']); + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + if (!$includePreview) { + // Default: only show approved documents + $queryBuilder->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + // Apply filters if (!empty($filters)) { // Text search @@ -310,6 +323,8 @@ class IncomeController extends AbstractController 'des' => $doc['des'], 'amount' => $doc['amount'], 'submitter' => $doc['submitter'], + 'isPreview' => $doc['isPreview'], + 'isApproved' => $doc['isApproved'], ]; // Get income center details @@ -375,14 +390,30 @@ class IncomeController extends AbstractController $params = json_decode($request->getContent(), true) ?? []; + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + // دریافت آیتم‌های انتخاب شده یا همه آیتم‌ها if (!isset($params['items'])) { - $items = $entityManager->getRepository(HesabdariDoc::class)->findBy([ - 'bid' => $acc['bid'], - 'type' => 'income', - 'year' => $acc['year'], - 'money' => $acc['money'] - ]); + $query = $entityManager->createQueryBuilder() + ->select('d') + ->from(HesabdariDoc::class, 'd') + ->where('d.bid = :bid') + ->andWhere('d.type = :type') + ->andWhere('d.year = :year') + ->andWhere('d.money = :money') + ->setParameter('bid', $acc['bid']) + ->setParameter('type', 'income') + ->setParameter('year', $acc['year']) + ->setParameter('money', $acc['money']); + + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + + $items = $query->getQuery()->getResult(); } else { $items = []; foreach ($params['items'] as $param) { @@ -394,7 +425,10 @@ class IncomeController extends AbstractController 'money' => $acc['money'] ]); if ($doc) { - $items[] = $doc; + // Check if the document is approved (unless includePreview is true) + if ($includePreview || $doc->isApproved()) { + $items[] = $doc; + } } } } @@ -426,14 +460,30 @@ class IncomeController extends AbstractController $params = json_decode($request->getContent(), true) ?? []; + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + // دریافت آیتم‌های انتخاب شده یا همه آیتم‌ها if (!isset($params['items'])) { - $items = $entityManager->getRepository(HesabdariDoc::class)->findBy([ - 'bid' => $acc['bid'], - 'type' => 'income', - 'year' => $acc['year'], - 'money' => $acc['money'] - ]); + $query = $entityManager->createQueryBuilder() + ->select('d') + ->from(HesabdariDoc::class, 'd') + ->where('d.bid = :bid') + ->andWhere('d.type = :type') + ->andWhere('d.year = :year') + ->andWhere('d.money = :money') + ->setParameter('bid', $acc['bid']) + ->setParameter('type', 'income') + ->setParameter('year', $acc['year']) + ->setParameter('money', $acc['money']); + + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + + $items = $query->getQuery()->getResult(); } else { $items = []; foreach ($params['items'] as $param) { @@ -445,7 +495,10 @@ class IncomeController extends AbstractController 'money' => $acc['money'] ]); if ($doc) { - $items[] = $doc; + // Check if the document is approved (unless includePreview is true) + if ($includePreview || $doc->isApproved()) { + $items[] = $doc; + } } } } @@ -563,6 +616,20 @@ class IncomeController extends AbstractController $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()); + } + $entityManager->persist($doc); $entityManager->flush();