diff --git a/hesabixCore/src/Controller/BankController.php b/hesabixCore/src/Controller/BankController.php index a4c166f..57e8731 100644 --- a/hesabixCore/src/Controller/BankController.php +++ b/hesabixCore/src/Controller/BankController.php @@ -47,9 +47,17 @@ class BankController extends AbstractController foreach ($datas as $data) { $bs = 0; $bd = 0; - $items = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bank' => $data - ]); + // Use query builder to filter by approved documents + $items = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bank = :bank') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('bank', $data) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); foreach ($items as $item) { $bs += $item->getBs(); $bd += $item->getBd(); @@ -95,9 +103,17 @@ class BankController extends AbstractController foreach ($datas as $data) { $bs = 0; $bd = 0; - $items = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bank' => $data - ]); + // Use query builder to filter by approved documents + $items = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bank = :bank') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('bank', $data) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); foreach ($items as $item) { $bs += $item->getBs(); $bd += $item->getBd(); @@ -212,8 +228,17 @@ class BankController extends AbstractController $bank = $entityManager->getRepository(BankAccount::class)->findOneBy(['bid' => $acc['bid'], 'code' => $code]); if (!$bank) throw $this->createNotFoundException(); - //check accounting docs - $rows = $entityManager->getRepository(HesabdariRow::class)->findby(['bid' => $acc['bid'], 'bank' => $bank]); + //check accounting docs - include both approved and preview documents for deletion check + $rows = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.bank = :bank') + ->setParameter('bid', $acc['bid']) + ->setParameter('bank', $bank) + ->getQuery() + ->getResult(); if (count($rows) > 0) return $this->json(['result' => 2]); if ($acc['bid']->getWalletMatchBank()) { @@ -245,9 +270,17 @@ class BankController extends AbstractController $bs = 0; $bd = 0; - $items = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bank' => $bank - ]); + // Use query builder to filter by approved documents + $items = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bank = :bank') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('bank', $bank) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); foreach ($items as $item) { $bs += $item->getBs(); @@ -285,11 +318,20 @@ class BankController extends AbstractController $query = $entityManager->createQueryBuilder() ->select('r') ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') ->where('r.bank = :bank') ->andWhere('r.bid = :bid') ->setParameter('bank', $bank) ->setParameter('bid', $acc['bid']); + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + if (isset($params['startDate']) && isset($params['endDate'])) { $query->andWhere('r.doc.date BETWEEN :startDate AND :endDate') ->setParameter('startDate', $params['startDate']) @@ -327,12 +369,29 @@ class BankController extends AbstractController $bank = $entityManager->getRepository(BankAccount::class)->findOneBy(['bid' => $acc['bid'], 'code' => $params['code']]); if (!$bank) throw $this->createNotFoundException(); + + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + if (!array_key_exists('items', $params)) { - $transactions = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bid' => $acc['bid'], - 'bank' => $bank, - 'year'=>$acc['year'] - ]); + $query = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.bank = :bank') + ->andWhere('r.year = :year') + ->setParameter('bid', $acc['bid']) + ->setParameter('bank', $bank) + ->setParameter('year', $acc['year']); + + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + + $transactions = $query->getQuery()->getResult(); } else { $transactions = []; foreach ($params['items'] as $param) { @@ -343,7 +402,10 @@ class BankController extends AbstractController 'year' => $acc['year'] ]); if ($prs) { - $transactions[] = $prs; + // Check if the document is approved (unless includePreview is true) + if ($includePreview || $prs->getDoc()->isApproved()) { + $transactions[] = $prs; + } } } } @@ -397,12 +459,28 @@ class BankController extends AbstractController if (!$bank) throw $this->createNotFoundException(); + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + if (!array_key_exists('items', $params)) { - $transactions = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bid' => $acc['bid'], - 'bank' => $bank, - 'year'=>$acc['year'] - ]); + $query = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.bank = :bank') + ->andWhere('r.year = :year') + ->setParameter('bid', $acc['bid']) + ->setParameter('bank', $bank) + ->setParameter('year', $acc['year']); + + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + + $transactions = $query->getQuery()->getResult(); } else { $transactions = []; foreach ($params['items'] as $param) { @@ -413,7 +491,10 @@ class BankController extends AbstractController 'year'=>$acc['year'] ]); if ($prs) { - $transactions[] = $prs; + // Check if the document is approved (unless includePreview is true) + if ($includePreview || $prs->getDoc()->isApproved()) { + $transactions[] = $prs; + } } } } diff --git a/hesabixCore/src/Controller/CashdeskController.php b/hesabixCore/src/Controller/CashdeskController.php index c45374c..5d77de5 100644 --- a/hesabixCore/src/Controller/CashdeskController.php +++ b/hesabixCore/src/Controller/CashdeskController.php @@ -49,9 +49,17 @@ class CashdeskController extends AbstractController foreach ($datas as $data) { $bs = 0; $bd = 0; - $items = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'cashdesk' => $data - ]); + // Use query builder to filter by approved documents + $items = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.cashdesk = :cashdesk') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('cashdesk', $data) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); foreach ($items as $item) { $bs += $item->getBs(); $bd += $item->getBd(); @@ -131,8 +139,17 @@ class CashdeskController extends AbstractController $cashdesk = $entityManager->getRepository(Cashdesk::class)->findOneBy(['bid' => $acc['bid'], 'code' => $code]); if (!$cashdesk) throw $this->createNotFoundException(); - //check accounting docs - $rows = $entityManager->getRepository(HesabdariRow::class)->findby(['bid' => $acc['bid'], 'cashdesk' => $cashdesk]); + //check accounting docs - include both approved and preview documents for deletion check + $rows = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.cashdesk = :cashdesk') + ->setParameter('bid', $acc['bid']) + ->setParameter('cashdesk', $cashdesk) + ->getQuery() + ->getResult(); if (count($rows) > 0) return $this->json(['result' => 2]); @@ -177,9 +194,17 @@ class CashdeskController extends AbstractController foreach ($datas as $data) { $bs = 0; $bd = 0; - $items = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'cashdesk' => $data - ]); + // Use query builder to filter by approved documents + $items = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.cashdesk = :cashdesk') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('cashdesk', $data) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); foreach ($items as $item) { $bs += $item->getBs(); $bd += $item->getBd(); @@ -211,9 +236,23 @@ class CashdeskController extends AbstractController $bs = 0; $bd = 0; - $items = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'cashdesk' => $cashdesk - ]); + // Use query builder to filter by approved documents + $items = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.cashdesk = :cashdesk') + ->andWhere('r.year = :year') + ->andWhere('r.bid = :bid') + ->andWhere('r.money = :money') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('cashdesk', $cashdesk) + ->setParameter('year', $acc['year']) + ->setParameter('bid', $acc['bid']) + ->setParameter('money', $acc['money']) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); foreach ($items as $item) { $bs += $item->getBs(); @@ -251,11 +290,20 @@ class CashdeskController extends AbstractController $query = $entityManager->createQueryBuilder() ->select('r') ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') ->where('r.cashdesk = :cashdesk') ->andWhere('r.bid = :bid') ->setParameter('cashdesk', $cashdesk) ->setParameter('bid', $acc['bid']); + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + if (isset($params['startDate']) && isset($params['endDate'])) { $query->andWhere('r.doc.date BETWEEN :startDate AND :endDate') ->setParameter('startDate', $params['startDate']) @@ -293,12 +341,29 @@ class CashdeskController extends AbstractController $cashdesk = $entityManager->getRepository(Cashdesk::class)->findOneBy(['bid' => $acc['bid'], 'code' => $params['code']]); if (!$cashdesk) throw $this->createNotFoundException(); + + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + if (!array_key_exists('items', $params)) { - $transactions = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bid' => $acc['bid'], - 'cashdesk' => $cashdesk, - 'year'=>$acc['year'] - ]); + $query = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.cashdesk = :cashdesk') + ->andWhere('r.year = :year') + ->setParameter('bid', $acc['bid']) + ->setParameter('cashdesk', $cashdesk) + ->setParameter('year', $acc['year']); + + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + + $transactions = $query->getQuery()->getResult(); } else { $transactions = []; foreach ($params['items'] as $param) { @@ -309,7 +374,10 @@ class CashdeskController extends AbstractController 'year' => $acc['year'] ]); if ($prs) { - $transactions[] = $prs; + // Check if the document is approved (unless includePreview is true) + if ($includePreview || $prs->getDoc()->isApproved()) { + $transactions[] = $prs; + } } } } @@ -370,12 +438,28 @@ class CashdeskController extends AbstractController if (!$cashdesk) throw $this->createNotFoundException(); + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + if (!array_key_exists('items', $params)) { - $transactions = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bid' => $acc['bid'], - 'cashdesk' => $cashdesk, - 'year'=>$acc['year'] - ]); + $query = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.cashdesk = :cashdesk') + ->andWhere('r.year = :year') + ->setParameter('bid', $acc['bid']) + ->setParameter('cashdesk', $cashdesk) + ->setParameter('year', $acc['year']); + + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + + $transactions = $query->getQuery()->getResult(); } else { $transactions = []; foreach ($params['items'] as $param) { @@ -386,7 +470,10 @@ class CashdeskController extends AbstractController 'year'=>$acc['year'] ]); if ($prs) { - $transactions[] = $prs; + // Check if the document is approved (unless includePreview is true) + if ($includePreview || $prs->getDoc()->isApproved()) { + $transactions[] = $prs; + } } } } diff --git a/hesabixCore/src/Controller/CommodityController.php b/hesabixCore/src/Controller/CommodityController.php index be6dbfa..e2b16d3 100644 --- a/hesabixCore/src/Controller/CommodityController.php +++ b/hesabixCore/src/Controller/CommodityController.php @@ -133,10 +133,19 @@ class CommodityController extends AbstractController $data = array_map(function (Commodity $item) use ($entityManager, $acc, $explore) { $temp = $explore::ExploreCommodity($item); if (!$item->isKhadamat()) { - $rows = $entityManager->getRepository('App\Entity\HesabdariRow')->findBy([ - 'bid' => $acc['bid'], - 'commodity' => $item - ]); + // Use query builder to filter by approved documents + $rows = $entityManager->createQueryBuilder() + ->select('r') + ->from('App\Entity\HesabdariRow', 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.commodity = :commodity') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('bid', $acc['bid']) + ->setParameter('commodity', $item) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); $count = 0; foreach ($rows as $row) { if ($row->getDoc()->getType() === 'buy' || $row->getDoc()->getType() === 'open_balance') { @@ -184,10 +193,19 @@ class CommodityController extends AbstractController foreach ($items as $item) { $temp = Explore::ExploreCommodity($item); if (!$item->isKhadamat()) { - $rows = $entityManager->getRepository('App\Entity\HesabdariRow')->findBy([ - 'bid' => $acc['bid'], - 'commodity' => $item - ]); + // Use query builder to filter by approved documents + $rows = $entityManager->createQueryBuilder() + ->select('r') + ->from('App\Entity\HesabdariRow', 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.commodity = :commodity') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('bid', $acc['bid']) + ->setParameter('commodity', $item) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); $count = 0; foreach ($rows as $row) { if ($row->getDoc()->getType() === 'buy' || $row->getDoc()->getType() === 'open_balance') { @@ -288,10 +306,19 @@ class CommodityController extends AbstractController if ($item->isKhadamat()) { $temp['count'] = 0; } else { - $rows = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bid' => $acc['bid'], - 'commodity' => $item - ]); + // Use query builder to filter by approved documents + $rows = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.commodity = :commodity') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('bid', $acc['bid']) + ->setParameter('commodity', $item) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); $count = 0; foreach ($rows as $row) { if ($row->getDoc()->getType() == 'buy') { @@ -356,10 +383,19 @@ class CommodityController extends AbstractController if ($item->isKhadamat()) { $temp['count'] = 0; } else { - $rows = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bid' => $acc['bid'], - 'commodity' => $item - ]); + // Use query builder to filter by approved documents + $rows = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.commodity = :commodity') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('bid', $acc['bid']) + ->setParameter('commodity', $item) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); $count = 0; foreach ($rows as $row) { if ($row->getDoc()->getType() == 'buy') { @@ -452,10 +488,19 @@ class CommodityController extends AbstractController if ($item->isKhadamat()) { $temp['count'] = 0; } else { - $rows = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bid' => $acc['bid'], - 'commodity' => $item - ]); + // Use query builder to filter by approved documents + $rows = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.commodity = :commodity') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('bid', $acc['bid']) + ->setParameter('commodity', $item) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); $count = 0; foreach ($rows as $row) { if ($row->getDoc()->getType() == 'buy') { @@ -651,10 +696,19 @@ class CommodityController extends AbstractController if ($data->isKhadamat()) { $res['count'] = 0; } else { - $rows = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bid' => $acc['bid'], - 'commodity' => $data - ]); + // Use query builder to filter by approved documents + $rows = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.commodity = :commodity') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('bid', $acc['bid']) + ->setParameter('commodity', $data) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); foreach ($rows as $row) { if ($row->getDoc()->getType() == 'buy') { $count += $row->getCommdityCount(); @@ -1320,8 +1374,17 @@ class CommodityController extends AbstractController throw $this->createNotFoundException('کالا یافت نشد'); } - // بررسی اسناد حسابداری - $docs = $entityManager->getRepository(HesabdariRow::class)->findBy(['bid' => $acc['bid'], 'commodity' => $commodity]); + // بررسی اسناد حسابداری - include both approved and preview documents for deletion check + $docs = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.commodity = :commodity') + ->setParameter('bid', $acc['bid']) + ->setParameter('commodity', $commodity) + ->getQuery() + ->getResult(); if (count($docs) > 0) { return $this->json(['result' => 2, 'message' => 'این کالا در اسناد حسابداری استفاده شده و قابل حذف نیست']); } @@ -1371,7 +1434,17 @@ class CommodityController extends AbstractController continue; } - $docs = $entityManager->getRepository(HesabdariRow::class)->findBy(['bid' => $acc['bid'], 'commodity' => $commodity]); + // بررسی اسناد حسابداری - include both approved and preview documents for deletion check + $docs = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.commodity = :commodity') + ->setParameter('bid', $acc['bid']) + ->setParameter('commodity', $commodity) + ->getQuery() + ->getResult(); $storeDocs = $entityManager->getRepository(StoreroomItem::class)->findBy(['bid' => $acc['bid'], 'commodity' => $commodity]); if (count($docs) > 0 || count($storeDocs) > 0) { 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(); diff --git a/hesabixCore/src/Controller/MoadiyanController.php b/hesabixCore/src/Controller/MoadiyanController.php deleted file mode 100644 index c83a1b2..0000000 --- a/hesabixCore/src/Controller/MoadiyanController.php +++ /dev/null @@ -1,18 +0,0 @@ -render('moadiyan/index.html.twig', [ - 'controller_name' => 'MoadiyanController', - ]); - } -} diff --git a/hesabixCore/src/Controller/SalaryController.php b/hesabixCore/src/Controller/SalaryController.php index 1221233..d0c1e9d 100644 --- a/hesabixCore/src/Controller/SalaryController.php +++ b/hesabixCore/src/Controller/SalaryController.php @@ -46,9 +46,17 @@ class SalaryController extends AbstractController foreach ($datas as $data) { $bs = 0; $bd = 0; - $items = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'salary' => $data - ]); + // Use query builder to filter by approved documents + $items = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.salary = :salary') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('salary', $data) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); foreach ($items as $item) { $bs += $item->getBs(); $bd += $item->getBd(); @@ -73,9 +81,17 @@ class SalaryController extends AbstractController // محاسبه بدهکار و بستانکار و تراز $bs = 0; $bd = 0; - $items = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'salary' => $data - ]); + // Use query builder to filter by approved documents + $items = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.salary = :salary') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('salary', $data) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); foreach ($items as $item) { $bs += $item->getBs(); $bd += $item->getBd(); @@ -141,8 +157,17 @@ class SalaryController extends AbstractController $salary = $entityManager->getRepository(Salary::class)->findOneBy(['bid' => $acc['bid'], 'code' => $code]); if (!$salary) throw $this->createNotFoundException(); - //check accounting docs - $rows = $entityManager->getRepository(HesabdariRow::class)->findby(['bid' => $acc['bid'], 'salary' => $salary]); + //check accounting docs - include both approved and preview documents for deletion check + $rows = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.salary = :salary') + ->setParameter('bid', $acc['bid']) + ->setParameter('salary', $salary) + ->getQuery() + ->getResult(); if (count($rows) > 0) return $this->json(['result' => 2]); @@ -187,9 +212,17 @@ class SalaryController extends AbstractController foreach ($datas as $data) { $bs = 0; $bd = 0; - $items = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'salary' => $data - ]); + // Use query builder to filter by approved documents + $items = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.salary = :salary') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('salary', $data) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); foreach ($items as $item) { $bs += $item->getBs(); $bd += $item->getBd(); @@ -221,9 +254,17 @@ class SalaryController extends AbstractController $bs = 0; $bd = 0; - $items = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'salary' => $salary - ]); + // Use query builder to filter by approved documents + $items = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.salary = :salary') + ->andWhere('d.isApproved = :isApproved') + ->setParameter('salary', $salary) + ->setParameter('isApproved', true) + ->getQuery() + ->getResult(); foreach ($items as $item) { $bs += $item->getBs(); @@ -261,11 +302,20 @@ class SalaryController extends AbstractController $query = $entityManager->createQueryBuilder() ->select('r') ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') ->where('r.salary = :salary') ->andWhere('r.bid = :bid') ->setParameter('salary', $salary) ->setParameter('bid', $acc['bid']); + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + if (isset($params['startDate']) && isset($params['endDate'])) { $query->andWhere('r.doc.date BETWEEN :startDate AND :endDate') ->setParameter('startDate', $params['startDate']) @@ -303,12 +353,29 @@ class SalaryController extends AbstractController $salary = $entityManager->getRepository(Salary::class)->findOneBy(['bid' => $acc['bid'], 'code' => $params['code']]); if (!$salary) throw $this->createNotFoundException(); + + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + if (!array_key_exists('items', $params)) { - $transactions = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bid' => $acc['bid'], - 'salary' => $salary, - 'year' => $acc['year'], - ]); + $query = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.salary = :salary') + ->andWhere('r.year = :year') + ->setParameter('bid', $acc['bid']) + ->setParameter('salary', $salary) + ->setParameter('year', $acc['year']); + + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + + $transactions = $query->getQuery()->getResult(); } else { $transactions = []; if (is_array($params['items'])) { @@ -322,7 +389,10 @@ class SalaryController extends AbstractController 'year' => $acc['year'], ]); if ($row) { - $transactions[] = $row; + // Check if the document is approved (unless includePreview is true) + if ($includePreview || $row->getDoc()->isApproved()) { + $transactions[] = $row; + } } } } @@ -378,12 +448,29 @@ class SalaryController extends AbstractController $salary = $entityManager->getRepository(Salary::class)->findOneBy(['bid' => $acc['bid'], 'code' => $params['code']]); if (!$salary) throw $this->createNotFoundException(); + + // Check if includePreview parameter is provided + $includePreview = $params['includePreview'] ?? false; + if (!array_key_exists('items', $params)) { - $transactions = $entityManager->getRepository(HesabdariRow::class)->findBy([ - 'bid' => $acc['bid'], - 'salary' => $salary, - 'year' => $acc['year'], - ]); + $query = $entityManager->createQueryBuilder() + ->select('r') + ->from(HesabdariRow::class, 'r') + ->join('r.doc', 'd') + ->where('r.bid = :bid') + ->andWhere('r.salary = :salary') + ->andWhere('r.year = :year') + ->setParameter('bid', $acc['bid']) + ->setParameter('salary', $salary) + ->setParameter('year', $acc['year']); + + if (!$includePreview) { + // Default: only show approved documents + $query->andWhere('d.isApproved = :isApproved') + ->setParameter('isApproved', true); + } + + $transactions = $query->getQuery()->getResult(); } else { $transactions = []; if (is_array($params['items'])) { @@ -397,7 +484,10 @@ class SalaryController extends AbstractController 'year' => $acc['year'], ]); if ($row) { - $transactions[] = $row; + // Check if the document is approved (unless includePreview is true) + if ($includePreview || $row->getDoc()->isApproved()) { + $transactions[] = $row; + } } } }