diff --git a/hesabixCore/src/Controller/BusinessController.php b/hesabixCore/src/Controller/BusinessController.php index ebe3b55..f73b042 100644 --- a/hesabixCore/src/Controller/BusinessController.php +++ b/hesabixCore/src/Controller/BusinessController.php @@ -542,6 +542,7 @@ class BusinessController extends AbstractController 'plugAccproCloseYear' => true, 'plugAccproPresell' => true, 'plugRepservice' => true, + 'plugHrmDocs' => true, ]; } elseif ($perm) { $result = [ @@ -583,6 +584,7 @@ class BusinessController extends AbstractController 'plugAccproCloseYear' => $perm->isPlugAccproCloseYear(), 'plugRepservice' => $perm->isPlugRepservice(), 'plugAccproPresell' => $perm->isPlugAccproPresell(), + 'plugHrmDocs' => $perm->isPlugHrmDocs(), ]; } return $this->json($result); @@ -650,6 +652,7 @@ class BusinessController extends AbstractController $perm->setPlugAccproPresell($params['plugAccproPresell']); $perm->setPlugAccproAccounting($params['plugAccproAccounting']); $perm->setPlugRepservice($params['plugRepservice']); + $perm->setPlugHrmDocs($params['plugHrmDocs']); $entityManager->persist($perm); $entityManager->flush(); $log->insert('تنظیمات پایه', 'ویرایش دسترسی‌های کاربر با پست الکترونیکی ' . $user->getEmail(), $this->getUser(), $business); diff --git a/hesabixCore/src/Controller/CostController.php b/hesabixCore/src/Controller/CostController.php index 379f19b..e06e45a 100644 --- a/hesabixCore/src/Controller/CostController.php +++ b/hesabixCore/src/Controller/CostController.php @@ -269,10 +269,10 @@ class CostController extends AbstractController ->setParameter('today', $today); break; case 'custom': - if (isset($filters['dateFrom']) && isset($filters['dateTo'])) { + if (isset($filters['date']) && isset($filters['date']['from']) && isset($filters['date']['to'])) { $queryBuilder->andWhere('d.date BETWEEN :dateFrom AND :dateTo') - ->setParameter('dateFrom', $filters['dateFrom']) - ->setParameter('dateTo', $filters['dateTo']); + ->setParameter('dateFrom', $filters['date']['from']) + ->setParameter('dateTo', $filters['date']['to']); } break; } diff --git a/hesabixCore/src/Entity/Permission.php b/hesabixCore/src/Entity/Permission.php index 96ab27a..ec735fb 100644 --- a/hesabixCore/src/Entity/Permission.php +++ b/hesabixCore/src/Entity/Permission.php @@ -123,6 +123,9 @@ class Permission #[ORM\Column(nullable: true)] private ?bool $plugAccproPresell = null; + #[ORM\Column(nullable: true)] + private ?bool $plugHrmDocs = null; + public function getId(): ?int { return $this->id; @@ -560,4 +563,16 @@ class Permission return $this; } + public function isPlugHrmDocs(): ?bool + { + return $this->plugHrmDocs; + } + + public function setPlugHrmDocs(?bool $plugHrmDocs): static + { + $this->plugHrmDocs = $plugHrmDocs; + + return $this; + } + } diff --git a/webUI/package.json b/webUI/package.json index bc95449..f768ddc 100644 --- a/webUI/package.json +++ b/webUI/package.json @@ -20,6 +20,8 @@ "@vuelidate/core": "^2.0.3", "@vuelidate/validators": "^2.0.4", "@vueuse/core": "^13.1.0", + "@zxing/browser": "^0.1.5", + "@zxing/library": "^0.21.3", "animate.css": "^4.1.1", "apexcharts": "^4.6.0", "axios": "^1.8.4", @@ -27,6 +29,7 @@ "date-fns-jalali": "^3.2.0-0", "downloadjs": "^1.4.7", "file-saver": "^2.0.5", + "html5-qrcode": "^2.3.8", "jalali-moment": "^3.3.11", "libphonenumber-js": "^1.12.7", "lodash": "^4.17.21", @@ -42,6 +45,7 @@ "vue-loading-overlay": "^6.0.6", "vue-media-upload": "^2.2.4", "vue-persian-datetime-picker": "^2.10.4", + "vue-qrcode-reader": "^5.7.2", "vue-router": "^4.5.0", "vue-select": "^4.0.0-beta.6", "vue-spinner": "^1.0.4", @@ -49,6 +53,7 @@ "vue3-easy-data-table": "^1.5.47", "vue3-perfect-scrollbar": "^2.0.0", "vue3-persian-datetime-picker": "^1.2.2", + "vue3-qrcode-reader": "^0.0.1", "vue3-tel-input": "^1.0.4", "vue3-treeselect": "^0.1.10", "vue3-treeview": "^0.4.2", diff --git a/webUI/public/img/plugins/hmr.jpg b/webUI/public/img/plugins/hmr.jpg new file mode 100644 index 0000000..6811b00 Binary files /dev/null and b/webUI/public/img/plugins/hmr.jpg differ diff --git a/webUI/public/sounds/beep.mp3 b/webUI/public/sounds/beep.mp3 new file mode 100644 index 0000000..c734804 Binary files /dev/null and b/webUI/public/sounds/beep.mp3 differ diff --git a/webUI/src/components/application/buttons/ShortcutsButton.vue b/webUI/src/components/application/buttons/ShortcutsButton.vue new file mode 100644 index 0000000..585ec40 --- /dev/null +++ b/webUI/src/components/application/buttons/ShortcutsButton.vue @@ -0,0 +1,471 @@ + + + + + \ No newline at end of file diff --git a/webUI/src/components/application/buttons/notifications_btn.vue b/webUI/src/components/application/buttons/notifications_btn.vue index ce22cce..a7214a0 100644 --- a/webUI/src/components/application/buttons/notifications_btn.vue +++ b/webUI/src/components/application/buttons/notifications_btn.vue @@ -2,10 +2,17 @@ import { defineComponent } from 'vue' import axios from 'axios'; +interface NotificationItem { + id: number; + message: string; + date: string; + url: string; +} + export default defineComponent({ name: "notifications_btn", data: () => ({ - items: [], + items: [] as NotificationItem[], timeoutId: null as number | null, // برای ذخیره ID تایمر }), components: {}, @@ -19,7 +26,7 @@ export default defineComponent({ } }, methods: { - jump(item) { + jump(item: NotificationItem) { axios.post('/api/notifications/read/' + item.id).then((response) => { if (item.url.startsWith('http')) { window.location.href = item.url; @@ -46,7 +53,7 @@ export default defineComponent({