From 895fdd9b830cae826894afc3a494bceed989e1bd Mon Sep 17 00:00:00 2001 From: pcalengratha Date: Mon, 25 May 2026 11:08:52 +0700 Subject: [PATCH] init project --- .editorconfig | 18 + .env.example | 65 + .gitattributes | 11 + .gitignore | 46 +- README.md | 60 +- app/Console/Commands/DisableLabAccess.php | 52 + app/Console/Commands/NotifyExpireLab.php | 77 + app/Console/Kernel.php | 41 + app/Enums/DateFormatEnum.php | 29 + app/Enums/ExcelDesignEnum.php | 260 + app/Enums/RecordStatusEnum.php | 16 + app/Enums/SexEnum.php | 17 + app/Enums/UtilEnum.php | 33 + app/Exports/DoctorPhysicianExport.php | 147 + app/Exports/DoctorRawExport.php | 146 + app/Exports/DoctorSampleSourceExport.php | 145 + app/Exports/FinancialReportExport.php | 158 + app/Exports/InventoryOnHandExport.php | 147 + app/Exports/ItemExpiredExport.php | 147 + app/Exports/StockinExport.php | 147 + app/Exports/StockoutExport.php | 147 + app/Exports/SummaryReportExport.php | 147 + app/Helpers/Helpers.php | 162 + app/Helpers/SessionHelper.php | 20 + .../Controllers/ActivityLogsController.php | 74 + app/Http/Controllers/AntibioticController.php | 101 + app/Http/Controllers/Api/AuthController.php | 37 + .../Api/SampleResultController.php | 64 + .../Controllers/AppointmentController.php | 117 + app/Http/Controllers/Auth/AuthController.php | 48 + .../Auth/AuthenticatedSessionController.php | 72 + .../Auth/ConfirmablePasswordController.php | 44 + ...mailVerificationNotificationController.php | 27 + .../EmailVerificationPromptController.php | 23 + .../Auth/NewPasswordController.php | 65 + .../Auth/PasswordResetLinkController.php | 47 + .../Auth/RegisteredUserController.php | 54 + .../Auth/VerifyEmailController.php | 30 + app/Http/Controllers/BaseController.php | 73 + app/Http/Controllers/CommentController.php | 112 + app/Http/Controllers/Controller.php | 93 + app/Http/Controllers/DashboardController.php | 630 + app/Http/Controllers/DepartmentController.php | 108 + .../Controllers/Helper/GlobalController.php | 28 + app/Http/Controllers/InvoiceController.php | 327 + app/Http/Controllers/LabController.php | 486 + app/Http/Controllers/OrganismController.php | 110 + app/Http/Controllers/PatientController.php | 239 + .../Controllers/PatientTypeController.php | 115 + app/Http/Controllers/PhysicianController.php | 170 + .../Controllers/PublicationController.php | 121 + app/Http/Controllers/QuantityController.php | 100 + app/Http/Controllers/RepaymentController.php | 165 + app/Http/Controllers/ReportController.php | 1168 + app/Http/Controllers/RoleController.php | 193 + app/Http/Controllers/SampleController.php | 876 + .../Controllers/SampleSourceController.php | 106 + app/Http/Controllers/SampleTypeController.php | 133 + app/Http/Controllers/ShareController.php | 710 + app/Http/Controllers/TelegramController.php | 88 + app/Http/Controllers/TestController.php | 487 + app/Http/Controllers/TestGroupController.php | 81 + app/Http/Controllers/UserController.php | 321 + app/Http/Controllers/UtilController.php | 913 + app/Http/Middleware/Authenticate.php | 21 + app/Http/Middleware/Cors.php | 31 + app/Http/Middleware/EncryptCookies.php | 17 + app/Http/Middleware/Localization.php | 26 + .../PreventRequestsDuringMaintenance.php | 17 + .../Middleware/RedirectIfAuthenticated.php | 31 + app/Http/Middleware/SetLocale.php | 24 + app/Http/Middleware/TrimStrings.php | 18 + app/Http/Middleware/TrustHosts.php | 20 + app/Http/Middleware/TrustProxies.php | 23 + app/Http/Middleware/VerifyBaseLab.php | 34 + app/Http/Middleware/VerifyCsrfToken.php | 19 + app/Http/Requests/Auth/LoginRequest.php | 92 + app/Http/Requests/PatientCreateRequest.php | 43 + .../Requests/PatientTypeCreateRequest.php | 42 + app/Http/Requests/PatientUpdateRequest.php | 43 + app/Http/Requests/SampleCreateRequest.php | 106 + .../Requests/SampleDetailCreateRequest.php | 33 + app/Http/Requests/TestSampleCreateRequest.php | 41 + .../UpdateRequests/SampleUpdateRequest.php | 91 + .../TestSampleUpdateRequest.php | 39 + app/Http/Resources/AntibioticResource.php | 26 + app/Http/Resources/HeadingItemResource.php | 27 + app/Http/Resources/LaboratoryResource.php | 24 + app/Http/Resources/OrganismResource.php | 19 + app/Http/Resources/PatientSampleResource.php | 19 + app/Http/Resources/SampleResource.php | 43 + app/Http/Resources/SampleTestResource.php | 23 + app/Http/Resources/SampleTypeResource.php | 31 + app/Http/Resources/TestResource.php | 31 + app/Http/Resources/TestSampleResource.php | 59 + app/Http/Resources/UserResource.php | 31 + app/Listeners/LogUserLogin.php | 32 + app/Listeners/LogUserLogout.php | 31 + app/Models/Antibiotic.php | 29 + app/Models/AntibioticResult.php | 25 + app/Models/Appointment.php | 35 + app/Models/BaseModel.php | 69 + app/Models/Comment.php | 26 + app/Models/Commune.php | 22 + app/Models/Department.php | 43 + app/Models/District.php | 21 + app/Models/Invoice.php | 57 + app/Models/InvoiceDetail.php | 33 + app/Models/Laboratory.php | 50 + app/Models/Module.php | 19 + app/Models/Organism.php | 27 + app/Models/OrganismResult.php | 24 + app/Models/Patient.php | 74 + app/Models/PatientTelegram.php | 37 + app/Models/PatientType.php | 23 + app/Models/Physician.php | 28 + app/Models/PhysicianCommission.php | 32 + app/Models/Province.php | 22 + app/Models/Publication.php | 30 + app/Models/PublicationReceiver.php | 25 + app/Models/Quantity.php | 26 + app/Models/RejectComment.php | 29 + app/Models/Repayment.php | 59 + app/Models/Role.php | 27 + app/Models/RoleHasPermission.php | 19 + app/Models/Sample.php | 214 + app/Models/SampleDetail.php | 35 + app/Models/SampleSource.php | 30 + app/Models/SampleSourceTelegram.php | 37 + app/Models/SampleType.php | 38 + app/Models/Supplier.php | 43 + app/Models/Test.php | 29 + app/Models/TestCategory.php | 27 + app/Models/TestGroup.php | 30 + app/Models/TestGroupDetail.php | 26 + app/Models/TestNormalValue.php | 25 + app/Models/TestResult.php | 39 + app/Models/TestSample.php | 63 + app/Models/TestSampleOrganism.php | 31 + app/Models/Traits/HasLocalizedName.php | 21 + app/Models/User.php | 54 + app/Models/UserLabCover.php | 20 + app/Models/Village.php | 22 + app/Providers/AppServiceProvider.php | 55 + app/Providers/AuthServiceProvider.php | 39 + app/Providers/BroadcastServiceProvider.php | 21 + app/Providers/EventServiceProvider.php | 41 + app/Providers/RouteServiceProvider.php | 52 + app/Providers/TelescopeServiceProvider.php | 71 + app/Traits/AuditLogTrait.php | 19 + app/View/Components/Alert.php | 26 + app/View/Components/AppLayout.php | 18 + app/View/Components/GuestLayout.php | 18 + artisan | 18 + bootstrap/app.php | 20 + bootstrap/cache/.gitignore | 2 + bootstrap/providers.php | 5 + composer.json | 102 + composer.lock | 11611 ++++ config/app.php | 137 + config/auth.php | 115 + config/broadcasting.php | 59 + config/cache.php | 117 + config/cors.php | 34 + config/database.php | 183 + config/excel.php | 333 + config/filesystems.php | 80 + config/labis.php | 51 + config/logging.php | 118 + config/mail.php | 118 + config/queue.php | 129 + config/services.php | 38 + config/session.php | 217 + config/telegram.php | 191 + config/telescope.php | 182 + config/view.php | 36 + database/.gitignore | 1 + database/factories/UserFactory.php | 44 + .../0001_01_01_000000_create_users_table.php | 49 + .../0001_01_01_000001_create_cache_table.php | 35 + .../0001_01_01_000002_create_jobs_table.php | 57 + ...03_14_211002_create_activity_log_table.php | 27 + ...add_event_column_to_activity_log_table.php | 22 + ...atch_uuid_column_to_activity_log_table.php | 22 + database/seeders/DatabaseSeeder.php | 25 + lang/en/antibiotic.php | 26 + lang/en/appointment.php | 16 + lang/en/auth.php | 19 + lang/en/comment.php | 29 + lang/en/department.php | 29 + lang/en/general.php | 102 + lang/en/inventory.php | 18 + lang/en/invoice.php | 85 + lang/en/lab_profile.php | 42 + lang/en/laboratory.php | 51 + lang/en/lang.php | 49 + lang/en/login.php | 15 + lang/en/opd_visit.php | 230 + lang/en/organism.php | 28 + lang/en/pagination.php | 19 + lang/en/passwords.php | 22 + lang/en/patient.php | 77 + lang/en/patient_type.php | 33 + lang/en/permission.php | 72 + lang/en/physician.php | 33 + lang/en/quantity.php | 26 + lang/en/report.php | 30 + lang/en/sample.php | 113 + lang/en/sample_source.php | 27 + lang/en/sample_type.php | 34 + lang/en/sidebar.php | 58 + lang/en/system_role.php | 28 + lang/en/test_sample.php | 68 + lang/en/user_account.php | 53 + lang/en/vaccination.php | 26 + lang/en/validation.php | 151 + lang/kh/antibiotic.php | 26 + lang/kh/appointment.php | 20 + lang/kh/auth.php | 19 + lang/kh/comment.php | 29 + lang/kh/department.php | 29 + lang/kh/general.php | 94 + lang/kh/inventory.php | 19 + lang/kh/invoice.php | 85 + lang/kh/lab_profile.php | 41 + lang/kh/laboratory.php | 52 + lang/kh/lang.php | 45 + lang/kh/login.php | 15 + lang/kh/medicine_vacc.php | 23 + lang/kh/opd_visit.php | 231 + lang/kh/organism.php | 27 + lang/kh/patient.php | 76 + lang/kh/patient_type.php | 33 + lang/kh/permission.php | 72 + lang/kh/physician.php | 31 + lang/kh/quantity.php | 26 + lang/kh/report.php | 26 + lang/kh/sample.php | 113 + lang/kh/sample_source.php | 25 + lang/kh/sample_type.php | 33 + lang/kh/sidebar.php | 60 + lang/kh/system_role.php | 29 + lang/kh/test_sample.php | 68 + lang/kh/user_account.php | 53 + lang/kh/vaccination.php | 26 + lang/kh/validation.php | 151 + package.json | 17 + phpunit.xml | 35 + public/.htaccess | 25 + public/favicon.ico | 0 public/index.php | 20 + public/robots.txt | 2 + resources/css/app.css | 11 + resources/js/app.js | 1 + resources/js/bootstrap.js | 4 + resources/views/activity_logs.blade.php | 150 + resources/views/aggregate_report.blade.php | 210 + resources/views/antibiotic.blade.php | 162 + resources/views/appointment.blade.php | 272 + .../views/audit-logs/index.blade copy.php | 201 + resources/views/audit-logs/index.blade.php | 284 + .../views/auth/confirm-password.blade.php | 36 + .../views/auth/forgot-password.blade.php | 36 + resources/views/auth/login.blade.php | 56 + resources/views/auth/register.blade.php | 59 + resources/views/auth/reset-password.blade.php | 48 + resources/views/auth/verify-email.blade.php | 39 + resources/views/bacteriology_report.blade.php | 93 + resources/views/base.blade.php | 198 + resources/views/clone_lab.blade.php | 159 + resources/views/comment.blade.php | 174 + resources/views/components/alert.blade.php | 46 + .../components/application-logo.blade.php | 38 + .../views/components/auth-card.blade.php | 9 + .../components/auth-session-status.blade.php | 7 + .../auth-validation-errors.blade.php | 16 + resources/views/components/button.blade.php | 3 + .../views/components/dropdown-link.blade.php | 1 + resources/views/components/dropdown.blade.php | 43 + resources/views/components/input.blade.php | 3 + resources/views/components/label.blade.php | 5 + resources/views/components/nav-link.blade.php | 11 + .../components/responsive-nav-link.blade.php | 11 + resources/views/dashboard.blade.php | 532 + resources/views/department.blade.php | 164 + resources/views/doctor_report.blade.php | 207 + resources/views/edit_vaccination.blade.php | 633 + resources/views/errors/404.blade.php | 64 + resources/views/expired_item.blade.php | 45 + resources/views/financial_report.blade.php | 256 + resources/views/home.blade.php | 411 + resources/views/individual_report.blade.php | 99 + resources/views/inventory.blade.php | 203 + resources/views/invoice_list.blade.php | 45 + resources/views/lab_profile.blade.php | 570 + resources/views/laboratory.blade.php | 762 + resources/views/layout/breadscrum.blade.php | 0 .../views/layout/common_script.blade.php | 204 + resources/views/layout/footer.blade.php | 10 + resources/views/layout/header.blade.php | 53 + resources/views/layout/loading.blade.php | 18 + resources/views/layout/navbar.blade.php | 129 + resources/views/layout/sidebar.blade.php | 91 + resources/views/layouts/app.blade.php | 36 + resources/views/layouts/guest.blade.php | 24 + resources/views/layouts/navigation.blade.php | 92 + resources/views/login.blade.php | 151 + resources/views/medicine.blade.php | 289 + resources/views/medicine_group.blade.php | 204 + resources/views/medicine_unit.blade.php | 193 + resources/views/modal/appointment.blade.php | 91 + resources/views/modal/assign_test.blade.php | 108 + .../doctor_report_detail_print.blade.php | 326 + .../views/modal/doctor_report_print.blade.php | 342 + .../sample_result_1.blade.php | 80 + .../sample_result_2.blade.php | 63 + .../modal/financial_report_print.blade.php | 370 + .../modal/inventory_onhand_print.blade.php | 318 + resources/views/modal/invoice.blade.php | 196 + .../views/modal/organism_result.blade.php | 59 + .../views/modal/preview_invoice.blade.php | 461 + .../riel_invoice.blade.php | 499 + .../usd_invoice.blade.php | 580 + .../usd_invoice_summary.blade.php | 444 + .../usd_invoice_t3.blade.php | 591 + .../usd_invoice_t4.blade.php | 408 + .../views/modal/preview_result.blade.php | 427 + .../preview_result_1.blade.php | 713 + ..._result_1_margin_default_firefox.blade.php | 543 + ...result_1_margin_default_noheader.blade.php | 597 + ...preview_result_1_previous_sample.blade.php | 758 + .../preview_result_2.blade.php | 445 + ...view_result_2_backup_for_Anapath.blade.php | 357 + .../preview_result_3.blade.php | 801 + .../preview_result_4.blade.php | 764 + .../preview_result_4_old.blade.php | 451 + .../preview_result_5.blade.php | 348 + .../preview_result_6.blade.php | 356 + .../preview_result_7.blade.php | 392 + .../preview_vaccination_invoice.blade.php | 480 + .../preview_vaccination_invoice_.blade.php | 540 + resources/views/modal/repayment.blade.php | 129 + .../views/modal/sample_label_print.blade.php | 43 + resources/views/modal/sample_result.blade.php | 68 + .../views/modal/stock_in_print.blade.php | 303 + .../views/modal/stock_out_print.blade.php | 312 + .../modal/summary_report_print.blade.php | 357 + .../views/modal/test_sample_formula.blade.php | 50 + .../views/modal/vaccination_print.blade.php | 306 + resources/views/my_profiles.blade.php | 272 + resources/views/need_restock.blade.php | 45 + resources/views/new_patient.blade.php | 238 + resources/views/new_patient_bk.blade.php | 204 + resources/views/new_payment.blade.php | 45 + resources/views/new_sample.blade.php | 432 + resources/views/new_vaccination.blade.php | 603 + resources/views/organism.blade.php | 170 + resources/views/pagination/custom.blade.php | 44 + .../views/pagination/custom_bk.blade.php | 41 + .../partials/language_switcher.blade.php | 13 + .../views/partials/patient_list.blade.php | 64 + resources/views/patient-type.blade.php | 229 + resources/views/patient.blade.php | 359 + resources/views/physician.blade.php | 355 + resources/views/publication.blade.php | 344 + resources/views/quantity.blade.php | 152 + resources/views/read_message.blade.php | 66 + resources/views/repayment.blade.php | 153 + resources/views/result_config.blade.php | 45 + resources/views/role.blade.php | 203 + resources/views/sample-type.blade.php | 206 + resources/views/sample.blade.php | 187 + resources/views/sample_edition.blade.php | 733 + resources/views/sample_source.blade.php | 199 + resources/views/search.blade.php | 193 + .../views/shared/anonymous_login.blade.php | 272 + .../views/shared/patient_profile.blade.php | 292 + .../views/shared/patient_register.blade.php | 91 + .../views/shared/preview_result.blade.php | 550 + resources/views/shared/test_result.blade.php | 69 + .../shared/test_result_1_deletable.blade.php | 555 + .../shared/test_result_3_backup.blade.php | 695 + .../shared/test_result_3_deletable.blade.php | 70 + .../shared/test_result_4_deletable.blade.php | 960 + resources/views/single_sample.blade.php | 404 + resources/views/stock_in.blade.php | 451 + resources/views/stock_out.blade.php | 370 + resources/views/supplier.blade.php | 240 + resources/views/test.blade.php | 577 + resources/views/test_profile.blade.php | 45 + resources/views/user_account.blade.php | 310 + resources/views/user_profile.blade.php | 155 + .../views/v_invoice/edit_invoice.blade.php | 371 + resources/views/v_invoice/invoice.blade.php | 282 + .../views/v_invoice/new_invoice.blade.php | 162 + .../views/v_invoice/report_filter.blade.php | 41 + resources/views/vaccination.blade.php | 207 + resources/views/welcome.blade.php | 277 + routes/api.php | 27 + routes/auth.php | 58 + routes/channels.php | 18 + routes/console.php | 8 + routes/web.php | 414 + storage/app/private/.gitignore | 2 + .../maps/horizontal-layout-dark/style.css.map | 1 + .../horizontal-layout-light/style.css.map | 1 + .../css/maps/horizontal-layout/style.css.map | 1 + .../maps/vertical-layout-dark/style.css.map | 1 + .../maps/vertical-layout-light/style.css.map | 1 + storage/app/public/assets/css/overwrite.css | 475 + .../public/assets/css/overwrite.select2.css | 82 + storage/app/public/assets/css/scrollbars.css | 427 + storage/app/public/assets/css/search_test.css | 35 + .../css/vertical-layout-light/style.css | 25948 +++++++ storage/app/public/assets/fonts/Hanuman.ttf | Bin 0 -> 128376 bytes storage/app/public/assets/fonts/KhmerOS.ttf | Bin 0 -> 265552 bytes .../public/assets/fonts/KhmerOS_muollight.ttf | Bin 0 -> 232832 bytes .../assets/fonts/NimbusMono-Regular.otf | Bin 0 -> 80480 bytes .../assets/fonts/Poppins/Poppins-Black.eot | Bin 0 -> 144008 bytes .../assets/fonts/Poppins/Poppins-Black.ttf | Bin 0 -> 143724 bytes .../assets/fonts/Poppins/Poppins-Black.woff | Bin 0 -> 66008 bytes .../assets/fonts/Poppins/Poppins-Black.woff2 | Bin 0 -> 47600 bytes .../assets/fonts/Poppins/Poppins-Bold.eot | Bin 0 -> 146164 bytes .../assets/fonts/Poppins/Poppins-Bold.ttf | Bin 0 -> 145900 bytes .../assets/fonts/Poppins/Poppins-Bold.woff | Bin 0 -> 67468 bytes .../assets/fonts/Poppins/Poppins-Bold.woff2 | Bin 0 -> 48748 bytes .../fonts/Poppins/Poppins-ExtraBold.eot | Bin 0 -> 145212 bytes .../fonts/Poppins/Poppins-ExtraBold.ttf | Bin 0 -> 144912 bytes .../fonts/Poppins/Poppins-ExtraBold.woff | Bin 0 -> 67452 bytes .../fonts/Poppins/Poppins-ExtraBold.woff2 | Bin 0 -> 48840 bytes .../assets/fonts/Poppins/Poppins-Light.eot | Bin 0 -> 151392 bytes .../assets/fonts/Poppins/Poppins-Light.ttf | Bin 0 -> 151108 bytes .../assets/fonts/Poppins/Poppins-Light.woff | Bin 0 -> 68108 bytes .../assets/fonts/Poppins/Poppins-Light.woff2 | Bin 0 -> 48956 bytes .../assets/fonts/Poppins/Poppins-Medium.eot | Bin 0 -> 148468 bytes .../assets/fonts/Poppins/Poppins-Medium.ttf | Bin 0 -> 148180 bytes .../assets/fonts/Poppins/Poppins-Medium.woff | Bin 0 -> 67868 bytes .../assets/fonts/Poppins/Poppins-Medium.woff2 | Bin 0 -> 49000 bytes .../assets/fonts/Poppins/Poppins-Regular.eot | Bin 0 -> 150216 bytes .../assets/fonts/Poppins/Poppins-Regular.ttf | Bin 0 -> 149940 bytes .../assets/fonts/Poppins/Poppins-Regular.woff | Bin 0 -> 68032 bytes .../fonts/Poppins/Poppins-Regular.woff2 | Bin 0 -> 49048 bytes .../assets/fonts/Poppins/Poppins-SemiBold.eot | Bin 0 -> 147092 bytes .../assets/fonts/Poppins/Poppins-SemiBold.ttf | Bin 0 -> 146796 bytes .../fonts/Poppins/Poppins-SemiBold.woff | Bin 0 -> 67320 bytes .../fonts/Poppins/Poppins-SemiBold.woff2 | Bin 0 -> 48508 bytes .../assets/fonts/SourceSerifPro-Bold.ttf | Bin 0 -> 113188 bytes .../assets/fonts/SourceSerifPro-Regular.ttf | Bin 0 -> 113640 bytes storage/app/public/assets/fonts/Tacteng.ttf | Bin 0 -> 200892 bytes .../public/assets/fonts/times_new_roman.ttf | Bin 0 -> 68372 bytes storage/app/public/assets/gulpfile.js | 236 + .../images/Untitled-1_03-removebg-preview.png | Bin 0 -> 83178 bytes .../app/public/assets/images/faces/face5.png | Bin 0 -> 369060 bytes storage/app/public/assets/images/favicon.png | Bin 0 -> 2641 bytes .../images/labsettings/result_footer.png | Bin 0 -> 3084 bytes .../images/labsettings/result_header_1.png | Bin 0 -> 8083 bytes .../images/labsettings/result_header_2.png | Bin 0 -> 7116 bytes .../images/labsettings/result_header_3.png | Bin 0 -> 20939 bytes .../images/labsettings/result_header_4.png | Bin 0 -> 21101 bytes .../app/public/assets/images/logo-dark.png | Bin 0 -> 94215 bytes .../app/public/assets/images/logo-dark.svg | 15 + .../app/public/assets/images/logo-dark_.png | Bin 0 -> 229958 bytes .../public/assets/images/logo-dark_old.png | Bin 0 -> 49859 bytes .../app/public/assets/images/logo-mini.png | Bin 0 -> 49859 bytes .../app/public/assets/images/logo-mini.svg | 20 + storage/app/public/assets/images/logo.png | Bin 0 -> 67907 bytes storage/app/public/assets/images/logo.svg | 15 + .../app/public/assets/images/sprites/blue.png | Bin 0 -> 3044 bytes .../app/public/assets/images/sprites/dark.png | Bin 0 -> 3104 bytes .../app/public/assets/images/sprites/flag.png | Bin 0 -> 400 bytes .../public/assets/images/sprites/green.png | Bin 0 -> 3037 bytes .../assets/images/sprites/jsgrid-icons.png | Bin 0 -> 2874 bytes .../app/public/assets/images/sprites/red.png | Bin 0 -> 3080 bytes .../public/assets/images/sprites/yellow.png | Bin 0 -> 3040 bytes storage/app/public/assets/js/ace.js | 7 + .../app/public/assets/js/admin/antibiotic.js | 107 + .../app/public/assets/js/admin/assign_test.js | 486 + .../calculation_results/calculateTestValue.js | 30 + .../math-expression-evaluator.js | 1462 + .../admin/calculation_results/test_script.js | 254 + .../calculation_results/underscore-min.js | 6 + storage/app/public/assets/js/admin/comment.js | 139 + .../app/public/assets/js/admin/department.js | 115 + .../admin/enter_result_forms/test_result_1.js | 598 + .../admin/enter_result_forms/test_result_2.js | 161 + .../app/public/assets/js/admin/global_funs.js | 313 + storage/app/public/assets/js/admin/invoice.js | 163 + .../app/public/assets/js/admin/laboratory.js | 134 + .../app/public/assets/js/admin/medication.js | 175 + .../app/public/assets/js/admin/medicine.js | 218 + .../public/assets/js/admin/medicine_group.js | 113 + .../assets/js/admin/medicine_purchase.js | 176 + .../assets/js/admin/medicine_release.js | 81 + .../public/assets/js/admin/medicine_unit.js | 107 + .../app/public/assets/js/admin/opdvisit.js | 113 + .../app/public/assets/js/admin/organism.js | 113 + storage/app/public/assets/js/admin/patient.js | 106 + .../public/assets/js/admin/patient_type.js | 127 + .../app/public/assets/js/admin/physician.js | 67 + .../public/assets/js/admin/preview_result.js | 193 + .../preview_result_forms/preview_result_1.js | 206 + .../preview_result_1_11_jan_2024.js | 206 + .../preview_result_1_previous_sample.js | 257 + .../preview_result_forms/preview_result_2.js | 88 + .../preview_result_2_anapath_backup.js | 91 + .../preview_result_forms/preview_result_3.js | 92 + .../preview_result_forms/preview_result_4.js | 144 + .../preview_result_forms/preview_result_4_.js | 188 + .../preview_result_forms/preview_result_5.js | 92 + .../preview_result_forms/preview_result_6.js | 104 + .../preview_result_forms/preview_result_7.js | 90 + .../app/public/assets/js/admin/quantity.js | 105 + .../public/assets/js/admin/request_test.js | 486 + storage/app/public/assets/js/admin/role.js | 173 + storage/app/public/assets/js/admin/sample.js | 162 + .../public/assets/js/admin/sample_lists.js | 9 + .../public/assets/js/admin/sample_source.js | 112 + .../app/public/assets/js/admin/sample_type.js | 141 + .../app/public/assets/js/admin/search_test.js | 250 + .../app/public/assets/js/admin/supplier.js | 117 + storage/app/public/assets/js/admin/test.js | 696 + .../app/public/assets/js/admin/test_result.js | 524 + storage/app/public/assets/js/admin/user.js | 204 + .../app/public/assets/js/admin/vaccination.js | 262 + storage/app/public/assets/js/alerts.js | 102 + storage/app/public/assets/js/avgrund.js | 21 + .../app/public/assets/js/bootstrap-table.js | 66 + storage/app/public/assets/js/bt-maxLength.js | 31 + storage/app/public/assets/js/c3.js | 218 + storage/app/public/assets/js/calendar.js | 73 + storage/app/public/assets/js/chart.js | 352 + storage/app/public/assets/js/chartist.js | 217 + .../app/public/assets/js/circle-progress.js | 8 + storage/app/public/assets/js/clipboard.js | 10 + storage/app/public/assets/js/codeEditor.js | 121 + storage/app/public/assets/js/codemirror.js | 51 + storage/app/public/assets/js/context-menu.js | 240 + storage/app/public/assets/js/dashboard.js | 1654 + storage/app/public/assets/js/data-table.js | 25 + storage/app/public/assets/js/db.js | 907 + storage/app/public/assets/js/demo.js | 10 + .../public/assets/js/desktop-notification.js | 80 + storage/app/public/assets/js/dragula.js | 16 + storage/app/public/assets/js/dropify.js | 4 + storage/app/public/assets/js/dropzone.js | 6 + storage/app/public/assets/js/editorDemo.js | 221 + storage/app/public/assets/js/file-upload.js | 12 + storage/app/public/assets/js/flot-chart.js | 563 + storage/app/public/assets/js/form-addons.js | 146 + storage/app/public/assets/js/form-repeater.js | 38 + .../app/public/assets/js/form-validation.js | 97 + storage/app/public/assets/js/formpickers.js | 40 + storage/app/public/assets/js/google-charts.js | 242 + storage/app/public/assets/js/google-maps.js | 698 + .../public/assets/js/hoverable-collapse.js | 25 + .../app/public/assets/js/ion-range-slider.js | 189 + storage/app/public/assets/js/jq.tablesort.js | 123 + .../public/assets/js/jquery-file-upload.js | 9 + storage/app/public/assets/js/js-grid.js | 192 + storage/app/public/assets/js/just-gage.js | 193 + storage/app/public/assets/js/light-gallery.js | 18 + storage/app/public/assets/js/lightgallery.js | 18 + storage/app/public/assets/js/listify.js | 8 + storage/app/public/assets/js/mapael.js | 10 + .../app/public/assets/js/mapael_example_1.js | 9073 +++ .../app/public/assets/js/mapael_example_2.js | 173 + storage/app/public/assets/js/maps.js | 215 + storage/app/public/assets/js/modal-demo.js | 12 + storage/app/public/assets/js/morris.js | 239 + storage/app/public/assets/js/no-ui-slider.js | 294 + storage/app/public/assets/js/off-canvas.js | 8 + storage/app/public/assets/js/owl-carousel.js | 134 + storage/app/public/assets/js/paginate.js | 23 + storage/app/public/assets/js/popover.js | 32 + storage/app/public/assets/js/profile-demo.js | 9 + storage/app/public/assets/js/progress-bar.js | 239 + storage/app/public/assets/js/rickshaw.js | 330 + storage/app/public/assets/js/select2.js | 20 + storage/app/public/assets/js/settings.js | 85 + storage/app/public/assets/js/sparkline.js | 79 + storage/app/public/assets/js/tablesorter.js | 11 + storage/app/public/assets/js/tabs.js | 48 + storage/app/public/assets/js/template.js | 113 + storage/app/public/assets/js/tight-grid.js | 9 + storage/app/public/assets/js/toastDemo.js | 86 + storage/app/public/assets/js/todolist.js | 34 + storage/app/public/assets/js/tooltips.js | 33 + storage/app/public/assets/js/typeahead.js | 60 + storage/app/public/assets/js/wizard.js | 53 + storage/app/public/assets/js/x-editable.js | 162 + .../libs/alertifyjs/build/alertify.min.js | 3 + .../libs/alertifyjs/build/alertifyjs.zip | Bin 0 -> 71732 bytes .../alertifyjs/build/css/alertify.min.css | 6 + .../alertifyjs/build/css/alertify.rtl.min.css | 6 + .../build/css/themes/bootstrap.min.css | 6 + .../build/css/themes/bootstrap.rtl.min.css | 6 + .../build/css/themes/default.min.css | 6 + .../build/css/themes/default.rtl.min.css | 6 + .../build/css/themes/semantic.min.css | 6 + .../build/css/themes/semantic.rtl.min.css | 6 + .../css/bootstrap-datepicker.min.css | 7 + .../bootstrap-datepicker.standalone.min.css | 7 + .../css/bootstrap-datepicker3.min.css | 7 + .../bootstrap-datepicker3.standalone.min.css | 7 + .../js/bootstrap-datepicker.min.js | 8 + .../locales/bootstrap-datepicker-en-CA.min.js | 1 + .../locales/bootstrap-datepicker.ar-tn.min.js | 1 + .../locales/bootstrap-datepicker.ar.min.js | 1 + .../locales/bootstrap-datepicker.az.min.js | 1 + .../locales/bootstrap-datepicker.bg.min.js | 1 + .../locales/bootstrap-datepicker.bm.min.js | 1 + .../locales/bootstrap-datepicker.bn.min.js | 1 + .../locales/bootstrap-datepicker.br.min.js | 1 + .../locales/bootstrap-datepicker.bs.min.js | 1 + .../locales/bootstrap-datepicker.ca.min.js | 1 + .../locales/bootstrap-datepicker.cs.min.js | 1 + .../locales/bootstrap-datepicker.cy.min.js | 1 + .../locales/bootstrap-datepicker.da.min.js | 1 + .../locales/bootstrap-datepicker.de.min.js | 1 + .../locales/bootstrap-datepicker.el.min.js | 1 + .../locales/bootstrap-datepicker.en-AU.min.js | 1 + .../locales/bootstrap-datepicker.en-CA.min.js | 1 + .../locales/bootstrap-datepicker.en-GB.min.js | 1 + .../locales/bootstrap-datepicker.en-IE.min.js | 1 + .../locales/bootstrap-datepicker.en-NZ.min.js | 1 + .../locales/bootstrap-datepicker.en-ZA.min.js | 1 + .../locales/bootstrap-datepicker.eo.min.js | 1 + .../locales/bootstrap-datepicker.es.min.js | 1 + .../locales/bootstrap-datepicker.et.min.js | 1 + .../locales/bootstrap-datepicker.eu.min.js | 1 + .../locales/bootstrap-datepicker.fa.min.js | 1 + .../locales/bootstrap-datepicker.fi.min.js | 1 + .../locales/bootstrap-datepicker.fo.min.js | 1 + .../locales/bootstrap-datepicker.fr-CH.min.js | 1 + .../locales/bootstrap-datepicker.fr.min.js | 1 + .../locales/bootstrap-datepicker.gl.min.js | 1 + .../locales/bootstrap-datepicker.he.min.js | 1 + .../locales/bootstrap-datepicker.hi.min.js | 1 + .../locales/bootstrap-datepicker.hr.min.js | 1 + .../locales/bootstrap-datepicker.hu.min.js | 1 + .../locales/bootstrap-datepicker.hy.min.js | 1 + .../locales/bootstrap-datepicker.id.min.js | 1 + .../locales/bootstrap-datepicker.is.min.js | 1 + .../locales/bootstrap-datepicker.it-CH.min.js | 1 + .../locales/bootstrap-datepicker.it.min.js | 1 + .../locales/bootstrap-datepicker.ja.min.js | 1 + .../locales/bootstrap-datepicker.ka.min.js | 1 + .../locales/bootstrap-datepicker.kh.min.js | 1 + .../locales/bootstrap-datepicker.kk.min.js | 1 + .../locales/bootstrap-datepicker.km.min.js | 1 + .../locales/bootstrap-datepicker.ko.min.js | 1 + .../locales/bootstrap-datepicker.kr.min.js | 1 + .../locales/bootstrap-datepicker.lt.min.js | 1 + .../locales/bootstrap-datepicker.lv.min.js | 1 + .../locales/bootstrap-datepicker.me.min.js | 1 + .../locales/bootstrap-datepicker.mk.min.js | 1 + .../locales/bootstrap-datepicker.mn.min.js | 1 + .../locales/bootstrap-datepicker.ms.min.js | 1 + .../locales/bootstrap-datepicker.nl-BE.min.js | 1 + .../locales/bootstrap-datepicker.nl.min.js | 1 + .../locales/bootstrap-datepicker.no.min.js | 1 + .../locales/bootstrap-datepicker.oc.min.js | 1 + .../locales/bootstrap-datepicker.pl.min.js | 1 + .../locales/bootstrap-datepicker.pt-BR.min.js | 1 + .../locales/bootstrap-datepicker.pt.min.js | 1 + .../locales/bootstrap-datepicker.ro.min.js | 1 + .../bootstrap-datepicker.rs-latin.min.js | 1 + .../locales/bootstrap-datepicker.rs.min.js | 1 + .../locales/bootstrap-datepicker.ru.min.js | 1 + .../locales/bootstrap-datepicker.si.min.js | 1 + .../locales/bootstrap-datepicker.sk.min.js | 1 + .../locales/bootstrap-datepicker.sl.min.js | 1 + .../locales/bootstrap-datepicker.sq.min.js | 1 + .../bootstrap-datepicker.sr-latin.min.js | 1 + .../locales/bootstrap-datepicker.sr.min.js | 1 + .../locales/bootstrap-datepicker.sv.min.js | 1 + .../locales/bootstrap-datepicker.sw.min.js | 1 + .../locales/bootstrap-datepicker.ta.min.js | 1 + .../locales/bootstrap-datepicker.tg.min.js | 1 + .../locales/bootstrap-datepicker.th.min.js | 1 + .../locales/bootstrap-datepicker.tk.min.js | 1 + .../locales/bootstrap-datepicker.tr.min.js | 1 + .../locales/bootstrap-datepicker.uk.min.js | 1 + .../bootstrap-datepicker.uz-cyrl.min.js | 1 + .../bootstrap-datepicker.uz-latn.min.js | 1 + .../locales/bootstrap-datepicker.vi.min.js | 1 + .../locales/bootstrap-datepicker.zh-CN.min.js | 1 + .../locales/bootstrap-datepicker.zh-TW.min.js | 1 + .../public/assets/libs/chart.js/Chart.min.js | 7 + .../public/assets/libs/icheck/icheck.min.js | 11 + .../assets/libs/lightgallery/invoice.css | 194 + .../libs/lightgallery/invoice_06_07_2023.css | 166 + .../assets/libs/lightgallery/lightgallery.css | 117 + .../libs/lightgallery/lightgallery.min.js | 5 + .../libs/lightgallery/preview_result.css | 216 + .../preview_result__17_07_2023.css | 210 + .../libs/moment/moment-precise-range.js | 129 + .../app/public/assets/libs/moment/moment.js | 9977 +++ .../public/assets/libs/printjs/printjs.css | 1 + .../public/assets/libs/printjs/printjs.min.js | 1 + .../libs/sweetalert2/sweetalert2.all.min.js | 2 + .../libs/sweetalert2/sweetalert2.min.css | 1 + .../libs/sweetalert2/sweetalert2.min.js | 1 + .../app/public/assets/libs/webcam/shutter.mp3 | Bin 0 -> 13624 bytes .../app/public/assets/libs/webcam/webcam.js | 1049 + .../public/assets/libs/webcam/webcam.min.js | 2 + .../app/public/assets/libs/webcam/webcam.swf | Bin 0 -> 7090 bytes .../assets/scss/common/light/_background.scss | 11 + .../assets/scss/common/light/_demo.scss | 383 + .../assets/scss/common/light/_fonts.scss | 99 + .../assets/scss/common/light/_footer.scss | 22 + .../assets/scss/common/light/_functions.scss | 4 + .../assets/scss/common/light/_misc.scss | 81 + .../assets/scss/common/light/_reset.scss | 131 + .../assets/scss/common/light/_typography.scss | 128 + .../assets/scss/common/light/_utilities.scss | 98 + .../assets/scss/common/light/_variables.scss | 298 + .../assets/scss/common/light/common.scss | 199 + .../common/light/components/_accordions.scss | 233 + .../scss/common/light/components/_badges.scss | 19 + .../common/light/components/_breadcrumbs.scss | 86 + .../common/light/components/_buttons.scss | 83 + .../scss/common/light/components/_cards.scss | 88 + .../light/components/_checkbox-radio.scss | 236 + .../common/light/components/_dropdown.scss | 33 + .../scss/common/light/components/_forms.scss | 62 + .../scss/common/light/components/_icons.scss | 49 + .../scss/common/light/components/_lists.scss | 144 + .../common/light/components/_pagination.scss | 110 + .../common/light/components/_popover.scss | 129 + .../common/light/components/_portfolio.scss | 92 + .../common/light/components/_preview.scss | 118 + .../scss/common/light/components/_tables.scss | 44 + .../common/light/components/_todo-list.scss | 78 + .../light/components/_toggle-switch.scss | 64 + .../common/light/components/_tooltips.scss | 41 + .../light/components/loaders/_bar-loader.scss | 47 + .../components/loaders/_circle-loader.scss | 45 + .../components/loaders/_colored-balls.scss | 116 + .../loaders/_dot-opacity-loader.scss | 41 + .../loaders/_flip-square-loader.scss | 38 + .../components/loaders/_glowing-ball.scss | 137 + .../loaders/_jumping-dots-loader.scss | 45 + .../light/components/loaders/_loaders.scss | 14 + .../loaders/_moving-square-loader.scss | 36 + .../components/loaders/_pixel-loader.scss | 50 + .../light/components/loaders/_square-box.scss | 90 + .../loaders/_square-path-loader.scss | 55 + .../light/components/loaders/_variables.scss | 4 + .../components/plugin-overrides/_ace.scss | 11 + .../components/plugin-overrides/_avgrund.scss | 132 + .../plugin-overrides/_codemirror.scss | 12 + .../components/plugin-overrides/_icheck.scss | 14 + .../plugin-overrides/_jquery-file-upload.scss | 33 + .../plugin-overrides/_progressbar-js.scss | 10 + .../plugin-overrides/_pws-tabs.scss | 142 + .../components/plugin-overrides/_quill.scss | 11 + .../components/plugin-overrides/_select2.scss | 62 + .../plugin-overrides/_summernote.scss | 10 + .../components/plugin-overrides/_tags.scss | 18 + .../components/plugin-overrides/_tinymce.scss | 8 + .../components/plugin-overrides/_toast.scss | 16 + .../plugin-overrides/_typeahead.scss | 65 + .../plugin-overrides/_wysieditor.scss | 150 + .../plugin-overrides/_x-editable.scss | 56 + .../common/light/landing-screens/_auth.scss | 87 + .../scss/common/light/mixins/_animation.scss | 70 + .../scss/common/light/mixins/_badges.scss | 7 + .../scss/common/light/mixins/_blockqoute.scss | 8 + .../common/light/mixins/_breadcrumbs.scss | 42 + .../scss/common/light/mixins/_buttons.scss | 60 + .../scss/common/light/mixins/_cards.scss | 7 + .../scss/common/light/mixins/_misc.scss | 72 + .../common/light/mixins/_no-ui-slider.scss | 24 + .../scss/common/light/mixins/_pagination.scss | 18 + .../scss/common/light/mixins/_popovers.scss | 42 + .../scss/common/light/mixins/_tooltips.scss | 28 + .../scss/vertical-layout-light/_layouts.scss | 386 + .../scss/vertical-layout-light/_navbar.scss | 497 + .../_settings-panel.scss | 307 + .../scss/vertical-layout-light/_sidebar.scss | 262 + .../vertical-layout-light/_variables.scss | 80 + .../_vertical-wrapper.scss | 41 + .../scss/vertical-layout-light/style.scss | 7 + .../assets/vendors/ace-builds/src-min/ace.js | 17 + .../ace-builds/src-min/ext-beautify.js | 8 + .../ace-builds/src-min/ext-code_lens.js | 8 + .../src-min/ext-elastic_tabstops_lite.js | 8 + .../vendors/ace-builds/src-min/ext-emmet.js | 8 + .../ace-builds/src-min/ext-error_marker.js | 8 + .../ace-builds/src-min/ext-keybinding_menu.js | 8 + .../ace-builds/src-min/ext-language_tools.js | 8 + .../vendors/ace-builds/src-min/ext-linking.js | 8 + .../ace-builds/src-min/ext-modelist.js | 8 + .../vendors/ace-builds/src-min/ext-options.js | 8 + .../vendors/ace-builds/src-min/ext-prompt.js | 8 + .../vendors/ace-builds/src-min/ext-rtl.js | 8 + .../ace-builds/src-min/ext-searchbox.js | 8 + .../ace-builds/src-min/ext-settings_menu.js | 8 + .../ace-builds/src-min/ext-spellcheck.js | 8 + .../vendors/ace-builds/src-min/ext-split.js | 8 + .../src-min/ext-static_highlight.js | 8 + .../ace-builds/src-min/ext-statusbar.js | 8 + .../ace-builds/src-min/ext-textarea.js | 8 + .../ace-builds/src-min/ext-themelist.js | 8 + .../ace-builds/src-min/ext-whitespace.js | 8 + .../ace-builds/src-min/keybinding-emacs.js | 8 + .../ace-builds/src-min/keybinding-sublime.js | 8 + .../ace-builds/src-min/keybinding-vim.js | 8 + .../ace-builds/src-min/keybinding-vscode.js | 8 + .../vendors/ace-builds/src-min/mode-abap.js | 8 + .../vendors/ace-builds/src-min/mode-abc.js | 8 + .../ace-builds/src-min/mode-actionscript.js | 8 + .../vendors/ace-builds/src-min/mode-ada.js | 8 + .../vendors/ace-builds/src-min/mode-alda.js | 8 + .../ace-builds/src-min/mode-apache_conf.js | 8 + .../vendors/ace-builds/src-min/mode-apex.js | 8 + .../ace-builds/src-min/mode-applescript.js | 8 + .../vendors/ace-builds/src-min/mode-aql.js | 8 + .../ace-builds/src-min/mode-asciidoc.js | 8 + .../vendors/ace-builds/src-min/mode-asl.js | 8 + .../ace-builds/src-min/mode-assembly_x86.js | 8 + .../ace-builds/src-min/mode-autohotkey.js | 8 + .../ace-builds/src-min/mode-batchfile.js | 8 + .../ace-builds/src-min/mode-c9search.js | 8 + .../vendors/ace-builds/src-min/mode-c_cpp.js | 8 + .../vendors/ace-builds/src-min/mode-cirru.js | 8 + .../ace-builds/src-min/mode-clojure.js | 8 + .../vendors/ace-builds/src-min/mode-cobol.js | 8 + .../vendors/ace-builds/src-min/mode-coffee.js | 8 + .../ace-builds/src-min/mode-coldfusion.js | 8 + .../ace-builds/src-min/mode-crystal.js | 8 + .../vendors/ace-builds/src-min/mode-csharp.js | 8 + .../src-min/mode-csound_document.js | 8 + .../src-min/mode-csound_orchestra.js | 8 + .../ace-builds/src-min/mode-csound_score.js | 8 + .../vendors/ace-builds/src-min/mode-csp.js | 8 + .../vendors/ace-builds/src-min/mode-css.js | 8 + .../vendors/ace-builds/src-min/mode-curly.js | 8 + .../vendors/ace-builds/src-min/mode-d.js | 8 + .../vendors/ace-builds/src-min/mode-dart.js | 8 + .../vendors/ace-builds/src-min/mode-diff.js | 8 + .../vendors/ace-builds/src-min/mode-django.js | 8 + .../ace-builds/src-min/mode-dockerfile.js | 8 + .../vendors/ace-builds/src-min/mode-dot.js | 8 + .../vendors/ace-builds/src-min/mode-drools.js | 8 + .../ace-builds/src-min/mode-edifact.js | 8 + .../vendors/ace-builds/src-min/mode-eiffel.js | 8 + .../vendors/ace-builds/src-min/mode-ejs.js | 8 + .../vendors/ace-builds/src-min/mode-elixir.js | 8 + .../vendors/ace-builds/src-min/mode-elm.js | 8 + .../vendors/ace-builds/src-min/mode-erlang.js | 8 + .../vendors/ace-builds/src-min/mode-forth.js | 8 + .../ace-builds/src-min/mode-fortran.js | 8 + .../vendors/ace-builds/src-min/mode-fsharp.js | 8 + .../vendors/ace-builds/src-min/mode-fsl.js | 8 + .../vendors/ace-builds/src-min/mode-ftl.js | 8 + .../vendors/ace-builds/src-min/mode-gcode.js | 8 + .../ace-builds/src-min/mode-gherkin.js | 8 + .../ace-builds/src-min/mode-gitignore.js | 8 + .../vendors/ace-builds/src-min/mode-glsl.js | 8 + .../ace-builds/src-min/mode-gobstones.js | 8 + .../vendors/ace-builds/src-min/mode-golang.js | 8 + .../ace-builds/src-min/mode-graphqlschema.js | 8 + .../vendors/ace-builds/src-min/mode-groovy.js | 8 + .../vendors/ace-builds/src-min/mode-haml.js | 8 + .../ace-builds/src-min/mode-handlebars.js | 8 + .../ace-builds/src-min/mode-haskell.js | 8 + .../ace-builds/src-min/mode-haskell_cabal.js | 8 + .../vendors/ace-builds/src-min/mode-haxe.js | 8 + .../vendors/ace-builds/src-min/mode-hjson.js | 8 + .../vendors/ace-builds/src-min/mode-html.js | 8 + .../ace-builds/src-min/mode-html_elixir.js | 8 + .../ace-builds/src-min/mode-html_ruby.js | 8 + .../vendors/ace-builds/src-min/mode-ini.js | 8 + .../vendors/ace-builds/src-min/mode-io.js | 8 + .../vendors/ace-builds/src-min/mode-jack.js | 8 + .../vendors/ace-builds/src-min/mode-jade.js | 8 + .../vendors/ace-builds/src-min/mode-java.js | 8 + .../ace-builds/src-min/mode-javascript.js | 8 + .../vendors/ace-builds/src-min/mode-json.js | 8 + .../vendors/ace-builds/src-min/mode-json5.js | 8 + .../vendors/ace-builds/src-min/mode-jsoniq.js | 8 + .../vendors/ace-builds/src-min/mode-jsp.js | 8 + .../vendors/ace-builds/src-min/mode-jssm.js | 8 + .../vendors/ace-builds/src-min/mode-jsx.js | 8 + .../vendors/ace-builds/src-min/mode-julia.js | 8 + .../vendors/ace-builds/src-min/mode-kotlin.js | 8 + .../vendors/ace-builds/src-min/mode-latex.js | 8 + .../vendors/ace-builds/src-min/mode-less.js | 8 + .../vendors/ace-builds/src-min/mode-liquid.js | 8 + .../vendors/ace-builds/src-min/mode-lisp.js | 8 + .../ace-builds/src-min/mode-livescript.js | 8 + .../vendors/ace-builds/src-min/mode-logiql.js | 8 + .../ace-builds/src-min/mode-logtalk.js | 8 + .../vendors/ace-builds/src-min/mode-lsl.js | 8 + .../vendors/ace-builds/src-min/mode-lua.js | 8 + .../ace-builds/src-min/mode-luapage.js | 8 + .../vendors/ace-builds/src-min/mode-lucene.js | 8 + .../ace-builds/src-min/mode-makefile.js | 8 + .../ace-builds/src-min/mode-markdown.js | 8 + .../vendors/ace-builds/src-min/mode-mask.js | 8 + .../vendors/ace-builds/src-min/mode-matlab.js | 8 + .../vendors/ace-builds/src-min/mode-maze.js | 8 + .../ace-builds/src-min/mode-mediawiki.js | 8 + .../vendors/ace-builds/src-min/mode-mel.js | 8 + .../vendors/ace-builds/src-min/mode-mixal.js | 8 + .../ace-builds/src-min/mode-mushcode.js | 8 + .../vendors/ace-builds/src-min/mode-mysql.js | 8 + .../vendors/ace-builds/src-min/mode-nginx.js | 8 + .../vendors/ace-builds/src-min/mode-nim.js | 8 + .../vendors/ace-builds/src-min/mode-nix.js | 8 + .../vendors/ace-builds/src-min/mode-nsis.js | 8 + .../ace-builds/src-min/mode-nunjucks.js | 8 + .../ace-builds/src-min/mode-objectivec.js | 8 + .../vendors/ace-builds/src-min/mode-ocaml.js | 8 + .../vendors/ace-builds/src-min/mode-pascal.js | 8 + .../vendors/ace-builds/src-min/mode-perl.js | 8 + .../vendors/ace-builds/src-min/mode-perl6.js | 8 + .../vendors/ace-builds/src-min/mode-pgsql.js | 8 + .../vendors/ace-builds/src-min/mode-php.js | 8 + .../src-min/mode-php_laravel_blade.js | 8 + .../vendors/ace-builds/src-min/mode-pig.js | 8 + .../ace-builds/src-min/mode-plain_text.js | 8 + .../ace-builds/src-min/mode-powershell.js | 8 + .../vendors/ace-builds/src-min/mode-praat.js | 8 + .../vendors/ace-builds/src-min/mode-prisma.js | 8 + .../vendors/ace-builds/src-min/mode-prolog.js | 8 + .../ace-builds/src-min/mode-properties.js | 8 + .../ace-builds/src-min/mode-protobuf.js | 8 + .../vendors/ace-builds/src-min/mode-puppet.js | 8 + .../vendors/ace-builds/src-min/mode-python.js | 8 + .../vendors/ace-builds/src-min/mode-qml.js | 8 + .../vendors/ace-builds/src-min/mode-r.js | 8 + .../vendors/ace-builds/src-min/mode-razor.js | 8 + .../vendors/ace-builds/src-min/mode-rdoc.js | 8 + .../vendors/ace-builds/src-min/mode-red.js | 8 + .../ace-builds/src-min/mode-redshift.js | 8 + .../vendors/ace-builds/src-min/mode-rhtml.js | 8 + .../vendors/ace-builds/src-min/mode-rst.js | 8 + .../vendors/ace-builds/src-min/mode-ruby.js | 8 + .../vendors/ace-builds/src-min/mode-rust.js | 8 + .../vendors/ace-builds/src-min/mode-sass.js | 8 + .../vendors/ace-builds/src-min/mode-scad.js | 8 + .../vendors/ace-builds/src-min/mode-scala.js | 8 + .../vendors/ace-builds/src-min/mode-scheme.js | 8 + .../vendors/ace-builds/src-min/mode-scss.js | 8 + .../vendors/ace-builds/src-min/mode-sh.js | 8 + .../vendors/ace-builds/src-min/mode-sjs.js | 8 + .../vendors/ace-builds/src-min/mode-slim.js | 8 + .../vendors/ace-builds/src-min/mode-smarty.js | 8 + .../ace-builds/src-min/mode-snippets.js | 8 + .../ace-builds/src-min/mode-soy_template.js | 8 + .../vendors/ace-builds/src-min/mode-space.js | 8 + .../vendors/ace-builds/src-min/mode-sparql.js | 8 + .../vendors/ace-builds/src-min/mode-sql.js | 8 + .../ace-builds/src-min/mode-sqlserver.js | 8 + .../vendors/ace-builds/src-min/mode-stylus.js | 8 + .../vendors/ace-builds/src-min/mode-svg.js | 8 + .../vendors/ace-builds/src-min/mode-swift.js | 8 + .../vendors/ace-builds/src-min/mode-tcl.js | 8 + .../ace-builds/src-min/mode-terraform.js | 8 + .../vendors/ace-builds/src-min/mode-tex.js | 8 + .../vendors/ace-builds/src-min/mode-text.js | 8 + .../ace-builds/src-min/mode-textile.js | 8 + .../vendors/ace-builds/src-min/mode-toml.js | 8 + .../vendors/ace-builds/src-min/mode-tsx.js | 8 + .../vendors/ace-builds/src-min/mode-turtle.js | 8 + .../vendors/ace-builds/src-min/mode-twig.js | 8 + .../ace-builds/src-min/mode-typescript.js | 8 + .../vendors/ace-builds/src-min/mode-vala.js | 8 + .../ace-builds/src-min/mode-vbscript.js | 8 + .../ace-builds/src-min/mode-velocity.js | 8 + .../ace-builds/src-min/mode-verilog.js | 8 + .../vendors/ace-builds/src-min/mode-vhdl.js | 8 + .../ace-builds/src-min/mode-visualforce.js | 8 + .../vendors/ace-builds/src-min/mode-wollok.js | 8 + .../vendors/ace-builds/src-min/mode-xml.js | 8 + .../vendors/ace-builds/src-min/mode-xquery.js | 8 + .../vendors/ace-builds/src-min/mode-yaml.js | 8 + .../vendors/ace-builds/src-min/mode-zeek.js | 8 + .../ace-builds/src-min/snippets/abap.js | 8 + .../ace-builds/src-min/snippets/abc.js | 8 + .../src-min/snippets/actionscript.js | 8 + .../ace-builds/src-min/snippets/ada.js | 8 + .../ace-builds/src-min/snippets/alda.js | 8 + .../src-min/snippets/apache_conf.js | 8 + .../ace-builds/src-min/snippets/apex.js | 8 + .../src-min/snippets/applescript.js | 8 + .../ace-builds/src-min/snippets/aql.js | 8 + .../ace-builds/src-min/snippets/asciidoc.js | 8 + .../ace-builds/src-min/snippets/asl.js | 8 + .../src-min/snippets/assembly_x86.js | 8 + .../ace-builds/src-min/snippets/autohotkey.js | 8 + .../ace-builds/src-min/snippets/batchfile.js | 8 + .../ace-builds/src-min/snippets/c9search.js | 8 + .../ace-builds/src-min/snippets/c_cpp.js | 8 + .../ace-builds/src-min/snippets/cirru.js | 8 + .../ace-builds/src-min/snippets/clojure.js | 8 + .../ace-builds/src-min/snippets/cobol.js | 8 + .../ace-builds/src-min/snippets/coffee.js | 8 + .../ace-builds/src-min/snippets/coldfusion.js | 8 + .../ace-builds/src-min/snippets/crystal.js | 8 + .../ace-builds/src-min/snippets/csharp.js | 8 + .../src-min/snippets/csound_document.js | 8 + .../src-min/snippets/csound_orchestra.js | 8 + .../src-min/snippets/csound_score.js | 8 + .../ace-builds/src-min/snippets/csp.js | 8 + .../ace-builds/src-min/snippets/css.js | 8 + .../ace-builds/src-min/snippets/curly.js | 8 + .../vendors/ace-builds/src-min/snippets/d.js | 8 + .../ace-builds/src-min/snippets/dart.js | 8 + .../ace-builds/src-min/snippets/diff.js | 8 + .../ace-builds/src-min/snippets/django.js | 8 + .../ace-builds/src-min/snippets/dockerfile.js | 8 + .../ace-builds/src-min/snippets/dot.js | 8 + .../ace-builds/src-min/snippets/drools.js | 8 + .../ace-builds/src-min/snippets/edifact.js | 8 + .../ace-builds/src-min/snippets/eiffel.js | 8 + .../ace-builds/src-min/snippets/ejs.js | 8 + .../ace-builds/src-min/snippets/elixir.js | 8 + .../ace-builds/src-min/snippets/elm.js | 8 + .../ace-builds/src-min/snippets/erlang.js | 8 + .../ace-builds/src-min/snippets/forth.js | 8 + .../ace-builds/src-min/snippets/fortran.js | 8 + .../ace-builds/src-min/snippets/fsharp.js | 8 + .../ace-builds/src-min/snippets/fsl.js | 8 + .../ace-builds/src-min/snippets/ftl.js | 8 + .../ace-builds/src-min/snippets/gcode.js | 8 + .../ace-builds/src-min/snippets/gherkin.js | 8 + .../ace-builds/src-min/snippets/gitignore.js | 8 + .../ace-builds/src-min/snippets/glsl.js | 8 + .../ace-builds/src-min/snippets/gobstones.js | 8 + .../ace-builds/src-min/snippets/golang.js | 8 + .../src-min/snippets/graphqlschema.js | 8 + .../ace-builds/src-min/snippets/groovy.js | 8 + .../ace-builds/src-min/snippets/haml.js | 8 + .../ace-builds/src-min/snippets/handlebars.js | 8 + .../ace-builds/src-min/snippets/haskell.js | 8 + .../src-min/snippets/haskell_cabal.js | 8 + .../ace-builds/src-min/snippets/haxe.js | 8 + .../ace-builds/src-min/snippets/hjson.js | 8 + .../ace-builds/src-min/snippets/html.js | 8 + .../src-min/snippets/html_elixir.js | 8 + .../ace-builds/src-min/snippets/html_ruby.js | 8 + .../ace-builds/src-min/snippets/ini.js | 8 + .../vendors/ace-builds/src-min/snippets/io.js | 8 + .../ace-builds/src-min/snippets/jack.js | 8 + .../ace-builds/src-min/snippets/jade.js | 8 + .../ace-builds/src-min/snippets/java.js | 8 + .../ace-builds/src-min/snippets/javascript.js | 8 + .../ace-builds/src-min/snippets/json.js | 8 + .../ace-builds/src-min/snippets/json5.js | 8 + .../ace-builds/src-min/snippets/jsoniq.js | 8 + .../ace-builds/src-min/snippets/jsp.js | 8 + .../ace-builds/src-min/snippets/jssm.js | 8 + .../ace-builds/src-min/snippets/jsx.js | 8 + .../ace-builds/src-min/snippets/julia.js | 8 + .../ace-builds/src-min/snippets/kotlin.js | 8 + .../ace-builds/src-min/snippets/latex.js | 8 + .../ace-builds/src-min/snippets/less.js | 8 + .../ace-builds/src-min/snippets/liquid.js | 8 + .../ace-builds/src-min/snippets/lisp.js | 8 + .../ace-builds/src-min/snippets/livescript.js | 8 + .../ace-builds/src-min/snippets/logiql.js | 8 + .../ace-builds/src-min/snippets/logtalk.js | 8 + .../ace-builds/src-min/snippets/lsl.js | 8 + .../ace-builds/src-min/snippets/lua.js | 8 + .../ace-builds/src-min/snippets/luapage.js | 8 + .../ace-builds/src-min/snippets/lucene.js | 8 + .../ace-builds/src-min/snippets/makefile.js | 8 + .../ace-builds/src-min/snippets/markdown.js | 8 + .../ace-builds/src-min/snippets/mask.js | 8 + .../ace-builds/src-min/snippets/matlab.js | 8 + .../ace-builds/src-min/snippets/maze.js | 8 + .../ace-builds/src-min/snippets/mediawiki.js | 8 + .../ace-builds/src-min/snippets/mel.js | 8 + .../ace-builds/src-min/snippets/mixal.js | 8 + .../ace-builds/src-min/snippets/mushcode.js | 8 + .../ace-builds/src-min/snippets/mysql.js | 8 + .../ace-builds/src-min/snippets/nginx.js | 8 + .../ace-builds/src-min/snippets/nim.js | 8 + .../ace-builds/src-min/snippets/nix.js | 8 + .../ace-builds/src-min/snippets/nsis.js | 8 + .../ace-builds/src-min/snippets/nunjucks.js | 8 + .../ace-builds/src-min/snippets/objectivec.js | 8 + .../ace-builds/src-min/snippets/ocaml.js | 8 + .../ace-builds/src-min/snippets/pascal.js | 8 + .../ace-builds/src-min/snippets/perl.js | 8 + .../ace-builds/src-min/snippets/perl6.js | 8 + .../ace-builds/src-min/snippets/pgsql.js | 8 + .../ace-builds/src-min/snippets/php.js | 8 + .../src-min/snippets/php_laravel_blade.js | 8 + .../ace-builds/src-min/snippets/pig.js | 8 + .../ace-builds/src-min/snippets/plain_text.js | 8 + .../ace-builds/src-min/snippets/powershell.js | 8 + .../ace-builds/src-min/snippets/praat.js | 8 + .../ace-builds/src-min/snippets/prisma.js | 8 + .../ace-builds/src-min/snippets/prolog.js | 8 + .../ace-builds/src-min/snippets/properties.js | 8 + .../ace-builds/src-min/snippets/protobuf.js | 8 + .../ace-builds/src-min/snippets/puppet.js | 8 + .../ace-builds/src-min/snippets/python.js | 8 + .../ace-builds/src-min/snippets/qml.js | 8 + .../vendors/ace-builds/src-min/snippets/r.js | 8 + .../ace-builds/src-min/snippets/razor.js | 8 + .../ace-builds/src-min/snippets/rdoc.js | 8 + .../ace-builds/src-min/snippets/red.js | 8 + .../ace-builds/src-min/snippets/redshift.js | 8 + .../ace-builds/src-min/snippets/rhtml.js | 8 + .../ace-builds/src-min/snippets/rst.js | 8 + .../ace-builds/src-min/snippets/ruby.js | 8 + .../ace-builds/src-min/snippets/rust.js | 8 + .../ace-builds/src-min/snippets/sass.js | 8 + .../ace-builds/src-min/snippets/scad.js | 8 + .../ace-builds/src-min/snippets/scala.js | 8 + .../ace-builds/src-min/snippets/scheme.js | 8 + .../ace-builds/src-min/snippets/scss.js | 8 + .../vendors/ace-builds/src-min/snippets/sh.js | 8 + .../ace-builds/src-min/snippets/sjs.js | 8 + .../ace-builds/src-min/snippets/slim.js | 8 + .../ace-builds/src-min/snippets/smarty.js | 8 + .../ace-builds/src-min/snippets/snippets.js | 8 + .../src-min/snippets/soy_template.js | 8 + .../ace-builds/src-min/snippets/space.js | 8 + .../ace-builds/src-min/snippets/sparql.js | 8 + .../ace-builds/src-min/snippets/sql.js | 8 + .../ace-builds/src-min/snippets/sqlserver.js | 8 + .../ace-builds/src-min/snippets/stylus.js | 8 + .../ace-builds/src-min/snippets/svg.js | 8 + .../ace-builds/src-min/snippets/swift.js | 8 + .../ace-builds/src-min/snippets/tcl.js | 8 + .../ace-builds/src-min/snippets/terraform.js | 8 + .../ace-builds/src-min/snippets/tex.js | 8 + .../ace-builds/src-min/snippets/text.js | 8 + .../ace-builds/src-min/snippets/textile.js | 8 + .../ace-builds/src-min/snippets/toml.js | 8 + .../ace-builds/src-min/snippets/tsx.js | 8 + .../ace-builds/src-min/snippets/turtle.js | 8 + .../ace-builds/src-min/snippets/twig.js | 8 + .../ace-builds/src-min/snippets/typescript.js | 8 + .../ace-builds/src-min/snippets/vala.js | 8 + .../ace-builds/src-min/snippets/vbscript.js | 8 + .../ace-builds/src-min/snippets/velocity.js | 8 + .../ace-builds/src-min/snippets/verilog.js | 8 + .../ace-builds/src-min/snippets/vhdl.js | 8 + .../src-min/snippets/visualforce.js | 8 + .../ace-builds/src-min/snippets/wollok.js | 8 + .../ace-builds/src-min/snippets/xml.js | 8 + .../ace-builds/src-min/snippets/xquery.js | 8 + .../ace-builds/src-min/snippets/yaml.js | 8 + .../ace-builds/src-min/snippets/zeek.js | 8 + .../ace-builds/src-min/theme-ambiance.js | 8 + .../vendors/ace-builds/src-min/theme-chaos.js | 8 + .../ace-builds/src-min/theme-chrome.js | 8 + .../ace-builds/src-min/theme-clouds.js | 8 + .../src-min/theme-clouds_midnight.js | 8 + .../ace-builds/src-min/theme-cobalt.js | 8 + .../src-min/theme-crimson_editor.js | 8 + .../vendors/ace-builds/src-min/theme-dawn.js | 8 + .../ace-builds/src-min/theme-dracula.js | 8 + .../ace-builds/src-min/theme-dreamweaver.js | 8 + .../ace-builds/src-min/theme-eclipse.js | 8 + .../ace-builds/src-min/theme-github.js | 8 + .../vendors/ace-builds/src-min/theme-gob.js | 8 + .../ace-builds/src-min/theme-gruvbox.js | 8 + .../ace-builds/src-min/theme-idle_fingers.js | 8 + .../ace-builds/src-min/theme-iplastic.js | 8 + .../ace-builds/src-min/theme-katzenmilch.js | 8 + .../ace-builds/src-min/theme-kr_theme.js | 8 + .../ace-builds/src-min/theme-kuroir.js | 8 + .../ace-builds/src-min/theme-merbivore.js | 8 + .../src-min/theme-merbivore_soft.js | 8 + .../src-min/theme-mono_industrial.js | 8 + .../ace-builds/src-min/theme-monokai.js | 8 + .../ace-builds/src-min/theme-nord_dark.js | 8 + .../src-min/theme-pastel_on_dark.js | 8 + .../src-min/theme-solarized_dark.js | 8 + .../src-min/theme-solarized_light.js | 8 + .../ace-builds/src-min/theme-sqlserver.js | 8 + .../ace-builds/src-min/theme-terminal.js | 8 + .../ace-builds/src-min/theme-textmate.js | 8 + .../ace-builds/src-min/theme-tomorrow.js | 8 + .../src-min/theme-tomorrow_night.js | 8 + .../src-min/theme-tomorrow_night_blue.js | 8 + .../src-min/theme-tomorrow_night_bright.js | 8 + .../src-min/theme-tomorrow_night_eighties.js | 8 + .../ace-builds/src-min/theme-twilight.js | 8 + .../ace-builds/src-min/theme-vibrant_ink.js | 8 + .../vendors/ace-builds/src-min/theme-xcode.js | 8 + .../vendors/ace-builds/src-min/worker-base.js | 1 + .../ace-builds/src-min/worker-coffee.js | 1 + .../vendors/ace-builds/src-min/worker-css.js | 1 + .../vendors/ace-builds/src-min/worker-html.js | 1 + .../ace-builds/src-min/worker-javascript.js | 1 + .../vendors/ace-builds/src-min/worker-json.js | 1 + .../vendors/ace-builds/src-min/worker-lua.js | 1 + .../vendors/ace-builds/src-min/worker-php.js | 1 + .../vendors/ace-builds/src-min/worker-xml.js | 1 + .../ace-builds/src-min/worker-xquery.js | 1 + .../assets/vendors/chart.js/Chart.min.js | 7 + .../assets/vendors/codemirror/ambiance.css | 74 + .../assets/vendors/codemirror/codemirror.css | 346 + .../assets/vendors/codemirror/codemirror.js | 9666 +++ .../assets/vendors/codemirror/javascript.js | 857 + .../public/assets/vendors/codemirror/shell.js | 142 + .../assets/vendors/css/vendor.bundle.base.css | 112 + .../font-awesome/css/font-awesome.min.css | 4 + .../font-awesome/fonts/FontAwesome.otf | Bin 0 -> 134808 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../fonts/fontawesome-webfont.svg | 2671 + .../fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes .../jquery.uploadfile.min.js | 8 + .../vendors/jquery-file-upload/uploadfile.css | 146 + .../jquery.avgrund/jquery.avgrund.min.js | 2 + .../vendors/js/org.vendor.bundle.base.js | 18 + .../assets/vendors/js/vendor.bundle.base.js | 24 + .../vendors/jsgrid/jsgrid-theme.min.css | 7 + .../mdi/css/materialdesignicons.min.css | 2 + .../mdi/fonts/materialdesignicons-webfont.eot | Bin 0 -> 417036 bytes .../mdi/fonts/materialdesignicons-webfont.svg | 8694 +++ .../mdi/fonts/materialdesignicons-webfont.ttf | Bin 0 -> 416816 bytes .../fonts/materialdesignicons-webfont.woff | Bin 0 -> 204320 bytes .../fonts/materialdesignicons-webfont.woff2 | Bin 0 -> 151728 bytes .../public/assets/vendors/moment/moment.js | 5670 ++ .../assets/vendors/moment/moment.min.js | 2 + .../vendors/pwstabs/jquery.pwstabs.min.css | 1 + .../vendors/pwstabs/jquery.pwstabs.min.js | 1 + .../assets/vendors/quill/quill.snow.css | 947 + .../assets/vendors/select2/select2.min.css | 1 + .../assets/vendors/select2/select2.min.js | 3 + .../vendors/simplemde/simplemde.min.css | 7 + .../public/assets/vendors/tinymce/bower.json | 21 + .../assets/vendors/tinymce/changelog.txt | 715 + .../assets/vendors/tinymce/composer.json | 42 + .../assets/vendors/tinymce/jquery.tinymce.js | 1 + .../vendors/tinymce/jquery.tinymce.min.js | 1 + .../public/assets/vendors/tinymce/license.txt | 504 + .../assets/vendors/tinymce/package.json | 43 + .../vendors/tinymce/plugins/advlist/index.js | 7 + .../vendors/tinymce/plugins/advlist/plugin.js | 283 + .../tinymce/plugins/advlist/plugin.min.js | 1 + .../vendors/tinymce/plugins/anchor/index.js | 7 + .../vendors/tinymce/plugins/anchor/plugin.js | 235 + .../tinymce/plugins/anchor/plugin.min.js | 1 + .../vendors/tinymce/plugins/autolink/index.js | 7 + .../tinymce/plugins/autolink/plugin.js | 352 + .../tinymce/plugins/autolink/plugin.min.js | 1 + .../tinymce/plugins/autoresize/index.js | 7 + .../tinymce/plugins/autoresize/plugin.js | 342 + .../tinymce/plugins/autoresize/plugin.min.js | 1 + .../vendors/tinymce/plugins/autosave/index.js | 7 + .../tinymce/plugins/autosave/plugin.js | 348 + .../tinymce/plugins/autosave/plugin.min.js | 1 + .../vendors/tinymce/plugins/bbcode/index.js | 7 + .../vendors/tinymce/plugins/bbcode/plugin.js | 262 + .../tinymce/plugins/bbcode/plugin.min.js | 1 + .../vendors/tinymce/plugins/charmap/index.js | 7 + .../vendors/tinymce/plugins/charmap/plugin.js | 617 + .../tinymce/plugins/charmap/plugin.min.js | 1 + .../vendors/tinymce/plugins/code/index.js | 7 + .../vendors/tinymce/plugins/code/plugin.js | 203 + .../tinymce/plugins/code/plugin.min.js | 1 + .../tinymce/plugins/codesample/css/prism.css | 138 + .../tinymce/plugins/codesample/index.js | 7 + .../tinymce/plugins/codesample/plugin.js | 1385 + .../tinymce/plugins/codesample/plugin.min.js | 1 + .../tinymce/plugins/colorpicker/index.js | 7 + .../tinymce/plugins/colorpicker/plugin.js | 255 + .../tinymce/plugins/colorpicker/plugin.min.js | 1 + .../tinymce/plugins/contextmenu/index.js | 7 + .../tinymce/plugins/contextmenu/plugin.js | 949 + .../tinymce/plugins/contextmenu/plugin.min.js | 1 + .../tinymce/plugins/directionality/index.js | 7 + .../tinymce/plugins/directionality/plugin.js | 207 + .../plugins/directionality/plugin.min.js | 1 + .../plugins/emoticons/img/smiley-cool.gif | Bin 0 -> 354 bytes .../plugins/emoticons/img/smiley-cry.gif | Bin 0 -> 329 bytes .../emoticons/img/smiley-embarassed.gif | Bin 0 -> 331 bytes .../emoticons/img/smiley-foot-in-mouth.gif | Bin 0 -> 342 bytes .../plugins/emoticons/img/smiley-frown.gif | Bin 0 -> 340 bytes .../plugins/emoticons/img/smiley-innocent.gif | Bin 0 -> 336 bytes .../plugins/emoticons/img/smiley-kiss.gif | Bin 0 -> 338 bytes .../plugins/emoticons/img/smiley-laughing.gif | Bin 0 -> 343 bytes .../emoticons/img/smiley-money-mouth.gif | Bin 0 -> 321 bytes .../plugins/emoticons/img/smiley-sealed.gif | Bin 0 -> 323 bytes .../plugins/emoticons/img/smiley-smile.gif | Bin 0 -> 344 bytes .../emoticons/img/smiley-surprised.gif | Bin 0 -> 338 bytes .../emoticons/img/smiley-tongue-out.gif | Bin 0 -> 328 bytes .../emoticons/img/smiley-undecided.gif | Bin 0 -> 337 bytes .../plugins/emoticons/img/smiley-wink.gif | Bin 0 -> 350 bytes .../plugins/emoticons/img/smiley-yell.gif | Bin 0 -> 336 bytes .../tinymce/plugins/emoticons/index.js | 7 + .../tinymce/plugins/emoticons/plugin.js | 211 + .../tinymce/plugins/emoticons/plugin.min.js | 1 + .../vendors/tinymce/plugins/fullpage/index.js | 7 + .../tinymce/plugins/fullpage/plugin.js | 730 + .../tinymce/plugins/fullpage/plugin.min.js | 1 + .../tinymce/plugins/fullscreen/index.js | 7 + .../tinymce/plugins/fullscreen/plugin.js | 299 + .../tinymce/plugins/fullscreen/plugin.min.js | 1 + .../vendors/tinymce/plugins/help/img/logo.png | Bin 0 -> 23101 bytes .../vendors/tinymce/plugins/help/index.js | 7 + .../vendors/tinymce/plugins/help/plugin.js | 1352 + .../tinymce/plugins/help/plugin.min.js | 1 + .../vendors/tinymce/plugins/hr/index.js | 7 + .../vendors/tinymce/plugins/hr/plugin.js | 152 + .../vendors/tinymce/plugins/hr/plugin.min.js | 1 + .../vendors/tinymce/plugins/image/index.js | 7 + .../vendors/tinymce/plugins/image/plugin.js | 844 + .../tinymce/plugins/image/plugin.min.js | 1 + .../tinymce/plugins/imagetools/index.js | 7 + .../tinymce/plugins/imagetools/plugin.js | 3994 ++ .../tinymce/plugins/imagetools/plugin.min.js | 2 + .../tinymce/plugins/importcss/index.js | 7 + .../tinymce/plugins/importcss/plugin.js | 479 + .../tinymce/plugins/importcss/plugin.min.js | 1 + .../tinymce/plugins/insertdatetime/index.js | 7 + .../tinymce/plugins/insertdatetime/plugin.js | 263 + .../plugins/insertdatetime/plugin.min.js | 1 + .../tinymce/plugins/legacyoutput/index.js | 7 + .../tinymce/plugins/legacyoutput/plugin.js | 343 + .../plugins/legacyoutput/plugin.min.js | 1 + .../vendors/tinymce/plugins/link/index.js | 7 + .../vendors/tinymce/plugins/link/plugin.js | 1174 + .../tinymce/plugins/link/plugin.min.js | 1 + .../vendors/tinymce/plugins/lists/index.js | 7 + .../vendors/tinymce/plugins/lists/plugin.js | 1660 + .../tinymce/plugins/lists/plugin.min.js | 1 + .../vendors/tinymce/plugins/media/index.js | 7 + .../vendors/tinymce/plugins/media/plugin.js | 1788 + .../tinymce/plugins/media/plugin.min.js | 1 + .../tinymce/plugins/nonbreaking/index.js | 7 + .../tinymce/plugins/nonbreaking/plugin.js | 175 + .../tinymce/plugins/nonbreaking/plugin.min.js | 1 + .../tinymce/plugins/noneditable/index.js | 7 + .../tinymce/plugins/noneditable/plugin.js | 256 + .../tinymce/plugins/noneditable/plugin.min.js | 1 + .../tinymce/plugins/pagebreak/index.js | 7 + .../tinymce/plugins/pagebreak/plugin.js | 231 + .../tinymce/plugins/pagebreak/plugin.min.js | 1 + .../vendors/tinymce/plugins/paste/index.js | 7 + .../vendors/tinymce/plugins/paste/plugin.js | 2342 + .../tinymce/plugins/paste/plugin.min.js | 1 + .../vendors/tinymce/plugins/preview/index.js | 7 + .../vendors/tinymce/plugins/preview/plugin.js | 265 + .../tinymce/plugins/preview/plugin.min.js | 1 + .../vendors/tinymce/plugins/print/index.js | 7 + .../vendors/tinymce/plugins/print/plugin.js | 154 + .../tinymce/plugins/print/plugin.min.js | 1 + .../vendors/tinymce/plugins/save/index.js | 7 + .../vendors/tinymce/plugins/save/plugin.js | 283 + .../tinymce/plugins/save/plugin.min.js | 1 + .../tinymce/plugins/searchreplace/index.js | 7 + .../tinymce/plugins/searchreplace/plugin.js | 785 + .../plugins/searchreplace/plugin.min.js | 1 + .../tinymce/plugins/spellchecker/index.js | 7 + .../tinymce/plugins/spellchecker/plugin.js | 1159 + .../plugins/spellchecker/plugin.min.js | 1 + .../vendors/tinymce/plugins/tabfocus/index.js | 7 + .../tinymce/plugins/tabfocus/plugin.js | 348 + .../tinymce/plugins/tabfocus/plugin.min.js | 1 + .../vendors/tinymce/plugins/table/index.js | 7 + .../vendors/tinymce/plugins/table/plugin.js | 4780 ++ .../tinymce/plugins/table/plugin.min.js | 2 + .../vendors/tinymce/plugins/template/index.js | 7 + .../tinymce/plugins/template/plugin.js | 487 + .../tinymce/plugins/template/plugin.min.js | 1 + .../tinymce/plugins/textcolor/index.js | 7 + .../tinymce/plugins/textcolor/plugin.js | 483 + .../tinymce/plugins/textcolor/plugin.min.js | 1 + .../tinymce/plugins/textpattern/index.js | 7 + .../tinymce/plugins/textpattern/plugin.js | 577 + .../tinymce/plugins/textpattern/plugin.min.js | 1 + .../vendors/tinymce/plugins/toc/index.js | 7 + .../vendors/tinymce/plugins/toc/plugin.js | 411 + .../vendors/tinymce/plugins/toc/plugin.min.js | 1 + .../plugins/visualblocks/css/visualblocks.css | 154 + .../tinymce/plugins/visualblocks/index.js | 7 + .../tinymce/plugins/visualblocks/plugin.js | 208 + .../plugins/visualblocks/plugin.min.js | 1 + .../tinymce/plugins/visualchars/index.js | 7 + .../tinymce/plugins/visualchars/plugin.js | 1105 + .../tinymce/plugins/visualchars/plugin.min.js | 1 + .../tinymce/plugins/wordcount/index.js | 7 + .../tinymce/plugins/wordcount/plugin.js | 628 + .../tinymce/plugins/wordcount/plugin.min.js | 1 + .../public/assets/vendors/tinymce/readme.md | 70 + .../skins/lightgray/content.inline.min.css | 1 + .../tinymce/skins/lightgray/content.min.css | 1 + .../skins/lightgray/fonts/tinymce-small.eot | Bin 0 -> 9492 bytes .../skins/lightgray/fonts/tinymce-small.svg | 63 + .../skins/lightgray/fonts/tinymce-small.ttf | Bin 0 -> 9304 bytes .../skins/lightgray/fonts/tinymce-small.woff | Bin 0 -> 9380 bytes .../tinymce/skins/lightgray/fonts/tinymce.eot | Bin 0 -> 17572 bytes .../tinymce/skins/lightgray/fonts/tinymce.svg | 131 + .../tinymce/skins/lightgray/fonts/tinymce.ttf | Bin 0 -> 17408 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 0 -> 17484 bytes .../tinymce/skins/lightgray/img/anchor.gif | Bin 0 -> 53 bytes .../tinymce/skins/lightgray/img/loader.gif | Bin 0 -> 2608 bytes .../tinymce/skins/lightgray/img/object.gif | Bin 0 -> 152 bytes .../tinymce/skins/lightgray/img/trans.gif | Bin 0 -> 43 bytes .../tinymce/skins/lightgray/skin.min.css | 1 + .../vendors/tinymce/themes/inlite/index.js | 7 + .../vendors/tinymce/themes/inlite/theme.js | 2161 + .../tinymce/themes/inlite/theme.min.js | 1 + .../vendors/tinymce/themes/modern/index.js | 7 + .../vendors/tinymce/themes/modern/theme.js | 1681 + .../tinymce/themes/modern/theme.min.js | 1 + .../assets/vendors/tinymce/tinymce.jquery.js | 55817 ++++++++++++++++ .../vendors/tinymce/tinymce.jquery.min.js | 55817 ++++++++++++++++ .../public/assets/vendors/tinymce/tinymce.js | 55816 +++++++++++++++ .../assets/vendors/tinymce/tinymce.min.js | 16 + .../jquery.twbsPagination.min.js | 9 + .../typeahead.js/typeahead.bundle.min.js | 8 + .../public/assets/vendors/typicons/LICENCE.md | 92 + .../assets/vendors/typicons/typicons.css | 1040 + .../assets/vendors/typicons/typicons.eot | Bin 0 -> 100204 bytes .../assets/vendors/typicons/typicons.svg | 1180 + .../assets/vendors/typicons/typicons.ttf | Bin 0 -> 99920 bytes .../assets/vendors/typicons/typicons.woff | Bin 0 -> 59872 bytes .../public/images/avatars/labs/avatar_19.jpg | Bin 0 -> 49125 bytes .../public/images/avatars/labs/avatar_22.jpg | Bin 0 -> 2955 bytes .../app/public/images/patients/no-image.png | Bin 0 -> 813 bytes storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tests/Feature/ExampleTest.php | 19 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 16 + vite.config.js | 18 + 1437 files changed, 384844 insertions(+), 27 deletions(-) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 app/Console/Commands/DisableLabAccess.php create mode 100644 app/Console/Commands/NotifyExpireLab.php create mode 100644 app/Console/Kernel.php create mode 100644 app/Enums/DateFormatEnum.php create mode 100644 app/Enums/ExcelDesignEnum.php create mode 100644 app/Enums/RecordStatusEnum.php create mode 100644 app/Enums/SexEnum.php create mode 100644 app/Enums/UtilEnum.php create mode 100644 app/Exports/DoctorPhysicianExport.php create mode 100644 app/Exports/DoctorRawExport.php create mode 100644 app/Exports/DoctorSampleSourceExport.php create mode 100644 app/Exports/FinancialReportExport.php create mode 100644 app/Exports/InventoryOnHandExport.php create mode 100644 app/Exports/ItemExpiredExport.php create mode 100644 app/Exports/StockinExport.php create mode 100644 app/Exports/StockoutExport.php create mode 100644 app/Exports/SummaryReportExport.php create mode 100644 app/Helpers/Helpers.php create mode 100644 app/Helpers/SessionHelper.php create mode 100644 app/Http/Controllers/ActivityLogsController.php create mode 100644 app/Http/Controllers/AntibioticController.php create mode 100644 app/Http/Controllers/Api/AuthController.php create mode 100644 app/Http/Controllers/Api/SampleResultController.php create mode 100644 app/Http/Controllers/AppointmentController.php create mode 100644 app/Http/Controllers/Auth/AuthController.php create mode 100644 app/Http/Controllers/Auth/AuthenticatedSessionController.php create mode 100644 app/Http/Controllers/Auth/ConfirmablePasswordController.php create mode 100644 app/Http/Controllers/Auth/EmailVerificationNotificationController.php create mode 100644 app/Http/Controllers/Auth/EmailVerificationPromptController.php create mode 100644 app/Http/Controllers/Auth/NewPasswordController.php create mode 100644 app/Http/Controllers/Auth/PasswordResetLinkController.php create mode 100644 app/Http/Controllers/Auth/RegisteredUserController.php create mode 100644 app/Http/Controllers/Auth/VerifyEmailController.php create mode 100644 app/Http/Controllers/BaseController.php create mode 100644 app/Http/Controllers/CommentController.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/DashboardController.php create mode 100644 app/Http/Controllers/DepartmentController.php create mode 100644 app/Http/Controllers/Helper/GlobalController.php create mode 100644 app/Http/Controllers/InvoiceController.php create mode 100644 app/Http/Controllers/LabController.php create mode 100644 app/Http/Controllers/OrganismController.php create mode 100644 app/Http/Controllers/PatientController.php create mode 100644 app/Http/Controllers/PatientTypeController.php create mode 100644 app/Http/Controllers/PhysicianController.php create mode 100644 app/Http/Controllers/PublicationController.php create mode 100644 app/Http/Controllers/QuantityController.php create mode 100644 app/Http/Controllers/RepaymentController.php create mode 100644 app/Http/Controllers/ReportController.php create mode 100644 app/Http/Controllers/RoleController.php create mode 100644 app/Http/Controllers/SampleController.php create mode 100644 app/Http/Controllers/SampleSourceController.php create mode 100644 app/Http/Controllers/SampleTypeController.php create mode 100644 app/Http/Controllers/ShareController.php create mode 100644 app/Http/Controllers/TelegramController.php create mode 100644 app/Http/Controllers/TestController.php create mode 100644 app/Http/Controllers/TestGroupController.php create mode 100644 app/Http/Controllers/UserController.php create mode 100644 app/Http/Controllers/UtilController.php create mode 100644 app/Http/Middleware/Authenticate.php create mode 100644 app/Http/Middleware/Cors.php create mode 100644 app/Http/Middleware/EncryptCookies.php create mode 100644 app/Http/Middleware/Localization.php create mode 100644 app/Http/Middleware/PreventRequestsDuringMaintenance.php create mode 100644 app/Http/Middleware/RedirectIfAuthenticated.php create mode 100644 app/Http/Middleware/SetLocale.php create mode 100644 app/Http/Middleware/TrimStrings.php create mode 100644 app/Http/Middleware/TrustHosts.php create mode 100644 app/Http/Middleware/TrustProxies.php create mode 100644 app/Http/Middleware/VerifyBaseLab.php create mode 100644 app/Http/Middleware/VerifyCsrfToken.php create mode 100644 app/Http/Requests/Auth/LoginRequest.php create mode 100644 app/Http/Requests/PatientCreateRequest.php create mode 100644 app/Http/Requests/PatientTypeCreateRequest.php create mode 100644 app/Http/Requests/PatientUpdateRequest.php create mode 100644 app/Http/Requests/SampleCreateRequest.php create mode 100644 app/Http/Requests/SampleDetailCreateRequest.php create mode 100644 app/Http/Requests/TestSampleCreateRequest.php create mode 100644 app/Http/Requests/UpdateRequests/SampleUpdateRequest.php create mode 100644 app/Http/Requests/UpdateRequests/TestSampleUpdateRequest.php create mode 100644 app/Http/Resources/AntibioticResource.php create mode 100644 app/Http/Resources/HeadingItemResource.php create mode 100644 app/Http/Resources/LaboratoryResource.php create mode 100644 app/Http/Resources/OrganismResource.php create mode 100644 app/Http/Resources/PatientSampleResource.php create mode 100644 app/Http/Resources/SampleResource.php create mode 100644 app/Http/Resources/SampleTestResource.php create mode 100644 app/Http/Resources/SampleTypeResource.php create mode 100644 app/Http/Resources/TestResource.php create mode 100644 app/Http/Resources/TestSampleResource.php create mode 100644 app/Http/Resources/UserResource.php create mode 100644 app/Listeners/LogUserLogin.php create mode 100644 app/Listeners/LogUserLogout.php create mode 100644 app/Models/Antibiotic.php create mode 100644 app/Models/AntibioticResult.php create mode 100644 app/Models/Appointment.php create mode 100644 app/Models/BaseModel.php create mode 100644 app/Models/Comment.php create mode 100644 app/Models/Commune.php create mode 100644 app/Models/Department.php create mode 100644 app/Models/District.php create mode 100644 app/Models/Invoice.php create mode 100644 app/Models/InvoiceDetail.php create mode 100644 app/Models/Laboratory.php create mode 100644 app/Models/Module.php create mode 100644 app/Models/Organism.php create mode 100644 app/Models/OrganismResult.php create mode 100644 app/Models/Patient.php create mode 100644 app/Models/PatientTelegram.php create mode 100644 app/Models/PatientType.php create mode 100644 app/Models/Physician.php create mode 100644 app/Models/PhysicianCommission.php create mode 100644 app/Models/Province.php create mode 100644 app/Models/Publication.php create mode 100644 app/Models/PublicationReceiver.php create mode 100644 app/Models/Quantity.php create mode 100644 app/Models/RejectComment.php create mode 100644 app/Models/Repayment.php create mode 100644 app/Models/Role.php create mode 100644 app/Models/RoleHasPermission.php create mode 100644 app/Models/Sample.php create mode 100644 app/Models/SampleDetail.php create mode 100644 app/Models/SampleSource.php create mode 100644 app/Models/SampleSourceTelegram.php create mode 100644 app/Models/SampleType.php create mode 100644 app/Models/Supplier.php create mode 100644 app/Models/Test.php create mode 100644 app/Models/TestCategory.php create mode 100644 app/Models/TestGroup.php create mode 100644 app/Models/TestGroupDetail.php create mode 100644 app/Models/TestNormalValue.php create mode 100644 app/Models/TestResult.php create mode 100644 app/Models/TestSample.php create mode 100644 app/Models/TestSampleOrganism.php create mode 100644 app/Models/Traits/HasLocalizedName.php create mode 100644 app/Models/User.php create mode 100644 app/Models/UserLabCover.php create mode 100644 app/Models/Village.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Providers/AuthServiceProvider.php create mode 100644 app/Providers/BroadcastServiceProvider.php create mode 100644 app/Providers/EventServiceProvider.php create mode 100644 app/Providers/RouteServiceProvider.php create mode 100644 app/Providers/TelescopeServiceProvider.php create mode 100644 app/Traits/AuditLogTrait.php create mode 100644 app/View/Components/Alert.php create mode 100644 app/View/Components/AppLayout.php create mode 100644 app/View/Components/GuestLayout.php create mode 100644 artisan create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 bootstrap/providers.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/broadcasting.php create mode 100644 config/cache.php create mode 100644 config/cors.php create mode 100644 config/database.php create mode 100644 config/excel.php create mode 100644 config/filesystems.php create mode 100644 config/labis.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/queue.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 config/telegram.php create mode 100644 config/telescope.php create mode 100644 config/view.php create mode 100644 database/.gitignore create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 database/migrations/2026_03_14_211002_create_activity_log_table.php create mode 100644 database/migrations/2026_03_14_211003_add_event_column_to_activity_log_table.php create mode 100644 database/migrations/2026_03_14_211004_add_batch_uuid_column_to_activity_log_table.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 lang/en/antibiotic.php create mode 100644 lang/en/appointment.php create mode 100644 lang/en/auth.php create mode 100644 lang/en/comment.php create mode 100644 lang/en/department.php create mode 100644 lang/en/general.php create mode 100644 lang/en/inventory.php create mode 100644 lang/en/invoice.php create mode 100644 lang/en/lab_profile.php create mode 100644 lang/en/laboratory.php create mode 100644 lang/en/lang.php create mode 100644 lang/en/login.php create mode 100644 lang/en/opd_visit.php create mode 100644 lang/en/organism.php create mode 100644 lang/en/pagination.php create mode 100644 lang/en/passwords.php create mode 100644 lang/en/patient.php create mode 100644 lang/en/patient_type.php create mode 100644 lang/en/permission.php create mode 100644 lang/en/physician.php create mode 100644 lang/en/quantity.php create mode 100644 lang/en/report.php create mode 100644 lang/en/sample.php create mode 100644 lang/en/sample_source.php create mode 100644 lang/en/sample_type.php create mode 100644 lang/en/sidebar.php create mode 100644 lang/en/system_role.php create mode 100644 lang/en/test_sample.php create mode 100644 lang/en/user_account.php create mode 100644 lang/en/vaccination.php create mode 100644 lang/en/validation.php create mode 100644 lang/kh/antibiotic.php create mode 100644 lang/kh/appointment.php create mode 100644 lang/kh/auth.php create mode 100644 lang/kh/comment.php create mode 100644 lang/kh/department.php create mode 100644 lang/kh/general.php create mode 100644 lang/kh/inventory.php create mode 100644 lang/kh/invoice.php create mode 100644 lang/kh/lab_profile.php create mode 100644 lang/kh/laboratory.php create mode 100644 lang/kh/lang.php create mode 100644 lang/kh/login.php create mode 100644 lang/kh/medicine_vacc.php create mode 100644 lang/kh/opd_visit.php create mode 100644 lang/kh/organism.php create mode 100644 lang/kh/patient.php create mode 100644 lang/kh/patient_type.php create mode 100644 lang/kh/permission.php create mode 100644 lang/kh/physician.php create mode 100644 lang/kh/quantity.php create mode 100644 lang/kh/report.php create mode 100644 lang/kh/sample.php create mode 100644 lang/kh/sample_source.php create mode 100644 lang/kh/sample_type.php create mode 100644 lang/kh/sidebar.php create mode 100644 lang/kh/system_role.php create mode 100644 lang/kh/test_sample.php create mode 100644 lang/kh/user_account.php create mode 100644 lang/kh/vaccination.php create mode 100644 lang/kh/validation.php create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 public/.htaccess create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/css/app.css create mode 100644 resources/js/app.js create mode 100644 resources/js/bootstrap.js create mode 100644 resources/views/activity_logs.blade.php create mode 100644 resources/views/aggregate_report.blade.php create mode 100644 resources/views/antibiotic.blade.php create mode 100644 resources/views/appointment.blade.php create mode 100644 resources/views/audit-logs/index.blade copy.php create mode 100644 resources/views/audit-logs/index.blade.php create mode 100644 resources/views/auth/confirm-password.blade.php create mode 100644 resources/views/auth/forgot-password.blade.php create mode 100644 resources/views/auth/login.blade.php create mode 100644 resources/views/auth/register.blade.php create mode 100644 resources/views/auth/reset-password.blade.php create mode 100644 resources/views/auth/verify-email.blade.php create mode 100644 resources/views/bacteriology_report.blade.php create mode 100644 resources/views/base.blade.php create mode 100644 resources/views/clone_lab.blade.php create mode 100644 resources/views/comment.blade.php create mode 100644 resources/views/components/alert.blade.php create mode 100644 resources/views/components/application-logo.blade.php create mode 100644 resources/views/components/auth-card.blade.php create mode 100644 resources/views/components/auth-session-status.blade.php create mode 100644 resources/views/components/auth-validation-errors.blade.php create mode 100644 resources/views/components/button.blade.php create mode 100644 resources/views/components/dropdown-link.blade.php create mode 100644 resources/views/components/dropdown.blade.php create mode 100644 resources/views/components/input.blade.php create mode 100644 resources/views/components/label.blade.php create mode 100644 resources/views/components/nav-link.blade.php create mode 100644 resources/views/components/responsive-nav-link.blade.php create mode 100644 resources/views/dashboard.blade.php create mode 100644 resources/views/department.blade.php create mode 100644 resources/views/doctor_report.blade.php create mode 100644 resources/views/edit_vaccination.blade.php create mode 100644 resources/views/errors/404.blade.php create mode 100644 resources/views/expired_item.blade.php create mode 100644 resources/views/financial_report.blade.php create mode 100644 resources/views/home.blade.php create mode 100644 resources/views/individual_report.blade.php create mode 100644 resources/views/inventory.blade.php create mode 100644 resources/views/invoice_list.blade.php create mode 100644 resources/views/lab_profile.blade.php create mode 100644 resources/views/laboratory.blade.php create mode 100644 resources/views/layout/breadscrum.blade.php create mode 100644 resources/views/layout/common_script.blade.php create mode 100644 resources/views/layout/footer.blade.php create mode 100644 resources/views/layout/header.blade.php create mode 100644 resources/views/layout/loading.blade.php create mode 100644 resources/views/layout/navbar.blade.php create mode 100644 resources/views/layout/sidebar.blade.php create mode 100644 resources/views/layouts/app.blade.php create mode 100644 resources/views/layouts/guest.blade.php create mode 100644 resources/views/layouts/navigation.blade.php create mode 100644 resources/views/login.blade.php create mode 100644 resources/views/medicine.blade.php create mode 100644 resources/views/medicine_group.blade.php create mode 100644 resources/views/medicine_unit.blade.php create mode 100644 resources/views/modal/appointment.blade.php create mode 100644 resources/views/modal/assign_test.blade.php create mode 100644 resources/views/modal/doctor_report_detail_print.blade.php create mode 100644 resources/views/modal/doctor_report_print.blade.php create mode 100644 resources/views/modal/enter_result_forms/sample_result_1.blade.php create mode 100644 resources/views/modal/enter_result_forms/sample_result_2.blade.php create mode 100644 resources/views/modal/financial_report_print.blade.php create mode 100644 resources/views/modal/inventory_onhand_print.blade.php create mode 100644 resources/views/modal/invoice.blade.php create mode 100644 resources/views/modal/organism_result.blade.php create mode 100644 resources/views/modal/preview_invoice.blade.php create mode 100644 resources/views/modal/preview_invoice_forms/riel_invoice.blade.php create mode 100644 resources/views/modal/preview_invoice_forms/usd_invoice.blade.php create mode 100644 resources/views/modal/preview_invoice_forms/usd_invoice_summary.blade.php create mode 100644 resources/views/modal/preview_invoice_forms/usd_invoice_t3.blade.php create mode 100644 resources/views/modal/preview_invoice_forms/usd_invoice_t4.blade.php create mode 100644 resources/views/modal/preview_result.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_1.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_1_margin_default_firefox.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_1_margin_default_noheader.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_1_previous_sample.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_2.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_2_backup_for_Anapath.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_3.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_4.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_4_old.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_5.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_6.blade.php create mode 100644 resources/views/modal/preview_result_forms/preview_result_7.blade.php create mode 100644 resources/views/modal/preview_vaccination_invoice.blade.php create mode 100644 resources/views/modal/preview_vaccination_invoice_.blade.php create mode 100644 resources/views/modal/repayment.blade.php create mode 100644 resources/views/modal/sample_label_print.blade.php create mode 100644 resources/views/modal/sample_result.blade.php create mode 100644 resources/views/modal/stock_in_print.blade.php create mode 100644 resources/views/modal/stock_out_print.blade.php create mode 100644 resources/views/modal/summary_report_print.blade.php create mode 100644 resources/views/modal/test_sample_formula.blade.php create mode 100644 resources/views/modal/vaccination_print.blade.php create mode 100644 resources/views/my_profiles.blade.php create mode 100644 resources/views/need_restock.blade.php create mode 100644 resources/views/new_patient.blade.php create mode 100644 resources/views/new_patient_bk.blade.php create mode 100644 resources/views/new_payment.blade.php create mode 100644 resources/views/new_sample.blade.php create mode 100644 resources/views/new_vaccination.blade.php create mode 100644 resources/views/organism.blade.php create mode 100644 resources/views/pagination/custom.blade.php create mode 100644 resources/views/pagination/custom_bk.blade.php create mode 100644 resources/views/partials/language_switcher.blade.php create mode 100644 resources/views/partials/patient_list.blade.php create mode 100644 resources/views/patient-type.blade.php create mode 100644 resources/views/patient.blade.php create mode 100644 resources/views/physician.blade.php create mode 100644 resources/views/publication.blade.php create mode 100644 resources/views/quantity.blade.php create mode 100644 resources/views/read_message.blade.php create mode 100644 resources/views/repayment.blade.php create mode 100644 resources/views/result_config.blade.php create mode 100644 resources/views/role.blade.php create mode 100644 resources/views/sample-type.blade.php create mode 100644 resources/views/sample.blade.php create mode 100644 resources/views/sample_edition.blade.php create mode 100644 resources/views/sample_source.blade.php create mode 100644 resources/views/search.blade.php create mode 100644 resources/views/shared/anonymous_login.blade.php create mode 100644 resources/views/shared/patient_profile.blade.php create mode 100644 resources/views/shared/patient_register.blade.php create mode 100644 resources/views/shared/preview_result.blade.php create mode 100644 resources/views/shared/test_result.blade.php create mode 100644 resources/views/shared/test_result_1_deletable.blade.php create mode 100644 resources/views/shared/test_result_3_backup.blade.php create mode 100644 resources/views/shared/test_result_3_deletable.blade.php create mode 100644 resources/views/shared/test_result_4_deletable.blade.php create mode 100644 resources/views/single_sample.blade.php create mode 100644 resources/views/stock_in.blade.php create mode 100644 resources/views/stock_out.blade.php create mode 100644 resources/views/supplier.blade.php create mode 100644 resources/views/test.blade.php create mode 100644 resources/views/test_profile.blade.php create mode 100644 resources/views/user_account.blade.php create mode 100644 resources/views/user_profile.blade.php create mode 100644 resources/views/v_invoice/edit_invoice.blade.php create mode 100644 resources/views/v_invoice/invoice.blade.php create mode 100644 resources/views/v_invoice/new_invoice.blade.php create mode 100644 resources/views/v_invoice/report_filter.blade.php create mode 100644 resources/views/vaccination.blade.php create mode 100644 resources/views/welcome.blade.php create mode 100644 routes/api.php create mode 100644 routes/auth.php create mode 100644 routes/channels.php create mode 100644 routes/console.php create mode 100644 routes/web.php create mode 100644 storage/app/private/.gitignore create mode 100644 storage/app/public/assets/css/maps/horizontal-layout-dark/style.css.map create mode 100644 storage/app/public/assets/css/maps/horizontal-layout-light/style.css.map create mode 100644 storage/app/public/assets/css/maps/horizontal-layout/style.css.map create mode 100644 storage/app/public/assets/css/maps/vertical-layout-dark/style.css.map create mode 100644 storage/app/public/assets/css/maps/vertical-layout-light/style.css.map create mode 100644 storage/app/public/assets/css/overwrite.css create mode 100644 storage/app/public/assets/css/overwrite.select2.css create mode 100644 storage/app/public/assets/css/scrollbars.css create mode 100644 storage/app/public/assets/css/search_test.css create mode 100644 storage/app/public/assets/css/vertical-layout-light/style.css create mode 100644 storage/app/public/assets/fonts/Hanuman.ttf create mode 100644 storage/app/public/assets/fonts/KhmerOS.ttf create mode 100644 storage/app/public/assets/fonts/KhmerOS_muollight.ttf create mode 100644 storage/app/public/assets/fonts/NimbusMono-Regular.otf create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Black.eot create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Black.ttf create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Black.woff create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Black.woff2 create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Bold.eot create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Bold.ttf create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Bold.woff create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Bold.woff2 create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-ExtraBold.eot create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-ExtraBold.ttf create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-ExtraBold.woff create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-ExtraBold.woff2 create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Light.eot create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Light.ttf create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Light.woff create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Light.woff2 create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Medium.eot create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Medium.ttf create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Medium.woff create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Medium.woff2 create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Regular.eot create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Regular.ttf create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Regular.woff create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-Regular.woff2 create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-SemiBold.eot create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-SemiBold.ttf create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-SemiBold.woff create mode 100644 storage/app/public/assets/fonts/Poppins/Poppins-SemiBold.woff2 create mode 100644 storage/app/public/assets/fonts/SourceSerifPro-Bold.ttf create mode 100644 storage/app/public/assets/fonts/SourceSerifPro-Regular.ttf create mode 100644 storage/app/public/assets/fonts/Tacteng.ttf create mode 100644 storage/app/public/assets/fonts/times_new_roman.ttf create mode 100644 storage/app/public/assets/gulpfile.js create mode 100644 storage/app/public/assets/images/Untitled-1_03-removebg-preview.png create mode 100644 storage/app/public/assets/images/faces/face5.png create mode 100644 storage/app/public/assets/images/favicon.png create mode 100644 storage/app/public/assets/images/labsettings/result_footer.png create mode 100644 storage/app/public/assets/images/labsettings/result_header_1.png create mode 100644 storage/app/public/assets/images/labsettings/result_header_2.png create mode 100644 storage/app/public/assets/images/labsettings/result_header_3.png create mode 100644 storage/app/public/assets/images/labsettings/result_header_4.png create mode 100644 storage/app/public/assets/images/logo-dark.png create mode 100644 storage/app/public/assets/images/logo-dark.svg create mode 100644 storage/app/public/assets/images/logo-dark_.png create mode 100644 storage/app/public/assets/images/logo-dark_old.png create mode 100644 storage/app/public/assets/images/logo-mini.png create mode 100644 storage/app/public/assets/images/logo-mini.svg create mode 100644 storage/app/public/assets/images/logo.png create mode 100644 storage/app/public/assets/images/logo.svg create mode 100644 storage/app/public/assets/images/sprites/blue.png create mode 100644 storage/app/public/assets/images/sprites/dark.png create mode 100644 storage/app/public/assets/images/sprites/flag.png create mode 100644 storage/app/public/assets/images/sprites/green.png create mode 100644 storage/app/public/assets/images/sprites/jsgrid-icons.png create mode 100644 storage/app/public/assets/images/sprites/red.png create mode 100644 storage/app/public/assets/images/sprites/yellow.png create mode 100644 storage/app/public/assets/js/ace.js create mode 100644 storage/app/public/assets/js/admin/antibiotic.js create mode 100644 storage/app/public/assets/js/admin/assign_test.js create mode 100644 storage/app/public/assets/js/admin/calculation_results/calculateTestValue.js create mode 100644 storage/app/public/assets/js/admin/calculation_results/math-expression-evaluator.js create mode 100644 storage/app/public/assets/js/admin/calculation_results/test_script.js create mode 100644 storage/app/public/assets/js/admin/calculation_results/underscore-min.js create mode 100644 storage/app/public/assets/js/admin/comment.js create mode 100644 storage/app/public/assets/js/admin/department.js create mode 100644 storage/app/public/assets/js/admin/enter_result_forms/test_result_1.js create mode 100644 storage/app/public/assets/js/admin/enter_result_forms/test_result_2.js create mode 100644 storage/app/public/assets/js/admin/global_funs.js create mode 100644 storage/app/public/assets/js/admin/invoice.js create mode 100644 storage/app/public/assets/js/admin/laboratory.js create mode 100644 storage/app/public/assets/js/admin/medication.js create mode 100644 storage/app/public/assets/js/admin/medicine.js create mode 100644 storage/app/public/assets/js/admin/medicine_group.js create mode 100644 storage/app/public/assets/js/admin/medicine_purchase.js create mode 100644 storage/app/public/assets/js/admin/medicine_release.js create mode 100644 storage/app/public/assets/js/admin/medicine_unit.js create mode 100644 storage/app/public/assets/js/admin/opdvisit.js create mode 100644 storage/app/public/assets/js/admin/organism.js create mode 100644 storage/app/public/assets/js/admin/patient.js create mode 100644 storage/app/public/assets/js/admin/patient_type.js create mode 100644 storage/app/public/assets/js/admin/physician.js create mode 100644 storage/app/public/assets/js/admin/preview_result.js create mode 100644 storage/app/public/assets/js/admin/preview_result_forms/preview_result_1.js create mode 100644 storage/app/public/assets/js/admin/preview_result_forms/preview_result_1_11_jan_2024.js create mode 100644 storage/app/public/assets/js/admin/preview_result_forms/preview_result_1_previous_sample.js create mode 100644 storage/app/public/assets/js/admin/preview_result_forms/preview_result_2.js create mode 100644 storage/app/public/assets/js/admin/preview_result_forms/preview_result_2_anapath_backup.js create mode 100644 storage/app/public/assets/js/admin/preview_result_forms/preview_result_3.js create mode 100644 storage/app/public/assets/js/admin/preview_result_forms/preview_result_4.js create mode 100644 storage/app/public/assets/js/admin/preview_result_forms/preview_result_4_.js create mode 100644 storage/app/public/assets/js/admin/preview_result_forms/preview_result_5.js create mode 100644 storage/app/public/assets/js/admin/preview_result_forms/preview_result_6.js create mode 100644 storage/app/public/assets/js/admin/preview_result_forms/preview_result_7.js create mode 100644 storage/app/public/assets/js/admin/quantity.js create mode 100644 storage/app/public/assets/js/admin/request_test.js create mode 100644 storage/app/public/assets/js/admin/role.js create mode 100644 storage/app/public/assets/js/admin/sample.js create mode 100644 storage/app/public/assets/js/admin/sample_lists.js create mode 100644 storage/app/public/assets/js/admin/sample_source.js create mode 100644 storage/app/public/assets/js/admin/sample_type.js create mode 100644 storage/app/public/assets/js/admin/search_test.js create mode 100644 storage/app/public/assets/js/admin/supplier.js create mode 100644 storage/app/public/assets/js/admin/test.js create mode 100644 storage/app/public/assets/js/admin/test_result.js create mode 100644 storage/app/public/assets/js/admin/user.js create mode 100644 storage/app/public/assets/js/admin/vaccination.js create mode 100644 storage/app/public/assets/js/alerts.js create mode 100644 storage/app/public/assets/js/avgrund.js create mode 100644 storage/app/public/assets/js/bootstrap-table.js create mode 100644 storage/app/public/assets/js/bt-maxLength.js create mode 100644 storage/app/public/assets/js/c3.js create mode 100644 storage/app/public/assets/js/calendar.js create mode 100644 storage/app/public/assets/js/chart.js create mode 100644 storage/app/public/assets/js/chartist.js create mode 100644 storage/app/public/assets/js/circle-progress.js create mode 100644 storage/app/public/assets/js/clipboard.js create mode 100644 storage/app/public/assets/js/codeEditor.js create mode 100644 storage/app/public/assets/js/codemirror.js create mode 100644 storage/app/public/assets/js/context-menu.js create mode 100644 storage/app/public/assets/js/dashboard.js create mode 100644 storage/app/public/assets/js/data-table.js create mode 100644 storage/app/public/assets/js/db.js create mode 100644 storage/app/public/assets/js/demo.js create mode 100644 storage/app/public/assets/js/desktop-notification.js create mode 100644 storage/app/public/assets/js/dragula.js create mode 100644 storage/app/public/assets/js/dropify.js create mode 100644 storage/app/public/assets/js/dropzone.js create mode 100644 storage/app/public/assets/js/editorDemo.js create mode 100644 storage/app/public/assets/js/file-upload.js create mode 100644 storage/app/public/assets/js/flot-chart.js create mode 100644 storage/app/public/assets/js/form-addons.js create mode 100644 storage/app/public/assets/js/form-repeater.js create mode 100644 storage/app/public/assets/js/form-validation.js create mode 100644 storage/app/public/assets/js/formpickers.js create mode 100644 storage/app/public/assets/js/google-charts.js create mode 100644 storage/app/public/assets/js/google-maps.js create mode 100644 storage/app/public/assets/js/hoverable-collapse.js create mode 100644 storage/app/public/assets/js/ion-range-slider.js create mode 100644 storage/app/public/assets/js/jq.tablesort.js create mode 100644 storage/app/public/assets/js/jquery-file-upload.js create mode 100644 storage/app/public/assets/js/js-grid.js create mode 100644 storage/app/public/assets/js/just-gage.js create mode 100644 storage/app/public/assets/js/light-gallery.js create mode 100644 storage/app/public/assets/js/lightgallery.js create mode 100644 storage/app/public/assets/js/listify.js create mode 100644 storage/app/public/assets/js/mapael.js create mode 100644 storage/app/public/assets/js/mapael_example_1.js create mode 100644 storage/app/public/assets/js/mapael_example_2.js create mode 100644 storage/app/public/assets/js/maps.js create mode 100644 storage/app/public/assets/js/modal-demo.js create mode 100644 storage/app/public/assets/js/morris.js create mode 100644 storage/app/public/assets/js/no-ui-slider.js create mode 100644 storage/app/public/assets/js/off-canvas.js create mode 100644 storage/app/public/assets/js/owl-carousel.js create mode 100644 storage/app/public/assets/js/paginate.js create mode 100644 storage/app/public/assets/js/popover.js create mode 100644 storage/app/public/assets/js/profile-demo.js create mode 100644 storage/app/public/assets/js/progress-bar.js create mode 100644 storage/app/public/assets/js/rickshaw.js create mode 100644 storage/app/public/assets/js/select2.js create mode 100644 storage/app/public/assets/js/settings.js create mode 100644 storage/app/public/assets/js/sparkline.js create mode 100644 storage/app/public/assets/js/tablesorter.js create mode 100644 storage/app/public/assets/js/tabs.js create mode 100644 storage/app/public/assets/js/template.js create mode 100644 storage/app/public/assets/js/tight-grid.js create mode 100644 storage/app/public/assets/js/toastDemo.js create mode 100644 storage/app/public/assets/js/todolist.js create mode 100644 storage/app/public/assets/js/tooltips.js create mode 100644 storage/app/public/assets/js/typeahead.js create mode 100644 storage/app/public/assets/js/wizard.js create mode 100644 storage/app/public/assets/js/x-editable.js create mode 100644 storage/app/public/assets/libs/alertifyjs/build/alertify.min.js create mode 100644 storage/app/public/assets/libs/alertifyjs/build/alertifyjs.zip create mode 100644 storage/app/public/assets/libs/alertifyjs/build/css/alertify.min.css create mode 100644 storage/app/public/assets/libs/alertifyjs/build/css/alertify.rtl.min.css create mode 100644 storage/app/public/assets/libs/alertifyjs/build/css/themes/bootstrap.min.css create mode 100644 storage/app/public/assets/libs/alertifyjs/build/css/themes/bootstrap.rtl.min.css create mode 100644 storage/app/public/assets/libs/alertifyjs/build/css/themes/default.min.css create mode 100644 storage/app/public/assets/libs/alertifyjs/build/css/themes/default.rtl.min.css create mode 100644 storage/app/public/assets/libs/alertifyjs/build/css/themes/semantic.min.css create mode 100644 storage/app/public/assets/libs/alertifyjs/build/css/themes/semantic.rtl.min.css create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/css/bootstrap-datepicker.min.css create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/css/bootstrap-datepicker.standalone.min.css create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/css/bootstrap-datepicker3.min.css create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/css/bootstrap-datepicker3.standalone.min.css create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/js/bootstrap-datepicker.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker-en-CA.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ar-tn.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ar.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.az.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.bg.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.bm.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.bn.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.br.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.bs.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ca.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.cs.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.cy.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.da.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.de.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.el.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.en-AU.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.en-CA.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.en-GB.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.en-IE.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.en-NZ.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.en-ZA.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.eo.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.es.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.et.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.eu.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.fa.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.fi.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.fo.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.fr-CH.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.fr.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.gl.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.he.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.hi.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.hr.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.hu.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.hy.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.id.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.is.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.it-CH.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.it.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ja.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ka.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.kh.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.kk.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.km.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ko.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.kr.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.lt.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.lv.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.me.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.mk.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.mn.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ms.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.nl-BE.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.nl.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.no.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.oc.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.pl.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.pt-BR.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.pt.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ro.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.rs-latin.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.rs.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ru.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.si.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.sk.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.sl.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.sq.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.sr-latin.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.sr.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.sv.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.sw.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.ta.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.tg.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.th.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.tk.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.tr.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.uk.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.uz-cyrl.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.uz-latn.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.vi.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js create mode 100644 storage/app/public/assets/libs/bootstrap-datepicker/locales/bootstrap-datepicker.zh-TW.min.js create mode 100644 storage/app/public/assets/libs/chart.js/Chart.min.js create mode 100644 storage/app/public/assets/libs/icheck/icheck.min.js create mode 100644 storage/app/public/assets/libs/lightgallery/invoice.css create mode 100644 storage/app/public/assets/libs/lightgallery/invoice_06_07_2023.css create mode 100644 storage/app/public/assets/libs/lightgallery/lightgallery.css create mode 100644 storage/app/public/assets/libs/lightgallery/lightgallery.min.js create mode 100644 storage/app/public/assets/libs/lightgallery/preview_result.css create mode 100644 storage/app/public/assets/libs/lightgallery/preview_result__17_07_2023.css create mode 100644 storage/app/public/assets/libs/moment/moment-precise-range.js create mode 100644 storage/app/public/assets/libs/moment/moment.js create mode 100644 storage/app/public/assets/libs/printjs/printjs.css create mode 100644 storage/app/public/assets/libs/printjs/printjs.min.js create mode 100644 storage/app/public/assets/libs/sweetalert2/sweetalert2.all.min.js create mode 100644 storage/app/public/assets/libs/sweetalert2/sweetalert2.min.css create mode 100644 storage/app/public/assets/libs/sweetalert2/sweetalert2.min.js create mode 100644 storage/app/public/assets/libs/webcam/shutter.mp3 create mode 100644 storage/app/public/assets/libs/webcam/webcam.js create mode 100644 storage/app/public/assets/libs/webcam/webcam.min.js create mode 100644 storage/app/public/assets/libs/webcam/webcam.swf create mode 100644 storage/app/public/assets/scss/common/light/_background.scss create mode 100644 storage/app/public/assets/scss/common/light/_demo.scss create mode 100644 storage/app/public/assets/scss/common/light/_fonts.scss create mode 100644 storage/app/public/assets/scss/common/light/_footer.scss create mode 100644 storage/app/public/assets/scss/common/light/_functions.scss create mode 100644 storage/app/public/assets/scss/common/light/_misc.scss create mode 100644 storage/app/public/assets/scss/common/light/_reset.scss create mode 100644 storage/app/public/assets/scss/common/light/_typography.scss create mode 100644 storage/app/public/assets/scss/common/light/_utilities.scss create mode 100644 storage/app/public/assets/scss/common/light/_variables.scss create mode 100644 storage/app/public/assets/scss/common/light/common.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_accordions.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_badges.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_breadcrumbs.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_buttons.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_cards.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_checkbox-radio.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_dropdown.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_forms.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_icons.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_lists.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_pagination.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_popover.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_portfolio.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_preview.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_tables.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_todo-list.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_toggle-switch.scss create mode 100644 storage/app/public/assets/scss/common/light/components/_tooltips.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_bar-loader.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_circle-loader.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_colored-balls.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_dot-opacity-loader.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_flip-square-loader.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_glowing-ball.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_jumping-dots-loader.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_loaders.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_moving-square-loader.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_pixel-loader.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_square-box.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_square-path-loader.scss create mode 100644 storage/app/public/assets/scss/common/light/components/loaders/_variables.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_ace.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_avgrund.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_codemirror.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_icheck.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_jquery-file-upload.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_progressbar-js.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_pws-tabs.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_quill.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_select2.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_summernote.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_tags.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_tinymce.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_toast.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_typeahead.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_wysieditor.scss create mode 100644 storage/app/public/assets/scss/common/light/components/plugin-overrides/_x-editable.scss create mode 100644 storage/app/public/assets/scss/common/light/landing-screens/_auth.scss create mode 100644 storage/app/public/assets/scss/common/light/mixins/_animation.scss create mode 100644 storage/app/public/assets/scss/common/light/mixins/_badges.scss create mode 100644 storage/app/public/assets/scss/common/light/mixins/_blockqoute.scss create mode 100644 storage/app/public/assets/scss/common/light/mixins/_breadcrumbs.scss create mode 100644 storage/app/public/assets/scss/common/light/mixins/_buttons.scss create mode 100644 storage/app/public/assets/scss/common/light/mixins/_cards.scss create mode 100644 storage/app/public/assets/scss/common/light/mixins/_misc.scss create mode 100644 storage/app/public/assets/scss/common/light/mixins/_no-ui-slider.scss create mode 100644 storage/app/public/assets/scss/common/light/mixins/_pagination.scss create mode 100644 storage/app/public/assets/scss/common/light/mixins/_popovers.scss create mode 100644 storage/app/public/assets/scss/common/light/mixins/_tooltips.scss create mode 100644 storage/app/public/assets/scss/vertical-layout-light/_layouts.scss create mode 100644 storage/app/public/assets/scss/vertical-layout-light/_navbar.scss create mode 100644 storage/app/public/assets/scss/vertical-layout-light/_settings-panel.scss create mode 100644 storage/app/public/assets/scss/vertical-layout-light/_sidebar.scss create mode 100644 storage/app/public/assets/scss/vertical-layout-light/_variables.scss create mode 100644 storage/app/public/assets/scss/vertical-layout-light/_vertical-wrapper.scss create mode 100644 storage/app/public/assets/scss/vertical-layout-light/style.scss create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ace.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-beautify.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-code_lens.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-elastic_tabstops_lite.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-emmet.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-error_marker.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-keybinding_menu.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-language_tools.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-linking.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-modelist.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-options.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-prompt.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-rtl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-searchbox.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-settings_menu.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-spellcheck.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-split.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-static_highlight.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-statusbar.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-textarea.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-themelist.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/ext-whitespace.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/keybinding-emacs.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/keybinding-sublime.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/keybinding-vim.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/keybinding-vscode.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-abap.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-abc.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-actionscript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-ada.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-alda.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-apache_conf.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-apex.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-applescript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-aql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-asciidoc.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-asl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-assembly_x86.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-autohotkey.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-batchfile.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-c9search.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-c_cpp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-cirru.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-clojure.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-cobol.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-coffee.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-coldfusion.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-crystal.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-csharp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-csound_document.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-csound_orchestra.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-csound_score.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-csp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-css.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-curly.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-d.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-dart.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-diff.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-django.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-dockerfile.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-dot.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-drools.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-edifact.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-eiffel.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-ejs.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-elixir.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-elm.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-erlang.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-forth.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-fortran.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-fsharp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-fsl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-ftl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-gcode.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-gherkin.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-gitignore.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-glsl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-gobstones.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-golang.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-graphqlschema.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-groovy.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-haml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-handlebars.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-haskell.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-haskell_cabal.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-haxe.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-hjson.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-html.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-html_elixir.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-html_ruby.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-ini.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-io.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-jack.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-jade.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-java.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-javascript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-json.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-json5.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-jsoniq.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-jsp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-jssm.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-jsx.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-julia.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-kotlin.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-latex.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-less.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-liquid.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-lisp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-livescript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-logiql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-logtalk.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-lsl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-lua.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-luapage.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-lucene.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-makefile.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-markdown.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-mask.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-matlab.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-maze.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-mediawiki.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-mel.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-mixal.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-mushcode.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-mysql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-nginx.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-nim.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-nix.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-nsis.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-nunjucks.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-objectivec.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-ocaml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-pascal.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-perl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-perl6.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-pgsql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-php.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-php_laravel_blade.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-pig.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-plain_text.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-powershell.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-praat.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-prisma.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-prolog.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-properties.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-protobuf.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-puppet.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-python.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-qml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-r.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-razor.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-rdoc.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-red.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-redshift.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-rhtml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-rst.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-ruby.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-rust.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-sass.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-scad.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-scala.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-scheme.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-scss.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-sh.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-sjs.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-slim.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-smarty.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-snippets.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-soy_template.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-space.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-sparql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-sql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-sqlserver.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-stylus.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-svg.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-swift.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-tcl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-terraform.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-tex.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-text.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-textile.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-toml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-tsx.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-turtle.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-twig.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-typescript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-vala.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-vbscript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-velocity.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-verilog.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-vhdl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-visualforce.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-wollok.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-xml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-xquery.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-yaml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/mode-zeek.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/abap.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/abc.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/actionscript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/ada.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/alda.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/apache_conf.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/apex.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/applescript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/aql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/asciidoc.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/asl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/assembly_x86.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/autohotkey.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/batchfile.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/c9search.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/c_cpp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/cirru.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/clojure.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/cobol.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/coffee.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/coldfusion.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/crystal.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/csharp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/csound_document.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/csound_orchestra.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/csound_score.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/csp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/css.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/curly.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/d.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/dart.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/diff.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/django.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/dockerfile.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/dot.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/drools.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/edifact.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/eiffel.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/ejs.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/elixir.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/elm.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/erlang.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/forth.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/fortran.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/fsharp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/fsl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/ftl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/gcode.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/gherkin.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/gitignore.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/glsl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/gobstones.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/golang.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/graphqlschema.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/groovy.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/haml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/handlebars.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/haskell.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/haskell_cabal.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/haxe.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/hjson.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/html.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/html_elixir.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/html_ruby.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/ini.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/io.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/jack.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/jade.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/java.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/javascript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/json.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/json5.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/jsoniq.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/jsp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/jssm.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/jsx.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/julia.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/kotlin.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/latex.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/less.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/liquid.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/lisp.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/livescript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/logiql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/logtalk.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/lsl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/lua.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/luapage.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/lucene.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/makefile.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/markdown.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/mask.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/matlab.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/maze.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/mediawiki.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/mel.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/mixal.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/mushcode.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/mysql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/nginx.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/nim.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/nix.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/nsis.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/nunjucks.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/objectivec.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/ocaml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/pascal.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/perl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/perl6.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/pgsql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/php.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/php_laravel_blade.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/pig.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/plain_text.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/powershell.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/praat.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/prisma.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/prolog.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/properties.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/protobuf.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/puppet.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/python.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/qml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/r.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/razor.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/rdoc.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/red.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/redshift.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/rhtml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/rst.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/ruby.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/rust.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/sass.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/scad.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/scala.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/scheme.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/scss.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/sh.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/sjs.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/slim.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/smarty.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/snippets.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/soy_template.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/space.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/sparql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/sql.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/sqlserver.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/stylus.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/svg.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/swift.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/tcl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/terraform.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/tex.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/text.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/textile.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/toml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/tsx.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/turtle.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/twig.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/typescript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/vala.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/vbscript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/velocity.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/verilog.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/vhdl.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/visualforce.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/wollok.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/xml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/xquery.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/yaml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/snippets/zeek.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-ambiance.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-chaos.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-chrome.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-clouds.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-clouds_midnight.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-cobalt.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-crimson_editor.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-dawn.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-dracula.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-dreamweaver.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-eclipse.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-github.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-gob.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-gruvbox.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-idle_fingers.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-iplastic.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-katzenmilch.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-kr_theme.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-kuroir.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-merbivore.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-merbivore_soft.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-mono_industrial.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-monokai.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-nord_dark.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-pastel_on_dark.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-solarized_dark.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-solarized_light.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-sqlserver.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-terminal.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-textmate.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-tomorrow.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-tomorrow_night.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-tomorrow_night_blue.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-tomorrow_night_bright.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-tomorrow_night_eighties.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-twilight.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-vibrant_ink.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/theme-xcode.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/worker-base.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/worker-coffee.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/worker-css.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/worker-html.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/worker-javascript.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/worker-json.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/worker-lua.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/worker-php.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/worker-xml.js create mode 100644 storage/app/public/assets/vendors/ace-builds/src-min/worker-xquery.js create mode 100644 storage/app/public/assets/vendors/chart.js/Chart.min.js create mode 100644 storage/app/public/assets/vendors/codemirror/ambiance.css create mode 100644 storage/app/public/assets/vendors/codemirror/codemirror.css create mode 100644 storage/app/public/assets/vendors/codemirror/codemirror.js create mode 100644 storage/app/public/assets/vendors/codemirror/javascript.js create mode 100644 storage/app/public/assets/vendors/codemirror/shell.js create mode 100644 storage/app/public/assets/vendors/css/vendor.bundle.base.css create mode 100644 storage/app/public/assets/vendors/font-awesome/css/font-awesome.min.css create mode 100644 storage/app/public/assets/vendors/font-awesome/fonts/FontAwesome.otf create mode 100644 storage/app/public/assets/vendors/font-awesome/fonts/fontawesome-webfont.eot create mode 100644 storage/app/public/assets/vendors/font-awesome/fonts/fontawesome-webfont.svg create mode 100644 storage/app/public/assets/vendors/font-awesome/fonts/fontawesome-webfont.ttf create mode 100644 storage/app/public/assets/vendors/font-awesome/fonts/fontawesome-webfont.woff create mode 100644 storage/app/public/assets/vendors/font-awesome/fonts/fontawesome-webfont.woff2 create mode 100644 storage/app/public/assets/vendors/jquery-file-upload/jquery.uploadfile.min.js create mode 100644 storage/app/public/assets/vendors/jquery-file-upload/uploadfile.css create mode 100644 storage/app/public/assets/vendors/jquery.avgrund/jquery.avgrund.min.js create mode 100644 storage/app/public/assets/vendors/js/org.vendor.bundle.base.js create mode 100644 storage/app/public/assets/vendors/js/vendor.bundle.base.js create mode 100644 storage/app/public/assets/vendors/jsgrid/jsgrid-theme.min.css create mode 100644 storage/app/public/assets/vendors/mdi/css/materialdesignicons.min.css create mode 100644 storage/app/public/assets/vendors/mdi/fonts/materialdesignicons-webfont.eot create mode 100644 storage/app/public/assets/vendors/mdi/fonts/materialdesignicons-webfont.svg create mode 100644 storage/app/public/assets/vendors/mdi/fonts/materialdesignicons-webfont.ttf create mode 100644 storage/app/public/assets/vendors/mdi/fonts/materialdesignicons-webfont.woff create mode 100644 storage/app/public/assets/vendors/mdi/fonts/materialdesignicons-webfont.woff2 create mode 100644 storage/app/public/assets/vendors/moment/moment.js create mode 100644 storage/app/public/assets/vendors/moment/moment.min.js create mode 100644 storage/app/public/assets/vendors/pwstabs/jquery.pwstabs.min.css create mode 100644 storage/app/public/assets/vendors/pwstabs/jquery.pwstabs.min.js create mode 100644 storage/app/public/assets/vendors/quill/quill.snow.css create mode 100644 storage/app/public/assets/vendors/select2/select2.min.css create mode 100644 storage/app/public/assets/vendors/select2/select2.min.js create mode 100644 storage/app/public/assets/vendors/simplemde/simplemde.min.css create mode 100644 storage/app/public/assets/vendors/tinymce/bower.json create mode 100644 storage/app/public/assets/vendors/tinymce/changelog.txt create mode 100644 storage/app/public/assets/vendors/tinymce/composer.json create mode 100644 storage/app/public/assets/vendors/tinymce/jquery.tinymce.js create mode 100644 storage/app/public/assets/vendors/tinymce/jquery.tinymce.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/license.txt create mode 100644 storage/app/public/assets/vendors/tinymce/package.json create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/advlist/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/advlist/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/advlist/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/anchor/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/anchor/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/anchor/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/autolink/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/autolink/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/autolink/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/autoresize/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/autoresize/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/autoresize/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/autosave/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/autosave/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/autosave/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/bbcode/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/bbcode/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/bbcode/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/charmap/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/charmap/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/charmap/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/code/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/code/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/code/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/codesample/css/prism.css create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/codesample/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/codesample/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/codesample/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/colorpicker/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/colorpicker/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/colorpicker/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/contextmenu/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/contextmenu/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/contextmenu/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/directionality/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/directionality/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/directionality/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-cool.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-cry.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-embarassed.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-frown.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-innocent.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-kiss.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-laughing.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-money-mouth.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-sealed.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-smile.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-surprised.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-tongue-out.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-undecided.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-wink.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/img/smiley-yell.gif create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/emoticons/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/fullpage/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/fullpage/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/fullpage/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/fullscreen/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/fullscreen/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/fullscreen/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/help/img/logo.png create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/help/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/help/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/help/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/hr/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/hr/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/hr/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/image/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/image/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/image/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/imagetools/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/imagetools/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/imagetools/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/importcss/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/importcss/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/importcss/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/insertdatetime/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/insertdatetime/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/insertdatetime/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/legacyoutput/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/legacyoutput/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/legacyoutput/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/link/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/link/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/link/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/lists/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/lists/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/lists/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/media/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/media/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/media/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/nonbreaking/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/nonbreaking/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/nonbreaking/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/noneditable/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/noneditable/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/noneditable/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/pagebreak/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/pagebreak/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/pagebreak/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/paste/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/paste/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/paste/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/preview/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/preview/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/preview/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/print/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/print/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/print/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/save/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/save/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/save/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/searchreplace/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/searchreplace/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/searchreplace/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/spellchecker/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/spellchecker/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/spellchecker/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/tabfocus/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/tabfocus/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/tabfocus/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/table/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/table/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/table/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/template/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/template/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/template/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/textcolor/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/textcolor/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/textcolor/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/textpattern/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/textpattern/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/textpattern/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/toc/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/toc/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/toc/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/visualblocks/css/visualblocks.css create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/visualblocks/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/visualblocks/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/visualblocks/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/visualchars/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/visualchars/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/visualchars/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/wordcount/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/wordcount/plugin.js create mode 100644 storage/app/public/assets/vendors/tinymce/plugins/wordcount/plugin.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/readme.md create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/content.inline.min.css create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/content.min.css create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/fonts/tinymce-small.eot create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/fonts/tinymce-small.svg create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/fonts/tinymce-small.ttf create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/fonts/tinymce-small.woff create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/fonts/tinymce.eot create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/fonts/tinymce.svg create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/fonts/tinymce.ttf create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/fonts/tinymce.woff create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/img/anchor.gif create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/img/loader.gif create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/img/object.gif create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/img/trans.gif create mode 100644 storage/app/public/assets/vendors/tinymce/skins/lightgray/skin.min.css create mode 100644 storage/app/public/assets/vendors/tinymce/themes/inlite/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/themes/inlite/theme.js create mode 100644 storage/app/public/assets/vendors/tinymce/themes/inlite/theme.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/themes/modern/index.js create mode 100644 storage/app/public/assets/vendors/tinymce/themes/modern/theme.js create mode 100644 storage/app/public/assets/vendors/tinymce/themes/modern/theme.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/tinymce.jquery.js create mode 100644 storage/app/public/assets/vendors/tinymce/tinymce.jquery.min.js create mode 100644 storage/app/public/assets/vendors/tinymce/tinymce.js create mode 100644 storage/app/public/assets/vendors/tinymce/tinymce.min.js create mode 100644 storage/app/public/assets/vendors/twbs-pagination/jquery.twbsPagination.min.js create mode 100644 storage/app/public/assets/vendors/typeahead.js/typeahead.bundle.min.js create mode 100644 storage/app/public/assets/vendors/typicons/LICENCE.md create mode 100644 storage/app/public/assets/vendors/typicons/typicons.css create mode 100644 storage/app/public/assets/vendors/typicons/typicons.eot create mode 100644 storage/app/public/assets/vendors/typicons/typicons.svg create mode 100644 storage/app/public/assets/vendors/typicons/typicons.ttf create mode 100644 storage/app/public/assets/vendors/typicons/typicons.woff create mode 100644 storage/app/public/images/avatars/labs/avatar_19.jpg create mode 100644 storage/app/public/images/avatars/labs/avatar_22.jpg create mode 100644 storage/app/public/images/patients/no-image.png create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/cache/data/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/testing/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 vite.config.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..a186cd2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[compose.yaml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..a9b80d8 --- /dev/null +++ b/.env.example @@ -0,0 +1,65 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +# PHP_CLI_SERVER_WORKERS=4 + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=vechsa_lis +DB_USERNAME=root +DB_PASSWORD= + +SESSION_DRIVER=database +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database + +CACHE_STORE=database +# CACHE_PREFIX= + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_SCHEME=null +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore index d5673e3..b71b1ea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,30 +1,24 @@ -/vendor/ -node_modules/ -npm-debug.log -yarn-error.log - -# Laravel 4 specific -bootstrap/compiled.php -app/storage/ - -# Laravel 5 & Lumen specific -public/storage -public/hot - -# Laravel 5 & Lumen specific with changed public path -public_html/storage -public_html/hot - -storage/*.key +*.log +.DS_Store .env -Homestead.yaml -Homestead.json -/.vagrant -.phpunit.result.cache - -/public/build -/storage/pail .env.backup .env.production .phpactor.json -auth.json +.phpunit.result.cache +/.fleet +/.idea +/.nova +/.phpunit.cache +/.vscode +/.zed +/auth.json +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/storage/pail +/vendor +Homestead.json +Homestead.yaml +Thumbs.db diff --git a/README.md b/README.md index 334f302..0165a77 100644 --- a/README.md +++ b/README.md @@ -1 +1,59 @@ -# hptims \ No newline at end of file +

Laravel Logo

+ +

+Build Status +Total Downloads +Latest Stable Version +License +

+ +## About Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: + +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. You can also check out [Laravel Learn](https://laravel.com/learn), where you will be guided through building a modern Laravel application. + +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. + +## Laravel Sponsors + +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). + +### Premium Partners + +- **[Vehikl](https://vehikl.com)** +- **[Tighten Co.](https://tighten.co)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Redberry](https://redberry.international/laravel-development)** +- **[Active Logic](https://activelogic.com)** + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). + +## Security Vulnerabilities + +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/app/Console/Commands/DisableLabAccess.php b/app/Console/Commands/DisableLabAccess.php new file mode 100644 index 0000000..967a35a --- /dev/null +++ b/app/Console/Commands/DisableLabAccess.php @@ -0,0 +1,52 @@ +where('record_status_id', 1) + ->whereRaw("DATEDIFF(end_date, CURDATE())<=-7") + ->update(['record_status_id' => 0]); + Log::channel('jobs')->info($labs); + } catch (\Exception $e){ + Log::channel('jobs')->error($e->getMessage()); + } + } +} diff --git a/app/Console/Commands/NotifyExpireLab.php b/app/Console/Commands/NotifyExpireLab.php new file mode 100644 index 0000000..6d7ef33 --- /dev/null +++ b/app/Console/Commands/NotifyExpireLab.php @@ -0,0 +1,77 @@ +where('record_status_id', 1) + ->whereNotNull('end_date') + ->whereRaw("DATEDIFF(end_date, CURDATE())=7")->get(); + + Log::channel('jobs')->info($labs); + + foreach ($labs as $lab){ + + $date= date_create(date('Y-m-d', strtotime($lab->end_date))); + date_add($date,date_interval_create_from_date_string("7 days")); + $_disable_date = date_format($date,"d-M-Y"); + + $publication = Publication::query()->create([ + 'title_en' => "License Expiry Alert", + 'title_kh' => "សេចក្តីជូនដំណឹងអំពីការផុតសុំពលភាពនៃការប្រើប្រាស់ប្រព័ន្ធ Labonak", + 'start_date' => date('Y-m-d'), + 'end_date' => date('Y-m-d', strtotime($lab->end_date)), + 'description' => "គណនីប្រើប្រាស់ប្រព័ន្ធរបស់លោកអ្នកនឹងផ្អាកប្រើប្រាស់ជាបណ្ណោះអាសន្ននៅថ្ងៃ " . $_disable_date . " សូមទំនាក់ទំនងទៅកាន់ System Administrator ដើម្បីបន្តសុពលភាព។ សូមអរគុណ!" + ]); + + PublicationReceiver::query()->create([ + 'publication_id' => $publication->id, + 'lab_id' => $lab->id, + 'created_by' => 1 + ]); + } + + } catch (\Exception $e){ + Log::channel('jobs')->error($e->getMessage()); + } + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 0000000..69914e9 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,41 @@ +command('inspire')->hourly(); + } + + /** + * Register the commands for the application. + * + * @return void + */ + protected function commands() + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/app/Enums/DateFormatEnum.php b/app/Enums/DateFormatEnum.php new file mode 100644 index 0000000..c66f3b6 --- /dev/null +++ b/app/Enums/DateFormatEnum.php @@ -0,0 +1,29 @@ + [ + 'bold' => true, + 'size' => 14, + 'color' => ['rgb' => '000000'], + ], + ]; + const DEFAULT = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => 'AAAAAA'], + ], + ], + ]; + + const DEFAULT_HEADER = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => 'AAAAAA'], + ], + ], + 'alignment' => [ + 'horizontal' => 'center' + ], + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => '0c54a4', + ] + ], + 'font' => [ + 'bold' => true, + 'size' => 11, + 'color' => ['rgb' => 'FFFFFF'], + ], + ]; + + const SUB_HEADER = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => 'AAAAAA'], + ], + ], + 'alignment' => [ + 'horizontal' => 'center' + ], + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => '2672c7', + ] + ], + 'font' => [ + 'bold' => true, + 'size' => 11, + 'color' => ['rgb' => 'FFFFFF'], + ], + ]; + + const DEFAULT_TOTAL = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => 'AAAAAA'], + ], + ], + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'c74126', + ] + ], + 'font' => [ + 'bold' => true, + 'size' => 11, + 'color' => ['rgb' => 'FFFFFF'], + ], + ]; + + const KHR_CURRENCY = '#,##0'; + + const GENERAL_CURRENCY = '_(* #,##0_);_(* (#,##0);_(* "-"??_);_(@_)'; + + const GENERAL_CURRENCY_ = '_(* #,##0_);_(* (#,##0);_(* "0"??_);_(@_)'; + + const TITLE = array( + 'alignment' => array( + 'horizontal' => Alignment::HORIZONTAL_CENTER, + 'vertical' => Alignment::VERTICAL_CENTER + ), + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'f3f3f3', + ] + ], + ); + + const BORDER = array( + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => 'AAAAAA'], + ], + ], + ); + + const HEADER = array( + 'font' => array('size' => 14), + 'alignment' => array( + 'horizontal' => Alignment::HORIZONTAL_CENTER, + 'vertical' => Alignment::VERTICAL_CENTER + ) + ); + + const SECTION = array( + 'alignment' => array( + 'horizontal' => Alignment::HORIZONTAL_CENTER, + 'vertical' => Alignment::VERTICAL_CENTER + ), + 'font' => [ + 'bold' => true, + 'size' => 12, + 'color' => ['rgb' => '000000'], + ], + ); + + const LIGHT_SECTION = array( + 'alignment' => array( + 'horizontal' => Alignment::HORIZONTAL_CENTER, + 'vertical' => Alignment::VERTICAL_CENTER + ), + 'font' => [ + 'size' => 12, + 'color' => ['rgb' => '000000'], + ], + ); + + const SECTION_BORDER = array( + 'alignment' => array( + 'horizontal' => Alignment::HORIZONTAL_CENTER, + 'vertical' => Alignment::VERTICAL_CENTER + ), + 'font' => [ + 'bold' => true, + 'size' => 12, + ], + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => 'AAAAAA'], + ], + ], + ); + + const HIGHLIGHT = array( + 'font' => array('bold' => true), + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'E8F0FF', + ] + ], + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => 'AAAAAA'], + ], + ], + 'alignment' => array( + 'vertical' => Alignment::VERTICAL_CENTER + ) + ); + + const GRAY_HEADER = array( + 'font' => array('bold' => true), + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'DDDDDD', + ] + ], + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => 'AAAAAA'], + ], + ], + 'alignment' => array( + 'vertical' => Alignment::VERTICAL_CENTER, + 'horizontal' => Alignment::HORIZONTAL_CENTER, + ) + ); + + const FOOTER = array( + 'font' => array('bold' => true) + ); + + CONST FONT_KHMER = array( + 'font' => array( + 'name' => 'Khmer OS' + ) + ); + + CONST ALIGNMENT = [ + 'alignment' => array( + 'vertical' => Alignment::VERTICAL_CENTER, + 'horizontal' => Alignment::HORIZONTAL_CENTER, + ) + ]; + + const BOLD_BORDER = array( + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ], + ); + + const TEXT_BOLD = array( + 'font' => array('bold' => true) + ); + + const YELLOW_BACKGROUND = array( + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'FAFAD2', + ] + ] + ); + + CONST VERTICAL_ALIGNMENT = [ + 'alignment' => array( + 'vertical' => Alignment::VERTICAL_CENTER, + ) + ]; + + CONST FONT_KH_OS_SIEMREAP = 'Khmer OS Siemreap'; + + CONST FONT_SIZE = 11; +} diff --git a/app/Enums/RecordStatusEnum.php b/app/Enums/RecordStatusEnum.php new file mode 100644 index 0000000..0f4b2b2 --- /dev/null +++ b/app/Enums/RecordStatusEnum.php @@ -0,0 +1,16 @@ +data = $data; + } + + public function array(): array + { + return $this->data; + } + + public function title(): string + { + return 'Doctor-Report'; + } + + public function startCell(): string + { + return 'A3'; + } + + public function setTitleHeadingTable($data): array + { + return $this->headingTitle = $data; + + } + + public function setTitle($title){ + $this->title = $title; + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + + $sheet = $event->sheet->getDelegate(); + $sheet->getParent()->getDefaultStyle()->getFont()->setName(ExcelDesignEnum::FONT_KH_OS_SIEMREAP); + $sheet->getParent()->getDefaultStyle()->getFont()->setSize(ExcelDesignEnum::FONT_SIZE); + + $bgGrandTotal = [ + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'd9d9d9', + ] + ], + 'font' => [ + 'bold' => true, + ] + ]; + + $alignmentCenter = [ + 'alignment' => [ + 'horizontal' => 'center' + ] + ]; + + $alignmentLeft = [ + 'alignment' => [ + 'horizontal' => 'left', + ] + ]; + + $borderAll = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $outBorder = [ + 'borders' => [ + 'outline' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $textBold = [ + 'font' => [ + 'bold' => true, + 'size' => 11, + ], + ]; + + $title = $this->title; + $columns = count($this->headingTitle); + $rows = count($this->data) + 2; + + $lastColumnString = Coordinate::stringFromColumnIndex($columns); + + for($i = 1; $i<=$columns; $i++){ + $nameCell = Coordinate::stringFromColumnIndex($i); + $sheet->getColumnDimension($nameCell)->setWidth(21); + } + + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->mergeCells("A1:$lastColumnString".'1'); + $sheet->setCellValue('A1',$title); + + foreach ($this->headingTitle as $key => $value){ + $cellColumn = $key + 1; + $cellColumnName = Coordinate::stringFromColumnIndex($cellColumn); + $sheet->setCellValue($cellColumnName.'2', $value); + } + + $sheet->getStyle("A1")->applyFromArray($alignmentCenter); + $sheet->getRowDimension(1)->setRowHeight(28); + $sheet->getStyle("A1")->applyFromArray($textBold); + $sheet->getRowDimension(2)->setRowHeight(25); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($borderAll); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($bgGrandTotal); + $sheet->getStyle("A3:A$rows")->applyFromArray($alignmentLeft); + $sheet->getStyle("A3:".$lastColumnString.$rows)->applyFromArray($outBorder); + + } + ]; + } +} diff --git a/app/Exports/DoctorRawExport.php b/app/Exports/DoctorRawExport.php new file mode 100644 index 0000000..16f5b39 --- /dev/null +++ b/app/Exports/DoctorRawExport.php @@ -0,0 +1,146 @@ +data = $data; + } + + public function array(): array + { + return $this->data; + } + + public function title(): string + { + return 'Doctor-Report'; + } + + public function startCell(): string + { + return 'A3'; + } + + public function setTitleHeadingTable($data): array + { + return $this->headingTitle = $data; + + } + + public function setTitle($title){ + $this->title = $title; + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + + $sheet = $event->sheet->getDelegate(); + $sheet->getParent()->getDefaultStyle()->getFont()->setName(ExcelDesignEnum::FONT_KH_OS_SIEMREAP); + $sheet->getParent()->getDefaultStyle()->getFont()->setSize(ExcelDesignEnum::FONT_SIZE); + + $bgGrandTotal = [ + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'd9d9d9', + ] + ], + 'font' => [ + 'bold' => true, + ] + ]; + + $alignmentCenter = [ + 'alignment' => [ + 'horizontal' => 'center' + ] + ]; + + $alignmentLeft = [ + 'alignment' => [ + 'horizontal' => 'left', + ] + ]; + + $borderAll = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $outBorder = [ + 'borders' => [ + 'outline' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $textBold = [ + 'font' => [ + 'bold' => true, + 'size' => 11, + ], + ]; + + $title = $this->title; + $columns = count($this->headingTitle); + $rows = count($this->data) + 2; + + $lastColumnString = Coordinate::stringFromColumnIndex($columns); + + for($i = 1; $i<=$columns; $i++){ + $nameCell = Coordinate::stringFromColumnIndex($i); + $sheet->getColumnDimension($nameCell)->setWidth(21); + } + + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->mergeCells("A1:$lastColumnString".'1'); + $sheet->setCellValue('A1',$title); + + foreach ($this->headingTitle as $key => $value){ + $cellColumn = $key + 1; + $cellColumnName = Coordinate::stringFromColumnIndex($cellColumn); + $sheet->setCellValue($cellColumnName.'2', $value); + } + + $sheet->getStyle("A1")->applyFromArray($alignmentCenter); + $sheet->getRowDimension(1)->setRowHeight(28); + $sheet->getStyle("A1")->applyFromArray($textBold); + $sheet->getRowDimension(2)->setRowHeight(25); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($borderAll); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($bgGrandTotal); + $sheet->getStyle("A3:A$rows")->applyFromArray($alignmentLeft); + $sheet->getStyle("A3:".$lastColumnString.$rows)->applyFromArray($outBorder); + + } + ]; + } +} diff --git a/app/Exports/DoctorSampleSourceExport.php b/app/Exports/DoctorSampleSourceExport.php new file mode 100644 index 0000000..039bc27 --- /dev/null +++ b/app/Exports/DoctorSampleSourceExport.php @@ -0,0 +1,145 @@ +data = $data; + } + + public function array(): array + { + return $this->data; + } + + public function title(): string + { + return 'Doctor-Report'; + } + + public function startCell(): string + { + return 'A3'; + } + + public function setTitleHeadingTable($data): array + { + return $this->headingTitle = $data; + + } + + public function setTitle($title){ + $this->title = $title; + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + + $sheet = $event->sheet->getDelegate(); + $sheet->getParent()->getDefaultStyle()->getFont()->setName(ExcelDesignEnum::FONT_KH_OS_SIEMREAP); + $sheet->getParent()->getDefaultStyle()->getFont()->setSize(ExcelDesignEnum::FONT_SIZE); + + $bgGrandTotal = [ + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'd9d9d9', + ] + ], + 'font' => [ + 'bold' => true, + ] + ]; + + $alignmentCenter = [ + 'alignment' => [ + 'horizontal' => 'center' + ] + ]; + + $alignmentLeft = [ + 'alignment' => [ + 'horizontal' => 'left', + ] + ]; + + $borderAll = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $outBorder = [ + 'borders' => [ + 'outline' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $textBold = [ + 'font' => [ + 'bold' => true, + 'size' => 11, + ], + ]; + + $title = $this->title; + $columns = count($this->headingTitle); + $rows = count($this->data) + 2; + + $lastColumnString = Coordinate::stringFromColumnIndex($columns); + + for($i = 1; $i<=$columns; $i++){ + $nameCell = Coordinate::stringFromColumnIndex($i); + $sheet->getColumnDimension($nameCell)->setWidth(21); + } + + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->mergeCells("A1:$lastColumnString".'1'); + $sheet->setCellValue('A1',$title); + + foreach ($this->headingTitle as $key => $value){ + $cellColumn = $key + 1; + $cellColumnName = Coordinate::stringFromColumnIndex($cellColumn); + $sheet->setCellValue($cellColumnName.'2', $value); + } + + $sheet->getStyle("A1")->applyFromArray($alignmentCenter); + $sheet->getRowDimension(1)->setRowHeight(28); + $sheet->getStyle("A1")->applyFromArray($textBold); + $sheet->getRowDimension(2)->setRowHeight(25); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($borderAll); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($bgGrandTotal); + $sheet->getStyle("A3:A$rows")->applyFromArray($alignmentLeft); + $sheet->getStyle("A3:".$lastColumnString.$rows)->applyFromArray($outBorder); + + } + ]; + } +} diff --git a/app/Exports/FinancialReportExport.php b/app/Exports/FinancialReportExport.php new file mode 100644 index 0000000..e0b526e --- /dev/null +++ b/app/Exports/FinancialReportExport.php @@ -0,0 +1,158 @@ +data = $data; + } + + public function array(): array + { + return $this->data; + } + + public function title(): string + { + return 'Fianancial-Report'; + } + + public function startCell(): string + { + return 'A3'; + } + + public function setTitleHeadingTable($data): array + { + return $this->headingTitle = $data; + + } + + public function setTitle($title){ + $this->title = $title; + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + + $sheet = $event->sheet->getDelegate(); + $sheet->getParent()->getDefaultStyle()->getFont()->setName(ExcelDesignEnum::FONT_KH_OS_SIEMREAP); + $sheet->getParent()->getDefaultStyle()->getFont()->setSize(ExcelDesignEnum::FONT_SIZE); + + $bgGrandTotal = [ + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'd9d9d9', + ] + ], + 'font' => [ + 'bold' => true, + ] + ]; + + $alignmentCenter = [ + 'alignment' => [ + 'horizontal' => 'center' + ] + ]; + + $alignmentLeft = [ + 'alignment' => [ + 'horizontal' => 'left', + ] + ]; + + $borderAll = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $outBorder = [ + 'borders' => [ + 'outline' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $textBold = [ + 'font' => [ + 'bold' => true, + 'size' => 11, + ], + ]; + + $title = $this->title; + $columns = count($this->headingTitle); + $rows = count($this->data) + 2; + + $lastColumnString = Coordinate::stringFromColumnIndex($columns); + + for($i = 1; $i<=$columns; $i++){ + $nameCell = Coordinate::stringFromColumnIndex($i); + $sheet->getColumnDimension($nameCell)->setWidth(21); + } + + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->mergeCells("A1:$lastColumnString".'1'); + $sheet->setCellValue('A1',$title); + + foreach ($this->headingTitle as $key => $value){ + $cellColumn = $key + 1; + $cellColumnName = Coordinate::stringFromColumnIndex($cellColumn); + $sheet->setCellValue($cellColumnName.'2', $value); + } + + $sheet->getStyle("A".($rows+1).":G".($rows+1))->applyFromArray($alignmentCenter); + $sheet->mergeCells("A".($rows+1).":G".($rows+1)); + $sheet->setCellValue('A'.($rows+1), 'Total'); + $sheet->setCellValue('H'.($rows+1), '=SUM(H3:H'.($rows).')'); + $sheet->setCellValue('I'.($rows+1), '=SUM(I3:I'.($rows).')'); + $sheet->setCellValue('J'.($rows+1), '=SUM(J3:J'.($rows).')'); + $sheet->setCellValue('K'.($rows+1), '=SUM(K3:K'.($rows).')'); + $sheet->setCellValue('L'.($rows+1), '=SUM(L3:L'.($rows).')'); + $sheet->setCellValue('M'.($rows+1), '=SUM(M3:M'.($rows).')'); + + $sheet->getStyle("A1")->applyFromArray($alignmentCenter); + $sheet->getRowDimension(1)->setRowHeight(28); + $sheet->getStyle("A1")->applyFromArray($textBold); + $sheet->getRowDimension(2)->setRowHeight(25); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($borderAll); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($bgGrandTotal); + $sheet->getStyle("A3:A$rows")->applyFromArray($alignmentLeft); + $sheet->getStyle("A3:".$lastColumnString.$rows)->applyFromArray($outBorder); + + } + ]; + } +} diff --git a/app/Exports/InventoryOnHandExport.php b/app/Exports/InventoryOnHandExport.php new file mode 100644 index 0000000..0f06cf3 --- /dev/null +++ b/app/Exports/InventoryOnHandExport.php @@ -0,0 +1,147 @@ +data = $data; + } + + public function array(): array + { + return $this->data; + } + + public function title(): string + { + return 'Inventory On hand'; + } + + public function startCell(): string + { + return 'A3'; + } + + public function setTitleHeadingTable($data): array + { + return $this->headingTitle = $data; + + } + + public function setTitle($title){ + $this->title = $title; + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + + $sheet = $event->sheet->getDelegate(); + $sheet->getParent()->getDefaultStyle()->getFont()->setName(ExcelDesignEnum::FONT_KH_OS_SIEMREAP); + $sheet->getParent()->getDefaultStyle()->getFont()->setSize(ExcelDesignEnum::FONT_SIZE); + + $bgGrandTotal = [ + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'd9d9d9', + ] + ], + 'font' => [ + 'bold' => true, + ] + ]; + + $alignmentCenter = [ + 'alignment' => [ + 'horizontal' => 'center' + ] + ]; + + $alignmentLeft = [ + 'alignment' => [ + 'horizontal' => 'left', + ] + ]; + + $borderAll = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $outBorder = [ + 'borders' => [ + 'outline' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $textBold = [ + 'font' => [ + 'bold' => true, + 'size' => 11, + ], + ]; + + $title = $this->title; + $columns = count($this->headingTitle); + $rows = count($this->data) + 2; + + $lastColumnString = Coordinate::stringFromColumnIndex($columns); + + for($i = 1; $i<=$columns; $i++){ + $nameCell = Coordinate::stringFromColumnIndex($i); + $sheet->getColumnDimension($nameCell)->setWidth(21); + } + + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->mergeCells("A1:$lastColumnString".'1'); + $sheet->setCellValue('A1',$title); + + foreach ($this->headingTitle as $key => $value){ + $cellColumn = $key + 1; + $cellColumnName = Coordinate::stringFromColumnIndex($cellColumn); + $sheet->setCellValue($cellColumnName.'2', $value); + } + + $sheet->getStyle("A1")->applyFromArray($alignmentCenter); + $sheet->getRowDimension(1)->setRowHeight(28); + $sheet->getStyle("A1")->applyFromArray($textBold); + $sheet->getRowDimension(2)->setRowHeight(25); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($borderAll); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($bgGrandTotal); + $sheet->getStyle("A3:A$rows")->applyFromArray($alignmentLeft); + $sheet->getStyle("A3:".$lastColumnString.$rows)->applyFromArray($outBorder); + + } + ]; + } +} diff --git a/app/Exports/ItemExpiredExport.php b/app/Exports/ItemExpiredExport.php new file mode 100644 index 0000000..b8de042 --- /dev/null +++ b/app/Exports/ItemExpiredExport.php @@ -0,0 +1,147 @@ +data = $data; + } + + public function array(): array + { + return $this->data; + } + + public function title(): string + { + return 'Expired items'; + } + + public function startCell(): string + { + return 'A3'; + } + + public function setTitleHeadingTable($data): array + { + return $this->headingTitle = $data; + + } + + public function setTitle($title){ + $this->title = $title; + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + + $sheet = $event->sheet->getDelegate(); + $sheet->getParent()->getDefaultStyle()->getFont()->setName(ExcelDesignEnum::FONT_KH_OS_SIEMREAP); + $sheet->getParent()->getDefaultStyle()->getFont()->setSize(ExcelDesignEnum::FONT_SIZE); + + $bgGrandTotal = [ + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'd9d9d9', + ] + ], + 'font' => [ + 'bold' => true, + ] + ]; + + $alignmentCenter = [ + 'alignment' => [ + 'horizontal' => 'center' + ] + ]; + + $alignmentLeft = [ + 'alignment' => [ + 'horizontal' => 'left', + ] + ]; + + $borderAll = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $outBorder = [ + 'borders' => [ + 'outline' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $textBold = [ + 'font' => [ + 'bold' => true, + 'size' => 11, + ], + ]; + + $title = $this->title; + $columns = count($this->headingTitle); + $rows = count($this->data) + 2; + + $lastColumnString = Coordinate::stringFromColumnIndex($columns); + + for($i = 1; $i<=$columns; $i++){ + $nameCell = Coordinate::stringFromColumnIndex($i); + $sheet->getColumnDimension($nameCell)->setWidth(21); + } + + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->mergeCells("A1:$lastColumnString".'1'); + $sheet->setCellValue('A1',$title); + + foreach ($this->headingTitle as $key => $value){ + $cellColumn = $key + 1; + $cellColumnName = Coordinate::stringFromColumnIndex($cellColumn); + $sheet->setCellValue($cellColumnName.'2', $value); + } + + $sheet->getStyle("A1")->applyFromArray($alignmentCenter); + $sheet->getRowDimension(1)->setRowHeight(28); + $sheet->getStyle("A1")->applyFromArray($textBold); + $sheet->getRowDimension(2)->setRowHeight(25); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($borderAll); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($bgGrandTotal); + $sheet->getStyle("A3:A$rows")->applyFromArray($alignmentLeft); + $sheet->getStyle("A3:".$lastColumnString.$rows)->applyFromArray($outBorder); + + } + ]; + } +} diff --git a/app/Exports/StockinExport.php b/app/Exports/StockinExport.php new file mode 100644 index 0000000..76becad --- /dev/null +++ b/app/Exports/StockinExport.php @@ -0,0 +1,147 @@ +data = $data; + } + + public function array(): array + { + return $this->data; + } + + public function title(): string + { + return 'Stock In Report'; + } + + public function startCell(): string + { + return 'A3'; + } + + public function setTitleHeadingTable($data): array + { + return $this->headingTitle = $data; + + } + + public function setTitle($title){ + $this->title = $title; + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + + $sheet = $event->sheet->getDelegate(); + $sheet->getParent()->getDefaultStyle()->getFont()->setName(ExcelDesignEnum::FONT_KH_OS_SIEMREAP); + $sheet->getParent()->getDefaultStyle()->getFont()->setSize(ExcelDesignEnum::FONT_SIZE); + + $bgGrandTotal = [ + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'd9d9d9', + ] + ], + 'font' => [ + 'bold' => true, + ] + ]; + + $alignmentCenter = [ + 'alignment' => [ + 'horizontal' => 'center' + ] + ]; + + $alignmentLeft = [ + 'alignment' => [ + 'horizontal' => 'left', + ] + ]; + + $borderAll = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $outBorder = [ + 'borders' => [ + 'outline' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $textBold = [ + 'font' => [ + 'bold' => true, + 'size' => 11, + ], + ]; + + $title = $this->title; + $columns = count($this->headingTitle); + $rows = count($this->data) + 2; + + $lastColumnString = Coordinate::stringFromColumnIndex($columns); + + for($i = 1; $i<=$columns; $i++){ + $nameCell = Coordinate::stringFromColumnIndex($i); + $sheet->getColumnDimension($nameCell)->setWidth(21); + } + + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->mergeCells("A1:$lastColumnString".'1'); + $sheet->setCellValue('A1',$title); + + foreach ($this->headingTitle as $key => $value){ + $cellColumn = $key + 1; + $cellColumnName = Coordinate::stringFromColumnIndex($cellColumn); + $sheet->setCellValue($cellColumnName.'2', $value); + } + + $sheet->getStyle("A1")->applyFromArray($alignmentCenter); + $sheet->getRowDimension(1)->setRowHeight(28); + $sheet->getStyle("A1")->applyFromArray($textBold); + $sheet->getRowDimension(2)->setRowHeight(25); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($borderAll); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($bgGrandTotal); + $sheet->getStyle("A3:A$rows")->applyFromArray($alignmentLeft); + $sheet->getStyle("A3:".$lastColumnString.$rows)->applyFromArray($outBorder); + + } + ]; + } +} diff --git a/app/Exports/StockoutExport.php b/app/Exports/StockoutExport.php new file mode 100644 index 0000000..23d193f --- /dev/null +++ b/app/Exports/StockoutExport.php @@ -0,0 +1,147 @@ +data = $data; + } + + public function array(): array + { + return $this->data; + } + + public function title(): string + { + return 'Stock In Report'; + } + + public function startCell(): string + { + return 'A3'; + } + + public function setTitleHeadingTable($data): array + { + return $this->headingTitle = $data; + + } + + public function setTitle($title){ + $this->title = $title; + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + + $sheet = $event->sheet->getDelegate(); + $sheet->getParent()->getDefaultStyle()->getFont()->setName(ExcelDesignEnum::FONT_KH_OS_SIEMREAP); + $sheet->getParent()->getDefaultStyle()->getFont()->setSize(ExcelDesignEnum::FONT_SIZE); + + $bgGrandTotal = [ + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'd9d9d9', + ] + ], + 'font' => [ + 'bold' => true, + ] + ]; + + $alignmentCenter = [ + 'alignment' => [ + 'horizontal' => 'center' + ] + ]; + + $alignmentLeft = [ + 'alignment' => [ + 'horizontal' => 'left', + ] + ]; + + $borderAll = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $outBorder = [ + 'borders' => [ + 'outline' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $textBold = [ + 'font' => [ + 'bold' => true, + 'size' => 11, + ], + ]; + + $title = $this->title; + $columns = count($this->headingTitle); + $rows = count($this->data) + 2; + + $lastColumnString = Coordinate::stringFromColumnIndex($columns); + + for($i = 1; $i<=$columns; $i++){ + $nameCell = Coordinate::stringFromColumnIndex($i); + $sheet->getColumnDimension($nameCell)->setWidth(21); + } + + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->mergeCells("A1:$lastColumnString".'1'); + $sheet->setCellValue('A1',$title); + + foreach ($this->headingTitle as $key => $value){ + $cellColumn = $key + 1; + $cellColumnName = Coordinate::stringFromColumnIndex($cellColumn); + $sheet->setCellValue($cellColumnName.'2', $value); + } + + $sheet->getStyle("A1")->applyFromArray($alignmentCenter); + $sheet->getRowDimension(1)->setRowHeight(28); + $sheet->getStyle("A1")->applyFromArray($textBold); + $sheet->getRowDimension(2)->setRowHeight(25); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($borderAll); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($bgGrandTotal); + $sheet->getStyle("A3:A$rows")->applyFromArray($alignmentLeft); + $sheet->getStyle("A3:".$lastColumnString.$rows)->applyFromArray($outBorder); + + } + ]; + } +} diff --git a/app/Exports/SummaryReportExport.php b/app/Exports/SummaryReportExport.php new file mode 100644 index 0000000..916a81c --- /dev/null +++ b/app/Exports/SummaryReportExport.php @@ -0,0 +1,147 @@ +data = $data; + } + + public function array(): array + { + return $this->data; + } + + public function title(): string + { + return 'summary_report'; + } + + public function startCell(): string + { + return 'A3'; + } + + public function setTitleHeadingTable($data): array + { + return $this->headingTitle = $data; + + } + + public function setTitle($title){ + $this->title = $title; + } + + public function registerEvents(): array + { + return [ + AfterSheet::class => function (AfterSheet $event) { + + $sheet = $event->sheet->getDelegate(); + $sheet->getParent()->getDefaultStyle()->getFont()->setName(ExcelDesignEnum::FONT_KH_OS_SIEMREAP); + $sheet->getParent()->getDefaultStyle()->getFont()->setSize(ExcelDesignEnum::FONT_SIZE); + + $bgGrandTotal = [ + 'fill' => [ + 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID, + 'color' => [ + 'rgb' => 'd9d9d9', + ] + ], + 'font' => [ + 'bold' => true, + ] + ]; + + $alignmentCenter = [ + 'alignment' => [ + 'horizontal' => 'center' + ] + ]; + + $alignmentLeft = [ + 'alignment' => [ + 'horizontal' => 'left', + ] + ]; + + $borderAll = [ + 'borders' => [ + 'allBorders' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $outBorder = [ + 'borders' => [ + 'outline' => [ + 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN, + 'color' => ['rgb' => '000000'], + ], + ] + ]; + + $textBold = [ + 'font' => [ + 'bold' => true, + 'size' => 11, + ], + ]; + + $title = $this->title; + $columns = count($this->headingTitle); + $rows = count($this->data) + 2; + + $lastColumnString = Coordinate::stringFromColumnIndex($columns); + + for($i = 1; $i<=$columns; $i++){ + $nameCell = Coordinate::stringFromColumnIndex($i); + $sheet->getColumnDimension($nameCell)->setAutoSize(true); + //setWidth(21); + } + + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->mergeCells("A1:$lastColumnString".'1'); + $sheet->setCellValue('A1',$title); + + foreach ($this->headingTitle as $key => $value){ + $cellColumn = $key + 1; + $cellColumnName = Coordinate::stringFromColumnIndex($cellColumn); + $sheet->setCellValue($cellColumnName.'2', $value); + } + + $sheet->getStyle("A1")->applyFromArray($alignmentCenter); + $sheet->getRowDimension(1)->setRowHeight(28); + $sheet->getStyle("A1")->applyFromArray($textBold); + $sheet->getRowDimension(2)->setRowHeight(25); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($alignmentCenter); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($borderAll); + $sheet->getStyle("A2:".$lastColumnString."2")->applyFromArray($bgGrandTotal); + $sheet->getStyle("A3:A$rows")->applyFromArray($alignmentLeft); + $sheet->getStyle("A3:".$lastColumnString.$rows)->applyFromArray($outBorder); + + } + ]; + } +} diff --git a/app/Helpers/Helpers.php b/app/Helpers/Helpers.php new file mode 100644 index 0000000..5a70b0c --- /dev/null +++ b/app/Helpers/Helpers.php @@ -0,0 +1,162 @@ + 0) { + return number_format($value, $decimal); + } + + return number_format($value, fmod($value, 1) == 0 ? 0 : 2); + } + + public static function isDateValid($date) + { + if(!is_null($date) && $date != '' && !empty($date) && $date !== "0000-00-00") { + return ((strtotime($date) < 0) || (strtotime($date) == false)) ? false : true; + } + else return false; + } + + public static function generateUuId($prefixClass){ + $hexTimestamp = strtoupper(dechex(round((1000000*gettimeofday()['sec']) + (gettimeofday()['usec'])))); + return + $prefixClass . + '-'. + str_pad(substr($hexTimestamp, 8, 3),3,'0',STR_PAD_RIGHT). + str_pad(substr($hexTimestamp, 11, 3),3,'0',STR_PAD_LEFT). + str_pad(mt_rand(1,99),2,'0',STR_PAD_LEFT); + } + + public static function generateUuIdForManual($prefixClass, $manual_code){ + return $prefixClass . '-'.date('ymd').'-'.$manual_code; + } + + public static function split_name($name) { + return explode(" ",$name,2); + } + + public static function getAge($startDate, $endDate) { + $today = new DateTime($endDate); + $diff = $today->diff(new DateTime($startDate)); + $years = $diff->y; + $months = $diff->m; + $days = $diff->d; + + /*if($years>0) return "$years ".__('sample.year') .($months > 0 ? ' '. $months .__('sample.month') : '') . ($days>0? ' ' . $days . __('sample.day'): ''); + return ($months > 0 ? ' '. $months .__('sample.month') : ''). ($days>0? ' ' . $days . __('sample.day'): '');*/ + + if($years ==0 && $months == 0) return $days . __('sample.day'); + elseif($years == 0 && $months > 0) return $months .__('sample.month'); + else return "$years ".__('sample.year'); + + /*if($years>0) return "$years ".__('sample.year') .($months > 0 ? ' '. $months .__('sample.month') : ''); + return $months .__('sample.month') .', '. $days . __('sample.day');*/ + } + + public static function getGender($sex){ + if($sex == 1) return __('sample.sex_m'); + return __('sample.sex_f'); + } + + public static function getGenderfull($sex){ + if($sex == 1) return __('sample.sex_male'); + return __('sample.sex_female'); + } + + public static function knum($string){ + $string = str_replace(array('1','2','3','4','5','6','7','8','9','0','.'), + array('១','២','៣','៤','៥','៦','៧','៨','៩','០',','), $string); + return $string; + } + + public static function getPatientAddress($patientObject){ + $address = ''; + if(App::getLocale()=='en'){ + if(isset($patientObject->province->name_en)) $address.= $patientObject->province->name_en; + if(isset($patientObject->district->name_en)) $address.= ', '. $patientObject->district->name_en; + if(isset($patientObject->commune->name_en)) $address.= ', '. $patientObject->commune->name_en; + if(isset($patientObject->viilage->name_en)) $address.= ', '. $patientObject->viilage->name_en; + }else{ + if(isset($patientObject->province->name_kh)) $address.= $patientObject->province->name_kh; + if(isset($patientObject->district->name_kh)) $address.= ', '. $patientObject->district->name_kh; + if(isset($patientObject->commune->name_kh)) $address.= ', '. $patientObject->commune->name_kh; + if(isset($patientObject->viilage->name_kh)) $address.= ', '. $patientObject->viilage->name_kh; + } + return $address; + } + + public static function getPrinterSignature($sampleId){ + $sample = Sample::query()->find( $sampleId); + if($sample->is_printed == 1){ + return User::query()->find($sample->printed_by)->signature; + }else{ + return @Auth::user()->signature; + } + } + + public static function setExcelSheetCell($sheet, $cellStart, $cellEnd, $value, $format = []){ + if($cellStart != $cellEnd){ + $sheet->mergeCells($cellStart.":".$cellEnd); + } + foreach(range(Str::substr($cellStart,0,1),Str::substr($cellEnd,0,1)) as $columnID) { + $sheet->getColumnDimension($columnID)->setAutoSize(true); + } + $sheet->setCellValue($cellStart, $value); + if(!is_null($format) || !empty($format)){ + $sheet->getStyle($cellStart.":".$cellEnd)->applyFromArray($format); + } + } + + public static function getNotify(){ + $publication = DB::select(" + SELECT + p.* + FROM publications p + INNER JOIN publication_receivers pr + ON pr.publication_id = p.id + WHERE DATE(NOW()) BETWEEN start_date AND end_date AND p.record_status_id = 1 + AND pr.lab_id = " . Session::get('base_lab_id')); + return $publication; + } + + public static function generatePatientBotLink($individual_type = 'patient',$labId, $patientId) + { + $botUsername = env('TELEGRAM_BOT_NAME'); // e.g. "MyLabBot" + if ($individual_type == 'sample_source'){ + // if $individual_type is sample_source, patientId is sample source id + return "https://t.me/{$botUsername}?start=samplesource_{$patientId}"; + } + return "https://t.me/{$botUsername}?start={$patientId}"; + } + +} diff --git a/app/Helpers/SessionHelper.php b/app/Helpers/SessionHelper.php new file mode 100644 index 0000000..8129144 --- /dev/null +++ b/app/Helpers/SessionHelper.php @@ -0,0 +1,20 @@ +get(); + return view('audit-logs.index',compact('users')); + } + + public function data(Request $request) + { + + $query = Activity::with('causer')->orderBy('created_at','desc'); + + if($request->event){ + $query->where('description',$request->event); + } + + if($request->user_id){ + $query->where('causer_id',$request->user_id); + } + + if($request->date_from){ + $query->whereDate('created_at','>=',$request->date_from); + } + + if($request->date_to){ + $query->whereDate('created_at','<=',$request->date_to); + } + + return DataTables::of($query) + + ->addColumn('module', function ($log) { + return class_basename($log->subject_type); + }) + + ->addColumn('user', function ($log) { + return $log->causer->name ?? 'System'; + }) + + ->editColumn('created_at', function ($log) { + return ' + '.$log->created_at->diffForHumans().' + '; + }) + + ->addColumn('action', function ($log) { + + return ''; + + }) + + ->rawColumns(['created_at','action']) + + ->make(true); + + } + +} diff --git a/app/Http/Controllers/AntibioticController.php b/app/Http/Controllers/AntibioticController.php new file mode 100644 index 0000000..a639c18 --- /dev/null +++ b/app/Http/Controllers/AntibioticController.php @@ -0,0 +1,101 @@ +model = $antibioticModel; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_antibiotic'])) return redirect(url('my-profile')); + $antibiotics = $this->model::with(['lab'])->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->when(!empty($request->kword), function ($antibiotics) use($request){ + $antibiotics->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + })->orderBy(BaseModel::CREATED_AT_FIELD,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('antibiotic', ['antibiotics' => AntibioticResource::collection($antibiotics)]); + } + + public function save(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_antibiotic'])) return false; + $validator = \Validator::make($request->all(), ['name_en' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('antibiotic.create_fail'), 'errors' => $validator->errors()->all()]); + $antibiotic = $this->model::query()->create([ 'name_en' => $request->name_en, 'weight' => $request->weight]); + return response()->json(['success' => true, 'message' => __('antibiotic.create_success'), 'data' => [$antibiotic]]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('antibiotic.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_antibiotic'])) return false; + $validator = \Validator::make($request->all(), ['name_en' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('antibiotic.update_fail'), 'errors' => $e->getMessage()]); + $data = array( + 'name_en' => $request->name_en, + 'weight' => $request->weight + ); + $this->model::query()->where('id', $request->uid)->update($data); + return response()->json(['success' => true, 'message' => __('antibiotic.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('antibiotic.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $antibiotic = $this->model::query()->find($request->uid); + return response()->json(['success' => true, 'message' => __('antibiotic.get_success'), 'data' => new AntibioticResource($antibiotic)]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('antibiotic.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_antibiotic'])) return false; + $this->model::query()->where('id', $request->uid)->update(array('record_status_id'=> RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('antibiotic.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('antibiotic.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->model::query()->where('id', $request->uid)->update(array('record_status_id'=> RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('antibiotic.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('antibiotic.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + +} diff --git a/app/Http/Controllers/Api/AuthController.php b/app/Http/Controllers/Api/AuthController.php new file mode 100644 index 0000000..98f59c0 --- /dev/null +++ b/app/Http/Controllers/Api/AuthController.php @@ -0,0 +1,37 @@ +only('email', 'password'); // or 'username' if you use that + + //if($request->client_id != env('ANALYZER_CLIENT_ID') || $request->client_secret != env('ANALYZER_CLIENT_SECRET')){ + // return response()->json(['error' => 'Invalid credentials'], 401); + //} + + if (!Auth::attempt($credentials)) { + return response()->json(['error' => 'Invalid credentials'], 401); + } + + $user = Auth::user(); + $token = $user->createToken('api-token')->accessToken; + return response()->json([ + 'token_type' => 'Bearer', + 'expires_in' => 1800, + 'access_token' => $token, + ]); + } + + public function logout(Request $request) + { + $request->user()->token()->delete(); + return response()->json(['message' => 'Logged out successfully']); + } +} diff --git a/app/Http/Controllers/Api/SampleResultController.php b/app/Http/Controllers/Api/SampleResultController.php new file mode 100644 index 0000000..045857e --- /dev/null +++ b/app/Http/Controllers/Api/SampleResultController.php @@ -0,0 +1,64 @@ +sampleModel = new Sample(); + $this->testResultModel = new TestResult(); + } + + public function pushLabResult(Request $request){ + try{ + $validator = \Validator::make($request->all(), ['message.pid' => 'required', 'message.result' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('Some variables are requires'), 'errors' => $validator->errors()->all()]); + $testSamples = collect($this->getSampleTest($request->message['pid'])); + + if(!empty($testSamples)) { + foreach ($request->message['result'] as $row) { + if (!empty($row['code']) && !empty($row['value'])) { + $resultRecord = $testSamples->filter(function ($val, $key) use ($row) { + return $val->code == $row['code']; + })->first(); + if(!empty($resultRecord)){ + $data = array( + 'test_result' => $row['value'], + 'test_date' => date('Y-m-d'), + 'created_at' => date('Y-m-d H:i:s') + ); + $this->testResultModel::query()->where(['id' => $resultRecord->result_id])->update($data); + } + } + } + } + return response()->json(['success' => true, 'message' => __('Laboratory result already pushed!')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('Failed while pushing laboratory result!'), 'errors' => $e->getMessage()]); + } + } + + private function getSampleTest( $sampleNumber){ + return DB::select("SELECT + s.id, + tr.id as result_id, + tr.test_sample_id, + tr.test_result, + ts.code, + ts.`unit_sign` + FROM samples s + INNER JOIN test_results tr ON tr.`sample_id` = s.`id` AND tr.`record_status_id` = 1 + INNER JOIN test_samples ts ON ts.`id` = tr.`test_sample_id` + WHERE s.`sample_number` = '".$sampleNumber."'"); + } + +} diff --git a/app/Http/Controllers/AppointmentController.php b/app/Http/Controllers/AppointmentController.php new file mode 100644 index 0000000..66ad79e --- /dev/null +++ b/app/Http/Controllers/AppointmentController.php @@ -0,0 +1,117 @@ +model = new Appointment(); + $this->patientModel = new Patient(); + $this->physicianModel = new Physician(); + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_appointment'])) return redirect(url('my-profile')); + $conceptCodes = $this->model::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->groupBy('appointment_type')->get('appointment_type'); + $patients = $this->patientModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => BaseModel::RECORD_STATUS_ACTIVE])->limit(20)->get(); + $physicians = $this->physicianModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId])->orderBy('name_en', 'ASC')->get(); + $appointments = $this->model::with(['patient', 'doctor'])->where(BaseModel::RECORD_STATUS_FIELD, BaseModel::RECORD_STATUS_ACTIVE) + ->where('lab_id', $this->baseLabId) + ->when(!empty($request->appointment_type), function ($query) use($request){ + $query->where('appointment_type', $request->appointment_type); + })->when(!empty($request->appointment_date), function ($query) use($request) { + $query->whereDate('appointment_date', date('Y-m-d', strtotime($request->appointment_date))); + })->orderBy('appointment_date','desc')->paginate(config('labis.pagination.perpage', 10)); + return view('appointment', ['appointments' => $appointments, 'conceptCodes' => $conceptCodes, 'patients' => $patients, 'patient_id' => 0, 'physicians' => $physicians]); + } + + public function store(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_appointment'])) return false; + $validator = \Validator::make($request->all(), ['patient_id' => 'required', 'appointment_date' => 'required', 'appointment_type' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('appointment.create_fail'), 'errors' => $validator->errors()->all()]); + + $app=new Appointment(); + $app->patient_id=$request->patient_id; + $app->appointment_date=date('Y-m-d H:i:s', strtotime($request->appointment_date)); + $app->appointment_type=$request->appointment_type; + $app->description=$request->description; + $app->doctor_id=$request->doctor_id; + $app->lab_id=$this->baseLabId; + $app->save(); + return response()->json(['success' => true, 'message' => __('appointment.create_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('appointment.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try { + if(!GlobalController::user_can(Auth::user()->role_id, ['update_appointment'])) return false; + $validator = \Validator::make($request->all(), ['patient_id' => 'required', 'appointment_date' => 'required', 'appointment_type' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('appointment.update_fail'), 'errors' => $validator->errors()->all()]); + $app=Appointment::find($request->uid); + $app->appointment_date=date('Y-m-d H:i:s', strtotime($request->appointment_date)); + $app->appointment_type=$request->appointment_type; + $app->description=$request->description; + $app->doctor_id=$request->doctor_id; + $app->lab_id=$this->baseLabId; + $app->save(); + return response()->json(['success' => true, 'message' => __('appointment.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('appointment.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $test = $this->model::query()->where(['lab_id' => $this->baseLabId, 'id' => $request->uid])->get()->first(); + return response()->json(['success' => true, 'message' => __('appointment.get_success'), 'data' => $test]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('appointment.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_appointment'])) return false; + $this->model::query()->where(['id' => $request->uid, 'lab_id' => $this->baseLabId])->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('appointment.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('appointment.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function getAlertNofication(){ + try{ + $appointments = $this->model::with(['patient:id,name_en,phone_number', 'doctor:id,name_en'])->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->where('lab_id', $this->baseLabId) + ->whereBetween('appointment_date', [Carbon::today(), Carbon::today()->addDays(2)])->orderBy('appointment_date','desc')->get(); + $count = $appointments->count(); + return response()->json(['success' => true, 'message' => __('appointment.get_success'), 'data' => $appointments, 'count' => $count]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('appointment.get_fail'), 'errors' => $e->getMessage()]); + } + } + +} diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php new file mode 100644 index 0000000..1c9232e --- /dev/null +++ b/app/Http/Controllers/Auth/AuthController.php @@ -0,0 +1,48 @@ +validate([ + 'username' => 'required', + 'password' => 'required', + ]); + + $credentials = $request->only('UserName', 'Password'); + dd('sda'); + + if (auth()->attempt($credentials)) { + return redirect()->route('homepage'); + + }else{ + session()->flash('error', 'Invalid credentials'); + return redirect()->route('login'); + + } + + + //return redirect("login")->withSuccess('Oppes! You have entered invalid credentials'); + } + + /** + * Write code on Method + * + * @return response() + */ + +} diff --git a/app/Http/Controllers/Auth/AuthenticatedSessionController.php b/app/Http/Controllers/Auth/AuthenticatedSessionController.php new file mode 100644 index 0000000..ddfbe1e --- /dev/null +++ b/app/Http/Controllers/Auth/AuthenticatedSessionController.php @@ -0,0 +1,72 @@ +authenticate(); + activity() + ->causedBy(Auth::user()) + ->withProperties([ + 'ip' => request()->ip(), + 'browser' => request()->userAgent() + ]) + ->log('User Login'); + + $request->session()->regenerate(); + if (!$request->session()->has('base_lab_id')) { + return redirect()->route('base'); + } + return redirect()->intended(RouteServiceProvider::HOME); + } + + /** + * Destroy an authenticated session. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(Request $request) + { + activity() + ->causedBy(Auth::user()) + ->withProperties([ + 'ip' => request()->ip(), + 'browser' => request()->userAgent() + ]) + ->log('User Logout'); + Auth::guard('web')->logout(); + + + $request->session()->invalidate(); + + $request->session()->regenerateToken(); + + return redirect('/'); + } +} diff --git a/app/Http/Controllers/Auth/ConfirmablePasswordController.php b/app/Http/Controllers/Auth/ConfirmablePasswordController.php new file mode 100644 index 0000000..1175010 --- /dev/null +++ b/app/Http/Controllers/Auth/ConfirmablePasswordController.php @@ -0,0 +1,44 @@ +validate([ + 'email' => $request->user()->email, + 'password' => $request->password, + ])) { + throw ValidationException::withMessages([ + 'password' => __('auth.password'), + ]); + } + + $request->session()->put('auth.password_confirmed_at', time()); + + return redirect()->intended(RouteServiceProvider::HOME); + } +} diff --git a/app/Http/Controllers/Auth/EmailVerificationNotificationController.php b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php new file mode 100644 index 0000000..3362dca --- /dev/null +++ b/app/Http/Controllers/Auth/EmailVerificationNotificationController.php @@ -0,0 +1,27 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(RouteServiceProvider::HOME); + } + + $request->user()->sendEmailVerificationNotification(); + + return back()->with('status', 'verification-link-sent'); + } +} diff --git a/app/Http/Controllers/Auth/EmailVerificationPromptController.php b/app/Http/Controllers/Auth/EmailVerificationPromptController.php new file mode 100644 index 0000000..e247f95 --- /dev/null +++ b/app/Http/Controllers/Auth/EmailVerificationPromptController.php @@ -0,0 +1,23 @@ +user()->hasVerifiedEmail() + ? redirect()->intended(RouteServiceProvider::HOME) + : view('auth.verify-email'); + } +} diff --git a/app/Http/Controllers/Auth/NewPasswordController.php b/app/Http/Controllers/Auth/NewPasswordController.php new file mode 100644 index 0000000..1df8e21 --- /dev/null +++ b/app/Http/Controllers/Auth/NewPasswordController.php @@ -0,0 +1,65 @@ + $request]); + } + + /** + * Handle an incoming new password request. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + * + * @throws \Illuminate\Validation\ValidationException + */ + public function store(Request $request) + { + $request->validate([ + 'token' => ['required'], + 'email' => ['required', 'email'], + 'password' => ['required', 'confirmed', Rules\Password::defaults()], + ]); + + // Here we will attempt to reset the user's password. If it is successful we + // will update the password on an actual user model and persist it to the + // database. Otherwise we will parse the error and return the response. + $status = Password::reset( + $request->only('email', 'password', 'password_confirmation', 'token'), + function ($user) use ($request) { + $user->forceFill([ + 'password' => Hash::make($request->password), + 'remember_token' => Str::random(60), + ])->save(); + + event(new PasswordReset($user)); + } + ); + + // If the password was successfully reset, we will redirect the user back to + // the application's home authenticated view. If there is an error we can + // redirect them back to where they came from with their error message. + return $status == Password::PASSWORD_RESET + ? redirect()->route('login')->with('status', __($status)) + : back()->withInput($request->only('email')) + ->withErrors(['email' => __($status)]); + } +} diff --git a/app/Http/Controllers/Auth/PasswordResetLinkController.php b/app/Http/Controllers/Auth/PasswordResetLinkController.php new file mode 100644 index 0000000..667ab94 --- /dev/null +++ b/app/Http/Controllers/Auth/PasswordResetLinkController.php @@ -0,0 +1,47 @@ +validate([ + 'email' => ['required', 'email'], + ]); + + // We will send the password reset link to this user. Once we have attempted + // to send the link, we will examine the response then see the message we + // need to show to the user. Finally, we'll send out a proper response. + $status = Password::sendResetLink( + $request->only('email') + ); + + return $status == Password::RESET_LINK_SENT + ? back()->with('status', __($status)) + : back()->withInput($request->only('email')) + ->withErrors(['email' => __($status)]); + } +} diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php new file mode 100644 index 0000000..487fedb --- /dev/null +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -0,0 +1,54 @@ +validate([ + 'name' => ['required', 'string', 'max:255'], + 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], + 'password' => ['required', 'confirmed', Rules\Password::defaults()], + ]); + + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + ]); + + event(new Registered($user)); + + Auth::login($user); + + return redirect(RouteServiceProvider::HOME); + } +} diff --git a/app/Http/Controllers/Auth/VerifyEmailController.php b/app/Http/Controllers/Auth/VerifyEmailController.php new file mode 100644 index 0000000..6baa9aa --- /dev/null +++ b/app/Http/Controllers/Auth/VerifyEmailController.php @@ -0,0 +1,30 @@ +user()->hasVerifiedEmail()) { + return redirect()->intended(RouteServiceProvider::HOME.'?verified=1'); + } + + if ($request->user()->markEmailAsVerified()) { + event(new Verified($request->user())); + } + + return redirect()->intended(RouteServiceProvider::HOME.'?verified=1'); + } +} diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php new file mode 100644 index 0000000..689d09e --- /dev/null +++ b/app/Http/Controllers/BaseController.php @@ -0,0 +1,73 @@ +where('record_status_id', RecordStatusEnum::ACTIVE) + ->whereIn('id', $this->getLabs()->pluck('id')->toArray()) + ->orderBy('created_at','desc')->get(); + + $request->session()->put('base_lab_coverages', $labs->pluck('name_en')->toArray()); + + // check it only one base default assign base session, else redirect to base view + if(count($labs)==1){ + $request->session()->put('base_lab_id', $labs->first()->id); + $request->session()->put('base_lab_name', $labs->first()->name_en); + $request->session()->put('base_lab', $labs[0]->toArray()); + if ($request->session()->has('base_lab_id')) { + return redirect('/dashboard'); + } + } + return view('base', ['labs' => $labs]); + } + + public function forget(Request $request){ + if ($request->session()->has('base_lab_id')) { + $request->session()->forget('base_lab_id'); + $request->session()->forget('base_lab_name'); + $request->session()->forget('base_lab'); + $request->session()->forget('base_lab'); + $request->session()->forget('base_lab_coverages'); + return redirect()->route('base'); + } + } + + public function store(Request $request){ + $validator = \Validator::make($request->all(), [ 'lab_id' => 'required']); + if ($validator->fails()) + { + session()->flash('error', 'Invalid credentials'); + return redirect()->route('base'); + } + $lab = Laboratory::query()->find($request->lab_id); + $request->session()->put('base_lab_id', $request->lab_id); + $request->session()->put('base_lab_name', $lab->name_en); + $request->session()->put('base_lab', $lab->toArray()); + if (!$request->session()->has('base_lab_id')) { + return redirect()->route('base'); + } + return redirect('/dashboard'); + } +} diff --git a/app/Http/Controllers/CommentController.php b/app/Http/Controllers/CommentController.php new file mode 100644 index 0000000..207d771 --- /dev/null +++ b/app/Http/Controllers/CommentController.php @@ -0,0 +1,112 @@ +model = $comment; + $this->department = $department; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_comment'])) return redirect(url('my-profile')); + $departments = $this->department::query()->where(['lab_id' => Session::get('base_lab_id'), BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderBy('name_en','asc')->get(); + $recordStatusCondition = Auth::id()==1 ? [RecordStatusEnum::DELETE, RecordStatusEnum::ACTIVE] : [RecordStatusEnum::ACTIVE]; + $comments = $this->model::with(['sample_type','sample_type.department'])->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusCondition) + ->where('lab_id', $this->baseLabId) + ->when(!empty($request->kword), function ($comments) use($request){ + $comments->whereRaw("replace(comment_desc, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + })->orderBy(BaseModel::CREATED_AT_FIELD,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('comment', ['comments' => $comments, 'departments' => $departments]); + } + + public function save(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_comment'])) return false; + $validator = \Validator::make($request->all(), ['comment_desc' => 'required', 'sample_type_id' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('comment.create_fail'), 'errors' => $validator->errors()->all()]); + foreach ($request->sample_type_id as $sample_type) { + $comment = $this->model::query()->create([ + 'comment_desc' => $request->comment_desc, + 'sample_type_id' => $sample_type, + 'lab_id' => $this->baseLabId + ]); + } + return response()->json(['success' => true, 'message' => __('comment.create_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('comment.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try { + if(!GlobalController::user_can(Auth::user()->role_id, ['update_comment'])) return false; + $validator = \Validator::make($request->all(), ['comment_desc' => 'required', 'sample_type_id' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('comment.update_fail'), 'errors' => $validator->errors()->all()]); + $data = array( + 'comment_desc' => $request->comment_desc, + 'sample_type_id' => $request->sample_type_id + ); + $this->model::query()->where('id', $request->uid)->update($data); + return response()->json(['success' => true, 'message' => __('comment.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('comment.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $test = $this->model::with('sample_type')->find($request->uid); + return response()->json(['success' => true, 'message' => __('comment.get_success'), 'data' => $test]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('comment.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_comment'])) return false; + $this->model::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('comment.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('comment.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->model::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('comment.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('comment.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..d13005e --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,93 @@ +whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusCondition)->get(); + if(Auth::id()!=1){ + $labIds = UserLabCover::query()->where('user_id', Auth::id())->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE)->pluck('lab_id')->toArray(); + $labs = $labs->whereIn('id', $labIds); + } + return $labs; + } + + function province(){ + return Province::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE)->get(['id','name_en','name_kh']); + } + + function district($province_id = null){ + return District::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->when(! is_null($province_id), function ($district) use($province_id){ + $district->where('province_id', $province_id); + })->orderBy('name_en','asc')->get(['id','name_en','name_kh']); + } + + function commune($district_id = null){ + return Commune::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->when(!is_null($district_id), function ($commune) use($district_id){ + $commune->where('district_id', $district_id); + })->orderBy('name_en','asc')->get(['id','name_en','name_kh']); + } + + function village($commune_id = null){ + return Village::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->when(!is_null($commune_id), function ($village) use($commune_id){ + $village->where('commune_id', $commune_id); + })->orderBy('name_en','asc')->get(['id','name_en','name_kh']); + } + + public function location(){ + // discount_type = [1 => '%', 2 => 'USD'] + return Laboratory::query()->find(Session::get('base_lab_id'))->only([ + 'name_en', + 'name_kh', + 'short_name', + 'sample_number', + 'patient_code', + 'verify_label', + 'technician_label', + 'discount_type', + 'logo', + 'address_kh', + 'address_en', + 'phone_number', + 'email', + 'shareable_lab_result', + 'result_header_id', + 'show_result_footer', + 'abnormal_result_font_weight', + 'abnormal_text_color', + 'exchange_rate', + 'lab_category_id', + 'currency', + 'is_hide_inv_discount', + 'is_hide_comission_percentage', + 'invoice_template_id', + 'alternative_logo' + ]); + } + +// public function switchLanguage($locale) +// { +// if (array_key_exists($locale, config('app.available_locales'))) { +// session(['locale' => $locale]); +// } +// return redirect()->back(); +// } + +} diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php new file mode 100644 index 0000000..48f08e1 --- /dev/null +++ b/app/Http/Controllers/DashboardController.php @@ -0,0 +1,630 @@ +sampleModel = $sampleModel; + $this->invoiceModel = $invoiceModel; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + + } + + function index(Request $q){ + return redirect(url('my-profile')); + $growthSample = 0; + $displaySample = ''; + $displaySampleResult = 0; + $growthIncome = 0; + $displayIncome = ''; + $displayIncomeResult = 0; + $growthPatient = 0; + $displayPatient = ''; + $displayPatientResult = 0; + $totalRejectedSample = $this->getTotalRejectedSampleCount(); + + $growthRejectedSample = 0; + + $todaySamples = $this->getTodaySamples(); + $yesterdaySample = $this->getYesterdaySampleCount(); + if($yesterdaySample>0){ + $growthIncome = (($todaySamples->count() - $yesterdaySample) / $yesterdaySample) * 100; + } + $displaySample=__('general.chart_filter_today'); + $displaySampleResult = $todaySamples->count(); + + //income + $todayIncome = $this->getTodayIncome(); + $todayIncome+=$this->getDailyReportV2(date('Y-m-d'), date('Y-m-d')); + $yesterdayIncome = $this->invoiceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereDate('invoice_date', date('Y-m-d', strtotime('-1 day')))->sum('gross_total'); + $yesterdayIncome+=$this->getDailyReportV2(date('Y-m-d', strtotime('-1 day')), date('Y-m-d', strtotime('-1 day'))); + if($yesterdayIncome>0){ + $growthIncome = (($todayIncome - $yesterdayIncome) / $yesterdayIncome) * 100; + } + $displayIncome=__('general.chart_filter_today'); + $displayIncomeResult = number_format($todayIncome); + + //disaplay patient + $todayPatient = $this->getTodayPatient(); + $yesterdayPatient = $this->getYesterdayPatient(); + if($yesterdayPatient>0){ + $growthPatient = (($todayPatient - $yesterdayPatient) / $yesterdayPatient) * 100; + } + $displayPatient=__('general.chart_filter_today'); + $displayPatientResult = $todayPatient; + + $todayRejectedSample = $this->getTodayRejectedSamples()->count(); + $yesterdayRejectedSample = $this->getYesterdayRejectedSamples()->count(); + if($yesterdayRejectedSample>0){ + $growthRejectedSample = (($todayRejectedSample - $yesterdayRejectedSample) / $yesterdayRejectedSample) * 100; + } + $displayRejectedSample=__('general.chart_filter_today'); + $displayRejectedSampleResult = $todayRejectedSample; + + return view('dashboard',[ + 'growthSample' => number_format($growthSample, 2), + 'totalSample' => $displaySampleResult, + 'displaySample' => $displaySample, + 'displaySampleResult' => $displaySampleResult, + 'growthIncome' => number_format($growthIncome, 2), + 'displayIncome' => $displayIncome, + 'displayIncomeResult' => $displayIncomeResult, + 'totalIncome' => $displayIncomeResult, + 'totalPatient' => $displayPatientResult, + 'growthPatient' => number_format($growthPatient, 2), + 'displayPatient' => $displayPatient, + 'displayPatientResult' => $displayPatientResult, + 'totalRejectedSample' => $totalRejectedSample, + 'growthRejectedSample' => number_format($growthRejectedSample, 2), + 'displayRejectedSample' => $displayRejectedSample, + 'displayRejectedSampleResult' => $displayRejectedSampleResult, + + 'labSettings' => (object) $this->base + ]); + } + + function filter_sample(Request $q) + { + $growthSample = 0; + if ($q->dt == 'this_month'){ + $monlthlySample= $this->getThisMonthSamples()->count(); + $last_monthSample = $this->getPreviousMonthSamples()->count(); + if($last_monthSample>0){ + $growthSample = (($monlthlySample - $last_monthSample) / $last_monthSample) * 100; + } + $displaySample=__('general.chart_filter_this_month'); + $displaySampleResult = $monlthlySample; + + } elseif ($q->dt == 'this_year'){ + $yearSamples = $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereYear('admission_date', date('Y'))->count(); + $last_yearSample = $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereYear('admission_date', (date('Y')-1))->count(); + if($last_yearSample>0){ + $growthSample = (($yearSamples - $last_yearSample) / $last_yearSample); + } + $displaySample=__('general.chart_filter_this_year'); + $displaySampleResult = $yearSamples; + } + else{ + $todaySamples = $this->getTodaySamples(); + $yesterdaySample = $this->getYesterdaySampleCount(); + if($yesterdaySample>0){ + $growthSample = (($todaySamples->count() - $yesterdaySample) / $yesterdaySample) * 100; + } + $displaySample=__('general.chart_filter_today'); + $displaySampleResult = $todaySamples->count(); + } + return response()->json([ + 'growthSample' => number_format($growthSample, 2), + 'displaySample' => $displaySample, + 'displaySampleResult' => $displaySampleResult + ]); + } + + function filter_income(Request $q){ + $growthIncome = 0; + if ($q->dt == 'this_month'){ + $monlthlyIncome= $this->getThisMonthIncome(); + $monlthlyIncome+=$this->getDailyReportV2(date('Y-m-01'), date('Y-m-t')); + $last_monthIncome = $this->getPreviousMonthIncome(); + $last_monthIncome+=$this->getDailyReportV2(date("Y-m-d", mktime(0, 0, 0, date("m")-1, 1)), date("Y-m-d", mktime(0, 0, 0, date("m"), 0))); + if($last_monthIncome>0){ + $growthIncome = (($monlthlyIncome - $last_monthIncome) / $last_monthIncome) * 100; + } + $displayIncome=__('general.chart_filter_this_month'); + $displayIncomeResult = number_format($monlthlyIncome); + + } elseif ($q->dt == 'this_year'){ + $yearIncome = $this->getLastYearIncome(); + $yearIncome+=$this->getDailyReportV2(date("Y-m-d",strtotime("last year January 1st")), date("Y-m-d",strtotime("last year December 31st"))); + $last_yearIncome = $this->getLastYearIncome(); + $last_yearIncome+=$this->getDailyReportV2(date("Y-m-d",strtotime("-2 year January 1st")), date("Y-m-d",strtotime("-2 year December 31st"))); + if($last_yearIncome>0){ + $growthIncome = (($yearIncome - $last_yearIncome) / $last_yearIncome) * 100; + } + $displayIncome=__('general.chart_filter_this_year'); + $displayIncomeResult = number_format($yearIncome); + } + else{ + $todayIncome = $this->getTodayIncome(); + $todayIncome+=$this->getDailyReportV2(date('Y-m-d'), date('Y-m-d')); + $yesterdayIncome = $this->invoiceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereDate('invoice_date', date('Y-m-d', strtotime('-1 day')))->sum('gross_total'); + $yesterdayIncome+=$this->getDailyReportV2(date('Y-m-d', strtotime('-1 day')), date('Y-m-d', strtotime('-1 day'))); + if($yesterdayIncome>0){ + $growthIncome = (($todayIncome - $yesterdayIncome) / $yesterdayIncome) * 100; + } + $displayIncome=__('general.chart_filter_today'); + $displayIncomeResult = number_format($todayIncome); + } + return response()->json([ + 'growthIncome' => number_format($growthIncome, 2), + 'displayIncome' => $displayIncome, + 'displayIncomeResult' => $displayIncomeResult + ]); + } + + function filter_patient(Request $q) + { + $growthPatient = 0; + if ($q->dt == 'this_month'){ + $monthlyPatient= $this->getThisMonthPatient(); + $last_monthPatient = $this->getPreviousMonthPatient(); + if($last_monthPatient>0){ + $growthPatient = (($monthlyPatient - $last_monthPatient) / $last_monthPatient) * 100; + } + $displayPatient=__('general.chart_filter_this_month'); + $displayPatientResult = $monthlyPatient; + + } elseif ($q->dt == 'this_year'){ + $yearPatient = $this->getThisYearPatient(); + $last_yearPatient = $this->getLastYearPatient(); + if($last_yearPatient>0){ + $growthPatient = (($yearPatient - $last_yearPatient) / $last_yearPatient) * 100; + } + $displayPatient=__('general.chart_filter_this_year'); + $displayPatientResult = $yearPatient; + } + else{ + $todayPatient = $this->getTodayPatient(); + $yesterdayPatient = $this->getYesterdayPatient(); + if($yesterdayPatient>0){ + $growthPatient = (($todayPatient - $yesterdayPatient) / $yesterdayPatient) * 100; + } + $displayPatient=__('general.chart_filter_today'); + $displayPatientResult = $todayPatient; + } + + return response()->json([ + 'growthPatient' => number_format($growthPatient, 2), + 'displayPatient' => $displayPatient, + 'displayPatientResult' => $displayPatientResult + ]); + } + + function filter_rejected_sample(Request $q) + { + $growthRejectedSample = 0; + if ($q->dt == 'this_month'){ + $monthlyRejectedSample= $this->getThisMonthRejectedSamples()->count(); + $last_monthRejectedSample = $this->getPreviousMonthRejectedSamples()->count(); + if($last_monthRejectedSample>0){ + $growthRejectedSample = (($monthlyRejectedSample - $last_monthRejectedSample) / $last_monthRejectedSample) * 100; + } + $displayRejectedSample=__('general.chart_filter_this_month'); + $displayRejectedSampleResult = $monthlyRejectedSample; + + } elseif ($q->dt == 'this_year'){ + $yearRejectedSample = $this->getThisYearRejectedSamples()->count(); + $last_yearRejectedSample = $this->getLastYearRejectedSamples()->count(); + if($last_yearRejectedSample>0){ + $growthRejectedSample = (($yearRejectedSample - $last_yearRejectedSample) / $last_yearRejectedSample) * 100; + } + $displayRejectedSample=__('general.chart_filter_this_year'); + $displayRejectedSampleResult = $yearRejectedSample; + } + else{ + $todayRejectedSample = $this->getTodayRejectedSamples()->count(); + $yesterdayRejectedSample = $this->getYesterdayRejectedSamples()->count(); + if($yesterdayRejectedSample>0){ + $growthRejectedSample = (($todayRejectedSample - $yesterdayRejectedSample) / $yesterdayRejectedSample) * 100; + } + $displayRejectedSample=__('general.chart_filter_today'); + $displayRejectedSampleResult = $todayRejectedSample; + } + return response()->json([ + 'growthRejectedSample' => number_format($growthRejectedSample, 2), + 'displayRejectedSample' => $displayRejectedSample, + 'displayRejectedSampleResult' => $displayRejectedSampleResult + ]); + } + + //get total sample count for dashboard by lab id + + function getTotalRejectedSampleCount(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->where('sample_condition', 0)->count(); + } + + function getTodayRejectedSamples(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->where('sample_condition', 0) + ->whereDate('admission_date', date('Y-m-d'))->get(); + } + + function getYesterdayRejectedSamples(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->where('sample_condition', 0) + ->whereDate('admission_date', date('Y-m-d', strtotime('-1 day')))->get(); + } + + function getThisMonthRejectedSamples(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->where('sample_condition', 0) + ->whereBetween('admission_date', [date('Y-m-01 00:00:00'), date('Y-m-t 23:59:59')])->get(); + } + + function getPreviousMonthRejectedSamples(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->where('sample_condition', 0) + ->whereBetween('admission_date', [date("Y-m-d 00:00:00", strtotime("first day of previous month")), date("Y-m-d 23:59:59", strtotime("last day of previous month"))])->get(); + } + + function getThisYearRejectedSamples(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->where('sample_condition', 0) + ->whereYear('admission_date', date('Y'))->get(); + } + + function getLastYearRejectedSamples(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->where('sample_condition', 0) + ->whereYear('admission_date', (date('Y')-1))->get(); + } + + + + + + function getTotalSampleCount(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->count(); + } + + //get yesterday sample count for dashboard by lab id + + function getYesterdaySampleCount(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereDate('admission_date', date('Y-m-d', strtotime('-1 day')))->count(); + } + + function getTodaySamples(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereDate('admission_date', date('Y-m-d'))->get(); + } + + function getThisMonthSamples(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereBetween('admission_date', [date('Y-m-01 00:00:00'), date('Y-m-t 23:59:59')])->get(); + } + + function getPreviousMonthSamples(){ + return $this->sampleModel::with(['patient'])->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereBetween('admission_date', [date("Y-m-d 00:00:00", strtotime("first day of previous month")), date("Y-m-d 23:59:59", strtotime("last day of previous month"))])->get(); + } + + function getLastYearAverage(){ + return $this->sampleModel::with(['patient'])->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereBetween('admission_date', [date('Y-01-01 00:00:00', strtotime('-1 year')), date('Y-12-31 23:59:59', strtotime('-1 year'))])->count(); + } + + function getTodayIncome(){ + return $this->invoiceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereDate('invoice_date', date('Y-m-d'))->sum('gross_total'); + } + + function getThisMonthIncome(){ + return $this->invoiceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereBetween('invoice_date', [date('Y-m-01 00:00:00'), date('Y-m-t 23:59:59')])->sum('gross_total'); + } + + function getPreviousMonthIncome(){ + return $this->invoiceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereBetween('invoice_date', [date("Y-m-d 00:00:00", strtotime("first day of previous month")), date("Y-m-d 23:59:59", strtotime("last day of previous month"))])->sum('gross_total'); + } + + function getLastYearIncome(){ + return $this->invoiceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereBetween('invoice_date', [date('Y-01-01 00:00:00', strtotime('-1 year')), date('Y-12-31 23:59:59', strtotime('-1 year'))])->sum('gross_total'); + } + + function getTotalIncome(){ + return $this->invoiceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->sum('gross_total'); + } + + function getTotalPatient(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->distinct('patient_id')->count('patient_id'); + } + + function getTodayPatient(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereDate('admission_date', date('Y-m-d'))->distinct('patient_id')->count('patient_id'); + } + + function getYesterdayPatient(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereDate('admission_date', date('Y-m-d', strtotime('-1 day')))->distinct('patient_id')->count('patient_id'); + } + + function getThisMonthPatient(){ + return $this->sampleModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereBetween('admission_date', [date('Y-m-01 00:00:00'), date('Y-m-t 23:59:59')])->distinct('patient_id')->count('patient_id'); + } + + function getPreviousMonthPatient(){ + return $this->sampleModel::with(['patient'])->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereBetween('admission_date', [date("Y-m-d 00:00:00", strtotime("first day of previous month")), date("Y-m-d 23:59:59", strtotime("last day of previous month"))])->distinct('patient_id')->count('patient_id'); + } + + function getLastYearPatient(){ + return $this->sampleModel::with(['patient'])->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereBetween('admission_date', [date('Y-01-01 00:00:00', strtotime('-1 year')), date('Y-12-31 23:59:59', strtotime('-1 year'))])->distinct('patient_id')->count('patient_id'); + } + + function getThisYearPatient(){ + return $this->sampleModel::with(['patient'])->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereBetween('admission_date', [date('Y-01-01 00:00:00'), date('Y-12-31 23:59:59')])->distinct('patient_id')->count('patient_id'); + } + + function getTotalInvoice(){ + return $this->invoiceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->count(); + } + + function getTotalPaidInvoice(){ + return $this->invoiceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->where('balance', 0)->count(); + } + + function getTotalUnpaidInvoice(){ + return $this->invoiceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->where('balance', '>', 0)->count(); + } + + + function getSampleSourceChart($period = 2){ + $samplePeriodCondition = " and s.lab_id = ".$this->baseLabId; + if($period == 1) $samplePeriodCondition.= " and date(s.admission_date)='".date('Y-m-d')."'"; // today + if($period == 2) $samplePeriodCondition.= " and s.admission_date BETWEEN '".date('Y-m-01 00:00:00')."' AND '".date('Y-m-t 23:59:59')."'"; // this month + if($period == 3) $samplePeriodCondition.= " and s.admission_date BETWEEN '".date('Y-01-01 23:59:59')."' AND '".date('Y-12-31 23:59:59')."'"; // this year + $sampleSourceData = DB::select(" + SELECT + ss.`name_en` as sample_source, + ".$period." as period_type, + ifnull(sample.total_samples, 0) as total_samples + FROM `sample_sources` ss + LEFT JOIN( + SELECT + s.`sample_source_id`, + SUM(1) AS total_samples + FROM samples s + WHERE s.`record_status_id` = 1 + " . $samplePeriodCondition . " + GROUP BY s.`sample_source_id` + ) sample + ON sample.sample_source_id = ss.`id` + WHERE ss.`record_status_id` = 1 + AND ss.`lab_id` = ".$this->baseLabId." + "); + $sampleSourceDataArray = []; + foreach ($sampleSourceData as $data){ + $sampleSourceDataArray['sample_source'][] = $data->sample_source; + $sampleSourceDataArray['period_type'][] = ($data->period_type==1 ? date('d-m-Y') : ($data->period_type==3 ? date('Y') : date('M-Y'))); + $sampleSourceDataArray['total_samples'][] = $data->total_samples; + } + return $sampleSourceDataArray; + } + + function getSampleByYearChart(){ + $yearSamples = $this->getAggregationSampleByYear((date('Y')-1), date('Y')); + $yearData = array(); + for ($year = date('Y'); $year>=(date('Y')-1); $year--){ + for($month = 12; $month>0; $month--){ + $yearData[$year]['month'][$month] = date('M', strtotime($year.'-'. $month.'-01')); + $yearData[$year]['data'][$month] = 0; + $yearData[$year]['year'][$month] = $year; + } + } + foreach ($yearSamples as $data){ + $yearData[$data->year_sample]['data'][$data->month_sample] = $data->total_samples; + } + return $yearData; + } + + function getAggregationSampleByYear($fromYear, $toYear) + { + $sampleByYear = DB::select("SELECT + MONTH(s.`admission_date`) AS month_sample, + YEAR(s.`admission_date`) AS year_sample, + SUM(1) AS total_samples + FROM samples s + WHERE YEAR(s.`admission_date`) between ".$fromYear." and ".$toYear." + AND s.`record_status_id` = 1 + AND s.`lab_id` = ".$this->baseLabId." + GROUP BY MONTH(s.`admission_date`), YEAR(s.`admission_date`) "); + return $sampleByYear; + } + + + public function getDailyReportV2($startDate, $endDate){ + try{ + $rawTestByPhysician = DB::select(" + select + r.repayment_date as `invoice_date`, + ss.`name_en` as sample_source, + p.`name_en` AS patient, + s.`sample_number`, + '' as test_name, + r.exchange_rate, + ps.`name_en` AS physician_name, + sum(r.cash_repayment_amount + r.bank_repayment_amount) AS total_amount, + 0 AS total_net_amount, + 0 as discount, + sum(r.cash_repayment_amount) as total_paid, + sum(r.bank_repayment_amount) as total_bank_paid, + 0 as total_owe + from repayments r + inner join invoices inv on inv.id = r.invoice_id and r.lab_id = inv.lab_id and inv.record_status_id = 1 + inner join samples s on s.`id` = inv.`sample_id` and s.`lab_id` = inv.`lab_id` and s.`record_status_id` = 1 + inner join patients p on p.`id` = s.`patient_id` and p.`lab_id` = s.`lab_id` + INNER JOIN sample_sources ss ON ss.id = s.`sample_source_id` AND ss.`lab_id` = s.`lab_id` + INNER JOIN physicians ps ON ps.`id` = s.`physician_id` + where r.`record_status_id` = 1 + AND DATE(r.repayment_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."' + and r.lab_id= ".$this->baseLabId." + group by r.`repayment_date`, + ss.`name_en`, + p.`name_en`, + s.`sample_number`, + ps.`name_en`, + r.exchange_rate + order by sample_number asc + "); + + //return $rawTestByPhysician; + $total = collect($rawTestByPhysician)->sum('total_paid') + collect($rawTestByPhysician)->sum('total_bank_paid'); + return $total; + } catch (\Exception $e){ + return []; + } + } + + public function samplesYearComparison() + { + $thisYear = now()->year; + $lastYear = now()->subYear()->year; + + $current = DB::table('samples') + ->selectRaw('MONTH(admission_date) as month, COUNT(*) as total') + ->whereYear('admission_date', $thisYear) + ->where('lab_id', $this->baseLabId) + ->groupBy('month') + ->pluck('total', 'month'); + + $previous = DB::table('samples') + ->selectRaw('MONTH(admission_date) as month, COUNT(*) as total') + ->whereYear('admission_date', $lastYear) + ->where('lab_id', $this->baseLabId) + ->groupBy('month') + ->pluck('total', 'month'); + + $trend = []; + + for ($m = 1; $m <= 12; $m++) { + $trend[] = [ + 'month' => date('M', mktime(0, 0, 0, $m, 1)), + 'this_year' => $current[$m] ?? 0, + 'last_year' => $previous[$m] ?? 0, + ]; + } + + return response()->json($trend); + } + + public function revenueYearComparison() + { + $thisYear = now()->year; + $lastYear = now()->subYear()->year; + + $current = DB::table('invoices') + ->selectRaw('MONTH(invoice_date) as month, SUM(gross_total) as total') + ->whereYear('invoice_date', $thisYear) + ->where('lab_id', $this->baseLabId) + ->groupBy('month') + ->pluck('total', 'month'); + + $previous = DB::table('invoices') + ->selectRaw('MONTH(invoice_date) as month, SUM(gross_total) as total') + ->whereYear('invoice_date', $lastYear) + ->where('lab_id', $this->baseLabId) + ->groupBy('month') + ->pluck('total', 'month'); + + $trend = []; + + for ($m = 1; $m <= 12; $m++) { + $trend[] = [ + 'month' => date('M', mktime(0, 0, 0, $m, 1)), + 'this_year' => $current[$m] ?? 0, + 'last_year' => $previous[$m] ?? 0, + ]; + } + + return response()->json($trend); + } + + function getSampleSourceByDistributor(){ + $thisYear = now()->year; + $sampleSourceData = DB::select(" + SELECT + ss.`name_en` as sample_source, + ifnull(sample.total_samples, 0) as total_samples + FROM `sample_sources` ss + LEFT JOIN( + SELECT + s.`sample_source_id`, + SUM(1) AS total_samples + FROM samples s + WHERE s.`record_status_id` = 1 + and year(s.admission_date) = ".$thisYear." + AND s.lab_id = ".$this->baseLabId." + GROUP BY s.`sample_source_id` + + ) sample + ON sample.sample_source_id = ss.`id` + WHERE ss.`record_status_id` = 1 + AND ss.`lab_id` = ".$this->baseLabId." + ORDER BY total_samples DESC + LIMIT 10 + "); + return response()->json($sampleSourceData); + } + + function getPanelDistributor(){ + $thisYear = now()->year; + $samplePanelData = DB::select("SELECT + d.`name_en` AS panel, + IFNULL(sample.total_samples, 0) AS total_samples + FROM `departments` d + LEFT JOIN( + SELECT + st.department_id, + SUM(1) AS total_samples + FROM samples s + INNER JOIN test_results tr ON tr.`sample_id` = s.`id` AND tr.`record_status_id`= 1 + INNER JOIN test_samples ts ON ts.id = tr.`test_sample_id` + INNER JOIN sample_types st ON st.id = ts.`sample_type_id` + INNER JOIN departments sd ON sd.id = st.`department_id` + WHERE s.`record_status_id` = 1 + and year(s.admission_date) = ".$thisYear." + AND s.lab_id = ".$this->baseLabId." + GROUP BY st.`department_id` + + ) sample + ON sample.department_id = d.`id` + WHERE d.`record_status_id` = 1 + AND d.`lab_id` = ".$this->baseLabId." + ORDER BY d.`name_en` + "); + return response()->json($samplePanelData); + } + +} diff --git a/app/Http/Controllers/DepartmentController.php b/app/Http/Controllers/DepartmentController.php new file mode 100644 index 0000000..9ac9dcf --- /dev/null +++ b/app/Http/Controllers/DepartmentController.php @@ -0,0 +1,108 @@ +model = $department; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_department'])) return redirect(url('my-profile')); + $standardDepartments = $this->model::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'is_standard' => 1])->get(['id','name_en'])->unique('name_en'); + $recordStatusCondition = Auth::id()==1 ? [RecordStatusEnum::DELETE, RecordStatusEnum::ACTIVE] : [RecordStatusEnum::ACTIVE]; + $departments = $this->model::query()->with(['samples'])->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusCondition) + ->where('lab_id', $this->baseLabId) + ->when(!empty($request->kword), function ($departments) use($request){ + $departments->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + })->orderBy('weight','asc')->paginate(config('labis.pagination.perpage', 10)); + return view('department', ['departments' => $departments, 'labs' => $this->labs, 'standardDepartments' => $standardDepartments]); + } + + public function save(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_department'])) return false; + $validator = \Validator::make($request->all(), ['name_en' => 'required']); + if ($validator->fails()){ + return response()->json(['success' => false, 'message' => __('department.create_fail'), 'errors' => $validator->errors()->all()]); + } + + $new = $this->model::query()->firstOrNew(['name_en' => $request->name_en, 'lab_id' => $this->baseLabId]); + $new->name_en = $request->name_en; + $new->weight = $request->weight; + $new->lab_id = $this->baseLabId; + $new->created_at = date('Y-m-d H:i:s'); + $new->created_by = Auth::user()->id; + $new->record_status_id = RecordStatusEnum::ACTIVE; + $new->save(); + + return response()->json(['success' => true, 'message' => __('department.create_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('department.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_department'])) return false; + $validator = \Validator::make($request->all(), [ + 'name_en' => 'required', + 'weight' => 'nullable' + ]); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('department.update_fail'), 'errors' => $validator->errors()->all()]); + $data = array( + 'name_en' => $request->name_en, + 'updated_at' => date('Y-m-d H:i:s'), + 'updated_by' => Auth::id() + ); + $this->model::query()->where('id', $request->uid)->update($data); + return response()->json(['success' => true, 'message' => __('department.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('department.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $department = $this->model::query()->find($request->uid); + return response()->json(['success' => true, 'message' => __('department.get_success'), 'data' => $department]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('department.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_department'])) return false; + $this->model::query()->where('id', $request->uid)->update(array('record_status_id'=> RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('department.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('department.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->model::query()->where('id', $request->uid)->update(array('record_status_id'=> RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('department.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('department.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + +} diff --git a/app/Http/Controllers/Helper/GlobalController.php b/app/Http/Controllers/Helper/GlobalController.php new file mode 100644 index 0000000..82a3df2 --- /dev/null +++ b/app/Http/Controllers/Helper/GlobalController.php @@ -0,0 +1,28 @@ +name == 'administrator' && Auth::id()==1) return true; + $user_can = DB::table('sys_permissions') + ->join('sys_role_has_permissions','sys_role_has_permissions.permission_id','sys_permissions.id') + ->whereIn('sys_permissions.code',$modules) + ->where('sys_role_has_permissions.role_id', $role) + ->exists(); + return $user_can; + } + catch (\Exception $e){ + Log::error($e); + } + + } + +} diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php new file mode 100644 index 0000000..03664a7 --- /dev/null +++ b/app/Http/Controllers/InvoiceController.php @@ -0,0 +1,327 @@ +model = $invoiceModel; + $this->sampleModel = $sampleModel; + $this->invoiceDetailModel = $invoiceDetailModel; + $this->patientModel = $patientModel; + $this->laboratoryConfigures = new LabConfigure(); + $this->physicianModel = $physicianModel; + + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + $this->labs = parent::getAccessAbleLabs(); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_invoice'])) return redirect(url('my-profile')); + $recordStatusConditions = Auth::id()==1 ? [RecordStatusEnum::ACTIVE , RecordStatusEnum::DELETE] : [RecordStatusEnum::ACTIVE]; + + $oweInvoices = $this->model::with(['sample.patient'])->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->where('balance','>', 0)->get(); + $physicians = $this->physicianModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get(); + + $invoices = $this->model::with(['sample','repayments']) + ->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusConditions) + ->where('lab_id', $this->baseLabId) + ->when(!empty($request->from_date) && !empty($request->to_date), function ($inv) use ($request){ + $inv->whereBetween('invoice_date',[date('Y-m-d',strtotime($request->from_date)), date('Y-m-d',strtotime($request->to_date))]); + }) + ->when(isset($request->physician) && !empty($request->physician), function($inv) use ($request){ + $inv->whereIn('sample_id', $this->sampleModel::query()->where('physician_id', $request->physician)->pluck('id')); + }) + ->when(!empty(trim($request->kword)), function ($inv) use($request, $recordStatusConditions){ + $inv->whereRaw("replace(invoice_code, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhereIn('sample_id', $this->sampleModel::query() + ->whereIn('patient_id', $this->patientModel::query() + ->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhereRaw("replace(phone_number, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhere('patient_uuid','like','%'.$request->kword.'%')->pluck('id')->toArray() + )->orwhereRaw("replace(sample_number, ' ','') like '%".str_replace(" ","",$request->kword)."%'")->pluck('id')->toArray() + )->where('lab_id', $this->baseLabId)->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusConditions); + })->orderBy('invoice_code','desc')->paginate(20); + if(Auth::id()==1){ + //dd($invoices->pluck('repayments')); + } + return view('v_invoice.invoice', ['invoices' => $invoices, 'labSettings' => (object) $this->location(), 'oweInvoices' => $oweInvoices, 'physicians' => $physicians]); + } + + public function create($sample_id = null){ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_invoice'])) return redirect(url('my-profile')); + $samples = $this->sampleModel::query()->with('invoice') + ->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereDoesntHave('invoice')->get(); + return view('v_invoice.new_invoice', [ + 'samples' => $samples, + 'sample_id' => $sample_id + ]); + } + + public function store(Request $request){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_invoice'])) return redirect(url('my-profile')); + $invoiceNumber = $this->generateAutoId($request->invoice_date); + $is_hide_discount = isset($request->is_hide_discount) ? 1: 0; + $requests = collect($request)->merge(['lab_id'=>$this->baseLabId, 'invoice_code' => $invoiceNumber, 'is_hide_discount' => $is_hide_discount, 'exchange_rate' => ((object) $this->location())->exchange_rate])->except(['first_paid_date']); + $invoice = $this->model::query()->create($requests->all()); + $invoiceDetailRequest = collect($request->test_sample_id); + $items = $invoiceDetailRequest->map(function ($row, $key) use($request, $invoice) { + $invoiceDetailRow = $this->invoiceDetailModel::query()->create([ + 'invoice_id' => $invoice->id, + 'test_sample_id' => $request->test_sample_id[$key], + 'discount_type' => $request->item_discount_type[$key], + 'discount' => $request->item_discount[$key], + 'test_name' => $request->test_name[$key], + 'qty' => 1, + 'unit_price' => $request->unit_price[$key], + ]); + return []; + }); + DB::commit(); + $request->session()->flash('message','invoice-success'); + if(isset($request->save_print_invoice) && $request->save_print_invoice=='save_preview_invoice'){ + return redirect('invoice/edit/'.$invoice->id.'?print'); + } + return redirect()->back(); + } catch (\Exception $e){ + DB::rollBack(); + $request->session()->flash('message','invoice-error'); + return redirect()->back(); + } + } + + public function edit($id){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_invoice', 'update_invoice'])) return redirect(url('my-profile')); + $invoice = $this->model::query()->with('invoiceDetail.testSample.sample.department','creator','modifier')->where(['lab_id' => $this->baseLabId, 'id' => $id])->first(); + + $samples = $this->sampleModel::query()->where('id', $invoice->sample_id)->first(); + + $refreshItemItem = $this->refreshItemItem($invoice->sample_id); + + + $labConfigures = $this->laboratoryConfigures::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get()->toArray(); + + return view('v_invoice.edit_invoice', [ + 'samples' => [$samples], + 'invoice' => $invoice, + 'invoice_id' => $id, + 'sample_id' => $invoice->sample_id, + 'labSettings' => (object) $this->location(), + 'refreshItemItem' => $refreshItemItem, + 'labConfigures' => $labConfigures, + 'is_need_refresh_invoice' => (count($refreshItemItem) == count($invoice->invoiceDetail)) ? 0 : 1 + ]); + } + + public function update(Request $invoiceUpdateRequest){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_invoice'])) return redirect(url('my-profile')); + $is_hide_discount = isset($invoiceUpdateRequest->is_hide_discount) ? 1: 0; + $requests = collect($invoiceUpdateRequest)->only(['invoice_note','total','discount','gross_total','deposit' ,'bank_deposit', 'balance','invoice_date','exchange_rate'])->merge(['is_hide_discount' => $is_hide_discount, 'updated_by' => Auth::id(), 'updated_at' => date('Y-m-d H:i:s')]); + $invoice = $this->model::query()->where(['id' => $invoiceUpdateRequest->uid, 'lab_id' => $this->baseLabId])->update($requests->all()); + $invoiceDetailRequest = collect($invoiceUpdateRequest->test_sample_id); + $items = $invoiceDetailRequest->map(function ($row, $key) use($invoiceUpdateRequest) { + $invDetail = $this->invoiceDetailModel::query()->where(['invoice_id' => $invoiceUpdateRequest->uid, 'test_sample_id' => $invoiceUpdateRequest->test_sample_id[$key]])->first(); + if (empty($invDetail)) { + $invoiceDetailRow = $this->invoiceDetailModel::query()->create([ + 'invoice_id' => $invoiceUpdateRequest->uid, + 'test_sample_id' => $invoiceUpdateRequest->test_sample_id[$key], + 'discount_type' => $invoiceUpdateRequest->item_discount_type[$key], + 'discount' => $invoiceUpdateRequest->item_discount[$key], + 'test_name' => $invoiceUpdateRequest->test_name[$key], + 'weight' => $invoiceUpdateRequest->weight[$key], + 'qty' => 1, + 'unit_price' => $invoiceUpdateRequest->unit_price[$key], + ]); + } + else{ + $invoiceDetailRow = $this->invoiceDetailModel::query()->where([ + 'invoice_id' => $invoiceUpdateRequest->uid, + 'test_sample_id' => $invoiceUpdateRequest->test_sample_id[$key] + ])->update([ + 'weight' => $invoiceUpdateRequest->weight[$key] + ]); + } + return []; + }); + $this->invoiceDetailModel::query()->where('invoice_id', $invoiceUpdateRequest->uid) + ->whereNotIn('test_sample_id', $invoiceUpdateRequest->test_sample_id)->delete(); + DB::commit(); + $invoiceUpdateRequest->session()->flash('message','invoice-success'); + return redirect()->back(); + } catch (\Exception $e){ + DB::rollBack(); + $invoiceUpdateRequest->session()->flash('message','invoice-error'); + return redirect()->back(); + } + } + + /** Perform by ajax function + * @param Request $request + * @return \Illuminate\Http\JsonResponse + */ + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_invoice'])) return false; + $invoice = $this->model::query()->where(['id' => $request->uid, 'lab_id' => $this->baseLabId])->first(); + $invoice->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('invoice.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('invoice.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->model::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('invoice.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('invoice.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + public function getSampleTest($sampleId){ + try{ + $patientTypes = $this->sampleModel::query()->with([])->where([ + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, + 'lab_id' => $this->baseLabId + ])->get(); + return response()->json(['success'=> true , 'data' => $patientTypes]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + public function generateAutoId($invoiceDate){ + $prefix = date('y',strtotime($invoiceDate)); + $invoiceCount = $this->model::query()->where('lab_id', $this->baseLabId)->whereRaw('year(invoice_date) ="'. date('Y',strtotime($invoiceDate)).'"')->count(); + return 'I-'.$this->base['short_name'].'-'.$prefix.'-'.(str_pad(($invoiceCount+1),5,'0',STR_PAD_LEFT)); + } + + public function paid($id){ + DB::beginTransaction(); + try{ + $invoice = $this->model::query()->find($id); + $invoice->balance = 0; + $invoice->deposit = $invoice->gross_total; + $invoice->first_paid_date = date('Y-m-d'); + $invoice->save(); + DB::commit(); + return response()->json(['success' => true, 'message' => __('This invoice already paid')]); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success' => false, 'message' => __('Failed while trying to paid on invoice'), 'errors' => $e->getMessage()]); + } + } + + function refreshItemItem($sampleId){ + try{ + $resultItems = DB::select(' + SELECT + d.`id` AS department_id, + d.`name_en` AS department_name, + d.weight as dweight, + st.`id` AS sample_type_id, + st.weight as sweight, + st.`name_en` AS sample_type, + ts.`id` AS test_sample_id, + ts.`heading_id` AS parent_id, + ts.`field_type`, + ts.`usd_price`, + ts.group_result, + ts.description, + t.`id` AS test_id, + t.`name_en` AS test_name, + tr.id as test_result_id, + pct.`commission_type`, + ifnull(pct.`commission_rate`, 0.00) as commission_rate, + ifnull(pct.`partner_price`, 0.00) as partner_price, + ts.weight + FROM samples s + INNER JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + INNER JOIN test_samples ts + ON ts.id = tr.`test_sample_id` + and ts.lab_id = tr.lab_id + INNER JOIN tests t + ON t.`id` = ts.`test_id` + INNER JOIN sample_types st + ON st.`id` = ts.`sample_type_id` + INNER JOIN departments d + ON d.`id` = st.`department_id` + LEFT JOIN `physician_commisssion` AS pct + ON pct.`test_sample_id` = ts.`id` + AND pct.`physician_id` = s.`physician_id` + WHERE s.`id` = '.$sampleId.' + AND s.`lab_id`= '.$this->baseLabId.' + AND tr.`record_status_id` = '.BaseModel::RECORD_STATUS_ACTIVE.' + AND LENGTH(ts.group_result)>0 + AND ts.usd_price>0 + ORDER BY + d.`weight`, + st.`weight`, + ts.`weight`'); + $departmentArray = array(); + foreach ($resultItems as $row){ + $net_amount = number_format((((!empty($row->commission_type) ? $row->commission_type : ((object) $this->location())->discount_type)) ==2 ? (($row->usd_price - $row->partner_price) - $row->commission_rate) : + (($row->usd_price - $row->partner_price) * (1-$row->commission_rate/100))),2); + $testItemArray = array( + 'test_sample_id' => (string)$row->test_sample_id, + 'test_id' => $row->test_id, + 'test_name' => $row->test_name, + 'closed_parent_id' => (string) (int)$row->parent_id, + 'field_type' => (string) $row->field_type, + 'usd_price' => $row->usd_price, + 'group_result' => (string) $row->group_result, + 'item_discount_type' => (!empty($row->commission_type) ? $row->commission_type : ((object) $this->location())->discount_type), + 'item_discount_rate' => $row->commission_rate, + 'item_discount' => $net_amount, + 'discount_price' => ($row->usd_price - $net_amount) + ); + $departmentArray[] = $testItemArray; + } + return $departmentArray; + } catch (\Exception $e){ + return $e->getMessage(); + } + } + +} diff --git a/app/Http/Controllers/LabController.php b/app/Http/Controllers/LabController.php new file mode 100644 index 0000000..cd222f9 --- /dev/null +++ b/app/Http/Controllers/LabController.php @@ -0,0 +1,486 @@ +model = $model; + $this->testSampleModel = $testSampleModel; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['system_settings'])) return redirect(url('my-profile')); + $lab = $this->model::query()->find($this->baseLabId); + return view('laboratory', ['info' => $lab]); + } + + public function save(Request $request){ + try { + + $validator = \Validator::make($request->all(), [ + 'lab_name_en' => 'required', + 'lab_code' => 'required|max:5', + 'sample_number' => 'required', + 'patient_code' => 'required', + 'start_date' => 'required', + 'end_date' => 'nullable' + ]); + if ($validator->fails()) { + return response()->json(['success' => false, 'message' => __('laboratory.create_fail'), 'errors' => $validator->errors()->all()]); + } + $data = array( + 'name_en' => $request->lab_name_en, + 'name_kh' => $request->lab_name_kh, + 'short_name' => $request->lab_code, + 'sample_number' => $request->sample_number, + 'patient_code' => $request->patient_code, + 'phone_number' => $request->phone_number, + 'lab_category_id' => $request->lab_category_id, + 'is_auto_make_invoice' => $request->is_auto_make_invoice, + 'email' => $request->email, + 'shareable_lab_result' => isset($request->shareable_lab_result) ? 1 : 0, + 'allow_external_request' => isset($request->allow_external_request) ? 1 : 0, + 'is_hide_comission_percentage' => isset($request->is_hide_comission_percentage) ? $request->is_hide_comission_percentage : 0, + 'is_hide_inv_discount' => 0, + 'address_en' => $request->address_en, + 'address_kh' => $request->address_kh, + 'start_date' => ($request->start_date ? date('Y-m-d H:i:s', strtotime($request->start_date)) : null), + 'end_date' => ($request->end_date ? date('Y-m-d H:i:s', strtotime($request->end_date)) : null), + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => Auth::id() + ); + $this->model::query()->insert($data); + return response()->json(['success' => true, 'message' => __('laboratory.create_success')]); + } + catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('laboratory.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function updateInfo(Request $request){ + try { + $validator = \Validator::make($request->all(), [ + 'name_en' => 'required', + 'name_kh' => 'required', + 'short_name' => 'required|max:3' + ]); + if ($validator->fails()) return response()->json(['errors' => $validator->errors()->all()]); + $data = array( + 'name_en' => $request->name_en, + 'name_kh' => $request->name_kh, + 'short_name' => $request->short_name, + 'email' => $request->email, + 'phone_number' => $request->phone_number, + 'address_en' => $request->address_en, + 'address_kh' => $request->address_kh, + 'updated_at' => date('Y-m-d H:i:s'), + 'updated_by' => Auth::id() + ); + $this->model::query()->where('id', $this->baseLabId)->update($data); + return redirect()->back(); + //return response()->json(['success' => true, 'message' => __('laboratory.update_success')]); + } catch (\Exception $e){ + dd($e); + //return redirect()->back(); + return response()->json(['success' => false, 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try { + + $validator = \Validator::make($request->all(), [ + 'lab_name_en' => 'required', + 'lab_code' => 'required|max:5', + 'sample_number' => 'required', + 'patient_code' => 'required', + 'start_date' => 'required', + 'end_date' => 'nullable' + ]); + if ($validator->fails()) return response()->json(['errors' => $validator->errors()->all()]); + $data = array( + 'name_en' => $request->lab_name_en, + 'name_kh' => $request->lab_name_kh, + 'short_name' => $request->lab_code, + 'sample_number' => $request->sample_number, + 'patient_code' => $request->patient_code, + 'phone_number' => $request->phone_number, + 'lab_category_id' => $request->lab_category_id, + 'is_auto_make_invoice' => $request->is_auto_make_invoice, + 'email' => $request->email, + 'shareable_lab_result' => isset($request->shareable_lab_result) ? 1 : 0, + 'allow_external_request' => isset($request->allow_external_request) ? 1 : 0, + 'is_hide_comission_percentage' => isset($request->is_hide_comission_percentage) ? $request->is_hide_comission_percentage : 0, + 'address_en' => $request->address_en, + 'address_kh' => $request->address_kh, + 'start_date' => ($request->start_date ? date('Y-m-d H:i:s', strtotime($request->start_date)) : null), + 'end_date' => ($request->end_date ? date('Y-m-d H:i:s', strtotime($request->end_date)) : null), + 'updated_at' => date('Y-m-d H:i:s'), + 'updated_by' => Auth::id() + ); + $this->model::query()->where('id', $request->lab_id)->update($data); + return response()->json(['success' => true, 'message' => __('laboratory.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $lab_id = $request->lab_id; + $lab = $this->model::query()->where('id', $lab_id)->get()->first(); + return response()->json(['success' => true, 'message' => __('laboratory.get_success'), 'data' => $lab]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('laboratory.get_fail'), 'errors' => $e->getMessage()]); + } + + } + + public function delete(Request $request){ + try{ + $this->model::query()->where('id', $request->lab_id)->update(array(BaseModel::RECORD_STATUS_FIELD=> RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('laboratory.delete_success')]); + } + catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('laboratory.delete_fail'), 'errors' => $e->getMessage()]); + } + + } + + public function restore(Request $request){ + try{ + $this->model::query()->where('id', $request->lab_id)->update(array(BaseModel::RECORD_STATUS_FIELD=> RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('laboratory.restore_success')]); + } + catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('laboratory.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + public function profile(){ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) return redirect(url('my-profile')); + $lab = $this->model::query()->find($this->baseLabId); + return view('lab_profile', ['info' => $lab]); + } + + public function labSettingSetters(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['system_settings'])) return redirect(url('my-profile')); + $validator = \Validator::make($request->all(), [ + 'sample_number' => 'required|integer', + 'patient_code' => 'required|integer', + 'technician_label' => 'nullable', + 'discount_type' => 'required|integer' + ]); + if ($validator->fails()){ return response()->json(['errors'=>$validator->errors()->all()]);} + $lab = $this->model::query()->where('id', $this->baseLabId)->first(); + $lab->update(array( + 'sample_number' => $request->sample_number, + 'currency' => $request->currency, + 'patient_code' => $request->patient_code, + 'technician_label' => $request->technician_label, + 'discount_type' => $request->discount_type, + 'phone_number' => $request->phone_number, + 'email' => $request->email, + 'exchange_rate' => $request->exchange_rate, + //'is_hide_inv_discount' => $request->is_hide_inv_discount, + 'abnormal_text_color' => $request->abnormal_text_color, + 'show_result_footer' => $request->show_result_footer, + 'abnormal_result_font_weight' => $request->abnormal_result_font_weight, + 'result_header_id' => $request->result_header_id, + 'is_auto_make_invoice' => $request->is_auto_make_invoice, + 'invoice_template_id' => $request->invoice_template_id + )); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function uploadImage(Request $request){ + try { + $image = $request->file('image'); + $imageName = 'avatar_'.$this->baseLabId.'.' . $image->getClientOriginalExtension(); + $lab = $this->model::query()->where('id', $this->baseLabId)->first(); + $lab->update(array('logo' => $imageName)); + $image->move(public_path('storage/images/avatars/labs'), $imageName); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function removeLabLogo(Request $request){ + try { + $lab = $this->model::query()->find($this->baseLabId); + if(!empty($lab->logo)) { + if (file_exists(public_path('storage/images/avatars/labs/' . $lab->logo))) { + unlink(public_path('storage/images/avatars/labs/' . $lab->logo)); + $lab->logo = null; + } + } + $lab->save(); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function saveLabConfigure(Request $request){ + try{ + $validator = \Validator::make($request->all(), [ + 'attribute_code' => 'required|string', + 'attribute_value' => 'required|string' + ]); + if ($validator->fails()){ return response()->json(['errors'=>$validator->errors()->all()]);} + $labSetting = $this->labConfigureModel::query()->firstOrNew(['atrribute_code' => $request->attribute_code, 'lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD=> RecordStatusEnum::ACTIVE]); + $labSetting->assigned_attribute_value = $request->attribute_value; + $labSetting->save(); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $labSetting]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function initLabData(){ + return view('clone_lab',['labs' => $this->labs]); + } + + function getLabData($labId){ + try{ + $department = Department::query()->with([ + 'samples', + 'samples.testSamples', + 'samples.testSamples.testValues', + 'samples.testSamples.organisms', + 'samples.testSamples.organisms.antibiotics' + ])->where(['lab_id' => $labId, BaseModel::RECORD_STATUS_FIELD => 1])->get()->toArray(); + return response()->json(['success' => true, 'data' => $department]); + } + catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => 'Error while retrieving lab data.']); + } + } + + /** Verify Image */ + + public function uploadVerifyImage(Request $request){ + try { + $image = $request->file('image'); + $imageName = 'verify_label_'.$this->baseLabId.'.' . $image->getClientOriginalExtension(); + $lab = $this->model::query()->where('id', $this->baseLabId)->first(); + $lab->update(array('verify_label' => $imageName)); + $image->move(public_path('storage/images/avatars/labs'), $imageName); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function removeVerifyImage(Request $request){ + try { + $lab = $this->model::query()->find($this->baseLabId); + if(!empty($lab->verify_label)) { + if (file_exists(public_path('storage/images/avatars/labs/' . $lab->verify_label))) { + unlink(public_path('storage/images/avatars/labs/' . $lab->verify_label)); + $lab->verify_label = null; + } + } + $lab->save(); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + function updateHeading(){ + $targetLabTestSample = TestSample::query()->where(['lab_id' => 18,'sample_type_id'=>397, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->where('heading_id','>',0)->get(); + foreach ($targetLabTestSample as $targetTestSample){ + dd($targetTestSample); + $source = TestSample::query()->where(['id' => $targetTestSample->heading_id, 'lab_id' => 29])->get();//->first(); + dd($source); + $target = TestSample::query()->where(['lab_id' => 18, 'test_id' => $source->test_id , 'sample_type_id' => $targetTestSample->sample_type_id ])->get()->first(); + + //TestSample::query()->where(['id' => $targetTestSample->id])->update([ 'heading_id' => $target->id]); + } + } + + + public function uploadAlternativeLogo(Request $request){ + try { + $image = $request->file('image'); + $imageName = 'alternative_logo_'.$this->baseLabId.'.' . $image->getClientOriginalExtension(); + $lab = $this->model::query()->where('id', $this->baseLabId)->first(); + $lab->update(array('alternative_logo' => $imageName)); + $image->move(public_path('storage/images/avatars/labs/alternative_logo'), $imageName); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function removeAlternativeLogo(Request $request){ + try { + $lab = $this->model::query()->find($this->baseLabId); + if(!empty($lab->alternative_logo)) { + if (file_exists(public_path('storage/images/avatars/labs/alternative_logo/' . $lab->alternative_logo))) { + unlink(public_path('storage/images/avatars/labs/alternative_logo/' . $lab->alternative_logo)); + $lab->alternative_logo = null; + } + } + $lab->save(); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + +// Alternative Verify Signature + public function uploadAlterVerifySignature(Request $request){ + try { + $image = $request->file('image'); + $imageName = 'alter_verify_sign_'.$this->baseLabId.'.' . $image->getClientOriginalExtension(); + $lab = $this->model::query()->where('id', $this->baseLabId)->first(); + $lab->update(array('alter_verify_sign' => $imageName)); + $image->move(public_path('storage/images/avatars/labs'), $imageName); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function removeAlterVerifySignature(Request $request){ + try { + $lab = $this->model::query()->find($this->baseLabId); + if(!empty($lab->alter_verify_sign)) { + if (file_exists(public_path('storage/images/avatars/labs/' . $lab->alter_verify_sign))) { + unlink(public_path('storage/images/avatars/labs/' . $lab->alter_verify_sign)); + $lab->alter_verify_sign = null; + } + } + $lab->save(); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + +// Alternative Labtech Signature + public function uploadAlterLabtechSignature(Request $request){ + try { + $image = $request->file('image'); + $imageName = 'alter_labtech_sign_'.$this->baseLabId.'.' . $image->getClientOriginalExtension(); + $lab = $this->model::query()->where('id', $this->baseLabId)->first(); + $lab->update(array('alter_labtech_sign' => $imageName)); + $image->move(public_path('storage/images/avatars/labs'), $imageName); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function removeAlterLabtechSignature(Request $request){ + try { + $lab = $this->model::query()->find($this->baseLabId); + if(!empty($lab->alter_labtech_sign)) { + if (file_exists(public_path('storage/images/avatars/labs/' . $lab->alter_labtech_sign))) { + unlink(public_path('storage/images/avatars/labs/' . $lab->alter_labtech_sign)); + $lab->alter_labtech_sign = null; + } + } + $lab->save(); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + /** default footer */ + public function uploadDefaultFooter(Request $request){ + try { + $image = $request->file('image'); + $imageName = 'default_footer_'.$this->baseLabId.'.' . $image->getClientOriginalExtension(); + $lab = $this->model::query()->where('id', $this->baseLabId)->first(); + $lab->update(array('footer' => $imageName)); + $image->move(public_path('storage/images/avatars/labs/default_footer'), $imageName); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function removeDefaultFooter(Request $request){ + try { + $lab = $this->model::query()->find($this->baseLabId); + if(!empty($lab->footer)) { + if (file_exists(public_path('storage/images/avatars/labs/default_footer/' . $lab->footer))) { + unlink(public_path('storage/images/avatars/labs/default_footer/' . $lab->footer)); + $lab->footer = null; + } + } + $lab->save(); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + /* default footer end */ + + /** alternative footer */ + public function uploadAlternativeFooter(Request $request){ + try { + $image = $request->file('image'); + $imageName = 'alternative_footer_'.$this->baseLabId.'.' . $image->getClientOriginalExtension(); + $lab = $this->model::query()->where('id', $this->baseLabId)->first(); + $lab->update(array('alternative_footer' => $imageName)); + $image->move(public_path('storage/images/avatars/labs/alternative_footer'), $imageName); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function removeAlternativeFooter(Request $request){ + try { + $lab = $this->model::query()->find($this->baseLabId); + if(!empty($lab->alternative_footer)) { + if (file_exists(public_path('storage/images/avatars/labs/alternative_footer/' . $lab->alternative_footer))) { + unlink(public_path('storage/images/avatars/labs/alternative_footer/' . $lab->alternative_footer)); + $lab->alternative_footer = null; + } + } + $lab->save(); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => $lab]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + /* alternative footer end */ + +} diff --git a/app/Http/Controllers/OrganismController.php b/app/Http/Controllers/OrganismController.php new file mode 100644 index 0000000..dced58e --- /dev/null +++ b/app/Http/Controllers/OrganismController.php @@ -0,0 +1,110 @@ +model = $organism; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_organism'])) return redirect(url('my-profile')); + $organisms = $this->model::with(['lab'])->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + //->where('lab_id', $this->baseLabId) + ->when(!empty($request->kword), function ($organisms) use($request){ + $organisms->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + })->orderBy(BaseModel::CREATED_AT_FIELD,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('organism', ['organisms' => $organisms]); + } + + public function save(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_organism'])) return false; + $validator = \Validator::make($request->all(), ['name_en' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('organism.create_fail'), 'errors' => $validator->errors()->all()]); + $new = $this->model::query()->firstOrNew(['name_en' => $request->name_en]); + $new->name_en = $request->name_en; + $new->weight = $request->weight; + $new->is_bold = $request->is_bold; + $new->lab_id = $this->baseLabId; + $new->created_at = date('Y-m-d H:i:s'); + $new->created_by = Auth::id(); + $new->record_status_id = RecordStatusEnum::ACTIVE; + $new->save(); + return response()->json(['success' => true, 'message' => __('organism.create_success'), 'data' => [$new]]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('organism.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_organism'])) return false; + $validator = \Validator::make($request->all(), ['name_en' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('organism.update_fail'), 'errors' => $validator->errors()->all()]); + $data = array( + 'name_en' => $request->name_en, + 'name_kh' => $request->name_kh, + 'is_bold' => $request->is_bold, + 'updated_at' => date('Y-m-d H:i:s'), + 'updated_by' => Auth::id() + ); + $this->model::query()->where('id', $request->uid)->update($data); + return response()->json(['success' => true, 'message' => __('organism.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('organism.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $organism = $this->model::query()->find($request->uid); + return response()->json(['success' => true, 'message' => __('organism.get_success'), 'data' => $organism]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('organism.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_organism'])) return false; + $this->model::query()->where('id', $request->uid)->update(array( BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('organism.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('organism.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->model::query()->where('id', $request->uid)->update(array( BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('organism.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('organism.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + +} diff --git a/app/Http/Controllers/PatientController.php b/app/Http/Controllers/PatientController.php new file mode 100644 index 0000000..53eaa35 --- /dev/null +++ b/app/Http/Controllers/PatientController.php @@ -0,0 +1,239 @@ +model = $patientModel; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + + } + + function province(){ + return parent::province(); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_patient'])) return redirect(url('my-profile')); + $provinces = $this->province(); + $patients = $this->model::with(['samples'])->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->where('lab_id', $this->baseLabId) + ->when(!empty(trim($request->kword)), function ($patients) use($request){ + $patients->whereRaw( + "(replace(name_en, ' ', '') LIKE ? OR replace(phone_number, ' ', '') LIKE ? OR replace(patient_uuid, ' ', '') LIKE ? OR replace(khid_number, ' ', '') LIKE ?) and lab_id = ?", + [ + '%' . str_replace(' ', '', $request->kword) . '%', + '%' . str_replace(' ', '', $request->kword) . '%', + '%' . str_replace(' ', '', $request->kword) . '%', + '%' . str_replace(' ', '', $request->kword) . '%', + $this->baseLabId + ] + ); + })->orderBy(BaseModel::CREATED_AT_FIELD,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('patient', ['provinces' => $provinces, 'patients' => $patients, 'labSettings' => (object) $this->base]); + } + + public function save(PatientCreateRequest $patientCreateRequest){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_patient'])) return false; + $dob = $patientCreateRequest->dob; + $datePart = explode("-",$dob); + if($datePart[1]>12){ + $dob = $datePart[1].'-'.$datePart[0].'-'.$datePart[2]; + } + $requests = collect($patientCreateRequest)->merge([ + 'lab_id' => $this->baseLabId, + BaseModel::CREATED_AT_FIELD => date('Y-m-d H:i:s'), + BaseModel::CREATED_BY_FIELD => Auth::id(), + BaseModel::UPDATED_AT_FIELD => NULL, + BaseModel::UPDATED_BY_FIELD => NULL, + BaseModel::RECORD_STATUS_FIELD => BaseModel::RECORD_STATUS_ACTIVE + ])->replace( + [ + 'dob' => date('Y-m-d', strtotime($dob)), + 'phone_number' => $patientCreateRequest->phone_number // preg_replace('/ /i', '', trim($patientCreateRequest->phone_number)) + ]); + + if(empty($patientCreateRequest->patient_uuid)) { + $patientNumber = $this->generateAutoId(date('Y-m-d')); + $requests = $requests->merge(['patient_uuid' => $patientNumber]); + } + + $patient = $this->model::query()->create($requests->all()); + DB::commit(); + return response()->json(['success'=> true , 'message' => __('patient.create_success') , 'data' => $patient]); + } catch (\Exception $e){ + DB::rollBack(); + Log::error($e); + return response()->json(['success'=> false , 'message' => __('patient.create_fail') , 'errors' => $e->getMessage()]); + } + } + + public function update(PatientUpdateRequest $patientUpdateRequest){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_patient'])) return false; + $dob = $patientUpdateRequest->dob; + $datePart = explode("-",$dob); + if($datePart[1]>12){ + $dob = $datePart[1].'-'.$datePart[0].'-'.$datePart[2]; + } + + $requests = collect($patientUpdateRequest)->merge([ + BaseModel::UPDATED_AT_FIELD => date('Y-m-d H:i:s'), + BaseModel::UPDATED_BY_FIELD => Auth::id() + ])->replace([ + 'dob' => date('Y-m-d', strtotime($dob)), + 'phone_number' => $patientUpdateRequest->phone_number // preg_replace('/ /i', '', trim($patientUpdateRequest->phone_number)) + ])->except(['patient_uuid','uid']); + $patient = $this->model::query()->find($patientUpdateRequest->uid)->update($requests->all()); + DB::commit(); + return response()->json(['success'=> true , 'message' => __('patient.update_success'), 'data' => array('id' => $patientUpdateRequest->uid) ]); + } catch (\Exception $e){ + DB::rollBack(); + Log::error($e); + return response()->json(['success'=> false , 'message' => __('patient.update_fail'), 'errors' => [$e->getMessage()]]); + } + } + + public function get(Request $request){ + try{ + $patient = $this->model::query()->find($request->uid); + return response()->json(['success'=> true , 'message' => __('patient.get_success') , 'data' => $patient]); + } + catch (\Exception $e){ + return response()->json(['success'=> false , __('patient.get_fail'), 'errors' => $e->getMessage()]); + } + + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_patient'])) return false; + $patient = $this->model::query()->find($request->uid); + $patient->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success'=> true, 'message' => __('patient.delete_success'), 'data' => $patient]); + } + catch (\Exception $e){ + return response()->json(['success'=> false, 'message' => __('patient.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $patient = $this->model::query()->find($request->uid); + $patient->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + return response()->json(['success'=> true, 'message' => __('patient.restore_success'), 'data' => $patient]); + } + catch (\Exception $e){ + return response()->json(['success'=> false, 'message' => __('patient.restore_success'), 'errors' => $e->getMessage()]); + } + } + + public function search(Request $request) + { + try{ + $patients = $this->model::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId]) + ->when($request->kword!='', function($patients) use ($request) { + $patients->whereRaw( + "(replace(name_en, ' ', '') LIKE ? OR replace(phone_number, ' ', '') LIKE ? OR replace(patient_uuid, ' ', '') LIKE ? OR replace(khid_number, ' ', '') LIKE ?) and lab_id = ?", + [ + '%' . str_replace(' ', '', $request->kword) . '%', + '%' . str_replace(' ', '', $request->kword) . '%', + '%' . str_replace(' ', '', $request->kword) . '%', + '%' . str_replace(' ', '', $request->kword) . '%', + $this->baseLabId + ] + ); + })->orderBy('name_en','asc')->limit(config('labis.pagination.perpage', 10))->get(); + return response()->json(['success'=> true, __('patient.get_success'), 'data' => $patients]); + } + catch (\Exception $e){ + return response()->json(['success'=> false, __('patient.get_fail'), 'errors' => [$e->getMessage()]]); + } + } + + public function patientSearchAjax(Request $request) + { + try{ + $provinces = $this->province(); + $patients = $this->model::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId]) + ->when($request->kword!='', function($patients) use ($request) { + $patients->whereRaw( + "(replace(name_en, ' ', '') LIKE ? OR replace(phone_number, ' ', '') LIKE ? OR replace(patient_uuid, ' ', '') LIKE ? OR replace(khid_number, ' ', '') LIKE ?) and lab_id = ?", + [ + '%' . str_replace(' ', '', $request->kword) . '%', + '%' . str_replace(' ', '', $request->kword) . '%', + '%' . str_replace(' ', '', $request->kword) . '%', + '%' . str_replace(' ', '', $request->kword) . '%', + $this->baseLabId + ] + ); + })->orderBy('name_en','asc')->paginate(config('labis.pagination.perpage', 10)); + return view('partials.patient_list', ['provinces' => $provinces, 'patients' => $patients, 'labSettings' => (object) $this->base]); + } + catch (\Exception $e){ + return response()->json(['success'=> false, __('patient.get_fail'), 'errors' => [$e->getMessage()]]); + } + } + + public function generateAutoId($admissionDate){ + $prefix = date('y',strtotime($admissionDate)); + $patientCount = $this->model::query()->where('lab_id', $this->baseLabId)->whereRaw('year(created_at) ="'. date('Y',strtotime($admissionDate)).'"')->count(); + if($this->baseLabId==34) $patientCount = $patientCount+5; // solve problem when delete patient + return 'P-'.$this->base['short_name'].'-'.$prefix.'-'.(str_pad(($patientCount+1),5,'0',STR_PAD_LEFT)); + } + + + public function searchPatientToSelect2(Request $request){ + $patients = []; + if(!empty(trim($request->term))){ + $patients = $this->model::query() + ->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId]) + ->when(!empty(trim($request->term)), function ($patients) use($request){ + $patients->whereRaw( + "(replace(name_en, ' ', '') LIKE ? OR replace(phone_number, ' ', '') LIKE ? OR replace(patient_uuid, ' ', '') LIKE ? OR replace(khid_number, ' ', '') LIKE ?) and lab_id = ?", + [ + '%' . str_replace(' ', '', $request->term) . '%', + '%' . str_replace(' ', '', $request->term) . '%', + '%' . str_replace(' ', '', $request->term) . '%', + '%' . str_replace(' ', '', $request->term) . '%', + $this->baseLabId + ] + ); + })->limit(20)->orderBy('name_en', 'asc')->get(); + } + $items = []; + if(!empty($patients)){ + $items = $patients->map(function ($item){ + return array('id'=>$item->id, 'text' => $item->patient_uuid . ' - '.$item->name_en . ((!empty($item->phone_number) ? ' - '.$item->phone_number: ''))); + }); + } + return response()->json(['results' => $items]); + } + + + +} diff --git a/app/Http/Controllers/PatientTypeController.php b/app/Http/Controllers/PatientTypeController.php new file mode 100644 index 0000000..6aea06c --- /dev/null +++ b/app/Http/Controllers/PatientTypeController.php @@ -0,0 +1,115 @@ +model = $patientType; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_patient_type'])) return redirect(url('my-profile')); + $standardPatientTypes = $this->model::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'is_standard' => 1])->get(['id','name_en'])->unique('name_en'); + $patientTypes = $this->model::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + //->where('lab_id', $this->baseLabId) + ->when(!empty($request->kword), function ($patientTypes) use ($request){ + $patientTypes->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + })->orderBy(BaseModel::CREATED_AT_FIELD,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('patient-type', ['patientTypes' => $patientTypes, 'standardPatientTypes' => $standardPatientTypes]); + } + + public function save(PatientTypeCreateRequest $request){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_patient_type'])) return false; + $new = $this->model::query()->firstOrNew(['name_en' => $request->name_en, 'gender' => $request->gender]); + $new->name_en = $request->name_en; + $new->gender = $request->gender; + $new->range_start = $request->age_from; + $new->range_start_unit = $request->age_from_unit; + $new->range_start_sign = $request->age_from_sign; + $new->range_end = $request->age_to; + $new->range_end_unit = $request->age_to_unit; + $new->range_end_sign = $request->age_to_sign; + //$new->lab_id = $this->baseLabId; + $new->save(); + DB::commit(); + return response()->json(['success' => true, 'message' => __('patient_type.create_success')]); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success' => false, 'message' => __('patient_type.create_fail'), 'errors' => $e->getMessage()]); + } + + } + + public function update(PatientTypeCreateRequest $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_patient_type'])) return false; + $data = array( + 'name_en' => $request->name_en, + 'range_start' => $request->age_from, + 'range_start_unit' => $request->age_from_unit, + 'gender' => $request->gender, + 'range_end' => $request->age_to, + 'range_end_unit' => $request->age_to_unit, + //'lab_id' => $this->baseLabId, + 'updated_at' => date('Y-m-d H:i:s'), + 'updated_by' => Auth::id() + ); + $this->model::query()->where('id', $request->uid)->update($data); + DB::commit(); + return response()->json(['success' => true, 'message' => __('patient_type.update_success')]); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success' => false, 'message' => __('patient_type.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $patientType = $this->model::query()->find($request->uid); + return response()->json(['success' => true, 'message' => __('patient_type.get_success'), 'data' => $patientType]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('patient_type.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_patient_type'])) return false; + $this->model::query()->where('id', $request->uid)->update(array( BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('patient_type.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('patient_type.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->model::query()->where('id', $request->uid)->update(array( BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('patient_type.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('patient_type.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + + +} diff --git a/app/Http/Controllers/PhysicianController.php b/app/Http/Controllers/PhysicianController.php new file mode 100644 index 0000000..7fccf30 --- /dev/null +++ b/app/Http/Controllers/PhysicianController.php @@ -0,0 +1,170 @@ +physician = $physician; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_physician'])) return redirect(url('my-profile')); + $physicians = $this->physician::with(['lab'])->where('record_status_id', RecordStatusEnum::ACTIVE) + ->where('lab_id', Session::get('base_lab_id')) + ->when(!empty($request->kword), function ($physicians) use ($request){ + $physicians->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + }) + ->orderBy(BaseModel::CREATED_AT,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('physician', ['physicians' => $physicians, 'labs' => parent::getAccessAbleLabs()]); + } + + public function save(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_physician'])) return redirect(url('my-profile')); + $validator = \Validator::make($request->all(), ['name_en' => 'required']); + if ($validator->fails()) return response()->json(['errors'=>$validator->errors()->all()]); + $imageName = NULL; + $footerName = NULL; + if($request->image) + { + request()->validate(['image' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048']); + $imageName = time().'.'.request()->image->getClientOriginalExtension(); + request()->image->move(public_path('storage/images/physician'), $imageName); + } + if($request->imageFooter) + { + request()->validate(['imageFooter' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048']); + $footerName = time().'_footer.'.request()->imageFooter->getClientOriginalExtension(); + request()->imageFooter->move(public_path('storage/images/physician'), $footerName); + } + + $new = $this->physician::query()->firstOrNew(['name_en' => $request->name_en, 'lab_id' => $this->baseLabId]); + $new->name_en = $request->name_en; + $new->phone = $request->phone; + $new->lab_id = $this->baseLabId; + $new->logo = $imageName; + $new->footer = $footerName; + $new->is_default = isset($request->is_default) ? 1 : 0; + $new->created_at = date('Y-m-d H:i:s'); + $new->created_by = Auth::user()->id; + $new->record_status_id = RecordStatusEnum::ACTIVE; + $new->save(); + + $request->session()->flash('msg','Physician has been inserted!'); + return redirect()->back(); + } + + public function update(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_physician'])) return redirect(url('my-profile')); + $validator = \Validator::make($request->all(), [ + 'name_en' => 'required' + ]); + if ($validator->fails()) return response()->json(['errors'=>$validator->errors()->all()]); + $imageName = NULL; + $footerName = NULL; + if($request->image) + { + request()->validate(['image' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048']); + $imageName = time().'.'.request()->image->getClientOriginalExtension(); + request()->image->move(public_path('storage/images/physician'), $imageName); + } + if($request->imageFooter) + { + request()->validate(['imageFooter' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048']); + $footerName = time().'_footer.'.request()->imageFooter->getClientOriginalExtension(); + request()->imageFooter->move(public_path('storage/images/physician'), $footerName); + } + $data = array( + 'name_en' => $request->name_en, + 'name_kh' => $request->name_kh, + 'phone' => $request->phone, + 'is_default' => isset($request->is_default) ? 1: 0, + 'updated_at' => date('Y-m-d H:i:s'), + 'updated_by' => Auth::id() + ); + if(!empty($imageName)){$data = array_merge($data, ['logo' => $imageName]);} + if(!empty($footerName)){$data = array_merge($data, ['footer' => $footerName]);} + $status = $this->physician::query()->where('id', $request->uid)->update($data); + $request->session()->flash('msg','Physician has been updated!'); + return redirect()->back(); + } + + public function deletePhysicianLogo(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_physician'])) return false; + $physician = $this->physician::query()->find($request->uid); + if(file_exists(public_path('storage/images/physician/'.$physician->logo))){ + unlink(public_path('storage/images/physician/'.$physician->logo)); + $physician->logo = null; + } + $physician->save(); + return response()->json(['success'=> true , 'message' => __('physician.delete_photo_success')]); + } + catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('physician.delete_photo_failed')]); + } + } + + public function deletePhysicianFooter(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_physician'])) return false; + $physician = $this->physician::query()->find($request->uid); + if(file_exists(public_path('storage/images/physician/'.$physician->footer))){ + unlink(public_path('storage/images/physician/'.$physician->footer)); + $physician->footer = null; + } + $physician->save(); + return response()->json(['success'=> true , 'message' => __('physician.delete_photo_success')]); + } + catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('physician.delete_photo_failed')]); + } + } + + public function get(Request $request){ + try { + $physician = $this->physician::query()->find($request->uid); + return response()->json(['success'=> true , 'message' => __('physician.get_success'), 'data' => $physician]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('physician.get_fail')]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_physician'])) return false; + $this->physician::query()->where('id', $request->uid)->update(array( BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success'=> true , 'message' => __('physician.delete_success')]); + } + catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('physician.delete_fail')]); + } + + } + + public function restore(Request $request){ + try { + $this->physician::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('physician.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('physician.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + +} diff --git a/app/Http/Controllers/PublicationController.php b/app/Http/Controllers/PublicationController.php new file mode 100644 index 0000000..af9d5dc --- /dev/null +++ b/app/Http/Controllers/PublicationController.php @@ -0,0 +1,121 @@ +model = $publication; + $this->publicationReceiverModel = new PublicationReceiver(); + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + $publications = $this->model::query()->whereIn(BaseModel::RECORD_STATUS_FIELD, [RecordStatusEnum::ACTIVE, RecordStatusEnum::DELETE]) + ->when(!empty($request->kword), function ($publications) use($request){ + $publications->whereRaw("replace(title_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhereRaw("replace(title_kh, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + })->orderBy(BaseModel::CREATED_AT_FIELD,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('publication', ['publications' => $publications, 'labs' => $this->labs]); + } + + public function save(Request $request){ + try{ + $validator = \Validator::make($request->all(), ['start_date' => 'required', 'title_en' => 'required','lab_ids' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('comment.create_fail'), 'errors' => $validator->errors()->all()]); + + $publication = $this->model::query()->create([ + 'title_en' => $request->title_en, + 'title_kh' => $request->title_kh, + 'start_date' => date('Y-m-d', strtotime($request->start_date)), + 'end_date' => date('Y-m-d', strtotime($request->end_date)), + 'description' => $request->description + ]); + + foreach ($request->lab_ids as $lab_id){ + $this->publicationReceiverModel::query()->create([ + 'publication_id' => $publication->id, + 'lab_id' => $lab_id, + 'created_by' => Auth::id() + ]); + } + + return response()->json(['success' => true, 'message' => __('comment.create_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('comment.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try { + $validator = \Validator::make($request->all(), ['start_date' => 'required', 'title_en' => 'required', 'lab_ids' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('comment.update_fail'), 'errors' => $validator->errors()->all()]); + $data = array( + 'title_en' => $request->title_en, + 'title_kh' => $request->title_kh, + 'start_date' => date('Y-m-d', strtotime($request->start_date)), + 'end_date' => date('Y-m-d', strtotime($request->end_date)), + 'description' => $request->description + ); + $this->model::query()->where('id', $request->uid)->update($data); + $this->publicationReceiverModel::query()->where('publication_id', $request->uid)->delete(); + foreach ($request->lab_ids as $lab_id){ + $this->publicationReceiverModel::query()->create([ + 'publication_id' => $request->uid, + 'lab_id' => $lab_id, + 'created_by' => Auth::id() + ]); + } + return response()->json(['success' => true, 'message' => __('comment.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('comment.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $test = $this->model::with(['receivers'])->find($request->uid); + return response()->json(['success' => true, 'message' => __('comment.get_success'), 'data' => $test]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('comment.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + $this->model::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('comment.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('comment.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->model::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('comment.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('comment.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + public function read($id){ + $publications = $this->model::query()->whereIn(BaseModel::RECORD_STATUS_FIELD, [RecordStatusEnum::ACTIVE, RecordStatusEnum::DELETE])->where('id', $id)->get()->first(); + return view('read_message', ['publications' => $publications]); + } + +} diff --git a/app/Http/Controllers/QuantityController.php b/app/Http/Controllers/QuantityController.php new file mode 100644 index 0000000..3a2f8ae --- /dev/null +++ b/app/Http/Controllers/QuantityController.php @@ -0,0 +1,100 @@ +model = $quantity; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_quantity'])) return redirect(url('my-profile')); + $quantities = $this->model::with(['lab'])->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->where('lab_id', $this->baseLabId) + ->when(!empty($request->kword), function ($quantities) use($request){ + $quantities->whereRaw("replace(quantity_name, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + })->orderBy(BaseModel::CREATED_AT_FIELD,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('quantity', ['quantities' => $quantities]); + } + + public function save(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_quantity'])) return false; + $validator = \Validator::make($request->all(), ['quantity_name' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('organism.create_fail'), 'errors' =>$validator->errors()->all()]); + $new = $this->model::query()->firstOrNew(['quantity_name' => $request->quantity_name]); + $new->quantity_name = $request->quantity_name; + //$new->lab_id = $this->baseLabId; + $new->save(); + return response()->json(['success' => true, 'message' => __('quantity.create_success'), 'data' => [$new]]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('quantity.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_quantity'])) return false; + $validator = \Validator::make($request->all(), ['quantity_name' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('organism.update_fail'), 'errors' => $validator->errors()->all()]); + $this->model::query()->where('id', $request->uid)->update(array('quantity_name' => $request->quantity_name)); + return response()->json(['success' => true, 'message' => __('quantity.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('quantity.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $quantity = $this->model::query()->find($request->uid); + return response()->json(['success' => true, 'message' => __('quantity.get_success'), 'data' => $quantity]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('quantity.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_quantity'])) return false; + $this->model::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('quantity.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('quantity.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->model::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('quantity.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('quantity.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + +} diff --git a/app/Http/Controllers/RepaymentController.php b/app/Http/Controllers/RepaymentController.php new file mode 100644 index 0000000..130133a --- /dev/null +++ b/app/Http/Controllers/RepaymentController.php @@ -0,0 +1,165 @@ +model = new Repayment(); + $this->invoiceModel = new Invoice(); + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_repayment'])) return redirect(url('my-profile')); + $recordStatusConditions = Auth::id()==1 ? [RecordStatusEnum::ACTIVE , RecordStatusEnum::DELETE] : [RecordStatusEnum::ACTIVE]; + $invoices = $this->invoiceModel::with(['sample.patient'])->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->where('balance','>', 0)->get(); + $repayments = $this->model::query() + ->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->where('lab_id', $this->baseLabId) + ->when(!empty($request->from_date) && !empty($request->to_date), function ($inv) use ($request){ + $inv->whereBetween('repayment_date',[date('Y-m-d',strtotime($request->from_date)), date('Y-m-d',strtotime($request->to_date))]); + })->when(!empty(trim($request->kword)), function ($inv) use($request, $recordStatusConditions){ + $inv->whereIn('invoice_id', $this->invoiceModel::query() + ->whereRaw("replace(invoice_code, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhere('patient_uuid','like','%'.$request->kword.'%')->pluck('id')->toArray() + )->where('lab_id', $this->baseLabId)->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusConditions); + })->orderBy('repayment_date','desc')->paginate(20); + return view('repayment', ['oweInvoices' => $invoices, 'repayments' => $repayments, 'labSettings' => (object) $this->location()]); + } + + public function store(Request $request){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_repayment'])) return false; + $data = array( + 'invoice_id' => $request->invoice_id, + 'amount_to_pay' => $request->amount_to_pay, + 'discount' => $request->discount, + 'amount_after_discount' => $request->amount_after_discount, + 'discount_type' => $request->discount_type, + 'cash_repayment_amount' => $request->cash_repayment_amount, + 'bank_repayment_amount' => $request->bank_repayment_amount, + 'repayment_date' => date('Y-m-d', strtotime($request->repayment_date)), + 'payment_method' => $request->payment_method, + 'bank_name' => $request->bank_name, + 'transaction_ref' => $request->transaction_ref, + 'exchange_rate' => $request->exchange_rate, + 'lab_id' => $this->baseLabId, + BaseModel::CREATED_AT => date('Y-m-d H:i:s'), + BaseModel::CREATED_BY_FIELD => Auth::id() + ); + $repayment = $this->model::query()->create($data); + if($repayment){ + $invoice = $this->invoiceModel::query()->find($request->invoice_id); + $totalRepayment = ($invoice->balance - ($request->cash_repayment_amount + $request->bank_repayment_amount)); + $invoice->deposit = ($invoice->deposit + $request->cash_repayment_amount); + $invoice->bank_deposit = ($invoice->bank_deposit+$request->bank_repayment_amount); + $invoice->balance = ($totalRepayment); + $invoice->discount = $request->discount; + $invoice->save(); + } + else DB::rollBack(); + DB::commit(); + return response()->json(['success' => true, 'message' => __('invoice.create_success'), 'data' => $repayment]); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success' => false, 'message' => $e]); + } + } + + + public function update(Request $request){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_repayment'])) return false; + $data = array( + 'cash_repayment_amount' => $request->cash_repayment_amount, + 'bank_repayment_amount' => $request->bank_repayment_amount, + 'repayment_date' => date('Y-m-d', strtotime($request->repayment_date)), + 'payment_method' => $request->payment_method, + 'bank_name' => $request->bank_name, + 'transaction_ref' => $request->transaction_ref, + 'exchange_rate' => $request->exchange_rate + ); + + $prevRepayment = $this->model::query()->find($request->uid); + + $repayment = $this->model::query()->where(['id' => $request->uid, 'lab_id' => $this->baseLabId])->update($data); + if($repayment){ + + $reviseInvoice = $this->invoiceModel::query()->find($request->invoice_id); + $totalRepayment = ($reviseInvoice->balance + $prevRepayment->cash_repayment_amount + $prevRepayment->bank_repayment_amount); + $reviseInvoice->deposit = (($reviseInvoice->deposit + $prevRepayment->cash_repayment_amount) - $request->cash_repayment_amount); + $reviseInvoice->bank_deposit = (($reviseInvoice->bank_deposit + $prevRepayment->bank_repayment_amount) - $request->bank_repayment_amount); + $reviseInvoice->balance = $totalRepayment - ($request->cash_repayment_amount + $request->bank_repayment_amount); + $reviseInvoice->save(); + } + else DB::rollBack(); + DB::commit(); + return response()->json(['success' => true, 'message' => __('invoice.create_success'), 'data' => $repayment]); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success' => false, 'message' => $e->getMessage()]); + } + } + + /** Perform by ajax function + * @param Request $request + * @return \Illuminate\Http\JsonResponse + */ + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_repayment'])) return redirect(url('my-profile')); + $repayment = $this->model::query()->where(['id' => $request->uid, 'lab_id' => $this->baseLabId])->get()->first(); + $reviseInvoice = $this->invoiceModel::query()->find($repayment->invoice_id); + $totalRepayment = ($reviseInvoice->balance + $repayment->cash_repayment_amount + $repayment->bank_repayment_amount); + $reviseInvoice->deposit = ($reviseInvoice->deposit - $repayment->cash_repayment_amount); + $reviseInvoice->bank_deposit = ($reviseInvoice->bank_deposit - $repayment->bank_repayment_amount); + $reviseInvoice->balance = $totalRepayment; + $reviseInvoice->save(); + $repayment->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('invoice.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('invoice.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $data = $this->model::with(['invoice.sample.patient'])->find($request->uid); + return response()->json(['success' => true, 'message' => __('invoice.get_success'), 'data' => $data]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('invoice.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function getInvoice(Request $request){ + try{ + $data = $this->invoiceModel::query()->find($request->uid); + return response()->json(['success' => true, 'message' => __('invoice.get_success'), 'data' => $data]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('invoice.get_fail'), 'errors' => $e->getMessage()]); + } + } + + +} diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php new file mode 100644 index 0000000..7733fc1 --- /dev/null +++ b/app/Http/Controllers/ReportController.php @@ -0,0 +1,1168 @@ +model = $invoiceModel; + $this->sampleModel = $sampleModel; + $this->invoiceDetailModel = $invoiceDetailModel; + $this->physicianModel = $physicianModel; + $this->sampleSourceModel = $sampleSourceModel; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + $this->labs = parent::getAccessAbleLabs(); + } + + /** + * ====================================== + * INVOICE REPORTS STARTED + */ + + public function dailyInvoiceReport($date, $reportType = 'daily'){ + try{ + $reportPeriodCondition = $reportType != 'daily' ? ' DATE_FORMAT(inv.`invoice_date`, "%Y-%m")= "'.date('Y-m',strtotime($date)).'" ' : ' DATE(inv.`invoice_date`) = "'.$date.'"'; + $arrData = array(); + $arrData['report_period'] = $date; + $invoices = DB::select(' + SELECT + inv.id as invoice_id, + ps.`id` AS physician_id, + ps.`name_en` AS physician_name, + lb.`name_en` AS lab, + p.`name_en` AS patient, + inv.`discount`, + inv.`total`, + inv.`gross_total`, + inv.`balance`, + inv.`invoice_date`, + req_test.req_tests + FROM `invoices` inv + INNER JOIN samples sp + ON sp.id =inv.`sample_id` AND sp.`lab_id` = inv.`lab_id` + INNER JOIN physicians ps + ON ps.`id` = sp.`physician_id` AND ps.`lab_id` = sp.`lab_id` + INNER JOIN `laboratories` lb + ON lb.`id` = sp.`lab_id` + INNER JOIN patients p + ON p.`id` = sp.`patient_id` AND p.`lab_id` = sp.`lab_id` + LEFT JOIN( + SELECT + tr.sample_id, + GROUP_CONCAT(t.name_en SEPARATOR ", ") AS req_tests + FROM `test_results` tr + INNER JOIN test_samples ts + ON ts.id = tr.test_sample_id + AND ts.lab_id = tr.lab_id + INNER JOIN tests t + ON t.id = ts.test_id + WHERE tr.lab_id = '.$this->baseLabId.' + AND tr.record_status_id = 1 + GROUP BY tr.sample_id + )req_test + ON req_test.sample_id = sp.id + WHERE '.$reportPeriodCondition.' + AND inv.record_status_id = 1 AND sp.record_status_id = 1 + AND inv.lab_id = '.$this->baseLabId); + $physicianArray = array(); + foreach ($invoices as $row) { + $physicianArray[$row->physician_id]['physician_id'] = $row->physician_id; + $physicianArray[$row->physician_id]['physician_name'] = $row->physician_name; + + $invoiceArray = array( + 'id' => (string)$row->invoice_id, + 'lab' => $row->lab, + 'patient' => $row->patient, + 'requested_tests' => (string) $row->req_tests, + 'discount' => $row->discount, + 'total_amount' => $row->total, + 'net_amount' => $row->gross_total, + 'owe_amount' => $row->balance + ); + $physicianArray[$row->physician_id]['invoices'][] = $invoiceArray; + } + $arrData['report_data'] = $physicianArray; + return response()->json(['success'=> true , 'data' => $arrData]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + + } + } + + public function yearlyInvoiceReport($year){ + try{ + $arrData = array(); + $arrData['report_period'] = $year; + $yearlyData = DB::select(' + SELECT + DATE_FORMAT(inv.`invoice_date`, "%m") AS month_id, + DATE_FORMAT(inv.`invoice_date`, "%M") AS month_name, + SUM(1) AS total_invoices, + SUM(inv.`gross_total`) AS net_amount, + SUM(inv.`deposit`) AS paid_amount, + SUM(inv.`balance`) AS owe_amount + FROM `invoices` inv + INNER JOIN samples sp + ON sp.id =inv.`sample_id` AND sp.`lab_id` = inv.`lab_id` + INNER JOIN physicians ps + ON ps.`id` = sp.`physician_id` AND ps.`lab_id` = sp.`lab_id` + INNER JOIN `laboratories` lb + ON lb.`id` = sp.`lab_id` + INNER JOIN patients p + ON p.`id` = sp.`patient_id` AND p.`lab_id` = sp.`lab_id` + WHERE YEAR(inv.`invoice_date`) = '.$year.' + GROUP BY DATE_FORMAT(inv.`invoice_date`, "%M"), DATE_FORMAT(inv.`invoice_date`, "%m") + '); + $yearlyInvoiceArray = array(); + foreach ($yearlyData as $row) { + $invoiceArray = array( + 'month_number' => (string)$row->month_id, + 'month_name' => $row->month_name, + 'total_invoice' => $row->total_invoices, + 'total_net_amount' => $row->net_amount, + 'total_paid_amount' => $row->paid_amount, + 'total_owe_amount' => $row->owe_amount + ); + $yearlyInvoiceArray[] = $invoiceArray; + } + $arrData['report_data'] = $yearlyInvoiceArray; + return response()->json(['success'=> true , 'data' => $arrData]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + /** + * ====================================== + * INVOICE REPORTS ENDED + */ + + + /** + * ====================================== + * SUMMARY REPORTS STARTED + */ + + public function summaryReport(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['generate_summary_report'])) return redirect(url('my-profile')); + $startDate = $request->start_date; + $endDate = $request->end_date; + $arrData = array(); + $arrData['report_name'] = 'Summary Report'; + $arrData['report_period_from'] = $startDate; + $arrData['report_period_to'] = $endDate; + $reportData = DB::select(' + SELECT + st.`id` AS sample_type_id, + st.`name_en` AS sample_type, + -- ts.group_result as test_name, + ts.group_result, + -- t.`name_en` AS test_name, + SUM(IF(p.`gender` =1, 1, 0)) AS total_male_patient, + SUM(IF(p.`gender` =1, 0, 1)) AS total_female_patient, + SUM(1) AS total_patient + FROM samples s + INNER JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + INNER JOIN test_samples ts + ON ts.id = tr.`test_sample_id` + INNER JOIN tests t + ON t.`id` = ts.`test_id` + INNER JOIN sample_types st + ON st.`id` = ts.`sample_type_id` + INNER JOIN patients p + ON p.id = s.patient_id + WHERE s.`lab_id`= '.$this->baseLabId.' + AND tr.`record_status_id` = 1 + AND s.`record_status_id` = 1 + AND p.`record_status_id` = 1 + AND ts.group_result IS NOT NULL AND ts.group_result <> "" + AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'" + GROUP BY st.`id`, + st.`name_en`, + ts.group_result, + t.`name_en` + -- order by st.weight, ts.weight asc + '); + $summaryReportArray = array(); + $summary4Export = array(); + foreach ($reportData as $row) { + $summaryReportArray[$row->sample_type_id]['sample_type'] = $row->sample_type; + $arr = array( + 'test_type' => $row->sample_type, + 'group_result' => $row->group_result, + // 'test_name' => (string)$row->test_name, + 'total_male_patient' => (int)$row->total_male_patient, + 'total_female_patient' => (int)$row->total_female_patient, + 'total_patient' => (int)$row->total_patient + ); + $summaryReportArray[$row->sample_type_id]['test_name'][] = $arr; + $summary4Export[] = $arr; + } + $arrData['report_data'] = collect($summaryReportArray)->flatten(1)->toArray(); + if($request->export) return $this->exportSummaryReport($summary4Export); + $arrData['sample_source_data'] = $this->getSummaryReportBySampleSource($startDate, $endDate); + $arrData['test_category_data'] = $this->getSummaryReportByTestCategory($startDate, $endDate); + $arrData['test_date_data'] = $this->getSummaryReportByReceiveDate($startDate, $endDate); + $arrData['performed_by'] = $this->getSummaryReportByPerformer($startDate, $endDate); + + return view('aggregate_report', ['report_data' => $arrData, 'labSettings' => (object) $this->location()]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + + + function getSummaryReportByTestCategory($startDate, $endDate){ + try{ + $reportData = DB::select(' + SELECT + ts.category, + SUM(IF(p.`gender` =1, 1, 0)) AS total_male_patient, + SUM(IF(p.`gender` =1, 0, 1)) AS total_female_patient, + SUM(1) AS total_patient + FROM samples s + INNER JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + INNER JOIN test_samples ts + ON ts.id = tr.`test_sample_id` + INNER JOIN tests t + ON t.`id` = ts.`test_id` + INNER JOIN sample_types st + ON st.`id` = ts.`sample_type_id` + INNER JOIN patients p + ON p.id = s.patient_id + WHERE s.`lab_id`= '.$this->baseLabId.' + AND tr.`record_status_id` = 1 + AND s.`record_status_id` = 1 + AND p.`record_status_id` = 1 + AND ts.category IS NOT NULL AND ts.category <> "" + AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'" + GROUP BY + ts.category + '); + $sampleSourceReportArray = array(); + foreach ($reportData as $row) { + $arr = array( + //'test_type' => $row->sample_type, + 'category' => $row->category, + 'total_male_patient' => (int)$row->total_male_patient, + 'total_female_patient' => (int)$row->total_female_patient, + 'total_patient' => (int)$row->total_patient + ); + $sampleSourceReportArray[] = $arr; + } + return $sampleSourceReportArray; + } catch (\Exception $e){ + return []; + } + } + + function getSummaryReportBySampleSource($startDate, $endDate){ + try{ + $sampleSourceData = DB::select(' + SELECT + ss.`name_en` AS clinic_name, + SUM(IF(p.`gender` =1, 1, 0)) AS total_male_patient, + SUM(IF(p.`gender` =1, 0, 1)) AS total_female_patient, + SUM(1) AS total_patient + FROM samples s + INNER JOIN patients p + ON p.id = s.patient_id + AND p.`lab_id` = s.`lab_id` + INNER JOIN sample_sources ss + ON ss.id = s.`sample_source_id` + AND ss.`lab_id` = s.`lab_id` + WHERE s.`lab_id`= '.$this->baseLabId.' + AND s.`record_status_id` = 1 + AND p.`record_status_id` = 1 + AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'" + GROUP BY ss.`name_en` + '); + $sampleSourceReportArray = array(); + foreach ($sampleSourceData as $row) { + $arr = array( + 'clinic_name' => (string)$row->clinic_name, + 'total_male_patient' => (int)$row->total_male_patient, + 'total_female_patient' => (int)$row->total_female_patient, + 'total_patient' => (int)$row->total_patient + ); + $sampleSourceReportArray[] = $arr; + } + return $sampleSourceReportArray; + } catch (\Exception $e){ + return []; + } + } + + function getSummaryReportByReceiveDate($startDate, $endDate){ + try{ + $sampleSourceData = DB::select(' + SELECT + DATE_FORMAT(s.`received_date`, "%Y-%m-%d") AS received_date, + SUM(IF(p.`gender` =1, 1, 0)) AS total_male_patient, + SUM(IF(p.`gender` =1, 0, 1)) AS total_female_patient, + SUM(1) AS total_patient + FROM samples s + INNER JOIN patients p + ON p.id = s.patient_id + AND p.`lab_id` = s.`lab_id` + WHERE s.`lab_id`= '.$this->baseLabId.' + AND s.`record_status_id` = 1 + AND p.`record_status_id` = 1 + AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'" + GROUP BY DATE_FORMAT(s.`received_date`, "%Y-%m-%d") + ORDER BY s.`received_date` + '); + $sampleSourceReportArray = array(); + foreach ($sampleSourceData as $row) { + $arr = array( + 'received_date' => (string)$row->received_date, + 'total_male_patient' => (int)$row->total_male_patient, + 'total_female_patient' => (int)$row->total_female_patient, + 'total_patient' => (int)$row->total_patient + ); + $sampleSourceReportArray[] = $arr; + } + return $sampleSourceReportArray; + } catch (\Exception $e){ + return []; + } + } + + function getSummaryReportByPerformer($startDate, $endDate){ + try{ + $sampleSourceData = DB::select(' + SELECT + us.`name` AS performer_name, + SUM(IF(p.`gender` =1, 1, 0)) AS total_male_patient, + SUM(IF(p.`gender` =1, 0, 1)) AS total_female_patient, + SUM(1) AS total_patient + FROM samples s + INNER JOIN patients p ON p.id = s.patient_id AND p.`lab_id` = s.`lab_id` + INNER JOIN test_results AS tr ON s.id=tr.sample_id + INNER JOIN users AS us ON tr.performed_by=us.id + WHERE s.`lab_id`= '.$this->baseLabId.' + AND s.`record_status_id` = 1 + AND p.`record_status_id` = 1 + AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'" + GROUP BY us.`name` + '); + $sampleSourceReportArray = array(); + foreach ($sampleSourceData as $row) { + $arr = array( + 'performer_name' => (string)$row->performer_name, + 'total_male_patient' => (int)$row->total_male_patient, + 'total_female_patient' => (int)$row->total_female_patient, + 'total_patient' => (int)$row->total_patient + ); + $sampleSourceReportArray[] = $arr; + } + return $sampleSourceReportArray; + } catch (\Exception $e){ + return []; + } + } + /** + * ====================================== + * SUMMARY REPORTS ENDED + */ + + + /** + * ====================================== + * DOCTOR REPORTS STARTED + */ + + public function doctorReport(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['generate_doctor_report'])) return redirect(url('my-profile')); + $startDate = $request->start_date; + $endDate = $request->end_date; + $sampleSourceId = (isset($request->sample_source) && !empty($request->sample_source)) ? $request->sample_source : NULL; + $physicianId = (isset($request->physician) && !empty($request->physician)) ? $request->physician : NULL; + $arrData = array(); + $arrData['report_name'] = 'Doctor Report'; + $arrData['report_period_from'] = $startDate; + $arrData['report_period_to'] = $endDate; + $reportData = DB::select(' + SELECT + ss.`name_en` AS sample_source_name, + SUM(1) AS total_exam, + SUM(tp.`total_price`) AS total_net_amount + FROM samples s + INNER JOIN patients p + ON p.id = s.patient_id + AND p.`lab_id` = s.`lab_id` + INNER JOIN sample_sources ss + ON ss.id = s.`sample_source_id` + AND ss.`lab_id` = s.`lab_id` + + LEFT JOIN( + SELECT + s.id AS sample_id, + s.`lab_id`, + SUM(ts.`usd_price`) AS total_price + FROM samples s + INNER JOIN test_results r + ON r.`sample_id` = s.`id` + AND r.`lab_id` = s.`lab_id` + INNER JOIN test_samples ts + ON ts.`id` = r.`test_sample_id` + WHERE s.`record_status_id`=1 + AND r.`record_status_id` =1 + AND ts.`record_status_id` =1 + GROUP BY s.`id`, s.`lab_id` + + ) tp ON tp.sample_id = s.id AND s.`lab_id` = tp.lab_id + WHERE s.`lab_id`= '.$this->baseLabId.' + AND s.`record_status_id` = 1 + AND p.`record_status_id` = 1 + AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'" + GROUP BY ss.`name_en`'); + $doctorReportArray = array(); + foreach ($reportData as $k=>$row) { + $arr = array( + 'no' => $k+1, + 'sample_source_name' => (string)$row->sample_source_name, + 'total_exam' => (int)$row->total_exam, + 'total_net_amount' => (float)$row->total_net_amount + ); + $doctorReportArray[] = $arr; + } + + if(empty($sampleSourceId) && empty($physicianId)){ + $arrData['report_data'] = $doctorReportArray; + $arrData['report_id'] = 1; + if($request->export){ + return $this->exportDoctorSampleBase($arrData['report_data']); + } + } elseif (!empty($sampleSourceId) && empty($physicianId)){ + $arrData['report_data'] = $this->getDoctorReportGroupByPhysician($startDate, $endDate, $sampleSourceId); + $arrData['report_id'] = 2; + if($request->export){ + return $this->exportDoctorPhysicianBase($arrData['report_data']); + } + }else{ + $arrData['report_data'] = $this->getDoctorReportRawByPhysician($startDate, $endDate,$sampleSourceId, $physicianId); + $arrData['report_id'] = 3; + if($request->export){ + return $this->exportDoctorRawBase($arrData['report_data']); + } + } + + $printDoctorData = $this->getDoctorReportRawBySampleSource($startDate, $endDate, !empty($sampleSourceId) ? $sampleSourceId : 0 ); + $printRawByPhysician = $this->getDoctorReportRawByPhysician($startDate, $endDate,$sampleSourceId, $physicianId); + + //$printDoctorReportDetail = $this->getDoctorReportDetail($startDate, $endDate,$sampleSourceId, $physicianId); + + $sampleSources = $this->sampleSourceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get(); + $physicians = $this->physicianModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get(); + + return view('doctor_report', ['report_data' => $arrData , 'sampleSources' => $sampleSources, 'physicians' => $physicians, 'labSettings' => (object) $this->location(), 'printDoctorData' => $printDoctorData, 'printRawByPhysician' => $printRawByPhysician]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + function getDoctorReportGroupByPhysician($startDate, $endDate, $sampleSourceId = null){ + try{ + $sampleSourceCondition = !is_null($sampleSourceId) ? ' AND s.sample_source_id='.$sampleSourceId :''; + $sampleSourceData = DB::select(' + SELECT + ps.`name_en` AS physician_name, + SUM(1) AS total_exam, + SUM(tp.`total_price`) AS total_net_amount + FROM samples s + + INNER JOIN patients p + ON p.id = s.patient_id + AND p.`lab_id` = s.`lab_id` + INNER JOIN sample_sources ss + ON ss.id = s.`sample_source_id` + AND ss.`lab_id` = s.`lab_id` + INNER JOIN physicians ps + ON ps.`id` = s.`physician_id` + + LEFT JOIN( + SELECT + s.id AS sample_id, + s.`lab_id`, + SUM(ts.`usd_price`) AS total_price + FROM samples s + INNER JOIN test_results r + ON r.`sample_id` = s.`id` + AND r.`lab_id` = s.`lab_id` + INNER JOIN test_samples ts + ON ts.`id` = r.`test_sample_id` + WHERE s.`record_status_id`=1 + AND r.`record_status_id` =1 + AND ts.`record_status_id` =1 + GROUP BY s.`id`, s.`lab_id` + + ) tp ON tp.sample_id = s.id AND s.`lab_id` = tp.lab_id + + WHERE s.`lab_id`= '.$this->baseLabId.' + '.$sampleSourceCondition.' + + AND s.`record_status_id` = 1 + AND p.`record_status_id` = 1 + AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'" + GROUP BY ps.`name_en`; + '); + $physicianReportArray = array(); + foreach ($sampleSourceData as $k=>$row) { + $arr = array( + 'no' => $k+1, + 'physician_name' => (string)$row->physician_name, + 'total_exam' => (int)$row->total_exam, + 'total_net_amount' => (float)$row->total_net_amount + ); + $physicianReportArray[] = $arr; + } + return $physicianReportArray; + } catch (\Exception $e){ + return []; + } + } + + public function getDoctorReportRawByPhysician($startDate, $endDate, $sample_source='', $physicianId = null){ + try{ + $physicianCondition = !empty($physicianId) && $physicianId!='All' ? ' AND s.physician_id='.$physicianId :''; + $sample_sourceCondition = !empty($sample_source) ? ' AND ss.id='.$sample_source :''; + $rawTestByPhysician = DB::select(' + SELECT + s.received_date as `invoice_date`, + ss.name_en as sample_source, + p.`name_en` AS patient, + s.`sample_number`, + -- req_test.req_tests AS test_name, + req_test.group_result as test_name, + ps.`name_en` AS physician_name, + tp.total_price AS total_amount, + tp.total_price AS total_net_amount + FROM samples s + INNER JOIN patients p + ON p.id = s.patient_id + AND p.`lab_id` = s.`lab_id` + INNER JOIN sample_sources ss + ON ss.id = s.`sample_source_id` + AND ss.`lab_id` = s.`lab_id` + INNER JOIN physicians ps + ON ps.`id` = s.`physician_id` + LEFT JOIN( + SELECT + s.id AS sample_id, + s.`lab_id`, + SUM(ts.`usd_price`) AS total_price + FROM samples s + INNER JOIN test_results r + ON r.`sample_id` = s.`id` + AND r.`lab_id` = s.`lab_id` + INNER JOIN test_samples ts + ON ts.`id` = r.`test_sample_id` + WHERE s.`record_status_id`=1 + AND r.`record_status_id` =1 + AND ts.`record_status_id` =1 + GROUP BY s.`id`, s.`lab_id` + + ) tp ON tp.sample_id = s.id AND s.`lab_id` = tp.lab_id + LEFT JOIN( + SELECT + tr.sample_id, + GROUP_CONCAT(t.name_en SEPARATOR ", ") AS req_tests, + GROUP_CONCAT(DISTINCT CASE WHEN ts.lab_id = 22 THEN SUBSTR(ts.`group_result`, 1, 4) ELSE ts.`group_result` END SEPARATOR ", ") AS group_result + + FROM `test_results` tr + INNER JOIN test_samples ts + ON ts.id = tr.test_sample_id + AND ts.lab_id = tr.lab_id + INNER JOIN tests t + ON t.id = ts.test_id + WHERE tr.lab_id = '.$this->baseLabId.' + AND tr.record_status_id = 1 + AND ts.`record_status_id` =1 + AND LENGTH(ts.`group_result`)>=1 + GROUP BY tr.sample_id + )req_test + ON req_test.sample_id = s.id + WHERE s.`lab_id`= '.$this->baseLabId.' + '.$physicianCondition.' + AND s.`record_status_id` = 1 + AND p.`record_status_id` = 1 + and req_test.group_result is not null + '.$sample_sourceCondition.' + AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).' order by s.received_date ASC " + '); + $physicianReportArray = array(); + foreach ($rawTestByPhysician as $row) { + $arr = array( + 'date' => (string)date('d-M-Y',strtotime($row->invoice_date)), + 'sample_source' => (string) $row->sample_source, + 'patient' => (string)$row->patient, + 'sample_number' => (string)$row->sample_number, + 'test_name' => (string)$row->test_name, + 'physician' => (string)$row->physician_name, + 'total_amount' => (float)$row->total_amount, + 'total_net_amount' => (float)$row->total_net_amount, + ); + $physicianReportArray[] = $arr; + } + asort($physicianReportArray); + return $physicianReportArray; + } catch (\Exception $e){ + return []; + } + } + + public function getDoctorReportRawBySampleSource($startDate, $endDate, $sampleSourceId){ + try{ + $rawDoctorReportPrint = DB::select(' + SELECT + s.received_date as `register_date`, + s.`sample_number`, + p.`name_en` AS patient, + ss.id sample_source_id, + ss.name_en as sample_source, + IF(p.gender=1, "M","F") as gender, + p.dob, + req_test.total_tests, + req_test.total_price AS total_price + FROM samples s + INNER JOIN patients p + ON p.id = s.patient_id + AND p.`lab_id` = s.`lab_id` + INNER JOIN sample_sources ss + ON ss.id = s.`sample_source_id` + AND ss.`lab_id` = s.`lab_id` + LEFT JOIN( + SELECT + tr.sample_id, + count(*) as total_tests, + SUM(ts.`usd_price`) AS total_price + FROM `test_results` tr + INNER JOIN test_samples ts + ON ts.id = tr.test_sample_id + AND ts.lab_id = tr.lab_id + INNER JOIN tests t + ON t.id = ts.test_id + WHERE tr.lab_id = '.$this->baseLabId.' + AND tr.record_status_id = 1 + AND ts.`record_status_id` =1 + AND LENGTH(ts.`group_result`)>=1 + GROUP BY tr.sample_id + )req_test + ON req_test.sample_id = s.id + WHERE s.`lab_id`= '.$this->baseLabId.' + '.(!empty($sampleSourceId) ? 'AND s.sample_source_id='.$sampleSourceId:'').' + AND s.`record_status_id` = 1 + AND p.`record_status_id` = 1 + AND DATE(s.received_date) BETWEEN "'.date('Y-m-d', strtotime($startDate)).'" AND "'.date('Y-m-d', strtotime($endDate)).'" + '); + $departmentArray = array(); + foreach ($rawDoctorReportPrint as $row){ + $departmentArray[$row->sample_source_id]['sample_source_id'] = $row->sample_source_id; + $departmentArray[$row->sample_source_id]['sample_source'] = $row->sample_source; + $testItemArray = array( + 'register_date' => date('d/m/Y',strtotime($row->register_date)), + 'sample_number' => $row->sample_number, + 'patient' => $row->patient, + 'gender' => $row->gender, + 'age' => (string) Helpers::getAge($row->dob, $row->register_date), + 'total_tests' => (integer) $row->total_tests, + 'total_price' =>(float) $row->total_price + ); + //dd($testItemArray); + $departmentArray[$row->sample_source_id]['data'][] = $testItemArray; + } + + //dd($departmentArray); + return collect($departmentArray)->values(); + + return $rawDoctorReportPrint; + } catch (\Exception $e){ + return []; + } + } + + + /** + * ====================================== + * DOCTOR REPORTS ENDED + */ + + + /** + * ====================================== + * FINANCIAL REPORTS ENDED + */ + + public function financialReport(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['generate_financial_report'])) return redirect(url('my-profile')); + $startDate = $request->start_date; + $endDate = $request->end_date; + $sampleSourceId = (isset($request->sample_source) && !empty($request->sample_source)) ? $request->sample_source : NULL; + $physicianId = (isset($request->physician) && !empty($request->physician)) ? $request->physician : NULL; + $arrData = array(); + $arrData['report_name'] = 'Financial Report'; + $arrData['report_period_from'] = $startDate; + $arrData['report_period_to'] = $endDate; + + $financialReport = $this->getFinancialReport($startDate, $endDate,$sampleSourceId, $physicianId); + + if($request->export){ + return $this->exportFinancialReport($financialReport); + } + + + + $sampleSources = $this->sampleSourceModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get(); + $physicians = $this->physicianModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get(); + + return view('financial_report', ['report_data' => $arrData , 'sampleSources' => $sampleSources, 'physicians' => $physicians, 'labSettings' => (object) $this->location(), 'financialReport' => $financialReport]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + + public function getFinancialReport($startDate, $endDate, $sample_source='', $physicianId = null){ + try{ + //\DB::enableQueryLog(); + $physicianCondition = !empty($physicianId) && $physicianId!='All' ? ' AND s.physician_id='.$physicianId :''; + $sample_sourceCondition = !empty($sample_source) ? ' AND ss.id='.$sample_source :''; + $rawTestByPhysician = DB::select(" + select + inv.`invoice_date`, + ss.`name_en` as sample_source, + p.`name_en` AS patient, + s.`sample_number`, + invd.test_name, + inv.exchange_rate, + ps.`name_en` AS physician_name, + sum(inv.total) AS total_amount, + sum(inv.gross_total) AS total_net_amount, + sum(inv.total) - SUM(inv.gross_total) as discount, + sum(ifnull(inv.deposit, 0)) as total_paid, + sum(ifnull(inv.bank_deposit,0)) as total_bank_paid, + -- sum(inv.gross_total) - SUM(inv.deposit) as total_owe, + sum(inv.balance) as total_owe + from invoices inv + inner join samples s on s.`id` = inv.`sample_id` and s.`lab_id` = inv.`lab_id` and s.`record_status_id` = 1 + inner join patients p on p.`id` = s.`patient_id` and p.`lab_id` = s.`lab_id` + INNER JOIN sample_sources ss ON ss.id = s.`sample_source_id` AND ss.`lab_id` = s.`lab_id` + INNER JOIN physicians ps ON ps.`id` = s.`physician_id` + inner join ( + select + inv.id, + group_concat(distinct invd.test_name SEPARATOR ', ') as test_name + from invoice_details invd + inner join invoices inv ON inv.id = invd.invoice_id + WHERE inv.`record_status_id` = 1 + AND DATE(inv.invoice_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."' + AND inv.lab_id= ".$this->baseLabId." + group by inv.id + )invd + on invd.id = inv.id + where inv.`record_status_id` = 1 + ".$physicianCondition." + ".$sample_sourceCondition." + AND DATE(inv.invoice_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."' + and inv.lab_id= ".$this->baseLabId." + group by inv.`invoice_date`, + ss.`name_en`, + p.`name_en`, + s.`sample_number`, + ps.`name_en`, + invd.test_name, + inv.exchange_rate + order by sample_number asc + "); + //dd(\DB::getQueryLog()); + $physicianReportArray = array(); + $i = 1; + foreach ($rawTestByPhysician as $row) { + $arr = array( + 'no' => strtotime($row->invoice_date), + 'date' => (string)date('d-M-Y',strtotime($row->invoice_date)), + 'sample_number' => (string)$row->sample_number, + 'patient' => (string)$row->patient, + 'test_name' => (string)$row->test_name, + 'physician' => (string)$row->physician_name, + 'exchange_rate' => @$row->exchange_rate, + 'total_amount' => (float)$row->total_amount, + 'total_discount' => (float)$row->discount, + 'total_net_amount' => (float)$row->total_net_amount, + 'total_paid' => (float)$row->total_paid, + 'total_bank_paid' => (float)$row->total_bank_paid, + 'total_owe' => (float)$row->total_owe, + ); + $physicianReportArray[] = $arr; + $i++; + } + + if(($sample_source=='-1' || empty($sample_source)) && empty($physicianId)){ + $vaccinationReports = $this->getVaccinationReport($startDate, $endDate); + foreach ($vaccinationReports as $vaccinationReport) { + $arrVac = array( + 'no' => strtotime($vaccinationReport->invoice_date), + 'date' => (string)date('d-M-Y',strtotime($vaccinationReport->invoice_date)), + 'sample_number' => (string)$vaccinationReport->sample_number, + 'patient' => (string)$vaccinationReport->patient, + 'test_name' => (string)$vaccinationReport->test_name, + 'physician' => (string)$vaccinationReport->physician_name, + 'exchange_rate' =>@$vaccinationReport->exchange_rate, + 'total_amount' => (float)$vaccinationReport->total_amount, + 'total_discount' => (float)$vaccinationReport->discount, + 'total_net_amount' => (float)$vaccinationReport->total_net_amount, + 'total_paid' => (float)$vaccinationReport->total_paid, + 'total_bank_paid' => (float)$vaccinationReport->total_bank_paid, + 'total_owe' => (float)$vaccinationReport->total_owe, + ); + $physicianReportArray[] = $arrVac; + $i++; + } + } + if(($sample_source=='-2' || empty($sample_source)) && empty($physicianId)){ + //$dialyReports = $this->getDailyReport($startDate, $endDate, $physicianId); + // if(Auth::id()==1){ + $dialyReports = $this->getDailyReportV2($startDate, $endDate, $physicianId); + // } + + $j=1; + foreach ($dialyReports as $vaccinationReport) { + $arrVac = array( + 'no' => strtotime($vaccinationReport->invoice_date), + 'date' => (string)date('d-M-Y',strtotime($vaccinationReport->invoice_date)), + 'sample_number' => (string)$vaccinationReport->sample_number, + 'patient' => (string)$vaccinationReport->patient, + 'test_name' => (string)$vaccinationReport->test_name, + 'physician' => (string)$vaccinationReport->physician_name, + 'exchange_rate' => @$vaccinationReport->exchange_rate, + 'total_amount' => (float)$vaccinationReport->total_amount, + 'total_discount' => (float)$vaccinationReport->discount, + 'total_net_amount' => (float)$vaccinationReport->total_net_amount, + 'total_paid' => (float)$vaccinationReport->total_paid, + 'total_bank_paid' => (float)$vaccinationReport->total_bank_paid, + 'total_owe' => (float)$vaccinationReport->total_owe, + ); + $physicianReportArray[] = $arrVac; + $j++; + } + } + + + +// Sort the array +//usort($physicianReportArray, 'date_compare'); + +sort($physicianReportArray); + // dd($physicianReportArray); + return $physicianReportArray; + } catch (\Exception $e){ + return []; + } + } + + public function getDailyReport($startDate, $endDate, $physicianId = null){ + try{ + //\DB::enableQueryLog(); + $physicianCondition = !empty($physicianId) && $physicianId!='All' ? ' AND s.physician_id='.$physicianId :''; + $rawTestByPhysician = DB::select(" + select + inv.first_paid_date as `invoice_date`, + ss.`name_en` as sample_source, + p.`name_en` AS patient, + s.`sample_number`, + invd.test_name, + inv.exchange_rate, + ps.`name_en` AS physician_name, + sum(inv.total) AS total_amount, + sum(inv.gross_total) AS total_net_amount, + sum(inv.total) - SUM(inv.gross_total) as discount, + sum(ifnull(inv.deposit, 0)) as total_paid, + sum(ifnull(inv.bank_deposit,0)) as total_bank_paid, + -- sum(inv.gross_total) - SUM(inv.deposit) as total_owe, + sum(inv.balance) as total_owe + from invoices inv + inner join samples s on s.`id` = inv.`sample_id` and s.`lab_id` = inv.`lab_id` and s.`record_status_id` = 1 + inner join patients p on p.`id` = s.`patient_id` and p.`lab_id` = s.`lab_id` + INNER JOIN sample_sources ss ON ss.id = s.`sample_source_id` AND ss.`lab_id` = s.`lab_id` + INNER JOIN physicians ps ON ps.`id` = s.`physician_id` + inner join ( + select + inv.id, + group_concat(distinct invd.test_name SEPARATOR ', ') as test_name + from invoice_details invd + inner join invoices inv ON inv.id = invd.invoice_id + WHERE inv.`record_status_id` = 1 + AND DATE(inv.first_paid_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."' + AND inv.lab_id= ".$this->baseLabId." + group by inv.id + )invd + on invd.id = inv.id + where inv.`record_status_id` = 1 + ".$physicianCondition." + AND DATE(inv.first_paid_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."' + and inv.lab_id= ".$this->baseLabId." + group by inv.`first_paid_date`, + ss.`name_en`, + p.`name_en`, + s.`sample_number`, + ps.`name_en`, + invd.test_name, + inv.exchange_rate + order by sample_number asc + "); + + return $rawTestByPhysician; + } catch (\Exception $e){ + return []; + } + } + + public function getDailyReportV2($startDate, $endDate, $physicianId = null){ + try{ + //\DB::enableQueryLog(); + $physicianCondition = !empty($physicianId) && $physicianId!='All' ? ' AND s.physician_id='.$physicianId :''; + $rawTestByPhysician = DB::select(" + select + r.repayment_date as `invoice_date`, + ss.`name_en` as sample_source, + p.`name_en` AS patient, + s.`sample_number`, + concat('Repayment for invoice ',inv.invoice_code) as test_name, + r.exchange_rate, + ps.`name_en` AS physician_name, + sum(r.cash_repayment_amount + r.bank_repayment_amount) AS total_amount, + sum(r.cash_repayment_amount + r.bank_repayment_amount) AS total_net_amount, + 0 as discount, + sum(r.cash_repayment_amount) as total_paid, + sum(r.bank_repayment_amount) as total_bank_paid, + 0 as total_owe + from repayments r + inner join invoices inv on inv.id = r.invoice_id and r.lab_id = inv.lab_id and inv.record_status_id = 1 + inner join samples s on s.`id` = inv.`sample_id` and s.`lab_id` = inv.`lab_id` and s.`record_status_id` = 1 + inner join patients p on p.`id` = s.`patient_id` and p.`lab_id` = s.`lab_id` + INNER JOIN sample_sources ss ON ss.id = s.`sample_source_id` AND ss.`lab_id` = s.`lab_id` + INNER JOIN physicians ps ON ps.`id` = s.`physician_id` + where r.`record_status_id` = 1 + ".$physicianCondition." + AND DATE(r.repayment_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."' + and r.lab_id= ".$this->baseLabId." + group by r.`repayment_date`, + ss.`name_en`, + p.`name_en`, + s.`sample_number`, + ps.`name_en`, + r.exchange_rate, + inv.invoice_code + order by sample_number asc + "); + + return $rawTestByPhysician; + } catch (\Exception $e){ + dd($e); + return []; + } + } + + public function getVaccinationReport($startDate, $endDate){ + try{ + //\DB::enableQueryLog(); + $rawTestByPhysician = DB::select(" + SELECT + inv.vaccination_date AS `invoice_date`, + 'Vaccination' AS sample_source, + p.`name_en` AS patient, + inv.invoice_code AS `sample_number`, + invd.test_name, + '' AS physician_name, + inv.exchange_rate, + SUM(inv.total) AS total_amount, + SUM(inv.gross_total) AS total_net_amount, + SUM(inv.total) - SUM(inv.gross_total) AS discount, + SUM(IFNULL(inv.deposit, 0)) AS total_paid, + SUM(IFNULL(inv.bank_deposit,0)) AS total_bank_paid, + SUM(inv.balance) AS total_owe + FROM vaccination_invoices inv + INNER JOIN patients p ON p.`id` = inv.`patient_id` AND p.`lab_id` = inv.`lab_id` + INNER JOIN ( + SELECT + inv.id, + GROUP_CONCAT(DISTINCT m.name SEPARATOR ', ') AS test_name + FROM vaccination_invoice_details invd + INNER JOIN vaccination_invoices inv ON inv.id = invd.vac_invoice_id + INNER JOIN `medicine_items` mi ON mi.id = invd.medicine_item_id + INNER JOIN medicines m ON m.id = mi.medicine_id + WHERE inv.`record_status_id` = 1 + AND DATE(inv.vaccination_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."' + AND inv.lab_id= ".$this->baseLabId." + GROUP BY inv.id + )invd + ON invd.id = inv.id + + WHERE inv.`record_status_id` = 1 + + AND DATE(inv.vaccination_date) BETWEEN '".date('Y-m-d', strtotime($startDate))."' AND '".date('Y-m-d', strtotime($endDate))."' + AND inv.lab_id= ".$this->baseLabId." + GROUP BY inv.`vaccination_date`, + p.`name_en`, + inv.invoice_code, + invd.test_name, + inv.exchange_rate + ORDER BY inv.invoice_code ASC + "); + //dd(\DB::getQueryLog()); + return $rawTestByPhysician; + } catch (\Exception $e){ + return []; + } + } + + + /** + * ===================================== + * EXPORT FUNCTION STARTED + */ + + function exportDoctorSampleBase($arrData){ + $data = $arrData; + $titleHeading = [ + __('No'), + __('Sample Source'), + __('Exam'), + __('Net Amount'), + ]; + $export = new DoctorSampleSourceExport($data); + $export->setTitle(__('Doctor Report')); + $export->setTitleHeadingTable($titleHeading); + $dateTime = Carbon::now()->toDateTime()->format(DateFormatEnum::YmdHis); + $fileName = 'doctor_report_by_sample'.$dateTime.'.xlsx'; + return Excel::download($export, $fileName); + } + + function exportDoctorPhysicianBase($arrData){ + $data = $arrData; + $titleHeading = [ + __('No'), + __('Physician'), + __('Exam'), + __('Net Amount'), + ]; + $export = new DoctorPhysicianExport($data); + $export->setTitle(__('Doctor Report')); + $export->setTitleHeadingTable($titleHeading); + $dateTime = Carbon::now()->toDateTime()->format(DateFormatEnum::YmdHis); + $fileName = 'doctor_report_by_physician'.$dateTime.'.xlsx'; + return Excel::download($export, $fileName); + } + + function exportDoctorRawBase($arrData){ + $data = $arrData; + $titleHeading = [ + __('Date'), + __('Sample Source'), + __('Patient'), + __('Sample Number'), + __('Test Name'), + __('Physician'), + __('Total Amount'), + __('Net Amount'), + ]; + $export = new DoctorPhysicianExport($data); + $export->setTitle(__('Doctor Report')); + $export->setTitleHeadingTable($titleHeading); + $dateTime = Carbon::now()->toDateTime()->format(DateFormatEnum::YmdHis); + $fileName = 'doctor_report'.$dateTime.'.xlsx'; + return Excel::download($export, $fileName); + } + + function exportSummaryReport($arrData){ + $data = $arrData; + $titleHeading = [ + __('Sample Type'), + __('Test Type'), + __('Male Patient'), + __('Female Patient'), + __('Total Patient') + ]; + $export = new SummaryReportExport($data); + $export->setTitle(__('Summary Report by Test Type')); + $export->setTitleHeadingTable($titleHeading); + $dateTime = Carbon::now()->toDateTime()->format(DateFormatEnum::YmdHis); + $fileName = 'summary_report'.$dateTime.'.xlsx'; + return Excel::download($export, $fileName); + } + + function exportFinancialReport($arrData){ + $data = $arrData; + $titleHeading = [ + __('No'), + __('Invoice Date'), + __('Sample Number'), + __('Patient Name'), + __('Test Name'), + __('Physician'), + __('Exchange Rate'), + __('Total'), + __('Discount'), + __('Net Amount'), + __('Cash Pay'), + __('Bank Pay'), + __('Owe'), + ]; + $export = new FinancialReportExport($data); + $export->setTitle(__('Financial Report')); + $export->setTitleHeadingTable($titleHeading); + $dateTime = Carbon::now()->toDateTime()->format(DateFormatEnum::YmdHis); + $fileName = 'financial_report'.$dateTime.'.xlsx'; + return Excel::download($export, $fileName); + } + + + +} diff --git a/app/Http/Controllers/RoleController.php b/app/Http/Controllers/RoleController.php new file mode 100644 index 0000000..aaf679f --- /dev/null +++ b/app/Http/Controllers/RoleController.php @@ -0,0 +1,193 @@ +roleModel = $roleModel; + $this->roleHasPermission = $roleHasPermission; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_user_role'])) return redirect(url('my-profile')); + $recordStatusCondition = Auth::id()==1 ? [RecordStatusEnum::DELETE, RecordStatusEnum::ACTIVE] : [RecordStatusEnum::ACTIVE]; + $roles = $this->roleModel::with('lab')->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusCondition) + ->where('lab_id', $this->baseLabId) + ->whereNotIn('id', [UtilEnum::ADMINISTRATOR_ROLE]) + ->when(!empty($request->kword), function ($roles) use($request){ + $roles->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + })->orderBy(BaseModel::CREATED_AT,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('role', ['roles' => $roles]); + } + + public function save(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_user_role'])) return false; + $validator = \Validator::make($request->all(), ['name_en' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('system_role.create_fail'), 'errors'=>$validator->errors()->all()]); + $new = $this->roleModel::query()->create(['name_en' => $request->name_en, 'lab_id' => $this->baseLabId]); + return response()->json(['success' => true, 'message' => __('system_role.create_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('system_role.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_user_role'])) return false; + $validator = \Validator::make($request->all(), ['name_en' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('system_role.update_fail'), 'errors'=>$validator->errors()->all()]); + $this->roleModel::query()->where('id', $request->uid)->update(array('name_en' => $request->name_en)); + return response()->json(['success' => true, 'message' => __('system_role.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('system_role.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $role = $this->roleModel::query()->find($request->uid); + return response()->json(['success' => true, 'message' => __('system_role.get_success'), 'data' => $role]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('system_role.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_user_role'])) return false; + $this->roleModel::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD=> RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('system_role.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('system_role.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->roleModel::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD=> RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('system_role.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('system_role.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + public function storeRolePermission(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['assign_permission'])) return false; + if(isset($request->permission_id)){ + foreach ($request->permission_id as $module_id){ + $this->roleHasPermission::query()->updateOrCreate([ + 'role_id' => $request->uid, + 'permission_id' => $module_id, + ],[ + 'role_id' => $request->uid, + 'permission_id' => $module_id + ]); + } + $this->roleHasPermission::query()->where('role_id', $request->uid) + ->whereNotIn('permission_id', $request->permission_id) + ->delete(); + } + else{ + $this->roleHasPermission::query()->where('role_id', $request->uid)->delete(); + } + return redirect()->back(); + } + catch (\Exception $e){ + return redirect()->back(); + } + + } + + function viewPermissionByRoleId($roleId){ + try { + if(!GlobalController::user_can(Auth::user()->role_id, ['assign_permission','create_user_role','update_user_role'])) return false; + $items = DB::select('SELECT + pg.id, + pg.weight, + ' . (App::getLocale() == 'en' ? 'pg.name_en' : 'pg.name_kh') . ' as permission_group, + pg.`parent_id`, + sp.id AS permission_id, + ' . (App::getLocale() == 'en' ? 'sp.name_en' : 'sp.name_kh') . ' as permission_name, + IF(prm.permission_id IS NULL, 0, 1) AS is_can + FROM `sys_permission_groups` pg + INNER JOIN `sys_permissions` sp + ON sp.`permission_group_id` = pg.`id` + LEFT JOIN( + SELECT + * + FROM `sys_role_has_permissions` + WHERE role_id = ' . $roleId . ' + ) prm + ON prm.permission_id = sp.`id` + where sp.record_status_id =1 + and pg.record_status_id=1 + '); + + $data = $this->arrayToTree($items); // $this->permissionGroup_::with(['subGroup.permission_','permission_'])->get(); + $arr_permission = array(); + foreach ($data as $item) { + $arr_permission[$item->weight]['name'] = $item->permission_group; + $arr = array( + 'id' => $item->permission_id, + 'name' => $item->permission_name, + 'is_can' => $item->is_can + ); + $arr_child = array(); + if (@$item->children) { + foreach ($item->children as $v) { + $arr_child[$v->weight]['name'] = $v->permission_group; + $arrc = array( + 'id' => $v->permission_id, + 'name' => $v->permission_name, + 'is_can' => $v->is_can + ); + $arr_child[$v->weight]['permissions'][] = $arrc; + } + } + $arr_permission[$item->weight]['permissions'][] = array_merge($arr, $arr_child); + } + return response()->json(['success' => true, 'message' => __('system_role.get_permission_success'), 'data' => $arr_permission]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('system_role.get_permission_fail'), 'errors' => $e->getMessage()]); + } + } + + function arrayToTree(array $items, $parentId = 0) { + $tree = []; + + foreach ($items as $item) { + if ($item->parent_id == $parentId) { + $children = $this->arrayToTree($items, $item->id); + if ($children) { + $item->children = $children; + } + $tree[] = $item; + } + } + return $tree; + } + +} diff --git a/app/Http/Controllers/SampleController.php b/app/Http/Controllers/SampleController.php new file mode 100644 index 0000000..a76572c --- /dev/null +++ b/app/Http/Controllers/SampleController.php @@ -0,0 +1,876 @@ +model = $sampleModel; + $this->physicianModel = $physicianModel; + $this->sampleSourceModel = $sampleSourceModel; + $this->patientModel = $patientModel; + $this->rejectCommentModel = $rejectCommentModel; + $this->sampleDetailModel = $sampleDetailModel; + $this->testResultModel = $testResultModel; + $this->testGroupModel = $testGroupModel; + $this->organismResultModel = $organismResultModel; + $this->antibioticResultModel = $antibioticResultModel; + + $this->invoiceModel = $invoiceModel; + $this->invoiceDetailModel = $invoiceDetailModel; + $this->laboratoryConfigures = $laboratoryConfigures; + + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_sample'])) return redirect(url('my-profile')); + $recordStatusConditions = Auth::id()==1 ? [RecordStatusEnum::ACTIVE, RecordStatusEnum::DELETE] : [RecordStatusEnum::ACTIVE]; + $samples = $this->model::with(['patient','sample_source']) + ->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusConditions) + ->where('lab_id', $this->baseLabId) + ->when(Auth::user()->role_id == UtilEnum::PHYSICIAN_ROLE, function($sample){ + $sample->where('sample_source_id', Auth::user()->sample_source_id); + })->when(!empty(trim($request->kword)), function ($samples) use($request, $recordStatusConditions){ + $samples->whereRaw("replace(sample_number, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhereIn('patient_id', $this->patientModel::query() + ->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhereRaw("replace(phone_number, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhere('patient_uuid','like','%'.$request->kword.'%')->pluck('id')->toArray() + )->where('lab_id', $this->baseLabId)->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusConditions); + })->when(!empty(trim($request->sample_status)), function ($samples) use($request){ + $samples->whereIn('id', $this->filterSampleStatus($request->sample_status)); + })->when(!empty($request->sample_date) && empty($request->kword) , function ($samples) use($request){ + $samples->whereDate('admission_date', date('Y-m-d',strtotime($request->sample_date))); + })->orderBy(BaseModel::CREATED_AT_FIELD,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('sample', ['samples' => $samples]); + } + + function filterSampleStatus($statusId){ + if($statusId == 5){ // rejected + $wheres = " and sample.`sample_condition` = 0 "; + }elseif ($statusId == 4){ // printed + $wheres = " and (sample.`sample_condition` <>0 and sample.`is_printed` = 1) "; + }elseif ($statusId == 1){ // pending, not request test, no result input + $wheres = " and (sample.`sample_condition` <>0 and sample.`is_printed` = 0 and (non_heading_tests=0 or (done_numeric_tests+done_org_test)=0)) "; + }elseif ($statusId == 3){ + $wheres = " and (sample.`sample_condition` <>0 and sample.`is_printed` = 0 and non_heading_tests>0 and non_heading_tests = (done_numeric_tests+done_org_test))"; + }elseif ($statusId ==2 ){ + $wheres = " and (sample.`sample_condition` <>0 and sample.`is_printed` = 0 and (done_numeric_tests+done_org_test)>0 and non_heading_tests > (done_numeric_tests+done_org_test))"; + } else{ + $wheres = ""; + } + + $resultItemsData = DB::select('SELECT + * + FROM + ( + SELECT + s.id, + s.`sample_number`, + IFNULL(sample_condition,1) AS sample_condition, + is_printed, + SUM(IF(ts.`field_type`>0, 1,0)) AS non_heading_tests, + SUM(IF(ts.`field_type` IN(1,4) AND tr.test_result IS NOT NULL, 1, 0)) AS done_numeric_tests, + SUM(IF(ts.`field_type` IN(2,3) AND org_result.total_org_result>0, 1, 0)) AS done_org_test + FROM samples s + LEFT JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + LEFT JOIN test_samples ts + ON ts.id = tr.`test_sample_id` + AND ts.lab_id = tr.lab_id + LEFT JOIN sample_types st + ON st.id = ts.`sample_type_id` + LEFT JOIN( + SELECT + tr.`id`, + COUNT(*) AS total_org_result + FROM samples s + INNER JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + INNER JOIN organism_results orgr + ON orgr.`test_result_id` = tr.`id` + WHERE s.lab_id = '.$this->baseLabId.' + AND tr.`record_status_id` = 1 + AND orgr.`record_status_id` = 1 + GROUP BY tr.id + ) AS org_result + ON org_result.id = tr.`id` + WHERE s.`lab_id` = '.$this->baseLabId.' + AND s.`record_status_id` = 1 + AND (tr.`record_status_id` = 1 OR tr.`record_status_id` IS NULL) + AND (st.`record_status_id` = 1 OR st.`record_status_id` IS NULL) + GROUP BY s.id, s.`sample_number`, s.sample_condition, s.is_printed + ) sample + WHERE 1 '.$wheres.' + + '); + $arr = []; + foreach ($resultItemsData as $row){ + $arr[] = $row->id; + } + return $arr; + } + + public function create($patient_id = null){ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_sample'])) return redirect(url('my-profile')); + $rejectComments = $this->rejectCommentModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderBy('reject_comment', 'ASC')->get(); + $physicians = $this->physicianModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId])->orderBy('name_en', 'ASC')->get(); + $sampleSources = $this->sampleSourceModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId])->orderBy('name_en','ASC')->get(); + $patients = $this->patientModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId]) + ->when(!empty($patient_id), function ($patients) use ($patient_id){ + $patients->where(['id' => $patient_id, 'lab_id' => $this->baseLabId ]); + })->orderBy(BaseModel::CREATED_AT_FIELD, 'DESC')->limit(30)->get(); + $testGroups = $this->testGroupModel::with(['testGroupDetails'])->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderBy('created_at')->get(); + return view('new_sample', [ + 'labSettings' => (object) $this->base, + 'physicians' => $physicians, + 'sampleSources' => $sampleSources, + 'patients' => $patients, + 'rejectComments' => $rejectComments, + 'provinces' => $this->province(), + 'patient_id' => $patient_id, + 'testGroups' => $testGroups + ]); + } + + public function generateAutoId($admissionDate){ + $prefix = date('ymd',strtotime($admissionDate)); + $sample = Sample::query(); + $sampleCount = $sample->where('lab_id', $this->baseLabId)->whereRaw('date(admission_date) ="'. date('Y-m-d',strtotime($admissionDate)).'"')->count(); + return 'S-'.$this->base['short_name'].'-'.$prefix.'-'.(str_pad(($sampleCount+1),3,'0',STR_PAD_LEFT)); + } + + public function store(SampleCreateRequest $sampleCreateRequest){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_sample'])) return false; + $request = collect($sampleCreateRequest)->merge(['lab_id'=>$this->baseLabId]); + if(empty($sampleCreateRequest->sample_number)) { + $sampleNumber = $this->generateAutoId($sampleCreateRequest->admission_date); + $request = $request->merge(['sample_number' => $sampleNumber]); + } + + $sample = $this->model::query()->where(['sample_number' => $request['sample_number']])->get()->first(); + if(!empty($sample)){ + if($sample->patient_id !=$request['patient_id']){ + if(empty($sampleCreateRequest->sample_number)) { + sleep(50); + $sampleNumber = $this->generateAutoId($sampleCreateRequest->admission_date); + $request = $request->merge(['sample_number' => $sampleNumber]); + } + else{ + return response()->json(['success' => false, 'message' => __('comment.create_fail'), 'errors' => ['Duplicate Sample Number']]); + } + $patientSample = $this->model::query()->create($request->all()); + $patientSample = $this->model::with(['patient','sample_source'])->find($patientSample->id); + } + else{ + $patientSample = $this->model::with(['patient','sample_source'])->find($sample->id); + } + } + else{ + $patientSample = $this->model::query()->create($request->all()); + $patientSample = $this->model::with(['patient','sample_source','physician'])->find($patientSample->id); + } + + DB::commit(); + return response()->json(['success' => true, 'message' => __('sample.create_success'), 'data' => new SampleResource($patientSample)]); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success' => false, 'message' => __('comment.create_fail'), 'errors' => [$e->getMessage()]]); + } + } + + public function store1(SampleCreateRequest $sampleCreateRequest){ + DB::beginTransaction(); + try{ + $request = collect($sampleCreateRequest)->merge(['lab_id'=>$this->baseLabId]); + if(empty($sampleCreateRequest->sample_number)) { + $sampleNumber = $this->generateAutoId($sampleCreateRequest->admission_date); + $request = $request->merge(['sample_number' => $sampleNumber]); + } + $patientSample = $this->model::query()->create($request->all()); + $patientSample = $this->model::with(['patient','sample_source'])->find($patientSample->id); + DB::commit(); + return response()->json(['success' => true, 'message' => __('sample.create_success'), 'data' => new SampleResource($patientSample)]); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success' => false, 'message' => __('comment.create_fail'), 'errors' => [$e->getMessage()]]); + } + } + + public function edit(Request $request, $id){ // url: base_url/sample/edit/[sample-id] + if(!GlobalController::user_can(Auth::user()->role_id, ['update_sample'])) return redirect(url('my-profile')); + $sample = $this->model::with(['patient'/*'patient.telegramChatId'*/,'invoice'])->where(['lab_id' => $this->baseLabId,'id' => $id])->first(); + $rejectComments = $this->rejectCommentModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderBy('reject_comment', 'ASC')->get(); + $physicians = $this->physicianModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId])->orderBy('name_en', 'ASC')->get(); + $samplePhysician = $this->physicianModel::query()->where('id', $sample->physician_id)->first(); + $sampleSources = $this->sampleSourceModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId])->orderBy('name_en','ASC')->get(); + $testGroups = $this->testGroupModel::with(['testGroupDetails'])->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderBy('created_at')->get(); + + $now = strtotime($sample->admission_date); // or your date as well + $your_date = strtotime($sample->patient->dob); + $datediff = $now - $your_date; + + $form = $sample->sample_tests->pluck('testSample')->pluck('sample')->unique()->first(); + + $enter_form_id = $form->enter_form_id ?? ($this->base['lab_category_id']==0? 1:2); + $preview_form_id = $form->preview_form_id ?? ($this->base['lab_category_id']==0? 1:2); + + $prevSample = []; + if(isset($_GET['previous_sample'])){ + $prevSample = $this->model::with(['patient','invoice'])->where(['lab_id' => $this->baseLabId, 'id' => $_GET['previous_sample']])->get(); + } + + $labConfigures = $this->laboratoryConfigures::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get()->toArray(); + + $resultTemplateId = (collect($labConfigures)->where('atrribute_code', 'RESULT_TEMPLATE')->pluck('assigned_attribute_value')->first()); + if(!empty($resultTemplateId)){ + $preview_form_id = $resultTemplateId; + } + + if($sample->result_template_id > 0){ + $preview_form_id = $sample->result_template_id; + } + + return view('sample_edition', [ + 'sample' => $sample, + 'labSettings' => (object) $this->base, + 'physicians' => $physicians, + 'sampleSources' => $sampleSources, + 'rejectComments' => $rejectComments, + 'testGroups' => $testGroups, + 'samplePhysician' => $samplePhysician, + 'agedy' => number_format((round($datediff / (60 * 60 * 24))/360),2), + 'enter_form_id' => $enter_form_id, // $form->enter_form_id ?? 1, + 'preview_form_id' => $preview_form_id . (isset($request->previous_sample) ? '_previous_sample':''), + 'previous_samples' => $this->getPreviousSample($sample->patient_id, $id), + 'labConfigures' => $labConfigures, + 'prevSample' => $prevSample, + 'firstPrvSampleId' => (int)@$this->getPreviousSample($sample->patient_id, $id)->first()->id, + 'firstPrvSampleDate' => (string) !empty($this->getPreviousSample($sample->patient_id, $id)->first()) ? date('d-m-Y', strtotime($this->getPreviousSample($sample->patient_id, $id)->first()->admission_date)) : '', + 'selected_pre_sample_date' => isset($request->previous_sample) ? date('d-m-Y', strtotime($this->getPreviousSample($sample->patient_id, $id)->where('id', $request->previous_sample)->first()->admission_date)) : '' + ]); + + + } + + function getPreviousSample($patientId, $curSampleId){ + return $this->model::query()->where(['patient_id' => $patientId, 'lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->where('id','<', $curSampleId)->orderBy('id', 'desc')->get(['id','admission_date', 'sample_number']); + } + + /** Update Sample Only + * @param SampleUpdateRequest $sampleUpdateRequest + * @return \Illuminate\Http\RedirectResponse + */ + + public function update(SampleUpdateRequest $sampleUpdateRequest){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_sample'])) return redirect(url('my-profile')); + $request = collect($sampleUpdateRequest)->except(['id','sample_number','patient_id','_token']); + $patientSample = $this->model::query()->where(['id' => $sampleUpdateRequest->id, 'lab_id' => $this->baseLabId])->first(); + $patientSample->update($request->all()); + DB::commit(); + $sampleUpdateRequest->session()->flash('message','Update success.'); + return redirect()->back(); + } catch (\Exception $e){ + if(Auth::id()==1){ + dd($e); + } + DB::rollBack(); + $sampleUpdateRequest->session()->flash('message','Update failed.'); + return redirect()->back(); + } + } + + /** Perform by ajax function */ + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_sample'])) return false; + $patientSample = $this->model::query()->where(['id' => $request->uid, 'lab_id' => $this->baseLabId])->first(); + $patientSample->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('sample.delete_success')]); + } + catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $patientSample = $this->model::query()->where(['id' => $request->uid, 'lab_id' => $this->baseLabId])->first(); + $patientSample->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('sample.restore_success')]); + } + catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + public function approve(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['approve_result'])) return false; + $patientSample = $this->model::query()->where(['id' => $request->uid, 'lab_id' => $this->baseLabId])->first(); + $patientSample->update(array('approved_by' => Auth::id(), 'approved_date' => date('Y-m-d H:i:s'))); + return response()->json(['success' => true, 'message' => __('sample.approve_success')]); + } + catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample.approve_fail'), 'errors' => $e->getMessage()]); + } + } + + /** Sample Detail / Assign Test */ + + public function storeSampleDetail(SampleDetailCreateRequest $sampleCreateRequest){ + set_time_limit(6000); + ini_set('memory_limit', '10240M'); + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_sample', 'update_sample'])) return false; + $this->sampleDetailModel::query()->where(['sample_id' => $sampleCreateRequest->sample_id, 'lab_id' => $this->baseLabId])->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + $sampleDetails = collect($sampleCreateRequest->sample_details); + $sampleDetails->map(function ($item){ + if(!empty($item['sample_description'])){ + $sampleDetail = $this->sampleDetailModel::query()->create([ + 'sample_id' => $item['sample_id'], + 'sample_type_id' => $item['sample_type_id'], + 'test_date' => date('Y-m-d'), + 'lab_technician_id' => Auth::id(), + 'sample_descr' => $item['sample_description'], + 'lab_id' => $this->baseLabId + ]); + } + }); + //dd($sampleCreateRequest->sample_tests); + if(!empty($sampleCreateRequest->sample_tests)){ + $this->testResultModel::query()->where(['sample_id' => $sampleCreateRequest->sample_id, 'lab_id' => $this->baseLabId]) + ->whereNotIn('test_sample_id', $sampleCreateRequest->sample_tests) + ->delete(); + foreach ($sampleCreateRequest->sample_tests as $test){ + $existingTestResult = $this->testResultModel::query()->where([ + 'test_sample_id' => $test, + 'lab_id' => $this->baseLabId, + 'sample_id' => $sampleCreateRequest->sample_id + ])->get()->toArray(); + if(empty($existingTestResult)) { + $testResult = $this->testResultModel::query()->create([ + 'sample_id' => $sampleCreateRequest->sample_id, + 'test_sample_id' => $test, + 'lab_id' => $this->baseLabId + ]); + } + } + }else{ + $this->testResultModel::query()->where(['sample_id' => $sampleCreateRequest->sample_id, 'lab_id' => $this->baseLabId])->delete(); + } + + + /** + * Create or Update Invoice in case invoice generation mode is auto start + */ + + $labSettings = (object) $this->base; + if($labSettings->is_auto_make_invoice == 1) { + $sample = $this->model::with('invoice')->find($sampleCreateRequest->sample_id); + $invoiceDetail = $this->makeInvoice($sample->id); + + $request = new Request($invoiceDetail); + $summary = collect($request); + + $total = $summary->sum('usd_price'); + $grossTotal = $summary->sum('item_discount'); // total price after discount + $discount = $total - $grossTotal; + $invoiceId = 0; + $discounts = $summary->sum('discount_price'); + if (empty($sample->invoice)) { + // create new + $invoiceRequest = collect($request)->merge([ + 'invoice_code' => $this->generateInvoiceId(date('Y-m-d', strtotime($sample->admission_date))),// 'I-'.Helpers::generateUuId($labSettings->short_name), + 'sample_id' => $sample->id, + 'total' => $total * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1), + 'discount' => $discounts * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1), + 'discount_type' => $labSettings->discount_type, + 'gross_total' => number_format($grossTotal * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1),2, '.', ''), + 'deposit' => 0, + 'bank_deposit' => 0, + 'balance' => number_format($grossTotal * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1),2, '.', ''), + 'invoice_date' => date('Y-m-d', strtotime($sample->admission_date)), + 'lab_id'=>$this->baseLabId, + 'exchange_rate' => $labSettings->exchange_rate + ]); + $invoice = $this->invoiceModel::query()->create($invoiceRequest->all()); + $invoiceId = $invoice->id; + } + else { + $invoiceId = $sample->invoice->id; + $editInvoice = $this->invoiceModel::query()->find($sample->invoice->id); + $deposit = $editInvoice->deposit; + $bank_deposit = $editInvoice->bank_deposit; + $editInvoice->total = $total * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1); + $editInvoice->discount = $discounts * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1); + $editInvoice->gross_total = number_format($grossTotal * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1),2, '.', ''); + $editInvoice->balance = number_format(($grossTotal-($deposit+$bank_deposit)),2, '.', ''); + $editInvoice->save(); + $this->invoiceDetailModel::query()->where('invoice_id', $sample->invoice->id)->delete(); + } + // Refresh Invoice Detail + $invoiceDetailRequest = collect($invoiceDetail); + $items = $invoiceDetailRequest->map(function ($row) use($invoiceId, $labSettings) { + $invoiceDetailRow = $this->invoiceDetailModel::query()->create([ + 'invoice_id' => $invoiceId, + 'test_sample_id' => $row['test_sample_id'], + 'discount_type' => $row['item_discount_type'], + 'discount' => $row['item_discount'], + 'test_name' => $row['group_result'], + 'qty' => 1, + 'unit_price' => $row['usd_price'] * ($labSettings->currency==1 ? $labSettings->exchange_rate : 1), + ]); + return []; + }); + } + + /** + * Create or Update Invoice in case invoice generation mode is auto end + */ + + DB::commit(); + return response()->json(['success' => true, 'message' => __('sample.assign_tests_success')]); + } catch (\Exception $e){ + Log::error($e); + DB::rollBack(); + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + public function storeSampleTestResult(Request $request){ + set_time_limit(6000); + ini_set('memory_limit', '10240M'); + if(!GlobalController::user_can(Auth::user()->role_id, ['add_result', 'update_result', 'delete_result'])) return false; + $validator = \Validator::make($request->all(), ['sample_id' => 'required', 'ref_test_sample_id' => 'nullable', 'ref_test_sample_id_value' => 'nullable', 'test_samples_to_hide' => 'nullable', 'ref_test_sample_performer' => 'nullable']); + if ($validator->fails()) {return response()->json(['errors'=>$validator->errors()->all()]);} + DB::beginTransaction(); + try{ + $sample = $this->model::query()->find($request->sample_id); + $sample->update([ + BaseModel::UPDATED_AT_FIELD => date('Y-m-d H:i:s'), + BaseModel::UPDATED_BY_FIELD => Auth::id() + ]); + // add test result + if(isset($request->ref_test_sample_id)){ + $data = collect($request->ref_test_sample_id); + $ref_test_sample_id_value = collect($request->ref_test_sample_id_value); + $ref_test_date = collect($request->ref_test_sample_test_date); + $ref_performed_by = collect($request->ref_test_sample_performer); + $ref_test_sample_comment = collect($request->ref_test_sample_comment); + $vars = $data->map(function ($val, $key) use($request, $ref_test_sample_id_value, $ref_test_date, $ref_performed_by, $ref_test_sample_comment){ + $this->testResultModel::query()->where(['lab_id' => $this->baseLabId, 'sample_id' => $request->sample_id, 'test_sample_id' => $val])->update([ + 'test_result' => @$ref_test_sample_id_value[$key], + 'test_date' => @$ref_test_date[$key], + 'performed_by' => @$ref_performed_by[$key], + 'comment' => $ref_test_sample_comment[$key], + ]); + }); + } + + + if(isset($request->ref_test_sample_id___)){ + $datas = collect($request->ref_test_sample_id___); + //$ref_test_date = collect($request->ref_test_sample_test_date); + //$ref_performed_by = collect($request->ref_test_sample_performer); + $ref_test_sample_comment_ = collect($request->ref_test_sample_comment___); + $vars = $datas->map(function ($val_, $key_) use($request, $ref_test_sample_comment_){ + $this->testResultModel::query()->where(['lab_id' => $this->baseLabId, 'sample_id' => $request->sample_id, 'test_sample_id' => $val_])->update([ + //'test_date' => @$ref_test_date[$key], + //'performed_by' => @$ref_performed_by[$key], + 'comment' => $ref_test_sample_comment_[$key_], + ]); + }); + } + + // set hide test + + if(isset($request->test_samples_to_hide)){ + $this->testResultModel::query()->where(['lab_id' => $this->baseLabId, 'sample_id' => $request->sample_id]) + ->whereNotIn('test_sample_id', $request->test_samples_to_hide)->update(['is_show' => 1]); + + foreach ($request->test_samples_to_hide as $val){ + $this->testResultModel::query()->where(['lab_id' => $this->baseLabId, 'sample_id' => $request->sample_id, 'test_sample_id' => $val])->update([ + 'is_show' => 0 + ]); + } + } else{ + $this->testResultModel::query()->where(['lab_id' => $this->baseLabId, 'sample_id' => $request->sample_id])->update(['is_show' => 1]); + } + + // organism result + if(isset($request->possible_result)){ + $possible_results = collect(json_decode($request->possible_result))->flatten(1); + //$organismIds = $possible_results->pluck('organism_id')->toArray(); + foreach ($possible_results as $k=>$org){ + + $organismIds = $possible_results->filter(function($item) use($org){ + return $item->test_sample_id == $org->test_sample_id; + })->pluck('organism_id')->toArray(); + + // change on 08/Sep/2023 to fixed issue save result success but no data affect + //$testResult = $this->testResultModel::query()->where(['test_sample_id' => $org->test_sample_id, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderByDesc('id')->limit(1)->first(); + $testResult = $this->testResultModel::query()->where(['test_sample_id' => $org->test_sample_id, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId, 'sample_id' => $request->sample_id])->orderByDesc('id')->limit(1)->first(); + + if(count($organismIds)>0){ + $this->organismResultModel::query()->where(['test_result_id' => $testResult->id, 'lab_id' => $this->baseLabId])->whereNotIn('organism_id', $organismIds)->update(['record_status_id' => 0]); + } + + $organismResult = $this->organismResultModel::query()->where(['test_result_id' => $testResult->id, 'organism_id' => $org->organism_id, BaseModel::RECORD_STATUS_FIELD =>RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId])->first(); + //$organismResultId = 0; + + if(!empty($organismResult)){ + $organismResultId = $organismResult->id; + $this->organismResultModel::query()->find($organismResult->id)->update([ + 'quantity_id' => (int)$org->quantity_id, + 'contaminant' => $org->contaminant + ]); + } + else{ + $savedOrg = $this->organismResultModel::query()->create([ + 'test_result_id' => $testResult->id, + 'organism_id' => $org->organism_id, + 'quantity_id' => (int)$org->quantity_id, + 'contaminant' => $org->contaminant, + 'lab_id' => $this->baseLabId, + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, + BaseModel::CREATED_AT => date('Y-m-d H:i:s') + ]); + $organismResultId = $savedOrg->id; + } + + + if(isset($request->anti_result)){ + $anti_result = collect(json_decode($request->anti_result))->flatten(1); + if(in_array($org->test_organism_id, $anti_result->pluck('test_organism_id')->unique()->flatten(1)->toArray())){ + $this->antibioticResultModel::query()->where('organism_result_id', $organismResultId)->delete(); + } + foreach ($anti_result as $j=>$anti){ + if($anti->test_organism_id == $org->test_organism_id && $anti->sensitive !="") { + $this->antibioticResultModel::query()->updateOrCreate([ + 'organism_result_id' => $organismResultId, + 'antibiotic_id' => $anti->antibiotic_id + ], [ + 'organism_result_id' => $organismResultId, + 'antibiotic_id' => $anti->antibiotic_id, + 'disk_diffusion' => $anti->disk_diffusion, + 'mic' => $anti->mic, + 'sensitive' => $anti->sensitive, + 'is_hide' => $anti->is_hide, + BaseModel::CREATED_AT_FIELD => date('Y-m-d H:i:s'), + BaseModel::CREATED_BY_FIELD => Auth::id(), + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE + ]); + } + } + } + + } + } + DB::commit(); + return response()->json(['success'=> true , 'message' => 'Sample result already saved.']); + } catch (\Exception $e){ + DB::rollBack(); + Log::error($e); + return response()->json(['success'=> false , 'error' => 'Failed while update sample result.']); + } + } + + public function getSampleTest($sample_id){ + try{ + $sample = $this->model::with(['patient','sample_source','sample_details','sample_tests', 'physician'])->find($sample_id); + return response()->json(['success'=> true , 'data' => new SampleResource($sample)]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => $e->getMessage()]); + } + } + + + + function makeInvoice($sampleId){ + try{ + $resultItems = DB::select(' + SELECT + d.`id` AS department_id, + d.`name_en` AS department_name, + d.weight as dweight, + st.`id` AS sample_type_id, + st.weight as sweight, + st.`name_en` AS sample_type, + ts.`id` AS test_sample_id, + ts.`heading_id` AS parent_id, + ts.`field_type`, + ts.`usd_price`, + ts.group_result, + ts.description, + t.`id` AS test_id, + t.`name_en` AS test_name, + tr.id as test_result_id, + pct.`commission_type`, + ifnull(pct.`commission_rate`, 0.00) as commission_rate, + ifnull(pct.`partner_price`, 0.00) as partner_price, + ts.weight + FROM samples s + INNER JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + INNER JOIN test_samples ts + ON ts.id = tr.`test_sample_id` + and ts.lab_id = tr.lab_id + INNER JOIN tests t + ON t.`id` = ts.`test_id` + INNER JOIN sample_types st + ON st.`id` = ts.`sample_type_id` + INNER JOIN departments d + ON d.`id` = st.`department_id` + LEFT JOIN `physician_commisssion` AS pct + ON pct.`test_sample_id` = ts.`id` + AND pct.`physician_id` = s.`physician_id` + WHERE s.`id` = '.$sampleId.' + AND s.`lab_id`= '.$this->baseLabId.' + AND tr.`record_status_id` = '.BaseModel::RECORD_STATUS_ACTIVE.' + AND LENGTH(ts.group_result)>0 + AND ts.usd_price>0 + ORDER BY + d.`weight`, + st.`weight`, + ts.`weight`'); + $departmentArray = array(); + foreach ($resultItems as $row){ + $net_amount = number_format((((!empty($row->commission_type) ? $row->commission_type : ((object) $this->location())->discount_type)) ==2 ? (($row->usd_price - $row->partner_price) - $row->commission_rate) : + (($row->usd_price - $row->partner_price) * (1-$row->commission_rate/100))),3); + $testItemArray = array( + 'test_sample_id' => (string)$row->test_sample_id, + 'test_id' => $row->test_id, + 'test_name' => $row->test_name, + 'closed_parent_id' => (string) (int)$row->parent_id, + 'field_type' => (string) $row->field_type, + 'usd_price' => $row->usd_price, + 'group_result' => (string) $row->group_result, + 'item_discount_type' => (!empty($row->commission_type) ? $row->commission_type : ((object) $this->location())->discount_type), + 'item_discount_rate' => $row->commission_rate, + 'item_discount' => $net_amount, + 'discount_price' => ($row->usd_price - $net_amount) + ); + $departmentArray[] = $testItemArray; + } + return $departmentArray; + } catch (\Exception $e){ + return $e->getMessage(); + } + } + + function printRecorder(Request $request){ + DB::beginTransaction(); + try{ + $patientSample = $this->model::query()->where(['id' => $request->uid, 'lab_id' => $this->baseLabId])->first(); + if($patientSample->is_printed==0) { + $patientSample->update( + [ + 'is_printed' => 1, + 'printed_at' => date('Y-m-d H:i:s'), + 'printed_by' => Auth::id() + ] + ); + } + DB::commit(); + return response()->json(['success'=> true , 'data' => $patientSample]); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + public function generateInvoiceId($invoiceDate){ + $prefix = date('y',strtotime($invoiceDate)); + $invoiceCount = $this->invoiceModel::query()->where('lab_id', $this->baseLabId)->whereRaw('year(invoice_date) ="'. date('Y',strtotime($invoiceDate)).'"')->count(); + return 'I-'.$this->base['short_name'].'-'.$prefix.'-'.(str_pad(($invoiceCount+1),5,'0',STR_PAD_LEFT)); + } + + + + function temporarySaveOrganismResult($sampleId, $testSampleId, $organismId){ + // if(Auth::user()->id==1){ + DB::beginTransaction(); + try{ + $testResult = $this->testResultModel::query()->where(['test_sample_id' => $testSampleId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId, 'sample_id' => $sampleId])->orderByDesc('id')->limit(1)->first(); + $organismResult = $this->organismResultModel::query()->where(['test_result_id' => $testResult->id, 'organism_id' => $organismId, BaseModel::RECORD_STATUS_FIELD =>RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId])->first(); + if(empty($organismResult)){ + + $savedOrg = $this->organismResultModel::query()->create([ + 'test_result_id' => $testResult->id, + 'organism_id' => $organismId, + 'quantity_id' => 0, + 'contaminant' => 0, + 'lab_id' => $this->baseLabId, + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, + BaseModel::CREATED_AT => date('Y-m-d H:i:s') + ]); + } + DB::commit(); + return response()->json(['success'=> true , 'message' => 'organisam_result_saved']); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + + //} + + } + + function temporarySaveOrganismResultQuantity($sampleId, $testSampleId, $organismId, $qtyId){ + //if(Auth::user()->id==1){ + DB::beginTransaction(); + try{ + $testResult = $this->testResultModel::query()->where(['test_sample_id' => $testSampleId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId, 'sample_id' => $sampleId])->orderByDesc('id')->limit(1)->first(); + $organismResult = $this->organismResultModel::query()->where(['test_result_id' => $testResult->id, 'organism_id' => $organismId, BaseModel::RECORD_STATUS_FIELD =>RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId])->first(); + if(!empty($organismResult)){ + $savedOrg = $this->organismResultModel::query()->where(['test_result_id' => $testResult->id, 'organism_id' => $organismId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId]) + ->update([ + 'quantity_id' => $qtyId + ]); + } + DB::commit(); + return response()->json(['success'=> true , 'message' => 'organisam_result_saved_by_addmin']); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + + //} + + } + + public function uploadAttachmentResult(Request $request){ + try { + $image = $request->file('image'); + $imageName = Str::uuid()->toString().'.' . $image->getClientOriginalExtension(); + $image->move(public_path('storage/images/attachment_lab_result'), $imageName); + return response()->json(['success' => true, 'message' => __('laboratory.update_success'), 'data' => array('result' =>$imageName)]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + function sendLabResultLink(Request $request, $patientId, $sampleId) + { + try { + $telegram = new Api(env('TELEGRAM_BOT_TOKEN')); + + $sample = $this->model::with(['patient','sample_source','lab'])->where(['id' => $sampleId])->first(); + + $text_message = "🧪 ".$sample->lab->name_en." Labo Result\n" + ."------------------------------------------------\n" + ."Patient Name:".$sample->patient->name_en."\n" + ."Age: ".Helpers::getAge($sample->patient->dob, $sample->admission_date)." (".Helpers::getGenderFull($sample->patient->gender).")\n" + ."Patients ID: ".$sample->patient->patient_uuid."\n" + ."Sample Source: ".$sample->sample_source->name_en."\n" + ."👉 Click To View Result\n" + ."------------------------------------------------\n" + ."Date: ".date("D d/m/Y H:i"); + + if($request->target_receiver=='patient'){ + $chat = DB::table('patient_telegram')->where('patient_id', $patientId)->first(); + if ($chat) { + $telegram->sendMessage([ + 'chat_id' => $chat->chat_id, + 'text' => $text_message, + 'parse_mode' => 'HTML', + + ]); + } + } + else{ + $sample = $this->model::with(['sample_source.telegramChatId'])->find($sampleId); + if(isset($sample->sample_source->telegramChatId) && !empty($sample->sample_source->telegramChatId)){ + $telegram->sendMessage([ + 'chat_id' => $sample->sample_source->telegramChatId->chat_id, + 'text' => $text_message, + 'parse_mode' => 'HTML', + ]); + } + } + + return response()->json(['success'=> true , 'message' => 'Laboroatory results have been sent!']); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => 'Laboroatory results sent failed!']); + //return response()->json(['success'=> false , 'message' => __('laboratory.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function updateSampleResultTemplate(Request $request){ + try{ + $patientSample = $this->model::query()->where(['id' => $request->uid, 'lab_id' => $this->baseLabId])->first(); + $patientSample->update(['result_template_id' => $request->result_template_id]); + return response()->json(['success'=> true , 'message' => 'Sample result template already saved!']); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => 'Failed while saving sample result template']); + } + } + +} diff --git a/app/Http/Controllers/SampleSourceController.php b/app/Http/Controllers/SampleSourceController.php new file mode 100644 index 0000000..97c6eef --- /dev/null +++ b/app/Http/Controllers/SampleSourceController.php @@ -0,0 +1,106 @@ +sampleSourceModel = $sampleSourceModel; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_sample_source'])) return redirect(url('my-profile')); + $sampleSources = $this->sampleSourceModel::with(['lab'])->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->where('lab_id', $this->baseLabId) + ->when(!empty($request->kword), function ($sampleSources) use($request){ + $sampleSources->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + })->orderBy(BaseModel::CREATED_AT,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('sample_source', ['sampleSources' => $sampleSources, 'labs' => parent::getAccessAbleLabs()]); + } + + public function save(Request $request){ + try { + if(!GlobalController::user_can(Auth::user()->role_id, ['create_sample_source'])) return false; + $validator = \Validator::make($request->all(), [ + 'name_en' => 'required', + 'name_kh' => 'nullable' + ]); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('sample_source.create_fail'), 'errors' => $validator->errors()->all()]); + + $new = $this->sampleSourceModel::query()->firstOrNew(['name_en' => $request->name_en, 'lab_id' => $this->baseLabId]); + $new->name_en = $request->name_en; + $new->is_default = $request->is_default; + $new->lab_id = $this->baseLabId; + $new->created_at = date('Y-m-d H:i:s'); + $new->created_by = Auth::id(); + $new->record_status_id = RecordStatusEnum::ACTIVE; + $new->save(); + + return response()->json(['success' => true, 'message' => __('sample_source.create_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample_source.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_sample_source'])) return false; + $validator = \Validator::make($request->all(), [ 'name_en' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('sample_source.update_fail'), 'errors' => $validator->errors()->all()]); + $data = array( + 'name_en' => $request->name_en, + 'name_kh' => $request->name_kh, + 'is_default' =>$request->is_default, + 'updated_at' => date('Y-m-d H:i:s'), + 'updated_by' => Auth::id() + ); + $this->sampleSourceModel::query()->where('id', $request->uid)->update($data); + return response()->json(['success' => true, 'message' => __('sample_source.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample_source.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $sampleSource = $this->sampleSourceModel::query()->find($request->uid); + return response()->json(['success' => true, 'message' => __('sample_source.get_success'), 'data' => $sampleSource]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample_source.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_sample_source'])) return false; + $this->sampleSourceModel::query()->where('id', $request->uid)->update(array( BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('sample_source.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample_source.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->sampleSourceModel::query()->where('id', $request->uid)->update(array( BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('sample_source.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample_source.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + +} diff --git a/app/Http/Controllers/SampleTypeController.php b/app/Http/Controllers/SampleTypeController.php new file mode 100644 index 0000000..ee09664 --- /dev/null +++ b/app/Http/Controllers/SampleTypeController.php @@ -0,0 +1,133 @@ +departmentModel = $departmentModel; + $this->sampleTypeModel = $sampleTypeModel; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_sample_type'])) return redirect(url('my-profile')); + $standardSampleTypes = $this->sampleTypeModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'is_standard' => 1])->get(['id','name_en'])->unique('name_en'); + $departments = $this->departmentModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE)->where('lab_id', $this->baseLabId)->get(); + $recordStatusCondition = Auth::id()==1 ? [RecordStatusEnum::DELETE, RecordStatusEnum::ACTIVE] : [RecordStatusEnum::ACTIVE]; + $sampleTypes = $this->sampleTypeModel::with(['department'=>function($query) {return $query->orderBy('id','ASC');}])->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusCondition) + ->where('lab_id', $this->baseLabId) + ->when(!empty($request->kword), function ($sampleTypes) use($request, $recordStatusCondition){ + $sampleTypes->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhereIn('department_id', $this->departmentModel::query() + ->where('lab_id', $this->baseLabId) + ->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->kword)."%'")->pluck('id')->toArray() + )->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusCondition);; + })->orderBy('weight','ASC')->paginate(config('labis.pagination.perpage', 10)); + return view('sample-type', ['sampleTypes' => $sampleTypes, 'departments' => $departments, 'standardSampleTypes' => $standardSampleTypes]); + } + + public function save(Request $request){ + try { + if(!GlobalController::user_can(Auth::user()->role_id, ['create_sample_type'])) return false; + $validator = \Validator::make($request->all(), ['name_en' => 'required', 'department_id' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('sample_type.create_fail'), 'errors' => $validator->errors()->all()]); + $new = $this->sampleTypeModel::query()->firstOrNew(['name_en' => $request->name_en, 'department_id' => $request->department_id]); + $new->name_en = $request->name_en; + $new->weight = $request->weight; + $new->tube = $request->tube; + $new->bg_color = $request->bg_color; + $new->color = $request->color; + $new->lab_id = $this->baseLabId; + $new->department_id = $request->department_id; + $new->enter_form_id = $request->enter_form_id; + $new->preview_form_id = $request->preview_form_id; + $new->description = is_array($request->description) ? json_encode($request->description) : NULL; + $new->save(); + + return response()->json(['success' => true, 'message' => __('sample_type.create_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample_type.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_sample_type'])) return false; + $validator = \Validator::make($request->all(), ['uid' => 'required', 'name_en' => 'required' /*,'department_ids' => 'required'*/]); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('sample_type.update_fail'), 'errors' => $validator->errors()->all()]); + $data = array( + 'name_en' => $request->name_en, + 'weight' => $request->weight, + 'tube' => $request->tube, + 'bg_color' => $request->bg_color, + 'color' => $request->color, + 'department_id' =>$request->department_id, + 'enter_form_id' => $request->enter_form_id, + 'preview_form_id' => $request->preview_form_id, + 'description' => is_array($request->description) ? json_encode($request->description) : NULL + ); + $this->sampleTypeModel::query()->where('id', $request->uid)->update($data); + return response()->json(['success' => true, 'message' => __('sample_type.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample_type.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $sampleType = $this->sampleTypeModel::query()->find($request->uid); + return response()->json(['success' => true, 'message' => __('sample_type.get_success'), 'data' => $sampleType]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample_type.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_sample_type'])) return false; + $this->sampleTypeModel::query()->where('id', $request->uid)->update(array('record_status_id'=> RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('sample_type.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample_type.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->sampleTypeModel::query()->where('id', $request->uid)->update(array('record_status_id'=> RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('sample_type.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample_type.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + public function getById($id){ + try{ + $sampleType = $this->sampleTypeModel::query()->find($id); + return response()->json(['success' => true, 'message' => __('sample_type.get_success'), 'data' => $sampleType]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('sample_type.get_fail'), 'errors' => $e->getMessage()]); + } + } + + + +} diff --git a/app/Http/Controllers/ShareController.php b/app/Http/Controllers/ShareController.php new file mode 100644 index 0000000..cc6f513 --- /dev/null +++ b/app/Http/Controllers/ShareController.php @@ -0,0 +1,710 @@ +patientModel = new Patient(); + $this->physicianModel = new Physician(); + $this->sampleModel = new Sample(); + $this->testResultModel = new TestResult(); + $this->laboratoryConfigures = new LabConfigure(); + $this->testGroupModel = new TestGroup(); + $this->departmentModel = new Department(); + $this->sampleDetailModel = new SampleDetail(); + $this->testGroupDetailModel = new TestGroupDetail(); + } + + public function index($id){ + $sample = Sample::with(['patient','invoice'])->where(['id' => $id])->first(); + $labSettings = Laboratory::query()->find($sample->lab_id); + $samplePhysician = Physician::query()->where('id', $sample->physician_id)->first(); + $labConfigures = $this->laboratoryConfigures::query()->where(['lab_id' => $sample->lab_id, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get()->toArray(); + + + $preview_form_id = ($labSettings->lab_category_id==0? 1:2); + + $resultTemplateId = (collect($labConfigures)->where('atrribute_code', 'RESULT_TEMPLATE')->pluck('assigned_attribute_value')->first()); + if(!empty($resultTemplateId)){ + $preview_form_id = $resultTemplateId; + } + + if($sample->result_template_id > 0){ + $preview_form_id = $sample->result_template_id; + } + + return view('shared.test_result', [ + 'sample' => $sample, + 'preview_result_id' => $preview_form_id, + 'labSettings' =>$labSettings, + 'samplePhysician' => $samplePhysician, + 'labConfigures' => $labConfigures, + 'firstPrvSampleId' => (int)@$this->getPreviousSample($sample->patient_id, $id)->first()->id, + 'firstPrvSampleDate' => (string) !empty($this->getPreviousSample($sample->patient_id, $id)->first()) ? date('d-m-Y', strtotime($this->getPreviousSample($sample->patient_id, $id)->first()->admission_date)) : '', + ]); + } + + function getTestItemBySampleId($sampleId, $previousId = 0){ + try{ + $data = Sample::with(['entryBy','modifiedBy','sample_tests', 'physician'])->where(['id' => $sampleId])->get()->first(); + $arrData = array(); + $arrData['result_comment'] = []; + $arrData['sample'] = array( + 'sample_number' => $data->sample_number, + 'collected_date' => date('d-M-Y H:i', strtotime($data->collected_date)), + 'received_date' => date('d-M-Y H:i', strtotime($data->received_date)), + 'requested_by' => $data->physician + ); + $arrData['sample_users'] = array('creator' => $data->entryBy->name, 'modifier' => @$data->modifiedBy->name); + $arrData['result_users'] = []; + $arrData['performers'] = [];//UserResource::collection($this->getLabUsers()->pluck('user')); + $arrData['antibiotic_results'] = $this->getOrgAntibioticResult($sampleId); + + $resultItems = DB::select(' + SELECT + p.gender, + p.dob, + d.`id` AS department_id, + d.`name_en` AS department_name, + d.weight as dweight, + st.`id` AS sample_type_id, + st.`name_en` AS sample_type, + ts.`id` AS test_sample_id, + ts.`heading_id` AS parent_id, + ts.`field_type`, + ts.formula, + ts.format, + ts.`usd_price`, + ts.group_result, + ts.description, + t.`id` AS test_id, + t.`name_en` AS test_name, + -- IF(ts.`field_type` = 2, \'Signle\', IF(ts.`field_type`=3,\'Multiple\', ts.unit_sign)) AS unit_sign, + ts.unit_sign AS unit_sign, + -- tnv.`minimum` as minimum, + -- tnv.`maximum` as maximum, + ifnull(tr.test_result,"") as test_result, + ifnull(prev_r.test_result,"") as prev_result, + tr.is_show, + tr.performed_by, + tr.id as test_result_id, + pct.`commission_type`, + ifnull(pct.`commission_rate`, 0.00) as commission_rate, + ifnull(pct.`partner_price`, 0.00) as partner_price, + ts.weight, + ts.is_bold, + ts.lab_id, + tr.test_date, + tr.comment, + sd.sample_descr + + FROM samples s + INNER JOIN patients p + ON p.id = s.patient_id AND p.lab_id = s.lab_id + INNER JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + INNER JOIN test_samples ts + ON ts.id = tr.`test_sample_id` + and ts.lab_id = tr.lab_id + INNER JOIN tests t + ON t.`id` = ts.`test_id` + /*AND t.`lab_id` = ts.`lab_id`*/ + INNER JOIN sample_types st + ON st.`id` = ts.`sample_type_id` + INNER JOIN departments d + ON d.`id` = st.`department_id` + + LEFT JOIN `physician_commisssion` AS pct + ON pct.`test_sample_id` = ts.`id` + AND pct.`physician_id` = s.`physician_id` + + LEFT JOIN sample_details sd ON sd.sample_id = s.id AND sd.sample_type_id = st.id + + LEFT JOIN ( + SELECT + tr.`test_sample_id`, + tr.`test_result` + FROM samples s + INNER JOIN test_results tr + ON tr.`sample_id` = s.`id` + WHERE s.id = '.$previousId.' + AND tr.record_status_id = 1 + ) prev_r + ON prev_r.test_sample_id = tr.`test_sample_id` + + WHERE s.`id` = '.$sampleId.' + AND tr.`record_status_id` = '.BaseModel::RECORD_STATUS_ACTIVE.' + + ORDER BY + d.`weight`, + st.`weight`, + ts.`weight`'); + $departmentArray = array(); + + $sampleTypeIds = collect($resultItems)->pluck('sample_type_id')->unique()->values(); + $refComment = collect($this->getRefCommentV2($sampleTypeIds)); + + foreach ($resultItems as $row){ + $departmentArray[$row->dweight]['department_id'] = $row->department_id; + $departmentArray[$row->dweight]['department_name'] = $row->department_name; + $departmentArray[$row->dweight]['samples'][$row->sample_type_id]['sample_type_id'] = $row->sample_type_id; + $departmentArray[$row->dweight]['samples'][$row->sample_type_id]['sample_type_name'] = $row->sample_type; + $departmentArray[$row->dweight]['samples'][$row->sample_type_id]['sample_descr'] = (string)$row->sample_descr !=''? '('.$row->sample_descr.')' : ''; + + + $departmentArray[$row->dweight]['samples'][$row->sample_type_id]['comments'] = $refComment->where('sample_type_id', $row->sample_type_id)->values(); + + $organismResult = []; + if(in_array($row->field_type, [2,3])) { + $organismResult = $this->getOrganismResult($row->test_result_id); + } + + + $refRanges = (object) $this->mapReferenceRange($row->test_sample_id, $row->gender, $row->dob); + + $testItemArray = array( + 'id' => (string)$row->test_sample_id, + 'test_id' => $row->test_id, + 'test_name' => $row->test_name, + 'closed_parent_id' => (string) (int)$row->parent_id, + 'field_type' => (string) $row->field_type, + 'unit_sign' => (string) $row->unit_sign, + 'usd_price' => $row->usd_price, + 'min_ref_val' => isset($refRanges->minimum) ? $refRanges->minimum :'', + 'max_ref_val' => isset($refRanges->maximum) ? $refRanges->maximum: '', + 'ref_range' => (isset($refRanges->minimum) /*&& !empty($refRanges->minimum)*/) ? in_array($refRanges->sign, ['<','<=','Neg <', 'Neg<']) ? $refRanges->sign.' '.$refRanges->maximum : (in_array($refRanges->sign, ['>','>=']) ? $refRanges->sign. ' '.$refRanges->minimum : ((isset($refRanges->minimum) /*&& !empty($refRanges->minimum)*/) ? $refRanges->minimum .' '. $refRanges->sign .' '. $refRanges->maximum : '')) : '', + //'ref_range' => ((isset($refRanges->minimum) && !empty($refRanges->minimum)) ? $refRanges->minimum .' '. $refRanges->sign .' '. $refRanges->maximum : ''), + 'test_result' => !is_null($row->format) && is_numeric($row->test_result) ? number_format($row->test_result,$row->format) : $row->test_result, + 'prev_result' => (string)!is_null($row->format) && is_numeric($row->prev_result) ? number_format($row->prev_result,$row->format) : $row->prev_result, + 'sign' => isset($refRanges->sign) ? $refRanges->sign: '', + 'is_show' => $row->is_show, + 'performed_by' => $row->performed_by, + 'org_results' => $organismResult, + 'group_result' => (string) $row->group_result, + 'commission_type' => NULL, + 'commission_rate' => $row->commission_rate, + 'partner_price' => $row->partner_price, + 'description' => (string) nl2br($row->description), + 'formula' => (string) $row->formula, + 'order' => (int) $row->weight, + 'test_date' => (string) $row->test_date, + 'comment' => (string) nl2br($row->comment), + 'str_comment' => (string) $row->comment, + 'is_bold' => (int) $row->is_bold, + 'ts' => $row->test_result, + 'lab_id' => $row->lab_id, + 'format' => (int)$row->format + ); + //dd($testItemArray); + $departmentArray[$row->dweight]['samples'][$row->sample_type_id]['tests'][] = $testItemArray; + } + + $arrData['sample_tests'] = $departmentArray; + + + return response()->json(['success'=> true , 'data' => $arrData]); + } catch (\Exception $e){ + Log::error($e); + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + function getRefCommentV2($sampleTypeIds){ + return Comment::query()->select('sample_type_id', 'comment_desc as name')->where( + [ + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE + ])->whereIn('sample_type_id', $sampleTypeIds)->get()->toArray(); + } + + function getOrgAntibioticResult($sampleId){ + $resultItems = DB::select(' + SELECT + ogr.test_result_id, + tsr.id AS test_organism_id, + ogr.organism_id, + att.antibiotic_id, + agr.disk_diffusion, + agr.mic, + agr.sensitive, + agr.is_hide, + att.name_en + FROM `organism_results` AS ogr + INNER JOIN `antibiogram_results` agr + ON agr.`organism_result_id` = ogr.`id` + INNER JOIN `antibiotics` att + ON att.id = agr.antibiotic_id + INNER JOIN test_results trs + ON trs.id = ogr.test_result_id + INNER JOIN `test_sample_organisms` tsr + ON tsr.test_sample_id = trs.test_sample_id + AND tsr.`organism_id` = ogr.`organism_id` + WHERE trs.`sample_id` = '.$sampleId.' + AND agr.`record_status_id` = 1 + AND ogr.record_status_id = 1 + AND trs.record_status_id = 1 + AND tsr.record_status_id = 1 + order by agr.sensitive desc'); + return $resultItems; + } + + function getOrganismResult($testResultId){ + $resultItems = DB::select(' + SELECT + ogr.test_result_id, + tsr.id AS test_organism_id, + ogr.organism_id, + ogr.quantity_id, + ogr.contaminant, + o.`name_en` AS organism_name, + o.is_bold, + qt.`quantity_name`, + ogr.id + FROM `organism_results` AS ogr + INNER JOIN test_results trs + ON trs.id = ogr.test_result_id + INNER JOIN `test_sample_organisms` tsr + ON tsr.test_sample_id = trs.test_sample_id + AND tsr.`organism_id` = ogr.`organism_id` + INNER JOIN organisms o + ON o.id = ogr.`organism_id` + LEFT JOIN `quantities` qt + ON qt.id = ogr.`quantity_id` + WHERE ogr.`test_result_id` = '.$testResultId. ' + AND ogr.record_status_id = 1 + AND trs.record_status_id = 1 + AND tsr.record_status_id = 1'); + return $resultItems; + } + + function mapReferenceRange($testSampleId, $genderId, $patientDob){ + + $referenceRanges = DB::select(' + SELECT + (IF(pt.range_start=0, 1, pt.range_start) * pt.range_start_unit) + IF(pt.range_start_unit=\'>\', 1, 0) AS start_range_in_day, + (IF(pt.range_end=0, 1, pt.range_end) * pt.range_end_unit) + IF(pt.range_end_sign=\'<=\', 1, 0) AS end_range_in_day, + pt.gender, + pt.range_start, + pt.range_start_unit, + pt.range_start_sign, + pt.range_end, + pt.range_end_unit, + pt.range_end_sign, + tnv.test_sample_id, + tnv.sign, + ts.format, + tnv.`minimum` AS minimum, + tnv.`maximum` AS maximum + FROM test_normal_values tnv + INNER JOIN patient_types pt + ON pt.id = tnv.patient_type_id + INNER JOIN test_samples ts + ON ts.id = tnv.test_sample_id + WHERE tnv.record_status_id = 1 + AND test_sample_id = '.$testSampleId.' + '); + + $now = time(); // or your date as well + $your_date = strtotime($patientDob); + $patientAgeInDay = round(($now - $your_date)/ (60 * 60 * 24)); + $referenceRangeArray = array(); + foreach ($referenceRanges as $referenceRange){ + if((int)$patientAgeInDay >= (int)$referenceRange->start_range_in_day && (int)$patientAgeInDay <= (int)$referenceRange->end_range_in_day){ + // Log::info($patientAgeInDay . ' - '.$genderId); + if($referenceRange->gender == $genderId){ + // Log::info('geneder=gender'); + $referenceRangeArray = array( + 'sign' => $referenceRange->sign, + 'minimum' => !is_null($referenceRange->format) ? number_format($referenceRange->minimum,$referenceRange->format) : (fmod($referenceRange->minimum,1) == 0 ? number_format($referenceRange->minimum,0):number_format($referenceRange->minimum,2)), + 'maximum' => !is_null($referenceRange->format) ? number_format($referenceRange->maximum,$referenceRange->format) : (fmod($referenceRange->maximum,1) == 0 ? number_format($referenceRange->maximum,0):number_format($referenceRange->maximum,2)), + ); break; + } + else{ + if($referenceRange->gender==3) { + $referenceRangeArray = array( + 'sign' => $referenceRange->sign, + 'minimum' => !is_null($referenceRange->format) ? number_format($referenceRange->minimum,$referenceRange->format) : (fmod($referenceRange->minimum,1) == 0 ? number_format($referenceRange->minimum,0):number_format($referenceRange->minimum,2)), + 'maximum' => !is_null($referenceRange->format) ? number_format($referenceRange->maximum,$referenceRange->format) : (fmod($referenceRange->maximum,1) == 0 ? number_format($referenceRange->maximum,0):number_format($referenceRange->maximum,2)), + ); break; + } + // } + } + } + } + return $referenceRangeArray; + } + + + /** + * New Implementation for Patient Profile + * @param Request $request + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + + public function startAnonymousSession($hashLabId){ + $this->base = Laboratory::query()->where(BaseModel::RECORD_STATUS_FIELD, BaseModel::RECORD_STATUS_ACTIVE) + ->where('allow_external_request', 1) + ->whereRaw('MD5(id)="'.$hashLabId.'"')->first(); + $provinces = Province::where('id','<>', 25)->orderBy('name_kh')->get(); + if(empty($this->base)) return view('errors.404'); + return view('shared.anonymous_login', ['labSettings' => (object) $this->base, 'provinces' => $provinces ]); + } + + public function searchPatientToSelect2(Request $request, $labId){ + $patients = []; + if(!empty(trim($request->term))){ + $patients = $this->patientModel::query() + ->where(['record_status_id' => 1, 'lab_id' => $labId]) + //->whereRaw('MD5(lab_id)="'.$hashLabId.'"') + ->when(!empty(trim($request->term)), function ($patients) use($request){ + $patients->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->term)."%'"); + //->orWhereRaw("replace(phone_number, ' ','') like '%".str_replace(" ","",$request->term)."%'"); + })->limit(3)->orderBy('name_en', 'asc')->get(); + } + $items = $patients->map(function ($item){ + return array('id'=>$item->id, 'text' => $item->name_en . ' : '.$item->phone_number . ', '.($item->gender==1 ? 'M' : 'F').', '.(date('Y') - date('Y',strtotime($item->dob)))); + }); + return response()->json(['results' => $items]); + } + + public function searchPatientPhoneToSelect2(Request $request, $labId){ + $patients = []; + if(!empty(trim($request->term))){ + $patients = $this->patientModel::query() + ->where(['record_status_id' => 1, 'lab_id' => $labId]) + ->when(!empty(trim($request->term)), function ($patients) use($request){ + $patients->whereRaw("replace(phone_number, ' ','') like '%".str_replace(" ","",$request->term)."%'"); + })->limit(3)->orderBy('phone_number', 'asc')->get(); + } + $items = []; + if(count($patients)>0) { + $items = $patients->map(function ($item){ + return array('id'=>$item->phone_number, 'text' => $item->name_en . ' : '.$item->phone_number . ', '.($item->gender==1 ? 'M' : 'F').', '.(date('Y') - date('Y',strtotime($item->dob)))); + }); + } + return response()->json(['results' => $items]); + } + + public function anonymousRegister(Request $request, $hashLabId){ + DB::beginTransaction(); + try{ + $dob = $request->dob; + $patient_name=strtoupper($request->name_en); + $datePart = explode("-",$dob); + $phoneNumber = $request->phone_number;// preg_replace('/ /i', '', trim($request->phone_number)); + if($datePart[1]>12){ + $dob = $datePart[1].'-'.$datePart[0].'-'.$datePart[2]; + } + $requests = collect($request)->merge([ + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => '1', + 'record_status_id' => 1 + ])->replace([ + 'dob' => date('Y-m-d', strtotime($dob)), + 'phone_number' => $phoneNumber, + 'name_en'=> $patient_name + ]); + + $patientNumber = $this->generateAutoId(date('Y-m-d'), $request->short_name, $request->lab_id); + $requests = $requests->merge(['patient_uuid' => $patientNumber]); + $patient = $this->patientModel::query()->create($requests->all()); + DB::commit(); + + $request->session()->put('anonymous_id', $patient->id); + $request->session()->put('base_lab_id', $patient->lab_id); + if ($request->session()->has('anonymous_id')) { + return redirect(url('customer/'.$hashLabId.'?request-test')); + } + + } catch (\Exception $e){ + dd($e); + DB::rollBack(); + Log::error($e); + return response()->json(['success'=> false , 'message' => __('patient.create_fail') , 'errors' => $e->getMessage()]); + } + } + + public function generateAutoId($admissionDate, $labShortName, $labId){ + $prefix = date('y',strtotime($admissionDate)); + $patientCount = $this->patientModel::query()->where('lab_id', $labId)->whereRaw('year(created_at) ="'. date('Y',strtotime($admissionDate)).'"')->count(); + if($labId==34) $patientCount = $patientCount+5; // solve problem when delete patient + return 'P-'.$labShortName.'-'.$prefix.'-'.(str_pad(($patientCount+1),5,'0',STR_PAD_LEFT)); + } + + public function anonymousLogin(Request $request, $hashLabId){ + if(empty($request->patient_id) && empty($request->phone_number)) { + session()->flash('message', 'មិនមានលេខនេះនៅក្នុងប្រព័ន្ធយើងខ្ញុំទេ'); + return redirect()->back(); + } + $pattern = '/ /i'; + $phoneNumber = $request->phone_number;// preg_replace($pattern, '', trim($request->phone_number)); + $patient = $this->patientModel::query()->where(BaseModel::RECORD_STATUS_FIELD, BaseModel::RECORD_STATUS_ACTIVE) + ->whereRaw('MD5(lab_id)="'.$hashLabId.'"') + ->when(!empty($request->phone_number) && empty($request->patient_id), function($patient) use($request){ + $patient->whereRaw("replace(phone_number, ' ','') = '".str_replace(" ","",$request->phone_number)."'"); + })->when(!empty($request->patient_id), function($patient) use($request){ + $patient->where('id', $request->patient_id); + })->first(); + //->where('phone_number', $phoneNumber)->first(); + if(empty($patient)){ + session()->flash('message', 'មិនមានលេខនេះនៅក្នុងប្រព័ន្ធយើងខ្ញុំទេ'); + return redirect()->back(); + } + else{ + $request->session()->put('anonymous_id', $patient->id); + $request->session()->put('base_lab_id', $patient->lab_id); + if ($request->session()->has('anonymous_id')) { + return redirect(url('customer/'.$hashLabId)); + } + } + } + + public function anonymousLogOut(Request $request, $hashLabId){ + if ($request->session()->has('anonymous_id')) { + $request->session()->forget('anonymous_id'); + $request->session()->forget('base_lab_id'); + return redirect(url('anonymous/'.$hashLabId)); + } + } + + public function profile(Request $request, $hashLabId) + { + if (!$request->session()->has('anonymous_id')) { + return redirect(url('anonymous/'.$hashLabId)); + } + $patient = $this->patientModel::query() + ->where(['id' => $request->session()->get('anonymous_id'), BaseModel::RECORD_STATUS_FIELD => BaseModel::RECORD_STATUS_ACTIVE]) + ->whereRaw('MD5(lab_id)="'.$hashLabId.'"')->first(); + $this->base = Laboratory::query()->where(BaseModel::RECORD_STATUS_FIELD, BaseModel::RECORD_STATUS_ACTIVE) + ->whereRaw('MD5(id)="'.$hashLabId.'"')->first(); + $samples = $this->sampleModel::query()->where(BaseModel::RECORD_STATUS_FIELD, BaseModel::RECORD_STATUS_ACTIVE) + ->where('patient_id', $request->session()->get('anonymous_id')) + ->whereRaw('MD5(lab_id)="'.$hashLabId.'"')->orderBy(BaseModel::CREATED_AT_FIELD,'desc')->paginate(5); + $testGroups = $this->testGroupModel::with(['testGroupDetails'])->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereRaw('MD5(lab_id)="'.$hashLabId.'"')->orderBy('created_at')->get(); + $physicians = $this->physicianModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereRaw('MD5(lab_id)="'.$hashLabId.'"')->orderBy('name_en')->get(); + return view('shared.patient_profile', + [ + 'patient' => $patient, + 'samples' => $samples, + 'labSettings' => (object) $this->base, + 'testGroups' => $testGroups, + 'physicians' => $physicians + ]); + } + + function getPreviousSample($patientId, $curSampleId){ + return $this->sampleModel::query()->where(['patient_id' => $patientId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->where('id','<', $curSampleId)->orderBy('id', 'desc')->get(['id','admission_date']); + } + + public function viewLabResult(Request $request, $hashLabId, $hashSampleId){ + if (!$request->session()->has('anonymous_id')) { + return redirect(url('anonymous/'.$hashLabId)); + } + $sample = $this->sampleModel::with(['patient','invoice'])->where(BaseModel::RECORD_STATUS_FIELD, BaseModel::RECORD_STATUS_ACTIVE) + ->whereRaw('MD5(lab_id)="'.$hashLabId.'" AND MD5(id)="'.$hashSampleId.'"')->first(); + $this->base = Laboratory::query()->where(BaseModel::RECORD_STATUS_FIELD, BaseModel::RECORD_STATUS_ACTIVE) + ->whereRaw('MD5(id)="'.$hashLabId.'"')->first(); + $labConfigures = $this->laboratoryConfigures::query() + ->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->whereRaw('MD5(id)="'.$hashLabId.'"') + ->get()->toArray(); + $samplePhysician = $this->physicianModel::query()->where('id', $sample->physician_id)->first(); + + + return view('shared.preview_result', + [ + 'sample' => $sample, + 'sample_id' => $sample->id, + 'labSettings' => (object) $this->base, + 'labConfigures' => $labConfigures, + 'samplePhysician' => $samplePhysician + ]); + } + + public function cloneRequestedLabServices(Request $request, $hashLabId, $hashSampleId){ + if (!$request->session()->has('anonymous_id')) { + return redirect(url('anonymous/'.$hashLabId)); + } + DB::beginTransaction(); + try{ + $sample = $this->sampleModel::query()->where(BaseModel::RECORD_STATUS_FIELD, BaseModel::RECORD_STATUS_ACTIVE) + ->whereRaw('MD5(lab_id)="'.$hashLabId.'" AND MD5(id)="'.$hashSampleId.'"')->first(); + + $requestedSample = []; + if(!empty($sample)){ + $reSampleArray = array( + 'patient_id' => $sample->patient_id, + 'sample_number' => $this->generateSampleNumber($sample->lab_id, date('Y-m-d H:i:s')), + 'admission_date' => date('Y-m-d H:i:s'), + 'sample_source_id' => $sample->sample_source_id, + 'physician_id' => $sample->physician_id, + 'requested_date' => date('Y-m-d H:i:s'), + 'collected_date' => date('Y-m-d H:i:s'), + 'is_accept_request' => 0, + 'lab_id' => $sample->lab_id, + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => $sample->patient_id, + ); + + $requestedSample = $this->sampleModel::query()->create($reSampleArray); + $previousTests = $this->testResultModel::query()->where([ + BaseModel::RECORD_STATUS_FIELD => BaseModel::RECORD_STATUS_ACTIVE, + 'sample_id' => $sample->id, + 'lab_id' => $sample->lab_id + ])->get(); + if(!empty($requestedSample) && !empty($previousTests)){ + $items = []; + foreach ($previousTests as $previousItem){ + $items[] = array( + 'sample_id' => $requestedSample->id, + 'test_sample_id' => $previousItem->test_sample_id, + 'test_result' => NULL, + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => $sample->patient_id, + 'lab_id' => $previousItem->lab_id + ); + } + $this->testResultModel::query()->insert($items); + } + } + DB::commit(); + return response()->json(['success'=> true , 'message' => __('ប្រតិបត្តិការបានសម្រេច'), 'data' => $requestedSample]); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success'=> false , 'message' => __('ប្រតិបត្តិការមិនបានសម្រេច'), 'errors' => [$e->getMessage()]]); + } + } + + public function generateSampleNumber($labId, $admissionDate){ + $this->base = Laboratory::query()->where(BaseModel::RECORD_STATUS_FIELD, BaseModel::RECORD_STATUS_ACTIVE) + ->where('id', $labId)->first(); + $prefix = date('ymd',strtotime($admissionDate)); + $sample = Sample::query(); + $sampleCount = $sample->where('lab_id', $labId)->whereRaw('date(admission_date) ="'. date('Y-m-d',strtotime($admissionDate)).'"')->count(); + return 'S-'.$this->base['short_name'].'-'.$prefix.'-'.(str_pad(($sampleCount+1),3,'0',STR_PAD_LEFT)); + } + + + function getTestItem(Request $request){ + try{ + $departments = $this->departmentModel::with(['samples','samples.testSamples.test','samples.testSamples.childTest']) + ->where(['lab_id' => $request->session()->get('base_lab_id'), BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->orderBy('weight', 'asc')->get(); + return response()->json(['success'=> true , 'data' => SampleTestResource::collection($departments)]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + /** Request Test */ + + public function storeSampleDetail(Request $sampleCreateRequest){ + + set_time_limit(6000); + ini_set('memory_limit', '10240M'); + DB::beginTransaction(); + try{ + + $labId = $sampleCreateRequest->session()->get('base_lab_id'); + $patientId = $sampleCreateRequest->session()->get('anonymous_id'); + + $sampleSourceId = SampleSource::where(['lab_id' => $labId, 'is_default' => 1, 'record_status_id' => 1])->get()->first(); + //$physicianId = Physician::where(['lab_id' => $labId, 'is_default' => 1, 'record_status_id' => 1])->get()->first(); + + // create sample first + $sampleRequest = array( + 'patient_id' => $patientId, + 'sample_number' => $this->generateSampleNumber($labId, date('Y-m-d H:i:s')), + 'admission_date' => date('Y-m-d H:i:s'), + 'sample_source_id' => @$sampleSourceId->id, // cannot null + 'physician_id' => $sampleCreateRequest->physician_id, // @$physicianId->id, // cannot null + 'requested_date' => date('Y-m-d H:i:s'), + 'received_date' => date('Y-m-d H:i:s'), + 'collected_date' => date('Y-m-d H:i:s'), + 'is_accept_request' => 0, + 'lab_id' => $labId, + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => $patientId, + ); + + $requestedSample = $this->sampleModel::query()->create($sampleRequest); + + //$this->sampleDetailModel::query()->where(['sample_id' => $requestedSample->id, 'lab_id' => $labId])->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + if(!empty($requestedSample)) { + if (!empty($sampleCreateRequest->sample_tests)) { + /*$this->testResultModel::query()->where(['sample_id' => $requestedSample->id, 'lab_id' => $labId]) + ->whereNotIn('test_sample_id', $sampleCreateRequest->sample_tests) + ->delete();*/ + foreach ($sampleCreateRequest->sample_tests as $test) { + $testResult = $this->testResultModel::query()->create([ + 'sample_id' => $requestedSample->id, + 'test_sample_id' => $test, + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => $patientId, + 'lab_id' => $labId, + ]); + } + } + /*else { + $this->testResultModel::query()->where(['sample_id' => $sampleCreateRequest->sample_id, 'lab_id' => $this->baseLabId])->delete(); + }*/ + } + + DB::commit(); + return response()->json(['success' => true, 'message' => __('sample.assign_tests_success')]); + } catch (\Exception $e){ + Log::error($e); + DB::rollBack(); + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + public function getTestGroup($id, $labId){ + try{ + $testGroupItems = $this->testGroupDetailModel::query()->where(['test_group_id' => $id, 'lab_id' => $labId, 'record_status_id'=> 1])->get()->pluck('test_sample_id')->toArray(); + return response()->json(['success' => true, 'data' => $testGroupItems]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + + +} diff --git a/app/Http/Controllers/TelegramController.php b/app/Http/Controllers/TelegramController.php new file mode 100644 index 0000000..d99df78 --- /dev/null +++ b/app/Http/Controllers/TelegramController.php @@ -0,0 +1,88 @@ +getWebhookUpdate(); + + if ($update->getMessage()) { + $chatId = $update->getMessage()->getChat()->getId(); + $text = $update->getMessage()->getText(); + $patientId = null; + $sampleSourceId = null; + if ($text && str_starts_with($text, "/start")) { + $parts = explode(" ", $text); + $individualType = 'patient'; + if (count($parts) > 1) { + $fullText = explode("_", $parts[1]); + if(count($fullText) > 1){ + $sampleSourceId = trim($fullText[1]); + } + else{ + $patientId = trim($parts[1]); + } + } + + if ($patientId) { + // Check if patient already registered + $exists = DB::table('patient_telegram') + ->where('patient_id', $patientId) + ->exists(); + + if (!$exists) { + DB::table('patient_telegram')->updateOrInsert( + ['patient_id' => $patientId], + ['chat_id' => $chatId] + ); + + $telegram->sendMessage([ + 'chat_id' => $chatId, + 'text' => "✅ Thank you for joining our bot. You will receive future laboratory results here." + ]); + } + } + // for sample source + if ($sampleSourceId) + { + // Check if patient already registered + $exist_sample_source = DB::table('sample_source_telegram') + ->where('sample_source_id', $sampleSourceId) + ->exists(); + + if (!$exist_sample_source) { + DB::table('sample_source_telegram')->updateOrInsert( + ['sample_source_id' => $sampleSourceId], + ['chat_id' => $chatId] + ); + + $telegram->sendMessage([ + 'chat_id' => $chatId, + 'text' => "✅ Thank you for joining our bot. You will receive future laboratory results here." + ]); + } + } + } + } + + return response()->json(['status' => 'ok'], 200); + } + catch(\Exception $e){ + + } +} + +} + + diff --git a/app/Http/Controllers/TestController.php b/app/Http/Controllers/TestController.php new file mode 100644 index 0000000..208b092 --- /dev/null +++ b/app/Http/Controllers/TestController.php @@ -0,0 +1,487 @@ +model = $testSample; + $this->departmentModel = $departmentModel; + $this->sampleTypeModel = $sampleTypeModel; + $this->patientTypeModel = $patientTypeModel; + $this->testModel = $testModel; + $this->organismModel = $organismModel; + $this->antibioticModel = $antibioticModel; + $this->testSampleOrganismModel = $testSampleOrganismModel; + $this->testNormalValueModel = $testNormalValueModel; + $this->physicianModel = $physicianModel; + $this->physicianCommissionModel = $physicianCommissionModel; + $this->labModel = $labModel; + $this->testCategoryModel = new TestCategory(); + + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + return null; + } + + public function save(Request $request){ + try{ + $validator = \Validator::make($request->all(), ['name_en' => 'required']); + if ($validator->fails()){ return response()->json(['errors'=>$validator->errors()->all()]);} + $test = $this->testModel::query()->create([ + 'name_en' => $request->name_en, + 'lab_id' => $this->baseLabId, + ]); + return response()->json(['success'=> true , 'data' => [$test]]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + public function update(Request $request){ + try{ + $validator = \Validator::make($request->all(), ['uid' => 'required', 'name_en' => 'required']); + if ($validator->fails()){ return response()->json(['errors'=>$validator->errors()->all()]);} + $test = $this->testModel::query()->where(['id' => $request->uid])->first(); + $test->update(array('name_en' => $request->name_en)); + return response()->json(['success'=> true , 'data' => [$test]]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + public function get(Request $request){ + try{ + $test = Test::query()->find($request->uid); + return response()->json(['data' => $test]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + public function delete(Request $request){ + $status = $this->testModel::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['status'=> $status , 'msg' => 'Delete successful']); + } + + public function restore(Request $request){ + $status = $this->testModel::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + return response()->json(['status'=> $status , 'msg' => 'Activate successful']); + } + + /** TEST SAMPLES + * @param Request $request + * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View + */ + + public function testSamples(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_test_sample'])) return redirect(url('my-profile')); + $physicians = $this->physicianModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get(); + $department = $this->departmentModel::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->orderBy('weight','asc')->get(); + $patientTypes = $this->patientTypeModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE)->get(); + $testItems = $this->testModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE)->get(); + $testSampleTable = $this->model::getTableNameByScheme(); + $sampleTypeTable = $this->sampleTypeModel::getTableNameByScheme(); + $departmentTable = $this->departmentModel::getTableNameByScheme(); + $testTable = $this->testModel::getTableNameByScheme(); + $testSamples = $this->model::query()->select([ + $departmentTable.'.name_en as department_name', + $sampleTypeTable.'.name_en as sample_type_name', + $testTable.'.name_en as test_name', + $testSampleTable.'.*' + ]) + ->join($sampleTypeTable, $testSampleTable.'.sample_type_id', '=', $sampleTypeTable.'.id') + ->join($departmentTable, $sampleTypeTable.'.department_id', '=', $departmentTable.'.id') + ->join($testTable, $testSampleTable.'.test_id', '=', $testTable.'.id') + ->where($testSampleTable.'.'.BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->where($testSampleTable.'.lab_id', $this->baseLabId) + ->where($sampleTypeTable.'.'.BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->when(!empty($request->sample_type), function ($query) use($sampleTypeTable, $request){ + $query->where($sampleTypeTable.'.id', $request->sample_type); + })->when(!empty($request->department), function ($query) use($departmentTable, $request) { + $query->where($departmentTable.'.id', $request->department); + })->when(!empty($request->kword), function ($query) use($testTable, $testSampleTable, $request){ + $query->whereRaw( $testTable.".name_en like '%".addslashes($request->kword)."%'") + ->orWhereRaw($testSampleTable.".code like '%".addslashes($request->kword)."%'"); + })->when(Auth::id()==1, function ($query) use ($testSampleTable){ + $query->whereIn($testSampleTable.'.'.BaseModel::RECORD_STATUS_FIELD , [RecordStatusEnum::DELETE, RecordStatusEnum::ACTIVE]); + })->orderBy($departmentTable.'.weight') + ->orderBy($sampleTypeTable.'.weight') + ->orderBy($testSampleTable.'.weight') + ->paginate(20); + return view('test', ['testSamples' => $testSamples, 'departments' => $department, + 'testItems' => $testItems, 'patientTypes' => $patientTypes, 'labSetting' => (object) $this->base, + 'physicians' => $physicians + ]); + } + + public function saveTestSample(TestSampleCreateRequest $request){ + set_time_limit(6000); + ini_set('memory_limit', '10240M'); + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_test_sample'])) return false; + $testSample = $this->model::query()->create([ + 'sample_type_id' => $request->sample_type_id, + 'test_id' => $request->test_id, + 'group_result' => $request->group_result, + 'category' => NULL, + 'unit_sign' => $request->unit_sign, + 'code' => $request->code, + 'heading_id' => $request->heading_id, + 'usd_price' => $request->usd_price, + 'weight' => $request->weight, + 'field_type' => $request->filed_type_id, + 'formula' => $request->formula, + 'format' => $request->format_value, + 'description' => $request->description, + 'lab_id' => $this->baseLabId, + 'is_bold' => $request->is_bold, + 'autocomplete_bind' => $request->autocomplete_bind + ]); + // reference range + if(in_array($request->filed_type_id,[1,4,6])){ + $data = collect($request->patient_type_ids); + $items = $data->map(function ($row, $key) use ($request, $testSample) { + if(!empty($request->patient_type_ids[$key]['value'])) { + $testNormalValue = $this->testNormalValueModel::query()->create([ + 'test_sample_id' => $testSample->id, + 'patient_type_id' => $request->patient_type_ids[$key]['value'], + 'sign' => $request->signs[$key]['value'], + 'minimum' => is_numeric($request->min_values[$key]['value']) ? $request->min_values[$key]['value'] : null, + 'maximum' => is_numeric($request->max_values[$key]['value']) ? $request->max_values[$key]['value'] : null, + ]); + } + return []; + }); + } + // organism and antibiotics + if(in_array($request->filed_type_id,[2,3]) ){ + $organismsCollection = collect($request->organisms); + foreach ($organismsCollection as $org){ + $this->testSampleOrganismModel::query()->create([ + 'test_sample_id' => $testSample->id, + 'is_default' => $org['is_default'], + 'organism_id' => $org['id'], + 'lab_id' => $this->baseLabId + ]); + } + } + DB::commit(); + return response()->json(['success' => true, 'message' => __('test_sample.create_success'), 'data' => [$testSample]]); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success'=> false, 'message' => __('test_sample.create_fail'), 'errors' => [$e->getMessage()]]); + } + } + + public function getTestSample(Request $request){ + $testSample = $this->model::with([ + 'sample', + 'organisms.organism', + 'testValues' + ])->find($request->uid); + return response()->json(['success'=> true , 'message' => __('test_sample.get_success'), 'data' => new TestSampleResource($testSample)]); + } + + public function updateTestSample(TestSampleUpdateRequest $request){ + + set_time_limit(6000); + ini_set('memory_limit', '10240M'); + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_test_sample'])) return false; + $testSample = $this->model::query()->where('id',$request->uid)->first(); + $testSample->update([ + 'sample_type_id' => $request->sample_type_id, + 'test_id' => $request->test_id, + 'group_result' => $request->group_result, + 'category' => @$request->category, + 'unit_sign' => $request->unit_sign, + 'code' => $request->code, + 'heading_id' => $request->heading_id, + 'usd_price' => $request->usd_price, + 'weight' => $request->weight, + 'field_type' => $request->filed_type_id, + 'formula' => $request->formula, + 'format' => $request->format_value, + 'description' => $request->description, + 'is_bold' => $request->is_bold, + 'autocomplete_bind' => $request->autocomplete_bind + ]); + + $this->testNormalValueModel::query()->where('test_sample_id', $testSample->id)->update([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE]); + $this->testSampleOrganismModel::query()->where('test_sample_id', $testSample->id)->update([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE]); + + // reference range + if(in_array($request->filed_type_id,[1,4,6])){ + $data = collect($request->patient_type_ids); + $items = $data->map(function ($row, $key) use ($request, $testSample) { + if(!empty($request->patient_type_ids[$key]['value'])) { + $testNormalValue = $this->testNormalValueModel::query()->create([ + 'test_sample_id' => $testSample->id, + 'patient_type_id' => $request->patient_type_ids[$key]['value'], + 'sign' => $request->signs[$key]['value'], + 'minimum' => is_numeric($request->min_values[$key]['value']) ? $request->min_values[$key]['value'] : null, + 'maximum' => is_numeric($request->max_values[$key]['value']) ? $request->max_values[$key]['value'] : null, + ]); + } + return []; + }); + } + // organism and antibiotics + if(in_array($request->filed_type_id,[2,3]) ){ + $organismsCollection = collect($request->organisms); + $organisms = $organismsCollection->pluck('id')->unique()->toArray(); + $this->testSampleOrganismModel::query()->where(['test_sample_id' => $testSample->id]) + ->whereNotIn('organism_id', $organisms) + ->update([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE]); + + foreach ($organismsCollection as $org){ + $testSampleOrganism = $this->testSampleOrganismModel::query()->create([ + 'test_sample_id' => $testSample->id, + 'is_default' => $org['is_default'], + 'organism_id' => $org['id'], + 'lab_id' => $this->baseLabId + ]); + } + + } + DB::commit(); + return response()->json(['success' => true, 'message' => __('test_sample.update_success'), 'data' => [$testSample]]); + } catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success' => false, 'message' => __('test_sample.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function editTestSampleOrder(Request $request){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_test_sample'])) return false; + $validator = \Validator::make($request->all(), ['id' => 'required', 'order_number' => 'required']); + if ($validator->fails()){ return response()->json(['errors'=>$validator->errors()->all()]);} + + $testSample = $this->model::query()->where([ + 'id' => $request->id, + 'lab_id' => $this->baseLabId + ])->first(); + $testSample->update(['weight' => $request->order_number]); + $batchUpdates = $this->model::query()->where([ + 'sample_type_id' => $testSample->sample_type_id, + 'lab_id' => $this->baseLabId, + ])->where('weight','>=', $request->order_number)->where('id','<>', $request->id)->update([ + 'weight' => DB::raw('weight + 1') + ]); + DB::commit(); + return redirect()->back(); + } catch (\Exception $e){ + DB::rollBack(); + return redirect()->back(); + } + } + + public function deleteTestSample(Request $request){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_test_sample'])) return false; + $this->model::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + $this->testNormalValueModel::query()->where('test_sample_id', $request->uid)->update([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE]); + $this->testSampleOrganismModel::query()->where('test_sample_id', $request->uid)->update([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE]); + DB::commit(); + return response()->json(['success' => true, 'message' => __('test_sample.delete_success')]); + } + catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success' => false, 'message' => __('test_sample.delete_fail')]); + } + + } + + public function restoreTestSample(Request $request){ + DB::beginTransaction(); + try{ + $this->model::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE)); + $this->testNormalValueModel::query()->where('test_sample_id', $request->uid)->update([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]); + $this->testSampleOrganismModel::query()->where('test_sample_id', $request->uid)->update([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]); + DB::commit(); + return response()->json(['success' => true, 'message' => __('test_sample.restore_success')]); + } + catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success' => false, 'message' => __('test_sample.restore_fail')]); + } + } + + public function storePhysicianCommission(Request $request){ + DB::beginTransaction(); + try{ + foreach ($request->physician as $k=>$val){ + $this->physicianCommissionModel::query()->updateOrCreate([ + 'physician_id' => $request->physician[$k], + 'test_sample_id' => $request->test_sample_id + ],[ + 'physician_id' => $request->physician[$k], + 'test_sample_id' => $request->test_sample_id, + 'commission_rate' => $request->commission_rate[$k], + 'partner_price' => $request->pc_price[$k], + 'commission_type' => $request->commission_type[$k], + 'lab_id' => $this->baseLabId, + BaseModel::CREATED_AT_FIELD => date('Y-m-d H:i:s'), + BaseModel::CREATED_BY_FIELD => Auth::id(), + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE + ]); + } + DB::commit(); + return redirect()->back(); + } + catch (\Exception $e){ + DB::rollBack(); + return redirect()->back(); + } + } + + public function setCommissionToAllTest(Request $request){ + DB::beginTransaction(); + try{ + $testSamples = $this->model::query()->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get(); + foreach ($testSamples as $testSample){ + $this->physicianCommissionModel::query()->updateOrCreate([ + 'physician_id' => $request->physician_id, + 'test_sample_id' => $testSample->id + ],[ + 'physician_id' => $request->physician_id, + 'test_sample_id' => $testSample->id, + 'commission_rate' => $request->commission_rate, + 'commission_type' => $request->commission_type, + 'lab_id' => $this->baseLabId, + BaseModel::CREATED_AT_FIELD => date('Y-m-d H:i:s'), + BaseModel::CREATED_BY_FIELD => Auth::id(), + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE + ]); + } + DB::commit(); + return response()->json(['success'=> true , 'message' => __('test_sample.add_commission_success')]); + } + catch (\Exception $e){ + DB::rollBack(); + return response()->json(['success'=> false , 'message' => __('test_sample.add_commission_fail'), 'errors' => $e->getMessage()]); + } + } + + + /*public function cloneTestSampleProperties(Request $request){ + try { + + $test_sample_id = $request->test_sample_id; + $target_lab_id = $request->target_lab_id; + $target_sample_type_id = $request->target_sample_type_id; + $target_test_sample_id = $request->target_test_sample_id; + + $testSamples = $this->model::with(['testValues','organisms','organisms.antibiotics'])->where('id', $test_sample_id)->get(); + + $this->testNormalValueModel::query()->where(['test_sample_id' => $target_test_sample_id])->update([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE]); + $this->testSampleOrganismModel::query()->where(['test_sample_id' => $target_test_sample_id, 'lab_id' => $target_lab_id])->update([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE]); + + foreach ($testSamples as $testSample) { + $testValues = isset($testSample->testValues) ? $testSample->testValues : []; + + foreach ($testValues as $testValue) { + $testValueData = [ + 'test_sample_id' => $target_test_sample_id, + 'patient_type_id' => $testValue->patient_type_id, + 'sign' => $testValue->sign, + 'minimum' => $testValue->minimum, + 'maximum' => $testValue->maximum, + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => 1 + ]; + $insertTestValue = $this->testNormalValueModel::query()->create($testValueData); + } + $testOrganisms = isset($testSample->organisms) ? $testSample->organisms : []; + foreach ($testOrganisms as $testOrganism) { + $testOrganismData = [ + 'test_sample_id' => $target_test_sample_id, + 'organism_id' => $testOrganism->organism_id, + 'lab_id' => $target_lab_id, + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => 1 + ]; + $insertTestSampleOrganism = $this->testSampleOrganismModel::query()->create($testOrganismData); + $antibiotics = isset($testOrganism->antibiotics) ? $testOrganism->antibiotics : []; + foreach ($antibiotics as $antibiotic) { + $testOrganismAntibioticData = [ + 'test_sample_organism_id' => $insertTestSampleOrganism->id, + 'antibiotic_id' => $antibiotic->antibiotic_id, + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => 1 + ]; + $insertTestOrganismAntibiotic = $this->testSampleOrganismAntibioticModel::query()->create($testOrganismAntibioticData); + } + } + } + } + catch (\Exception $e){ + Log::error($e->getMessage()); + } + return redirect()->back(); + }*/ + + +} diff --git a/app/Http/Controllers/TestGroupController.php b/app/Http/Controllers/TestGroupController.php new file mode 100644 index 0000000..0f0deae --- /dev/null +++ b/app/Http/Controllers/TestGroupController.php @@ -0,0 +1,81 @@ +model = $model; + $this->testGroupDetailModel = $testGroupDetailModel; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + return null; + } + + public function save(Request $request){ + DB::beginTransaction(); + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_test_group'])) return false; + $validator = \Validator::make($request->all(), ['name_en' => 'required','test_sample_ids' => 'required']); + if ($validator->fails()){ return response()->json(['errors'=>$validator->errors()->all()]);} + $testGroup = $this->model::query()->create(['group_name' => $request->name_en, 'lab_id' => $this->baseLabId]); + foreach ($request->test_sample_ids as $v){ + $this->testGroupDetailModel::query()->create([ + 'test_group_id' => $testGroup->id, + 'test_sample_id' => $v, + 'lab_id' => $this->baseLabId + ]); + } + DB::commit(); + return response()->json(['success'=> true , 'data' => [$testGroup]]); + } catch (\Exception $e) + { + DB::rollBack(); + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + public function get($id){ + try{ + $testGroupItems = $this->testGroupDetailModel::query()->where(['test_group_id' => $id, 'lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD=>RecordStatusEnum::ACTIVE])->get()->pluck('test_sample_id')->toArray(); + return response()->json(['success' => true, 'data' => $testGroupItems]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_test_group'])) return false; + $this->model::query()->where(['id' => $request->id, 'lab_id' => $this->baseLabId])->update([BaseModel::RECORD_STATUS_FIELD=>RecordStatusEnum::DELETE]); + return response()->json(['success' => true, 'message' => 'Test group successfully deleted']); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'message' => 'Failed while deleting test group. Please try again.', 'errors' => [$e->getMessage()]]); + } + } + + +} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php new file mode 100644 index 0000000..5966e5e --- /dev/null +++ b/app/Http/Controllers/UserController.php @@ -0,0 +1,321 @@ +userModel = $userModel; + $this->roleModel = $roleModel; + $this->userLabCover = $userLabCover; + $this->sampleSourceModel = $sampleSourceModel; + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + public function index(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_user_account'])) return redirect(url('my-profile')); + $this->labs = parent::getAccessAbleLabs(); + $recordStatusCondition = Auth::id()==1 ? [RecordStatusEnum::DELETE, RecordStatusEnum::ACTIVE] : [RecordStatusEnum::ACTIVE]; + $roles = $this->roleModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->when(Auth::user()->role_id != UtilEnum::ADMINISTRATOR_ROLE , function ($roles){ + $roles->whereNotIn('id', [UtilEnum::ADMINISTRATOR_ROLE]); + })->get(); + + $sample_sources = $this->sampleSourceModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->when(Auth::user()->role_id != UtilEnum::PHYSICIAN_ROLE && Auth::id()!=1 , function ($sampleSource){ + $sampleSource->where('lab_id', Session::get('base_lab_id')); + })->get(); + + $users = $this->userModel::with(['role','lab_covers'])->whereIn(BaseModel::RECORD_STATUS_FIELD, $recordStatusCondition) + ->when(Auth::id()!=1, function ($users){ + $users->whereNotIn('id', [UtilEnum::ADMINISTRATOR_USER]) + ->whereIn('id', $this->labs->pluck('userLabCovers')->flatten()->pluck('user_id')->toArray()); + })->when(!empty($request->kword), function($users) use ($request) { + $keyword = '%' . str_replace(' ', '', $request->kword) . '%'; + $users->where(function ($q) use ($keyword) { + $q->whereRaw("REPLACE(name,' ','') LIKE ?", [$keyword]) + ->orWhereRaw("REPLACE(email,' ','') LIKE ?", [$keyword]); + })->where('id', '!=', UtilEnum::ADMINISTRATOR_USER); + }) + ->orderBy(BaseModel::CREATED_AT,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('user_account', ['users' => $users, 'roles' => $roles, 'labs' => $this->labs, 'sample_sources' => $sample_sources]); + } + + public function labUsers(Request $request){ + if(!GlobalController::user_can(Auth::user()->role_id, ['view_user_account'])) return redirect(url('my-profile')); + $this->labs = parent::getAccessAbleLabs(); + $roles = $this->roleModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->whereNotIn('id', [UtilEnum::ADMINISTRATOR_ROLE])->get(); + $sample_sources = $this->sampleSourceModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->where('lab_id', Session::get('base_lab_id'))->get(); + + $users = $this->userModel::with(['role','lab_covers'])->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->whereIn('id', $this->labs->pluck('labUsers')->flatten()->pluck('user_id')->toArray()) + ->whereNotIn('role_id', [UtilEnum::ADMINISTRATOR_ROLE]) + ->when(!empty($request->kword), function($users) use ($request) { + $users->whereRaw("replace(name, ' ','') like '%".str_replace(" ","",$request->kword)."%'") + ->orWhereRaw("replace(email, ' ','') like '%".str_replace(" ","",$request->kword)."%'"); + })->orderBy(BaseModel::CREATED_AT,'desc')->paginate(config('labis.pagination.perpage', 10)); + return view('user_account', ['users' => $users, 'roles' => $roles, 'labs' => $this->labs, 'sample_sources' => $sample_sources]); + } + + public function save(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['create_user_account'])) return false; + $validator = \Validator::make($request->all(), [ + 'name' => 'required', + 'email' => 'required|email|unique:users', + 'password' => 'required', + 'role_id' => 'required', + 'sample_source_id' => 'nullable' + ]); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('user_account.create_fail'), 'errors' => $validator->errors()->all()]); + $data = array( + 'name' => $request->name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + 'is_manager' => ($request->role_id==3 ? 1: 0), + 'sample_source_id' => $request->sample_source_id, + 'role_id' => $request->role_id, + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => Auth::id(), + ); + $user = $this->userModel::query()->create($data); + Log::channel('account_creation')->info(array('action' => 'create', 'raw' => $request->all(), 'prepared' => $data)); + $requests = new Request(array('uid' => $user->id, 'lab_ids' => [Session::get('base_lab_id')])); + $this->assignLabs($requests); + return response()->json(['success' => true, 'message' => __('user_account.create_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('user_account.create_fail'), 'errors' => $e->getMessage()]); + } + } + + public function update(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_user_account'])) return false; + $validator = \Validator::make($request->all(), [ + 'name' => 'required', + 'email' => 'required|email|unique:users,email, ' . $request->uid . ',id', + 'password' => 'required', + 'role_id' => 'required' + ]); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('user_account.update_fail'), 'errors' => $validator->errors()->all()]); + $data = array( + 'name' => $request->name, + 'email' => $request->email, + 'role_id' => $request->role_id, + 'is_manager' => ($request->role_id==3 ? 1: 0), + 'sample_source_id' => $request->sample_source_id, + 'updated_at' => date('Y-m-d H:i:s'), + 'updated_by' => Auth::id() + ); + $this->userModel::query()->where('id', $request->uid)->update($data); + Log::channel('account_creation')->info(array('action' => 'update', 'raw' => $request->all(), 'prepared' => $data)); + return response()->json(['success' => true, 'message' => __('user_account.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('user_account.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function resetPassword(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['update_user_account'])) return false; + $validator = \Validator::make($request->all(), [ + 'uid' => 'required', + 'password' => 'required' + ]); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('user_account.update_fail'), 'errors' => $validator->errors()->all()]); + $data = array( + 'password' => Hash::make($request->password), + 'updated_at' => date('Y-m-d H:i:s'), + 'updated_by' => Auth::id() + ); + $this->userModel::query()->find($request->uid)->update($data); + return response()->json(['success' => true, 'message' => __('user_account.update_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('user_account.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function get(Request $request){ + try{ + $user = $this->userModel::with(['lab_covers'])->find($request->uid); + return response()->json(['success' => true, 'message' => __('user_account.get_success'), 'data' => $user]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('user_account.get_fail'), 'errors' => $e->getMessage()]); + } + } + + public function delete(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['delete_user_account'])) return false; + $this->userModel::query()->where('id', $request->uid)->update(array( BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE)); + return response()->json(['success' => true, 'message' => __('user_account.delete_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('user_account.delete_fail'), 'errors' => $e->getMessage()]); + } + } + + public function restore(Request $request){ + try{ + $this->userModel::query()->where('id', $request->uid)->update(array(BaseModel::RECORD_STATUS_FIELD=> RecordStatusEnum::ACTIVE)); + return response()->json(['success' => true, 'message' => __('user_account.restore_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('user_account.restore_fail'), 'errors' => $e->getMessage()]); + } + } + + public function assignLabs(Request $request){ + try{ + if(!GlobalController::user_can(Auth::user()->role_id, ['assign_lab'])) return false; + $validator = \Validator::make($request->all(), [ 'uid' => 'required']); + if ($validator->fails()) return response()->json(['success' => false, 'message' => __('user_account.assign_lab_fail'), 'errors'=>$validator->errors()->all()]); + $this->userLabCover::query()->where('user_id', $request->uid) + ->update(['end_date' => date('Y-m-d'), BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::DELETE, BaseModel::UPDATED_AT_FIELD => date('Y-m-d H:i:s'), BaseModel::UPDATED_BY_FIELD =>Auth::id()]); + $data = array(); + foreach ($request->lab_ids as $lab_id){ + $data[] = array( + 'user_id' => $request->uid, + 'lab_id' => $lab_id, + 'start_date' => date('Y-m-d'), + 'created_at' => date('Y-m-d H:i:s'), + 'created_by' => Auth::id() + ); + } + $this->userLabCover::query()->insert($data); + return response()->json(['success' => true, 'message' => __('user_account.assign_lab_success')]); + } catch (\Exception $e){ + return response()->json(['success' => false, 'message' => __('user_account.assign_lab_fail'), 'errors' => $e->getMessage()]); + } + + } + + public function uploadSignature(Request $request){ + try { + $image = $request->file('signature'); + $imageName = 'signature_'.Auth::id().date('YmdHis').'.' . $image->getClientOriginalExtension(); + $user = User::find(Auth::id()); + $user->update(array('signature' => $imageName)); + $image->move(public_path('storage/images/signature'), $imageName); + return back()->with(['success' => true, 'message' => __('singnature updated'), 'data' => 'signature']); + }catch (\Exception $e){ + Log::error($e); + return response()->json(['success'=> false , 'message' => __('user_account.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function removeSignature(Request $request){ + try { + $user = $this->userModel::query()->find(Auth::id()); + if(!empty($user->signature)) { + if (file_exists(public_path('storage/images/signature/' . $user->signature))) { + unlink(public_path('storage/images/signature/' . $user->signature)); + $user->signature = null; + } + } + $user->save(); + return response()->json(['success' => true, 'message' => __('user_account.update_success'), 'data' => $user]); + }catch (\Exception $e){ + return response()->json(['success'=> false , 'message' => __('user_account.update_fail'), 'errors' => $e->getMessage()]); + } + } + + public function changePassword(Request $request) + { + try { + + $request->validate([ + 'current_password' => 'required|string', + 'new_password' => 'required|confirmed|min:8|string' + ]); + + $auth = Auth::user(); + + // Check current password + if (!Hash::check($request->current_password, $auth->password)) { + // return response()->json([ + // 'success' => false, + // 'message' => __('user_account.invalid_current_password') + // ]); + return redirect()->back()->withErrors(['current_password' => __('user_account.invalid_current_password')]); + } + + // Check new password not same as old + if ($request->current_password === $request->new_password) { + return redirect()->back()->withErrors(['new_password' => __('user_account.new_password_same_old_password')]); + } + + // Update password + $user = User::where('id', $auth->id)->update([ + 'password' => Hash::make($request->new_password) + ]); + + Log::channel('account_creation')->info([ + 'action' => 'change-password', + 'user_id' => $auth->id + ]); + + // return response()->json([ + // 'success' => true, + // 'message' => __('user_account.change_password_success') + // //'data' => $user + // ]); + return redirect()->back()->with('success', __('user_account.change_password_success')); + + } catch (\Exception $e) { + + // return response()->json([ + // 'success' => false, + // 'message' => __('user_account.change_password_fail'), + // 'errors' => $e->getMessage() + // ]); + return redirect()->back()->withErrors(['error' => __('user_account.change_password_fail') . ': ' . $e->getMessage()]); + + } + } + + function my_profile() + { + $user = $this->userModel::query()->with(['role','lab_covers'])->find(Auth::id()); + //return response()->json(['success' => true, 'message' => __('user_account.get_success'), 'data' => $user]); + return view('my_profiles',[ + // 'labSettings' => (object) $this->base, + 'users' => $user + ]); + + } + + + + +} diff --git a/app/Http/Controllers/UtilController.php b/app/Http/Controllers/UtilController.php new file mode 100644 index 0000000..3b411a2 --- /dev/null +++ b/app/Http/Controllers/UtilController.php @@ -0,0 +1,913 @@ +organismModel = $organismModel; + $this->antibioticModel = $antibioticModel; + $this->sampleTypeModel = $sampleTypeModel; + $this->departmentModel = $departmentModel; + $this->rejectCommentModel = $rejectCommentModel; + $this->testSampleModel = $testSampleModel; + $this->sampleModel = $sampleModel; + $this->labUserModel = $labUserModel; + $this->patientTypeModel = $patientTypeModel; + + $this->testSampleOrganismModel = $testSampleOrganism; + + $this->baseLabId = Session::get('base_lab_id'); + $this->base = Session::get('base_lab'); + } + + function province($responseType = 'object') + { + $provinces = parent::province(); + return $responseType == 'object' ? $provinces : json_encode($provinces); // TODO: Change the autogenerated stub + } + + + + function district($responseType = 'object' ,$province_id = null) + { + $districts = parent::district($province_id); + return $responseType == 'object' ? $districts : response()->json($districts); // TODO: Change the autogenerated stub + } + + public function commune($responseType = 'object', $district_id = null) + { + $communes = parent::commune($district_id); + return $responseType == 'object' ? $communes : json_encode($communes); // TODO: Change the autogenerated stub + } + + public function village($responseType = 'object', $commune_id = null) + { + $villages = parent::village($commune_id); + return $responseType == 'object' ? $villages : json_encode($villages); // TODO: Change the autogenerated stub + } + + public function location() + { + return parent::location(); // TODO: Change the autogenerated stub + } + + public function generatePatientUuId($responseType = 'object'){ + try{ + $location = (object) $this->location(); + $uuid = Helpers::generateUuId($location->short_name); + return response()->json(['success'=> true , 'data' => array('uuid' => $uuid)]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + public function generateUuIdForManual($responseType, $manual_code){ + try{ + $location = (object) $this->location(); + $uuid = Helpers::generateUuIdForManual($location->short_name, $manual_code); + return response()->json(['success'=> true , 'data' => array('uuid' => $uuid)]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + public function getDepartment(){ + try{ + $department = $this->departmentModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId])->orderBy('weight','asc')->get(); + return response()->json(['success'=> true , 'data' => $department]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + public function getDepartmentByLabId($labId){ + try{ + $department = $this->departmentModel::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $labId])->orderBy('weight','asc')->get(); + return response()->json(['success'=> true , 'data' => $department]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + public function getSampleTypeByDepartment($departmentId=0){ + try{ + if($departmentId == 0) return response()->json(['success'=> true , 'data' => []]); + $sampleType = $this->sampleTypeModel::query()->where('record_status_id', RecordStatusEnum::ACTIVE)->where('department_id', $departmentId)->get(); + return response()->json(['success'=> true , 'data' => $sampleType]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + public function getAntibiotic(Request $request, $responseType = 'object') + { + $antibiotics = $this->antibioticModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->when(isset($request->name) && $request->name !='', function ($organisms) use($request) { + $organisms->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->name)."%'"); + })->orderBy('name_en', 'asc')->get(); + return $responseType == 'object' ? $antibiotics : json_encode($antibiotics); + } + + public function getOrganisms($responseType = 'object', Request $request) + { + $organisms = $this->organismModel::query()->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE) + ->when(isset($request->name) && $request->name !='', function ($organisms) use($request) { + $organisms->whereRaw("replace(name_en, ' ','') like '".str_replace(" ","",$request->name)."%'"); + })->orderBy('name_en', 'asc')->limit(40)->get(); + return $responseType == 'object' ? $organisms : json_encode($organisms); + } + + public function storeRejectComment(Request $request){ + try{ + $validator = \Validator::make($request->all(), ['name_en' => 'required']); + if ($validator->fails()) return response()->json(['errors'=>$validator->errors()->all()]); + $rejectComment = $this->rejectCommentModel::query()->create([ + 'sample_condition_id' => 3, + 'reject_comment' => $request->name_en, + 'lab_id' => $this->baseLabId + ]); + return response()->json(['success'=> true , 'data' => [$rejectComment]]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'errors' => [$e->getMessage()]]); + } + } + + function getTestItem(){ + try{ + $departments = $this->departmentModel::with(['samples','samples.testSamples.test','samples.testSamples.childTest']) + ->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + ->orderBy('weight', 'asc')->get(); + return response()->json(['success'=> true , 'data' => SampleTestResource::collection($departments)]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + function getLabUsers(){ + return $this->labUserModel::with('user')->where(['lab_id' => $this->baseLabId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get(); + } + + + function getTestItemBySampleId($sampleId, $previousId = 0){ + try{ + $data = $this->sampleModel::with(['entryBy','modifiedBy','sample_tests', 'physician', 'patient','sample_source'])->where(['id' => $sampleId, 'lab_id' => $this->baseLabId])->get()->first(); + $arrData = array(); + $arrData['result_comment'] = []; + $arrData['sample'] = array( + 'sample_number' => $data->sample_number, + 'requested_by' => $data->physician, + 'patient_name' => $data->patient->name_en, + 'patient_uuid' => $data->patient->patient_uuid, + 'sample_source' => $data->sample_source->name_en, + 'sample_id' => $data->id + ); + + $arrData['sample_users'] = array('creator' => $data->entryBy->name, 'modifier' => @$data->modifiedBy->name); + $arrData['result_users'] = []; + $arrData['performers'] = UserResource::collection($this->getLabUsers()->pluck('user')); + + $arrData['antibiotic_results'] = $this->getOrgAntibioticResult($sampleId); + + $resultItems = DB::select(' + SELECT + p.gender, + p.dob, + d.`id` AS department_id, + d.`name_en` AS department_name, + d.weight as dweight, + st.`id` AS sample_type_id, + st.weight as sweight, + st.`name_en` AS sample_type, + ts.`id` AS test_sample_id, + ts.`heading_id` AS parent_id, + ts.`field_type`, + ts.formula, + ts.format, + ts.`usd_price`, + ts.group_result, + ts.description, + t.`id` AS test_id, + t.`name_en` AS test_name, + ts.unit_sign AS unit_sign, + ifnull(tr.test_result,"") as test_result, + tr.is_show, + tr.performed_by, + tr.id as test_result_id, + pct.`commission_type`, + ifnull(pct.`commission_rate`, 0.00) as commission_rate, + ifnull(pct.`partner_price`, 0.00) as partner_price, + ts.weight, + tr.test_date, + tr.comment, + ifnull(prev_r.test_result,"") as prev_result, + ts.is_bold, + ts.autocomplete_bind, + ts.lab_id, + sd.sample_descr + FROM samples s + INNER JOIN patients p + ON p.id = s.patient_id AND p.lab_id = s.lab_id + INNER JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + INNER JOIN test_samples ts + ON ts.id = tr.`test_sample_id` + and ts.lab_id = tr.lab_id + INNER JOIN tests t + ON t.`id` = ts.`test_id` + INNER JOIN sample_types st + ON st.`id` = ts.`sample_type_id` + INNER JOIN departments d + ON d.`id` = st.`department_id` + LEFT JOIN `physician_commisssion` AS pct + ON pct.`test_sample_id` = ts.`id` + AND pct.`physician_id` = s.`physician_id` + + LEFT JOIN sample_details sd ON sd.sample_id = s.id AND sd.sample_type_id = st.id + + LEFT JOIN ( + SELECT + tr.`test_sample_id`, + tr.`test_result` + FROM samples s + INNER JOIN test_results tr + ON tr.`sample_id` = s.`id` + WHERE s.id = '.$previousId.' + AND s.`lab_id` = '.$this->baseLabId.' + AND tr.record_status_id = 1 + ) prev_r + ON prev_r.test_sample_id = tr.`test_sample_id` + + WHERE s.`id` = '.$sampleId.' + AND s.`lab_id`= '.$this->baseLabId.' + and ts.lab_id = '.$this->baseLabId.' + AND tr.`record_status_id` = '.BaseModel::RECORD_STATUS_ACTIVE.' + + ORDER BY + d.`weight`, + st.`weight`, + ts.`weight`'); + $departmentArray = array(); + + + + $sampleTypeIds = collect($resultItems)->pluck('sample_type_id')->unique()->values(); + + $allTestSampleIds = collect($resultItems)->pluck('test_sample_id')->unique()->toArray(); + + if(count($sampleTypeIds)>0) { + $refComment = collect($this->getRefCommentV2($sampleTypeIds)); + $testSampleIds = collect($resultItems)->whereIn('field_type', [2, 3])->pluck('test_sample_id')->unique()->toArray(); + if(count($testSampleIds)>0){ + $suggestedOrgResults = collect($this->getTestSampleOrganismV2($testSampleIds)); + } + $testResultIds = collect($resultItems)->whereIn('field_type', [2, 3])->pluck('test_result_id')->unique()->toArray(); + if(count($testResultIds)>0){ + $organismResults = collect($this->getOrganismResultV2($testResultIds)); + $previousOrganismResults = collect($this->getPreviousOrganismResult($previousId)); + } + $refCollection = collect($this->mapReferenceRangeV2($allTestSampleIds)); + } + + + + $discount_type = ((object) $this->location())->discount_type; + + foreach ($resultItems as $row){ + $departmentArray[$row->dweight]['department_id'] = $row->department_id; + $departmentArray[$row->dweight]['department_name'] = $row->department_name; + $departmentArray[$row->dweight]['samples'][$row->sweight]['sample_type_id'] = $row->sample_type_id; + $departmentArray[$row->dweight]['samples'][$row->sweight]['sample_type_name'] = $row->sample_type; + $departmentArray[$row->dweight]['samples'][$row->sweight]['sample_descr'] = (string)$row->sample_descr !=''? '('.$row->sample_descr.')' : ''; + + $departmentArray[$row->dweight]['samples'][$row->sweight]['comments'] = $refComment->where('sample_type_id', $row->sample_type_id)->values();// (object) $this->getRefComment($row->sample_type_id); + + $organismResult = []; + $suggestedOrgResult = []; + + $previousOrganismResult = []; + + if(in_array($row->field_type, [2,3])) { + $organismResult = $organismResults->where('test_result_id', $row->test_result_id)->values();// $this->getOrganismResult($row->test_result_id); + $suggestedOrgResult = $suggestedOrgResults->where('test_sample_id', $row->test_sample_id)->values();// $this->getTestSampleOrganism($row->test_sample_id); + $previousOrganismResult = $previousOrganismResults->where('test_sample_id', $row->test_sample_id)->values(); + } + + $refRanges =(object) $this->evaluateRefRanges( $refCollection->where('test_sample_id',$row->test_sample_id)->values()->toArray(), $row->gender, $row->dob); // (object) $this->mapReferenceRange($row->test_sample_id, $row->gender, $row->dob); + + + + $testItemArray = array( + 'id' => (string)$row->test_sample_id, + 'test_id' => $row->test_id, + 'test_name' => $row->test_name, + 'closed_parent_id' => (string) (int)$row->parent_id, + 'field_type' => (string) $row->field_type, + 'unit_sign' => (string) $row->unit_sign, + 'usd_price' => $row->usd_price, + 'min_ref_val' => isset($refRanges->minimum) ? $refRanges->minimum :'', + 'max_ref_val' => isset($refRanges->maximum) ? $refRanges->maximum: '', + 'org_ref_range' => $refRanges, + 'ref_range' =>(isset($refRanges->sign) && in_array($refRanges->sign,["0.00","0.0","0"]) && isset($refRanges->minimum) && $refRanges->minimum==0 && isset($refRanges->maximum) && $refRanges->maximum==0) ? $refRanges->minimum . ' - ' . $refRanges->maximum : ((isset($refRanges->minimum)) ? in_array($refRanges->sign, ['<','<=','Neg <', 'Neg<','≤']) ? $refRanges->sign.' '.$refRanges->maximum : (in_array($refRanges->sign, ['>','>=','≥']) ? $refRanges->sign. ' '. (($refRanges->minimum == 0)? $refRanges->maximum:$refRanges->minimum) : ((isset($refRanges->minimum)) ? ($refRanges->minimum==0 && $refRanges->maximum==0 ? '' : $refRanges->minimum) .' '. $refRanges->sign .' '. ($refRanges->maximum==0? '':$refRanges->maximum) : '')) : ''), + //'ref_range' =>(isset($refRanges->sign) && in_array($refRanges->sign,["0.00","0.0","0"]) && isset($refRanges->minimum) && $refRanges->minimum==0 && isset($refRanges->maximum) && $refRanges->maximum==0) ? $refRanges->minimum . ' - ' . $refRanges->maximum : ((isset($refRanges->minimum)) ? in_array($refRanges->sign, ['<','<=','Neg <', 'Neg<','≤']) ? $refRanges->sign.' '.$refRanges->maximum : (in_array($refRanges->sign, ['>','>=']) ? $refRanges->sign. ' '.$refRanges->minimum : ((isset($refRanges->minimum)) ? ($refRanges->minimum==0 && $refRanges->maximum==0 ? '' : $refRanges->minimum) .' '. $refRanges->sign .' '. ($refRanges->maximum==0? '':$refRanges->maximum) : '')) : ''), + //'ref_range' => ((isset($refRanges->minimum)) ? in_array($refRanges->sign, ['<','<=','Neg <', 'Neg<','≤']) ? $refRanges->sign.' '.$refRanges->maximum : (in_array($refRanges->sign, ['>','>=']) ? $refRanges->sign. ' '.$refRanges->minimum : ((isset($refRanges->minimum)) ? ($refRanges->minimum==0 && $refRanges->maximum==0 ? '' : $refRanges->minimum) .' '. $refRanges->sign .' '. ($refRanges->maximum==0? '':$refRanges->maximum) : '')) : ''), + 'test_result' => !is_null($row->format) && $row->format>=0 && is_numeric($row->test_result) ? number_format($row->test_result,$row->format,'.','') : $row->test_result, + 'prev_result' => (string)!is_null($row->format) && is_numeric($row->prev_result) ? number_format($row->prev_result,$row->format) : $row->prev_result, + 'sign' => isset($refRanges->sign) ? $refRanges->sign: '', + 'is_show' => $row->is_show, + 'performed_by' => $row->performed_by, + 'org_results' => $organismResult, + 'prev_org_results' => $previousOrganismResult, + 'org_suggested_results' => $suggestedOrgResult, + 'group_result' => (string) $row->group_result, + 'commission_type' => (!empty($row->commission_type) ? $row->commission_type : $discount_type), + 'commission_rate' => $row->commission_rate, + 'partner_price' => $row->partner_price, + 'description' => (string) nl2br($row->description), + 'formula' => (string) $row->formula, + 'order' => (int) $row->weight, + 'test_date' => (string) $row->test_date, + 'comment' => (string) nl2br($row->comment), + 'str_comment' => (string) $row->comment, + 'is_bold' => (int) $row->is_bold, + 'autocomplete_bind' => (int) $row->autocomplete_bind, + 'ts' => $row->test_result, + 'lab_id' => $row->lab_id, + 'format' => (int)$row->format + ); + $departmentArray[$row->dweight]['samples'][$row->sweight]['tests'][] = $testItemArray; + } + + + $arrData['sample_tests'] = $departmentArray; + return response()->json(['success'=> true , 'data' => $arrData]); + } catch (\Exception $e){ + Log::error($e); + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + function getRefCommentV2($sampleTypeIds){ + return Comment::query()->select('sample_type_id', 'comment_desc as name')->where( + [ + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, + 'lab_id' => $this->baseLabId + ])->whereIn('sample_type_id', $sampleTypeIds)->get()->toArray(); + } + + function getTestSampleOrganismV2($testSampleIds){ + $resultItems = DB::select(' + SELECT + ts.id as test_sample_id, + tsr.id AS test_organism_id, + o.id as organism_id, + o.`name_en` AS organism_name, + o.is_bold, + tsr.is_default + FROM `test_samples` AS ts + INNER JOIN `test_sample_organisms` tsr + ON tsr.test_sample_id = ts.id + INNER JOIN organisms o + ON o.id = tsr.`organism_id` + WHERE ts.`id` in('. implode(',',$testSampleIds) . ') + AND tsr.record_status_id = 1 + AND ts.record_status_id = 1 and tsr.is_default=1'); + return $resultItems; + } + + function getOrganismResultV2($testResultIds){ + $resultItems = DB::select(' + SELECT + ogr.test_result_id, + tsr.id AS test_organism_id, + ogr.organism_id, + ogr.quantity_id, + ogr.contaminant, + o.`name_en` AS organism_name, + o.is_bold, + qt.`quantity_name`, + ogr.id + FROM `organism_results` AS ogr + INNER JOIN test_results trs + ON trs.id = ogr.test_result_id and ogr.lab_id = trs.lab_id + INNER JOIN `test_sample_organisms` tsr + ON tsr.test_sample_id = trs.test_sample_id + AND tsr.`organism_id` = ogr.`organism_id` + INNER JOIN organisms o + ON o.id = ogr.`organism_id` + LEFT JOIN `quantities` qt + ON qt.id = ogr.`quantity_id` + WHERE ogr.`test_result_id` in('.implode(',', $testResultIds). ') + AND ogr.record_status_id = 1 + AND trs.record_status_id = 1 + AND tsr.record_status_id = 1'); + return $resultItems; + } + + function getPreviousOrganismResult($previousSampleId){ + $resultItems = DB::select(' + SELECT + trs.test_sample_id, + ogr.test_result_id, + tsr.id AS test_organism_id, + ogr.organism_id, + ogr.quantity_id, + ogr.contaminant, + o.`name_en` AS organism_name, + o.is_bold, + qt.`quantity_name`, + ogr.id + FROM `organism_results` AS ogr + INNER JOIN test_results trs + ON trs.id = ogr.test_result_id and ogr.lab_id = trs.lab_id + INNER JOIN samples s + ON s.id = trs.sample_id + INNER JOIN `test_sample_organisms` tsr + ON tsr.test_sample_id = trs.test_sample_id + AND tsr.`organism_id` = ogr.`organism_id` + INNER JOIN organisms o + ON o.id = ogr.`organism_id` + LEFT JOIN `quantities` qt + ON qt.id = ogr.`quantity_id` + WHERE s.id = '.$previousSampleId.' + AND s.`lab_id` = '.$this->baseLabId.' + AND ogr.record_status_id = 1 + AND trs.record_status_id = 1 + AND tsr.record_status_id = 1'); + return $resultItems; + } + + function getRefComment($sampleTypeId ){ + return Comment::query()->select('comment_desc as name')->where( + [ + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, + 'lab_id' => $this->baseLabId, + 'sample_type_id' => $sampleTypeId + ])->get(); + } + + function mapReferenceRange($testSampleId, $genderId, $patientDob){ + + $referenceRanges = DB::select(' + SELECT + (IF(pt.range_start=0, 1, pt.range_start) * pt.range_start_unit) + IF(pt.range_start_unit=\'>\', 1, 0) AS start_range_in_day, + (IF(pt.range_end=0, 1, pt.range_end) * pt.range_end_unit) + IF(pt.range_end_sign=\'<=\', 1, 0) AS end_range_in_day, + pt.gender, + pt.range_start, + pt.range_start_unit, + pt.range_start_sign, + pt.range_end, + pt.range_end_unit, + pt.range_end_sign, + tnv.test_sample_id, + tnv.sign, + ts.format, + tnv.`minimum` AS minimum, + tnv.`maximum` AS maximum + FROM test_normal_values tnv + INNER JOIN patient_types pt + ON pt.id = tnv.patient_type_id + INNER JOIN test_samples ts + ON ts.id = tnv.test_sample_id + WHERE tnv.record_status_id = 1 + AND test_sample_id = '.$testSampleId.' + '); + + $now = time(); // or your date as well + $your_date = strtotime($patientDob); + $patientAgeInDay = round(($now - $your_date)/ (60 * 60 * 24)); + $referenceRangeArray = array(); + foreach ($referenceRanges as $referenceRange){ + if((int)$patientAgeInDay >= (int)$referenceRange->start_range_in_day && (int)$patientAgeInDay <= (int)$referenceRange->end_range_in_day){ + // Log::info($patientAgeInDay . ' - '.$genderId); + if($referenceRange->gender == $genderId){ + // Log::info('geneder=gender'); + $referenceRangeArray = array( + 'sign' => $referenceRange->sign, + 'minimum' => !is_null($referenceRange->format) ? number_format($referenceRange->minimum,$referenceRange->format) : (fmod($referenceRange->minimum,1) == 0 ? number_format($referenceRange->minimum,0):number_format($referenceRange->minimum,2)), + 'maximum' => !is_null($referenceRange->format) ? number_format($referenceRange->maximum,$referenceRange->format) : (fmod($referenceRange->maximum,1) == 0 ? number_format($referenceRange->maximum,0):number_format($referenceRange->maximum,2)), + ); break; + } + else{ + if($referenceRange->gender==3) { + $referenceRangeArray = array( + 'sign' => $referenceRange->sign, + 'minimum' => !is_null($referenceRange->format) ? number_format($referenceRange->minimum,$referenceRange->format) : (fmod($referenceRange->minimum,1) == 0 ? number_format($referenceRange->minimum,0):number_format($referenceRange->minimum,2)), + 'maximum' => !is_null($referenceRange->format) ? number_format($referenceRange->maximum,$referenceRange->format) : (fmod($referenceRange->maximum,1) == 0 ? number_format($referenceRange->maximum,0):number_format($referenceRange->maximum,2)), + ); break; + } + // } + } + } + } + return $referenceRangeArray; + } + + function getTestSampleOrganism($testSampleId){ + $resultItems = DB::select(' + SELECT + ts.id as test_sample_id, + tsr.id AS test_organism_id, + o.id as organism_id, + o.`name_en` AS organism_name, + o.is_bold, + tsr.is_default + FROM `test_samples` AS ts + INNER JOIN `test_sample_organisms` tsr + ON tsr.test_sample_id = ts.id + INNER JOIN organisms o + ON o.id = tsr.`organism_id` + WHERE ts.`id` = '.$testSampleId. ' + AND tsr.record_status_id = 1 + AND ts.record_status_id = 1'); + return $resultItems; + } + + function getOrganismResult($testResultId){ + $resultItems = DB::select(' + SELECT + ogr.test_result_id, + tsr.id AS test_organism_id, + ogr.organism_id, + ogr.quantity_id, + ogr.contaminant, + o.`name_en` AS organism_name, + o.is_bold, + qt.`quantity_name`, + ogr.id + FROM `organism_results` AS ogr + INNER JOIN test_results trs + ON trs.id = ogr.test_result_id and ogr.lab_id = trs.lab_id + INNER JOIN `test_sample_organisms` tsr + ON tsr.test_sample_id = trs.test_sample_id + AND tsr.`organism_id` = ogr.`organism_id` + INNER JOIN organisms o + ON o.id = ogr.`organism_id` + LEFT JOIN `quantities` qt + ON qt.id = ogr.`quantity_id` + WHERE ogr.`test_result_id` = '.$testResultId. ' + AND ogr.record_status_id = 1 + AND trs.record_status_id = 1 + AND tsr.record_status_id = 1'); + return $resultItems; + } + + function getOrgAntibioticResult($sampleId){ + $resultItems = DB::select(' + SELECT + ogr.test_result_id, + tsr.id AS test_organism_id, + ogr.organism_id, + agr.antibiotic_id, + agr.disk_diffusion, + agr.mic, + agr.sensitive, + agr.is_hide, + att.name_en + FROM `organism_results` AS ogr + INNER JOIN `antibiogram_results` agr + ON agr.`organism_result_id` = ogr.`id` + INNER JOIN `antibiotics` att + ON att.id = agr.antibiotic_id + INNER JOIN test_results trs + ON trs.id = ogr.test_result_id + INNER JOIN `test_sample_organisms` tsr + ON tsr.test_sample_id = trs.test_sample_id + AND tsr.`organism_id` = ogr.`organism_id` + WHERE trs.`sample_id` = '.$sampleId.' + AND agr.`record_status_id` = 1 + AND ogr.record_status_id = 1 + AND trs.record_status_id = 1 + AND tsr.record_status_id = 1 + order by agr.sensitive desc'); + return $resultItems; + } + + function getTestSampleItems($sampleTypeId = null, $fieldType=""){ + + try{ + $headingItems = $this->testSampleModel::with(['test']) + ->where([ + 'lab_id' => $this->baseLabId, + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE + ])->when(!empty($sampleTypeId), function ($headingItems) use($sampleTypeId) { + $headingItems->where('sample_type_id', $sampleTypeId); + })->when($fieldType !="", function ($query) use($fieldType){ + $query->where('field_type', $fieldType); + })->get(); + return response()->json(['success'=> true , 'data' => HeadingItemResource::collection($headingItems)]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + function getTestSampleBySampleType($sampleTypeId){ + try{ + $headingItems = $this->testSampleModel::with(['test']) + ->where([ + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, + 'sample_type_id' => $sampleTypeId + ])->get(); + return response()->json(['success'=> true , 'data' => HeadingItemResource::collection($headingItems)]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + public function getPatientTypes(){ + try{ + $patientTypes = $this->patientTypeModel::query()->where([ BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->get(); + return response()->json(['success'=> true , 'data' => $patientTypes]); + } catch (\Exception $e) + { + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + public function getPhysicianCommission($testSampleId){ + try { + $test = $this->testSampleModel::with(['test'])->find($testSampleId); + $testCommissions = DB::select(' + SELECT + p.id, + p.name_en, + ifnull(comm.commission_type, '.((object)$this->location())->discount_type.') as commission_type, + ifnull(comm.commission_rate, 0.00) as commission_rate, + ifnull(comm.partner_price, 0.00) as partner_price + FROM physicians p + LEFT JOIN( + SELECT + pc.`physician_id`, + pc.`commission_type`, + pc.`commission_rate`, + pc.partner_price, + pc.`test_sample_id` + FROM `physician_commisssion` pc + INNER JOIN physicians p + ON p.`id` = pc.`physician_id` + WHERE p.`lab_id` = '.$this->baseLabId.' + AND p.`record_status_id` = 1 + AND pc.test_sample_id = '.$testSampleId.' + AND pc.`record_status_id` = 1 + ) comm + ON comm.physician_id = p.`id` + WHERE p.`lab_id` = '.$this->baseLabId.' + AND p.`record_status_id` = 1 + '); + $data = array('test_name' => $test->test->name_en, 'physicians' => $testCommissions); + return response()->json(['success'=> true , 'data' => $data]); + } catch (\Exception $e){ + return response()->json(['success'=> false , 'errors' => $e->getMessage()]); + } + } + + + + + + + + + + /****** */ + + + + function mapReferenceRangeV2($testSampleIds) + { + try{ + $referenceRanges = DB::select(' + SELECT + ts.id as test_sample_id, + (IF(pt.range_start=0, 1, pt.range_start) * pt.range_start_unit) + IF(pt.range_start_unit=\'>\', 1, 0) AS start_range_in_day, + (IF(pt.range_end=0, 1, pt.range_end) * pt.range_end_unit) + IF(pt.range_end_sign=\'<=\', 1, 0) AS end_range_in_day, + pt.gender, + pt.range_start, + pt.range_start_unit, + pt.range_start_sign, + pt.range_end, + pt.range_end_unit, + pt.range_end_sign, + tnv.test_sample_id, + tnv.sign, + ts.format, + tnv.`minimum` AS minimum, + tnv.`maximum` AS maximum + FROM test_normal_values tnv + INNER JOIN patient_types pt + ON pt.id = tnv.patient_type_id + INNER JOIN test_samples ts + ON ts.id = tnv.test_sample_id + WHERE tnv.record_status_id = 1 + AND test_sample_id in('. implode(',',$testSampleIds) . ') + '); + return $referenceRanges; + } catch(\Exception $e) + { + dd($e); + return false; + } + } + + function evaluateRefRanges($referenceRanges, $genderId, $patientDob){ + $now = time(); + $your_date = strtotime($patientDob); + $patientAgeInDay = round(($now - $your_date)/ (60 * 60 * 24)); + $referenceRangeArray = array(); + foreach ($referenceRanges as $referenceRange){ + if((int)$patientAgeInDay >= (int)$referenceRange->start_range_in_day && (int)$patientAgeInDay <= (int)$referenceRange->end_range_in_day){ + if($referenceRange->gender == $genderId){ + $referenceRangeArray = array( + 'sign' => $referenceRange->sign, + 'minimum' => !is_null($referenceRange->format) ? number_format($referenceRange->minimum,$referenceRange->format) : (fmod($referenceRange->minimum,1) == 0 ? number_format($referenceRange->minimum,0):number_format($referenceRange->minimum,2)), + 'maximum' => !is_null($referenceRange->format) ? number_format($referenceRange->maximum,$referenceRange->format) : (fmod($referenceRange->maximum,1) == 0 ? number_format($referenceRange->maximum,0):number_format($referenceRange->maximum,2)), + ); break; + } + else{ + if($referenceRange->gender==3) { + $referenceRangeArray = array( + 'sign' => $referenceRange->sign, + 'minimum' => !is_null($referenceRange->format) ? number_format($referenceRange->minimum,$referenceRange->format) : (fmod($referenceRange->minimum,1) == 0 ? number_format($referenceRange->minimum,0):number_format($referenceRange->minimum,2)), + 'maximum' => !is_null($referenceRange->format) ? number_format($referenceRange->maximum,$referenceRange->format) : (fmod($referenceRange->maximum,1) == 0 ? number_format($referenceRange->maximum,0):number_format($referenceRange->maximum,2)), + ); break; + } + } + } + } + return $referenceRangeArray; + } + + + + public function getTestSampleOrganisms($testSampleId, $sampleId){ + + + $test = $this->testSampleModel::with('test')->find($testSampleId); + $defVal = count($this->getSelectedOrganismResult($sampleId, $testSampleId)) ==0 ? [-1] : $this->getSelectedOrganismResult($sampleId, $testSampleId); + $testSampleOrganisms = $this->testSampleOrganismModel::with(['organism']) + ->where(['test_sample_id' => $testSampleId, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId]) + ->limit(10)->get()->map(function ($data) use ($defVal) { + $data['selected'] = in_array($data['id'], $defVal) ? 1: 0; + return $data; + })->toArray(); + + $qualities = Quantity::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->select(['id','quantity_name as name'])->get()->toArray(); + $antibiotics = collect(Antibiotic::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->select(['id','name_en'])->get()->toArray()); + $resultKeyed = collect($this->getOrgAntibioticResult($sampleId))->groupBy('organism_id'); + + $testSampleOrganisms = collect($testSampleOrganisms)->map(function ($item) use ($resultKeyed, $antibiotics) { + $match = $resultKeyed->get($item['organism_id']); + return [ + 'id' => $item['id'], + 'test_sample_id' => $item['test_sample_id'], + 'organism_id' => $item['organism_id'], + 'lab_id' => $item['lab_id'], + 'record_status_id' => $item['record_status_id'], + 'selected' => $item['selected'], + 'organism' => $item['organism'], + 'antibiotics' => collect($antibiotics)->map(function ($item_) use ($match) { + $match = $match?->groupBy('antibiotic_id')->get($item_['id'])?->first(); + return [ + 'id' => $item_['id'], + 'name_en' => $item_['name_en'], + 'antibiotic_item' => $item_, + 'antibiotic_result' => $match ? [ + 'sensitive' => $match?->sensitive, + 'mic' => $match?->mic, + 'disk_diffusion' => $match?->disk_diffusion, + 'is_hide' => $match?->is_hide, + 'organism_id' => $match?->organism_id, + 'test_organism_id' => $match?->test_organism_id, + 'test_result_id' => $match?->test_result_id + ] : null + ]; + }) + ]; + })->toArray(); + + return response()->json(['success'=> true , 'test' =>$test, 'data' => array_unique($testSampleOrganisms, SORT_REGULAR),'qualities' => $qualities]); + } + + + public function getTestSampleOrganismsByName(Request $request){ + $test = $this->testSampleModel::with('test')->find($request->test_sample_id); + $defVal = count($this->getSelectedOrganismResult($request->sample_id, $request->test_sample_id)) ==0 ? [-1] : $this->getSelectedOrganismResult($request->sample_id, $request->test_sample_id); + $selectedOrganisms = $this->testSampleOrganismModel::with(['organism','antibiotics.antibioticResult','antibiotics.antibioticItem']) + ->where(['test_sample_id' => $request->test_sample_id, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId]) + ->whereIn('id', $defVal)->get()->map(function ($data) { + $data['selected'] = 1; + return $data; + })->toArray(); + + $testSampleOrganisms = $this->testSampleOrganismModel::with(['organism','antibiotics.antibioticResult','antibiotics.antibioticItem']) + ->where(['test_sample_id' => $request->test_sample_id, BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => $this->baseLabId]) + ->when(!empty(trim($request->name)), function ($testSampleOrganisms) use($request){ + $testSampleOrganisms->whereIn('organism_id', $this->organismModel::query()->whereRaw("replace(name_en, ' ','') like '%".str_replace(" ","",$request->name)."%'")->pluck('id')->toArray()); + })->whereNotIn('id', $defVal) + ->limit(10)->get()->map(function ($data) { + $data['selected'] = 0; + return $data; + })->toArray(); + $qualities = Quantity::query()->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE])->select(['id','quantity_name as name'])->get()->toArray(); + return response()->json(['success'=> true , 'test' =>$test, 'data' => array_unique(array_merge($selectedOrganisms, $testSampleOrganisms), SORT_REGULAR), 'qualities' => $qualities, 'selected_org' => $this->getSelectedOrganismResultQty($request->sample_id, $request->test_sample_id)]); + } + + + function getSelectedOrganismResult($sampleId, $testSampleId){ + $resultItems = DB::select(' + SELECT + tsr.id AS test_organism_id + FROM `organism_results` AS ogr + INNER JOIN test_results trs + ON trs.id = ogr.test_result_id + INNER JOIN `test_sample_organisms` tsr + ON tsr.test_sample_id = trs.test_sample_id + AND tsr.`organism_id` = ogr.`organism_id` + INNER JOIN organisms o + ON o.id = ogr.`organism_id` + LEFT JOIN `quantities` qt + ON qt.id = ogr.`quantity_id` + WHERE trs.sample_id = '.$sampleId.' + and trs.test_sample_id ='.$testSampleId.' + AND ogr.record_status_id = 1 + AND trs.record_status_id = 1 + AND tsr.record_status_id = 1'); + $data = collect($resultItems)->pluck('test_organism_id')->toArray(); + return $data; + } + + function getSelectedOrganismResultQty($sampleId, $testSampleId){ + $resultItems = DB::select(' + SELECT + tsr.id AS test_organism_id, + ogr.quantity_id + FROM `organism_results` AS ogr + INNER JOIN test_results trs + ON trs.id = ogr.test_result_id + INNER JOIN `test_sample_organisms` tsr + ON tsr.test_sample_id = trs.test_sample_id + AND tsr.`organism_id` = ogr.`organism_id` + INNER JOIN organisms o + ON o.id = ogr.`organism_id` + LEFT JOIN `quantities` qt + ON qt.id = ogr.`quantity_id` + WHERE trs.sample_id = '.$sampleId.' + and trs.test_sample_id ='.$testSampleId.' + AND ogr.record_status_id = 1 + AND trs.record_status_id = 1 + AND tsr.record_status_id = 1'); + $data = collect($resultItems)->toArray(); + return $data; + } + + +} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..704089a --- /dev/null +++ b/app/Http/Middleware/Authenticate.php @@ -0,0 +1,21 @@ +expectsJson()) { + return route('login'); + } + } +} diff --git a/app/Http/Middleware/Cors.php b/app/Http/Middleware/Cors.php new file mode 100644 index 0000000..4e6875f --- /dev/null +++ b/app/Http/Middleware/Cors.php @@ -0,0 +1,31 @@ +header('Access-Control-Allow-Origin', '*') + ->header('Access-Control-Allow-Methods', 'OPTIONS, GET, POST, PUT, DELETE') + ->header('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, X-Token-Auth, Authorization');*/ + + $response = $next($request); + + $response->headers->set('Access-Control-Allow-Origin' , '*'); + $response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE'); + $response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application'); + + return $response; + } +} \ No newline at end of file diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 0000000..033136a --- /dev/null +++ b/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ +check()) { + return redirect(RouteServiceProvider::HOME); + } + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/SetLocale.php b/app/Http/Middleware/SetLocale.php new file mode 100644 index 0000000..8e54cd9 --- /dev/null +++ b/app/Http/Middleware/SetLocale.php @@ -0,0 +1,24 @@ +has('locale')) { + App::setLocale(session('locale')); + } + return $next($request); + } +} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000..5a50e7b --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,18 @@ +allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php new file mode 100644 index 0000000..14befce --- /dev/null +++ b/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,23 @@ +session()->exists('base_lab_id')) { + return redirect('/base'); + } + } catch (\Exception $e){ + + Log::error($e); + } + return $next($request); + } + +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 0000000..c0e7bb3 --- /dev/null +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,19 @@ + ['required', 'string', 'email'], + 'password' => ['required', 'string'], + ]; + } + + /** + * Attempt to authenticate the request's credentials. + * + * @return void + * + * @throws \Illuminate\Validation\ValidationException + */ + public function authenticate() + { + $this->ensureIsNotRateLimited(); + if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) { + RateLimiter::hit($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => trans('auth.failed'), + ]); + } + + RateLimiter::clear($this->throttleKey()); + } + + /** + * Ensure the login request is not rate limited. + * + * @return void + * + * @throws \Illuminate\Validation\ValidationException + */ + public function ensureIsNotRateLimited() + { + if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { + return; + } + + event(new Lockout($this)); + + $seconds = RateLimiter::availableIn($this->throttleKey()); + + throw ValidationException::withMessages([ + 'email' => trans('auth.throttle', [ + 'seconds' => $seconds, + 'minutes' => ceil($seconds / 60), + ]), + ]); + } + + /** + * Get the rate limiting throttle key for the request. + * + * @return string + */ + public function throttleKey() + { + return Str::lower($this->input('email')).'|'.$this->ip(); + } +} diff --git a/app/Http/Requests/PatientCreateRequest.php b/app/Http/Requests/PatientCreateRequest.php new file mode 100644 index 0000000..4a3003a --- /dev/null +++ b/app/Http/Requests/PatientCreateRequest.php @@ -0,0 +1,43 @@ +request->all()); + return [ + 'name_en' => 'required|string', + 'patient_uuid' => 'nullable|string', + 'dob' => 'required|date', + 'gender' => 'required|integer', + 'phone_number' => 'nullable', + 'khid_number' => 'nullable', + 'house_number' => 'nullable', + 'street_number' => 'nullable', + 'province_id' => 'nullable', + 'district_id' => 'nullable', + 'commune_id' => 'nullable', + 'village_id' => 'nullable' + ]; + } + +} diff --git a/app/Http/Requests/PatientTypeCreateRequest.php b/app/Http/Requests/PatientTypeCreateRequest.php new file mode 100644 index 0000000..563cf2c --- /dev/null +++ b/app/Http/Requests/PatientTypeCreateRequest.php @@ -0,0 +1,42 @@ + 'required', + 'gender' => 'required', + 'age_from' => 'required|min:0', + 'age_from_unit' => 'required|min:0', + 'age_to' => 'required|min:0', + 'age_to_unit' => 'required|min:0' + ]; + } + + public function messages() + { + return [ + ]; + } + +} diff --git a/app/Http/Requests/PatientUpdateRequest.php b/app/Http/Requests/PatientUpdateRequest.php new file mode 100644 index 0000000..12b676e --- /dev/null +++ b/app/Http/Requests/PatientUpdateRequest.php @@ -0,0 +1,43 @@ + 'required|integer|min:1', + 'name_en' => 'required|string', + 'patient_uuid' => 'nullable|string', + 'dob' => 'required', + 'gender' => 'required|integer', + 'phone_number' => 'nullable', + 'khid_number' => 'nullable', + 'house_number' => 'nullable', + 'street_number' => 'nullable', + 'province_id' => 'nullable', + 'district_id' => 'nullable', + 'commune_id' => 'nullable', + 'village_id' => 'nullable' + ]; + } + +} diff --git a/app/Http/Requests/SampleCreateRequest.php b/app/Http/Requests/SampleCreateRequest.php new file mode 100644 index 0000000..a68cd76 --- /dev/null +++ b/app/Http/Requests/SampleCreateRequest.php @@ -0,0 +1,106 @@ + 'required|integer|min:1', + + /*'sample_number' => [ + + 'required', + + Rule::unique(Sample::getTableNameByConnection(), 'sample_number') + + ],*/ + + 'physician_id' => 'required|integer', + 'sample_source_id' => 'required|integer', + 'sample_condition' => 'nullable', + + 'reject_comment_id' => 'nullable', + + 'collected_date' => 'required|date', + + 'received_date' => 'required|date', + + 'admission_date' => 'required|date', + + 'diagnosis' => 'nullable', + + 'is_urgent' => 'required|integer' + + ]; + + } + + + + public function messages() + + { + + return [ + + //'reject_comment_id.required_if' => 'Reject reason is required.' + + ]; + + } + + + +} + diff --git a/app/Http/Requests/SampleDetailCreateRequest.php b/app/Http/Requests/SampleDetailCreateRequest.php new file mode 100644 index 0000000..970265c --- /dev/null +++ b/app/Http/Requests/SampleDetailCreateRequest.php @@ -0,0 +1,33 @@ + 'required|integer|min:1', + 'sample_tests' => 'required|array', + 'sample_details' => 'required|array' + ]; + } + +} diff --git a/app/Http/Requests/TestSampleCreateRequest.php b/app/Http/Requests/TestSampleCreateRequest.php new file mode 100644 index 0000000..330723d --- /dev/null +++ b/app/Http/Requests/TestSampleCreateRequest.php @@ -0,0 +1,41 @@ + 'required|integer|min:1', + 'sample_type_id' => 'required|integer|min:1', + 'group_result' => 'nullable|string', + 'unit_sign' => 'nullable|string', + 'heading_id' => 'nullable', + 'usd_price' => 'nullable', + 'code' => 'nullable', + 'wight' => 'nullable', + 'filed_type_id' => 'required|integer|min:0', + //'patient_type_ids' => 'required_if:filed_type_id,1', + //'organisms' => 'required_if:filed_type_id,2,3' + ]; + } + +} diff --git a/app/Http/Requests/UpdateRequests/SampleUpdateRequest.php b/app/Http/Requests/UpdateRequests/SampleUpdateRequest.php new file mode 100644 index 0000000..5364ff1 --- /dev/null +++ b/app/Http/Requests/UpdateRequests/SampleUpdateRequest.php @@ -0,0 +1,91 @@ + 'required|integer', + 'sample_source_id' => 'required|integer', + + //'sample_condition' => 'nullable', + + //'reject_comment_id' => 'nullable', + + 'collected_date' => 'required|date', + + 'received_date' => 'required|date', + + 'admission_date' => 'required|date', + + //'diagnosis' => 'nullable', + + //'is_urgent' => 'accepted' + + ]; + + } + + + + public function messages() + + { + + return [ + + ]; + + } + + + +} + diff --git a/app/Http/Requests/UpdateRequests/TestSampleUpdateRequest.php b/app/Http/Requests/UpdateRequests/TestSampleUpdateRequest.php new file mode 100644 index 0000000..eb6ef18 --- /dev/null +++ b/app/Http/Requests/UpdateRequests/TestSampleUpdateRequest.php @@ -0,0 +1,39 @@ + 'required', + 'test_id' => 'required|integer|min:1', + 'sample_type_id' => 'required|integer|min:1', + 'group_result' => 'nullable|string', + 'heading_id' => 'nullable', + 'unit_sign' => 'nullable|string', + 'usd_price' => 'nullable', + 'wight' => 'nullable', + 'filed_type_id' => 'required|integer|min:0', + ]; + } + +} diff --git a/app/Http/Resources/AntibioticResource.php b/app/Http/Resources/AntibioticResource.php new file mode 100644 index 0000000..3d1b88e --- /dev/null +++ b/app/Http/Resources/AntibioticResource.php @@ -0,0 +1,26 @@ + $this->id, + 'name_en' => $this->name_en, + 'weight' => $this->weight, + 'lab_id' => $this->lab_id, + // 'lab' => LaboratoryResource::collection($this->lab), + 'record_status_id' => $this->record_status_id + ]; + } +} diff --git a/app/Http/Resources/HeadingItemResource.php b/app/Http/Resources/HeadingItemResource.php new file mode 100644 index 0000000..70af078 --- /dev/null +++ b/app/Http/Resources/HeadingItemResource.php @@ -0,0 +1,27 @@ + $this->id, + 'sample_type_id' => $this->sample_type_id, + 'group_result' => $this->group_result, + 'id' => $this->test_id, + 'name_en' => $this->whenLoaded('test', function (){ + return $this->test->name_en; + }) + ]; + } +} diff --git a/app/Http/Resources/LaboratoryResource.php b/app/Http/Resources/LaboratoryResource.php new file mode 100644 index 0000000..9257323 --- /dev/null +++ b/app/Http/Resources/LaboratoryResource.php @@ -0,0 +1,24 @@ + $this->id, + 'name_en' => $this->name_en, + 'name_kh' => $this->name_kh, + 'record_status_id' => $this->record_status_id + ]; + } +} diff --git a/app/Http/Resources/OrganismResource.php b/app/Http/Resources/OrganismResource.php new file mode 100644 index 0000000..5983bde --- /dev/null +++ b/app/Http/Resources/OrganismResource.php @@ -0,0 +1,19 @@ + $this->id, + 'sample_number' => $this->sample_number, + 'patient' => $this->whenLoaded('patient', function (){ + return [ + 'id' => $this->patient->id, + 'uuid' => $this->patient->patient_uuid, + 'name' => $this->patient->name_en + ]; + }), + 'sample_source' => $this->whenLoaded('sample_source',function (){ + return [ + 'id' => $this->sample_source->id, + 'name' => $this->sample_source->name_en + ]; + }), + 'physician' => $this->whenLoaded('physician',function (){ + return [ + 'id' => $this->physician->id, + 'name' => $this->physician->name_en + ]; + }), + 'sample_details' => $this->whenLoaded('sample_details'), + 'sample_tests' => $this->whenLoaded('sample_tests') + ]; + } +} diff --git a/app/Http/Resources/SampleTestResource.php b/app/Http/Resources/SampleTestResource.php new file mode 100644 index 0000000..f3c55d9 --- /dev/null +++ b/app/Http/Resources/SampleTestResource.php @@ -0,0 +1,23 @@ + $this->id, + 'department_name' => $this->name_en, + 'samples' => SampleTypeResource::collection($this->whenLoaded('samples')), + ]; + } +} diff --git a/app/Http/Resources/SampleTypeResource.php b/app/Http/Resources/SampleTypeResource.php new file mode 100644 index 0000000..840034d --- /dev/null +++ b/app/Http/Resources/SampleTypeResource.php @@ -0,0 +1,31 @@ +whenLoaded('testSamples')); + + return [ + 'id' => $this->id, + 'department_id' => $this->department_id, + 'name_en' => $this->name_en, + 'tube' => (string)$this->tube, + 'descriptions' => json_decode($this->description), + 'bg_color' => $this->bg_color, + 'color' => $this->color, + 'testSamples' => TestResource::collection($this->whenLoaded('testSamples')), + ]; + } +} diff --git a/app/Http/Resources/TestResource.php b/app/Http/Resources/TestResource.php new file mode 100644 index 0000000..467418b --- /dev/null +++ b/app/Http/Resources/TestResource.php @@ -0,0 +1,31 @@ + (string) $this->id, + 'group_result' => $this->group_result, + 'closed_parent_id' => (string) ($this->heading_id > 0 ? $this->heading_id : 0), + 'code' => $this->code, + 'test_name' => $this->whenLoaded('test', function (){ + return $this->test->name_en; + }), + 'children' => null, + 'price' => (string)$this->usd_price, + 'test_heading' => $this->field_type== 0 ? 'test-heading' : '' + ]; + + } +} diff --git a/app/Http/Resources/TestSampleResource.php b/app/Http/Resources/TestSampleResource.php new file mode 100644 index 0000000..b3fdb9c --- /dev/null +++ b/app/Http/Resources/TestSampleResource.php @@ -0,0 +1,59 @@ + $this->id, + 'sample_type' => new SampleTypeResource($this->whenLoaded('sample')), + 'selected_organisms' => $this->whenLoaded('organisms', function() { + return $this->organisms->map(function ($item){ + return array( + 'id' => $item->id, + 'is_default' => $item->is_default, + 'organism_id' => $item->organism_id, + 'test_sample_id' => $item->test_sample_id, + 'organism' => $item->organism, + ); + }); + }), + 'test_values' => $this->whenLoaded('testValues', function (){ + return $this->testValues->map(function ($item){ + return array( + 'id' => $item->id, + 'patient_type_id' => $item->patient_type_id, + 'sign' => $item->sign, + 'maximum' => $item->maximum, + 'minimum' => $item->minimum + ); + }); + }), + 'test_id' => $this->test_id, + 'heading_id' => $this->heading_id, + 'usd_price' => $this->usd_price, + 'group_result' => $this->group_result, + 'category' => $this->category, + 'unit_sign' => $this->unit_sign, + 'weight' => $this->weight, + 'field_type' => $this->field_type, + 'format' => $this->format, + 'formula' => $this->formula, + 'description' => $this->description, + 'lab_id' => $this->lab_id, + 'code' => $this->code, + 'is_bold' => (int) $this->is_bold, + 'autocomplete_bind' => (int) $this->autocomplete_bind + ]; + } +} diff --git a/app/Http/Resources/UserResource.php b/app/Http/Resources/UserResource.php new file mode 100644 index 0000000..bc8a72c --- /dev/null +++ b/app/Http/Resources/UserResource.php @@ -0,0 +1,31 @@ + $this->id, + 'name' => $this->name, + 'email' => $this->email, + 'is_manager' => $this->is_manager, + 'role_id' => $this->role_id + ]; + } + catch(\Exception $e){ + return []; + //dd($e); + } + } +} diff --git a/app/Listeners/LogUserLogin.php b/app/Listeners/LogUserLogin.php new file mode 100644 index 0000000..48f9b80 --- /dev/null +++ b/app/Listeners/LogUserLogin.php @@ -0,0 +1,32 @@ +causedBy($event->user) + ->withProperties([ + 'ip' => request()->ip(), + 'browser' => request()->userAgent(), + 'url' => request()->fullUrl() + ]) + ->log('User Login'); + } +} diff --git a/app/Listeners/LogUserLogout.php b/app/Listeners/LogUserLogout.php new file mode 100644 index 0000000..5e073ae --- /dev/null +++ b/app/Listeners/LogUserLogout.php @@ -0,0 +1,31 @@ +causedBy($event->user) + ->withProperties([ + 'ip' => request()->ip(), + 'browser' => request()->userAgent() + ]) + ->log('User Logout'); + } +} diff --git a/app/Models/Antibiotic.php b/app/Models/Antibiotic.php new file mode 100644 index 0000000..b6f007e --- /dev/null +++ b/app/Models/Antibiotic.php @@ -0,0 +1,29 @@ +belongsTo('App\Models\Laboratory', 'lab_id','id'); + } + +} diff --git a/app/Models/AntibioticResult.php b/app/Models/AntibioticResult.php new file mode 100644 index 0000000..f0c4cd7 --- /dev/null +++ b/app/Models/AntibioticResult.php @@ -0,0 +1,25 @@ +belongsTo(Patient::class, 'patient_id', 'id'); + } + + public function doctor(){ + return $this->belongsTo(Physician::class, 'doctor_id','id'); + } + + +} diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php new file mode 100644 index 0000000..52f7440 --- /dev/null +++ b/app/Models/BaseModel.php @@ -0,0 +1,69 @@ +created_at = date('Y-m-d H:i:s'); + $model->created_by = Auth::id() ?? 1; + }); + + static::updating(function ($model){ + $model->updated_at = date('Y-m-d H:i:s'); + $model->updated_by = Auth::id() ?? 1; + }); + } + + public static function getTableNameByScheme() + { + $__table = (new static())->table; + $__database = (new static())->getConnection()->getDatabaseName(); + return $__database.'.'.$__table; + + } + + public static function getTableNameByConnection() + { + $__table = (new static())->table; + $__database = (new static())->getConnection()->getName(); + return $__database.'.'.$__table; + } + + public function createdByUser() + { + return $this->belongsTo(User::class, self::CREATED_BY_FIELD, 'id')->withDefault(function(){ + return new User(); + }); + } + + public function updatedByUser() + { + return $this->belongsTo(User::class, self::UPDATED_BY_FIELD, 'id')->withDefault(function(){ + return new User(); + });; + } + +} diff --git a/app/Models/Comment.php b/app/Models/Comment.php new file mode 100644 index 0000000..f7d97b0 --- /dev/null +++ b/app/Models/Comment.php @@ -0,0 +1,26 @@ +belongsTo('App\Models\SampleType','sample_type_id', 'id'); + } + +} diff --git a/app/Models/Commune.php b/app/Models/Commune.php new file mode 100644 index 0000000..feae220 --- /dev/null +++ b/app/Models/Commune.php @@ -0,0 +1,22 @@ +belongsTo('App\Models\Laboratory', 'lab_id','id'); + } + + public function samples(){ + return $this->hasMany(SampleType::class, 'department_id')->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE)->where('lab_id', Session::get('base_lab_id')) + ->orderBy('weight'); + } + +} diff --git a/app/Models/District.php b/app/Models/District.php new file mode 100644 index 0000000..3b7ce6d --- /dev/null +++ b/app/Models/District.php @@ -0,0 +1,21 @@ +belongsTo(Laboratory::class, 'lab_id','id'); + } + + public function sample(){ + return $this->belongsTo(Sample::class, 'sample_id','id'); + } + + public function invoiceDetail(){ + return $this->hasMany(InvoiceDetail::class, 'invoice_id', 'id')->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE); + } + + public function repayments(){ + return $this->hasMany(Repayment::class, 'invoice_id', 'id')->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE); + } + + public function creator() + { + return $this->belongsTo(User::class, 'created_by'); + } + + public function modifier() + { + return $this->belongsTo(User::class, 'updated_by'); + } + + +} diff --git a/app/Models/InvoiceDetail.php b/app/Models/InvoiceDetail.php new file mode 100644 index 0000000..45ef4bb --- /dev/null +++ b/app/Models/InvoiceDetail.php @@ -0,0 +1,33 @@ +belongsTo(TestSample::class, 'test_sample_id', 'id'); + } + + +} diff --git a/app/Models/Laboratory.php b/app/Models/Laboratory.php new file mode 100644 index 0000000..41eb576 --- /dev/null +++ b/app/Models/Laboratory.php @@ -0,0 +1,50 @@ +hasMany('App\Models\UserLabCover', 'lab_id','id')->where('record_status_id', RecordStatusEnum::ACTIVE); + } + + public function labUsers(){ + return $this->hasMany('App\Models\UserLabCover', 'lab_id','id')->where('record_status_id', RecordStatusEnum::ACTIVE)->where('lab_id', Session::get('base_lab_id')); + } + +} diff --git a/app/Models/Module.php b/app/Models/Module.php new file mode 100644 index 0000000..79eec73 --- /dev/null +++ b/app/Models/Module.php @@ -0,0 +1,19 @@ +belongsTo('App\Models\Laboratory', 'lab_id','id'); + } + +} diff --git a/app/Models/OrganismResult.php b/app/Models/OrganismResult.php new file mode 100644 index 0000000..4900590 --- /dev/null +++ b/app/Models/OrganismResult.php @@ -0,0 +1,24 @@ +belongsTo(Province::class,'province_id','id'); + } + + public function district(){ + return $this->belongsTo(District::class,'district_id','id'); + } + + public function commune(){ + return $this->belongsTo(Commune::class,'commune_id','id'); + } + + public function village(){ + return $this->belongsTo(Village::class,'village_id','id'); + } + + public function samples(){ + return $this->hasMany(Sample::class,'patient_id','id') + ->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => Session::get('base_lab_id')]); + } + + public function telegramChatId(){ + return $this->belongsTo(PatientTelegram::class,'id', 'patient_id'); + } + +} diff --git a/app/Models/PatientTelegram.php b/app/Models/PatientTelegram.php new file mode 100644 index 0000000..3ab5697 --- /dev/null +++ b/app/Models/PatientTelegram.php @@ -0,0 +1,37 @@ +belongsTo('App\Models\Laboratory', 'lab_id','id'); + } + +} diff --git a/app/Models/PhysicianCommission.php b/app/Models/PhysicianCommission.php new file mode 100644 index 0000000..aa3299c --- /dev/null +++ b/app/Models/PhysicianCommission.php @@ -0,0 +1,32 @@ +belongsTo('App\Models\Laboratory', 'lab_id','id'); + } + +} diff --git a/app/Models/Province.php b/app/Models/Province.php new file mode 100644 index 0000000..e95fffd --- /dev/null +++ b/app/Models/Province.php @@ -0,0 +1,22 @@ +hasMany(PublicationReceiver::class, 'publication_id', 'id'); + } + + + +} diff --git a/app/Models/PublicationReceiver.php b/app/Models/PublicationReceiver.php new file mode 100644 index 0000000..e416717 --- /dev/null +++ b/app/Models/PublicationReceiver.php @@ -0,0 +1,25 @@ +belongsTo('App\Models\Laboratory', 'lab_id','id'); + } + +} diff --git a/app/Models/RejectComment.php b/app/Models/RejectComment.php new file mode 100644 index 0000000..d78bf8b --- /dev/null +++ b/app/Models/RejectComment.php @@ -0,0 +1,29 @@ +belongsTo(Invoice::class, 'invoice_id','id'); + } + +} diff --git a/app/Models/Role.php b/app/Models/Role.php new file mode 100644 index 0000000..753a45a --- /dev/null +++ b/app/Models/Role.php @@ -0,0 +1,27 @@ +belongsTo(Laboratory::class, 'lab_id'); + } + +} diff --git a/app/Models/RoleHasPermission.php b/app/Models/RoleHasPermission.php new file mode 100644 index 0000000..28a6a84 --- /dev/null +++ b/app/Models/RoleHasPermission.php @@ -0,0 +1,19 @@ +belongsTo(Laboratory::class, 'lab_id','id'); + } + + public function patient(){ + return $this->belongsTo(Patient::class, 'patient_id','id'); + } + + public function sample_source(){ + return $this->belongsTo(SampleSource::class, 'sample_source_id','id'); + } + + public function sample_details(){ + return $this->hasMany(SampleDetail::class, 'sample_id', 'id') + ->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => Session::get('base_lab_id')]); + } + + public function sample_tests(){ + return $this->hasMany(TestResult::class, 'sample_id', 'id') + ->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => Session::get('base_lab_id')]); + } + + public function entryBy(){ + return $this->belongsTo(User::class, 'created_by', 'id'); + } + + public function modifiedBy(){ + return $this->belongsTo(User::class, 'updated_by', 'id'); + } + + public function physician(){ + return $this->belongsTo(Physician::class, 'physician_id', 'id'); + } + + public function invoice(){ + return $this->belongsTo(Invoice::class, 'id', 'sample_id')->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, 'lab_id' => Session::get('base_lab_id')]); + } + + function getStateAttribute(){ + $state = '#FF0000'; + $sampleCondition = $this->sample_condition; + $samplePrinted = $this->is_printed; + $sampleId = $this->id; + + $resultItemsData = DB::select(' + SELECT + s.id, + s.`sample_number`, + SUM(IF(ts.`field_type`>0, 1,0)) AS non_heading_tests, + SUM(IF(ts.`field_type` IN(1,4) AND tr.test_result IS NOT NULL, 1, 0)) AS done_numeric_tests, + SUM(IF(ts.`field_type` IN(2,3) AND org_result.total_org_result>0, 1, 0)) AS done_org_test + FROM samples s + LEFT JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + LEFT JOIN test_samples ts + ON ts.id = tr.`test_sample_id` + AND ts.lab_id = tr.lab_id + LEFT JOIN sample_types st + ON st.id = ts.`sample_type_id` + LEFT JOIN( + SELECT + tr.`id`, + COUNT(*) AS total_org_result + FROM samples s + INNER JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + INNER JOIN organism_results orgr + ON orgr.`test_result_id` = tr.`id` + WHERE s.id = '.$sampleId.' + AND tr.`record_status_id` = 1 + AND orgr.`record_status_id` = 1 + group by tr.id + ) AS org_result + ON org_result.id = tr.`id` + WHERE s.`id` = '.$sampleId.' + AND (tr.`record_status_id` = 1 OR tr.`record_status_id` IS NULL) + AND (st.`record_status_id` = 1 OR st.`record_status_id` IS NULL) + GROUP BY s.`sample_number`, s.id'); + + $non_heading_tests = 0; + $done_numeric_tests = 0; + $done_org_test = 0; + foreach ($resultItemsData as $v){ + $non_heading_tests = $v->non_heading_tests; + $done_numeric_tests = $v->done_numeric_tests; + $done_org_test = $v->done_org_test; + } + + if(!is_null($sampleCondition) && $sampleCondition==0) $state = '#FFA500'; // orange for rejected + elseif(($sampleCondition!=0 || is_null($sampleCondition)) && $samplePrinted) $state = '#3b86d1'; // blue for printed + else { + if($non_heading_tests==0) $state = '#FF0000'; + else if($non_heading_tests>0 && $non_heading_tests == ($done_numeric_tests+$done_org_test)){ + $state = '#008000'; // Green for fully completed + } + elseif($non_heading_tests>0 && ($done_numeric_tests+$done_org_test)==0){ + $state = '#FF0000'; // Red for No result at all + } + elseif(($done_numeric_tests+$done_org_test)>0 && $non_heading_tests >($done_numeric_tests+$done_org_test)){ + $state = '#FFFF00'; // Yellow for complete some + } + else $state = '#FF0000'; //Silver for known state + } + return $state; + } + + function getProgressAttribute(){ + $state = '#FF0000'; + $sampleCondition = $this->sample_condition; + $samplePrinted = $this->is_printed; + $sampleId = $this->id; + + $resultItemsData = DB::select(' + SELECT + s.id, + s.`sample_number`, + SUM(IF(ts.`field_type`>0, 1,0)) AS non_heading_tests, + SUM(IF(ts.`field_type` IN(1,4) AND tr.test_result IS NOT NULL, 1, 0)) AS done_numeric_tests, + SUM(IF(ts.`field_type` IN(2,3) AND org_result.total_org_result>0, 1, 0)) AS done_org_test + FROM samples s + LEFT JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + LEFT JOIN test_samples ts + ON ts.id = tr.`test_sample_id` + AND ts.lab_id = tr.lab_id + LEFT JOIN sample_types st + ON st.id = ts.`sample_type_id` + LEFT JOIN( + SELECT + tr.`id`, + COUNT(*) AS total_org_result + FROM samples s + INNER JOIN test_results tr + ON tr.`sample_id` = s.`id` + AND s.`lab_id` = tr.`lab_id` + INNER JOIN organism_results orgr + ON orgr.`test_result_id` = tr.`id` + WHERE s.id = '.$sampleId.' + AND tr.`record_status_id` = 1 + AND orgr.`record_status_id` = 1 + group by tr.id + ) AS org_result + ON org_result.id = tr.`id` + WHERE s.`id` = '.$sampleId.' + AND (tr.`record_status_id` = 1 OR tr.`record_status_id` IS NULL) + AND (st.`record_status_id` = 1 OR st.`record_status_id` IS NULL) + GROUP BY s.`sample_number`, s.id'); + + $non_heading_tests = 0; + $done_numeric_tests = 0; + $done_org_test = 0; + foreach ($resultItemsData as $v){ + $non_heading_tests = $v->non_heading_tests; + $done_numeric_tests = $v->done_numeric_tests; + $done_org_test = $v->done_org_test; + } + + if(!is_null($sampleCondition) && $sampleCondition==0) $state = __('sample.filter_rejected'); // '#FFA500'; // orange for rejected + elseif(($sampleCondition!=0 || is_null($sampleCondition)) && $samplePrinted) $state = __('sample.filter_printed'); // '#3b86d1'; // blue for printed + else { + if($non_heading_tests==0) $state = __('sample.filter_pending'); + else if($non_heading_tests>0 && $non_heading_tests == ($done_numeric_tests+$done_org_test)){ + $state = __('sample.filter_completed'); // '#008000'; // Green for fully completed + } + elseif($non_heading_tests>0 && ($done_numeric_tests+$done_org_test)==0){ + $state = __('sample.filter_pending'); //'#FF0000'; // Red for No result at all + } + elseif(($done_numeric_tests+$done_org_test)>0 && $non_heading_tests >($done_numeric_tests+$done_org_test)){ + $state = __('sample.filter_processing'); // '#FFFF00'; // Yellow for complete some + } + else $state = __('sample.filter_pending'); //Silver for known state + } + return $state; + } + + +} diff --git a/app/Models/SampleDetail.php b/app/Models/SampleDetail.php new file mode 100644 index 0000000..df8d3f3 --- /dev/null +++ b/app/Models/SampleDetail.php @@ -0,0 +1,35 @@ +belongsTo('App\Models\Laboratory', 'lab_id','id'); + } + + public function telegramChatId(){ + return $this->belongsTo(SampleSourceTelegram::class,'id', 'sample_source_id'); + } + +} diff --git a/app/Models/SampleSourceTelegram.php b/app/Models/SampleSourceTelegram.php new file mode 100644 index 0000000..30036ee --- /dev/null +++ b/app/Models/SampleSourceTelegram.php @@ -0,0 +1,37 @@ +belongsTo(Department::class, 'department_id'); + } + + public function testSamples(){ + return $this->hasMany(TestSample::class, 'sample_type_id') + ->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]) + //->where('lab_id', Session::get('base_lab_id')) + ->orderBy('weight'); + } + +} diff --git a/app/Models/Supplier.php b/app/Models/Supplier.php new file mode 100644 index 0000000..e6f5b93 --- /dev/null +++ b/app/Models/Supplier.php @@ -0,0 +1,43 @@ +belongsTo('App\Models\Laboratory', 'lab_id','id'); + } + +} diff --git a/app/Models/TestCategory.php b/app/Models/TestCategory.php new file mode 100644 index 0000000..724cc3a --- /dev/null +++ b/app/Models/TestCategory.php @@ -0,0 +1,27 @@ +hasMany(TestGroupDetail::class, 'test_group_id', 'id')->where([BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE]); + } + +} diff --git a/app/Models/TestGroupDetail.php b/app/Models/TestGroupDetail.php new file mode 100644 index 0000000..114ba89 --- /dev/null +++ b/app/Models/TestGroupDetail.php @@ -0,0 +1,26 @@ +belongsTo(TestSample::class,'test_sample_id','id')->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE); + } + +// function organismResults(){ +// return $this->hasMany(OrganismResult::class,'test_result_id','id')->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE); +// } + +// function getUsdPriceAttribute(){ +// return TestSample::query()->find($this->test_sample_id)->first()->usd_price; +// } + + +} diff --git a/app/Models/TestSample.php b/app/Models/TestSample.php new file mode 100644 index 0000000..e43b37a --- /dev/null +++ b/app/Models/TestSample.php @@ -0,0 +1,63 @@ +belongsTo(Test::class, 'test_id','id'); + } + + public function sample(){ + return $this->belongsTo(SampleType::class, 'sample_type_id','id'); + } + + public function lab(){ + return $this->belongsTo(Laboratory::class, 'lab_id','id'); + } + + public function organisms(){ + return $this->hasMany(TestSampleOrganism::class, 'test_sample_id', 'id')->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE); + } + + public function tests(){ + return $this->hasMany(self::class, 'heading_id','id')->where([ + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, + 'lab_id' => Session::get('base_lab_id') + ]); + } + + public function childTest(){ + return $this->hasMany(self::class, 'heading_id','id')->where([ + BaseModel::RECORD_STATUS_FIELD => RecordStatusEnum::ACTIVE, + 'lab_id' => Session::get('base_lab_id') + ]); + } + + public function testValues(){ + return $this->hasMany(TestNormalValue::class, 'test_sample_id', 'id')->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE); + } + +} diff --git a/app/Models/TestSampleOrganism.php b/app/Models/TestSampleOrganism.php new file mode 100644 index 0000000..b6d7164 --- /dev/null +++ b/app/Models/TestSampleOrganism.php @@ -0,0 +1,31 @@ +belongsTo('App\Models\Organism', 'organism_id', 'id')->where(BaseModel::RECORD_STATUS_FIELD, RecordStatusEnum::ACTIVE); + } + + +} diff --git a/app/Models/Traits/HasLocalizedName.php b/app/Models/Traits/HasLocalizedName.php new file mode 100644 index 0000000..42b2096 --- /dev/null +++ b/app/Models/Traits/HasLocalizedName.php @@ -0,0 +1,21 @@ +getLocale(); // e.g. 'en' or 'fr' + // Default fallback language + $column = 'name_en'; + + if (in_array($locale, ['en', 'kh'])) { + $column = "name_{$locale}"; + } + + // Return localized name if exists, else fallback + return $this->{$column} ?? $this->name_en; + } +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 0000000..5e9bbbc --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,54 @@ + 'datetime', + ]; + + public function role(){ + return $this->belongsTo('App\Models\Role', 'role_id','id'); + } + + public function lab_covers(){ + return $this->hasMany('App\Models\UserLabCover', 'user_id','id')->where('record_status_id', RecordStatusEnum::ACTIVE ); + } + +} diff --git a/app/Models/UserLabCover.php b/app/Models/UserLabCover.php new file mode 100644 index 0000000..acf306c --- /dev/null +++ b/app/Models/UserLabCover.php @@ -0,0 +1,20 @@ +belongsTo('App\Models\Laboratory', 'lab_id','id'); + } + + public function user(){ + return $this->belongsTo('App\Models\User', 'user_id', 'id'); + } +} diff --git a/app/Models/Village.php b/app/Models/Village.php new file mode 100644 index 0000000..44bd02c --- /dev/null +++ b/app/Models/Village.php @@ -0,0 +1,22 @@ +app->environment('local')) { + $this->app->register(\Laravel\Telescope\TelescopeServiceProvider::class); + $this->app->register(TelescopeServiceProvider::class); + } + + } + + /** + * Bootstrap any application services. + * + * @return void + */ + public function boot(): void + { + // Only needed for older MySQL versions (< 5.7.7) + Schema::defaultStringLength(191); + + // Language switcher composer +// View::composer('partials.language_switcher', function ($view) { +// $view->with('current_locale', app()->getLocale()); +// $view->with('available_locales', config('app.available_locales')); +// }); + + // Shared publications message + $publications = Publication::query() + ->whereRaw('CURDATE() BETWEEN start_date AND end_date') + ->where('record_status_id', 1) + ->orderByDesc('id') + ->get(); + + View::share([ + 'sharedMessage' => $publications, + ]); + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php new file mode 100644 index 0000000..d18a1a8 --- /dev/null +++ b/app/Providers/AuthServiceProvider.php @@ -0,0 +1,39 @@ + 'App\Policies\ModelPolicy', + ]; + + /** + * Register any authentication / authorization services. + * + * @return void + */ + public function boot() + { + $this->registerPolicies(); + Passport::routes(); + + // Access token: 10 minutes + Passport::tokensExpireIn(Carbon::now()->addMinutes(30)); + + // Refresh token: e.g., 30 days (default is 30 days; adjust as needed) + Passport::refreshTokensExpireIn(Carbon::now()->addDays(30)); + + // + } +} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..395c518 --- /dev/null +++ b/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,21 @@ + [ + SendEmailVerificationNotification::class, + ], + Login::class => [ + \App\Listeners\LogUserLogin::class, + ], + + Logout::class => [ + \App\Listeners\LogUserLogout::class, + ], + ]; + + /** + * Register any events for your application. + * + * @return void + */ + public function boot() + { + // + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..f6616a6 --- /dev/null +++ b/app/Providers/RouteServiceProvider.php @@ -0,0 +1,52 @@ +configureRateLimiting(); + + $this->routes(function () { + Route::middleware('web') + ->group(base_path('routes/web.php')); + + Route::prefix('api') + ->middleware('api') + ->group(base_path('routes/api.php')); + }); + } + + /** + * Configure the rate limiters for the application. + * + * @return void + */ + protected function configureRateLimiting() + { + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(60); + }); + } +} diff --git a/app/Providers/TelescopeServiceProvider.php b/app/Providers/TelescopeServiceProvider.php new file mode 100644 index 0000000..a9ddad2 --- /dev/null +++ b/app/Providers/TelescopeServiceProvider.php @@ -0,0 +1,71 @@ +hideSensitiveRequestDetails(); + + Telescope::filter(function (IncomingEntry $entry) { + if ($this->app->environment('local')) { + return true; + } + + return $entry->isReportableException() || + $entry->isFailedRequest() || + $entry->isFailedJob() || + $entry->isScheduledTask() || + $entry->hasMonitoredTag(); + }); + } + + /** + * Prevent sensitive request details from being logged by Telescope. + * + * @return void + */ + protected function hideSensitiveRequestDetails() + { + if ($this->app->environment('local')) { + return; + } + + Telescope::hideRequestParameters(['_token']); + + Telescope::hideRequestHeaders([ + 'cookie', + 'x-csrf-token', + 'x-xsrf-token', + ]); + } + + /** + * Register the Telescope gate. + * + * This gate determines who can access Telescope in non-local environments. + * + * @return void + */ + protected function gate() + { + Gate::define('viewTelescope', function ($user) { + return in_array($user->email, [ + // + ]); + }); + } +} diff --git a/app/Traits/AuditLogTrait.php b/app/Traits/AuditLogTrait.php new file mode 100644 index 0000000..f53d0e7 --- /dev/null +++ b/app/Traits/AuditLogTrait.php @@ -0,0 +1,19 @@ +logAll() + ->logOnlyDirty() + ->dontSubmitEmptyLogs() + ->setDescriptionForEvent(fn(string $eventName) => class_basename($this)." {$eventName}"); + } +} \ No newline at end of file diff --git a/app/View/Components/Alert.php b/app/View/Components/Alert.php new file mode 100644 index 0000000..302775e --- /dev/null +++ b/app/View/Components/Alert.php @@ -0,0 +1,26 @@ +handleCommand(new ArgvInput); + +exit($status); diff --git a/bootstrap/app.php b/bootstrap/app.php new file mode 100644 index 0000000..c8fd15e --- /dev/null +++ b/bootstrap/app.php @@ -0,0 +1,20 @@ +withRouting( + web: __DIR__.'/../routes/web.php', + commands: __DIR__.'/../routes/console.php', + health: '/up' + ) + ->withMiddleware(function (Middleware $middleware) { + $middleware->web(append: [ + \App\Http\Middleware\SetLocale::class, + ]); + }) + ->withExceptions(function (Exceptions $exceptions): void { + // + })->create(); diff --git a/bootstrap/cache/.gitignore b/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/bootstrap/providers.php b/bootstrap/providers.php new file mode 100644 index 0000000..38b258d --- /dev/null +++ b/bootstrap/providers.php @@ -0,0 +1,5 @@ +=5.0.0" + }, + "require-dev": { + "doctrine/dbal": "^4.0.0", + "nesbot/carbon": "^2.71.0 || ^3.0.0", + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Carbon\\Doctrine\\": "src/Carbon/Doctrine/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "KyleKatarn", + "email": "kylekatarnls@gmail.com" + } + ], + "description": "Types to use Carbon in Doctrine", + "keywords": [ + "carbon", + "date", + "datetime", + "doctrine", + "time" + ], + "support": { + "issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues", + "source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2024-02-09T16:56:22+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/8f5fa3cc214230e71f54924bd0197a3bcc705eb1", + "reference": "8f5fa3cc214230e71f54924bd0197a3bcc705eb1", + "shasum": "" + }, + "require": { + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7 || ^8" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6 || ^7 || ^8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.7.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-12-29T13:15:25+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.4", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + } + ], + "time": "2025-08-20T19:15:30+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.7", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "b5874fa9ed0043116c72162ec7f4fb50e02e7cce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/b5874fa9ed0043116c72162ec7f4fb50e02e7cce", + "reference": "b5874fa9ed0043116c72162ec7f4fb50e02e7cce", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.7" + }, + "time": "2025-09-16T12:23:56+00:00" + }, + { + "name": "defuse/php-encryption", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/defuse/php-encryption.git", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "paragonie/random_compat": ">= 2", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^5|^6|^7|^8|^9|^10", + "yoast/phpunit-polyfills": "^2.0.0" + }, + "bin": [ + "bin/generate-defuse-key" + ], + "type": "library", + "autoload": { + "psr-4": { + "Defuse\\Crypto\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Hornby", + "email": "taylor@defuse.ca", + "homepage": "https://defuse.ca/" + }, + { + "name": "Scott Arciszewski", + "email": "info@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "Secure PHP Encryption Library", + "keywords": [ + "aes", + "authenticated encryption", + "cipher", + "crypto", + "cryptography", + "encrypt", + "encryption", + "openssl", + "security", + "symmetric key cryptography" + ], + "support": { + "issues": "https://github.com/defuse/php-encryption/issues", + "source": "https://github.com/defuse/php-encryption/tree/v2.4.0" + }, + "time": "2023-06-19T06:10:36+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" + }, + "time": "2024-07-08T12:26:09+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "reference": "d61a8a9604ec1f8c3d150d09db6ce98b32675013", + "shasum": "" + }, + "require": { + "php": "^8.2|^8.3|^8.4|^8.5" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.32|^2.1.31", + "phpunit/phpunit": "^8.5.48|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2025-10-31T18:51:33+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2025-03-06T22:45:56+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.19.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/b287d2a16aceffbf6e0295559b39662612b77fcf", + "reference": "b287d2a16aceffbf6e0295559b39662612b77fcf", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.19.0" + }, + "time": "2025-10-17T16:34:55+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v7.0.3", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v7.0.3" + }, + "time": "2026-02-25T22:16:40+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "reference": "38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379", + "shasum": "" + }, + "require": { + "php": "^8.1", + "symfony/http-foundation": "^5.4|^6.4|^7.3|^8" + }, + "require-dev": { + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2025-12-03T09:33:47+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.4", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b", + "reference": "e01f4a821471308ba86aa202fed6698b6b695e3b", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:43:20+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.10.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^2.3", + "guzzlehttp/psr7": "^2.8", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2025-08-23T22:36:01+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "481557b130ef3790cf82b713667b43030dc9c957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", + "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:34:08+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.9.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", + "phpunit/phpunit": "^8.5.44 || ^9.6.25" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.9.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2026-03-10T16:41:02+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "reference": "4f4bbd4e7172148801e76e3decc1e559bdee34e1", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "support": { + "issues": "https://github.com/guzzle/uri-template/issues", + "source": "https://github.com/guzzle/uri-template/tree/v1.0.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template", + "type": "tidelift" + } + ], + "time": "2025-08-22T14:27:06+00:00" + }, + { + "name": "irazasyed/telegram-bot-sdk", + "version": "v3.15.0", + "source": { + "type": "git", + "url": "https://github.com/irazasyed/telegram-bot-sdk.git", + "reference": "07146018d173dedfd520fb8f18a50f31e27b1e60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/irazasyed/telegram-bot-sdk/zipball/07146018d173dedfd520fb8f18a50f31e27b1e60", + "reference": "07146018d173dedfd520fb8f18a50f31e27b1e60", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/guzzle": "^7.5.1", + "guzzlehttp/psr7": "^2.5", + "illuminate/support": "9 - 12", + "league/event": "^2.2 || ^3.0", + "php": ">=8.0", + "psr/container": "^1.1 || ^2.0", + "psr/event-dispatcher": "^1.0" + }, + "require-dev": { + "irazasyed/docgen": "^0.2", + "pestphp/pest": "^1.22 || ^2.0 || ^3.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpspec/prophecy": "^1.17", + "phpspec/prophecy-phpunit": "^2.0", + "rector/rector": "^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 || ^1.0.0 || ^2.0.0" + }, + "suggest": { + "illuminate/container": "Hold dependencies to be injected in commands constructors", + "irazasyed/larasupport": "Allows you to use any Laravel Package in Lumen by adding support!" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Telegram": "Telegram\\Bot\\Laravel\\Facades\\Telegram" + }, + "providers": [ + "Telegram\\Bot\\Laravel\\TelegramServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Telegram\\Bot\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Irfaq Syed", + "email": "github@lukonet.net", + "homepage": "https://github.com/irazasyed" + } + ], + "description": "The Unofficial Telegram Bot API PHP SDK", + "homepage": "https://github.com/irazasyed/telegram-bot-sdk", + "keywords": [ + "laravel", + "laravel telegram", + "telegram", + "telegram bot", + "telegram bot api", + "telegram php", + "telegram sdk" + ], + "support": { + "issues": "https://github.com/irazasyed/telegram-bot-sdk/issues", + "source": "https://github.com/irazasyed/telegram-bot-sdk/tree/v3.15.0" + }, + "time": "2025-02-18T19:03:24+00:00" + }, + { + "name": "laminas/laminas-code", + "version": "4.17.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "40d61e2899ec17c5d08bbc0a2d586b3ca17ab9bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/40d61e2899ec17c5d08bbc0a2d586b3ca17ab9bd", + "reference": "40d61e2899ec17c5d08bbc0a2d586b3ca17ab9bd", + "shasum": "" + }, + "require": { + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0.1", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^3.0.0", + "laminas/laminas-stdlib": "^3.18.0", + "phpunit/phpunit": "^10.5.58", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.15.0" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas", + "laminasframework" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2025-11-01T09:38:14+00:00" + }, + { + "name": "laravel/framework", + "version": "v12.54.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "325497463e7599cd14224c422c6e5dd2fe832868" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/325497463e7599cd14224c422c6e5dd2fe832868", + "reference": "325497463e7599cd14224c422c6e5dd2fe832868", + "shasum": "" + }, + "require": { + "brick/math": "^0.11|^0.12|^0.13|^0.14", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.4", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.3", + "guzzlehttp/guzzle": "^7.8.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/prompts": "^0.3.0", + "laravel/serializable-closure": "^1.3|^2.0", + "league/commonmark": "^2.8.1", + "league/flysystem": "^3.25.1", + "league/flysystem-local": "^3.25.1", + "league/uri": "^7.5.1", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^3.8.4", + "nunomaduro/termwind": "^2.0", + "php": "^8.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^7.2.0", + "symfony/error-handler": "^7.2.0", + "symfony/finder": "^7.2.0", + "symfony/http-foundation": "^7.2.0", + "symfony/http-kernel": "^7.2.0", + "symfony/mailer": "^7.2.0", + "symfony/mime": "^7.2.0", + "symfony/polyfill-php83": "^1.33", + "symfony/polyfill-php84": "^1.33", + "symfony/polyfill-php85": "^1.33", + "symfony/process": "^7.2.0", + "symfony/routing": "^7.2.0", + "symfony/uid": "^7.2.0", + "symfony/var-dumper": "^7.2.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.6.1", + "voku/portable-ascii": "^2.0.2" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/log-implementation": "1.0|2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/concurrency": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/json-schema": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/reflection": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version", + "spatie/once": "*" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.322.9", + "ext-gmp": "*", + "fakerphp/faker": "^1.24", + "guzzlehttp/promises": "^2.0.3", + "guzzlehttp/psr7": "^2.4", + "laravel/pint": "^1.18", + "league/flysystem-aws-s3-v3": "^3.25.1", + "league/flysystem-ftp": "^3.25.1", + "league/flysystem-path-prefixing": "^3.25.1", + "league/flysystem-read-only": "^3.25.1", + "league/flysystem-sftp-v3": "^3.25.1", + "mockery/mockery": "^1.6.10", + "opis/json-schema": "^2.4.1", + "orchestra/testbench-core": "^10.9.0", + "pda/pheanstalk": "^5.0.6|^7.0.0", + "php-http/discovery": "^1.15", + "phpstan/phpstan": "^2.0", + "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", + "predis/predis": "^2.3|^3.0", + "resend/resend-php": "^0.10.0|^1.0", + "symfony/cache": "^7.2.0", + "symfony/http-client": "^7.2.0", + "symfony/psr-http-message-bridge": "^7.2.0", + "symfony/translation": "^7.2.0" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).", + "brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).", + "fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).", + "league/flysystem-read-only": "Required to use read-only disks (^3.25.1)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).", + "mockery/mockery": "Required to use mocking (^1.6).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", + "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", + "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", + "predis/predis": "Required to use the predis connector (^2.3|^3.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^7.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^7.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/functions.php", + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Filesystem/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Log/functions.php", + "src/Illuminate/Reflection/helpers.php", + "src/Illuminate/Support/functions.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/", + "src/Illuminate/Reflection/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2026-03-10T20:25:56+00:00" + }, + { + "name": "laravel/passport", + "version": "v13.6.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/passport.git", + "reference": "d97be1147f3dc2857e5a5cc4be0842c3ed46c5d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/passport/zipball/d97be1147f3dc2857e5a5cc4be0842c3ed46c5d8", + "reference": "d97be1147f3dc2857e5a5cc4be0842c3ed46c5d8", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-openssl": "*", + "firebase/php-jwt": "^6.4|^7.0", + "illuminate/auth": "^11.35|^12.0|^13.0", + "illuminate/console": "^11.35|^12.0|^13.0", + "illuminate/container": "^11.35|^12.0|^13.0", + "illuminate/contracts": "^11.35|^12.0|^13.0", + "illuminate/cookie": "^11.35|^12.0|^13.0", + "illuminate/database": "^11.35|^12.0|^13.0", + "illuminate/encryption": "^11.35|^12.0|^13.0", + "illuminate/http": "^11.35|^12.0|^13.0", + "illuminate/support": "^11.35|^12.0|^13.0", + "league/oauth2-server": "^9.2", + "php": "^8.2", + "php-http/discovery": "^1.20", + "phpseclib/phpseclib": "^3.0", + "psr/http-factory-implementation": "*", + "symfony/console": "^7.1|^8.0", + "symfony/psr-http-message-bridge": "^7.1|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^9.15|^10.8|^11.0", + "phpstan/phpstan": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Passport\\PassportServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Passport\\": "src/", + "Laravel\\Passport\\Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Passport provides OAuth2 server support to Laravel.", + "keywords": [ + "laravel", + "oauth", + "passport" + ], + "support": { + "issues": "https://github.com/laravel/passport/issues", + "source": "https://github.com/laravel/passport" + }, + "time": "2026-03-05T16:26:09+00:00" + }, + { + "name": "laravel/prompts", + "version": "v0.3.14", + "source": { + "type": "git", + "url": "https://github.com/laravel/prompts.git", + "reference": "9f0e371244eedfe2ebeaa72c79c54bb5df6e0176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/prompts/zipball/9f0e371244eedfe2ebeaa72c79c54bb5df6e0176", + "reference": "9f0e371244eedfe2ebeaa72c79c54bb5df6e0176", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.2", + "ext-mbstring": "*", + "php": "^8.1", + "symfony/console": "^6.2|^7.0|^8.0" + }, + "conflict": { + "illuminate/console": ">=10.17.0 <10.25.0", + "laravel/framework": ">=10.17.0 <10.25.0" + }, + "require-dev": { + "illuminate/collections": "^10.0|^11.0|^12.0|^13.0", + "mockery/mockery": "^1.5", + "pestphp/pest": "^2.3|^3.4|^4.0", + "phpstan/phpstan": "^1.12.28", + "phpstan/phpstan-mockery": "^1.1.3" + }, + "suggest": { + "ext-pcntl": "Required for the spinner to be animated." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Laravel\\Prompts\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", + "support": { + "issues": "https://github.com/laravel/prompts/issues", + "source": "https://github.com/laravel/prompts/tree/v0.3.14" + }, + "time": "2026-03-01T09:02:38+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v2.0.10", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669", + "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2026-02-20T19:59:49+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.11.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/tinker.git", + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/tinker/zipball/c9f80cc835649b5c1842898fb043f8cc098dd741", + "reference": "c9f80cc835649b5c1842898fb043f8cc098dd741", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.11.1|^0.12.0", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0|^7.0|^8.0" + }, + "require-dev": { + "mockery/mockery": "~1.3.3|^1.4.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.8|^9.3.3|^10.0" + }, + "suggest": { + "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0)." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "support": { + "issues": "https://github.com/laravel/tinker/issues", + "source": "https://github.com/laravel/tinker/tree/v2.11.1" + }, + "time": "2026-02-06T14:12:35+00:00" + }, + { + "name": "lcobucci/clock", + "version": "3.5.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/clock.git", + "reference": "a3139d9e97d47826f27e6a17bb63f13621f86058" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/a3139d9e97d47826f27e6a17bb63f13621f86058", + "reference": "a3139d9e97d47826f27e6a17bb63f13621f86058", + "shasum": "" + }, + "require": { + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "infection/infection": "^0.31", + "lcobucci/coding-standard": "^11.2.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^2.0.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0.0", + "phpstan/phpstan-strict-rules": "^2.0.0", + "phpunit/phpunit": "^12.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\Clock\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com" + } + ], + "description": "Yet another clock abstraction", + "support": { + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/3.5.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2025-10-27T09:03:17+00:00" + }, + { + "name": "lcobucci/jwt", + "version": "5.6.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/bb3e9f21e4196e8afc41def81ef649c164bca25e", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-sodium": "*", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/clock": "^1.0" + }, + "require-dev": { + "infection/infection": "^0.29", + "lcobucci/clock": "^3.2", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^11.1" + }, + "suggest": { + "lcobucci/clock": ">= 3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/5.6.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2025-10-17T11:30:53+00:00" + }, + { + "name": "league/commonmark", + "version": "2.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "84b1ca48347efdbe775426f108622a42735a6579" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/84b1ca48347efdbe775426f108622a42735a6579", + "reference": "84b1ca48347efdbe775426f108622a42735a6579", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.9-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2026-03-05T21:37:03+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/event", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/event.git", + "reference": "ec38ff7ea10cad7d99a79ac937fbcffb9334c210" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/event/zipball/ec38ff7ea10cad7d99a79ac937fbcffb9334c210", + "reference": "ec38ff7ea10cad7d99a79ac937fbcffb9334c210", + "shasum": "" + }, + "require": { + "php": ">=7.2.0", + "psr/event-dispatcher": "^1.0" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "phpstan/phpstan": "^0.12.45", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Event package", + "keywords": [ + "emitter", + "event", + "listener" + ], + "support": { + "issues": "https://github.com/thephpleague/event/issues", + "source": "https://github.com/thephpleague/event/tree/3.0.3" + }, + "time": "2024-09-04T16:06:53+00:00" + }, + { + "name": "league/flysystem", + "version": "3.32.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/254b1595b16b22dbddaaef9ed6ca9fdac4956725", + "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "async-aws/core": "<1.19.0", + "async-aws/s3": "<1.14.0", + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5 || ^2.0", + "async-aws/simple-s3": "^1.1 || ^2.0", + "aws/aws-sdk-php": "^3.295.10", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-mongodb": "^1.3|^2", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", + "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2|^2", + "phpseclib/phpseclib": "^3.0.36", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.5.11|^10.0", + "sabre/dav": "^4.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/3.32.0" + }, + "time": "2026-02-25T17:01:41+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.31.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-local.git", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "reference": "2f669db18a4c20c755c2bb7d3a7b0b2340488079", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "support": { + "source": "https://github.com/thephpleague/flysystem-local/tree/3.31.0" + }, + "time": "2026-01-23T15:30:45+00:00" + }, + { + "name": "league/fractal", + "version": "0.20.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/fractal.git", + "reference": "573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/fractal/zipball/573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e", + "reference": "573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "doctrine/orm": "^2.5", + "illuminate/contracts": "~5.0", + "laminas/laminas-paginator": "~2.12", + "mockery/mockery": "^1.3", + "pagerfanta/pagerfanta": "~1.0.0|~4.0.0", + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "~3.4", + "vimeo/psalm": "^4.30" + }, + "suggest": { + "illuminate/pagination": "The Illuminate Pagination component.", + "laminas/laminas-paginator": "Laminas Framework Paginator", + "pagerfanta/pagerfanta": "Pagerfanta Paginator" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.20.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Fractal\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Phil Sturgeon", + "email": "me@philsturgeon.uk", + "homepage": "http://philsturgeon.uk/", + "role": "Developer" + } + ], + "description": "Handle the output of complex data structures ready for API output.", + "homepage": "http://fractal.thephpleague.com/", + "keywords": [ + "api", + "json", + "league", + "rest" + ], + "support": { + "issues": "https://github.com/thephpleague/fractal/issues", + "source": "https://github.com/thephpleague/fractal/tree/0.20.2" + }, + "time": "2025-02-14T21:33:14+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "league/oauth2-server", + "version": "9.3.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-server.git", + "reference": "d8e2f39f645a82b207bbac441694d6e6079357cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/d8e2f39f645a82b207bbac441694d6e6079357cb", + "reference": "d8e2f39f645a82b207bbac441694d6e6079357cb", + "shasum": "" + }, + "require": { + "defuse/php-encryption": "^2.4", + "ext-json": "*", + "ext-openssl": "*", + "lcobucci/clock": "^2.3 || ^3.0", + "lcobucci/jwt": "^5.0", + "league/event": "^3.0", + "league/uri": "^7.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/http-message": "^2.0", + "psr/http-server-middleware": "^1.0" + }, + "replace": { + "league/oauth2server": "*", + "lncd/oauth2": "*" + }, + "require-dev": { + "laminas/laminas-diactoros": "^3.5", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.12|^2.0", + "phpstan/phpstan-deprecation-rules": "^1.1.4|^2.0", + "phpstan/phpstan-phpunit": "^1.3.15|^2.0", + "phpstan/phpstan-strict-rules": "^1.5.2|^2.0", + "phpunit/phpunit": "^10.5|^11.5|^12.0", + "roave/security-advisories": "dev-master", + "slevomat/coding-standard": "^8.14.1", + "squizlabs/php_codesniffer": "^3.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\OAuth2\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Andy Millington", + "email": "andrew@noexceptions.io", + "homepage": "https://www.noexceptions.io", + "role": "Developer" + } + ], + "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.", + "homepage": "https://oauth2.thephpleague.com/", + "keywords": [ + "Authentication", + "api", + "auth", + "authorisation", + "authorization", + "oauth", + "oauth 2", + "oauth 2.0", + "oauth2", + "protect", + "resource", + "secure", + "server" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-server/issues", + "source": "https://github.com/thephpleague/oauth2-server/tree/9.3.0" + }, + "funding": [ + { + "url": "https://github.com/sephster", + "type": "github" + } + ], + "time": "2025-11-25T22:51:15+00:00" + }, + { + "name": "league/uri", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri.git", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/08cf38e3924d4f56238125547b5720496fac8fd4", + "reference": "08cf38e3924d4f56238125547b5720496fac8fd4", + "shasum": "" + }, + "require": { + "league/uri-interfaces": "^7.8.1", + "php": "^8.1", + "psr/http-factory": "^1" + }, + "conflict": { + "league/uri-schemes": "^1.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-dom": "to convert the URI into an HTML anchor tag", + "ext-fileinfo": "to create Data URI from file contennts", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "ext-uri": "to use the PHP native URI class", + "jeremykendall/php-domain-parser": "to further parse the URI host and resolve its Public Suffix and Top Level Domain", + "league/uri-components": "to provide additional tools to manipulate URI objects components", + "league/uri-polyfill": "to backport the PHP URI extension for older versions of PHP", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "URI manipulation library", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "URN", + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "middleware", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc2141", + "rfc3986", + "rfc3987", + "rfc6570", + "rfc8141", + "uri", + "uri-template", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-15T20:22:25+00:00" + }, + { + "name": "league/uri-interfaces", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/uri-interfaces.git", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/85d5c77c5d6d3af6c54db4a78246364908f3c928", + "reference": "85d5c77c5d6d3af6c54db4a78246364908f3c928", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^8.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "suggest": { + "ext-bcmath": "to improve IPV4 host parsing", + "ext-gmp": "to improve IPV4 host parsing", + "ext-intl": "to handle IDN host with the best performance", + "php-64bit": "to improve IPV4 host parsing", + "rowbot/url": "to handle URLs using the WHATWG URL Living Standard specification", + "symfony/polyfill-intl-idn": "to handle IDN host via the Symfony polyfill if ext-intl is not present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Uri\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://nyamsprod.com" + } + ], + "description": "Common tools for parsing and resolving RFC3987/RFC3986 URI", + "homepage": "https://uri.thephpleague.com", + "keywords": [ + "data-uri", + "file-uri", + "ftp", + "hostname", + "http", + "https", + "parse_str", + "parse_url", + "psr-7", + "query-string", + "querystring", + "rfc3986", + "rfc3987", + "rfc6570", + "uri", + "url", + "ws" + ], + "support": { + "docs": "https://uri.thephpleague.com", + "forum": "https://thephpleague.slack.com", + "issues": "https://github.com/thephpleague/uri-src/issues", + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/nyamsprod", + "type": "github" + } + ], + "time": "2026-03-08T20:05:35+00:00" + }, + { + "name": "livewire/livewire", + "version": "v4.2.1", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "93e972fa42c1b34fff1550093ab94f778d81ea5a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/93e972fa42c1b34fff1550093ab94f778d81ea5a", + "reference": "93e972fa42c1b34fff1550093ab94f778d81ea5a", + "shasum": "" + }, + "require": { + "illuminate/database": "^10.0|^11.0|^12.0|^13.0", + "illuminate/routing": "^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "illuminate/validation": "^10.0|^11.0|^12.0|^13.0", + "laravel/prompts": "^0.1.24|^0.2|^0.3", + "league/mime-type-detection": "^1.9", + "php": "^8.1", + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/http-kernel": "^6.2|^7.0|^8.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^10.15.0|^11.0|^12.0|^13.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^8.21.0|^9.0|^10.0|^11.0", + "orchestra/testbench-dusk": "^8.24|^9.1|^10.0|^11.0", + "phpunit/phpunit": "^10.4|^11.5|^12.5", + "psy/psysh": "^0.11.22|^0.12" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Livewire": "Livewire\\Livewire" + }, + "providers": [ + "Livewire\\LivewireServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v4.2.1" + }, + "funding": [ + { + "url": "https://github.com/livewire", + "type": "github" + } + ], + "time": "2026-02-28T00:01:19+00:00" + }, + { + "name": "maatwebsite/excel", + "version": "3.1.67", + "source": { + "type": "git", + "url": "https://github.com/SpartnerNL/Laravel-Excel.git", + "reference": "e508e34a502a3acc3329b464dad257378a7edb4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SpartnerNL/Laravel-Excel/zipball/e508e34a502a3acc3329b464dad257378a7edb4d", + "reference": "e508e34a502a3acc3329b464dad257378a7edb4d", + "shasum": "" + }, + "require": { + "composer/semver": "^3.3", + "ext-json": "*", + "illuminate/support": "5.8.*||^6.0||^7.0||^8.0||^9.0||^10.0||^11.0||^12.0", + "php": "^7.0||^8.0", + "phpoffice/phpspreadsheet": "^1.30.0", + "psr/simple-cache": "^1.0||^2.0||^3.0" + }, + "require-dev": { + "laravel/scout": "^7.0||^8.0||^9.0||^10.0", + "orchestra/testbench": "^6.0||^7.0||^8.0||^9.0||^10.0", + "predis/predis": "^1.1" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Excel": "Maatwebsite\\Excel\\Facades\\Excel" + }, + "providers": [ + "Maatwebsite\\Excel\\ExcelServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Maatwebsite\\Excel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Patrick Brouwers", + "email": "patrick@spartner.nl" + } + ], + "description": "Supercharged Excel exports and imports in Laravel", + "keywords": [ + "PHPExcel", + "batch", + "csv", + "excel", + "export", + "import", + "laravel", + "php", + "phpspreadsheet" + ], + "support": { + "issues": "https://github.com/SpartnerNL/Laravel-Excel/issues", + "source": "https://github.com/SpartnerNL/Laravel-Excel/tree/3.1.67" + }, + "funding": [ + { + "url": "https://laravel-excel.com/commercial-support", + "type": "custom" + }, + { + "url": "https://github.com/patrickbrouwers", + "type": "github" + } + ], + "time": "2025-08-26T09:13:16+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/682f1098a8fddbaf43edac2306a691c7ad508ec5", + "reference": "682f1098a8fddbaf43edac2306a691c7ad508ec5", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-zlib": "*", + "php-64bit": "^8.3" + }, + "require-dev": { + "brianium/paratest": "^7.7", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.86", + "guzzlehttp/guzzle": "^7.5", + "mikey179/vfsstream": "^1.6", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^12.0", + "vimeo/psalm": "^6.0" + }, + "suggest": { + "guzzlehttp/psr7": "^2.4", + "psr/http-message": "^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/maennchen", + "type": "github" + } + ], + "time": "2025-12-10T09:58:31+00:00" + }, + { + "name": "markbaker/complex", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "reference": "95c56caa1cf5c766ad6d65b6344b807c1e8405b9", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/3.0.2" + }, + "time": "2022-12-06T16:21:08+00:00" + }, + { + "name": "markbaker/matrix", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/728434227fe21be27ff6d86621a1b13107a2562c", + "reference": "728434227fe21be27ff6d86621a1b13107a2562c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "phpcompatibility/php-compatibility": "^9.3", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/3.0.1" + }, + "time": "2022-12-02T22:17:43+00:00" + }, + { + "name": "milon/barcode", + "version": "v12.1.0", + "source": { + "type": "git", + "url": "https://github.com/milon/barcode.git", + "reference": "052e601665cfb99e119a630b6116fab0eb30183e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/milon/barcode/zipball/052e601665cfb99e119a630b6116fab0eb30183e", + "reference": "052e601665cfb99e119a630b6116fab0eb30183e", + "shasum": "" + }, + "require": { + "ext-gd": "*", + "illuminate/support": "^7.0|^8.0|^9.0|^10.0 | ^11.0 | ^12.0", + "php": "^7.3 | ^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "DNS1D": "Milon\\Barcode\\Facades\\DNS1DFacade", + "DNS2D": "Milon\\Barcode\\Facades\\DNS2DFacade" + }, + "providers": [ + "Milon\\Barcode\\BarcodeServiceProvider" + ] + } + }, + "autoload": { + "psr-0": { + "Milon\\Barcode": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Nuruzzaman Milon", + "email": "contact@milon.im" + } + ], + "description": "Barcode generator like Qr Code, PDF417, C39, C39+, C39E, C39E+, C93, S25, S25+, I25, I25+, C128, C128A, C128B, C128C, 2-Digits UPC-Based Extention, 5-Digits UPC-Based Extention, EAN 8, EAN 13, UPC-A, UPC-E, MSI (Variation of Plessey code)", + "keywords": [ + "CODABAR", + "CODE 128", + "CODE 39", + "barcode", + "datamatrix", + "ean", + "laravel", + "pdf417", + "qr code", + "qrcode" + ], + "support": { + "issues": "https://github.com/milon/barcode/issues", + "source": "https://github.com/milon/barcode/tree/v12.1.0" + }, + "funding": [ + { + "url": "https://paypal.me/nuruzzamanmilon", + "type": "custom" + }, + { + "url": "https://github.com/milon", + "type": "github" + } + ], + "time": "2026-02-07T00:42:12+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.10.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0", + "reference": "b321dd6749f0bf7189444158a3ce785cc16d69b0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8 || ^2.0", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/3.10.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2026-01-02T08:56:05+00:00" + }, + { + "name": "nesbot/carbon", + "version": "3.11.3", + "source": { + "type": "git", + "url": "https://github.com/CarbonPHP/carbon.git", + "reference": "6a7e652845bb018c668220c2a545aded8594fbbf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6a7e652845bb018c668220c2a545aded8594fbbf", + "reference": "6a7e652845bb018c668220c2a545aded8594fbbf", + "shasum": "" + }, + "require": { + "carbonphp/carbon-doctrine-types": "<100.0", + "ext-json": "*", + "php": "^8.1", + "psr/clock": "^1.0", + "symfony/clock": "^6.3.12 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "doctrine/dbal": "^3.6.3 || ^4.0", + "doctrine/orm": "^2.15.2 || ^3.0", + "friendsofphp/php-cs-fixer": "^v3.87.1", + "kylekatarnls/multi-tester": "^2.5.3", + "phpmd/phpmd": "^2.15.0", + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.22", + "phpunit/phpunit": "^10.5.53", + "squizlabs/php_codesniffer": "^3.13.4 || ^4.0.0" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev", + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbonphp.github.io/carbon/", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbonphp.github.io/carbon/guide/getting-started/introduction.html", + "issues": "https://github.com/CarbonPHP/carbon/issues", + "source": "https://github.com/CarbonPHP/carbon" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + } + ], + "time": "2026-03-11T17:23:39+00:00" + }, + { + "name": "nette/schema", + "version": "v1.3.5", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.5" + }, + "require-dev": { + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.6", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.39@stable", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.3.5" + }, + "time": "2026-02-23T03:47:12+00:00" + }, + { + "name": "nette/utils", + "version": "v4.1.3", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", + "shasum": "" + }, + "require": { + "php": "8.2 - 8.5" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.5", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.1.3" + }, + "time": "2026-02-13T03:05:33+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.2", + "symfony/console": "^7.4.4 || ^8.0.4" + }, + "require-dev": { + "illuminate/console": "^11.47.0", + "laravel/pint": "^1.27.1", + "mockery/mockery": "^1.6.12", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2", + "phpstan/phpstan": "^1.12.32", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.3.5 || ^8.0.4", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + }, + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "It's like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2026-02-16T23:10:27+00:00" + }, + { + "name": "openspout/openspout", + "version": "v4.32.0", + "source": { + "type": "git", + "url": "https://github.com/openspout/openspout.git", + "reference": "41f045c1f632e1474e15d4c7bc3abcb4a153563d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/openspout/openspout/zipball/41f045c1f632e1474e15d4c7bc3abcb4a153563d", + "reference": "41f045c1f632e1474e15d4c7bc3abcb4a153563d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-filter": "*", + "ext-libxml": "*", + "ext-xmlreader": "*", + "ext-zip": "*", + "php": "~8.3.0 || ~8.4.0 || ~8.5.0" + }, + "require-dev": { + "ext-zlib": "*", + "friendsofphp/php-cs-fixer": "^3.86.0", + "infection/infection": "^0.31.2", + "phpbench/phpbench": "^1.4.1", + "phpstan/phpstan": "^2.1.22", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpstan/phpstan-strict-rules": "^2.0.6", + "phpunit/phpunit": "^12.3.7" + }, + "suggest": { + "ext-iconv": "To handle non UTF-8 CSV files (if \"php-mbstring\" is not already installed or is too limited)", + "ext-mbstring": "To handle non UTF-8 CSV files (if \"iconv\" is not already installed)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "OpenSpout\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Adrien Loison", + "email": "adrien@box.com" + } + ], + "description": "PHP Library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way", + "homepage": "https://github.com/openspout/openspout", + "keywords": [ + "OOXML", + "csv", + "excel", + "memory", + "odf", + "ods", + "office", + "open", + "php", + "read", + "scale", + "spreadsheet", + "stream", + "write", + "xlsx" + ], + "support": { + "issues": "https://github.com/openspout/openspout/issues", + "source": "https://github.com/openspout/openspout/tree/v4.32.0" + }, + "funding": [ + { + "url": "https://paypal.me/filippotessarotto", + "type": "custom" + }, + { + "url": "https://github.com/Slamdunk", + "type": "github" + } + ], + "time": "2025-09-03T16:03:54+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2025-09-24T15:06:41+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.20.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.20.0" + }, + "time": "2024-10-02T11:20:13+00:00" + }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.30.2", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "09cdde5e2f078b9a3358dd217e2c8cb4dac84be2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/09cdde5e2f078b9a3358dd217e2c8cb4dac84be2", + "reference": "09cdde5e2f078b9a3358dd217e2c8cb4dac84be2", + "shasum": "" + }, + "require": { + "composer/pcre": "^1||^2||^3", + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.15", + "maennchen/zipstream-php": "^2.1 || ^3.0", + "markbaker/complex": "^3.0", + "markbaker/matrix": "^3.0", + "php": ">=7.4.0 <8.5.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-main", + "doctrine/instantiator": "^1.5", + "dompdf/dompdf": "^1.0 || ^2.0 || ^3.0", + "friendsofphp/php-cs-fixer": "^3.2", + "mitoteam/jpgraph": "^10.3", + "mpdf/mpdf": "^8.1.1", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^1.1", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^8.5 || ^9.0", + "squizlabs/php_codesniffer": "^3.7", + "tecnickcom/tcpdf": "^6.5" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer", + "ext-intl": "PHP Internationalization Functions", + "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + }, + { + "name": "Owen Leibman" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.30.2" + }, + "time": "2026-01-11T05:58:24+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.5", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be", + "reference": "75365b91986c2405cf5e1e012c5595cd487a98be", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:41:33+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.49", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "6233a1e12584754e6b5daa69fe1289b47775c1b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/6233a1e12584754e6b5daa69fe1289b47775c1b9", + "reference": "6233a1e12584754e6b5daa69fe1289b47775c1b9", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.49" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2026-01-27T09:17:28+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" + }, + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.21", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4821fab5b7cd8c49a673a9fd5754dc9162bb9e97", + "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2", + "composer/class-map-generator": "^1.6" + }, + "suggest": { + "composer/class-map-generator": "Improved tab completion performance with better class discovery.", + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "https://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.21" + }, + "time": "2026-03-06T21:21:28+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.1.1" + }, + "time": "2025-03-22T05:38:12+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.9.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "8429c78ca35a09f27565311b98101e2826affde0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0", + "reference": "8429c78ca35a09f27565311b98101e2826affde0", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.25", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.9.2" + }, + "time": "2025-12-14T04:43:48+00:00" + }, + { + "name": "simplesoftwareio/simple-qrcode", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/SimpleSoftwareIO/simple-qrcode.git", + "reference": "916db7948ca6772d54bb617259c768c9cdc8d537" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SimpleSoftwareIO/simple-qrcode/zipball/916db7948ca6772d54bb617259c768c9cdc8d537", + "reference": "916db7948ca6772d54bb617259c768c9cdc8d537", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^2.0", + "ext-gd": "*", + "php": ">=7.2|^8.0" + }, + "require-dev": { + "mockery/mockery": "~1", + "phpunit/phpunit": "~9" + }, + "suggest": { + "ext-imagick": "Allows the generation of PNG QrCodes.", + "illuminate/support": "Allows for use within Laravel." + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "QrCode": "SimpleSoftwareIO\\QrCode\\Facades\\QrCode" + }, + "providers": [ + "SimpleSoftwareIO\\QrCode\\QrCodeServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "SimpleSoftwareIO\\QrCode\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Simple Software LLC", + "email": "support@simplesoftware.io" + } + ], + "description": "Simple QrCode is a QR code generator made for Laravel.", + "homepage": "https://www.simplesoftware.io/#/docs/simple-qrcode", + "keywords": [ + "Simple", + "generator", + "laravel", + "qrcode", + "wrapper" + ], + "support": { + "issues": "https://github.com/SimpleSoftwareIO/simple-qrcode/issues", + "source": "https://github.com/SimpleSoftwareIO/simple-qrcode/tree/4.2.0" + }, + "time": "2021-02-08T20:43:55+00:00" + }, + { + "name": "spatie/laravel-activitylog", + "version": "4.12.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-activitylog.git", + "reference": "bf66b5bbe9a946e977e876420d16b30b9aff1b2d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/bf66b5bbe9a946e977e876420d16b30b9aff1b2d", + "reference": "bf66b5bbe9a946e977e876420d16b30b9aff1b2d", + "shasum": "" + }, + "require": { + "illuminate/config": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/database": "^8.69 || ^9.27 || ^10.0 || ^11.0 || ^12.0 || ^13.0", + "illuminate/support": "^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0 || ^13.0", + "php": "^8.1", + "spatie/laravel-package-tools": "^1.6.3" + }, + "require-dev": { + "ext-json": "*", + "orchestra/testbench": "^6.23 || ^7.0 || ^8.0 || ^9.6 || ^10.0 || ^11.0", + "pestphp/pest": "^1.20 || ^2.0 || ^3.0 || ^4.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Activitylog\\ActivitylogServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\Activitylog\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Tom Witkowski", + "email": "dev.gummibeer@gmail.com", + "homepage": "https://gummibeer.de", + "role": "Developer" + } + ], + "description": "A very simple activity logger to monitor the users of your website or application", + "homepage": "https://github.com/spatie/activitylog", + "keywords": [ + "activity", + "laravel", + "log", + "spatie", + "user" + ], + "support": { + "issues": "https://github.com/spatie/laravel-activitylog/issues", + "source": "https://github.com/spatie/laravel-activitylog/tree/4.12.1" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-02-22T08:37:18+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.93.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", + "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0|^11.0|^12.0|^13.0", + "php": "^8.1" + }, + "require-dev": { + "mockery/mockery": "^1.5", + "orchestra/testbench": "^8.0|^9.2|^10.0|^11.0", + "pestphp/pest": "^2.1|^3.1|^4.0", + "phpunit/php-code-coverage": "^10.0|^11.0|^12.0", + "phpunit/phpunit": "^10.5|^11.5|^12.5", + "spatie/pest-plugin-test-time": "^2.2|^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2026-02-21T12:49:54+00:00" + }, + { + "name": "symfony/clock", + "version": "v7.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v7.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-11-12T15:39:26+00:00" + }, + { + "name": "symfony/console", + "version": "v7.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d", + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-06T14:06:20+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "2e7c52c647b406e2107dd867db424a4dbac91864" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/2e7c52c647b406e2107dd867db424a4dbac91864", + "reference": "2e7c52c647b406e2107dd867db424a4dbac91864", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-17T07:53:42+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8da531f364ddfee53e36092a7eebbbd0b775f6b8", + "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^6.4|^7.0|^8.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-20T16:42:42+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "dc2c0eba1af673e736bb851d747d266108aea746" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dc2c0eba1af673e736bb851d747d266108aea746", + "reference": "dc2c0eba1af673e736bb851d747d266108aea746", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-05T11:45:34+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.6.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:21:43+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-29T09:40:50+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f94b3e7b7dafd40e666f0c9ff2084133bae41e81", + "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.1" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-06T13:15:18+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3b3fcf386c809be990c922e10e4c620d6367cab1", + "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/flex": "<2.10", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^7.1|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.1|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-06T16:33:18+00:00" + }, + { + "name": "symfony/mailer", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/b02726f39a20bc65e30364f5c750c4ddbf1f58e9", + "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/mime": "^7.2|^8.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-25T16:50:00+00:00" + }, + { + "name": "symfony/mime", + "version": "v7.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/da5ab4fde3f6c88ab06e96185b9922f48b677cd1", + "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/mailer": "<6.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v7.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-05T15:24:09+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70", + "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-27T09:58:17+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-10T14:38:51+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-12-23T08:48:59+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-01-02T08:10:11+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-08T02:45:35+00:00" + }, + { + "name": "symfony/polyfill-php84", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-24T13:30:11+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-06-23T16:12:55+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.33.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.33.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v7.4.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "608476f4604102976d687c483ac63a79ba18cc97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97", + "reference": "608476f4604102976d687c483ac63a79ba18cc97", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v7.4.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-26T15:07:59+00:00" + }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v7.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "929ffe10bbfbb92e711ac3818d416f9daffee067" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/929ffe10bbfbb92e711ac3818d416f9daffee067", + "reference": "929ffe10bbfbb92e711ac3818d416f9daffee067", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/http-message": "^1.0|^2.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "php-http/discovery": "^1.15", + "psr/log": "^1.1.4|^2|^3", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", + "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6|^8.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "https://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-03T23:30:35+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "238d749c56b804b31a9bf3e26519d93b65a60938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/238d749c56b804b31a9bf3e26519d93b65a60938", + "reference": "238d749c56b804b31a9bf3e26519d93b65a60938", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-25T16:50:00+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43", + "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T11:30:57+00:00" + }, + { + "name": "symfony/string", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "9f209231affa85aa930a5e46e6eb03381424b30b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/9f209231affa85aa930a5e46e6eb03381424b30b", + "reference": "9f209231affa85aa930a5e46e6eb03381424b30b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-09T09:33:46+00:00" + }, + { + "name": "symfony/translation", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "1888cf064399868af3784b9e043240f1d89d25ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/1888cf064399868af3784b9e043240f1d89d25ce", + "reference": "1888cf064399868af3784b9e043240f1d89d25ce", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5.3|^3.3" + }, + "conflict": { + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<6.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^5.0", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-17T07:53:42+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.6.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977", + "reference": "65a8bc82080447fae78373aa10f8d13b38338977", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.6-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-07-15T13:41:35+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/7719ce8aba76be93dfe249192f1fbfa52c588e36", + "reference": "7719ce8aba76be93dfe249192f1fbfa52c588e36", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v7.4.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-03T23:30:35+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/045321c440ac18347b136c63d2e9bf28a2dc0291", + "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-15T10:53:20+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41", + "reference": "f0292ccf0ec75843d65027214426b6b163b48b41", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.4 || ^8.0", + "symfony/css-selector": "^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.4.0" + }, + "time": "2025-12-02T11:56:42+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.3", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "955e7815d677a3eaa7075231212f2110983adecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc", + "reference": "955e7815d677a3eaa7075231212f2110983adecc", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.4", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.5", + "symfony/polyfill-ctype": "^1.26", + "symfony/polyfill-mbstring": "^1.26", + "symfony/polyfill-php80": "^1.26" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2025-12-27T19:49:13+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "https://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2024-11-21T01:49:47+00:00" + }, + { + "name": "yajra/laravel-datatables", + "version": "v12.0.0", + "source": { + "type": "git", + "url": "https://github.com/yajra/datatables.git", + "reference": "ac036600203f31847e617dea73186670d2edbf8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yajra/datatables/zipball/ac036600203f31847e617dea73186670d2edbf8d", + "reference": "ac036600203f31847e617dea73186670d2edbf8d", + "shasum": "" + }, + "require": { + "php": "^8.2", + "yajra/laravel-datatables-buttons": "^12.1", + "yajra/laravel-datatables-editor": "^12", + "yajra/laravel-datatables-export": "^12", + "yajra/laravel-datatables-fractal": "^12", + "yajra/laravel-datatables-html": "^12", + "yajra/laravel-datatables-oracle": "^12" + }, + "require-dev": { + "larastan/larastan": "^3.1", + "laravel/pint": "^1.21", + "orchestra/testbench": "^10", + "pestphp/pest": "^3.7", + "pestphp/pest-plugin-laravel": "^3.1", + "rector/rector": "^2.0.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arjay Angeles", + "email": "aqangeles@gmail.com" + } + ], + "description": "Laravel DataTables Complete Package.", + "keywords": [ + "datatables", + "jquery", + "laravel" + ], + "support": { + "issues": "https://github.com/yajra/datatables/issues", + "source": "https://github.com/yajra/datatables/tree/v12.0.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yajra", + "type": "github" + } + ], + "time": "2025-02-26T13:04:07+00:00" + }, + { + "name": "yajra/laravel-datatables-buttons", + "version": "v12.3.1", + "source": { + "type": "git", + "url": "https://github.com/yajra/laravel-datatables-buttons.git", + "reference": "8c6763404c24402817e3c3ea10e70ad5a27dc67b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yajra/laravel-datatables-buttons/zipball/8c6763404c24402817e3c3ea10e70ad5a27dc67b", + "reference": "8c6763404c24402817e3c3ea10e70ad5a27dc67b", + "shasum": "" + }, + "require": { + "illuminate/console": "^12", + "php": "^8.2", + "yajra/laravel-datatables-html": "^12", + "yajra/laravel-datatables-oracle": "^12" + }, + "require-dev": { + "larastan/larastan": "^3.1", + "laravel/pint": "^1.21", + "maatwebsite/excel": "^3.1.64", + "orchestra/testbench": "^10", + "rap2hpoutre/fast-excel": "^5.6", + "rector/rector": "^2.0" + }, + "suggest": { + "barryvdh/laravel-snappy": "Allows exporting of dataTable to PDF using the print view.", + "dompdf/dompdf": "Allows exporting of dataTable to PDF using the DomPDF.", + "maatwebsite/excel": "Exporting of dataTables (excel, csv and PDF) using maatwebsite package.", + "rap2hpoutre/fast-excel": "Faster exporting of dataTables using fast-excel package.", + "yajra/laravel-datatables-export": "Exporting of dataTables (excel, csv and PDF) via livewire and queue worker." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Yajra\\DataTables\\ButtonsServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yajra\\DataTables\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arjay Angeles", + "email": "aqangeles@gmail.com" + } + ], + "description": "Laravel DataTables Buttons Plugin.", + "keywords": [ + "buttons", + "datatables", + "jquery", + "laravel" + ], + "support": { + "issues": "https://github.com/yajra/laravel-datatables-buttons/issues", + "source": "https://github.com/yajra/laravel-datatables-buttons/tree/v12.3.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yajra", + "type": "github" + } + ], + "time": "2025-12-02T08:51:24+00:00" + }, + { + "name": "yajra/laravel-datatables-editor", + "version": "v12.3.0", + "source": { + "type": "git", + "url": "https://github.com/yajra/laravel-datatables-editor.git", + "reference": "8cde2263c4efb074920dbb99475bb1c0f77bed8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yajra/laravel-datatables-editor/zipball/8cde2263c4efb074920dbb99475bb1c0f77bed8d", + "reference": "8cde2263c4efb074920dbb99475bb1c0f77bed8d", + "shasum": "" + }, + "require": { + "illuminate/console": "^12", + "illuminate/database": "^12", + "illuminate/http": "^12", + "illuminate/validation": "^12", + "php": "^8.2" + }, + "require-dev": { + "larastan/larastan": "^3.1", + "laravel/pint": "^1.21.2", + "orchestra/testbench": "^10.1", + "rector/rector": "^2.0.10" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Yajra\\DataTables\\EditorServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yajra\\DataTables\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arjay Angeles", + "email": "aqangeles@gmail.com" + } + ], + "description": "Laravel DataTables Editor plugin for Laravel 5.5+.", + "keywords": [ + "JS", + "datatables", + "editor", + "html", + "jquery", + "laravel" + ], + "support": { + "issues": "https://github.com/yajra/laravel-datatables-editor/issues", + "source": "https://github.com/yajra/laravel-datatables-editor/tree/v12.3.0" + }, + "funding": [ + { + "url": "https://www.paypal.me/yajra", + "type": "custom" + }, + { + "url": "https://github.com/yajra", + "type": "github" + }, + { + "url": "https://www.patreon.com/yajra", + "type": "patreon" + } + ], + "time": "2025-10-03T09:00:17+00:00" + }, + { + "name": "yajra/laravel-datatables-export", + "version": "v12.3.1", + "source": { + "type": "git", + "url": "https://github.com/yajra/laravel-datatables-export.git", + "reference": "6322275f1fe46558838074898393d087e9a60b05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yajra/laravel-datatables-export/zipball/6322275f1fe46558838074898393d087e9a60b05", + "reference": "6322275f1fe46558838074898393d087e9a60b05", + "shasum": "" + }, + "require": { + "ext-json": "*", + "livewire/livewire": "^2.12.8|^3.5.6|^4.0", + "openspout/openspout": "^4.24.5", + "php": "^8.2", + "phpoffice/phpspreadsheet": "^1.29.9|^2.3.7|^3.9.1|^4.0.0|^5.0.0", + "yajra/laravel-datatables-buttons": "^12.0" + }, + "require-dev": { + "larastan/larastan": "^3.1", + "laravel/pint": "^1.17.2", + "orchestra/testbench": "^10.0", + "pestphp/pest": "^3.7", + "pestphp/pest-plugin-laravel": "^3.1", + "rector/rector": "^2.0.9" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Yajra\\DataTables\\ExportServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yajra\\DataTables\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arjay Angeles", + "email": "aqangeles@gmail.com" + } + ], + "description": "Laravel DataTables Queued Export Plugin.", + "keywords": [ + "datatables", + "excel", + "export", + "laravel", + "livewire", + "queue" + ], + "support": { + "issues": "https://github.com/yajra/laravel-datatables-export/issues", + "source": "https://github.com/yajra/laravel-datatables-export/tree/v12.3.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yajra", + "type": "github" + } + ], + "time": "2026-01-28T05:15:39+00:00" + }, + { + "name": "yajra/laravel-datatables-fractal", + "version": "v12.0.1", + "source": { + "type": "git", + "url": "https://github.com/yajra/laravel-datatables-fractal.git", + "reference": "c193c77a42820dbe7a59aec9a61fed2a93fb6031" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yajra/laravel-datatables-fractal/zipball/c193c77a42820dbe7a59aec9a61fed2a93fb6031", + "reference": "c193c77a42820dbe7a59aec9a61fed2a93fb6031", + "shasum": "" + }, + "require": { + "league/fractal": "^0.20.1", + "php": "^8.2", + "yajra/laravel-datatables-oracle": "^12" + }, + "require-dev": { + "larastan/larastan": "^3.1", + "laravel/pint": "^1.21", + "orchestra/testbench": "^10", + "rector/rector": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Yajra\\DataTables\\FractalServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yajra\\DataTables\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arjay Angeles", + "email": "aqangeles@gmail.com" + } + ], + "description": "Laravel DataTables Fractal Plugin.", + "keywords": [ + "api", + "datatables", + "fractal", + "laravel" + ], + "support": { + "issues": "https://github.com/yajra/laravel-datatables-fractal/issues", + "source": "https://github.com/yajra/laravel-datatables-fractal/tree/v12.0.1" + }, + "time": "2025-12-30T15:22:09+00:00" + }, + { + "name": "yajra/laravel-datatables-html", + "version": "v12.7.0", + "source": { + "type": "git", + "url": "https://github.com/yajra/laravel-datatables-html.git", + "reference": "8d3a3041f1f33e2f34647942be6b0f9fe321a05c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yajra/laravel-datatables-html/zipball/8d3a3041f1f33e2f34647942be6b0f9fe321a05c", + "reference": "8d3a3041f1f33e2f34647942be6b0f9fe321a05c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^8.2", + "yajra/laravel-datatables-oracle": "^12.0" + }, + "require-dev": { + "larastan/larastan": "^3.1", + "laravel/pint": "^1.21", + "livewire/livewire": "^3.4|^4.0", + "orchestra/testbench": "^10", + "rector/rector": "^2.0" + }, + "suggest": { + "laravel/livewire": "Required for Livewire layout support." + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Yajra\\DataTables\\HtmlServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "psr-4": { + "Yajra\\DataTables\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arjay Angeles", + "email": "aqangeles@gmail.com" + } + ], + "description": "Laravel DataTables HTML builder plugin", + "keywords": [ + "JS", + "datatables", + "html", + "jquery", + "laravel", + "yajra" + ], + "support": { + "issues": "https://github.com/yajra/laravel-datatables-html/issues", + "source": "https://github.com/yajra/laravel-datatables-html/tree/v12.7.0" + }, + "funding": [ + { + "url": "https://www.paypal.me/yajra", + "type": "custom" + }, + { + "url": "https://github.com/yajra", + "type": "github" + }, + { + "url": "https://www.patreon.com/yajra", + "type": "patreon" + } + ], + "time": "2026-01-23T06:41:02+00:00" + }, + { + "name": "yajra/laravel-datatables-oracle", + "version": "v12.7.0", + "source": { + "type": "git", + "url": "https://github.com/yajra/laravel-datatables.git", + "reference": "1e4251feeb21f17a817ae06ed29ec91338641868" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/yajra/laravel-datatables/zipball/1e4251feeb21f17a817ae06ed29ec91338641868", + "reference": "1e4251feeb21f17a817ae06ed29ec91338641868", + "shasum": "" + }, + "require": { + "illuminate/database": "^12", + "illuminate/filesystem": "^12", + "illuminate/http": "^12", + "illuminate/support": "^12", + "illuminate/view": "^12", + "php": "^8.2" + }, + "require-dev": { + "algolia/algoliasearch-client-php": "^3.4.1", + "larastan/larastan": "^3.1.0", + "laravel/pint": "^1.14", + "laravel/scout": "^10.8.3", + "meilisearch/meilisearch-php": "^1.6.1", + "orchestra/testbench": "^10", + "rector/rector": "^2.0" + }, + "suggest": { + "yajra/laravel-datatables-buttons": "Plugin for server-side exporting of dataTables.", + "yajra/laravel-datatables-editor": "Plugin to use DataTables Editor (requires a license).", + "yajra/laravel-datatables-export": "Plugin for server-side exporting using livewire and queue worker.", + "yajra/laravel-datatables-fractal": "Plugin for server-side response using Fractal.", + "yajra/laravel-datatables-html": "Plugin for server-side HTML builder of dataTables." + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "DataTables": "Yajra\\DataTables\\Facades\\DataTables" + }, + "providers": [ + "Yajra\\DataTables\\DataTablesServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "12.x-dev" + } + }, + "autoload": { + "files": [ + "src/helper.php" + ], + "psr-4": { + "Yajra\\DataTables\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Arjay Angeles", + "email": "aqangeles@gmail.com" + } + ], + "description": "jQuery DataTables API for Laravel", + "keywords": [ + "datatables", + "jquery", + "laravel", + "yajra" + ], + "support": { + "issues": "https://github.com/yajra/laravel-datatables/issues", + "source": "https://github.com/yajra/laravel-datatables/tree/v12.7.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/yajra", + "type": "github" + } + ], + "time": "2026-02-20T15:00:37+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.24.1", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" + }, + "time": "2024-11-21T13:46:39+00:00" + }, + { + "name": "filp/whoops", + "version": "2.18.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "reference": "d2102955e48b9fd9ab24280a7ad12ed552752c4d", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.18.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2025-08-08T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.1.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" + }, + "time": "2025-04-30T06:54:44+00:00" + }, + { + "name": "laravel/pail", + "version": "v1.2.6", + "source": { + "type": "git", + "url": "https://github.com/laravel/pail.git", + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pail/zipball/aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", + "reference": "aa71a01c309e7f66bc2ec4fb1a59291b82eb4abf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "illuminate/console": "^10.24|^11.0|^12.0|^13.0", + "illuminate/contracts": "^10.24|^11.0|^12.0|^13.0", + "illuminate/log": "^10.24|^11.0|^12.0|^13.0", + "illuminate/process": "^10.24|^11.0|^12.0|^13.0", + "illuminate/support": "^10.24|^11.0|^12.0|^13.0", + "nunomaduro/termwind": "^1.15|^2.0", + "php": "^8.2", + "symfony/console": "^6.0|^7.0|^8.0" + }, + "require-dev": { + "laravel/framework": "^10.24|^11.0|^12.0|^13.0", + "laravel/pint": "^1.13", + "orchestra/testbench-core": "^8.13|^9.17|^10.8|^11.0", + "pestphp/pest": "^2.20|^3.0|^4.0", + "pestphp/pest-plugin-type-coverage": "^2.3|^3.0|^4.0", + "phpstan/phpstan": "^1.12.27", + "symfony/var-dumper": "^6.3|^7.0|^8.0", + "symfony/yaml": "^6.3|^7.0|^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Pail\\PailServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Pail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Easily delve into your Laravel application's log files directly from the command line.", + "homepage": "https://github.com/laravel/pail", + "keywords": [ + "dev", + "laravel", + "logs", + "php", + "tail" + ], + "support": { + "issues": "https://github.com/laravel/pail/issues", + "source": "https://github.com/laravel/pail" + }, + "time": "2026-02-09T13:44:54+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/pint.git", + "reference": "bdec963f53172c5e36330f3a400604c69bf02d39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/pint/zipball/bdec963f53172c5e36330f3a400604c69bf02d39", + "reference": "bdec963f53172c5e36330f3a400604c69bf02d39", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.2.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.94.2", + "illuminate/view": "^12.54.1", + "larastan/larastan": "^3.9.3", + "laravel-zero/framework": "^12.0.5", + "mockery/mockery": "^1.6.12", + "nunomaduro/termwind": "^2.4.0", + "pestphp/pest": "^3.8.6", + "shipfastlabs/agent-detector": "^1.1.0" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "dev", + "format", + "formatter", + "lint", + "linter", + "php" + ], + "support": { + "issues": "https://github.com/laravel/pint/issues", + "source": "https://github.com/laravel/pint" + }, + "time": "2026-03-12T15:51:39+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.53.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/sail.git", + "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sail/zipball/e340eaa2bea9b99192570c48ed837155dbf24fbb", + "reference": "e340eaa2bea9b99192570c48ed837155dbf24fbb", + "shasum": "" + }, + "require": { + "illuminate/console": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/contracts": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^9.52.16|^10.0|^11.0|^12.0|^13.0", + "php": "^8.0", + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/yaml": "^6.0|^7.0|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^7.0|^8.0|^9.0|^10.0|^11.0", + "phpstan/phpstan": "^2.0" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/sail/issues", + "source": "https://github.com/laravel/sail" + }, + "time": "2026-02-06T12:16:02+00:00" + }, + { + "name": "laravel/sentinel", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/sentinel.git", + "reference": "7a98db53e0d9d6f61387f3141c07477f97425603" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/sentinel/zipball/7a98db53e0d9d6f61387f3141c07477f97425603", + "reference": "7a98db53e0d9d6f61387f3141c07477f97425603", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/container": "^8.37|^9.0|^10.0|^11.0|^12.0|^13.0", + "php": "^8.0" + }, + "require-dev": { + "laravel/pint": "^1.27", + "orchestra/testbench": "^6.47.1|^7.56|^8.37|^9.16|^10.9|^11.0", + "phpstan/phpstan": "^2.1.33" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Sentinel\\SentinelServiceProvider" + ] + }, + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sentinel\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mior Muhammad Zaki", + "email": "mior@laravel.com" + } + ], + "support": { + "source": "https://github.com/laravel/sentinel/tree/v1.0.1" + }, + "time": "2026-02-12T13:32:54+00:00" + }, + { + "name": "laravel/telescope", + "version": "v5.18.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/telescope.git", + "reference": "6e2aead19de0efb767f703559cc6539036b7fc59" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/telescope/zipball/6e2aead19de0efb767f703559cc6539036b7fc59", + "reference": "6e2aead19de0efb767f703559cc6539036b7fc59", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": "^8.37|^9.0|^10.0|^11.0|^12.0|^13.0", + "laravel/sentinel": "^1.0", + "php": "^8.0", + "symfony/console": "^5.3|^6.0|^7.0", + "symfony/var-dumper": "^5.0|^6.0|^7.0" + }, + "require-dev": { + "ext-gd": "*", + "guzzlehttp/guzzle": "^6.0|^7.0", + "laravel/octane": "^1.4|^2.0", + "orchestra/testbench": "^6.47.1|^7.55|^8.36|^9.15|^10.8|^11.0", + "phpstan/phpstan": "^1.10" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Telescope\\TelescopeServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Telescope\\": "src/", + "Laravel\\Telescope\\Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Mohamed Said", + "email": "mohamed@laravel.com" + } + ], + "description": "An elegant debug assistant for the Laravel framework.", + "keywords": [ + "debugging", + "laravel", + "monitoring" + ], + "support": { + "issues": "https://github.com/laravel/telescope/issues", + "source": "https://github.com/laravel/telescope/tree/v5.18.0" + }, + "time": "2026-03-05T15:53:11+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.12", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "docs": "https://docs.mockery.io/", + "issues": "https://github.com/mockery/mockery/issues", + "rss": "https://github.com/mockery/mockery/releases.atom", + "security": "https://github.com/mockery/mockery/security/advisories", + "source": "https://github.com/mockery/mockery" + }, + "time": "2024-05-16T03:13:13+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.13.4", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-08-01T08:46:24+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v8.9.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.18.4", + "nunomaduro/termwind": "^2.4.0", + "php": "^8.2.0", + "symfony/console": "^7.4.4 || ^8.0.4" + }, + "conflict": { + "laravel/framework": "<11.48.0 || >=14.0.0", + "phpunit/phpunit": "<11.5.50 || >=14.0.0" + }, + "require-dev": { + "brianium/paratest": "^7.8.5", + "larastan/larastan": "^3.9.2", + "laravel/framework": "^11.48.0 || ^12.52.0", + "laravel/pint": "^1.27.1", + "orchestra/testbench-core": "^9.12.0 || ^10.9.0", + "pestphp/pest": "^3.8.5 || ^4.4.1 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.0.3 || ^9.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + }, + "branch-alias": { + "dev-8.x": "8.x-dev" + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "dev", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2026-02-17T17:33:08+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.12", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56", + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.7.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.1", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.3.1" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.46" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" + } + ], + "time": "2025-12-24T07:01:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" + } + ], + "time": "2026-02-02T13:52:54+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:07:44+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:08:43+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:09:35+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.5.55", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/adc7262fccc12de2b30f12a8aa0b33775d814f00", + "reference": "adc7262fccc12de2b30f12a8aa0b33775d814f00", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.4", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.12", + "phpunit/php-file-iterator": "^5.1.1", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.3", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.2", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/recursion-context": "^6.0.3", + "sebastian/type": "^5.1.3", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.55" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2026-02-18T12:37:06+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-19T07:56:08+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:45:54+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" + } + ], + "time": "2026-01-24T09:26:40+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:49:50+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:53:05+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2025-05-21T11:55:47+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.3.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" + } + ], + "time": "2025-09-24T06:12:51+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:57:36+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:58:38+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:00:13+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:01:32+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" + } + ], + "time": "2025-08-13T04:42:22+00:00" + }, + { + "name": "sebastian/type", + "version": "5.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" + } + ], + "time": "2025-08-09T06:55:48+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-09T05:16:32+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.4.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.4.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-02-09T09:33:46+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-11-17T20:03:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.2", + "ext-json": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..6e9d02f --- /dev/null +++ b/config/app.php @@ -0,0 +1,137 @@ + env('APP_NAME', 'Vechsa-LIS'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool) env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | the application so that it's available within Artisan commands. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. The timezone + | is set to "UTC" by default as it is suitable for most use cases. + | + */ + + 'timezone' => 'Asia/Bangkok', + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by Laravel's translation / localization methods. This option can be + | set to any locale for which you plan to have translation strings. + | + */ + + 'locale' => env('APP_LOCALE', 'kh'), + + 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), + + 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is utilized by Laravel's encryption services and should be set + | to a random, 32 character string to ensure that all encrypted values + | are secure. You should do this prior to deploying the application. + | + */ + + + 'available_locales' => [ + 'English' => 'en', + 'Khmer' => 'kh' + ], + + 'cipher' => 'AES-256-CBC', + + 'key' => env('APP_KEY'), + + 'previous_keys' => [ + ...array_filter( + explode(',', (string) env('APP_PREVIOUS_KEYS', '')) + ), + ], + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => env('APP_MAINTENANCE_DRIVER', 'file'), + 'store' => env('APP_MAINTENANCE_STORE', 'database'), + ], + + + + + + +]; diff --git a/config/auth.php b/config/auth.php new file mode 100644 index 0000000..7d1eb0d --- /dev/null +++ b/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => env('AUTH_GUARD', 'web'), + 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | which utilizes session storage plus the Eloquent user provider. + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication guards have a user provider, which defines how the + | users are actually retrieved out of your database or other storage + | system used by the application. Typically, Eloquent is utilized. + | + | If you have multiple user tables or models you may configure multiple + | providers to represent the model / table. These providers may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => env('AUTH_MODEL', App\Models\User::class), + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | These configuration options specify the behavior of Laravel's password + | reset functionality, including the table utilized for token storage + | and the user provider that is invoked to actually retrieve users. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the number of seconds before a password confirmation + | window expires and users are asked to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), + +]; diff --git a/config/broadcasting.php b/config/broadcasting.php new file mode 100644 index 0000000..3bba110 --- /dev/null +++ b/config/broadcasting.php @@ -0,0 +1,59 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'useTLS' => true, + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/config/cache.php b/config/cache.php new file mode 100644 index 0000000..b32aead --- /dev/null +++ b/config/cache.php @@ -0,0 +1,117 @@ + env('CACHE_STORE', 'database'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "array", "database", "file", "memcached", + | "redis", "dynamodb", "octane", + | "failover", "null" + | + */ + + 'stores' => [ + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_CACHE_CONNECTION'), + 'table' => env('DB_CACHE_TABLE', 'cache'), + 'lock_connection' => env('DB_CACHE_LOCK_CONNECTION'), + 'lock_table' => env('DB_CACHE_LOCK_TABLE'), + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_CACHE_CONNECTION', 'cache'), + 'lock_connection' => env('REDIS_CACHE_LOCK_CONNECTION', 'default'), + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + 'failover' => [ + 'driver' => 'failover', + 'stores' => [ + 'database', + 'array', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, and DynamoDB cache + | stores, there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-cache-'), + +]; diff --git a/config/cors.php b/config/cors.php new file mode 100644 index 0000000..558369d --- /dev/null +++ b/config/cors.php @@ -0,0 +1,34 @@ + ['api/*'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..df933e7 --- /dev/null +++ b/config/database.php @@ -0,0 +1,183 @@ + env('DB_CONNECTION', 'sqlite'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Below are all of the database connections defined for your application. + | An example configuration is provided for each database system which + | is supported by Laravel. You're free to add / remove connections. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DB_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + 'busy_timeout' => null, + 'journal_mode' => null, + 'synchronous' => null, + 'transaction_mode' => 'DEFERRED', + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + (PHP_VERSION_ID >= 80500 ? \Pdo\Mysql::ATTR_SSL_CA : \PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'mariadb' => [ + 'driver' => 'mariadb', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => env('DB_CHARSET', 'utf8mb4'), + 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + (PHP_VERSION_ID >= 80500 ? \Pdo\Mysql::ATTR_SSL_CA : \PDO::MYSQL_ATTR_SSL_CA) => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => env('DB_SSLMODE', 'prefer'), + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DB_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'laravel'), + 'username' => env('DB_USERNAME', 'root'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => env('DB_CHARSET', 'utf8'), + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run on the database. + | + */ + + 'migrations' => [ + 'table' => 'migrations', + 'update_date_on_publish' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as Memcached. You may define your connection settings here. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug((string) env('APP_NAME', 'laravel')).'-database-'), + 'persistent' => env('REDIS_PERSISTENT', false), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + 'max_retries' => env('REDIS_MAX_RETRIES', 3), + 'backoff_algorithm' => env('REDIS_BACKOFF_ALGORITHM', 'decorrelated_jitter'), + 'backoff_base' => env('REDIS_BACKOFF_BASE', 100), + 'backoff_cap' => env('REDIS_BACKOFF_CAP', 1000), + ], + + ], + +]; diff --git a/config/excel.php b/config/excel.php new file mode 100644 index 0000000..987883e --- /dev/null +++ b/config/excel.php @@ -0,0 +1,333 @@ + [ + + /* + |-------------------------------------------------------------------------- + | Chunk size + |-------------------------------------------------------------------------- + | + | When using FromQuery, the query is automatically chunked. + | Here you can specify how big the chunk should be. + | + */ + 'chunk_size' => 1000, + + /* + |-------------------------------------------------------------------------- + | Pre-calculate formulas during export + |-------------------------------------------------------------------------- + */ + 'pre_calculate_formulas' => false, + + /* + |-------------------------------------------------------------------------- + | Enable strict null comparison + |-------------------------------------------------------------------------- + | + | When enabling strict null comparison empty cells ('') will + | be added to the sheet. + */ + 'strict_null_comparison' => false, + + /* + |-------------------------------------------------------------------------- + | CSV Settings + |-------------------------------------------------------------------------- + | + | Configure e.g. delimiter, enclosure and line ending for CSV exports. + | + */ + 'csv' => [ + 'delimiter' => ',', + 'enclosure' => '"', + 'line_ending' => PHP_EOL, + 'use_bom' => false, + 'include_separator_line' => false, + 'excel_compatibility' => false, + 'output_encoding' => '', + 'test_auto_detect' => true, + ], + + /* + |-------------------------------------------------------------------------- + | Worksheet properties + |-------------------------------------------------------------------------- + | + | Configure e.g. default title, creator, subject,... + | + */ + 'properties' => [ + 'creator' => '', + 'lastModifiedBy' => '', + 'title' => '', + 'description' => '', + 'subject' => '', + 'keywords' => '', + 'category' => '', + 'manager' => '', + 'company' => '', + ], + ], + + 'imports' => [ + + /* + |-------------------------------------------------------------------------- + | Read Only + |-------------------------------------------------------------------------- + | + | When dealing with imports, you might only be interested in the + | data that the sheet exists. By default we ignore all styles, + | however if you want to do some logic based on style data + | you can enable it by setting read_only to false. + | + */ + 'read_only' => true, + + /* + |-------------------------------------------------------------------------- + | Ignore Empty + |-------------------------------------------------------------------------- + | + | When dealing with imports, you might be interested in ignoring + | rows that have null values or empty strings. By default rows + | containing empty strings or empty values are not ignored but can be + | ignored by enabling the setting ignore_empty to true. + | + */ + 'ignore_empty' => false, + + /* + |-------------------------------------------------------------------------- + | Heading Row Formatter + |-------------------------------------------------------------------------- + | + | Configure the heading row formatter. + | Available options: none|slug|custom + | + */ + 'heading_row' => [ + 'formatter' => 'slug', + ], + + /* + |-------------------------------------------------------------------------- + | CSV Settings + |-------------------------------------------------------------------------- + | + | Configure e.g. delimiter, enclosure and line ending for CSV imports. + | + */ + 'csv' => [ + 'delimiter' => null, + 'enclosure' => '"', + 'escape_character' => '\\', + 'contiguous' => false, + 'input_encoding' => 'UTF-8', + ], + + /* + |-------------------------------------------------------------------------- + | Worksheet properties + |-------------------------------------------------------------------------- + | + | Configure e.g. default title, creator, subject,... + | + */ + 'properties' => [ + 'creator' => '', + 'lastModifiedBy' => '', + 'title' => '', + 'description' => '', + 'subject' => '', + 'keywords' => '', + 'category' => '', + 'manager' => '', + 'company' => '', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Extension detector + |-------------------------------------------------------------------------- + | + | Configure here which writer/reader type should be used when the package + | needs to guess the correct type based on the extension alone. + | + */ + 'extension_detector' => [ + 'xlsx' => Excel::XLSX, + 'xlsm' => Excel::XLSX, + 'xltx' => Excel::XLSX, + 'xltm' => Excel::XLSX, + 'xls' => Excel::XLS, + 'xlt' => Excel::XLS, + 'ods' => Excel::ODS, + 'ots' => Excel::ODS, + 'slk' => Excel::SLK, + 'xml' => Excel::XML, + 'gnumeric' => Excel::GNUMERIC, + 'htm' => Excel::HTML, + 'html' => Excel::HTML, + 'csv' => Excel::CSV, + 'tsv' => Excel::TSV, + + /* + |-------------------------------------------------------------------------- + | PDF Extension + |-------------------------------------------------------------------------- + | + | Configure here which Pdf driver should be used by default. + | Available options: Excel::MPDF | Excel::TCPDF | Excel::DOMPDF + | + */ + 'pdf' => Excel::DOMPDF, + ], + + /* + |-------------------------------------------------------------------------- + | Value Binder + |-------------------------------------------------------------------------- + | + | PhpSpreadsheet offers a way to hook into the process of a value being + | written to a cell. In there some assumptions are made on how the + | value should be formatted. If you want to change those defaults, + | you can implement your own default value binder. + | + | Possible value binders: + | + | [x] Maatwebsite\Excel\DefaultValueBinder::class + | [x] PhpOffice\PhpSpreadsheet\Cell\StringValueBinder::class + | [x] PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder::class + | + */ + 'value_binder' => [ + 'default' => Maatwebsite\Excel\DefaultValueBinder::class, + ], + + 'cache' => [ + /* + |-------------------------------------------------------------------------- + | Default cell caching driver + |-------------------------------------------------------------------------- + | + | By default PhpSpreadsheet keeps all cell values in memory, however when + | dealing with large files, this might result into memory issues. If you + | want to mitigate that, you can configure a cell caching driver here. + | When using the illuminate driver, it will store each value in the + | cache store. This can slow down the process, because it needs to + | store each value. You can use the "batch" store if you want to + | only persist to the store when the memory limit is reached. + | + | Drivers: memory|illuminate|batch + | + */ + 'driver' => 'memory', + + /* + |-------------------------------------------------------------------------- + | Batch memory caching + |-------------------------------------------------------------------------- + | + | When dealing with the "batch" caching driver, it will only + | persist to the store when the memory limit is reached. + | Here you can tweak the memory limit to your liking. + | + */ + 'batch' => [ + 'memory_limit' => 60000, + ], + + /* + |-------------------------------------------------------------------------- + | Illuminate cache + |-------------------------------------------------------------------------- + | + | When using the "illuminate" caching driver, it will automatically use + | your default cache store. However if you prefer to have the cell + | cache on a separate store, you can configure the store name here. + | You can use any store defined in your cache config. When leaving + | at "null" it will use the default store. + | + */ + 'illuminate' => [ + 'store' => null, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Transaction Handler + |-------------------------------------------------------------------------- + | + | By default the import is wrapped in a transaction. This is useful + | for when an import may fail and you want to retry it. With the + | transactions, the previous import gets rolled-back. + | + | You can disable the transaction handler by setting this to null. + | Or you can choose a custom made transaction handler here. + | + | Supported handlers: null|db + | + */ + 'transactions' => [ + 'handler' => 'db', + 'db' => [ + 'connection' => null, + ], + ], + + 'temporary_files' => [ + + /* + |-------------------------------------------------------------------------- + | Local Temporary Path + |-------------------------------------------------------------------------- + | + | When exporting and importing files, we use a temporary file, before + | storing reading or downloading. Here you can customize that path. + | + */ + 'local_path' => storage_path('framework/cache/laravel-excel'), + + /* + |-------------------------------------------------------------------------- + | Remote Temporary Disk + |-------------------------------------------------------------------------- + | + | When dealing with a multi server setup with queues in which you + | cannot rely on having a shared local temporary path, you might + | want to store the temporary file on a shared disk. During the + | queue executing, we'll retrieve the temporary file from that + | location instead. When left to null, it will always use + | the local path. This setting only has effect when using + | in conjunction with queued imports and exports. + | + */ + 'remote_disk' => null, + 'remote_prefix' => null, + + /* + |-------------------------------------------------------------------------- + | Force Resync + |-------------------------------------------------------------------------- + | + | When dealing with a multi server setup as above, it's possible + | for the clean up that occurs after entire queue has been run to only + | cleanup the server that the last AfterImportJob runs on. The rest of the server + | would still have the local temporary file stored on it. In this case your + | local storage limits can be exceeded and future imports won't be processed. + | To mitigate this you can set this config value to be true, so that after every + | queued chunk is processed the local temporary file is deleted on the server that + | processed it. + | + */ + 'force_resync_remote' => null, + ], +]; diff --git a/config/filesystems.php b/config/filesystems.php new file mode 100644 index 0000000..37d8fca --- /dev/null +++ b/config/filesystems.php @@ -0,0 +1,80 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Below you may configure as many filesystem disks as necessary, and you + | may even configure multiple disks for the same driver. Examples for + | most supported storage drivers are configured here for reference. + | + | Supported drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app/private'), + 'serve' => true, + 'throw' => false, + 'report' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => rtrim(env('APP_URL', 'http://localhost'), '/').'/storage', + 'visibility' => 'public', + 'throw' => false, + 'report' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + 'report' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/config/labis.php b/config/labis.php new file mode 100644 index 0000000..7674c91 --- /dev/null +++ b/config/labis.php @@ -0,0 +1,51 @@ + [ + 'perpage' => 20, + ], + + 'auto_complete_items' => [ + 'Positive ', + 'Negative ', + 'Normal ', + 'Abnormal', + 'POSITIVE ', + 'NEGATIVE ', + 'Trace', + '(1+)', + '(2+)', + '(3+)', + ], + 'baseManagerMenus' =>[ + 'department', + 'sample-type', + 'test', + 'comment', + 'organism', + 'antibiotic', + 'quantity', + 'ward', + 'hospital-service', + 'patient-type', + 'physician', + 'lab-users' + ], + + 'administrator' => [ + 'concept-code', + 'publication', + 'hospital', + 'user', + 'role', + 'clone-hospital' + ], + + 'sample' => [ + 'sample', + 'requested' + ], + + +]; diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000..225e7ab --- /dev/null +++ b/config/logging.php @@ -0,0 +1,118 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['daily'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => 'debug', + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => 'debug', + 'days' => 14, + ], + + 'account_creation' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/account_creation.log'), + 'level' => 'debug', + 'days' => 60, + ], + + 'jobs' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/job_run.log'), + 'level' => 'debug', + 'days' => 60, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => 'critical', + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => 'debug', + 'handler' => SyslogUdpHandler::class, + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + ], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => 'debug', + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => 'debug', + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + ], + +]; diff --git a/config/mail.php b/config/mail.php new file mode 100644 index 0000000..522b284 --- /dev/null +++ b/config/mail.php @@ -0,0 +1,118 @@ + env('MAIL_MAILER', 'log'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers that can be used + | when delivering an email. You may specify which one you're using for + | your mailers below. You may also add additional mailers if needed. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "resend", "log", "array", + | "failover", "roundrobin" + | + */ + + 'mailers' => [ + + 'smtp' => [ + 'transport' => 'smtp', + 'scheme' => env('MAIL_SCHEME'), + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', '127.0.0.1'), + 'port' => env('MAIL_PORT', 2525), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN', parse_url((string) env('APP_URL', 'http://localhost'), PHP_URL_HOST)), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'message_stream_id' => env('POSTMARK_MESSAGE_STREAM_ID'), + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'resend' => [ + 'transport' => 'resend', + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + 'retry_after' => 60, + ], + + 'roundrobin' => [ + 'transport' => 'roundrobin', + 'mailers' => [ + 'ses', + 'postmark', + ], + 'retry_after' => 60, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all emails sent by your application to be sent from + | the same address. Here you may specify a name and address that is + | used globally for all emails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + +]; diff --git a/config/queue.php b/config/queue.php new file mode 100644 index 0000000..79c2c0a --- /dev/null +++ b/config/queue.php @@ -0,0 +1,129 @@ + env('QUEUE_CONNECTION', 'database'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection options for every queue backend + | used by your application. An example configuration is provided for + | each backend supported by Laravel. You're also free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", + | "deferred", "background", "failover", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'connection' => env('DB_QUEUE_CONNECTION'), + 'table' => env('DB_QUEUE_TABLE', 'jobs'), + 'queue' => env('DB_QUEUE', 'default'), + 'retry_after' => (int) env('DB_QUEUE_RETRY_AFTER', 90), + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => env('BEANSTALKD_QUEUE_HOST', 'localhost'), + 'queue' => env('BEANSTALKD_QUEUE', 'default'), + 'retry_after' => (int) env('BEANSTALKD_QUEUE_RETRY_AFTER', 90), + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => env('REDIS_QUEUE_CONNECTION', 'default'), + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => (int) env('REDIS_QUEUE_RETRY_AFTER', 90), + 'block_for' => null, + 'after_commit' => false, + ], + + 'deferred' => [ + 'driver' => 'deferred', + ], + + 'background' => [ + 'driver' => 'background', + ], + + 'failover' => [ + 'driver' => 'failover', + 'connections' => [ + 'database', + 'deferred', + ], + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control how and where failed jobs are stored. Laravel ships with + | support for storing failed jobs in a simple file or in a database. + | + | Supported drivers: "database-uuids", "dynamodb", "file", "null" + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'sqlite'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/config/services.php b/config/services.php new file mode 100644 index 0000000..6a90eb8 --- /dev/null +++ b/config/services.php @@ -0,0 +1,38 @@ + [ + 'key' => env('POSTMARK_API_KEY'), + ], + + 'resend' => [ + 'key' => env('RESEND_API_KEY'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + + 'slack' => [ + 'notifications' => [ + 'bot_user_oauth_token' => env('SLACK_BOT_USER_OAUTH_TOKEN'), + 'channel' => env('SLACK_BOT_USER_DEFAULT_CHANNEL'), + ], + ], + +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..5b541b7 --- /dev/null +++ b/config/session.php @@ -0,0 +1,217 @@ + env('SESSION_DRIVER', 'database'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to expire immediately when the browser is closed then you may + | indicate that via the expire_on_close configuration option. + | + */ + + 'lifetime' => (int) env('SESSION_LIFETIME', 120), + + 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false), + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it's stored. All encryption is performed + | automatically by Laravel and you may use the session like normal. + | + */ + + 'encrypt' => env('SESSION_ENCRYPT', false), + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When utilizing the "file" session driver, the session files are placed + | on disk. The default storage location is defined here; however, you + | are free to provide another location where they should be stored. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table to + | be used to store sessions. Of course, a sensible default is defined + | for you; however, you're welcome to change this to another table. + | + */ + + 'table' => env('SESSION_TABLE', 'sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | When using one of the framework's cache driven session backends, you may + | define the cache store which should be used to store the session data + | between requests. This must match one of your defined cache stores. + | + | Affects: "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the session cookie that is created by + | the framework. Typically, you should not need to change this value + | since doing so does not grant a meaningful security improvement. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug((string) env('APP_NAME', 'laravel')).'-session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application, but you're free to change this when necessary. + | + */ + + 'path' => env('SESSION_PATH', '/'), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | This value determines the domain and subdomains the session cookie is + | available to. By default, the cookie will be available to the root + | domain without subdomains. Typically, this shouldn't be changed. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. It's unlikely you should disable this option. + | + */ + + 'http_only' => env('SESSION_HTTP_ONLY', true), + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" to permit secure cross-site requests. + | + | See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => env('SESSION_SAME_SITE', 'lax'), + + /* + |-------------------------------------------------------------------------- + | Partitioned Cookies + |-------------------------------------------------------------------------- + | + | Setting this value to true will tie the cookie to the top-level site for + | a cross-site context. Partitioned cookies are accepted by the browser + | when flagged "secure" and the Same-Site attribute is set to "none". + | + */ + + 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), + +]; diff --git a/config/telegram.php b/config/telegram.php new file mode 100644 index 0000000..807d7ca --- /dev/null +++ b/config/telegram.php @@ -0,0 +1,191 @@ + [ + 'labonak_bot' => [ + 'token' => env('TELEGRAM_BOT_TOKEN',''), + 'webhook_url' => env('TELEGRAM_WEBHOOK_URL',''), + ] + ], + + /* + |-------------------------------------------------------------------------- + | Default Bot Name + |-------------------------------------------------------------------------- + | + | Here you may specify which of the bots you wish to use as + | your default bot for regular use. + | + */ + 'default' => 'labonak_bot', + + /* + |-------------------------------------------------------------------------- + | Asynchronous Requests [Optional] + |-------------------------------------------------------------------------- + | + | When set to True, All the requests would be made non-blocking (Async). + | + | Default: false + | Possible Values: (Boolean) "true" OR "false" + | + */ + 'async_requests' => env('TELEGRAM_ASYNC_REQUESTS', false), + + /* + |-------------------------------------------------------------------------- + | HTTP Client Handler [Optional] + |-------------------------------------------------------------------------- + | + | If you'd like to use a custom HTTP Client Handler. + | Should be an instance of \Telegram\Bot\HttpClients\HttpClientInterface + | + | Default: GuzzlePHP + | + */ + 'http_client_handler' => null, + + /* + |-------------------------------------------------------------------------- + | Resolve Injected Dependencies in commands [Optional] + |-------------------------------------------------------------------------- + | + | Using Laravel's IoC container, we can easily type hint dependencies in + | our command's constructor and have them automatically resolved for us. + | + | Default: true + | Possible Values: (Boolean) "true" OR "false" + | + */ + 'resolve_command_dependencies' => true, + + /* + |-------------------------------------------------------------------------- + | Register Telegram Global Commands [Optional] + |-------------------------------------------------------------------------- + | + | If you'd like to use the SDK's built in command handler system, + | You can register all the global commands here. + | + | Global commands will apply to all the bots in system and are always active. + | + | The command class should extend the \Telegram\Bot\Commands\Command class. + | + | Default: The SDK registers, a help command which when a user sends /help + | will respond with a list of available commands and description. + | + */ + 'commands' => [ + Telegram\Bot\Commands\HelpCommand::class, + ], + + /* + |-------------------------------------------------------------------------- + | Command Groups [Optional] + |-------------------------------------------------------------------------- + | + | You can organize a set of commands into groups which can later, + | be re-used across all your bots. + | + | You can create 4 types of groups: + | 1. Group using full path to command classes. + | 2. Group using shared commands: Provide the key name of the shared command + | and the system will automatically resolve to the appropriate command. + | 3. Group using other groups of commands: You can create a group which uses other + | groups of commands to bundle them into one group. + | 4. You can create a group with a combination of 1, 2 and 3 all together in one group. + | + | Examples shown below are by the group type for you to understand each of them. + */ + 'command_groups' => [ + /* // Group Type: 1 + 'commmon' => [ + Acme\Project\Commands\TodoCommand::class, + Acme\Project\Commands\TaskCommand::class, + ], + */ + + /* // Group Type: 2 + 'subscription' => [ + 'start', // Shared Command Name. + 'stop', // Shared Command Name. + ], + */ + + /* // Group Type: 3 + 'auth' => [ + Acme\Project\Commands\LoginCommand::class, + Acme\Project\Commands\SomeCommand::class, + ], + + 'stats' => [ + Acme\Project\Commands\UserStatsCommand::class, + Acme\Project\Commands\SubscriberStatsCommand::class, + Acme\Project\Commands\ReportsCommand::class, + ], + + 'admin' => [ + 'auth', // Command Group Name. + 'stats' // Command Group Name. + ], + */ + + /* // Group Type: 4 + 'myBot' => [ + 'admin', // Command Group Name. + 'subscription', // Command Group Name. + 'status', // Shared Command Name. + 'Acme\Project\Commands\BotCommand' // Full Path to Command Class. + ], + */ + ], + + /* + |-------------------------------------------------------------------------- + | Shared Commands [Optional] + |-------------------------------------------------------------------------- + | + | Shared commands let you register commands that can be shared between, + | one or more bots across the project. + | + | This will help you prevent from having to register same set of commands, + | for each bot over and over again and make it easier to maintain them. + | + | Shared commands are not active by default, You need to use the key name to register them, + | individually in a group of commands or in bot commands. + | Think of this as a central storage, to register, reuse and maintain them across all bots. + | + */ + 'shared_commands' => [ + // 'start' => Acme\Project\Commands\StartCommand::class, + // 'stop' => Acme\Project\Commands\StopCommand::class, + // 'status' => Acme\Project\Commands\StatusCommand::class, + ], +]; diff --git a/config/telescope.php b/config/telescope.php new file mode 100644 index 0000000..f9a10e0 --- /dev/null +++ b/config/telescope.php @@ -0,0 +1,182 @@ + env('TELESCOPE_DOMAIN', null), + + /* + |-------------------------------------------------------------------------- + | Telescope Path + |-------------------------------------------------------------------------- + | + | This is the URI path where Telescope will be accessible from. Feel free + | to change this path to anything you like. Note that the URI will not + | affect the paths of its internal API that aren't exposed to users. + | + */ + + 'path' => env('TELESCOPE_PATH', 'telescope'), + + /* + |-------------------------------------------------------------------------- + | Telescope Storage Driver + |-------------------------------------------------------------------------- + | + | This configuration options determines the storage driver that will + | be used to store Telescope's data. In addition, you may set any + | custom options as needed by the particular driver you choose. + | + */ + + 'driver' => env('TELESCOPE_DRIVER', 'database'), + + 'storage' => [ + 'database' => [ + 'connection' => env('DB_CONNECTION', 'mysql'), + 'chunk' => 1000, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Telescope Master Switch + |-------------------------------------------------------------------------- + | + | This option may be used to disable all Telescope watchers regardless + | of their individual configuration, which simply provides a single + | and convenient way to enable or disable Telescope data storage. + | + */ + + 'enabled' => env('TELESCOPE_ENABLED', true), + + /* + |-------------------------------------------------------------------------- + | Telescope Route Middleware + |-------------------------------------------------------------------------- + | + | These middleware will be assigned to every Telescope route, giving you + | the chance to add your own middleware to this list or change any of + | the existing middleware. Or, you can simply stick with this list. + | + */ + + 'middleware' => [ + 'web', + Authorize::class, + ], + + /* + |-------------------------------------------------------------------------- + | Allowed / Ignored Paths & Commands + |-------------------------------------------------------------------------- + | + | The following array lists the URI paths and Artisan commands that will + | not be watched by Telescope. In addition to this list, some Laravel + | commands, like migrations and queue commands, are always ignored. + | + */ + + 'only_paths' => [ + // 'api/*' + ], + + 'ignore_paths' => [ + 'nova-api*', + ], + + 'ignore_commands' => [ + // + ], + + /* + |-------------------------------------------------------------------------- + | Telescope Watchers + |-------------------------------------------------------------------------- + | + | The following array lists the "watchers" that will be registered with + | Telescope. The watchers gather the application's profile data when + | a request or task is executed. Feel free to customize this list. + | + */ + + 'watchers' => [ + Watchers\BatchWatcher::class => env('TELESCOPE_BATCH_WATCHER', true), + + Watchers\CacheWatcher::class => [ + 'enabled' => env('TELESCOPE_CACHE_WATCHER', true), + 'hidden' => [], + ], + + Watchers\ClientRequestWatcher::class => env('TELESCOPE_CLIENT_REQUEST_WATCHER', true), + + Watchers\CommandWatcher::class => [ + 'enabled' => env('TELESCOPE_COMMAND_WATCHER', true), + 'ignore' => [], + ], + + Watchers\DumpWatcher::class => [ + 'enabled' => env('TELESCOPE_DUMP_WATCHER', true), + 'always' => env('TELESCOPE_DUMP_WATCHER_ALWAYS', false), + ], + + Watchers\EventWatcher::class => [ + 'enabled' => env('TELESCOPE_EVENT_WATCHER', true), + 'ignore' => [], + ], + + Watchers\ExceptionWatcher::class => env('TELESCOPE_EXCEPTION_WATCHER', true), + + Watchers\GateWatcher::class => [ + 'enabled' => env('TELESCOPE_GATE_WATCHER', true), + 'ignore_abilities' => [], + 'ignore_packages' => true, + 'ignore_paths' => [], + ], + + Watchers\JobWatcher::class => env('TELESCOPE_JOB_WATCHER', true), + Watchers\LogWatcher::class => env('TELESCOPE_LOG_WATCHER', true), + Watchers\MailWatcher::class => env('TELESCOPE_MAIL_WATCHER', true), + + Watchers\ModelWatcher::class => [ + 'enabled' => env('TELESCOPE_MODEL_WATCHER', true), + 'events' => ['eloquent.*'], + 'hydrations' => true, + ], + + Watchers\NotificationWatcher::class => env('TELESCOPE_NOTIFICATION_WATCHER', true), + + Watchers\QueryWatcher::class => [ + 'enabled' => env('TELESCOPE_QUERY_WATCHER', true), + 'ignore_packages' => true, + 'ignore_paths' => [], + 'slow' => 100, + ], + + Watchers\RedisWatcher::class => env('TELESCOPE_REDIS_WATCHER', true), + + Watchers\RequestWatcher::class => [ + 'enabled' => env('TELESCOPE_REQUEST_WATCHER', true), + 'size_limit' => env('TELESCOPE_RESPONSE_SIZE_LIMIT', 64), + 'ignore_http_methods' => [], + 'ignore_status_codes' => [], + ], + + Watchers\ScheduleWatcher::class => env('TELESCOPE_SCHEDULE_WATCHER', true), + Watchers\ViewWatcher::class => env('TELESCOPE_VIEW_WATCHER', true), + ], +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..22b8a18 --- /dev/null +++ b/config/view.php @@ -0,0 +1,36 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + +]; diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php new file mode 100644 index 0000000..584104c --- /dev/null +++ b/database/factories/UserFactory.php @@ -0,0 +1,44 @@ + + */ +class UserFactory extends Factory +{ + /** + * The current password being used by the factory. + */ + protected static ?string $password; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => static::$password ??= Hash::make('password'), + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php new file mode 100644 index 0000000..05fb5d9 --- /dev/null +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -0,0 +1,49 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + + Schema::create('password_reset_tokens', function (Blueprint $table) { + $table->string('email')->primary(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + + Schema::create('sessions', function (Blueprint $table) { + $table->string('id')->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->string('ip_address', 45)->nullable(); + $table->text('user_agent')->nullable(); + $table->longText('payload'); + $table->integer('last_activity')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('users'); + Schema::dropIfExists('password_reset_tokens'); + Schema::dropIfExists('sessions'); + } +}; diff --git a/database/migrations/0001_01_01_000001_create_cache_table.php b/database/migrations/0001_01_01_000001_create_cache_table.php new file mode 100644 index 0000000..ed758bd --- /dev/null +++ b/database/migrations/0001_01_01_000001_create_cache_table.php @@ -0,0 +1,35 @@ +string('key')->primary(); + $table->mediumText('value'); + $table->integer('expiration')->index(); + }); + + Schema::create('cache_locks', function (Blueprint $table) { + $table->string('key')->primary(); + $table->string('owner'); + $table->integer('expiration')->index(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('cache'); + Schema::dropIfExists('cache_locks'); + } +}; diff --git a/database/migrations/0001_01_01_000002_create_jobs_table.php b/database/migrations/0001_01_01_000002_create_jobs_table.php new file mode 100644 index 0000000..425e705 --- /dev/null +++ b/database/migrations/0001_01_01_000002_create_jobs_table.php @@ -0,0 +1,57 @@ +id(); + $table->string('queue')->index(); + $table->longText('payload'); + $table->unsignedTinyInteger('attempts'); + $table->unsignedInteger('reserved_at')->nullable(); + $table->unsignedInteger('available_at'); + $table->unsignedInteger('created_at'); + }); + + Schema::create('job_batches', function (Blueprint $table) { + $table->string('id')->primary(); + $table->string('name'); + $table->integer('total_jobs'); + $table->integer('pending_jobs'); + $table->integer('failed_jobs'); + $table->longText('failed_job_ids'); + $table->mediumText('options')->nullable(); + $table->integer('cancelled_at')->nullable(); + $table->integer('created_at'); + $table->integer('finished_at')->nullable(); + }); + + Schema::create('failed_jobs', function (Blueprint $table) { + $table->id(); + $table->string('uuid')->unique(); + $table->text('connection'); + $table->text('queue'); + $table->longText('payload'); + $table->longText('exception'); + $table->timestamp('failed_at')->useCurrent(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + Schema::dropIfExists('job_batches'); + Schema::dropIfExists('failed_jobs'); + } +}; diff --git a/database/migrations/2026_03_14_211002_create_activity_log_table.php b/database/migrations/2026_03_14_211002_create_activity_log_table.php new file mode 100644 index 0000000..7c05bc8 --- /dev/null +++ b/database/migrations/2026_03_14_211002_create_activity_log_table.php @@ -0,0 +1,27 @@ +create(config('activitylog.table_name'), function (Blueprint $table) { + $table->bigIncrements('id'); + $table->string('log_name')->nullable(); + $table->text('description'); + $table->nullableMorphs('subject', 'subject'); + $table->nullableMorphs('causer', 'causer'); + $table->json('properties')->nullable(); + $table->timestamps(); + $table->index('log_name'); + }); + } + + public function down() + { + Schema::connection(config('activitylog.database_connection'))->dropIfExists(config('activitylog.table_name')); + } +} diff --git a/database/migrations/2026_03_14_211003_add_event_column_to_activity_log_table.php b/database/migrations/2026_03_14_211003_add_event_column_to_activity_log_table.php new file mode 100644 index 0000000..7b797fd --- /dev/null +++ b/database/migrations/2026_03_14_211003_add_event_column_to_activity_log_table.php @@ -0,0 +1,22 @@ +table(config('activitylog.table_name'), function (Blueprint $table) { + $table->string('event')->nullable()->after('subject_type'); + }); + } + + public function down() + { + Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) { + $table->dropColumn('event'); + }); + } +} diff --git a/database/migrations/2026_03_14_211004_add_batch_uuid_column_to_activity_log_table.php b/database/migrations/2026_03_14_211004_add_batch_uuid_column_to_activity_log_table.php new file mode 100644 index 0000000..8f7db66 --- /dev/null +++ b/database/migrations/2026_03_14_211004_add_batch_uuid_column_to_activity_log_table.php @@ -0,0 +1,22 @@ +table(config('activitylog.table_name'), function (Blueprint $table) { + $table->uuid('batch_uuid')->nullable()->after('properties'); + }); + } + + public function down() + { + Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) { + $table->dropColumn('batch_uuid'); + }); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..6b901f8 --- /dev/null +++ b/database/seeders/DatabaseSeeder.php @@ -0,0 +1,25 @@ +create(); + + User::factory()->create([ + 'name' => 'Test User', + 'email' => 'test@example.com', + ]); + } +} diff --git a/lang/en/antibiotic.php b/lang/en/antibiotic.php new file mode 100644 index 0000000..fc9fef0 --- /dev/null +++ b/lang/en/antibiotic.php @@ -0,0 +1,26 @@ + 'Antibiotics', + 'search_placeholder' => 'Antibiotic name...', + 'table_no' => 'No.', + 'table_name' => 'Name', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New Antibiotic', + 'form_name' => 'Antibiotic', + 'form_sort' => 'Sort-Order', + 'form_edit_tittle' => 'Edit Antibiotic', + + 'create_success' => 'Antibiotic has been created!', + 'create_fail' => 'An error occur while trying to create antibiotic record. Please try again.', + 'update_success' => 'Antibiotic record has been updated!', + 'update_fail' => 'An error occur while trying to update antibiotic record. Please try again.', + 'delete_success' => 'Antibiotic record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete antibiotic record. Please try again.', + 'restore_success' => 'Antibiotic record has been restored!', + 'restore_fail' => 'An error occur while trying to restore antibiotic record. Please try again.', + 'get_success' => 'Antibiotic record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve antibiotic record. Please try again.' + +]; diff --git a/lang/en/appointment.php b/lang/en/appointment.php new file mode 100644 index 0000000..3c86b71 --- /dev/null +++ b/lang/en/appointment.php @@ -0,0 +1,16 @@ + 'Appointment Type', + 'date' => 'Appointment Date', + 'duration' => 'Duration (days)', + 'patient' => 'Patient', + 'description' => 'Description', + 'doctor' => 'Doctor', + 'create_success' =>'Appointment record has been saved.', + 'create_fail' =>'Failed while saving Appointment record.', + 'update_success' =>'Appointment record has been updated.', + 'update_fail' =>'Failed while updating Appointment record.', + 'delete_success' =>'Appointment record has been deleted.', + 'delete_fail' =>'Failed while deleting Appointment record.', +]; diff --git a/lang/en/auth.php b/lang/en/auth.php new file mode 100644 index 0000000..e5506df --- /dev/null +++ b/lang/en/auth.php @@ -0,0 +1,19 @@ + 'These credentials do not match our records.', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', + +]; diff --git a/lang/en/comment.php b/lang/en/comment.php new file mode 100644 index 0000000..f24b9c2 --- /dev/null +++ b/lang/en/comment.php @@ -0,0 +1,29 @@ + 'Comments', + 'search_placeholder' => 'Comment name..', + 'table_no' => 'No.', + 'table_name' => 'Comment', + 'table_department' => 'Ward', + 'table_sample_type' => 'Sample Type', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New Comment', + 'form_name' => 'Comment', + 'form_sample_type' => 'Sample Type', + 'form_department' => 'Ward', + 'form_edit_tittle' => 'Edit Comment', + + 'create_success' => 'Comment has been created!', + 'create_fail' => 'An error occur while trying to create comment record. Please try again.', + 'update_success' => 'Comment record has been updated!', + 'update_fail' => 'An error occur while trying to update comment record. Please try again.', + 'delete_success' => 'Comment record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete comment record. Please try again.', + 'restore_success' => 'Comment record has been restored!', + 'restore_fail' => 'An error occur while trying to restore comment record. Please try again.', + 'get_success' => 'Comment record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve comment record. Please try again.' + +]; diff --git a/lang/en/department.php b/lang/en/department.php new file mode 100644 index 0000000..e8a2542 --- /dev/null +++ b/lang/en/department.php @@ -0,0 +1,29 @@ + 'Departments', + 'search_placeholder' => 'Department name...', + 'table_no' => 'No', + 'table_name' => 'Department Name', + 'table_sample_type' => 'Sample Type', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New Department', + 'form_name' => 'Name', + 'form_sort' => 'Sort-Order', + 'form_laboratory' => 'Laboratory', + 'form_select_all_lab' => 'Select All Labs', + 'form_edit_tittle' => 'Edit Department', + + 'create_success' => 'Department has been created!', + 'create_fail' => 'An error occur while trying to create department record. Please try again.', + 'update_success' => 'Department record has been updated!', + 'update_fail' => 'An error occur while trying to update department record. Please try again.', + 'delete_success' => 'Department record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete department record. Please try again.', + 'restore_success' => 'Department record has been restored!', + 'restore_fail' => 'An error occur while trying to restore department record. Please try again.', + 'get_success' => 'Department record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve department record. Please try again.' + +]; diff --git a/lang/en/general.php b/lang/en/general.php new file mode 100644 index 0000000..3641c5b --- /dev/null +++ b/lang/en/general.php @@ -0,0 +1,102 @@ + 'Search', + 'btn_add_new' => 'Add New', + 'btn_edit' => 'Modify', + 'btn_delete' => 'Delete', + 'date_placeholder' => 'dd-mm-yyyy', + 'btn_save' => 'Save', + 'btn_cancel' => 'Cancel', + 'confirm_delete_text' => 'Are you sure to remove this record?', + 'confirm_delete_yes' => 'Ok, Delete', + 'confirm_delete_no' => 'Cancel', + 'btn_clear' => 'Reset', + + 'change_lab' => 'Change Lab', + 'profile' => 'My Profile', + 'logout' => 'Sing Out', + + 'today_sample' => ' Today Samples', + 'this_month_sample' => ' This Month Samples', + 'last_month_sample' => ' Last Month Samples', + 'average_sample' => 'Average Samples by Month', + 'today_income' => 'Today Incomes', + 'this_month_income' => 'This Month Incomes', + 'last_month_income' => 'Last Month Incomes', + 'last_year_income' => 'Last Year Incomes', + 'sample_statistic' => 'Sample Statistics', + 'sample_source_statistic' => 'Sample Source statistics', + 'chart_filter_today' => 'Today', + 'chart_filter_this_month' => 'This Month', + 'chart_filter_this_year' => 'This Year', + 'chart_filter_last_year' => 'Last Year', + + 'confirm_delete_record' => 'Are you sure to remove this record?', + 'confirm_ok_delete' => 'Ok, Delete', + 'confirm_cancel' => 'No, Cancel', + 'delete_success' => 'Record delete successful.', + 'delete_failed' => "Can't delete this record.", + 'choose_option' => 'Select Option', + + + 'confirm_restore_record' => 'Are you sure to restore this record?', + 'confirm_ok_restore' => 'Yes', + 'confirm_cancel_restore' => 'No', + + 'type_date_placeholder' => 'mm/dd/yyyy', + 'select2_tag_placeholder' => 'Choose or search something..', + 'select2_no_result' => 'No Option Found', + 'optional' => 'Optional', + 'required' => 'Required', + //new + 'total_samples' => 'Total Samples', + 'total_income' => 'Total Income', + 'total_patient' => 'Total Patient', + 'total_invoice' => 'Total Invoice', + 'total_paid_invoice' => 'Total Paid Invoice', + 'total_unpaid_invoice' => 'Total Unpaid Invoice', + 'total_rejected_sample' => 'Total Rejected Sample', + 'monthly_sample_trend' => 'Monthly Sample Trend', + 'monthly_income_trend' => 'Monthly Income Trend', + 'panel_distribution' => 'This Year Samples Distribute by Panel', + 'sample_source_distribution' => 'This Year Samples Distribute by Sample Source', + + 'manage_user_accounts' => 'Manage User Accounts', + 'manage_user_roles' => 'Manage User Roles', + + 'manage_user_accounts' => 'Manage User Accounts', + 'manage_user_roles' => 'Manage User Roles', + 'laboratory_settings' => 'System Settings', + 'activity_logs' => 'Activity Logs', + 'appointment' => 'Appointment', + 'billing' => 'Billing & Payments', + 'btn_save_patient_add_new_sample' => 'Save & New Sample', + + 'user_name' => 'Login Name', + 'user_role' => 'Role', + 'upload_signature' => 'Upload Signature', + 'signature_image' => 'Signature Image', + 'current_signature' => 'Current Signature', + + 'change_password' => 'Change Password', + 'current_password' => 'Current Password', + 'new_password' => 'New Password', + 'confirm_password' => 'Confirm Password', + 'general_settings' => 'General Settings', + 'result_settings' => 'Result Settings', + + 'notification' => 'Notification', + 'page' => 'page', + + 'contaminant' => 'Contaminant', + + 'sample_entry_by' => 'Entered By', + 'modify_by' => 'Modified By', + + + 'apply_to_all_test' => 'Apply to all tests' + + + +]; diff --git a/lang/en/inventory.php b/lang/en/inventory.php new file mode 100644 index 0000000..a26884d --- /dev/null +++ b/lang/en/inventory.php @@ -0,0 +1,18 @@ + 'Supplier', + 'sp_create_success' => 'Supplier has been created!', + 'sp_create_fail' => 'An error occur while trying to create supplier record. Please try again.', + 'sp_update_success' => 'Supplier record has been updated!', + 'sp_update_fail' => 'An error occur while trying to update supplier record. Please try again.', + 'sp_delete_success' => 'Supplier record has been deleted!', + 'sp_delete_fail' => 'An error occur while trying to delete supplier record. Please try again.', + 'sp_restore_success' => 'Supplier record has been restored!', + 'sp_restore_fail' => 'An error occur while trying to restore supplier record. Please try again.', + 'sp_get_success' => 'Supplier record has been retrieved!', + 'sp_get_fail' => 'An error occur while trying to retrieve supplier record. Please try again.', + +]; diff --git a/lang/en/invoice.php b/lang/en/invoice.php new file mode 100644 index 0000000..7ec2a18 --- /dev/null +++ b/lang/en/invoice.php @@ -0,0 +1,85 @@ + 'Invoices', + 'table_date_filter' => 'Invoice Date Between', + 'table_textable_filter' => 'Or Search by', + 'table_textable_filter_placeholder' => 'Inovice code, sample number, patient code, or phone number', + 'btn_quick_report' => 'Quick Invoice Report', + 'dialy_report' => 'Daily Invoice Report', + 'monthly_invoice_report' => 'Monthly Invoice Report', + 'yearly_invoice_report' => 'Yearly Invoice Report', + 'table_no' => 'No.', + 'table_invoice_code' => 'Invoice No.', + 'table_sample_number' => 'Sample No', + 'table_patient_name' => 'Patient Name', + 'table_invoice_date' => 'Invoice Date', + 'table_total_cost' => 'Sub Total', + 'table_discount' => 'Discount', + 'table_net_cost' => 'Total ($)', + 'table_net_cost_riel' => 'Total (Riel)', + 'table_paid' => 'Paid Amount', + 'table_owe' => 'Owe Amount', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_new_title' => 'New Invoice', + 'form_edit_title'=> 'Edit Invoice', + 'form_patient' => 'Patient', + 'form_invoice_number' => 'Invoice No', + 'form_invoice_date' => 'Invoice Date', + 'form_description' => 'Description', + 'form_qty' => 'Qty', + 'form_unit_price' => 'Unit Price', + 'form_total_amount' => 'Total Amount', + 'form_discount' => 'Discount', + 'form_net_amount' => 'Net Amount', + 'form_paid_amount' => 'Paid Amount', + 'form_paid_date' => 'Paid Date', + 'form_owe_amount' => 'Owe Amount', + 'form_btn_save' => 'Save Invoice', + 'form_btn_generate_invoice' => 'Generate Invoice', + + 'invoice_report_filter' => 'Invoice Report Filters', + 'report_type' => 'Report Type', + 'report_filter' => 'Report Filter', + 'view_report' => 'View Report', + 'daily' => 'Daily', + 'monthly' => 'Monthly', + 'yearly' => 'Yearly', + + 'received_date' => 'Received Date', + + 'paid_by' => 'Customer', + + 'received_by' => 'Cashier', + + 'tittle' => 'Laboratory Invoice', + + 'print' => 'Print', + + 'create_success' => 'Invoice has been created!', + 'create_fail' => 'An error occur while trying to create invoice record. Please try again.', + 'update_success' => 'Invoice record has been updated!', + 'update_fail' => 'An error occur while trying to update invoice record. Please try again.', + 'delete_success' => 'Invoice record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete invoice record. Please try again.', + 'restore_success' => 'Invoice record has been restored!', + 'restore_fail' => 'An error occur while trying to restore invoice record. Please try again.', + 'get_success' => 'Invoice record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve invoice record. Please try again.', + 'form_btn_save_preview' => 'Save & Preview Invoice', + + 'pay_type' => 'Pay Type', + 'bank_name' => 'Bank Name', + 'transaction_no' => 'Transaction No', + 'cash_paid' => 'Cash Pay', + 'bank_paid' => 'Bank Pay', + + 'exchange_rate' => 'Exchange Rate', + 'hide_discount' => 'Hide Discount', + 'refresh_item' => 'Check for items update', + 'repayment' => 'Repayment', + 'repayment_date' => 'Repayment Date' + + +]; diff --git a/lang/en/lab_profile.php b/lang/en/lab_profile.php new file mode 100644 index 0000000..45f43de --- /dev/null +++ b/lang/en/lab_profile.php @@ -0,0 +1,42 @@ + 'Lab Profile', + 'lab_name' => 'Lab Name', + 'short_name' => 'Short Name', + 'emial' => 'E-mail', + 'address' => 'Address', + 'lab_settings' => 'Lab Settings', + 'sample_numner_conf' => 'Sample Number', + 'patient_numner_conf' => 'Patient Number', + 'type_of_discount_conf' => 'Type of Discount', + 'verify_label' => 'Verify Label', + 'technician_label' => 'Technician Label', + 'department' => 'Wards', + 'btn_change' => 'Change', + 'manual' => 'Manual', + 'system_generate' => 'System Generate', + 'btn_save' => 'Save', + 'percentage' => 'Percentage', + 'price' => 'Price', + 'start_date' => 'Start Date', + 'usage_period' => 'Licence Expire', + 'name_placeholder' => 'Input name here', + 'based_currency' => 'Currency', + 'exchange_rate' => 'Exchange Rate', + 'invoice_template' => 'Invoice Format', + 'invoice_detail' => 'Detail by tests', + 'invoice_summary' => 'Summary', + 'detail_with_panel' => 'Detail with Panel & Sample', + + 'header_font_name' => 'Result Page Header Font', + 'header_font_size' => 'Result Page Header Font-Size', + 'body_font_name' => 'Result Page Body Font', + 'body_font_size' => 'Result Page body Font-Size', + 'abnormal_result' => 'Abnormal Result Highlight', + 'font_weight' => 'Font-Weight', + 'font_bold' => 'Bold', + 'font_normal' => 'Normal', + 'text_color' => 'Color' + +]; diff --git a/lang/en/laboratory.php b/lang/en/laboratory.php new file mode 100644 index 0000000..1f55b31 --- /dev/null +++ b/lang/en/laboratory.php @@ -0,0 +1,51 @@ + 'Laboratory', + 'search_placeholder' => 'Laboratory name, address...', + 'table_no' => 'No.', + 'table_name_kh' => 'Name Khmer', + 'table_name_en' => 'Name Latin', + 'table_login_email' => 'Login-Email', + 'table_system_role' => 'System Role', + 'table_labs' => 'Labs', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New Laboratory', + 'form_name' => 'Full-Name', + 'form_login_email' => 'Login-Email', + 'form_ismnager' => 'Lab Manager', + 'form_edit_tittle' => 'Edit Laboratory Information', + 'form_system_role' => 'System-Role', + 'form_lab_cover' => 'Laboratory Coverage', + 'form_laboratory' => 'Laboratory', + 'form_select_all_lab' => 'Select All Labs', + 'form_password' => 'Password', + 'form_address_en' => 'Address-En', + 'form_address_kh' => 'Address-KH', + + 'create_success' => 'Laboratory has been created!', + 'create_fail' => 'An error occur while trying to create laboratory record. Please try again.', + 'update_success' => 'Laboratory record has been updated!', + 'update_fail' => 'An error occur while trying to update laboratory record. Please try again.', + 'delete_success' => 'Laboratory record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete laboratory record. Please try again.', + 'restore_success' => 'Laboratory record has been restored!', + 'restore_fail' => 'An error occur while trying to restore laboratory record. Please try again.', + 'get_success' => 'Laboratory record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve laboratory record. Please try again.', + + 'clone_lab' => 'Clone Laboratory', + 'source_lab' => 'Source Laboratory', + 'target_lab' => 'New Laboratory', + + 'start_clone' => 'Clone', + + 'phone' => 'Phone Number', + 'info' => 'Laboratory Information', + 'license' => 'License Agreement', + 'start_date' => 'Start Date', + 'expiry_date' => 'Date of Expiry', + 'change_base' => 'Change Laboratory' + +]; diff --git a/lang/en/lang.php b/lang/en/lang.php new file mode 100644 index 0000000..6334462 --- /dev/null +++ b/lang/en/lang.php @@ -0,0 +1,49 @@ + "Laboratory", + "forget_password" => "Forget password", + "sign_in" => "Sign in", + "keep_me_sign_in" => "Keep me signed in", + "dashboard" => "Dashboard", + "add_new" => "Add new", + "search" => "Search", + "payment" => "Payment", + "new_payment" => "New Payment", + "vaccination" => "Vaccination", + "invoice_list" => "Invoice List", + "logistics" => "Logistics", + "inventory" => "Inventory", + "stock_in" => "Stock In", + "stock_out" => "Stock Out", + "need_restock" => "Need Restock", + "expired_items" => "Expired Items", + "supplier" => "Supplier", + "report" => "Report", + "individual_report" => "Invidual Report", + "aggregate_report" => "Aggregate Report", + "doctor_report" => "Doctor Report", + "bacteriology_report" => "Bacteriology Report", + "administrator" => "Administrator", + "laboratory-profile" => "Lab Profile", + "department" => "Department", + "test_profile" => "Test Profile", + "result_config" => "Result Config", + "user_account" => "User Account", + "copyright" => "Copyright © 2022 LABONAK. All rights reserved.", + "lis" => "Laboratory Information System", + "new_laboratory" => "New Laboratory", + "lab_name_en" => "Laboratory Name (English)", + "lab_name_kh" => "Laboratory Name (Khmer)", + "lab_short_name" => "Short name", + "address_en" => "Address (English)", + "address_kh" => "Address (Khmer)", + "save" => "Save", + "cancel" => "Cancel", + "new_department" => "New department", + "sort_order" => "Sort Order", + "category" => "Category", + + "edit_laboratory" => "", + + ]; + ?> diff --git a/lang/en/login.php b/lang/en/login.php new file mode 100644 index 0000000..b17c6be --- /dev/null +++ b/lang/en/login.php @@ -0,0 +1,15 @@ + 'Sign in to continue.', + 'welcome_to_labonak' => 'WELCOME TO LABONAK.', + 'sign_in' => 'Sign in', + 'language' => 'Language', + 'en' => 'English', + 'kh' => 'Khmer', + 'email' => 'Email', + 'password' => 'Password', + 'select_base' => 'Select your laboratory from the list below.', + 'confirm_base' => 'Confirm', + 'logout' => 'Sign Out' + +]; diff --git a/lang/en/opd_visit.php b/lang/en/opd_visit.php new file mode 100644 index 0000000..ac9dfe0 --- /dev/null +++ b/lang/en/opd_visit.php @@ -0,0 +1,230 @@ +'New Consultation', + 'admission_date'=>'Admission Date', + 'admission_ward'=>'Admission Ward', + 'doctor'=>'Doctor', + 'physical_examinations'=>'Physical Examinations', + 'histories'=>'Histories', + 'investigations_&_procedures'=>'Investigations & Procedures', + 'medications'=>'Medications', + 'documents'=>'Documents', + 'bills'=>'Bills', + 'chief_complaint'=>'Chief Complaint', + 'vital_sign'=>'Vital Sign', + 'body_temperature(celsius)'=>'Body Temperature(Celsius)', + 'temperature'=>'Temperature', + 'pulse'=>'Pulse', + 'spo2'=>'SpO2', + 'respiration_rate'=>'Respiration Rate', + 'biometrics'=>'Biometrics', + 'weight(kg)'=>'weight(Kg)', + 'height(cm)'=>'Height(cm)', + 'bmi(clac)'=>'BMI(Clac)', + 'diagnosis'=>'Diagnosis', + 'initial_diagnosis'=>'Initial Diagnosis', + 'final_diagnosis'=>'Final Diagnosis', + 'save'=>'Save', + 'vaccination_history'=>'Vaccination History', + 'allergies'=>'Allergies', + 'allergen_category'=>'Allergen Category', + 'allergen'=>'Allergen', + 'drug_allergy'=>'Drug Allergy', + 'food_allergy'=>'Food Allergy', + 'insect_allergy'=>'Insect Allergy', + 'environment_allergy'=>'Environment Allergy', + 'others'=>'Others', + 'current_medication'=>'Current Medication', + 'past_medical_surgical_history'=>'Past Medical Surgical', + 'family_history'=>'Family History', + 'laboratory'=>'Laboratory', + 'request_for_laboratory_test'=>'Request for Laboratory Test', + 'request_imagery'=>'Request Imagery', + 'imagery_type'=>'Imagery Type', + 'imagery_service'=>'Imagery Service', + 'medical_item_group'=>'Medical Item Group', + 'medical_item'=>'Medical Item', + 'route'=>'Route', + 'form'=>'Form', + 'morning'=>'Morning', + 'noon'=>'Noon', + 'afternoon'=>'Afternoon', + 'evening'=>'Evening', + 'midnight'=>'Midnight', + 'duration'=>'Duration', + 'instruction'=>'Instruction', + 'view_all'=>'View All', + 'pending'=>'Pending', + 'discharged'=>'Discharged', + 'visit_number'=>'Visit Number', + 'save_&_generate_invoice'=>'Save & Generate Invoice', + 'hid'=>'HID', + 'patient_name'=>'Patient Name', + 'gender'=>'Gender', + 'age'=>'Age', + 'date_of_birth'=>'Date of Birth', + 'visit_date'=>'Visit Date', + 'visit_no.'=>'Visit No.', + 'refer_from'=>'Refer From', + 'refer_to'=>'Refer To', + 'visit_histories'=>'Visit Histories', + 'life_styles'=>'Life Styles', + 'alcohol'=>'Alcohol', + 'smoking'=>'Smoking', + 'drug'=>'Drug', + 'no'=>'No', + 'yes'=>'Yes', + 'new_invoice'=>'New Invoice', + 'upload_document'=>'Upload Document', + 'consultation' => 'Consultations', + 'medicine_name' => 'Medicine Name', + 'view_requested' => 'View Requests', + 'consultations' => 'Consultations', + 'imagery' => 'Imagery', + 'possible_result' => 'Possible Result', + 'imagery_list' => 'Imagery List', + 'pharmacy' => 'Pharmacy', + 'prescriptions' => 'Medication', + 'medicine_instruction' => 'Medicine Instruction', + 'exam_date' => 'Exam Date', + 'technique' => 'Technique', + 'id' => 'ID', + 'add_result_of' => 'Add Result of ', + 'attach_photo' => 'Attach Photo ', + 'short_name' => 'Code', + 'name' => 'Name in English', + 'name_kh' => 'Name in Khmer', + 'standard_result' => 'Standard Result', + 'default_select' => 'Default Select', + 'wards' => 'Wards', + 'ward' => 'Ward', + 'doctors' => 'Doctors', + 'base_manager' => 'Base Manager', + 'hospital_services' => 'Hospital Services', + 'hospital_service' => 'Hospital Service', + 'service_type' => 'Service Type', + 'name_latin' => 'Name-Latin', + 'name_local' => 'Name-Local', + + 'visit' => 'Patient', + 'type_service_code_or_name' => 'Type service code or name...', + 'total' => 'Total', + 'action' => 'Action', + 'stock_in' => 'Stock In', + 'stock_out' => 'Stock Out', + 'inventory_report' => 'Inventory Report', + 'item' => 'item', + 'supplier' => 'Supplier', + 'item_group' => 'Item Group', + 'item_unit' => 'Item Unit', + 'grn_number' => 'GRN-Number', + 'po_number' => 'PO-Number', + 'received_date' => 'Received Date', + 'total_amount' => 'Total Amount', + 'grn_num_or_supplier' => 'GRN-Number or supplier name...', + 'unit_price' => 'Unit Price', + 'quantity' => 'Quantity', + 'expiry_date' => 'Expiry Date', + + 'gin_number' => 'GIN-Number', + 'issued_date' => 'Issued Date', + 'report_type' => 'Report Type', + 'inventory_on_hand' => 'Inventory on hand', + 'expire_report' => 'Inventory on hand', + 'report_date' => 'Report Date', + + 'item_name' => 'Item Name', + 'on_hand' => 'On Hand', + 'last_stock_in' => 'Last Stock In', + 'last_stock_out' => 'Last Stock Out', + 'stock_in_date' => 'Stock In Date', + 'expire_date' => 'Expire Date', + '_month' => '# Month', + + 'code' => 'Code', + 'sale_price' => 'Sale Price', + 'description' => 'Description', + 'is_vaccination' => 'Is Vaccination', + 'vat_number' => 'VAT Number', + 'supplier_name' => 'Supplier Name', + 'contact_person' => 'Contact Person', + 'position' => 'Position', + 'phone' => 'Phone Number', + 'email' => 'Email', + 'address' => 'Address', + 'packaged_item' => 'Packaged Item', + + 'medical_record' => 'Medical Record', + + 'concept_code' => 'Concept Code', + + 'class' => 'Class', + 'sub_class' => 'Sub Class', + 'create_success' => 'Record has been created', + 'create_fail' => 'Failed while creating a record', + 'update_success' => 'Record has been updated', + 'update_fail' => 'Failed while updating a record', + 'get_success' => 'Record has been fetched', + 'get_fail' => 'Failed while fetching a record', + 'delete_success' => 'Record has been deleted', + 'delete_fail' => 'Failed while deleting a record', + 'restore_success' => 'Record has been restored', + 'restore_fail' => 'Failed while restoring a record', + 'evaluation' => 'Evaluation', + 'evaluation_summary' => 'Evaluation Summary', + 'queues' => 'Queues', + 'queue_no' => 'Queue-No', + 'save_to_queue' => 'Add Queue', + 'systolic' => 'Systolic', + 'diastolic' => 'Diastolic', + 'glucose' => 'Glucose', + + 'onset_date' => 'Onset Date', + 'clinical_feature' => 'Clinical Feature', + 'sign' => 'Sign', + 'general_appearance' => 'General Appearance', + 'status' => 'Status', + 'other' => 'Other', + 'ent' => 'ENT (ORL)', + 'ears' => 'Ears', + 'nose' => 'Noses', + 'throat' => 'Throat', + 'cardio_system' => 'Cardiovascular System', + 'heart_sound' => 'Heart Sound', + 'cardio_refill_time' => 'Capillary Refill Time', + 'resp_system' => 'Respiratory System', + 'inspection' => 'Inspection', + 'percussion' => 'Percussion', + 'auscultation' => 'Auscultation', + 'palpation' => 'Palpation', + 'uro_system' => 'Urogenital System', + 'skin' => 'Skin & Extremities', + 'edema' => 'Edema', + 'wounds' => 'Wounds', + 'rash' => 'Rash', + 'nervous_system' => 'Central Nervous System', + 'neurological' => 'Neurological', + 'mental_status' => 'Mental Status', + 'eyes' => 'Eyes', + 'verbal' => 'Verbal', + 'motion' => 'Motion', + 'mental_total' => 'Total', + 'specify' => 'Specify', + 'gastro_system' => 'Gastro-Intestinal System', + 'speech' => 'Speech', + 'mood' => 'Mood and affect', + 'thought' => 'Thought', + 'insight' => 'Insight & Judgement', + 'consciousness' => 'Consciousness', + 'abdomen' => 'Abdomen', + 'perception' => 'Perception', + 'coma' => 'Glasgow coma scale', + 'print_consult_form' => 'Print Consultation Form', + 'document_title' => 'Document Title', + 'file_name' => 'File name', + 'file_type' => 'File type', + 'past_medical_history' => 'Past Medical History' + + +]; diff --git a/lang/en/organism.php b/lang/en/organism.php new file mode 100644 index 0000000..545b838 --- /dev/null +++ b/lang/en/organism.php @@ -0,0 +1,28 @@ + 'Organisms', + 'search_placeholder' => 'Organism name...', + 'table_no' => 'No.', + 'table_name' => 'Name', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New Organism', + 'form_name' => 'Organism', + 'form_sort' => 'Sort-Order', + 'form_edit_tittle' => 'Edit Organism', + 'is_bold' => 'Bold', + + 'create_success' => 'Organism has been created!', + 'create_fail' => 'An error occur while trying to create organism record. Please try again.', + 'update_success' => 'Organism record has been updated!', + 'update_fail' => 'An error occur while trying to update organism record. Please try again.', + 'delete_success' => 'Organism record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete organism record. Please try again.', + 'restore_success' => 'Organism record has been restored!', + 'restore_fail' => 'An error occur while trying to restore organism record. Please try again.', + 'get_success' => 'Organism record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve organism record. Please try again.' + + +]; diff --git a/lang/en/pagination.php b/lang/en/pagination.php new file mode 100644 index 0000000..d481411 --- /dev/null +++ b/lang/en/pagination.php @@ -0,0 +1,19 @@ + '« Previous', + 'next' => 'Next »', + +]; diff --git a/lang/en/passwords.php b/lang/en/passwords.php new file mode 100644 index 0000000..2345a56 --- /dev/null +++ b/lang/en/passwords.php @@ -0,0 +1,22 @@ + 'Your password has been reset!', + 'sent' => 'We have emailed your password reset link!', + 'throttled' => 'Please wait before retrying.', + 'token' => 'This password reset token is invalid.', + 'user' => "We can't find a user with that email address.", + +]; diff --git a/lang/en/patient.php b/lang/en/patient.php new file mode 100644 index 0000000..49fc7db --- /dev/null +++ b/lang/en/patient.php @@ -0,0 +1,77 @@ + 'Patients', + 'search_placeholdolder' => 'Patient name, phone ..', + 'table_no' => 'No', + 'table_code' => 'Code', + 'table_name' => 'Name', + 'table_sex' => 'Sex', + 'table_phon' => 'Phone', + 'table_have_sample' => 'Have Sample', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_title' => 'New Patient', + 'form_edit_title' => 'Edit Patient', + 'form_code' => 'Patient Code', + 'form_name' => 'Patient Name', + 'form_dob' => 'Dob or Age', + 'form_age' => 'Age', + 'form_gender' => 'Gender', + 'form_sex_male' => 'Male', + 'form_sex_female' => 'Female', + 'form_sex_other' => 'Other', + 'form_khid' => 'KH-ID Number', + 'form_phone' => 'Phone Number', + 'form_house' => 'House Number', + 'form_street' => 'Street Number', + 'form_province' => 'Province', + 'form_district' => 'District', + 'form_commune' => 'Commune', + 'form_village' => 'Village', + 'form_alt_generate_puuid' => 'Auto Generate Patient Code', + + 'create_success' => 'Patient has been created!', + 'create_fail' => 'An error occur while trying to create patient record. Please try again.', + 'update_success' => 'Patient record has been updated!', + 'update_fail' => 'An error occur while trying to update patient record. Please try again.', + 'delete_success' => 'Patient record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete patient record. Please try again.', + 'restore_success' => 'Patient record has been restored!', + 'restore_fail' => 'An error occur while trying to restore patient record. Please try again.', + 'get_success' => 'Patient record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve patient record. Please try again.', + + 'basic_information' => 'Basic Information', + 'identifiers' => 'Identifiers', + 'contact_detail' => 'Contact Details', + 'medical_history' => 'Medical Histories', + 'first_name' => 'Surname', + 'last_name' => 'Given Name', + 'dob' => 'Date of Birth', + 'marital_status' => 'Marital Status', + 'single' => 'Single', + 'married' => 'Married', + 'other' => 'Others', + 'are_in_num' => 'Or Age in year, month, and day.', + 'blood_group' => 'Blood Group', + 'khid' => 'Khmer ID Card', + 'passport' => 'Passport', + 'nhid' => 'National Health ID', + 'create_new' => 'Create New Patient', + 'street' => 'Street', + 'house_no' => 'House Number', + 'email' => 'E-mail', + 'allergy' => 'Allergies', + 'chronic_disease' => 'Chronic Diseases', + 'past_surgery' => 'Past Surgeries', + 'family_history' => 'Family Medical History', + 'vaccination_history' => 'Vaccination Histories', + 'save_patient' => 'Save Patient', + 'save_consult' => 'Consultation', + 'save_queue' => 'Add Queue', + 'cancel' => 'Cancel', + 'sample' => 'Samples' + + +]; diff --git a/lang/en/patient_type.php b/lang/en/patient_type.php new file mode 100644 index 0000000..86c5235 --- /dev/null +++ b/lang/en/patient_type.php @@ -0,0 +1,33 @@ + 'Patient Type', + 'search_placeholder' => 'Patient type name...', + 'table_no' => 'No', + 'table_name' => 'Name', + 'table_gender' => 'Gender', + 'table_age_from' => 'Age From', + 'table_age_to' => 'Age To', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New Patient Type', + 'form_name' => 'Name', + 'form_max_age' => 'Max-Age', + 'form_min_age' => 'Min-Age', + 'form_edit_tittle' => 'Edit Patient Type', + 'form_input_day' => 'days', + 'form_input_month' => 'months', + 'form_input_year' => 'years', + + 'create_success' => 'Patient Type has been created!', + 'create_fail' => 'An error occur while trying to create patient type record. Please try again.', + 'update_success' => 'Patient Type record has been updated!', + 'update_fail' => 'An error occur while trying to update patient type record. Please try again.', + 'delete_success' => 'Patient Type record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete patient type record. Please try again.', + 'restore_success' => 'Patient Type record has been restored!', + 'restore_fail' => 'An error occur while trying to restore patient type record. Please try again.', + 'get_success' => 'Patient Type record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve patient type record. Please try again.' + +]; diff --git a/lang/en/permission.php b/lang/en/permission.php new file mode 100644 index 0000000..3fa64d0 --- /dev/null +++ b/lang/en/permission.php @@ -0,0 +1,72 @@ + 'View Patient', + 'create_patient' => 'Create Patient', + 'update_patient' => 'Update Patient', + 'delete_patient' => 'Delete Patient', + 'view_sample' => 'View Sample', + 'create_sample' => 'Create Sample', + 'update_sample' => 'Update Sample', + 'delete_sample' => 'Delete Sample', + 'add_result' => 'Add Result', + 'view_result' => 'View Result', + 'update_result' => 'Update Result', + 'delete_result' => 'Delete Result', + 'approve_result' => 'Approve Result', + 'print_result' => 'Print Result', + 'view_invoice' => 'View Invoice', + 'create_invoice' => 'Create Invoice', + 'update_invoice' => 'Update Invoice', + 'delete_invoice' => 'Delete Invoice', + 'generate_doctor_report' => 'Generate Doctor Report', + 'generate_summary_report' => 'Generate Summary Report', + 'view_dashboard' => 'View Dashboard', + 'update_laboratory_information' => 'Update Laboratory Information', + 'view_department' => 'View Department', + 'create_department' => 'Create Department', + 'update_department' => 'Update Department', + 'delete_department' => 'Delete Department', + 'view_sample_type' => 'View Sample Type', + 'create_sample_type' => 'Create Sample Type', + 'update_sample_type' => 'Update Sample Type', + 'delete_sample_type' => 'Delete Sample Type', + 'view_test_sample' => 'View Test Sample', + 'create_test_sample' => 'Create Test Sample', + 'update_test_sample' => 'Update Test Sample', + 'delete_test_sample' => 'Delete Test Sample', + 'view_comment' => 'View Comment', + 'create_comment' => 'Create Comment', + 'update_comment' => 'Update Comment', + 'delete_comment' => 'Delete Comment', + 'view_organism' => 'View Organism', + 'create_organism' => 'Create Organism', + 'update_organism' => 'Update Organism', + 'delete_organism' => 'Delete Organism', + 'view_antibiotic' => 'View Antibiotic', + 'create_antibiotic' => 'Create Antibiotic', + 'update_antibiotic' => 'Update Antibiotic', + 'delete_antibiotic' => 'Delete Antibiotic', + 'view_quantity' => 'View Quantity', + 'create_quantity' => 'Create Quantity', + 'update_quantity' => 'Update Quantity', + 'delete_quantity' => 'Delete Quantity', + 'view_sample_source' => 'View Sample Source', + 'create_sample_source' => 'Create Sample Source', + 'update_sample_source' => 'Update Sample Source', + 'delete_sample_source' => 'Delete Sample Source', + 'view_patient_type' => 'View Patient Type', + 'create_patient_type' => 'Create Patient Type', + 'update_patient_type' => 'Update Patient Type', + 'delete_patient_type' => 'Delete Patient Type', + 'view_physician' => 'View Provider', + 'create_physician' => 'Create Provider', + 'update_physician' => 'Update Provider', + 'delete_physician' => 'Delete Provider', + 'view_user_account' => 'View User Account', + 'create_user_account' => 'Create User Account', + 'update_user_account' => 'Update User Account', + 'delete_user_account,' => 'Delete User Account,', + 'assign_lab' => 'Assign Lab', + +]; diff --git a/lang/en/physician.php b/lang/en/physician.php new file mode 100644 index 0000000..4eb66d7 --- /dev/null +++ b/lang/en/physician.php @@ -0,0 +1,33 @@ + 'Physicians', + 'search_placeholder' => 'Physician name...', + 'table_no' => 'No', + 'table_name' => 'Name', + 'table_logo' => 'Logo', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New Physician', + 'form_name' => 'Name', + 'form_logo_upload' => 'Upload', + 'form_logo' => 'Header', + 'form_edit_tittle' => 'Edit Physician', + 'confirm_delete_photo' => 'Are you sure want to delete physician logo?', + 'ok_delete' => 'Yes, Delete', + 'cancel_delete' => 'No, Cancel', + 'confirm_delete' => 'Are you sure want to delete physician data?', + 'delete_photo_success' => 'Physician photo deleted successful', + 'delete_photo_failed' => 'Physician photo delete failed', + + 'delete_success' => 'Physician record has been deleted!', + 'delete_failed' => 'An error occur while trying to delete physician record. Please try again.', + + 'restore_success' => 'Physician record has been restored!', + 'restore_fail' => 'An error occur while trying to restore physician record. Please try again.', + + 'form_footer' => 'Footer', + 'default_select' => 'Make default' + + +]; diff --git a/lang/en/quantity.php b/lang/en/quantity.php new file mode 100644 index 0000000..213d464 --- /dev/null +++ b/lang/en/quantity.php @@ -0,0 +1,26 @@ + 'Quantities', + 'search_placeholder' => 'Quantity name...', + 'table_no' => 'No.', + 'table_name' => 'Name', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New Quantity', + 'form_name' => 'Quantity', + 'form_sort' => 'Sort-Order', + 'form_edit_tittle' => 'Edit Quantity', + + 'create_success' => 'Quantity has been created!', + 'create_fail' => 'An error occur while trying to create quantity record. Please try again.', + 'update_success' => 'Quantity record has been updated!', + 'update_fail' => 'An error occur while trying to update quantity record. Please try again.', + 'delete_success' => 'Quantity record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete quantity record. Please try again.', + 'restore_success' => 'Quantity record has been restored!', + 'restore_fail' => 'An error occur while trying to restore quantity record. Please try again.', + 'get_success' => 'Quantity record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve quantity record. Please try again.' + +]; diff --git a/lang/en/report.php b/lang/en/report.php new file mode 100644 index 0000000..e8cc61f --- /dev/null +++ b/lang/en/report.php @@ -0,0 +1,30 @@ + 'Summary Report', + 'summary_rpt_fd_filter' => 'Invoice Date From', + 'summary_rpt_td_filter' => 'Invoice Date End', + 'btn_view' => 'View Report', + 'btn_action' => 'Actions', + 'btn_action_print' => 'Print', + 'btn_action_export' => 'Download Excel', + 'summary_report_section_by_test' => 'Summary Report by Test Type', + 'summary_report_section_by_sample_source' => 'Summary Report by Sample Source', + 'summary_rpt_test_type' => 'Test Type', + 'summary_male_patient' => 'Male Patient', + 'summary_female_patient' => 'Female Patient', + 'summary_total_patient' => 'Total Patient', + 'summary_clinic_name' => 'Sample Source', + 'doctor_date_range_filter' => 'Invoice Date Range', + 'doctor_sample_source_filter' => 'Sample Source', + 'doctor_physician_filter' => 'Provider', + 'doctor_exam' => 'Exam', + 'doctor_net_amount' => 'Net Amount', + 'summary_total_sample'=>'Total Sample', + 'summary_report_section_by_category'=>'Summary Report by Category', + 'summary_report_section_by_date'=>'Summary Report by Date', + 'summary_report_section_by_labtech'=>'Summary Report By Lab', + 'financial_report'=>'Financial Report', + 'summary_category_name'=>'Category', + 'total' => 'Total' + +]; diff --git a/lang/en/sample.php b/lang/en/sample.php new file mode 100644 index 0000000..ef574d4 --- /dev/null +++ b/lang/en/sample.php @@ -0,0 +1,113 @@ + 'Samples', + 'table_no' => 'No', + 'table_patient_code' => 'Patient Code', + 'table_patient_name' => 'Patient Name', + 'table_sample_number' => 'Sample No', + 'table_collected_date' => 'Request Date', + 'table_received_date' => 'Received Date', + 'table_sample_source' => 'Sample Source', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_title' => 'New Sample', + 'form_patient' => 'Patient', + 'form_sample_number' => 'Sample No', + 'form_sample_source' => 'Sample Source', + 'form_requester' => 'Requested By', + 'form_collected_date' => 'Request Date', + 'form_received_date' => 'Received Date', + 'form_admission_date' => 'Admission Date', + 'form_diagnisis' => 'Diagnosis', + 'form_sample_condition' => 'Sample Condition', + 'form_reject_reason' => 'Reject Reason', + 'form_is_urgent' => 'Is Urgent', + 'form_btn_save_assign_test' => 'Save & Assign Test', + 'form_patient_info_title' => 'Patient Information', + 'form_patient_code' => 'Code', + 'form_patient_name' => 'Name', + 'form_patient_gender' => 'Sex', + 'form_patient_age' => 'Age', + 'form_patient_mobile' => 'Mobile', + 'form_patient_address' => 'Address', + 'form_edit_title' => 'Edit Sample', + 'form_btn_update' => 'Update', + 'form_btn_assign_test' => 'Assign Test', + 'form_btn_add_result' => 'Add Result', + 'form_btn_preview_result' => 'Preview Result', + 'from_btn_remove' => 'Remove', + 'form_btn_new_sample' => 'New Sample', + 'assign_test_modal_title' => 'Assign Test', + 'assign_test_save_template' => 'Save Template', + 'assign_test_make_invoice' => 'Make Invoice', + 'assign_test_total_fee_text' => 'Total Payment', + 'assign_test_total_test' => 'Total Tests', + 'assign_test_btn_save' => 'Save', + 'assign_test_btn_save_add_result' => 'Save & Add Result', + 'assign_test_btn_cancel' => 'Cancel', + 'add_result_title' => 'Add Result', + 'sample_entry_by' => 'Sample Entry By', + 'sample_modify_by' => 'Modified By', + 'add_result_test' => 'Test Name', + 'add_result_result' => 'Result', + 'add_result_unit_sign' => 'Unit Sign', + 'add_result_ref_range' => 'Ref. Range', + 'add_result_test_date' => 'Test Date', + 'add_result_performed_by' => 'Performed By', + 'add_result_hide' => 'Hide', + 'add_result_btn_edit_test' => 'Edit Test', + 'add_result_btn_save' => 'Save', + 'add_result_btn_save_preview' => 'Save & Preview', + 'add_result_btn_cancel' => 'Cancel', + 'print_title' => 'Laboratory Result', + 'btn_print' => 'Print', + 'btn_approve' => 'Approve', + 'last_test_date' => 'Last test date', + 'verify_by' => 'Verify by', + 'report_date' => 'Report date', + 'lab_technician' => 'Lab. Technician', + + 'search_placeholder' => 'Patient name or phone..', + + 'condition_good' => 'Good', + 'condition_reject' => 'Rejected', + 'condition_acceptable' => 'Acceptable', + + 'requested_date' => 'Request Date', + + 'year' => ' y', + 'month' => ' m', + 'day' => ' d', + 'sex_m' => ' M', + 'sex_f' => ' F', + 'physician_name' => 'Provider Name', + + 'create_success' => 'Sample has been created!', + 'create_fail' => 'An error occur while trying to create sample record. Please try again.', + 'update_success' => 'Sample record has been updated!', + 'update_fail' => 'An error occur while trying to update sample record. Please try again.', + 'delete_success' => 'Sample record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete sample record. Please try again.', + 'restore_success' => 'Sample record has been restored!', + 'restore_fail' => 'An error occur while trying to restore sample record. Please try again.', + 'get_success' => 'Sample record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve sample record. Please try again.', + + 'approve_success' => 'Sample has been approved!', + 'approve_fail' => 'An error occur while trying to approve the sample. Please try again.', + + + 'filter_all' => 'Show All', + 'filter_rejected' => 'Rejected', + 'filter_pending' => 'Pending', + 'filter_processing' => 'Processing', + 'filter_completed' => 'Completed', + 'filter_printed' => 'Printed', + 'clear_selection' => 'Uncheck all tests', + 'print_label' => 'Print Label', + 'previous_result' => 'Previous Result', + 'sample_status' => ' Status ' + +]; diff --git a/lang/en/sample_source.php b/lang/en/sample_source.php new file mode 100644 index 0000000..6ea9fe7 --- /dev/null +++ b/lang/en/sample_source.php @@ -0,0 +1,27 @@ + 'Sample Sources', + 'search_placeholder' => 'Sample source name...', + 'table_no' => 'No', + 'table_name_latin' => 'Name-Latin', + 'table_name_khmer' => 'Name-Khmer', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New Sample Source', + 'form_name' => 'Name', + 'form_sort' => 'Sort-Order', + 'form_edit_tittle' => 'Edit Sample Source', + + 'create_success' => 'Sample source has been created!', + 'create_fail' => 'An error occur while trying to create sample source record. Please try again.', + 'update_success' => 'Sample source record has been updated!', + 'update_fail' => 'An error occur while trying to update sample source record. Please try again.', + 'delete_success' => 'Sample source record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete sample source record. Please try again.', + 'restore_success' => 'Sample source record has been restored!', + 'restore_fail' => 'An error occur while trying to restore sample source record. Please try again.', + 'get_success' => 'Sample source record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve sample source record. Please try again.' + +]; diff --git a/lang/en/sample_type.php b/lang/en/sample_type.php new file mode 100644 index 0000000..8de8c04 --- /dev/null +++ b/lang/en/sample_type.php @@ -0,0 +1,34 @@ + 'Sample Types', + 'search_placeholder' => 'Sample type name...', + 'table_no' => 'No', + 'table_name' => 'Name', + 'table_department' => 'Department Name', + 'table_sample_type' => 'Sample Type', + 'table_description' => 'Description', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New Sample Type', + 'form_name' => 'Name', + 'form_sort' => 'Sort-Order', + 'form_department' => 'Ward', + 'form_select_all_department' => 'Select All Departments', + 'form_edit_tittle' => 'Edit Sample Type', + 'form_sample_description' => 'Sample Type', + + 'tube' => 'Type of Tube', + + 'create_success' => 'Sample type has been created!', + 'create_fail' => 'An error occur while trying to create sample type record. Please try again.', + 'update_success' => 'Sample type record has been updated!', + 'update_fail' => 'An error occur while trying to update sample type record. Please try again.', + 'delete_success' => 'Sample type record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete sample type record. Please try again.', + 'restore_success' => 'Sample type record has been restored!', + 'restore_fail' => 'An error occur while trying to restore sample type record. Please try again.', + 'get_success' => 'Sample type record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve sample type record. Please try again.' + +]; diff --git a/lang/en/sidebar.php b/lang/en/sidebar.php new file mode 100644 index 0000000..cdc0762 --- /dev/null +++ b/lang/en/sidebar.php @@ -0,0 +1,58 @@ + 'Dashboard', + 'patients' => 'Patients', + 'new_patient' => 'New Patient', + 'patient_list' => 'Patient List', + 'sample' => 'Samples', + 'new_sample' => 'Register Sample', + 'payment' => 'Payment', + 'invoice_list' => 'Invoice List', + 'report' => 'Reports', + 'lab_manager' => 'Lab Manager', + 'laboratory-profile' => 'Lab Profile', + 'department' => 'Departments', + 'sample_types' => 'Sample Types', + 'test_sample' => 'Tests', + 'comment' => 'Comments', + 'organism' => 'Organisms', + 'antibiotic' => 'Antibiotics', + 'quantity' => 'Quantities', + 'sample_source' => 'Sample Sources', + 'patient_type' => 'Patient Types', + 'physician' => 'Physicians', + 'user_account' => 'User Accounts', + 'administrator' => 'Administrator', + 'laboratory' => 'Laboratories', + 'system_role' => 'System Roles', + 'change_lab' => 'Change Lab', + 'logout' => 'Logout', + 'clone_lab' => 'Clone Laboratory', + 'medicines' => 'Logistics', + 'supplier' => 'Supplier', + 'medicine_group' => 'Item Group', + 'medicine_unit' => 'Item Unit', + 'medicine' => 'Items', + 'stockin' => 'Stock In', + 'stockout' => 'Stock Out', + + 'inventory_report' => 'Inventory Report', + + 'vaccination' => 'Vaccination', + 'new_vaccination' => 'New Vaccination', + 'vaccination_list' => 'Vaccination List', + 'publication' => 'Messages', + + 'laboratory_configures' => 'Lab Configuration', + 'financial_report' => 'Financial Report', + 'aggregate_report' => 'Aggregate Report', + 'doctor_report' => 'Doctor Report', + 'invoice'=>'Invoices', + 'payments'=>'Invoices & Repayment', + 'sample_management' => 'Sample Management', + 'create_sample' => 'Create Sample', + 'appointment' => 'Appointments', + 'view_sample' => 'Sample List', + +]; diff --git a/lang/en/system_role.php b/lang/en/system_role.php new file mode 100644 index 0000000..eb2d5cc --- /dev/null +++ b/lang/en/system_role.php @@ -0,0 +1,28 @@ + 'System Roles', + 'search_placeholder' => 'Role name...', + 'table_no' => 'No', + 'table_name' => 'Name', + 'table_default_page' => 'Default Page', + 'table_permission' => 'Permission', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New System Role', + 'form_name' => 'Name', + 'form_edit_tittle' => 'Edit System Role', + 'form_system_role' => 'System-Role', + + 'create_success' => 'System role has been created!', + 'create_fail' => 'An error occur while trying to create system role record. Please try again.', + 'update_success' => 'System role record has been updated!', + 'update_fail' => 'An error occur while trying to update system role record. Please try again.', + 'delete_success' => 'System role record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete system role record. Please try again.', + 'restore_success' => 'System role record has been restored!', + 'restore_fail' => 'An error occur while trying to restore system role record. Please try again.', + 'get_success' => 'System role record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve system role record. Please try again.' + +]; diff --git a/lang/en/test_sample.php b/lang/en/test_sample.php new file mode 100644 index 0000000..de8b270 --- /dev/null +++ b/lang/en/test_sample.php @@ -0,0 +1,68 @@ + 'Tests', + 'search_placeholder' => 'Department, sample type, or test name...', + 'table_no' => 'No', + 'table_name' => 'Test Name', + 'table_department' => 'Ward', + 'table_sample_type' => 'Sample Type', + 'table_sign' => 'Sign', + 'table_group_result' => 'Group Result', + 'table_field_type' => 'Field Type', + 'table_price' => 'Price', + 'table_sort' => 'Sort-Order', + 'table_btn_pc' => 'Provider Commission', + 'pc_physician' => 'Provider', + 'pc_rate' => 'Commission Rate', + 'pc_btn_apply_all_test' => 'Apply to all tests', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New Test Sample', + 'form_test_name' => 'Test Name', + 'form_unit_sign' => 'Unit Sign', + 'form_field_type' => 'Field Type', + 'form_edit_tittle' => 'Edit Test Sample', + 'form_description' => 'Description', + 'form_format' => 'Format', + 'form_ref_range' => 'Reference Range', + 'form_ref_min' => 'Min-Value', + 'form_ref_sign' => 'Sign', + 'form_ref_max' => 'Max-Value', + 'form_ref_patient_type' => 'Patient Type', + 'form_organism' => 'Organisim & Antibiotic', + 'organism_input_placeholder' => 'Organism name', + 'antibiotic_inut_placeholder' => 'Antibiotic name', + 'form_organism_selected' => 'Selected', + 'form_formula' => 'Formula', + 'formula_equation' => 'Equation', + + 'btn_apply_to_all_tests' => 'Apply to all tests', + 'code' => 'Code', + + 'create_success' => 'Test sample has been created!', + 'create_fail' => 'An error occur while trying to create test sample record. Please try again.', + 'update_success' => 'Test sample record has been updated!', + 'update_fail' => 'An error occur while trying to update test sample record. Please try again.', + 'delete_success' => 'Test sample record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete test sample record. Please try again.', + 'restore_success' => 'Test sample record has been restored!', + 'restore_fail' => 'An error occur while trying to restore test sample record. Please try again.', + 'get_success' => 'Test sample record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve test sample record. Please try again.', + + 'add_commission_success' => 'Commission record has been added!', + 'add_commission_fail' => 'An error occur while trying to add commission record. Please try again.', + 'select_organism' => 'Selected Organisms', + 'result_highlight_with_bold_text' => 'Highlight with Bold Text on Result Page', + 'auto_suggest_results' => 'Auto Suggest Result', + + 'numeric' => 'Numeric', + 'calculate' => 'Calculate', + 'single' => 'Single Selection', + 'multiple' => 'Multiple Selection', + 'text' => 'Long Text', + 'attachment' => 'Attachment', + 'heading' => 'Heading' + +]; diff --git a/lang/en/user_account.php b/lang/en/user_account.php new file mode 100644 index 0000000..e24d632 --- /dev/null +++ b/lang/en/user_account.php @@ -0,0 +1,53 @@ + 'User Accounts', + 'search_placeholder' => 'Account name, email address...', + 'table_no' => 'No', + 'table_name' => 'Name', + 'table_login_email' => 'Login-Email', + 'table_system_role' => 'System Role', + 'table_labs' => 'Labs', + 'table_status' => 'Status', + 'table_action' => 'Actions', + 'form_add_tittle' => 'New User Account', + 'form_name' => 'Full-Name', + 'form_login_email' => 'Login-Email', + 'form_ismnager' => 'Lab Manager', + 'physician' => 'Sample Source', + 'non_of_above' => 'Others', + 'form_edit_tittle' => 'Edit User Account', + 'form_system_role' => 'System-Role', + 'form_lab_cover' => 'Laboratory Coverage', + 'form_laboratory' => 'Laboratory', + 'form_select_all_lab' => 'Select All Labs', + 'form_password' => 'Password', + 'form_character' => 'characters', + 'form_assign_lab' => 'Assign laboratory', + + 'user_profile' => 'User Profile', + 'form_change_password' => 'Change Password', + 'form_old_password' => 'Current Password', + 'form_new_password' => 'New Password', + 'form_confirm_password' => 'Confirm New Password', + 'form_signature' => 'Signature', + + 'invalid_current_password' => 'Invalid current password', + 'new_password_same_old_password' => 'New Password cannot be same as your current password.', + 'change_password_success' => 'Your password has been changed!', + 'change_password_fail' => 'An error occur while trying to change password. Please try again.', + + 'create_success' => 'User account has been created!', + 'create_fail' => 'An error occur while trying to create user account record. Please try again.', + 'update_success' => 'User account record has been updated!', + 'update_fail' => 'An error occur while trying to update user account record. Please try again.', + 'delete_success' => 'User account record has been deleted!', + 'delete_fail' => 'An error occur while trying to delete user account record. Please try again.', + 'restore_success' => 'User account record has been restored!', + 'restore_fail' => 'An error occur while trying to restore user account record. Please try again.', + 'get_success' => 'User account record has been retrieved!', + 'get_fail' => 'An error occur while trying to retrieve user account record. Please try again.', + 'assign_lab_success' => 'User account has been added to laboratories!', + 'assign_lab_fail' => 'An error occur while trying to assign user account to laboratories. Please try again.' + +]; diff --git a/lang/en/vaccination.php b/lang/en/vaccination.php new file mode 100644 index 0000000..3e1e130 --- /dev/null +++ b/lang/en/vaccination.php @@ -0,0 +1,26 @@ +'Date', + 'next_visit' =>'Next Visit', + 'name' =>'Vaccine Name', + 'unit_price' =>'Unit Price', + 'qty' =>'Quantity', + 'subtotal' =>'Sub Total', + 'new_title' =>'New Vaccination', + 'btn_save' =>'Save', + 'create_success' =>'Vaccination record has been saved.', + 'create_fail' =>'Failed while saving vaccination record.', + 'update_success' =>'Vaccination record has been updated.', + 'update_fail' =>'Failed while updating vaccination record.', + 'delete_success' =>'Vaccination record has been deleted.', + 'delete_fail' =>'Failed while deleting vaccination record.', + 'restore_success' =>'Vaccination record has been restored.', + 'restore_fail' =>'Failed while restoring vaccination record.', + 'list_title' =>'Vaccinations', + 'invoice_title' =>'Vaccination Invoice', + 'edit_title' =>'Edit Vaccination', + + +]; diff --git a/lang/en/validation.php b/lang/en/validation.php new file mode 100644 index 0000000..a65914f --- /dev/null +++ b/lang/en/validation.php @@ -0,0 +1,151 @@ + 'The :attribute must be accepted.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'numeric' => 'The :attribute must be between :min and :max.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'string' => 'The :attribute must be between :min and :max characters.', + 'array' => 'The :attribute must have between :min and :max items.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'date' => 'The :attribute is not a valid date.', + 'date_equals' => 'The :attribute must be a date equal to :date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'email' => 'The :attribute must be a valid email address.', + 'ends_with' => 'The :attribute must end with one of the following: :values.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'numeric' => 'The :attribute must be greater than :value.', + 'file' => 'The :attribute must be greater than :value kilobytes.', + 'string' => 'The :attribute must be greater than :value characters.', + 'array' => 'The :attribute must have more than :value items.', + ], + 'gte' => [ + 'numeric' => 'The :attribute must be greater than or equal :value.', + 'file' => 'The :attribute must be greater than or equal :value kilobytes.', + 'string' => 'The :attribute must be greater than or equal :value characters.', + 'array' => 'The :attribute must have :value items or more.', + ], + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'lt' => [ + 'numeric' => 'The :attribute must be less than :value.', + 'file' => 'The :attribute must be less than :value kilobytes.', + 'string' => 'The :attribute must be less than :value characters.', + 'array' => 'The :attribute must have less than :value items.', + ], + 'lte' => [ + 'numeric' => 'The :attribute must be less than or equal :value.', + 'file' => 'The :attribute must be less than or equal :value kilobytes.', + 'string' => 'The :attribute must be less than or equal :value characters.', + 'array' => 'The :attribute must not have more than :value items.', + ], + 'max' => [ + 'numeric' => 'The :attribute may not be greater than :max.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', + 'string' => 'The :attribute may not be greater than :max characters.', + 'array' => 'The :attribute may not have more than :max items.', + ], + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'numeric' => 'The :attribute must be at least :min.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'string' => 'The :attribute must be at least :min characters.', + 'array' => 'The :attribute must have at least :min items.', + ], + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute format is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'password' => 'The password is incorrect.', + 'present' => 'The :attribute field must be present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values are present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => 'The :attribute must be :size.', + 'file' => 'The :attribute must be :size kilobytes.', + 'string' => 'The :attribute must be :size characters.', + 'array' => 'The :attribute must contain :size items.', + ], + 'starts_with' => 'The :attribute must start with one of the following: :values.', + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute format is invalid.', + 'uuid' => 'The :attribute must be a valid UUID.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap our attribute placeholder + | with something more reader friendly such as "E-Mail Address" instead + | of "email". This simply helps us make our message more expressive. + | + */ + + 'attributes' => [], + +]; diff --git a/lang/kh/antibiotic.php b/lang/kh/antibiotic.php new file mode 100644 index 0000000..0b92d2e --- /dev/null +++ b/lang/kh/antibiotic.php @@ -0,0 +1,26 @@ + 'តារាងឱសថប្រឆាំងមេរោគ', + 'search_placeholder' => 'ឈ្មោះឱសថប្រឆាំងមេរោគ', + 'table_no' => 'ល.រ', + 'table_name' => 'ឈ្មោះ', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'បង្កើតអង់ទីប៊ីយោទិកថ្មី', + 'form_name' => 'ឱសថប្រឆាំងមេរោគ', + 'form_sort' => 'លេខរៀង', + 'form_edit_tittle' => 'កែប្រែព័ត៌មានឱសថប្រឆាំងមេរោគ', + + 'create_success' => 'ឈ្មោះឱសថប្រឆាំងមេរោគថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតឈ្មោះឱសថប្រឆាំងមេរោគថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានឈ្មោះឱសថប្រឆាំងមេរោគកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានឈ្មោះឱសថប្រឆាំងមេរោគបានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានឈ្មោះឱសថប្រឆាំងមេរោគលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានឈ្មោះឱសថប្រឆាំងមេរោគចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានឈ្មោះឱសថប្រឆាំងមេរោគស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានឈ្មោះឱសថប្រឆាំងមេរោគបានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានឈ្មោះឱសថប្រឆាំងមេរោគទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានឈ្មោះឱសថប្រឆាំងមេរោគបានទេ។ សូមសាកល្បងម្តងទៀត' + +]; diff --git a/lang/kh/appointment.php b/lang/kh/appointment.php new file mode 100644 index 0000000..c39a146 --- /dev/null +++ b/lang/kh/appointment.php @@ -0,0 +1,20 @@ + 'ប្រភេទណាត់ជួប', + 'date' => 'ថ្ងៃណាត់ជួប', + 'duration' => 'រយៈពេលជាថ្ងៃ', + 'patient' => 'អ្នកជំងឺ', + 'description' => 'បរិយាយ', + 'doctor' => 'គ្រូពេទ្យ', + 'create_success' => 'ការណាត់ជួបថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតការណាត់ជួបថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានការណាត់ជួបកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានការណាត់ជួបបានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានការណាត់ជួបលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានការណាត់ជួបចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានការណាត់ជួបស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានការណាត់ជួបបានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានការណាត់ជួបទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានការណាត់ជួបបានទេ។ សូមសាកល្បងម្តងទៀត' +]; diff --git a/lang/kh/auth.php b/lang/kh/auth.php new file mode 100644 index 0000000..c148aaf --- /dev/null +++ b/lang/kh/auth.php @@ -0,0 +1,19 @@ + 'ឈ្មោះគណនីឬលេខសំងាត់មិនត្រឹមត្រូវ', + 'throttle' => 'លោកអ្នកបញ្ចូលព័ត៌មានមិនត្រឹមត្រូវជាច្រើនដង។ សូមព្យាយាមម្តងទៀតក្នុងរយៈពេល :seconds seconds.', + +]; diff --git a/lang/kh/comment.php b/lang/kh/comment.php new file mode 100644 index 0000000..40cda81 --- /dev/null +++ b/lang/kh/comment.php @@ -0,0 +1,29 @@ + 'តារាងមតិយោបល់', + 'search_placeholder' => 'ឈ្មោះមតិយោបល់..', + 'table_no' => 'ល.រ', + 'table_name' => 'មតិយោបល់', + 'table_department' => 'ផ្នែកមន្ទីរពិសោធន៌', + 'table_sample_type' => 'ប្រភេទសំណាក', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'យោបល់ថ្មី', + 'form_name' => 'ទម្រង់មតិយោបល់', + 'form_sample_type' => 'ប្រភេទសំណាក', + 'form_department' => 'ផ្នែកមន្ទីរពិសោធន៌', + 'form_edit_tittle' => 'កែប្រែយោបល់', + + 'create_success' => 'មតិយោបល់ថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតមតិយោបល់ថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានមតិយោបល់កែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានមតិយោបល់បានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានមតិយោបល់លុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានមតិយោបល់ចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានមតិយោបល់ស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានមតិយោបល់បានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានមតិយោបល់ទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានមតិយោបល់បានទេ។ សូមសាកល្បងម្តងទៀត' + +]; diff --git a/lang/kh/department.php b/lang/kh/department.php new file mode 100644 index 0000000..e854cd2 --- /dev/null +++ b/lang/kh/department.php @@ -0,0 +1,29 @@ + 'តារាងផ្នែកមន្ទីរពិសោធន៌', + 'search_placeholder' => 'ឈ្មោះផ្នែកមន្ទីរពិសោធន៌...', + 'table_no' => 'ល.រ', + 'table_name' => 'ឈ្មោះផ្នែកមន្ទីរពិសោធន៌', + 'table_sample_type' => 'ប្រភេទសំណាក', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'បង្កើតផ្នែកមន្ទីរពិសោធន៌ថ្មី', + 'form_name' => 'ឈ្មោះ', + 'form_sort' => 'លេខរៀង', + 'form_laboratory' => 'មន្ទីរពិសោធន៌', + 'form_select_all_lab' => 'ជ្រើសរើសមន្ទីរពិសោធន៌ទាំងអស់', + 'form_edit_tittle' => 'កែ​ប្រែផ្នែកមន្ទីរពិសោធន៌', + + 'create_success' => 'ផ្នែកមន្ទីរពិសោធន៍ថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតផ្នែកមន្ទីរពិសោធន៍ថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានផ្នែកមន្ទីរពិសោធន៍កែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានផ្នែកមន្ទីរពិសោធន៍បានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានផ្នែកមន្ទីរពិសោធន៍លុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានផ្នែកមន្ទីរពិសោធន៍ចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានផ្នែកមន្ទីរពិសោធន៍ស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានផ្នែកមន្ទីរពិសោធន៍បានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានផ្នែកមន្ទីរពិសោធន៍ទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានផ្នែកមន្ទីរពិសោធន៍បានទេ។ សូមសាកល្បងម្តងទៀត' + +]; diff --git a/lang/kh/general.php b/lang/kh/general.php new file mode 100644 index 0000000..0bbe9e0 --- /dev/null +++ b/lang/kh/general.php @@ -0,0 +1,94 @@ + 'ស្វែងរក', + 'btn_add_new' => 'បង្កើតថ្មី', + 'btn_edit' => 'កែប្រែ', + 'btn_delete' => 'លុប', + 'date_placeholder' => 'ថ្ងៃ ខែ ឆ្នាំ', + 'btn_save' => 'រក្សាទុក', + 'btn_cancel' => 'បោះបង់', + 'confirm_delete_text' => 'តើអ្នកពិតជាចង់លុបទិន្នន័យនេះមែនឬទេ?', + 'confirm_delete_yes' => 'យល់ព្រម', + 'confirm_delete_no' => 'បោះបង់', + 'btn_clear' => 'សម្អាត', + + 'change_lab' => 'ជ្រើសរើសមន្ទីរពិសោធន៍', + 'profile' => 'អំពីអ្នកប្រើប្រាស់', + 'logout' => 'ចាកចេញពីប្រព័ន្ធ', + + 'today_sample' => 'ចំនួនសំណាកថ្ងៃនេះ', + 'this_month_sample' => 'ចំនួនសំណាកក្នុងខែនេះ', + 'last_month_sample' => 'ចំនួនសំណាកក្នុងខែមុន', + 'average_sample' => 'ចំនួនសំណាកគិតជាមធ្យមក្នុង១ខែ', + 'today_income' => 'ចំណូលសរុបក្នុងថ្ងៃនេះ', + 'this_month_income' => 'ចំណូលសរុបក្នុងខែនេះ', + 'last_month_income' => 'ចំណូលសរុបក្នុងខែមុន', + 'last_year_income' => 'ចំណូលសរុបក្នុងឆ្នាំមុន', + 'sample_statistic' => 'ស្ថិតិចំនួនសំណាក', + 'sample_source_statistic' => 'ស្ថិតិសំណាកតាមប្រភព', + 'chart_filter_today' => 'ក្នុងថ្ងៃនេះ', + 'chart_filter_this_month' => 'ក្នុងខែនេះ', + 'chart_filter_this_year' => 'ក្នុងឆ្នាំនេះ', + 'chart_filter_last_year' => 'ក្នុងឆ្នាំមុន', + + 'confirm_delete_record' => 'តើអ្នកពិតជាចង់លុបព័ត៌មាននេះមែនឬទេ?', + 'confirm_ok_delete' => 'បាទ/ចាស យល់ព្រម', + 'confirm_cancel' => 'ទេ, បោះបង់', + 'delete_success' => 'ព័ត៌មានលុបបានសម្រេច', + 'delete_failed' => "ព័ត៌មានមិនអាចលុបបានទេ", + 'choose_option' => 'ជ្រើសរើស', + + 'confirm_restore_record' => 'តើអ្នកពិតជាចង់ស្តារព័ត៌មាននេះមែនឬទេ?', + 'confirm_ok_restore' => 'បាទ/ចាស', + 'confirm_cancel_restore' => 'ទេ', + + 'type_date_placeholder' => 'ខែ/ថ្ងៃ/ឆ្នាំ', + 'select2_tag_placeholder' => 'ជ្រើសរើស ឬស្វែងរកក្នុងប្រអស់', + 'select2_no_result' => 'មិនមានទិន្នន័យរកឃើញ', + 'optional' => 'ជាជម្រើស', + 'required' => 'តម្រូវ', + + //new + 'total_samples' => 'ចំនួនសំណាកសរុប', + 'total_income' => 'ចំណូលសរុប', + 'total_patient' => 'ចំនួនអ្នកជំងឺសរុប', + 'total_invoice' => 'ចំនួនវិក្កយបត្រសរុប', + 'total_paid_invoice' => 'ចំនួនវិក្កយបត្របង់ប្រាក់រួច', + 'total_unpaid_invoice' => 'ចំនួនវិក្កយបត្រមិនទាន់បង់ប្រាក់', + 'total_rejected_sample' => 'ចំនួនសំណាកបដិសេធសរុប', + 'monthly_sample_trend' => 'និន្នាការសំណាកប្រចាំខែ', + 'monthly_income_trend' => 'និន្នាការចំណូលប្រចាំខែ', + 'panel_distribution' => 'ចំនួនសំណាកតាម Panel(ឆ្នាំនេះ)', + 'sample_source_distribution' => 'ចំនួនសំណាកតាមប្រភពសំណាក(ឆ្នាំនេះ)', + + 'manage_user_accounts' => 'គ្រប់គ្រងគណនីប្រើប្រាស់', + 'manage_user_roles' => 'គ្រប់គ្រងតួនាទីអ្នកប្រើប្រាស់', + 'laboratory_settings' => 'កំណត់ប្រព័ន្ធ', + 'activity_logs' => 'កំណត់ហេតុប្រតិបត្តិការណ៍', + 'btn_save_patient_add_new_sample' => 'រក្សាទុក និងបង្កើតសំណាកថ្មី', + + 'user_name' => 'ឈ្មោះគណនី', + 'user_role' => 'តួនាទី', + 'upload_signature' => 'បញ្ចូលគម្រូហត្ថលេខា', + 'signature_image' => 'រូបភាពហត្ថលេខា', + 'current_signature' => 'ហត្ថលេខាបច្ចុប្បន្ន', + + 'change_password' => 'ផ្លាស់ប្តូរលេខសំងាត់', + 'current_password' => 'លេខសំងាត់បច្ចុប្បន្ន', + 'new_password' => 'លេខសំងាត់ថ្មី', + 'confirm_password' => 'បញ្ជាក់សារឡើងវិញ', + + 'general_settings' => 'ការកំណត់ទូទៅ', + 'result_settings' => 'ការកំណត់ផ្នែកលទ្ធផល', + 'notification' => 'សារជូនដំណឹង', + 'page' => 'ទំព័រទី ', + + 'contaminant' => 'មានការចំលងរោគ', + + 'sample_entry_by' => 'បញ្ចូលលទ្ធផលដោយ', + 'modify_by' => 'កែប្រែលទ្ធផលដោយ', + + 'apply_to_all_test' => 'កំណត់គ្រប់តេស្តទាំងអស់' + +]; diff --git a/lang/kh/inventory.php b/lang/kh/inventory.php new file mode 100644 index 0000000..fef3b36 --- /dev/null +++ b/lang/kh/inventory.php @@ -0,0 +1,19 @@ + 'អ្នកផ្គត់ផ្គង់', + 'sp_create_success' => 'មីបង្កើតបានសម្រេច។', + 'sp_create_fail' => 'មិនអាចបង្កើតអ្នកផ្គត់ផ្គង់ថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'sp_update_success' => 'ព័ត៌មានអ្នកផ្គត់ផ្គង់កែប្រែបានសម្រេច។ ', + 'sp_update_fail' => 'មិនអាចកែប្រែព័ត៌មានអ្នកផ្គត់ផ្គង់បានទេ។ សូមសាកល្បងម្តងទៀត', + 'sp_delete_success' => 'ព័ត៌មានអ្នកផ្គត់ផ្គង់លុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'sp_delete_fail' => 'មិនអាចលុបព័ត៌មានអ្នកផ្គត់ផ្គង់ចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'sp_restore_success' => 'ព័ត៌មានអ្នកផ្គត់ផ្គង់ស្តារបានសម្រេច។', + 'sp_restore_fail' => 'មិនអាចស្តារព័ត៌មានអ្នកផ្គត់ផ្គង់បានទេ។ សូមសាកល្បងម្តងទៀត', + 'sp_get_success' => 'ព័ត៌មានអ្នកផ្គត់ផ្គង់ទាញយកបានសម្រេច។', + 'sp_get_fail' => 'មិនអាចទាញយកព័ត៌មានអ្នកផ្គត់ផ្គង់បានទេ។ សូមសាកល្បងម្តងទៀត', + 'supplier_name' => 'ឈ្មោះអ្នកផ្គត់ផ្គង់' + +]; diff --git a/lang/kh/invoice.php b/lang/kh/invoice.php new file mode 100644 index 0000000..3094a43 --- /dev/null +++ b/lang/kh/invoice.php @@ -0,0 +1,85 @@ + 'តារាងវិក័យប័ត្រ', + 'table_date_filter' => 'ចន្លោះកាលបរិច្ឆេទ', + 'table_textable_filter' => 'ឬ ស្វែងរកតាម', + 'table_textable_filter_placeholder' => 'លេខវិក័យប័ត្រ លេខសំណាក លេខសំគាល់អ្នកជំងឺ ឬ លេខទូរស័ព្ទ', + 'btn_quick_report' => 'របាយការណ៍ចំណូលខ្លី', + 'dialy_report' => 'របាយការណ៍ចំណូលប្រចាំថ្ងៃ', + 'monthly_invoice_report' => 'របាយការណ៍ចំណូលប្រចាំខែ', + 'yearly_invoice_report' => 'របាយការណ៍ចំណូលប្រចាំឆ្នាំ', + 'table_no' => 'ល.រ', + 'table_invoice_code' => 'លេខវិក័យប័ត្រ', + 'table_sample_number' => 'លេខសំណាក', + 'table_patient_name' => 'ឈ្មោះអ្នកជំងឺ', + 'table_invoice_date' => 'ថ្ងៃធ្វើវិក័យប័ត្រ', + 'table_total_cost' => 'តម្លៃសរុប', + 'table_discount' => 'បញ្ចុះតម្លៃ', + 'table_net_cost' => 'តម្លៃត្រូវបង់ ($)', + 'table_net_cost_riel' => 'តម្លៃត្រូវបង់ (៛)', + 'table_paid' => 'តម្លៃដែលបានបង់', + 'table_owe' => 'នៅខ្វះ', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_new_title' => 'ធ្វើវិក័យប័ត្រថ្មី', + 'form_edit_title'=> 'កែប្រែវិក័យប័ត្រ', + 'form_patient' => 'អ្នកជំងឺ', + 'form_invoice_number' => 'លេខវិក័យប័ត្រ', + 'form_invoice_date' => 'ថ្ងៃធ្វើវិក័យប័ត្រ', + 'form_description' => 'ពិពណ័នា', + 'form_qty' => 'ចំនួន', + 'form_unit_price' => 'តម្លៃឯកត្តា', + 'form_total_amount' => 'តម្លៃសរុប', + 'form_discount' => 'បញ្ចុះតម្លៃ', + 'form_net_amount' => 'តម្លៃត្រូវបង់', + 'form_paid_amount' => 'តម្លៃដែលបានបង់', + 'form_paid_date' => 'ថ្ងៃបង់ប្រាក់', + 'form_owe_amount' => 'នៅខ្វះ', + 'form_btn_save' => 'រក្សាទុកវិក័យប័ត្រ', + 'form_btn_generate_invoice' => 'បង្កើតវិក័យប័ត្រ', + + 'invoice_report_filter' => 'ច្រោះរបាយការណ៍វិក័យប័ត្រ', + 'report_type' => 'ប្រភេទរបាយការណ៍', + 'report_filter' => 'ជ្រើសរើសរយៈពេល', + 'view_report' => 'បង្ហាញរបាយការណ៍', + 'daily' => 'ប្រចាំថ្ងៃ', + 'monthly' => 'ប្រចាំខែ', + 'yearly' => 'ប្រចាំឆ្នាំ', + + 'received_date' => 'ថ្ងៃទទួលប្រាក់', + + 'paid_by' => 'អតិថិជន', + + 'received_by' => 'បេឡាករ', + + 'tittle' => 'វិក័យប័ត្រមន្ទីរ​ពិសោធន៍', + 'print' => 'បោះពុម្ពវិកយប័ត្រ', + + 'create_success' => 'វិក័យបត្រថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតវិក័យបត្រថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានវិក័យបត្រកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានវិក័យបត្របានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានវិក័យបត្រលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានវិក័យបត្រចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានវិក័យបត្រស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានវិក័យបត្របានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានវិក័យបត្រទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានវិក័យបត្របានទេ។ សូមសាកល្បងម្តងទៀត', + + 'form_btn_save_preview' => 'រក្សាទុក និងបោះពុម្ពវិកយប័ត្រ', + + 'pay_type' => 'ប្រភេទបង់ប្រាក់', + 'bank_name' => 'ឈ្មោះធនាគារ', + 'transaction_no' => 'លេខកូដប្រតិបត្តិការ', + 'cash_paid' => 'បង់ប្រាក់សុទ្ធ', + 'bank_paid' => 'បង់តាមធនាគារ', + + 'exchange_rate' => 'អត្រាប្តូរប្រាក់', + 'hide_discount' => 'មិនបង្ហាញព័ត៌មានបញ្ចុះតម្លៃ', + 'refresh_item' => 'ធ្វើបច្ចុប្បន្នភាពវិក្កយបត្រ', + + 'repayment' => 'ការបង់ប្រាក់', + 'repayment_date' => 'ថ្ងៃបង់ប្រាក់' + +]; diff --git a/lang/kh/lab_profile.php b/lang/kh/lab_profile.php new file mode 100644 index 0000000..36f8095 --- /dev/null +++ b/lang/kh/lab_profile.php @@ -0,0 +1,41 @@ + 'ទម្រង់មន្ទីរពិសោធន៍', + 'lab_name' => 'ឈ្មោះមន្ទីរពិសោធន៍', + 'short_name' => 'ឈ្មោះកាត់', + 'emial' => 'អ៊ីមែល', + 'address' => 'អាស័យដ្ឋាន', + 'lab_settings' => 'កំណត់​ មន្ទីរពិសោធន៌', + 'sample_numner_conf' => 'លេខកូដសំណាក', + 'patient_numner_conf' => 'លេខកូដអ្នកជំងឺ', + 'type_of_discount_conf' => 'ប្រភេទបញ្ចុះតម្លៃ', + 'verify_label' => 'ហត្ថលេខា និងឈ្មោះអ្នកត្រួតពិនិត្យ', + 'technician_label' => 'ឈ្មោះបុគ្គលិកមន្ទីរពិសោធន៍', + 'department' => 'ផ្នែកមន្ទីរពិសោធន៌', + 'btn_change' => 'កំណត់', + 'manual' => 'បង្កើតខ្លួនឯង', + 'system_generate' => 'បង្កើតដោយប្រព័ន្ធ', + 'btn_save' => 'រក្សាទុក', + 'percentage' => 'ភាគរយ', + 'price' => 'តម្លៃ', + 'usage_period' => 'ថ្ងៃផុតសុពលភាពប្រើប្រាស់', + 'start_date' => 'ថ្ងៃចុះឈ្មោះប្រើប្រាស់', + 'name_placeholder' => 'សូមបំពេញឈ្មោះ', + 'based_currency' => 'រូបិយប័ណ្ណ', + 'exchange_rate' => 'អត្រាប្តូរប្រាក់', + 'invoice_template' => 'ទម្រង់វិក្កយបត្រ', + 'invoice_detail' => 'លម្អិតតាមឈ្មោះតេស្ត', + 'invoice_summary' => 'សរុបរួម', + 'detail_with_panel' => 'លម្អិតតាមឈ្មោះ Panel និងប្រភេទសំណាក', + + 'header_font_name' => 'ពុម្ពអក្សរលើក្បាលទំព័រ', + 'header_font_size' => 'ទំហំពុម្ពអក្សរលើក្បាលទំព័រ', + 'body_font_name' => 'ពុម្ពអក្សរលើលទ្ធផល', + 'body_font_size' => 'ទំហំពុម្ពអក្សរលើលទ្ធផល', + 'abnormal_result' => 'ការរំលេចលើលទ្ធផលមិនប្រក្រតី', + 'font_weight' => 'កំរាស់ពុម្ពអក្សារ', + 'font_bold' => 'ក្រាស់/ឌិត', + 'font_normal' => 'ធម្មតា', + 'text_color' => 'ពណ៌អក្សរ' +]; diff --git a/lang/kh/laboratory.php b/lang/kh/laboratory.php new file mode 100644 index 0000000..f52c369 --- /dev/null +++ b/lang/kh/laboratory.php @@ -0,0 +1,52 @@ + 'តារាងមន្ទីរពិសោធន៍', + 'search_placeholder' => 'ឈ្មោះមន្ទីរពិសោធន៍', + 'table_no' => 'ល.រ', + 'table_name_kh' => 'ឈ្មោះភាសាខ្មែរ', + 'table_name_en' => 'ឈ្មោះឡាតាំង', + 'table_login_email' => 'អ៊ីមែលដែលត្រូវចូល', + 'table_system_role' => 'តួនាទីប្រព័ន្ធ', + 'table_labs' => 'មន្ទីរពិសោធន៍', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'បង្កើតមន្ទីរពិសោធន៍ថ្មី', + 'form_name' => 'ឈ្មោះពេញ', + 'form_login_email' => 'អ៊ីមែលសម្រាប់ចូលប្រើ', + 'form_ismnager' => 'អ្នកគ្រប់គ្រង់មន្ទីរពិសោធន៍', + 'form_edit_tittle' => 'កែប្រែព័ត៌មានមន្ទីរពិសោធន៍', + 'form_system_role' => 'តួនាទីប្រព័ន្ធ', + 'form_lab_cover' => 'ការគ្រប់ដណ្តប់របស់មន្ទីរពិសោធន៍', + 'form_laboratory' => 'មន្ទីរពិសោធន៍', + 'form_select_all_lab' => 'ជ្រើសរើសមន្ទីរពិសោធន៌ទាំងអស់', + 'form_password' => 'លេខសំងាត់', + 'form_address_en' => 'អាស័យដ្ឋានជាភាសាអង់គ្លេស', + 'form_address_kh' => 'អាស័យដ្ឋានជាភាសាខ្មែរ', + + 'create_success' => 'មន្ទីរពិសោធន៍ថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតមន្ទីរពិសោធន៍ថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានមន្ទីរពិសោធន៍កែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានមន្ទីរពិសោធន៍បានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានមន្ទីរពិសោធន៍លុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានមន្ទីរពិសោធន៍ចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានមន្ទីរពិសោធន៍ស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានមន្ទីរពិសោធន៍បានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានមន្ទីរពិសោធន៍ទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានមន្ទីរពិសោធន៍បានទេ។ សូមសាកល្បងម្តងទៀត', + + 'clone_lab' => 'ក្លូនមន្ទីរពិសោធន៍', + + 'source_lab' => 'មន្ទីរពិសោធន៍ គម្រូ', + 'target_lab' => 'មន្ទីរពិសោធន៍ ថ្មី', + + 'start_clone' => 'ក្លូន', + + 'phone' => 'លេខទូរស័ព្ទ', + 'info' => 'ព័ត៌មានមន្ទីរពិសោធន៍', + 'license' => 'កិច្ចព្រមព្រៀងប្រើប្រាស់ប្រព័ន្ធ', + 'start_date' => 'ថ្ងៃចាប់ផ្តើម', + 'expiry_date' => 'ថ្ងៃផុតសុពលភាព', + 'change_base' => 'ប្តូរមន្ទីរពិសោធន៍' + +]; diff --git a/lang/kh/lang.php b/lang/kh/lang.php new file mode 100644 index 0000000..7904421 --- /dev/null +++ b/lang/kh/lang.php @@ -0,0 +1,45 @@ + "មន្ទីរពិសោធន៏", + "forget_password" => "ភ្លេចលេខសំងាត់", + "sign_in" => "ចូលប្រើ", + "keep_me_sign_in" => "រក្សាទុកខ្ញុំឱ្យចូលក្នុង", + "dashboard" => "ផ្ទាំងបង្ហាញព័ត៌មាន", + "add_new" => "បន្ថែមថ្មី", + "search" => "ស្វែងរក", + "payment" => "ការទូរទាត់", + "new_payment" => "ទូរទាត់ថ្មី", + "vaccination" => "ការចាក់វ៉ាក់សាំង", + "invoice_list" => "បញ្ជីវិក័យប័ត្", + "logistics" => "ភស្តុភារ", + "inventory" => "សារពើភ័ណ្ឌ", + "stock_in" => "ចូលស្តុក", + "stock_out" => "ចេញស្តុក", + "need_restock" => "ត្រូវការចូលស្តុកវិញ", + "expired_items" => "ផុតរយៈកំណត់", + "supplier" => "អ្នកផ្គត់ផ្គង់", + "report" => "របាយការណ៏", + "individual_report" => "របាយការណ៍បុគ្គល", + "aggregate_report" => "របាយការណ៍សរុប", + "doctor_report" => "របាយការណ៍វេជ្ជបណ្ឌិត", + "bacteriology_report" => "របាយការណ៍បាក់តេរី", + "administrator" => "អ្នកគ្រប់គ្រង", + "laboratory-profile" => "កម្រងព័ត៌មានមន្ទីរពិសោធន៍", + "department" => "ផ្នែកមន្ទីរពិសោធន៍", + "test_profile" => "កម្រងព័ត៌មានតេស្ត", + "result_config" => "ការកំណត់លទ្ធផល", + "user_account" => "គណនី​អ្នកប្រើប្រាស់", + "copyright" => "រក្សាសិទ្ធិដោយ © 2022 LABONAK.", + "all_right_reserved"=> "រក្សាសិទ្ធិគ្រប់យ៉ាង", + "lis" => "ប្រព័ន្ធព័ត៌មានមន្ទីរពិសោធន៍", + "new_department" => "បង្កើតផ្នែកមន្ទីរធិសោធន៍ថ្មី", + "lab_name_en" => "ឈ្មោះមន្ទីរពិសោធន៍ (អង់គ្លេស)", + "lab_name_kh" => "ឈ្មោះមន្ទីរពិសោធន៍ (ខ្មែរ)", + "lab_short_name" => "ឈ្មោះកាត់", + "address_en" => "អាស័យដ្ឋាន (អង់គ្លេស)", + "address_kh" => "អាស័យដ្ឋាន (ខ្មែរ)", + "save" => "រក្សាទុក", + "cancel" => "បោះបង់", + "sort_order" => "លេខរៀង", + ]; + ?> diff --git a/lang/kh/login.php b/lang/kh/login.php new file mode 100644 index 0000000..9d85913 --- /dev/null +++ b/lang/kh/login.php @@ -0,0 +1,15 @@ + 'ឡាបូអ្នកសូមស្វាគមន៍', + 'sign_in_to_continue' => 'សូមបញ្ចូលលេខសំងាត់ដើម្បីចូលប្រើប្រាស់', + 'sign_in' => 'ចូលប្រើប្រាស់', + 'language' => 'ជម្រើសភាសា', + 'en' => 'ភាសាអង់គ្លេស', + 'kh' => 'ភាសាខ្មែរ', + 'email' => 'សារអេឡិចត្រូនិច', + 'password' => 'លេខសំងាត់', + 'select_base' => 'សូមជ្រើសរើសមន្ទីរពិសោធន៍.', + 'confirm_base' => 'ជ្រើសរើសរួចរាល់', + 'logout' => 'ចាកចេញពីប្រព័ន្ធ' + +]; diff --git a/lang/kh/medicine_vacc.php b/lang/kh/medicine_vacc.php new file mode 100644 index 0000000..c3091ed --- /dev/null +++ b/lang/kh/medicine_vacc.php @@ -0,0 +1,23 @@ + 'អ្នកផ្គត់ផ្គង់', + 'supplier_search_placeholder' => 'ឈ្មោះគណនី អាស័យដ្ឋានអ៊ីមែល', + 'supplier_table_no' => 'ល.រ', + 'supplier_table_name' => 'ឈ្មោះ', + 'supplier_table_action' => 'ប្រតិបត្តិការ', + 'supplier_form_add_tittle' => 'បង្កើតគណនីអ្នកប្រើប្រាស់', + 'supplier_form_name' => 'ឈ្មោះពេញ', + 'supplier_form_edit_tittle' => 'កែប្រែគណនីអ្នកប្រើប្រាស់', + 'supplier_create_success' => 'គណនីអ្នកប្រើប្រាស់ថ្មីបង្កើតបានសម្រេច។', + 'supplier_create_fail' => 'មិនអាចបង្កើតគណនីអ្នកប្រើប្រាស់ថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'supplier_update_success' => 'ព័ត៌មានគណនីអ្នកប្រើប្រាស់កែប្រែបានសម្រេច។ ', + 'supplier_update_fail' => 'មិនអាចកែប្រែព័ត៌មានគណនីអ្នកប្រើប្រាស់បានទេ។ សូមសាកល្បងម្តងទៀត', + 'supplier_delete_success' => 'ព័ត៌មានគណនីអ្នកប្រើប្រាស់លុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'supplier_delete_fail' => 'មិនអាចលុបព័ត៌មានគណនីអ្នកប្រើប្រាស់ចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'supplier_restore_success' => 'ព័ត៌មានគណនីអ្នកប្រើប្រាស់ស្តារបានសម្រេច។', + 'supplier_restore_fail' => 'មិនអាចស្តារព័ត៌មានគណនីអ្នកប្រើប្រាស់បានទេ។ សូមសាកល្បងម្តងទៀត', + 'supplier_get_success' => 'ព័ត៌មានគណនីអ្នកប្រើប្រាស់ទាញយកបានសម្រេច។', + 'supplier_get_fail' => 'មិនអាចទាញយកព័ត៌មានគណនីអ្នកប្រើប្រាស់បានទេ។ សូមសាកល្បងម្តងទៀត', + +]; diff --git a/lang/kh/opd_visit.php b/lang/kh/opd_visit.php new file mode 100644 index 0000000..a6368db --- /dev/null +++ b/lang/kh/opd_visit.php @@ -0,0 +1,231 @@ +'ពិគ្រោះជំងឺថ្មី', + 'admission_date'=>'ថ្ងៃចុះឈ្មោះ', + 'admission_ward'=>'ដាក់ចូលផ្នែក', + 'doctor'=>'វេជ្ជបណ្ឌិត', + 'physical_examinations'=>'ការត្រួតពិនិត្យរាងកាយ', + 'histories'=>'ប្រវត្តិអ្នកជំងឺ', + 'investigations_&_procedures'=>'ការអង្កេត និង និតិវិធី', + 'medications'=>'ការផ្តល់ថ្នាំ', + 'documents'=>'ឯកសារ', + 'bills'=>'វិក្កយបត្រ', + 'chief_complaint'=>'សញ្ញាតម្អូន', + 'vital_sign'=>'សញ្ញាគ្រោះថ្នាក់', + 'temperature'=>'សីតុណ្ហភាព', + 'blood_presure(mmhg)'=>'សំពាធឈាម', + 'pulse'=>'ជីពចរ', + 'spo2'=>'អុកស៊ីសែន', + 'respiration_rate'=>'ចង្វាក់ដង្ហើម', + 'biometrics'=>'ជីវមាឌ', + 'weight(kg)'=>'ទម្ងន់', + 'height(cm)'=>'កម្ពស់', + 'bmi(clac)'=>'សន្ទស្សន៍ម៉ាសរាងកាយ', + 'diagnosis'=>'រោគវិនិច្ឆ័យ', + 'initial_diagnosis'=>'រោគវិនិច្ឆ័យដំបូង', + 'final_diagnosis'=>'រោគវិនិច្ឆ័យចុងក្រោយ', + 'save'=>'រក្សាទុក', + 'vaccination_history'=>'ប្រវត្តិនៃការចាក់វ៉ាក់ស៊ាំង', + 'allergies'=>'ប្រតិកម្ម', + 'allergen_category'=>'ប្រភេទប្រតិកម្ម', + 'allergen'=>'ប្រតិកម្ម', + 'drug_allergy'=>'ប្រតិកម្មថ្នាំ', + 'food_allergy'=>'ប្រតិកម្មអាហារ', + 'insect_allergy'=>'ប្រតិកម្មសត្វល្អិត', + 'environment_allergy'=>'ប្រតិកម្មបរិស្ថាន', + 'others'=>'ផ្សេងៗ', + 'current_medication'=>'ឪសថកំពុងប្រើ', + 'past_medical_surgical_history'=>'ប្រវត្តិនៃការវះកាត់', + 'family_history'=>'ប្រវត្តិគ្រួសារ', + 'laboratory'=>'ផ្នែកមន្ទីរពិសោធន៏', + 'request_for_laboratory_test'=>'ការស្នើសុំមន្ទីរពិសោធន៏', + 'request_imagery'=>'ការស្នើសុំថត រឺ អេកូ', + 'imagery_type'=>'ប្រភេទថត រឺ អេកូ', + 'imagery_service'=>'សេវាថត រឺ អេកូ', + 'medical_item_group'=>'ក្រុមសំភារៈវេជ្ជសាស្រ្ត', + 'medical_item'=>'សំភារៈវេជ្ជសាស្រ្ត', + 'route'=>'ផ្លូវ', + 'form'=>'ទម្រង់', + 'morning'=>'ពេលព្រឹក', + 'noon'=>'ពេលថ្ងៃ', + 'afternoon'=>'ពេលរសៀល', + 'evening'=>'ពេលល្ងាច', + 'midnight'=>'កណ្តាលយប់', + 'duration'=>'រយៈពេល', + 'instruction'=>'របៀបប្រើ', + 'view_all'=>'មើលទាំងអស់', + 'pending'=>'រង់ចាំ', + 'discharged'=>'ចេញពីមន្ទីរពេទ្យ', + 'visit_number'=>'លេខរៀងចូលពិនិត្យ', + 'save_&_generate_invoice'=>'រក្សាទុក និង បង្កើតវិក្កយបត្រ', + 'hid'=>'លេខសំគាល់អ្នកជំងឺ', + 'patient_name'=>'ឈ្មោះអ្នកជំងឺ', + 'gender'=>'ភេទ', + 'age'=>'អាយុ', + 'date_of_birth'=>'ថ្ងៃខែឆ្នាំកំណើត', + 'visit_date'=>'ថ្ងៃចូលពិនិត្យ', + 'visit_no.'=>'លេខរៀងពិនិត្យ', + 'refer_from'=>'បញ្ជូនមកពី', + 'refer_to'=>'បញ្ជូនទៅ', + 'visit_histories'=>'ប្រវត្តិពិនិត្យជំងឺ', + 'life_styles'=>'របៀបរស់នៅ', + 'alcohol'=>'គ្រឿងស្រវឹង', + 'smoking'=>'ជក់', + 'drug'=>'ថ្នាំញៀន', + 'no'=>'ល.រ', + 'yes'=>'បាទ/ចាស', + 'new_invoice'=>'វិក្កយបត្រថ្មី', + 'upload_document'=>'បញ្ចូលឯកសារ', + 'consultation' => 'តារាងពិគ្រោះជំងឺ', + 'medicine_name' => 'ឈ្មោះថ្នាំ', + 'view_requested' => 'មើលការស្នើសុំ', + 'consultations' => 'ពិគ្រោះជំងឺ', + 'imagery' => 'ផ្នែកថត ស្កេន', + 'possible_result' => 'កំណត់លទ្ធផលស្តង់ដារ', + 'imagery_list' => 'តារាងអ្នកជំងឺថត ស្កេន', + 'pharmacy' => 'ផ្នែកឳសថស្ថាន', + 'prescriptions' => 'តារាងស្នើសុំឪសថ', + 'medicine_instruction' => 'ការណែនាំប្រើប្រាស់ឪសថ', + 'exam_date' => 'ថ្ងៃធ្វើតេស្ត', + 'technique' => 'បច្ចេកទេស', + 'id' => 'ID', + 'add_result_of' => 'បញ្ចូលលទ្ធផលរបស់ ', + 'attach_photo' => 'បញ្ចូលរូបភាពទី ', + 'short_name' => 'លេខកូដ', + 'name' => 'ឈ្មោះជាភាសាអង់គ្លេស', + 'name_kh' => 'ឈ្មោះជាភាសាខ្មែរ', + 'standard_result' => 'លទ្ធផលស្តង់ដារ', + 'default_select' => 'ជ្រើសរើសស្វ័យប្រវត្ត', + 'wards' => 'ផ្នែក', + 'ward' => 'ផ្នែក', + 'doctors' => 'វេជ្ជបណ្ឌិត', + 'base_manager' => 'គ្រប់គ្រងទូទៅ', + 'hospital_services' => 'សេវាកម្មមន្ទីរពេទ្យ', + 'hospital_service' => 'សេវាកម្មមន្ទីរពេទ្យ', + 'service_type' => 'ប្រភេទសេវា', + 'name_latin' => 'ឈ្មោះឡាតាំង', + 'name_local' => 'ឈ្មោះជាភាសាខ្មែរ', + + 'visit' => 'អ្នកជំងឺ', + 'type_service_code_or_name' => 'បញ្ចូលលេខកូដ ឬ ឈ្មោះសេវាកម្ម', + 'unit_price' => 'តម្លៃរាយ', + 'total' => 'សរុប', + 'action' => 'ប្រតិបត្តការ', + 'stock_in' => 'ទំនិញចូលឃ្លាំង', + 'stock_out' => 'ទំនិញចេញពីឃ្លាំង', + 'inventory_report' => 'របាយការណ៍សារពើភ័ណ្ឌ', + 'item' => 'សារពើភ័ណ្ឌ', + 'supplier' => 'អ្នកផ្គត់ផ្គង់', + 'item_group' => 'ក្រុមសារពើភ័ណ្ឌ', + 'item_unit' => 'ឯកត្តារង្វាស់រង្វាល់', + 'grn_number' => 'លេខកូដទទួលទំនិញ', + 'po_number' => 'លេខបញ្ជាទិញ', + 'received_date' => 'ថ្ងៃទទួលទំនិញ', + 'total_amount' => 'ទឹកប្រាក់សរុប', + 'grn_num_or_supplier' => 'លេខកូដទទួលទំនិញ ឬ ឈ្មោះអ្នកផ្គត់ផ្គង់', + 'quantity' => 'បរិមាណ', + 'expiry_date' => 'ថ្ងៃផុតកំណត់', + + 'gin_number' => 'លេខកូដបញ្ចេញទំនិញ', + 'issued_date' => 'ថ្ងៃបញ្ចេញទំនិញ', + 'description' => 'បរិយាយ', + 'report_type' => 'ប្រភេទរបាយការណ៍', + 'inventory_on_hand' => 'ទំនិញក្នុងឃ្លាំង', + 'expire_report' => 'ទំនិញផុតកំណត់', + 'report_date' => 'ថ្ងៃធ្វើរបាយការណ៍', + + 'item_name' => 'ឈ្មោះទំនិញ', + 'on_hand' => 'ទំនិញក្នុងស្តុក', + 'last_stock_in' => 'ថ្ងៃទំនិញចូលចុងក្រោយ', + 'last_stock_out' => 'ថ្ងៃទំនិញចេញចុងក្រោយ', + 'stock_in_date' => 'ថ្ងៃទំនិញចូល', + 'expire_date' => 'ថ្ងៃផុតកំណត់', + '_month' => 'ចំនួនខែ', + + 'code' => 'លេខសំគាល់', + 'sale_price' => 'តម្លៃលក់', + 'is_vaccination' => 'ជាប្រភេទថ្នាំបង្ការ', + 'vat_number' => 'លេខពន្ធអាករ', + 'supplier_name' => 'ឈ្មោះក្រុមហ៊ុនផ្គត់ផ្គង់', + 'contact_person' => 'ឈ្មោះបុគ្គលិក', + 'position' => 'មុខតំណែង', + 'phone' => 'លេខទូរស័ព្ទ', + 'email' => 'អ៊ីមែល', + 'address' => 'អាស័យដ្ឋាន', + 'packaged_item' => 'ទំនិញជាកញ្ចប់', + + 'medical_record' => 'កំណត់ត្រាវេជ្ជសាស្ត្រ', + + 'concept_code' => 'លេខកូដខន់សិប', + 'class' => 'ក្រុម', + 'sub_class' => 'ក្រុមរង', + 'create_success' => 'បង្កើតបានសម្រេច', + 'create_fail' => 'បង្កើតមិនបានសម្រេច', + 'update_success' => 'កែប្រែបានសម្រេច', + 'update_fail' => 'កែប្រែមិនបានសម្រេច', + 'get_success' => 'ទាញបានសម្រេច', + 'get_fail' => 'ទាញមិនបានសម្រេច', + 'delete_success' => 'លុបបានសម្រេច', + 'delete_fail' => 'លុបមិនបានសម្រេច', + 'restore_success' => 'ស្តារបានសម្រេច', + 'restore_fail' => 'ស្តារមិនបានសម្រេច', + + 'evaluation' => 'ការវាយតម្លៃ', + 'evaluation_summary' => 'វាយតម្លៃសង្ខេប', + + 'queues' => 'តារាងរង់ចាំ', + 'queue_no' => 'លេខរង់ចាំ', + 'save_to_queue' => 'បញ្ចូលក្នុងតារាងរង់ចាំ', + + 'systolic' => 'ស៊ីស្តូលិក', + 'diastolic' => 'យ៉ាស្តូលិក', + 'glucose' => 'កម្រិតស្ករក្នុងឈាម', + + 'onset_date' => 'ថ្ងៃចាប់ផ្តើមចេញអាការៈ', + 'clinical_feature' => 'សញ្ញាគ្លីនិក', + 'sign' => 'សញ្ញា', + 'general_appearance' => 'លក្ខណៈទូទៅ', + 'status' => 'ស្ថានភាព', + 'other' => 'ផ្សេងទៀត', + 'ent' => 'ត្រចៀក ច្រមុះ បំពង់ក', + 'ears' => 'ត្រចៀក', + 'nose' => 'ច្រមុះ', + 'throat' => 'បំពង់ក', + 'cardio_system' => 'ប្រព័ន្ធសរសៃឈាមបេះដូង', + 'heart_sound' => 'ចង្វាក់បេះដូង', + 'cardio_refill_time' => 'ពេលវេលាបំពេញ Capillary', + 'resp_system' => 'ប្រព័ន្ធផ្លូវដង្ហើម', + 'inspection' => 'ការត្រួតពិនិត្យ', + 'percussion' => 'ការគោះ', + 'auscultation' => 'អាស្កាល់ថេសិន', + 'palpation' => 'ផាល់ផេសិន', + 'uro_system' => 'ប្រព័ន្ធ Urogenital', + 'skin' => 'ស្បែក', + 'edema' => 'ហើម', + 'wounds' => 'របួស', + 'rash' => 'កន្ទួល', + 'nervous_system' => 'ប្រព័ន្ធសរសៃប្រសាទ', + 'neurological' => 'សរសៃប្រសាទ', + 'mental_status' => 'ស្ថានភាពផ្លូវចិត្ត', + 'eyes' => 'ភ្នែក', + 'verbal' => 'ពាក្យសំដី', + 'motion' => 'ចលនា', + 'mental_total' => 'សរុប', + 'specify' => 'បញ្ជាក់', + 'gastro_system' => 'ប្រព័ន្ធក្រពះ-ពោះវៀន', + 'speech' => 'ការនិយាយស្តី', + 'mood' => 'អារម្មណ៍និងការប៉ះពាល់', + 'thought' => 'ការគិត', + 'insight' => 'ការយល់ឃើញ និងការវិនិច្ឆ័យ', + 'consciousness' => 'ឆន្ទៈ', + 'abdomen' => 'ផ្នែកពោះ', + 'perception' => 'ការយល់ឃើញ', + 'coma' => 'ការវាស់វែងសភាពសន្លប់', + 'print_consult_form' => 'បោះពុម្ពទម្រង់ពិគ្រោះ', + 'document_title' => 'បរិយាយឯកសារ', + 'file_name' => 'ឈ្មោះឯកសារ', + 'file_type' => 'ប្រភេទ', + + +]; diff --git a/lang/kh/organism.php b/lang/kh/organism.php new file mode 100644 index 0000000..3c2f8ad --- /dev/null +++ b/lang/kh/organism.php @@ -0,0 +1,27 @@ + 'តារាងមេរោគ', + 'search_placeholder' => 'ឈ្មោះមេរោគ', + 'table_no' => 'ទេ', + 'table_name' => 'ឈ្មោះ', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'បន្ថែមមេរោគថ្មី', + 'form_name' => 'ទម្រង់មេរោគ', + 'form_sort' => 'លេខរៀង', + 'form_edit_tittle' => 'កែប្រែឈ្មោះមេរោគ', + 'is_bold' => 'អក្សរដិត', + + 'create_success' => 'ឈ្មោះមេរោគថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតឈ្មោះមេរោគថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានឈ្មោះមេរោគកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានឈ្មោះមេរោគបានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានឈ្មោះមេរោគលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានឈ្មោះមេរោគចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានឈ្មោះមេរោគស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានឈ្មោះមេរោគបានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានឈ្មោះមេរោគទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានឈ្មោះមេរោគបានទេ។ សូមសាកល្បងម្តងទៀត' + +]; diff --git a/lang/kh/patient.php b/lang/kh/patient.php new file mode 100644 index 0000000..4656113 --- /dev/null +++ b/lang/kh/patient.php @@ -0,0 +1,76 @@ + 'តារាងអ្នកជំងឺ', + 'search_placeholdolder' => 'ឈ្មោះអ្នកជំងឺ ឬលេខទូរស័ព្ទ…', + 'table_no' => 'ល.រ', + 'table_code' => 'លេខកូដ', + 'table_name' => 'ឈ្មោះ', + 'table_sex' => 'ភេទ', + 'table_phon' => 'លេខទូរស័ព្ទ', + 'table_have_sample' => 'មានសំណាក', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_title' => 'អ្នកជំងឺថ្មី', + 'form_edit_title' => 'កែប្រែព័ត៌មានអ្នកជំងឺ', + 'form_code' => 'លេខកូដអ្នកជំងឺ', + 'form_name' => 'ឈ្មោះអ្នកជំងឺ', + 'form_dob' => 'ថ្ងៃខែឆ្នាំកំណើត ឬអាយុ', + 'form_age' => 'អាយុ', + 'form_gender' => 'ភេទ', + 'form_sex_male' => 'ប្រុស', + 'form_sex_female' => 'ស្រី', + 'form_sex_other' => 'ផ្សេងទៀត', + 'form_khid' => 'លេខអត្តសញ្ញាណប័ណ្ណ', + 'form_phone' => 'លេខទូរស័ព្ទ', + 'form_house' => 'លេខផ្ទះ', + 'form_street' => 'លេខផ្លូវ', + 'form_province' => 'ខេត្ត/រាជធានី', + 'form_district' => 'ស្រុក', + 'form_commune' => 'ឃុំ', + 'form_village' => 'ភូមិ', + 'form_alt_generate_puuid' => 'បង្កើតលេខកូដអ្នកជំងឺ', + + 'create_success' => 'អ្នកជំងឺថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតអ្នកជំងឺថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានអ្នកជំងឺកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានអ្នកជំងឺបានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានអ្នកជំងឺលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានអ្នកជំងឺចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានអ្នកជំងឺស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានអ្នកជំងឺបានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានអ្នកជំងឺទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានអ្នកជំងឺបានទេ។ សូមសាកល្បងម្តងទៀត', + + 'basic_information' => 'ព័ត៌មានមូលដ្នាន', + 'identifiers' => 'អត្តសញ្ញាណឯកតជន', + 'contact_detail' => 'ព័ត៌មានទំនាក់ទំនង', + 'medical_history' => 'ប្រវត្តិវេជ្ជសាស្ត្រ', + 'first_name' => 'នាមត្រកូល', + 'last_name' => 'នាមខ្លូន', + 'dob' => 'ថ្ងៃខែឆ្នាំកំណើត', + 'marital_status' => 'ស្ថានភាពគ្រួសារ', + 'single' => 'នៅលីវ', + 'married' => 'មានគ្រួសារ', + 'other' => 'ផ្សេងៗ', + 'are_in_num' => 'ឬ អាយុគិតជាឆ្នាំ ខែ និងថ្ងៃ', + 'blood_group' => 'ក្រុមឈាម', + 'khid' => 'លេខអត្តសញ្ញាណប័ណ្ណ', + 'passport' => 'លេខលិខិតឆ្លងដែន', + 'nhid' => 'លេខប័ណ្ណសុខភាព', + 'create_new' => 'ចុះឈ្មោះអ្នកជំងឺថ្មី', + 'street' => 'លេខផ្លូវ', + 'house_no' => 'លេខផ្ទះ', + 'email' => 'សារអេឡិចត្រូនិច', + 'allergy' => 'អាលែកហ្ស៊ី', + 'chronic_disease' => 'ជំងឺរាំរ៉ៃ', + 'past_surgery' => 'ប្រវត្តិវះកាត់', + 'family_history' => 'ប្រវត្តិសុខភាពគ្រួសារ', + 'vaccination_history' => 'ប្រវត្តិចាក់ថ្នាំបង្ការ', + 'save_patient' => 'រក្សាទុកព័ត៌មានអ្នកជំងឺ', + 'save_consult' => 'ពិគ្រោះ', + 'save_queue' => 'បញ្ជូនទៅកន្លែងរង់ចាំ', + 'cancel' => 'បោះបង់', + 'sample' => 'សំណាក' + +]; diff --git a/lang/kh/patient_type.php b/lang/kh/patient_type.php new file mode 100644 index 0000000..df44979 --- /dev/null +++ b/lang/kh/patient_type.php @@ -0,0 +1,33 @@ + 'តារាងប្រភេទអ្នកជំងឺ', + 'search_placeholder' => 'ឈ្មោះប្រភេទអ្មកជំងឺ', + 'table_no' => 'ល.រ', + 'table_name' => 'ឈ្មោះ', + 'table_gender' => 'ភេទ', + 'table_age_from' => 'អាយុចាប់ពី', + 'table_age_to' => 'អាយុដល់', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'ប្រភេទអ្នកជំងឺថ្មី', + 'form_name' => 'ឈ្មោះ', + 'form_max_age' => 'អាយុច្រើនបំផុត', + 'form_min_age' => 'អាយុតិចបំផុត', + 'form_edit_tittle' => 'កែប្រែប្រភេទអ្នកជំងឺ', + 'form_input_day' => 'ថ្ងៃ', + 'form_input_month' => 'ខែ', + 'form_input_year' => 'ឆ្នាំ', + + 'create_success' => 'ប្រភេទអ្នកជំងឺថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតប្រភេទអ្នកជំងឺថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានប្រភេទអ្នកជំងឺកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានប្រភេទអ្នកជំងឺបានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានប្រភេទអ្នកជំងឺលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានប្រភេទអ្នកជំងឺចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានប្រភេទអ្នកជំងឺស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានប្រភេទអ្នកជំងឺបានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានប្រភេទអ្នកជំងឺទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានប្រភេទអ្នកជំងឺបានទេ។ សូមសាកល្បងម្តងទៀត' + +]; diff --git a/lang/kh/permission.php b/lang/kh/permission.php new file mode 100644 index 0000000..8a3a81e --- /dev/null +++ b/lang/kh/permission.php @@ -0,0 +1,72 @@ + 'មើលអ្នកជំងឺ', + 'create_patient' => 'បង្កើតអ្នកជំងឺ', + 'update_patient' => 'ធ្វើបច្ចុប្បន្នភាពអ្នកជំងឺ', + 'delete_patient' => 'លុបអ្នកជំងឺ', + 'view_sample' => 'មើលសំណាក', + 'create_sample' => 'ចុះឈ្មោះសំណាក', + 'update_sample' => 'កែប្រែសំណាក', + 'delete_sample' => 'លុបសំណាក', + 'add_result' => 'បន្ថែមលទ្ធផល', + 'view_result' => 'ចូលមើលលទ្ធផល', + 'update_result' => 'ធ្វើបច្ចុប្បន្នភាពលទ្ធផល', + 'delete_result' => 'លុបលទ្ធផល', + 'approve_result' => 'អនុម័តលទ្ធផល', + 'print_result' => 'បោះពុម្ភលទ្ធផល', + 'view_invoice' => 'ចូលមើលវិក័យប័ត្រ', + 'create_invoice' => 'បង្កើតវិក័យប័ត្រ', + 'update_invoice' => 'ធ្វើបច្ចុប្បន្នភាពវិក័យប័ត្រ', + 'delete_invoice' => 'លុបវិក័យប័ត្រ', + 'generate_doctor_report' => 'បង្កើតរបាយណ៌ការគ្រូពេទ្យ', + 'generate_summary_report' => 'បង្កើតរបាយណ៌ការសរុបរួម', + 'view_dashboard' => 'ចូលមើលផ្ទាំងបង្ហាញទិន្នន័យ', + 'update_laboratory_information' => 'ធ្វើបច្ចុប្បន្នភាពព័ត៌មានមន្ទីរពិសោធន៌', + 'view_department' => 'ចូលមើលផ្នែកមន្ទីរពិសោធន៌', + 'create_department' => 'បង្កើតផ្នែកមន្ទីរពិសោធន៌', + 'update_department' => 'ធ្វើបច្ចុប្បន្នភាពផ្នែកមន្ទីរពិសោធន៌', + 'delete_department' => 'លុបផ្នែកមន្ទីរពិសោធន៌', + 'view_sample_type' => 'ចូលមើលប្រភេទសំណាក', + 'create_sample_type' => 'បង្កើតប្រភេទសំណាក', + 'update_sample_type' => 'ធ្វើបច្ចុប្បន្នភាពប្រភេទសំណាក', + 'delete_sample_type' => 'លុបប្រភេទសំណាក', + 'view_test_sample' => 'ចូលមើលសំណាកតេស្ត', + 'create_test_sample' => 'បង្កើតសំណាកតេស្ត', + 'update_test_sample' => 'ធ្វើបច្ចុប្បន្នភាពសំណាកតេស្ត', + 'delete_test_sample' => 'លុបសំណាកតេស្ត', + 'view_comment' => 'ចូលមើលយោបល់', + 'create_comment' => 'បង្កើតយោបល់', + 'update_comment' => 'ធ្វើបច្ចុប្បន្នភាពយោបល់', + 'delete_comment' => 'លុបយោបល់', + 'view_organism' => 'ចូលមើលមេរោគ', + 'create_organism' => 'បង្កើតមេរោគ', + 'update_organism' => 'ធ្វើបច្ចុប្បន្នភាពមេរោគ', + 'delete_organism' => 'លុបមេរោគ', + 'view_antibiotic' => 'មើលអង់ទីប៊ីយោទិក', + 'create_antibiotic' => 'បង្កើតអង់ទីប៊ីយោទិក', + 'update_antibiotic' => 'កែប្រែអង់ទីប៊ីយោទិក', + 'delete_antibiotic' => 'លុបអង់ទីប៊ីយោទិក', + 'view_quantity' => 'ចូលមើលបរិមាណ', + 'create_quantity' => 'បង្កើតបរិមាណ', + 'update_quantity' => 'ធ្វើបច្ចុប្បន្នភាពបរិមាណ', + 'delete_quantity' => 'លុបបរិមាណ', + 'view_sample_source' => 'មើលប្រភពសំណាក', + 'create_sample_source' => 'បង្កើតប្រភពសំណាក', + 'update_sample_source' => 'ធ្វើបច្ចុប្បន្នភាពប្រភពសំណាក', + 'delete_sample_source' => 'លុបប្រភពសំណាក', + 'view_patient_type' => 'មើលប្រភេទអ្នកជំងឺ', + 'create_patient_type' => 'បង្កើតប្រភេទអ្មកជំងឺ', + 'update_patient_type' => 'ធ្វើបច្ចុប្បន្នភាពប្រភេទអ្នកជំងឺ', + 'delete_patient_type' => 'លុបប្រភេទអ្នកជំងឺ', + 'view_physician' => 'មើលគ្រូពេទ្យ', + 'create_physician' => 'បង្កើតគ្រូពេទ្យ', + 'update_physician' => 'ធ្វើបច្ចុប្បន្នភាពគ្រូពេទ្យ', + 'delete_physician' => 'លុបគ្រូពេទ្យ', + 'view_user_account' => 'មើលគណនីអ្នកប្រើប្រាស់', + 'create_user_account' => 'បង្កើតគណនីអ្នកប្រើប្រាស់', + 'update_user_account' => 'ធ្វើបច្ចុប្បន្នភាពគណនីអ្នកប្រើប្រាស់', + 'delete_user_account,' => 'លុបគណនីអ្នកប្រើប្រាស់', + 'assign_lab' => 'កំណត់មន្ទីរពិសោធន៌', + +]; diff --git a/lang/kh/physician.php b/lang/kh/physician.php new file mode 100644 index 0000000..16208e9 --- /dev/null +++ b/lang/kh/physician.php @@ -0,0 +1,31 @@ + 'តារាងបញ្ជីគ្រូពេទ្យ', + 'search_placeholder' => 'ឈ្មោះគ្រូពេទ្យ', + 'table_no' => 'ល.រ', + 'table_name' => 'ឈ្មោះ', + 'table_logo' => 'រូបតំណាង', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'បន្ថែមគ្រូពេទ្យថ្មី', + 'form_name' => 'ឈ្មោះ', + 'form_logo_upload' => 'បញ្ចូល', + 'form_logo' => 'គម្រូក្បាលទំព័រ', + 'form_edit_tittle' => 'កែប្រែគ្រូពេទ្យ', + 'confirm_delete_photo' => 'តើអ្នកពិតជាចង់លុបរូបតំណាងរបស់គ្រូពេទ្យនេះមែនឬទេ?', + 'ok_delete' => 'បាទ/ចាស, លុប', + 'cancel_delete' => 'ទេ, បោះបង់', + 'confirm_delete' => 'តើអ្នកពិតជាចង់លុបគ្រូពេទ្យនេះមែនឬទេ?', + 'delete_photo_success' => 'រូបតំណាងរបស់គ្រូពេទ្យលុបបានសម្រេច', + 'delete_photo_failed' => 'រូបតំណាងរបស់គ្រូពេទ្យមិនអាចលុបបានទេ', + + 'delete_success' => 'ព័ត៌មានគ្រូពេទ្យលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានគ្រូពេទ្យចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានគ្រូពេទ្យស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានគ្រូពេទ្យបានទេ។ សូមសាកល្បងម្តងទៀត', + + 'form_footer' => 'គម្រូជើងទំព័រ', + 'default_select' => 'បុរេសកម្ម' + +]; diff --git a/lang/kh/quantity.php b/lang/kh/quantity.php new file mode 100644 index 0000000..fdec084 --- /dev/null +++ b/lang/kh/quantity.php @@ -0,0 +1,26 @@ + 'តារាងបរិមាណ', + 'search_placeholder' => 'ឈ្មោះបរិមាណ...', + 'table_no' => 'ល.រ', + 'table_name' => 'ឈ្មោះ', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'បរិមាណថ្មី', + 'form_name' => 'បរិមាណ', + 'form_sort' => 'លេខរៀង', + 'form_edit_tittle' => 'កែប្រែបរិមាណ', + + 'create_success' => 'បរិមាណថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតបរិមាណថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានបរិមាណកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានបរិមាណបានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានបរិមាណលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានបរិមាណចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានបរិមាណស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានបរិមាណបានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានបរិមាណទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានបរិមាណបានទេ។ សូមសាកល្បងម្តងទៀត' + +]; diff --git a/lang/kh/report.php b/lang/kh/report.php new file mode 100644 index 0000000..66f8ca5 --- /dev/null +++ b/lang/kh/report.php @@ -0,0 +1,26 @@ + 'របាយការណ៍សរុបរួម', + 'summary_rpt_fd_filter' => 'ចាប់ពីថ្ងៃ', + 'summary_rpt_td_filter' => 'រហូតដល់ថ្ងៃ', + 'btn_view' => 'បង្ហាញរបាយការណ៍', + 'btn_action' => 'ប្រតិបត្តិការ', + 'btn_action_print' => 'បោះពុម្ភ', + 'btn_action_export' => 'ទាញជា Excel', + 'summary_report_section_by_test' => 'របាយការណ៍សរុបតាមតេស្ត', + 'summary_report_section_by_sample_source' => 'របាយការណ៍សរុបតាមប្រភពសំណាក', + 'summary_rpt_test_type' => 'ប្រភេទតេស្ត', + 'summary_male_patient' => 'អ្នកជំងឺប្រុស', + 'summary_female_patient' => 'អ្នកជំងឺស្រី', + 'summary_total_patient' => 'អ្នកជំងឺសរុប', + 'summary_clinic_name' => 'ប្រភពសំណាក', + 'doctor_date_range_filter' => 'កាលបរិច្ឆេទ', + 'doctor_sample_source_filter' => 'ប្រភពសំណាក', + 'doctor_physician_filter' => 'គ្រូពេទ្យ', + 'doctor_exam' => 'ចំនួនតេស្ត', + 'doctor_net_amount' => 'តម្លៃត្រូវទូទាត់', + 'summary_report_section_by_category'=>'របាយការណ៍សរុបតាមប្រភេទតេស្ត', + 'summary_category_name'=>'ប្រភេទតេស្ត', + 'total' => 'សរុប' + +]; diff --git a/lang/kh/sample.php b/lang/kh/sample.php new file mode 100644 index 0000000..f0d75d2 --- /dev/null +++ b/lang/kh/sample.php @@ -0,0 +1,113 @@ + 'តារាងសំណាក', + 'table_no' => 'ល.រ', + 'table_patient_code' => 'លេខកូដអ្នកជំងឺ', + 'table_patient_name' => 'ឈ្មោះអ្នកជំងឺ', + 'table_sample_number' => 'លេខកូដសំណាក', + 'table_collected_date' => 'ថ្ងៃស្នើសុំធ្វើតេស្ត', + 'table_received_date' => 'ថ្ងៃទទួលសំណាក', + 'table_sample_source' => 'ប្រភពសំណាក', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_title' => 'បង្កើតសំណាកថ្មី', + 'form_patient' => 'អ្នកជំងឺ', + 'form_sample_number' => 'លេខកូដសំណាក', + 'form_sample_source' => 'ប្រភពសំណាក', + 'form_requester' => 'ស្នើសុំដោយ', + 'form_collected_date' => 'ថ្ងៃស្នើសុំធ្វើតេស្ត', + 'form_received_date' => 'ថ្ងៃទទួលសំណាក', + 'form_admission_date' => 'ថ្ងៃចូលសម្រាកពេទ្យ', + 'form_diagnisis' => 'រោគវិនិច្ឆ័យ', + 'form_sample_condition' => 'ស្ថានភាពសំណាក', + 'form_reject_reason' => 'មូលហេតុបដិសេធ', + 'form_is_urgent' => 'បន្ទាន់', + 'form_btn_save_assign_test' => 'រក្សាទុក និងបញ្ចូលតេស្ត', + 'form_patient_info_title' => 'ព័ត៌មានអ្នកជំងឺ', + 'form_patient_code' => 'លេខកូដអ្នកជំងឺ', + 'form_patient_name' => 'ឈ្មោះអ្នកជំងឺ', + 'form_patient_gender' => 'ភេទ', + 'form_patient_age' => 'អាយុ', + 'form_patient_mobile' => 'លេខទូរស័ព្ទ', + 'form_patient_address' => 'អាសយដ្ឋាន', + 'form_edit_title' => 'កែប្រែសំណាក', + 'form_btn_update' => 'កែប្រែ', + 'form_btn_assign_test' => 'ជ្រើសរើសតេស្ត', + 'form_btn_add_result' => 'បញ្ចូលលទ្ធផល', + 'form_btn_preview_result' => 'មើលលទ្ធផល', + 'from_btn_remove' => 'លុបចេញ', + 'form_btn_new_sample' => 'បង្កើតសំណាកថ្មី', + 'assign_test_modal_title' => 'ជ្រើសរើសតេស្ត', + 'assign_test_save_template' => 'បង្កើតក្រុមតេស្ត', + 'assign_test_make_invoice' => 'បង្កើតវិក្កយបត្រ', + 'assign_test_total_fee_text' => 'តម្លៃសរុប', + 'assign_test_total_test' => 'ចំនួនតេស្តស្នើសុំ', + 'assign_test_btn_save' => 'រក្សាទុក', + 'assign_test_btn_save_add_result' => 'រក្សាទុក និងបញ្ចូលលទ្ធផល', + 'assign_test_btn_cancel' => 'បោះបង់', + 'add_result_title' => 'បញ្ចូលលទ្ធផល', + 'sample_entry_by' => 'បញ្ចូលសំណាកដោយ', + 'sample_modify_by' => 'កែប្រែដោយ', + 'add_result_test' => 'ឈ្មោះតេស្ត', + 'add_result_result' => 'លទ្ធផល', + 'add_result_unit_sign' => 'សញ្ញាឯកត្តា', + 'add_result_ref_range' => 'តម្លៃយោង', + 'add_result_test_date' => 'ថ្ងៃធ្វើតេស្ត', + 'add_result_performed_by' => 'តេស្តដោយ', + 'add_result_hide' => 'លាក់', + 'add_result_btn_edit_test' => 'កែប្រែតេស្ត', + 'add_result_btn_save' => 'រក្សាទុក', + 'add_result_btn_save_preview' => 'រក្សាទុក និងមើលលទ្ធផល', + 'add_result_btn_cancel' => 'បោះបង់', + 'print_title' => 'លទ្ធផលមន្ទីរពិសោធន៍', + 'btn_print' => 'បោះពុម្ព', + 'btn_approve' => 'យល់ព្រម', + 'last_test_date' => 'ថ្ងៃធ្វើតេស្តចុងក្រោយ', + 'verify_by' => 'ផ្ទៀងផ្ទាត់ដោយ', + 'report_date' => 'ថ្ងៃធ្វើរបាយការណ៍', + + 'lab_technician' => 'បុគ្គលិកមន្ទី​រពិសោធន៍ ', + 'physician_name' => 'ឈ្មោះគ្រូពេទ្យ', + + 'search_placeholder' => 'ឈ្មោះអ្នកជំងឺ ឬលេខទូរស័ព្ទ..', + + 'condition_good' => 'ល្អ', + 'condition_reject' => 'បដិសេធ', + 'condition_acceptable' => 'អាចទទួលយកបាន', + + 'requested_date' => 'ថ្ងៃស្នើ​សុំ', + + 'year' => ' ឆ្នាំ', + 'month' => ' ខែ', + 'day' => ' ថ្ងៃ', + 'sex_m' => ' ប្រុស', + 'sex_f' => ' ស្រី', + + 'create_success' => 'សំណាកថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតសំណាកថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានសំណាកកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានសំណាកបានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានសំណាកលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានសំណាកចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានសំណាកស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានសំណាកបានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានសំណាកទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានសំណាកបានទេ។ សូមសាកល្បងម្តងទៀត', + + 'approve_success' => 'សំណាកអនុម័ត្តបានសម្រេច', + 'approve_fail' => 'មិនអាចអនុម័ត្តសំណាកបានទេ', + + 'filter_all' => 'បង្ហាញទាំងអស់', + 'filter_rejected' => 'បានបដិសេធ', + 'filter_pending' => 'កំពុងរង់ចាំ', + 'filter_processing' => 'កំពុងដំណើរការ', + 'filter_completed' => 'រួចរាល់', + 'filter_printed' => 'បានបោះពុម្ព', + 'clear_selection' => 'ជម្រះជម្រើសតេស្ត', + 'print_label' => 'បោះពុម្ព Label', + 'previous_result' => 'ប្រវត្តិលទ្ធផល', + 'sample_status' => ' ស្ថានភាព ' + +]; diff --git a/lang/kh/sample_source.php b/lang/kh/sample_source.php new file mode 100644 index 0000000..ae8209d --- /dev/null +++ b/lang/kh/sample_source.php @@ -0,0 +1,25 @@ + 'តារាងប្រភពសំណាក', + 'search_placeholder' => 'ឈ្មោះប្រភពសំណាក', + 'table_no' => 'ល.រ', + 'table_name' => 'ឈ្មោះ', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'ប្រភពសំណាកថ្មី', + 'form_name' => 'ឈ្មោះ', + 'form_sort' => 'លេខរៀង', + 'form_edit_tittle' => 'កែប្រែប្រភពសំណាក', + + 'create_success' => 'ប្រភពសំណាកថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតប្រភពសំណាកថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានប្រភពសំណាកកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានប្រភពសំណាកបានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានប្រភពសំណាកលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានប្រភពសំណាកចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានប្រភពសំណាកស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានប្រភពសំណាកបានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានប្រភពសំណាកទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានប្រភពសំណាកបានទេ។ សូមសាកល្បងម្តងទៀត' +]; diff --git a/lang/kh/sample_type.php b/lang/kh/sample_type.php new file mode 100644 index 0000000..8bab2f5 --- /dev/null +++ b/lang/kh/sample_type.php @@ -0,0 +1,33 @@ + 'តារាងប្រភេទសំណាក', + 'search_placeholder' => 'ឈ្មោះប្រភេទសំណាក...', + 'table_no' => 'ល.រ', + 'table_name' => 'ឈ្មោះ', + 'table_department' => 'ផ្នែកមន្ទីរពិសោធន៌', + 'table_sample_type' => 'ប្រភេទសំណាក', + 'table_description' => 'ពិពណ៌នា', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'ប្រភេទសំណាកថ្មី', + 'form_name' => 'ឈ្មោះ', + 'form_sort' => 'លេខរៀង', + 'form_department' => 'ផ្នែកមន្ទីរពិសោធន៌', + 'form_select_all_department' => 'ជ្រើសរើសផ្នែកមន្ទីរពិសោធន៌ទាំងអស់', + 'form_edit_tittle' => 'កែប្រែប្រភេទសំណាក', + 'form_sample_description' => 'ប្រភេទសំណាក', + 'tube' => 'ប្រភេទទីប', + + 'create_success' => 'ប្រភេទសំណាកថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតប្រភេទសំណាកថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានប្រភេទសំណាកកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានប្រភេទសំណាកបានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានប្រភេទសំណាកលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានប្រភេទសំណាកចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានប្រភេទសំណាកស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានប្រភេទសំណាកបានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានប្រភេទសំណាកទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានប្រភេទសំណាកបានទេ។ សូមសាកល្បងម្តងទៀត' + +]; diff --git a/lang/kh/sidebar.php b/lang/kh/sidebar.php new file mode 100644 index 0000000..afba6c2 --- /dev/null +++ b/lang/kh/sidebar.php @@ -0,0 +1,60 @@ + 'ផ្ទាំងព័ត៌មានសង្ខេប', + 'patients' => 'គ្រប់គ្រងអ្នកជំងឺ', + 'new_patient' => 'ចុះឈ្មោះអ្នកជំងឺ', + 'patient_list' => 'តារាងអ្នកជំងឺ', + 'appointment' => 'តារាងណាត់ជួប', + 'sample' => 'សំណាក', + 'new_sample' => 'បញ្ចូលសំណាកថ្មី', + 'invoice_list' => 'Invoice List', + 'report' => 'របាយការណ៍', + 'lab_manager' => 'Lab Manager', + 'laboratory-profile' => 'Lab Profile', + 'department' => 'ផ្នែកមន្ទីរពិសោធន៍', + 'sample_types' => 'ប្រភេទសំណាក', + 'test_sample' => 'តេស្ត', + 'comment' => 'មតិយោបល់', + 'organism' => 'មេរោគ/លទ្ធផលជ្រើសរើស', + 'antibiotic' => 'ឱសថប្រឆាំងមេរោគ', + 'quantity' => 'បរិមាណ', + 'sample_source' => 'ប្រភពសំណាក', + 'patient_type' => 'ប្រភេទអ្នកជំងឺ', + 'physician' => 'គ្រូពេទ្យ', + 'user_account' => 'User Accounts', + 'administrator' => 'Administrator', + 'laboratory' => 'Laboratories', + 'system_role' => 'System Roles', + 'change_lab' => 'Change Lab', + 'logout' => 'Logout', + 'clone_lab' => 'Clone Laboratory', + 'medicines' => 'Logistics', + 'supplier' => 'Supplier', + 'medicine_group' => 'Item Group', + 'medicine_unit' => 'Item Unit', + 'medicine' => 'Items', + 'stockin' => 'Stock In', + 'stockout' => 'Stock Out', + + 'inventory_report' => 'Inventory Report', + + 'vaccination' => 'Vaccination', + 'new_vaccination' => 'New Vaccination', + 'vaccination_list' => 'Vaccination List', + 'publication' => 'Messages', + + 'laboratory_configures' => 'រចនាសម្ព័ន្ធមន្ទីរពិសោធន៍', + 'aggregate_report' => 'របាយការណ៍សង្ខេប', + 'doctor_report' => 'របាយការណ៍គ្រូពេទ្យ', + 'financial_report' => 'របាយការណ៍ហិរញ្ញវត្ថុ', + 'invoice'=>'វិក័យប័ត្រ', + 'payments'=>'គ្រប់គ្រងវិក័យប័ត្រ & បង់ប្រាក់', + 'payment'=> 'តារាងបង់ប្រាក់', + 'sample_management' => 'គ្រប់គ្រងសំណាក', + 'create_sample' => 'បញ្ចូលសំណាកថ្មី', + 'view_sample' => 'តារាងសំណាក' + + + +]; diff --git a/lang/kh/system_role.php b/lang/kh/system_role.php new file mode 100644 index 0000000..c2f2e31 --- /dev/null +++ b/lang/kh/system_role.php @@ -0,0 +1,29 @@ + 'តួនាទីប្រព័ន្ធ', + 'search_placeholder' => 'ឈ្មោះតួនាទី', + 'table_no' => 'ល.រ', + 'table_name' => 'ឈ្មោះ', + 'table_default_page' => 'ទំព័រដើម', + 'table_permission' => 'សិទ្ធិប្រើប្រាស់', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'បង្កើតតួនាទីប្រព័ន្ធ', + 'form_name' => 'ឈ្មោះ', + 'form_edit_tittle' => 'កែប្រែតួនាទីប្រព័ន្ធ', + 'form_system_role' => 'តួនាទីប្រព័ន្ធ', + + 'create_success' => 'តួនាទីប្រព័ន្ធថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតតួនាទីប្រព័ន្ធថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានតួនាទីប្រព័ន្ធកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានតួនាទីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានតួនាទីប្រព័ន្ធលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានតួនាទីប្រព័ន្ធចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានតួនាទីប្រព័ន្ធស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានតួនាទីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានតួនាទីប្រព័ន្ធទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានតួនាទីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត' + + +]; diff --git a/lang/kh/test_sample.php b/lang/kh/test_sample.php new file mode 100644 index 0000000..538cea2 --- /dev/null +++ b/lang/kh/test_sample.php @@ -0,0 +1,68 @@ + 'តារាងតេស្ត', + 'search_placeholder' => 'ផ្នែកមន្ទីរពិសោន័ ប្រភេទសំណាក ឬ ឈ្មោះតេស្ត', + 'table_no' => 'ល.រ', + 'table_name' => 'ឈ្មោះតេស្ត', + 'table_department' => 'ផ្នែកមន្ទីរពិសោធន៌', + 'table_sample_type' => 'ប្រភេទសំណាក', + 'table_sign' => 'សញ្ញា', + 'table_group_result' => 'ក្រុមលទ្ធផល', + 'table_field_type' => 'ប្រភេទទិន្នន័យ', + 'table_price' => 'តម្លៃ​', + 'table_sort' => 'លេខរៀង', + 'table_btn_pc' => 'ប្រាក់ចំណែកគ្រូពេទ្យ', + 'pc_physician' => 'គ្រូពេទ្យ', + 'pc_rate' => 'ប្រាក់ចំណែក', + 'pc_btn_apply_all_test' => 'អនុវត្តគ្រប់តេស្តទាំងអស់', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'សំណាកតេស្តថ្មី', + 'form_test_name' => 'ឈ្មោះតេស្ត', + 'form_unit_sign' => 'ខ្នាតសញ្ញា', + 'form_field_type' => 'ប្រភេទទិន្នន័យ', + 'form_edit_tittle' => 'កែប្រែសំណាកតេស្ត', + 'form_description' => 'ការពណ៌នា', + 'form_format' => 'កំណត់ទំរង់', + 'form_ref_range' => 'តម្លៃយោង', + 'form_ref_min' => 'តម្លៃអបបរិមា', + 'form_ref_sign' => 'សញ្ញា', + 'form_ref_max' => 'តម្លៃអតិបរិមា', + 'form_ref_patient_type' => 'ប្រភេទអ្នកជំងឺ', + 'form_organism' => 'មេរោគ និង ថ្នាំអង់ទីប៊ីយោទិក', + 'organism_input_placeholder' => 'ឈ្មោះមេរោគ', + 'antibiotic_inut_placeholder' => 'ថ្នាំអង់ទីប៊ីយោទិក', + 'form_organism_selected' => 'បានជ្រើសរើស', + 'form_formula' => 'រូបមន្ត', + 'formula_equation' => 'ប្រមាណវិធី', + + 'btn_apply_to_all_tests' => 'កំណត់តម្លៃគ្រប់តេស្តទាំងអស់', + 'code' => 'លេខកូដ', + + 'create_success' => 'សំណាកតេស្តថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតសំណាកតេស្តថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានសំណាកតេស្តកែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានសំណាកតេស្តបានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានសំណាកតេស្តលុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានសំណាកតេស្តចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានសំណាកតេស្តស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានសំណាកតេស្តបានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានសំណាកតេស្តទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានសំណាកតេស្តបានទេ។ សូមសាកល្បងម្តងទៀត', + + 'add_commission_success' => 'ព័ត៌មានប្រាក់ចំណែកគ្រូពេទ្យរក្សាទុកបានសម្រេច។', + 'add_commission_fail' => 'មិនអាចរក្សាទុកព័ត៌មានប្រាក់ចំណែកគ្រូពេទ្យរក្សាទុកបានទេ។ សូមសាកល្បងម្តងទៀត', + 'select_organism' => 'ឈ្មោះមេរោគដែលបានជ្រើសរើស', + 'result_highlight_with_bold_text' => 'បន្លេចអក្សរឌិតនៅលើក្រដាសលទ្ធផល', + 'auto_suggest_results' => 'ផ្ដល់ជំរើសលទ្ធផលដោយស្វ័យប្រវត្តិ', + + 'numeric' => 'លេខ', + 'calculate' => 'គណនា', + 'single' => 'ជ្រើសរើសមួយ', + 'multiple' => 'ពហុជ្រើសរើស', + 'text' => 'ពហុពាក្យ', + 'attachment' => 'បញ្ចូលឯកសារ', + 'heading' => 'រចនាសម្ព័ន្ធតេស្ត' + +]; diff --git a/lang/kh/user_account.php b/lang/kh/user_account.php new file mode 100644 index 0000000..cc54ec7 --- /dev/null +++ b/lang/kh/user_account.php @@ -0,0 +1,53 @@ + 'គណនីអ្នកប្រើប្រាស់', + 'search_placeholder' => 'ឈ្មោះគណនី អាស័យដ្ឋានអ៊ីមែល', + 'table_no' => 'ល.រ', + 'table_name' => 'ឈ្មោះ', + 'table_login_email' => 'អ៊ីមែលដែលត្រូវចូល', + 'table_system_role' => 'តួនាទីប្រព័ន្ធ', + 'table_labs' => 'មន្ទីរពិសោធន៍', + 'table_status' => 'ស្ថានភាព', + 'table_action' => 'ប្រតិបត្តិការ', + 'form_add_tittle' => 'បង្កើតគណនីអ្នកប្រើប្រាស់', + 'form_name' => 'ឈ្មោះពេញ', + 'form_login_email' => 'អ៊ីមែលសម្រាប់ចូលប្រើ', + 'form_ismnager' => 'អ្នកគ្រប់គ្រង់មន្ទីរពិសោធន៍', + 'physician' => 'ប្រភពសំណាក', + 'non_of_above' => 'ផ្សេងៗ', + 'form_edit_tittle' => 'កែប្រែគណនីអ្នកប្រើប្រាស់', + 'form_system_role' => 'តួនាទីប្រព័ន្ធ', + 'form_lab_cover' => 'ការគ្រប់ដណ្តប់របស់មន្ទីរពិសោធន៍', + 'form_laboratory' => 'មន្ទីរពិសោធន៍', + 'form_select_all_lab' => 'ជ្រើសរើសមន្ទីរពិសោធន៌ទាំងអស់', + 'form_password' => 'លេខសម្ងាត់', + 'form_character' => 'តួអក្សរ', + 'form_assign_lab' => 'កំណត់មន្ទីរពិសោធន៍', + + 'invalid_current_password' => 'លេខសំងាត់ចាស់មិនត្រឹមត្រូវ', + 'new_password_same_old_password' => 'លេខសំងាត់ថ្មីមិនអាចដូចលេខសំងាត់ចាស់បានទេ', + 'change_password_success' => 'លេខសំងាត់ប្តូរបានសម្រេច', + 'change_password_fail' => 'មិនអាចប្តូរលេខសំងាត់បានទេ។ សូមព្យាយាមម្តងទៀត', + + 'user_profile' => 'អំពីអ្នកប្រើប្រាស់', + 'form_change_password' => 'ប្តូរលេខសំងាត់', + 'form_old_password' => 'លេខសំងាត់បច្ចុប្បន្ន', + 'form_new_password' => 'លេខសំងាត់ថ្មី', + 'form_confirm_password' => 'បញ្ជាក់លេខសំងាត់', + 'form_signature' => 'គំរូហត្ថលេខា', + + 'create_success' => 'គណនីអ្នកប្រើប្រាស់ថ្មីបង្កើតបានសម្រេច។', + 'create_fail' => 'មិនអាចបង្កើតគណនីអ្នកប្រើប្រាស់ថ្មីបានទេ។ សូមសាកល្បងម្តងទៀត', + 'update_success' => 'ព័ត៌មានគណនីអ្នកប្រើប្រាស់កែប្រែបានសម្រេច។ ', + 'update_fail' => 'មិនអាចកែប្រែព័ត៌មានគណនីអ្នកប្រើប្រាស់បានទេ។ សូមសាកល្បងម្តងទៀត', + 'delete_success' => 'ព័ត៌មានគណនីអ្នកប្រើប្រាស់លុបចេញពីប្រព័ន្ធបានសម្រេច។', + 'delete_fail' => 'មិនអាចលុបព័ត៌មានគណនីអ្នកប្រើប្រាស់ចេញពីប្រព័ន្ធបានទេ។ សូមសាកល្បងម្តងទៀត', + 'restore_success' => 'ព័ត៌មានគណនីអ្នកប្រើប្រាស់ស្តារបានសម្រេច។', + 'restore_fail' => 'មិនអាចស្តារព័ត៌មានគណនីអ្នកប្រើប្រាស់បានទេ។ សូមសាកល្បងម្តងទៀត', + 'get_success' => 'ព័ត៌មានគណនីអ្នកប្រើប្រាស់ទាញយកបានសម្រេច។', + 'get_fail' => 'មិនអាចទាញយកព័ត៌មានគណនីអ្នកប្រើប្រាស់បានទេ។ សូមសាកល្បងម្តងទៀត', + 'assign_lab_success' => 'គណនីអ្នកប្រើប្រាស់បានភ្ជាប់ទៅមន្ទីរពិសោធន៍បានសម្រេច។', + 'assign_lab_fail' => 'មិនអាចភ្ជាប់គណនីអ្នកប្រើប្រាស់ទៅមន្ទីរពិសោធន៍បានទេ។ សូមសាកល្បងម្តងទៀត' + +]; diff --git a/lang/kh/vaccination.php b/lang/kh/vaccination.php new file mode 100644 index 0000000..bf96561 --- /dev/null +++ b/lang/kh/vaccination.php @@ -0,0 +1,26 @@ +'ថ្ងៃចាក់វ៉ាក់សាំង', + 'next_visit' =>'ថ្ងៃណាត់ជួបលើកក្រោយ', + 'name' =>'ឈ្មោះវ៉ាក់សាំង', + 'unit_price' =>'តម្លៃ/ឯកត្តា', + 'qty' =>'បរិមាណ', + 'subtotal' =>'តម្លៃសរុប', + 'new_title' =>'កត់ត្រាថ្មី', + 'btn_save' =>'រក្សាទុក', + 'create_success' =>'ព័ត៌មានវ៉ាក់សាំងរក្សាទុកបានសម្រេច', + 'create_fail' =>'ព័ត៌មានវ៉ាក់សាំងមិនអាចរក្សាទុកបានទេ', + 'update_success' =>'ព័ត៌មានវ៉ាក់សាំងកែប្រែបានសម្រេច', + 'update_fail' =>'ព័ត៌មានវ៉ាក់សាំងមិនអាចកែប្រែបានទេ', + 'delete_success' =>'ព័ត៌មានវ៉ាក់សាំងលុបបានសម្រេច', + 'delete_fail' =>'ព័ត៌មានវ៉ាក់សាំងមិនអាចលុបបានទេ', + 'restore_success' =>'ព័ត៌មានវ៉ាក់សាំងរក្សាទុកបានសម្រេច', + 'restore_fail' =>'ព័ត៌មានវ៉ាក់សាំងមិនអាចរក្សាទុកបានទេ', + 'list_title' =>'តារាងចាក់វ៉ាក់សាំង', +'invoice_title' =>'វិក័យប័ត្រវ៉ាក់សាំង', + 'edit_title' =>'កែប្រែព័ត៌មានចាក់វ៉ាក់សាំង', + + +]; diff --git a/lang/kh/validation.php b/lang/kh/validation.php new file mode 100644 index 0000000..f19034d --- /dev/null +++ b/lang/kh/validation.php @@ -0,0 +1,151 @@ + 'The :attribute must be accepted.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', + 'between' => [ + 'numeric' => 'The :attribute must be between :min and :max.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', + 'string' => 'The :attribute must be between :min and :max characters.', + 'array' => 'The :attribute must have between :min and :max items.', + ], + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', + 'date' => 'The :attribute is not a valid date.', + 'date_equals' => 'The :attribute must be a date equal to :date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'dimensions' => 'The :attribute has invalid image dimensions.', + 'distinct' => 'The :attribute field has a duplicate value.', + 'email' => 'សារអេឡិចត្រូនិចមិនត្រឹមត្រូវ', + 'ends_with' => 'The :attribute must end with one of the following: :values.', + 'exists' => 'The selected :attribute is invalid.', + 'file' => 'The :attribute must be a file.', + 'filled' => 'The :attribute field must have a value.', + 'gt' => [ + 'numeric' => 'The :attribute must be greater than :value.', + 'file' => 'The :attribute must be greater than :value kilobytes.', + 'string' => 'The :attribute must be greater than :value characters.', + 'array' => 'The :attribute must have more than :value items.', + ], + 'gte' => [ + 'numeric' => 'The :attribute must be greater than or equal :value.', + 'file' => 'The :attribute must be greater than or equal :value kilobytes.', + 'string' => 'The :attribute must be greater than or equal :value characters.', + 'array' => 'The :attribute must have :value items or more.', + ], + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'in_array' => 'The :attribute field does not exist in :other.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'ipv4' => 'The :attribute must be a valid IPv4 address.', + 'ipv6' => 'The :attribute must be a valid IPv6 address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'lt' => [ + 'numeric' => 'The :attribute must be less than :value.', + 'file' => 'The :attribute must be less than :value kilobytes.', + 'string' => 'The :attribute must be less than :value characters.', + 'array' => 'The :attribute must have less than :value items.', + ], + 'lte' => [ + 'numeric' => 'The :attribute must be less than or equal :value.', + 'file' => 'The :attribute must be less than or equal :value kilobytes.', + 'string' => 'The :attribute must be less than or equal :value characters.', + 'array' => 'The :attribute must not have more than :value items.', + ], + 'max' => [ + 'numeric' => 'The :attribute may not be greater than :max.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', + 'string' => 'The :attribute may not be greater than :max characters.', + 'array' => 'The :attribute may not have more than :max items.', + ], + 'mimes' => 'The :attribute must be a file of type: :values.', + 'mimetypes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'numeric' => 'The :attribute must be at least :min.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'string' => 'The :attribute must be at least :min characters.', + 'array' => 'The :attribute must have at least :min items.', + ], + 'not_in' => 'The selected :attribute is invalid.', + 'not_regex' => 'The :attribute format is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'password' => 'The password is incorrect.', + 'present' => 'The :attribute field must be present.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_unless' => 'The :attribute field is required unless :other is in :values.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_with_all' => 'The :attribute field is required when :values are present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'numeric' => 'The :attribute must be :size.', + 'file' => 'The :attribute must be :size kilobytes.', + 'string' => 'The :attribute must be :size characters.', + 'array' => 'The :attribute must contain :size items.', + ], + 'starts_with' => 'The :attribute must start with one of the following: :values.', + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'unique' => 'The :attribute has already been taken.', + 'uploaded' => 'The :attribute failed to upload.', + 'url' => 'The :attribute format is invalid.', + 'uuid' => 'The :attribute must be a valid UUID.', + + /* + |-------------------------------------------------------------------------- + | Custom Validation Language Lines + |-------------------------------------------------------------------------- + | + | Here you may specify custom validation messages for attributes using the + | convention "attribute.rule" to name the lines. This makes it quick to + | specify a specific custom language line for a given attribute rule. + | + */ + + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + + /* + |-------------------------------------------------------------------------- + | Custom Validation Attributes + |-------------------------------------------------------------------------- + | + | The following language lines are used to swap our attribute placeholder + | with something more reader friendly such as "E-Mail Address" instead + | of "email". This simply helps us make our message more expressive. + | + */ + + 'attributes' => [], + +]; diff --git a/package.json b/package.json new file mode 100644 index 0000000..7686b29 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://www.schemastore.org/package.json", + "private": true, + "type": "module", + "scripts": { + "build": "vite build", + "dev": "vite" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.0", + "axios": "^1.11.0", + "concurrently": "^9.0.1", + "laravel-vite-plugin": "^2.0.0", + "tailwindcss": "^4.0.0", + "vite": "^7.0.7" + } +} diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..d703241 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,35 @@ + + + + + tests/Unit + + + tests/Feature + + + + + app + + + + + + + + + + + + + + + + + + diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..b574a59 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,25 @@ + + + Options -MultiViews -Indexes + + + RewriteEngine On + + # Handle Authorization Header + RewriteCond %{HTTP:Authorization} . + RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] + + # Handle X-XSRF-Token Header + RewriteCond %{HTTP:x-xsrf-token} . + RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-Token}] + + # Redirect Trailing Slashes If Not A Folder... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] + + # Send Requests To Front Controller... + RewriteCond %{REQUEST_FILENAME} !-d + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^ index.php [L] + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..ee8f07e --- /dev/null +++ b/public/index.php @@ -0,0 +1,20 @@ +handleRequest(Request::capture()); diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/resources/css/app.css b/resources/css/app.css new file mode 100644 index 0000000..3e6abea --- /dev/null +++ b/resources/css/app.css @@ -0,0 +1,11 @@ +@import 'tailwindcss'; + +@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php'; +@source '../../storage/framework/views/*.php'; +@source '../**/*.blade.php'; +@source '../**/*.js'; + +@theme { + --font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol', 'Noto Color Emoji'; +} diff --git a/resources/js/app.js b/resources/js/app.js new file mode 100644 index 0000000..e59d6a0 --- /dev/null +++ b/resources/js/app.js @@ -0,0 +1 @@ +import './bootstrap'; diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js new file mode 100644 index 0000000..5f1390b --- /dev/null +++ b/resources/js/bootstrap.js @@ -0,0 +1,4 @@ +import axios from 'axios'; +window.axios = axios; + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; diff --git a/resources/views/activity_logs.blade.php b/resources/views/activity_logs.blade.php new file mode 100644 index 0000000..f54ce95 --- /dev/null +++ b/resources/views/activity_logs.blade.php @@ -0,0 +1,150 @@ + + + + @include('layout.header') + + + + +
+ @include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+ +
+ +
+
+

d {{__('general.profile')}}

+ +
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + @foreach($activities as $activity) + + + + + + + + + @endforeach + + +
UserActionModuleDescriptionDateDetail
{{ $activity->causer->name ?? 'System' }}{{ $activity->event }}{{ class_basename($activity->subject_type) }}{{ $activity->description }}{{ $activity->created_at->format('Y-m-d H:i') }} + +
+ + {{ $activities->links() }} +
+
+ +
+
+
+ +
+
+ + + @include('layout.footer') +
+
+
+ @include('layout.common_script') + + + + + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('report.summary_rpt_tittle')}}

+
+
+ +
+ +
{{__('report.summary_report_section_by_sample_source')}}
+
+
+ + + + + + + + + + + @foreach($report_data['sample_source_data'] as $j=>$l) + + + + + + + @endforeach + +
{{__('report.summary_clinic_name')}}{{__('report.summary_male_patient')}}{{__('report.summary_female_patient')}}{{__('report.summary_total_sample')}}
{{$l['clinic_name']}}{{$l['total_male_patient']}}{{$l['total_female_patient']}}{{$l['total_patient']}}
+
+
+ +
{{__('report.summary_report_section_by_test')}}
+
+
+ + + + + + + + + + + @foreach($report_data['report_data'] as $k=>$val) + @if(!is_array($val)) + + + + @else + @foreach($val as $v) + + + + + + + @endforeach + @endif + @endforeach + +
{{__('report.summary_rpt_test_type')}}{{__('report.summary_male_patient')}}{{__('report.summary_female_patient')}}{{__('report.summary_total_patient')}}
{{$val}}
{{$v['group_result']}}{{$v['total_male_patient']}}{{$v['total_female_patient']}}{{$v['total_patient']}}
+
+
+ +
{{__('report.summary_report_section_by_category')}}
+
+
+ + + + + + + + + + + + @foreach($report_data['test_category_data'] as $raw=>$v) + + + + + + + + @endforeach + + + + + + + +
{{__('report.summary_category_name')}}{{__('report.summary_male_patient')}}{{__('report.summary_female_patient')}}{{__('report.summary_total_patient')}}
{{$v['category']}}{{$v['total_male_patient']}}{{$v['total_female_patient']}}{{$v['total_patient']}}
{{__('report.total')}}{{$total_male}}{{$total_female}}{{$total_patient}}
+
+
+
+
+
+
+
+
+
+ + @include('layout.footer') +
+ + @include('modal.summary_report_print') + +
+
+@include('layout.common_script') + + + +{{----}} + + + + + diff --git a/resources/views/antibiotic.blade.php b/resources/views/antibiotic.blade.php new file mode 100644 index 0000000..4e246a3 --- /dev/null +++ b/resources/views/antibiotic.blade.php @@ -0,0 +1,162 @@ + + + + @include('layout.header') + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('antibiotic.table_title')}}

+
+
+ +
+
+
+
+ +
+ + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['create_antibiotic'])) + + @endif +
+
+
+
+

+ +
+
+ + + + + + +{{-- --}} +{{-- --}} + + + + @foreach($antibiotics as $k=>$antibiotic) + + + + +{{-- --}} +{{-- --}} + + @endforeach + +
{{__('antibiotic.table_no')}}{{__('antibiotic.table_action')}}{{__('antibiotic.table_name')}}Laboratory{{__('antibiotic.table_status')}}
{{($k+1) + (($_GET['page'] ?? 1) * 20) - 20}} +
+ @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_antibiotic'])) + + @endif + @if($antibiotic->record_status_id==0) + + @else + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['delete_antibiotic'])) + + @endif + @endif +
+
{{$antibiotic->name_en}}{{$antibiotic->lab->name_en}}--}} +{{-- --}} +{{--
+
+
+ +
+ {!! $antibiotics->appends($_GET)->links('pagination.custom') !!} +
+ +
+
+
+
+
+ +
+
+ + + + + @include('layout.footer') +
+
+
+@include('layout.common_script') + + + + + + + diff --git a/resources/views/appointment.blade.php b/resources/views/appointment.blade.php new file mode 100644 index 0000000..3854bc9 --- /dev/null +++ b/resources/views/appointment.blade.php @@ -0,0 +1,272 @@ + + + + @include('layout.header') + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('sidebar.appointment')}}

+
+
+ +
+
+
+
+
+ +
+ + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['create_appointment'])) + + @endif +
+
+
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + @foreach($appointments as $k=>$appointment) + + + + + + + + + + @endforeach + +
{{__('comment.table_no')}}{{__('comment.table_action')}}{{__('appointment.patient')}}{{__('appointment.date')}}{{__('appointment.type')}}{{__('appointment.doctor')}}{{__('appointment.description')}}
{{($k+1) + (($_GET['page'] ?? 1) * 20) - 20}} +
+ @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['create_sample'])) + + @endif + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_appointment'])) + + @endif + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['delete_appointment'])) + + @endif +
+
{{$appointment->patient->name_en . ' - ' .$appointment->patient->phone_number}}{{date('d-M-Y h:i A', strtotime($appointment->appointment_date))}}{{$appointment->appointment_type}}{{$appointment->doctor->name_en ?? ''}}{{$appointment->description}}
+
+
+ +
+ {!! $appointments->appends($_GET)->links('pagination.custom') !!} +
+ +
+
+
+
+
+ +
+
+ + @include('modal.appointment') + + @include('layout.footer') +
+
+
+@include('layout.common_script') + + + + + + + diff --git a/resources/views/audit-logs/index.blade copy.php b/resources/views/audit-logs/index.blade copy.php new file mode 100644 index 0000000..3aa3f07 --- /dev/null +++ b/resources/views/audit-logs/index.blade copy.php @@ -0,0 +1,201 @@ + + + + + @include('layout.header') + + + + + + + + + + +
+ + @include('layout.navbar') + @include('layout.breadscrum') + +
+ + @include('layout.sidebar') + +
+
+ +
+ +
+

Audit Log List

+
+ +
+ + +
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + +
IDEventModuleRecord IDUserIPDateAction
+ +
+
+ +
+ + @include('layout.footer') + +
+
+
+ +@include('layout.common_script') + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/views/audit-logs/index.blade.php b/resources/views/audit-logs/index.blade.php new file mode 100644 index 0000000..c8def1c --- /dev/null +++ b/resources/views/audit-logs/index.blade.php @@ -0,0 +1,284 @@ + + + + + @include('layout.header') + + + + + + + + + + +
+ + @include('layout.navbar') + @include('layout.breadscrum') + +
+ + @include('layout.sidebar') + +
+
+ + +
+ +
+

Audit Logs

+ +
+
+
+
+ +
+ + +
+
+
+ +
+
+ + +
+
+ +
+
+ +
+ +
+ +
+
+
+
+ +
+
+ + + + + + + + + + + + + +
IDDATEEVENTTABLEUSERACTION
+ +
+
+ +
+ + + + + @include('layout.footer') + +
+
+
+ +@include('layout.common_script') + + + + + + + + + + + + + + + + + + diff --git a/resources/views/auth/confirm-password.blade.php b/resources/views/auth/confirm-password.blade.php new file mode 100644 index 0000000..466593a --- /dev/null +++ b/resources/views/auth/confirm-password.blade.php @@ -0,0 +1,36 @@ + + + + + + + + +
+ {{ __('This is a secure area of the application. Please confirm your password before continuing.') }} +
+ + + + +
+ @csrf + + +
+ + + +
+ +
+ + {{ __('Confirm') }} + +
+
+
+
diff --git a/resources/views/auth/forgot-password.blade.php b/resources/views/auth/forgot-password.blade.php new file mode 100644 index 0000000..0642fa8 --- /dev/null +++ b/resources/views/auth/forgot-password.blade.php @@ -0,0 +1,36 @@ + + + + + + + + +
+ {{ __('Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.') }} +
+ + + + + + + +
+ @csrf + + +
+ + + +
+ +
+ + {{ __('Email Password Reset Link') }} + +
+
+
+
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php new file mode 100644 index 0000000..ecbe174 --- /dev/null +++ b/resources/views/auth/login.blade.php @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + +
+ @csrf + + +
+ + + +
+ + +
+ + + +
+ + +
+ +
+ +
+ @if (Route::has('password.request')) + + {{ __('Forgot your password?') }} + + @endif + + + {{ __('Log in') }} + +
+
+
+
diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php new file mode 100644 index 0000000..a0c4fbe --- /dev/null +++ b/resources/views/auth/register.blade.php @@ -0,0 +1,59 @@ + + + + + + + + + + + +
+ @csrf + + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ +
+ + {{ __('Already registered?') }} + + + + {{ __('Register') }} + +
+
+
+
diff --git a/resources/views/auth/reset-password.blade.php b/resources/views/auth/reset-password.blade.php new file mode 100644 index 0000000..979d1b4 --- /dev/null +++ b/resources/views/auth/reset-password.blade.php @@ -0,0 +1,48 @@ + + + + + + + + + + + +
+ @csrf + + + + + +
+ + + +
+ + +
+ + + +
+ + +
+ + + +
+ +
+ + {{ __('Reset Password') }} + +
+
+
+
diff --git a/resources/views/auth/verify-email.blade.php b/resources/views/auth/verify-email.blade.php new file mode 100644 index 0000000..dc0ae7f --- /dev/null +++ b/resources/views/auth/verify-email.blade.php @@ -0,0 +1,39 @@ + + + + + + + + +
+ {{ __('Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn\'t receive the email, we will gladly send you another.') }} +
+ + @if (session('status') == 'verification-link-sent') +
+ {{ __('A new verification link has been sent to the email address you provided during registration.') }} +
+ @endif + +
+
+ @csrf + +
+ + {{ __('Resend Verification Email') }} + +
+
+ +
+ @csrf + + +
+
+
+
diff --git a/resources/views/bacteriology_report.blade.php b/resources/views/bacteriology_report.blade.php new file mode 100644 index 0000000..022b138 --- /dev/null +++ b/resources/views/bacteriology_report.blade.php @@ -0,0 +1,93 @@ + + + + @include('layout.header') + + + +
+ @include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

Bacteriology Report

+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + + + +
+
+
+
+
+
+
+ @include('layout.footer') +
+
+
+ @include('layout.common_script') + + + + diff --git a/resources/views/base.blade.php b/resources/views/base.blade.php new file mode 100644 index 0000000..50e6655 --- /dev/null +++ b/resources/views/base.blade.php @@ -0,0 +1,198 @@ + + + + + + {{ config('app.name', 'doctora') }} + + + + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+ + + + + + + + + + + + + diff --git a/resources/views/clone_lab.blade.php b/resources/views/clone_lab.blade.php new file mode 100644 index 0000000..8126ec6 --- /dev/null +++ b/resources/views/clone_lab.blade.php @@ -0,0 +1,159 @@ + + + + @include('layout.header') + + + + +
+ @include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('laboratory.clone_lab')}}

+
+
+
+
+ @csrf +
+
+
+ +
+
+ +
+{{--
--}} +{{-- --}} +{{--
--}} +
+
+
+ +
+
+ +
+
+ + +
+
+ +
+
+
+ +
+
+ +
+ + +
+
+
+
+
+ +
+
+ + + @include('layout.footer') +
+
+
+ @include('layout.common_script') + + + + + + + diff --git a/resources/views/comment.blade.php b/resources/views/comment.blade.php new file mode 100644 index 0000000..3083982 --- /dev/null +++ b/resources/views/comment.blade.php @@ -0,0 +1,174 @@ + + + + @include('layout.header') + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('comment.table_title')}}

+
+
+ +
+
+
+
+ +
+ + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['create_comment'])) + + @endif +
+
+
+
+

+ +
+
+ + + + + + + + + + + + + @foreach($comments as $k=>$comment) + + + + + + + + + @endforeach + +
{{__('comment.table_no')}}{{__('comment.table_action')}}{{__('comment.table_name')}}{{__('comment.table_sample_type')}}{{__('comment.table_department')}}{{__('comment.table_status')}}
{{($k+1) + (($_GET['page'] ?? 1) * 20) - 20}} +
+ @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_comment'])) + + @endif + @if($comment->record_status_id==0) + + @else + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['delete_comment'])) + + @endif + @endif +
+
{{substr($comment->comment_desc,0,50)}}...{{$comment->sample_type->name_en}}{{$comment->sample_type->department->name_en}} + +
+
+
+ +
+ {!! $comments->appends($_GET)->links('pagination.custom') !!} +
+ +
+
+
+
+
+ +
+
+ + + + + @include('layout.footer') +
+
+
+@include('layout.common_script') + + + + + + + diff --git a/resources/views/components/alert.blade.php b/resources/views/components/alert.blade.php new file mode 100644 index 0000000..8b93cee --- /dev/null +++ b/resources/views/components/alert.blade.php @@ -0,0 +1,46 @@ +@if(session('success')) + +@endif + +@if(session('error')) + +@endif + +@if(session('warning')) + +@endif + +@if(session('info')) + +@endif + + +@if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+@endif + + diff --git a/resources/views/components/application-logo.blade.php b/resources/views/components/application-logo.blade.php new file mode 100644 index 0000000..2446cc6 --- /dev/null +++ b/resources/views/components/application-logo.blade.php @@ -0,0 +1,38 @@ +@if(session('success')) + +@endif + +@if(session('error')) + +@endif + +@if(session('warning')) + +@endif + +@if(session('info')) + +@endif + + +@if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+@endif \ No newline at end of file diff --git a/resources/views/components/auth-card.blade.php b/resources/views/components/auth-card.blade.php new file mode 100644 index 0000000..71235cf --- /dev/null +++ b/resources/views/components/auth-card.blade.php @@ -0,0 +1,9 @@ +
+
+ {{ $logo }} +
+ +
+ {{ $slot }} +
+
diff --git a/resources/views/components/auth-session-status.blade.php b/resources/views/components/auth-session-status.blade.php new file mode 100644 index 0000000..a54088f --- /dev/null +++ b/resources/views/components/auth-session-status.blade.php @@ -0,0 +1,7 @@ +@props(['status']) + +@if ($status) +
merge(['class' => 'font-medium text-sm text-green-600 alert alter-danger']) }}> + {{ $status }} +
+@endif diff --git a/resources/views/components/auth-validation-errors.blade.php b/resources/views/components/auth-validation-errors.blade.php new file mode 100644 index 0000000..8b4045f --- /dev/null +++ b/resources/views/components/auth-validation-errors.blade.php @@ -0,0 +1,16 @@ +@props(['errors']) + +@if ($errors->any()) +
+ +{{--
--}} +{{-- {{ __('Whoops! Something went wrongff.') }}--}} +{{--
--}} + +
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+@endif diff --git a/resources/views/components/button.blade.php b/resources/views/components/button.blade.php new file mode 100644 index 0000000..8f18773 --- /dev/null +++ b/resources/views/components/button.blade.php @@ -0,0 +1,3 @@ + diff --git a/resources/views/components/dropdown-link.blade.php b/resources/views/components/dropdown-link.blade.php new file mode 100644 index 0000000..761ee8a --- /dev/null +++ b/resources/views/components/dropdown-link.blade.php @@ -0,0 +1 @@ +merge(['class' => 'block px-4 py-2 text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 transition duration-150 ease-in-out']) }}>{{ $slot }} diff --git a/resources/views/components/dropdown.blade.php b/resources/views/components/dropdown.blade.php new file mode 100644 index 0000000..c015664 --- /dev/null +++ b/resources/views/components/dropdown.blade.php @@ -0,0 +1,43 @@ +@props(['align' => 'right', 'width' => '48', 'contentClasses' => 'py-1 bg-white']) + +@php +switch ($align) { + case 'left': + $alignmentClasses = 'origin-top-left left-0'; + break; + case 'top': + $alignmentClasses = 'origin-top'; + break; + case 'right': + default: + $alignmentClasses = 'origin-top-right right-0'; + break; +} + +switch ($width) { + case '48': + $width = 'w-48'; + break; +} +@endphp + +
+
+ {{ $trigger }} +
+ + +
diff --git a/resources/views/components/input.blade.php b/resources/views/components/input.blade.php new file mode 100644 index 0000000..d6d857b --- /dev/null +++ b/resources/views/components/input.blade.php @@ -0,0 +1,3 @@ +@props(['disabled' => false]) + +merge(['class' => 'rounded-md shadow-sm border-gray-300 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50']) !!}> diff --git a/resources/views/components/label.blade.php b/resources/views/components/label.blade.php new file mode 100644 index 0000000..1cc65e2 --- /dev/null +++ b/resources/views/components/label.blade.php @@ -0,0 +1,5 @@ +@props(['value']) + + diff --git a/resources/views/components/nav-link.blade.php b/resources/views/components/nav-link.blade.php new file mode 100644 index 0000000..5c101a2 --- /dev/null +++ b/resources/views/components/nav-link.blade.php @@ -0,0 +1,11 @@ +@props(['active']) + +@php +$classes = ($active ?? false) + ? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 text-sm font-medium leading-5 text-gray-900 focus:outline-none focus:border-indigo-700 transition duration-150 ease-in-out' + : 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out'; +@endphp + +merge(['class' => $classes]) }}> + {{ $slot }} + diff --git a/resources/views/components/responsive-nav-link.blade.php b/resources/views/components/responsive-nav-link.blade.php new file mode 100644 index 0000000..02bb527 --- /dev/null +++ b/resources/views/components/responsive-nav-link.blade.php @@ -0,0 +1,11 @@ +@props(['active']) + +@php +$classes = ($active ?? false) + ? 'block pl-3 pr-4 py-2 border-l-4 border-indigo-400 text-base font-medium text-indigo-700 bg-indigo-50 focus:outline-none focus:text-indigo-800 focus:bg-indigo-100 focus:border-indigo-700 transition duration-150 ease-in-out' + : 'block pl-3 pr-4 py-2 border-l-4 border-transparent text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out'; +@endphp + +merge(['class' => $classes]) }}> + {{ $slot }} + diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php new file mode 100644 index 0000000..1121504 --- /dev/null +++ b/resources/views/dashboard.blade.php @@ -0,0 +1,532 @@ + + + + @include('layout.header') + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+ +
+
+ +
+ +
+
+
{{ __('general.total_samples') }}
+
+
{{number_format($totalSample,0)}}
+
+ @if($growthSample>=0) + +

{{$growthSample}}%

+ @else + +

{{$growthSample}}%

+ @endif + +
+
+
+ +
+
+

{{__($displaySample)}}

+
+
+
+
+ +
+
+ +
+ +
+
+
{{ __('general.total_income') }}
+
+
$ {{number_format($totalIncome,2)}}
+
+ @if($growthIncome>=0) + +

{{$growthIncome}}%

+ @else + +

{{$growthIncome}}%

+ @endif + +
+
+
+ +
+
+

{{__($displayIncome)}}

+
+
+
+
+ +
+
+ +
+ +
+
+
{{ __('general.total_patient') }}
+
+
{{number_format($totalPatient,0)}}
+
+ @if($growthPatient>=0) + +

{{$growthPatient}}%

+ @else + +

{{$growthPatient}}%

+ @endif + +
+
+
+ +
+
+

{{__($displayPatient)}}

+
+
+
+
+ +
+
+ +
+ +
+
+
{{ __('general.total_rejected_sample') }}
+
+
{{number_format($totalRejectedSample,0)}}
+
+ @if($growthRejectedSample>=0) + +

{{$growthRejectedSample}}%

+ @else + +

{{$growthRejectedSample}}%

+ @endif + +
+
+
+ +
+
+

{{($displayRejectedSample)}}

+
+
+
+
+
+
+
+ +
+
+
+
+
+
{{ __('general.monthly_sample_trend') }}
+
+
+
+ +
+
+
+ +
+
+
+
+
{{ __('general.monthly_income_trend') }}
+
+
+
+ +
+
+
+ + +
+ +
+
+
+
+
+
{{ __('general.sample_source_distribution') }}
+
+
+
+ +
+
+
+ +
+
+
+
+
{{ __('general.panel_distribution') }}
+
+
+
+ +
+
+
+ +
+
+ @include('layout.footer') +
+
+
+@include('layout.common_script') + + +{{-- --}} + + + + + + + + + + + + + + + + + + diff --git a/resources/views/department.blade.php b/resources/views/department.blade.php new file mode 100644 index 0000000..0639412 --- /dev/null +++ b/resources/views/department.blade.php @@ -0,0 +1,164 @@ + + + + @include('layout.header') + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('department.table_title')}}

+ +
+
+
+
+
+
+ +
+ + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['create_department'])) + + @endif +
+
+
+
+

+
+
+ + + + + + + + + + + @foreach($departments as $k=>$department) + + + + + + + @endforeach + +
{{__('department.table_no')}}{{__('department.table_action')}}{{__('department.table_name')}}{{__('department.table_sample_type')}}
{{($k+1) + (($_GET['page'] ?? 1) * 20) - 20}} +
+ @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_department'])) + + @endif + @if($department->record_status_id==0) + + @else + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['delete_department'])) + + @endif + @endif +
+
{{$department->name}} + @foreach($department->samples as $sample) + + @endforeach +
+
+
+ +
+ {!! $departments->appends($_GET)->links('pagination.custom') !!} +
+ +
+
+
+
+
+ +
+
+ + + + + @include('layout.footer') +
+
+
+@include('layout.common_script') + + + + + + + + diff --git a/resources/views/doctor_report.blade.php b/resources/views/doctor_report.blade.php new file mode 100644 index 0000000..31b82ff --- /dev/null +++ b/resources/views/doctor_report.blade.php @@ -0,0 +1,207 @@ + + + + @include('layout.header') + + + + + + + + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('sidebar.doctor_report')}}

+{{-- * is generated based on number of test selected--}} +
+
+ +
+
+
+ + + @if($report_data['report_id']==3) + + + + + + + + + + + + @foreach($report_data['report_data'] as $v) + + + + + + + + + + @endforeach + + @elseif($report_data['report_id']==1) + + + + + + + + @foreach($report_data['report_data'] as $v) + + + + + + @endforeach + + @else + + + + + + + @foreach($report_data['report_data'] as $v) + + + + + + @endforeach + + + @endif +
DatePatient NameSample NoTest NamePhysician NameTotal AmountNet Amount
{{$v['date']}}{{$v['patient']}}{{$v['sample_number']}}{{$v['test_name']}}{{$v['physician']}}{{$v['total_amount']}}{{$v['total_net_amount']}}
{{__('report.summary_clinic_name')}}{{__('report.doctor_exam')}}{{__('report.doctor_net_amount')}}
{{$v['sample_source_name']}}{{$v['total_exam']}}{{$v['total_net_amount']}}
PhysicianExamNet Amount
{{$v['physician_name']}}{{$v['total_exam']}}{{$v['total_net_amount']}}
+
+
+
+
+
+
+
+
+
+ + @include('modal.doctor_report_print') + + @include('modal.doctor_report_detail_print') + + @include('layout.footer') +
+
+
+@include('layout.common_script') + + + +{{----}} + + + + + diff --git a/resources/views/edit_vaccination.blade.php b/resources/views/edit_vaccination.blade.php new file mode 100644 index 0000000..054e123 --- /dev/null +++ b/resources/views/edit_vaccination.blade.php @@ -0,0 +1,633 @@ + + + + @include('layout.header') + + + + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('vaccination.edit_title')}}

+
+
+ @csrf + +
+
+
+
+
+
+
+
+ +
+
+ +
+
+ + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['create_patient'])) + + @endif +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + @foreach($vaccinations->vaccinationDetail as $vaccination_item) + + + + + + + + @endforeach + +
{{__('vaccination.name')}}{{__('vaccination.unit_price')}} ($){{__('vaccination.qty')}}{{__('vaccination.subtotal')}} + +
+ + + + + + + + + + +
+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + @if(Auth::id()==199999999) + @include('modal.preview_vaccination_invoice') + @else + @include('modal.preview_vaccination_invoice_') + @endif + + @include('layout.footer') +
+
+
+@include('layout.common_script') + + + + + + + + + + + + + diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php new file mode 100644 index 0000000..abbb9bf --- /dev/null +++ b/resources/views/errors/404.blade.php @@ -0,0 +1,64 @@ + + + + + + + + + Laboratory Information System - LIS + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+

404

+
+
+

SORRY!

+

Service not available.

+
+
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+ +
+ + + + + + + + + diff --git a/resources/views/expired_item.blade.php b/resources/views/expired_item.blade.php new file mode 100644 index 0000000..048a19c --- /dev/null +++ b/resources/views/expired_item.blade.php @@ -0,0 +1,45 @@ + + + + @include('layout.header') + + + +
+ @include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+
+

Expired item

+
+
+
+
+
+
+ @include('layout.footer') +
+
+
+ @include('layout.common_script') + + + + diff --git a/resources/views/financial_report.blade.php b/resources/views/financial_report.blade.php new file mode 100644 index 0000000..b47d52b --- /dev/null +++ b/resources/views/financial_report.blade.php @@ -0,0 +1,256 @@ + + + + @include('layout.header') + + + + + + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('sidebar.financial_report')}}

+{{-- * is generated based on the invoice--}} + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + @php + $i=1; + $totalPrice = 0; + $totalPriceRiel = 0; + $total = 0; + $totalRiel = 0; + $total_discount = 0; + $total_discountRiel = 0; + $total_paid = 0; + $total_paidRiel = 0; + $total_bank_paid = 0; + $total_bank_paidRiel = 0; + $total_owe = 0; + $total_oweRiel = 0; + + @endphp + @foreach($financialReport as $row) + + + + + + + + + + + + + + + @php + $totalPrice+=$row['total_net_amount']; + $totalPriceRiel+=($row['total_net_amount'] * @$row['exchange_rate']); + $total += $row['total_amount']; + $totalRiel += ($row['total_amount'] * @$row['exchange_rate']); + $total_discount += $row['total_discount']; + $total_discountRiel += ($row['total_discount'] * @$row['exchange_rate']); + $total_paid += $row['total_paid']; + $total_paidRiel += ($row['total_paid'] * @$row['exchange_rate']); + $total_bank_paid+=$row['total_bank_paid']; + $total_bank_paidRiel+=($row['total_bank_paid'] * @$row['exchange_rate']); + $total_owe += $row['total_owe']; + $total_oweRiel += ($row['total_owe'] * @$row['exchange_rate']); + @endphp + @endforeach + + + + + + + + + + + + + + + @if($labSettings->is_hide_comission_percentage>0) + @php + $ownBenefitRate = ((100 - $labSettings->is_hide_comission_percentage)); + @endphp + + + + + + + + + + + + + + + + + + + + + + @endif + +
Invoice DateSample NoPatient NamePhysicianExchange RateTotalDiscountNet AmountCash PayBank PayOwe
{{$row['date']}}{{$row['sample_number']}}{{$row['patient']}}{{$row['physician']}}{{@$row['exchange_rate']}}{{$row['total_amount']}}{{$row['total_discount']}}{{$row['total_net_amount']}}{{$row['total_paid']}}{{$row['total_bank_paid']}}{{$row['total_owe']}}
{{__('TOTAL')}}   $ {{number_format(($total),2)}}
 ៛ {{number_format(($totalRiel))}}
 $ {{number_format(($total_discount),2)}}
 ៛ {{number_format(($total_discountRiel))}}
 $ {{number_format(($totalPrice),2)}}
 ៛ {{number_format(($totalPriceRiel))}}
 $ {{number_format(($total_paid),2)}}
 ៛ {{number_format(($total_paidRiel))}}
 $ {{number_format(($total_bank_paid),2)}}
 ៛ {{number_format(($total_bank_paidRiel))}}
 $ {{number_format(($total_owe),2)}}
 ៛ {{number_format(($total_oweRiel))}}
{{$labSettings->is_hide_comission_percentage}}% {{__('Percent')}}   $ {{number_format(($total * ($labSettings->is_hide_comission_percentage/100)),2)}}
 ៛ {{number_format((($totalRiel * ($labSettings->is_hide_comission_percentage/100))))}}
 $ {{number_format(($total_discount * ($labSettings->is_hide_comission_percentage/100)),2)}}
 ៛ {{number_format((($total_discountRiel * ($labSettings->is_hide_comission_percentage/100))))}}
 $ {{number_format(($totalPrice * ($labSettings->is_hide_comission_percentage/100)),2)}}
 ៛ {{number_format((($totalPriceRiel * ($labSettings->is_hide_comission_percentage/100))))}}
 $ {{number_format(($total_paid * ($labSettings->is_hide_comission_percentage/100)),2)}}
 ៛ {{number_format((($total_paidRiel * ($labSettings->is_hide_comission_percentage/100))))}}
 $ {{number_format(($total_bank_paid * ($labSettings->is_hide_comission_percentage/100)),2)}}
 ៛ {{number_format((($total_bank_paidRiel * ($labSettings->is_hide_comission_percentage/100))))}}
 $ {{number_format(($total_owe * ($labSettings->is_hide_comission_percentage/100)),2)}}
 ៛ {{number_format((($total_oweRiel * ($labSettings->is_hide_comission_percentage/100))))}}
{{$ownBenefitRate}}% {{__('Percent')}}   $ {{number_format(($total * ($ownBenefitRate/100)),2)}}
 ៛ {{number_format((($totalRiel * ($ownBenefitRate/100))))}}
 $ {{number_format(($total_discount * ($ownBenefitRate/100)),2)}}
 ៛ {{number_format((($total_discountRiel * ($ownBenefitRate/100))))}}
 $ {{number_format(($totalPrice * ($ownBenefitRate/100)),2)}}
 ៛ {{number_format((($totalPriceRiel * ($ownBenefitRate/100))))}}
 $ {{number_format(($total_paid * ($ownBenefitRate/100)),2)}}
 ៛ {{number_format((($total_paidRiel * ($ownBenefitRate/100))))}}
 $ {{number_format(($total_bank_paid * ($ownBenefitRate/100)),2)}}
 ៛ {{number_format((($total_bank_paidRiel * ($ownBenefitRate/100))))}}
 $ {{number_format(($total_owe * ($ownBenefitRate/100)),2)}}
 ៛ {{number_format((($total_oweRiel * ($ownBenefitRate/100))))}}
+
+
+
+
+
+
+
+
+
+ + @include('modal.financial_report_print') + + @include('layout.footer') +
+
+
+@include('layout.common_script') + + + +{{----}} + + + + + diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php new file mode 100644 index 0000000..0332ae1 --- /dev/null +++ b/resources/views/home.blade.php @@ -0,0 +1,411 @@ + + + + @include('layout.header') + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+ +
+
+
+
+
+
{{ __('general.today_sample') }}
+
{{$todaySamples}}
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
{{ __('general.this_month_sample') }}
+
{{$thisMonthSamples}}
+
+
+ +
+
+
+
+
+
+
+
+
+
+
{{ __('general.last_month_sample') }}
+
{{$previousMonthSamples}}
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
{{ __('general.average_sample') }} ({{date('Y',strtotime("-1 year"))}})
+
{{$averageSamples}}
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
{{ __('general.today_income') }}
+
{{$labSettings->currency==1 ? number_format(ceil($todayIncome / 100) * 100) : number_format($todayIncome,2)}}
+
+
+ + {{$labSettings->currency==1 ? '៛' : '$'}} + +
+
+
+
+
+
+
+
+
+
+
{{ __('general.this_month_income') }}
+
{{$labSettings->currency==1 ? number_format(ceil($thisMonthIncome / 100) * 100) : number_format($thisMonthIncome,2)}}
+
+
+ + {{$labSettings->currency==1 ? '៛' : '$'}} + +
+
+
+
+
+
+
+
+
+
+
{{ __('general.last_month_income') }}
+
{{$labSettings->currency==1 ? number_format(ceil($lastMonthIncome / 100) * 100) : number_format($lastMonthIncome,2)}}
+
+
+ + {{$labSettings->currency==1 ? '៛' : '$'}} + +
+
+
+
+
+
+
+
+
+
+
{{ __('general.last_year_income') }}
+
{{$labSettings->currency==1 ? number_format(ceil($lastYearIncome / 100) * 100) : number_format($lastYearIncome,2)}}
+
+
+ + {{$labSettings->currency==1 ? '៛' : '$'}} + +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
{{ __('general.sample_statistic') }}
+
+
+
+ +
+
+
+ +
+
+
+
+ +
{{ __('general.sample_source_statistic') }}
+ +
+
+
+ +
+
+
+ +
+ + +
+ @include('layout.footer') +
+
+
+@include('layout.common_script') + + + + + + + + + + diff --git a/resources/views/individual_report.blade.php b/resources/views/individual_report.blade.php new file mode 100644 index 0000000..9417824 --- /dev/null +++ b/resources/views/individual_report.blade.php @@ -0,0 +1,99 @@ + + + + @include('layout.header') + + + +
+ @include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

Individual Report

+
+
+
+ + +
+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+
+
+
+ + + +
+
+
+
+
+
+
+ @include('layout.footer') +
+
+
+ @include('layout.common_script') + + + + diff --git a/resources/views/inventory.blade.php b/resources/views/inventory.blade.php new file mode 100644 index 0000000..f2b8fb5 --- /dev/null +++ b/resources/views/inventory.blade.php @@ -0,0 +1,203 @@ +' + + + @include('layout.header') + + + + + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('Inventory Report')}}

+
+
+ +
+ @if(!empty($report_data['report_data']) && $report_data['report_id']==1) +

{{$report_data['report_name']}}

+
+
+ + + + + + + + + + + + + @foreach($report_data['report_data'] as $v) + + + + + + + + @endforeach + +
Item GroupItem NameOn handLast Stock InLast Stock Out
{{$v->item_group}}{{$v->item_name}}{{floatval($v->available_quantity)}}{{!empty($v->stock_in_date) ? date('d-m-Y',strtotime($v->stock_in_date)) : ''}}{{!empty($v->stock_out_date) ? date('d-m-Y',strtotime($v->stock_out_date)) : ''}}
+
+
+ @endif + + @if(!empty($report_data['report_data']) && $report_data['report_id']==2) +

{{$report_data['report_name']}}

+
+
+ + + + + + + + + + + + + + @foreach($report_data['report_data'] as $v) + + + + + + + + + @endforeach + +
Item GroupItem NameStock InStock In DateExpire Date# Month
{{$v->item_group}}{{$v->item_name}}{{$v->stock_in}}{{!empty($v->stock_in_date) ? date('d-m-Y',strtotime($v->stock_in_date)) : ''}}{{!empty($v->expiry_date) ? date('d-m-Y',strtotime($v->expiry_date)) : ''}}{{$v->months}}
+
+
+ @endif + +
+
+
+
+
+
+
+ + @if(isset($_GET['report_type'])) + @include('modal.inventory_onhand_print') + @endif + + @include('layout.footer') +
+
+
+@include('layout.common_script') + + + + + + + + diff --git a/resources/views/invoice_list.blade.php b/resources/views/invoice_list.blade.php new file mode 100644 index 0000000..89da05f --- /dev/null +++ b/resources/views/invoice_list.blade.php @@ -0,0 +1,45 @@ + + + + @include('layout.header') + + + +
+ @include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+
+

Invoice List

+
+
+
+
+
+
+ @include('layout.footer') +
+
+
+ @include('layout.common_script') + + + + diff --git a/resources/views/lab_profile.blade.php b/resources/views/lab_profile.blade.php new file mode 100644 index 0000000..d0c33ad --- /dev/null +++ b/resources/views/lab_profile.blade.php @@ -0,0 +1,570 @@ + + + + + + @include('layout.header') + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('laboratory.info')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+ +
+
+
{{__('laboratory.info')}}
+
+
+ {{__('laboratory.table_name_kh')}} + {{$info->name_kh}} +
+
+ {{__('laboratory.table_name_en')}} + {{$info->name_en}} +
+
+ {{__('lab_profile.short_name')}} + {{$info->short_name}} +
+
+ {{__('laboratory.phone')}} + {{$info->phone}} +
+
+ {{__('lab_profile.emial')}} + {{$info->email}} +
+
+
+
+
{{__('lab_profile.address')}}
+
+
+ {{__('laboratory.form_address_kh')}} + {{$info->address_kh}} +
+
+ {{__('laboratory.form_address_en')}} + {{$info->address_en}} +
+
+
+
+
{{__('laboratory.license')}}
+
+
+ {{__('laboratory.start_date')}} + {{date('l, F j, Y g:i A', strtotime($info->start_date))}} +
+
+ {{__('laboratory.expiry_date')}} + {{date('l, F j, Y g:i A', strtotime($info->end_date))}} +
+
+
+
+
+
+ +
+
+ +
+ + + + @include('layout.footer') +
+
+
+ +@include('layout.common_script') + + + + + + + + + diff --git a/resources/views/laboratory.blade.php b/resources/views/laboratory.blade.php new file mode 100644 index 0000000..4531aa8 --- /dev/null +++ b/resources/views/laboratory.blade.php @@ -0,0 +1,762 @@ + + + + + + @include('layout.header') + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('general.laboratory_settings')}}

+ +
+
{{__('general.general_settings')}}
+
+
+
+

{{__('lab_profile.sample_numner_conf')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ +
+ +
+
+
+
+

{{__('lab_profile.patient_numner_conf')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ +
+ +
+
+
+
+
+
+

{{__('lab_profile.based_currency')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ +
+ +
+
+
+
+

{{__('lab_profile.type_of_discount_conf')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ +
+ +
+
+
+
+
+
+

{{__('lab_profile.exchange_rate')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ +
+ +
+
+ +
+
+

{{__('sidebar.invoice')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ + + +
+ +
+
+
+
{{__('general.result_settings')}}
+ + @php + $configures = collect($info->labConfigures); + + $fontNameHeader = ($configures->where('atrribute_code', 'FONT_NAME_FOR_RESULT_HEADER')->pluck('assigned_attribute_value')->first()); + $fontSizeHeader = ($configures->where('atrribute_code', 'FONT_SIZE_FOR_RESULT_HEADER')->pluck('assigned_attribute_value')->first()); + $resultColorHeader = ($configures->where('atrribute_code', 'COLOR_FOR_RESULT_HEADER')->pluck('assigned_attribute_value')->first()); + + $fontName = ($configures->where('atrribute_code', 'FONT_NAME_FOR_RESULT')->pluck('assigned_attribute_value')->first()); + $fontSize = ($configures->where('atrribute_code', 'FONT_SIZE_FOR_RESULT')->pluck('assigned_attribute_value')->first()); + $resultColor = ($configures->where('atrribute_code', 'COLOR_FOR_RESULT')->pluck('assigned_attribute_value')->first()); + $lineHeight = ($configures->where('atrribute_code', 'LINE_HEIGHT_FOR_RESULT_HEADER')->pluck('assigned_attribute_value')->first()); + + $resultTemplateId = ($configures->where('atrribute_code', 'RESULT_TEMPLATE')->pluck('assigned_attribute_value')->first()); + + @endphp + +
+
+
+

{{__('lab_profile.header_font_name')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ +
+ +
+
+
+
+

{{__('lab_profile.header_font_size')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ +
+ +
+
+
+
+
+
+

{{__('lab_profile.body_font_name')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ +
+ +
+
+
+
+

{{__('lab_profile.body_font_size')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ +
+ +
+
+
+
+
+
+

{{__('lab_profile.abnormal_result')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ + +
+ +
+
+
+
+

{{__('lab_profile.verify_label')}} + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_laboratory_information'])) + + @endif +

+
+ verify_label) :''}}"> +
+ +
+
+
+ +
+ + +
+
+ +
+
+ +
+ + + + @include('layout.footer') +
+
+
+ +@include('layout.common_script') + + + + + + + + + diff --git a/resources/views/layout/breadscrum.blade.php b/resources/views/layout/breadscrum.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/resources/views/layout/common_script.blade.php b/resources/views/layout/common_script.blade.php new file mode 100644 index 0000000..b98ba65 --- /dev/null +++ b/resources/views/layout/common_script.blade.php @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/views/layout/footer.blade.php b/resources/views/layout/footer.blade.php new file mode 100644 index 0000000..99c9504 --- /dev/null +++ b/resources/views/layout/footer.blade.php @@ -0,0 +1,10 @@ + +
+
+
+
+ {{__('© '.date('Y').' ' . env('APP_NAME'))}} +
+
+
+
diff --git a/resources/views/layout/header.blade.php b/resources/views/layout/header.blade.php new file mode 100644 index 0000000..32c9884 --- /dev/null +++ b/resources/views/layout/header.blade.php @@ -0,0 +1,53 @@ + + + + + {{env('APP_TITLE', 'Laboratory Information System')}} + + + + + + + + + + + + + + + + {{-- + + --}} + + + + + + + + diff --git a/resources/views/layout/loading.blade.php b/resources/views/layout/loading.blade.php new file mode 100644 index 0000000..ddecf32 --- /dev/null +++ b/resources/views/layout/loading.blade.php @@ -0,0 +1,18 @@ +
+ +{{--
--}} +{{-- --}} +{{--
--}} + +
+
+ + + + +
+
+ +
+ + diff --git a/resources/views/layout/navbar.blade.php b/resources/views/layout/navbar.blade.php new file mode 100644 index 0000000..fb6463a --- /dev/null +++ b/resources/views/layout/navbar.blade.php @@ -0,0 +1,129 @@ + +@php + $current_locale= App::currentLocale(); + $baseLab = (array) Session::get('base_lab'); + $labName = $baseLab['name_'.$current_locale]; +@endphp + + + + + diff --git a/resources/views/layout/sidebar.blade.php b/resources/views/layout/sidebar.blade.php new file mode 100644 index 0000000..62173eb --- /dev/null +++ b/resources/views/layout/sidebar.blade.php @@ -0,0 +1,91 @@ +@include('layout/loading') + diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php new file mode 100644 index 0000000..3bb39dc --- /dev/null +++ b/resources/views/layouts/app.blade.php @@ -0,0 +1,36 @@ + + + + + + + + {{ config('app.name', 'Laravel') }} + + {{-- + --}} + + + + + + + + +
+ @include('layouts.navigation') + + +
+
+ {{ $header }} +
+
+ + +
+ {{ $slot }} +
+
+ + diff --git a/resources/views/layouts/guest.blade.php b/resources/views/layouts/guest.blade.php new file mode 100644 index 0000000..b94f3af --- /dev/null +++ b/resources/views/layouts/guest.blade.php @@ -0,0 +1,24 @@ + + + + + + + + {{ config('app.name', 'Laravel') }} + + + + + + + + + + + +
+ {{ $slot }} +
+ + diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php new file mode 100644 index 0000000..3355c7d --- /dev/null +++ b/resources/views/layouts/navigation.blade.php @@ -0,0 +1,92 @@ + diff --git a/resources/views/login.blade.php b/resources/views/login.blade.php new file mode 100644 index 0000000..9625984 --- /dev/null +++ b/resources/views/login.blade.php @@ -0,0 +1,151 @@ + + + + + + {{ config('app.name', 'doctora') }} + + + + + + + + + + + + + +
+ +
+
+
+ + +
+
+ + + + + + diff --git a/resources/views/medicine.blade.php b/resources/views/medicine.blade.php new file mode 100644 index 0000000..2bb25d0 --- /dev/null +++ b/resources/views/medicine.blade.php @@ -0,0 +1,289 @@ + + + + @include('layout.header') + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('sidebar.medicine')}}

+
+
+
+ +
+
+
+ +
+ + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['add_medicine'])) + + @endif +
+
+
+
+

+ +
+
+ + + + + + + + + + +{{-- --}} + + + + + @foreach($medicineItems as $k=>$medicineItem) + + + + + + + + +{{-- --}} + + + @endforeach + +
{{__('physician.table_no')}}{{__('physician.table_action')}}{{__('Code')}}{{__('Medical Item')}}{{__('Medical Item Group')}}{{__('Unit Price')}}{{__('Sale Price')}}{{__('Is Vaccination')}}{{__('physician.table_status')}}
{{($k+1) + (($_GET['page'] ?? 1) * 20) - 20}} +
+ @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_medicine'])) + + @endif + @if($medicineItem->record_status_id==0) + + @else + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['delete_medicine'])) + + @endif + @endif +
+
{{$medicineItem->code}}{{$medicineItem->medicine->name}}{{@$medicineItem->medicineGroup->name_en}}{{$medicineItem->unit_price}}{{$medicineItem->sale_price}} + +
+
+
+ +
+ {!! $medicineItems->links('pagination.custom') !!} +
+ +
+
+
+
+
+ +
+
+ + + + + @include('layout.footer') +
+
+
+@include('layout.common_script') + + + + + + + + + + diff --git a/resources/views/medicine_group.blade.php b/resources/views/medicine_group.blade.php new file mode 100644 index 0000000..bed0627 --- /dev/null +++ b/resources/views/medicine_group.blade.php @@ -0,0 +1,204 @@ + + + + @include('layout.header') + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('Medical Item Group')}}

+
+
+
+ @csrf +
+
+
+ +
+ + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['add_medicine_group'])) + + @endif +
+
+
+
+

+ +
+
+ + + + + + +{{-- --}} + + + + + + @foreach($medicineGroups as $k=>$medicineGroup) + + + + +{{-- --}} + + + + @endforeach + +
{{__('physician.table_no')}}{{__('physician.table_action')}}{{__('Medical Item Group')}}{{__('Is Vaccination')}}{{__('Description')}}{{__('physician.table_status')}}
{{($k+1) + (($_GET['page'] ?? 1) * 20) - 20}} +
+ @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_medicine_group'])) + + @endif + @if($medicineGroup->record_status_id==0) + + @else + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['delete_medicine_group'])) + + @endif + @endif +
+
{{$medicineGroup->name_en}}{{$medicineGroup->description}} + +
+
+
+ +
+ {!! $medicineGroups->links('pagination.custom') !!} +
+ +
+
+
+
+
+ +
+
+ + + + + @include('layout.footer') +
+
+
+@include('layout.common_script') + + + + + + + + diff --git a/resources/views/medicine_unit.blade.php b/resources/views/medicine_unit.blade.php new file mode 100644 index 0000000..2b5592d --- /dev/null +++ b/resources/views/medicine_unit.blade.php @@ -0,0 +1,193 @@ + + + + @include('layout.header') + + + + +
+@include('layout.navbar') + + @include('layout.breadscrum') +
+ + @include('layout.sidebar') + + +
+
+
+
+
+
+

{{__('Medical Item Unit')}}

+
+
+
+ @csrf +
+
+
+ +
+ + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['add_medicine_unit'])) + + @endif +
+
+
+
+

+ +
+
+ + + + + + + + + + + + @foreach($medicineUnits as $k=>$medicineUnit) + + + + + + + + @endforeach + +
{{__('physician.table_no')}}{{__('physician.table_action')}}{{__('Medical Item Unit Name')}}{{__('Packaged Item')}}{{__('physician.table_status')}}
{{($k+1) + (($_GET['page'] ?? 1) * 20) - 20}} +
+ @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['update_medicine_unit'])) + + @endif + @if($medicineUnit->record_status_id==0) + + @else + @if(\App\Http\Controllers\Helper\GlobalController::user_can(Auth::user()->role_id, ['delete_medicine_unit'])) + + @endif + @endif +
+
{{$medicineUnit->name_en}}{{$medicineUnit->unit_packing}} + +
+
+
+ +
+ {!! $medicineUnits->links('pagination.custom') !!} +
+ +
+
+
+
+
+ +
+
+ + + + + @include('layout.footer') +
+
+
+@include('layout.common_script') + + + + + + + + diff --git a/resources/views/modal/appointment.blade.php b/resources/views/modal/appointment.blade.php new file mode 100644 index 0000000..31bf178 --- /dev/null +++ b/resources/views/modal/appointment.blade.php @@ -0,0 +1,91 @@ + + + diff --git a/resources/views/modal/assign_test.blade.php b/resources/views/modal/assign_test.blade.php new file mode 100644 index 0000000..b7db44b --- /dev/null +++ b/resources/views/modal/assign_test.blade.php @@ -0,0 +1,108 @@ + + + diff --git a/resources/views/modal/doctor_report_detail_print.blade.php b/resources/views/modal/doctor_report_detail_print.blade.php new file mode 100644 index 0000000..1ef11d0 --- /dev/null +++ b/resources/views/modal/doctor_report_detail_print.blade.php @@ -0,0 +1,326 @@ + diff --git a/resources/views/modal/doctor_report_print.blade.php b/resources/views/modal/doctor_report_print.blade.php new file mode 100644 index 0000000..1e2111d --- /dev/null +++ b/resources/views/modal/doctor_report_print.blade.php @@ -0,0 +1,342 @@ + diff --git a/resources/views/modal/enter_result_forms/sample_result_1.blade.php b/resources/views/modal/enter_result_forms/sample_result_1.blade.php new file mode 100644 index 0000000..b58861a --- /dev/null +++ b/resources/views/modal/enter_result_forms/sample_result_1.blade.php @@ -0,0 +1,80 @@ + + + diff --git a/resources/views/modal/enter_result_forms/sample_result_2.blade.php b/resources/views/modal/enter_result_forms/sample_result_2.blade.php new file mode 100644 index 0000000..50c0833 --- /dev/null +++ b/resources/views/modal/enter_result_forms/sample_result_2.blade.php @@ -0,0 +1,63 @@ + + + diff --git a/resources/views/modal/financial_report_print.blade.php b/resources/views/modal/financial_report_print.blade.php new file mode 100644 index 0000000..911d848 --- /dev/null +++ b/resources/views/modal/financial_report_print.blade.php @@ -0,0 +1,370 @@ + diff --git a/resources/views/modal/inventory_onhand_print.blade.php b/resources/views/modal/inventory_onhand_print.blade.php new file mode 100644 index 0000000..ab5b709 --- /dev/null +++ b/resources/views/modal/inventory_onhand_print.blade.php @@ -0,0 +1,318 @@ + diff --git a/resources/views/modal/invoice.blade.php b/resources/views/modal/invoice.blade.php new file mode 100644 index 0000000..c278be8 --- /dev/null +++ b/resources/views/modal/invoice.blade.php @@ -0,0 +1,196 @@ + + + diff --git a/resources/views/modal/organism_result.blade.php b/resources/views/modal/organism_result.blade.php new file mode 100644 index 0000000..7c49a29 --- /dev/null +++ b/resources/views/modal/organism_result.blade.php @@ -0,0 +1,59 @@ + + + diff --git a/resources/views/modal/preview_invoice.blade.php b/resources/views/modal/preview_invoice.blade.php new file mode 100644 index 0000000..7cefed2 --- /dev/null +++ b/resources/views/modal/preview_invoice.blade.php @@ -0,0 +1,461 @@ + diff --git a/resources/views/modal/preview_invoice_forms/riel_invoice.blade.php b/resources/views/modal/preview_invoice_forms/riel_invoice.blade.php new file mode 100644 index 0000000..9021104 --- /dev/null +++ b/resources/views/modal/preview_invoice_forms/riel_invoice.blade.php @@ -0,0 +1,499 @@ + diff --git a/resources/views/modal/preview_invoice_forms/usd_invoice.blade.php b/resources/views/modal/preview_invoice_forms/usd_invoice.blade.php new file mode 100644 index 0000000..70bd0f3 --- /dev/null +++ b/resources/views/modal/preview_invoice_forms/usd_invoice.blade.php @@ -0,0 +1,580 @@ + + \ No newline at end of file diff --git a/resources/views/modal/preview_invoice_forms/usd_invoice_summary.blade.php b/resources/views/modal/preview_invoice_forms/usd_invoice_summary.blade.php new file mode 100644 index 0000000..f2e37e5 --- /dev/null +++ b/resources/views/modal/preview_invoice_forms/usd_invoice_summary.blade.php @@ -0,0 +1,444 @@ + diff --git a/resources/views/modal/preview_invoice_forms/usd_invoice_t3.blade.php b/resources/views/modal/preview_invoice_forms/usd_invoice_t3.blade.php new file mode 100644 index 0000000..6e2d693 --- /dev/null +++ b/resources/views/modal/preview_invoice_forms/usd_invoice_t3.blade.php @@ -0,0 +1,591 @@ + diff --git a/resources/views/modal/preview_invoice_forms/usd_invoice_t4.blade.php b/resources/views/modal/preview_invoice_forms/usd_invoice_t4.blade.php new file mode 100644 index 0000000..7eafc90 --- /dev/null +++ b/resources/views/modal/preview_invoice_forms/usd_invoice_t4.blade.php @@ -0,0 +1,408 @@ + diff --git a/resources/views/modal/preview_result.blade.php b/resources/views/modal/preview_result.blade.php new file mode 100644 index 0000000..2d004fd --- /dev/null +++ b/resources/views/modal/preview_result.blade.php @@ -0,0 +1,427 @@ + diff --git a/resources/views/modal/preview_result_forms/preview_result_1.blade.php b/resources/views/modal/preview_result_forms/preview_result_1.blade.php new file mode 100644 index 0000000..9623761 --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_1.blade.php @@ -0,0 +1,713 @@ + + + + diff --git a/resources/views/modal/preview_result_forms/preview_result_1_margin_default_firefox.blade.php b/resources/views/modal/preview_result_forms/preview_result_1_margin_default_firefox.blade.php new file mode 100644 index 0000000..fd5f46c --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_1_margin_default_firefox.blade.php @@ -0,0 +1,543 @@ + + + + diff --git a/resources/views/modal/preview_result_forms/preview_result_1_margin_default_noheader.blade.php b/resources/views/modal/preview_result_forms/preview_result_1_margin_default_noheader.blade.php new file mode 100644 index 0000000..072e248 --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_1_margin_default_noheader.blade.php @@ -0,0 +1,597 @@ + + + + diff --git a/resources/views/modal/preview_result_forms/preview_result_1_previous_sample.blade.php b/resources/views/modal/preview_result_forms/preview_result_1_previous_sample.blade.php new file mode 100644 index 0000000..650e060 --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_1_previous_sample.blade.php @@ -0,0 +1,758 @@ + + \ No newline at end of file diff --git a/resources/views/modal/preview_result_forms/preview_result_2.blade.php b/resources/views/modal/preview_result_forms/preview_result_2.blade.php new file mode 100644 index 0000000..1e56c01 --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_2.blade.php @@ -0,0 +1,445 @@ + diff --git a/resources/views/modal/preview_result_forms/preview_result_2_backup_for_Anapath.blade.php b/resources/views/modal/preview_result_forms/preview_result_2_backup_for_Anapath.blade.php new file mode 100644 index 0000000..ae160e1 --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_2_backup_for_Anapath.blade.php @@ -0,0 +1,357 @@ + diff --git a/resources/views/modal/preview_result_forms/preview_result_3.blade.php b/resources/views/modal/preview_result_forms/preview_result_3.blade.php new file mode 100644 index 0000000..1f26dd7 --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_3.blade.php @@ -0,0 +1,801 @@ + + + + diff --git a/resources/views/modal/preview_result_forms/preview_result_4.blade.php b/resources/views/modal/preview_result_forms/preview_result_4.blade.php new file mode 100644 index 0000000..d550afe --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_4.blade.php @@ -0,0 +1,764 @@ + + + + diff --git a/resources/views/modal/preview_result_forms/preview_result_4_old.blade.php b/resources/views/modal/preview_result_forms/preview_result_4_old.blade.php new file mode 100644 index 0000000..47793cf --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_4_old.blade.php @@ -0,0 +1,451 @@ + diff --git a/resources/views/modal/preview_result_forms/preview_result_5.blade.php b/resources/views/modal/preview_result_forms/preview_result_5.blade.php new file mode 100644 index 0000000..ef61f3e --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_5.blade.php @@ -0,0 +1,348 @@ + diff --git a/resources/views/modal/preview_result_forms/preview_result_6.blade.php b/resources/views/modal/preview_result_forms/preview_result_6.blade.php new file mode 100644 index 0000000..79dc579 --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_6.blade.php @@ -0,0 +1,356 @@ + diff --git a/resources/views/modal/preview_result_forms/preview_result_7.blade.php b/resources/views/modal/preview_result_forms/preview_result_7.blade.php new file mode 100644 index 0000000..0cbebc4 --- /dev/null +++ b/resources/views/modal/preview_result_forms/preview_result_7.blade.php @@ -0,0 +1,392 @@ + diff --git a/resources/views/modal/preview_vaccination_invoice.blade.php b/resources/views/modal/preview_vaccination_invoice.blade.php new file mode 100644 index 0000000..ced678b --- /dev/null +++ b/resources/views/modal/preview_vaccination_invoice.blade.php @@ -0,0 +1,480 @@ + diff --git a/resources/views/modal/preview_vaccination_invoice_.blade.php b/resources/views/modal/preview_vaccination_invoice_.blade.php new file mode 100644 index 0000000..f4712df --- /dev/null +++ b/resources/views/modal/preview_vaccination_invoice_.blade.php @@ -0,0 +1,540 @@ + diff --git a/resources/views/modal/repayment.blade.php b/resources/views/modal/repayment.blade.php new file mode 100644 index 0000000..f4b0478 --- /dev/null +++ b/resources/views/modal/repayment.blade.php @@ -0,0 +1,129 @@ + + diff --git a/resources/views/modal/sample_label_print.blade.php b/resources/views/modal/sample_label_print.blade.php new file mode 100644 index 0000000..52df06a --- /dev/null +++ b/resources/views/modal/sample_label_print.blade.php @@ -0,0 +1,43 @@ + diff --git a/resources/views/modal/sample_result.blade.php b/resources/views/modal/sample_result.blade.php new file mode 100644 index 0000000..12367e3 --- /dev/null +++ b/resources/views/modal/sample_result.blade.php @@ -0,0 +1,68 @@ + + + diff --git a/resources/views/modal/stock_in_print.blade.php b/resources/views/modal/stock_in_print.blade.php new file mode 100644 index 0000000..bd5a8bb --- /dev/null +++ b/resources/views/modal/stock_in_print.blade.php @@ -0,0 +1,303 @@ +';return g}var b,c=this,d=c._id,e=c.classPrefix,f="#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000",g="background: -ms-linear-gradient(top,"+f+");background: linear-gradient(to bottom,"+f+");";return b='
'+a()+'
','
'+b+"
"}})}),g("33",["2r"],function(a){"use strict";return a.extend({init:function(a){var b=this;a.delimiter||(a.delimiter="\xbb"),b._super(a),b.classes.add("path"),b.canFocus=!0,b.on("click",function(a){var c,d=a.target;(c=d.getAttribute("data-index"))&&b.fire("select",{value:b.row()[c],index:c})}),b.row(b.settings.row)},focus:function(){var a=this;return a.getEl().firstChild.focus(),a},row:function(a){return arguments.length?(this.state.set("row",a),this):this.state.get("row")},renderHtml:function(){var a=this;return'
'+a._getDataPathHtml(a.state.get("row"))+"
"},bindStates:function(){var a=this;return a.state.on("change:row",function(b){a.innerHtml(a._getDataPathHtml(b.value))}),a._super()},_getDataPathHtml:function(a){var b,c,d=this,e=a||[],f="",g=d.classPrefix;for(b=0,c=e.length;b0?'":"")+'
'+e[b].name+"
"; +return f||(f='
\xa0
'),f}})}),g("34",["33"],function(a){return a.extend({postRender:function(){function a(a){if(1===a.nodeType){if("BR"==a.nodeName||a.getAttribute("data-mce-bogus"))return!0;if("bookmark"===a.getAttribute("data-mce-type"))return!0}return!1}var b=this,c=b.settings.editor;return c.settings.elementpath!==!1&&(b.on("select",function(a){c.focus(),c.selection.select(this.row()[a.index].element),c.nodeChanged()}),c.on("nodeChange",function(d){for(var e=[],f=d.parents,g=f.length;g--;)if(1==f[g].nodeType&&!a(f[g])){var h=c.fire("ResolveName",{name:f[g].nodeName.toLowerCase(),target:f[g]});if(h.isDefaultPrevented()||e.push({name:h.name,element:f[g]}),h.isPropagationStopped())break}b.row(e)})),b._super()}})}),g("35",["2j"],function(a){"use strict";return a.extend({Defaults:{layout:"flex",align:"center",defaults:{flex:1}},renderHtml:function(){var a=this,b=a._layout,c=a.classPrefix;return a.classes.add("formitem"),b.preRender(a),'
'+(a.settings.title?'
'+a.settings.title+"
":"")+'
'+(a.settings.html||"")+b.renderHtml(a)+"
"}})}),g("36",["2j","35","9"],function(a,b,c){"use strict";return a.extend({Defaults:{containerCls:"form",layout:"flex",direction:"column",align:"stretch",flex:1,padding:20,labelGap:30,spacing:10,callbacks:{submit:function(){this.submit()}}},preRender:function(){var a=this,d=a.items();a.settings.formItemDefaults||(a.settings.formItemDefaults={layout:"flex",autoResize:"overflow",defaults:{flex:1}}),d.each(function(d){var e,f=d.settings.label;f&&(e=new b(c.extend({items:{type:"label",id:d._id+"-l",text:f,flex:0,forId:d._id,disabled:d.disabled()}},a.settings.formItemDefaults)),e.type="formitem",d.aria("labelledby",d._id+"-l"),"undefined"==typeof d.settings.flex&&(d.settings.flex=1),a.replace(d,e),e.add(d))})},submit:function(){return this.fire("submit",{data:this.toJSON()})},postRender:function(){var a=this;a._super(),a.fromJSON(a.settings.data)},bindStates:function(){function a(){var a,c,d,e=0,f=[];if(b.settings.labelGapCalc!==!1)for(d="children"==b.settings.labelGapCalc?b.find("formitem"):b.items(),d.filter("formitem").each(function(a){var b=a.items()[0],c=b.getEl().clientWidth;e=c>e?c:e,f.push(b)}),c=b.settings.labelGap||0,a=f.length;a--;)f[a].settings.minWidth=e+c}var b=this;b._super(),b.on("show",a),a()}})}),g("37",["36"],function(a){"use strict";return a.extend({Defaults:{containerCls:"fieldset",layout:"flex",direction:"column",align:"stretch",flex:1,padding:"25 15 5 15",labelGap:30,spacing:10,border:1},renderHtml:function(){var a=this,b=a._layout,c=a.classPrefix;return a.preRender(),b.preRender(a),'
'+(a.settings.title?''+a.settings.title+"":"")+'
'+(a.settings.html||"")+b.renderHtml(a)+"
"}})}),g("4x",["e","1j","1g","1w","9","2a"],function(a,b,c,d,e,f){var g=e.trim,h=function(a,b,c,d,e){return{type:a,title:b,url:c,level:d,attach:e}},i=function(a){for(;a=a.parentNode;){var c=a.contentEditable;if(c&&"inherit"!==c)return b.isContentEditableTrue(a)}return!1},j=function(b,c){return a.DOM.select(b,c)},k=function(a){return a.innerText||a.textContent},l=function(a){return a.id?a.id:f.uuid("h")},m=function(a){return a&&"A"===a.nodeName&&(a.id||a.name)},n=function(a){return m(a)&&p(a)},o=function(a){return a&&/^(H[1-6])$/.test(a.nodeName)},p=function(a){return i(a)&&!b.isContentEditableFalse(a)},q=function(a){return o(a)&&p(a)},r=function(a){return o(a)?parseInt(a.nodeName.substr(1),10):0},s=function(a){var b=l(a),c=function(){a.id=b};return h("header",k(a),"#"+b,r(a),c)},t=function(a){var b=a.id||a.name,c=k(a);return h("anchor",c?c:"#"+b,"#"+b,0,d.noop)},u=function(a){return c.map(c.filter(a,q),s)},v=function(a){return c.map(c.filter(a,n),t)},w=function(a){var b=j("h1,h2,h3,h4,h5,h6,a:not([href])",a);return b},x=function(a){return g(a.title).length>0},y=function(a){var b=w(a);return c.filter(u(b).concat(v(b)),x)};return{find:y}}),g("38",["4t","4x","17","2y","1g","1w","9"],function(a,b,c,d,e,f,g){"use strict";var h=function(){return a.tinymce?a.tinymce.activeEditor:c.activeEditor},i={},j=5,k=function(a){return{title:a.title,value:{title:{raw:a.title},url:a.url,attach:a.attach}}},l=function(a){return g.map(a,k)},m=function(a,b){return{title:a,value:{title:a,url:b,attach:f.noop}}},n=function(a,b){var c=e.find(b,function(b){return b.url===a});return!c},o=function(a,b,c){var d=b in a?a[b]:c;return d===!1?null:d},p=function(a,b,c,d){var h={title:"-"},j=function(a){var d=e.filter(a[c],function(a){return n(a,b)});return g.map(d,function(a){return{title:a,value:{title:a,url:a,attach:f.noop}}})},k=function(a){var c=e.filter(b,function(b){return b.type==a});return l(c)},p=function(){var a=k("anchor"),b=o(d,"anchor_top","#top"),c=o(d,"anchor_bottom","#bottom");return null!==b&&a.unshift(m("",b)),null!==c&&a.push(m("",c)),a},q=function(a){return e.reduce(a,function(a,b){var c=0===a.length||0===b.length;return c?a.concat(b):a.concat(h,b)},[])};return d.typeahead_urls===!1?[]:"file"===c?q([r(a,j(i)),r(a,k("header")),r(a,p())]):r(a,j(i))},q=function(a,b){var c=i[b];/^https?/.test(a)&&(c?e.indexOf(c,a)===-1&&(i[b]=c.slice(0,j).concat(a)):i[b]=[a])},r=function(a,b){var c=a.toLowerCase(),d=g.grep(b,function(a){return a.title.toLowerCase().indexOf(c)!==-1});return 1===d.length&&d[0].title===a?[]:d},s=function(a){var b=a.title;return b.raw?b.raw:b},t=function(a,c,d,e){var f=function(f){var g=b.find(d),h=p(f,g,e,c);a.showAutoComplete(h,f)};a.on("autocomplete",function(){f(a.value())}),a.on("selectitem",function(b){var c=b.value;a.value(c.url);var d=s(c);"image"===e?a.fire("change",{meta:{alt:d,attach:c.attach}}):a.fire("change",{meta:{text:d,attach:c.attach}}),a.focus()}),a.on("click",function(b){0===a.value().length&&"INPUT"===b.target.nodeName&&f("")}),a.on("PostRender",function(){a.getRoot().on("submit",function(b){b.isDefaultPrevented()||q(a.value(),e)})})},u=function(a){var b=a.status,c=a.message;return"valid"===b?{status:"ok",message:c}:"unknown"===b?{status:"warn",message:c}:"invalid"===b?{status:"warn",message:c}:{status:"none",message:""}},v=function(a,b,c){var d=b.filepicker_validator_handler;if(d){var e=function(b){return 0===b.length?void a.statusLevel("none"):void d({url:b,type:c},function(b){var c=u(b);a.statusMessage(c.message),a.statusLevel(c.status)})};a.state.on("change:value",function(a){e(a.value)})}};return d.extend({init:function(b){var c,d,e,f=this,i=h(),j=i.settings,k=b.filetype;b.spellcheck=!1,e=j.file_picker_types||j.file_browser_callback_types,e&&(e=g.makeMap(e,/[, ]/)),e&&!e[k]||(d=j.file_picker_callback,!d||e&&!e[k]?(d=j.file_browser_callback,!d||e&&!e[k]||(c=function(){d(f.getEl("inp").id,f.value(),k,a)})):c=function(){var a=f.fire("beforecall").meta;a=g.extend({filetype:k},a),d.call(i,function(a,b){f.value(a).fire("change",{meta:b})},f.value(),a)}),c&&(b.icon="browse",b.onaction=c),f._super(b),t(f,j,i.getBody(),k),v(f,j,k)}})}),g("39",["2u"],function(a){"use strict";return a.extend({recalc:function(a){var b=a.layoutRect(),c=a.paddingBox;a.items().filter(":visible").each(function(a){a.layoutRect({x:c.left,y:c.top,w:b.innerW-c.right-c.left,h:b.innerH-c.top-c.bottom}),a.recalc&&a.recalc()})}})}),g("3a",["2u"],function(a){"use strict";return a.extend({recalc:function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N=[],O=Math.max,P=Math.min;for(d=a.items().filter(":visible"),e=a.layoutRect(),f=a.paddingBox,g=a.settings,m=a.isRtl()?g.direction||"row-reversed":g.direction,h=g.align,i=a.isRtl()?g.pack||"end":g.pack,j=g.spacing||0,"row-reversed"!=m&&"column-reverse"!=m||(d=d.set(d.toArray().reverse()),m=m.split("-")[0]),"column"==m?(z="y",x="h",y="minH",A="maxH",C="innerH",B="top",D="deltaH",E="contentH",J="left",H="w",F="x",G="innerW",I="minW",K="right",L="deltaW",M="contentW"):(z="x",x="w",y="minW",A="maxW",C="innerW",B="left",D="deltaW",E="contentW",J="top",H="h",F="y",G="innerH",I="minH",K="bottom",L="deltaH",M="contentH"),l=e[C]-f[B]-f[B],w=k=0,b=0,c=d.length;b0&&(k+=q,o[A]&&N.push(n),o.flex=q),l-=o[y],r=f[J]+o[I]+f[K],r>w&&(w=r);if(u={},l<0?u[y]=e[y]-l+e[D]:u[y]=e[C]-l+e[D],u[I]=w+e[L],u[E]=e[C]-l,u[M]=w,u.minW=P(u.minW,e.maxW),u.minH=P(u.minH,e.maxH),u.minW=O(u.minW,e.startMinWidth),u.minH=O(u.minH,e.startMinHeight),!e.autoResize||u.minW==e.minW&&u.minH==e.minH){for(t=l/k,b=0,c=N.length;bs?(l-=o[A]-o[y],k-=o.flex,o.flex=0,o.maxFlexSize=s):o.maxFlexSize=0;for(t=l/k,v=f[B],u={},0===k&&("end"==i?v=l+f[B]:"center"==i?(v=Math.round(e[C]/2-(e[C]-l)/2)+f[B],v<0&&(v=f[B])):"justify"==i&&(v=f[B],j=Math.floor(l/(d.length-1)))),u[F]=f[J],b=0,c=d.length;b0&&(r+=o.flex*t),u[x]=r,u[z]=v,n.layoutRect(u),n.recalc&&n.recalc(),v+=r+j}else if(u.w=u.minW,u.h=u.minH,a.layoutRect(u),this.recalc(a),null===a._lastRect){var Q=a.parent();Q&&(Q._lastRect=null,Q.recalc())}}})}),g("3b",["2t"],function(a){return a.extend({Defaults:{containerClass:"flow-layout",controlClass:"flow-layout-item",endClass:"break"},recalc:function(a){a.items().filter(":visible").each(function(a){a.recalc&&a.recalc()})},isNative:function(){return!0}})}),g("4y",["1m","4z","1r","4d","e"],function(a,b,c,d,e){var f=function(a,c,d){for(;d!==c;){if(d.style[a]){var e=d.style[a];return""!==e?b.some(e):b.none()}d=d.parentNode}return b.none()},g=function(a){return/[0-9.]+px$/.test(a)?Math.round(72*parseInt(a,10)/96)+"pt":a},h=function(a){return a.replace(/[\'\"]/g,"").replace(/,\s+/g,",")},i=function(a,c){return b.from(e.DOM.getStyle(c,a,!0))},j=function(a){return function(e,g){return b.from(g).map(c.fromDom).filter(d.isElement).bind(function(b){return f(a,e,b.dom()).or(i(a,b.dom()))}).getOr("")}};return{getFontSize:j("fontSize"),getFontFamily:a.compose(h,j("fontFamily")),toPt:g}}),g("3c",["2g","2r","2p","9","1g","e","17","6","4y"],function(a,b,c,d,e,f,g,h,i){function j(a){a.settings.ui_container&&(h.container=f.DOM.select(a.settings.ui_container)[0])}function k(b){b.on("ScriptsLoaded",function(){b.rtl&&(a.rtl=!0)})}function l(a){function b(b,c){return function(){var d=this;a.on("nodeChange",function(e){var f=a.formatter,g=null;m(e.parents,function(a){if(m(b,function(b){if(c?f.matchNode(a,c,{value:b.value})&&(g=b.value):f.matchNode(a,b.value)&&(g=b.value),g)return!1}),g)return!1}),d.value(g)})}}function e(b){return function(){var c=this,d=function(a){return a?a.split(",")[0]:""};a.on("init nodeChange",function(e){var f,g=null;f=i.getFontFamily(a.getBody(),e.element),m(b,function(a){a.value.toLowerCase()===f.toLowerCase()&&(g=a.value)}),m(b,function(a){g||d(a.value).toLowerCase()!==d(f).toLowerCase()||(g=a.value)}),c.value(g),!g&&f&&c.text(d(f))})}}function f(b){return function(){var c=this;a.on("init nodeChange",function(d){var e,f,g=null;e=i.getFontSize(a.getBody(),d.element),f=i.toPt(e),m(b,function(a){a.value===e?g=e:a.value===f&&(g=f)}),c.value(g),g||c.text(f)})}}function g(a){a=a.replace(/;$/,"").split(";");for(var b=a.length;b--;)a[b]=a[b].split("=");return a}function h(){function b(a){var c=[];if(a)return m(a,function(a){var f={text:a.title,icon:a.icon};if(a.items)f.menu=b(a.items);else{var g=a.format||"custom"+d++;a.format||(a.name=g,e.push(a)),f.format=g,f.cmd=a.cmd}c.push(f)}),c}function c(){var c;return c=b(a.settings.style_formats_merge?a.settings.style_formats?f.concat(a.settings.style_formats):f:a.settings.style_formats||f)}var d=0,e=[],f=[{title:"Headings",items:[{title:"Heading 1",format:"h1"},{title:"Heading 2",format:"h2"},{title:"Heading 3",format:"h3"},{title:"Heading 4",format:"h4"},{title:"Heading 5",format:"h5"},{title:"Heading 6",format:"h6"}]},{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}];return a.on("init",function(){m(e,function(b){a.formatter.register(b.name,b)})}),{type:"menu",items:c(),onPostRender:function(b){a.fire("renderFormatsMenu",{control:b.control})},itemDefaults:{preview:!0,textStyle:function(){if(this.settings.format)return a.formatter.getCssText(this.settings.format)},onPostRender:function(){var b=this;b.parent().on("show",function(){var c,d;c=b.settings.format,c&&(b.disabled(!a.formatter.canApply(c)),b.active(a.formatter.match(c))),d=b.settings.cmd,d&&b.active(a.queryCommandState(d))})},onclick:function(){this.settings.format&&o(this.settings.format),this.settings.cmd&&a.execCommand(this.settings.cmd)}}}}function j(b){return function(){var c=this;a.formatter?a.formatter.formatChanged(b,function(a){c.active(a)}):a.on("init",function(){a.formatter.formatChanged(b,function(a){c.active(a)})})}}function k(b){return function(){function c(){var c="redo"==b?"hasRedo":"hasUndo";return!!a.undoManager&&a.undoManager[c]()}var d=this;d.disabled(!c()),a.on("Undo Redo AddUndo TypingUndo ClearUndos SwitchMode",function(){d.disabled(a.readonly||!c())})}}function l(){var b=this;a.on("VisualAid",function(a){b.active(a.hasVisual)}),b.active(a.hasVisual)}function o(b){b.control&&(b=b.control.value()),b&&a.execCommand("mceToggleFormat",!1,b)}function p(b){var c=b.length;return d.each(b,function(b){b.menu&&(b.hidden=0===p(b.menu));var d=b.format;d&&(b.hidden=!a.formatter.canApply(d)),b.hidden&&c--}),c}function q(b){var c=b.items().length;return b.items().each(function(b){b.menu&&b.visible(q(b.menu)>0),!b.menu&&b.settings.menu&&b.visible(p(b.settings.menu)>0);var d=b.settings.format;d&&b.visible(a.formatter.canApply(d)),b.visible()||c--}),c}var r;r=h(),m({bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript"},function(b,c){a.addButton(c,{tooltip:b,onPostRender:j(c),onclick:function(){o(c)}})}),m({outdent:["Decrease indent","Outdent"],indent:["Increase indent","Indent"],cut:["Cut","Cut"],copy:["Copy","Copy"],paste:["Paste","Paste"],help:["Help","mceHelp"],selectall:["Select all","SelectAll"],removeformat:["Clear formatting","RemoveFormat"],visualaid:["Visual aids","mceToggleVisualAid"],newdocument:["New document","mceNewDocument"]},function(b,c){a.addButton(c,{tooltip:b[0],cmd:b[1]})}),m({blockquote:["Blockquote","mceBlockQuote"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],alignleft:["Align left","JustifyLeft"],aligncenter:["Align center","JustifyCenter"],alignright:["Align right","JustifyRight"],alignjustify:["Justify","JustifyFull"],alignnone:["No alignment","JustifyNone"]},function(b,c){a.addButton(c,{tooltip:b[0],cmd:b[1],onPostRender:j(c)})});var s=function(a){var b=a;return b.length>0&&"-"===b[0].text&&(b=b.slice(1)),b.length>0&&"-"===b[b.length-1].text&&(b=b.slice(0,b.length-1)),b},t=function(b){var c,e;if("string"==typeof b)e=b.split(" ");else if(d.isArray(b))return n(d.map(b,t));return c=d.grep(e,function(b){return"|"===b||b in a.menuItems}),d.map(c,function(b){return"|"===b?{text:"-"}:a.menuItems[b]})},u=function(b){var c=[{text:"-"}],e=d.grep(a.menuItems,function(a){return a.context===b});return d.each(e,function(a){"before"==a.separator&&c.push({text:"|"}),a.prependToContext?c.unshift(a):c.push(a),"after"==a.separator&&c.push({text:"|"})}),c},v=function(a){return s(a.insert_button_items?t(a.insert_button_items):u("insert"))};a.addButton("undo",{tooltip:"Undo",onPostRender:k("undo"),cmd:"undo"}),a.addButton("redo",{tooltip:"Redo",onPostRender:k("redo"),cmd:"redo"}),a.addMenuItem("newdocument",{text:"New document",icon:"newdocument",cmd:"mceNewDocument"}),a.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onPostRender:k("undo"),cmd:"undo"}),a.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onPostRender:k("redo"),cmd:"redo"}),a.addMenuItem("visualaid",{text:"Visual aids",selectable:!0,onPostRender:l,cmd:"mceToggleVisualAid"}),a.addButton("remove",{tooltip:"Remove",icon:"remove",cmd:"Delete"}),a.addButton("insert",{type:"menubutton",icon:"insert",menu:[],oncreatemenu:function(){this.menu.add(v(a.settings)),this.menu.renderNew()}}),m({cut:["Cut","Cut","Meta+X"],copy:["Copy","Copy","Meta+C"],paste:["Paste","Paste","Meta+V"],selectall:["Select all","SelectAll","Meta+A"],bold:["Bold","Bold","Meta+B"],italic:["Italic","Italic","Meta+I"],underline:["Underline","Underline","Meta+U"],strikethrough:["Strikethrough","Strikethrough"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],removeformat:["Clear formatting","RemoveFormat"]},function(b,c){a.addMenuItem(c,{text:b[0],icon:c,shortcut:b[2],cmd:b[1]})}),a.on("mousedown",function(){c.hideAll()}),a.addButton("styleselect",{type:"menubutton",text:"Formats",menu:r,onShowMenu:function(){a.settings.style_formats_autohide&&q(this.menu)}}),a.addButton("formatselect",function(){var c=[],d=g(a.settings.block_formats||"Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre");return m(d,function(b){c.push({text:b[0],value:b[1],textStyle:function(){return a.formatter.getCssText(b[1])}})}),{type:"listbox",text:d[0][0],values:c,fixedWidth:!0,onselect:o,onPostRender:b(c)}}),a.addButton("fontselect",function(){var b="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",c=[],d=g(a.settings.font_formats||b);return m(d,function(a){c.push({text:{raw:a[0]},value:a[1],textStyle:a[1].indexOf("dings")==-1?"font-family:"+a[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:c,fixedWidth:!0,onPostRender:e(c),onselect:function(b){b.control.settings.value&&a.execCommand("FontName",!1,b.control.settings.value)}}}),a.addButton("fontsizeselect",function(){var b=[],c="8pt 10pt 12pt 14pt 18pt 24pt 36pt",d=a.settings.fontsize_formats||c;return m(d.split(" "),function(a){var c=a,d=a,e=a.split("=");e.length>1&&(c=e[0],d=e[1]),b.push({text:c,value:d})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:b,fixedWidth:!0,onPostRender:f(b),onclick:function(b){b.control.settings.value&&a.execCommand("FontSize",!1,b.control.settings.value)}}}),a.addMenuItem("formats",{text:"Formats",menu:r})}var m=d.each,n=function(a){return e.reduce(a,function(a,b){return a.concat(b)},[])};return g.on("AddEditor",function(a){var b=a.editor;k(b),l(b),j(b)}),a.translate=function(a){return g.translate(a)},b.tooltips=!h.iOS,{}}),g("3d",["2u"],function(a){"use strict";return a.extend({recalc:function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E=[],F=[];b=a.settings,e=a.items().filter(":visible"),f=a.layoutRect(),d=b.columns||Math.ceil(Math.sqrt(e.length)),c=Math.ceil(e.length/d),s=b.spacingH||b.spacing||0,t=b.spacingV||b.spacing||0,u=b.alignH||b.align,v=b.alignV||b.align,q=a.paddingBox,C="reverseRows"in b?b.reverseRows:a.isRtl(),u&&"string"==typeof u&&(u=[u]),v&&"string"==typeof v&&(v=[v]);for(l=0;lE[l]?y:E[l],F[m]=z>F[m]?z:F[m];for(A=f.innerW-q.left-q.right,w=0,l=0;l0?s:0),A-=(l>0?s:0)+E[l];for(B=f.innerH-q.top-q.bottom,x=0,m=0;m0?t:0),B-=(m>0?t:0)+F[m];if(w+=q.left+q.right,x+=q.top+q.bottom,i={},i.minW=w+(f.w-f.innerW),i.minH=x+(f.h-f.innerH),i.contentW=i.minW-f.deltaW,i.contentH=i.minH-f.deltaH,i.minW=Math.min(i.minW,f.maxW),i.minH=Math.min(i.minH,f.maxH),i.minW=Math.max(i.minW,f.startMinWidth),i.minH=Math.max(i.minH,f.startMinHeight),!f.autoResize||i.minW==f.minW&&i.minH==f.minH){f.autoResize&&(i=a.layoutRect(i),i.contentW=i.minW-f.deltaW,i.contentH=i.minH-f.deltaH);var G;G="start"==b.packV?0:B>0?Math.floor(B/c):0;var H=0,I=b.flexWidths;if(I)for(l=0;l'},src:function(a){this.getEl().src=a},html:function(a,c){var d=this,e=this.getEl().contentWindow.document.body;return e?(e.innerHTML=a,c&&c()):b.setTimeout(function(){d.html(a)}),this}})}),g("3f",["2r"],function(a){"use strict";return a.extend({init:function(a){var b=this;b._super(a),b.classes.add("widget").add("infobox"),b.canFocus=!1},severity:function(a){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(a)},help:function(a){this.state.set("help",a)},renderHtml:function(){var a=this,b=a.classPrefix;return'
'+a.encode(a.state.get("text"))+'
'},bindStates:function(){var a=this;return a.state.on("change:text",function(b){a.getEl("body").firstChild.data=a.encode(b.value),a.state.get("rendered")&&a.updateLayoutRect()}),a.state.on("change:help",function(b){a.classes.toggle("has-help",b.value),a.state.get("rendered")&&a.updateLayoutRect()}),a._super()}})}),g("3g",["2r","4q"],function(a,b){"use strict";return a.extend({init:function(a){var b=this;b._super(a),b.classes.add("widget").add("label"),b.canFocus=!1,a.multiline&&b.classes.add("autoscroll"),a.strong&&b.classes.add("strong")},initLayoutRect:function(){var a=this,c=a._super();if(a.settings.multiline){var d=b.getSize(a.getEl());d.width>c.maxW&&(c.minW=c.maxW,a.classes.add("multiline")),a.getEl().style.width=c.minW+"px",c.startMinH=c.h=c.minH=Math.min(c.maxH,b.getSize(a.getEl()).height)}return c},repaint:function(){var a=this;return a.settings.multiline||(a.getEl().style.lineHeight=a.layoutRect().h+"px"),a._super()},severity:function(a){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(a)},renderHtml:function(){var a,b,c=this,d=c.settings.forId,e=c.settings.html?c.settings.html:c.encode(c.state.get("text"));return!d&&(b=c.settings.forName)&&(a=c.getRoot().find("#"+b)[0],a&&(d=a._id)),d?'":''+e+""},bindStates:function(){var a=this;return a.state.on("change:text",function(b){a.innerHtml(a.encode(b.value)),a.state.get("rendered")&&a.updateLayoutRect()}),a._super()}})}),g("3h",["2j"],function(a){"use strict";return a.extend({Defaults:{role:"toolbar",layout:"flow"},init:function(a){var b=this;b._super(a),b.classes.add("toolbar")},postRender:function(){var a=this;return a.items().each(function(a){a.classes.add("toolbar-item")}),a._super()}})}),g("3i",["3h"],function(a){"use strict";return a.extend({Defaults:{role:"menubar",containerCls:"menubar",ariaRoot:!0,defaults:{type:"menubutton"}}})}),g("3j",["2v","2h","3i"],function(a,b,c){"use strict";function d(a,b){for(;a;){if(b===a)return!0;a=a.parentNode}return!1}var e=a.extend({init:function(a){var b=this;b._renderOpen=!0,b._super(a),a=b.settings,b.classes.add("menubtn"),a.fixedWidth&&b.classes.add("fixed-width"),b.aria("haspopup",!0),b.state.set("menu",a.menu||b.render())},showMenu:function(a){var c,d=this;return d.menu&&d.menu.visible()&&a!==!1?d.hideMenu():(d.menu||(c=d.state.get("menu")||[],c.length?c={type:"menu",items:c}:c.type=c.type||"menu",c.renderTo?d.menu=c.parent(d).show().renderTo():d.menu=b.create(c).parent(d).renderTo(),d.fire("createmenu"),d.menu.reflow(),d.menu.on("cancel",function(a){a.control.parent()===d.menu&&(a.stopPropagation(),d.focus(),d.hideMenu())}),d.menu.on("select",function(){d.focus()}),d.menu.on("show hide",function(a){a.control==d.menu&&d.activeMenu("show"==a.type),d.aria("expanded","show"==a.type)}).fire("show")),d.menu.show(),d.menu.layoutRect({w:d.layoutRect().w}),d.menu.moveRel(d.getEl(),d.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"]),void d.fire("showmenu"))},hideMenu:function(){var a=this;a.menu&&(a.menu.items().each(function(a){a.hideMenu&&a.hideMenu()}),a.menu.hide())},activeMenu:function(a){this.classes.toggle("active",a)},renderHtml:function(){var a,b=this,d=b._id,e=b.classPrefix,f=b.settings.icon,g=b.state.get("text"),h="";return a=b.settings.image,a?(f="none","string"!=typeof a&&(a=window.getSelection?a[0]:a[1]),a=" style=\"background-image: url('"+a+"')\""):a="",g&&(b.classes.add("btn-has-text"),h=''+b.encode(g)+""),f=b.settings.icon?e+"ico "+e+"i-"+f:"",b.aria("role",b.parent()instanceof c?"menuitem":"button"),'
'},postRender:function(){var a=this;return a.on("click",function(b){b.control===a&&d(b.target,a.getEl())&&(a.focus(),a.showMenu(!b.aria),b.aria&&a.menu.items().filter(":visible")[0].focus())}),a.on("mouseenter",function(b){var c,d=b.control,f=a.parent();d&&f&&d instanceof e&&d.parent()==f&&(f.items().filter("MenuButton").each(function(a){a.hideMenu&&a!=d&&(a.menu&&a.menu.visible()&&(c=!0),a.hideMenu())}),c&&(d.focus(),d.showMenu()))}),a._super()},bindStates:function(){var a=this;return a.state.on("change:menu",function(){a.menu&&a.menu.remove(),a.menu=null}),a._super()},remove:function(){this._super(),this.menu&&this.menu.remove()}});return e}),g("3k",["2r","2h","6","5"],function(a,b,c,d){"use strict";return a.extend({Defaults:{border:0,role:"menuitem"},init:function(a){var b,c=this;c._super(a),a=c.settings,c.classes.add("menu-item"),a.menu&&c.classes.add("menu-item-expand"),a.preview&&c.classes.add("menu-item-preview"),b=c.state.get("text"),"-"!==b&&"|"!==b||(c.classes.add("menu-item-sep"),c.aria("role","separator"),c.state.set("text","-")),a.selectable&&(c.aria("role","menuitemcheckbox"),c.classes.add("menu-item-checkbox"),a.icon="selected"),a.preview||a.selectable||c.classes.add("menu-item-normal"),c.on("mousedown",function(a){a.preventDefault()}),a.menu&&!a.ariaHideMenu&&c.aria("haspopup",!0)},hasMenus:function(){return!!this.settings.menu},showMenu:function(){var a,c=this,d=c.settings,e=c.parent();if(e.items().each(function(a){a!==c&&a.hideMenu()}),d.menu){a=c.menu,a?a.show():(a=d.menu,a.length?a={type:"menu",items:a}:a.type=a.type||"menu",e.settings.itemDefaults&&(a.itemDefaults=e.settings.itemDefaults),a=c.menu=b.create(a).parent(c).renderTo(),a.reflow(),a.on("cancel",function(b){b.stopPropagation(),c.focus(),a.hide()}),a.on("show hide",function(a){a.control.items&&a.control.items().each(function(a){a.active(a.settings.selected)})}).fire("show"),a.on("hide",function(b){b.control===a&&c.classes.remove("selected")}),a.submenu=!0),a._parentMenu=e,a.classes.add("menu-sub");var f=a.testMoveRel(c.getEl(),c.isRtl()?["tl-tr","bl-br","tr-tl","br-bl"]:["tr-tl","br-bl","tl-tr","bl-br"]);a.moveRel(c.getEl(),f),a.rel=f,f="menu-sub-"+f,a.classes.remove(a._lastRel).add(f),a._lastRel=f,c.classes.add("selected"),c.aria("expanded",!0)}},hideMenu:function(){var a=this;return a.menu&&(a.menu.items().each(function(a){a.hideMenu&&a.hideMenu()}),a.menu.hide(),a.aria("expanded",!1)),a},renderHtml:function(){function a(a){var b,d,e={};for(e=c.mac?{alt:"⌥",ctrl:"⌘",shift:"⇧",meta:"⌘"}:{meta:"Ctrl"},a=a.split("+"),b=0;b").replace(new RegExp(b("]mce~match!"),"g"),"
")}var f=this,g=f._id,h=f.settings,i=f.classPrefix,j=f.state.get("text"),k=f.settings.icon,l="",m=h.shortcut,n=f.encode(h.url),o="";return k&&f.parent().classes.add("menu-has-icons"),h.image&&(l=" style=\"background-image: url('"+h.image+"')\""),m&&(m=a(m)),k=i+"ico "+i+"i-"+(f.settings.icon||"none"),o="-"!==j?'\xa0":"",j=e(f.encode(d(j))),n=e(f.encode(d(n))),'
'+o+("-"!==j?''+j+"":"")+(m?'
'+m+"
":"")+(h.menu?'
':"")+(n?'":"")+"
"},postRender:function(){var a=this,b=a.settings,c=b.textStyle;if("function"==typeof c&&(c=c.call(this)),c){var e=a.getEl("text");e&&e.setAttribute("style",c)}return a.on("mouseenter click",function(c){c.control===a&&(b.menu||"click"!==c.type?(a.showMenu(),c.aria&&a.menu.focus(!0)):(a.fire("select"),d.requestAnimationFrame(function(){a.parent().hideAll()})))}),a._super(),a},hover:function(){var a=this;return a.parent().items().each(function(a){a.classes.remove("selected")}),a.classes.toggle("selected",!0),a},active:function(a){return"undefined"!=typeof a&&this.aria("checked",a),this._super(a)},remove:function(){this._super(),this.menu&&this.menu.remove()}})}),g("3l",["a","2g","5"],function(a,b,c){"use strict";return function(d,e){var f,g,h=this,i=b.classPrefix;h.show=function(b,j){function k(){f&&(a(d).append('
'),j&&j())}return h.hide(),f=!0,b?g=c.setTimeout(k,b):k(),h},h.hide=function(){var a=d.lastChild;return c.clearTimeout(g),a&&a.className.indexOf("throbber")!=-1&&a.parentNode.removeChild(a),f=!1,h}}}),g("3m",["2p","3k","3l","9"],function(a,b,c,d){"use strict";return a.extend({Defaults:{defaultType:"menuitem",border:1,layout:"stack",role:"application",bodyRole:"menu",ariaRoot:!0},init:function(a){var b=this;if(a.autohide=!0,a.constrainToViewport=!0,"function"==typeof a.items&&(a.itemsFactory=a.items,a.items=[]),a.itemDefaults)for(var c=a.items,e=c.length;e--;)c[e]=d.extend({},a.itemDefaults,c[e]);b._super(a),b.classes.add("menu")},repaint:function(){return this.classes.toggle("menu-align",!0), +this._super(),this.getEl().style.height="",this.getEl("body").style.height="",this},cancel:function(){var a=this;a.hideAll(),a.fire("select")},load:function(){function a(){e.throbber&&(e.throbber.hide(),e.throbber=null)}var b,d,e=this;d=e.settings.itemsFactory,d&&(e.throbber||(e.throbber=new c(e.getEl("body"),!0),0===e.items().length?(e.throbber.show(),e.fire("loading")):e.throbber.show(100,function(){e.items().remove(),e.fire("loading")}),e.on("hide close",a)),e.requestTime=b=(new Date).getTime(),e.settings.itemsFactory(function(c){return 0===c.length?void e.hide():void(e.requestTime===b&&(e.getEl().style.width="",e.getEl("body").style.width="",a(),e.items().remove(),e.getEl("body").innerHTML="",e.add(c),e.renderNew(),e.fire("loaded")))}))},hideAll:function(){var a=this;return this.find("menuitem").exec("hideMenu"),a._super()},preRender:function(){var a=this;return a.items().each(function(b){var c=b.settings;if(c.icon||c.image||c.selectable)return a._hasIcons=!0,!1}),a.settings.itemsFactory&&a.on("postrender",function(){a.settings.itemsFactory&&a.load()}),a._super()}})}),g("3n",["3j","3m"],function(a,b){"use strict";return a.extend({init:function(a){function b(c){for(var f=0;f0&&(e=c[0].text,g.state.set("value",c[0].value)),g.state.set("menu",c)),g.state.set("text",a.text||e),g.classes.add("listbox"),g.on("select",function(b){var c=b.control;f&&(b.lastControl=f),a.multiple?c.active(!c.active()):g.value(b.control.value()),f=c})},bindStates:function(){function a(a,c){a instanceof b&&a.items().each(function(a){a.hasMenus()||a.active(a.value()===c)})}function c(a,b){var d;if(a)for(var e=0;e'},postRender:function(){var a=this;a._super(),a.resizeDragHelper=new b(this._id,{start:function(){a.fire("ResizeStart")},drag:function(b){"both"!=a.settings.direction&&(b.deltaX=0),a.fire("Resize",b)},stop:function(){a.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}})}),g("3q",["2r"],function(a){"use strict";function b(a){var b="";if(a)for(var c=0;c'+a[c]+"";return b}return a.extend({Defaults:{classes:"selectbox",role:"selectbox",options:[]},init:function(a){var b=this;b._super(a),b.settings.size&&(b.size=b.settings.size),b.settings.options&&(b._options=b.settings.options),b.on("keydown",function(a){var c;13==a.keyCode&&(a.preventDefault(),b.parents().reverse().each(function(a){if(a.toJSON)return c=a,!1}),b.fire("submit",{data:c.toJSON()}))})},options:function(a){return arguments.length?(this.state.set("options",a),this):this.state.get("options")},renderHtml:function(){var a,c=this,d="";return a=b(c._options),c.size&&(d=' size = "'+c.size+'"'),'"},bindStates:function(){var a=this;return a.state.on("change:options",function(c){a.getEl().innerHTML=b(c.value)}),a._super()}})}),g("3r",["2r","2k","4q"],function(a,b,c){"use strict";function d(a,b,c){return ac&&(a=c),a}function e(a,b,c){a.setAttribute("aria-"+b,c)}function f(a,b){var d,f,g,h,i,j;"v"==a.settings.orientation?(h="top",g="height",f="h"):(h="left",g="width",f="w"),j=a.getEl("handle"),d=(a.layoutRect()[f]||100)-c.getSize(j)[g],i=d*((b-a._minValue)/(a._maxValue-a._minValue))+"px",j.style[h]=i,j.style.height=a.layoutRect().h+"px",e(j,"valuenow",b),e(j,"valuetext",""+a.settings.previewFilter(b)),e(j,"valuemin",a._minValue),e(j,"valuemax",a._maxValue)}return a.extend({init:function(a){var b=this;a.previewFilter||(a.previewFilter=function(a){return Math.round(100*a)/100}),b._super(a),b.classes.add("slider"),"v"==a.orientation&&b.classes.add("vertical"),b._minValue=a.minValue||0,b._maxValue=a.maxValue||100,b._initValue=b.state.get("value")},renderHtml:function(){var a=this,b=a._id,c=a.classPrefix;return'
'},reset:function(){this.value(this._initValue).repaint()},postRender:function(){function a(a,b,c){return(c+a)/(b-a)}function e(a,b,c){return c*(b-a)-a}function f(b,c){function f(f){var g;g=n.value(),g=e(b,c,a(b,c,g)+.05*f),g=d(g,b,c),n.value(g),n.fire("dragstart",{value:g}),n.fire("drag",{value:g}),n.fire("dragend",{value:g})}n.on("keydown",function(a){switch(a.keyCode){case 37:case 38:f(-1);break;case 39:case 40:f(1)}})}function g(a,e,f){var g,h,i,o,p;n._dragHelper=new b(n._id,{handle:n._id+"-handle",start:function(a){g=a[j],h=parseInt(n.getEl("handle").style[k],10),i=(n.layoutRect()[m]||100)-c.getSize(f)[l],n.fire("dragstart",{value:p})},drag:function(b){var c=b[j]-g;o=d(h+c,0,i),f.style[k]=o+"px",p=a+o/i*(e-a),n.value(p),n.tooltip().text(""+n.settings.previewFilter(p)).show().moveRel(f,"bc tc"),n.fire("drag",{value:p})},stop:function(){n.tooltip().hide(),n.fire("dragend",{value:p})}})}var h,i,j,k,l,m,n=this;h=n._minValue,i=n._maxValue,"v"==n.settings.orientation?(j="screenY",k="top",l="height",m="h"):(j="screenX",k="left",l="width",m="w"),n._super(),f(h,i,n.getEl("handle")),g(h,i,n.getEl("handle"))},repaint:function(){this._super(),f(this,this.value())},bindStates:function(){var a=this;return a.state.on("change:value",function(b){f(a,b.value)}),a._super()}})}),g("3s",["2r"],function(a){"use strict";return a.extend({renderHtml:function(){var a=this;return a.classes.add("spacer"),a.canFocus=!1,'
'}})}),g("3t",["3j","4q","a"],function(a,b,c){return a.extend({Defaults:{classes:"widget btn splitbtn",role:"button"},repaint:function(){var a,d,e=this,f=e.getEl(),g=e.layoutRect();return e._super(),a=f.firstChild,d=f.lastChild,c(a).css({width:g.w-b.getSize(d).width,height:g.h-2}),c(d).css({height:g.h-2}),e},activeMenu:function(a){var b=this;c(b.getEl().lastChild).toggleClass(b.classPrefix+"active",a)},renderHtml:function(){var a,b=this,c=b._id,d=b.classPrefix,e=b.state.get("icon"),f=b.state.get("text"),g="";return a=b.settings.image,a?(e="none","string"!=typeof a&&(a=window.getSelection?a[0]:a[1]),a=" style=\"background-image: url('"+a+"')\""):a="",e=b.settings.icon?d+"ico "+d+"i-"+e:"",f&&(b.classes.add("btn-has-text"),g=''+b.encode(f)+""),'
'},postRender:function(){var a=this,b=a.settings.onclick;return a.on("click",function(a){var c=a.target;if(a.control==this)for(;c;){if(a.aria&&"down"!=a.aria.key||"BUTTON"==c.nodeName&&c.className.indexOf("open")==-1)return a.stopImmediatePropagation(),void(b&&b.call(this,a));c=c.parentNode}}),delete a.settings.onclick,a._super()}})}),g("3u",["3b"],function(a){"use strict";return a.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"},isNative:function(){return!0}})}),g("3v",["2m","a","4q"],function(a,b,c){"use strict";return a.extend({Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(a){var c;this.activeTabId&&(c=this.getEl(this.activeTabId),b(c).removeClass(this.classPrefix+"active"),c.setAttribute("aria-selected","false")),this.activeTabId="t"+a,c=this.getEl("t"+a),c.setAttribute("aria-selected","true"),b(c).addClass(this.classPrefix+"active"),this.items()[a].show().fire("showtab"),this.reflow(),this.items().each(function(b,c){a!=c&&b.hide()})},renderHtml:function(){var a=this,b=a._layout,c="",d=a.classPrefix;return a.preRender(),b.preRender(a),a.items().each(function(b,e){var f=a._id+"-t"+e;b.aria("role","tabpanel"),b.aria("labelledby",f),c+='"}),'
'+c+'
'+b.renderHtml(a)+"
"},postRender:function(){var a=this;a._super(),a.settings.activeTab=a.settings.activeTab||0,a.activateTab(a.settings.activeTab),this.on("click",function(b){var c=b.target.parentNode;if(c&&c.id==a._id+"-head")for(var d=c.childNodes.length;d--;)c.childNodes[d]==b.target&&a.activateTab(d)})},initLayoutRect:function(){var a,b,d,e=this;b=c.getSize(e.getEl("head")).width,b=b<0?0:b,d=0,e.items().each(function(a){b=Math.max(b,a.layoutRect().minW),d=Math.max(d,a.layoutRect().minH)}),e.items().each(function(a){a.settings.x=0,a.settings.y=0,a.settings.w=b,a.settings.h=d,a.layoutRect({x:0,y:0,w:b,h:d})});var f=c.getSize(e.getEl("head")).height;return e.settings.minWidth=b,e.settings.minHeight=d+f,a=e._super(),a.deltaH+=f,a.innerH=a.h-a.deltaH,a}})}),g("3w",["2r","9","4q"],function(a,b,c){return a.extend({init:function(a){var b=this;b._super(a),b.classes.add("textbox"),a.multiline?b.classes.add("multiline"):(b.on("keydown",function(a){var c;13==a.keyCode&&(a.preventDefault(),b.parents().reverse().each(function(a){if(a.toJSON)return c=a,!1}),b.fire("submit",{data:c.toJSON()}))}),b.on("keyup",function(a){b.state.set("value",a.target.value)}))},repaint:function(){var a,b,c,d,e,f=this,g=0;a=f.getEl().style,b=f._layoutRect,e=f._lastRepaintRect||{};var h=document;return!f.settings.multiline&&h.all&&(!h.documentMode||h.documentMode<=8)&&(a.lineHeight=b.h-g+"px"),c=f.borderBox,d=c.left+c.right+8,g=c.top+c.bottom+(f.settings.multiline?8:0),b.x!==e.x&&(a.left=b.x+"px",e.x=b.x),b.y!==e.y&&(a.top=b.y+"px",e.y=b.y),b.w!==e.w&&(a.width=b.w-d+"px",e.w=b.w),b.h!==e.h&&(a.height=b.h-g+"px",e.h=b.h),f._lastRepaintRect=e,f.fire("repaint",{},!1),f},renderHtml:function(){var a,d,e=this,f=e.settings;return a={id:e._id,hidefocus:"1"},b.each(["rows","spellcheck","maxLength","size","readonly","min","max","step","list","pattern","placeholder","required","multiple"],function(b){a[b]=f[b]}),e.disabled()&&(a.disabled="disabled"),f.subtype&&(a.type=f.subtype),d=c.create(f.multiline?"textarea":"input",a),d.value=e.state.get("value"),d.className=e.classes,d.outerHTML},value:function(a){return arguments.length?(this.state.set("value",a),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var a=this;a.getEl().value=a.state.get("value"),a._super(),a.$el.on("change",function(b){a.state.set("value",b.target.value),a.fire("change",b)})},bindStates:function(){var a=this;return a.state.on("change:value",function(b){a.getEl().value!=b.value&&(a.getEl().value=b.value)}),a.state.on("change:disabled",function(b){a.getEl().disabled=b.value}),a._super()},remove:function(){this.$el.off(),this._super()}})}),g("1f",["2d","2e","2f","2g","2h","2i","2j","2k","2l","2m","2n","2o","2p","23","24","2q","2r","2s","25","2t","2u","2v","2w","2x","2y","2z","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","3g","3h","3i","3j","3k","3l","3m","3n","3o","3p","3q","3r","3s","3t","3u","3v","3w"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca,da,ea){"use strict";var fa=function(a,b){e.add(a.split(".").pop(),b)},ga=function(a,b,c){var d,e;for(e=b.split(/[.\/]/),d=0;d + * Released under Apache-2.0 license + * http://apache.org/licenses/LICENSE-2.0.html + */ +!function(a,b,c,d){"use strict";var e=a.fn.twbsPagination,f=function(b,c){if(this.$element=a(b),this.options=a.extend({},a.fn.twbsPagination.defaults,c),this.options.startPage<1||this.options.startPage>this.options.totalPages)throw new Error("Start page option is incorrect");if(this.options.totalPages=parseInt(this.options.totalPages),isNaN(this.options.totalPages))throw new Error("Total pages option is not correct!");if(this.options.visiblePages=parseInt(this.options.visiblePages),isNaN(this.options.visiblePages))throw new Error("Visible pages option is not correct!");if(this.options.onPageClick instanceof Function&&this.$element.first().on("page",this.options.onPageClick),this.options.hideOnlyOnePage&&1==this.options.totalPages)return this.$element.trigger("page",1),this;this.options.totalPages"),this.$listContainer.addClass(this.options.paginationClass),"UL"!==d&&this.$element.append(this.$listContainer),this.options.initiateStartPageClick?this.show(this.options.startPage):(this.currentPage=this.options.startPage,this.render(this.getPages(this.options.startPage)),this.setupEvents()),this};f.prototype={constructor:f,destroy:function(){return this.$element.empty(),this.$element.removeData("twbs-pagination"),this.$element.off("page"),this},show:function(a){if(a<1||a>this.options.totalPages)throw new Error("Page is incorrect.");return this.currentPage=a,this.render(this.getPages(a)),this.setupEvents(),this.$element.trigger("page",a),this},enable:function(){this.show(this.currentPage)},disable:function(){var b=this;this.$listContainer.off("click").on("click","li",function(a){a.preventDefault()}),this.$listContainer.children().each(function(){var c=a(this);c.hasClass(b.options.activeClass)||a(this).addClass(b.options.disabledClass)})},buildListItems:function(a){var b=[];if(this.options.first&&b.push(this.buildItem("first",1)),this.options.prev){var c=a.currentPage>1?a.currentPage-1:this.options.loop?this.options.totalPages:1;b.push(this.buildItem("prev",c))}for(var d=0;d"),e=a(""),f=this.options[b]?this.makeText(this.options[b],c):c;return d.addClass(this.options[b+"Class"]),d.data("page",c),d.data("page-type",b),d.append(e.attr("href",this.makeHref(c)).addClass(this.options.anchorClass).html(f)),d},getPages:function(a){var b=[],c=Math.floor(this.options.visiblePages/2),d=a-c+1-this.options.visiblePages%2,e=a+c;d<=0&&(d=1,e=this.options.visiblePages),e>this.options.totalPages&&(d=this.options.totalPages-this.options.visiblePages+1,e=this.options.totalPages);for(var f=d;f<=e;)b.push(f),f++;return{currentPage:a,numeric:b}},render:function(b){var c=this;this.$listContainer.children().remove();var d=this.buildListItems(b);a.each(d,function(a,b){c.$listContainer.append(b)}),this.$listContainer.children().each(function(){var d=a(this),e=d.data("page-type");switch(e){case"page":d.data("page")===b.currentPage&&d.addClass(c.options.activeClass);break;case"first":d.toggleClass(c.options.disabledClass,1===b.currentPage);break;case"last":d.toggleClass(c.options.disabledClass,b.currentPage===c.options.totalPages);break;case"prev":d.toggleClass(c.options.disabledClass,!c.options.loop&&1===b.currentPage);break;case"next":d.toggleClass(c.options.disabledClass,!c.options.loop&&b.currentPage===c.options.totalPages)}})},setupEvents:function(){var b=this;this.$listContainer.off("click").on("click","li",function(c){var d=a(this);return!d.hasClass(b.options.disabledClass)&&!d.hasClass(b.options.activeClass)&&(!b.options.href&&c.preventDefault(),void b.show(parseInt(d.data("page"))))})},makeHref:function(a){return this.options.href?this.generateQueryString(a):"#"},makeText:function(a,b){return a.replace(this.options.pageVariable,b).replace(this.options.totalPagesVariable,this.options.totalPages)},getPageFromQueryString:function(a){var b=this.getSearchString(a),c=new RegExp(this.options.pageVariable+"(=([^&#]*)|&|#|$)"),d=c.exec(b);return d&&d[2]?(d=decodeURIComponent(d[2]),d=parseInt(d),isNaN(d)?null:d):null},generateQueryString:function(a,b){var c=this.getSearchString(b),d=new RegExp(this.options.pageVariable+"=*[^&#]*");return c?"?"+c.replace(d,this.options.pageVariable+"="+a):""},getSearchString:function(a){var c=a||b.location.search;return""===c?null:(0===c.indexOf("?")&&(c=c.substr(1)),c)},getCurrentPage:function(){return this.currentPage}},a.fn.twbsPagination=function(b){var c,e=Array.prototype.slice.call(arguments,1),g=a(this),h=g.data("twbs-pagination"),i="object"==typeof b?b:{};return h||g.data("twbs-pagination",h=new f(this,i)),"string"==typeof b&&(c=h[b].apply(h,e)),c===d?g:c},a.fn.twbsPagination.defaults={totalPages:1,startPage:1,visiblePages:5,initiateStartPageClick:!0,hideOnlyOnePage:!1,href:!1,pageVariable:"{{page}}",totalPagesVariable:"{{total_pages}}",page:null,first:"First",prev:"Previous",next:"Next",last:"Last",loop:!1,onPageClick:null,paginationClass:"pagination",nextClass:"page-item next",prevClass:"page-item prev",lastClass:"page-item last",firstClass:"page-item first",pageClass:"page-item",activeClass:"active",disabledClass:"disabled",anchorClass:"page-link"},a.fn.twbsPagination.Constructor=f,a.fn.twbsPagination.noConflict=function(){return a.fn.twbsPagination=e,this},a.fn.twbsPagination.version="1.4.1"}(window.jQuery,window,document); \ No newline at end of file diff --git a/storage/app/public/assets/vendors/typeahead.js/typeahead.bundle.min.js b/storage/app/public/assets/vendors/typeahead.js/typeahead.bundle.min.js new file mode 100644 index 0000000..ffd98f3 --- /dev/null +++ b/storage/app/public/assets/vendors/typeahead.js/typeahead.bundle.min.js @@ -0,0 +1,8 @@ +/*! + * typeahead.js 0.11.1 + * https://github.com/twitter/typeahead.js + * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT + */ + +!function(a,b){"function"==typeof define&&define.amd?define("bloodhound",["jquery"],function(c){return a.Bloodhound=b(c)}):"object"==typeof exports?module.exports=b(require("jquery")):a.Bloodhound=b(jQuery)}(this,function(a){var b=function(){"use strict";return{isMsie:function(){return/(msie|trident)/i.test(navigator.userAgent)?navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2]:!1},isBlankString:function(a){return!a||/^\s*$/.test(a)},escapeRegExChars:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(a){return"string"==typeof a},isNumber:function(a){return"number"==typeof a},isArray:a.isArray,isFunction:a.isFunction,isObject:a.isPlainObject,isUndefined:function(a){return"undefined"==typeof a},isElement:function(a){return!(!a||1!==a.nodeType)},isJQuery:function(b){return b instanceof a},toStr:function(a){return b.isUndefined(a)||null===a?"":a+""},bind:a.proxy,each:function(b,c){function d(a,b){return c(b,a)}a.each(b,d)},map:a.map,filter:a.grep,every:function(b,c){var d=!0;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?void 0:!1}),!!d):d},some:function(b,c){var d=!1;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?!1:void 0}),!!d):d},mixin:a.extend,identity:function(a){return a},clone:function(b){return a.extend(!0,{},b)},getIdGenerator:function(){var a=0;return function(){return a++}},templatify:function(b){function c(){return String(b)}return a.isFunction(b)?b:c},defer:function(a){setTimeout(a,0)},debounce:function(a,b,c){var d,e;return function(){var f,g,h=this,i=arguments;return f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},throttle:function(a,b){var c,d,e,f,g,h;return g=0,h=function(){g=new Date,e=null,f=a.apply(c,d)},function(){var i=new Date,j=b-(i-g);return c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},stringify:function(a){return b.isString(a)?a:JSON.stringify(a)},noop:function(){}}}(),c="0.11.1",d=function(){"use strict";function a(a){return a=b.toStr(a),a?a.split(/\s+/):[]}function c(a){return a=b.toStr(a),a?a.split(/\W+/):[]}function d(a){return function(c){return c=b.isArray(c)?c:[].slice.call(arguments,0),function(d){var e=[];return b.each(c,function(c){e=e.concat(a(b.toStr(d[c])))}),e}}}return{nonword:c,whitespace:a,obj:{nonword:d(c),whitespace:d(a)}}}(),e=function(){"use strict";function c(c){this.maxSize=b.isNumber(c)?c:100,this.reset(),this.maxSize<=0&&(this.set=this.get=a.noop)}function d(){this.head=this.tail=null}function e(a,b){this.key=a,this.val=b,this.prev=this.next=null}return b.mixin(c.prototype,{set:function(a,b){var c,d=this.list.tail;this.size>=this.maxSize&&(this.list.remove(d),delete this.hash[d.key],this.size--),(c=this.hash[a])?(c.val=b,this.list.moveToFront(c)):(c=new e(a,b),this.list.add(c),this.hash[a]=c,this.size++)},get:function(a){var b=this.hash[a];return b?(this.list.moveToFront(b),b.val):void 0},reset:function(){this.size=0,this.hash={},this.list=new d}}),b.mixin(d.prototype,{add:function(a){this.head&&(a.next=this.head,this.head.prev=a),this.head=a,this.tail=this.tail||a},remove:function(a){a.prev?a.prev.next=a.next:this.head=a.next,a.next?a.next.prev=a.prev:this.tail=a.prev},moveToFront:function(a){this.remove(a),this.add(a)}}),c}(),f=function(){"use strict";function c(a,c){this.prefix=["__",a,"__"].join(""),this.ttlKey="__ttl__",this.keyMatcher=new RegExp("^"+b.escapeRegExChars(this.prefix)),this.ls=c||h,!this.ls&&this._noop()}function d(){return(new Date).getTime()}function e(a){return JSON.stringify(b.isUndefined(a)?null:a)}function f(b){return a.parseJSON(b)}function g(a){var b,c,d=[],e=h.length;for(b=0;e>b;b++)(c=h.key(b)).match(a)&&d.push(c.replace(a,""));return d}var h;try{h=window.localStorage,h.setItem("~~~","!"),h.removeItem("~~~")}catch(i){h=null}return b.mixin(c.prototype,{_prefix:function(a){return this.prefix+a},_ttlKey:function(a){return this._prefix(a)+this.ttlKey},_noop:function(){this.get=this.set=this.remove=this.clear=this.isExpired=b.noop},_safeSet:function(a,b){try{this.ls.setItem(a,b)}catch(c){"QuotaExceededError"===c.name&&(this.clear(),this._noop())}},get:function(a){return this.isExpired(a)&&this.remove(a),f(this.ls.getItem(this._prefix(a)))},set:function(a,c,f){return b.isNumber(f)?this._safeSet(this._ttlKey(a),e(d()+f)):this.ls.removeItem(this._ttlKey(a)),this._safeSet(this._prefix(a),e(c))},remove:function(a){return this.ls.removeItem(this._ttlKey(a)),this.ls.removeItem(this._prefix(a)),this},clear:function(){var a,b=g(this.keyMatcher);for(a=b.length;a--;)this.remove(b[a]);return this},isExpired:function(a){var c=f(this.ls.getItem(this._ttlKey(a)));return b.isNumber(c)&&d()>c?!0:!1}}),c}(),g=function(){"use strict";function c(a){a=a||{},this.cancelled=!1,this.lastReq=null,this._send=a.transport,this._get=a.limiter?a.limiter(this._get):this._get,this._cache=a.cache===!1?new e(0):h}var d=0,f={},g=6,h=new e(10);return c.setMaxPendingRequests=function(a){g=a},c.resetCache=function(){h.reset()},b.mixin(c.prototype,{_fingerprint:function(b){return b=b||{},b.url+b.type+a.param(b.data||{})},_get:function(a,b){function c(a){b(null,a),k._cache.set(i,a)}function e(){b(!0)}function h(){d--,delete f[i],k.onDeckRequestArgs&&(k._get.apply(k,k.onDeckRequestArgs),k.onDeckRequestArgs=null)}var i,j,k=this;i=this._fingerprint(a),this.cancelled||i!==this.lastReq||((j=f[i])?j.done(c).fail(e):g>d?(d++,f[i]=this._send(a).done(c).fail(e).always(h)):this.onDeckRequestArgs=[].slice.call(arguments,0))},get:function(c,d){var e,f;d=d||a.noop,c=b.isString(c)?{url:c}:c||{},f=this._fingerprint(c),this.cancelled=!1,this.lastReq=f,(e=this._cache.get(f))?d(null,e):this._get(c,d)},cancel:function(){this.cancelled=!0}}),c}(),h=window.SearchIndex=function(){"use strict";function c(c){c=c||{},c.datumTokenizer&&c.queryTokenizer||a.error("datumTokenizer and queryTokenizer are both required"),this.identify=c.identify||b.stringify,this.datumTokenizer=c.datumTokenizer,this.queryTokenizer=c.queryTokenizer,this.reset()}function d(a){return a=b.filter(a,function(a){return!!a}),a=b.map(a,function(a){return a.toLowerCase()})}function e(){var a={};return a[i]=[],a[h]={},a}function f(a){for(var b={},c=[],d=0,e=a.length;e>d;d++)b[a[d]]||(b[a[d]]=!0,c.push(a[d]));return c}function g(a,b){var c=0,d=0,e=[];a=a.sort(),b=b.sort();for(var f=a.length,g=b.length;f>c&&g>d;)a[c]b[d]?d++:(e.push(a[c]),c++,d++);return e}var h="c",i="i";return b.mixin(c.prototype,{bootstrap:function(a){this.datums=a.datums,this.trie=a.trie},add:function(a){var c=this;a=b.isArray(a)?a:[a],b.each(a,function(a){var f,g;c.datums[f=c.identify(a)]=a,g=d(c.datumTokenizer(a)),b.each(g,function(a){var b,d,g;for(b=c.trie,d=a.split("");g=d.shift();)b=b[h][g]||(b[h][g]=e()),b[i].push(f)})})},get:function(a){var c=this;return b.map(a,function(a){return c.datums[a]})},search:function(a){var c,e,j=this;return c=d(this.queryTokenizer(a)),b.each(c,function(a){var b,c,d,f;if(e&&0===e.length)return!1;for(b=j.trie,c=a.split("");b&&(d=c.shift());)b=b[h][d];return b&&0===c.length?(f=b[i].slice(0),void(e=e?g(e,f):f)):(e=[],!1)}),e?b.map(f(e),function(a){return j.datums[a]}):[]},all:function(){var a=[];for(var b in this.datums)a.push(this.datums[b]);return a},reset:function(){this.datums={},this.trie=e()},serialize:function(){return{datums:this.datums,trie:this.trie}}}),c}(),i=function(){"use strict";function a(a){this.url=a.url,this.ttl=a.ttl,this.cache=a.cache,this.prepare=a.prepare,this.transform=a.transform,this.transport=a.transport,this.thumbprint=a.thumbprint,this.storage=new f(a.cacheKey)}var c;return c={data:"data",protocol:"protocol",thumbprint:"thumbprint"},b.mixin(a.prototype,{_settings:function(){return{url:this.url,type:"GET",dataType:"json"}},store:function(a){this.cache&&(this.storage.set(c.data,a,this.ttl),this.storage.set(c.protocol,location.protocol,this.ttl),this.storage.set(c.thumbprint,this.thumbprint,this.ttl))},fromCache:function(){var a,b={};return this.cache?(b.data=this.storage.get(c.data),b.protocol=this.storage.get(c.protocol),b.thumbprint=this.storage.get(c.thumbprint),a=b.thumbprint!==this.thumbprint||b.protocol!==location.protocol,b.data&&!a?b.data:null):null},fromNetwork:function(a){function b(){a(!0)}function c(b){a(null,e.transform(b))}var d,e=this;a&&(d=this.prepare(this._settings()),this.transport(d).fail(b).done(c))},clear:function(){return this.storage.clear(),this}}),a}(),j=function(){"use strict";function a(a){this.url=a.url,this.prepare=a.prepare,this.transform=a.transform,this.transport=new g({cache:a.cache,limiter:a.limiter,transport:a.transport})}return b.mixin(a.prototype,{_settings:function(){return{url:this.url,type:"GET",dataType:"json"}},get:function(a,b){function c(a,c){b(a?[]:e.transform(c))}var d,e=this;if(b)return a=a||"",d=this.prepare(a,this._settings()),this.transport.get(d,c)},cancelLastRequest:function(){this.transport.cancel()}}),a}(),k=function(){"use strict";function d(d){var e;return d?(e={url:null,ttl:864e5,cache:!0,cacheKey:null,thumbprint:"",prepare:b.identity,transform:b.identity,transport:null},d=b.isString(d)?{url:d}:d,d=b.mixin(e,d),!d.url&&a.error("prefetch requires url to be set"),d.transform=d.filter||d.transform,d.cacheKey=d.cacheKey||d.url,d.thumbprint=c+d.thumbprint,d.transport=d.transport?h(d.transport):a.ajax,d):null}function e(c){var d;if(c)return d={url:null,cache:!0,prepare:null,replace:null,wildcard:null,limiter:null,rateLimitBy:"debounce",rateLimitWait:300,transform:b.identity,transport:null},c=b.isString(c)?{url:c}:c,c=b.mixin(d,c),!c.url&&a.error("remote requires url to be set"),c.transform=c.filter||c.transform,c.prepare=f(c),c.limiter=g(c),c.transport=c.transport?h(c.transport):a.ajax,delete c.replace,delete c.wildcard,delete c.rateLimitBy,delete c.rateLimitWait,c}function f(a){function b(a,b){return b.url=f(b.url,a),b}function c(a,b){return b.url=b.url.replace(g,encodeURIComponent(a)),b}function d(a,b){return b}var e,f,g;return e=a.prepare,f=a.replace,g=a.wildcard,e?e:e=f?b:a.wildcard?c:d}function g(a){function c(a){return function(c){return b.debounce(c,a)}}function d(a){return function(c){return b.throttle(c,a)}}var e,f,g;return e=a.limiter,f=a.rateLimitBy,g=a.rateLimitWait,e||(e=/^throttle$/i.test(f)?d(g):c(g)),e}function h(c){return function(d){function e(a){b.defer(function(){g.resolve(a)})}function f(a){b.defer(function(){g.reject(a)})}var g=a.Deferred();return c(d,e,f),g}}return function(c){var f,g;return f={initialize:!0,identify:b.stringify,datumTokenizer:null,queryTokenizer:null,sufficient:5,sorter:null,local:[],prefetch:null,remote:null},c=b.mixin(f,c||{}),!c.datumTokenizer&&a.error("datumTokenizer is required"),!c.queryTokenizer&&a.error("queryTokenizer is required"),g=c.sorter,c.sorter=g?function(a){return a.sort(g)}:b.identity,c.local=b.isFunction(c.local)?c.local():c.local,c.prefetch=d(c.prefetch),c.remote=e(c.remote),c}}(),l=function(){"use strict";function c(a){a=k(a),this.sorter=a.sorter,this.identify=a.identify,this.sufficient=a.sufficient,this.local=a.local,this.remote=a.remote?new j(a.remote):null,this.prefetch=a.prefetch?new i(a.prefetch):null,this.index=new h({identify:this.identify,datumTokenizer:a.datumTokenizer,queryTokenizer:a.queryTokenizer}),a.initialize!==!1&&this.initialize()}var e;return e=window&&window.Bloodhound,c.noConflict=function(){return window&&(window.Bloodhound=e),c},c.tokenizers=d,b.mixin(c.prototype,{__ttAdapter:function(){function a(a,b,d){return c.search(a,b,d)}function b(a,b){return c.search(a,b)}var c=this;return this.remote?a:b},_loadPrefetch:function(){function b(a,b){return a?c.reject():(e.add(b),e.prefetch.store(e.index.serialize()),void c.resolve())}var c,d,e=this;return c=a.Deferred(),this.prefetch?(d=this.prefetch.fromCache())?(this.index.bootstrap(d),c.resolve()):this.prefetch.fromNetwork(b):c.resolve(),c.promise()},_initialize:function(){function a(){b.add(b.local)}var b=this;return this.clear(),(this.initPromise=this._loadPrefetch()).done(a),this.initPromise},initialize:function(a){return!this.initPromise||a?this._initialize():this.initPromise},add:function(a){return this.index.add(a),this},get:function(a){return a=b.isArray(a)?a:[].slice.call(arguments),this.index.get(a)},search:function(a,c,d){function e(a){var c=[];b.each(a,function(a){!b.some(f,function(b){return g.identify(a)===g.identify(b)})&&c.push(a)}),d&&d(c)}var f,g=this;return f=this.sorter(this.index.search(a)),c(this.remote?f.slice():f),this.remote&&f.length=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},stringify:function(a){return b.isString(a)?a:JSON.stringify(a)},noop:function(){}}}(),c=function(){"use strict";function a(a){var g,h;return h=b.mixin({},f,a),g={css:e(),classes:h,html:c(h),selectors:d(h)},{css:g.css,html:g.html,classes:g.classes,selectors:g.selectors,mixin:function(a){b.mixin(a,g)}}}function c(a){return{wrapper:'',menu:'
'}}function d(a){var c={};return b.each(a,function(a,b){c[b]="."+a}),c}function e(){var a={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},menu:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:" 0"}};return b.isMsie()&&b.mixin(a.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),a}var f={wrapper:"twitter-typeahead",input:"tt-input",hint:"tt-hint",menu:"tt-menu",dataset:"tt-dataset",suggestion:"tt-suggestion",selectable:"tt-selectable",empty:"tt-empty",open:"tt-open",cursor:"tt-cursor",highlight:"tt-highlight"};return a}(),d=function(){"use strict";function c(b){b&&b.el||a.error("EventBus initialized without el"),this.$el=a(b.el)}var d,e;return d="typeahead:",e={render:"rendered",cursorchange:"cursorchanged",select:"selected",autocomplete:"autocompleted"},b.mixin(c.prototype,{_trigger:function(b,c){var e;return e=a.Event(d+b),(c=c||[]).unshift(e),this.$el.trigger.apply(this.$el,c),e},before:function(a){var b,c;return b=[].slice.call(arguments,1),c=this._trigger("before"+a,b),c.isDefaultPrevented()},trigger:function(a){var b;this._trigger(a,[].slice.call(arguments,1)),(b=e[a])&&this._trigger(b,[].slice.call(arguments,1))}}),c}(),e=function(){"use strict";function a(a,b,c,d){var e;if(!c)return this;for(b=b.split(i),c=d?h(c,d):c,this._callbacks=this._callbacks||{};e=b.shift();)this._callbacks[e]=this._callbacks[e]||{sync:[],async:[]},this._callbacks[e][a].push(c);return this}function b(b,c,d){return a.call(this,"async",b,c,d)}function c(b,c,d){return a.call(this,"sync",b,c,d)}function d(a){var b;if(!this._callbacks)return this;for(a=a.split(i);b=a.shift();)delete this._callbacks[b];return this}function e(a){var b,c,d,e,g;if(!this._callbacks)return this;for(a=a.split(i),d=[].slice.call(arguments,1);(b=a.shift())&&(c=this._callbacks[b]);)e=f(c.sync,this,[b].concat(d)),g=f(c.async,this,[b].concat(d)),e()&&j(g);return this}function f(a,b,c){function d(){for(var d,e=0,f=a.length;!d&&f>e;e+=1)d=a[e].apply(b,c)===!1;return!d}return d}function g(){var a;return a=window.setImmediate?function(a){setImmediate(function(){a()})}:function(a){setTimeout(function(){a()},0)}}function h(a,b){return a.bind?a.bind(b):function(){a.apply(b,[].slice.call(arguments,0))}}var i=/\s+/,j=g();return{onSync:c,onAsync:b,off:d,trigger:e}}(),f=function(a){"use strict";function c(a,c,d){for(var e,f=[],g=0,h=a.length;h>g;g++)f.push(b.escapeRegExChars(a[g]));return e=d?"\\b("+f.join("|")+")\\b":"("+f.join("|")+")",c?new RegExp(e):new RegExp(e,"i")}var d={node:null,pattern:null,tagName:"strong",className:null,wordsOnly:!1,caseSensitive:!1};return function(e){function f(b){var c,d,f;return(c=h.exec(b.data))&&(f=a.createElement(e.tagName),e.className&&(f.className=e.className),d=b.splitText(c.index),d.splitText(c[0].length),f.appendChild(d.cloneNode(!0)),b.parentNode.replaceChild(f,d)),!!c}function g(a,b){for(var c,d=3,e=0;e