From dd78e12a7a40f2655bc31a337470543a58643048 Mon Sep 17 00:00:00 2001 From: Gloomy Date: Mon, 18 Aug 2025 19:53:48 +0000 Subject: [PATCH] update two-step ui/fix Warranty plugin bugs --- .../Plugins/PlugWarrantyController.php | 84 ++++++- hesabixCore/src/Entity/Business.php | 44 +++- webUI/src/views/acc/settings/bussiness.vue | 232 ++++++++---------- webUI/src/views/acc/storeroom/io/view.vue | 112 ++++++++- 4 files changed, 335 insertions(+), 137 deletions(-) diff --git a/hesabixCore/src/Controller/Plugins/PlugWarrantyController.php b/hesabixCore/src/Controller/Plugins/PlugWarrantyController.php index debc191..ccb9735 100644 --- a/hesabixCore/src/Controller/Plugins/PlugWarrantyController.php +++ b/hesabixCore/src/Controller/Plugins/PlugWarrantyController.php @@ -23,6 +23,7 @@ use App\Service\PluginService; use App\Service\SMS; use App\Service\registryMGR; use Symfony\Component\Validator\Constraints as Assert; +use App\Entity\StoreroomTicket; class PlugWarrantyController extends AbstractController { @@ -39,6 +40,66 @@ class PlugWarrantyController extends AbstractController } } + #[Route('/api/plugins/warranty/serials/by-storeroom-ticket/{code}', name: 'plugin_warranty_serials_by_storeroom_ticket', methods: ['GET'])] + public function plugin_warranty_serials_by_storeroom_ticket(string $code, Request $request, Access $access, EntityManagerInterface $entityManager, PluginService $pluginService): JsonResponse + { + $acc = $access->hasRole('store'); + if (!$acc) { + throw $this->createAccessDeniedException(); + } + if (!$pluginService->isActive('warranty', $acc['bid'])) { + return $this->json(['success' => false, 'message' => 'افزونه گارانتی فعال نیست'], 403); + } + + /** @var StoreroomTicket|null $ticket */ + $ticket = $entityManager->getRepository(StoreroomTicket::class)->findOneBy([ + 'bid' => $acc['bid'], + 'code' => $code, + ]); + if (!$ticket) { + return $this->json(['success' => false, 'message' => 'حواله یافت نشد'], 404); + } + + $doc = $ticket->getDoc(); + if (!$doc) { + return $this->json([ + 'success' => true, + 'ticketActivationCode' => $ticket->getActivationCode(), + 'items' => [] + ]); + } + + $serials = $entityManager->getRepository(PlugWarrantySerial::class)->createQueryBuilder('s') + ->andWhere('s.business = :bid') + ->andWhere('s.allocatedToDocumentId = :docId') + ->setParameter('bid', $acc['bid']) + ->setParameter('docId', $doc->getId()) + ->getQuery() + ->getResult(); + + $items = array_map(function (PlugWarrantySerial $s) use ($entityManager) { + $commodity = $s->getCommodity(); + return [ + 'serialNumber' => $s->getSerialNumber(), + 'commodity' => $commodity ? [ + 'id' => $commodity->getId(), + 'name' => $commodity->getName(), + 'code' => $commodity->getCode(), + ] : null, + 'status' => $s->getStatus(), + 'activation' => $s->getActivation(), + 'activationTicketCode' => $s->getActivationTicketCode(), + 'warrantyEndDate' => $s->getWarrantyEndDate()?->format('Y-m-d'), + ]; + }, $serials); + + return $this->json([ + 'success' => true, + 'ticketActivationCode' => $ticket->getActivationCode(), + 'items' => $items + ]); + } + private function expiredFlag(?\DateTimeImmutable $end): bool { return $end !== null && $end < new \DateTimeImmutable('today'); @@ -938,16 +999,18 @@ class PlugWarrantyController extends AbstractController } #[Route('/api/plugins/warranty/settings/get', name: 'plugin_warranty_settings_get', methods: ['GET'])] - public function plugin_warranty_settings_get(Access $access, registryMGR $registryMGR): JsonResponse + public function plugin_warranty_settings_get(Access $access, registryMGR $registryMGR, EntityManagerInterface $entityManager): JsonResponse { $acc = $access->hasRole('plugWarrantyManager'); if (!$acc) { throw $this->createAccessDeniedException(); } - $require = filter_var($registryMGR->get('warranty', 'requireWarrantyOnDelivery'), FILTER_VALIDATE_BOOLEAN); - $grace = (int) ($registryMGR->get('warranty', 'activationGraceDays') ?? 7); - $match = filter_var($registryMGR->get('warranty', 'matchWarrantyToSerial'), FILTER_VALIDATE_BOOLEAN); + $business = $entityManager->getRepository(Business::class)->find($acc['bid']); + + $require = filter_var($business->getRequireWarrantyOnDelivery(), FILTER_VALIDATE_BOOLEAN); + $grace = (int) ($business->getActivationGraceDays() ?? 7); + $match = filter_var($business->getMatchWarrantyToSerial(), FILTER_VALIDATE_BOOLEAN); return $this->json([ 'requireWarrantyOnDelivery' => (bool) $require, 'activationGraceDays' => max(0, $grace), @@ -956,22 +1019,27 @@ class PlugWarrantyController extends AbstractController } #[Route('/api/plugins/warranty/settings/save', name: 'plugin_warranty_settings_save', methods: ['POST'])] - public function plugin_warranty_settings_save(Request $request, Access $access, registryMGR $registryMGR): JsonResponse + public function plugin_warranty_settings_save(Request $request, Access $access, registryMGR $registryMGR, EntityManagerInterface $entityManager): JsonResponse { $acc = $access->hasRole('plugWarrantyManager'); if (!$acc) { throw $this->createAccessDeniedException(); } + $business = $entityManager->getRepository(Business::class)->find($acc['bid']); + $params = json_decode($request->getContent() ?: '{}', true); $require = isset($params['requireWarrantyOnDelivery']) && ($params['requireWarrantyOnDelivery'] === true || $params['requireWarrantyOnDelivery'] === '1' || $params['requireWarrantyOnDelivery'] === 1 || $params['requireWarrantyOnDelivery'] === 'true'); $graceDays = isset($params['activationGraceDays']) ? (int) $params['activationGraceDays'] : 7; if ($graceDays < 0) { $graceDays = 0; } $match = isset($params['matchWarrantyToSerial']) && ($params['matchWarrantyToSerial'] === true || $params['matchWarrantyToSerial'] === '1' || $params['matchWarrantyToSerial'] === 1 || $params['matchWarrantyToSerial'] === 'true'); - $registryMGR->update('warranty', 'requireWarrantyOnDelivery', $require ? '1' : '0'); - $registryMGR->update('warranty', 'activationGraceDays', (string) $graceDays); - $registryMGR->update('warranty', 'matchWarrantyToSerial', $match ? '1' : '0'); + $business->setRequireWarrantyOnDelivery($require); + $business->setActivationGraceDays($graceDays); + $business->setMatchWarrantyToSerial($match); + + $entityManager->flush(); + return $this->json(['success' => true]); } diff --git a/hesabixCore/src/Entity/Business.php b/hesabixCore/src/Entity/Business.php index 68263fb..08b7aac 100644 --- a/hesabixCore/src/Entity/Business.php +++ b/hesabixCore/src/Entity/Business.php @@ -325,6 +325,15 @@ class Business #[ORM\Column(length: 255, nullable: true)] private ?string $financialApprover = null; + #[ORM\Column(nullable: true)] + private ?bool $requireWarrantyOnDelivery = null; + + #[ORM\Column(nullable: true)] + private ?int $activationGraceDays = null; + + #[ORM\Column(nullable: true)] + private ?bool $matchWarrantyToSerial = null; + public function __construct() { $this->logs = new ArrayCollection(); @@ -2254,4 +2263,37 @@ class Business $this->financialApprover = $financialApprover; return $this; } -} + + public function getRequireWarrantyOnDelivery(): ?bool + { + return $this->requireWarrantyOnDelivery; + } + + public function setRequireWarrantyOnDelivery(?bool $requireWarrantyOnDelivery): static + { + $this->requireWarrantyOnDelivery = $requireWarrantyOnDelivery; + return $this; + } + + public function getActivationGraceDays(): ?int + { + return $this->activationGraceDays; + } + + public function setActivationGraceDays(?int $activationGraceDays): static + { + $this->activationGraceDays = $activationGraceDays; + return $this; + } + + public function getMatchWarrantyToSerial(): ?bool + { + return $this->matchWarrantyToSerial; + } + + public function setMatchWarrantyToSerial(?bool $matchWarrantyToSerial): static + { + $this->matchWarrantyToSerial = $matchWarrantyToSerial; + return $this; + } +} \ No newline at end of file diff --git a/webUI/src/views/acc/settings/bussiness.vue b/webUI/src/views/acc/settings/bussiness.vue index 977b156..e471896 100755 --- a/webUI/src/views/acc/settings/bussiness.vue +++ b/webUI/src/views/acc/settings/bussiness.vue @@ -310,142 +310,126 @@ - - -

تایید دومرحله‌ای

- - + + + + + تایید دومرحله‌ای + + -
+
با فعال‌سازی این گزینه، تمام فاکتورها، حواله‌های انبار، دریافت‌ها و پرداخت‌ها نیاز به تایید مدیر خواهند داشت.
- - - - - - -

تعیین تاییدکنندگان

- - -
- -