From eacfacb13b62d7f232a5aa551fced5565b02a5fe Mon Sep 17 00:00:00 2001 From: MEHMETKECECI Date: Wed, 11 Feb 2026 17:46:22 +0300 Subject: [PATCH] ilk --- .idea/.gitignore | 8 + .idea/.name | 1 + .idea/backend.iml | 4 + .idea/bssapp-backend.iml | 9 + .idea/go.imports.xml | 11 + .idea/inspectionProfiles/Project_Default.xml | 6 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + svc/.env | 8 + svc/auth/claims.go | 47 + svc/auth/claims_mapper.go | 36 + svc/auth/context.go | 15 + svc/auth/jwt.go | 53 + svc/auth/logout.go | 44 + svc/config/config.go | 1 + svc/ctxkeys/keys.go | 5 + svc/db/mssql.go | 31 + svc/db/postgres.go | 68 + svc/deneme | 0 svc/fonts/DejaVuSans-Bold.ttf | Bin 0 -> 705684 bytes svc/fonts/DejaVuSans.ttf | Bin 0 -> 757076 bytes svc/fonts/FreeSans.ttf | 0 svc/fonts/FreeSansBold.ttf | 0 svc/go.mod | 30 + svc/go.sum | 76 + svc/internal/auditlog/events.go | 35 + svc/internal/auditlog/helpers.go | 73 + svc/internal/auditlog/init.go | 30 + svc/internal/auditlog/model.go | 37 + svc/internal/auditlog/worker.go | 141 + svc/internal/auditlog/writer.go | 25 + svc/internal/authz/context.go | 36 + svc/internal/authz/mssql.go | 32 + svc/internal/authz/mssql_helpers.go | 24 + svc/internal/authz/piyasa_repo.go | 74 + svc/internal/mailer/config.go | 50 + svc/internal/mailer/graph_mailer.go | 270 + svc/internal/mailer/mailer.go | 148 + svc/internal/mailer/password_reset.go | 18 + svc/internal/security/errors.go | 11 + svc/internal/security/password_policy.go | 35 + svc/internal/security/password_reset.go | 13 + svc/internal/security/refresh_token.go | 23 + svc/internal/security/reset_token.go | 26 + svc/mail.env | 4 + svc/main.go | 587 + svc/middlewares/auditlog_middleware.go | 71 + svc/middlewares/auth_middleware.go | 39 + svc/middlewares/authz_v2.go | 961 ++ svc/middlewares/current_user.go | 24 + svc/middlewares/force_password_change.go | 66 + svc/middlewares/global_auth.go | 58 + svc/middlewares/helpers.go | 56 + svc/middlewares/rate_limit.go | 59 + svc/middlewares/request_logger.go | 108 + svc/models/NewOrderNumberResponse.go | 6 + svc/models/account.go | 8 + svc/models/custom_time.go | 45 + svc/models/customerlist.go | 13 + svc/models/invalid_variant.go | 13 + svc/models/mk_user.go | 57 + svc/models/modelcombo_error.go | 16 + svc/models/null_uuid.go | 120 + svc/models/order_pdf.go | 54 + svc/models/orderdetail.go | 98 + svc/models/orderheader.go | 109 + svc/models/orderinventory.go | 10 + svc/models/orderlist.go | 35 + svc/models/ordernull_types.go | 179 + svc/models/orderpricelistb2b.go | 13 + svc/models/product.go | 5 + svc/models/productcolor.go | 7 + svc/models/productcolorsize.go | 9 + svc/models/productdetail.go | 14 + svc/models/productsecondcolor.go | 7 + svc/models/statement_detail.go | 17 + svc/models/statement_header.go | 41 + svc/models/statements_params.go | 10 + svc/models/todaycurrencyv3.go | 10 + svc/models/user_detail.go | 88 + svc/models/user_list.go | 18 + svc/models/users.go | 20 + svc/permissions/models.go | 83 + svc/permissions/repository.go | 601 + svc/permissions/role_department_repo.go | 123 + svc/permissions/role_policy.go | 33 + svc/permissions/seed.go | 40 + svc/public/Baggi-Tekstil-A.s-Logolu.jpeg | Bin 0 -> 59942 bytes svc/queries/account.go | 74 + svc/queries/currency_cache.go | 64 + svc/queries/customerlist.go | 114 + svc/queries/get_order_list_excel.go | 52 + svc/queries/helpers.go | 174 + svc/queries/inventoryproduct.go | 93 + svc/queries/order_get.go | 280 + svc/queries/order_pdf.go | 161 + svc/queries/order_write.go | 1079 ++ svc/queries/orderinventory.go | 109 + svc/queries/orderlist.go | 213 + svc/queries/orderlist_base.go | 75 + svc/queries/orderpricelistb2b.go | 36 + svc/queries/permission_role_dept.go | 47 + svc/queries/product.go | 34 + svc/queries/productcolor.go | 20 + svc/queries/productcolorsize.go | 66 + svc/queries/productdetail.go | 36 + svc/queries/productsecondcolor.go | 18 + svc/queries/statement_header.go | 172 + svc/queries/statement_header_pdf.go | 187 + svc/queries/statements_detail.go | 121 + svc/queries/statements_pdf.go | 305 + svc/queries/todaycurrencyv3.go | 35 + svc/queries/user_detail.go | 296 + svc/queries/user_list.go | 106 + svc/queries/user_password.go | 41 + svc/repository/activitylog_repository.go | 286 + svc/repository/mk_user_repository.go | 352 + svc/repository/permission_repository.go | 33 + svc/repository/refresh_token_repository.go | 80 + svc/repository/user_repo.go | 276 + svc/repository/user_role_repo.go | 32 + svc/routes/account.go | 39 + svc/routes/activitylogs.go | 126 + svc/routes/admin_piyasa.go | 61 + svc/routes/admin_reset_password.go | 104 + svc/routes/audit_helper.go | 60 + svc/routes/auth_refresh.go | 92 + svc/routes/customerlist.go | 57 + svc/routes/first_password_change.go | 169 + svc/routes/login.go | 733 + svc/routes/order_list_excel.go | 91 + svc/routes/order_pdf.go | 1387 ++ svc/routes/order_validate.go | 45 + svc/routes/orderinventory.go | 89 + svc/routes/orderlist.go | 126 + svc/routes/orderpricelistb2b.go | 131 + svc/routes/orders.go | 239 + svc/routes/password_forgot.go | 116 + svc/routes/password_reset.go | 126 + svc/routes/password_reset_complete.go | 152 + svc/routes/password_reset_validate.go | 63 + svc/routes/permission_debug.go | 63 + svc/routes/permission_matrix_v2.go | 203 + svc/routes/permissions.go | 114 + svc/routes/product.go | 27 + svc/routes/productcolor.go | 48 + svc/routes/productcolorsize.go | 73 + svc/routes/productdetail.go | 65 + svc/routes/productsecondcolor.go | 67 + svc/routes/role_department_permissions.go | 440 + svc/routes/statement_detail.go | 38 + svc/routes/statement_header.go | 38 + svc/routes/statement_header_pdf.go | 395 + svc/routes/statements_pdf.go | 642 + svc/routes/test_mail.go | 49 + svc/routes/todaycurrencyv3.go | 30 + svc/routes/user_detail.go | 320 + svc/routes/user_list.go | 81 + svc/routes/userpermissions.go | 232 + svc/services/auth.go | 42 + svc/utils/error.go | 8 + svc/utils/mail.env | 6 + svc/utils/utils.go | 17 + svc/utils/uuid.go | 11 + ui/-.editorconfig | 7 + ui/.editorconfig | 7 + ui/.gitignore | 1 + ui/.idea/.gitignore | 8 + ui/.idea/baggisoftwaresystem.iml | 9 + ui/.idea/modules.xml | 8 + ui/.idea/vcs.xml | 6 + ui/.npmrc | 5 + ui/.quasar/dev-spa/app.js | 77 + ui/.quasar/dev-spa/client-entry.js | 158 + ui/.quasar/dev-spa/client-prefetch.js | 116 + ui/.quasar/dev-spa/quasar-user-options.js | 23 + ui/.quasar/feature-flags.d.ts | 8 + ui/.quasar/pinia.d.ts | 8 + ui/.quasar/quasar.d.ts | 4 + ui/.quasar/tsconfig.json | 94 + ui/.vscode/extensions.json | 13 + ui/.vscode/settings.json | 4 + ui/README.md | 24 + ui/babel.config.js | 12 + ui/index.html | 21 + ui/jsconfig.json | 3 + ui/package-lock.json | 12102 ++++++++++++++++ ui/package.json | 45 + ui/postcss.config.js | 9 + ui/public/favicon.ico | Bin 0 -> 33368 bytes ui/public/icons/baggi-icon.png | Bin 0 -> 148396 bytes ui/public/icons/favicon-128x128.png | Bin 0 -> 3053 bytes ui/public/icons/favicon-16x16.png | Bin 0 -> 1209 bytes ui/public/icons/favicon-32x32.png | Bin 0 -> 1372 bytes ui/public/icons/favicon-96x96.png | Bin 0 -> 2396 bytes ui/public/images/Baggi-Exclusive-Logo.jpg | Bin 0 -> 372776 bytes ui/public/images/Baggi-Fabrika-resmi.jpg | Bin 0 -> 120108 bytes ui/public/images/Baggi-tekstilas-logolu.jpg | Bin 0 -> 145528 bytes ui/quasar.config.js | 78 + ...ig.js.temporary.compiled.1770820662971.mjs | 83 + ui/src/App.vue | 7 + ui/src/assets/quasar-logo-vertical.svg | 15 + ui/src/boot/.gitkeep | 0 ui/src/boot/axios.js | 21 + ui/src/boot/dayjs.js | 14 + ui/src/components/EssentialLink.vue | 44 + ui/src/composables/usePermission.js | 20 + ui/src/css/app.css | 1532 ++ ui/src/css/quasar.variables.sass | 8 + ui/src/layouts/EmptyLayout.vue | 7 + ui/src/layouts/MainLayout.vue | 302 + ui/src/pages/ActivityLogs.vue | 341 + ui/src/pages/ChangePassword.vue | 120 + ui/src/pages/Dashboard.vue | 9 + ui/src/pages/ErrorNotFound.vue | 27 + ui/src/pages/FirstPasswordChange.vue | 120 + ui/src/pages/MainPage.vue | 306 + ui/src/pages/MainPanel.vue | 9 + ui/src/pages/MePassword.vue | 107 + ui/src/pages/OrderEntry.vue | 2987 ++++ ui/src/pages/OrderGateway.vue | 272 + ui/src/pages/OrderList.vue | 408 + ui/src/pages/OrderPdf.vue | 1 + ui/src/pages/PermissionMatrix.vue | 301 + ui/src/pages/ProductionWorker.vue | 224 + ui/src/pages/ProductionWorkerGateway.vue | 211 + ui/src/pages/ResetPassword.vue | 264 + ui/src/pages/RoleDepartmentPermissionPage.vue | 435 + ui/src/pages/StatementHeaderReport.vue | 103 + ui/src/pages/StatementReport.vue | 499 + ui/src/pages/TestMail.vue | 63 + ui/src/pages/UserDetail.vue | 383 + ui/src/pages/UserGateway.vue | 108 + ui/src/pages/UserList.vue | 272 + ui/src/pages/UserPermissionPage.vue | 357 + ui/src/pages/UserSync.vue | 172 + ui/src/pages/statementofaccount.vue | 521 + ui/src/router/index.js | 96 + ui/src/router/meta.d.js | 10 + ui/src/router/routes.js | 260 + ui/src/services/api.js | 67 + ui/src/services/orderService.js | 62 + ui/src/stores/OrdernewListStore.js | 167 + ui/src/stores/UserDetailStore.js | 238 + ui/src/stores/UserListStore.js | 72 + ui/src/stores/accountStore.js | 43 + ui/src/stores/activityLogStore.js | 102 + ui/src/stores/authStore.js | 117 + ui/src/stores/deneme | 3023 ++++ ui/src/stores/deneme2 | 1128 ++ ui/src/stores/deneme3 | 653 + ui/src/stores/downloadstHeadStore.js | 50 + ui/src/stores/downloadstpdfStore.js | 51 + ui/src/stores/example-store.js | 15 + ui/src/stores/index.js | 20 + ui/src/stores/mailTestStore.js | 29 + ui/src/stores/mePasswordStore.js | 38 + ui/src/stores/orderentryStore.js | 3340 +++++ ui/src/stores/permissionStore.js | 182 + ui/src/stores/statementdetailStore.js | 66 + ui/src/stores/statementheaderStore.js | 163 + ui/src/stores/store-flag.d.ts | 13 + ui/src/stores/userPermissionStore.js | 31 + ui/src/stores/userSyncStore.js | 53 + ui/src/utils/flatten.js | 54 + ui/src/utils/formatters.js | 86 + 266 files changed, 51337 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/backend.iml create mode 100644 .idea/bssapp-backend.iml create mode 100644 .idea/go.imports.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 svc/.env create mode 100644 svc/auth/claims.go create mode 100644 svc/auth/claims_mapper.go create mode 100644 svc/auth/context.go create mode 100644 svc/auth/jwt.go create mode 100644 svc/auth/logout.go create mode 100644 svc/config/config.go create mode 100644 svc/ctxkeys/keys.go create mode 100644 svc/db/mssql.go create mode 100644 svc/db/postgres.go create mode 100644 svc/deneme create mode 100644 svc/fonts/DejaVuSans-Bold.ttf create mode 100644 svc/fonts/DejaVuSans.ttf create mode 100644 svc/fonts/FreeSans.ttf create mode 100644 svc/fonts/FreeSansBold.ttf create mode 100644 svc/go.mod create mode 100644 svc/go.sum create mode 100644 svc/internal/auditlog/events.go create mode 100644 svc/internal/auditlog/helpers.go create mode 100644 svc/internal/auditlog/init.go create mode 100644 svc/internal/auditlog/model.go create mode 100644 svc/internal/auditlog/worker.go create mode 100644 svc/internal/auditlog/writer.go create mode 100644 svc/internal/authz/context.go create mode 100644 svc/internal/authz/mssql.go create mode 100644 svc/internal/authz/mssql_helpers.go create mode 100644 svc/internal/authz/piyasa_repo.go create mode 100644 svc/internal/mailer/config.go create mode 100644 svc/internal/mailer/graph_mailer.go create mode 100644 svc/internal/mailer/mailer.go create mode 100644 svc/internal/mailer/password_reset.go create mode 100644 svc/internal/security/errors.go create mode 100644 svc/internal/security/password_policy.go create mode 100644 svc/internal/security/password_reset.go create mode 100644 svc/internal/security/refresh_token.go create mode 100644 svc/internal/security/reset_token.go create mode 100644 svc/mail.env create mode 100644 svc/main.go create mode 100644 svc/middlewares/auditlog_middleware.go create mode 100644 svc/middlewares/auth_middleware.go create mode 100644 svc/middlewares/authz_v2.go create mode 100644 svc/middlewares/current_user.go create mode 100644 svc/middlewares/force_password_change.go create mode 100644 svc/middlewares/global_auth.go create mode 100644 svc/middlewares/helpers.go create mode 100644 svc/middlewares/rate_limit.go create mode 100644 svc/middlewares/request_logger.go create mode 100644 svc/models/NewOrderNumberResponse.go create mode 100644 svc/models/account.go create mode 100644 svc/models/custom_time.go create mode 100644 svc/models/customerlist.go create mode 100644 svc/models/invalid_variant.go create mode 100644 svc/models/mk_user.go create mode 100644 svc/models/modelcombo_error.go create mode 100644 svc/models/null_uuid.go create mode 100644 svc/models/order_pdf.go create mode 100644 svc/models/orderdetail.go create mode 100644 svc/models/orderheader.go create mode 100644 svc/models/orderinventory.go create mode 100644 svc/models/orderlist.go create mode 100644 svc/models/ordernull_types.go create mode 100644 svc/models/orderpricelistb2b.go create mode 100644 svc/models/product.go create mode 100644 svc/models/productcolor.go create mode 100644 svc/models/productcolorsize.go create mode 100644 svc/models/productdetail.go create mode 100644 svc/models/productsecondcolor.go create mode 100644 svc/models/statement_detail.go create mode 100644 svc/models/statement_header.go create mode 100644 svc/models/statements_params.go create mode 100644 svc/models/todaycurrencyv3.go create mode 100644 svc/models/user_detail.go create mode 100644 svc/models/user_list.go create mode 100644 svc/models/users.go create mode 100644 svc/permissions/models.go create mode 100644 svc/permissions/repository.go create mode 100644 svc/permissions/role_department_repo.go create mode 100644 svc/permissions/role_policy.go create mode 100644 svc/permissions/seed.go create mode 100644 svc/public/Baggi-Tekstil-A.s-Logolu.jpeg create mode 100644 svc/queries/account.go create mode 100644 svc/queries/currency_cache.go create mode 100644 svc/queries/customerlist.go create mode 100644 svc/queries/get_order_list_excel.go create mode 100644 svc/queries/helpers.go create mode 100644 svc/queries/inventoryproduct.go create mode 100644 svc/queries/order_get.go create mode 100644 svc/queries/order_pdf.go create mode 100644 svc/queries/order_write.go create mode 100644 svc/queries/orderinventory.go create mode 100644 svc/queries/orderlist.go create mode 100644 svc/queries/orderlist_base.go create mode 100644 svc/queries/orderpricelistb2b.go create mode 100644 svc/queries/permission_role_dept.go create mode 100644 svc/queries/product.go create mode 100644 svc/queries/productcolor.go create mode 100644 svc/queries/productcolorsize.go create mode 100644 svc/queries/productdetail.go create mode 100644 svc/queries/productsecondcolor.go create mode 100644 svc/queries/statement_header.go create mode 100644 svc/queries/statement_header_pdf.go create mode 100644 svc/queries/statements_detail.go create mode 100644 svc/queries/statements_pdf.go create mode 100644 svc/queries/todaycurrencyv3.go create mode 100644 svc/queries/user_detail.go create mode 100644 svc/queries/user_list.go create mode 100644 svc/queries/user_password.go create mode 100644 svc/repository/activitylog_repository.go create mode 100644 svc/repository/mk_user_repository.go create mode 100644 svc/repository/permission_repository.go create mode 100644 svc/repository/refresh_token_repository.go create mode 100644 svc/repository/user_repo.go create mode 100644 svc/repository/user_role_repo.go create mode 100644 svc/routes/account.go create mode 100644 svc/routes/activitylogs.go create mode 100644 svc/routes/admin_piyasa.go create mode 100644 svc/routes/admin_reset_password.go create mode 100644 svc/routes/audit_helper.go create mode 100644 svc/routes/auth_refresh.go create mode 100644 svc/routes/customerlist.go create mode 100644 svc/routes/first_password_change.go create mode 100644 svc/routes/login.go create mode 100644 svc/routes/order_list_excel.go create mode 100644 svc/routes/order_pdf.go create mode 100644 svc/routes/order_validate.go create mode 100644 svc/routes/orderinventory.go create mode 100644 svc/routes/orderlist.go create mode 100644 svc/routes/orderpricelistb2b.go create mode 100644 svc/routes/orders.go create mode 100644 svc/routes/password_forgot.go create mode 100644 svc/routes/password_reset.go create mode 100644 svc/routes/password_reset_complete.go create mode 100644 svc/routes/password_reset_validate.go create mode 100644 svc/routes/permission_debug.go create mode 100644 svc/routes/permission_matrix_v2.go create mode 100644 svc/routes/permissions.go create mode 100644 svc/routes/product.go create mode 100644 svc/routes/productcolor.go create mode 100644 svc/routes/productcolorsize.go create mode 100644 svc/routes/productdetail.go create mode 100644 svc/routes/productsecondcolor.go create mode 100644 svc/routes/role_department_permissions.go create mode 100644 svc/routes/statement_detail.go create mode 100644 svc/routes/statement_header.go create mode 100644 svc/routes/statement_header_pdf.go create mode 100644 svc/routes/statements_pdf.go create mode 100644 svc/routes/test_mail.go create mode 100644 svc/routes/todaycurrencyv3.go create mode 100644 svc/routes/user_detail.go create mode 100644 svc/routes/user_list.go create mode 100644 svc/routes/userpermissions.go create mode 100644 svc/services/auth.go create mode 100644 svc/utils/error.go create mode 100644 svc/utils/mail.env create mode 100644 svc/utils/utils.go create mode 100644 svc/utils/uuid.go create mode 100644 ui/-.editorconfig create mode 100644 ui/.editorconfig create mode 100644 ui/.gitignore create mode 100644 ui/.idea/.gitignore create mode 100644 ui/.idea/baggisoftwaresystem.iml create mode 100644 ui/.idea/modules.xml create mode 100644 ui/.idea/vcs.xml create mode 100644 ui/.npmrc create mode 100644 ui/.quasar/dev-spa/app.js create mode 100644 ui/.quasar/dev-spa/client-entry.js create mode 100644 ui/.quasar/dev-spa/client-prefetch.js create mode 100644 ui/.quasar/dev-spa/quasar-user-options.js create mode 100644 ui/.quasar/feature-flags.d.ts create mode 100644 ui/.quasar/pinia.d.ts create mode 100644 ui/.quasar/quasar.d.ts create mode 100644 ui/.quasar/tsconfig.json create mode 100644 ui/.vscode/extensions.json create mode 100644 ui/.vscode/settings.json create mode 100644 ui/README.md create mode 100644 ui/babel.config.js create mode 100644 ui/index.html create mode 100644 ui/jsconfig.json create mode 100644 ui/package-lock.json create mode 100644 ui/package.json create mode 100644 ui/postcss.config.js create mode 100644 ui/public/favicon.ico create mode 100644 ui/public/icons/baggi-icon.png create mode 100644 ui/public/icons/favicon-128x128.png create mode 100644 ui/public/icons/favicon-16x16.png create mode 100644 ui/public/icons/favicon-32x32.png create mode 100644 ui/public/icons/favicon-96x96.png create mode 100644 ui/public/images/Baggi-Exclusive-Logo.jpg create mode 100644 ui/public/images/Baggi-Fabrika-resmi.jpg create mode 100644 ui/public/images/Baggi-tekstilas-logolu.jpg create mode 100644 ui/quasar.config.js create mode 100644 ui/quasar.config.js.temporary.compiled.1770820662971.mjs create mode 100644 ui/src/App.vue create mode 100644 ui/src/assets/quasar-logo-vertical.svg create mode 100644 ui/src/boot/.gitkeep create mode 100644 ui/src/boot/axios.js create mode 100644 ui/src/boot/dayjs.js create mode 100644 ui/src/components/EssentialLink.vue create mode 100644 ui/src/composables/usePermission.js create mode 100644 ui/src/css/app.css create mode 100644 ui/src/css/quasar.variables.sass create mode 100644 ui/src/layouts/EmptyLayout.vue create mode 100644 ui/src/layouts/MainLayout.vue create mode 100644 ui/src/pages/ActivityLogs.vue create mode 100644 ui/src/pages/ChangePassword.vue create mode 100644 ui/src/pages/Dashboard.vue create mode 100644 ui/src/pages/ErrorNotFound.vue create mode 100644 ui/src/pages/FirstPasswordChange.vue create mode 100644 ui/src/pages/MainPage.vue create mode 100644 ui/src/pages/MainPanel.vue create mode 100644 ui/src/pages/MePassword.vue create mode 100644 ui/src/pages/OrderEntry.vue create mode 100644 ui/src/pages/OrderGateway.vue create mode 100644 ui/src/pages/OrderList.vue create mode 100644 ui/src/pages/OrderPdf.vue create mode 100644 ui/src/pages/PermissionMatrix.vue create mode 100644 ui/src/pages/ProductionWorker.vue create mode 100644 ui/src/pages/ProductionWorkerGateway.vue create mode 100644 ui/src/pages/ResetPassword.vue create mode 100644 ui/src/pages/RoleDepartmentPermissionPage.vue create mode 100644 ui/src/pages/StatementHeaderReport.vue create mode 100644 ui/src/pages/StatementReport.vue create mode 100644 ui/src/pages/TestMail.vue create mode 100644 ui/src/pages/UserDetail.vue create mode 100644 ui/src/pages/UserGateway.vue create mode 100644 ui/src/pages/UserList.vue create mode 100644 ui/src/pages/UserPermissionPage.vue create mode 100644 ui/src/pages/UserSync.vue create mode 100644 ui/src/pages/statementofaccount.vue create mode 100644 ui/src/router/index.js create mode 100644 ui/src/router/meta.d.js create mode 100644 ui/src/router/routes.js create mode 100644 ui/src/services/api.js create mode 100644 ui/src/services/orderService.js create mode 100644 ui/src/stores/OrdernewListStore.js create mode 100644 ui/src/stores/UserDetailStore.js create mode 100644 ui/src/stores/UserListStore.js create mode 100644 ui/src/stores/accountStore.js create mode 100644 ui/src/stores/activityLogStore.js create mode 100644 ui/src/stores/authStore.js create mode 100644 ui/src/stores/deneme create mode 100644 ui/src/stores/deneme2 create mode 100644 ui/src/stores/deneme3 create mode 100644 ui/src/stores/downloadstHeadStore.js create mode 100644 ui/src/stores/downloadstpdfStore.js create mode 100644 ui/src/stores/example-store.js create mode 100644 ui/src/stores/index.js create mode 100644 ui/src/stores/mailTestStore.js create mode 100644 ui/src/stores/mePasswordStore.js create mode 100644 ui/src/stores/orderentryStore.js create mode 100644 ui/src/stores/permissionStore.js create mode 100644 ui/src/stores/statementdetailStore.js create mode 100644 ui/src/stores/statementheaderStore.js create mode 100644 ui/src/stores/store-flag.d.ts create mode 100644 ui/src/stores/userPermissionStore.js create mode 100644 ui/src/stores/userSyncStore.js create mode 100644 ui/src/utils/flatten.js create mode 100644 ui/src/utils/formatters.js diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..98cd9e7 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +backend \ No newline at end of file diff --git a/.idea/backend.iml b/.idea/backend.iml new file mode 100644 index 0000000..7ee078d --- /dev/null +++ b/.idea/backend.iml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/bssapp-backend.iml b/.idea/bssapp-backend.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/bssapp-backend.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/go.imports.xml b/.idea/go.imports.xml new file mode 100644 index 0000000..d7202f0 --- /dev/null +++ b/.idea/go.imports.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..7675e2a --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e92123c --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/svc/.env b/svc/.env new file mode 100644 index 0000000..d29fb64 --- /dev/null +++ b/svc/.env @@ -0,0 +1,8 @@ +JWT_SECRET=bssapp_super_secret_key_1234567890 +PASSWORD_RESET_SECRET=1dc7d6d52fd0459a8b1f288a6590428e760f54339f8e47beb20db36b6df6070b +APP_FRONTEND_URL=http://localhost:9000 +API_URL=http://localhost:8080 + + + + diff --git a/svc/auth/claims.go b/svc/auth/claims.go new file mode 100644 index 0000000..12859e5 --- /dev/null +++ b/svc/auth/claims.go @@ -0,0 +1,47 @@ +package auth + +import ( + "strings" + + "github.com/golang-jwt/jwt/v5" +) + +type Claims struct { + // ================================================== + // 🔑 IDENTITY + // ================================================== + ID int64 `json:"id"` + Username string `json:"username"` + RoleID int64 `json:"role_id"` + + RoleCode string `json:"role_code"` + DepartmentCodes []string `json:"department_codes"` + + // ================================================== + // 🧾 NEBIM (frontend filtre & backend guard için) + // ================================================== + V3Username string `json:"v3_username"` + V3UserGroup string `json:"v3_usergroup"` + + // ================================================== + // 🔐 SESSION + // ================================================== + SessionID string `json:"session_id"` + + // ================================================== + // ⚠️ SECURITY + // ================================================== + ForcePasswordChange bool `json:"force_password_change"` + + jwt.RegisteredClaims +} + +func (c *Claims) IsAdmin() bool { + if c == nil { + return false + } + + role := strings.ToLower(strings.TrimSpace(c.RoleCode)) + + return role == "admin" +} diff --git a/svc/auth/claims_mapper.go b/svc/auth/claims_mapper.go new file mode 100644 index 0000000..fdb1d83 --- /dev/null +++ b/svc/auth/claims_mapper.go @@ -0,0 +1,36 @@ +package auth + +import ( + "time" + + "bssapp-backend/models" + + "github.com/golang-jwt/jwt/v5" +) + +func BuildClaimsFromUser(u *models.MkUser, ttl time.Duration) Claims { + now := time.Now() + + return Claims{ + // 🔴 mk_dfusr.id + ID: u.ID, + + Username: u.Username, + RoleCode: u.RoleCode, + RoleID: u.RoleID, + // ✅ BURASI + DepartmentCodes: u.DepartmentCodes, + + SessionID: u.SessionID, + + ForcePasswordChange: u.ForcePasswordChange, + + RegisteredClaims: jwt.RegisteredClaims{ + Issuer: "bssapp", + Subject: u.Username, + IssuedAt: jwt.NewNumericDate(now), + NotBefore: jwt.NewNumericDate(now), + ExpiresAt: jwt.NewNumericDate(now.Add(ttl)), + }, + } +} diff --git a/svc/auth/context.go b/svc/auth/context.go new file mode 100644 index 0000000..d407d33 --- /dev/null +++ b/svc/auth/context.go @@ -0,0 +1,15 @@ +package auth + +import ( + "bssapp-backend/ctxkeys" + "context" +) + +func WithClaims(ctx context.Context, claims *Claims) context.Context { + return context.WithValue(ctx, ctxkeys.UserContextKey, claims) +} + +func GetClaimsFromContext(ctx context.Context) (*Claims, bool) { + claims, ok := ctx.Value(ctxkeys.UserContextKey).(*Claims) + return claims, ok +} diff --git a/svc/auth/jwt.go b/svc/auth/jwt.go new file mode 100644 index 0000000..afaa5aa --- /dev/null +++ b/svc/auth/jwt.go @@ -0,0 +1,53 @@ +package auth + +import ( + "errors" + "os" + + "github.com/golang-jwt/jwt/v5" +) + +// package auth + +func jwtSecret() ([]byte, error) { + sec := os.Getenv("JWT_SECRET") + if len(sec) < 10 { + return nil, errors.New("JWT_SECRET environment boş veya çok kısa") + } + return []byte(sec), nil +} + +// ✅ TEK VE DOĞRU TOKEN ÜRETİCİ +func GenerateToken(claims Claims, username string, change bool) (string, error) { + secret, err := jwtSecret() + if err != nil { + return "", err + } + + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + return token.SignedString(secret) +} + +func ValidateToken(tokenStr string) (*Claims, error) { + secret, err := jwtSecret() + if err != nil { + return nil, err + } + + token, err := jwt.ParseWithClaims( + tokenStr, + &Claims{}, + func(token *jwt.Token) (interface{}, error) { + return secret, nil + }, + ) + if err != nil { + return nil, err + } + + claims, ok := token.Claims.(*Claims) + if !ok || !token.Valid { + return nil, errors.New("token geçersiz") + } + return claims, nil +} diff --git a/svc/auth/logout.go b/svc/auth/logout.go new file mode 100644 index 0000000..c37d427 --- /dev/null +++ b/svc/auth/logout.go @@ -0,0 +1,44 @@ +package auth + +import ( + "bssapp-backend/internal/auditlog" + "bssapp-backend/repository" + "database/sql" + "encoding/json" + "net/http" + "time" +) + +func LogoutAllHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + claims, ok := GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + + userID := claims.ID + + _ = repository.NewRefreshTokenRepository(db). + RevokeAllForUser(userID) + + http.SetCookie(w, &http.Cookie{ + Name: "mk_refresh", + Value: "", + Path: "/", + Expires: time.Unix(0, 0), + HttpOnly: true, + }) + + auditlog.Write(auditlog.ActivityLog{ + UserID: auditlog.IntUserIDToUUID(int(userID)), + ActionType: "logout_all", + ActionCategory: "auth", + Description: "user logged out from all devices", + IsSuccess: true, + }) + + _ = json.NewEncoder(w).Encode(map[string]bool{"success": true}) + } +} diff --git a/svc/config/config.go b/svc/config/config.go new file mode 100644 index 0000000..d912156 --- /dev/null +++ b/svc/config/config.go @@ -0,0 +1 @@ +package config diff --git a/svc/ctxkeys/keys.go b/svc/ctxkeys/keys.go new file mode 100644 index 0000000..2ebfdd1 --- /dev/null +++ b/svc/ctxkeys/keys.go @@ -0,0 +1,5 @@ +package ctxkeys + +type ContextKey string + +const UserContextKey ContextKey = "jwt_claims" diff --git a/svc/db/mssql.go b/svc/db/mssql.go new file mode 100644 index 0000000..1917147 --- /dev/null +++ b/svc/db/mssql.go @@ -0,0 +1,31 @@ +package db + +import ( + "database/sql" + "fmt" + "log" + + _ "github.com/microsoft/go-mssqldb" +) + +var MssqlDB *sql.DB + +func ConnectMSSQL() { + connString := "sqlserver://sa:Gil_0150@10.0.0.9:1433?databaseName=BAGGI_V3" + + var err error + MssqlDB, err = sql.Open("sqlserver", connString) + if err != nil { + log.Fatal("MSSQL bağlantı hatası:", err) + } + + err = MssqlDB.Ping() + if err != nil { + log.Fatal("MSSQL erişilemiyor:", err) + } + + fmt.Println("✅ MSSQL bağlantısı başarılı!") +} +func GetDB() *sql.DB { + return MssqlDB +} diff --git a/svc/db/postgres.go b/svc/db/postgres.go new file mode 100644 index 0000000..b24cfa8 --- /dev/null +++ b/svc/db/postgres.go @@ -0,0 +1,68 @@ +package db + +import ( + "database/sql" + "fmt" + "log" + "os" + "time" + + _ "github.com/lib/pq" +) + +var PgDB *sql.DB + +// ConnectPostgres → PostgreSQL veritabanına bağlanır +func ConnectPostgres() (*sql.DB, error) { + // Bağlantı stringi (istersen .env’den oku) + connStr := os.Getenv("POSTGRES_CONN") + if connStr == "" { + // fallback → sabit tanımlı bağlantı + connStr = "host=172.16.0.3 port=5432 user=postgres password=tayitkan dbname=baggib2b sslmode=disable" + } + + db, err := sql.Open("postgres", connStr) + if err != nil { + return nil, fmt.Errorf("PostgreSQL bağlantı hatası: %w", err) + } + + // ======================================================= + // 🔹 BAĞLANTI HAVUZU (AUDIT LOG UYUMLU) + // ======================================================= + db.SetMaxOpenConns(30) // audit + api paralel çalışsın + db.SetMaxIdleConns(10) + db.SetConnMaxLifetime(30 * time.Minute) + db.SetConnMaxIdleTime(5 * time.Minute) // 🔥 uzun idle audit bağlantılarını kapat + + // 🔹 Test et + if err = db.Ping(); err != nil { + return nil, fmt.Errorf("PostgreSQL erişilemiyor: %w", err) + } + + log.Println("✅ PostgreSQL bağlantısı başarılı!") + PgDB = db + return db, nil + +} + +// GetPostgresUsers → test amaçlı ilk 5 kullanıcıyı listeler +func GetPostgresUsers(db *sql.DB) error { + query := `SELECT id, code, email FROM mk_dfusr ORDER BY id LIMIT 5` + rows, err := db.Query(query) + if err != nil { + return fmt.Errorf("PostgreSQL sorgu hatası: %w", err) + } + defer rows.Close() + + fmt.Println("📋 İlk 5 PostgreSQL kullanıcısı:") + for rows.Next() { + var id int + var code, email string + if err := rows.Scan(&id, &code, &email); err != nil { + return err + } + fmt.Printf(" ➜ ID: %-4d | USER: %-20s | EMAIL: %s\n", id, code, email) + } + + return rows.Err() +} diff --git a/svc/deneme b/svc/deneme new file mode 100644 index 0000000..e69de29 diff --git a/svc/fonts/DejaVuSans-Bold.ttf b/svc/fonts/DejaVuSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6d65fa7dc41ae8ffae77a4a843a73ba31ffd78c7 GIT binary patch literal 705684 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

sms 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%0A7@OA|SSm%P*^HlXor5<@yw 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

fI);V1&`p^P@z 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%0Dm&v@4taQGLT-zh3S`AeK1 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,GZiO*k^1+ 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


*Toc{%?n7Na{@W#kyM+}-t@ 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�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 0 { + dfusrID = entry.DfUsrID + } else { + dfusrID = nil + } + + // ---------- USERNAME ---------- + var username any + if entry.Username != "" { + username = entry.Username + } else { + username = nil + } + + // ---------- ROLE CODE (SNAPSHOT) ---------- + roleCode := entry.RoleCode + if roleCode == "" { + roleCode = "public" + } + + // ---------- TARGET ---------- + var targetDfUsrID any + if entry.TargetDfUsrID > 0 { + targetDfUsrID = entry.TargetDfUsrID + } else { + targetDfUsrID = nil + } + targetUsername := nullIfEmpty(entry.TargetUsername) + + log.Printf( + "🧾 auditlog INSERT | actor_dfusr=%v actor_user=%v role=%s %s %s target=%v", + dfusrID, + username, + roleCode, + entry.ActionCategory, + entry.ActionTarget, + targetDfUsrID, + ) + + _, err := dbConn.Exec(` + INSERT INTO mk_user_activity_log ( + log_id, + dfusr_id, + username, + role_code, + + action_type, + action_category, + action_target, + description, + + ip_address, + user_agent, + session_id, + + request_started_at, + request_finished_at, + duration_ms, + http_status, + + is_success, + error_message, + + -- ✅ NEW + target_dfusr_id, + target_username, + change_before, + change_after, + + created_at + ) VALUES ( + gen_random_uuid(), + $1,$2,$3, + $4,$5,$6,$7, + $8,$9,$10, + $11,$12,$13,$14, + $15,$16, + $17,$18,$19,$20, + now() + ) + `, + dfusrID, + username, + roleCode, + + entry.ActionType, + entry.ActionCategory, + entry.ActionTarget, + entry.Description, + + entry.IpAddress, + entry.UserAgent, + entry.SessionID, + + nullIfZeroTime(entry.RequestStartedAt), + nullIfZeroTime(entry.RequestFinishedAt), + nullIfZeroInt(entry.DurationMs), + nullIfZeroInt(entry.HttpStatus), + + entry.IsSuccess, + entry.ErrorMessage, + + // ✅ NEW + targetDfUsrID, + targetUsername, + toJSONB(entry.ChangeBefore), + toJSONB(entry.ChangeAfter), + ) + + if err != nil { + log.Println("❌ auditlog insert error:", err) + } + } +} diff --git a/svc/internal/auditlog/writer.go b/svc/internal/auditlog/writer.go new file mode 100644 index 0000000..5969e4f --- /dev/null +++ b/svc/internal/auditlog/writer.go @@ -0,0 +1,25 @@ +package auditlog + +import "context" + +func Write(log ActivityLog) { + if logQueue == nil { + return // sistem henüz init edilmediyse sessizce çık + } + + select { + case logQueue <- log: + // kuyruğa alındı + default: + // kuyruk dolu → drop edilir, ana akış bozulmaz + } +} +func Enqueue(ctx context.Context, al ActivityLog) { + + select { + case logQueue <- al: + // ok + default: + // queue dolu → drop + } +} diff --git a/svc/internal/authz/context.go b/svc/internal/authz/context.go new file mode 100644 index 0000000..ea81a32 --- /dev/null +++ b/svc/internal/authz/context.go @@ -0,0 +1,36 @@ +package authz + +import "context" + +type scopeKey string + +const ( + CtxDeptCodesKey scopeKey = "authz.dept_codes" + CtxPiyasaCodesKey scopeKey = "authz.piyasa_codes" +) + +func WithDeptCodes(ctx context.Context, codes []string) context.Context { + return context.WithValue(ctx, CtxDeptCodesKey, codes) +} + +func WithPiyasaCodes(ctx context.Context, codes []string) context.Context { + return context.WithValue(ctx, CtxPiyasaCodesKey, codes) +} + +func GetDeptCodesFromCtx(ctx context.Context) []string { + if v := ctx.Value(CtxDeptCodesKey); v != nil { + if codes, ok := v.([]string); ok { + return codes + } + } + return nil +} + +func GetPiyasaCodesFromCtx(ctx context.Context) []string { + if v := ctx.Value(CtxPiyasaCodesKey); v != nil { + if codes, ok := v.([]string); ok { + return codes + } + } + return nil +} diff --git a/svc/internal/authz/mssql.go b/svc/internal/authz/mssql.go new file mode 100644 index 0000000..a8c0fb2 --- /dev/null +++ b/svc/internal/authz/mssql.go @@ -0,0 +1,32 @@ +package authz + +import ( + "context" + "fmt" + "strings" +) + +func BuildMSSQLPiyasaFilter( + ctx context.Context, + column string, +) string { + + codes := GetPiyasaCodesFromCtx(ctx) + + if len(codes) == 0 { + return "1=1" + + } + + var quoted []string + + for _, c := range codes { + quoted = append(quoted, "'"+c+"'") + } + + return fmt.Sprintf( + "%s IN (%s)", + column, + strings.Join(quoted, ","), + ) +} diff --git a/svc/internal/authz/mssql_helpers.go b/svc/internal/authz/mssql_helpers.go new file mode 100644 index 0000000..cb20bdf --- /dev/null +++ b/svc/internal/authz/mssql_helpers.go @@ -0,0 +1,24 @@ +package authz + +import ( + "fmt" + "strings" +) + +func BuildINClause(column string, codes []string) string { + if len(codes) == 0 { + return "1=0" + } + var quoted []string + for _, c := range codes { + c = strings.TrimSpace(strings.ToUpper(c)) + if c == "" { + continue + } + quoted = append(quoted, "'"+c+"'") + } + if len(quoted) == 0 { + return "1=0" + } + return fmt.Sprintf("%s IN (%s)", column, strings.Join(quoted, ",")) +} diff --git a/svc/internal/authz/piyasa_repo.go b/svc/internal/authz/piyasa_repo.go new file mode 100644 index 0000000..7784328 --- /dev/null +++ b/svc/internal/authz/piyasa_repo.go @@ -0,0 +1,74 @@ +package authz + +import ( + "database/sql" + "fmt" + "sync" +) + +// ===================================================== +// 🧠 PIYASA CACHE (USER → CODES) +// ===================================================== + +var ( + piyasaCache = make(map[int][]string) + piyasaMu sync.RWMutex +) + +// ===================================================== +// 📌 GET USER PIYASA CODES (CACHED) +// ===================================================== + +func GetUserPiyasaCodes(pg *sql.DB, userID int) ([]string, error) { + + // ----------------------------- + // CACHE READ + // ----------------------------- + piyasaMu.RLock() + if it, ok := piyasaCache[userID]; ok { + piyasaMu.RUnlock() + return it, nil + } + piyasaMu.RUnlock() + + // ----------------------------- + // DB QUERY + // ----------------------------- + rows, err := pg.Query(` + SELECT piyasa_code + FROM dfusr_piyasa + WHERE dfusr_id = $1 + AND is_allowed = true + `, userID) + if err != nil { + return nil, fmt.Errorf("pg piyasa query error: %w", err) + } + defer rows.Close() + + var out []string + for rows.Next() { + var code string + if err := rows.Scan(&code); err == nil { + out = append(out, code) + } + } + + // ----------------------------- + // CACHE WRITE + // ----------------------------- + piyasaMu.Lock() + piyasaCache[userID] = out + piyasaMu.Unlock() + + return out, nil +} + +// ===================================================== +// 🧹 CLEAR USER PIYASA CACHE +// ===================================================== + +func ClearPiyasaCache(userID int) { + piyasaMu.Lock() + defer piyasaMu.Unlock() + delete(piyasaCache, userID) +} diff --git a/svc/internal/mailer/config.go b/svc/internal/mailer/config.go new file mode 100644 index 0000000..d8b48f3 --- /dev/null +++ b/svc/internal/mailer/config.go @@ -0,0 +1,50 @@ +package mailer + +import ( + "os" + "strconv" + "strings" +) + +type Config struct { + Host string + Port int + Username string + Password string + From string + StartTLS bool +} + +func ConfigFromEnv() (Config, error) { + var cfg Config + + cfg.Host = strings.TrimSpace(os.Getenv("SMTP_HOST")) + cfg.Username = strings.TrimSpace(os.Getenv("SMTP_USERNAME")) + cfg.Password = os.Getenv("SMTP_PASSWORD") + cfg.From = strings.TrimSpace(os.Getenv("SMTP_FROM")) + + portStr := strings.TrimSpace(os.Getenv("SMTP_PORT")) + if portStr == "" { + cfg.Port = 587 + } else { + p, err := strconv.Atoi(portStr) + if err != nil { + return Config{}, err + } + cfg.Port = p + } + + startTLS := strings.TrimSpace(os.Getenv("SMTP_STARTTLS")) + if startTLS == "" { + cfg.StartTLS = true + } else { + cfg.StartTLS = strings.EqualFold(startTLS, "true") || startTLS == "1" + } + + // minimal validation + if cfg.Host == "" || cfg.Username == "" || cfg.Password == "" || cfg.From == "" || cfg.Port <= 0 { + return Config{}, ErrInvalidConfig + } + + return cfg, nil +} diff --git a/svc/internal/mailer/graph_mailer.go b/svc/internal/mailer/graph_mailer.go new file mode 100644 index 0000000..0d1c9da --- /dev/null +++ b/svc/internal/mailer/graph_mailer.go @@ -0,0 +1,270 @@ +package mailer + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "os" + "strconv" + "strings" + "time" + + "golang.org/x/oauth2/clientcredentials" +) + +type GraphMailer struct { + httpClient *http.Client + from string // noreply@baggi.com.tr + replyTo string // opsiyonel +} + +func NewGraphMailer() (*GraphMailer, error) { + tenantID := strings.TrimSpace(os.Getenv("AZURE_TENANT_ID")) + clientID := strings.TrimSpace(os.Getenv("AZURE_CLIENT_ID")) + clientSecret := strings.TrimSpace(os.Getenv("AZURE_CLIENT_SECRET")) + from := strings.TrimSpace(os.Getenv("MAIL_FROM")) + replyTo := strings.TrimSpace(os.Getenv("MAIL_REPLY_TO")) // opsiyonel + + if tenantID == "" || clientID == "" || clientSecret == "" || from == "" { + return nil, fmt.Errorf("azure graph mailer env missing (AZURE_TENANT_ID/AZURE_CLIENT_ID/AZURE_CLIENT_SECRET/MAIL_FROM)") + } + + conf := clientcredentials.Config{ + ClientID: clientID, + ClientSecret: clientSecret, + TokenURL: fmt.Sprintf("https://login.microsoftonline.com/%s/oauth2/v2.0/token", tenantID), + Scopes: []string{"https://graph.microsoft.com/.default"}, + } + + httpClient := conf.Client(context.Background()) + httpClient.Timeout = 25 * time.Second + + log.Printf("✉️ Graph Mailer hazır (App-only token) | from=%s", from) + + return &GraphMailer{ + httpClient: httpClient, + from: from, + replyTo: replyTo, + }, nil +} + +func (g *GraphMailer) Send(ctx context.Context, msg Message) error { + start := time.Now() + + // ---------- validate ---------- + cleanTo := make([]string, 0, len(msg.To)) + for _, t := range msg.To { + t = strings.TrimSpace(t) + if t != "" { + cleanTo = append(cleanTo, t) + } + } + if len(cleanTo) == 0 { + return fmt.Errorf("recipient missing") + } + subject := strings.TrimSpace(msg.Subject) + if subject == "" { + return fmt.Errorf("subject missing") + } + + // internal-safe adjustments + isInternal := allRecipientsInDomain(cleanTo, "baggi.com.tr") + if isInternal && !strings.HasPrefix(subject, "[BSSApp]") { + subject = "[BSSApp] " + subject + } + + html := strings.TrimSpace(msg.BodyHTML) + text := strings.TrimSpace(msg.Body) + + // Eğer sadece HTML geldiyse text üret (spam skorunu düşürür) + if text == "" && html != "" { + text = stripHTMLVerySimple(html) + } + // Eğer sadece text geldiyse basit HTML üret + if html == "" && text != "" { + html = "

" +
+			htmlEscape(text) + "
" + } + if html == "" { + return fmt.Errorf("body missing (Body or BodyHTML)") + } + + log.Printf("✉️ [MAIL] SEND START | from=%s | to=%v | internal=%v | subject=%s", g.from, cleanTo, isInternal, subject) + + // ---------- build recipients ---------- + type recipient struct { + EmailAddress struct { + Address string `json:"address"` + } `json:"emailAddress"` + } + toRecipients := make([]recipient, 0, len(cleanTo)) + for _, m := range cleanTo { + r := recipient{} + r.EmailAddress.Address = m + toRecipients = append(toRecipients, r) + } + + // ---------- headers to reduce auto-phish/spam signals ---------- + headers := []map[string]string{ + { + "name": "X-Mailer", + "value": "BSSApp Graph Mailer", + }, + { + "name": "X-BSSApp-Internal", + "value": strconv.FormatBool(isInternal), + }, + } + + // replyTo (opsiyonel) + var replyToRecipients []recipient + if strings.TrimSpace(g.replyTo) != "" { + rt := recipient{} + rt.EmailAddress.Address = strings.TrimSpace(g.replyTo) + replyToRecipients = []recipient{rt} + } + + // ---------- Graph payload ---------- + message := map[string]any{ + "subject": subject, + "body": map[string]string{ + "contentType": "HTML", + "content": buildHTML(html, text, isInternal), + }, + "toRecipients": toRecipients, + "internetMessageHeaders": headers, + "importance": "normal", + } + + // replyTo SADECE doluysa ekle + if len(replyToRecipients) > 0 { + message["replyTo"] = replyToRecipients + } + + payload := map[string]any{ + "message": message, + "saveToSentItems": true, + } + + b, err := json.Marshal(payload) + if err != nil { + return fmt.Errorf("json marshal: %w", err) + } + + url := fmt.Sprintf( + "https://graph.microsoft.com/v1.0/users/%s/sendMail", + g.from, + ) + + req, err := http.NewRequestWithContext( + ctx, + http.MethodPost, + url, + bytes.NewBuffer(b), + ) + if err != nil { + return fmt.Errorf("new request: %w", err) + } + req.Header.Set("Content-Type", "application/json") + + res, err := g.httpClient.Do(req) + if err != nil { + return fmt.Errorf("graph request: %w", err) + } + defer res.Body.Close() + + if res.StatusCode >= 300 { + bodyBytes, _ := io.ReadAll(res.Body) + log.Printf( + "❌ [MAIL] SEND FAILED | status=%s | body=%s", + res.Status, + string(bodyBytes), + ) + return fmt.Errorf("graph send mail failed: %s", res.Status) + } + + log.Printf( + "✅ [MAIL] SEND OK | to=%v | duration=%s", + cleanTo, + time.Since(start), + ) + + return nil +} + +// ---------- helpers ---------- + +func allRecipientsInDomain(to []string, domain string) bool { + domain = strings.ToLower(strings.TrimSpace(domain)) + for _, addr := range to { + addr = strings.ToLower(strings.TrimSpace(addr)) + if !strings.HasSuffix(addr, "@"+domain) { + return false + } + } + return true +} + +func buildHTML(htmlBody, textBody string, internal bool) string { + // Internal ise daha sade, daha az “marketing-like” + if internal { + return ` +
+ ` + htmlBody + ` +
+
+ Bu e-posta BSSApp sistemi tarafından otomatik oluşturulmuştur. +
+
` + } + + // External + return ` +
+ ` + htmlBody + ` +
` +} + +// Çok basit “html -> text” (tam değil ama yeterli) +func stripHTMLVerySimple(s string) string { + s = strings.ReplaceAll(s, "
", "\n") + s = strings.ReplaceAll(s, "
", "\n") + s = strings.ReplaceAll(s, "
", "\n") + s = strings.ReplaceAll(s, "

", "\n\n") + // kaba temizlik + for { + i := strings.Index(s, "<") + j := strings.Index(s, ">") + if i >= 0 && j > i { + s = s[:i] + s[j+1:] + continue + } + break + } + return strings.TrimSpace(s) +} + +func htmlEscape(s string) string { + replacer := strings.NewReplacer( + "&", "&", + "<", "<", + ">", ">", + "\"", """, + "'", "'", + ) + return replacer.Replace(s) +} +func (g *GraphMailer) SendMail(to string, subject string, html string) error { + msg := Message{ + To: []string{to}, + Subject: subject, + BodyHTML: html, + } + + // context burada internal olarak veriliyor + return g.Send(context.Background(), msg) +} diff --git a/svc/internal/mailer/mailer.go b/svc/internal/mailer/mailer.go new file mode 100644 index 0000000..c7f32b5 --- /dev/null +++ b/svc/internal/mailer/mailer.go @@ -0,0 +1,148 @@ +package mailer + +import ( + "context" + "crypto/tls" + "errors" + "fmt" + "net" + "net/smtp" + "strings" + "time" +) + +var ErrInvalidConfig = errors.New("invalid smtp config") + +type Mailer struct { + cfg Config +} + +type Message struct { + To []string + Subject string + Body string + BodyHTML string +} + +func New(cfg Config) *Mailer { + return &Mailer{cfg: cfg} +} + +func (m *Mailer) Send(ctx context.Context, msg Message) error { + if len(msg.To) == 0 { + return errors.New("recipient missing") + } + if strings.TrimSpace(msg.Subject) == "" { + return errors.New("subject missing") + } + + // timeout kontrolü (ctx) + deadline, ok := ctx.Deadline() + if !ok { + // default timeout + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, 20*time.Second) + defer cancel() + deadline, _ = ctx.Deadline() + } + timeout := time.Until(deadline) + if timeout <= 0 { + return context.DeadlineExceeded + } + + addr := fmt.Sprintf("%s:%d", m.cfg.Host, m.cfg.Port) + + dialer := net.Dialer{Timeout: timeout} + conn, err := dialer.DialContext(ctx, "tcp", addr) + if err != nil { + return fmt.Errorf("smtp dial: %w", err) + } + defer conn.Close() + + c, err := smtp.NewClient(conn, m.cfg.Host) + if err != nil { + return fmt.Errorf("smtp client: %w", err) + } + defer c.Close() + + // STARTTLS + if m.cfg.StartTLS { + tlsCfg := &tls.Config{ + ServerName: m.cfg.Host, + MinVersion: tls.VersionTLS12, + } + if err := c.StartTLS(tlsCfg); err != nil { + return fmt.Errorf("starttls: %w", err) + } + } + + // AUTH + auth := smtp.PlainAuth("", m.cfg.Username, m.cfg.Password, m.cfg.Host) + if err := c.Auth(auth); err != nil { + return fmt.Errorf("smtp auth: %w", err) + } + + // MAIL FROM + if err := c.Mail(m.cfg.From); err != nil { + return fmt.Errorf("mail from: %w", err) + } + + // RCPT TO + for _, rcpt := range msg.To { + rcpt = strings.TrimSpace(rcpt) + if rcpt == "" { + continue + } + if err := c.Rcpt(rcpt); err != nil { + return fmt.Errorf("rcpt %s: %w", rcpt, err) + } + } + + w, err := c.Data() + if err != nil { + return fmt.Errorf("data: %w", err) + } + + // basit mime + contentType := "text/plain; charset=UTF-8" + body := msg.Body + if strings.TrimSpace(msg.BodyHTML) != "" { + contentType = "text/html; charset=UTF-8" + body = msg.BodyHTML + } + + raw := buildMIME(m.cfg.From, msg.To, msg.Subject, contentType, body) + + _, writeErr := w.Write([]byte(raw)) + closeErr := w.Close() + + if writeErr != nil { + return fmt.Errorf("write body: %w", writeErr) + } + if closeErr != nil { + return fmt.Errorf("close body: %w", closeErr) + } + + if err := c.Quit(); err != nil { + return fmt.Errorf("quit: %w", err) + } + + return nil +} + +func buildMIME(from string, to []string, subject, contentType, body string) string { + // Subject UTF-8 basit hali (gerekirse sonra MIME encoded-word ekleriz) + headers := []string{ + "From: " + from, + "To: " + strings.Join(to, ", "), + "Subject: " + subject, + "MIME-Version: 1.0", + "Content-Type: " + contentType, + "", + } + return strings.Join(headers, "\r\n") + "\r\n" + body + "\r\n" +} + +type MailerInterface interface { + Send(ctx context.Context, msg Message) error +} diff --git a/svc/internal/mailer/password_reset.go b/svc/internal/mailer/password_reset.go new file mode 100644 index 0000000..a8e6a94 --- /dev/null +++ b/svc/internal/mailer/password_reset.go @@ -0,0 +1,18 @@ +package mailer + +import "fmt" + +func (m *GraphMailer) SendPasswordResetMail(toEmail string, resetURL string) error { + subject := "Parola Sıfırlama" + + html := fmt.Sprintf(` +

Merhaba,

+

Parolanızı sıfırlamak için aşağıdaki bağlantıya tıklayın:

+

+ %s +

+

Bu bağlantı 30 dakika geçerlidir ve tek kullanımlıktır.

+ `, resetURL, resetURL) + + return m.SendMail(toEmail, subject, html) +} diff --git a/svc/internal/security/errors.go b/svc/internal/security/errors.go new file mode 100644 index 0000000..ea8b872 --- /dev/null +++ b/svc/internal/security/errors.go @@ -0,0 +1,11 @@ +package security + +import "errors" + +var ( + ErrPasswordTooShort = errors.New("password must be at least 8 characters") + ErrPasswordUpper = errors.New("password must contain an uppercase letter") + ErrPasswordLower = errors.New("password must contain a lowercase letter") + ErrPasswordDigit = errors.New("password must contain a digit") + ErrPasswordSpecial = errors.New("password must contain a special character") +) diff --git a/svc/internal/security/password_policy.go b/svc/internal/security/password_policy.go new file mode 100644 index 0000000..4b9855c --- /dev/null +++ b/svc/internal/security/password_policy.go @@ -0,0 +1,35 @@ +package security + +import ( + "errors" + "regexp" + "strings" +) + +var ( + reUpper = regexp.MustCompile(`[A-Z]`) + reLower = regexp.MustCompile(`[a-z]`) + reDigit = regexp.MustCompile(`[0-9]`) + reSpecial = regexp.MustCompile(`[^A-Za-z0-9]`) +) + +func ValidatePassword(pw string) error { + pw = strings.TrimSpace(pw) + + if len(pw) < 8 { + return errors.New("Parola en az 8 karakter olmalı") + } + if !reUpper.MatchString(pw) { + return errors.New("Parola en az 1 büyük harf içermeli") + } + if !reLower.MatchString(pw) { + return errors.New("Parola en az 1 küçük harf içermeli") + } + if !reDigit.MatchString(pw) { + return errors.New("Parola en az 1 rakam içermeli") + } + if !reSpecial.MatchString(pw) { + return errors.New("Parola en az 1 özel karakter içermeli") + } + return nil +} diff --git a/svc/internal/security/password_reset.go b/svc/internal/security/password_reset.go new file mode 100644 index 0000000..d364717 --- /dev/null +++ b/svc/internal/security/password_reset.go @@ -0,0 +1,13 @@ +package security + +import ( + "os" +) + +func BuildResetURL(token string) string { + base := os.Getenv("FRONTEND_URL") + if base == "" { + base = "http://localhost:9000" + } + return base + "/password-reset/" + token +} diff --git a/svc/internal/security/refresh_token.go b/svc/internal/security/refresh_token.go new file mode 100644 index 0000000..c59b14b --- /dev/null +++ b/svc/internal/security/refresh_token.go @@ -0,0 +1,23 @@ +package security + +import ( + "crypto/rand" + "crypto/sha256" + "encoding/hex" +) + +func GenerateRefreshToken() (plain string, hash string, err error) { + b := make([]byte, 32) // 256 bit + if _, err = rand.Read(b); err != nil { + return + } + plain = hex.EncodeToString(b) + sum := sha256.Sum256([]byte(plain)) + hash = hex.EncodeToString(sum[:]) + return +} + +func HashRefreshToken(plain string) string { + sum := sha256.Sum256([]byte(plain)) + return hex.EncodeToString(sum[:]) +} diff --git a/svc/internal/security/reset_token.go b/svc/internal/security/reset_token.go new file mode 100644 index 0000000..b1acf47 --- /dev/null +++ b/svc/internal/security/reset_token.go @@ -0,0 +1,26 @@ +package security + +import ( + "crypto/rand" + "crypto/sha256" + "encoding/hex" +) + +func GenerateResetToken() (plain string, hash string, err error) { + b := make([]byte, 32) // 256 bit + if _, err = rand.Read(b); err != nil { + return + } + + plain = hex.EncodeToString(b) + + sum := sha256.Sum256([]byte(plain)) + hash = hex.EncodeToString(sum[:]) + + return +} + +func HashToken(plain string) string { + sum := sha256.Sum256([]byte(plain)) + return hex.EncodeToString(sum[:]) +} diff --git a/svc/mail.env b/svc/mail.env new file mode 100644 index 0000000..0e9f91e --- /dev/null +++ b/svc/mail.env @@ -0,0 +1,4 @@ +AZURE_TENANT_ID=c8e0675d-1f6e-40f3-ba5f-3d1985b92317 +AZURE_CLIENT_ID=94a134b7-757f-4bcc-9e4b-d577b631a9a3 +AZURE_CLIENT_SECRET=PaW8Q~9NzYXHrESZcKoP6.hRxS.CyQshvJ0Y0czx +MAIL_FROM=baggiss@baggi.com.tr diff --git a/svc/main.go b/svc/main.go new file mode 100644 index 0000000..ca41e3d --- /dev/null +++ b/svc/main.go @@ -0,0 +1,587 @@ +package main + +import ( + "bssapp-backend/db" + "bssapp-backend/internal/auditlog" + "bssapp-backend/internal/mailer" + "bssapp-backend/middlewares" + "bssapp-backend/permissions" + "bssapp-backend/repository" + "bssapp-backend/routes" + "database/sql" + "log" + "net/http" + "os" + "runtime/debug" + + "github.com/gorilla/mux" + "github.com/joho/godotenv" +) + +/* +=========================================================== +✅ CORS +=========================================================== +*/ +func enableCORS(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Access-Control-Allow-Origin", "http://localhost:9000") + w.Header().Set("Access-Control-Allow-Credentials", "true") + w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") + w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") + + if r.Method == http.MethodOptions { + w.WriteHeader(http.StatusOK) + return + } + + h.ServeHTTP(w, r) + }) +} + +/* +=========================================================== +✅ V3 — Method-aware Route Auto Register +- mk_sys_routes: (path, method, module_code, action) +- unique: (path, method) +- admin auto-allow: mk_sys_role_permissions (role_id=3) +=========================================================== +*/ +func autoRegisterRouteV3( + pg *sql.DB, + path string, + method string, + module string, + action string, +) { + tx, err := pg.Begin() + if err != nil { + log.Println("❌ TX begin error:", err) + return + } + defer tx.Rollback() + + // 1) ROUTE REGISTER (path+method) + _, err = tx.Exec(` + INSERT INTO mk_sys_routes + (path, method, module_code, action) + VALUES + ($1, $2, $3, $4) + ON CONFLICT (path, method) DO UPDATE + SET + module_code = EXCLUDED.module_code, + action = EXCLUDED.action + `, + path, + method, + module, + action, + ) + if err != nil { + log.Printf("❌ Route register error (%s %s): %v", method, path, err) + return + } + + // 2) ADMIN AUTO PERMISSION (module+action bazlı) + _, err = tx.Exec(` + INSERT INTO mk_sys_role_permissions + (role_id, module_code, action, allowed) + SELECT + id, + $1, + $2, + true + FROM dfrole + WHERE id = 3 -- ADMIN + ON CONFLICT DO NOTHING + `, + module, + action, + ) + if err != nil { + log.Printf("❌ Admin perm seed error (%s %s): %v", method, path, err) + return + } + + if err := tx.Commit(); err != nil { + log.Println("❌ TX commit error:", err) + return + } + + log.Printf("✅ Route+Perm registered → %s %s [%s:%s]", + method, path, module, action, + ) +} + +/* +=========================================================== +✅ V3 Route Bind Helper +- tek satırda: autoRegister + wrap + Handle +=========================================================== +*/ +func bindV3( + r *mux.Router, + pg *sql.DB, + path string, + method string, + module string, + action string, + h http.Handler, +) { + // main + autoRegisterRouteV3(pg, path, method, module, action) + + r.Handle(path, h).Methods(method, "OPTIONS") +} + +/* +=========================================================== +InitRoutes — FULL V3 (Method-aware) PERMISSION EDITION +=========================================================== +*/ +func InitRoutes(pgDB *sql.DB, mssql *sql.DB, ml *mailer.GraphMailer) *mux.Router { + + r := mux.NewRouter() + + /* + =========================================================== + ✅ wrapV3 (method-aware): + - AuthMiddleware (JWT) + - panic recover + - AuthzGuardByRoute(pgDB) => route(path+method) lookup + =========================================================== + */ + wrapV3 := func(h http.Handler) http.Handler { + return middlewares.AuthMiddleware( + pgDB, + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer func() { + if rec := recover(); rec != nil { + log.Printf("🔥 PANIC %s %s\n%v", r.Method, r.URL.Path, rec) + debug.PrintStack() + http.Error(w, "internal server error", 500) + } + }() + + // ✅ method-aware route guard + middlewares.AuthzGuardByRoute(pgDB)(h).ServeHTTP(w, r) + }), + ) + } + + // ============================================================ + // PUBLIC (NO AUTHZ) + // ============================================================ + bindV3(r, pgDB, + "/api/auth/login", "POST", + "auth", "login", + http.HandlerFunc(routes.LoginHandler(pgDB)), + ) + + bindV3(r, pgDB, + "/api/auth/refresh", "POST", + "auth", "refresh", + routes.AuthRefreshHandler(pgDB), + ) + + // ============================================================ + // SYSTEM + // ============================================================ + bindV3(r, pgDB, + "/api/password/change", "POST", + "system", "update", + wrapV3(http.HandlerFunc(routes.FirstPasswordChangeHandler(pgDB))), + ) + + bindV3(r, pgDB, + "/api/activity-logs", "GET", + "user", "view", + wrapV3(routes.AdminActivityLogsHandler(pgDB)), + ) + + bindV3(r, pgDB, + "/api/test-mail", "POST", + "user", "insert", + wrapV3(routes.TestMailHandler(ml)), + ) + + // ============================================================ + // PERMISSIONS + // ============================================================ + rolePerm := "/api/roles/{id}/permissions" + + bindV3(r, pgDB, + rolePerm, "GET", + "user", "update", + wrapV3(routes.GetRolePermissionMatrix(pgDB)), + ) + bindV3(r, pgDB, + rolePerm, "POST", + "user", "update", + wrapV3(routes.SaveRolePermissionMatrix(pgDB)), + ) + + userPerm := "/api/users/{id}/permissions" + + bindV3(r, pgDB, + userPerm, "GET", + "user", "update", + wrapV3(routes.GetUserPermissionsHandler(pgDB)), + ) + bindV3(r, pgDB, + userPerm, "POST", + "user", "update", + wrapV3(routes.SaveUserPermissionsHandler(pgDB)), + ) + + // ✅ permissions/routes (system:view) + bindV3(r, pgDB, + "/api/permissions/routes", "GET", + "system", "view", + wrapV3(routes.GetUserRoutePermissionsHandler(pgDB)), + ) + + // ✅ permissions/effective (system:view) + bindV3(r, pgDB, + "/api/permissions/effective", "GET", + "system", "view", + wrapV3(routes.GetMyEffectivePermissions(pgDB)), + ) + + // ✅ my permission matrix (system:view) (Senin tabloda user:view görünüyor; düzeltiyoruz) + bindV3(r, pgDB, + "/api/permissions/matrix", "GET", + "system", "view", + wrapV3(routes.GetMyPermissionMatrix(pgDB)), + ) + + // ============================================================ + // ROLE + DEPARTMENT PERMISSIONS + // ============================================================ + rdPerm := "/api/roles/{roleId}/departments/{deptCode}/permissions" + rdHandler := routes.NewRoleDepartmentPermissionHandler(pgDB) + + bindV3(r, pgDB, + rdPerm, "GET", + "user", "update", + wrapV3(http.HandlerFunc(rdHandler.Get)), + ) + bindV3(r, pgDB, + rdPerm, "POST", + "user", "update", + wrapV3(http.HandlerFunc(rdHandler.Save)), + ) + + // ============================================================ + // USERS + // ============================================================ + bindV3(r, pgDB, + "/api/users/list", "GET", + "user", "view", + wrapV3(routes.UserListRoute(pgDB)), + ) + + bindV3(r, pgDB, + "/api/users", "POST", + "user", "insert", + wrapV3(routes.UserCreateRoute(pgDB)), + ) + + bindV3(r, pgDB, + "/api/users/{id}", "GET", + "user", "update", + wrapV3(routes.UserDetailRoute(pgDB)), + ) + bindV3(r, pgDB, + "/api/users/{id}", "PUT", + "user", "update", + wrapV3(routes.UserDetailRoute(pgDB)), + ) + + bindV3(r, pgDB, + "/api/users/{id}/admin-reset-password", "POST", + "user", "update", + wrapV3(routes.AdminResetPasswordHandler(pgDB)), + ) + + bindV3(r, pgDB, + "/api/users/{id}/send-password-mail", "POST", + "user", "update", + wrapV3(routes.SendPasswordResetMailHandler(pgDB, ml)), + ) + + // ✅ eski kısayol create endpoint (senin eski main.go’da vardı) + bindV3(r, pgDB, + "/api/users/create", "POST", + "user", "insert", + wrapV3(routes.UserCreateRoute(pgDB)), + ) + + // ============================================================ + // LOOKUPS + // ============================================================ + lookups := map[string]http.Handler{ + "/api/lookups/roles": routes.GetRoleLookupRoute(pgDB), + "/api/lookups/departments": routes.GetDepartmentLookupRoute(pgDB), + "/api/lookups/nebim-users": routes.GetNebimUserLookupRoute(pgDB), + "/api/lookups/piyasalar": routes.GetPiyasaLookupRoute(pgDB), + "/api/lookups/users-perm": routes.GetUsersForPermissionSelectRoute(pgDB), + "/api/lookups/roles-perm": routes.GetRolesForPermissionSelectRoute(pgDB), + "/api/lookups/departments-perm": routes.GetDepartmentsForPermissionSelectRoute(pgDB), + "/api/lookups/modules": routes.GetModuleLookupRoute(pgDB), + } + + for path, handler := range lookups { + bindV3(r, pgDB, + path, "GET", + "user", "view", + wrapV3(handler), + ) + } + + // ============================================================ + // CUSTOMER + // ============================================================ + bindV3(r, pgDB, + "/api/accounts", "GET", + "customer", "view", + wrapV3(http.HandlerFunc(routes.GetAccountsHandler)), + ) + + bindV3(r, pgDB, + "/api/customer-list", "GET", + "customer", "view", + wrapV3(http.HandlerFunc(routes.GetCustomerListHandler)), + ) + + // ============================================================ + // FINANCE + // ============================================================ + bindV3(r, pgDB, + "/api/today-currency", "GET", + "finance", "view", + wrapV3(routes.GetTodayCurrencyV3Handler(mssql)), + ) + + bindV3(r, pgDB, + "/api/export-pdf", "GET", + "finance", "export", + wrapV3(routes.ExportPDFHandler(mssql)), + ) + + bindV3(r, pgDB, + "/api/exportstamentheaderreport-pdf", "GET", + "finance", "export", + wrapV3(routes.ExportStatementHeaderReportPDFHandler(mssql)), + ) + + // ============================================================ + // REPORT (STATEMENTS) + // ============================================================ + bindV3(r, pgDB, + "/api/statements", "GET", + "finance", "view", + wrapV3(http.HandlerFunc(routes.GetStatementHeadersHandler)), + ) + + // ⚠️ Senin handler: GetStatementDetailsHandler vars["accountCode"] bekliyor, + // route’da {id} var. Burada, DB route’unu ve path’i bozmayalım diye {id}’yi koruyorum, + // ama handler içinde accountCode := mux.Vars(r)["id"] yapman daha doğru. + bindV3(r, pgDB, + "/api/statements/{id}/details", "GET", + "finance", "view", + wrapV3(http.HandlerFunc(routes.GetStatementDetailsHandler)), + ) + + // ============================================================ + // ORDER + // ============================================================ + orderRoutes := []struct { + Path string + Method string + Action string + Handle http.Handler + }{ + {"/api/order/create", "POST", "insert", routes.CreateOrderHandler(pgDB, mssql)}, + {"/api/order/update", "POST", "update", http.HandlerFunc(routes.UpdateOrderHandler)}, + {"/api/order/get/{id}", "GET", "view", routes.GetOrderByIDHandler(mssql)}, + {"/api/orders/list", "GET", "view", routes.OrderListRoute(mssql)}, + {"/api/orders/export", "GET", "export", routes.OrderListExcelRoute(mssql)}, + {"/api/order/check/{id}", "GET", "view", routes.OrderExistsHandler(mssql)}, + {"/api/order/validate", "POST", "insert", routes.ValidateOrderHandler(mssql)}, + {"/api/order/pdf/{id}", "GET", "export", routes.OrderPDFHandler(mssql)}, + {"/api/order-inventory", "GET", "view", http.HandlerFunc(routes.GetOrderInventoryHandler)}, + {"/api/orderpricelistb2b", "GET", "view", routes.GetOrderPriceListB2BHandler(pgDB, mssql)}, + {"/api/min-price", "GET", "view", routes.GetOrderPriceListB2BHandler(pgDB, mssql)}, + } + + for _, rt := range orderRoutes { + bindV3(r, pgDB, + rt.Path, rt.Method, + "order", rt.Action, + wrapV3(rt.Handle), + ) + } + + // ============================================================ + // PRODUCTS (✅ handler mapping fix) + // ============================================================ + bindV3(r, pgDB, + "/api/products", "GET", + "order", "view", + wrapV3(http.HandlerFunc(routes.GetProductListHandler)), + ) + + bindV3(r, pgDB, + "/api/product-detail", "GET", + "order", "view", + wrapV3(http.HandlerFunc(routes.GetProductDetailHandler)), + ) + + bindV3(r, pgDB, + "/api/product-colors", "GET", + "order", "view", + wrapV3(http.HandlerFunc(routes.GetProductColorsHandler)), + ) + + bindV3(r, pgDB, + "/api/product-colorsize", "GET", + "order", "view", + wrapV3(http.HandlerFunc(routes.GetProductColorSizesHandler)), + ) + + bindV3(r, pgDB, + "/api/product-secondcolor", "GET", + "order", "view", + wrapV3(http.HandlerFunc(routes.GetProductSecondColorsHandler)), + ) + + // ============================================================ + // ROLE MANAGEMENT + // ============================================================ + bindV3(r, pgDB, + "/api/roles", "GET", + "user", "view", + wrapV3(routes.GetRolesHandler(pgDB)), + ) + + bindV3(r, pgDB, + "/api/departments", "GET", + "user", "view", + wrapV3(routes.GetDepartmentsHandler(pgDB)), + ) + + bindV3(r, pgDB, + "/api/piyasalar", "GET", + "user", "view", + wrapV3(routes.GetPiyasalarHandler(pgDB)), + ) + + // ============================================================ + // ROLE RELATIONS + // ============================================================ + bindV3(r, pgDB, + "/api/roles/{id}/departments", "POST", + "user", "update", + wrapV3(routes.UpdateRoleDepartmentsHandler(pgDB)), + ) + + bindV3(r, pgDB, + "/api/roles/{id}/piyasalar", "POST", + "user", "update", + wrapV3(routes.UpdateRolePiyasalarHandler(pgDB)), + ) + + // ============================================================ + // USER ↔ ROLE + // ============================================================ + bindV3(r, pgDB, + "/api/users/{id}/roles", "POST", + "user", "update", + wrapV3(routes.UpdateUserRolesHandler(pgDB)), + ) + + // ============================================================ + // ADMIN EXTRA (eski main.go’da vardı, yeni sisteme alındı) + // ============================================================ + bindV3(r, pgDB, + "/api/admin/users/{id}/piyasa-sync", "POST", + "admin", "user.update", + wrapV3(http.HandlerFunc(routes.AdminSyncUserPiyasaHandler)), + ) + + return r +} + +func main() { + log.Println("🔥🔥🔥 BSSAPP BACKEND STARTED — LOGIN ROUTE SHOULD EXIST 🔥🔥🔥") + + // ------------------------------------------------------- + // 🔑 ENV + // ------------------------------------------------------- + if err := godotenv.Load(".env", "mail.env"); err != nil { + log.Println("⚠️ .env / mail.env bulunamadı") + } + + jwtSecret := os.Getenv("JWT_SECRET") + if len(jwtSecret) < 10 { + log.Fatal("❌ JWT_SECRET tanımlı değil veya çok kısa (min 10 karakter)") + } + log.Println("🔐 JWT_SECRET yüklendi") + + // ------------------------------------------------------- + // 🔗 DATABASE + // ------------------------------------------------------- + db.ConnectMSSQL() + + pgDB, err := db.ConnectPostgres() + if err != nil { + log.Fatalf("❌ PostgreSQL bağlantı hatası: %v", err) + } + defer pgDB.Close() + + // ------------------------------------------------------- + // 🔐 ADMIN ROLE + DEPARTMENT AUTO SEED + // ------------------------------------------------------- + if err := permissions.SeedAdminRoleDepartments(pgDB); err != nil { + log.Println("❌ Admin dept seed failed:", err) + } else { + log.Println("✅ Admin dept permissions seeded") + } + + // ------------------------------------------------------- + // 🕵️ AUDIT LOG INIT + // ------------------------------------------------------- + auditlog.Init(pgDB, 1000) + log.Println("🕵️ AuditLog sistemi başlatıldı (buffer=1000)") + + // ------------------------------------------------------- + // ✉️ MAILER INIT + // ------------------------------------------------------- + graphMailer, err := mailer.NewGraphMailer() + if err != nil { + log.Fatalf("❌ Graph Mailer init error: %v", err) + } + log.Println("✉️ Graph Mailer hazır") + + // ------------------------------------------------------- + // 👤 DEBUG + // ------------------------------------------------------- + repository.NewUserRepository(pgDB).DebugListUsers() + + // ------------------------------------------------------- + // 🌍 SERVER + // ------------------------------------------------------- + router := InitRoutes(pgDB, db.MssqlDB, graphMailer) + + handler := enableCORS( + middlewares.GlobalAuthMiddleware( + pgDB, + middlewares.RequestLogger(router), + ), + ) + + log.Println("✅ Server çalışıyor: http://localhost:8080") + log.Fatal(http.ListenAndServe(":8080", handler)) +} diff --git a/svc/middlewares/auditlog_middleware.go b/svc/middlewares/auditlog_middleware.go new file mode 100644 index 0000000..d0cbd70 --- /dev/null +++ b/svc/middlewares/auditlog_middleware.go @@ -0,0 +1,71 @@ +package middlewares + +import ( + "bssapp-backend/auth" + "net/http" + "time" + + "bssapp-backend/internal/auditlog" +) + +type ResponseWriter struct { + http.ResponseWriter + status int +} + +func NewResponseWriter(w http.ResponseWriter) *ResponseWriter { + return &ResponseWriter{ + ResponseWriter: w, + status: http.StatusOK, + } +} + +func (rw *ResponseWriter) WriteHeader(code int) { + rw.status = code + rw.ResponseWriter.WriteHeader(code) +} + +func (rw *ResponseWriter) Status() int { return rw.status } + +func Audit(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + start := time.Now() + rw := NewResponseWriter(w) + + next.ServeHTTP(rw, r) + + // ✅ AuthMiddleware sonrası burada claims VAR + var dfusrID int64 + var username, roleCode string + + if claims, ok := auth.GetClaimsFromContext(r.Context()); ok && claims != nil { + dfusrID = int64(claims.ID) + username = claims.Username + roleCode = claims.RoleCode // token’da varsa + } + + entry := auditlog.ActivityLog{ + DfUsrID: dfusrID, + Username: username, + RoleCode: roleCode, + + ActionType: "route_access", + ActionCategory: "nav", + ActionTarget: r.URL.Path, + Description: r.Method + " " + r.URL.Path, + + IpAddress: r.RemoteAddr, + UserAgent: r.UserAgent(), + SessionID: "", + + RequestStartedAt: start, + RequestFinishedAt: time.Now(), + DurationMs: int(time.Since(start).Milliseconds()), + HttpStatus: rw.Status(), + IsSuccess: rw.Status() < 400, + } + + auditlog.Write(entry) + }) +} diff --git a/svc/middlewares/auth_middleware.go b/svc/middlewares/auth_middleware.go new file mode 100644 index 0000000..ff37dfa --- /dev/null +++ b/svc/middlewares/auth_middleware.go @@ -0,0 +1,39 @@ +package middlewares + +import ( + "bssapp-backend/auth" + "database/sql" + "log" + "net/http" + "strings" +) + +func AuthMiddleware(db *sql.DB, next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + authHeader := r.Header.Get("Authorization") + if authHeader == "" { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + + parts := strings.SplitN(authHeader, " ", 2) + if len(parts) != 2 || parts[0] != "Bearer" { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + + claims, err := auth.ValidateToken(parts[1]) + if err != nil { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + + // 🔥 BU SATIR ŞART + ctx := auth.WithClaims(r.Context(), claims) + + log.Printf("🔐 AUTH CTX SET user=%d role=%s", claims.ID, claims.RoleCode) + + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} diff --git a/svc/middlewares/authz_v2.go b/svc/middlewares/authz_v2.go new file mode 100644 index 0000000..4d347dd --- /dev/null +++ b/svc/middlewares/authz_v2.go @@ -0,0 +1,961 @@ +package middlewares + +import ( + "bssapp-backend/internal/authz" + "bssapp-backend/permissions" + "bytes" + "database/sql" + "encoding/json" + "io" + "log" + "net/http" + "strconv" + "strings" + "sync" + "time" + + "bssapp-backend/auth" + + "github.com/gorilla/mux" +) + +/* +AuthzGuardV2 +- module+action role permission check (mk_sys_role_permissions) +- optional scope checks (department / piyasa) via intersection: + user_allowed ∩ role_allowed +- cache with TTL + +Expected: +- AuthMiddleware runs before this and sets JWT claims in context. +- claims should contain RoleID and UserID. +*/ + +// ===================================================== +// 🔧 CONFIG / CONSTANTS +// ===================================================== + +const ( + defaultPermTTL = 60 * time.Second + defaultScopeTTL = 30 * time.Second + + maxBodyRead = 1 << 20 // 1MB +) + +// ===================================================== +// 🧠 CACHE +// ===================================================== + +type cacheItem struct { + val any + expires time.Time +} + +type ttlCache struct { + mu sync.RWMutex + ttl time.Duration + m map[string]cacheItem +} + +// ===================================================== +// 🌍 GLOBAL SCOPE CACHE (for invalidation) +// ===================================================== + +var globalScopeCache *ttlCache + +func newTTLCache(ttl time.Duration) *ttlCache { + return &ttlCache{ + ttl: ttl, + m: make(map[string]cacheItem), + } +} + +func (c *ttlCache) get(key string) (any, bool) { + now := time.Now() + c.mu.RLock() + item, ok := c.m[key] + c.mu.RUnlock() + if !ok { + return nil, false + } + if now.After(item.expires) { + // lazy delete + c.mu.Lock() + delete(c.m, key) + c.mu.Unlock() + return nil, false + } + return item.val, true +} + +func (c *ttlCache) set(key string, val any) { + c.mu.Lock() + c.m[key] = cacheItem{val: val, expires: time.Now().Add(c.ttl)} + c.mu.Unlock() +} + +// ===================================================== +// ✅ MAIN MIDDLEWARE +// ===================================================== + +type AuthzV2Options struct { + // If true, scope checks are attempted when scope can be extracted. + EnableScopeChecks bool + + // If true, when scope is required but cannot be extracted, deny. + // If false, when scope cannot be extracted, scope check is skipped. + StrictScope bool + + // Override TTLs (optional) + PermTTL time.Duration + ScopeTTL time.Duration + + // Custom extractors (optional). If nil, built-in extractors are used. + ExtractDepartmentCodes func(r *http.Request) []string + ExtractPiyasaCodes func(r *http.Request) []string + + // Decide whether this request should be treated as scope-sensitive. + // If nil, built-in heuristic is used. + IsScopeSensitive func(module string, r *http.Request) bool +} + +func AuthzGuardV2(pg *sql.DB, module string, action string) func(http.Handler) http.Handler { + return AuthzGuardV2WithOptions(pg, module, action, AuthzV2Options{ + EnableScopeChecks: true, + StrictScope: false, + }) +} + +func AuthzGuardV2WithOptions(pg *sql.DB, module string, action string, opt AuthzV2Options) func(http.Handler) http.Handler { + + permTTL := opt.PermTTL + if permTTL <= 0 { + permTTL = defaultPermTTL + } + scopeTTL := opt.ScopeTTL + if scopeTTL <= 0 { + scopeTTL = defaultScopeTTL + } + + permCache := newTTLCache(permTTL) + if globalScopeCache == nil { + globalScopeCache = newTTLCache(scopeTTL) + } + scopeCache := globalScopeCache + + // default extractors + extractDept := opt.ExtractDepartmentCodes + if extractDept == nil { + extractDept = defaultExtractDepartmentCodes + } + extractPiy := opt.ExtractPiyasaCodes + if extractPiy == nil { + extractPiy = defaultExtractPiyasaCodes + } + + isScopeSensitive := opt.IsScopeSensitive + if isScopeSensitive == nil { + isScopeSensitive = defaultIsScopeSensitive + } + + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + // OPTIONS passthrough + if r.Method == http.MethodOptions { + w.WriteHeader(http.StatusOK) + return + } + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", 401) + return + } + + userID := claims.ID + roleCode := claims.RoleCode + + // ADMIN BYPASS + if claims.IsAdmin() { + next.ServeHTTP(w, r) + return + } + + // resolve role_id from role_code + roleID, err := cachedRoleID(pg, permCache, roleCode) + if err != nil { + log.Println("❌ role resolve error:", err) + http.Error(w, "forbidden", http.StatusForbidden) + return + } + + // -------------------------------------------------- + // 🔐 PERMISSION RESOLUTION (USER > ROLE > DENY) + // -------------------------------------------------- + + permRepo := permissions.NewPermissionRepository(pg) + + allowed := false + resolved := false // karar verildi mi? + + // -------------------------------------------------- + // 1️⃣ USER OVERRIDE (ÖNCELİK) + // -------------------------------------------------- + + overrides, err := permRepo.GetUserOverrides(userID) + if err != nil { + log.Println("❌ override load error:", err) + http.Error(w, "forbidden", http.StatusForbidden) + return + } + + for _, o := range overrides { + + if o.Module == module && + o.Action == action { + + log.Printf( + "🔁 USER OVERRIDE → %s:%s = %v", + module, + action, + o.Allowed, + ) + + allowed = o.Allowed + resolved = true + break + } + } + + // -------------------------------------------------- + // 2️⃣ ROLE + DEPARTMENT (NEW SYSTEM) + // -------------------------------------------------- + + if !resolved { + + deptCodes := claims.DepartmentCodes + + roleDeptAllowed, err := permRepo.ResolvePermissionChain( + userID, + roleID, + deptCodes, + module, + action, + ) + + if err != nil { + log.Println("❌ perm resolve error:", err) + http.Error(w, "forbidden", http.StatusForbidden) + return + } + + if roleDeptAllowed { + + log.Printf("🆕 ROLE+DEPT → %s:%s = true", module, action) + + allowed = true + resolved = true + + } else { + + log.Printf("🆕 ROLE+DEPT → %s:%s = false (try legacy)", module, action) + } + } + // -------------------------------------------------- + // 3️⃣ ROLE ONLY (LEGACY FALLBACK) + // -------------------------------------------------- + + if !resolved { + + legacyAllowed, err := cachedRolePermission( + pg, + permCache, + roleID, + module, + action, + ) + + if err != nil { + log.Println("❌ legacy perm error:", err) + http.Error(w, "forbidden", http.StatusForbidden) + return + } + + log.Printf("🕰️ LEGACY ROLE → %s:%s = %v", module, action, legacyAllowed) + + allowed = legacyAllowed + resolved = true + } + + // -------------------------------------------------- + // 3️⃣ FINAL DECISION + // -------------------------------------------------- + + if !allowed { + + log.Printf( + "⛔ ACCESS DENIED user=%d %s:%s path=%s", + claims.ID, + module, + action, + r.URL.Path, + ) + + http.Error(w, "forbidden", http.StatusForbidden) + return + } + + log.Printf( + "✅ ACCESS OK user=%d %s:%s %s", + claims.ID, + module, + action, + r.URL.Path, + ) + + // -------------------------------------------------- + // 4️⃣ OPTIONAL SCOPE CHECKS (FINAL - SECURE) + // -------------------------------------------------- + + if opt.EnableScopeChecks && isScopeSensitive(module, r) { + + // 🔹 Request’ten gelenler + reqDepts := normalizeCodes(extractDept(r)) + reqPiy := normalizeCodes(extractPiy(r)) + + ctx := r.Context() + + // 🔹 USER PIYASA (DB’den) + userPiy, err := authz.GetUserPiyasaCodes(pg, int(userID)) + if err != nil { + log.Println("❌ piyasa load error:", err) + http.Error(w, "forbidden", 403) + return + } + + userPiy = normalizeCodes(userPiy) + + // ------------------------------------------------ + // ✅ PIYASA INTERSECTION + // ------------------------------------------------ + + var effectivePiy []string + + switch { + case len(reqPiy) > 0 && len(userPiy) > 0: + effectivePiy = intersect(reqPiy, userPiy) + + case len(reqPiy) > 0 && len(userPiy) == 0: + // user piyasa tanımlı değilse request'e güvenme → boş kalsın (StrictScope varsa deny) + effectivePiy = nil + + case len(reqPiy) == 0 && len(userPiy) > 0: + effectivePiy = userPiy + } + if len(reqPiy) > 0 && len(effectivePiy) == 0 { + // request piyasa istiyor ama user scope karşılamıyor + http.Error(w, "forbidden", http.StatusForbidden) + return + } + + // ------------------------------------------------ + // ✅ CONTEXT’E YAZ + // ------------------------------------------------ + + if len(reqDepts) > 0 { + ctx = authz.WithDeptCodes(ctx, reqDepts) + } + + if len(effectivePiy) > 0 { + ctx = authz.WithPiyasaCodes(ctx, effectivePiy) + } + + r = r.WithContext(ctx) + + // ------------------------------------------------ + // ❗ STRICT MODE + // ------------------------------------------------ + + if len(reqDepts) == 0 && len(effectivePiy) == 0 { + + if opt.StrictScope { + http.Error(w, "forbidden", http.StatusForbidden) + return + } + + next.ServeHTTP(w, r) + return + } + + // ------------------------------------------------ + // 🔍 DEPARTMENT CHECK + // ------------------------------------------------ + + if len(reqDepts) > 0 { + + okDept, err := cachedDeptIntersectionAny( + pg, + scopeCache, + userID, + roleID, + reqDepts, + ) + + if err != nil { + log.Println("❌ dept scope error:", err) + http.Error(w, "forbidden", http.StatusForbidden) + return + } + + if !okDept { + http.Error(w, "forbidden", http.StatusForbidden) + return + } + } + + // ------------------------------------------------ + // 🔍 PIYASA CHECK + // ------------------------------------------------ + + if len(effectivePiy) > 0 { + + okPiy, err := cachedPiyasaIntersectionAny( + pg, + scopeCache, + userID, + roleID, + effectivePiy, + ) + + if err != nil { + log.Println("❌ piyasa scope error:", err) + http.Error(w, "forbidden", http.StatusForbidden) + return + } + + if !okPiy { + http.Error(w, "forbidden", http.StatusForbidden) + return + } + } + } + + // -------------------------------------------------- + // ✅ ALLOW + // -------------------------------------------------- + + next.ServeHTTP(w, r) + }) + } +} + +// ===================================================== +// 🔐 PERMISSION CHECK (mk_sys_role_permissions) +// ===================================================== + +func cachedRolePermission(pg *sql.DB, c *ttlCache, roleID int64, module, action string) (bool, error) { + + key := "perm|" + itoa(roleID) + "|" + module + "|" + action + if v, ok := c.get(key); ok { + return v.(bool), nil + } + + var allowed bool + err := pg.QueryRow(` + SELECT allowed + FROM mk_sys_role_permissions + WHERE role_id = $1 AND module_code = $2 AND action = $3 + `, roleID, module, action).Scan(&allowed) + + if err == sql.ErrNoRows { + c.set(key, false) + return false, nil + } + if err != nil { + return false, err + } + + c.set(key, allowed) + return allowed, nil +} + +// ===================================================== +// 🧩 SCOPE INTERSECTION +// user scope ∩ role scope +// ===================================================== + +func cachedDeptIntersectionAny(pg *sql.DB, c *ttlCache, userID, roleID int64, deptCodes []string) (bool, error) { + // cache by exact request list (sorted would be ideal; normalizeCodes already stabilizes somewhat) + key := "deptAny|" + itoa(userID) + "|" + itoa(roleID) + "|" + strings.Join(deptCodes, ",") + if v, ok := c.get(key); ok { + return v.(bool), nil + } + + // ANY match: if request wants multiple codes, allow if at least one is in intersection + // Intersection query: + // user departments: dfusr_dprt -> mk_dprt(code) + // role allowed: dfrole_dprt -> mk_dprt(id) OR directly by id + okAny := false + + // We do it in a single query with ANY($3) + var dummy int + err := pg.QueryRow(` + SELECT 1 + FROM dfusr_dprt ud + JOIN mk_dprt d ON d.id = ud.dprt_id + JOIN dfrole_dprt rd ON rd.dprt_id = ud.dprt_id + WHERE ud.dfusr_id = $1 + AND rd.dfrole_id = $2 + AND ud.is_active = true + AND rd.is_allowed = true + AND d.code = ANY($3) + LIMIT 1 + `, userID, roleID, pqArray(deptCodes)).Scan(&dummy) + + if err == sql.ErrNoRows { + c.set(key, false) + return false, nil + } + if err != nil { + return false, err + } + + okAny = true + c.set(key, okAny) + return okAny, nil +} + +func cachedPiyasaIntersectionAny(pg *sql.DB, c *ttlCache, userID, roleID int64, piyasaCodes []string) (bool, error) { + + key := "piyAny|" + itoa(userID) + "|" + itoa(roleID) + "|" + strings.Join(piyasaCodes, ",") + if v, ok := c.get(key); ok { + return v.(bool), nil + } + + var dummy int + err := pg.QueryRow(` + SELECT 1 + FROM dfusr_piyasa up + WHERE up.dfusr_id = $1 + AND up.is_allowed = true + AND up.piyasa_code = ANY($2) + LIMIT 1 + `, userID, pqArray(piyasaCodes)).Scan(&dummy) + + if err == sql.ErrNoRows { + c.set(key, false) + return false, nil + } + if err != nil { + return false, err + } + + c.set(key, true) + return true, nil +} + +// ===================================================== +// 🧲 DEFAULT SCOPE DETECTION +// ===================================================== + +// defaultIsScopeSensitive decides whether this module likely needs dept/piyasa checks. +// You can tighten/extend later. +func defaultIsScopeSensitive(module string, r *http.Request) bool { + switch module { + case "order", "customer", "report", "finance": + return true + default: + return false + } +} + +// ===================================================== +// 🔎 DEFAULT EXTRACTORS +// ===================================================== + +// We try to extract scope from: +// - query params: dprt, dprt_code, department, department_code, piyasa, piyasa_code, market +// - headers: X-Department, X-Piyasa +// - json body fields: department / department_code / dprt_code, piyasa / piyasa_code / market_code +// (body read is safe: we re-inject the body) +func defaultExtractDepartmentCodes(r *http.Request) []string { + var out []string + + // query params + for _, k := range []string{"dprt", "dprt_code", "department", "department_code"} { + out = append(out, splitCSV(r.URL.Query().Get(k))...) + } + + // headers + out = append(out, splitCSV(r.Header.Get("X-Department"))...) + + // JSON body (if any) + out = append(out, extractFromJSONBody(r, []string{ + "department", "department_code", "dprt", "dprt_code", + })...) + + return out +} + +func defaultExtractPiyasaCodes(r *http.Request) []string { + var out []string + + for _, k := range []string{"piyasa", "piyasa_code", "market", "market_code"} { + out = append(out, splitCSV(r.URL.Query().Get(k))...) + } + + out = append(out, splitCSV(r.Header.Get("X-Piyasa"))...) + + out = append(out, extractFromJSONBody(r, []string{ + "piyasa", "piyasa_code", "market", "market_code", "customer_attribute", + })...) + + return out +} + +func extractFromJSONBody(r *http.Request, keys []string) []string { + // Only for methods that might have body + switch r.Method { + case http.MethodPost, http.MethodPut, http.MethodPatch: + default: + return nil + } + + // read body (and restore) + raw, err := readBodyAndRestore(r, maxBodyRead) + if err != nil || len(raw) == 0 { + return nil + } + + // try parse object + var obj map[string]any + if err := json.Unmarshal(raw, &obj); err != nil { + return nil + } + + var out []string + for _, k := range keys { + if v, ok := obj[k]; ok { + switch t := v.(type) { + case string: + out = append(out, splitCSV(t)...) + case []any: + for _, it := range t { + if s, ok := it.(string); ok { + out = append(out, splitCSV(s)...) + } + } + } + } + } + + return out +} + +func readBodyAndRestore(r *http.Request, limit int64) ([]byte, error) { + if r.Body == nil { + return nil, nil + } + + // Read with limit + raw, err := io.ReadAll(io.LimitReader(r.Body, limit)) + if err != nil { + return nil, err + } + + // restore + r.Body = io.NopCloser(bytes.NewBuffer(raw)) + return raw, nil +} + +// ===================================================== +// 🧼 HELPERS +// ===================================================== + +func splitCSV(s string) []string { + s = strings.TrimSpace(s) + if s == "" { + return nil + } + parts := strings.Split(s, ",") + out := make([]string, 0, len(parts)) + for _, p := range parts { + p = strings.TrimSpace(p) + if p != "" { + out = append(out, p) + } + } + return out +} + +func normalizeCodes(in []string) []string { + if len(in) == 0 { + return nil + } + seen := map[string]struct{}{} + out := make([]string, 0, len(in)) + for _, s := range in { + s = strings.ToUpper(strings.TrimSpace(s)) + if s == "" { + continue + } + if _, ok := seen[s]; ok { + continue + } + seen[s] = struct{}{} + out = append(out, s) + } + return out +} + +// pqArray: minimal adapter to pass []string as Postgres array. +// If you already use lib/pq, replace this with pq.Array. +// Here we use a simple JSON array -> Postgres can cast text[] from ARRAY[]? Not directly. +// So: YOU SHOULD USE lib/pq in your project. If it's already there, change pqArray() to pq.Array(slice). +// +// For now, we implement as a driver.Value using "{A,B}" format (Postgres text[] literal). +type pgTextArray string + +func (a pgTextArray) Value() (any, error) { return string(a), nil } + +func pqArray(ss []string) any { + // produce "{A,B,C}" as text[] literal + // escape quotes minimally + if len(ss) == 0 { + return pgTextArray("{}") + } + var b strings.Builder + b.WriteString("{") + for i, s := range ss { + if i > 0 { + b.WriteString(",") + } + s = strings.ReplaceAll(s, `"`, `\"`) + b.WriteString(`"`) + b.WriteString(s) + b.WriteString(`"`) + } + b.WriteString("}") + return pgTextArray(b.String()) +} + +func itoa(n int64) string { + return strconv.FormatInt(n, 10) +} + +// isolate strconv usage without importing it globally in this snippet +func strconvFormatInt(n int64) string { + // local minimal + // NOTE: in real code just import strconv and use strconv.FormatInt(n, 10) + if n == 0 { + return "0" + } + neg := n < 0 + if neg { + n = -n + } + var buf [32]byte + i := len(buf) + for n > 0 { + i-- + buf[i] = byte('0' + (n % 10)) + n /= 10 + } + if neg { + i-- + buf[i] = '-' + } + return string(buf[i:]) +} + +// optional: allow passing scope explicitly from handlers via context (advanced use) +type scopeKey string + +// ===================================================== +// 🔍 ROLE RESOLVER (code -> id) WITH CACHE +// ===================================================== + +func cachedRoleID(pg *sql.DB, c *ttlCache, roleCode string) (int64, error) { + + key := "role|" + strings.ToLower(roleCode) + + if v, ok := c.get(key); ok { + return v.(int64), nil + } + + var id int64 + + err := pg.QueryRow(` + SELECT id + FROM dfrole + WHERE LOWER(code) = LOWER($1) + `, roleCode).Scan(&id) + + if err != nil { + return 0, err + } + + c.set(key, id) + return id, nil +} + +// ===================================================== +// 🧹 CACHE INVALIDATION (ADMIN) +// ===================================================== + +func ClearAuthzScopeCacheForUser(userID int64) { + + // NOTE: this clears ALL scope cache. + // Simple & safe. Optimize later if needed. + + if globalScopeCache != nil { + globalScopeCache.mu.Lock() + defer globalScopeCache.mu.Unlock() + + for k := range globalScopeCache.m { + if strings.Contains(k, "|"+itoa(userID)+"|") { + delete(globalScopeCache.m, k) + } + } + } +} + +// intersect: A ∩ B +func intersect(a, b []string) []string { + + set := make(map[string]struct{}, len(a)) + + for _, v := range a { + set[v] = struct{}{} + } + + var out []string + + for _, v := range b { + if _, ok := set[v]; ok { + out = append(out, v) + } + } + + return out +} +func AuthzGuardByRoute(pg *sql.DB) func(http.Handler) http.Handler { + + return func(next http.Handler) http.Handler { + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + // ===================================================== + // 0️⃣ OPTIONS → PASS (CORS preflight) + // ===================================================== + if r.Method == http.MethodOptions { + next.ServeHTTP(w, r) + return + } + + // ===================================================== + // 1️⃣ AUTH + // ===================================================== + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + // ===================================================== + // 2️⃣ REAL ROUTE TEMPLATE ( /api/users/{id} ) + // ===================================================== + route := mux.CurrentRoute(r) + + if route == nil { + log.Printf("❌ AUTHZ: route not resolved: %s %s", + r.Method, r.URL.Path, + ) + + http.Error(w, "route not resolved", 403) + return + } + + pathTemplate, err := route.GetPathTemplate() + if err != nil { + log.Printf("❌ AUTHZ: path template error: %v", err) + + http.Error(w, "route template error", 403) + return + } + + // ===================================================== + // 3️⃣ ROUTE LOOKUP (path + method) + // ===================================================== + var module, action string + + err = pg.QueryRow(` + SELECT module_code, action + FROM mk_sys_routes + WHERE path = $1 + AND method = $2 + `, + pathTemplate, + r.Method, + ).Scan(&module, &action) + + if err != nil { + + log.Printf( + "❌ AUTHZ: route not registered: %s %s", + r.Method, + pathTemplate, + ) + + http.Error(w, "route permission not found", 403) + return + } + + // ===================================================== + // 4️⃣ PERMISSION RESOLVE + // ===================================================== + repo := permissions.NewPermissionRepository(pg) + + allowed, err := repo.ResolvePermissionChain( + int64(claims.ID), + int64(claims.RoleID), + claims.DepartmentCodes, + module, + action, + ) + + if err != nil { + + log.Printf( + "❌ AUTHZ: resolve error user=%d %s:%s err=%v", + claims.ID, + module, + action, + err, + ) + + http.Error(w, "forbidden", 403) + return + } + + if !allowed { + + log.Printf( + "⛔ AUTHZ: denied user=%d %s:%s", + claims.ID, + module, + action, + ) + + http.Error(w, "forbidden", 403) + return + } + + // ===================================================== + // 5️⃣ PASS + // ===================================================== + next.ServeHTTP(w, r) + }) + } +} diff --git a/svc/middlewares/current_user.go b/svc/middlewares/current_user.go new file mode 100644 index 0000000..825350f --- /dev/null +++ b/svc/middlewares/current_user.go @@ -0,0 +1,24 @@ +package middlewares + +import ( + "bssapp-backend/auth" + "bssapp-backend/models" + "bssapp-backend/utils" + "net/http" +) + +func CurrentUser(r *http.Request) (*models.User, bool) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + + if !ok || claims == nil { + return nil, false + } + + user := utils.UserFromClaims(claims) + if user == nil { + return nil, false + } + + return user, true +} diff --git a/svc/middlewares/force_password_change.go b/svc/middlewares/force_password_change.go new file mode 100644 index 0000000..91354df --- /dev/null +++ b/svc/middlewares/force_password_change.go @@ -0,0 +1,66 @@ +package middlewares + +import ( + "bssapp-backend/auth" + "database/sql" + "log" + "net/http" + "strings" +) + +// 🔓 force_password_change=true iken izinli endpoint prefixleri +var passwordChangeAllowlist = []string{ + "/api/password/change", + "/api/password/reset", + "/api/password/reset/validate", + "/api/auth/refresh", +} + +func ForcePasswordChangeGuard(db *sql.DB) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + log.Println("❌ FPC GUARD: claims NOT FOUND") + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + + log.Printf( + "🛡️ FPC GUARD user=%s force=%v path=%s", + claims.Username, + claims.ForcePasswordChange, + r.URL.Path, + ) + + // 🔓 Şifre değişimi zorunlu DEĞİL → serbest + if !claims.ForcePasswordChange { + next.ServeHTTP(w, r) + return + } + + // 🔐 Şifre değişimi ZORUNLU → allowlist kontrolü + for _, allowed := range passwordChangeAllowlist { + if strings.HasPrefix(r.URL.Path, allowed) { + log.Printf( + "✅ FPC GUARD PASS user=%s path=%s", + claims.Username, + r.URL.Path, + ) + next.ServeHTTP(w, r) + return + } + } + + // ⛔ Zorunlu ama yanlış endpoint + log.Printf( + "⛔ FPC GUARD BLOCK user=%s path=%s", + claims.Username, + r.URL.Path, + ) + + http.Error(w, "password change required", http.StatusUnauthorized) + }) + } +} diff --git a/svc/middlewares/global_auth.go b/svc/middlewares/global_auth.go new file mode 100644 index 0000000..b962993 --- /dev/null +++ b/svc/middlewares/global_auth.go @@ -0,0 +1,58 @@ +package middlewares + +import ( + "bssapp-backend/auth" + "log" + "net/http" + "strings" +) + +var publicPaths = []string{ + "/api/auth/login", + "/api/auth/refresh", + "/api/password/forgot", + "/api/password/reset", +} + +func GlobalAuthMiddleware(db any, next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + path := r.URL.Path + + // PUBLIC ROUTES + for _, p := range publicPaths { + if strings.HasPrefix(path, p) { + next.ServeHTTP(w, r) + return + } + } + + // JWT + authHeader := r.Header.Get("Authorization") + if authHeader == "" { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + + parts := strings.SplitN(authHeader, " ", 2) + if len(parts) != 2 || parts[0] != "Bearer" { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + + claims, err := auth.ValidateToken(parts[1]) + if err != nil { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + + ctx := auth.WithClaims(r.Context(), claims) + + log.Printf("🔐 GLOBAL AUTH user=%d role=%s", + claims.ID, + claims.RoleCode, + ) + + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} diff --git a/svc/middlewares/helpers.go b/svc/middlewares/helpers.go new file mode 100644 index 0000000..1de99d9 --- /dev/null +++ b/svc/middlewares/helpers.go @@ -0,0 +1,56 @@ +package middlewares + +import ( + "bssapp-backend/auth" + "bssapp-backend/ctxkeys" + "context" +) + +func getClaims(ctx context.Context) *auth.Claims { + if v := ctx.Value(ctxkeys.UserContextKey); v != nil { + if c, ok := v.(*auth.Claims); ok { + return c + } + } + return nil +} + +// -------------------------------------------------- +// 🔐 SESSION +// -------------------------------------------------- +func GetSessionID(ctx context.Context) string { + if c := getClaims(ctx); c != nil { + return c.SessionID + } + return "" +} + +// -------------------------------------------------- +// 🔑 USER ID (mk_dfusr.id) +// -------------------------------------------------- +func GetUserID(ctx context.Context) int64 { + if c := getClaims(ctx); c != nil { + return c.ID + } + return 0 +} + +// -------------------------------------------------- +// 👤 USERNAME +// -------------------------------------------------- +func GetUsername(ctx context.Context) string { + if c := getClaims(ctx); c != nil { + return c.Username + } + return "" +} + +// -------------------------------------------------- +// 🧩 ROLE +// -------------------------------------------------- +func GetRoleCode(ctx context.Context) string { + if c := getClaims(ctx); c != nil && c.RoleCode != "" { + return c.RoleCode + } + return "public" +} diff --git a/svc/middlewares/rate_limit.go b/svc/middlewares/rate_limit.go new file mode 100644 index 0000000..be0a884 --- /dev/null +++ b/svc/middlewares/rate_limit.go @@ -0,0 +1,59 @@ +package middlewares + +import ( + "net" + "net/http" + "sync" + "time" +) + +type rateEntry struct { + Count int + ExpiresAt time.Time +} + +var ( + rateMu sync.Mutex + rateDB = make(map[string]*rateEntry) +) + +func RateLimit(keyFn func(*http.Request) string, limit int, window time.Duration) func(http.Handler) http.Handler { + + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + key := keyFn(r) + now := time.Now() + + rateMu.Lock() + e, ok := rateDB[key] + if !ok || now.After(e.ExpiresAt) { + e = &rateEntry{ + Count: 0, + ExpiresAt: now.Add(window), + } + rateDB[key] = e + } + + e.Count++ + if e.Count > limit { + rateMu.Unlock() + http.Error(w, "Too many requests", http.StatusTooManyRequests) + return + } + rateMu.Unlock() + + next.ServeHTTP(w, r) + }) + } +} + +// helpers +func RateByIP(r *http.Request) string { + ip, _, _ := net.SplitHostPort(r.RemoteAddr) + return "ip:" + ip +} + +func RateByUser(r *http.Request) string { + return "user:" + r.URL.Path // id path’ten okunabilir +} diff --git a/svc/middlewares/request_logger.go b/svc/middlewares/request_logger.go new file mode 100644 index 0000000..bd8e4f6 --- /dev/null +++ b/svc/middlewares/request_logger.go @@ -0,0 +1,108 @@ +package middlewares + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/auditlog" + "log" + "net" + "net/http" + "time" +) + +type statusWriter struct { + http.ResponseWriter + status int +} + +func (w *statusWriter) WriteHeader(code int) { + w.status = code + w.ResponseWriter.WriteHeader(code) +} + +func RequestLogger(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + start := time.Now() + + sw := &statusWriter{ + ResponseWriter: w, + status: 200, + } + + // ---------- CLAIMS ---------- + claims, _ := auth.GetClaimsFromContext(r.Context()) + + // ---------- IP ---------- + ip := r.RemoteAddr + if host, _, err := net.SplitHostPort(ip); err == nil { + ip = host + } + + // ---------- UA ---------- + ua := r.UserAgent() + + // ---------- SESSION ---------- + sessionID := "" + if claims != nil { + sessionID = claims.SessionID + } + + hasAuth := r.Header.Get("Authorization") != "" + + log.Printf("➡️ %s %s | auth=%v", r.Method, r.URL.Path, hasAuth) + + // ---------- RUN ---------- + next.ServeHTTP(sw, r) + + finish := time.Now() + dur := int(finish.Sub(start).Milliseconds()) + + log.Printf("⬅️ %s %s | status=%d | %s", r.Method, r.URL.Path, sw.status, time.Since(start)) + + // ---------- AUDIT (route_access) ---------- + al := auditlog.ActivityLog{ + ActionType: "route_access", + ActionCategory: "nav", + ActionTarget: r.URL.Path, + Description: r.Method + " " + r.URL.Path, + + IpAddress: ip, + UserAgent: ua, + SessionID: sessionID, + + RequestStartedAt: start, + RequestFinishedAt: finish, + DurationMs: dur, + HttpStatus: sw.status, + + IsSuccess: sw.status < 400, + } + + // ---------- CLAIMS → LOG ---------- + if claims != nil { + al.Username = claims.Username + al.RoleCode = claims.RoleCode + al.DfUsrID = int64(claims.ID) + + // Eğer claims içinde UUID varsa ekle (sende varsa aç) + // al.UserID = claims.UserUUID + } else { + al.RoleCode = "public" + } + + // ---------- ERROR ---------- + if sw.status >= 400 { + al.ErrorMessage = http.StatusText(sw.status) + } + + // ✅ ESKİ: auditlog.Write(al) + // ✅ YENİ: + auditlog.Enqueue(r.Context(), al) + + if claims == nil { + log.Println("⚠️ LOGGER: claims is NIL") + } else { + log.Printf("✅ LOGGER CLAIMS user=%s role=%s id=%d", claims.Username, claims.RoleCode, claims.ID) + } + }) +} diff --git a/svc/models/NewOrderNumberResponse.go b/svc/models/NewOrderNumberResponse.go new file mode 100644 index 0000000..6d5a908 --- /dev/null +++ b/svc/models/NewOrderNumberResponse.go @@ -0,0 +1,6 @@ +package models + +type NewOrderNumberResponse struct { + OrderHeaderID string `json:"OrderHeaderID"` + OrderNumber string `json:"OrderNumber"` +} diff --git a/svc/models/account.go b/svc/models/account.go new file mode 100644 index 0000000..f1d5edb --- /dev/null +++ b/svc/models/account.go @@ -0,0 +1,8 @@ +package models + +// Cari hesap modeli +type Account struct { + DisplayCode string `json:"display_code"` // "ZLA 0127" + AccountCode string `json:"account_code"` // "ZLA0127" + AccountName string `json:"account_name"` // "EKO TEXTIL COM SRL" ya da "" +} diff --git a/svc/models/custom_time.go b/svc/models/custom_time.go new file mode 100644 index 0000000..50ee9fb --- /dev/null +++ b/svc/models/custom_time.go @@ -0,0 +1,45 @@ +package models + +import ( + "database/sql" + "strings" + "time" +) + +type CustomTime struct { + sql.NullTime +} + +func (ct *CustomTime) UnmarshalJSON(b []byte) error { + s := strings.Trim(string(b), `"`) + if s == "" || s == "null" { + ct.Valid = false + return nil + } + + // DESTEKLENEN TÜM FORMATLAR + layouts := []string{ + time.RFC3339, // 2025-11-21T00:10:27Z + "2006-01-02T15:04:05", // 2025-11-21T00:10:27 + "2006-01-02 15:04:05", // 2025-11-21 00:10:27 ← FRONTEND FORMATIN! + } + + for _, layout := range layouts { + if t, err := time.Parse(layout, s); err == nil { + ct.Time = t + ct.Valid = true + return nil + } + } + + // Hâlâ parse edemediyse → invalid kabul et + ct.Valid = false + return nil +} + +func (ct CustomTime) MarshalJSON() ([]byte, error) { + if ct.Valid { + return []byte(`"` + ct.Time.Format("2006-01-02 15:04:05") + `"`), nil + } + return []byte(`null`), nil +} diff --git a/svc/models/customerlist.go b/svc/models/customerlist.go new file mode 100644 index 0000000..07eda1e --- /dev/null +++ b/svc/models/customerlist.go @@ -0,0 +1,13 @@ +// models/customerlist.go +package models + +type CustomerList struct { + CurrAccTypeCode int `json:"CurrAccTypeCode"` // 🆕 FK için lazım + Cari_Kod string `json:"Cari_Kod"` + Cari_Ad string `json:"Cari_Ad"` + Musteri_Ana_Grubu string `json:"Musteri_Ana_Grubu"` + Piyasa string `json:"Piyasa"` + Musteri_Temsilcisi string `json:"Musteri_Temsilcisi"` + Ulke string `json:"Ulke"` + Doviz_cinsi string `json:"Doviz_Cinsi"` +} diff --git a/svc/models/invalid_variant.go b/svc/models/invalid_variant.go new file mode 100644 index 0000000..c6b9a42 --- /dev/null +++ b/svc/models/invalid_variant.go @@ -0,0 +1,13 @@ +package models + +type InvalidVariant struct { + Index int `json:"index"` + ClientKey string `json:"clientKey"` + ItemCode string `json:"itemCode"` + ColorCode string `json:"colorCode"` + Dim1 string `json:"dim1"` + Dim2 string `json:"dim2"` + Qty1 float64 `json:"qty1"` + ComboKey string `json:"comboKey,omitempty"` + Reason string `json:"reason,omitempty"` +} diff --git a/svc/models/mk_user.go b/svc/models/mk_user.go new file mode 100644 index 0000000..da7a4bf --- /dev/null +++ b/svc/models/mk_user.go @@ -0,0 +1,57 @@ +package models + +import "time" + +type MkUser struct { + // ================================================== + // 🔑 PRIMARY ID (mk_dfusr.id) + // ================================================== + ID int64 `json:"id"` // mk_dfusr.id + RoleID int64 `json:"role_id"` + + // ================================================== + // 🔁 LEGACY DFUSR (opsiyonel – migrate/debug) + // ================================================== + LegacyDfUsrID *int64 `json:"legacy_dfusr_id,omitempty"` + + // ================================================== + // 👤 CORE + // ================================================== + Username string `json:"username"` + FullName string `json:"full_name"` + Email string `json:"email"` + Mobile string `json:"mobile"` + IsActive bool `json:"is_active"` + + // ================================================== + // 🔐 AUTH + // ================================================== + PasswordHash string `json:"-"` + ForcePasswordChange bool `json:"force_password_change"` + PasswordUpdatedAt *time.Time `json:"password_updated_at,omitempty"` + SessionID string `json:"session_id"` + + // ================================================== + // 🧩 ROLE + // ================================================== + RoleCode string `json:"role_code"` + + // ================================================== + // 🧾 NEBIM + // ================================================== + V3Username string `json:"v3_username"` + V3UserGroup string `json:"v3_usergroup"` + + // ================================================== + // 🏭 RUNTIME SCOPES + // ================================================== + DepartmentCodes []string `json:"departments"` + PiyasaCodes []string `json:"piyasalar"` + + // ================================================== + // ⏱ AUDIT + // ================================================== + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + LastLoginAt *time.Time `json:"last_login_at,omitempty"` +} diff --git a/svc/models/modelcombo_error.go b/svc/models/modelcombo_error.go new file mode 100644 index 0000000..9a97f3e --- /dev/null +++ b/svc/models/modelcombo_error.go @@ -0,0 +1,16 @@ +// models/errors.go +package models + +type ValidationError struct { + Code string `json:"code"` + Message string `json:"message"` + ClientKey string `json:"clientKey,omitempty"` + ItemCode string `json:"itemCode,omitempty"` + ColorCode string `json:"colorCode,omitempty"` + Dim1 string `json:"dim1,omitempty"` + Dim2 string `json:"dim2,omitempty"` +} + +func (e *ValidationError) Error() string { + return e.Message +} diff --git a/svc/models/null_uuid.go b/svc/models/null_uuid.go new file mode 100644 index 0000000..f380e3c --- /dev/null +++ b/svc/models/null_uuid.go @@ -0,0 +1,120 @@ +package models + +import ( + "database/sql/driver" + "encoding/json" + "strings" +) + +// ============================================================ +// 🔹 NullUUID — MSSQL UNIQUEIDENTIFIER için nullable tip +// ============================================================ +type NullUUID struct { + UUID string `json:"UUID"` + Valid bool `json:"Valid"` +} + +// ------------------------------------------------------------ +// +// SQL Valuer (INSERT/UPDATE parametresi) +// +// ------------------------------------------------------------ +func (n NullUUID) Value() (driver.Value, error) { + if !n.Valid || strings.TrimSpace(n.UUID) == "" { + return nil, nil + } + return n.UUID, nil +} + +// ------------------------------------------------------------ +// +// SQL Scanner (SELECT sonucu) +// +// ------------------------------------------------------------ +func (n *NullUUID) Scan(value interface{}) error { + if value == nil { + n.UUID = "" + n.Valid = false + return nil + } + + switch v := value.(type) { + case string: + n.UUID = v + n.Valid = true + case []byte: + n.UUID = string(v) + n.Valid = true + default: + n.UUID = "" + n.Valid = false + } + return nil +} + +// ------------------------------------------------------------ +// +// JSON Marshal — Go → JSON +// Null ise: null +// Değer varsa: "guid-string" +// +// ------------------------------------------------------------ +func (n NullUUID) MarshalJSON() ([]byte, error) { + if !n.Valid || strings.TrimSpace(n.UUID) == "" { + return []byte("null"), nil + } + return json.Marshal(n.UUID) +} + +// ------------------------------------------------------------ +// +// JSON Unmarshal — JSON → Go +// Kabul ettiği formatlar: +// • null +// • "guid-string" +// • {"UUID":"...","Valid":true} (ileride istersen) +// +// ------------------------------------------------------------ +func (n *NullUUID) UnmarshalJSON(data []byte) error { + s := strings.TrimSpace(string(data)) + + // null veya boş + if s == "null" || s == "" { + n.UUID = "" + n.Valid = false + return nil + } + + // Önce string gibi dene: "guid" + var str string + if err := json.Unmarshal(data, &str); err == nil { + str = strings.TrimSpace(str) + if str == "" { + n.UUID = "" + n.Valid = false + } else { + n.UUID = str + n.Valid = true + } + return nil + } + + // Objeyse: { "UUID":"...", "Valid":true } + var aux struct { + UUID string `json:"UUID"` + Valid bool `json:"Valid"` + } + if err := json.Unmarshal(data, &aux); err != nil { + return err + } + + aux.UUID = strings.TrimSpace(aux.UUID) + if aux.UUID == "" || !aux.Valid { + n.UUID = "" + n.Valid = false + } else { + n.UUID = aux.UUID + n.Valid = true + } + return nil +} diff --git a/svc/models/order_pdf.go b/svc/models/order_pdf.go new file mode 100644 index 0000000..189a724 --- /dev/null +++ b/svc/models/order_pdf.go @@ -0,0 +1,54 @@ +package models + +// =============================== +// 🔹 ORDER HEADER (PDF için) +// =============================== +type OrderHeaderPDF struct { + OrderHeaderID string `json:"OrderHeaderID"` + OrderNumber string `json:"OrderNumber"` + CurrAccCode string `json:"CurrAccCode"` + CariAdi string `json:"CariAdi"` + OrderDate string `json:"OrderDate"` // yyyy-MM-dd + AverageDueDate string `json:"AverageDueDate"` // Termin + Description string `json:"Description"` +} + +// =============================== +// 🔹 ORDER LINE (PDF için) +// =============================== +type OrderLinePDF struct { + OrderLineID string `json:"OrderLineID"` + OrderHeaderID string `json:"OrderHeaderID"` + + Model string `json:"Model"` + Renk string `json:"Renk"` + Renk2 string `json:"Renk2"` + AnaGrup string `json:"AnaGrup"` + AltGrup string `json:"AltGrup"` + Aciklama string `json:"Aciklama"` + + Fiyat float64 `json:"Fiyat"` + Adet float64 `json:"Adet"` + Tutar float64 `json:"Tutar"` + PB string `json:"PB"` + + TerminTarihi string `json:"TerminTarihi"` + + // 16 beden alanı + Size1 float64 `json:"Size1"` + Size2 float64 `json:"Size2"` + Size3 float64 `json:"Size3"` + Size4 float64 `json:"Size4"` + Size5 float64 `json:"Size5"` + Size6 float64 `json:"Size6"` + Size7 float64 `json:"Size7"` + Size8 float64 `json:"Size8"` + Size9 float64 `json:"Size9"` + Size10 float64 `json:"Size10"` + Size11 float64 `json:"Size11"` + Size12 float64 `json:"Size12"` + Size13 float64 `json:"Size13"` + Size14 float64 `json:"Size14"` + Size15 float64 `json:"Size15"` + Size16 float64 `json:"Size16"` +} diff --git a/svc/models/orderdetail.go b/svc/models/orderdetail.go new file mode 100644 index 0000000..f8aee81 --- /dev/null +++ b/svc/models/orderdetail.go @@ -0,0 +1,98 @@ +package models + +// ============================================================ +// 📦 ORDER DETAIL (trOrderLine) +// ============================================================ +type OrderDetail struct { + OrderLineID string `json:"OrderLineID"` + + // 🔑 Frontend’den gelen benzersiz anahtar (sadece JSON, DB kolonu değil) + ClientKey NullString `json:"clientKey"` + ComboKey NullString `json:"ComboKey"` + SortOrder NullInt32 `json:"SortOrder"` + ItemTypeCode NullInt16 `json:"ItemTypeCode"` + ItemCode NullString `json:"ItemCode"` + ColorCode NullString `json:"ColorCode"` + ItemDim1Code NullString `json:"ItemDim1Code"` + ItemDim2Code NullString `json:"ItemDim2Code"` + ItemDim3Code NullString `json:"ItemDim3Code"` + + Qty1 NullFloat64 `json:"Qty1"` + Qty2 NullFloat64 `json:"Qty2"` + + CancelQty1 NullFloat64 `json:"CancelQty1"` + CancelQty2 NullFloat64 `json:"CancelQty2"` + CancelDate NullTime `json:"CancelDate"` + + OrderCancelReasonCode NullString `json:"OrderCancelReasonCode"` + ClosedDate NullTime `json:"ClosedDate"` + IsClosed NullBool `json:"IsClosed"` + + SalespersonCode NullString `json:"SalespersonCode"` + PaymentPlanCode NullString `json:"PaymentPlanCode"` + PurchasePlanCode NullString `json:"PurchasePlanCode"` + + // MSSQL smalldatetime + DeliveryDate NullTime `json:"DeliveryDate"` + + // MSSQL date (YYYY-MM-DD) + PlannedDateOfLading NullString `json:"PlannedDateOfLading"` + + LineDescription NullString `json:"LineDescription"` + UsedBarcode NullString `json:"UsedBarcode"` + CostCenterCode NullString `json:"CostCenterCode"` + + VatCode NullString `json:"VatCode"` + VatRate NullFloat64 `json:"VatRate"` + + PCTCode NullString `json:"PCTCode"` + PCTRate NullFloat64 `json:"PCTRate"` + + LDisRate1 NullFloat64 `json:"LDisRate1"` + LDisRate2 NullFloat64 `json:"LDisRate2"` + LDisRate3 NullFloat64 `json:"LDisRate3"` + LDisRate4 NullFloat64 `json:"LDisRate4"` + LDisRate5 NullFloat64 `json:"LDisRate5"` + + DocCurrencyCode NullString `json:"DocCurrencyCode"` + PriceCurrencyCode NullString `json:"PriceCurrencyCode"` + PriceExchangeRate NullFloat64 `json:"PriceExchangeRate"` + + Price NullFloat64 `json:"Price"` + + PriceListLineID NullString `json:"PriceListLineID"` + + BaseProcessCode NullString `json:"BaseProcessCode"` + BaseOrderNumber NullString `json:"BaseOrderNumber"` + BaseCustomerTypeCode NullInt32 `json:"BaseCustomerTypeCode"` + BaseCustomerCode NullString `json:"BaseCustomerCode"` + BaseSubCurrAccID NullString `json:"BaseSubCurrAccID"` + BaseStoreCode NullString `json:"BaseStoreCode"` + + SupportRequestHeaderID NullString `json:"SupportRequestHeaderID"` + + OrderHeaderID string `json:"OrderHeaderID"` + + OrderLineSumID NullInt32 `json:"OrderLineSumID"` + OrderLineBOMID NullInt32 `json:"OrderLineBOMID"` + + CreatedUserName NullString `json:"CreatedUserName"` + CreatedDate NullString `json:"CreatedDate"` + LastUpdatedUserName NullString `json:"LastUpdatedUserName"` + LastUpdatedDate NullString `json:"LastUpdatedDate"` + + SurplusOrderQtyToleranceRate NullFloat64 `json:"SurplusOrderQtyToleranceRate"` + + PurchaseRequisitionLineID NullString `json:"PurchaseRequisitionLineID"` + WithHoldingTaxTypeCode NullString `json:"WithHoldingTaxTypeCode"` + + DOVCode NullString `json:"DOVCode"` + OrderLineLinkedProductID NullString `json:"OrderLineLinkedProductID"` + + // JOIN attr + UrunIlkGrubu NullString `json:"UrunIlkGrubu"` + UrunAnaGrubu NullString `json:"UrunAnaGrubu"` + UrunAltGrubu NullString `json:"UrunAltGrubu"` + Fit1 NullString `json:"Fit1"` + Fit2 NullString `json:"Fit2"` +} diff --git a/svc/models/orderheader.go b/svc/models/orderheader.go new file mode 100644 index 0000000..9b61c0f --- /dev/null +++ b/svc/models/orderheader.go @@ -0,0 +1,109 @@ +package models + +// ============================================================ +// 🧾 ORDER HEADER +// ============================================================ +type OrderHeader struct { + OrderHeaderID string `json:"OrderHeaderID"` + + OrderTypeCode NullInt16 `json:"OrderTypeCode"` + ProcessCode NullString `json:"ProcessCode"` + OrderNumber NullString `json:"OrderNumber"` + IsCancelOrder NullBool `json:"IsCancelOrder"` + + // 🔥 Date & Time string olarak geliyor (frontend) + OrderDate NullString `json:"OrderDate"` // "YYYY-MM-DD" + OrderTime NullString `json:"OrderTime"` // "HH:mm:ss" + + DocumentNumber NullString `json:"DocumentNumber"` + + PaymentTerm NullInt16 `json:"PaymentTerm"` + AverageDueDate NullString `json:"AverageDueDate"` // "YYYY-MM-DD" + + Description NullString `json:"Description"` + InternalDescription NullString `json:"InternalDescription"` + + CurrAccTypeCode NullInt16 `json:"CurrAccTypeCode"` + CurrAccCode NullString `json:"CurrAccCode"` + + CurrAccDescription NullString `json:"CurrAccDescription"` + + // 🔥 GUID alanları NullUUID yapıldı + SubCurrAccID NullUUID `json:"SubCurrAccID"` + ContactID NullUUID `json:"ContactID"` + ShipmentMethodCode NullString `json:"ShipmentMethodCode"` + ShippingPostalAddressID NullUUID `json:"ShippingPostalAddressID"` + BillingPostalAddressID NullUUID `json:"BillingPostalAddressID"` + GuarantorContactID NullUUID `json:"GuarantorContactID"` + GuarantorContactID2 NullUUID `json:"GuarantorContactID2"` + + RoundsmanCode NullString `json:"RoundsmanCode"` + DeliveryCompanyCode NullString `json:"DeliveryCompanyCode"` + + TaxTypeCode NullInt16 `json:"TaxTypeCode"` + WithHoldingTaxTypeCode NullString `json:"WithHoldingTaxTypeCode"` + DOVCode NullString `json:"DOVCode"` + TaxExemptionCode NullInt16 `json:"TaxExemptionCode"` + + CompanyCode NullInt32 `json:"CompanyCode"` + OfficeCode NullString `json:"OfficeCode"` + StoreTypeCode NullInt16 `json:"StoreTypeCode"` + StoreCode NullString `json:"StoreCode"` + + POSTerminalID NullInt16 `json:"POSTerminalID"` + WarehouseCode NullString `json:"WarehouseCode"` + ToWarehouseCode NullString `json:"ToWarehouseCode"` + + OrdererCompanyCode NullInt32 `json:"OrdererCompanyCode"` + OrdererOfficeCode NullString `json:"OrdererOfficeCode"` + OrdererStoreCode NullString `json:"OrdererStoreCode"` + + GLTypeCode NullString `json:"GLTypeCode"` + DocCurrencyCode NullString `json:"DocCurrencyCode"` + LocalCurrencyCode NullString `json:"LocalCurrencyCode"` + ExchangeRate NullFloat64 `json:"ExchangeRate"` + + TDisRate1 NullFloat64 `json:"TDisRate1"` + TDisRate2 NullFloat64 `json:"TDisRate2"` + TDisRate3 NullFloat64 `json:"TDisRate3"` + TDisRate4 NullFloat64 `json:"TDisRate4"` + TDisRate5 NullFloat64 `json:"TDisRate5"` + + DiscountReasonCode NullInt16 `json:"DiscountReasonCode"` + SurplusOrderQtyToleranceRate NullFloat64 `json:"SurplusOrderQtyToleranceRate"` + + ImportFileNumber NullString `json:"ImportFileNumber"` + ExportFileNumber NullString `json:"ExportFileNumber"` + IncotermCode1 NullString `json:"IncotermCode1"` + IncotermCode2 NullString `json:"IncotermCode2"` + LettersOfCreditNumber NullString `json:"LettersOfCreditNumber"` + PaymentMethodCode NullString `json:"PaymentMethodCode"` + + IsInclutedVat NullBool `json:"IsInclutedVat"` + IsCreditSale NullBool `json:"IsCreditSale"` + IsCreditableConfirmed NullBool `json:"IsCreditableConfirmed"` + + CreditableConfirmedUser NullString `json:"CreditableConfirmedUser"` + // MSSQL datetime + CreditableConfirmedDate CustomTime `json:"CreditableConfirmedDate"` + + IsSalesViaInternet NullBool `json:"IsSalesViaInternet"` + IsSuspended NullBool `json:"IsSuspended"` + IsCompleted NullBool `json:"IsCompleted"` + IsPrinted NullBool `json:"IsPrinted"` + IsLocked NullBool `json:"IsLocked"` + UserLocked NullBool `json:"UserLocked"` + IsClosed NullBool `json:"IsClosed"` + + ApplicationCode NullString `json:"ApplicationCode"` + ApplicationID NullUUID `json:"ApplicationID"` + + CreatedUserName NullString `json:"CreatedUserName"` + // Frontend "YYYY-MM-DD HH:mm:ss" gönderiyor + CreatedDate NullString `json:"CreatedDate"` + + LastUpdatedUserName NullString `json:"LastUpdatedUserName"` + LastUpdatedDate NullString `json:"LastUpdatedDate"` + + IsProposalBased NullBool `json:"IsProposalBased"` +} diff --git a/svc/models/orderinventory.go b/svc/models/orderinventory.go new file mode 100644 index 0000000..bdb3b2b --- /dev/null +++ b/svc/models/orderinventory.go @@ -0,0 +1,10 @@ +package models + +type OrderInventory struct { + UrunKodu string `json:"urun_kodu"` + RenkKodu string `json:"renk_kodu"` + RenkAciklamasi string `json:"renk_aciklamasi"` + Beden string `json:"beden"` + Yaka string `json:"yaka"` + KullanilabilirEnvanter float64 `json:"kullanilabilir_envanter"` +} diff --git a/svc/models/orderlist.go b/svc/models/orderlist.go new file mode 100644 index 0000000..a91ceff --- /dev/null +++ b/svc/models/orderlist.go @@ -0,0 +1,35 @@ +package models + +// ======================================================== +// 📌 OrderList — Sipariş Listeleme Modeli (FINAL & UI SAFE) +// ======================================================== +type OrderList struct { + + // 🆔 Sipariş Bilgileri + OrderHeaderID string `json:"OrderHeaderID"` + OrderNumber string `json:"OrderNumber"` + OrderDate string `json:"OrderDate"` + + // 🧾 Cari Bilgileri + CurrAccCode string `json:"CurrAccCode"` + CurrAccDescription string `json:"CurrAccDescription"` + + // 👤 Müşteri Tanımları + MusteriTemsilcisi string `json:"MusteriTemsilcisi"` + Piyasa string `json:"Piyasa"` + + // ℹ️ Sipariş Durumu + CreditableConfirmedDate string `json:"CreditableConfirmedDate"` + IsCreditableConfirmed bool `json:"IsCreditableConfirmed"` + + // 💱 Para Birimi + DocCurrencyCode string `json:"DocCurrencyCode"` + + // 💰 Tutarlar + TotalAmount float64 `json:"TotalAmount"` + TotalAmountUSD float64 `json:"TotalAmountUSD"` + + // 📝 Açıklama + Description string `json:"Description"` + ExchangeRateUSD float64 `json:"ExchangeRateUSD"` +} diff --git a/svc/models/ordernull_types.go b/svc/models/ordernull_types.go new file mode 100644 index 0000000..11e29f8 --- /dev/null +++ b/svc/models/ordernull_types.go @@ -0,0 +1,179 @@ +package models + +import ( + "database/sql" + "encoding/json" + "time" +) + +/* ============================================================== + 🔹 NULL TYPE WRAPPERS + MSSQL sql.Null* tiplerini JSON'a dönüştürürken: + - null yerine "", 0 veya false döndürür + - frontend'de (Vue/Quasar) doğrudan okunabilir hale getirir +============================================================== */ + +// 🟦 STRING +type NullString struct { + sql.NullString +} + +func (ns *NullString) MarshalJSON() ([]byte, error) { + if ns.Valid { + return json.Marshal(ns.String) + } + return json.Marshal("") +} + +func (ns *NullString) UnmarshalJSON(b []byte) error { + var s *string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + if s != nil { + ns.Valid = true + ns.String = *s + } else { + ns.Valid = false + ns.String = "" + } + return nil +} + +// 🟩 INT32 +type NullInt32 struct { + sql.NullInt32 +} + +func (ni *NullInt32) MarshalJSON() ([]byte, error) { + if ni.Valid { + return json.Marshal(ni.Int32) + } + return json.Marshal(0) +} + +func (ni *NullInt32) UnmarshalJSON(b []byte) error { + var n *int32 + if err := json.Unmarshal(b, &n); err != nil { + return err + } + if n != nil { + ni.Valid = true + ni.Int32 = *n + } else { + ni.Valid = false + ni.Int32 = 0 + } + return nil +} + +// 🟧 INT16 +type NullInt16 struct { + sql.NullInt16 +} + +func (ni *NullInt16) MarshalJSON() ([]byte, error) { + if ni.Valid { + return json.Marshal(ni.Int16) + } + return json.Marshal(0) +} + +func (ni *NullInt16) UnmarshalJSON(b []byte) error { + var n *int16 + if err := json.Unmarshal(b, &n); err != nil { + return err + } + if n != nil { + ni.Valid = true + ni.Int16 = *n + } else { + ni.Valid = false + ni.Int16 = 0 + } + return nil +} + +// 🟨 FLOAT64 +type NullFloat64 struct { + sql.NullFloat64 +} + +func (nf *NullFloat64) MarshalJSON() ([]byte, error) { + if nf.Valid { + return json.Marshal(nf.Float64) + } + return json.Marshal(0.0) +} + +func (nf *NullFloat64) UnmarshalJSON(b []byte) error { + var f *float64 + if err := json.Unmarshal(b, &f); err != nil { + return err + } + if f != nil { + nf.Valid = true + nf.Float64 = *f + } else { + nf.Valid = false + nf.Float64 = 0 + } + return nil +} + +// 🟥 BOOL +type NullBool struct { + sql.NullBool +} + +func (nb *NullBool) MarshalJSON() ([]byte, error) { + if nb.Valid { + return json.Marshal(nb.Bool) + } + return json.Marshal(false) +} + +func (nb *NullBool) UnmarshalJSON(b []byte) error { + var v *bool + if err := json.Unmarshal(b, &v); err != nil { + return err + } + if v != nil { + nb.Valid = true + nb.Bool = *v + } else { + nb.Valid = false + nb.Bool = false + } + return nil +} + +// 🟪 TIME +type NullTime struct { + sql.NullTime +} + +func (nt *NullTime) MarshalJSON() ([]byte, error) { + if nt.Valid { + return json.Marshal(nt.Time.Format("2006-01-02 15:04:05")) + } + return json.Marshal(nil) +} + +func (nt *NullTime) UnmarshalJSON(b []byte) error { + var s *string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + if s != nil && *s != "" { + t, err := time.Parse("2006-01-02 15:04:05", *s) + if err != nil { + return err + } + nt.Valid = true + nt.Time = t + } else { + nt.Valid = false + } + return nil +} diff --git a/svc/models/orderpricelistb2b.go b/svc/models/orderpricelistb2b.go new file mode 100644 index 0000000..3a94e7a --- /dev/null +++ b/svc/models/orderpricelistb2b.go @@ -0,0 +1,13 @@ +package models + +// OrderPriceListB2B B2B ürün fiyat listesini temsil eder +type OrderPriceListB2B struct { + ModelCode string `json:"modelCode"` + CurrencyCode string `json:"currencyCode"` + Price float64 `json:"price"` + PriceGroupID int `json:"priceGroupId"` + LastUpdate string `json:"lastUpdate"` + RateToTRY float64 `json:"rateToTRY"` + PriceTRY float64 `json:"priceTRY"` + BaseCurrency string `json:"baseCurrency"` +} diff --git a/svc/models/product.go b/svc/models/product.go new file mode 100644 index 0000000..eefe700 --- /dev/null +++ b/svc/models/product.go @@ -0,0 +1,5 @@ +package models + +type Product struct { + ProductCode string `json:"ProductCode"` // ✅ büyük P harf ile +} diff --git a/svc/models/productcolor.go b/svc/models/productcolor.go new file mode 100644 index 0000000..850e607 --- /dev/null +++ b/svc/models/productcolor.go @@ -0,0 +1,7 @@ +package models + +type ProductColor struct { + ProductCode string `json:"product_code"` + ColorCode string `json:"color_code"` + ColorDescription string `json:"color_description"` +} diff --git a/svc/models/productcolorsize.go b/svc/models/productcolorsize.go new file mode 100644 index 0000000..ace2b4f --- /dev/null +++ b/svc/models/productcolorsize.go @@ -0,0 +1,9 @@ +package models + +// 🔹 Ürün renk + beden varyasyon listesi (açıklamalar çıkarıldı) +type ProductColorSize struct { + ProductCode string `json:"product_code"` + ColorCode string `json:"color_code"` + ItemDim1Code string `json:"item_dim1_code"` + ItemDim2Code string `json:"item_dim2_code"` +} diff --git a/svc/models/productdetail.go b/svc/models/productdetail.go new file mode 100644 index 0000000..fd8644d --- /dev/null +++ b/svc/models/productdetail.go @@ -0,0 +1,14 @@ +package models + +type ProductDetail struct { + ProductCode string `json:"ProductCode"` + UrunIlkGrubu string `json:"UrunIlkGrubu"` + UrunAnaGrubu string `json:"UrunAnaGrubu"` + UrunAltGrubu string `json:"UrunAltGrubu"` + UrunIcerik string `json:"UrunIcerik"` + Drop string `json:"Drop"` + Kategori string `json:"Kategori"` + AskiliYan string `json:"AskiliYan"` + Fit1 string `json:"Fit1"` + Fit2 string `json:"Fit2"` +} diff --git a/svc/models/productsecondcolor.go b/svc/models/productsecondcolor.go new file mode 100644 index 0000000..3977480 --- /dev/null +++ b/svc/models/productsecondcolor.go @@ -0,0 +1,7 @@ +package models + +type ProductSecondColor struct { + ProductCode string `json:"product_code"` + ColorCode string `json:"color_code"` + ItemDim2Code string `json:"item_dim2_code"` +} diff --git a/svc/models/statement_detail.go b/svc/models/statement_detail.go new file mode 100644 index 0000000..f7a6786 --- /dev/null +++ b/svc/models/statement_detail.go @@ -0,0 +1,17 @@ +package models + +// Detay tablo (alt satır) +type StatementDetail struct { + BelgeTarihi string `json:"belge_tarihi"` // Belge tarihi + BelgeRefNumarasi string `json:"belge_ref_numarasi"` // Belge referans numarası + UrunAnaGrubu string `json:"urun_ana_grubu"` // Ürün ana grubu + UrunAltGrubu string `json:"urun_alt_grubu"` // Ürün alt grubu + YetiskinGarson string `json:"yetiskin_garson"` // Yetişkin/Çocuk (garson) + Fit string `json:"fit"` // Fit bilgisi + Icerik string `json:"icerik"` // İçerik + UrunKodu string `json:"urun_kodu"` // Ürün kodu + UrunRengi string `json:"urun_rengi"` // Ürün rengi + ToplamAdet float64 `json:"toplam_adet"` // Toplam adet + ToplamFiyat float64 `json:"toplam_fiyat"` // Birim fiyat + ToplamTutar float64 `json:"toplam_tutar"` // Toplam tutar +} diff --git a/svc/models/statement_header.go b/svc/models/statement_header.go new file mode 100644 index 0000000..c7144cf --- /dev/null +++ b/svc/models/statement_header.go @@ -0,0 +1,41 @@ +package models + +import ( + "database/sql" + "encoding/json" +) + +type StatementHeader struct { + CariKod string `json:"cari_kod"` + CariIsim string `json:"cari_isim"` + BelgeTarihi string `json:"belge_tarihi"` + VadeTarihi string `json:"vade_tarihi"` + BelgeNo string `json:"belge_no"` + IslemTipi string `json:"islem_tipi"` + Aciklama string `json:"aciklama"` + ParaBirimi string `json:"para_birimi"` + Borc float64 `json:"borc"` + Alacak float64 `json:"alacak"` + Bakiye float64 `json:"bakiye"` + Parislemler sql.NullString `json:"parislemler"` + + // 🔹 PDF için detaylar + Details []StatementDetail `json:"details,omitempty"` +} + +// JSON dönüşümünde NULL değerleri "" yap +func (s StatementHeader) MarshalJSON() ([]byte, error) { + type Alias StatementHeader + return json.Marshal(&struct { + Parislemler string `json:"parislemler"` + *Alias + }{ + Parislemler: func() string { + if s.Parislemler.Valid { + return s.Parislemler.String + } + return "" + }(), + Alias: (*Alias)(&s), + }) +} diff --git a/svc/models/statements_params.go b/svc/models/statements_params.go new file mode 100644 index 0000000..595363d --- /dev/null +++ b/svc/models/statements_params.go @@ -0,0 +1,10 @@ +package models + +type StatementParams struct { + CariKod string `json:"cari_kod"` + StartDate string `json:"startdate"` + EndDate string `json:"enddate"` + AccountCode string `json:"accountcode"` + LangCode string `json:"langcode"` + Parislemler []string `json:"parislemler"` // ✅ slice olmalı +} diff --git a/svc/models/todaycurrencyv3.go b/svc/models/todaycurrencyv3.go new file mode 100644 index 0000000..e4eab48 --- /dev/null +++ b/svc/models/todaycurrencyv3.go @@ -0,0 +1,10 @@ +package models + +// TodayCurrencyV3 sistemdeki döviz kurlarını temsil eder +type TodayCurrencyV3 struct { + CurrencyCode string `json:"currencyCode"` + RelationCurrencyCode string `json:"relationCurrencyCode"` + ExchangeTypeCode int `json:"exchangeTypeCode"` + Rate float64 `json:"rate"` + Date string `json:"date"` +} diff --git a/svc/models/user_detail.go b/svc/models/user_detail.go new file mode 100644 index 0000000..8e83a67 --- /dev/null +++ b/svc/models/user_detail.go @@ -0,0 +1,88 @@ +package models + +import "encoding/json" + +// ====================================================== +// 👤 USER DETAIL — GET RESPONSE +// UserDetail.vue formuna birebir +// ====================================================== +type UserDetail struct { + ID int64 `json:"id"` + Code string `json:"code"` + IsActive bool `json:"is_active"` + FullName string `json:"full_name"` + Email string `json:"email"` + Mobile string `json:"mobile"` + Address string `json:"address"` + + HasPassword bool `json:"has_password"` // 🔐 SADECE DURUM + + // ===== İLİŞKİLER ===== + Roles []string `json:"roles"` + Departments []DeptOption `json:"departments"` + Piyasalar []DeptOption `json:"piyasalar"` + NebimUsers []NebimOption `json:"nebim_users"` +} + +// ====================================================== +// ✍️ USER WRITE — PUT PAYLOAD +// ====================================================== +type UserWrite struct { + Code string `json:"code"` + IsActive bool `json:"is_active"` + FullName string `json:"full_name"` + Email string `json:"email"` + Mobile string `json:"mobile"` + Address string `json:"address"` + + Roles []string `json:"roles"` + Departments []DeptOption `json:"departments"` + Piyasalar []DeptOption `json:"piyasalar"` + NebimUsers []NebimOption `json:"nebim_users"` +} + +// ====================================================== +// 🔹 COMMON OPTION MODELS +// ====================================================== +type DeptOption struct { + Code string `json:"code"` + Title string `json:"title,omitempty"` +} + +// Flexible JSON decode +func (d *DeptOption) UnmarshalJSON(data []byte) error { + + var raw struct { + Code any `json:"code"` + Title string `json:"title"` + } + + if err := json.Unmarshal(data, &raw); err != nil { + return err + } + + d.Title = raw.Title + + switch v := raw.Code.(type) { + + case string: + d.Code = v + + case []any: + if len(v) > 0 { + if s, ok := v[0].(string); ok { + d.Code = s + } + } + + default: + d.Code = "" + } + + return nil +} + +type NebimOption struct { + Username string `json:"username"` + UserGroupCode string `json:"user_group_code"` +} diff --git a/svc/models/user_list.go b/svc/models/user_list.go new file mode 100644 index 0000000..87a316e --- /dev/null +++ b/svc/models/user_list.go @@ -0,0 +1,18 @@ +package models + +// UserListRow — UserList.vue satır modeli (FINAL) +type UserListRow struct { + ID int64 `json:"id"` + Code string `json:"code"` + IsActive bool `json:"is_active"` + + // Nebim eşleşmesi (ID yok) + NebimUsername *string `json:"nebim_username,omitempty"` + UserGroupCode *string `json:"user_group_code,omitempty"` + + // UI’da gösterilecek toplu alanlar + RoleNames string `json:"role_names"` // "ADMIN, USER" + DepartmentNames string `json:"department_names"` // "UST YONETIM, ..." + PiyasaNames string `json:"piyasa_names"` // "AVRUPA, LALELI" + +} diff --git a/svc/models/users.go b/svc/models/users.go new file mode 100644 index 0000000..6d068e4 --- /dev/null +++ b/svc/models/users.go @@ -0,0 +1,20 @@ +package models + +type User struct { + ID int `json:"id"` + Username string `json:"username"` + + IsActive bool `json:"is_active"` + Email string `json:"email"` + + RoleID int `json:"role_id"` + RoleCode string `json:"role_code"` + FullName string + Mobile string + Address string + V3Username string `json:"v3_username"` + V3UserGroup int `json:"v3_usergroup"` + ForcePasswordChange bool `json:"force_password_change"` + + Upass string // 🔐 dfusr.upass (TEK KAYNAK) +} diff --git a/svc/permissions/models.go b/svc/permissions/models.go new file mode 100644 index 0000000..9e1e520 --- /dev/null +++ b/svc/permissions/models.go @@ -0,0 +1,83 @@ +package permissions + +/* ===================================================== + ROLE PERMISSION MATRIX (READ) + - Role bazlı matrix ekranı için: role_id + role_code + module/action/allowed + - UI isterse "source" alanı ile satırın nereden geldiğini gösterebilir. +===================================================== */ + +type PermissionMatrixRow struct { + // Role tarafı + RoleID int `json:"role_id,omitempty"` + RoleCode string `json:"role_code,omitempty"` + + // User override tarafı + UserID int64 `json:"user_id,omitempty"` + + // Ortak alanlar + Module string `json:"module"` + ModuleCode string `json:"module_code"` + Action string `json:"action"` + Allowed bool `json:"allowed"` + + // role | user + Source string `json:"source"` +} + +/* ===================================================== + ROLE PERMISSION UPDATE (WRITE) + - /api/permissions/matrix POST gibi update endpoint'lerinde kullanılır +===================================================== */ + +type PermissionUpdateRequest struct { + RoleID int `json:"role_id"` + Module string `json:"module"` + Action string `json:"action"` + Allowed bool `json:"allowed"` +} + +/* ===================================================== + USER OVERRIDE MODELS + - mk_sys_user_permissions tablosu için +===================================================== */ + +// DB’den okurken döndüğümüz satır (GET /api/users/{id}/permissions) +type UserOverrideRow struct { + Module string `json:"module"` + Action string `json:"action"` + Allowed bool `json:"allowed"` +} + +// Middleware içinde hızlı okuma için de kullanılabilir (GetUserOverrides) +type UserPermissionOverride struct { + Module string `json:"module"` + Action string `json:"action"` + Allowed bool `json:"allowed"` +} + +// Repo “upsert/insert” gibi operasyonlarda kullanılacak internal model +type UserPermission struct { + UserID int64 `json:"user_id"` + Module string `json:"module"` + Action string `json:"action"` + Allowed bool `json:"allowed"` +} + +// POST payload için tip (SaveUserOverrides input) +type UserPermissionRequest struct { + Module string `json:"module"` + Action string `json:"action"` + Allowed bool `json:"allowed"` +} + +// Role + Department Permission Row +type RoleDepartmentPermission struct { + RoleID int `json:"role_id"` + DepartmentCode string `json:"department_code"` + + Module string `json:"module"` + Action string `json:"action"` + Allowed bool `json:"allowed"` + + Source string `json:"source"` // "role_dept" +} diff --git a/svc/permissions/repository.go b/svc/permissions/repository.go new file mode 100644 index 0000000..aa40648 --- /dev/null +++ b/svc/permissions/repository.go @@ -0,0 +1,601 @@ +package permissions + +import ( + "database/sql" + "log" + "strings" + + "github.com/lib/pq" +) + +type PermissionRepository struct { + DB *sql.DB +} + +func NewPermissionRepository(db *sql.DB) *PermissionRepository { + return &PermissionRepository{DB: db} +} + +/* ===================================================== + MATRIX READ (V2) - ROLE BASED +===================================================== */ + +func (r *PermissionRepository) GetPermissionMatrixForRoles( + roleIDs []int, +) ([]PermissionMatrixRow, error) { + + if len(roleIDs) == 0 { + return []PermissionMatrixRow{}, nil + } + + query := ` + SELECT + rp.role_id, + rol.code, + rp.module_code, + rp.action, + rp.allowed + FROM mk_sys_role_permissions rp + JOIN dfrole rol ON rol.id = rp.role_id + WHERE rp.role_id = ANY($1) + ORDER BY rol.id, rp.module_code, rp.action + ` + + rows, err := r.DB.Query(query, pq.Array(roleIDs)) + if err != nil { + return nil, err + } + defer rows.Close() + + list := make([]PermissionMatrixRow, 0) + + for rows.Next() { + var row PermissionMatrixRow + if err := rows.Scan( + &row.RoleID, + &row.RoleCode, + &row.Module, + &row.Action, + &row.Allowed, + ); err != nil { + return nil, err + } + + row.Source = "role" + list = append(list, row) + } + + return list, nil +} + +/* ===================================================== + MATRIX UPDATE (V2) - ROLE BASED +===================================================== */ + +func (r *PermissionRepository) UpdatePermissions( + list []PermissionUpdateRequest, +) error { + + tx, err := r.DB.Begin() + if err != nil { + return err + } + defer tx.Rollback() + + stmt, err := tx.Prepare(` + INSERT INTO mk_sys_role_permissions + (role_id, module_code, action, allowed) + VALUES ($1,$2,$3,$4) + ON CONFLICT (role_id, module_code, action) + DO UPDATE SET allowed = EXCLUDED.allowed + `) + if err != nil { + return err + } + defer stmt.Close() + + for _, p := range list { + if _, err := stmt.Exec( + p.RoleID, + p.Module, + p.Action, + p.Allowed, + ); err != nil { + return err + } + } + + return tx.Commit() +} + +/* ===================================================== + USER OVERRIDES - READ + GET /api/users/{id}/permissions +===================================================== */ + +// Tek tip: PermissionMatrixRow döndürüyoruz (source=user) +func (r *PermissionRepository) GetUserOverridesByUserID( + userID int64, +) ([]PermissionMatrixRow, error) { + + rows, err := r.DB.Query(` + SELECT + user_id, + module_code, + action, + allowed + FROM mk_sys_user_permissions + WHERE user_id = $1 + ORDER BY module_code, action + `, userID) + + if err != nil { + return nil, err + } + defer rows.Close() + + list := make([]PermissionMatrixRow, 0) + + for rows.Next() { + var row PermissionMatrixRow + if err := rows.Scan( + &row.UserID, + &row.Module, + &row.Action, + &row.Allowed, + ); err != nil { + return nil, err + } + + row.Source = "user" + list = append(list, row) + } + + return list, nil +} + +/* ===================================================== + USER OVERRIDES - UPSERT SAVE (typed) + POST /api/users/{id}/permissions +===================================================== */ + +func (r *PermissionRepository) SaveUserOverrides( + userID int64, + list []UserPermissionRequest, +) error { + + log.Println("➡️ REPO SaveUserOverrides START") + log.Println("USER:", userID) + log.Println("ROWS:", len(list)) + + tx, err := r.DB.Begin() + if err != nil { + log.Println("❌ TX BEGIN ERROR:", err) + return err + } + defer tx.Rollback() + + // önce sil + _, err = tx.Exec(` + DELETE FROM mk_sys_user_permissions + WHERE user_id = $1 + `, userID) + + if err != nil { + log.Println("❌ DELETE ERROR:", err) + return err + } + + stmt, err := tx.Prepare(` + INSERT INTO mk_sys_user_permissions + (user_id, module_code, action, allowed) + VALUES ($1,$2,$3,$4) + `) + + if err != nil { + log.Println("❌ PREPARE ERROR:", err) + return err + } + defer stmt.Close() + + for _, p := range list { + if strings.TrimSpace(p.Module) == "" { + log.Printf("⚠️ SKIP EMPTY MODULE user=%d action=%s", + userID, + p.Action, + ) + continue + } + + _, err := stmt.Exec( + userID, + p.Module, + p.Action, + p.Allowed, + ) + if err != nil { + log.Println("❌ INSERT ERROR:", err) + return err + } + } + + if err := tx.Commit(); err != nil { + log.Println("❌ COMMIT ERROR:", err) + return err + } + + log.Println("✅ REPO SaveUserOverrides DONE") + return nil + +} + +/* ===================================================== + RESOLUTION HELPERS (middleware için) +===================================================== */ + +// user override var mı? varsa *bool döner, yoksa nil +func (r *PermissionRepository) HasUserOverride( + userID int64, + module string, + action string, +) (*bool, error) { + + var allowed bool + + err := r.DB.QueryRow(` + SELECT allowed + FROM mk_sys_user_permissions + WHERE user_id=$1 + AND module_code=$2 + AND action=$3 + `, + userID, + module, + action, + ).Scan(&allowed) + + if err == sql.ErrNoRows { + return nil, nil + } + if err != nil { + return nil, err + } + + return &allowed, nil +} + +// roleIDs içinden OR logic: herhangi biri allowed=true ise true +func (r *PermissionRepository) HasRoleAccess( + roleIDs []int, + module string, + action string, +) (bool, error) { + + if len(roleIDs) == 0 { + return false, nil + } + + var count int + + err := r.DB.QueryRow(` + SELECT COUNT(*) + FROM mk_sys_role_permissions + WHERE role_id = ANY($1) + AND module_code=$2 + AND action=$3 + AND allowed=true + `, + pq.Array(roleIDs), + module, + action, + ).Scan(&count) + + if err != nil { + return false, err + } + + return count > 0, nil +} + +// Final decision: user override varsa onu uygula, yoksa role bazlı +func (r *PermissionRepository) ResolvePermission( + userID int64, + roleIDs []int, + module string, + action string, +) (bool, error) { + + override, err := r.HasUserOverride(userID, module, action) + if err != nil { + return false, err + } + + if override != nil { + return *override, nil + } + + return r.HasRoleAccess(roleIDs, module, action) +} +func (r *PermissionRepository) GetUserOverrides( + userID int64, +) ([]UserPermissionOverride, error) { + + rows, err := r.DB.Query(` + SELECT module_code, action, allowed + FROM mk_sys_user_permissions + WHERE user_id = $1 + `, userID) + + if err != nil { + return nil, err + } + defer rows.Close() + + var list []UserPermissionOverride + + for rows.Next() { + + var o UserPermissionOverride + + if err := rows.Scan( + &o.Module, + &o.Action, + &o.Allowed, + ); err != nil { + return nil, err + } + + list = append(list, o) + } + + return list, nil +} +func (r *PermissionRepository) UpdateUserOverrides( + list []UserPermission, +) error { + + tx, err := r.DB.Begin() + if err != nil { + return err + } + defer tx.Rollback() + + stmt, err := tx.Prepare(` + INSERT INTO mk_sys_user_permissions + (user_id, module_code, action, allowed) + + VALUES ($1,$2,$3,$4) + + ON CONFLICT (user_id, module_code, action) + DO UPDATE SET allowed = EXCLUDED.allowed + `) + if err != nil { + return err + } + defer stmt.Close() + + for _, p := range list { + + _, err := stmt.Exec( + p.UserID, + p.Module, + p.Action, + p.Allowed, + ) + + if err != nil { + return err + } + } + + return tx.Commit() +} +func (r *PermissionRepository) ResolveEffectivePermission( + userID int64, + roleID int64, + deptCode string, + module string, + action string, +) (bool, error) { + + // 1️⃣ USER OVERRIDE + var allowed bool + + err := r.DB.QueryRow(` + SELECT allowed + FROM mk_sys_user_permissions + WHERE user_id = $1 + AND module_code = $2 + AND action = $3 + `, + userID, module, action, + ).Scan(&allowed) + + if err == nil { + return allowed, nil + } + if err != sql.ErrNoRows { + return false, err + } + + // ================================================== + // 2️⃣ ROLE + DEPARTMENT + // ================================================== + + if len(deptCode) > 0 { + + var allowed bool + + err = r.DB.QueryRow(` -- 🔥 := DEĞİL = + SELECT allowed + FROM vw_role_dept_permissions + WHERE role_id = $1 + AND department_code = ANY($2) + AND module_code = $3 + AND action = $4 + ORDER BY allowed DESC + LIMIT 1 + `, + roleID, + pq.Array([]string{deptCode}), + module, + action, + ).Scan(&allowed) + + if err == nil { + + log.Printf( + " ↳ ROLE+DEPT OVERRIDE = %v", + allowed, + ) + + return allowed, nil + } + + if err != sql.ErrNoRows { + log.Println("❌ ROLE+DEPT ERR:", err) + return false, err + } + } + + // 3️⃣ ROLE DEFAULT + err = r.DB.QueryRow(` + SELECT allowed + FROM mk_sys_role_permissions + WHERE role_id = $1 + AND module_code = $2 + AND action = $3 + `, + roleID, module, action, + ).Scan(&allowed) + + if err == nil { + return allowed, nil + } + if err != sql.ErrNoRows { + return false, err + } + + // 4️⃣ DENY + return false, nil +} +func (r *PermissionRepository) ResolvePermissionChain( + userID int64, + roleID int64, + deptCodes []string, + module string, + action string, +) (bool, error) { + + log.Printf( + "🔐 PERM CHECK user=%d role=%d dept=%v %s:%s", + userID, + roleID, + deptCodes, + module, + action, + ) + + // ================================================== + // 1️⃣ USER OVERRIDE + // ================================================== + + override, err := r.HasUserOverride(userID, module, action) + if err != nil { + log.Println("❌ USER OVERRIDE ERR:", err) + return false, err + } + + if override != nil { + + log.Printf( + " ↳ USER OVERRIDE = %v", + *override, + ) + + return *override, nil + } + + // ================================================== + // 2️⃣ ROLE + DEPARTMENT + // ================================================== + + if len(deptCodes) > 0 { + + var allowed bool + + err := r.DB.QueryRow(` + SELECT allowed + FROM vw_role_dept_permissions + WHERE role_id = $1 + AND department_code IN ( + SELECT UNNEST($2::text[]) + ) + AND module_code = $3 + AND action = $4 + ORDER BY allowed DESC + LIMIT 1 +`, + roleID, + pq.Array(deptCodes), + module, + action, + ).Scan(&allowed) + + if err == nil { + + log.Printf( + " ↳ ROLE+DEPT OVERRIDE = %v", + allowed, + ) + + return allowed, nil + } + + if err != sql.ErrNoRows { + log.Println("❌ ROLE+DEPT ERR:", err) + return false, err + } + } + + // ================================================== + // 3️⃣ ROLE DEFAULT + // ================================================== + + var roleAllowed bool + + err = r.DB.QueryRow(` + SELECT allowed + FROM mk_sys_role_permissions + WHERE role_id = $1 + AND module_code = $2 + AND action = $3 + `, + roleID, + module, + action, + ).Scan(&roleAllowed) + + if err == nil { + + log.Printf( + " ↳ ROLE DEFAULT = %v", + roleAllowed, + ) + + return roleAllowed, nil + } + + if err != sql.ErrNoRows { + log.Println("❌ ROLE DEFAULT ERR:", err) + return false, err + } + + // ================================================== + // 4️⃣ DENY + // ================================================== + + log.Println(" ↳ NO RULE → DENY") + + return false, nil +} diff --git a/svc/permissions/role_department_repo.go b/svc/permissions/role_department_repo.go new file mode 100644 index 0000000..c73040c --- /dev/null +++ b/svc/permissions/role_department_repo.go @@ -0,0 +1,123 @@ +package permissions + +import ( + "bssapp-backend/queries" + "database/sql" + "log" +) + +type RoleDepartmentPermissionRepo struct { + db *sql.DB +} + +func NewRoleDepartmentPermissionRepo(db *sql.DB) *RoleDepartmentPermissionRepo { + return &RoleDepartmentPermissionRepo{db: db} +} + +/* ====================================================== + GET +====================================================== */ + +func (r *RoleDepartmentPermissionRepo) Get( + roleID int, + deptCode string, +) ([]RoleDepartmentPermission, error) { + + rows, err := r.db.Query( + queries.GetRoleDepartmentPermissions, + roleID, + deptCode, + ) + + if err != nil { + return nil, err + } + defer rows.Close() + + var list []RoleDepartmentPermission + + for rows.Next() { + + var p RoleDepartmentPermission + + if err := rows.Scan( + &p.Module, + &p.Action, + &p.Allowed, + ); err != nil { + return nil, err + } + + p.RoleID = roleID + p.DepartmentCode = deptCode + p.Source = "role_department" + + list = append(list, p) + } + + return list, nil +} + +/* ====================================================== + SAVE +====================================================== */ + +func (r *RoleDepartmentPermissionRepo) Save( + roleID int, + deptCode string, + list []RoleDepartmentPermission, +) error { + + tx, err := r.db.Begin() + if err != nil { + return err + } + defer tx.Rollback() + + stmt, err := tx.Prepare( + queries.UpsertRoleDepartmentPermission, + ) + if err != nil { + return err + } + defer stmt.Close() + + for _, p := range list { + + if p.Module == "" { + log.Printf( + "⚠️ SKIP EMPTY MODULE role=%v dept=%v action=%v", + roleID, + deptCode, + p.Action, + ) + continue + } + + _, err := stmt.Exec( + roleID, + deptCode, + p.Module, + p.Action, + p.Allowed, + ) + + // 🔴🔴🔴 KRİTİK DEBUG LOG + if err != nil { + + log.Printf( + "❌ UPSERT FAIL role=%v dept=%v module=%v action=%v allowed=%v err=%v", + roleID, + deptCode, + p.Module, + p.Action, + p.Allowed, + err, + ) + + return err + } + } + + return tx.Commit() +} diff --git a/svc/permissions/role_policy.go b/svc/permissions/role_policy.go new file mode 100644 index 0000000..6f14666 --- /dev/null +++ b/svc/permissions/role_policy.go @@ -0,0 +1,33 @@ +package permissions + +// 🔥 SYSTEM / ADMIN ROLE IDS +var AdminRoleIDs = map[int]struct{}{ + 1: {}, + 3: {}, +} + +// ------------------------------------------------------- +// 🧠 ROLE POLICY +// ------------------------------------------------------- +func ResolveEffectiveRoles( + roleIDs []int, +) (effectiveRoleIDs []int, isAdmin bool) { + + roleMap := make(map[int]struct{}) + + for _, roleID := range roleIDs { + + // 🔥 SYSTEM / ADMIN OVERRIDE (1,3,…) + if _, ok := AdminRoleIDs[roleID]; ok { + return []int{roleID}, true + } + + roleMap[roleID] = struct{}{} + } + + for id := range roleMap { + effectiveRoleIDs = append(effectiveRoleIDs, id) + } + + return effectiveRoleIDs, false +} diff --git a/svc/permissions/seed.go b/svc/permissions/seed.go new file mode 100644 index 0000000..5216e0e --- /dev/null +++ b/svc/permissions/seed.go @@ -0,0 +1,40 @@ +package permissions + +import "database/sql" + +func SeedAdminRoleDepartments(db *sql.DB) error { + + var adminID int + var err error + + // Admin role id al + err = db.QueryRow(` + SELECT id + FROM dfrole + WHERE code = 'admin' + `).Scan(&adminID) + + if err != nil { + return err + } + + // Seed + _, err = db.Exec(` +INSERT INTO mk_sys_role_department_permissions + (role_id, department_code, module_code, action, allowed) + +SELECT + $1, + d.code, + r.module_code, + r.action, + true +FROM mk_dprt d +CROSS JOIN mk_sys_routes r + +ON CONFLICT (role_id, department_code, module_code, action) +DO NOTHING +`, adminID) + + return err +} diff --git a/svc/public/Baggi-Tekstil-A.s-Logolu.jpeg b/svc/public/Baggi-Tekstil-A.s-Logolu.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..129519a8c095b5f4ed67e6633431d4f58e1656e7 GIT binary patch literal 59942 zcmeFZXINXwmNqKqgaalgyA1}6NG1qOZW{z92nHc8@7gE*C*J_K zG*s190cXwt0B2}FfRiDBGT_|V)8q8_Iofgl;`!6#^2Li6E?&8O_3D+&SFT*8yGeKT z+Kp>hu3V?Te&gn?TlBZC(%ojbeT#wi_pQ@P&Ya$P?)+uijkm5{xkmf%|HtFxBY^($ z`Q-Dj&Yj@~oTWc=j{eL^J%H= zzFv`#R3s}v->eZ*u6KlLG-Q%mQ*4aILP#CQl4qE$X&;9)&02eOO z+BtKHc2SX@_K4@soV$4a+=cJOXkAOYMt|X+*zL!df;C@@UI^DR}cKF2mYt_ zz{N9ZY;~{K)x>`^Rsfpg|e0XXhO1SIfP(aG5a*sd#TU+117B3 zW+yeJ{CR66OK6`U!rANT%$H}NK}9?Mv=#Sy>WU?TfRr+K5{Pn4ZpCgzEbvvBh!kZL z1$2EMlex~pJe{fbsa0v=4PN9HhKV$bkS6K_egIq8YTWy52Bw~n`>U8A%oT)us zU0iz6(`?V@}=lVK_Yyn;}Q_buRStY0^5+{@DrUz#8go=ptf zg}EKyBQ&sPR8wFSZ3;Yr$I?%%um-7*36v!e-ju|(NJdAnj_{05A&q+|rofGjgj&iLkLOmtVka5T~wO+@)|^TT-Q^y3V7&OZmz znfd6rGibnVk`Z)l<#rX1DWyi~~#~=ss7!u7&fSz(YB24`-ko?~$Ji zuqoq8Y1EHrM#uk0*e;LhN*5g{{)3Y<3yW0#ib0>$kP~t(-7sd{WXKmYzE16$C=w9kIs#gokUq2EYdRC0HM&l2$_NdkHIl z{yaDg2FrREqy9GLf#GcPmTF-%1lCHdqh~;)v=#@8s9&Y^Iq!K494JNsLFrpMY|F2l zgxn!K+^=E+Mss>ectSbMmu9@ucD6@pM!#m^njTSUcG=t$9}}ZOc|h+c({fx!v&$-P zhk<-~w(E-WO>dln_Eq1$f$H($f22&!@*9OHFPA&|@fMf5@M!jBhe&#Idt-Z6(fx&T z<+HevJ1aQ=ex@B11f*aiUxIQ~lavs%`qQp4m{llrj)uzCFL&9oTI!)$@yPRCltqXs zl^?h#Ld}IuEvF^LL{vKaLG|n4I=sSAIy75yVGC!p8fXbh*46dH>~Q)eLv3|ih_R9t zs~du!3s5>Yd_C6BYPC9cf0#b{TsOM}bfk!abFh8i4YDsGf#B{Qz$Cblz>BQ|iCYTE z(8c%LdKcKS$cDGpXzUci6Dr)zBMRU0Dpt5S9*i)l&03B?3_KP$yOq-OmPls8JC%Vf zCNLAA1Hv#iMpYySe~^TsA@H|%Mg%r^N*UcHvu_(jsxXtt3E%+^OfjroU@PGF!SU)? zV!xV*c(R}`i+HzUq54pMM|^4iieaDBfa9N&MryBfn~#w5TG}m9roKEf9I<9A^g%Yi zrjUl+D)sAD(KSf+$T|gN0}N)rmM>dB5Eo8ea~A$kkw0#5%DiIo$&)VV#!Vd*4Cb`y zrYRp4$~tmC9w-)N2_&N6FSz+Z!18jE4dtyf_R*91;_V<-C{m7^Au)25`gA%&RhiB? zUY#@AiajFVBPpKSOW$A0W*{XQ$nF>vJBL1e%%i6P6kvdsk@SB}OSe6`Sus6XwB1hs zEzF_#+(Ucxp)#!iI~#++5E@^%tX&-Zdc=JIqiN^3teRAydTc+Z;sn8ug921QC2xd*c8^ZoFdtZ2g7Nm-ns zN(1)Cpk>jIBU!BkQNB{kCYU4}VPv4)XW;;8YT)DWCh@++|oB#h6TIfpcMDX+6Z585qhS zt|EE-8n$a-^SN&B3cidcRr)l#Eb{M9S;Ou~8QI{sd% zo3u62*V}SRcJ7kZ{?Z#yco0h#SMnkmDl`0p$jkdbpLMYK6Sn-i&VwGdK=c`SBMgXl zn#%n05j5O4x5rl52E#O8&IT2%h z!)=8MQiu7~h{%o`Lc@Z7rF$T^nT*%wd^WzQb^LhO^&hdbOA^C1O8f3K7&2=U`YMK=#w~}GjPE9U!(r)n*Y|%!j>3U zEj?KQw^wnoR;YYrK0P-{9}RSI)o)3T5w+y=75%v|Nb#qT{aMQsK-lL)wUzGP%O`+* z1Et+4rFy?s+`AR-{8y{YO1NBx6M(5>$lB$QuumQVito2gz73{MhhDO*EI!Uwb}AwC zRH(yPz$mNH#YqSVE{X@iROAWMjA}p|6tlA_K>#b=)@3jJ`}_PS&tVm2oUKC?r0Eb0 zUqIfvsiQDD!?!wmx;#>maf>NF$7JhGn+=Z|XZDApk$=nv%jg;__B48iue6O9VML5N zt7vao(QXs9I?A2*p|>*P=z2OE14B!M)bef=!c|4bm`Wg&`nukb)Aj`(odB+-CAXF>0sRA3gW8 zl(TD`+-nlaNQi?!nY(7!t;l`?$d&4fKCM8j-_6hRn#;cxn7ZcD&BtX9Kk#YH-s>8} z$}5}zjuw0xQ#NAE6!>X&QqOz>z;c{juQ53m?@9}LXb49w|2ir3X9Gp{mKpqY@=oyr z>@+e%XUF+raL{{npW4D7_H3sl;a28QA9Y z9;&iyQ(-a{qe?XI({51X-T*^{%jSNi9T96;!z3rgxd-3uEXpBm-abyTnjJjGf4D4M2s}%1RY8SasW?`Bq7t zIyABo4LzQC(~`||_PAu3AglC9XqYJDUAFq>NFA^jr&V2SR9H`}z^O4+jjzf^#R4J9J^O3PgSN8VWg0*X7`4_D z?^N>ydT5j|)`EqJt&@;F+r!xvvY`8V0rrp>>`|7aqnSh-nYWB50F?(UC?}<9lZ{Nb zp6>R_LLH92jA(ygMuTVPTv8f3JB11m_x*3h767MalaifbT82|#xCb2Y+F^d;VocPq*C%nQ--xX8SIe!8Y}%RcH{TynMv#g;_F z+5CKSQ}(xu9lw;mbU7TdIsrsT&)l0U^j<`QB?K=Fr%Kr+xaWlLkd_s}T7ezE*wzI+ zE<1KE3aKC3xYORRY=3d1%t&d%X)mfuho?WIvEXjQQS;J|x}Lyf9j$)2l1b;7%?Th} zdPX7j{b&&X;Xlsg*W_a@18#mV{FvSom_4T*)&Hx)Q0JKKAEk#1Mf~|?uPGgZYsF&2 zrve!IeUC+#)ezV1o?u1nA?^J{`P9xAT_*r~m-c{SE4mdISq`1LeK zWaAGZ2iu1Y%2KMGQYV0QgMwJ;8L>6aOv`{fzQ@wE=lCHi_jR05v32`57g;%rrqm54 z`o(vt(b|&UU9_U|X{SYR-fg7y1y~oQ8=op=)RDN6T^i_BEB34-X~U>$ZmE{jrQK>m zMyX68Rz8Gdhlj-a#6ay!{NzBAWNK&p$XX+Xjqs zZ=Kl#Cjc>yPW0=^r!ckO_I@7q?6F{1X8YKBRK936`C)X}`@L`ZJ(HV~5>nRQ@-DLe zqET7;cQhsw3)uaYqVCNmtk*izzW%aO8CUKTkynmfbougWjd`;d_#1EGBL&1FB}YS( z*5|CI4hx1d8YNO=mzt35ud~c9dyxLsg4um8;syFGoz05V$E@nV_xtG2f8ZP%fS3cK3sY?wZvT0P14LR%MXuXF19O z_36iRbBLe+d*_{-DCbeSrRXP0X1?E$a=7p8;sSjzbMBExvs2*=dCjmEces#wV>7*Q zY>4-T!j977*K}JMiNBvoImRk01bv~D9a(1Xt^5Yi`2BzR3YLZ|4+S1-LCL%4ldcXn z_}D-=%HUo#`Y2B`dIimbLd_c1dd7ZigJ#g%Xe%2{7%avN76UdYuh^Q1T=?dI;~s(A zw(C%%_oX^g-wZ_--^Kd%{dA^0=Z}thu%cwNP`xBNhd0z64KD5r7_=bkn~kZ#p~Yph zO~#D>VaH$nqvuQQ{Huf1Sph-UpZ&M?ypUl5^RwrO`-xuaKpXJWAHWk^E9Nse7-*yt zjOP2p1x@kJIdwt9{A$PpR(6g{d+*HpG2n@1`J>C}vn+*O1HIgb!bbbE>1r?LO?)eO zg93^7i=K`IpwX);+F`Fn#QrLQ(j0o?K~15pSH6`wRz0onm6?%#yA*RgAVj}Xegd$4 zvmn-z{_jpfMGACVJ5NMi_8XKo#(n^x9{<%n>+uA%00$jOOk8cgqDg_ibCN8Z@%x!I zNwR+99u5`PSPz$3fvS=i(1ZeR(Q3Pn^c|+pdja;uh9ubdJ9eOcaV#hSOkt>I@Hu#j zs0KQ@@5DR&8d*(lP?Ly9Og!EDWv%I${p1Ys!}CGRbe(ig zZ~OaL)n3nyH8}OYB+sRH#<83L7``++%7`VEGO86dqc)I)4)f&^(`qVZP4OaH9&}I> z6U~DyC~;XLSAOg-n-}c$7dYth&IRqoy(DZf;~0DuKFvckU7Wb?{;EfqBjg+1$=O2S zE*R{iG}^1$uQ{`PdSg)e4!znjvS*N0()^xix+B9GNf1Gcx^F%BsbTv79DB$28h3<$ zWbs_iWO&YqZinGup2}RbRr(2_{GpNkZHir1DL3DnH*0mfc`8Ts-oh*{rqkV~$QobI zE{pwbId?=EVvL)>4UWUHxyd}5z{BUO!;Z+gz&x~Ar05=aH@J^}qsn+@go?yP ziTDV2d&@Anrgs#7+QrmG3o$;*zBcm1hrwmB`#qG0`FR2G4Ge}F5s5iHfIt>2l$@xO zSV(i~%FhP5J9Ip5DCU~cNMe@z>e9Eq7YYn$cYki~xtu=f978(>!@}s$NQURBY0}qh zKHW!WV3;TcF0B!f1fWO+?Fh@U5EGwo#f@=3H|+XYaJ8C0Na9n7Oy7@Z`oH~U<^SwI z#I!!Pa~PZ@?Lze4Qi?I}gt_G!<3<*Sd#E+_6Ua*MNJ)rS=XVFelJ2R4V2ph-z?rUW zd+TaEr9I+JPjiiAfmBh!}1+m|j9j=_^0dJO@68eoWAu`TCJLj|xoOB>LE`D)vzLL+@|vZtpTW-f;^UD?7ANrCA}K!(Uj z4NDNgS8Z0hnrwB)1qtnZ)5LZ-sW{^h?TsRR9UXZgj%`qURNqQyhzN(*IrNz^S)=H6 zb(!?dogRqdWyBdv0#0KU(E=Jd?O9EtH#A z_|t+U^x3M>yKaBPYyNbezR11}{`)H07oQ>4{PS08;h&_{Mnj~fIw8zHR^7N7pRPeg zt{j6@YscRsSi~{c8caK9brt-#BP!M`nCL4Caz3r4BE4CmvH9y49}ng>tIiD@JQxwn2^NsxuP(ABI_gGKQ^UoaT9_za6oEl;;VE)^I9H40nokM1`vs4FgN%q#nOX2n z=5$~TNKJY)Xe6KLv#hK3vW;MyGOo38ls(qp@Nk*EG4;o<`V&=t!A_M|J7*PR+8mSi zdXOj(>d+U1P4hDM=edHr`8-hJGoW;98Vo68qk2}d5A(XECKj7$K3Msn6Tl@YuU5>|VEEVMar)2N zE@8d~Fg386f@2jAF8XU_PY)$ndAMOiYI0KoV1XzrgV~Q=6{)Z<3W6xf#SlrmvcLii zpK0RUDyo4?BHQ#KuTat=5{XNJwdtF-@NQz{{KirkhdfN&FAkHEM}U+^&-B`)YLXo8 zHgD}-kH5Ely#^9N%<$U})_^;~^X4!zzYF_@w&;YEsw<0gE477!H}0e*&2F;%s5M*$ z8MKXnJ*HPZ923}N#%u2GX?f9 zoYjZGeg(ekHPnZKv)ar!eZWx7QR4iVL%O*lM(P@aN-4ow&F~A_WuB1s?iP zN{}o+6Ubm8Y8f+rY`Mk72Co=@7s#GE!bEcj~2sJ)1kBvp*7wbooC zzbfto;6;H!@nvFPW#S4WW@U8gb7-qMl_x1B9@O@Nrz2XfF?%NOT?Ia88;wENGUlwk zXJnSGSScQ9IbmV6l5X$)kVzJgpU3P3hBH^URMUw-0?w~kECpuNKxH7PkRR_w-kNws z?<@kD`@x413#Qf%?I{Gl6W6zKEV%UUV67G{tFW=M&s~~Go?ftRU!KkQ?Qc$jjndb* z|3*u4Rvp@2lEkYk#(d<nHA5L=&uB#}2={-CFG{6_T8#e>QZ7A-a_Ir5^gg-PieYE!lHY~UUfw=2F+0GRT zgNSOMI{gB+nV1ykLR*)rJ&=vPCN6L9P zPrv4W+ZI*z>s;ugTI{rt7P$q?zLB!O3MO;rMAp$Wb$&z3@pQ^}m)eM2wwI)Od& zR|A~xR3Q+Y89@6qAN|y%aybgUTiVN3Vj>%k*sc}01DgzlZ28aIK+Mz`N}#_~w_&9H z7+%=-;x1zHD=8HBf^*KE8GduIRU6*Lh0dv-z774oGTGQ*a#w%N)UmFK`zOl%?#?nH zu*ZI0?>vzB77aF=M#6lTd8+fx1d|uR9ei%b|F6Q+VQIx*+ikaf~qBnKH z5i*j?VIF;EJ`2;Z8XFdC<-}sf8Jm&FTo7x_Q!A);Q0m*sB{h)x%LpmEk}hS`7gOp^ z75AQru6vwW2dr}#y#3a`<||xsT%{qx)^BHf#knInEdnD`=Iy+Exy@eg^)KHvV;fv2v}RG(WS!q{(^}rDS2%7u8j%J<`7I#aTt*87r{e z((dRT8IY zUX?-lX$%s^#8@?LNk*yh<;#D~e{MVcsk{{zsKYw%)*G88ySSEFmYZI=%VmKy3q`&K z=V8DUvfK-AGP3SYc!!J(1DLGKBr>GsSPes=iYB#~Ai}D*@d-xU5c318;VRbYnL=QG zwEy}k!+3J3cPQ8x=TyF;QH&dw$nm5JBC$8P0D5r(uxnuU*LwWZ2W1nNylCDRzDWk< zwLqXq4o#t=tLq6B;a6Bcry$Cv>Afn8N-Vo!&>U%`8cAqeHY+h+_ve?Knu4%IaAObq zS4z_~9p2US6EV42xzYDS?fana!PDSx-|Nv7VRmBk^n`If*ZteZgYxZM`Nw}cxBTQ+ znfk%w!F%dR{)$G#e)NpV9P6e!&{~IViAe37pNFZK(!!F^j(@l7=mU9}+?w38iue z*6-D7W{=SNxlMfDe>-dJh?}!3s9-Opg+%mE01E4XE6`hjvkF~~{aG!!A3jX%p<9S0 zt0ra=A9lf3W49a#j<5jQLTuEkVI8mF z2Xd|XI^MIMUp@*LS3Y%;23d8NeJoe!w_$({HkkRqCYEGm*k}BGRXXDZO4NjFS4>lj zX?u^r9XXef-EB;}AH{`OAve2wQ^qESbxiUrD6Wy>F*;3V5AT5a-PLfhbL*Ink7L-X&761Lenq2JZ$oa1 z^Ex{3(nlyS;Zq7BA0}bXQ2lH4{=|e&$%!q`16;m1N+U@!mHBV8L;3kK+{NhIR;gw` z^3G!)U*2LuF?OeKIN(BDyy{41Rj7y&0 z>B9w$p8$Z2*Hag~_s1POxBU0x9|HE-e_zebe)~ZW^4J2x1OaI|N7&m~D#VMmWTR&a zE`Vvk4WS>Dvqk3?JVDN^&Ec)!<&4@d^hC z^}tHVJ^DRjWKG6gHE|jl8I-fUz~C+@Cy3sTs*s^Y^^O}5h z!V;=X=RDpBv3g{+MSKgUSow(b3j6Y$D!KR~$$GW+T_yPmte(D^d zKVDe~S=U_4jpGGR(0omBcFp*dTF*9Q?28^DlmV~|L(#)f3kyVg75wC?Pw8tCgPj=^ z*&f;|%~-L|jUmL~!|&@A{!Jb!{HHQEw$n!KyEb=HYc;de%O0@e`tv`NHt2h43PhF` zt%nO8^Yi*{cs21MCo3{9Ax;S#PH<7u=1hP=!JjJT%d{xazimgVJrZPGJGGy`s~o+9 zV!8UpL%4TF=`W(`etn+;qxV~j5}Uc-9;kULT}1T2dPJfTh`2g-(MV3G4P*5B7U4AJ z9*9h4&6E&R&=zX&TF^Dps{r9YJ>mhc(E|8L2JfIFLn0R?-_yka_;gvkq`R`5#zB|a24aT-2LS}1zJOg}jIn$w?k|f}sIO|Jl z#RruWjC09_Ox9kegBY2dG??MY4$hy%fEQw~_J!MF`xy-wVX4=qj>O?GK6Ddk5W*C_ zMbeEx<7E99@LdU}-D-Rp5*3OkfXk!Q`Z5Sy#%r%+CG)j(qYtlBhB!eeqm`)27#D4l z7PY!if^V?SL(yAL_W3keib5@K8(yS7i1cibTn&v(0#=&#!P%~RwRzH_ThZ^_ysdg1 zgmLGZHmmLWA_GF$c;kqDIz+c+R2uw=b$b;wnMbscSs1Jmls}}a&s>!VwcK`C3Z@2V z-LxKl@WFy-(L=k>*XE$4ilQ)V#)CC8oQ6%*>OGAKs2#2b*VrHFua0l*%Q~I_5Dh+l zvztv#frn**`nLd7xA%)fO|H|8XDTec0_1@Y4%qpW5~voRB)bXRyRGRRdX(Qjum|2u zdgEr=KUF!BRwfvkIlcXr8weWlLi*^2kg7+YvkZhx7b`fpmRuQn?pPD@YB(*;NY|pJ zupl@FGQuPyZobLi9n-h70vSd4&?q&KD=DPVR@j456Odgy0l3k`akJitl(cI+RT|m( zgSA%_RGm9UfY*?;V-gM3fh)>~Df3`VAEWatThX}?LV>$zK$S(}lP&8E%IoJHazXp( z^!^tD2m&VFmu#IVK(8kaf`PjImfYuYiLa9Q#OK|jFZ5E|-kB8@g&L+R!?c&At;wxR zQ!{w%EH8KyRk`ClHDx@)@V0&a^UIAc?G^XWwjH^S0hKeLuxQ`482h=g6~|p3Q>B=d z56-i97}}dt=vKzny_~}@JPC2|{0x@$K}ec|ZvWGVuiKp4nd#Ux*i zsj1!qi=#daQez?Geml$P_sd1pXwvk-vVvug*6~%~dpsFi&4X zWp_fti%n=wXH-5+~w zJH^f_hs@62y}{+g14_-cynH-Lk|dTW_5`|%`2vHdH${1cli45hKEH73iF(0b4+Bl-`x9k%NMs@wRUFmTHf8nm&15c981OaHQ_-1T`OmN)v-D)8bJuF`qE?+ z9#O2uNU=OLb2UZ}qR4qJm+=!|v;J(FqE`Gix2KG%7@uKTWa9B<>*cvu@rFw<$X?*dDM&JH5*d-@2ALV7X& zQ#OjWzmM8^vf~n=K4tx|asGasZZ1+EE(1GNm?81i2NI57+nG*9_9ae1$Nv!7yL?X$ zIh9+Y_}WZFCC)vDB(uFz>6;KZ6>K)6-<1U78-V^EQXvpL$Gw#FEax=`jK4 z2Ww7;>wj0J!|&*`-SSgxP}hMZ&L~D}@o#6*sXSl0EIdIpg@+;TIA98JJBJUH!rJ>< z#FgoQb67V&wC%C5`9ywt_TboUC6n}uo=rT%qQwj1qKsk3Bwo`2y=Y|Fz}GcBz`Tj#@U{FCPqsYO{N&n1`Av zgVmj~aAnVaY!<+CTi>c5)r!uEM(TeF3kyxbAS#)};waCe-#8|^}%u6tcA z&j8XgU(5&LK11R+Rc*bbnV%!HnrTo0u`T15&t~)09cR!j6O7ACaVA3jRw2Vxn2f>_1dc(3PKK5n*mj@ zRPC7+zI3M6p6UFg+^-!`0&n{Lc5=bc*qk_~5-5GSoPYUgKu`uT{VjZ+%yPaZs;a(h z5v=HETYohu3#Il#{iV#IqWpttnmiMh^3)unf{3t6- zhE!Na_$s5PTl4!sl*S*=q@I^3$>4ggbR8VQiyf|LkoSz!Y9L!9NigKmS8g7ZEbh~* zqz6lEg)X1yDdWGcr3 zP5=h=2+HHhTMk~_xLqtwG zFuIfS!QI`fiNjo>!mK`Qkk?|Ub4Wppw~2!-C^N=(ZO90$+nf{B2L@{|c|>tVi+m`` z_o=-MHxZ7G4Zd1|bFQ#MgoT&mpcF4Kbi6C#&hEywAPJ)rK#RO)G()AofN_OPfwo-5 zW}nLTT=jL5rE$5I^*}fwXPcBBG<2;0m8=bE1*Qd5=rfStI;@OrSmz-?^m#NGxExNt z*?qT;HDNxZ?z$ts5`H_ENvj(&VAAy(;wzGoF3WaC5HT%nA2B!nVBrnS8IQ?-2)O=T zPkc6JV=JR_^y_g1>eXNIB+$sFmzSnoaG+O~MzE??(wKSr&g;XR=RJr2=0N=2am=Kw z@0zU-v9BlY=SyEGr$})L1(s*>T-T%g*pihJ$r;z&<6%yLFfp;9Mcs&dunT&;qB)3O4^s zvO>a_&HIa_Ce#O2;``KKq~mh0z1IX~$8p($Cf(LeDTnag!UwH?W|%70SYb;urK*Xd zs~2g~?KLu-v20z(NGm_}K=uRx*4^tTH5hp0eoxdX%*uaTt_L<#ma~0fyCSwk%d@HM zf!^{y+puNm9^6P%fl2^{PUYL!@A7R36y>>9vPRKs9pH|u?C|gdG9P7@Jm~y0A*Vdq z%MyN?kW>BfeB?h#zAdTg+>tK!%4r5Cw|W%hMIHT3TrQn1#^|n7bT~%+YDmsZKEe$_ zOmAR*mxD8t6G;1Apx;qPus4SI_f)RZ=@^QSIG9 zx7=Q!NtNeqU`>WMHHY%8AUbe>qa%M3ll5rHu1Mm2AjvNawN3E~rxu$DKP!Wk6@U`& z>rexRW;}Elnkj?kPhq0Q<>5Z+lbkF_={!55Y5f|0&!hCXJL(%13}r~( zBa3{<68&)br{{yF`mYv-V9Ev~x_*k%I26awOtmboECLAZUoCcM#i@@#-D0-X>>c-4 ziM`U@^86L>FK0$$PVM#Y+p_;sA0Gg4wkz^|HI98eHREr%QVPe zh6N0s%XxXzs?8}^{J3}c`mbW!3h1luXo9h64;2m+!wOS4TM4D}IvP{c18PkX zp0ICegS~ihfQ>VS*-GQyt0Bs02Fzn`8E~=j_mT-y-RGZ}%SBm3C%Jef9&uMjW-QY< zF%lKuEgRyVDzq4_Y&dlb{?^JXYcNT zO%nV=oAJjwDjmKq#f0@W_`zVo#r2U|DC}FFDk(6#V3A6)sO(9;s|GvTZ(=n+KtSl-!Oyy_*{rsxBFNR6EQXp+h36_%?mI> zjle+PCyl6<*;lc<23ZZP(u)*;#ih#Ak;SSW&{Ns z{7WsIWS}NtHcT;NQsnA>7;2z%jX&DUnwCTubQPWTIr4~DCbXflzy%8t6Cs`ehReXC z!3=$O8)M&}8J<2hu73;48!-B0=5CE{Cv8Iee8?1v(9+&o?<;}7MPOd*uS;;&>~F4A zDNR55r8vlW%v3mKw7^176>wJ>dRiNR?ykhflfIF*vb)VrY=lxY5vaiVRJe?Z8OEaWB&qypTOe6ziJA`ZQ?7x!10Uo zN_q#^-BuO{J6ZzTlF5d@|Bq)B|7l5Hr^rY=%@A$Q$-xtV?1CiKR>7C=2<=tHWx)Pn zBB*oVnwRl~nWFmeBb@;K=9vu9xa!w!{VlAy0lFRT_NO;-4m|3y(QPRhr==0dw{L~hht)Ojh*CLV7h1a%qzX6$`9}gzDF9f&Py~`q#5?p``0m_#j3s{8y`A6m*?4U=$I zG4&JCa7=48W8VD7^DpE9fJaF&!JUOHO`Zw%%b1k}$y}DleYxl1# z#n;_A$lP|&F6K=6`x%FnT2@BQ9AfCWQ0H)`8NmDO$L}Uj^P*Wd8dh}u;yUfjR|6^6 zRPFH5Z$&NC6_RAj+c5l}D!743MHi|H2d2~Tp_BlvyT9C57feV6E^I*;`>N@6jq$@R z3ST+*SZqhc82!2{lw^4#v+wkn5o~Lvq`PLdR!!G&7f0PtE62tj>`cb{C2B@a%P_+^ zhr=fOY8Z>b{!UV(PozX<^j{0DFC|tSNnZka{VRD&j5UK)Iu5Xn)7rraLk9DWWeUX# z5?|MsT8o_3q$Sl{8{CdgWI0bJc8 z<6Y#?z#6&ajt!^in+=s1VNR2N9Z85vN(1wxQBsZL3h5xQ9X)!iu>Jn+(r32mD?%>naFto82?2JyG`y2sR5rp-6Lecxu1ch5NqLxpgtg^9 zLN!X0fNd6!8GOkFMm#!OX7k@0dikK7KPShmEa2jH8V%DXou~iAH0IB&n6@aPlAVL= zRtNzg!;5tfE=r6JsD+~B9bp#D-5S+eWz#VN%%OA-QJFZ5RP$*KSIcFjv-DS8Z~2@Y zLylOwWg&!8R}g;UIyWOnG)?DBe^&g>t~*6Lp(1CJYn5R44ffigkf!od_*wzD!sz?= z2=9M&P6TVPlaeKPw*v&vz9Bi^xuMTgY+ zQB-BiZq9@XHy6fmfpmlE6Fr8w0&hD~U#xR7SgsKa6p532>!C}Ft24Z5(Mco~l2{wFjeE%SkGSt`x?sY}v~)Q; z{i$dw8kYuOD>QWL(9j#_cuS~o`LXa=Hao;m_mx9$(sko+P_kYkue%SB#1tZ%$oVB@ z!#Ky$wUXMW(Lb)Tf)F9pUVYzg6&{g#x;MrdT;@y|tbw^r(x6AcasCj*~ zH+eXmzR80_*f{^l&3PCpzTG*zTx7$W&Kk*Ob4-f-CMh?Zkc8w*)04D7q9nBm=*Qmm z@Lae*zMl0(jYjK!6LA`~&{a-bb#c4Wz$+~5Rm@tri*L;VENqSGlkw0iWUso7|HiV4 zHUzkJ6e>Fy3km*h}Tm?ZBdH3YZ+V-WG$IWc0&B{*y z`itsyj>BcY!x@X*9u#cr*%z{Yi-O9EqZ^n5))|oWf}7g|Ce6aToI}Q$m;7Sf9J5nX~{bq5ywDfMb%l{07`+J>x9>&{5(;fo?ZADi1jN-V{ zeDmD^Lag*sHjGqmpfSigbZlR3Z5cvb(UD#bOeZRu_Es~+s6c7&1@QxNmixZ3Avb?t zz-d+fV*%HtaaX!m-N-6g+Vp~_Mg+_#2M5)tfO$v9RnHGk&DC_O!qR0pHqROrhF*UQ zE2TBk`k?!e;$IzpTu?1PnjxCN{LE9J%xQFB=XBvV;yj&pAltZ`@ok3G|r7m!$k_J;ua*=UF8L#MkU-5~AZeW|bI0o7cT=nJ))lIP0JbI(Wv?l#gk~M(-z6# zihAO!HNx+-QWqTuZV4J)6|HjBXC+>F%E)(B(|KKbR*dnjBM&n zfjnxeFx|FD&sD7C!QmF*lGT6Zs_N_ygLmzt6yi#`8nF!qz~$oRRJdE!Gk}PIfGLCXSYN8#q}Dav|B50!yAb%WiIa8W+fGFj`lTu zK>Ku9)&E7@d&f1Et^32w*v5j22q<*~BpR9s0YaToigYOTZ@ zlup0Ss^o)caE#nKSLsuU^%&-iBzlyE>ToW5F{`VHGhLw+m zm&g*fIxdKz#MlteX_pYP+NiIvaJn;CL3%@c0q zhHk3nslh!V2bcnuDF7fL+(8%SFt~WhPzYAAtmk-LRNhPge={YG`M_Y>%|B>)$s)qt z6~a2enSlbf<6ifPy^20V_?tSE-X0C(_+3(Dzk*!o?y$9I2mw78gVdyhj01^_N*R8y zhQRQZG|v#%qldI0QW^xTZd}6f$Cl4F?>FJktGv-hIJ!- zbNTK;#`e~#w8vI5k6C43hjVb!ft*)~oEjq{WJ;KBJ88x8<4rG>ywY~XyYFaZ8yaCC(*bm_>cgK-LWPb)B?L$or422rS2W?(X0*3}Dh z!sg$5lj60wK zhaR7Rk3-^!3|cbQ&D3B_PxI}a>YkMaw3mfqNK?@QD0yhNyLO%+M}B$d;0MmhKgR8U z80X^m2|~qA*U(f?9Y`7qFu3b1zd>DO&5J6D*HsvhRR{Ou%i`!m7qYPg?B>#?^l%gy z|5|w>&JkaVOGgV=#5!;kzhP~$mo86@Xt-%)4l6Yjs{jd%JBXKZ8~Y3D^hnK#p~T-Z znX!5V%exChM z@kZtiIL_IPykgh@^Q^n!D{H+cxH9&ATiHgBaL}O5`^Q@AIlyuFzw>vbqsUpJ$-wj` zR4#EFL=y7#=IOsu91?y-khB7$$I) z!M^*EdDdCIZ!~FPE6E!v4gZjY@E~9Rl0AagTC@pMww7k&<3GWAOy-@OUM_+2A54%q zu#4k!3am1^n}eMEN3Tx}%A22qg(dfgyGU{Dw@rjlA&^o=Cc2(!#vF z-0CBh^W8Vfg!5Waq&dB%uN!tL?a|DJ!5EwfdR!2UKp@4rvNB(aKM$$QjT8lTZ@?Dg zC**G)pKM92DZl)!YyNenP|mRA?bgNMntl00Be^V%mWZ9yQX?mQkaw}cJ?mUTF7EwH zH2NpXh6)${jzUQu;JffG`&}}J1((Y%rTedamSiaW>QhcOa1hbf)$Lavyua|ptVYSg zbso?hY=r47M7ACBeYRLGBWdBNE~HQuFRy;>kEw$hlC-=WpfY0C zbgStWuTY+ak-LtcXZdJ~S%eQ?XjsOyMuihCY=qnR!2>C#UB~s=-N1X&*b*t3Qv2=& zKuTwdN^{ZTJ9OwzllXTZ|DAyc8X88ZnL)0t8Yd{sv9!IKNJ8s!!3W>19+~a^5FxUF zzn|((b6)k&F$U6Bf8Qwo=lS5@m&--xsz z-$22M=0v^g{gj#;St$wqic{9`Fjcau9Q9qtQ2eG{=wea?ms(e8cAu{dk*~in0BG#b z)5ju9zX!PVqcZ>B4X&v?gtc6#Gn6e7UXT2I@ydy2 z`Y;#ocqp_f^}>8OEn%qd=CC9eJl+xjdb3RkZ6(WFgl=>sD^69;LPNWPRE<7wcv2>; zWUPPZ^VQxsl(0yCJdN7u@I7rH6KkUyZ=xS&d*tQU4B?!IHGcL%>=tndw=ha$_x)2j z)!sj}^s!>Y2G*=59;hC*HqIo95}Um`+)x5R+R!^u@vFW)y;KnJ z7_qMOkiumjvtfpljicsat2d^V@!)jRRlyF#P1fJ@Ud7z%ny6iB?p|qbiTB6ui?#|2 z|3Ku^lm~9kVVk&j+sDj6w#hV+V)I>iMhaMiGaV=HACLRo=q{1v>E?Od+^TVZOOFkCD2)va+5kv;^! zA{OdZ^Mo7V?^nSLNFdHD-{oikrL7!6iYmD^;yBP%R2pXmij%$D_E%{BEswv1xVXMY zwceWi2gJr-=FY$S^mEFuM=5&4o52EJiJP3QEWC@>SUWZ)FkW*N&MAlqsrlFw$ULqP z?J6!&P$X!k+KD9tx=Tl>#ILnm31)kl&G^7rJC?GOnB2gdi4&jQ_Jvt8<^*c_W_?ZX z*+>S)2C|5q#P9*%HM+@~b-?3pDQDasby}@{stK0JE4A~o0a*wb z9UV+U4oLjPokAiKr*+(55P9_(A-v^Ohb>*^cKfhrzYdIEXOZpcloYJ|np!}_#5bBR zfPBw!I!>bMr`pZ2!;@>*zR?Vea@j3MrM^njNBIE6a6KcubU)>?haqy)y$2$TrRHhO z?qfox5ppt0KSW#QBKH}ZDYi|u3b67DM`HHunB_?m1sWHWv;O8NmY(@qw^^Zb3}qtA2-a5Yf;!(-w*$em<{$v1!kTxo4s3!sK2rP}4)HL&hO zn}4QNyr#QLgU|BN^d6!}RPqyWOI3%o-+$k+YSD|RT?i`MxWS@uO)5HM>1bx|kBdbl z-!LSW{qTpKP?x)6Ntp)w$sLK<*8s&?!40KZu#r zvC~vI;KTXaDKEDG6JsihXkT^trdoS+recl$$gqAHF7#fimH+2ALRVqO;7qmhNoAkA z39WB#!MewGl|yra(Gzg3v8%VUj72Ki*DX#S5^z(7o_XW*_1aMvzXosR^k$@!P=XpOMNLz?{4*`V^ReeO ze=D0AhYI88uDJt-I{Xv|YL%`{^y#GDgaUKg{p`N)ZC=*q64n8p&`?x5#-%$pLP3oc zRdZvpp`+rhTY}cj+NYZCD4bSQ7FS7QJE=LB0=a~6)?miTYT>Oq` z5_GUGe4PI}&L=HyXT~F>4S-cS{{gGw!E8$}f4?Il<*vz0Ww{rUhl$tAe)+OQ(}8uk zB<%~K@!K8Y!b)MzagA~RajN5dz0=c^erUh)wp&##MlVS~l;UBGF6eY<8=jkQ9YnkN zcSLL&FBxmXt|ol3cY9OBLaSxg0djFLK4_#KX5to0V%b)xM!V<7(6nT6n*s;&UCpY6s?}m=bs7m^m|`$PYB8cf3$1^mSgV zraI5RUg4nkrYS^PdT~je^~m}Bk72aGj06FAl{qed+aCo{z*ISft9%eE^wjt*xHdo* zF5(_2E2r>zn4QT`7qhk5t+7UP`A612d*y%O_`}Amr~>JFe0bGk;m+hnv%k)2iVOaOS<67|l0oT$LT=9X|LfzZU zDE?E3a~YK48CqiJs5>C5p#EtydBws>(U(aF_DF9SV+neGA6z8J&reKm_(~iNu5%rT=4hDjkgF3N99>_Ke0q_$5@8vhOZFw z;1K}X@@Z=$!`E*BqqCEplYWz~-p@Wqshyz-Hhc$f4fQ&lW_p$XrkjWo; z;hNvBZaJS0+Yhg;Jgr9_?hFSf$B7~0!M(kUOUoRipG*vW`JEC_Z_V|zBn4v zN+*8Dv3y*>`{j)E_^QqUij?5g%2oT2(-nX^gw$QfmXS5|rQC~uuhGwP6^br^d>3Vw zc$ar--$=#eQ~P$Tugka;wKJF2W!W~NA#Joy)|T71jGJ!~ilB74Zpf);*Uxkr%Lidc zTq{aq#w?uJ^Dv10yg!gvyi@T|%ky*?hu)7Za2L48)@!_}s1^fQ%Eja}2ED+6He}b`?rAye`uhz%F zW)%!aDE0(c{ES0Ll?@!#&I~&Br4rsX>g#EO=G}vf<(vQHBN?1*>I8=w;3$BVjRICCP4@2y=^1aN+aUhPZtFeOvLW&C6H)jdM>a7p-g?+qjZsijw%ynQ*o4jXB{ z;RS%KI^&oBw9i(G3{dA~&&}T@o$G=*t8CPRV*#E9 zNGC2G=a^HK#uA(2^d}0;qOJ=gkO~4QIg($shgoE*z}pc(t(TR!B^s}c->#eyb+aPJ zm*({?0RS9T)3cd>2jJjPAefq$V~g?wLdo;1@%CGMdwg~Ux zI>XeI2;zIU;_sNnnT78rAF~rPgdMa}PWjkQWiXTkOx|$P5ieJ55kY@I*x64ZH*R?J z-@tf|jk1uO0mmL!`KM!d-~7q!@VrF6wwaNb(J)FPe$7NZVoYympP-HfB$*O2&`HwC z2}?P(cO5Q~vWK*0OKVjRC&`d!pu96ch<>jJA;qk5IaN} z#|_q8P^@mp*z%m(@AvGe$mFVjrI}r|{Kl@~U6_OR?sW9x8Yf5&KwYHJU4LISv9g!G zuI*nlpaeJ6J>IwY4$Jrhkj81_Yj}@}r+!UO$HX8*#-kf=I>4bTupT-(C?U&NQle`3 z8_fU;FyJfyFktuy7HmfaL=Q1BK69ryjuNA}3OJC0n9UxVUeO?bLFk$g?IV4cmZn-e zGZ7d@2(q$z{L@z)F;dl{Q{cx;%Z)=;w~4t^>=_G8ydaD+zHs_ANtegdsv}Ioq?!W{ zWJ1%@nQWJ3|C%QF_d_!NyK`gT&5#Qgb-Dm&U&oDKC5A$&H259U-hZmyb2;sk1f^kFQ_M}evs11u-_ zY#Ftx&93~)>TxUbJCH{86i9Q|6Rlkx(g1V+sIkjwEK>_VGsTrUhrAD%H4d%OO24d(q_ccA}?GoaYjBefiT0=5kvUO2wyav(uSoHM_~OmBt*PnaKn4+WZCn>p6oj7y)pu?U!f;X@NSb?D_&&44U$_Uhm_Kt=kYg)bJF*B zBD=~Ks-qAI$K%(&K)OZ>mb%+lx?7;E+uECl5|?P1GKRG!VqMt6E9D$h*qpK^Q`@T1 z06ov%S9?}X7&Q{knEXm=r8m_aiTR*6EoW*L>Nzgb6-&=?Z6?T&o+q)N2Q+mgx^z98 zaX9eG7;B5rT{Nz5S0FW4eJwb)m&6H`j?gkGG2!=W<1yj`phfqmH!OnYXBWpBVh)%> z?wEtSR09!tff95B>rUnxySC)bECU(|=Kpe7|65-&e=RBPEt;XdEBaGix7j4VQKGA; zg09sm8>X9?j6*?JbSr@RLt-!(lyjjGx9U-AWa?QxiX$+TT%Cwd&$d?K4jU)9;;{N9 zooe+Nwo7KiyRv!~8Ide1TLHaebh2dl=oq_6bZVKtqN864~= zY{Vv=u(ZR=wk0KG1FS%I2%m`wJnO6Jr$k@TIX%6d9QJyhRXn|wwpTRM73`?S>}nC5 zqAAU)sr@-S_Dk)9;qV0C{x>Bk!lb9;wqOK6pv>Piw}d-J@TJ4Vt4zMR#oF=I-?2;SyAY8eLb2})&0v^O_U*IM&0r`ba18yWF?=h#N;dHB)}KR_33xOqZ*+ zQnh>FE<9Lj+%kv?PP_}#gyyvoVc%%>RSz#5hv>^*&=vLxook z#mtxO!-NkoaqQn{Du1~T{gCkW3e3MAetwh>wxQix$KDB$l~#ZXG`AT&E$#I#ZL{^a zUrx5HsPGkaF+HD*Y9_j37`J;EBoO7&93o(N-sq>w)>O))9>3xcbKm3)0$eieGB#$SrVV$-yz4e# zd;S2wqH1Y!m+0TM`XbM@|H<+`C{mztL$bP^xx}cZ`ib9I!W6@vid$y)&DpDi>%K0C zB|EzM=Q(?q07^kNIwtZW2o2}bX9d=G?W4hOroLPe7Pyt)tOCabbyR20r)c7{gU65y z8@M<Y?4rlaHAtqw`K8H+NMmRjjjcW=c21 zr)P<+3-Xg;9e7DIvz&f$=qwLNiRJ?FKXC{D^516?C5_1s6Ks~u=^5H0VT=6bzXG_XS;8HnYk(k_S$uoxQJG>f(S*=D-HI||Z4JkYjT%*Pzvo#Vt~CUgAq zc)q=4(ZRBY=|shxVyCplYBZCzl9F@blVdF=(QNK5$wsd^g(L8CNp@b>}$w zA`}G~S0KYYp=b#K66TDBE%j$SCKQL#ZNJiCA6<>dL2*FT`oq&%hptuqz$&<@z(XgB z5ttj7G{&&%S}~ETHZ&B)dMrBgi4lcmpbYvLKIXwUeqP8G*mlgGJB0ka0+_GaH&&aadRz_NRZ$kt$ zM8(Nr)x33BBEw^5Tz2pbOyV*49&QGZ3CnF4deGsLqHmXQZ`N$o__3l^ALah7nfNSk z=Yv=}qu^?4FgjMb$k2YNq1g#F^vdXn*UB?j9usRYlsvu=+cNO>r!Adng6nlVix?kc zkzNU)oLR++E0y3%WPq92E!-&-Z4_B4Vm_Raj>rf40zRkV?y~%irk^@lP2#%_-P+>- z%4Z64W6PC)7dF|7NbYh)QgHISsd+`Hy=`T~YFf0IVDw|TF5{8j)e7lQc|8_^_0s3M z5^v9cZL3V4(plzU(JYWB^6#_eG#$bulDS^&a960XdgvW8C@SF)#h(41Q5uihw#MW& z9vh)!-y~P;*I0C+mwSd+2u)odHzy&xtLRT+hN%4{B&CecHy|!@j^k}hzu>MxPFmuJ zm&@*6;frxvxOJF*YV&4t(c4m+)={Y@+;jKxj&avfkY8I(DK-2X&Bc_b&pJ2|c82!# z@kkLT?w4=wZS65T0>T8dhjGW2ow~!#Wh6>%CKSlzxm7s#f7RZH`_1gUyr;+;*dRX_}#>q|pln-pp)%ug$#OebyjSg z==r#g?)RSrHaz7Y3W>56)4F1b1gHxh_K^r*2G|wCKq@p=C0&5aeOW`)hAW_EY%CBe zY*KheKp*x)ojMT)6?_mWX3i=k6#A12Uh2MWB|Wrg02Y*H_3 z-l(OmPF;EPfo(qyyYah)i^^HT8}BsMXu@LREP&i|lb4^)>P>Ea9GQwwatiV%sd)H` zG1jgvQDime&NJeAxL?+sGx1%AXv#9Q)h2e{r{2M1B5`QBnEQ!<)?F*WufN%^Ec3+P zBk(&y$r^|BosLyE91t@sB9bx^&BN>JIgMnpO?s=22iW0eSX)*^Wv&k z5)NvPZv|sl-c7Z36-AJ+6Fpa#)KUY5{pm8@yRXfV5*I}`7WpUP=BzMzdC`?kTg~>n zD&*{FVfcLYf$hT2_OLQFG^kbMMZTq)NmvHLQJb58JJWs~reTPxd8Nvxt!=1z*Vt07 zs9X3H#zpD&O#oD%8DOgqk1i*84?M8*yKv!aTYGGemnpYH@4b^1MVlsH*iVL)aL%m_ z`=(UG8EHFnb3II4fXCt(N7_xS_wWdGH59An`Jq^0X0nZ$$8}{q!GGe%#5^loE4798 zEe&?lY`co0h8a6qItG^gkf?L^ir#SreN(ym=a>aTsfKop@P*MrS%ngRHCLok##Q^y z*m9RVuioC#S#`F&CNEX|qM1$iTBx(zhSw-wy<+9LNkDhgm}4S3XEi=f-n&wDJH{~2 ze0*kdPJITpLp8d;;>9mM3JwIXrp%wKz3`mnvB8KgW3eWe&t2)8nhR@?OLGQ!t`NOL z2VT^)j*gyTI_9JO2Af;cT>HLlYNaBiHf`DbMAs%Xuq`D;0W>OSD|qT&<|VMnvKwM*6=k;*cf_udSo?gLXv$=^XmyAzFq9L@Kc zc3Jk1y)5n(%A**iFV1jiM8t0zA(7sIy9|gkdC4y~`6biaVtNS2tZ` z)vDwDfCe>l+mU9WBq%NgV8z_$@ZyraL{Rfk^;kWiQq#Mx8cX5shfqh+_uOVDBtUPT zQ-c$TmXa3xnpryuV)?1+s6rB3VE>~OU}D%E3qD#_`n;1`k)&}uWHG8V0=AT5`<0%9 zu~Q57tDzc$rEt%>dQ(fY7Z88ipDe2HF?zqTni^If-HOX8Ch1;W?@H3qm~tqx$uU)6?>r(n1ZJC2nsWuKb?1Pdcn+ zKlH6}olz`_RPUE&9*JucF@ye>_Z!%vFsP_uL9O|eCX#3Nf6H9a?&<+%sUGek| zZUJvZQRJLYVGw6ZmPP$KP_ki@%EMK(uc6TR3CC%h)C&|nXb5;VEC`hHULwX_CVrzS zOp;wo02?i~lgc>dz2oSRq!`n$BJEc+VMchYL!TyJ34>PYt;CekT`(u8KKtvl(RcOb zo^KdPn6}}=~I(AUoMT);s#9q?SP^^&S{a*2o#a(BsXJ4Oxa-GeyPWBo~ z91`MBpexkpqoA)3x+@Ybc5DeGpC_md?du)E0f|BiH|iklkaHfYl#&AC+30smijc7J zP+Sg{D%_?Fmh`)?@v9Q8h*E2`Lb%h%lq)PE`r20bd@EXh$yrBs98&k8D0TI0Qe})J zxw7GH7W_?UW~2ptvUY5u25R6;j$_{1M1(h^{A71_UC1V>Vt&ID#U;ANy$+_&tZWJ^ z_WU0hNi-@fFt3c%Q+Js@=@?(s<_UObCuHGjDbGL7_plBAa563u`DuXxUzvS?!!1_U zd9N9Z+vTykb>kv)(7(P^%a z8_1&RO||&gY}Cp?hB`V5N#uX7a-O?!kdvV|bOKK6Krf-l_L!lqX%~V+`Re@MafX)* zTd4s^TGM z2np;setz?>TjyNm;YIdqhc^lXu4W%=t5n$3eWNkc)u`*6z}b2U>iFdEcLuosc82E; zR=?sHG!byjK}~ePX6x0=w~q@~8*{o!fI}Bj>0@(!+khy}^tb>ANCO`#{AQ7B|*WUDV%Ub*&scNaA-=d!hr+C}d1EZ=kJR&iiXr-rdA=Mdznk;sjfUxv`Y4|Xd3!b+4MzE}u@*qNBbH|eIH{rNcc1YFm7)ULuFx#|T7=*TZp>(H z!A9ulOz88batU(CSKUQp)dA)H4U5*vmI?Eo7K?M#&~%a+&RhAFv9P?hn$a_w+d_Z) zjd!H6qAxRBsu)A;{j|-J+hllQl0B@^oS-PJtzABfi2O!MPD*rJqEUq!&Wg16*fJS5 zLE!IUnfY4mN#1kgo@cWt$rV#IhOrlKNe&lA6XeHG{!q|e1w^FR2PyN^LHzAWd;egt zi;O^(hHE)RfEW+=;h%2;=oOGJeR6Uud}1t(1J{iaL@(0*B7QN;eVc*4+GO7XSb4)t zEahpX#MlSsG{*Xw^yQ0TeTL^j#oT6+ z^ZS=bY({o=(59MjjQCUpZce)GG&s)yGZtrg6=TTI38xk1?i^^^c8MNJ5*t3^vqZ*6LH4AIDK>$#gedjr`7oW+!oPk30Tzho% zyUdG0wtk}fj+tbg_-s)k-Uo8j)XFT2u^Dr%$#EF*a7st#)93@58$X$1!>=f>@xRV~d54@+UDw@xx)II+>PmlfLSoLJ4`lg~R#q4oFLE;ML|5|-Wg-6Pjy zMAWb5#7Q?GK`AR2>sa$<<(t+$J~0{K$5v{P)Pn_MX@H0TuhC~E0Z5x9hGOBP3p>mE z6B;vOg*(>376rMQynVt{r5Gl}C|aX4sS5MTsW8HgRr76D!nPpvu?DHk!9e=>TD!wt zn1>utE~B?kM}4RHrjU@yK07`ga>^&DioWdehjA6>1IATdaGH9PUWN5A_nop0(mB~~ z40%~0jB-nx!(3ADN-OZ;&3Kt}qEsvpX`KZ=d|`9aP@j7w1mSg46Y=3}^m^PY;fLer z@~opo0^A;`Mi1rzVnAG-yU@y(7e?brc}w7nK^E* z`63b%YqDGsnnlit#+EfBa-BnCdw4QC6I#6VVa&C2nJ<$>dhd-e+s?~99{ur{`A057G<4m6sWOF^wkXLYB*E0 zp9PX64*-HpyVocHa#xBi{Zf$LQwfM=1K516uqU!*Nk^?+BIn~$l)jsH*P12Xfr5l8w3tPG6 zP$cWWl^0PWlCy#vM3XoV{aK@0HgJX|MlkPPCitY>i;?x-8c}lZsuzjJ+4SvaQVfmw zQCif}%6vZ{T)aP^5u4EjaNQSrAP58u+|>^00`H9qj`praCYOcH!an;6*%^dCSN<+(EPKak^fz>e19wAep)VPsAEun z@&`orys<5bA;i$w{I73Wes2>d^7CYQDH7M@2aI{~>XYG6MV z`SN7?C2qRyFjo81`%G6EwUs%XbA-%dWJ;xYfmH)p7eJ zZtjg$VNC^NOay6ud6y>=pwz(NCdc$xY@gp}Y?JuPexlgGxYNV=K1%Uchbflaykd|B z-h}ONdXIdFPq$h45^<^$6>d%shn~7;4`XGk-j4Nl5_z_1-mo+P6f)FH5UvU6X#epm zDFq&U-+l`y&qO%t1#P>4-mQ+J-24z17IA-T61%C6+U+ z!wt4k4U2S4FZ-UL6ewGzGP280IL;4(*LAr|p5p}Qji{4ZcEtl;{w<+1Tby9r0i7~| zQZ2S2#U?dUBem$+QgCZ;oRPROu{L{{%@VIcdS$Jm`;1?7xz29PPy+8~k)G^%ug90H zt1!K#oN0XFak^L)hkfNURPL3QWQHsKGi7opyCKMJQlmyi4-Wkfx~Tmt3_;8(8IUXJ z>*?6zG215sCD}F1(os9v+-9Bh8W$sE9<*D|s_VcRTtWuE@}~@O+~R&$W<(1EMbOs- zYjF}$BvIW%CKvY;azup41^#tog`XOCI+QL|dd9mi4^GH1c^8V2@i6zTd8a;MdCkk< zpQDMPx*3Bzgq&F%A~cM8cSlq)sNl<7gsi%S=uq<-{D|8bzu2`!b7TIu?_GVah;EWa z{bs(Ai}XQWap|J5NSueTWJg2<%+z4*OA5vPakPE~%4>A0d4SI)09k@a8|u~Oqz)Tc zeWMYh_g89!=Q22$C-91wMZv<5#_5- z;H3mbf!cGdTu}xC`Rh__wb$UxwV7or+gV7|87=6NL(_*F>AKm~5t4MKyoV(UkYT${cXf^Ss#s`%1t+*_P7}|3Q^Lj1C)hfxRx&-tZ_!4F-jhv&HT4K+Ee`GRNGlN&JnemYYhT*O5KI6@3@kx5B=ZW5ah{Sf8EbWWNd z#-}ffK4|o`rwt;MH(b~8WL%Wzi}Sd;Na`E#z*2zO2!iQ6+OUOhgwJLci&nBfHK2MK zyJ@5k=$4^AHuF9+J783(ZcAN%&=ZT~GeC{$d2hxABx`mzV{w2qH` za23$5-T)W`>ye1#pm^3K#jS4Xm-VPBwy~J!&py&>SM6A6bXVf4R8)NSQtrzbFiKc$ z+#+6|$Uh*daaY^@5(__i%HVh-8|xhr(^JmH_TB~TD*TUG(Z}` zZl$L0Wi?}Z&7J1VhmJqHe=q*tY{**MCpUJA9SU2g=?%V)zMNkZCX@`+Dpc{?z~QzP zxXR!olf>fWc6;#viUu<6y1ZJJgR1S#7$H0NBDqa`8S%|17G*AcGwe{ z(n+AB42{rf8gABSG*^8cT#jYOtC!^uC9hoVo=ut^;2<9_j`x`s<$qi{u~q8Y+TQM_ z_&03Z1#WW4jTG%}r9C^`O2he7o{wERJ_ZfS9D}H6$2zh6Y7;`uJX~}RgTVu`|Dykg zShK6<%V9gMQ`Zh_cP_bME(q)p-6o3Fh22Ky1YeUe3#?is^z5L~ zbaUdT-sBG++4BZi5)bhp zu)fXeg>+j&bs=c>K2@~1%kB-9ws-7tb$i|XEt2!XuoK7cOZq8SHgL|n%@*Hi7UFCR zb{xqitdxQd(mr3FXYHifoxAXN*|M#)>?$E+t!4xEBOSR~1I@lo3DC*d_K;XlA<6!h zU4z;mY%^xxXnM35jWmSo+vOWu^kCQy#2#Ya21N75N$0$QT+ylnH%MtjDhNcHM{9PP z%*ap6PlWZrcS{B)h`u$Qx>jjR9kwgv3h&I>H!VxMFV`lu6vM!dA|(mdT!&!Ywq|}V z51ny0O_(M%gvkCRyG+aN(Y_-JVXH4K)g7uJkmt*qGfPB**(ay9BRmCQ8oU~v28Bzo zXoLe94l?az>7ot%m^9{Hy5oK;BVb0Q4y#F|45m`?Gl$*>Ncz<5b%z?whf|2$$n1+y zXjrRn95fvOFF1edE=uAUNj+wzM(VPSDjmC2Vv-C1J)_^gTk;P|o)ta%{2mF(?^qi~=+_5M|Y8EMKNUvnYZ%-TpLI_JRdP$ux-MZ z6J_8htz3-)!cR-8p-o3ul>AA|Qx`-e&J{+|8u7lrK_cH?%#1LiC@Y%po=0UkV$m3NZrRo-kWWKUf&EG`>NHfogXk<{SP z*yCaQv#`L6|(Fpz!W)McJCEXT++qp5{jG6MZqssG?=B3d_2(#Kw?C$d( z0#L3Ot-)vp$3ws2B#pz)&Y_W8{=zdyj0YiJi+qmCP>3h4z&2NX+i|aUR9h90$MO-h z-wZp67h0BPkgF{A%Fen;0zz1Dz0|#NK`a&SX{8u8-Bbl~Kk>+w)aGasno}35VR=a- z5c=$N7=AEohHuxGgRYx-Rxp?P!i=uS6$gYWDROIKaK8x|$jV*STK+Y{ILdAF z)_Ag*t;V^!{$ZFrr8-XZ_Y%W-FDt^y29~w1^%7$%H_^SYy4#mxGzay7gMnx|75;1M zCClO28Eu`-nh?iPgY*(XdNktwuI#JS|H09vl2dBjXaWUF7+$$H>$v)7ZnwTy2{X?|*d^4)mWo(cJFPIr~cO zrxn;D4;1fxBYcC<*9v)>aGg!=x#Nv%Pj#A3x&X_j~#qb+G-pOVFv;IC2&ul z;;61hd#T@nb?@}T$AVVTdmX48&8{G>B28)S7#w%eq5G2dTX~bsCwHdbYL?zDP_!Hx zu6x>_VM*%NHx>x#)b(njZ0$uCP0u?oRr*y0C(TA^u^^U48WSUZf>&46zx>#h{oCnC z{pAn3T+$4v?ICwdn3k3vNdD^`isN54BFq|p@zrO?>$j1l!w*IyXf&Fz52)nd{L6j* zf1E-+N}NXM!jHEvEcLL-|Me4{r1@v^z}WrHSBngR-F{pKj&B~nt*Lx^I4juum_2*m zLfm(;VjyeJ7!ZdUHFe(N zV-x9q1uJSw&r;sQ5Df$Nl9EEM?E5cbR7y}v0zfXjE1G2+0qll~5pEjGpsQPt&jZeO zt0HGww}K9Mae|$7Acx``k-WlLje91^o)IhKd0FP(zW_z2=tseu8e*8Mu+*$VKL%lB z^HuM8s@_fjCAo-^2&mbhi>-k)xt00rb^ehn{i1{ctz3$BamXl8*}`q1Smuyf5?wF)J6za4PFSq2-Ds0X7IBaJ0w>G?g(1dJeM3Z zemTeB|Bw(e+0qpwV94y@k1T$O|9>zH zwChh3_4Y@9`4Pr`I%=%z!wu{N(ayslHj$C7TOPHK-piRXSeW5DR!waPj@6nGVqp-W z;@fTs38R+6$+eD|ZrI`JF9&aJT9TKeJ2f=h6Ld6SQgN_{B>ik;E7vFqpMnQOaAB~Y zcRG*nXZN|S#=U(uwFraHCA)i__zsyEKbJ^xi{Kknj`iVi!$&ezU~z@g9sm@6%nUl- zkaN@Bz5hV`-o3B(I$J%Ww=$e~gs>T!(oceIcN)qW?3@z(>hW*&@(S+OM6{(1JW1{a zBMmzHwv`=!Ei)fn^R${?$1l*bxN+5+hH2KP?H=3^w$6_~<80<@Tl!{g^xI5WJ^9P6K8EfnKMr#k|i@)-*W|5sqR#o=RA(8?67pcNhoNlIb+P$qAq~13 zZjiPSIcWaHQE{)^Z2FS2Z&o38BfrPkY`yi_?ma~3BY zh88(=gytLl^vnx)xq+8DpKz{L>`#7K z4pdR~t?bWx!7+&QKmJU78^h)@l%8b!@Y;``=D6beZMeUVZjH-*qoHe=2d?8EM>T{O zjbDfholzL^6=Xr@MlYLMhke{MKQJIwcGk|{UtD>YOT!0#|3`oRU|D6(%KH{K^sDcu zn<9`KiX)=XSp}#*E_;_9z^@eeh9d|lE(45$4jJZ_C4}3$;vmdLQ`y>hN;CFx>hdpp z;4E2{0=GBaeRDKhd#h-<*=Gtv2)U!bIk=cIP0^4io22r`nj{h+flxyWWkiZ}LkJ}hP~2_2)1rZkfGOcL;2SR$CCjhALl2*n2~NDdqxj_Br%8BW&=&XNJ@dGS zr2Y#Qf1G1({lUhzg}#j!4CH7X75tIgu=s;h1OQ0OL)F=)fFTddo~#=P2T5G@99trx zW0yU%P&8!^KQw4KY#{(K!Pq08yCb(BD}z=+rZ7FJP^Is zBQiucaCB0@uGzuP0G91M%~!D6Y>3)PTs5;~0Iv)c!SU2mCtk!H86CjA9T62>P~7i% znD4aqMG?*?2j@NJEtuB?x{$YQWh3V@27;v(LJP_9P?YiY)&^>>lDX;k z4@p;gQ#jy?3Ea^pUyAV3c~Hi(YfI{~JFebPrx{|xAri@8dOGK3fN#9r<5RD!1{{io z*?;nq#q>J`Z$Blpz3|5ulxn++7Ma_YZTfNBx2_YyEkn+abyVMNaV$fO8oRGKPWr~{UOMNT7-`#~6eMGRvGq2L1z)BW>d7H@t&JmlzO%Ky z^kg9&h`xduA;A+}fPUG!;FtIMZ6YT;rfRe4;xtk?wyUGOlNIDu4*+nLc|J~)#;Amp zt=@|}sO-&&t-#Jy3>jO@u7Q}w_L%Q%p7sIqqSKlhNi_lr;WwrvYKn8UEWg?fL=vs; zR9Q)sXf6?L(M^T1Ym&a)f~)Fs6mq#1-5b{j^PsBi{&BYa?|*)2+c$!(zqug!!L16b zL#FJ{d8YjKfU03_t`(mQZOwMQvN8~Rd}jJQ1^1~$P8?+8)bU^`f&0m%EQ&e8n? zi&dj$oYJXR{fdKiI|F1TrX<> z^r-W-mZ1JBom*LjqzK~}VHxWtxGE-wN~;RANz?2_;Tk*6ZOzjPPGlJzp;16s&PD7k zu{Jb^{niR+A(jme~MX7`lh7a z+gatg)P_;!w{t0fQGZ#uhrpaE%#J9G^As|VD#8^;9?|q8ewwwtI|Ss9HvAy2=r-(6 zgmn%X22-n~YgZ29zsAA|5->U9vQOI6F}n0MCU1j3Qu)GlVbzzhD`HWv;osS=xM365 z5cu~L6eYkktFJ+Awc*+WnfTac{#fHWdG5?K37LL}0S4BHmr++r@)|<1VDg-KTCLo2Y5y0UI^Q9{@Xw6tvuO z(VT#BZ<&1+k(1&QV-0ooT7`9>Rg8T0AyG7G-VxM>HCn!n7qWdms1zX5Ruv;9z(eC(yXD1?%Af5N$aO^xmT=4 zp@UO@!D=dlvp;WtB`j;@@zLn33g(NhY34d&`1kPP_U)!bl41qq(tZ8K7w3?;TIq1r#PI?+;*%rz;~ z;8cM4opTbBnl7k~f}iKeh4>~K%-ZR-RIREgOR3-n$0)^65u@E@|`Vd1x@Y*t7yM&5;T9XZOvz9 z7@#fcogf?)P4Urr_eHX9i`_%SZs3JKAk^y?cfo)?X5G9lf&V+($ioU59ObtHJ@W`=qdtfOP^S~`Wm?_8jx?_m~MIH*` z57V^$>0uWxtg-|omq6SAlBH!qi~%8(F398nS>A8>k^do8Sg`nZW>@s^)yL$X9Pkps z=Ro+dluN51Vhw?srWxvgJv@3#ZFwiZ9^w9mPxC{5K!R-XS9_rND*7u^mP;;ok` zD~*;2nTWNVbQ&J>YKdaH=hu%FyxJ!HRe`x^T3`KiVi0MW6AA(;kyvd$_Of`f&5-?#rBgnA z7KktW=lPJ0Wo68LJk+r_daA_^R7`wVStWf?62De?93$xLe*cmdeW&YG;HibTHQs3B zkhmTA*Jyyl5FOH>efR(YVl6jTqdV0}YwV{{cP6P#L4Ad5ubIsX@$sI8Z066-bTBYw z`WZnvN*z~=#rdz+b(`p-9doX0&@h^7lnS9B$0lrnNYLw7eRMbo2N3C(p2PI6nK255@oR&+HJb*+olkZ&098(~EQN?(n)c zq$*4%PGps2{dfoLwUG@vo3@2d_`e;rKbN_*5BFLm{WAP-~IRw_ZbbKJqI)T4RNrfVS?anmFtsF`AkgC~l z2MJGySQji=>*{$!(O1Oe6dei=t0HMYgNy4 z`!Sm|>r3@hcT72${PQ=xCMmM=%|wc}q-A6yrr85u*t%VZa`uN^)3qv1y8;QWol>o8 z%y%6ins>RX0f${t??f|C9l;rL%&vt#6+q)?qR8` z*P?hk%fc=PWl9m#yYN>>J+AsVoJ~=~`=eO8*CTD+T*edoPH+a|qit(H&qO$VuR#IY z`ntepa*pld&!%i_!2ltaTMZX05I6VzRjD2|iCRV8@fFut7Gu}g+-mmEQ#o~i!PP^0 zenn=UimPO3px~Ry7$+=ko4Br$uQ@$h2Qwusur4F^zPwqi=TyhWPmOXJ@+);fPaW&O zPHseV4)?eCe-nLGEvBy;W&5Ep%{y)(5-in_aCicqytKHWEmqNWn{_MAl;mrEsg(fv|@D*#^dm(Izl#uAw39J;{hFGYkT_38xT^~qAg zHffh0Ddzmr-s8F7Jgo7eHY$O3Hb!-<4|i7?hD{`Y;at^)z$YXyC(L_pe?0W;Q9s0TiJU ztO@qRhitV%#wH0hMFYv%rke3&`K+Y2MMk(j%ZK05yLmbE@ytcMD`Dh;MQ|mpMsohZr zWs`is){3-{mh>Z}4L4lyrj)~-viYCm5hDgU^3My#SyDKIsBHb(yRd(hClyMQhjAIT z^Fy1zjkU8kk3VcXO&F}1OcL%-o!t#T-IF7Wr>t21LY4jmI>CMxT( zmvb#Zd^XL$b9k9K(b2N`>`F_mnuxmnOv1<8_nV~d|N&W0!7?r zVSq-i?UY|~)C_izAPUeKv!g6_{jqLm%-1#^#mLc+GCevKT;FvR7!Qpi3R~%o&(M6} zxWf7^5ENd^(fIkDPv{S;HC%&_7>LiC% zM{Jhu9ZjC<@KmeoHir-0mO^=W$-^1DoodyWEQJ~rx3p8dT`ySEA5yr z(D-Ai!Wp%2Do?RpxBCC`SSNs#k3j53w;NUZX!V0HMAhTU2U^-r1j3DQx5HS;^({ky zW1XO4JISUogF|$rRReE3j<9Ssvs8cYbFpm{E44(n$@Wq;;eNxoXo)dkdGtfPi4btr z86a8~HU@09z{Lf5K~^p!6%lp4>;>+pVvF_M&M+znM0r+4{ULR}G*cp#H?wMMvGs&) zOa>^y^m^VpBE>Ga5mr=~jfJTQmd0c=J;gG!y1Q6zEoMf+dP978P#hEiSeT`~#K&@X zdZM7y*rX`uMlM62BuVdx?&5Y_n26Ip3TvG3nq9EC;SfG#Ue8Wsc1Vw5Lq$D##F62vcv`>z2ph8Hx4>(uX4`1On(#; zgdzB|$CeveS`I&;syIt>tq3V)0n4(&bA7UtPFgwQxFSXXC;E zFzD9A5bo&2&3h|tApiKMd9aMW)Ad{$lqLt=_>0Yd{Re15v2fhufl1i&JX-H;QJ>f$vN7kLi zUi48it-kr&^CdUv&O~61q3}Yk~^~TzkEzmYJMR2=FQX&D&>}mG7se0s&iSL zujcHY_>?rrKI=tgwac=ig!U)qu9<@ONUY$H{tjevjXvNXtQC|}mly4cy-|7No9>Kl zRzw%t35en{#4Ohd`5$u0Lun|e%w^J>y)Y@{s0)&hj5Dk^hG6|DYrDagnE+*FO+whlt3Y=+t zPi)j<^gsr3XmW9Bi!@+IM!3kY%OOJGuD*>;=oEFFQbo3gMx0&9XxLtHz-x2|X(gdqJ zSL0dNu?hptS_WVf$#uqdX!H4A)BWwS()dj>W%G$0GuOiD(T2c6UI{1b>Q+@y+-2~J zCqUfEh7|}*j?fJ;IM`FcHu6+A&>yLHeLdrB@;BREVxwuPv^5l2Hcl|wU+1mT2qf!NVh9RZ3}8lG|WUR8lS5; zrJ;*2cZmWHqNhB*7E|N0tR6D=E-@U+ZS=sf>TkNtQKuyvWA(;v76pASilt`5@AY$GdTNIhBbl)X8dEB8FjooW>vtqFNW4z&sB{myj&OL9Bq z?hRr7{->OZl4P3LblK#11PzN%xG6T-y(B9Y!SwYdU~AVwRHN*N+fp}pZ06yu*AF^OdqHkYJc$QC-Rv6iKHXJ7cs6@{7xSCUG-jt_tX;t+V(u>dzy4c^&c46@7#QQl!%mW*D z#n0OaBYMMidz4?>(!X4$cgvjj{3_02HL|)=2NitHqSn@zG7c`TFE8Aaa7yRa4|pBr z|JkMhmp`fN$kS#TM}@MF-J~iGgV<8@c_$RAc(-1prMjk<)~oA zNcABxnMmx4S4c{A7eM#cGr-B{_nET>X0mh$?;&_|*O4HdA%663c8 zxKU)h(T#NPkmUt7$ge-JNr(b$|D=I?7+-T`G7);Yaa31W{pz(sC#g%&Jm_!r2 z40rq;#;kz~uHoW%yR?~gYI5bW;7u=aAGI6+Hiqk#CZkjSt72-$QqM~3y3@d=5QyyUy9*uVf zp^oE9J1hG@-9q`^hTjzG#$i0pp^+=B=)QnUpwY~Gu&%WO$qK0sb#D|02pKG@nj?d7pYtb~j#pNM3`v(`RC>d@!*V1QI^ z`e%4XM!1K~6N@Rg;=Wz(cSlgplXnCLVSYkemuGOsGN`)XWQUthm{-g|dRy0f=t?l(>G-st!$kGYf@ zYc6$f&AKl5$6V^SGj)ZMisL4s>s6PHBFiO-)XNr46(+{oXAK(<8x7^9+6fcQNn?^S zB0|JgpPs+lNyu?$;iAI86wYp;@mbjB5Z8h7J=~6oSUi(j+M#vCX-0JT1nZ0|vF4%H z)hwnFK1P#=o%u-Z@)L?s-^6)FIz6CdIEq3fh+Z4@KO>_@b zb(ZYCiJprXL6jCo@SlN2nwn3rx8QGgQ6yjq;nT21MS*#DaWCvRsy+9JhhO#Am01X% zO|*oQqB&aR#MNk+P5|H&eAYKN3oKGJwORV)3U_YD7caF^i|`HwK8)@K4G(#j8gyzP zw)eKoc|n&*1o1=an29(~)57gNnNE>aG+qenR`0=pQLXgI94jG}DNiVC-Hzx&bdbTU z8E@d#j2n4HBh3z@dqcUGjGwzZ71*JQ;FHEjjDwvyN37ipohXj8HC;YZ93N9kTgddH z8Yj{Abd?+)K2(s4WCX$VfIhp1XKwV9bZlG-g1T!v{z{tPYg}bEOvNVcZ5O!XZ zGy9fsdxi>v6k%%ti2kn%P;@zLi4ZRM50E)5~X){vyU~vK`{?XdAaQ6-C2wS{W ze}pQ)gk$rAqh?o~k)DU_oNth}3hTRaHHz0qUAMseM%DI1y;CA3AP9RFjf=mCP_=XO z8n9DOO1V|KdA!u;w&i}t%_lcW=8QpV*rpVE&u8Poq5|sgLAnH~#*ZdX6HsO6Ztk>^ zp1-%{*!MY-0li-T20e}@DL#22R$(G7mZWVil8LK;>E>c) zq^@)wU*Hv#yAJv&55a$K-j9eF;gM^{2Zy{$W)k=*8q)RWK77Ny%YBDrHLFCPS@RyI z^F|EmXT5Uv4;ly#F-udGEYr)ZPgPLFi`yq~Z$~-Idf$dwbt3MqYUxH7ObceZtP~%s z9C$m&jZSVlHde{V7R@klA&Wu>*r!jYagmc{~SWcx^3WjdsQiH%|w$$ zXfk8>v4MPN!xJa_W_nASIe6jNN~VU7`mdYO+0uz&ljFOpT}w48dahoZ-_-|ad7 z;p#Is+sK>Djb3`?mRWRFZ?xd={KG3wF_sZ=ZD}bqrDbdBjhmI#8cmvo$@@cLnoFf0 z0v>6L8D8rg`74ndl&y`W&hFU%!;(XyFR;H6ioy_xIzQcJ@VZeF@sl&H_>=5Mg$ z`Gg8N@$Buz;fF0HC6W4W1nYP2yWGNH;SXttr`vXzVfDud%;(qvh0^@xse%@WLJaZm zRQT}oZ%cl!+;g83WS1wgG(+`>u;-sgIr#Wp5WItw5@*MVaJ$^aL!4KmwZlYkAK#c; z&aEP*cKQ=BCuUq+&5fR}qOoa(9E~}2qheZSqb0}C(?ay?C)>BKxLBAbZ%S%K=pAs& z0%k3?N#ALfm>iI2LkT+A4nsh+k}1;0kHm=h_AqHnFrKQs6z(5z2X0jCk*JkSX2 z(TN9!L5E=+T{u)~+T8h;8vF$vc&cxhY7D<+GWY$b1)2-7DI6Zldrw=p|B|}jUF`Lz zJ?b|3l4VIIaa>2_&j3;B-B)1KHJhSA?9@{%S`j49yQ?mbv}AG4JoC6hY)9*w#y5js zrHz9 z-YkYSVEKcYYtn?PrLXomqgSySfML~RO|RbQV71Xm9m5)#r7g_Mg5-J}8YN3MkZ)HQ z!n%$Sw{#=2ZeCh6ja*mC%`VT6B{yA-6CcIZuTjeBhgF`AMp7L}&B;Rh%fdcLrt=_m zD6y!2rh%?T4-k38q>^3}VgZC|(Ur)l9{s-)$Q8E5k7wY9hHgk=(SApA8eeGJNlAMX zrs#CZ$#Q2OrW2)}xGF*Y&bH;x8kKtZY^0g1r{0S+boQv6K#LUJY4!o_6i08~rd1*d z44B-QfVWK5YsX12s}!%qSquXslqkZxPw7#LAuY|KM7KaQK*;%s9p9YQRgz)&hpX=J z$MC!i<`&*+k#xG8VsQ{tIAR7opt5fq$y<&oZ6DNko&Pj+x%bemh2n=$MV9JXAonbO%yUvny+g#F@#apC;Z!RZ3#Z3prWLLT2+ z(6e#TyCs@}+<|nLb0?9AlW|}H+@qlPY-kWG+tm07CQfim+1^I2Y|a&?l$STvC>!3O zF)`I0pKe)z-7a@UxB6HxEbja~Y_7d#^o8WBY@48@BZ6Kife+!A@p!k4un?EDm;F8P z-=n2(cg-Tan#RWhQQKd%b^*c_PfKazURG4FvTxxF7O}K*_^sGBqX$8)TKf>Z`nVOs@;B%UGcLY!33-;PC(=z5%A+)jyZ{JGjh%9Y^&MfHMk$lOyy*rW<7{g!6#F^gI03y(?w?* zS7&Wj`e{*tu$4KI3O4CVdUdR>gIkrTB^&JDwkq89uAnTEBbMO>f%mteQgT{E;OWTjR3r#VfuXDr{2 zL6}F+VD7zWuS>9Mx*G@SfWwZq&9IPj#?4m+emh(A{(p+$|GUpS$ElbJ0`&#RbDJx> zarWqle0arV1@oXNeKt~ChF%7MY+dT-^qlMVB1-=u-T&{t!vEg(XF?~D0cXFh7>ZmX z7Lf<7rasuAl8u+I1_g{7%!^wH?z3hmZkqrPD|<(q!P~q!;WBGH5h>(NMhVoo`NB%o zO5#OP|K<=YRYs)|n8TnSZeqnt+y_(K4ODj)m|@E@h#fG)*NvLv6^}X^X`FVl#C#eC zhyzcTgR94-473cN8^6@6l7rS+#%jjK^Kxa1nyhO14X{x+>7 z2<&#P;dc&LSHz%6Qwlp5%#b6V>-j}`do0aD=M^&GKJpe*cNia#d;RTqwz`Upj5mTk zF&BM5a+vsXxRrg-c~-XDn3TXo!s{9sOs=9&P$A}w9h|tsx#@)sTbv|YJBj*mU+cXk zWzsd!xYeYnRqu8pZt$p|pVYOOs^;faXKp)z;Cp_=6_{L#%xs8t*=SkFVyXzG7=ebt zoCh`Ysb|U0j2M#8k*4Z67ONj(2zgT~3zByOo9`-D;p3cHUfY-j+=Xfy#$o~lqdaEJ zpWMU-_#$xe*5e0t<*zx&>%;OIP`;K^adQaP`uji4_?ZGDQy5+8o0 zB*~ZnSR(o%c?R$DT+>5)ui5q&HYyE5VbZ`Ps|QZ06_`XE)l6&un>H!4d#tr}GiQ(r z_gnv3Zy^&*83p|z9vnWc$DsEDI)x2OtoZ9HlvARysiGy1R!Try>3A9l1cE|kb=4%@ zavv^j-AtXmvf1ev*RqebQT2FPn5yl(Z51%!SVDbML&bnHExuN@`-WUM`tWoIM@(6$ z_XNd1>B$^bkinCA!G^2ZBEaRffXMjBq%=^*EJ*H-OtAsFe}7Npie!vSZCAq1&{Ja3 zSs$2ywIks@lf4tK9BIVC#iSCv3@r8B0KJx1-;^fbcDMlt*w&9vGo8f5N=PtIea0+= z>(|(0FVMICKT)kFqplAtqG(T3(#(??AM#m~r`e{REz@ihN&&wAt?XvnbxS}wcn(!> z6Oia+;*ro`+V@v$&MT*n@?an}Ueh3oK$hdQpj!D+QGvkejlJ&FOm7>J*d|mw6NNe#epKhF&hU z!=b%2Os+harWB6x8_I6rPN)4>-SGI=(?r7JU_FFS2$Lub;VKtLZ42I|D&iCuN7r&g zo^)aFif%7!2%rM$y(}JhgvQPC_Wpj~^$EKVj54;wAJIt1s)H=K$w9jM<&sZQv&|Fb zKH6!M;N5M;%T&y*;&UUCIJ*K(t^FrS;p0_JpL7#o{l@XbHClqWtQte#W#(~5DuV18 z<(#c})SPO<93^?;h2Z0gI|22;mqRhCe-_GQdrQ~sTM%izNIQ2sK@0-7iS+@3;2h}E zvTkQ$G73D24@{`hgwKX94Gs@P=Eb}`N`~EDU3*LeFWCCyLxP%>ksY*>nwOVT5NVoG z3iwmiU?e;P?Fxg*us8WNr;cs6`4nP`GKK^d`yrn)ygt+om@HHg6PQ*8D><>>PV&K* zD(`k54voL|swNTedVFceZcpy1xWa%GE{JN}jtr<1m*ez>jgOZ#osH$fg&|_w^UA2d zF&2fP)?Dg3Z4hTaOwk*a2w`njI_rw3=Z_4y{a-2-ou!mocC?ezy$O}Yg?Tw!R@>C4 zd9hq&z=`m_5`(PUc=KKJp7!Y&KC^Jb41@gAIrnT~x>jqs^3e5v(?d|SArCLK8*CU4T5 zrd5Q{ANgBm{8y5t`?6DUk@w0C#-eCVJ#5wColGW!Bdh_&fzCVUk`(u#@~mv7!A68Q zCXMSOa)k#Xo^bz7XncTSIms8xJA=4WAUWh*k4Gpt+&Ysh`%q%vIZovq!3)l%f4zjp zBVcF5$MUd4r0|z3XyGC|0zecl=qzT($8}#H^|MwQZAA9;qnSP7^W3H$Nryl)OLT}=S7GFi`ibx6V9Ts! zlzj=1l3lNM-$Sb&p(6YO=~Zn#%T8_2ymK6^F|D3qfBLL3(5Za5WBOE9qf73{>waL8 zKqCZ!{bOFw-?27XGQjy@z*ZnmaX&nHei#4GeOY|Dde^Sf zWo9$KU4YMhDq_$anN`uF% zr3jEA2)B<#313`QaxBverZrgGEhwZ6cO-EJ+J!{;8UJH%9<04p7xUJ3Nn!)%r`%(t z`=A}5D$$%{y^YX=ezg(}l8J5q{f<>Cee^v7h4R~(Z@w7}pHzO{rN6P28__JambKNj zbp-Ujs~^uOAeFO)uU~!SpdGaUkI42j|Ct%!{!2o)z?K1n#uYS_Gw?!ngXL%tS(+rj zMh%D->4+ZgoYma9Co%J}D5STzp>fy$=?8<`i%bhzOE0c zFMvNz3wJ0jzr*7Ngh{>%BHhL6xP)cF|!q$gJ#ankVg`Se2-*(IWjSrqmigcfN} zi&6u%0#)>s<1cAUv6V2H+SO5(o z(b{N8FJ6iB4^uG92e%{IK4%RZ%zRtV*^PM_n&FVQ9;4?Rd3yEMmT++_(RuYpR@Fy{ zJht6ABgb)`vI6esz@cqTXCVp=UE^}DL3oCw1S>s)Wc2yqF5`}1JqW(Dvs~oT^NSb` z^I<&|gSGR-H6GrLZLdbe3D=meq($j==#S5mXuk%)G*ps(AZY#V0Q3`LV^@;Nb!Cd{G!FBYp+in=C3 z&mrftOHEUZjF;={%O@H+Bczq6H)hVAK9J!wvV5J=0v0N=@rdp2H;5Dz1gx%W3$iHW z^>$po)u-|h4ej-gkNa~Au~OQKSN$7LXXfF*Lp%z+fJU$$D;3N_VdH{r<;%+-ejzxt zBL9w@DgRuLTq=PcT!HX7JmReczbp4TH-HG^E(tO>F}4^vm=2BPK%q)(UNevhFd}${ z;_Hm&;Zi`^fn7D+T|0Ko=LxVyu=ev5E(1-tnz`>zO80^mJ_Ghuil#=CSwmoCT@3lt zvqc%i6BP6LOEp{HL-(S;Yoon(Ubj|s2>D|i8@5@YnO>lIDlHTKYNaH_voz!9xP9Ia z$Uh#^PPgJql}jTfspi;{$Ok32Mk%Vki|AMb`YXu2H3p5Rw{R9TWsTH(_}chP%MR6M z#mu>~2_HuIC{#>%^&DCkvysWcU%1G{wF1(@u!tE80SI%+o?+FR#ZqmVV6i&?^cueH zSk&UYndeW3pqKsovhl@b+nRBLIL|rZHQjVB_KHTs zCOOj`=Vc7m7YTN_T3bFO@M%omMpP#N>k2wZu438R6wVfV_H!^son{5K;)07lX>Q{h zhKN+9VNq+RvEVk;+$he*XH%8rkg05$x{;V}HA9?WF3!S(j6UbqCW387rPXBL^jEfD zAx-HIf7~T!t4lBovBai}XL^2-d<;N`&9 zbR5Oi=S%&Fc=lDkrD>M!reaXZkZ=IdJ1SZb;8+-yt>8`pN7*}|AH_+;AV@RA`bLjX zTW(WX@t3-~EP{l0c4+J$!C*cd+U!pK$jBfogRN9p69k7Kt#*kWoHhD_J=vd>Qqei{ z(Zm~OtF(tb!;-l1y_%L+X&`u;vD93gfn)$pnXl9`8VY_s*HNjs3S$4xmM~EDO2K7h zm83*aESHSuDY2KWL%8Z%a{Cs?@u^*`dpgv8PHq}LGZ9d82SZ4*5^K31FH|TlkAQ4SlY#4Em*U!FN|YxaJb{c+3K-(le)|5 z=j2f+tII;x95#`K?IfaGVZ9J)m;LULGSH#V<+}D0VG78v!dSNYPuN1dF}XFNXcz>( z^QqX;W1k)(~9yMx|D8ql*g zrd-Ol26Rq6a{jA_|UcH}vg&O36v?W87YENt~*)>_hC%T2cpDKpt72|YO{xF%g2 zD+<|6CxeHja%pRaR3n_5uZk#qi=FU>6<1U{vl^MLlK7kaxzubj3x|~cKqzEM3(tdr zX$T9`#0iM?GY1nk^@DfROZLu(%hIZMbL4CLt%DW!awj5ZMnRVDfJ9@dO=?j*RjKQHpBT8 zhh6;2Kf#LopGErb>2Ldk#rFG8F?q?VdI$Y&0zB4JcVW47Liv2+^qv#b)e-2datC`n zKNS)qy}`v!alKv|_b*`O)c;#C5Bw-`ak#koqGt*5>4@FZK-+tPm@DfsqbbFtUjm~gJLS7lqw&FQBkg!jsT z?~wsz(`|K4q<*R1DUZo#g}{rg1Ksyz2o7yBa^J+5PyhbO?tdY?=6{0IG4%>OPN_LQ zQ0yzK*R7>imx<9>ldT+MWj9Z%`mivZxwAs+(W*35P(YUzIx*(D5%E%x8 nlb8GVbN*d{e^=n&75H}r{#}88SK!|j_;&^VUn`*Tef0kTC1o$5 literal 0 HcmV?d00001 diff --git a/svc/queries/account.go b/svc/queries/account.go new file mode 100644 index 0000000..a0ac4d8 --- /dev/null +++ b/svc/queries/account.go @@ -0,0 +1,74 @@ +package queries + +import ( + "context" + "fmt" + "log" + "strings" + + "bssapp-backend/db" + "bssapp-backend/internal/authz" + "bssapp-backend/models" +) + +func GetAccounts(ctx context.Context) ([]models.Account, error) { + + piyasaFilter := authz.BuildMSSQLPiyasaFilter(ctx, "f2.CustomerAtt01") + + if strings.TrimSpace(piyasaFilter) == "" { + piyasaFilter = "1=1" + } + + query := fmt.Sprintf(` + SELECT + x.AccountCode, + MAX(x.AccountName) AS AccountName + FROM ( + SELECT + LEFT(b.CurrAccCode, 8) AS AccountCode, + COALESCE(d.CurrAccDescription, '') AS AccountName + FROM trCurrAccBook b + LEFT JOIN cdCurrAccDesc d + ON d.CurrAccCode = b.CurrAccCode + JOIN CustomerAttributesFilter f2 + ON f2.CurrAccCode = b.CurrAccCode + WHERE %s + ) x + GROUP BY x.AccountCode + ORDER BY x.AccountCode +`, piyasaFilter) + + log.Println("🔎 ACCOUNT PIYASA FILTER =", piyasaFilter) + log.Println("🔎 ACCOUNT QUERY =", query) + + rows, err := db.MssqlDB.Query(query) + if err != nil { + return nil, fmt.Errorf("MSSQL query error: %w", err) + } + defer rows.Close() + + var accounts []models.Account + + for rows.Next() { + + var acc models.Account + + if err := rows.Scan( + &acc.AccountCode, + &acc.AccountName, + ); err != nil { + return nil, err + } + + if len(acc.AccountCode) >= 4 { + acc.DisplayCode = + strings.TrimSpace(acc.AccountCode[:3] + " " + acc.AccountCode[3:]) + } else { + acc.DisplayCode = acc.AccountCode + } + + accounts = append(accounts, acc) + } + + return accounts, rows.Err() +} diff --git a/svc/queries/currency_cache.go b/svc/queries/currency_cache.go new file mode 100644 index 0000000..3859591 --- /dev/null +++ b/svc/queries/currency_cache.go @@ -0,0 +1,64 @@ +package queries + +import ( + "bssapp-backend/models" + "database/sql" + "sync" + "time" +) + +/* =============================== + CACHE STRUCT +================================ */ + +type currencyCacheItem struct { + data *models.TodayCurrencyV3 + expiresAt time.Time +} + +var ( + currencyCache = make(map[string]currencyCacheItem) + cacheMutex sync.RWMutex + cacheTTL = 5 * time.Minute +) + +/* =============================== + MAIN CACHE FUNC +================================ */ + +func GetCachedCurrencyV3(db *sql.DB, code string) (*models.TodayCurrencyV3, error) { + + now := time.Now() + + /* ---------- READ CACHE ---------- */ + cacheMutex.RLock() + + item, ok := currencyCache[code] + + if ok && now.Before(item.expiresAt) { + cacheMutex.RUnlock() + return item.data, nil + } + + cacheMutex.RUnlock() + + /* ---------- FETCH DB ---------- */ + + data, err := GetTodayCurrencyV3(db, code) + if err != nil { + return nil, err + } + + /* ---------- WRITE CACHE ---------- */ + + cacheMutex.Lock() + + currencyCache[code] = currencyCacheItem{ + data: data, + expiresAt: now.Add(cacheTTL), + } + + cacheMutex.Unlock() + + return data, nil +} diff --git a/svc/queries/customerlist.go b/svc/queries/customerlist.go new file mode 100644 index 0000000..6daeb6a --- /dev/null +++ b/svc/queries/customerlist.go @@ -0,0 +1,114 @@ +package queries + +import ( + "context" + "fmt" + + "bssapp-backend/db" + "bssapp-backend/internal/authz" + "bssapp-backend/models" +) + +func GetCustomerList(ctx context.Context) ([]models.CustomerList, error) { + + piyasaFilter := authz.BuildMSSQLPiyasaFilter( + ctx, + "f.CustomerAtt01", + ) + + query := fmt.Sprintf(` + SELECT + c.CurrAccTypeCode, + c.CurrAccCode, + ISNULL(d.CurrAccDescription, ''), + + dbo.HG_Temizlik( + ISNULL(( + SELECT AttributeDescription + FROM cdCurrAccAttributeDesc WITH(NOLOCK) + WHERE CurrAccTypeCode = 3 + AND AttributeTypeCode = 8 + AND AttributeCode = f.CustomerAtt08 + AND LangCode = 'TR' + ), SPACE(0)) + ), + + dbo.HG_Temizlik( + ISNULL(( + SELECT AttributeDescription + FROM cdCurrAccAttributeDesc WITH(NOLOCK) + WHERE CurrAccTypeCode = 3 + AND AttributeTypeCode = 1 + AND AttributeCode = f.CustomerAtt01 + AND LangCode = 'TR' + ), SPACE(0)) + ), + + dbo.HG_Temizlik( + ISNULL(( + SELECT AttributeDescription + FROM cdCurrAccAttributeDesc WITH(NOLOCK) + WHERE CurrAccTypeCode = 3 + AND AttributeTypeCode = 2 + AND AttributeCode = f.CustomerAtt02 + AND LangCode = 'TR' + ), SPACE(0)) + ), + + dbo.HG_Temizlik( + ISNULL(( + SELECT AttributeDescription + FROM cdCurrAccAttributeDesc WITH(NOLOCK) + WHERE CurrAccTypeCode = 3 + AND AttributeTypeCode = 5 + AND AttributeCode = f.CustomerAtt05 + AND LangCode = 'TR' + ), SPACE(0)) + ), + + ISNULL(c.CurrencyCode, '') + + FROM cdCurrAcc c + LEFT JOIN cdCurrAccDesc d + ON c.CurrAccCode = d.CurrAccCode + LEFT JOIN CustomerAttributesFilter f + ON c.CurrAccCode = f.CurrAccCode + + WHERE + c.CompanyCode = 1 + AND c.CurrAccTypeCode = 3 + AND c.IsBlocked = 0 + AND %s + + ORDER BY d.CurrAccDescription + `, piyasaFilter) + + rows, err := db.MssqlDB.Query(query) + if err != nil { + return nil, err + } + defer rows.Close() + + var list []models.CustomerList + + for rows.Next() { + var c models.CustomerList + + if err := rows.Scan( + &c.CurrAccTypeCode, + &c.Cari_Kod, + &c.Cari_Ad, + &c.Musteri_Ana_Grubu, + &c.Piyasa, + &c.Musteri_Temsilcisi, + &c.Ulke, + &c.Doviz_cinsi, + ); err != nil { + return nil, err + } + + list = append(list, c) + } + + return list, rows.Err() +} diff --git a/svc/queries/get_order_list_excel.go b/svc/queries/get_order_list_excel.go new file mode 100644 index 0000000..81c2c3c --- /dev/null +++ b/svc/queries/get_order_list_excel.go @@ -0,0 +1,52 @@ +package queries + +import ( + "database/sql" + "fmt" +) + +func GetOrderListExcel( + db *sql.DB, + search string, + currAcc string, + orderDate string, +) (*sql.Rows, error) { + + q := OrderListBaseQuery + " AND 1=1 " + args := []interface{}{} + + // SEARCH + if search != "" { + q += ` +AND ( + LOWER(h.OrderNumber) LIKE LOWER(@p1) OR + LOWER(h.CurrAccCode) LIKE LOWER(@p1) OR + LOWER(ca.CurrAccDescription) LIKE LOWER(@p1) OR + LOWER(h.Description) LIKE LOWER(@p1) OR + LOWER(mt.AttributeDescription) LIKE LOWER(@p1) OR + LOWER(py.AttributeDescription) LIKE LOWER(@p1) +) +` + args = append(args, "%"+search+"%") + } + + // CURRACC + if currAcc != "" { + q += fmt.Sprintf(" AND h.CurrAccCode = @p%d ", len(args)+1) + args = append(args, currAcc) + } + + // DATE + if orderDate != "" { + q += fmt.Sprintf( + " AND CONVERT(varchar, h.OrderDate, 23) = @p%d ", + len(args)+1, + ) + args = append(args, orderDate) + } + + // ORDER BY SONDA + q += " ORDER BY h.CreatedDate DESC " + + return db.Query(q, args...) +} diff --git a/svc/queries/helpers.go b/svc/queries/helpers.go new file mode 100644 index 0000000..5dac5b1 --- /dev/null +++ b/svc/queries/helpers.go @@ -0,0 +1,174 @@ +package queries + +import ( + "bssapp-backend/models" + "database/sql" + "fmt" + "github.com/google/uuid" + "log" + "strings" + "time" +) + +// ============================================================ +// 🔥 UNIVERSAL DATETIME PARSER +// ============================================================ +func parseDateTime(str string) (time.Time, error) { + layouts := []string{ + "2006-01-02 15:04:05", // "2025-11-21 12:37:21" + time.RFC3339, // "2025-11-21T12:37:21Z" + "2006-01-02", // "2025-11-21" + } + for _, layout := range layouts { + if t, err := time.Parse(layout, str); err == nil { + return t, nil + } + } + return time.Time{}, fmt.Errorf("datetime parse edilemedi: %s", str) +} + +// ============================================================ +// 📌 DATE (YYYY-MM-DD) → sql.NullTime +// ============================================================ +func nullableDateString(ns models.NullString) sql.NullTime { + if ns.Valid && strings.TrimSpace(ns.String) != "" { + t, err := time.Parse("2006-01-02", ns.String) + if err == nil { + return sql.NullTime{Valid: true, Time: t} + } + } + return sql.NullTime{} +} + +// ============================================================ +// 📌 TIME (HH:mm:ss) → sql.NullString +// ============================================================ +func nullableTimeString(ns models.NullString) sql.NullString { + if ns.Valid && strings.TrimSpace(ns.String) != "" { + return sql.NullString{String: ns.String, Valid: true} + } + return sql.NullString{} +} + +// ============================================================ +// 📌 DATETIME (CustomTime → sql.NullTime) +// ============================================================ +func nullableDateTime(ct models.CustomTime, fallback time.Time) sql.NullTime { + if ct.Valid && !ct.Time.IsZero() { + return sql.NullTime{Valid: true, Time: ct.Time} + } + return sql.NullTime{Valid: true, Time: fallback} +} + +// ============================================================ +// 📌 DATETIME (NullTime → sql.NullTime) +// ============================================================ +func nullableTime(nt models.NullTime, fallback time.Time) sql.NullTime { + if nt.Valid && !nt.Time.IsZero() { + return sql.NullTime{Valid: true, Time: nt.Time} + } + return sql.NullTime{Valid: true, Time: fallback} +} + +// ============================================================ +// 📌 DATETIME (NullString → sql.NullTime) +// ============================================================ +func nullableDateTimeString(ns models.NullString, fallback time.Time) sql.NullTime { + if !ns.Valid || strings.TrimSpace(ns.String) == "" { + return sql.NullTime{Time: fallback, Valid: true} + } + t, err := parseDateTime(ns.String) + if err != nil { + return sql.NullTime{Time: fallback, Valid: true} + } + return sql.NullTime{Time: t, Valid: true} +} + +// ============================================================ +// 📌 STRING → sql.NullString +// ============================================================ +func nullableString(val models.NullString, fallback string) sql.NullString { + if val.Valid && strings.TrimSpace(val.String) != "" { + return sql.NullString{String: val.String, Valid: true} + } + return sql.NullString{String: fallback, Valid: true} +} + +// ============================================================ +// 📌 GUID (UNIQUEIDENTIFIER) → interface{} +// ============================================================ +func nullableUUID(v interface{}) interface{} { + switch x := v.(type) { + + // 1️⃣ models.NullUUID → direkt geri dön + case models.NullUUID: + if !x.Valid { + return nil + } + return x.UUID + + // 2️⃣ models.NullString → GUID parse et + case models.NullString: + if !x.Valid || strings.TrimSpace(x.String) == "" { + return nil + } + id, err := uuid.Parse(x.String) + if err != nil { + return nil + } + return id + + // 3️⃣ string → GUID parse et + case string: + id, err := uuid.Parse(x) + if err != nil { + return nil + } + return id + } + + return nil +} + +// ============================================================ +// 📌 NUMERIC → sql.NullX +// ============================================================ +func nullableFloat64(val models.NullFloat64, fallback float64) sql.NullFloat64 { + if val.Valid { + return sql.NullFloat64{Float64: val.Float64, Valid: true} + } + return sql.NullFloat64{Float64: fallback, Valid: true} +} + +func nullableInt16(val models.NullInt16, fallback int16) sql.NullInt16 { + if val.Valid { + return sql.NullInt16{Int16: val.Int16, Valid: true} + } + return sql.NullInt16{Int16: fallback, Valid: true} +} + +func nullableInt32(val models.NullInt32, fallback int32) sql.NullInt32 { + if val.Valid { + return sql.NullInt32{Int32: val.Int32, Valid: true} + } + return sql.NullInt32{Int32: fallback, Valid: true} +} + +func nullableInt32ToInt16(val models.NullInt32, fallback int16) sql.NullInt16 { + if val.Valid { + return sql.NullInt16{Int16: int16(val.Int32), Valid: true} + } + return sql.NullInt16{Int16: fallback, Valid: true} +} + +// ============================================================ +// 📌 BOOL → sql.NullBool +// ============================================================ +func nullableBool(val models.NullBool, fallback bool) sql.NullBool { + if val.Valid { + return sql.NullBool{Bool: val.Bool, Valid: true} + } + return sql.NullBool{Bool: fallback, Valid: true} +} + +var logger = log.Default() diff --git a/svc/queries/inventoryproduct.go b/svc/queries/inventoryproduct.go new file mode 100644 index 0000000..ac88ec5 --- /dev/null +++ b/svc/queries/inventoryproduct.go @@ -0,0 +1,93 @@ +package queries + +// 🔹 Ürüne göre stok detay sorgusu +const GetInventoryProduct = ` +-- 🔹 Ürüne göre stok detay sorgusu (Nebim V3 uyumlu, parametre güvenli) +SELECT + bsItemTypeDesc.ItemTypeDescription AS InventoryType, + inv.WarehouseCode AS Depo_Kodu, + wh.WarehouseDescription AS Depo_Adi, + inv.ItemCode AS Urun_Kodu, + ISNULL(descItem.ItemDescription, '') AS Madde_Aciklamasi, + inv.ColorCode AS Renk_Kodu, + ISNULL(descColor.ColorDescription, '') AS Renk_Aciklamasi, + inv.ItemDim1Code AS Beden, + attr.ProductAtt01 AS Urun_Grubu, + attr.ProductAtt02 AS Urun_Alt_Grubu, + attr.ProductAtt41 AS Kisa_Karisim, + attr.ProductAtt42 AS SERI, + attr.ProductAtt43 AS FASON_ISCLIK, + attr.ProductAtt45 AS ASKILI_YAN, + inv.ItemDim2Code AS YAKA, + attr.ProductAtt44 AS GARSON_YETISKIN, + attr.ProductAtt10 AS MarkaKodu, + ROUND( + SUM(inv.InventoryQty1) + - (SUM(inv.ReserveQty1) + SUM(inv.DispOrderQty1) + SUM(inv.PickingQty1)), + cdUnitOfMeasure.RoundDigit + ) AS Kullanilabilir_Envanter +FROM cdItem WITH (NOLOCK) +JOIN cdUnitOfMeasure WITH (NOLOCK) + ON cdItem.UnitOfMeasureCode1 = cdUnitOfMeasure.UnitOfMeasureCode +JOIN ( + SELECT + CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code, + SUM(CASE WHEN SourceTable = 'PickingStates' THEN Qty1 ELSE 0 END) AS PickingQty1, + SUM(CASE WHEN SourceTable = 'ReserveStates' THEN Qty1 ELSE 0 END) AS ReserveQty1, + SUM(CASE WHEN SourceTable = 'DispOrderStates' THEN Qty1 ELSE 0 END) AS DispOrderQty1, + SUM(CASE WHEN SourceTable = 'trStock' THEN (In_Qty1 - Out_Qty1) ELSE 0 END) AS InventoryQty1 + FROM ( + SELECT 'PickingStates' AS SourceTable, CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code, Qty1, 0 AS In_Qty1, 0 AS Out_Qty1 + FROM PickingStates WITH (NOLOCK) + UNION ALL + SELECT 'ReserveStates', CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code, Qty1, 0, 0 + FROM ReserveStates WITH (NOLOCK) + UNION ALL + SELECT 'DispOrderStates', CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code, Qty1, 0, 0 + FROM DispOrderStates WITH (NOLOCK) + UNION ALL + SELECT 'trStock', CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code, 0, SUM(In_Qty1), SUM(Out_Qty1) + FROM trStock WITH (NOLOCK) + GROUP BY CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code + ) AS src + GROUP BY CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code +) AS inv + ON cdItem.ItemTypeCode = inv.ItemTypeCode + AND cdItem.ItemCode = inv.ItemCode +LEFT JOIN ProductAttributesFilter AS attr WITH (NOLOCK) + ON attr.ItemCode = inv.ItemCode +LEFT JOIN bsItemTypeDesc WITH (NOLOCK) + ON bsItemTypeDesc.ItemTypeCode = inv.ItemTypeCode + AND bsItemTypeDesc.LangCode = 'TR' +LEFT JOIN cdWarehouseDesc AS wh WITH (NOLOCK) + ON wh.WarehouseCode = inv.WarehouseCode +LEFT JOIN cdItemDesc AS descItem WITH (NOLOCK) + ON descItem.ItemTypeCode = inv.ItemTypeCode + AND descItem.ItemCode = inv.ItemCode + AND descItem.LangCode = 'TR' +LEFT JOIN cdColorDesc AS descColor WITH (NOLOCK) + ON descColor.ColorCode = inv.ColorCode + AND descColor.LangCode = 'TR' +WHERE + inv.ItemTypeCode IN (1) + AND inv.WarehouseCode IN ('1-0-12','1-0-21','1-0-10','1-0-2','1-1-3','1-2-4','1-2-5','') + AND inv.InventoryQty1 >= 0 + AND cdItem.IsBlocked = 0 + AND inv.ItemCode = @p1 -- ✅ doğrudan parametre, DECLARE yok +GROUP BY + inv.CompanyCode, inv.OfficeCode, inv.StoreTypeCode, inv.StoreCode, + inv.WarehouseCode, inv.ItemTypeCode, inv.ItemCode, inv.ColorCode, + inv.ItemDim1Code, inv.ItemDim2Code, inv.ItemDim3Code, + cdUnitOfMeasure.RoundDigit, attr.ProductAtt01, attr.ProductAtt02, + attr.ProductAtt41, attr.ProductAtt42, attr.ProductAtt43, attr.ProductAtt44, + attr.ProductAtt45, attr.ProductAtt10, bsItemTypeDesc.ItemTypeDescription, + wh.WarehouseDescription, descItem.ItemDescription, descColor.ColorDescription; + +` diff --git a/svc/queries/order_get.go b/svc/queries/order_get.go new file mode 100644 index 0000000..b7fb55a --- /dev/null +++ b/svc/queries/order_get.go @@ -0,0 +1,280 @@ +package queries + +import ( + "bssapp-backend/db" + "bssapp-backend/models" + "database/sql" + "errors" + "fmt" +) + +// GetOrderByID — Sipariş başlığı (header) ve satırlarını (lines) getirir. +func GetOrderByID(orderID string) (*models.OrderHeader, []models.OrderDetail, error) { + conn := db.GetDB() + + logger.Printf("🧾 [GetOrderByID] begin • id=%s", orderID) + + // ===================================================== + // HEADER (Cari adı join'li) + // ===================================================== + var header models.OrderHeader + qHeader := ` + SELECT + CAST(h.OrderHeaderID AS varchar(36)) AS OrderHeaderID, + h.OrderTypeCode, + h.ProcessCode, + h.OrderNumber, + h.IsCancelOrder, + h.OrderDate, + h.OrderTime, + h.DocumentNumber, + h.PaymentTerm, + h.AverageDueDate, + h.Description, + h.InternalDescription, + h.CurrAccTypeCode, + h.CurrAccCode, + d.CurrAccDescription, + h.SubCurrAccID, + h.ContactID, + h.ShipmentMethodCode, + h.ShippingPostalAddressID, + h.BillingPostalAddressID, + h.GuarantorContactID, + h.GuarantorContactID2, + h.RoundsmanCode, + h.DeliveryCompanyCode, + h.TaxTypeCode, + h.WithHoldingTaxTypeCode, + h.DOVCode, + h.TaxExemptionCode, + h.CompanyCode, + h.OfficeCode, + h.StoreTypeCode, + h.StoreCode, + h.POSTerminalID, + h.WarehouseCode, + h.ToWarehouseCode, + h.OrdererCompanyCode, + h.OrdererOfficeCode, + h.OrdererStoreCode, + h.GLTypeCode, + h.DocCurrencyCode, + h.LocalCurrencyCode, + h.ExchangeRate, + h.TDisRate1, + h.TDisRate2, + h.TDisRate3, + h.TDisRate4, + h.TDisRate5, + h.DiscountReasonCode, + h.SurplusOrderQtyToleranceRate, + h.ImportFileNumber, + h.ExportFileNumber, + h.IncotermCode1, + h.IncotermCode2, + h.LettersOfCreditNumber, + h.PaymentMethodCode, + h.IsInclutedVat, + h.IsCreditSale, + h.IsCreditableConfirmed, + h.CreditableConfirmedUser, + h.CreditableConfirmedDate, + h.IsSalesViaInternet, + h.IsSuspended, + h.IsCompleted, + h.IsPrinted, + h.IsLocked, + h.UserLocked, + h.IsClosed, + h.ApplicationCode, + h.ApplicationID, + h.CreatedUserName, + h.CreatedDate, + h.LastUpdatedUserName, + h.LastUpdatedDate, + h.IsProposalBased + FROM BAGGI_V3.dbo.trOrderHeader AS h + LEFT JOIN BAGGI_V3.dbo.cdCurrAccDesc AS d + ON h.CurrAccCode = d.CurrAccCode + WHERE h.OrderHeaderID = @p1; + ` + + err := conn.QueryRow(qHeader, orderID).Scan( + &header.OrderHeaderID, + &header.OrderTypeCode, + &header.ProcessCode, + &header.OrderNumber, + &header.IsCancelOrder, + &header.OrderDate, + &header.OrderTime, + &header.DocumentNumber, + &header.PaymentTerm, + &header.AverageDueDate, + &header.Description, + &header.InternalDescription, + &header.CurrAccTypeCode, + &header.CurrAccCode, + &header.CurrAccDescription, + &header.SubCurrAccID, + &header.ContactID, + &header.ShipmentMethodCode, + &header.ShippingPostalAddressID, + &header.BillingPostalAddressID, + &header.GuarantorContactID, + &header.GuarantorContactID2, + &header.RoundsmanCode, + &header.DeliveryCompanyCode, + &header.TaxTypeCode, + &header.WithHoldingTaxTypeCode, + &header.DOVCode, + &header.TaxExemptionCode, + &header.CompanyCode, + &header.OfficeCode, + &header.StoreTypeCode, + &header.StoreCode, + &header.POSTerminalID, + &header.WarehouseCode, + &header.ToWarehouseCode, + &header.OrdererCompanyCode, + &header.OrdererOfficeCode, + &header.OrdererStoreCode, + &header.GLTypeCode, + &header.DocCurrencyCode, + &header.LocalCurrencyCode, + &header.ExchangeRate, + &header.TDisRate1, + &header.TDisRate2, + &header.TDisRate3, + &header.TDisRate4, + &header.TDisRate5, + &header.DiscountReasonCode, + &header.SurplusOrderQtyToleranceRate, + &header.ImportFileNumber, + &header.ExportFileNumber, + &header.IncotermCode1, + &header.IncotermCode2, + &header.LettersOfCreditNumber, + &header.PaymentMethodCode, + &header.IsInclutedVat, + &header.IsCreditSale, + &header.IsCreditableConfirmed, + &header.CreditableConfirmedUser, + &header.CreditableConfirmedDate, + &header.IsSalesViaInternet, + &header.IsSuspended, + &header.IsCompleted, + &header.IsPrinted, + &header.IsLocked, + &header.UserLocked, + &header.IsClosed, + &header.ApplicationCode, + &header.ApplicationID, + &header.CreatedUserName, + &header.CreatedDate, + &header.LastUpdatedUserName, + &header.LastUpdatedDate, + &header.IsProposalBased, + ) + + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + logger.Printf("⚠️ [GetOrderByID] sipariş bulunamadı: %s", orderID) + return nil, nil, sql.ErrNoRows + } + logger.Printf("❌ [GetOrderByID] header sorgu hatası: %v", err) + return nil, nil, err + } + + logger.Printf("✅ [GetOrderByID] header loaded • orderNo=%v currAcc=%v", + header.OrderNumber, header.CurrAccCode.String) + + // ===================================================== + // LINES + // ===================================================== + qLines := ` + SELECT + CAST(L.OrderLineID AS varchar(36)) AS OrderLineID, + L.SortOrder, + L.ItemTypeCode, + L.ItemCode, + L.ColorCode, + L.ItemDim1Code, + L.ItemDim2Code, + L.ItemDim3Code, + L.Qty1, + L.Qty2, + L.Price, + L.VatRate, + L.PCTRate, + L.DocCurrencyCode, + L.DeliveryDate, + L.PlannedDateOfLading, + L.LineDescription, + L.IsClosed, + L.CreatedUserName, + L.CreatedDate, + L.LastUpdatedUserName, + L.LastUpdatedDate, + P.ProductAtt42Desc AS UrunIlkGrubu, + P.ProductAtt01Desc AS UrunAnaGrubu, + P.ProductAtt02Desc AS UrunAltGrubu, + P.ProductAtt38Desc AS Fit1, + P.ProductAtt39Desc AS Fit2 + FROM BAGGI_V3.dbo.trOrderLine AS L + LEFT JOIN ProductFilterWithDescription('TR') AS P + ON LTRIM(RTRIM(P.ProductCode)) = LTRIM(RTRIM(L.ItemCode)) + WHERE L.OrderHeaderID = @p1 + ORDER BY L.SortOrder ASC; + ` + + rows, err := conn.Query(qLines, orderID) + if err != nil { + logger.Printf("❌ [GetOrderByID] line sorgu hatası: %v", err) + return &header, nil, err + } + defer rows.Close() + + lines := make([]models.OrderDetail, 0, 32) + for rows.Next() { + var ln models.OrderDetail + if err := rows.Scan( + &ln.OrderLineID, + &ln.SortOrder, + &ln.ItemTypeCode, + &ln.ItemCode, + &ln.ColorCode, + &ln.ItemDim1Code, + &ln.ItemDim2Code, + &ln.ItemDim3Code, + &ln.Qty1, + &ln.Qty2, + &ln.Price, + &ln.VatRate, + &ln.PCTRate, + &ln.DocCurrencyCode, + &ln.DeliveryDate, + &ln.PlannedDateOfLading, + &ln.LineDescription, + &ln.IsClosed, + &ln.CreatedUserName, + &ln.CreatedDate, + &ln.LastUpdatedUserName, + &ln.LastUpdatedDate, + &ln.UrunIlkGrubu, + &ln.UrunAnaGrubu, + &ln.UrunAltGrubu, + &ln.Fit1, + &ln.Fit2, + ); err != nil { + return &header, nil, fmt.Errorf("line scan hatası: %w", err) + } + lines = append(lines, ln) + } + if err := rows.Err(); err != nil { + return &header, nil, fmt.Errorf("line rows hatası: %w", err) + } + + logger.Printf("📦 [GetOrderByID] lines loaded • count=%d", len(lines)) + return &header, lines, nil +} diff --git a/svc/queries/order_pdf.go b/svc/queries/order_pdf.go new file mode 100644 index 0000000..6b200c9 --- /dev/null +++ b/svc/queries/order_pdf.go @@ -0,0 +1,161 @@ +package queries + +import ( + "context" + "database/sql" +) + +/* +============================================================ + + HEADER GETIRME — OrderHeader struct’ına uygun + ============================================================ +*/ +type OrderHeaderDB struct { + OrderHeaderID string + OrderNumber string + CurrAccCode string + CurrAccName string + DocCurrency string + OrderDate sql.NullTime + Description sql.NullString + InternalDesc sql.NullString + OfficeCode sql.NullString + CreatedUser sql.NullString +} + +func GetOrderHeaderDB(ctx context.Context, db *sql.DB, id string) (*OrderHeaderDB, error) { + q := ` +SELECT + CAST(h.OrderHeaderID AS varchar(36)), + h.OrderNumber, + h.CurrAccCode, + d.CurrAccDescription, + h.DocCurrencyCode, + h.OrderDate, + h.Description, + h.InternalDescription, + h.OfficeCode, + h.CreatedUserName +FROM BAGGI_V3.dbo.trOrderHeader AS h +LEFT JOIN BAGGI_V3.dbo.cdCurrAccDesc AS d + ON h.CurrAccCode = d.CurrAccCode +WHERE h.OrderHeaderID = @p1 +` + row := db.QueryRowContext(ctx, q, id) + + var h OrderHeaderDB + err := row.Scan( + &h.OrderHeaderID, + &h.OrderNumber, + &h.CurrAccCode, + &h.CurrAccName, + &h.DocCurrency, + &h.OrderDate, + &h.Description, + &h.InternalDesc, + &h.OfficeCode, + &h.CreatedUser, + ) + if err != nil { + return nil, err + } + return &h, nil +} + +/* +============================================================ + + SATIRLARI GETIRME — OrderLineRaw struct’ına uygun + ============================================================ +*/ +type OrderLineRawDB struct { + OrderLineID sql.NullString + ItemCode string + ColorCode string + ItemDim1Code sql.NullString + ItemDim2Code sql.NullString + Qty1 sql.NullFloat64 + Price sql.NullFloat64 + DocCurrencyCode sql.NullString + DeliveryDate sql.NullTime + LineDescription sql.NullString + UrunAnaGrubu sql.NullString + UrunAltGrubu sql.NullString + IsClosed sql.NullBool + WithHoldingTaxType sql.NullString + DOVCode sql.NullString + PlannedDateOfLading sql.NullTime + CostCenterCode sql.NullString + VatCode sql.NullString + VatRate sql.NullFloat64 +} + +func GetOrderLinesDB(ctx context.Context, db *sql.DB, id string) ([]OrderLineRawDB, error) { + + q := ` +SELECT + CAST(L.OrderLineID AS varchar(36)), + L.ItemCode, + L.ColorCode, + L.ItemDim1Code, + L.ItemDim2Code, + L.Qty1, + L.Price, + L.DocCurrencyCode, + L.DeliveryDate, + L.LineDescription, + P.ProductAtt01Desc, + P.ProductAtt02Desc, + L.IsClosed, + L.WithHoldingTaxTypeCode, + L.DOVCode, + L.PlannedDateOfLading, + L.CostCenterCode, + L.VatCode, + L.VatRate +FROM BAGGI_V3.dbo.trOrderLine AS L +LEFT JOIN ProductFilterWithDescription('TR') AS P + ON LTRIM(RTRIM(P.ProductCode)) = LTRIM(RTRIM(L.ItemCode)) +WHERE L.OrderHeaderID = @p1 +ORDER BY L.SortOrder, L.OrderLineID +` + + rows, err := db.QueryContext(ctx, q, id) + if err != nil { + return nil, err + } + defer rows.Close() + + var out []OrderLineRawDB + + for rows.Next() { + var r OrderLineRawDB + err = rows.Scan( + &r.OrderLineID, + &r.ItemCode, + &r.ColorCode, + &r.ItemDim1Code, + &r.ItemDim2Code, + &r.Qty1, + &r.Price, + &r.DocCurrencyCode, + &r.DeliveryDate, + &r.LineDescription, + &r.UrunAnaGrubu, + &r.UrunAltGrubu, + &r.IsClosed, + &r.WithHoldingTaxType, + &r.DOVCode, + &r.PlannedDateOfLading, + &r.CostCenterCode, + &r.VatCode, + &r.VatRate, + ) + if err != nil { + return nil, err + } + out = append(out, r) + } + return out, nil +} diff --git a/svc/queries/order_write.go b/svc/queries/order_write.go new file mode 100644 index 0000000..4e3f41d --- /dev/null +++ b/svc/queries/order_write.go @@ -0,0 +1,1079 @@ +// ===================== PART 1 (Satır 1-300) ===================== +// ======================================================= +// order_write.go — v4.3 FINAL (Insert + Update + Delete) +// - PCTCode her zaman "%0" olarak yazılır (cdPCT FK uyumlu) +// - INSERT/UPDATE öncesi ItemVariant Guard + Duplicate Guard (payload içi) +// - UpdateOrder: DELETE öncesi child tablolar (trOrderLineCurrency) temizlenir +// ======================================================= + +package queries + +import ( + "bssapp-backend/db" + "bssapp-backend/models" + "database/sql" + "fmt" + "github.com/google/uuid" + "strings" + "time" +) + +func nf0(v models.NullFloat64) float64 { + if !v.Valid { + return 0 + } + return v.Float64 +} + +// ======================================================= +// COMBO KEY & STRING HELPERS +// ======================================================= +func normalizeComboKey(s string) string { + return strings.ToUpper(strings.TrimSpace(s)) +} + +// makeComboKey: frontend tarafında NullString olmayan struct’lar için +func makeComboKey(ln models.OrderDetail) string { + model := safeNS(ln.ItemCode) + renk := safeNS(ln.ColorCode) + renk2 := safeNS(ln.ItemDim2Code) + beden := safeNS(ln.ItemDim1Code) + + return normalizeComboKey( + fmt.Sprintf("%s||%s||%s||%s", model, renk, beden, renk2), + ) +} + +// qtyValue → NullFloat64 güvenli float64 +func qtyValue(q models.NullFloat64) float64 { + if !q.Valid { + return 0 + } + return q.Float64 +} + +// VatCode: NullString → string +// - NULL → "" +// - "0" → "" (FK patlamasın, sadece anlamlı kodlar gönderiyoruz) +// - "%0", "%10" vb → trimlenmiş hali +func normalizeVatCode(ns models.NullString) string { + if !ns.Valid { + return "" + } + s := strings.TrimSpace(ns.String) + if s == "0" { + return "" + } + return s +} + +// PCTCode: NullString → string +// - Artık her durumda "%0" döndürür (tek PCT tipi kullanımı) +// NOT: SQL tarafında da "%0" cdPCT içinde tanımlı olmalı +func normalizePCTCode(ns models.NullString) string { + return "%0" +} + +// models.NullString → trimlenmiş string (NULL ise "") +func safeNS(ns models.NullString) string { + if !ns.Valid { + return "" + } + return strings.TrimSpace(ns.String) +} + +// ======================================================= +// COMBO KEY HELPERS (DB alanlarından) +// ======================================================= + +// makeComboKeyParts: düz string alanlardan comboKey üret +// comboKey = model || renk || beden || renk2 +func makeComboKeyParts(item, color, dim1, dim2 string) string { + item = strings.TrimSpace(item) + color = strings.TrimSpace(color) + dim1 = strings.TrimSpace(dim1) + dim2 = strings.TrimSpace(dim2) + + if item == "" && color == "" && dim1 == "" && dim2 == "" { + return "" + } + + return normalizeComboKey(item + "||" + color + "||" + dim1 + "||" + dim2) +} + +// comboFromNulls: NullString alanlardan comboKey üret +func comboFromNulls(item, color, dim1, dim2 models.NullString) string { + return makeComboKeyParts( + safeNS(item), + safeNS(color), + safeNS(dim1), + safeNS(dim2), + ) +} + +// ======================================================= +// ✅ ItemVariant Guard — INSERT / UPDATE öncesi +// ======================================================= + +// normalizeKeyPart: NullString → trim + UPPER +func normalizeKeyPart(ns models.NullString) string { + s := strings.TrimSpace(safeNS(ns)) + return strings.ToUpper(s) +} + +// ======================================================= +// AKSBIR DETECTION +// ======================================================= + +// ======================================================= +// COMBO KEY BUILDER (AKSBIR AWARE) +// ======================================================= + +// Variant check: ItemCode + ColorCode + Dim1 + Dim2 +func ValidateItemVariant(tx *sql.Tx, ln models.OrderDetail) error { + fmt.Printf( + "🧪 VARIANT GUARD INPUT | ClientKey=%s Item=%q Color=%q Dim1=%q Dim2=%q Dim3=%q Qty1=%v\n", + safeNS(ln.ClientKey), + safeNS(ln.ItemCode), + safeNS(ln.ColorCode), + safeNS(ln.ItemDim1Code), + safeNS(ln.ItemDim2Code), + safeNS(ln.ItemDim3Code), + nf0(ln.Qty1), + ) + + item := normalizeKeyPart(ln.ItemCode) + color := normalizeKeyPart(ln.ColorCode) + dim1 := normalizeKeyPart(ln.ItemDim1Code) + dim2 := normalizeKeyPart(ln.ItemDim2Code) + + // ✅ Placeholder/boş standardizasyon (SENDE "_" geliyor) + normalizeEmpty := func(s string) string { + s = strings.TrimSpace(strings.ToUpper(s)) + if s == "_" || s == "-" { + return "" + } + return s + } + + item = normalizeEmpty(item) + color = normalizeEmpty(color) + dim1 = normalizeEmpty(dim1) + dim2 = normalizeEmpty(dim2) + + if item == "" { + return fmt.Errorf( + "ItemCode boş olamaz (ClientKey=%s)", + safeNS(ln.ClientKey), + ) + fmt.Printf( + "🧪 VARIANT NORMALIZED | Item=%q Color=%q Dim1=%q Dim2=%q\n", + item, color, dim1, dim2, + ) + + } + + // İstersen debug: + // fmt.Printf("🧪 VARIANT CHECK item=%q color=%q dim1=%q dim2=%q clientKey=%s\n", item, color, dim1, dim2, safeNS(ln.ClientKey)) + + var exists int + err := tx.QueryRow(` + SELECT CASE WHEN EXISTS ( + SELECT 1 + FROM BAGGI_V3.dbo.prItemVariant V WITH (NOLOCK) + WHERE ISNULL(LTRIM(RTRIM(V.ItemCode)),'') = @p1 + AND ISNULL(LTRIM(RTRIM(V.ColorCode)),'') = @p2 + AND ISNULL(LTRIM(RTRIM(V.ItemDim1Code)),'') = @p3 + AND ISNULL(LTRIM(RTRIM(V.ItemDim2Code)),'') = @p4 + ) THEN 1 ELSE 0 END + `, item, color, dim1, dim2).Scan(&exists) + + if err != nil { + return fmt.Errorf("ItemVariant kontrol query hatası: %w", err) + } + + if exists != 1 { + return &models.ValidationError{ + Code: "INVALID_ITEM_VARIANT", + Message: "Tanımsız ürün kombinasyonu", + ClientKey: safeNS(ln.ClientKey), + ItemCode: item, + ColorCode: color, + Dim1: dim1, + Dim2: dim2, + } + } + + return nil +} + +// ValidateOrderVariants: save/update öncesi payload satırlarını prItemVariant'a göre doğrular. +// invalid döner; error sadece DB/prepare/query hatalarında döner. +func ValidateOrderVariants(db *sql.DB, lines []models.OrderDetail) ([]models.InvalidVariant, error) { + + normalizeEmpty := func(s string) string { + s = strings.TrimSpace(strings.ToUpper(s)) + if s == "_" || s == "-" { + return "" + } + return s + } + + stmt, err := db.Prepare(` + SELECT CASE WHEN EXISTS ( + SELECT 1 + FROM BAGGI_V3.dbo.prItemVariant V WITH (NOLOCK) + WHERE ISNULL(LTRIM(RTRIM(V.ItemCode)),'') = @p1 + AND ISNULL(LTRIM(RTRIM(V.ColorCode)),'') = @p2 + AND ISNULL(LTRIM(RTRIM(V.ItemDim1Code)),'') = @p3 + AND ISNULL(LTRIM(RTRIM(V.ItemDim2Code)),'') = @p4 + ) THEN 1 ELSE 0 END + `) + if err != nil { + return nil, fmt.Errorf("validate prepare hatası: %w", err) + } + defer stmt.Close() + + invalid := make([]models.InvalidVariant, 0) + + for i, ln := range lines { + qty := qtyValue(ln.Qty1) + if qty <= 0 { + continue + } + + item := normalizeEmpty(normalizeKeyPart(ln.ItemCode)) + color := normalizeEmpty(normalizeKeyPart(ln.ColorCode)) + dim1 := normalizeEmpty(normalizeKeyPart(ln.ItemDim1Code)) + dim2 := normalizeEmpty(normalizeKeyPart(ln.ItemDim2Code)) + + // ItemCode boş ise invalid + if strings.TrimSpace(item) == "" { + invalid = append(invalid, models.InvalidVariant{ + Index: i, + ClientKey: safeNS(ln.ClientKey), + ItemCode: item, + ColorCode: color, + Dim1: dim1, + Dim2: dim2, + Qty1: qty, + ComboKey: safeNS(ln.ComboKey), + Reason: "ItemCode boş", + }) + continue + } + + var exists int + if err := stmt.QueryRow(item, color, dim1, dim2).Scan(&exists); err != nil { + return nil, fmt.Errorf("validate query hatası (i=%d): %w", i, err) + } + + if exists != 1 { + invalid = append(invalid, models.InvalidVariant{ + Index: i, + ClientKey: safeNS(ln.ClientKey), + ItemCode: item, + ColorCode: color, + Dim1: dim1, + Dim2: dim2, + Qty1: qty, + ComboKey: safeNS(ln.ComboKey), + Reason: "prItemVariant’ta yok", + }) + } + } + + return invalid, nil +} + +// ======================================================= +// LineResult → frontend senkronu için +// ======================================================= + +type OrderLineResult struct { + ClientKey string `json:"clientKey"` + OrderLineID string `json:"orderLineID"` +} + +// ======================================================= +// PART 1 — InsertOrder (header + lines insert) — FINAL v5.1 +// ✔ OrderHeaderID backend üretir +// ✔ LOCAL-... numara gelirse gerçek WS numarası üretir +// ✔ Full debug +// ✔ Tüm satırlar INSERT edilir +// ✔ INSERT öncesi ItemVariant Guard +// ✔ Payload içi Duplicate Guard (comboKey) +// ======================================================= + +func InsertOrder(header models.OrderHeader, lines []models.OrderDetail, user *models.User) (string, []OrderLineResult, error) { + conn := db.GetDB() + + fmt.Println("🟦 InsertOrder() BAŞLADI -----------------------------") + + tx, err := conn.Begin() + if err != nil { + return "", nil, fmt.Errorf("tx baslatilamadi: %w", err) + } + defer tx.Rollback() + + now := time.Now() + v3User := fmt.Sprintf("V3U%d-%s", user.V3UserGroup, user.V3Username) + + // ======================================================= + // 1) BACKEND — OrderHeaderID üretimi (HER ZAMAN) + // ======================================================= + realHeaderID := uuid.New().String() + + fmt.Println("🟩 Backend yeni OrderHeaderID üretti:", realHeaderID) + + header.OrderHeaderID = realHeaderID + + // ======================================================= + // 2) OrderNumber üretimi (LOCAL-* ise gerçek WS numarası) + // ======================================================= + if !header.OrderNumber.Valid || + strings.HasPrefix(header.OrderNumber.String, "LOCAL-") || + len(strings.TrimSpace(header.OrderNumber.String)) == 0 { + + fmt.Println("🟨 LOCAL numara geldi → gerçek WS numarası üretilecek...") + + var realNumber string + err := tx.QueryRow(` + SELECT CONCAT( + '1-WS-3-', + RIGHT('00000' + CAST(NEXT VALUE FOR BAGGI_V3.dbo.Seq_OrderNumber_WS AS VARCHAR(10)), 5) + ) + `).Scan(&realNumber) + + if err != nil { + return "", nil, fmt.Errorf("Gerçek sipariş numarası üretilemedi: %w", err) + } + + fmt.Println("🟩 Üretilen gerçek WS numarası:", realNumber) + + header.OrderNumber.String = realNumber + header.OrderNumber.Valid = true + } + + newID := realHeaderID // artık DB’ye bu yazılacak + + // ======================================================= + // 3) Döviz kuru çözümü + // ======================================================= + exRate := 1.0 + if header.DocCurrencyCode.Valid && header.DocCurrencyCode.String != "TRY" { + if c, err := GetTodayCurrencyV3(conn, header.DocCurrencyCode.String); err == nil { + if c.Rate > 0 { + exRate = c.Rate + } + } + } + + // ======================================================= + // 4) HEADER INSERT + // ======================================================= + + queryHeader := ` +INSERT INTO BAGGI_V3.dbo.trOrderHeader ( + OrderHeaderID, OrderTypeCode, ProcessCode, OrderNumber, IsCancelOrder, + OrderDate, OrderTime, DocumentNumber, PaymentTerm, + AverageDueDate, Description, InternalDescription, + CurrAccTypeCode, CurrAccCode, SubCurrAccID, ContactID, + ShipmentMethodCode, ShippingPostalAddressID, BillingPostalAddressID, + GuarantorContactID, GuarantorContactID2, RoundsmanCode, + DeliveryCompanyCode, TaxTypeCode, WithHoldingTaxTypeCode, DOVCode, + TaxExemptionCode, CompanyCode, OfficeCode, StoreTypeCode, StoreCode, + POSTerminalID, WarehouseCode, ToWarehouseCode, + OrdererCompanyCode, OrdererOfficeCode, OrdererStoreCode, + GLTypeCode, DocCurrencyCode, LocalCurrencyCode, ExchangeRate, + TDisRate1, TDisRate2, TDisRate3, TDisRate4, TDisRate5, + DiscountReasonCode, SurplusOrderQtyToleranceRate, + ImportFileNumber, ExportFileNumber, + IncotermCode1, IncotermCode2, LettersOfCreditNumber, + PaymentMethodCode, IsInclutedVat, IsCreditSale, IsCreditableConfirmed, + CreditableConfirmedUser, CreditableConfirmedDate, + IsSalesViaInternet, IsSuspended, IsCompleted, IsPrinted, + IsLocked, UserLocked, IsClosed, + ApplicationCode, ApplicationID, + CreatedUserName, CreatedDate, LastUpdatedUserName, LastUpdatedDate, + IsProposalBased +) +VALUES ( + @p1,@p2,@p3,@p4, + @p5,@p6,@p7,@p8, + @p9,@p10,@p11, + @p12,@p13,@p14,@p15, + @p16,@p17,@p18, + @p19,@p20,@p21, + @p22,@p23,@p24,@p25, + @p26,@p27,@p28,@p29,@p30, + @p31,@p32,@p33, + @p34,@p35,@p36, + @p37,@p38,@p39,@p40, + @p41,@p42,@p43,@p44,@p45, + @p46,@p47, + @p48,@p49, + @p50,@p51,@p52, + @p53,@p54,@p55,@p56,@p57, + @p58,@p59,@p60,@p61,@p62, + @p63,@p64,@p65, + @p66,@p67,@p68,@p69,@p70,@p71,@p72,@p73 +); +` + + fmt.Println("🟪 HEADER INSERT ÇALIŞIYOR...") + + headerParams := []any{ + header.OrderHeaderID, + nullableInt16(header.OrderTypeCode, 1), + nullableString(header.ProcessCode, "WS"), + nullableString(header.OrderNumber, ""), + nullableBool(header.IsCancelOrder, false), + + nullableDateString(header.OrderDate), + nullableTimeString(header.OrderTime), + nullableString(header.DocumentNumber, ""), + nullableInt16(header.PaymentTerm, 0), + + nullableDateString(header.AverageDueDate), + nullableString(header.Description, ""), + nullableString(header.InternalDescription, ""), + + nullableInt16(header.CurrAccTypeCode, 0), + nullableString(header.CurrAccCode, ""), + nullableUUID(header.SubCurrAccID), + nullableUUID(header.ContactID), + + nullableString(header.ShipmentMethodCode, ""), + nullableUUID(header.ShippingPostalAddressID), + nullableUUID(header.BillingPostalAddressID), + + nullableUUID(header.GuarantorContactID), + nullableUUID(header.GuarantorContactID2), + nullableString(header.RoundsmanCode, ""), + + nullableString(header.DeliveryCompanyCode, ""), + nullableInt16(header.TaxTypeCode, 0), + nullableString(header.WithHoldingTaxTypeCode, ""), + nullableString(header.DOVCode, ""), + + nullableInt16(header.TaxExemptionCode, 0), + nullableInt32ToInt16(header.CompanyCode, 1), + nullableString(header.OfficeCode, "101"), + nullableInt16(header.StoreTypeCode, 5), + nullableString(header.StoreCode, ""), + + nullableInt16(header.POSTerminalID, 0), + nullableString(header.WarehouseCode, "1-0-12"), + nullableString(header.ToWarehouseCode, ""), + + nullableInt32ToInt16(header.OrdererCompanyCode, 1), + nullableString(header.OrdererOfficeCode, "101"), + nullableString(header.OrdererStoreCode, ""), + + nullableString(header.GLTypeCode, ""), + nullableString(header.DocCurrencyCode, "TRY"), + nullableString(header.LocalCurrencyCode, "TRY"), + nullableFloat64(header.ExchangeRate, exRate), + + nullableFloat64(header.TDisRate1, 0), + nullableFloat64(header.TDisRate2, 0), + nullableFloat64(header.TDisRate3, 0), + nullableFloat64(header.TDisRate4, 0), + nullableFloat64(header.TDisRate5, 0), + + nullableInt16(header.DiscountReasonCode, 0), + nullableFloat64(header.SurplusOrderQtyToleranceRate, 0), + + nullableString(header.ImportFileNumber, ""), + nullableString(header.ExportFileNumber, ""), + + nullableString(header.IncotermCode1, ""), + nullableString(header.IncotermCode2, ""), + nullableString(header.LettersOfCreditNumber, ""), + + nullableString(header.PaymentMethodCode, ""), + nullableBool(header.IsInclutedVat, false), + nullableBool(header.IsCreditSale, true), + nullableBool(header.IsCreditableConfirmed, true), + + nullableString(header.CreditableConfirmedUser, v3User), + nullableDateTime(header.CreditableConfirmedDate, now), + + nullableBool(header.IsSalesViaInternet, false), + nullableBool(header.IsSuspended, false), + nullableBool(header.IsCompleted, false), + nullableBool(header.IsPrinted, false), + + nullableBool(header.IsLocked, false), + nullableBool(header.UserLocked, false), + nullableBool(header.IsClosed, false), + + nullableString(header.ApplicationCode, "Order"), + nullableUUID(header.ApplicationID), + + nullableString(header.CreatedUserName, v3User), + nullableDateTimeString(header.CreatedDate, now), + nullableString(header.LastUpdatedUserName, v3User), + nullableDateTimeString(header.LastUpdatedDate, now), + + nullableBool(header.IsProposalBased, false), + } + + if _, err := tx.Exec(queryHeader, headerParams...); err != nil { + fmt.Println("❌ HEADER INSERT ERROR:", err) + return "", nil, fmt.Errorf("header insert hatasi: %w", err) + } + + fmt.Println("🟩 HEADER INSERT OK — ID:", newID) + + // ======================================================= + // 5) LINE INSERT + // ======================================================= + + insStmt, err := tx.Prepare(` +INSERT INTO BAGGI_V3.dbo.trOrderLine ( + OrderLineID, + SortOrder, ItemTypeCode, ItemCode, ColorCode, + ItemDim1Code, ItemDim2Code, ItemDim3Code, + Qty1, Qty2, + CancelQty1, CancelQty2, + OrderCancelReasonCode, + DeliveryDate, PlannedDateOfLading, + LineDescription, + UsedBarcode, CostCenterCode, + VatCode, VatRate, PCTCode, PCTRate, + LDisRate1, LDisRate2, LDisRate3, LDisRate4, LDisRate5, + DocCurrencyCode, PriceCurrencyCode, PriceExchangeRate, + Price, + BaseProcessCode, BaseOrderNumber, + BaseCustomerTypeCode, BaseCustomerCode, + BaseSubCurrAccID, BaseStoreCode, + OrderHeaderID, + CreatedUserName, CreatedDate, + LastUpdatedUserName, LastUpdatedDate, + SurplusOrderQtyToleranceRate, + WithHoldingTaxTypeCode, + DOVCode +) +VALUES ( + @p1,@p2,@p3,@p4, + @p5,@p6,@p7,@p8, + @p9,@p10, + @p11,@p12, + @p13, + @p14,@p15, + @p16, + @p17,@p18, + @p19,@p20,@p21,@p22, + @p23,@p24,@p25,@p26,@p27, + @p28,@p29,@p30, + @p31, + @p32,@p33, + @p34,@p35, + @p36,@p37, + @p38, + @p39,@p40, + @p41,@p42, + @p43, + @p44, + @p45 +)`) + if err != nil { + return "", nil, fmt.Errorf("line insert stmt hazirlanamadi: %w", err) + } + defer insStmt.Close() + + lineResults := make([]OrderLineResult, 0, len(lines)) + + // ✅ Duplicate Guard (payload içi) + seenCombo := make(map[string]bool) + + for i, ln := range lines { + // ===================== PART 2 (Satır 301-600) ===================== + fmt.Println("────────────────────────────────────") + fmt.Printf("🟨 [INSERT] LINE %d — gelen OrderLineID=%s\n", i+1, ln.OrderLineID) + + // Her satır için yeni GUID + if ln.OrderLineID == "" { + newLineID := uuid.New().String() + fmt.Println("🆕 Yeni LineID üretildi:", newLineID) + ln.OrderLineID = newLineID + } + + // ✅ Duplicate Guard (comboKey) + comboKey := normalizeComboKey(safeNS(ln.ComboKey)) + if comboKey == "" { + comboKey = makeComboKey(ln) + } + + if qtyValue(ln.Qty1) > 0 && comboKey != "" { + if seenCombo[comboKey] { + return "", nil, fmt.Errorf( + "Duplicate satır (comboKey=%s, ClientKey=%s)", + comboKey, + safeNS(ln.ClientKey), + ) + } + seenCombo[comboKey] = true + } + + // V2 Logic → %0 PCT + vatCode := normalizeVatCode(ln.VatCode) + pctCode := normalizePCTCode(ln.PCTCode) + + var pctParam any + if pctCode == "" { + pctParam = nil + } else { + pctParam = pctCode + } + + planned := nullableDateString(ln.PlannedDateOfLading) + // ✅ INSERT ÖNCESİ ItemVariant GUARD + if qtyValue(ln.Qty1) > 0 { + if err := ValidateItemVariant(tx, ln); err != nil { + fmt.Println("❌ VARIANT GUARD (INSERT):", err) + return "", nil, err + } + } + fmt.Printf( + "🚨 INSERT LINE[%d] | LineID=%s ClientKey=%s Item=%q Color=%q Dim1=%q Dim2=%q Dim3=%q Qty1=%v\n", + i+1, + ln.OrderLineID, + safeNS(ln.ClientKey), + safeNS(ln.ItemCode), + safeNS(ln.ColorCode), + safeNS(ln.ItemDim1Code), + safeNS(ln.ItemDim2Code), + safeNS(ln.ItemDim3Code), + nf0(ln.Qty1), + ) + + _, err := insStmt.Exec( + ln.OrderLineID, + ln.SortOrder, + ln.ItemTypeCode, + nullableString(ln.ItemCode, ""), + safeNS(ln.ColorCode), + safeNS(ln.ItemDim1Code), + safeNS(ln.ItemDim2Code), + nullableString(ln.ItemDim3Code, ""), + ln.Qty1, ln.Qty2, + ln.CancelQty1, ln.CancelQty2, + nullableString(ln.OrderCancelReasonCode, ""), + nullableTime(ln.DeliveryDate, now), + planned, + nullableString(ln.LineDescription, ""), + nullableString(ln.UsedBarcode, ""), + nullableString(ln.CostCenterCode, ""), + vatCode, nf0(ln.VatRate), + pctParam, nf0(ln.PCTRate), + nf0(ln.LDisRate1), + nf0(ln.LDisRate2), + nf0(ln.LDisRate3), + nf0(ln.LDisRate4), + nf0(ln.LDisRate5), + nullableString(ln.DocCurrencyCode, "TRY"), + nullableString(ln.PriceCurrencyCode, "TRY"), + nf0(ln.PriceExchangeRate), + nf0(ln.Price), + nullableString(ln.BaseProcessCode, ""), + nullableString(ln.BaseOrderNumber, ""), + ln.BaseCustomerTypeCode, + nullableString(ln.BaseCustomerCode, ""), + nullableUUID(ln.BaseSubCurrAccID), + nullableString(ln.BaseStoreCode, ""), + header.OrderHeaderID, + v3User, now, + v3User, now, + nf0(ln.SurplusOrderQtyToleranceRate), + nullableString(ln.WithHoldingTaxTypeCode, ""), + nullableString(ln.DOVCode, ""), + ) + + if err != nil { + fmt.Println("❌ INSERT LINE ERROR") + fmt.Printf( + "💥 FAILED LINE | LineID=%s ClientKey=%s Item=%q Color=%q Dim1=%q Dim2=%q Dim3=%q\n", + ln.OrderLineID, + safeNS(ln.ClientKey), + safeNS(ln.ItemCode), + safeNS(ln.ColorCode), + safeNS(ln.ItemDim1Code), + safeNS(ln.ItemDim2Code), + safeNS(ln.ItemDim3Code), + ) + fmt.Println("SQL ERROR:", err) + return "", nil, fmt.Errorf("line insert hatasi: %w", err) + } + + if ln.ClientKey.Valid && ln.ClientKey.String != "" { + lineResults = append(lineResults, OrderLineResult{ + ClientKey: ln.ClientKey.String, + OrderLineID: ln.OrderLineID, + }) + } + } + + // ======================================================= + // 6) COMMIT + // ======================================================= + fmt.Println("🟨 COMMIT EDİLİYOR...") + + if err := tx.Commit(); err != nil { + fmt.Println("❌ COMMIT ERROR:", err) + return "", nil, err + } + + fmt.Println("✅ COMMIT OK — INSERT ORDER BİTTİ") + fmt.Println("────────────────────────────────────") + + return newID, lineResults, nil +} + +// ======================================================= +// PART 2 — UpdateOrder FULL DEBUG (v4.3) +// ✔ ComboKey ile açık satır eşleştirme +// ✔ Kapalı satırları korur +// ✔ Payload içi Duplicate Guard +// ✔ INSERT/UPDATE öncesi ItemVariant Guard (tek noktada) +// ✔ Grid’de olmayan açık satırları siler (önce child) +// ======================================================= + +func UpdateOrder(header models.OrderHeader, lines []models.OrderDetail, user *models.User) ([]OrderLineResult, error) { + conn := db.GetDB() + + // ====================================================== + // 🔍 SCAN DEBUG — HEADER bilgisi + // ====================================================== + fmt.Println("══════════════════════════════════════") + fmt.Println("🔍 [DEBUG] UpdateOrder çağrıldı") + fmt.Printf("🔍 HeaderID: %v\n", header.OrderHeaderID) + fmt.Printf("🔍 Line sayısı: %v\n", len(lines)) + fmt.Printf("🔍 User: %v (V3: %s/%d)\n", + user.Username, user.V3Username, user.V3UserGroup) + fmt.Println("══════════════════════════════════════") + + tx, err := conn.Begin() + if err != nil { + return nil, fmt.Errorf("tx baslatilamadi: %w", err) + } + defer tx.Rollback() + + now := time.Now() + v3User := fmt.Sprintf("V3U%d-%s", user.V3UserGroup, user.V3Username) + + // Döviz kuru + exRate := 1.0 + if header.DocCurrencyCode.Valid && header.DocCurrencyCode.String != "TRY" { + if c, err := GetTodayCurrencyV3(conn, header.DocCurrencyCode.String); err == nil && c.Rate > 0 { + exRate = c.Rate + } + } + + // ======================================================= + // 0) Mevcut satırları oku (GUID STRING olarak!) + // ======================================================= + + existingOpen := make(map[string]bool) + existingClosed := make(map[string]bool) + existingOpenCombo := make(map[string]string) + existingClosedCombo := make(map[string]string) + + rows, err := tx.Query(` +SELECT + CONVERT(varchar(36), OrderLineID), + ISNULL(IsClosed, 0), + ISNULL(ItemCode,''), + ISNULL(ColorCode,''), + ISNULL(ItemDim1Code,''), + ISNULL(ItemDim2Code,'') +FROM BAGGI_V3.dbo.trOrderLine +WHERE OrderHeaderID=@p1 +`, header.OrderHeaderID) + if err != nil { + return nil, fmt.Errorf("mevcut satirlar okunamadi: %w", err) + } + defer rows.Close() + + for rows.Next() { + var id, item, color, dim1, dim2 string + var closed bool + + if err := rows.Scan(&id, &closed, &item, &color, &dim1, &dim2); err != nil { + return nil, err + } + + combo := makeComboKeyParts(item, color, dim1, dim2) + + if closed { + existingClosed[id] = true + if combo != "" { + existingClosedCombo[combo] = id + } + } else { + existingOpen[id] = true + if combo != "" { + existingOpenCombo[combo] = id + } + } + } + + // ====================================================== + // HEADER UPDATE + // ====================================================== + + _, err = tx.Exec(` +UPDATE BAGGI_V3.dbo.trOrderHeader SET + OrderDate=@p1, + OrderTime=@p2, + AverageDueDate=@p3, + Description=@p4, + InternalDescription=@p5, + DocCurrencyCode=@p6, + LocalCurrencyCode=@p7, + ExchangeRate=@p8, + LastUpdatedUserName=@p9, + LastUpdatedDate=@p10 +WHERE OrderHeaderID=@p11 +`, + nullableDateString(header.OrderDate), + nullableTimeString(header.OrderTime), + nullableDateString(header.AverageDueDate), + nullableString(header.Description, ""), + nullableString(header.InternalDescription, ""), + nullableString(header.DocCurrencyCode, "TRY"), + nullableString(header.LocalCurrencyCode, "TRY"), + nullableFloat64(header.ExchangeRate, exRate), + v3User, + now, + header.OrderHeaderID, + ) + if err != nil { + return nil, err + } + // ====================================================== + // PREPARE STATEMENTS + // ====================================================== + + insStmt, err := tx.Prepare(`INSERT INTO BAGGI_V3.dbo.trOrderLine ( +OrderLineID, SortOrder, ItemTypeCode, ItemCode, ColorCode, +ItemDim1Code, ItemDim2Code, ItemDim3Code, +Qty1, Qty2, CancelQty1, CancelQty2, OrderCancelReasonCode, +DeliveryDate, PlannedDateOfLading, LineDescription, +UsedBarcode, CostCenterCode, +VatCode, VatRate, PCTCode, PCTRate, +LDisRate1, LDisRate2, LDisRate3, LDisRate4, LDisRate5, +DocCurrencyCode, PriceCurrencyCode, PriceExchangeRate, +Price, BaseProcessCode, BaseOrderNumber, +BaseCustomerTypeCode, BaseCustomerCode, +BaseSubCurrAccID, BaseStoreCode, +OrderHeaderID, CreatedUserName, CreatedDate, +LastUpdatedUserName, LastUpdatedDate, +SurplusOrderQtyToleranceRate, +WithHoldingTaxTypeCode, DOVCode) +VALUES ( +@p1,@p2,@p3,@p4,@p5,@p6,@p7,@p8,@p9,@p10, +@p11,@p12,@p13,@p14,@p15,@p16,@p17,@p18, +@p19,@p20,@p21,@p22,@p23,@p24,@p25,@p26,@p27, +@p28,@p29,@p30,@p31,@p32,@p33,@p34,@p35, +@p36,@p37,@p38,@p39,@p40,@p41,@p42,@p43, +@p44,@p45)`) + + if err != nil { + return nil, err + } + defer insStmt.Close() + + updStmt, err := tx.Prepare(`UPDATE BAGGI_V3.dbo.trOrderLine SET +SortOrder=@p1, ItemTypeCode=@p2, ItemCode=@p3, ColorCode=@p4, +ItemDim1Code=@p5, ItemDim2Code=@p6, ItemDim3Code=@p7, +Qty1=@p8, Qty2=@p9, CancelQty1=@p10, CancelQty2=@p11, +OrderCancelReasonCode=@p12, +DeliveryDate=@p13, PlannedDateOfLading=@p14, +LineDescription=@p15, UsedBarcode=@p16, CostCenterCode=@p17, +VatCode=@p18, VatRate=@p19, PCTCode=@p20, PCTRate=@p21, +LDisRate1=@p22, LDisRate2=@p23, LDisRate3=@p24, +LDisRate4=@p25, LDisRate5=@p26, +DocCurrencyCode=@p27, PriceCurrencyCode=@p28, +PriceExchangeRate=@p29, Price=@p30, +BaseProcessCode=@p31, BaseOrderNumber=@p32, +BaseCustomerTypeCode=@p33, BaseCustomerCode=@p34, +BaseSubCurrAccID=@p35, BaseStoreCode=@p36, +LastUpdatedUserName=@p37, LastUpdatedDate=@p38, +SurplusOrderQtyToleranceRate=@p39, +WithHoldingTaxTypeCode=@p40, DOVCode=@p41 +WHERE OrderLineID=@p42 AND ISNULL(IsClosed,0)=0`) + + if err != nil { + return nil, err + } + defer updStmt.Close() + + lineResults := make([]OrderLineResult, 0) + seenCombo := make(map[string]bool) + + for _, ln := range lines { + + comboKey := normalizeComboKey(safeNS(ln.ComboKey)) + if comboKey == "" { + comboKey = makeComboKey(ln) + } + + // Duplicate guard (SADECE aktif) + if qtyValue(ln.Qty1) > 0 && comboKey != "" { + if seenCombo[comboKey] { + return nil, fmt.Errorf("Duplicate satır: %s", comboKey) + } + seenCombo[comboKey] = true + } + + // Kapalı satır + if ln.OrderLineID != "" && existingClosed[ln.OrderLineID] { + continue + } + if comboKey != "" { + if _, ok := existingClosedCombo[comboKey]; ok { + continue + } + } + + // DELETE SIGNAL + if ln.OrderLineID != "" && qtyValue(ln.Qty1) <= 0 { + _, err := tx.Exec(`DELETE FROM BAGGI_V3.dbo.trOrderLineCurrency WHERE OrderLineID=@p1`, ln.OrderLineID) + if err != nil { + return nil, err + } + _, err = tx.Exec(` +DELETE FROM BAGGI_V3.dbo.trOrderLine +WHERE OrderHeaderID=@p1 AND OrderLineID=@p2 AND ISNULL(IsClosed,0)=0 +`, header.OrderHeaderID, ln.OrderLineID) + if err != nil { + return nil, err + } + delete(existingOpen, ln.OrderLineID) + delete(existingOpenCombo, comboKey) + continue + } + isNew := false + + if ln.OrderLineID == "" { + if dbID, ok := existingOpenCombo[comboKey]; ok { + ln.OrderLineID = dbID + } else { + ln.OrderLineID = uuid.New().String() + isNew = true + } + } + + if qtyValue(ln.Qty1) > 0 { + if err := ValidateItemVariant(tx, ln); err != nil { + return nil, err + } + } + + if isNew { + _, err := insStmt.Exec( + ln.OrderLineID, ln.SortOrder, ln.ItemTypeCode, + nullableString(ln.ItemCode, ""), safeNS(ln.ColorCode), + safeNS(ln.ItemDim1Code), safeNS(ln.ItemDim2Code), + nullableString(ln.ItemDim3Code, ""), + ln.Qty1, ln.Qty2, ln.CancelQty1, ln.CancelQty2, + nullableString(ln.OrderCancelReasonCode, ""), + nullableTime(ln.DeliveryDate, now), + nullableDateString(ln.PlannedDateOfLading), + nullableString(ln.LineDescription, ""), + nullableString(ln.UsedBarcode, ""), + nullableString(ln.CostCenterCode, ""), + normalizeVatCode(ln.VatCode), nf0(ln.VatRate), + normalizePCTCode(ln.PCTCode), nf0(ln.PCTRate), + nf0(ln.LDisRate1), nf0(ln.LDisRate2), + nf0(ln.LDisRate3), nf0(ln.LDisRate4), nf0(ln.LDisRate5), + nullableString(ln.DocCurrencyCode, "TRY"), + nullableString(ln.PriceCurrencyCode, "TRY"), + nf0(ln.PriceExchangeRate), nf0(ln.Price), + nullableString(ln.BaseProcessCode, ""), + nullableString(ln.BaseOrderNumber, ""), + ln.BaseCustomerTypeCode, + nullableString(ln.BaseCustomerCode, ""), + nullableUUID(ln.BaseSubCurrAccID), + nullableString(ln.BaseStoreCode, ""), + header.OrderHeaderID, + v3User, now, v3User, now, + nf0(ln.SurplusOrderQtyToleranceRate), + nullableString(ln.WithHoldingTaxTypeCode, ""), + nullableString(ln.DOVCode, ""), + ) + if err != nil { + return nil, err + } + } else { + _, err := updStmt.Exec( + ln.SortOrder, ln.ItemTypeCode, + nullableString(ln.ItemCode, ""), + safeNS(ln.ColorCode), + safeNS(ln.ItemDim1Code), + safeNS(ln.ItemDim2Code), + nullableString(ln.ItemDim3Code, ""), + nf0(ln.Qty1), nf0(ln.Qty2), + nf0(ln.CancelQty1), nf0(ln.CancelQty2), + nullableString(ln.OrderCancelReasonCode, ""), + nullableTime(ln.DeliveryDate, now), + nullableDateString(ln.PlannedDateOfLading), + nullableString(ln.LineDescription, ""), + nullableString(ln.UsedBarcode, ""), + nullableString(ln.CostCenterCode, ""), + normalizeVatCode(ln.VatCode), nf0(ln.VatRate), + normalizePCTCode(ln.PCTCode), nf0(ln.PCTRate), + nf0(ln.LDisRate1), nf0(ln.LDisRate2), + nf0(ln.LDisRate3), nf0(ln.LDisRate4), nf0(ln.LDisRate5), + nullableString(ln.DocCurrencyCode, "TRY"), + nullableString(ln.PriceCurrencyCode, "TRY"), + nf0(ln.PriceExchangeRate), nf0(ln.Price), + nullableString(ln.BaseProcessCode, ""), + nullableString(ln.BaseOrderNumber, ""), + ln.BaseCustomerTypeCode, + nullableString(ln.BaseCustomerCode, ""), + nullableUUID(ln.BaseSubCurrAccID), + nullableString(ln.BaseStoreCode, ""), + v3User, now, + nf0(ln.SurplusOrderQtyToleranceRate), + nullableString(ln.WithHoldingTaxTypeCode, ""), + nullableString(ln.DOVCode, ""), + ln.OrderLineID, + ) + if err != nil { + return nil, err + } + } + + delete(existingOpen, ln.OrderLineID) + delete(existingOpenCombo, comboKey) + + if ln.ClientKey.Valid { + lineResults = append(lineResults, OrderLineResult{ + ClientKey: ln.ClientKey.String, + OrderLineID: ln.OrderLineID, + }) + } + } + + // Grid dışı kalan açık satırlar + for id := range existingOpen { + _, err := tx.Exec(`DELETE FROM BAGGI_V3.dbo.trOrderLineCurrency WHERE OrderLineID=@p1`, id) + if err != nil { + return nil, err + } + _, err = tx.Exec(`DELETE FROM BAGGI_V3.dbo.trOrderLine WHERE OrderLineID=@p1 AND ISNULL(IsClosed,0)=0`, id) + if err != nil { + return nil, err + } + } + + if err := tx.Commit(); err != nil { + return nil, err + } + + return lineResults, nil +} diff --git a/svc/queries/orderinventory.go b/svc/queries/orderinventory.go new file mode 100644 index 0000000..a7c20b1 --- /dev/null +++ b/svc/queries/orderinventory.go @@ -0,0 +1,109 @@ +package queries + +// 🔹 Sipariş ekranı stok kontrolü (ürün + renk + 2. renk + beden) +// 🔧 Renk1 boşsa (aksesuar vb.) renksiz stokları da çeker +const GetOrderInventory = ` +DECLARE @ProductCode NVARCHAR(30) = @p1; +DECLARE @ColorCode NVARCHAR(30) = @p2; +DECLARE @ColorCode2 NVARCHAR(30) = @p3; + +-- 🔧 Normalize giriş parametreleri +SET @ColorCode = LTRIM(RTRIM(ISNULL(@ColorCode, ''))); +SET @ColorCode2 = LTRIM(RTRIM(ISNULL(@ColorCode2, ''))); + +IF @ColorCode = '' +BEGIN + SET @ColorCode = ''; +END + +IF @ColorCode2 = '' +BEGIN + SET @ColorCode2 = NULL; +END + +------------------------------------------------------------ +-- 🔹 Ana sorgu +------------------------------------------------------------ +SELECT + Inventory.ItemCode AS Urun_Kodu, + Inventory.ColorCode AS Renk_Kodu, + ISNULL(( + SELECT TOP 1 ColorDescription + FROM cdColorDesc WITH(NOLOCK) + WHERE cdColorDesc.ColorCode = Inventory.ColorCode + AND cdColorDesc.LangCode = N'TR' + ), '') AS Renk_Aciklamasi, + + -- ✅ NULL bedenleri boş string olarak getir + ISNULL(Inventory.ItemDim1Code, '') AS Beden, + ISNULL(Inventory.ItemDim2Code, '') AS Yaka, + + ROUND( + SUM(Inventory.InventoryQty1) - + (SUM(Inventory.ReserveQty1) + SUM(Inventory.DispOrderQty1) + SUM(Inventory.PickingQty1)), + cdUnitOfMeasure.RoundDigit + ) AS Kullanilabilir_Envanter + +FROM cdItem WITH (NOLOCK) +JOIN cdUnitOfMeasure WITH (NOLOCK) + ON cdItem.UnitOfMeasureCode1 = cdUnitOfMeasure.UnitOfMeasureCode +JOIN ( + SELECT + CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code, + SUM(CASE WHEN SourceTable = 'PickingStates' THEN Qty1 ELSE 0 END) AS PickingQty1, + SUM(CASE WHEN SourceTable = 'ReserveStates' THEN Qty1 ELSE 0 END) AS ReserveQty1, + SUM(CASE WHEN SourceTable = 'DispOrderStates' THEN Qty1 ELSE 0 END) AS DispOrderQty1, + SUM(CASE WHEN SourceTable = 'trStock' THEN (In_Qty1 - Out_Qty1) ELSE 0 END) AS InventoryQty1 + FROM ( + SELECT 'PickingStates' AS SourceTable, CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code, + Qty1, 0 AS In_Qty1, 0 AS Out_Qty1 + FROM PickingStates + UNION ALL + SELECT 'ReserveStates', CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code, + Qty1, 0, 0 + FROM ReserveStates + UNION ALL + SELECT 'DispOrderStates', CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code, + Qty1, 0, 0 + FROM DispOrderStates + UNION ALL + SELECT 'trStock', CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code, + 0, SUM(In_Qty1), SUM(Out_Qty1) + FROM trStock WITH (NOLOCK) + GROUP BY CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code + ) AS SourceData + GROUP BY CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, + ItemTypeCode, ItemCode, ColorCode, ItemDim1Code, ItemDim2Code, ItemDim3Code +) AS Inventory + ON cdItem.ItemTypeCode = Inventory.ItemTypeCode + AND cdItem.ItemCode = Inventory.ItemCode +LEFT JOIN ProductAttributesFilter + ON ProductAttributesFilter.ItemCode = Inventory.ItemCode +WHERE + Inventory.ItemTypeCode IN (1) + AND Inventory.WarehouseCode IN ('1-0-12','1-0-21','1-0-10','1-0-2','1-1-3','1-2-4','1-2-5') + AND cdItem.IsBlocked = 0 + AND Inventory.ItemCode = @ProductCode + AND ( + -- 🔹 Eğer renk girilmişse o renk; boşsa renksiz stokları getir + (LTRIM(RTRIM(@ColorCode)) <> '' AND Inventory.ColorCode = @ColorCode) + OR (LTRIM(RTRIM(@ColorCode)) = '' AND (Inventory.ColorCode IS NULL OR LTRIM(RTRIM(Inventory.ColorCode)) = '')) + ) + AND ( + -- 🔹 2. renk sadece doluysa filtrelensin + @ColorCode2 IS NULL + OR Inventory.ItemDim2Code = @ColorCode2 + ) +GROUP BY + Inventory.ItemCode, + Inventory.ColorCode, + ISNULL(Inventory.ItemDim1Code, ''), -- ✅ NULL bedenleri boş string olarak gruplar + ISNULL(Inventory.ItemDim2Code, ''), -- ✅ NULL yakaları boş string olarak gruplar + cdUnitOfMeasure.RoundDigit; +` diff --git a/svc/queries/orderlist.go b/svc/queries/orderlist.go new file mode 100644 index 0000000..78a7107 --- /dev/null +++ b/svc/queries/orderlist.go @@ -0,0 +1,213 @@ +package queries + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/authz" + "context" + "database/sql" + "fmt" +) + +// ======================================================== +// 📌 GetOrderList — FINAL + CURRENCY SAFE + PIYASA AUTHZ +// ======================================================== +func GetOrderList( + ctx context.Context, + mssql *sql.DB, + pg *sql.DB, + search string, +) (*sql.Rows, error) { + + claims, ok := auth.GetClaimsFromContext(ctx) + if !ok || claims == nil { + return nil, fmt.Errorf("unauthorized: claims not found") + } + + // ---------------------------------------------------- + // 🔐 PIYASA FILTER (ADMIN BYPASS) + // ---------------------------------------------------- + piyasaWhere := "1=1" + + if !claims.IsAdmin() { + + codes, err := authz.GetUserPiyasaCodes(pg, int(claims.ID)) + if err != nil { + return nil, fmt.Errorf("piyasa codes load error: %w", err) + } + + if len(codes) == 0 { + // hiç yetkisi yok → hiç kayıt dönmesin + piyasaWhere = "1=0" + } else { + // ⚠️ EXISTS içinde kullanılacak + piyasaWhere = authz.BuildINClause( + "UPPER(f2.CustomerAtt01)", + codes, + ) + } + } + + // ---------------------------------------------------- + // 📄 BASE QUERY + // ---------------------------------------------------- + baseQuery := fmt.Sprintf(` +SELECT + CAST(h.OrderHeaderID AS NVARCHAR(50)) AS OrderHeaderID, + ISNULL(h.OrderNumber, '') AS OrderNumber, + CONVERT(varchar, h.OrderDate, 23) AS OrderDate, + + ISNULL(h.CurrAccCode, '') AS CurrAccCode, + ISNULL(ca.CurrAccDescription, '') AS CurrAccDescription, + + ISNULL(mt.AttributeDescription, '') AS MusteriTemsilcisi, + ISNULL(py.AttributeDescription, '') AS Piyasa, + + CONVERT(varchar, h.CreditableConfirmedDate,23) AS CreditableConfirmedDate, + ISNULL(h.DocCurrencyCode,'TRY') AS DocCurrencyCode, + + ISNULL(l.TotalAmount,0) AS TotalAmount, + + ---------------------------------------------------------------- + -- USD HESABI (TRY / EUR / GBP / USD DESTEKLİ) + ---------------------------------------------------------------- + CASE + WHEN h.DocCurrencyCode = 'USD' + THEN ISNULL(l.TotalAmount,0) + + WHEN h.DocCurrencyCode = 'TRY' + AND usd.Rate > 0 + THEN ISNULL(l.TotalAmount,0) / usd.Rate + + WHEN h.DocCurrencyCode IN ('EUR','GBP') + AND cur.Rate > 0 + AND usd.Rate > 0 + THEN (ISNULL(l.TotalAmount,0) * cur.Rate) / usd.Rate + + ELSE 0 + END AS TotalAmountUSD, + + ISNULL(h.IsCreditableConfirmed,0) AS IsCreditableConfirmed, + ISNULL(h.Description,'') AS Description, + + usd.Rate AS ExchangeRateUSD + +FROM dbo.trOrderHeader h + +JOIN ( + SELECT + OrderHeaderID, + SUM(Qty1 * Price) AS TotalAmount + FROM dbo.trOrderLine + GROUP BY OrderHeaderID +) l + ON l.OrderHeaderID = h.OrderHeaderID + +LEFT JOIN dbo.cdCurrAccDesc ca + ON ca.CurrAccCode = h.CurrAccCode + AND ca.LangCode = 'TR' + +-- müşteri temsilcisi + piyasa açıklamaları +LEFT JOIN dbo.CustomerAttributesFilter f + ON f.CurrAccCode = h.CurrAccCode + +LEFT JOIN dbo.cdCurrAccAttributeDesc mt + ON mt.CurrAccTypeCode = 3 + AND mt.AttributeTypeCode = 2 + AND mt.AttributeCode = f.CustomerAtt02 + AND mt.LangCode = 'TR' + +LEFT JOIN dbo.cdCurrAccAttributeDesc py + ON py.CurrAccTypeCode = 3 + AND py.AttributeTypeCode = 1 + AND py.AttributeCode = f.CustomerAtt01 + AND py.LangCode = 'TR' + +---------------------------------------------------------------- +-- USD → TRY +---------------------------------------------------------------- +OUTER APPLY ( + SELECT TOP 1 Rate + FROM dbo.AllExchangeRates + WHERE CurrencyCode = 'USD' + AND RelationCurrencyCode = 'TRY' + AND ExchangeTypeCode = 6 + AND Rate > 0 + AND Date <= CAST(GETDATE() AS date) + ORDER BY Date DESC +) usd + +---------------------------------------------------------------- +-- ORDER PB → TRY +---------------------------------------------------------------- +OUTER APPLY ( + SELECT TOP 1 Rate + FROM dbo.AllExchangeRates + WHERE CurrencyCode = h.DocCurrencyCode + AND RelationCurrencyCode = 'TRY' + AND ExchangeTypeCode = 6 + AND Rate > 0 + AND Date <= CAST(GETDATE() AS date) + ORDER BY Date DESC +) cur + +WHERE + ISNULL(h.IsCancelOrder,0) = 0 + AND h.OrderTypeCode = 1 + AND h.ProcessCode = 'WS' + AND h.IsClosed = 0 + + -- 🔐 PIYASA AUTHZ (EXISTS — SAĞLAM YOL) + AND EXISTS ( + SELECT 1 + FROM dbo.CustomerAttributesFilter f2 + WHERE f2.CurrAccCode = h.CurrAccCode + AND %s + ) +`, piyasaWhere) + + // ---------------------------------------------------- + // 🔍 SEARCH FILTER (CASE + TR SAFE) + // ---------------------------------------------------- + if search != "" { + baseQuery += ` +AND EXISTS ( + SELECT 1 + FROM dbo.trOrderHeader h2 + LEFT JOIN dbo.cdCurrAccDesc ca2 + ON ca2.CurrAccCode = h2.CurrAccCode + AND ca2.LangCode = 'TR' + WHERE h2.OrderHeaderID = h.OrderHeaderID + AND ( + LOWER(REPLACE(REPLACE(h2.OrderNumber,'İ','I'),'ı','i')) + COLLATE Latin1_General_CI_AI LIKE LOWER(@p1) + + OR LOWER(REPLACE(REPLACE(h2.CurrAccCode,'İ','I'),'ı','i')) + COLLATE Latin1_General_CI_AI LIKE LOWER(@p1) + + OR LOWER(REPLACE(REPLACE(ca2.CurrAccDescription,'İ','I'),'ı','i')) + COLLATE Latin1_General_CI_AI LIKE LOWER(@p1) + + OR LOWER(REPLACE(REPLACE(h2.Description,'İ','I'),'ı','i')) + COLLATE Latin1_General_CI_AI LIKE LOWER(@p1) + ) +) +` + } + + // ---------------------------------------------------- + // 📌 ORDER + // ---------------------------------------------------- + baseQuery += ` +ORDER BY h.CreatedDate DESC +` + + // ---------------------------------------------------- + // ▶ EXECUTE + // ---------------------------------------------------- + if search != "" { + searchLike := fmt.Sprintf("%%%s%%", search) + return mssql.Query(baseQuery, searchLike) + } + + return mssql.Query(baseQuery) +} diff --git a/svc/queries/orderlist_base.go b/svc/queries/orderlist_base.go new file mode 100644 index 0000000..02d5afd --- /dev/null +++ b/svc/queries/orderlist_base.go @@ -0,0 +1,75 @@ +package queries + +const OrderListBaseQuery = ` +SELECT + CAST(h.OrderHeaderID AS NVARCHAR(50)) AS OrderHeaderID, + ISNULL(h.OrderNumber, '') AS OrderNumber, + CONVERT(varchar, h.OrderDate, 23) AS OrderDate, + + ISNULL(h.CurrAccCode, '') AS CurrAccCode, + ISNULL(ca.CurrAccDescription, '') AS CurrAccDescription, + + ISNULL(mt.AttributeDescription, '') AS MusteriTemsilcisi, + ISNULL(py.AttributeDescription, '') AS Piyasa, + + CONVERT(varchar, h.CreditableConfirmedDate, 23) AS CreditableConfirmedDate, + ISNULL(h.DocCurrencyCode, 'TRY') AS DocCurrencyCode, + + ISNULL(l.TotalAmount, 0) AS TotalAmount, + + CASE + WHEN h.DocCurrencyCode = 'USD' + THEN ISNULL(l.TotalAmount, 0) + WHEN h.DocCurrencyCode = 'TRY' + THEN ISNULL(l.TotalAmount, 0) / NULLIF(er.Rate, 1) + ELSE 0 + END AS TotalAmountUSD, + + ISNULL(h.IsCreditableConfirmed, 0) AS IsCreditableConfirmed, + ISNULL(h.Description, '') AS Description, + + ISNULL(er.Rate, 1) AS ExchangeRateUSD + +FROM dbo.trOrderHeader h + +JOIN ( + SELECT OrderHeaderID, SUM(Qty1 * Price) AS TotalAmount + FROM dbo.trOrderLine + GROUP BY OrderHeaderID +) l ON l.OrderHeaderID = h.OrderHeaderID + +LEFT JOIN dbo.cdCurrAccDesc ca + ON ca.CurrAccCode = h.CurrAccCode AND ca.LangCode = 'TR' + +LEFT JOIN dbo.CustomerAttributes f + ON f.CurrAccTypeCode = h.CurrAccTypeCode + AND f.CurrAccCode = h.CurrAccCode + +LEFT JOIN dbo.cdCurrAccAttributeDesc mt + ON mt.CurrAccTypeCode = f.CurrAccTypeCode + AND mt.AttributeTypeCode = 2 + AND mt.AttributeCode = f.CustomerAtt02 + AND mt.LangCode = 'TR' + +LEFT JOIN dbo.cdCurrAccAttributeDesc py + ON py.CurrAccTypeCode = f.CurrAccTypeCode + AND py.AttributeTypeCode = 3 + AND py.AttributeCode = f.CustomerAtt03 + AND py.LangCode = 'TR' + +OUTER APPLY ( + SELECT TOP 1 Rate + FROM dbo.AllExchangeRates er + WHERE er.CurrencyCode = 'USD' + AND er.RelationCurrencyCode = 'TRY' + AND er.ExchangeTypeCode = 6 + AND er.Rate > 0 + ORDER BY ABS(DATEDIFF(DAY, er.Date, GETDATE())) +) er + +WHERE + ISNULL(h.IsCancelOrder, 0) = 0 + AND h.OrderTypeCode = 1 + AND h.ProcessCode = 'WS' + AND h.IsClosed = 0 +` diff --git a/svc/queries/orderpricelistb2b.go b/svc/queries/orderpricelistb2b.go new file mode 100644 index 0000000..de26d9e --- /dev/null +++ b/svc/queries/orderpricelistb2b.go @@ -0,0 +1,36 @@ +package queries + +import ( + "bssapp-backend/models" + "database/sql" + "fmt" +) + +// GetOrderPriceListB2B → model + currency bazlı ürün fiyatını döndürür (PostgreSQL sürümü) +func GetOrderPriceListB2B(db *sql.DB, modelCode string, currency string) (*models.OrderPriceListB2B, error) { + query := ` + SELECT + mmitem.code AS ModelCode, + sdprc.crn AS CurrencyCode, + sdprc.prc AS Price, + sdprc.sdprcgrp_id AS PriceGroupID, + TO_CHAR(sdprc.zlins_dttm, 'YYYY-MM-DD') AS LastUpdate + FROM sdprc + LEFT JOIN mmitem ON sdprc.mmitem_id = mmitem.id + WHERE mmitem.code = $1 + AND sdprc.prc IS NOT NULL + AND sdprc.prc > 0 + AND sdprc.crn = $2 + AND sdprc.sdprcgrp_id = 1 + ORDER BY sdprc.zlins_dttm DESC + LIMIT 1; + ` + + row := db.QueryRow(query, modelCode, currency) + var p models.OrderPriceListB2B + err := row.Scan(&p.ModelCode, &p.CurrencyCode, &p.Price, &p.PriceGroupID, &p.LastUpdate) + if err != nil { + return nil, fmt.Errorf("ürün fiyatı bulunamadı: %v", err) + } + return &p, nil +} diff --git a/svc/queries/permission_role_dept.go b/svc/queries/permission_role_dept.go new file mode 100644 index 0000000..49f80ec --- /dev/null +++ b/svc/queries/permission_role_dept.go @@ -0,0 +1,47 @@ +package queries + +/* ====================================================== + ROLE + DEPARTMENT PERMISSIONS +====================================================== */ + +// GET +const GetRoleDepartmentPermissions = ` +SELECT + rdp.module_code, + rdp.action, + rdp.allowed +FROM vw_role_dept_permissions rdp +WHERE rdp.role_id = $1 + AND rdp.department_code = $2 +ORDER BY rdp.module_code, rdp.action +` + +// UPSERT +const UpsertRoleDepartmentPermission = ` +INSERT INTO mk_sys_role_department_permissions +( + role_id, + department_code, + module_code, + action, + allowed +) +VALUES ($1,$2,$3,$4,$5) + +ON CONFLICT ON CONSTRAINT uq_role_dept_module_action +DO UPDATE SET + allowed = EXCLUDED.allowed; + +` + +// ====================================================== +// 📦 MODULES +// ====================================================== + +const GetModuleLookup = ` +SELECT + code AS value, + name AS label +FROM mk_sys_modules +ORDER BY id +` diff --git a/svc/queries/product.go b/svc/queries/product.go new file mode 100644 index 0000000..73953db --- /dev/null +++ b/svc/queries/product.go @@ -0,0 +1,34 @@ +package queries + +import ( + "bssapp-backend/db" + "bssapp-backend/models" +) + +// GetProductList → MSSQL'den ürün listesini döndürür +func GetProductList() ([]models.Product, error) { + rows, err := db.MssqlDB.Query(` + SELECT + ProductCode + FROM ProductFilterWithDescription('TR') + WHERE + ProductAtt42 IN ('SERI', 'AKSESUAR') + AND IsBlocked = 0 + AND LEN(ProductCode) = 13 -- 🔹 yalnızca 13 karakterlik kodlar + ORDER BY ProductCode; + `) + if err != nil { + return nil, err + } + defer rows.Close() + + var list []models.Product + for rows.Next() { + var p models.Product + if err := rows.Scan(&p.ProductCode); err != nil { + return nil, err + } + list = append(list, p) + } + return list, nil +} diff --git a/svc/queries/productcolor.go b/svc/queries/productcolor.go new file mode 100644 index 0000000..f438fe5 --- /dev/null +++ b/svc/queries/productcolor.go @@ -0,0 +1,20 @@ +package queries + +const GetProductColors = ` +DECLARE @ProductCode VARCHAR(30) = @p1; + +SELECT DISTINCT + p.ProductCode, + v.ColorCode, + ISNULL(cd.ColorDescription, '') AS ColorDescription +FROM ProductFilterWithDescription('TR') AS p +INNER JOIN prItemVariant AS v WITH(NOLOCK) + ON v.ItemCode = p.ProductCode +LEFT JOIN cdColorDesc AS cd WITH(NOLOCK) + ON cd.ColorCode = v.ColorCode + AND cd.LangCode = 'TR' +WHERE + p.ProductCode = @ProductCode + AND ISNULL(v.ColorCode, '') <> '' +ORDER BY v.ColorCode; +` diff --git a/svc/queries/productcolorsize.go b/svc/queries/productcolorsize.go new file mode 100644 index 0000000..b6346b9 --- /dev/null +++ b/svc/queries/productcolorsize.go @@ -0,0 +1,66 @@ +package queries + +const GetProductColorSizes = ` +------------------------------------------------------------ +-- 🧩 GetProductColorSizes +-- Kullanım: +-- @p1 = ProductCode +-- @p2 = ColorCode +-- @p3 = ColorCode2 +-- Açıklama: +-- Renk veya ikinci renk boşsa buna göre filtre uygular. +-- Renksiz (aksesuar) ürünlerde ColorCode='' kayıtlarını getirir. +------------------------------------------------------------ + +DECLARE @ProductCode NVARCHAR(30) = @p1; +DECLARE @ColorCode NVARCHAR(30) = @p2; +DECLARE @ColorCode2 NVARCHAR(30) = @p3; + +-- 🔧 Normalize parametreler (boşlukları kırp ve düzelt) +SET @ColorCode = LTRIM(RTRIM(ISNULL(@ColorCode, ''))); +SET @ColorCode2 = LTRIM(RTRIM(ISNULL(@ColorCode2, ''))); + +IF @ColorCode = '' +BEGIN + SET @ColorCode = ''; -- tamamen renksiz ürün +END + +IF @ColorCode2 = '' +BEGIN + SET @ColorCode2 = NULL; -- 2. renk yok +END + +------------------------------------------------------------ +-- 🔹 Ana sorgu +------------------------------------------------------------ +SELECT + Product.ProductCode, + ISNULL(prItemVariant.ColorCode, '') AS ColorCode, + ISNULL(prItemVariant.ItemDim1Code, '') AS ItemDim1Code, + ISNULL(prItemVariant.ItemDim2Code, '') AS ItemDim2Code +FROM ProductFilterWithDescription('TR') AS Product +INNER JOIN cdItem WITH(NOLOCK) + ON cdItem.ItemTypeCode = 1 + AND cdItem.ItemCode = Product.ProductCode +LEFT JOIN prProductLot WITH(NOLOCK) + ON prProductLot.ItemTypeCode = cdItem.ItemTypeCode + AND prProductLot.ItemCode = cdItem.ItemCode + AND prProductLot.IsDefault = 1 +LEFT JOIN prItemVariant WITH(NOLOCK) + ON prItemVariant.ItemCode = Product.ProductCode +WHERE + ProductAtt42 IN ('SERI','AKSESUAR') + AND Product.IsBlocked = 0 + AND Product.ProductCode = @ProductCode + AND ( + -- 🔸 1. renk doluysa o renk + (LTRIM(RTRIM(@ColorCode)) <> '' AND prItemVariant.ColorCode = @ColorCode) + -- 🔸 1. renk boşsa renksiz varyantlar + OR (LTRIM(RTRIM(@ColorCode)) = '' AND (prItemVariant.ColorCode IS NULL OR LTRIM(RTRIM(prItemVariant.ColorCode)) = '')) + -- 🔸 2. renk varsa ek olarak dahil et + OR (@ColorCode2 IS NOT NULL AND prItemVariant.ColorCode = @ColorCode2) + ) +ORDER BY + prItemVariant.ItemDim1Code, + prItemVariant.ItemDim2Code; +` diff --git a/svc/queries/productdetail.go b/svc/queries/productdetail.go new file mode 100644 index 0000000..49f3b16 --- /dev/null +++ b/svc/queries/productdetail.go @@ -0,0 +1,36 @@ +package queries + +const GetProductDetail = ` +DECLARE @ProductCode VARCHAR(30) = @p1; + +SELECT + ProductCode, + '' AS BOS7, + ProductDescription, + Product.ProductAtt42, + Product.ProductAtt42Desc AS URUN_ILK_GRUBU, + Product.ProductAtt01, + Product.ProductAtt01Desc AS URUN_ANA_GRUBU, + Product.ProductAtt02, + Product.ProductAtt02Desc AS URUN_ALT_GRUBU, + Product.ProductAtt41, + Product.ProductAtt41Desc AS ICERIK, + Product.ProductAtt10, + Product.ProductAtt10Desc AS MARKA, + Product.ProductAtt11, + Product.ProductAtt11Desc AS DROP_, + Product.ProductAtt29, + Product.ProductAtt29Desc AS KARISIM, + Product.ProductAtt45, + Product.ProductAtt45Desc AS ASKILI_YAN, + Product.ProductAtt44, + Product.ProductAtt44Desc AS KATEGORI, + Product.ProductAtt38, + Product.ProductAtt38Desc AS FIT1, + Product.ProductAtt39, + Product.ProductAtt39Desc AS FIT2 +FROM ProductFilterWithDescription('TR') AS Product +WHERE ProductAtt42 IN ('SERI','AKSESUAR') + AND IsBlocked = 0 + AND ProductCode = @p1; +` diff --git a/svc/queries/productsecondcolor.go b/svc/queries/productsecondcolor.go new file mode 100644 index 0000000..8213c89 --- /dev/null +++ b/svc/queries/productsecondcolor.go @@ -0,0 +1,18 @@ +package queries + +const GetProductSecondColors = ` +SELECT DISTINCT + Product.ProductCode, + ISNULL(prItemVariant.ColorCode, '') AS ColorCode, + ISNULL(prItemVariant.ItemDim2Code, '') AS ItemDim2Code +FROM prItemVariant WITH(NOLOCK) + INNER JOIN ProductFilterWithDescription('TR') AS Product + ON prItemVariant.ItemCode = Product.ProductCode + LEFT JOIN cdColorDesc AS ColorDesc WITH(NOLOCK) + ON ColorDesc.ColorCode = prItemVariant.ItemDim2Code + AND ColorDesc.LangCode = 'TR' +WHERE Product.ProductCode = @ProductCode + AND prItemVariant.ColorCode = @ColorCode + AND ISNULL(prItemVariant.ItemDim2Code, '') <> '' +GROUP BY Product.ProductCode, prItemVariant.ItemDim2Code, prItemVariant.ColorCode +` diff --git a/svc/queries/statement_header.go b/svc/queries/statement_header.go new file mode 100644 index 0000000..2dbea7e --- /dev/null +++ b/svc/queries/statement_header.go @@ -0,0 +1,172 @@ +package queries + +import ( + "bssapp-backend/db" + "bssapp-backend/models" + "database/sql" + "fmt" + "strings" +) + +// Ana tabloyu getiren fonksiyon (Vue header tablosu için) +func GetStatements(params models.StatementParams) ([]models.StatementHeader, error) { + // AccountCode normalize: "ZLA0127" → "ZLA 0127" + if len(params.AccountCode) == 7 && strings.ContainsAny(params.AccountCode, "0123456789") { + params.AccountCode = params.AccountCode[:3] + " " + params.AccountCode[3:] + } + + // Parislemler []string → '1','2','3' + parislemFilter := "''" + if len(params.Parislemler) > 0 { + quoted := make([]string, len(params.Parislemler)) + for i, v := range params.Parislemler { + quoted[i] = fmt.Sprintf("'%s'", v) + } + parislemFilter = strings.Join(quoted, ",") + } + + query := fmt.Sprintf(` +;WITH Opening AS ( + SELECT + b.CurrAccCode AS Cari_Kod, + b.DocCurrencyCode AS Para_Birimi, + SUM(c.Debit - c.Credit) AS Devir_Bakiyesi + FROM trCurrAccBook b + LEFT JOIN trCurrAccBookCurrency c + ON c.CurrAccBookID = b.CurrAccBookID + AND c.CurrencyCode = b.DocCurrencyCode + WHERE b.CurrAccCode LIKE '%%' + @Carikod + '%%' + AND b.DocumentDate < @startdate + AND EXISTS ( + SELECT 1 + FROM CurrAccBookATAttributesFilter f2 + WHERE f2.CurrAccBookID = b.CurrAccBookID + AND f2.ATAtt01 IN (%s) + ) + GROUP BY b.CurrAccCode, b.DocCurrencyCode +), +Movements AS ( + SELECT + b.CurrAccCode AS Cari_Kod, + d.CurrAccDescription AS Cari_Isim, + CONVERT(varchar(10), b.DocumentDate, 23) AS Belge_Tarihi, + CONVERT(varchar(10), b.DueDate, 23) AS Vade_Tarihi, + b.RefNumber AS Belge_No, + b.BaseApplicationCode AS Islem_Tipi, + b.LineDescription AS Aciklama, + b.DocCurrencyCode AS Para_Birimi, + c.Debit AS Borc, + c.Credit AS Alacak, + SUM(c.Debit - c.Credit) + OVER (PARTITION BY b.CurrAccCode, c.CurrencyCode + ORDER BY b.DocumentDate, b.CurrAccBookID) AS Hareket_Bakiyesi, + f.ATAtt01 AS Parislemtipi + FROM trCurrAccBook b + LEFT JOIN cdCurrAccDesc d + ON b.CurrAccCode = d.CurrAccCode + LEFT JOIN trCurrAccBookCurrency c + ON b.CurrAccBookID = c.CurrAccBookID + AND b.DocCurrencyCode = c.CurrencyCode + LEFT JOIN CurrAccBookATAttributesFilter f + ON b.CurrAccBookID = f.CurrAccBookID + WHERE b.CurrAccCode LIKE '%%' + @Carikod + '%%' + AND b.DocumentDate BETWEEN @startdate AND @enddate + AND EXISTS ( + SELECT 1 + FROM CurrAccBookATAttributesFilter f2 + WHERE f2.CurrAccBookID = b.CurrAccBookID + AND f2.ATAtt01 IN (%s) + ) +) +SELECT + m.Cari_Kod, + m.Cari_Isim, + m.Belge_Tarihi, + m.Vade_Tarihi, + m.Belge_No, + m.Islem_Tipi, + m.Aciklama, + m.Para_Birimi, + m.Borc, + m.Alacak, + ISNULL(o.Devir_Bakiyesi,0) + m.Hareket_Bakiyesi AS Bakiye, + m.Parislemtipi AS Parislemler +FROM Movements m +LEFT JOIN Opening o + ON o.Cari_Kod = m.Cari_Kod + AND o.Para_Birimi = m.Para_Birimi + +UNION ALL + +-- Devir satırı +SELECT + @Carikod AS Cari_Kod, + MAX(d.CurrAccDescription) AS Cari_Isim, + CONVERT(varchar(10), @startdate, 23) AS Belge_Tarihi, + CONVERT(varchar(10), @startdate, 23) AS Vade_Tarihi, + 'Baslangic_devir' AS Belge_No, + 'Devir' AS Islem_Tipi, + 'Devir Bakiyesi' AS Aciklama, + b.DocCurrencyCode AS Para_Birimi, + SUM(c.Debit) AS Borc, + SUM(c.Credit) AS Alacak, + SUM(c.Debit) - SUM(c.Credit) AS Bakiye, + ( + SELECT STRING_AGG(x.ATAtt01, ',') + FROM ( + SELECT DISTINCT f2.ATAtt01 + FROM CurrAccBookATAttributesFilter f2 + INNER JOIN trCurrAccBook bb + ON f2.CurrAccBookID = bb.CurrAccBookID + WHERE bb.CurrAccCode LIKE '%%' + @Carikod + '%%' + AND bb.DocumentDate < @startdate + AND f2.ATAtt01 IN (%s) + ) x + ) AS Parislemler +FROM trCurrAccBook b +LEFT JOIN cdCurrAccDesc d + ON b.CurrAccCode = d.CurrAccCode +LEFT JOIN trCurrAccBookCurrency c + ON b.CurrAccBookID = c.CurrAccBookID + AND b.DocCurrencyCode = c.CurrencyCode +WHERE b.CurrAccCode LIKE '%%' + @Carikod + '%%' + AND b.DocumentDate < @startdate +GROUP BY b.DocCurrencyCode + +ORDER BY Para_Birimi, Belge_Tarihi; +`, parislemFilter, parislemFilter, parislemFilter) + + rows, err := db.MssqlDB.Query(query, + sql.Named("startdate", params.StartDate), + sql.Named("enddate", params.EndDate), + sql.Named("Carikod", params.AccountCode), + sql.Named("LangCode", params.LangCode), + ) + if err != nil { + return nil, fmt.Errorf("MSSQL query error: %v", err) + } + defer rows.Close() + + var results []models.StatementHeader + for rows.Next() { + var r models.StatementHeader + if err := rows.Scan( + &r.CariKod, + &r.CariIsim, + &r.BelgeTarihi, + &r.VadeTarihi, + &r.BelgeNo, + &r.IslemTipi, + &r.Aciklama, + &r.ParaBirimi, + &r.Borc, + &r.Alacak, + &r.Bakiye, + &r.Parislemler, + ); err != nil { + return nil, err + } + results = append(results, r) + } + return results, nil +} diff --git a/svc/queries/statement_header_pdf.go b/svc/queries/statement_header_pdf.go new file mode 100644 index 0000000..c05f7d0 --- /dev/null +++ b/svc/queries/statement_header_pdf.go @@ -0,0 +1,187 @@ +// queries/statements_header_pdf.go +package queries + +import ( + "bssapp-backend/db" + "bssapp-backend/models" + "database/sql" + "fmt" + "log" + "strings" +) + +// küçük yardımcı: boşlukları temizle, her değeri ayrı tırnakla sar +func buildQuotedHList(vals []string) string { + var pp []string + for _, v := range vals { + v = strings.TrimSpace(v) + if v != "" { + pp = append(pp, fmt.Sprintf("'%s'", v)) // '1','2' gibi + } + } + if len(pp) == 0 { + return "" + } + return strings.Join(pp, ",") +} + +/* ============================ HEADER (Ana Tablo) ============================ */ + +func GetStatementsHPDF(accountCode, startDate, endDate string, parislemler []string) ([]models.StatementHeader, []string, error) { + // Account normalize + if len(accountCode) == 7 && strings.ContainsAny(accountCode, "0123456789") { + accountCode = accountCode[:3] + " " + accountCode[3:] + } + + // IN list parse et + inList := buildQuotedHList(parislemler) + parislemCond := "''" + if inList != "" { + parislemCond = inList + } + + query := fmt.Sprintf(` +;WITH Opening AS ( + SELECT + b.CurrAccCode AS Cari_Kod, + b.DocCurrencyCode AS Para_Birimi, + SUM(c.Debit - c.Credit) AS Devir_Bakiyesi + FROM trCurrAccBook b + LEFT JOIN trCurrAccBookCurrency c + ON c.CurrAccBookID = b.CurrAccBookID + AND c.CurrencyCode = b.DocCurrencyCode + WHERE b.CurrAccCode LIKE @Carikod + AND b.DocumentDate < @StartDate + AND EXISTS ( + SELECT 1 + FROM CurrAccBookATAttributesFilter f2 + WHERE f2.CurrAccBookID = b.CurrAccBookID + AND f2.ATAtt01 IN (%s) + ) + GROUP BY b.CurrAccCode, b.DocCurrencyCode +), +Movements AS ( + SELECT + b.CurrAccCode AS Cari_Kod, + d.CurrAccDescription AS Cari_Isim, + CONVERT(varchar(10), b.DocumentDate, 23) AS Belge_Tarihi, + CONVERT(varchar(10), b.DueDate, 23) AS Vade_Tarihi, + b.RefNumber AS Belge_No, + b.BaseApplicationCode AS Islem_Tipi, + b.LineDescription AS Aciklama, + b.DocCurrencyCode AS Para_Birimi, + c.Debit AS Borc, + c.Credit AS Alacak, + SUM(c.Debit - c.Credit) + OVER (PARTITION BY b.CurrAccCode, c.CurrencyCode + ORDER BY b.DocumentDate, b.CurrAccBookID) AS Hareket_Bakiyesi, + f.ATAtt01 AS Parislemler + FROM trCurrAccBook b + LEFT JOIN cdCurrAccDesc d + ON b.CurrAccCode = d.CurrAccCode AND d.LangCode = 'TR' + LEFT JOIN trCurrAccBookCurrency c + ON b.CurrAccBookID = c.CurrAccBookID + AND b.DocCurrencyCode = c.CurrencyCode + LEFT JOIN CurrAccBookATAttributesFilter f + ON b.CurrAccBookID = f.CurrAccBookID + WHERE b.CurrAccCode LIKE @Carikod + AND b.DocumentDate BETWEEN @StartDate AND @EndDate + AND EXISTS ( + SELECT 1 + FROM CurrAccBookATAttributesFilter f2 + WHERE f2.CurrAccBookID = b.CurrAccBookID + AND f2.ATAtt01 IN (%s) + ) +)`, parislemCond, parislemCond) + query += fmt.Sprintf(` +SELECT + m.Cari_Kod, + m.Cari_Isim, + m.Belge_Tarihi, + m.Vade_Tarihi, + m.Belge_No, + m.Islem_Tipi, + m.Aciklama, + m.Para_Birimi, + m.Borc, + m.Alacak, + ISNULL(o.Devir_Bakiyesi,0) + m.Hareket_Bakiyesi AS Bakiye, + m.Parislemler +FROM Movements m +LEFT JOIN Opening o + ON o.Cari_Kod = m.Cari_Kod + AND o.Para_Birimi = m.Para_Birimi + +UNION ALL + +-- Devir satırı +SELECT + @Carikod AS Cari_Kod, + MAX(d.CurrAccDescription) AS Cari_Isim, + CONVERT(varchar(10), @StartDate, 23) AS Belge_Tarihi, + CONVERT(varchar(10), @StartDate, 23) AS Vade_Tarihi, + 'Baslangic_devir' AS Belge_No, + 'Devir' AS Islem_Tipi, + 'Devir Bakiyesi' AS Aciklama, + b.DocCurrencyCode AS Para_Birimi, + SUM(c.Debit) AS Borc, + SUM(c.Credit) AS Alacak, + SUM(c.Debit) - SUM(c.Credit) AS Bakiye, + ( + SELECT STRING_AGG(x.ATAtt01, ',') + FROM ( + SELECT DISTINCT f2.ATAtt01 + FROM CurrAccBookATAttributesFilter f2 + INNER JOIN trCurrAccBook bb + ON f2.CurrAccBookID = bb.CurrAccBookID + WHERE bb.CurrAccCode LIKE @Carikod + AND bb.DocumentDate < @StartDate + AND f2.ATAtt01 IN (%s) + ) x + ) AS Parislemler +FROM trCurrAccBook b +LEFT JOIN cdCurrAccDesc d + ON b.CurrAccCode = d.CurrAccCode AND d.LangCode = 'TR' +LEFT JOIN trCurrAccBookCurrency c + ON b.CurrAccBookID = c.CurrAccBookID + AND b.DocCurrencyCode = c.CurrencyCode +WHERE b.CurrAccCode LIKE @Carikod + AND b.DocumentDate < @StartDate +GROUP BY b.DocCurrencyCode + +ORDER BY Para_Birimi, Belge_Tarihi;`, parislemCond) + + rows, err := db.MssqlDB.Query(query, + sql.Named("Carikod", "%"+accountCode+"%"), + sql.Named("StartDate", startDate), + sql.Named("EndDate", endDate), + ) + if err != nil { + log.Printf("❌ Header sorgu hatası: %v", err) + return nil, nil, fmt.Errorf("header sorgu hatası: %v", err) + } + defer rows.Close() + + var headers []models.StatementHeader + var belgeNos []string + for rows.Next() { + var h models.StatementHeader + if err := rows.Scan( + &h.CariKod, &h.CariIsim, + &h.BelgeTarihi, &h.VadeTarihi, + &h.BelgeNo, &h.IslemTipi, + &h.Aciklama, &h.ParaBirimi, + &h.Borc, &h.Alacak, + &h.Bakiye, &h.Parislemler, + ); err != nil { + log.Printf("❌ Header scan hatası: %v", err) + return nil, nil, err + } + headers = append(headers, h) + if h.BelgeNo != "" { + belgeNos = append(belgeNos, h.BelgeNo) + } + } + log.Printf("✅ Header verileri alındı: %d kayıt, %d belge no", len(headers), len(belgeNos)) + return headers, belgeNos, nil +} diff --git a/svc/queries/statements_detail.go b/svc/queries/statements_detail.go new file mode 100644 index 0000000..67b27f9 --- /dev/null +++ b/svc/queries/statements_detail.go @@ -0,0 +1,121 @@ +package queries + +import ( + "bssapp-backend/db" + "bssapp-backend/models" + "database/sql" + "fmt" + "strings" +) + +/* ============================ DETAIL (ALT TABLO) ============================ */ + +func GetStatementDetails(accountCode, startDate, endDate string, parislemler []string) ([]models.StatementDetail, error) { + // Parislemler filtresi hazırlanır (ör: 1,2,3) + inParislem := "" + if len(parislemler) > 0 { + pp := make([]string, len(parislemler)) + for i, v := range parislemler { + pp[i] = strings.TrimSpace(v) + } + inParislem = strings.Join(pp, ",") + } + query := fmt.Sprintf(` +SELECT + CONVERT(varchar(10), a.InvoiceDate, 23) AS Belge_Tarihi, + a.InvoiceNumber AS Belge_Ref_Numarasi, + COALESCE(MAX(AnaGrupDesc.AttributeDescription), '') AS Urun_Ana_Grubu, + COALESCE(MAX(AltGrupDesc.AttributeDescription), '') AS Urun_Alt_Grubu, + COALESCE(MAX(GarsonDesc.AttributeDescription), '') AS Yetiskin_Garson, + COALESCE(MAX(FitDesc.AttributeDescription), '') AS Fit, + COALESCE(MAX(KisaKarDesc.AttributeDescription), '') AS Icerik, + a.ItemCode AS Urun_Kodu, + a.ColorCode AS Urun_Rengi, + SUM(a.Qty1) AS Toplam_Adet, + SUM(ABS(a.Doc_Price)) AS Toplam_Fiyat, + CAST(SUM(a.Qty1 * ABS(a.Doc_Price)) AS numeric(18,2)) AS Toplam_Tutar +FROM AllInvoicesWithAttributes a +LEFT JOIN prItemAttribute AnaGrup + ON a.ItemCode = AnaGrup.ItemCode AND AnaGrup.AttributeTypeCode = 1 +LEFT JOIN cdItemAttributeDesc AnaGrupDesc + ON AnaGrup.AttributeTypeCode = AnaGrupDesc.AttributeTypeCode + AND AnaGrup.AttributeCode = AnaGrupDesc.AttributeCode + AND AnaGrup.ItemTypeCode = AnaGrupDesc.ItemTypeCode + +LEFT JOIN prItemAttribute AltGrup + ON a.ItemCode = AltGrup.ItemCode AND AltGrup.AttributeTypeCode = 2 +LEFT JOIN cdItemAttributeDesc AltGrupDesc + ON AltGrup.AttributeTypeCode = AltGrupDesc.AttributeTypeCode + AND AltGrup.AttributeCode = AltGrupDesc.AttributeCode + AND AltGrup.ItemTypeCode = AltGrupDesc.ItemTypeCode + +LEFT JOIN prItemAttribute Garson + ON a.ItemCode = Garson.ItemCode AND Garson.AttributeTypeCode = 44 +LEFT JOIN cdItemAttributeDesc GarsonDesc + ON Garson.AttributeTypeCode = GarsonDesc.AttributeTypeCode + AND Garson.AttributeCode = GarsonDesc.AttributeCode + AND Garson.ItemTypeCode = GarsonDesc.ItemTypeCode + +LEFT JOIN prItemAttribute FitTbl + ON a.ItemCode = FitTbl.ItemCode AND FitTbl.AttributeTypeCode = 38 +LEFT JOIN cdItemAttributeDesc FitDesc + ON FitTbl.AttributeTypeCode = FitDesc.AttributeTypeCode + AND FitTbl.AttributeCode = FitDesc.AttributeCode + AND FitTbl.ItemTypeCode = FitDesc.ItemTypeCode + +LEFT JOIN prItemAttribute KisaKar + ON a.ItemCode = KisaKar.ItemCode AND KisaKar.AttributeTypeCode = 41 +LEFT JOIN cdItemAttributeDesc KisaKarDesc + ON KisaKar.AttributeTypeCode = KisaKarDesc.AttributeTypeCode + AND KisaKar.AttributeCode = KisaKarDesc.AttributeCode + AND KisaKar.ItemTypeCode = KisaKarDesc.ItemTypeCode +WHERE a.CurrAccCode LIKE @Carikod + AND a.InvoiceDate BETWEEN @StartDate AND @EndDate + %s +GROUP BY a.InvoiceDate, a.InvoiceNumber, a.ItemCode, a.ColorCode +ORDER BY Belge_Tarihi, Belge_Ref_Numarasi, Urun_Kodu;`, + func() string { + if inParislem == "" { + return "" + } + return fmt.Sprintf(`AND EXISTS ( + SELECT 1 + FROM CurrAccBookATAttributesFilter f + WHERE f.CurrAccBookID = a.CurrAccBookID + AND f.ATAtt01 IN (%s) + )`, inParislem) + }(), + ) + rows, err := db.MssqlDB.Query(query, + sql.Named("Carikod", "%"+accountCode+"%"), + sql.Named("StartDate", startDate), + sql.Named("EndDate", endDate), + ) + if err != nil { + return nil, fmt.Errorf("detay sorgu hatası: %v", err) + } + defer rows.Close() + + var results []models.StatementDetail + for rows.Next() { + var d models.StatementDetail + if err := rows.Scan( + &d.BelgeTarihi, + &d.BelgeRefNumarasi, + &d.UrunAnaGrubu, + &d.UrunAltGrubu, + &d.YetiskinGarson, + &d.Fit, + &d.Icerik, + &d.UrunKodu, + &d.UrunRengi, + &d.ToplamAdet, + &d.ToplamFiyat, + &d.ToplamTutar, + ); err != nil { + return nil, err + } + results = append(results, d) + } + return results, nil +} diff --git a/svc/queries/statements_pdf.go b/svc/queries/statements_pdf.go new file mode 100644 index 0000000..a1a84f9 --- /dev/null +++ b/svc/queries/statements_pdf.go @@ -0,0 +1,305 @@ +// queries/statements_pdf.go +package queries + +import ( + "bssapp-backend/db" + "bssapp-backend/models" + "database/sql" + "fmt" + "log" + "strings" +) + +// küçük yardımcı: boşlukları temizle, her değeri ayrı tırnakla sar +func buildQuotedList(vals []string) string { + var pp []string + for _, v := range vals { + v = strings.TrimSpace(v) + if v != "" { + pp = append(pp, fmt.Sprintf("'%s'", v)) // '1','2' gibi + } + } + if len(pp) == 0 { + return "" + } + return strings.Join(pp, ",") +} + +/* ============================ HEADER (Ana Tablo) ============================ */ + +func GetStatementsPDF(accountCode, startDate, endDate string, parislemler []string) ([]models.StatementHeader, []string, error) { + // Account normalize + if len(accountCode) == 7 && strings.ContainsAny(accountCode, "0123456789") { + accountCode = accountCode[:3] + " " + accountCode[3:] + } + + // IN list parse et + inList := buildQuotedList(parislemler) + parislemCond := "''" + if inList != "" { + parislemCond = inList + } + + query := fmt.Sprintf(` +;WITH Opening AS ( + SELECT + b.CurrAccCode AS Cari_Kod, + b.DocCurrencyCode AS Para_Birimi, + SUM(c.Debit - c.Credit) AS Devir_Bakiyesi + FROM trCurrAccBook b + LEFT JOIN trCurrAccBookCurrency c + ON c.CurrAccBookID = b.CurrAccBookID + AND c.CurrencyCode = b.DocCurrencyCode + WHERE b.CurrAccCode LIKE @Carikod + AND b.DocumentDate < @StartDate + AND EXISTS ( + SELECT 1 + FROM CurrAccBookATAttributesFilter f2 + WHERE f2.CurrAccBookID = b.CurrAccBookID + AND f2.ATAtt01 IN (%s) + ) + GROUP BY b.CurrAccCode, b.DocCurrencyCode +), +Movements AS ( + SELECT + b.CurrAccCode AS Cari_Kod, + d.CurrAccDescription AS Cari_Isim, + CONVERT(varchar(10), b.DocumentDate, 23) AS Belge_Tarihi, + CONVERT(varchar(10), b.DueDate, 23) AS Vade_Tarihi, + b.RefNumber AS Belge_No, + b.BaseApplicationCode AS Islem_Tipi, + b.LineDescription AS Aciklama, + b.DocCurrencyCode AS Para_Birimi, + c.Debit AS Borc, + c.Credit AS Alacak, + SUM(c.Debit - c.Credit) + OVER (PARTITION BY b.CurrAccCode, c.CurrencyCode + ORDER BY b.DocumentDate, b.CurrAccBookID) AS Hareket_Bakiyesi, + f.ATAtt01 AS Parislemler + FROM trCurrAccBook b + LEFT JOIN cdCurrAccDesc d + ON b.CurrAccCode = d.CurrAccCode AND d.LangCode = 'TR' + LEFT JOIN trCurrAccBookCurrency c + ON b.CurrAccBookID = c.CurrAccBookID + AND b.DocCurrencyCode = c.CurrencyCode + LEFT JOIN CurrAccBookATAttributesFilter f + ON b.CurrAccBookID = f.CurrAccBookID + WHERE b.CurrAccCode LIKE @Carikod + AND b.DocumentDate BETWEEN @StartDate AND @EndDate + AND EXISTS ( + SELECT 1 + FROM CurrAccBookATAttributesFilter f2 + WHERE f2.CurrAccBookID = b.CurrAccBookID + AND f2.ATAtt01 IN (%s) + ) +)`, parislemCond, parislemCond) + query += fmt.Sprintf(` +SELECT + m.Cari_Kod, + m.Cari_Isim, + m.Belge_Tarihi, + m.Vade_Tarihi, + m.Belge_No, + m.Islem_Tipi, + m.Aciklama, + m.Para_Birimi, + m.Borc, + m.Alacak, + ISNULL(o.Devir_Bakiyesi,0) + m.Hareket_Bakiyesi AS Bakiye, + m.Parislemler +FROM Movements m +LEFT JOIN Opening o + ON o.Cari_Kod = m.Cari_Kod + AND o.Para_Birimi = m.Para_Birimi + +UNION ALL + +-- Devir satırı +SELECT + @Carikod AS Cari_Kod, + MAX(d.CurrAccDescription) AS Cari_Isim, + CONVERT(varchar(10), @StartDate, 23) AS Belge_Tarihi, + CONVERT(varchar(10), @StartDate, 23) AS Vade_Tarihi, + 'Baslangic_devir' AS Belge_No, + 'Devir' AS Islem_Tipi, + 'Devir Bakiyesi' AS Aciklama, + b.DocCurrencyCode AS Para_Birimi, + SUM(c.Debit) AS Borc, + SUM(c.Credit) AS Alacak, + SUM(c.Debit) - SUM(c.Credit) AS Bakiye, + ( + SELECT STRING_AGG(x.ATAtt01, ',') + FROM ( + SELECT DISTINCT f2.ATAtt01 + FROM CurrAccBookATAttributesFilter f2 + INNER JOIN trCurrAccBook bb + ON f2.CurrAccBookID = bb.CurrAccBookID + WHERE bb.CurrAccCode LIKE @Carikod + AND bb.DocumentDate < @StartDate + AND f2.ATAtt01 IN (%s) + ) x + ) AS Parislemler +FROM trCurrAccBook b +LEFT JOIN cdCurrAccDesc d + ON b.CurrAccCode = d.CurrAccCode AND d.LangCode = 'TR' +LEFT JOIN trCurrAccBookCurrency c + ON b.CurrAccBookID = c.CurrAccBookID + AND b.DocCurrencyCode = c.CurrencyCode +WHERE b.CurrAccCode LIKE @Carikod + AND b.DocumentDate < @StartDate +GROUP BY b.DocCurrencyCode + +ORDER BY Para_Birimi, Belge_Tarihi;`, parislemCond) + + rows, err := db.MssqlDB.Query(query, + sql.Named("Carikod", "%"+accountCode+"%"), + sql.Named("StartDate", startDate), + sql.Named("EndDate", endDate), + ) + if err != nil { + log.Printf("❌ Header sorgu hatası: %v", err) + return nil, nil, fmt.Errorf("header sorgu hatası: %v", err) + } + defer rows.Close() + + var headers []models.StatementHeader + var belgeNos []string + for rows.Next() { + var h models.StatementHeader + if err := rows.Scan( + &h.CariKod, &h.CariIsim, + &h.BelgeTarihi, &h.VadeTarihi, + &h.BelgeNo, &h.IslemTipi, + &h.Aciklama, &h.ParaBirimi, + &h.Borc, &h.Alacak, + &h.Bakiye, &h.Parislemler, + ); err != nil { + log.Printf("❌ Header scan hatası: %v", err) + return nil, nil, err + } + headers = append(headers, h) + if h.BelgeNo != "" { + belgeNos = append(belgeNos, h.BelgeNo) + } + } + log.Printf("✅ Header verileri alındı: %d kayıt, %d belge no", len(headers), len(belgeNos)) + return headers, belgeNos, nil +} + +/* ============================ DETAIL (Alt Tablo) ============================ */ + +func GetDetailsMapPDF(belgeNos []string, startDate, endDate string) (map[string][]models.StatementDetail, error) { + result := make(map[string][]models.StatementDetail) + if len(belgeNos) == 0 { + log.Println("⚠️ GetDetailsMapPDF: belge listesi boş") + return result, nil + } + + qs := make([]string, 0, len(belgeNos)) + for _, no := range belgeNos { + safe := strings.ReplaceAll(no, "'", "''") + qs = append(qs, fmt.Sprintf("'%s'", safe)) + } + inBelge := strings.Join(qs, ",") + + query := fmt.Sprintf(` +;WITH BookMap AS ( + SELECT b.RefNumber AS InvoiceNumber, b.CurrAccBookID + FROM trCurrAccBook b + WHERE b.RefNumber IN (%s) +) +SELECT + CONVERT(varchar(10), a.InvoiceDate, 23) AS Belge_Tarihi, + a.InvoiceNumber AS Belge_Ref_Numarasi, + + MAX(ISNULL(AnaGrupDesc.AttributeDescription, '')) AS Urun_Ana_Grubu, + MAX(ISNULL(AltGrupDesc.AttributeDescription, '')) AS Urun_Alt_Grubu, + MAX(ISNULL(GarsonDesc.AttributeDescription, '')) AS Yetiskin_Garson, + MAX(ISNULL(FitDesc.AttributeDescription, '')) AS Fit, + MAX(ISNULL(KisaKarDesc.AttributeDescription, '')) AS Icerik, + + a.ItemCode, a.ColorCode, + SUM(a.Qty1), SUM(ABS(a.Doc_Price)), + CAST(SUM(a.Qty1 * ABS(a.Doc_Price)) AS numeric(18,2)) + +FROM AllInvoicesWithAttributes a +JOIN BookMap bm + ON bm.InvoiceNumber = a.InvoiceNumber + +-- Ana Grup +LEFT JOIN prItemAttribute AnaGrup + ON a.ItemCode = AnaGrup.ItemCode AND AnaGrup.AttributeTypeCode = 1 +LEFT JOIN cdItemAttributeDesc AnaGrupDesc + ON AnaGrup.AttributeTypeCode = AnaGrupDesc.AttributeTypeCode + AND AnaGrup.AttributeCode = AnaGrupDesc.AttributeCode + AND AnaGrup.ItemTypeCode = AnaGrupDesc.ItemTypeCode + +-- Alt Grup +LEFT JOIN prItemAttribute AltGrup + ON a.ItemCode = AltGrup.ItemCode AND AltGrup.AttributeTypeCode = 2 +LEFT JOIN cdItemAttributeDesc AltGrupDesc + ON AltGrup.AttributeTypeCode = AltGrupDesc.AttributeTypeCode + AND AltGrup.AttributeCode = AltGrupDesc.AttributeCode + AND AltGrup.ItemTypeCode = AltGrupDesc.ItemTypeCode + +-- Garson +LEFT JOIN prItemAttribute Garson + ON a.ItemCode = Garson.ItemCode AND Garson.AttributeTypeCode = 44 +LEFT JOIN cdItemAttributeDesc GarsonDesc + ON Garson.AttributeTypeCode = GarsonDesc.AttributeTypeCode + AND Garson.AttributeCode = GarsonDesc.AttributeCode + AND Garson.ItemTypeCode = GarsonDesc.ItemTypeCode + +-- Fit +LEFT JOIN prItemAttribute FitTbl + ON a.ItemCode = FitTbl.ItemCode AND FitTbl.AttributeTypeCode = 38 +LEFT JOIN cdItemAttributeDesc FitDesc + ON FitTbl.AttributeTypeCode = FitDesc.AttributeTypeCode + AND FitTbl.AttributeCode = FitDesc.AttributeCode + AND FitTbl.ItemTypeCode = FitDesc.ItemTypeCode + +-- Kısa Karışım +LEFT JOIN prItemAttribute KisaKar + ON a.ItemCode = KisaKar.ItemCode AND KisaKar.AttributeTypeCode = 41 +LEFT JOIN cdItemAttributeDesc KisaKarDesc + ON KisaKar.AttributeTypeCode = KisaKarDesc.AttributeTypeCode + AND KisaKar.AttributeCode = KisaKarDesc.AttributeCode + AND KisaKar.ItemTypeCode = KisaKarDesc.ItemTypeCode + +WHERE a.InvoiceDate BETWEEN @StartDate AND @EndDate +GROUP BY a.InvoiceDate, a.InvoiceNumber, a.ItemCode, a.ColorCode +ORDER BY a.InvoiceNumber, a.ItemCode, a.ColorCode;`, inBelge) + rows, err := db.MssqlDB.Query(query, + sql.Named("StartDate", startDate), + sql.Named("EndDate", endDate), + ) + if err != nil { + log.Printf("❌ Detay sorgu hatası: %v", err) + return nil, fmt.Errorf("detay sorgu hatası: %v", err) + } + defer rows.Close() + + for rows.Next() { + var d models.StatementDetail + if err := rows.Scan( + &d.BelgeTarihi, + &d.BelgeRefNumarasi, + &d.UrunAnaGrubu, + &d.UrunAltGrubu, + &d.YetiskinGarson, + &d.Fit, + &d.Icerik, + &d.UrunKodu, + &d.UrunRengi, + &d.ToplamAdet, + &d.ToplamFiyat, + &d.ToplamTutar, + ); err != nil { + log.Printf("❌ Detay scan hatası: %v", err) + return nil, err + } + result[d.BelgeRefNumarasi] = append(result[d.BelgeRefNumarasi], d) + } + log.Printf("✅ Detay verileri alındı: %d belge için detay var", len(result)) + return result, nil +} diff --git a/svc/queries/todaycurrencyv3.go b/svc/queries/todaycurrencyv3.go new file mode 100644 index 0000000..b279367 --- /dev/null +++ b/svc/queries/todaycurrencyv3.go @@ -0,0 +1,35 @@ +package queries + +import ( + "bssapp-backend/models" + "database/sql" + "fmt" +) + +// GetTodayCurrencyV3 tek bir döviz türü için güncel kuru döndürür (MSSQL sürümü) +func GetTodayCurrencyV3(db *sql.DB, currencyCode string) (*models.TodayCurrencyV3, error) { + query := ` + SELECT TOP 1 + CurrencyCode, + RelationCurrencyCode, + ExchangeTypeCode, + Rate, + CONVERT(varchar, Date, 23) AS Date + FROM AllExchangeRates + WHERE CurrencyCode = @p1 + AND RelationCurrencyCode = 'TRY' + AND ExchangeTypeCode = 6 + AND Rate > 0 + ORDER BY ABS(DATEDIFF(DAY, Date, GETDATE())) ASC + ` + + row := db.QueryRow(query, currencyCode) + + var c models.TodayCurrencyV3 + err := row.Scan(&c.CurrencyCode, &c.RelationCurrencyCode, &c.ExchangeTypeCode, &c.Rate, &c.Date) + if err != nil { + return nil, fmt.Errorf("kur bilgisi alınamadı: %v", err) + } + + return &c, nil +} diff --git a/svc/queries/user_detail.go b/svc/queries/user_detail.go new file mode 100644 index 0000000..d768b84 --- /dev/null +++ b/svc/queries/user_detail.go @@ -0,0 +1,296 @@ +package queries + +// ====================================================== +// 👤 USER HEADER +// ====================================================== +// ====================================================== +// 👤 USER HEADER (mk_dfusr) +// ====================================================== +const GetUserHeader = ` +SELECT + id, + username, + is_active, + COALESCE(full_name,'') AS full_name, + COALESCE(email,'') AS email, + COALESCE(mobile,'') AS mobile, + COALESCE(address,'') AS address, + + CASE + WHEN password_hash IS NOT NULL AND password_hash <> '' THEN true + ELSE false + END AS has_password + +FROM mk_dfusr +WHERE id = $1 +` + +// ====================================================== +// 🔐 ROLES +// ====================================================== +const GetUserRoles = ` +SELECT r.code +FROM dfrole_usr ur +JOIN dfrole r ON r.id = ur.dfrole_id +WHERE ur.dfusr_id = $1 +ORDER BY r.code +` + +// ====================================================== +// 🏢 DEPARTMENTS +// ====================================================== +const GetUserDepartments = ` +SELECT d.code, d.title +FROM dfusr_dprt ud +JOIN mk_dprt d ON d.id = ud.dprt_id +WHERE ud.dfusr_id = $1 + AND ud.is_active = true +ORDER BY d.code +` + +// ====================================================== +// 🌍 PIYASALAR +// ====================================================== +const GetUserPiyasalar = ` +SELECT p.code, p.title +FROM dfusr_piyasa up +JOIN mk_sales_piy p ON p.code = up.piyasa_code +WHERE up.dfusr_id = $1 + AND up.is_allowed = true +ORDER BY p.code +` + +// ====================================================== +// 🧾 NEBIM USERS +// ====================================================== +const GetUserNebim = ` +SELECT n.username, n.user_group_code +FROM dfusr_nebim_user un +JOIN mk_nebim_user n ON n.id = un.mk_nebim_user_id +WHERE un.dfusr_id = $1 +ORDER BY n.username +` + +// ====================================================== +// ✍️ UPDATE USER HEADER (SAFE) +// ====================================================== +// ====================================================== +// ✍️ UPDATE USER HEADER (mk_dfusr) +// ====================================================== +const UpdateUserHeader = ` +UPDATE mk_dfusr +SET + username = $2, + is_active = $3, + full_name = $4, + email = $5, + mobile = $6, + address = NULLIF($7, ''), + updated_at = NOW() +WHERE id = $1 +` + +// ====================================================== +// ➕ INSERT RELATIONS +// ====================================================== + +// ---------- ROLE +const InsertUserRole = ` +INSERT INTO dfrole_usr (dfusr_id, dfrole_id) +SELECT $1, r.id +FROM dfrole r +WHERE r.code = $2 +ON CONFLICT DO NOTHING +` + +// ---------- DEPARTMENT +const InsertUserDepartment = ` +INSERT INTO dfusr_dprt (dfusr_id, dprt_id, is_active) +SELECT $1, d.id, true +FROM mk_dprt d +WHERE d.code = $2 +ON CONFLICT DO NOTHING +` + +// ---------- PIYASA +const InsertUserPiyasa = ` +INSERT INTO dfusr_piyasa (dfusr_id, piyasa_code, is_allowed) +VALUES ($1, $2, true) +ON CONFLICT DO NOTHING +` + +// ---------- NEBIM USER +const InsertUserNebim = ` +INSERT INTO dfusr_nebim_user (dfusr_id, mk_nebim_user_id) +SELECT $1, n.id +FROM mk_nebim_user n +WHERE n.username = $2 +ON CONFLICT DO NOTHING +` + +// ====================================================== +// 📚 LOOKUPS +// ====================================================== +const GetRoleLookup = ` +SELECT code AS value, code AS label +FROM dfrole +ORDER BY code +` + +const GetDepartmentLookup = ` +SELECT code AS value, title AS label +FROM mk_dprt +WHERE is_active = true +ORDER BY code +` + +const GetPiyasaLookup = ` +SELECT code AS value, title AS label +FROM mk_sales_piy +WHERE is_active = true +ORDER BY code +` + +const GetNebimUserLookup = ` +SELECT + username AS value, + username || ' (' || user_group_code || ')' AS label, + user_group_code +FROM mk_nebim_user +WHERE is_active = true +ORDER BY username +` + +// ====================================================== +// 📦 ORDER — NEW NUMBER +// ====================================================== + +const GetNextOrderNumber = ` +SELECT + COALESCE(MAX(order_number), 0) + 1 +FROM orders +WHERE order_year = EXTRACT(YEAR FROM NOW()) +` + +// ====================================================== +// 🔐 ROLES (ADMIN LIST) +// ====================================================== + +const GetRoles = ` +SELECT + id, + code, + title +FROM dfrole +ORDER BY code +` + +// ====================================================== +// 🏢 DEPARTMENTS (ADMIN LIST) +// ====================================================== + +const GetDepartments = ` +SELECT + id, + code, + title +FROM mk_dprt +WHERE is_active = true +ORDER BY code +` + +// ====================================================== +// 🌍 PIYASALAR (ADMIN LIST) +// ====================================================== + +const GetPiyasalar = ` +SELECT + code, + title +FROM mk_sales_piy +WHERE is_active = true +ORDER BY code +` + +// ====================================================== +// 🔗 ROLE → DEPARTMENT +// ====================================================== + +const DeleteRoleDepartments = ` +DELETE FROM dfrole_dprt +WHERE dfrole_id = $1 +` + +const InsertRoleDepartment = ` +INSERT INTO dfrole_dprt ( + dfrole_id, + dprt_id, + is_allowed +) +SELECT + $1, + d.id, + true +FROM mk_dprt d +WHERE d.code = $2 +ON CONFLICT DO NOTHING +` + +// ====================================================== +// 🔗 ROLE → PIYASA +// ====================================================== + +const DeleteRolePiyasalar = ` +DELETE FROM dfrole_piyasa +WHERE dfrole_id = $1 +` + +const InsertRolePiyasa = ` +INSERT INTO dfrole_piyasa ( + dfrole_id, + piyasa_code, + is_allowed +) +VALUES ($1,$2,true) +ON CONFLICT DO NOTHING +` + +// ====================================================== +// 👤 USER → ROLE +// ====================================================== + +const DeleteUserRoles = ` +DELETE FROM dfrole_usr +WHERE dfusr_id = $1 +` + +// ====================================================== +// 🏢 DEPARTMENTS (ADMIN PERM PAGE SELECT) -> { code, title } +// ====================================================== +const GetDepartmentsForPermissionSelect = ` +SELECT + code AS id, + title AS title +FROM mk_dprt +WHERE is_active = true +ORDER BY title +` + +// ====================================================== +// 🔐 ROLES (ADMIN PERM PAGE SELECT) -> { id, title } +// ====================================================== +const GetRolesForPermissionSelect = ` +SELECT + id::text AS id, + COALESCE(NULLIF(title,''), code) AS title +FROM dfrole +ORDER BY COALESCE(NULLIF(title,''), code) +` +const GetUserLookupForPermission = ` +SELECT + id::text AS id, + username || ' - ' || full_name AS title +FROM mk_dfusr +WHERE is_active = true +ORDER BY username +` diff --git a/svc/queries/user_list.go b/svc/queries/user_list.go new file mode 100644 index 0000000..809bbe4 --- /dev/null +++ b/svc/queries/user_list.go @@ -0,0 +1,106 @@ +package queries + +import ( + "database/sql" + "fmt" +) + +// ======================================================== +// 📌 GetUserList — POSTGRES FINAL (mk_dfusr) +// ======================================================== +func GetUserList(db *sql.DB, search string) (*sql.Rows, error) { + + baseQuery := ` +SELECT + u.id AS id, -- 1 + u.username AS code, -- 2 (frontend uyumu için alias) + u.is_active AS is_active, -- 3 + + -- Nebim eşleşmesi (opsiyonel) + n.username AS nebim_username, -- 4 + n.user_group_code AS user_group_code, -- 5 + + -- Roller + COALESCE(string_agg(DISTINCT r.code, ', '), '') AS role_names, -- 6 + + -- Departmanlar + COALESCE(string_agg(DISTINCT d.title, ', '), '') AS department_names, -- 7 + + -- Piyasalar (ÇOKLU) + COALESCE(string_agg(DISTINCT p.title, ', '), '') AS piyasa_names -- 8 + +FROM mk_dfusr u + +-- ========================== +-- 🔗 Nebim eşleşmesi +-- ========================== +LEFT JOIN dfusr_nebim_user un + ON un.dfusr_id = u.id + +LEFT JOIN mk_nebim_user n + ON n.id = un.mk_nebim_user_id + +-- ========================== +-- 🔐 Roller +-- ========================== +LEFT JOIN dfrole_usr uru + ON uru.dfusr_id = u.id + +LEFT JOIN dfrole r + ON r.id = uru.dfrole_id + +-- ========================== +-- 🏢 Departmanlar +-- ========================== +LEFT JOIN dfusr_dprt ud + ON ud.dfusr_id = u.id + +LEFT JOIN mk_dprt d + ON d.id = ud.dprt_id + +-- ========================== +-- 🌍 Piyasalar +-- ========================== +LEFT JOIN dfusr_piyasa up + ON up.dfusr_id = u.id + +LEFT JOIN mk_sales_piy p + ON p.code = up.piyasa_code + +WHERE 1 = 1 +` + + // 🔍 SEARCH FILTER + if search != "" { + baseQuery += ` + AND ( + u.username ILIKE $1 + OR u.email ILIKE $1 + OR n.username ILIKE $1 + OR r.code ILIKE $1 + OR d.title ILIKE $1 + OR p.title ILIKE $1 + ) +` + } + + // 📌 GROUP + ORDER + baseQuery += ` +GROUP BY + u.id, + u.username, + u.is_active, + n.username, + n.user_group_code + +ORDER BY u.username +` + + // ▶ EXECUTE QUERY + if search != "" { + searchLike := fmt.Sprintf("%%%s%%", search) + return db.Query(baseQuery, searchLike) + } + + return db.Query(baseQuery) +} diff --git a/svc/queries/user_password.go b/svc/queries/user_password.go new file mode 100644 index 0000000..1526a07 --- /dev/null +++ b/svc/queries/user_password.go @@ -0,0 +1,41 @@ +package queries + +// ====================================================== +// 🔐 UPDATE USER PASSWORD (RESET / CHANGE) +// ====================================================== +const UpdateUserPassword = ` +UPDATE dfusr +SET + upass = $2, + last_updated_date = NOW() +WHERE id = $1 + AND is_active = true +` + +// Reset token yaz +const SetUserResetToken = ` +UPDATE dfusr +SET + fpass = $2, + fpass_id = NOW() +WHERE id = $1 + AND is_active = true +` + +// Reset token kontrol +const CheckUserResetToken = ` +SELECT id +FROM dfusr +WHERE + fpass = $1 + AND is_active = true +` + +// Reset sonrası temizle +const ClearUserResetToken = ` +UPDATE dfusr +SET + fpass = NULL, + fpass_id = NULL +WHERE id = $1 +` diff --git a/svc/repository/activitylog_repository.go b/svc/repository/activitylog_repository.go new file mode 100644 index 0000000..73f2365 --- /dev/null +++ b/svc/repository/activitylog_repository.go @@ -0,0 +1,286 @@ +package repository + +import ( + "context" + "database/sql" + "fmt" + "strings" + "time" +) + +type ActivityLogRow struct { + CreatedAt time.Time `json:"created_at"` + RequestStartedAt *time.Time `json:"request_started_at,omitempty"` + RequestFinishedAt *time.Time `json:"request_finished_at,omitempty"` + DurationMs *int `json:"duration_ms,omitempty"` + HttpStatus *int `json:"http_status,omitempty"` + + Username string `json:"username"` + RoleCode string `json:"role_code"` + + ActionCategory string `json:"action_category"` + ActionType string `json:"action_type"` + ActionTarget string `json:"action_target"` + Description string `json:"description"` + + // ✅ TARGET USER + TargetDfUsrID int64 `json:"target_dfusr_id"` + TargetUsername string `json:"target_username"` + + // ✅ DIFF + ChangeBefore string `json:"change_before"` + ChangeAfter string `json:"change_after"` + + IpAddress string `json:"ip_address"` + IsSuccess bool `json:"is_success"` + ErrorMsg string `json:"error_message"` + UserAgent string `json:"user_agent"` + SessionID string `json:"session_id"` + + // audit ids + UserUUID string `json:"user_id"` + DfUsrID int64 `json:"dfusr_id"` + + Email string `json:"email"` + IsActive bool `json:"is_active"` +} + +type ActivityLogQuery struct { + Username string + RoleCode string + ActionCategory string + ActionType string + ActionTarget string + Success *bool + + StatusMin *int + StatusMax *int + + DateFrom *time.Time + DateTo *time.Time + + Page int + Limit int +} + +type ActivityLogResult struct { + Total int64 `json:"total"` + Items []ActivityLogRow `json:"items"` +} + +func ListActivityLogs( + ctx context.Context, + db *sql.DB, + q ActivityLogQuery, +) (ActivityLogResult, error) { + + // ---------- defaults ---------- + if q.Page <= 0 { + q.Page = 1 + } + // limit <=0 → unlimited + if q.Limit < 0 { + q.Limit = 50 + } + if q.Limit > 200 { + q.Limit = 200 + } + + offset := 0 + if q.Limit > 0 { + offset = (q.Page - 1) * q.Limit + } + + where := []string{} + args := []interface{}{} + + add := func(cond string, val interface{}) { + where = append(where, cond) + args = append(args, val) + } + + // ---------- filters ---------- + if strings.TrimSpace(q.Username) != "" { + add(fmt.Sprintf("l.username ILIKE $%d", len(args)+1), + "%"+strings.TrimSpace(q.Username)+"%") + } + if strings.TrimSpace(q.RoleCode) != "" { + add(fmt.Sprintf("r.code = $%d", len(args)+1), + strings.TrimSpace(q.RoleCode)) + } + if strings.TrimSpace(q.ActionCategory) != "" { + add(fmt.Sprintf("l.action_category = $%d", len(args)+1), + strings.TrimSpace(q.ActionCategory)) + } + if strings.TrimSpace(q.ActionType) != "" { + add(fmt.Sprintf("l.action_type = $%d", len(args)+1), + strings.TrimSpace(q.ActionType)) + } + if strings.TrimSpace(q.ActionTarget) != "" { + add(fmt.Sprintf("l.action_target ILIKE $%d", len(args)+1), + "%"+strings.TrimSpace(q.ActionTarget)+"%") + } + if q.Success != nil { + add(fmt.Sprintf("l.is_success = $%d", len(args)+1), *q.Success) + } + if q.StatusMin != nil { + add(fmt.Sprintf("l.http_status >= $%d", len(args)+1), *q.StatusMin) + } + if q.StatusMax != nil { + add(fmt.Sprintf("l.http_status <= $%d", len(args)+1), *q.StatusMax) + } + if q.DateFrom != nil { + add(fmt.Sprintf("l.created_at >= $%d", len(args)+1), *q.DateFrom) + } + if q.DateTo != nil { + add(fmt.Sprintf("l.created_at < $%d", len(args)+1), + q.DateTo.Add(24*time.Hour)) + } + + whereSQL := "" + if len(where) > 0 { + whereSQL = "WHERE " + strings.Join(where, " AND ") + } + + // ---------- COUNT ---------- + countSQL := fmt.Sprintf(` + SELECT count(*) + FROM mk_user_activity_log l + LEFT JOIN mk_dfusr u ON u.id = l.dfusr_id + LEFT JOIN dfrole_usr ru ON ru.dfusr_id = u.id + LEFT JOIN dfrole r ON r.id = ru.dfrole_id + %s + `, whereSQL) + + var total int64 + if err := db.QueryRowContext(ctx, countSQL, args...).Scan(&total); err != nil { + return ActivityLogResult{}, err + } + + // ---------- LIST ---------- + listArgs := append([]interface{}{}, args...) + + listSQL := fmt.Sprintf(` +SELECT + l.created_at, + l.request_started_at, + l.request_finished_at, + l.duration_ms, + l.http_status, + + COALESCE(u.username, l.username, '') AS username, + COALESCE(r.code,''), + + COALESCE(l.action_category,''), + COALESCE(l.action_type,''), + COALESCE(l.action_target,''), + COALESCE(l.description,''), + + COALESCE(l.target_dfusr_id, 0), + COALESCE(l.target_username, ''), + COALESCE(l.change_before::text, ''), + COALESCE(l.change_after::text, ''), + + COALESCE(l.ip_address,''), + COALESCE(l.is_success,false), + COALESCE(l.error_message,''), + COALESCE(l.user_agent,''), + COALESCE(l.session_id,''), + + COALESCE(l.user_id::text,''), + COALESCE(l.dfusr_id,0), + + COALESCE(u.email,''), + COALESCE(u.is_active,false) + +FROM mk_user_activity_log l +LEFT JOIN mk_dfusr u ON u.id = l.dfusr_id +LEFT JOIN dfrole_usr ru ON ru.dfusr_id = u.id +LEFT JOIN dfrole r ON r.id = ru.dfrole_id +%s +ORDER BY l.created_at DESC +`, whereSQL) + // LIMIT sadece istenirse + if q.Limit > 0 { + + listSQL += fmt.Sprintf( + " LIMIT $%d OFFSET $%d", + len(listArgs)+1, + len(listArgs)+2, + ) + + listArgs = append(listArgs, q.Limit, offset) + } + + rows, err := db.QueryContext(ctx, listSQL, listArgs...) + if err != nil { + return ActivityLogResult{}, err + } + defer rows.Close() + + items := []ActivityLogRow{} + + for rows.Next() { + var it ActivityLogRow + var started, finished sql.NullTime + var dur, status sql.NullInt64 + + if err := rows.Scan( + &it.CreatedAt, + &started, + &finished, + &dur, + &status, + + &it.Username, + &it.RoleCode, + + &it.ActionCategory, + &it.ActionType, + &it.ActionTarget, + &it.Description, + + // ✅ NEW + &it.TargetDfUsrID, + &it.TargetUsername, + &it.ChangeBefore, + &it.ChangeAfter, + + &it.IpAddress, + &it.IsSuccess, + &it.ErrorMsg, + &it.UserAgent, + &it.SessionID, + + &it.UserUUID, + &it.DfUsrID, + + &it.Email, + &it.IsActive, + ); err != nil { + return ActivityLogResult{}, err + } + + if started.Valid { + it.RequestStartedAt = &started.Time + } + if finished.Valid { + it.RequestFinishedAt = &finished.Time + } + if dur.Valid { + v := int(dur.Int64) + it.DurationMs = &v + } + if status.Valid { + v := int(status.Int64) + it.HttpStatus = &v + } + + items = append(items, it) + } + + return ActivityLogResult{ + Total: total, + Items: items, + }, nil +} diff --git a/svc/repository/mk_user_repository.go b/svc/repository/mk_user_repository.go new file mode 100644 index 0000000..7eb0bce --- /dev/null +++ b/svc/repository/mk_user_repository.go @@ -0,0 +1,352 @@ +package repository + +import ( + "bssapp-backend/models" + "database/sql" + "errors" + "strings" + "time" + + "github.com/lib/pq" +) + +var ErrMkUserNotFound = errors.New("mk_user not found") + +type MkUserRepository struct { + DB *sql.DB +} + +func NewMkUserRepository(db *sql.DB) *MkUserRepository { + return &MkUserRepository{DB: db} +} + +// ------------------------------------------------------- +// 🔍 GET BY USERNAME +// ------------------------------------------------------- +func (r *MkUserRepository) GetByUsername(username string) (*models.MkUser, error) { + username = strings.TrimSpace(username) + + var u models.MkUser + + err := r.DB.QueryRow(`SELECT + u.id, + u.username, + COALESCE(u.email,'') AS email, + u.is_active, + COALESCE(u.password_hash,'') AS password_hash, + u.force_password_change, + + COALESCE(r.id, 0) AS role_id, + COALESCE(r.code, '') AS role_code, + + -- ✅ DEPARTMENTS + COALESCE( + array_agg(DISTINCT d.code) + FILTER (WHERE d.code IS NOT NULL), + '{}' + ) AS department_codes, + + u.password_updated_at, + u.created_at, + u.updated_at, + u.last_login_at + +FROM mk_dfusr u + +LEFT JOIN dfrole_usr ru + ON ru.dfusr_id = u.id + +LEFT JOIN dfrole r + ON r.id = ru.dfrole_id + +-- ✅ USER → DEPT +LEFT JOIN dfusr_dprt ud + ON ud.dfusr_id = u.id + AND ud.is_active = true + +LEFT JOIN mk_dprt d + ON d.id = ud.dprt_id + +WHERE LOWER(u.username) = LOWER($1) + +GROUP BY + u.id, r.id + +LIMIT 1 +`, username).Scan( + &u.ID, + &u.Username, + &u.Email, + &u.IsActive, + &u.PasswordHash, + &u.ForcePasswordChange, + + &u.RoleID, + &u.RoleCode, + + pq.Array(&u.DepartmentCodes), // ✅ + + &u.PasswordUpdatedAt, + + &u.CreatedAt, + &u.UpdatedAt, + &u.LastLoginAt, + ) + + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, ErrMkUserNotFound + } + return nil, err + } + + return &u, nil +} + +// ------------------------------------------------------- +// 🔍 GET BY ID +// ------------------------------------------------------- +func (r *MkUserRepository) GetByID(id int64) (*models.MkUser, error) { + var u models.MkUser + + err := r.DB.QueryRow(` + SELECT + u.id, + u.username, + COALESCE(u.email,'') AS email, + u.is_active, + COALESCE(u.password_hash,'') AS password_hash, + u.force_password_change, + + COALESCE(r.id, 0) AS role_id, + COALESCE(r.code, '') AS role_code, + + -- ✅ DEPARTMENTS + COALESCE( + array_agg(DISTINCT d.code) + FILTER (WHERE d.code IS NOT NULL), + '{}' + ) AS department_codes, + + u.password_updated_at, + u.created_at, + u.updated_at, + u.last_login_at + +FROM mk_dfusr u + +LEFT JOIN dfrole_usr ru + ON ru.dfusr_id = u.id + +LEFT JOIN dfrole r + ON r.id = ru.dfrole_id + +-- ✅ USER → DEPT +LEFT JOIN dfusr_dprt ud + ON ud.dfusr_id = u.id + AND ud.is_active = true + +LEFT JOIN mk_dprt d + ON d.id = ud.dprt_id + +WHERE LOWER(u.username) = LOWER($1) + +GROUP BY + u.id, r.id + +LIMIT 1 +`, id).Scan( + &u.ID, + &u.Username, + &u.Email, + &u.IsActive, + &u.PasswordHash, + &u.ForcePasswordChange, + + &u.RoleID, + &u.RoleCode, + pq.Array(&u.DepartmentCodes), // ✅ + &u.PasswordUpdatedAt, + &u.CreatedAt, + &u.UpdatedAt, + &u.LastLoginAt, + ) + + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, ErrMkUserNotFound + } + return nil, err + } + + return &u, nil +} + +// ------------------------------------------------------- +// 🔁 CREATE FROM LEGACY (dfusr → mk_dfusr) +// - id = dfusr.id ✅ +// - role / v3 YOK +// ------------------------------------------------------- +// ------------------------------------------------------- +// 🔁 CREATE FROM LEGACY (dfusr → mk_dfusr) FULL MIGRATION +// ------------------------------------------------------- +func (r *MkUserRepository) CreateFromLegacy( + legacy *models.User, + passwordHash string, +) (*models.MkUser, error) { + + var u models.MkUser + + err := r.DB.QueryRow(` + INSERT INTO mk_dfusr ( + id, + username, + email, + full_name, + mobile, + address, + is_active, + password_hash, + force_password_change, + created_at, + updated_at + ) + VALUES ( + $1,$2,$3,$4,$5,$6,$7,$8,true,now(),now() + ) + ON CONFLICT (id) + DO UPDATE SET + email = EXCLUDED.email, + full_name = EXCLUDED.full_name, + mobile = EXCLUDED.mobile, + address = EXCLUDED.address, + password_hash = EXCLUDED.password_hash, + force_password_change= true, + updated_at = now() + RETURNING + id, + username, + COALESCE(email,''), + is_active, + COALESCE(password_hash,''), + force_password_change, + password_updated_at, + created_at, + updated_at, + last_login_at + `, + legacy.ID, + legacy.Username, + legacy.Email, + legacy.FullName, + legacy.Mobile, + legacy.Address, + legacy.IsActive, + passwordHash, + ).Scan( + &u.ID, + &u.Username, + &u.Email, + &u.IsActive, + &u.PasswordHash, + &u.ForcePasswordChange, + &u.PasswordUpdatedAt, + &u.CreatedAt, + &u.UpdatedAt, + &u.LastLoginAt, + ) + + if err != nil { + return nil, err + } + + return &u, nil +} + +// ------------------------------------------------------- +// ➕ CREATE NEW USER (NON-LEGACY) +// - id = sequence (>=1000) +// ------------------------------------------------------- +func (r *MkUserRepository) CreateNewUser( + username string, + email string, + isActive bool, +) (*models.MkUser, error) { + + var u models.MkUser + + err := r.DB.QueryRow(` + INSERT INTO mk_dfusr ( + username, + email, + is_active, + force_password_change, + created_at, + updated_at + ) + VALUES ( + $1,$2,$3,true,now(),now() + ) + RETURNING + id, + username, + COALESCE(email,'') AS email, + is_active, + COALESCE(password_hash,'') AS password_hash, + force_password_change, + password_updated_at, + created_at, + updated_at, + last_login_at + `, + strings.TrimSpace(username), + strings.TrimSpace(email), + isActive, + ).Scan( + &u.ID, + &u.Username, + &u.Email, + &u.IsActive, + &u.PasswordHash, + &u.ForcePasswordChange, + &u.PasswordUpdatedAt, + &u.CreatedAt, + &u.UpdatedAt, + &u.LastLoginAt, + ) + + if err != nil { + return nil, err + } + + return &u, nil +} + +// ------------------------------------------------------- +// 🕒 TOUCH LAST LOGIN +// ------------------------------------------------------- +func (r *MkUserRepository) TouchLastLogin(userID int64) error { + _, err := r.DB.Exec(` + UPDATE mk_dfusr + SET last_login_at = $1, + updated_at = $1 + WHERE id = $2 + `, time.Now(), userID) + return err +} + +// ------------------------------------------------------- +// 🔐 UPDATE PASSWORD +// ------------------------------------------------------- +func (r *MkUserRepository) UpdatePassword(userID int64, newHash string) error { + _, err := r.DB.Exec(` + UPDATE mk_dfusr + SET + password_hash = $1, + force_password_change = false, + password_updated_at = NOW(), + updated_at = NOW() + WHERE id = $2 + `, newHash, userID) + return err +} diff --git a/svc/repository/permission_repository.go b/svc/repository/permission_repository.go new file mode 100644 index 0000000..9586e95 --- /dev/null +++ b/svc/repository/permission_repository.go @@ -0,0 +1,33 @@ +// repository/permission_repository.go +package repository + +import "database/sql" + +type PermissionRepository struct { + DB *sql.DB +} + +func NewPermissionRepository(db *sql.DB) *PermissionRepository { + return &PermissionRepository{DB: db} +} + +func (r *PermissionRepository) GetPermissionsByRoleID(roleID int64) ([]string, error) { + rows, err := r.DB.Query(` + SELECT route + FROM mkdf_rol_per + WHERE role_id = $1 AND can_access = true + `, roleID) + if err != nil { + return nil, err + } + defer rows.Close() + + perms := []string{} + for rows.Next() { + var route string + if err := rows.Scan(&route); err == nil { + perms = append(perms, route) + } + } + return perms, nil +} diff --git a/svc/repository/refresh_token_repository.go b/svc/repository/refresh_token_repository.go new file mode 100644 index 0000000..d090376 --- /dev/null +++ b/svc/repository/refresh_token_repository.go @@ -0,0 +1,80 @@ +package repository + +import ( + "database/sql" + "errors" + "time" +) + +var ErrRefreshTokenInvalid = errors.New("refresh token invalid") + +type RefreshTokenRepository struct { + DB *sql.DB +} + +func NewRefreshTokenRepository(db *sql.DB) *RefreshTokenRepository { + return &RefreshTokenRepository{DB: db} +} + +// Yeni refresh (HASH saklanır) +func (r *RefreshTokenRepository) IssueRefreshToken( + mkUserID int64, + tokenHash string, + expiresAt time.Time, +) error { + _, err := r.DB.Exec(` + INSERT INTO mk_refresh_tokens (mk_user_id, token_hash, expires_at) + VALUES ($1,$2,$3) + `, mkUserID, tokenHash, expiresAt) + return err +} + +// Tek refresh’i revoke et (rotation / logout) +func (r *RefreshTokenRepository) RevokeByHash(hash string) error { + _, err := r.DB.Exec(` + UPDATE mk_refresh_tokens + SET revoked_at = now() + WHERE token_hash = $1 + AND revoked_at IS NULL + `, hash) + return err +} + +// Kullanıcının tüm refresh’lerini revoke et (logout-all / password change) +func (r *RefreshTokenRepository) RevokeAllForUser(mkUserID int64) error { + _, err := r.DB.Exec(` + UPDATE mk_refresh_tokens + SET revoked_at = now() + WHERE mk_user_id = $1 + AND revoked_at IS NULL + `, mkUserID) + return err +} + +// Geçerli refresh’i tüket (validate + rotate) +func (r *RefreshTokenRepository) ConsumeValid(tokenHash string) (int64, error) { + var mkUserID int64 + err := r.DB.QueryRow(` + SELECT mk_user_id + FROM mk_refresh_tokens + WHERE token_hash = $1 + AND revoked_at IS NULL + AND expires_at > now() + `, tokenHash).Scan(&mkUserID) + + if err != nil { + if err == sql.ErrNoRows { + return 0, ErrRefreshTokenInvalid + } + return 0, err + } + + // tek kullanımlık: eskiyi revoke et + _, _ = r.DB.Exec(` + UPDATE mk_refresh_tokens + SET revoked_at = now() + WHERE token_hash = $1 + `, tokenHash) + + return mkUserID, nil +} diff --git a/svc/repository/user_repo.go b/svc/repository/user_repo.go new file mode 100644 index 0000000..e76b874 --- /dev/null +++ b/svc/repository/user_repo.go @@ -0,0 +1,276 @@ +package repository + +import ( + "bssapp-backend/models" + "database/sql" + "errors" + "fmt" + "log" + "strings" +) + +// UserRepository → kullanıcı işlemleri için repository katmanı +type UserRepository struct { + DB *sql.DB +} + +// NewUserRepository → yeni bir UserRepository döner +func NewUserRepository(db *sql.DB) *UserRepository { + return &UserRepository{DB: db} +} + +// ------------------------------------------------------- +// 📋 GetUserList (User Management) +// ------------------------------------------------------- +func (r *UserRepository) GetUserList() ([]models.User, error) { + + query := ` + SELECT + u.id, + u.code, + COALESCE(u.upass,'') as upass, + u.is_active, + COALESCE(u.email,''), + COALESCE(uru.dfrole_id, 0) AS role_id, + COALESCE(dr.code, '') AS role_code + FROM dfusr u + LEFT JOIN dfrole_usr uru ON u.id = uru.dfusr_id + LEFT JOIN dfrole dr ON dr.id = uru.dfrole_id + ORDER BY u.code + ` + + rows, err := r.DB.Query(query) + if err != nil { + return nil, err + } + defer rows.Close() + + var users []models.User + for rows.Next() { + var u models.User + if err := rows.Scan( + &u.ID, + &u.Username, + &u.Upass, // ✅ dfusr.upass + &u.IsActive, + &u.Email, + &u.RoleID, + &u.RoleCode, + ); err != nil { + return nil, err + } + users = append(users, u) + } + return users, nil +} + +// ------------------------------------------------------- +// ➕ CreateUser (legacy dfusr insert) [kullanıyorsan kalsın] +// ------------------------------------------------------- +func (r *UserRepository) CreateUser(u *models.User) (int, error) { + + query := ` + INSERT INTO dfusr ( + code, + upass, + is_active, + email, + v3_username, + v3usergroup + ) + VALUES ($1, $2, $3, $4, $5, $6) + RETURNING id + ` + + var newID int + err := r.DB.QueryRow( + query, + u.Username, + u.Upass, // ✅ upass + u.IsActive, + u.Email, + u.V3Username, + u.V3UserGroup, + ).Scan(&newID) + + if err != nil { + return 0, err + } + return newID, nil +} + +// ------------------------------------------------------- +// 🔍 GetUserByUsername (legacy) [login için şart değil ama düzelttim] +// ------------------------------------------------------- +func (r *UserRepository) GetUserByUsername(username string) (*models.User, error) { + + clean := strings.TrimSpace(username) + + query := ` + SELECT + u.id, + u.code, + COALESCE(u.upass,'') as upass, + u.is_active, + COALESCE(u.email,''), + + COALESCE(uru.dfrole_id,0) AS role_id, + COALESCE(dr.code,'') AS role_code, + + COALESCE(u.v3_username,'') as v3_username, + COALESCE(u.v3_usergroup,0) as v3_usergroup, + COALESCE(u.force_password_change,false) as force_password_change + + FROM dfusr u + + LEFT JOIN dfrole_usr uru + ON uru.dfusr_id = u.id + + LEFT JOIN dfrole dr + ON dr.id = uru.dfrole_id + + WHERE u.is_active = true + AND ( + LOWER(u.code) = LOWER($1) + OR LOWER(u.email) = LOWER($1) + ) + + LIMIT 1; + ` + + row := r.DB.QueryRow(query, clean) + + var user models.User + + err := row.Scan( + &user.ID, + &user.Username, + &user.Upass, + &user.IsActive, + &user.Email, + + &user.RoleID, + &user.RoleCode, + + &user.V3Username, + &user.V3UserGroup, + &user.ForcePasswordChange, + ) + + if err != nil { + + if errors.Is(err, sql.ErrNoRows) { + return nil, errors.New("kullanıcı bulunamadı") + } + + return nil, err + } + + return &user, nil +} + +// ------------------------------------------------------- +// 🧪 DebugListUsers +// ------------------------------------------------------- +func (r *UserRepository) DebugListUsers() { + rows, err := r.DB.Query(`SELECT id, code FROM dfusr ORDER BY id LIMIT 10`) + if err != nil { + fmt.Println("❌ [DEBUG] Listeleme hatası:", err) + return + } + defer rows.Close() + + fmt.Println("📋 [DEBUG] İlk 10 kullanıcı:") + for rows.Next() { + var id int + var code string + if err := rows.Scan(&id, &code); err == nil { + fmt.Printf(" - %d : %s\n", id, code) + } + } +} + +// ------------------------------------------------------- +// 🔁 SetUserRoles +// ------------------------------------------------------- +func (r *UserRepository) SetUserRoles(userID int, roleIDs []int) error { + + tx, err := r.DB.Begin() + if err != nil { + return err + } + defer tx.Rollback() + + if _, err := tx.Exec(`DELETE FROM dfrole_usr WHERE dfusr_id = $1`, userID); err != nil { + return err + } + + for _, roleID := range roleIDs { + if _, err := tx.Exec( + `INSERT INTO dfrole_usr (dfrole_id, dfusr_id) VALUES ($1, $2)`, + roleID, userID, + ); err != nil { + return err + } + } + + return tx.Commit() +} + +// ------------------------------------------------------- +// 🔐 GetLegacyUserForLogin ✅ LOGIN İÇİN TEK DOĞRU FONKSİYON +// ------------------------------------------------------- +func (r *UserRepository) GetLegacyUserForLogin(login string) (*models.User, error) { + log.Println("🟡 LEGACY LOGIN QUERY HIT:", login) + + login = strings.TrimSpace(login) + + var u models.User + + err := r.DB.QueryRow(` + SELECT + u.id, + u.code, + COALESCE(u.upass,'') as upass, + u.is_active, + COALESCE(u.email,''), + COALESCE(u.dfrole_id,0) as role_id, + COALESCE(dr.code,'') as role_code, + COALESCE(u.force_password_change,false) + FROM dfusr u + LEFT JOIN dfrole dr ON dr.id = u.dfrole_id + WHERE u.is_active = true + AND ( + LOWER(u.code) = LOWER($1) + OR LOWER(u.email) = LOWER($1) + ) + LIMIT 1 + `, login).Scan( + &u.ID, + &u.Username, + &u.Upass, + &u.IsActive, + &u.Email, + &u.RoleID, + &u.RoleCode, + &u.ForcePasswordChange, + ) + + if err != nil { + log.Printf("❌ LEGACY SCAN ERROR: %v", err) + return nil, err + } + + prefix := u.Upass + if len(prefix) > 4 { + prefix = prefix[:4] + } + + log.Printf( + "🧪 LEGACY UPASS OK len=%d prefix=%s", + len(u.Upass), + prefix, + ) + + return &u, nil +} diff --git a/svc/repository/user_role_repo.go b/svc/repository/user_role_repo.go new file mode 100644 index 0000000..b7de144 --- /dev/null +++ b/svc/repository/user_role_repo.go @@ -0,0 +1,32 @@ +package repository + +import "database/sql" + +type UserRole struct { + RoleID int + RoleCode string + IsSystem bool +} + +// repository/user_roles.go +// repository/user_roles.go +func GetUserRolesByUserID(db *sql.DB, userID int64) ([]int, error) { + rows, err := db.Query(` + SELECT role_id + FROM dfrole_usr + WHERE mk_dfusr_id = $1 + `, userID) + if err != nil { + return nil, err + } + defer rows.Close() + + var roles []int + for rows.Next() { + var rid int + if err := rows.Scan(&rid); err == nil { + roles = append(roles, rid) + } + } + return roles, nil +} diff --git a/svc/routes/account.go b/svc/routes/account.go new file mode 100644 index 0000000..363cfd1 --- /dev/null +++ b/svc/routes/account.go @@ -0,0 +1,39 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/authz" + "bssapp-backend/queries" + "encoding/json" + "log" + "net/http" +) + +func GetAccountsHandler(w http.ResponseWriter, r *http.Request) { + + // ✅ AUTH (sadece login kontrolü) + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + // ✅ DEBUG (scope kontrol için faydalı) + log.Println("🔍 PIYASA CTX:", authz.GetPiyasaCodesFromCtx(r.Context())) + + // ✅ QUERY + accounts, err := queries.GetAccounts(r.Context()) + if err != nil { + log.Println("❌ GetAccounts error:", err) + http.Error(w, "db error", http.StatusInternalServerError) + return + } + + // ✅ RESPONSE + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + if err := json.NewEncoder(w).Encode(accounts); err != nil { + log.Println("❌ JSON encode error:", err) + return + } +} diff --git a/svc/routes/activitylogs.go b/svc/routes/activitylogs.go new file mode 100644 index 0000000..df966e6 --- /dev/null +++ b/svc/routes/activitylogs.go @@ -0,0 +1,126 @@ +package routes + +import ( + "bssapp-backend/repository" + "database/sql" + "encoding/json" + "net/http" + "strconv" + "time" +) + +type ActivityLogQuery struct { + Username string + RoleCode string + ActionCategory string + ActionType string + ActionTarget string + Success *bool + + DateFrom *time.Time + DateTo *time.Time + + Page int + Limit int +} + +func AdminActivityLogsHandler(pgDB *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + q := repository.ActivityLogQuery{} + + // pagination + if v := r.URL.Query().Get("page"); v != "" { + if i, err := strconv.Atoi(v); err == nil { + q.Page = i + } + } + + if v := r.URL.Query().Get("limit"); v != "" { + if i, err := strconv.Atoi(v); err == nil { + q.Limit = i + } + } else { + // limit yoksa unlimited + q.Limit = 0 + } + + // filters + q.Username = r.URL.Query().Get("username") + q.RoleCode = r.URL.Query().Get("role_code") + q.ActionCategory = r.URL.Query().Get("action_category") + q.ActionType = r.URL.Query().Get("action_type") + q.ActionTarget = r.URL.Query().Get("action_target") + + // success + if v := r.URL.Query().Get("success"); v != "" { + if v == "true" || v == "1" { + b := true + q.Success = &b + } else if v == "false" || v == "0" { + b := false + q.Success = &b + } + } + + // status range + if v := r.URL.Query().Get("status_min"); v != "" { + if i, err := strconv.Atoi(v); err == nil { + q.StatusMin = &i + } + } + if v := r.URL.Query().Get("status_max"); v != "" { + if i, err := strconv.Atoi(v); err == nil { + q.StatusMax = &i + } + } + + // date range (ISO: 2026-01-03T00:00:00Z veya 2026-01-03) + parseDate := func(s string) (*time.Time, error) { + if s == "" { + return nil, nil + } + // önce RFC3339 dene + if t, err := time.Parse(time.RFC3339, s); err == nil { + return &t, nil + } + // sonra sadece tarih + if t, err := time.Parse("2006-01-02", s); err == nil { + tt := t + return &tt, nil + } + return nil, http.ErrNotSupported + } + + if v := r.URL.Query().Get("date_from"); v != "" { + t, err := parseDate(v) + if err != nil { + http.Error(w, "date_from format hatalı", http.StatusBadRequest) + return + } + q.DateFrom = t + } + if v := r.URL.Query().Get("date_to"); v != "" { + t, err := parseDate(v) + if err != nil { + http.Error(w, "date_to format hatalı", http.StatusBadRequest) + return + } + q.DateTo = t + } + + res, err := repository.ListActivityLogs(r.Context(), pgDB, q) + if err != nil { + http.Error(w, "Loglar alınamadı", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + _ = json.NewEncoder(w).Encode(map[string]interface{}{ + "page": q.Page, + "limit": q.Limit, + "total": res.Total, + "items": res.Items, + }) + } +} diff --git a/svc/routes/admin_piyasa.go b/svc/routes/admin_piyasa.go new file mode 100644 index 0000000..c4de4aa --- /dev/null +++ b/svc/routes/admin_piyasa.go @@ -0,0 +1,61 @@ +package routes + +import ( + "log" + "net/http" + "strconv" + + "bssapp-backend/auth" + "bssapp-backend/internal/authz" + "bssapp-backend/middlewares" + + "github.com/gorilla/mux" +) + +// ===================================================== +// 🔐 ADMIN — PIYASA CACHE SYNC +// ===================================================== +// POST /api/admin/users/{id}/piyasa-sync +func AdminSyncUserPiyasaHandler(w http.ResponseWriter, r *http.Request) { + + // -------------------------------------------------- + // 🔐 AUTH + // -------------------------------------------------- + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", 401) + return + } + + // -------------------------------------------------- + // 🆔 USER ID PARAM + // -------------------------------------------------- + vars := mux.Vars(r) + + idStr := vars["id"] + + targetID, err := strconv.ParseInt(idStr, 10, 64) + if err != nil { + http.Error(w, "invalid user id", http.StatusBadRequest) + return + } + + // -------------------------------------------------- + // 🧹 CACHE CLEAR + // -------------------------------------------------- + authz.ClearPiyasaCache(int(targetID)) + middlewares.ClearAuthzScopeCacheForUser(targetID) + + log.Printf( + "🔄 ADMIN PIYASA SYNC | admin=%d target=%d", + claims.ID, + targetID, + ) + + // -------------------------------------------------- + // ✅ OK + // -------------------------------------------------- + w.Header().Set("Content-Type", "application/json") + + w.Write([]byte(`{"status":"ok"}`)) +} diff --git a/svc/routes/admin_reset_password.go b/svc/routes/admin_reset_password.go new file mode 100644 index 0000000..543de20 --- /dev/null +++ b/svc/routes/admin_reset_password.go @@ -0,0 +1,104 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/auditlog" + "bssapp-backend/repository" + "database/sql" + "encoding/json" + "github.com/gorilla/mux" + "golang.org/x/crypto/bcrypt" + "net/http" + "strconv" +) + +type AdminResetPasswordRequest struct { + Password string `json:"password"` // opsiyonel +} + +func AdminResetPasswordHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + // --------------------------------------------------- + // 1️⃣ USER ID + // --------------------------------------------------- + idStr := mux.Vars(r)["id"] + userID, err := strconv.ParseInt(idStr, 10, 64) + if err != nil || userID <= 0 { + http.Error(w, "invalid user id", http.StatusBadRequest) + return + } + + // --------------------------------------------------- + // 2️⃣ PAYLOAD (opsiyonel) + // --------------------------------------------------- + var req AdminResetPasswordRequest + _ = json.NewDecoder(r.Body).Decode(&req) + + // parola verilmediyse backend üretir + password := req.Password + if password == "" { + password = "Temp123!" // 👉 istersek random generator ekleriz + } + + // --------------------------------------------------- + // 3️⃣ HASH + // --------------------------------------------------- + hash, err := bcrypt.GenerateFromPassword( + []byte(password), + bcrypt.DefaultCost, + ) + if err != nil { + http.Error(w, "password hash error", http.StatusInternalServerError) + return + } + + // --------------------------------------------------- + // 4️⃣ UPDATE mk_dfusr + // --------------------------------------------------- + _, err = db.Exec(` + UPDATE mk_dfusr + SET + password_hash = $1, + force_password_change = true, + password_updated_at = NOW(), + updated_at = NOW() + WHERE id = $2 + `, string(hash), userID) + + if err != nil { + http.Error(w, "password reset failed", http.StatusInternalServerError) + return + } + + // --------------------------------------------------- + // 5️⃣ REFRESH TOKEN REVOKE + // --------------------------------------------------- + _ = repository. + NewRefreshTokenRepository(db). + RevokeAllForUser(userID) + + // --------------------------------------------------- + // 6️⃣ AUDIT + // --------------------------------------------------- + auditlog.Write(auditlog.ActivityLog{ + ActionType: "ADMIN_PASSWORD_RESET", + ActionCategory: "security", + ActionTarget: "mk_dfusr.id", + IsSuccess: true, + }) + + // --------------------------------------------------- + // 7️⃣ RESPONSE + // --------------------------------------------------- + _ = json.NewEncoder(w).Encode(map[string]any{ + "success": true, + }) + } +} diff --git a/svc/routes/audit_helper.go b/svc/routes/audit_helper.go new file mode 100644 index 0000000..402d107 --- /dev/null +++ b/svc/routes/audit_helper.go @@ -0,0 +1,60 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/ctxkeys" + "bssapp-backend/internal/auditlog" + "bssapp-backend/permissions" + "bssapp-backend/repository" + "database/sql" + "encoding/json" +) + +// auditLogFromRequest +// routes içinden çağrılır +// auditLogFromRequest +// routes içinden çağrılır +func auditLogFromRequest( + ctx any, + db *sql.DB, + actionType string, + meta map[string]any, +) { + + al := auditlog.ActivityLog{ + ActionType: actionType, + ActionCategory: "ADMIN", + IsSuccess: true, + } + + // JWT → identity + if c, ok := ctx.(interface { + Value(any) any + }); ok { + if claims, ok := c.Value(ctxkeys.UserContextKey).(*auth.Claims); ok && claims != nil { + + // ✅ TEK KİMLİK + al.DfUsrID = claims.ID + al.Username = claims.Username + al.RoleCode = claims.RoleCode + + // 🔗 MULTI ROLE → ADMIN CHECK + roles, err := repository.GetUserRolesByUserID(db, claims.ID) + if err == nil { + _, isAdmin := permissions.ResolveEffectiveRoles(roles) + if isAdmin { + al.RoleCode = "admin" + } + } + } + } + + // meta → description + if meta != nil { + if b, err := json.Marshal(meta); err == nil { + al.Description = string(b) + } + } + + auditlog.Write(al) +} diff --git a/svc/routes/auth_refresh.go b/svc/routes/auth_refresh.go new file mode 100644 index 0000000..f5b177f --- /dev/null +++ b/svc/routes/auth_refresh.go @@ -0,0 +1,92 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/security" + "bssapp-backend/repository" + "database/sql" + "encoding/json" + "net/http" + "time" +) + +func setRefreshCookie(w http.ResponseWriter, plain string, exp time.Time) { + http.SetCookie(w, &http.Cookie{ + Name: "mk_refresh", + Value: plain, + Path: "/", + Expires: exp, + HttpOnly: true, + SameSite: http.SameSiteLaxMode, + Secure: false, // prod: true + }) +} + +func AuthRefreshHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + // 1) refresh cookie + c, err := r.Cookie("mk_refresh") + if err != nil || c.Value == "" { + http.Error(w, "refresh token missing", http.StatusUnauthorized) + return + } + + hash := security.HashRefreshToken(c.Value) + rtRepo := repository.NewRefreshTokenRepository(db) + + // 2) validate + consume + mkUserID, err := rtRepo.ConsumeValid(hash) + if err != nil { + http.Error(w, "refresh token invalid", http.StatusUnauthorized) + return + } + + // 3) rotate + newPlain, newHash, err := security.GenerateRefreshToken() + if err != nil { + http.Error(w, "refresh gen failed", http.StatusInternalServerError) + return + } + refreshExp := time.Now().Add(14 * 24 * time.Hour) + if err := rtRepo.IssueRefreshToken(mkUserID, newHash, refreshExp); err != nil { + http.Error(w, "refresh store failed", http.StatusInternalServerError) + return + } + setRefreshCookie(w, newPlain, refreshExp) + + // 4) mk user reload + mkRepo := repository.NewMkUserRepository(db) + mkUser, err := mkRepo.GetByID(mkUserID) + if err != nil || !mkUser.IsActive { + http.Error(w, "user invalid", http.StatusUnauthorized) + return + } + if mkUser.ForcePasswordChange { + http.Error(w, "password change required", http.StatusForbidden) + return + } + + // 5) new access token + claims := auth.BuildClaimsFromUser(mkUser, 15*time.Minute) + + token, err := auth.GenerateToken( + claims, + mkUser.Username, + mkUser.ForcePasswordChange, + ) + if err != nil { + http.Error(w, "access token gen failed", http.StatusInternalServerError) + return + } + + // 6) response + _ = json.NewEncoder(w).Encode(map[string]any{ + "success": true, + "token": token, + }) + + } +} diff --git a/svc/routes/customerlist.go b/svc/routes/customerlist.go new file mode 100644 index 0000000..e61b8e8 --- /dev/null +++ b/svc/routes/customerlist.go @@ -0,0 +1,57 @@ +package routes + +import ( + "encoding/json" + "log" + "net/http" + + "bssapp-backend/auth" + "bssapp-backend/queries" +) + +func GetCustomerListHandler(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + // -------------------------------------------------- + // 🔐 CLAIMS (DEBUG / TRACE) + // -------------------------------------------------- + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + log.Printf( + "📥 /api/customers | user=%d admin=%v", + claims.ID, + claims.IsAdmin(), + ) + + // -------------------------------------------------- + // 🗄️ QUERY (CONTEXT TAŞIYOR) + // -------------------------------------------------- + list, err := queries.GetCustomerList(r.Context()) + if err != nil { + log.Println("❌ Customer list error:", err) + http.Error(w, "Veritabanı hatası", http.StatusInternalServerError) + return + } + + // -------------------------------------------------- + // 📤 JSON OUTPUT + // -------------------------------------------------- + if err := json.NewEncoder(w).Encode(list); err != nil { + log.Printf("❌ JSON encode error: %v", err) + return + } + + // -------------------------------------------------- + // 📊 RESULT LOG + // -------------------------------------------------- + log.Printf( + "✅ Customer list DONE | user=%d | resultCount=%d", + claims.ID, + len(list), + ) +} diff --git a/svc/routes/first_password_change.go b/svc/routes/first_password_change.go new file mode 100644 index 0000000..8530e65 --- /dev/null +++ b/svc/routes/first_password_change.go @@ -0,0 +1,169 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/auditlog" + "bssapp-backend/internal/security" + "bssapp-backend/models" + "bssapp-backend/repository" + "database/sql" + "encoding/json" + "log" + "net/http" + "time" + + "golang.org/x/crypto/bcrypt" +) + +func FirstPasswordChangeHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + // -------------------------------------------------- + // 1️⃣ JWT CLAIMS + // -------------------------------------------------- + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + // -------------------------------------------------- + // 2️⃣ PAYLOAD + // -------------------------------------------------- + var req struct { + CurrentPassword string `json:"current_password"` + NewPassword string `json:"new_password"` + } + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, "invalid payload", http.StatusBadRequest) + return + } + + if req.CurrentPassword == "" || req.NewPassword == "" { + http.Error(w, "password fields required", http.StatusUnprocessableEntity) + return + } + + // -------------------------------------------------- + // 3️⃣ LOAD USER (mk_dfusr) + // -------------------------------------------------- + var currentHash string + err := db.QueryRow(` + SELECT password_hash + FROM mk_dfusr + WHERE id = $1 + `, claims.ID).Scan(¤tHash) + + if err != nil || currentHash == "" { + http.Error(w, "user not found", http.StatusUnauthorized) + return + } + + // -------------------------------------------------- + // 4️⃣ CURRENT PASSWORD CHECK + // -------------------------------------------------- + if bcrypt.CompareHashAndPassword( + []byte(currentHash), + []byte(req.CurrentPassword), + ) != nil { + http.Error(w, "mevcut şifre hatalı", http.StatusUnauthorized) + return + } + + // -------------------------------------------------- + // 5️⃣ PASSWORD POLICY + // -------------------------------------------------- + if err := security.ValidatePassword(req.NewPassword); err != nil { + http.Error(w, err.Error(), http.StatusUnprocessableEntity) + return + } + + // -------------------------------------------------- + // 6️⃣ HASH NEW PASSWORD + // -------------------------------------------------- + hash, err := bcrypt.GenerateFromPassword( + []byte(req.NewPassword), + bcrypt.DefaultCost, + ) + if err != nil { + http.Error(w, "password hash error", http.StatusInternalServerError) + return + } + + // -------------------------------------------------- + // 7️⃣ UPDATE mk_dfusr + // -------------------------------------------------- + _, err = db.Exec(` + UPDATE mk_dfusr + SET + password_hash = $1, + force_password_change = false, + password_updated_at = NOW(), + updated_at = NOW() + WHERE id = $2 + `, string(hash), claims.ID) + + if err != nil { + http.Error(w, "password update failed", http.StatusInternalServerError) + return + } + + // -------------------------------------------------- + // 8️⃣ REFRESH TOKEN REVOKE + // -------------------------------------------------- + _ = repository. + NewRefreshTokenRepository(db). + RevokeAllForUser(claims.ID) + + // -------------------------------------------------- + // 9️⃣ NEW JWT (TEK DOĞRU YOL) + // -------------------------------------------------- + newClaims := auth.BuildClaimsFromUser( + &models.MkUser{ + ID: claims.ID, + Username: claims.Username, + RoleCode: claims.RoleCode, + V3Username: claims.V3Username, + V3UserGroup: claims.V3UserGroup, + SessionID: claims.SessionID, + ForcePasswordChange: false, + }, + 15*time.Minute, + ) + + newToken, err := auth.GenerateToken( + newClaims, + claims.Username, + false, + ) + if err != nil { + http.Error(w, "token generation failed", http.StatusInternalServerError) + return + } + + // -------------------------------------------------- + // 🔟 AUDIT + // -------------------------------------------------- + auditlog.ForcePasswordChangeCompleted( + r.Context(), + claims.ID, + "self_change", + ) + + // -------------------------------------------------- + // 1️⃣1️⃣ RESPONSE + // -------------------------------------------------- + _ = json.NewEncoder(w).Encode(map[string]any{ + "token": newToken, + "user": map[string]any{ + "id": claims.ID, + "username": claims.Username, + "force_password_change": false, + }, + }) + log.Printf("✅ FIRST-PASS claims user=%d role=%s", claims.ID, claims.RoleCode) + } +} diff --git a/svc/routes/login.go b/svc/routes/login.go new file mode 100644 index 0000000..89685f8 --- /dev/null +++ b/svc/routes/login.go @@ -0,0 +1,733 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/auditlog" + "bssapp-backend/models" + "bssapp-backend/queries" + "bssapp-backend/repository" + "bssapp-backend/services" + "database/sql" + "encoding/json" + "fmt" + "log" + "net/http" + "strconv" + "strings" + "time" + + "github.com/gorilla/mux" + "golang.org/x/crypto/bcrypt" +) + +/* ====================================================== + 🔐 LOGIN +====================================================== */ + +type LoginRequest struct { + Username string `json:"username"` + Password string `json:"password"` +} + +func LoginHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + // -------------------------------------------------- + // 0️⃣ REQUEST + // -------------------------------------------------- + var req LoginRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, "Geçersiz JSON", http.StatusBadRequest) + return + } + + login := strings.TrimSpace(req.Username) + pass := req.Password // ⚠️ TRIM YAPMA + + if login == "" || pass == "" { + http.Error(w, "Kullanıcı adı veya parola hatalı", http.StatusUnauthorized) + return + } + + mkRepo := repository.NewMkUserRepository(db) + + // ================================================== + // 1️⃣ mk_dfusr ÖNCELİKLİ + // ================================================== + mkUser, err := mkRepo.GetByUsername(login) + if err == nil { + log.Println("🧪 MK USER FROM DB") + log.Printf("🧪 ID=%d role_id=%d role_code='%s' depts=%v", + mkUser.ID, + mkUser.RoleID, + mkUser.RoleCode, + mkUser.DepartmentCodes, + ) + + } + + log.Printf( + "🔎 LOGIN DEBUG | mk_user_found=%v err=%v hash_len=%d", + err == nil, + err, + func() int { + if err == nil { + return len(strings.TrimSpace(mkUser.PasswordHash)) + } + return 0 + }(), + ) + + if err == nil { + + // mk_dfusr authoritative + if strings.TrimSpace(mkUser.PasswordHash) != "" { + + if bcrypt.CompareHashAndPassword( + []byte(mkUser.PasswordHash), + []byte(pass), + ) != nil { + http.Error(w, "Kullanıcı adı veya parola hatalı", http.StatusUnauthorized) + return + } + + _ = mkRepo.TouchLastLogin(mkUser.ID) + writeLoginResponse(w, db, mkUser) + return + } + // password_hash boşsa legacy fallback + } else if err != repository.ErrMkUserNotFound { + log.Println("❌ mk_dfusr lookup error:", err) + http.Error(w, "Giriş yapılamadı", http.StatusInternalServerError) + return + } + + // ================================================== + // 2️⃣ dfusr FALLBACK (LEGACY) + // ================================================== + log.Println("🟡 LEGACY LOGIN PATH:", login) + + legacyRepo := repository.NewUserRepository(db) + legacyUser, err := legacyRepo.GetLegacyUserForLogin(login) + if err != nil || !legacyUser.IsActive { + http.Error(w, "Kullanıcı adı veya parola hatalı", http.StatusUnauthorized) + return + } + + log.Printf( + "🔎 LOGIN DEBUG | legacy_upass_len=%d prefix=%s", + len(strings.TrimSpace(legacyUser.Upass)), + func() string { + if len(legacyUser.Upass) >= 4 { + return legacyUser.Upass[:4] + } + return legacyUser.Upass + }(), + ) + + if !services.CheckPasswordWithLegacy(legacyUser, pass) { + http.Error(w, "Kullanıcı adı veya parola hatalı", http.StatusUnauthorized) + return + } + + // ================================================== + // 3️⃣ MIGRATION (dfusr → mk_dfusr) + // ================================================== + newHash, err := bcrypt.GenerateFromPassword( + []byte(pass), + bcrypt.DefaultCost, + ) + if err != nil { + http.Error(w, "Şifre üretilemedi", http.StatusInternalServerError) + return + } + + mkUser, err = mkRepo.CreateFromLegacy(legacyUser, string(newHash)) + if err != nil { + log.Println("❌ CREATE_FROM_LEGACY FAILED:", err) + http.Error(w, "Kullanıcı migrate edilemedi", http.StatusInternalServerError) + return + } + + // 🔥 KRİTİK: TOKEN GUARD İÇİN GARANTİ + mkUser.ForcePasswordChange = true + + auditlog.Write(auditlog.ActivityLog{ + ActionType: "LEGACY_USER_MIGRATED", + ActionCategory: "security", + Description: "dfusr -> mk_dfusr on login", + IsSuccess: true, + }) + + // ================================================== + // 4️⃣ SUCCESS + // ================================================== + writeLoginResponse(w, db, mkUser) + } +} + +// ====================================================== +// 🔑 LOGIN RESPONSE +// ====================================================== + +func writeLoginResponse(w http.ResponseWriter, db *sql.DB, user *models.MkUser) { + // 🔥 ROLE GARANTİSİ + if user.RoleID == 0 { + + _ = db.QueryRow(` + SELECT dfrole_id + FROM dfrole_usr + WHERE dfusr_id = $1 + LIMIT 1 + `, user.ID).Scan(&user.RoleID) + } + + if user.RoleCode == "" && user.RoleID > 0 { + + _ = db.QueryRow(` + SELECT code + FROM dfrole + WHERE id = $1 + `, user.RoleID).Scan(&user.RoleCode) + } + + log.Println("🧪 LOGIN RESPONSE USER DEBUG") + log.Printf("🧪 user.ID = %d", user.ID) + log.Printf("🧪 user.Username = %s", user.Username) + log.Printf("🧪 user.RoleID = %d", user.RoleID) + log.Printf("🧪 user.RoleCode = '%s'", user.RoleCode) + log.Printf("🧪 user.IsActive = %v", user.IsActive) + + permRepo := repository.NewPermissionRepository(db) + perms, _ := permRepo.GetPermissionsByRoleID(user.RoleID) + + // ✅ CLAIMS BUILD + claims := auth.BuildClaimsFromUser(user, 15*time.Minute) + + token, err := auth.GenerateToken( + claims, + user.Username, + user.ForcePasswordChange, + ) + if err != nil { + http.Error(w, "Token üretilemedi", http.StatusInternalServerError) + return + } + + _ = json.NewEncoder(w).Encode(map[string]any{ + "token": token, + "user": map[string]any{ + "id": user.ID, + "username": user.Username, + "email": user.Email, + "is_active": user.IsActive, + "role_id": user.RoleID, + "role_code": user.RoleCode, + "force_password_change": user.ForcePasswordChange, + "v3_username": user.V3Username, + "v3_usergroup": user.V3UserGroup, + }, + "permissions": perms, + }) +} + +/* ====================================================== + 🔎 LOOKUPS (aynen korunuyor) +====================================================== */ + +type LookupOption struct { + Value string `json:"value"` + Label string `json:"label"` +} + +func GetRoleLookupRoute(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + rows, err := db.Query(queries.GetRoleLookup) + if err != nil { + http.Error(w, "role lookup error", http.StatusInternalServerError) + return + } + defer rows.Close() + + var list []LookupOption + for rows.Next() { + var o LookupOption + if err := rows.Scan(&o.Value, &o.Label); err == nil { + list = append(list, o) + } + } + _ = json.NewEncoder(w).Encode(list) + } +} + +func GetDepartmentLookupRoute(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + rows, err := db.Query(queries.GetDepartmentLookup) + if err != nil { + http.Error(w, "department lookup error", http.StatusInternalServerError) + return + } + defer rows.Close() + + var list []LookupOption + for rows.Next() { + var o LookupOption + if err := rows.Scan(&o.Value, &o.Label); err == nil { + list = append(list, o) + } + } + _ = json.NewEncoder(w).Encode(list) + } +} + +func GetPiyasaLookupRoute(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + rows, err := db.Query(queries.GetPiyasaLookup) + if err != nil { + http.Error(w, "piyasa lookup error", http.StatusInternalServerError) + return + } + defer rows.Close() + + var list []LookupOption + for rows.Next() { + var o LookupOption + if err := rows.Scan(&o.Value, &o.Label); err == nil { + list = append(list, o) + } + } + _ = json.NewEncoder(w).Encode(list) + } +} + +// ====================================================== +// 🧾 NEBIM USER LOOKUP +// GET /api/lookups/nebim-users +// ====================================================== +func GetNebimUserLookupRoute(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + rows, err := db.Query(queries.GetNebimUserLookup) + if err != nil { + http.Error(w, "nebim lookup error", http.StatusInternalServerError) + return + } + defer rows.Close() + + var list []map[string]string + for rows.Next() { + var v, l, g string + if err := rows.Scan(&v, &l, &g); err == nil { + list = append(list, map[string]string{ + "value": v, + "label": l, + "user_group_code": g, + }) + } + } + + _ = json.NewEncoder(w).Encode(list) + } +} +func UserCreateRoute(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + var payload models.UserWrite + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + http.Error(w, "Geçersiz payload", http.StatusBadRequest) + return + } + + if payload.Code == "" { + http.Error(w, "Kullanıcı kodu zorunludur", http.StatusUnprocessableEntity) + return + } + + tx, err := db.Begin() + if err != nil { + http.Error(w, "Transaction başlatılamadı", http.StatusInternalServerError) + return + } + defer tx.Rollback() + + var newID int64 + err = tx.QueryRow(` + INSERT INTO mk_dfusr ( + code, + is_active, + full_name, + email, + mobile, + address, + force_password_change, + last_updated_date + ) + VALUES ($1,$2,$3,$4,$5,$6,true,NOW()) + RETURNING id + `, + payload.Code, + payload.IsActive, + payload.FullName, + payload.Email, + payload.Mobile, + payload.Address, + ).Scan(&newID) + + if err != nil { + log.Println("USER INSERT ERROR:", err) + http.Error(w, "Kullanıcı oluşturulamadı", http.StatusInternalServerError) + return + } + + // ROLES + for _, role := range payload.Roles { + _, _ = tx.Exec(queries.InsertUserRole, newID, role) + } + + // DEPARTMENTS + for _, d := range payload.Departments { + _, _ = tx.Exec(queries.InsertUserDepartment, newID, d.Code) + } + + // PIYASALAR + for _, p := range payload.Piyasalar { + _, _ = tx.Exec(queries.InsertUserPiyasa, newID, p.Code) + } + + // NEBIM + for _, n := range payload.NebimUsers { + _, _ = tx.Exec(queries.InsertUserNebim, newID, n.Username) + } + + if err := tx.Commit(); err != nil { + http.Error(w, "Commit başarısız", http.StatusInternalServerError) + return + } + + _ = json.NewEncoder(w).Encode(map[string]any{ + "success": true, + "id": newID, + }) + } +} + +// ====================================================== +// 🔐 ROLES LIST +// GET /api/roles +// ====================================================== + +func GetRolesHandler(db *sql.DB) http.HandlerFunc { + type RoleRow struct { + ID int64 `json:"id"` + Code string `json:"code"` + Title string `json:"title"` + } + + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + rows, err := db.Query(queries.GetRoles) + if err != nil { + http.Error(w, "roles query error", http.StatusInternalServerError) + return + } + defer rows.Close() + + var list []RoleRow + for rows.Next() { + var x RoleRow + if err := rows.Scan(&x.ID, &x.Code, &x.Title); err == nil { + list = append(list, x) + } + } + + _ = json.NewEncoder(w).Encode(list) + } +} + +// ====================================================== +// 🏢 DEPARTMENTS LIST +// GET /api/departments +// ====================================================== + +func GetDepartmentsHandler(db *sql.DB) http.HandlerFunc { + type DeptRow struct { + ID int64 `json:"id"` + Code string `json:"code"` + Title string `json:"title"` + } + + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + rows, err := db.Query(queries.GetDepartments) + if err != nil { + http.Error(w, "departments query error", http.StatusInternalServerError) + return + } + defer rows.Close() + + var list []DeptRow + for rows.Next() { + var x DeptRow + if err := rows.Scan(&x.ID, &x.Code, &x.Title); err == nil { + list = append(list, x) + } + } + + _ = json.NewEncoder(w).Encode(list) + } +} + +// ====================================================== +// 🌍 PIYASALAR LIST +// GET /api/piyasalar +// ====================================================== + +func GetPiyasalarHandler(db *sql.DB) http.HandlerFunc { + type PiyRow struct { + Code string `json:"code"` + Title string `json:"title"` + } + + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + rows, err := db.Query(queries.GetPiyasalar) + if err != nil { + http.Error(w, "piyasalar query error", http.StatusInternalServerError) + return + } + defer rows.Close() + + var list []PiyRow + for rows.Next() { + var x PiyRow + if err := rows.Scan(&x.Code, &x.Title); err == nil { + list = append(list, x) + } + } + + _ = json.NewEncoder(w).Encode(list) + } +} + +// ====================================================== +// 🔗 ROLE → DEPARTMENTS UPDATE +// POST /api/roles/{id}/departments +// body: { "codes": ["D01","D02"] } +// ====================================================== + +type CodesPayload struct { + Codes []string `json:"codes"` +} + +func UpdateRoleDepartmentsHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + roleIDStr := mux.Vars(r)["id"] + roleID, err := strconv.ParseInt(roleIDStr, 10, 64) + if err != nil || roleID <= 0 { + http.Error(w, "Geçersiz role id", http.StatusBadRequest) + return + } + + var payload CodesPayload + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + http.Error(w, "Geçersiz payload", http.StatusBadRequest) + return + } + + tx, err := db.Begin() + if err != nil { + http.Error(w, "Transaction başlatılamadı", http.StatusInternalServerError) + return + } + defer tx.Rollback() + + // reset + if _, err := tx.Exec(queries.DeleteRoleDepartments, roleID); err != nil { + http.Error(w, "Role departments silinemedi", http.StatusInternalServerError) + return + } + + // insert new + for _, code := range payload.Codes { + code = strings.TrimSpace(code) + if code == "" { + continue + } + if _, err := tx.Exec(queries.InsertRoleDepartment, roleID, code); err != nil { + http.Error(w, "Role department eklenemedi", http.StatusInternalServerError) + return + } + } + + if err := tx.Commit(); err != nil { + http.Error(w, "Commit başarısız", http.StatusInternalServerError) + return + } + + _ = json.NewEncoder(w).Encode(map[string]any{"success": true}) + } +} + +// ====================================================== +// 🔗 ROLE → PIYASALAR UPDATE +// POST /api/roles/{id}/piyasalar +// body: { "codes": ["TR","EU"] } (piyasa_code list) +// ====================================================== + +func UpdateRolePiyasalarHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + roleIDStr := mux.Vars(r)["id"] + roleID, err := strconv.ParseInt(roleIDStr, 10, 64) + if err != nil || roleID <= 0 { + http.Error(w, "Geçersiz role id", http.StatusBadRequest) + return + } + + var payload CodesPayload + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + http.Error(w, "Geçersiz payload", http.StatusBadRequest) + return + } + + tx, err := db.Begin() + if err != nil { + http.Error(w, "Transaction başlatılamadı", http.StatusInternalServerError) + return + } + defer tx.Rollback() + + // reset + if _, err := tx.Exec(queries.DeleteRolePiyasalar, roleID); err != nil { + http.Error(w, "Role piyasalar silinemedi", http.StatusInternalServerError) + return + } + + // insert new + for _, code := range payload.Codes { + code = strings.TrimSpace(code) + if code == "" { + continue + } + if _, err := tx.Exec(queries.InsertRolePiyasa, roleID, code); err != nil { + http.Error(w, "Role piyasa eklenemedi", http.StatusInternalServerError) + return + } + } + + if err := tx.Commit(); err != nil { + http.Error(w, "Commit başarısız", http.StatusInternalServerError) + return + } + + _ = json.NewEncoder(w).Encode(map[string]any{"success": true}) + } +} + +// ====================================================== +// 👤 USER → ROLES UPDATE +// POST /api/users/{id}/roles +// body: { "codes": ["admin","user"] } (dfrole.code list) +// ====================================================== + +func UpdateUserRolesHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + // ---------- CLAIMS ---------- + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || !claims.IsAdmin() { + http.Error(w, "forbidden", http.StatusForbidden) + return + } + + // ---------- TARGET USER ---------- + userIDStr := mux.Vars(r)["id"] + userID, err := strconv.ParseInt(userIDStr, 10, 64) + if err != nil || userID <= 0 { + http.Error(w, "Geçersiz user id", http.StatusBadRequest) + return + } + + // ---------- PAYLOAD ---------- + var payload CodesPayload + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + http.Error(w, "Geçersiz payload", http.StatusBadRequest) + return + } + + // ---------- BEFORE (ROLE LIST) ---------- + oldRoles, _ := repository.GetUserRolesByUserID(db, userID) + + // ---------- TX ---------- + tx, err := db.Begin() + if err != nil { + http.Error(w, "Transaction başlatılamadı", http.StatusInternalServerError) + return + } + defer tx.Rollback() + + // reset + if _, err := tx.Exec(queries.DeleteUserRoles, userID); err != nil { + http.Error(w, "User roles silinemedi", http.StatusInternalServerError) + return + } + + // insert new + for _, roleCode := range payload.Codes { + roleCode = strings.TrimSpace(roleCode) + if roleCode == "" { + continue + } + if _, err := tx.Exec(queries.InsertUserRole, userID, roleCode); err != nil { + http.Error(w, "User role eklenemedi", http.StatusInternalServerError) + return + } + } + + if err := tx.Commit(); err != nil { + http.Error(w, "Commit başarısız", http.StatusInternalServerError) + return + } + + // ---------- AFTER (ROLE LIST) ---------- + newRoles, _ := repository.GetUserRolesByUserID(db, userID) + + // ---------- AUDIT ---------- + auditlog.Enqueue(r.Context(), auditlog.ActivityLog{ + ActionType: "role_change", + ActionCategory: "user_admin", + ActionTarget: fmt.Sprintf("/api/users/%d/roles", userID), + Description: "user roles updated", + + Username: claims.Username, + RoleCode: claims.RoleCode, + DfUsrID: int64(claims.ID), + + TargetDfUsrID: userID, + + ChangeBefore: map[string]any{ + "roles": oldRoles, + }, + ChangeAfter: map[string]any{ + "roles": newRoles, + }, + + IsSuccess: true, + }) + + _ = json.NewEncoder(w).Encode(map[string]any{ + "success": true, + }) + } +} diff --git a/svc/routes/order_list_excel.go b/svc/routes/order_list_excel.go new file mode 100644 index 0000000..90ff2a8 --- /dev/null +++ b/svc/routes/order_list_excel.go @@ -0,0 +1,91 @@ +package routes + +import ( + "bssapp-backend/models" + "bssapp-backend/queries" + "database/sql" + "fmt" + "net/http" + "time" + + "github.com/xuri/excelize/v2" +) + +func OrderListExcelRoute(db *sql.DB) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + search := r.URL.Query().Get("search") + currAcc := r.URL.Query().Get("CurrAccCode") + orderDate := r.URL.Query().Get("OrderDate") + + rows, err := queries.GetOrderListExcel(db, search, currAcc, orderDate) + if err != nil { + http.Error(w, "Veritabanı hatası", 500) + return + } + defer rows.Close() + + f := excelize.NewFile() + sheet := "Orders" + f.SetSheetName("Sheet1", sheet) + + headers := []string{ + "Sipariş No", "Tarih", "Cari Kod", "Cari Adı", + "Temsilci", "Piyasa", "Onay Tarihi", "PB", + "Tutar", "Tutar (USD)", "Açıklama", + } + + for i, h := range headers { + cell, _ := excelize.CoordinatesToCellName(i+1, 1) + f.SetCellValue(sheet, cell, h) + } + + rowIdx := 2 + for rows.Next() { + var o models.OrderList + _ = rows.Scan( + &o.OrderHeaderID, + &o.OrderNumber, + &o.OrderDate, + &o.CurrAccCode, + &o.CurrAccDescription, + &o.MusteriTemsilcisi, + &o.Piyasa, + &o.CreditableConfirmedDate, + &o.DocCurrencyCode, + &o.TotalAmount, + &o.TotalAmountUSD, + &o.IsCreditableConfirmed, + &o.Description, + &o.ExchangeRateUSD, + ) + + f.SetSheetRow(sheet, fmt.Sprintf("A%d", rowIdx), &[]interface{}{ + o.OrderNumber, + o.OrderDate, + o.CurrAccCode, + o.CurrAccDescription, + o.MusteriTemsilcisi, + o.Piyasa, + o.CreditableConfirmedDate, + o.DocCurrencyCode, + o.TotalAmount, + o.TotalAmountUSD, + o.Description, + }) + rowIdx++ + } + + filename := fmt.Sprintf( + "order_list_%s.xlsx", + time.Now().Format("2006-01-02_15-04"), + ) + + w.Header().Set("Content-Type", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + w.Header().Set("Content-Disposition", + "attachment; filename="+filename) + + _ = f.Write(w) + }) +} diff --git a/svc/routes/order_pdf.go b/svc/routes/order_pdf.go new file mode 100644 index 0000000..83da361 --- /dev/null +++ b/svc/routes/order_pdf.go @@ -0,0 +1,1387 @@ +package routes + +import ( + "bytes" + "database/sql" + "fmt" + "github.com/gorilla/mux" + "github.com/jung-kurt/gofpdf" + "log" + "math" + "net/http" + "os" + "sort" + "strings" + "time" +) + +/* =========================================================== + 1) SABİTLER / RENKLER / TİPLER + =========================================================== */ + +// Baggi renkleri +var ( + baggiGoldR, baggiGoldG, baggiGoldB = 201, 162, 39 + baggiCreamR, baggiCreamG, baggiCreamB = 255, 254, 249 + baggiGrayBorderR, baggiGrayBorderG, baggiGrayBorderB = 187, 187, 187 +) + +// Beden kategorileri (frontend birebir) +const ( + catAyk = "ayk" + catYas = "yas" + catPan = "pan" + catGom = "gom" + catTak = "tak" + catAksbir = "aksbir" +) + +var categoryOrder = []string{catAyk, catYas, catPan, catGom, catTak, catAksbir} + +var categoryTitle = map[string]string{ + catAyk: " AYAKKABI", + catYas: " YAŞ", + catPan: " PANTOLON", + catGom: " GÖMLEK", + catTak: " TAKIM ELBİSE", + catAksbir: " AKSESUAR", +} + +/* =========================================================== + HEADER MODEL + =========================================================== */ + +type OrderHeader struct { + OrderHeaderID string + OrderNumber string + CurrAccCode string + CurrAccName string + DocCurrency string + OrderDate time.Time + Description string + InternalDesc string + OfficeCode string + CreatedUser string + CustomerRep string // 🆕 Müşteri Temsilcisi +} + +/* =========================================================== + RAW LINE MODEL + =========================================================== */ + +type OrderLineRaw struct { + OrderLineID sql.NullString + ItemCode string + ColorCode string + ItemDim1Code sql.NullString + ItemDim2Code sql.NullString + Qty1 sql.NullFloat64 + Price sql.NullFloat64 + DocCurrencyCode sql.NullString + DeliveryDate sql.NullTime + LineDescription sql.NullString + UrunAnaGrubu sql.NullString + UrunAltGrubu sql.NullString + IsClosed sql.NullBool + WithHoldingTaxType sql.NullString + DOVCode sql.NullString + PlannedDateOfLading sql.NullTime + CostCenterCode sql.NullString + VatCode sql.NullString + VatRate sql.NullFloat64 +} + +/* =========================================================== + PDF SATIR MODELİ + =========================================================== */ + +type PdfRow struct { + Model string + Color string + GroupMain string + GroupSub string + Description string + Category string + SizeQty map[string]int + TotalQty int + Price float64 + Currency string + Amount float64 + Termin string + IsClosed bool + OrderLineIDs map[string]string + + ClosedSizes map[string]bool // 🆕 her beden için IsClosed bilgisi +} + +/* =========================================================== + PDF LAYOUT STRUCT + =========================================================== */ + +type pdfLayout struct { + PageW, PageH float64 + MarginL float64 + MarginR float64 + MarginT float64 + MarginB float64 + + ColModelW float64 + ColRenkW float64 + ColGroupW float64 + ColGroupW2 float64 + ColDescLeft float64 + ColDescRight float64 + ColDescW float64 + ColQtyW float64 + ColPriceW float64 + ColCurW float64 + ColAmountW float64 + ColTerminW float64 + + CentralW float64 + HeaderMainH float64 + HeaderSizeH float64 + RowH float64 +} + +/* genel cell padding */ +const OcellPadX = 2 + +/* +=========================================================== + + PDF LAYOUT OLUŞTURUCU + =========================================================== +*/ + +/* +=========================================================== + + PDF LAYOUT OLUŞTURUCU — AÇIKLAMA TEK KOLON + =========================================================== +*/ +func newPdfLayout(pdf *gofpdf.Fpdf) pdfLayout { + pageW, pageH := pdf.GetPageSize() + + l := pdfLayout{ + PageW: pageW, + PageH: pageH, + MarginL: 10, + MarginR: 10, + MarginT: 10, + MarginB: 12, + + RowH: 7, + HeaderMainH: 8, + HeaderSizeH: 6, + } + + totalW := pageW - l.MarginL - l.MarginR + + /* -------------------------------------------------------- + SOL BLOK GÜNCEL – MODEL/RENK ÇAKIŞMASI GİDERİLDİ + -------------------------------------------------------- */ + l.ColModelW = 24 // eski 18 → genişletildi + l.ColRenkW = 24 // eski 14 → biraz geniş + l.ColGroupW = 20 + l.ColGroupW2 = 20 + + /* -------------------------------------------------------- + AÇIKLAMA = TEK GENİŞ KOLON (kategori listesi + açıklama içerir) + -------------------------------------------------------- */ + l.ColDescLeft = 50 // açıklama başlığı + kategori alanı (artık tek kolon) + l.ColDescRight = 0 // kullanılmıyor (0 bırakılmalı!) + + left := l.ColModelW + l.ColRenkW + l.ColGroupW + l.ColGroupW2 + l.ColDescLeft + + /* -------------------------------------------------------- + SAĞ BLOK + -------------------------------------------------------- */ + l.ColQtyW = 12 + l.ColPriceW = 16 + l.ColCurW = 10 + l.ColAmountW = 20 + l.ColTerminW = 20 + + right := l.ColQtyW + l.ColPriceW + l.ColCurW + l.ColAmountW + l.ColTerminW + + /* -------------------------------------------------------- + ORTA BLOK (BEDEN 16 KOLON) + -------------------------------------------------------- */ + l.CentralW = totalW - left - right + if l.CentralW < 70 { + l.CentralW = 70 + } + + return l +} + +/* =========================================================== + HELPER FONKSİYONLAR + =========================================================== */ + +func safeTrimUpper(s string) string { + return strings.ToUpper(strings.TrimSpace(s)) +} + +func f64(v sql.NullFloat64) float64 { + if !v.Valid { + return 0 + } + return v.Float64 +} + +func s64(v sql.NullString) string { + if !v.Valid { + return "" + } + return v.String +} + +func normalizeBedenLabelGo(v string) string { + // 1️⃣ NULL / boş / whitespace → " " (aksbir null kolonu) + s := strings.TrimSpace(v) + if s == "" { + return " " // 🔥 NULL BEDEN → boş kolon + } + + // 2️⃣ Uppercase + s = strings.ToUpper(s) + + /* -------------------------------------------------- + 🔥 AKSBİR ÖZEL (STD eş anlamlıları) + -------------------------------------------------- */ + switch s { + case "STD", "STANDART", "STANDARD", "ONE SIZE", "ONESIZE": + return "STD" + } + + /* -------------------------------------------------- + 🔢 SADECE "CM" VARSA → NUMERİK KISMI AL + 120CM / 120 CM → 120 + ❌ 105 / 110 / 120 → DOKUNMA + -------------------------------------------------- */ + if strings.HasSuffix(s, "CM") { + num := strings.TrimSpace(strings.TrimSuffix(s, "CM")) + if num != "" { + return num + } + } + + /* -------------------------------------------------- + HARF BEDENLER (DOKUNMA) + -------------------------------------------------- */ + switch s { + case "XS", "S", "M", "L", "XL", + "2XL", "3XL", "4XL", "5XL", "6XL", "7XL": + return s + } + + // 4️⃣ Sayısal veya başka değerler → olduğu gibi + return s +} + +func detectBedenGroupGo(bedenList []string, ana, alt string) string { + ana = safeTrimUpper(ana) + alt = safeTrimUpper(alt) + + for _, b := range bedenList { + switch b { + case "XS", "S", "M", "L", "XL": + return catGom + } + } + + if strings.Contains(ana, "PANTOLON") { + return catPan + } + if strings.Contains(alt, "ÇOCUK") || strings.Contains(alt, "GARSON") { + return catYas + } + return catTak +} +func defaultSizeListFor(cat string) []string { + switch cat { + case catAyk: + return []string{"39", "40", "41", "42", "43", "44", "45"} + case catYas: + return []string{"2", "4", "6", "8", "10", "12", "14"} + case catPan: + return []string{"38", "40", "42", "44", "46", "48", "50", "52", "54", "56", "58", "60", "62", "64", "66", "68"} + case catGom: + return []string{"XS", "S", "M", "L", "XL", "2XL", "3XL", "4XL", "5XL", "6XL", "7XL"} + case catTak: + return []string{"44", "46", "48", "50", "52", "54", "56", "58", "60", "62", "64", "66", "68", "70", "72", "74"} + case catAksbir: + return []string{"", "44", "STD", "110", "115", "120", "125", "130", "135"} + } + return []string{} +} + +func contains(list []string, v string) bool { + for _, x := range list { + if x == v { + return true + } + } + return false +} + +/* =========================================================== + 2) PDF OLUŞTURUCU (A4 YATAY + FOOTER) + =========================================================== */ + +func newOrderPdf() *gofpdf.Fpdf { + pdf := gofpdf.New("L", "mm", "A4", "") + pdf.SetMargins(10, 10, 10) + pdf.SetAutoPageBreak(false, 12) + + // UTF8 fontlar + pdf.AddUTF8Font("dejavu", "", "fonts/DejaVuSans.ttf") + pdf.AddUTF8Font("dejavu-b", "", "fonts/DejaVuSans-Bold.ttf") + + // Footer: sayfa numarası + pdf.AliasNbPages("") + pdf.SetFooterFunc(func() { + pdf.SetY(-10) + pdf.SetFont("dejavu", "", 8) + txt := fmt.Sprintf("Sayfa %d/{nb}", pdf.PageNo()) + pdf.CellFormat(0, 10, txt, "", 0, "R", false, 0, "") + }) + + return pdf +} + +/* =========================================================== + 3) DB FONKSİYONLARI (HEADER + LINES) + =========================================================== */ + +// HEADER +func getOrderHeaderFromDB(db *sql.DB, orderID string) (*OrderHeader, error) { + row := db.QueryRow(` + SELECT + CAST(h.OrderHeaderID AS varchar(36)), + h.OrderNumber, + h.CurrAccCode, + d.CurrAccDescription, + h.DocCurrencyCode, + h.OrderDate, + h.Description, + h.InternalDescription, + h.OfficeCode, + h.CreatedUserName, + ISNULL(( + SELECT TOP (1) ca.AttributeDescription + FROM BAGGI_V3.dbo.cdCurrAccAttributeDesc AS ca WITH (NOLOCK) + WHERE ca.CurrAccTypeCode = 3 + AND ca.AttributeTypeCode = 2 -- 🟡 Müşteri Temsilcisi + AND ca.AttributeCode = f.CustomerAtt02 + AND ca.LangCode = 'TR' + ), '') AS CustomerRep + FROM BAGGI_V3.dbo.trOrderHeader AS h + LEFT JOIN BAGGI_V3.dbo.cdCurrAccDesc AS d + ON h.CurrAccCode = d.CurrAccCode + LEFT JOIN BAGGI_V3.dbo.CustomerAttributesFilter AS f + ON h.CurrAccCode = f.CurrAccCode + WHERE h.OrderHeaderID = @p1 + `, orderID) + + var h OrderHeader + var orderDate sql.NullTime + + err := row.Scan( + &h.OrderHeaderID, + &h.OrderNumber, + &h.CurrAccCode, + &h.CurrAccName, + &h.DocCurrency, + &orderDate, + &h.Description, + &h.InternalDesc, + &h.OfficeCode, + &h.CreatedUser, + &h.CustomerRep, // 🆕 buradan geliyor + ) + if err != nil { + return nil, err + } + + if orderDate.Valid { + h.OrderDate = orderDate.Time + } + return &h, nil +} + +// LINES +func getOrderLinesFromDB(db *sql.DB, orderID string) ([]OrderLineRaw, error) { + rows, err := db.Query(` + SELECT + CAST(L.OrderLineID AS varchar(36)), + L.ItemCode, + L.ColorCode, + L.ItemDim1Code, + L.ItemDim2Code, + L.Qty1, + L.Price, + L.DocCurrencyCode, + L.DeliveryDate, + L.LineDescription, + P.ProductAtt01Desc, + P.ProductAtt02Desc, + L.IsClosed, + L.WithHoldingTaxTypeCode, + L.DOVCode, + L.PlannedDateOfLading, + L.CostCenterCode, + L.VatCode, + L.VatRate + FROM BAGGI_V3.dbo.trOrderLine AS L + LEFT JOIN ProductFilterWithDescription('TR') AS P + ON LTRIM(RTRIM(P.ProductCode)) = LTRIM(RTRIM(L.ItemCode)) + WHERE L.OrderHeaderID = @p1 + ORDER BY L.SortOrder, L.OrderLineID + `, orderID) + + if err != nil { + return nil, err + } + defer rows.Close() + + var out []OrderLineRaw + for rows.Next() { + var l OrderLineRaw + if err := rows.Scan( + &l.OrderLineID, + &l.ItemCode, + &l.ColorCode, + &l.ItemDim1Code, + &l.ItemDim2Code, + &l.Qty1, + &l.Price, + &l.DocCurrencyCode, + &l.DeliveryDate, + &l.LineDescription, + &l.UrunAnaGrubu, + &l.UrunAltGrubu, + &l.IsClosed, + &l.WithHoldingTaxType, + &l.DOVCode, + &l.PlannedDateOfLading, + &l.CostCenterCode, + &l.VatCode, + &l.VatRate, + ); err != nil { + return nil, err + } + out = append(out, l) + } + return out, rows.Err() +} + +/* =========================================================== + 4) NORMALIZE + CATEGORY MAP + =========================================================== */ + +func normalizeOrderLinesForPdf(lines []OrderLineRaw) []PdfRow { + type comboKey struct { + Model, Color, Color2 string + } + + merged := make(map[comboKey]*PdfRow) + + for _, raw := range lines { + + // ❌ ARTIK KAPALI SATIRLARI ATMAYACAĞIZ + // if raw.IsClosed.Valid && raw.IsClosed.Bool { + // continue + // } + + model := safeTrimUpper(raw.ItemCode) + color := safeTrimUpper(raw.ColorCode) + color2 := safeTrimUpper(s64(raw.ItemDim2Code)) + displayColor := color + if color2 != "" { + displayColor = fmt.Sprintf("%s-%s", color, color2) + } + + key := comboKey{model, color, color2} + + if _, ok := merged[key]; !ok { + merged[key] = &PdfRow{ + Model: model, + Color: displayColor, + GroupMain: s64(raw.UrunAnaGrubu), + GroupSub: s64(raw.UrunAltGrubu), + Description: s64(raw.LineDescription), + SizeQty: make(map[string]int), + Currency: s64(raw.DocCurrencyCode), + Price: f64(raw.Price), + OrderLineIDs: make(map[string]string), + ClosedSizes: make(map[string]bool), // 🆕 + } + } + row := merged[key] + + // beden + rawBeden := s64(raw.ItemDim1Code) + if raw.ItemDim1Code.Valid { + rawBeden = raw.ItemDim1Code.String + } + normalized := normalizeBedenLabelGo(rawBeden) + + qty := int(math.Round(f64(raw.Qty1))) + if qty > 0 { + row.SizeQty[normalized] += qty + row.TotalQty += qty + + // 🆕 Bu beden kapalı satırdan geldiyse işaretle + if raw.IsClosed.Valid && raw.IsClosed.Bool { + row.ClosedSizes[normalized] = true + } + } + + // OrderLineID eşleştirmesi + if raw.OrderLineID.Valid { + row.OrderLineIDs[normalized] = raw.OrderLineID.String + } + + // Termin + if row.Termin == "" && raw.DeliveryDate.Valid { + row.Termin = raw.DeliveryDate.Time.Format("02.01.2006") + } + } + + // finalize + out := make([]PdfRow, 0, len(merged)) + for _, r := range merged { + var sizes []string + for s := range r.SizeQty { + sizes = append(sizes, s) + } + r.Category = detectBedenGroupGo(sizes, r.GroupMain, r.GroupSub) + r.Amount = float64(r.TotalQty) * r.Price + out = append(out, *r) + } + + // Sıralama: Model → Renk → Category + sort.Slice(out, func(i, j int) bool { + if out[i].Model != out[j].Model { + return out[i].Model < out[j].Model + } + if out[i].Color != out[j].Color { + return out[i].Color < out[j].Color + } + return out[i].Category < out[j].Category + }) + + return out +} + +/* =========================================================== + 5) CATEGORY → SIZE MAP (HEADER İÇİN) + =========================================================== */ + +type CategorySizeMap map[string][]string + +// kategori beden map (global – TÜM GRİD İÇİN TEK HEADER) +func buildCategorySizeMap(rows []PdfRow) CategorySizeMap { + cm := make(CategorySizeMap) + + // Her kategori için sabit default listeleri kullan + for _, cat := range categoryOrder { + base := defaultSizeListFor(cat) + if len(base) > 0 { + cm[cat] = append([]string{}, base...) + } + } + + // İstersen ekstra bedenler varsa ekle (opsiyonel) + for _, r := range rows { + c := r.Category + if c == "" { + c = catTak + } + if _, ok := cm[c]; !ok { + cm[c] = []string{} + } + for size := range r.SizeQty { + if !contains(cm[c], size) { + cm[c] = append(cm[c], size) + } + } + } + + return cm +} + +/* =========================================================== + ORDER HEADER (Logo + Gold Label + Sağ Bilgi Kutusu) + =========================================================== */ + +func drawOrderHeader(pdf *gofpdf.Fpdf, h *OrderHeader, showDesc bool) float64 { + pageW, _ := pdf.GetPageSize() + marginL := 10.0 + y := 8.0 + + /* ---------------------------------------------------- + 1) LOGO + ---------------------------------------------------- */ + logo := "./public/Baggi-Tekstil-A.s-Logolu.jpeg" + if _, err := os.Stat(logo); err == nil { + pdf.ImageOptions(logo, marginL, y, 32, 0, false, gofpdf.ImageOptions{}, 0, "") + } + + /* ---------------------------------------------------- + 2) ALTIN BAŞLIK BAR + ---------------------------------------------------- */ + titleW := 150.0 + titleX := marginL + 40 + titleY := y + 2 + + pdf.SetFillColor(149, 113, 22) // Baggi altın + pdf.Rect(titleX, titleY, titleW, 10, "F") + + pdf.SetFont("dejavu-b", "", 13) + pdf.SetTextColor(255, 255, 255) + pdf.SetXY(titleX+4, titleY+2) + pdf.CellFormat(titleW-8, 6, "BAGGI TEKSTİL - SİPARİŞ FORMU", "", 0, "L", false, 0, "") + + /* ---------------------------------------------------- + 3) SAĞ TARAF BİLGİ KUTUSU + ---------------------------------------------------- */ + boxW := 78.0 + boxH := 30.0 + boxX := pageW - marginL - boxW + boxY := y - 2 + + pdf.SetDrawColor(180, 180, 180) + pdf.Rect(boxX, boxY, boxW, boxH, "") + + pdf.SetFont("dejavu-b", "", 9) + pdf.SetTextColor(149, 113, 22) + rep := strings.TrimSpace(h.CustomerRep) + if rep == "" { + rep = strings.TrimSpace(h.CreatedUser) + } + + info := []string{ + "Formun Basılma Tarihi: " + time.Now().Format("02.01.2006"), + "Sipariş Tarihi: " + h.OrderDate.Format("02.01.2006"), + "Sipariş No: " + h.OrderNumber, + "Müşteri Temsilcisi: " + rep, // 🔥 YENİ EKLENDİ + "Cari Kod: " + h.CurrAccCode, + "Müşteri: " + h.CurrAccName, + } + + iy := boxY + 3 + for _, line := range info { + pdf.SetXY(boxX+3, iy) + pdf.CellFormat(boxW-6, 4.5, line, "", 0, "L", false, 0, "") + iy += 4.5 + } + + /* ---------------------------------------------------- + 4) ALT AYIRICI ÇİZGİ + ---------------------------------------------------- */ + lineY := boxY + boxH + 3 + pdf.SetDrawColor(120, 120, 120) + pdf.Line(marginL, lineY, pageW-marginL, lineY) + pdf.SetDrawColor(200, 200, 200) + + y = lineY + 4 + + /* ---------------------------------------------------- + 5) AÇIKLAMA (Varsa) + ---------------------------------------------------- */ + if showDesc && strings.TrimSpace(h.Description) != "" { + text := strings.TrimSpace(h.Description) + + pdf.SetFont("dejavu", "", 8) // wrap’te kullanılacak font + lineH := 4.0 + textW := pageW - marginL*2 - 52 + + // Kaç satır olacağını hesapla + lines := pdf.SplitLines([]byte(text), textW) + descBoxH := float64(len(lines))*lineH + 4 // min boşluk + + if descBoxH < 10 { + descBoxH = 10 + } + + pdf.SetDrawColor(210, 210, 210) + pdf.Rect(marginL, y, pageW-marginL*2, descBoxH, "") + + // Başlık + pdf.SetFont("dejavu-b", "", 8) + pdf.SetTextColor(149, 113, 22) + pdf.SetXY(marginL+3, y+2) + pdf.CellFormat(40, 4, "Sipariş Genel Açıklaması:", "", 0, "L", false, 0, "") + + // Metin + pdf.SetFont("dejavu", "", 8) + pdf.SetTextColor(30, 30, 30) + pdf.SetXY(marginL+48, y+2) + pdf.MultiCell(textW, lineH, text, "", "L", false) + + y += descBoxH + 3 + } + + return y +} + +/* =========================================================== + GRID HEADER — 2 katmanlı + 16 beden kolonlu + =========================================================== */ + +/* +=========================================================== + + GRID HEADER — AÇIKLAMA içinde kategori listesi + 16 beden kolonu + =========================================================== +*/ +func drawGridHeader(pdf *gofpdf.Fpdf, layout pdfLayout, startY float64, catSizes CategorySizeMap) float64 { + pdf.SetFont("dejavu-b", "", 6) + pdf.SetDrawColor(baggiGrayBorderR, baggiGrayBorderG, baggiGrayBorderB) + pdf.SetFillColor(baggiCreamR, baggiCreamG, baggiCreamB) + pdf.SetTextColor(20, 20, 20) // 🟣 TÜM HEADER YAZILARI SİYAH + + y := startY + x := layout.MarginL + + totalHeaderH := float64(len(categoryOrder)) * layout.HeaderSizeH + + centerLabel := func(h float64) float64 { + return y + (h/2.0 - 3) + } + + /* ---------------------------------------------------- + SOL BLOK (Model – Renk – Grup1 – Grup2) + ---------------------------------------------------- */ + cols := []struct { + w float64 + t string + }{ + {layout.ColModelW, "MODEL"}, + {layout.ColRenkW, "RENK"}, + {layout.ColGroupW, "ÜRÜN ANA"}, + {layout.ColGroupW2, "ÜRÜN ALT"}, + } + + for _, c := range cols { + pdf.Rect(x, y, c.w, totalHeaderH, "DF") + pdf.SetXY(x, centerLabel(totalHeaderH)) + pdf.CellFormat(c.w, 6, c.t, "", 0, "C", false, 0, "") + x += c.w + } + + /* ---------------------------------------------------- + AÇIKLAMA BAŞLIĞI — TEK HÜCRE & DİKEY ORTALAMA + ---------------------------------------------------- */ + descX := x + descW := layout.ColDescLeft + + pdf.Rect(descX, y, descW, totalHeaderH, "DF") + + // AÇIKLAMA yazısı ortalanacak + pdf.SetXY(descX, y+(totalHeaderH/2-3)) + pdf.CellFormat(descW, 6, "AÇIKLAMA", "", 0, "C", false, 0, "") + + /* ---------------------------------------------------- + AÇIKLAMA sağında kategori listesi dikey şekilde + ---------------------------------------------------- */ + catX := descX + 1 + catY := y + 2 + + pdf.SetFont("dejavu", "", 6.2) + for _, cat := range categoryOrder { + label := categoryTitle[cat] + pdf.SetXY(catX+2, catY) + pdf.CellFormat(descW-4, 4.8, label, "", 0, "L", false, 0, "") + catY += layout.HeaderSizeH + } + + /* ---------------------------------------------------- + 16’lı BEDEN BLOĞU + ---------------------------------------------------- */ + x = descX + descW + colW := layout.CentralW / 16.0 + + cy := y + + for _, cat := range categoryOrder { + + // Arka plan + pdf.SetFillColor(baggiCreamR, baggiCreamG, baggiCreamB) + pdf.Rect(x, cy, layout.CentralW, layout.HeaderSizeH, "DF") + + sizes := catSizes[cat] + if len(sizes) == 0 { + sizes = defaultSizeListFor(cat) + } + if cat == catAksbir { + pdf.SetFont("dejavu", "", 5) // sadece aksesuar için küçük font + } else { + pdf.SetFont("dejavu", "", 6) // diğer tüm kategoriler normal font + } + + xx := x + for i := 0; i < 16; i++ { + pdf.Rect(xx, cy, colW, layout.HeaderSizeH, "") + if i < len(sizes) { + pdf.SetXY(xx, cy+1) + pdf.CellFormat(colW, layout.HeaderSizeH-2, sizes[i], "", 0, "C", false, 0, "") + } + xx += colW + } + + cy += layout.HeaderSizeH + } + + /* ---------------------------------------------------- + SAĞ BLOK (ADET – FİYAT – PB – TUTAR – TERMİN) + ---------------------------------------------------- */ + rightX := x + 16*colW + + rightCols := []struct { + w float64 + t string + }{ + {layout.ColQtyW, "ADET"}, + {layout.ColPriceW, "FİYAT"}, + {layout.ColCurW, "PB"}, + {layout.ColAmountW, "TUTAR"}, + {layout.ColTerminW, "TERMİN"}, + } + + for _, c := range rightCols { + pdf.Rect(rightX, y, c.w, totalHeaderH, "DF") + pdf.SetXY(rightX, centerLabel(totalHeaderH)) + pdf.CellFormat(c.w, 6, c.t, "", 0, "C", false, 0, "") + rightX += c.w + } + + return y + totalHeaderH +} + +/* =========================================================== + AÇIKLAMA WRAP + DİNAMİK SATIR YÜKSEKLİĞİ + =========================================================== */ + +// Açıklama kolonunu çok satırlı yazan helper +func drawWrappedCell(pdf *gofpdf.Fpdf, text string, x, y, w, h float64) { + txt := strings.TrimSpace(text) + if txt == "" { + return + } + + lineH := 3.2 + lines := pdf.SplitLines([]byte(txt), w-2*OcellPadX) + cy := y + 1 + + for _, ln := range lines { + if cy+lineH > y+h { + break + } + pdf.SetXY(x+OcellPadX, cy) + pdf.CellFormat(w-2*OcellPadX, lineH, string(ln), "", 0, "L", false, 0, "") + cy += lineH + } +} + +// Açıklamaya göre satır yüksekliği hesaplar +func calcRowHeight(pdf *gofpdf.Fpdf, layout pdfLayout, row PdfRow) float64 { + base := layout.RowH + desc := strings.TrimSpace(row.Description) + if desc == "" { + return base + } + + // Yeni: açıklama genişliği = sol + sağ + descW := layout.ColDescW + + lines := pdf.SplitLines([]byte(desc), descW-2*OcellPadX) + lineH := 3.2 + h := float64(len(lines))*lineH + 2 + + if h < base { + h = base + } + return h +} + +/* =========================================================== + SATIR ÇİZİMİ — 16 kolonlu beden dizilimi (sola yaslı) + =========================================================== */ + +/* +=========================================================== + + SATIR ÇİZİMİ — Tek açıklama sütunu + 16 beden kolonu + =========================================================== +*/ +func drawPdfRow(pdf *gofpdf.Fpdf, layout pdfLayout, y float64, row PdfRow, catSizes CategorySizeMap, rowH float64) float64 { + + pdf.SetFont("dejavu", "", 7) + pdf.SetDrawColor(200, 200, 200) + pdf.SetLineWidth(0.15) + pdf.SetTextColor(0, 0, 0) + + x := layout.MarginL + h := rowH + + centerY := func() float64 { + return y + (h-3.5)/2 + } + + /* ---------------------------------------------------- + 1) SOL BLOK + MODEL – RENK – ÜRÜN ANA – ÜRÜN ALT + ---------------------------------------------------- */ + + cols := []struct { + w float64 + v string + }{ + {layout.ColModelW, row.Model}, + {layout.ColRenkW, row.Color}, + {layout.ColGroupW, row.GroupMain}, + {layout.ColGroupW2, row.GroupSub}, + } + + for _, c := range cols { + pdf.Rect(x, y, c.w, h, "") + pdf.SetXY(x+1.3, centerY()) + pdf.CellFormat(c.w-2.6, 3.5, c.v, "", 0, "L", false, 0, "") + x += c.w + } + + /* ---------------------------------------------------- + 2) AÇIKLAMA (TEK BÜYÜK KOLON) + ---------------------------------------------------- */ + + descW := layout.ColDescLeft // açıklama = sadece sol kolon + + pdf.Rect(x, y, descW, h, "") + drawWrappedCell(pdf, row.Description, x, y, descW, h) + + x += descW + + /* ---------------------------------------------------- + 3) 16 BEDEN KOLONU + ---------------------------------------------------- */ + + colW := layout.CentralW / 16.0 + + // kategorinin beden listesi + sizes := catSizes[row.Category] + + if len(sizes) == 0 { + tmp := make([]string, 0, len(row.SizeQty)) + for s := range row.SizeQty { + tmp = append(tmp, s) + } + sort.Strings(tmp) + sizes = tmp + } + + xx := x + for i := 0; i < 16; i++ { + if i < len(sizes) { + lbl := sizes[i] + + if q, ok := row.SizeQty[lbl]; ok && q > 0 { + // 🔍 Bu beden kapalı mı? + isClosedSize := row.ClosedSizes != nil && row.ClosedSizes[lbl] + + if isClosedSize { + // Gri dolgu + beyaz yazı + pdf.SetFillColor(220, 220, 220) // açık gri zemin + pdf.Rect(xx, y, colW, h, "DF") // doldurulmuş hücre + pdf.SetTextColor(255, 255, 255) // beyaz text + } else { + // Normal hücre: sadece border + pdf.Rect(xx, y, colW, h, "") + pdf.SetTextColor(0, 0, 0) // siyah text + } + + pdf.SetXY(xx, centerY()) + pdf.CellFormat(colW, 3.5, fmt.Sprintf("%d", q), "", 0, "C", false, 0, "") + + // Sonraki işler için text rengini resetle + if isClosedSize { + pdf.SetTextColor(0, 0, 0) + } + } else { + // Bu beden kolonunda quantity yoksa normal boş hücre + pdf.Rect(xx, y, colW, h, "") + } + } else { + // 16 kolonun kalanları (header'da var ama bu kategoride kullanılmayan bedenler) + pdf.Rect(xx, y, colW, h, "") + } + + xx += colW + } + x = xx + + /* ---------------------------------------------------- + 4) SAĞ BLOK: ADET – FİYAT – PB – TUTAR – TERMİN + ---------------------------------------------------- */ + + rightCols := []struct { + w float64 + v string + alg string + }{ + {layout.ColQtyW, fmt.Sprintf("%d", row.TotalQty), "C"}, + {layout.ColPriceW, fmt.Sprintf("%.2f", row.Price), "R"}, + {layout.ColCurW, row.Currency, "C"}, + {layout.ColAmountW, fmt.Sprintf("%.2f", row.Amount), "R"}, + {layout.ColTerminW, row.Termin, "C"}, + } + + for _, c := range rightCols { + pdf.Rect(x, y, c.w, h, "") + pdf.SetXY(x+0.6, centerY()) + pdf.CellFormat(c.w-1.2, 3.5, c.v, "", 0, c.alg, false, 0, "") + x += c.w + } + + return y + h +} + +/* =========================================================== + FORMATLAYICI: TR PARA BİÇİMİ (1.234.567,89) + =========================================================== */ +/* =========================================================== + TOPLAM TUTAR / KDV / KDV DAHİL TOPLAM KUTUSU + (Sipariş Genel Açıklaması ile grid header arasında) +=========================================================== */ + +/* =========================================================== + PREMIUM BAGGI GOLD TOTALS BOX + (Sipariş Açıklaması ile Grid Header arasındaki kutu) +=========================================================== */ + +func drawTotalsBox( + pdf *gofpdf.Fpdf, + layout pdfLayout, + startY float64, + subtotal float64, + hasVat bool, + vatRate float64, + vatAmount float64, + totalWithVat float64, + currency string, +) float64 { + + x := layout.MarginL + w := layout.PageW - layout.MarginL - layout.MarginR + + lineH := 6.0 + rows := 1 + if hasVat { + rows = 3 + } + + boxH := float64(rows)*lineH + 5 + + /* ---------------------------------------------------- + ARKA PLAN + ALTIN ÇERÇEVE + ---------------------------------------------------- */ + pdf.SetFillColor(255, 253, 245) // yumuşak krem + pdf.SetDrawColor(149, 113, 22) // Baggi gold + pdf.SetLineWidth(0.4) + pdf.Rect(x, startY, w, boxH, "DF") + + /* ---------------------------------------------------- + Genel metin stilleri + ---------------------------------------------------- */ + labelX := x + 4 + valueX := x + w - 70 // değerlerin sağda hizalanacağı kolon + + pdf.SetTextColor(149, 113, 22) // Sol başlık gold + pdf.SetFont("dejavu-b", "", 8.5) + + y := startY + 2 + + /* ---------------------------------------------------- + 1️⃣ TOPLAM TUTAR + ---------------------------------------------------- */ + pdf.SetXY(labelX, y) + pdf.CellFormat(80, lineH, "TOPLAM TUTAR", "", 0, "L", false, 0, "") + + pdf.SetTextColor(201, 162, 39) + pdf.SetFont("dejavu-b", "", 9) + + pdf.SetXY(valueX, y) + pdf.CellFormat(65, lineH, + fmt.Sprintf("%s %s", formatCurrencyTR(subtotal), currency), + "", 0, "R", false, 0, "") + + y += lineH + + /* ---------------------------------------------------- + 2️⃣ KDV (opsiyonel) + ---------------------------------------------------- */ + if hasVat { + + pdf.SetTextColor(149, 113, 22) // gold başlık + pdf.SetFont("dejavu-b", "", 8.5) + + pdf.SetXY(labelX, y) + pdf.CellFormat(80, lineH, + fmt.Sprintf("KDV (%%%g)", vatRate), + "", 0, "L", false, 0, "") + + pdf.SetTextColor(20, 20, 20) + pdf.SetFont("dejavu-b", "", 9) + + pdf.SetXY(valueX, y) + pdf.CellFormat(65, lineH, + fmt.Sprintf("%s %s", formatCurrencyTR(vatAmount), currency), + "", 0, "R", false, 0, "") + + y += lineH + + /* ---------------------------------------------------- + 3️⃣ KDV DAHİL TOPLAM + ---------------------------------------------------- */ + pdf.SetTextColor(201, 162, 39) + pdf.SetFont("dejavu-b", "", 8.5) + + pdf.SetXY(labelX, y) + pdf.CellFormat(80, lineH, "KDV DAHİL TOPLAM TUTAR", "", 0, "L", false, 0, "") + + pdf.SetTextColor(20, 20, 20) + pdf.SetFont("dejavu-b", "", 9) + + pdf.SetXY(valueX, y) + pdf.CellFormat(65, lineH, + fmt.Sprintf("%s %s", formatCurrencyTR(totalWithVat), currency), + "", 0, "R", false, 0, "") + } + + /* ---------------------------------------------------- + Kutu altı boşluk + ---------------------------------------------------- */ + return startY + boxH + 4 +} + +/* =========================================================== + GRUP TOPLAM BAR (Frontend tarzı sarı bar) + =========================================================== */ + +func drawGroupSummaryBar(pdf *gofpdf.Fpdf, layout pdfLayout, groupName string, totalQty int, totalAmount float64, currency string) float64 { + y := pdf.GetY() + x := layout.MarginL + w := layout.PageW - layout.MarginL - layout.MarginR + h := 7.0 + + // Açık sarı zemin + pdf.SetFillColor(255, 249, 205) // #fff9cd benzeri + pdf.SetDrawColor(214, 192, 106) + pdf.Rect(x, y, w, h, "DF") + + pdf.SetFont("dejavu-b", "", 8.5) + pdf.SetTextColor(20, 20, 20) + + leftTxt := strings.ToUpper(strings.TrimSpace(groupName)) + if leftTxt == "" { + leftTxt = "GENEL" + } + pdf.SetXY(x+2, y+1.2) + pdf.CellFormat(w*0.40, h-2.4, leftTxt, "", 0, "L", false, 0, "") + + rightTxt := fmt.Sprintf( + "TOPLAM %s ADET: %d TOPLAM %s TUTAR: %s %s", + leftTxt, totalQty, + leftTxt, formatCurrencyTR(totalAmount), currency, + ) + + pdf.SetXY(x+w*0.35, y+1.2) + pdf.CellFormat(w*0.60-2, h-2.4, rightTxt, "", 0, "R", false, 0, "") + + // reset + pdf.SetTextColor(0, 0, 0) + pdf.SetDrawColor(201, 162, 39) + + pdf.SetY(y + h) + return y + h +} + +/* =========================================================== + MULTIPAGE RENDER ENGINE (Header + GridHeader + Rows) + =========================================================== */ + +func renderOrderGrid(pdf *gofpdf.Fpdf, header *OrderHeader, rows []PdfRow, hasVat bool, vatRate float64) { + layout := newPdfLayout(pdf) + catSizes := buildCategorySizeMap(rows) + + // Grup: ÜRÜN ANA GRUBU + type group struct { + Name string + Rows []PdfRow + Adet int + Tutar float64 + } + + groups := map[string]*group{} + var order []string + + for _, r := range rows { + name := strings.TrimSpace(r.GroupMain) + if name == "" { + name = "GENEL" + } + g, ok := groups[name] + if !ok { + g = &group{Name: name} + groups[name] = g + order = append(order, name) + } + g.Rows = append(g.Rows, r) + g.Adet += r.TotalQty + g.Tutar += r.Amount + } + + groupSummaryH := 7.0 + + // 🔹 Genel toplam (grid içindeki satırlardan) + var subtotal float64 + for _, r := range rows { + subtotal += r.Amount + } + + // 🔹 KDV hesapla (hasVat ve vatRate, OrderPDFHandler'dan geliyor) + var vatAmount float64 + totalWithVat := subtotal + + if hasVat && vatRate > 0 { + vatAmount = subtotal * vatRate / 100.0 + totalWithVat = subtotal + vatAmount + } + + var y float64 + firstPage := true + + newPage := func(showDesc bool, showTotals bool) { + pdf.AddPage() + // Üst header (logo + sağ kutu + genel açıklama) + y = drawOrderHeader(pdf, header, showDesc) + + // 🔸 İlk sayfada, header ile grid arasında TOPLAM kutusu + if showTotals { + y = drawTotalsBox( + pdf, + layout, + y, + subtotal, + hasVat, + vatRate, + vatAmount, + totalWithVat, + header.DocCurrency, + ) + } + + // Grid header + y = drawGridHeader(pdf, layout, y, catSizes) + y += 1 + } + + // İlk sayfa: açıklama + toplam kutusu + newPage(firstPage, true) + firstPage = false + + for _, name := range order { + g := groups[name] + + for _, row := range g.Rows { + rh := calcRowHeight(pdf, layout, row) + + if y+rh+groupSummaryH+2 > layout.PageH-layout.MarginB { + // Sonraki sayfalarda: açıklama yok, toplam kutusu yok + newPage(false, false) + } + y = drawPdfRow(pdf, layout, y, row, catSizes, rh) + pdf.SetY(y) // 🔹 satırın altına imleci getir + } + + // Grup toplam barı için yer kontrolü + if y+groupSummaryH+2 > layout.PageH-layout.MarginB { + newPage(false, false) + } + y = drawGroupSummaryBar(pdf, layout, g.Name, g.Adet, g.Tutar, header.DocCurrency) + y += 1 + } + + // ⚠️ Eski alttaki "Genel Toplam" yazdırma kaldırıldı; toplam kutusu artık üstte. +} + +/* =========================================================== + HTTP HANDLER → /api/order/pdf/{id} + =========================================================== */ + +func OrderPDFHandler(db *sql.DB) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + orderID := mux.Vars(r)["id"] + if orderID == "" { + http.Error(w, "missing order id", http.StatusBadRequest) + return + } + if db == nil { + http.Error(w, "db not initialized", http.StatusInternalServerError) + return + } + + // Header + header, err := getOrderHeaderFromDB(db, orderID) + if err != nil { + log.Println("header error:", err) + http.Error(w, "header not found", http.StatusInternalServerError) + return + } + + // Lines + lines, err := getOrderLinesFromDB(db, orderID) + if err != nil { + log.Println("lines error:", err) + http.Error(w, "lines not found", http.StatusInternalServerError) + return + } + // 🔹 Satırlardan KDV bilgisi yakala (ilk pozitif orana göre) + hasVat := false + var vatRate float64 + + for _, l := range lines { + if l.VatRate.Valid && l.VatRate.Float64 > 0 { + hasVat = true + vatRate = l.VatRate.Float64 + break + } + } + + // Normalize + rows := normalizeOrderLinesForPdf(lines) + + // PDF + pdf := newOrderPdf() + renderOrderGrid(pdf, header, rows, hasVat, vatRate) + + var buf bytes.Buffer + if err := pdf.Output(&buf); err != nil { + http.Error(w, "pdf output error: "+err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/pdf") + w.Header().Set( + "Content-Disposition", + fmt.Sprintf("inline; filename=\"ORDER_%s.pdf\"", header.OrderNumber), + ) + w.WriteHeader(http.StatusOK) + _, _ = w.Write(buf.Bytes()) + }) +} diff --git a/svc/routes/order_validate.go b/svc/routes/order_validate.go new file mode 100644 index 0000000..aa93ded --- /dev/null +++ b/svc/routes/order_validate.go @@ -0,0 +1,45 @@ +package routes + +import ( + "bssapp-backend/models" + "bssapp-backend/queries" + "database/sql" + "encoding/json" + "fmt" + "net/http" +) + +type validateOrderRequest struct { + Header models.OrderHeader `json:"header"` + Lines []models.OrderDetail `json:"lines"` +} + +type validateOrderResponse struct { + OK bool `json:"ok"` + Invalid []models.InvalidVariant `json:"invalid"` +} + +func ValidateOrderHandler(mssql *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + var req validateOrderRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, fmt.Sprintf("JSON parse hatası: %v", err), http.StatusBadRequest) + return + } + + invalid, err := queries.ValidateOrderVariants(mssql, req.Lines) + if err != nil { + http.Error(w, fmt.Sprintf("Validate error: %v", err), http.StatusInternalServerError) + return + } + + resp := validateOrderResponse{ + OK: len(invalid) == 0, + Invalid: invalid, + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + _ = json.NewEncoder(w).Encode(resp) + } +} diff --git a/svc/routes/orderinventory.go b/svc/routes/orderinventory.go new file mode 100644 index 0000000..8b4a824 --- /dev/null +++ b/svc/routes/orderinventory.go @@ -0,0 +1,89 @@ +package routes + +import ( + "bssapp-backend/db" + "bssapp-backend/queries" + "context" + "encoding/json" + "log" + "net/http" + "time" +) + +// ✅ GET /api/order-inventory?code=...&color=...&color2=... +func GetOrderInventoryHandler(w http.ResponseWriter, r *http.Request) { + code := r.URL.Query().Get("code") + color := r.URL.Query().Get("color") + color2 := r.URL.Query().Get("color2") + + if code == "" { + http.Error(w, "Eksik parametre: code gerekli", http.StatusBadRequest) + return + } + + // 🔧 Normalize eksik renk parametreleri + if color == "" { + color = " " + } + if color2 == "" { + color2 = " " + } + + log.Printf("🎨 [ORDERINV] İstek alındı -> code=%q | color=%q | color2=%q", code, color, color2) + + // ✅ MSSQL bağlantısını ve timeout'u oluştur + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + + rows, err := db.MssqlDB.QueryContext(ctx, queries.GetOrderInventory, code, color, color2) + if err != nil { + log.Printf("❌ [ORDERINV] SQL çalıştırılamadı: %v", err) + http.Error(w, "SQL hatası: "+err.Error(), http.StatusInternalServerError) + return + } + defer func() { + if cerr := rows.Close(); cerr != nil { + log.Printf("⚠️ [ORDERINV] rows.Close() hatası: %v", cerr) + } + }() + + type Row struct { + UrunKodu string `json:"UrunKodu"` + RenkKodu string `json:"RenkKodu"` + RenkAciklamasi string `json:"RenkAciklamasi"` + Beden string `json:"Beden"` + Yaka string `json:"Yaka"` + KullanilabilirAdet float64 `json:"KullanilabilirAdet"` + } + + var list []Row + for rows.Next() { + var r Row + if err := rows.Scan( + &r.UrunKodu, + &r.RenkKodu, + &r.RenkAciklamasi, + &r.Beden, + &r.Yaka, + &r.KullanilabilirAdet, + ); err != nil { + log.Printf("⚠️ [ORDERINV] Scan hatası: %v", err) + continue + } + list = append(list, r) + } + + if err := rows.Err(); err != nil { + log.Printf("❌ [ORDERINV] Rows hatası: %v", err) + http.Error(w, "Veri okuma hatası: "+err.Error(), http.StatusInternalServerError) + return + } + + log.Printf("✅ [ORDERINV] %s / %s / %s -> %d kayıt döndü", code, color, color2, len(list)) + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + if err := json.NewEncoder(w).Encode(list); err != nil { + log.Printf("❌ [ORDERINV] JSON encode hatası: %v", err) + http.Error(w, "JSON encode başarısız", http.StatusInternalServerError) + } +} diff --git a/svc/routes/orderlist.go b/svc/routes/orderlist.go new file mode 100644 index 0000000..078cd16 --- /dev/null +++ b/svc/routes/orderlist.go @@ -0,0 +1,126 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/db" + "bssapp-backend/models" + "bssapp-backend/queries" + "database/sql" + "encoding/json" + "log" + "net/http" + "strings" +) + +// ====================================================== +// 📌 OrderListRoute — Sipariş Listeleme API (AUTHZ + SAFE) +// ====================================================== +func OrderListRoute(mssql *sql.DB) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + // -------------------------------------------------- + // 🔍 Query Param (RAW + TRIM) + // -------------------------------------------------- + raw := r.URL.Query().Get("search") + search := strings.TrimSpace(raw) + + log.Printf( + "📥 /api/orders/list search raw=%q trimmed=%q lenRaw=%d lenTrim=%d", + raw, + search, + len(raw), + len(search), + ) + + // -------------------------------------------------- + // 🗄️ SQL CALL (WITH CONTEXT) + // -------------------------------------------------- + rows, err := queries.GetOrderList( + r.Context(), + mssql, + db.PgDB, // ✅ artık var + search, + ) + + if err != nil { + log.Printf("❌ SQL sorgu hatası: %v", err) + http.Error(w, "Veritabanı hatası", http.StatusInternalServerError) + return + } + defer rows.Close() + + // -------------------------------------------------- + // 📦 Sonuç Listesi + // -------------------------------------------------- + list := make([]models.OrderList, 0, 100) + count := 0 + + // ================================================== + // 🧠 SCAN — SQL SELECT ile BİRE BİR (14 kolon) + // ================================================== + for rows.Next() { + + var o models.OrderList + + err = rows.Scan( + &o.OrderHeaderID, // 1 + &o.OrderNumber, // 2 + &o.OrderDate, // 3 + + &o.CurrAccCode, // 4 + &o.CurrAccDescription, // 5 + + &o.MusteriTemsilcisi, // 6 + &o.Piyasa, // 7 + + &o.CreditableConfirmedDate, // 8 + &o.DocCurrencyCode, // 9 + + &o.TotalAmount, // 10 + &o.TotalAmountUSD, // 11 + + &o.IsCreditableConfirmed, // 12 + &o.Description, // 13 + + &o.ExchangeRateUSD, // 14 + ) + + if err != nil { + log.Printf( + "⚠️ SCAN HATASI | OrderHeaderID=%v | err=%v", + o.OrderHeaderID, + err, + ) + continue + } + + list = append(list, o) + count++ + } + + if err := rows.Err(); err != nil { + log.Printf("⚠️ rows.Err(): %v", err) + } + + // -------------------------------------------------- + // 📊 RESULT LOG + // -------------------------------------------------- + claims, _ := auth.GetClaimsFromContext(r.Context()) + + log.Printf( + "✅ Order list DONE | user=%d | search=%q | resultCount=%d", + claims.ID, + search, + count, + ) + + // -------------------------------------------------- + // 📤 JSON OUTPUT + // -------------------------------------------------- + if err := json.NewEncoder(w).Encode(list); err != nil { + log.Printf("❌ JSON encode hatası: %v", err) + } + }) +} diff --git a/svc/routes/orderpricelistb2b.go b/svc/routes/orderpricelistb2b.go new file mode 100644 index 0000000..a3b625e --- /dev/null +++ b/svc/routes/orderpricelistb2b.go @@ -0,0 +1,131 @@ +package routes + +import ( + "bssapp-backend/models" + "bssapp-backend/queries" + "database/sql" + "encoding/json" + "fmt" + "net/http" + "strings" +) + +// ✅ Model + pb/currency paramına göre fiyat döner (debug log’lu) +func GetOrderPriceListB2BHandler(pg *sql.DB, mssql *sql.DB) http.HandlerFunc { + + return func(w http.ResponseWriter, r *http.Request) { + + model := r.URL.Query().Get("model") + if model == "" { + model = r.URL.Query().Get("code") + } + + cur := r.URL.Query().Get("currency") + if cur == "" { + cur = r.URL.Query().Get("pb") + } + + if model == "" || cur == "" { + http.Error(w, "Eksik parametre", 400) + return + } + + cur = strings.ToUpper(cur) + + fmt.Printf("💰 [MINPRICE] model=%s cur=%s\n", model, cur) + + var ( + price float64 + rate float64 = 1 + ) + + /* ====================== + USD / EUR → Direkt + ====================== */ + + if cur == "USD" || cur == "EUR" { + + p, err := queries.GetOrderPriceListB2B(pg, model, cur) + + if err != nil { + http.Error(w, cur+" fiyat bulunamadı", 404) + return + } + + price = p.Price + + } else if cur == "TRY" { + + /* ====================== + TRY → USD * Kur + ====================== */ + + // 1️⃣ USD fiyat + p, err := queries.GetOrderPriceListB2B(pg, model, "USD") + if err != nil { + http.Error(w, "USD fiyat bulunamadı", 404) + return + } + + // 2️⃣ USD→TRY satış + r, err := queries.GetCachedCurrencyV3(mssql, "USD") + + if err != nil { + http.Error(w, "USD kuru bulunamadı", 503) + return + } + + rate = r.Rate + price = p.Price * rate + + } else if cur == "GBP" { + + /* ====================== + GBP → USD Bridge + ====================== */ + + // 1️⃣ USD fiyat + p, err := queries.GetOrderPriceListB2B(pg, model, "USD") + if err != nil { + http.Error(w, "USD fiyat bulunamadı", 404) + return + } + + // 2️⃣ USD→TRY + usd, err := queries.GetCachedCurrencyV3(mssql, "USD") + + if err != nil { + http.Error(w, "USD kuru yok", 503) + return + } + + // 3️⃣ GBP→TRY + gbp, err := queries.GetCachedCurrencyV3(mssql, "GBP") + if err != nil { + http.Error(w, "GBP kuru yok", 503) + return + } + + rate = usd.Rate / gbp.Rate + price = p.Price * rate + + } else { + + http.Error(w, "Desteklenmeyen para birimi", 400) + return + } + + resp := models.OrderPriceListB2B{ + ModelCode: model, + CurrencyCode: cur, + Price: price, + RateToTRY: rate, + PriceTRY: price, + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(resp) + + fmt.Printf("✅ [MINPRICE] %s → %.2f %s\n", model, price, cur) + } +} diff --git a/svc/routes/orders.go b/svc/routes/orders.go new file mode 100644 index 0000000..e5c84f0 --- /dev/null +++ b/svc/routes/orders.go @@ -0,0 +1,239 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/models" + "bssapp-backend/queries" + "bssapp-backend/utils" + "database/sql" + "encoding/json" + "errors" + "fmt" + "net/http" + + "github.com/gorilla/mux" +) + +// ================================ +// POST /api/order/update +// ================================ +func UpdateOrderHandler(w http.ResponseWriter, r *http.Request) { + + // -------------------------------------------------- + // 1️⃣ JWT CLAIMS (TEK KAYNAK) + // -------------------------------------------------- + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + user := utils.UserFromClaims(claims) + + if !ok || claims == nil { + http.Error(w, "Kullanıcı doğrulanamadı", http.StatusUnauthorized) + return + } + + user = utils.UserFromClaims(claims) + if user == nil { + http.Error(w, "Kullanıcı doğrulanamadı", http.StatusUnauthorized) + return + } + + // -------------------------------------------------- + // 2️⃣ REQUEST BODY + // -------------------------------------------------- + var payload struct { + Header models.OrderHeader `json:"header"` + Lines []models.OrderDetail `json:"lines"` + } + + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + http.Error(w, "Geçersiz JSON", http.StatusBadRequest) + return + } + + // -------------------------------------------------- + // 3️⃣ UPDATE + // -------------------------------------------------- + results, err := queries.UpdateOrder( + payload.Header, + payload.Lines, + user, // ✅ *models.User + ) + + if err != nil { + + // ✅ VALIDATION ERROR + var vErr *models.ValidationError + if errors.As(err, &vErr) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusBadRequest) + _ = json.NewEncoder(w).Encode(vErr) + return + } + + // ❌ SYSTEM ERROR + utils.LogError("ORDER_UPDATE", err) + + w.WriteHeader(http.StatusInternalServerError) + _ = json.NewEncoder(w).Encode(map[string]any{ + "code": "ORDER_UPDATE_FAILED", + "message": "Sipariş kaydedilirken beklenmeyen bir hata oluştu.", + }) + return + } + + // -------------------------------------------------- + // 4️⃣ RESPONSE + // -------------------------------------------------- + w.Header().Set("Content-Type", "application/json") + _ = json.NewEncoder(w).Encode(map[string]any{ + "success": true, + "lines": results, + }) +} + +// ------------------------------------------------------------- +// 🟩 CREATE — /api/order/create +// ------------------------------------------------------------- +func CreateOrderHandler(pg *sql.DB, mssql *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + // -------------------------------------------------- + // JWT CLAIMS + // -------------------------------------------------- + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + user := utils.UserFromClaims(claims) + + if !ok || claims == nil { + http.Error(w, "Yetkisiz", http.StatusUnauthorized) + return + } + + user = utils.UserFromClaims(claims) + if user == nil { + http.Error(w, "Yetkisiz", http.StatusUnauthorized) + return + } + + var payload struct { + Header models.OrderHeader `json:"header"` + Lines []models.OrderDetail `json:"lines"` + } + + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + http.Error(w, "Geçersiz JSON", http.StatusBadRequest) + return + } + + // -------------------------------------------------- + // INSERT + // -------------------------------------------------- + newID, lineResults, err := queries.InsertOrder( + payload.Header, + payload.Lines, + user, // ✅ *models.User + ) + + if err != nil { + + var vErr *models.ValidationError + if errors.As(err, &vErr) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusBadRequest) + _ = json.NewEncoder(w).Encode(vErr) + return + } + + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + orderNo := "" + if payload.Header.OrderNumber.Valid { + orderNo = payload.Header.OrderNumber.String + } + + // -------------------------------------------------- + // RESPONSE + // -------------------------------------------------- + _ = json.NewEncoder(w).Encode(map[string]any{ + "status": "success", + "orderID": newID, + "orderNumber": orderNo, + "lineResults": lineResults, + }) + } +} + +// ------------------------------------------------------------- +// 🟨 GET BY ID — /api/order/get/{id} +// ------------------------------------------------------------- +func GetOrderByIDHandler(mssql *sql.DB) http.HandlerFunc { + + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + orderID := mux.Vars(r)["id"] + if orderID == "" { + http.Error(w, "Eksik parametre: id", http.StatusBadRequest) + return + } + + fmt.Printf("📦 /api/order/get/%s çağrıldı\n", orderID) + + header, lines, err := queries.GetOrderByID(orderID) + + switch { + case errors.Is(err, sql.ErrNoRows): + http.Error(w, fmt.Sprintf("Sipariş bulunamadı: %s", orderID), http.StatusNotFound) + return + + case err != nil: + http.Error(w, fmt.Sprintf("Veritabanı hatası: %v", err), http.StatusInternalServerError) + return + + default: + _ = json.NewEncoder(w).Encode(map[string]any{ + "header": header, + "lines": lines, + }) + } + } +} + +// ------------------------------------------------------------- +// 🔎 ORDER EXISTS — /api/order/check/{id} +// ------------------------------------------------------------- +func OrderExistsHandler(db *sql.DB) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + id := mux.Vars(r)["id"] + + var count int + err := db.QueryRow(` + SELECT COUNT(*) + FROM trOrderHeader + WHERE OrderHeaderID = @p1 + `, id).Scan(&count) + + if err != nil { + http.Error(w, "db error", http.StatusInternalServerError) + return + } + + _ = json.NewEncoder(w).Encode(map[string]any{ + "exists": count > 0, + }) + }) +} diff --git a/svc/routes/password_forgot.go b/svc/routes/password_forgot.go new file mode 100644 index 0000000..a04aa9a --- /dev/null +++ b/svc/routes/password_forgot.go @@ -0,0 +1,116 @@ +package routes + +import ( + "bssapp-backend/internal/auditlog" + "bssapp-backend/internal/mailer" + "bssapp-backend/internal/security" + "database/sql" + "encoding/json" + "fmt" + "net/http" + "os" + "strings" + "time" +) + +func ForgotPasswordHandler( + db *sql.DB, + mailer *mailer.GraphMailer, +) http.HandlerFunc { + + type request struct { + Email string `json:"email"` + } + + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + // ------------------------------------------------------- + // 1️⃣ Request parse (enumeration yok) + // ------------------------------------------------------- + var req request + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + respondOK(w) + return + } + + email := strings.TrimSpace(strings.ToLower(req.Email)) + if email == "" { + respondOK(w) + return + } + + // ------------------------------------------------------- + // 2️⃣ Aktif kullanıcıyı bul + // ------------------------------------------------------- + var userID int64 + err := db.QueryRow(` + SELECT id + FROM mk_dfusr + WHERE email = $1 + AND is_active = true + `, email).Scan(&userID) + + if err != nil { + // ❗ kullanıcı yok → bilgi sızdırma yok + respondOK(w) + return + } + + // ------------------------------------------------------- + // 3️⃣ Reset token üret + // ------------------------------------------------------- + plain, hash, err := security.GenerateResetToken() + if err != nil { + respondOK(w) + return + } + + expires := time.Now().Add(30 * time.Minute) + + // ------------------------------------------------------- + // 4️⃣ DB’ye SADECE HASH kaydet + // ------------------------------------------------------- + _, _ = db.Exec(` + INSERT INTO dfusr_password_reset ( + dfusr_id, + token, + expires_at + ) + VALUES ($1, $2, $3) + `, userID, hash, expires) + + // ------------------------------------------------------- + // 5️⃣ Reset URL (PLAIN token) + // ------------------------------------------------------- + resetURL := fmt.Sprintf( + "%s/password-reset/%s", + os.Getenv("FRONTEND_URL"), + plain, + ) + + // ------------------------------------------------------- + // 6️⃣ Mail gönder (fail olsa bile enumeration yok) + // ------------------------------------------------------- + _ = mailer.SendPasswordResetMail(email, resetURL) + + // ------------------------------------------------------- + // 7️⃣ AUDIT LOG + // ------------------------------------------------------- + auditlog.Write(auditlog.ActivityLog{ + ActionType: "PASSWORD_FORGOT_REQUEST", + ActionCategory: "security", + ActionTarget: email, + IsSuccess: true, + }) + + respondOK(w) + } +} + +func respondOK(w http.ResponseWriter) { + _ = json.NewEncoder(w).Encode(map[string]bool{ + "success": true, + }) +} diff --git a/svc/routes/password_reset.go b/svc/routes/password_reset.go new file mode 100644 index 0000000..b555139 --- /dev/null +++ b/svc/routes/password_reset.go @@ -0,0 +1,126 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/auditlog" + "bssapp-backend/internal/security" + "database/sql" + "encoding/json" + "net/http" + + "golang.org/x/crypto/bcrypt" +) + +func ChangeOwnPasswordHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + // -------------------------------------------------- + // 1️⃣ JWT CLAIMS + // -------------------------------------------------- + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + // -------------------------------------------------- + // 2️⃣ PAYLOAD + // -------------------------------------------------- + var req struct { + CurrentPassword string `json:"current_password"` + NewPassword string `json:"new_password"` + } + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, "invalid payload", http.StatusBadRequest) + return + } + + if req.CurrentPassword == "" || req.NewPassword == "" { + http.Error(w, "current_password and new_password required", http.StatusBadRequest) + return + } + + // -------------------------------------------------- + // 3️⃣ PASSWORD POLICY + // -------------------------------------------------- + if err := security.ValidatePassword(req.NewPassword); err != nil { + http.Error(w, err.Error(), http.StatusUnprocessableEntity) + return + } + + // -------------------------------------------------- + // 4️⃣ MEVCUT HASH ÇEK + // -------------------------------------------------- + var currentHash string + err := db.QueryRow(` + SELECT password_hash + FROM mk_dfusr + WHERE id = $1 + AND is_active = true + `, claims.ID).Scan(¤tHash) + + if err != nil { + http.Error(w, "user not found", http.StatusUnauthorized) + return + } + + // -------------------------------------------------- + // 5️⃣ CURRENT PASSWORD CHECK + // -------------------------------------------------- + if bcrypt.CompareHashAndPassword( + []byte(currentHash), + []byte(req.CurrentPassword), + ) != nil { + http.Error(w, "current password incorrect", http.StatusUnauthorized) + return + } + + // -------------------------------------------------- + // 6️⃣ NEW HASH + // -------------------------------------------------- + newHash, err := bcrypt.GenerateFromPassword( + []byte(req.NewPassword), + bcrypt.DefaultCost, + ) + if err != nil { + http.Error(w, "hash error", http.StatusInternalServerError) + return + } + + // -------------------------------------------------- + // 7️⃣ UPDATE (⚠️ force_password_change DEĞİŞMEZ) + // -------------------------------------------------- + _, err = db.Exec(` + UPDATE mk_dfusr + SET + password_hash = $1, + password_updated_at = now(), + updated_at = now() + WHERE id = $2 + `, string(newHash), claims.ID) + + if err != nil { + http.Error(w, "password update failed", http.StatusInternalServerError) + return + } + + // -------------------------------------------------- + // 8️⃣ AUDIT + // -------------------------------------------------- + auditlog.Write(auditlog.ActivityLog{ + ActionType: "PASSWORD_CHANGED", + ActionCategory: "security", + ActionTarget: claims.Username, + IsSuccess: true, + }) + + // -------------------------------------------------- + // 9️⃣ RESPONSE + // -------------------------------------------------- + _ = json.NewEncoder(w).Encode(map[string]any{ + "success": true, + }) + } +} diff --git a/svc/routes/password_reset_complete.go b/svc/routes/password_reset_complete.go new file mode 100644 index 0000000..bdcab3a --- /dev/null +++ b/svc/routes/password_reset_complete.go @@ -0,0 +1,152 @@ +// routes/password_reset_complete.go +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/auditlog" + "bssapp-backend/internal/security" + "bssapp-backend/repository" + "database/sql" + "encoding/json" + "net/http" + "time" + + "golang.org/x/crypto/bcrypt" +) + +func CompletePasswordResetHandler(db *sql.DB) http.HandlerFunc { + + type request struct { + Token string `json:"token"` + Password string `json:"password"` + } + + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + var req request + if err := json.NewDecoder(r.Body).Decode(&req); err != nil || req.Token == "" || req.Password == "" { + http.Error(w, "invalid payload", http.StatusBadRequest) + return + } + + if err := security.ValidatePassword(req.Password); err != nil { + http.Error(w, err.Error(), http.StatusUnprocessableEntity) + return + } + + tokenHash := security.HashToken(req.Token) + + // 1) token doğrula + var userID int64 + var expiresAt time.Time + + err := db.QueryRow(` + SELECT mk_dfusr_id, expires_at + FROM mk_dfusr_password_reset + WHERE token = $1 + AND used_at IS NULL + `, tokenHash).Scan(&userID, &expiresAt) + + if err != nil || time.Now().After(expiresAt) { + http.Error(w, "invalid or expired token", http.StatusUnprocessableEntity) + return + } + + // 2) yeni hash + passHash, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost) + if err != nil { + http.Error(w, "hash error", http.StatusInternalServerError) + return + } + + // 3) tx: şifre + used_at + tx, err := db.Begin() + if err != nil { + http.Error(w, "tx error", http.StatusInternalServerError) + return + } + defer tx.Rollback() + + // mk_dfusr güncelle + if _, err := tx.Exec(` + UPDATE mk_dfusr + SET password_hash = $1, + force_password_change = false, + password_updated_at = now(), + updated_at = now() + WHERE id = $2 + `, string(passHash), userID); err != nil { + http.Error(w, "update failed", http.StatusInternalServerError) + return + } + + // token tüket + if _, err := tx.Exec(` + UPDATE mk_dfusr_password_reset + SET used_at = now() + WHERE token = $1 + `, tokenHash); err != nil { + http.Error(w, "token update failed", http.StatusInternalServerError) + return + } + + if err := tx.Commit(); err != nil { + http.Error(w, "commit failed", http.StatusInternalServerError) + return + } + + // 4) refresh revoke + _ = repository.NewRefreshTokenRepository(db).RevokeAllForUser(userID) + + // 5) user + perms + jwt + mkRepo := repository.NewMkUserRepository(db) + u, err := mkRepo.GetByID(userID) + if err != nil { + http.Error(w, "user fetch failed", http.StatusInternalServerError) + return + } + + permRepo := repository.NewPermissionRepository(db) + perms, _ := permRepo.GetPermissionsByRoleID(u.RoleID) + + // ✅ CLAIMS BUILD + claims := auth.BuildClaimsFromUser(u, 15*time.Minute) + + // ✅ TOKEN + jwtStr, err := auth.GenerateToken( + claims, + u.Username, + false, + ) + if err != nil { + http.Error(w, "token generation failed", http.StatusInternalServerError) + return + } + + auditlog.Write(auditlog.ActivityLog{ + ActionType: "PASSWORD_RESET_COMPLETED", + ActionCategory: "security", + ActionTarget: u.Username, + IsSuccess: true, + }) + + _ = json.NewEncoder(w).Encode(map[string]any{ + "success": true, + "token": jwtStr, + "user": map[string]any{ + "id": u.ID, + "username": u.Username, + "email": u.Email, + "is_active": u.IsActive, + "role_id": u.RoleID, + "role_code": u.RoleCode, + "force_password_change": false, + "v3_username": u.V3Username, + "v3_usergroup": u.V3UserGroup, + }, + "permissions": perms, + }) + } +} diff --git a/svc/routes/password_reset_validate.go b/svc/routes/password_reset_validate.go new file mode 100644 index 0000000..9c50ead --- /dev/null +++ b/svc/routes/password_reset_validate.go @@ -0,0 +1,63 @@ +package routes + +import ( + "crypto/sha256" + "database/sql" + "encoding/hex" + "net/http" + "time" + + "github.com/gorilla/mux" +) + +// GET /api/password/reset/validate/{token} +func ValidatePasswordResetTokenHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + token := mux.Vars(r)["token"] + if token == "" { + http.NotFound(w, r) + return + } + + // 🔐 plain token -> hash + h := sha256.Sum256([]byte(token)) + tokenHash := hex.EncodeToString(h[:]) + + var ( + userID int64 + expiresAt time.Time + usedAt sql.NullTime + ) + + err := db.QueryRow(` + SELECT user_id, expires_at, used_at + FROM password_reset_tokens + WHERE token_hash = $1 + LIMIT 1 + `, tokenHash).Scan(&userID, &expiresAt, &usedAt) + + if err != nil { + // ❗ bilgi sızdırma yok + http.NotFound(w, r) + return + } + + // ⏰ Süre kontrolü + if time.Now().After(expiresAt) { + http.NotFound(w, r) + return + } + + // 🔁 Tek kullanımlık + if usedAt.Valid { + http.Error(w, "token already used", http.StatusGone) + return + } + + // ✅ TOKEN GEÇERLİ + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"valid":true}`)) + } +} diff --git a/svc/routes/permission_debug.go b/svc/routes/permission_debug.go new file mode 100644 index 0000000..4759fc0 --- /dev/null +++ b/svc/routes/permission_debug.go @@ -0,0 +1,63 @@ +package routes + +import ( + "bssapp-backend/auth" + "database/sql" + "encoding/json" + "net/http" +) + +func DebugPermissionV2(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + // sadece auth kontrolü + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", 401) + return + } + + module := r.URL.Query().Get("module") + action := r.URL.Query().Get("action") + + if module == "" || action == "" { + http.Error(w, "module & action required", 400) + return + } + + rows, err := db.Query(` + SELECT + r.id, + r.code, + rp.allowed + FROM dfrole r + LEFT JOIN mk_sys_role_permissions rp + ON rp.role_id = r.id + AND rp.module_code = $1 + AND rp.action = $2 + ORDER BY r.id + `, module, action) + + if err != nil { + http.Error(w, "db error", 500) + return + } + defer rows.Close() + + type Row struct { + RoleID int `json:"role_id"` + Code string `json:"code"` + Allowed bool `json:"allowed"` + } + + var list []Row + + for rows.Next() { + var r Row + _ = rows.Scan(&r.RoleID, &r.Code, &r.Allowed) + list = append(list, r) + } + + json.NewEncoder(w).Encode(list) + } +} diff --git a/svc/routes/permission_matrix_v2.go b/svc/routes/permission_matrix_v2.go new file mode 100644 index 0000000..bf37ff9 --- /dev/null +++ b/svc/routes/permission_matrix_v2.go @@ -0,0 +1,203 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/auditlog" + "bssapp-backend/permissions" + "database/sql" + "encoding/json" + "fmt" + "net/http" + "strconv" + + "github.com/gorilla/mux" +) + +func GetRolePermissionMatrix(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", 401) + return + } + + roleID, _ := strconv.Atoi(mux.Vars(r)["id"]) + + rows, err := db.Query(` + SELECT + module_code, + action, + allowed + FROM mk_sys_role_permissions + WHERE role_id=$1 + `, roleID) + + if err != nil { + http.Error(w, "db error", 500) + return + } + defer rows.Close() + + var list []permissions.PermissionMatrixRow + + for rows.Next() { + + var row permissions.PermissionMatrixRow + + if err := rows.Scan( + &row.Module, + &row.Action, + &row.Allowed, + ); err != nil { + http.Error(w, "scan error", 500) + return + } + + row.Source = "role" + + list = append(list, row) + } + + json.NewEncoder(w).Encode(list) + } +} + +func SaveRolePermissionMatrix(db *sql.DB) http.HandlerFunc { + + return func(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", 401) + return + } + + roleID, _ := strconv.Atoi(mux.Vars(r)["id"]) + + var list []permissions.PermissionMatrixRow + + if err := json.NewDecoder(r.Body).Decode(&list); err != nil { + http.Error(w, "bad payload", 400) + return + } + + repo := permissions.NewPermissionRepository(db) + + // ================= OLD ================= + + oldRows, _ := repo.GetPermissionMatrixForRoles([]int{roleID}) + + oldMap := map[string]bool{} + + for _, p := range oldRows { + key := p.Module + ":" + p.Action + oldMap[key] = p.Allowed + } + + // ================= DIFF ================= + + var changes []map[string]any + + for _, p := range list { + + key := p.Module + ":" + p.Action + + oldVal, ok := oldMap[key] + if !ok { + oldVal = false + } + + if oldVal != p.Allowed { + + changes = append(changes, map[string]any{ + "module": p.Module, + "action": p.Action, + "before": oldVal, + "after": p.Allowed, + }) + } + } + + // ================= SAVE ================= + + tx, err := db.Begin() + if err != nil { + http.Error(w, "tx error", 500) + return + } + defer tx.Rollback() + + stmt, err := tx.Prepare(` + INSERT INTO mk_sys_role_permissions + (role_id,module_code,action,allowed) + VALUES ($1,$2,$3,$4) + + ON CONFLICT + (role_id,module_code,action) + DO UPDATE SET allowed=EXCLUDED.allowed + `) + + if err != nil { + http.Error(w, "prepare error", 500) + return + } + defer stmt.Close() + + for _, p := range list { + + if _, err := stmt.Exec( + roleID, + p.Module, + p.Action, + p.Allowed, + ); err != nil { + http.Error(w, "exec error", 500) + return + } + } + + if err := tx.Commit(); err != nil { + http.Error(w, "commit error", 500) + return + } + + // ================= AUDIT ================= + + if len(changes) > 0 { + + var roleCode string + + _ = db.QueryRow(` + SELECT code FROM dfrole WHERE id=$1 + `, roleID).Scan(&roleCode) + + auditlog.Enqueue(r.Context(), auditlog.ActivityLog{ + + ActionType: "role_permission_change", + ActionCategory: "role_permission", + + ActionTarget: fmt.Sprintf("/api/roles/%d/permissions", roleID), + + Description: "role permission matrix updated", + + Username: claims.Username, + RoleCode: claims.RoleCode, + DfUsrID: int64(claims.ID), + + ChangeBefore: map[string]any{ + "permissions": oldRows, + }, + + ChangeAfter: map[string]any{ + "changes": changes, + }, + + IsSuccess: true, + }) + } + + json.NewEncoder(w).Encode(map[string]bool{ + "success": true, + }) + } +} diff --git a/svc/routes/permissions.go b/svc/routes/permissions.go new file mode 100644 index 0000000..aef0d08 --- /dev/null +++ b/svc/routes/permissions.go @@ -0,0 +1,114 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/permissions" + "database/sql" + "encoding/json" + "net/http" +) + +/* ===================================================== + HANDLER +===================================================== */ + +type PermissionHandler struct { + DB *sql.DB + Repo *permissions.PermissionRepository +} + +func NewPermissionHandler(db *sql.DB) *PermissionHandler { + return &PermissionHandler{ + DB: db, + Repo: permissions.NewPermissionRepository(db), + } +} + +/* ===================================================== + POST /api/permissions/matrix +===================================================== */ + +func (h *PermissionHandler) UpdatePermissionMatrix( + w http.ResponseWriter, + r *http.Request, +) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", 401) + return + } + + var req []permissions.PermissionUpdateRequest + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, "invalid payload", 400) + return + } + + if len(req) == 0 { + w.WriteHeader(http.StatusOK) + return + } + + err := h.Repo.UpdatePermissions(req) + if err != nil { + http.Error(w, "db error", 500) + return + } + + json.NewEncoder(w).Encode(map[string]any{ + "success": true, + }) +} +func GetMyPermissionMatrix(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", 401) + return + } + + var roleID int + + err := db.QueryRow(` + SELECT id FROM dfrole WHERE LOWER(code)=LOWER($1) + `, claims.RoleCode).Scan(&roleID) + + if err != nil { + http.Error(w, "role resolve error", 500) + return + } + + repo := permissions.NewPermissionRepository(db) + + raw, err := repo.GetPermissionMatrixForRoles([]int{roleID}) + if err != nil { + http.Error(w, "db error", 500) + return + } + + // 🔥 FRONTEND FORMAT + type Row struct { + Module string `json:"module"` + Action string `json:"action"` + Allowed bool `json:"allowed"` + } + + list := make([]Row, 0, len(raw)) + + for _, p := range raw { + + list = append(list, Row{ + Module: p.ModuleCode, // 👈 burası önemli + Action: p.Action, + Allowed: p.Allowed, + }) + } + + _ = json.NewEncoder(w).Encode(list) + } +} diff --git a/svc/routes/product.go b/svc/routes/product.go new file mode 100644 index 0000000..1893f08 --- /dev/null +++ b/svc/routes/product.go @@ -0,0 +1,27 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/queries" + "encoding/json" + "net/http" +) + +// ✅ GET /api/products +func GetProductListHandler(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + products, err := queries.GetProductList() + if err != nil { + http.Error(w, "Ürün listesi alınamadı: "+err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + _ = json.NewEncoder(w).Encode(products) +} diff --git a/svc/routes/productcolor.go b/svc/routes/productcolor.go new file mode 100644 index 0000000..3a794e6 --- /dev/null +++ b/svc/routes/productcolor.go @@ -0,0 +1,48 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/db" + "bssapp-backend/models" + "bssapp-backend/queries" + "encoding/json" + "log" + "net/http" +) + +func GetProductColorsHandler(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + code := r.URL.Query().Get("code") + if code == "" { + http.Error(w, "Eksik parametre: code gerekli", http.StatusBadRequest) + return + } + + rows, err := db.MssqlDB.Query(queries.GetProductColors, code) + if err != nil { + http.Error(w, "Renk listesi alınamadı: "+err.Error(), http.StatusInternalServerError) + return + } + defer rows.Close() + + var list []models.ProductColor + for rows.Next() { + var c models.ProductColor + if err := rows.Scan(&c.ProductCode, &c.ColorCode, &c.ColorDescription); err != nil { + log.Println("Satır okunamadı:", err) + continue + } + list = append(list, c) + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + _ = json.NewEncoder(w).Encode(list) + + log.Printf("✅ [1.COLOR] %s -> %d kayıt", code, len(list)) +} diff --git a/svc/routes/productcolorsize.go b/svc/routes/productcolorsize.go new file mode 100644 index 0000000..cb8c048 --- /dev/null +++ b/svc/routes/productcolorsize.go @@ -0,0 +1,73 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/db" + "bssapp-backend/models" + "bssapp-backend/queries" + "encoding/json" + "log" + "net/http" +) + +// ✅ GET /api/product-colorsize?code=S001-DCY18144&color=001&color2=017 +func GetProductColorSizesHandler(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + code := r.URL.Query().Get("code") + color := r.URL.Query().Get("color") + color2 := r.URL.Query().Get("color2") + + // 🔹 Model kodu zorunlu, renk opsiyonel + if code == "" { + http.Error(w, "Eksik parametre: code gerekli", http.StatusBadRequest) + return + } + + // 🔧 Eksik parametreleri normalize et + if color == "" { + color = " " + } + if color2 == "" { + color2 = " " + } + + log.Printf("🎨 [COLORSIZE] İstek alındı -> code=%q | color=%q | color2=%q", code, color, color2) + + // ✅ MSSQL’e sıralı 3 parametre gönder (adlı değil!) + rows, err := db.MssqlDB.Query(queries.GetProductColorSizes, code, color, color2) + if err != nil { + log.Printf("❌ [COLORSIZE] DB sorgu hatası: %v", err) + http.Error(w, "SQL hatası: "+err.Error(), http.StatusInternalServerError) + return + } + defer rows.Close() + + var list []models.ProductColorSize + for rows.Next() { + var s models.ProductColorSize + if err := rows.Scan(&s.ProductCode, &s.ColorCode, &s.ItemDim1Code, &s.ItemDim2Code); err != nil { + log.Printf("⚠️ [COLORSIZE] Satır okunamadı: %v", err) + continue + } + list = append(list, s) + } + + if err := rows.Err(); err != nil { + log.Printf("⚠️ [COLORSIZE] Row iteration hatası: %v", err) + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + if err := json.NewEncoder(w).Encode(list); err != nil { + log.Printf("❌ [COLORSIZE] JSON encode hatası: %v", err) + http.Error(w, "JSON encode başarısız", http.StatusInternalServerError) + return + } + + log.Printf("✅ [COLORSIZE] %s / %s / %s -> %d kayıt döndü", code, color, color2, len(list)) +} diff --git a/svc/routes/productdetail.go b/svc/routes/productdetail.go new file mode 100644 index 0000000..fbaa693 --- /dev/null +++ b/svc/routes/productdetail.go @@ -0,0 +1,65 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/db" + "bssapp-backend/models" + "bssapp-backend/queries" + "encoding/json" + "log" + "net/http" +) + +func GetProductDetailHandler(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + code := r.URL.Query().Get("code") + if code == "" { + http.Error(w, "Eksik parametre: code", http.StatusBadRequest) + return + } + + row := db.MssqlDB.QueryRow(queries.GetProductDetail, code) + + var p models.ProductDetail + err := row.Scan( + &p.ProductCode, + new(string), // BOS7 + new(string), // ProductDescription + new(string), // ProductAtt42 + &p.UrunIlkGrubu, + new(string), // ProductAtt01 + &p.UrunAnaGrubu, + new(string), // ProductAtt02 + &p.UrunAltGrubu, + new(string), // ProductAtt41 + &p.UrunIcerik, + new(string), // ProductAtt10 + new(string), // Marka + new(string), // ProductAtt11 + &p.Drop, + new(string), // ProductAtt29 + new(string), // Karisim + new(string), // ProductAtt45 + &p.AskiliYan, + new(string), // ProductAtt44 + &p.Kategori, + new(string), // ProductAtt38 + &p.Fit1, + new(string), // ProductAtt39 + &p.Fit2, + ) + if err != nil { + log.Println("❌ Ürün detayları alınamadı:", err) + http.Error(w, "Veri okuma hatası: "+err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + _ = json.NewEncoder(w).Encode(p) +} diff --git a/svc/routes/productsecondcolor.go b/svc/routes/productsecondcolor.go new file mode 100644 index 0000000..500a1cd --- /dev/null +++ b/svc/routes/productsecondcolor.go @@ -0,0 +1,67 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/db" + "bssapp-backend/models" + "bssapp-backend/queries" + "database/sql" + "encoding/json" + "log" + "net/http" +) + +// ✅ GET /api/product-secondcolor?code=S001-DCY18144&color=001 +func GetProductSecondColorsHandler(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + code := r.URL.Query().Get("code") + color := r.URL.Query().Get("color") + + if code == "" || color == "" { + http.Error(w, "Eksik parametre: code ve color gerekli", http.StatusBadRequest) + return + } + + log.Printf("🎨 [2.COLOR] İstek alındı -> code=%s color=%s", code, color) + + rows, err := db.MssqlDB.Query( + queries.GetProductSecondColors, + sql.Named("ProductCode", code), + sql.Named("ColorCode", color), + ) + if err != nil { + log.Println("❌ DB sorgu hatası:", err) + http.Error(w, "2. renk listesi alınamadı: "+err.Error(), http.StatusInternalServerError) + return + } + defer rows.Close() + + var list []models.ProductSecondColor + for rows.Next() { + var c models.ProductSecondColor + if err := rows.Scan(&c.ProductCode, &c.ColorCode, &c.ItemDim2Code); err != nil { + log.Println("⚠️ Satır okunamadı:", err) + continue + } + list = append(list, c) + } + + if err := rows.Err(); err != nil { + log.Println("⚠️ Row iteration hatası:", err) + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + if err := json.NewEncoder(w).Encode(list); err != nil { + log.Println("❌ JSON encode hatası:", err) + http.Error(w, "JSON encode başarısız", http.StatusInternalServerError) + return + } + + log.Printf("✅ [2.COLOR] %s / %s -> %d kayıt döndü", code, color, len(list)) +} diff --git a/svc/routes/role_department_permissions.go b/svc/routes/role_department_permissions.go new file mode 100644 index 0000000..1d9efbe --- /dev/null +++ b/svc/routes/role_department_permissions.go @@ -0,0 +1,440 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/auditlog" + "bssapp-backend/permissions" + "bssapp-backend/queries" + "database/sql" + "encoding/json" + "fmt" + "log" + "net/http" + "strconv" + + "github.com/gorilla/mux" +) + +type IdTitleOption struct { + ID string `json:"id"` + Title string `json:"title"` +} +type Row struct { + Route string `json:"route"` + CanAccess bool `json:"can_access"` +} + +type RoleDepartmentPermissionHandler struct { + DB *sql.DB + Repo *permissions.RoleDepartmentPermissionRepo +} + +func NewRoleDepartmentPermissionHandler(db *sql.DB) *RoleDepartmentPermissionHandler { + + return &RoleDepartmentPermissionHandler{ + DB: db, // ✅ EKLENDİ + Repo: permissions.NewRoleDepartmentPermissionRepo(db), + } +} + +/* ====================================================== + GET +====================================================== */ + +func (h *RoleDepartmentPermissionHandler) Get(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + vars := mux.Vars(r) + + roleID, err := strconv.Atoi(vars["roleId"]) + if err != nil || roleID <= 0 { + http.Error(w, "invalid roleId", http.StatusBadRequest) + return + } + + deptCode := vars["deptCode"] + if deptCode == "" { + http.Error(w, "invalid deptCode", http.StatusBadRequest) + return + } + + list, err := h.Repo.Get(roleID, deptCode) + if err != nil { + http.Error(w, "db error", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + _ = json.NewEncoder(w).Encode(list) +} + +/* ====================================================== + POST +====================================================== */ + +func (h *RoleDepartmentPermissionHandler) Save(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + vars := mux.Vars(r) + + roleID, err := strconv.Atoi(vars["roleId"]) + if err != nil || roleID <= 0 { + http.Error(w, "invalid roleId", http.StatusBadRequest) + return + } + + deptCode := vars["deptCode"] + if deptCode == "" { + http.Error(w, "invalid deptCode", http.StatusBadRequest) + return + } + + var list []permissions.RoleDepartmentPermission + if err := json.NewDecoder(r.Body).Decode(&list); err != nil { + http.Error(w, "bad payload", http.StatusBadRequest) + return + } + + // ================= OLD ================= + oldRows, err := h.Repo.Get(roleID, deptCode) + if err != nil { + log.Println("OLD PERM LOAD ERROR:", err) + } + + oldMap := map[string]bool{} + for _, p := range oldRows { + key := p.Module + ":" + p.Action + oldMap[key] = p.Allowed + } + + // ================= DIFF ================= + var changes []map[string]any + for _, p := range list { + key := p.Module + ":" + p.Action + oldVal := oldMap[key] + if oldVal != p.Allowed { + changes = append(changes, map[string]any{ + "module": p.Module, + "action": p.Action, + "before": oldVal, + "after": p.Allowed, + }) + } + } + + // ================= SAVE ================= + if err := h.Repo.Save(roleID, deptCode, list); err != nil { + http.Error(w, "save error", http.StatusInternalServerError) + return + } + + // ================= AUDIT ================= + if len(changes) > 0 { + auditlog.Enqueue(r.Context(), auditlog.ActivityLog{ + ActionType: "role_department_permission_change", + ActionCategory: "role_permission", + ActionTarget: fmt.Sprintf( + "/api/roles/%d/departments/%s/permissions", + roleID, + deptCode, + ), + Description: "role+department permissions updated", + Username: claims.Username, + RoleCode: claims.RoleCode, + DfUsrID: int64(claims.ID), + ChangeBefore: map[string]any{ + "permissions": oldRows, + }, + ChangeAfter: map[string]any{ + "changes": changes, + }, + IsSuccess: true, + }) + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + _ = json.NewEncoder(w).Encode(map[string]bool{"success": true}) +} +func GetModuleLookupRoute(db *sql.DB) http.HandlerFunc { + + return func(w http.ResponseWriter, r *http.Request) { + + rows, err := db.Query(queries.GetModuleLookup) + if err != nil { + http.Error(w, "db error", 500) + return + } + defer rows.Close() + + type Row struct { + Value string `json:"value"` + Label string `json:"label"` + } + + var list []Row + + for rows.Next() { + + var r Row + + if err := rows.Scan( + &r.Value, + &r.Label, + ); err != nil { + http.Error(w, "scan error", 500) + return + } + + list = append(list, r) + } + + json.NewEncoder(w).Encode(list) + } +} +func GetRolesForPermissionSelectRoute(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + rows, err := db.Query(queries.GetRolesForPermissionSelect) + if err != nil { + http.Error(w, "roles select error", 500) + return + } + defer rows.Close() + + list := make([]IdTitleOption, 0) + for rows.Next() { + var o IdTitleOption + if err := rows.Scan(&o.ID, &o.Title); err == nil { + list = append(list, o) + } + } + + _ = json.NewEncoder(w).Encode(list) + } +} + +func GetDepartmentsForPermissionSelectRoute(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + rows, err := db.Query(queries.GetDepartmentsForPermissionSelect) + if err != nil { + http.Error(w, "departments select error", 500) + return + } + defer rows.Close() + + list := make([]IdTitleOption, 0) + for rows.Next() { + var o IdTitleOption + if err := rows.Scan(&o.ID, &o.Title); err == nil { + list = append(list, o) + } + } + + _ = json.NewEncoder(w).Encode(list) + } +} +func GetUsersForPermissionSelectRoute(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + rows, err := db.Query(queries.GetUserLookupForPermission) + if err != nil { + http.Error(w, "users lookup error", http.StatusInternalServerError) + return + } + defer rows.Close() + + list := make([]IdTitleOption, 0, 128) + + for rows.Next() { + + var o IdTitleOption + + if err := rows.Scan(&o.ID, &o.Title); err == nil { + list = append(list, o) + } + } + + _ = json.NewEncoder(w).Encode(list) + } +} + +func (h *PermissionHandler) GetUserOverrides(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + userID, err := strconv.ParseInt(mux.Vars(r)["id"], 10, 64) + if err != nil || userID <= 0 { + http.Error(w, "invalid id", http.StatusBadRequest) + return + } + + list, err := h.Repo.GetUserOverridesByUserID(userID) + if err != nil { + log.Println("❌ USER OVERRIDE LOAD ERROR:", err) + http.Error(w, "db error", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + _ = json.NewEncoder(w).Encode(list) +} +func GetUserRoutePermissionsHandler(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", 401) + return + } + + repo := permissions.NewPermissionRepository(db) + + // JWT’den departmanlar + depts := claims.DepartmentCodes + + rows, err := db.Query(` + SELECT DISTINCT + module_code, + action, + path + FROM mk_sys_routes + `) + if err != nil { + http.Error(w, err.Error(), 500) + return + } + defer rows.Close() + + type Row struct { + Route string `json:"route"` + CanAccess bool `json:"can_access"` + } + + list := make([]Row, 0, 64) + + for rows.Next() { + + var module, action, path string + + if err := rows.Scan( + &module, + &action, + &path, + ); err != nil { + continue + } + + allowed, err := repo.ResolvePermissionChain( + int64(claims.ID), + int64(claims.RoleID), + depts, + module, + action, + ) + + if err != nil { + log.Println("PERM RESOLVE ERROR:", err) + continue + } + + list = append(list, Row{ + Route: path, + CanAccess: allowed, + }) + } + + _ = json.NewEncoder(w).Encode(list) + } +} + +func GetMyEffectivePermissions(db *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", 401) + return + } + + repo := permissions.NewPermissionRepository(db) + + // ✅ JWT'DEN DEPARTMENTS + depts := claims.DepartmentCodes + + log.Printf("🧪 EFFECTIVE PERM | user=%d role=%d depts=%v", + claims.ID, + claims.RoleID, + depts, + ) + + // all system perms + all, err := db.Query(` + SELECT DISTINCT module_code, action + FROM mk_sys_routes + `) + if err != nil { + http.Error(w, err.Error(), 500) + return + } + defer all.Close() + + type Row struct { + Module string `json:"module"` + Action string `json:"action"` + Allowed bool `json:"allowed"` + } + + list := make([]Row, 0, 128) + + for all.Next() { + + var m, a string + if err := all.Scan(&m, &a); err != nil { + continue + } + + allowed, err := repo.ResolvePermissionChain( + int64(claims.ID), + int64(claims.RoleID), + depts, + m, + a, + ) + + if err != nil { + continue + } + + list = append(list, Row{ + Module: m, + Action: a, + Allowed: allowed, + }) + } + + _ = json.NewEncoder(w).Encode(list) + } +} diff --git a/svc/routes/statement_detail.go b/svc/routes/statement_detail.go new file mode 100644 index 0000000..0f5c20f --- /dev/null +++ b/svc/routes/statement_detail.go @@ -0,0 +1,38 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/queries" + "encoding/json" + "net/http" + + "github.com/gorilla/mux" +) + +// GET /api/statements/{accountCode}/details?startdate=...&enddate=...&parislemler=1&parislemler=2 +func GetStatementDetailsHandler(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + vars := mux.Vars(r) + accountCode := vars["accountCode"] + + startDate := r.URL.Query().Get("startdate") + endDate := r.URL.Query().Get("enddate") + parislemler := r.URL.Query()["parislemler"] + + details, err := queries.GetStatementDetails(accountCode, startDate, endDate, parislemler) + if err != nil { + http.Error(w, "Error fetching statement details: "+err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + if err := json.NewEncoder(w).Encode(details); err != nil { + http.Error(w, "Error encoding response: "+err.Error(), http.StatusInternalServerError) + } +} diff --git a/svc/routes/statement_header.go b/svc/routes/statement_header.go new file mode 100644 index 0000000..71ce07d --- /dev/null +++ b/svc/routes/statement_header.go @@ -0,0 +1,38 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/models" + "bssapp-backend/queries" + "encoding/json" + "net/http" +) + +// GET /api/statements +func GetStatementHeadersHandler(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + params := models.StatementParams{ + StartDate: r.URL.Query().Get("startdate"), + EndDate: r.URL.Query().Get("enddate"), + AccountCode: r.URL.Query().Get("accountcode"), + LangCode: r.URL.Query().Get("langcode"), + Parislemler: r.URL.Query()["parislemler"], + } + + statements, err := queries.GetStatements(params) + if err != nil { + http.Error(w, "Error fetching statements: "+err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + if err := json.NewEncoder(w).Encode(statements); err != nil { + http.Error(w, "Error encoding response: "+err.Error(), http.StatusInternalServerError) + } +} diff --git a/svc/routes/statement_header_pdf.go b/svc/routes/statement_header_pdf.go new file mode 100644 index 0000000..85834f1 --- /dev/null +++ b/svc/routes/statement_header_pdf.go @@ -0,0 +1,395 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/models" + "bssapp-backend/queries" + "bytes" + "database/sql" + "fmt" + "log" + "net/http" + "os" + "path/filepath" + "sort" + "strings" + "time" + + "github.com/jung-kurt/gofpdf" +) + +/* ============================ SABİTLER ============================ */ + +// A4 Landscape (mm) +const ( + hPageWidth = 297.0 + hPageHeight = 210.0 + + hMarginL = 8.0 + hMarginT = 8.0 + hMarginR = 8.0 + hMarginB = 15.0 + + hLineHMain = 5.2 + hCellPadX = 2.0 + + hHeaderRowH = 8.4 + hGroupBarH = 9.0 + + hGridLineWidth = 0.3 + hLogoW = 42.0 +) + +// Kolonlar +var hMainCols = []string{ + "Belge No", "Tarih", "Vade", "İşlem", + "Açıklama", "Para", "Borç", "Alacak", "Bakiye", +} + +var hMainWbase = []float64{ + 34, 30, 28, 24, 60, 20, 36, 36, 36, +} + +// Font dosyaları +const ( + hFontFamilyReg = "dejavu" + hFontFamilyBold = "dejavu-b" + hFontPathReg = "fonts/DejaVuSans.ttf" + hFontPathBold = "fonts/DejaVuSans-Bold.ttf" +) + +// Renkler +var ( + hColorPrimary = [3]int{149, 113, 22} // #957116 + hColorSecondary = [3]int{218, 193, 151} // #dac197 (Baggi secondary) +) + +/* ============================ FONT / FORMAT ============================ */ + +func hEnsureFonts(pdf *gofpdf.Fpdf) { + if _, err := os.Stat(hFontPathReg); err == nil { + pdf.AddUTF8Font(hFontFamilyReg, "", hFontPathReg) + } + if _, err := os.Stat(hFontPathBold); err == nil { + pdf.AddUTF8Font(hFontFamilyBold, "", hFontPathBold) + } +} + +func hNormalizeWidths(base []float64, targetTotal float64) []float64 { + sum := 0.0 + for _, v := range base { + sum += v + } + scale := targetTotal / sum + out := make([]float64, len(base)) + for i, v := range base { + out[i] = v * scale + } + return out +} + +func hFormatCurrencyTR(val float64) string { + s := fmt.Sprintf("%.2f", val) + parts := strings.Split(s, ".") + intPart, decPart := parts[0], parts[1] + + var out []string + for len(intPart) > 3 { + out = append([]string{intPart[len(intPart)-3:]}, out...) + intPart = intPart[:len(intPart)-3] + } + if intPart != "" { + out = append([]string{intPart}, out...) + } + return strings.Join(out, ".") + "," + decPart +} + +func hNeedNewPage(pdf *gofpdf.Fpdf, needH float64) bool { + return pdf.GetY()+needH+hMarginB > hPageHeight +} + +/* ============================ YARDIMCI FONKSİYONLAR ============================ */ + +func hSplitLinesSafe(pdf *gofpdf.Fpdf, text string, width float64) [][]byte { + if width <= 0 { + width = 1 + } + return pdf.SplitLines([]byte(text), width) +} + +func hDrawWrapText(pdf *gofpdf.Fpdf, text string, x, y, width, lineH float64) { + if text == "" { + return + } + lines := hSplitLinesSafe(pdf, text, width) + cy := y + for _, ln := range lines { + pdf.SetXY(x, cy) + pdf.CellFormat(width, lineH, string(ln), "", 0, "L", false, 0, "") + cy += lineH + } +} + +func hCalcRowHeightForText(pdf *gofpdf.Fpdf, text string, colWidth, lineHeight, padX float64) float64 { + if text == "" { + return lineHeight + } + lines := hSplitLinesSafe(pdf, text, colWidth-(2*padX)) + h := float64(len(lines)) * lineHeight + if h < lineHeight { + h = lineHeight + } + return h +} + +/* ============================ HEADER ============================ */ + +func hDrawPageHeader(pdf *gofpdf.Fpdf, cariKod, cariIsim, start, end string) float64 { + logoPath, _ := filepath.Abs("./public/Baggi-Tekstil-A.s-Logolu.jpeg") + + // Logo + pdf.ImageOptions(logoPath, hMarginL, 2, hLogoW, 0, false, gofpdf.ImageOptions{}, 0, "") + + // Başlıklar + pdf.SetFont(hFontFamilyBold, "", 16) + pdf.SetTextColor(hColorPrimary[0], hColorPrimary[1], hColorPrimary[2]) + pdf.SetXY(hMarginL+hLogoW+8, hMarginT+2) + pdf.CellFormat(120, 7, "Baggi Software System", "", 0, "L", false, 0, "") + + pdf.SetFont(hFontFamilyBold, "", 12) + pdf.SetXY(hMarginL+hLogoW+8, hMarginT+10) + pdf.CellFormat(120, 6, "Cari Hesap Raporu", "", 0, "L", false, 0, "") + + // Bugünün tarihi (sağ üst) + today := time.Now().Format("02.01.2006") + pdf.SetFont(hFontFamilyReg, "", 9) + pdf.SetXY(hPageWidth-hMarginR-40, hMarginT+3) + pdf.CellFormat(40, 6, "Tarih: "+today, "", 0, "R", false, 0, "") + + // Cari & Tarih kutuları (daha yukarı taşındı) + boxY := hMarginT + hLogoW - 6 + pdf.SetFont(hFontFamilyBold, "", 10) + + pdf.Rect(hMarginL, boxY, 140, 11, "") + pdf.SetXY(hMarginL+2, boxY+3) + pdf.CellFormat(136, 5, fmt.Sprintf("Cari: %s — %s", cariKod, cariIsim), "", 0, "L", false, 0, "") + + pdf.Rect(hPageWidth-hMarginR-140, boxY, 140, 11, "") + pdf.SetXY(hPageWidth-hMarginR-138, boxY+3) + pdf.CellFormat(136, 5, fmt.Sprintf("Tarih Aralığı: %s → %s", start, end), "", 0, "R", false, 0, "") + + // Alt çizgi + y := boxY + 13 + pdf.SetDrawColor(hColorPrimary[0], hColorPrimary[1], hColorPrimary[2]) + pdf.Line(hMarginL, y, hPageWidth-hMarginR, y) + pdf.SetDrawColor(200, 200, 200) + + return y + 4 +} + +/* ============================ TABLO ============================ */ + +func hDrawGroupBar(pdf *gofpdf.Fpdf, currency string, sonBakiye float64) { + x := hMarginL + y := pdf.GetY() + w := hPageWidth - hMarginL - hMarginR + h := hGroupBarH + + pdf.SetDrawColor(hColorPrimary[0], hColorPrimary[1], hColorPrimary[2]) + pdf.SetLineWidth(0.6) + pdf.Rect(x, y, w, h, "") + + pdf.SetFont(hFontFamilyBold, "", 11.3) + pdf.SetTextColor(hColorPrimary[0], hColorPrimary[1], hColorPrimary[2]) + + pdf.SetXY(x+hCellPadX+1.0, y+(h-5.0)/2) + pdf.CellFormat(w*0.6, 5.0, currency, "", 0, "L", false, 0, "") + + txt := "Son Bakiye = " + hFormatCurrencyTR(sonBakiye) + pdf.SetXY(x+w*0.4, y+(h-5.0)/2) + pdf.CellFormat(w*0.6-2.0, 5.0, txt, "", 0, "R", false, 0, "") + + pdf.SetLineWidth(hGridLineWidth) + pdf.SetDrawColor(200, 200, 200) + pdf.SetTextColor(0, 0, 0) + + pdf.Ln(h) +} + +func hDrawMainHeaderRow(pdf *gofpdf.Fpdf, cols []string, widths []float64) { + pdf.SetFont(hFontFamilyBold, "", 10.2) + pdf.SetTextColor(255, 255, 255) + pdf.SetFillColor(hColorPrimary[0], hColorPrimary[1], hColorPrimary[2]) + pdf.SetDrawColor(120, 90, 20) + + x := hMarginL + y := pdf.GetY() + for i, c := range cols { + pdf.Rect(x, y, widths[i], hHeaderRowH, "DF") + pdf.SetXY(x+hCellPadX, y+1.6) + pdf.CellFormat(widths[i]-2*hCellPadX, hHeaderRowH-3.2, c, "", 0, "C", false, 0, "") + x += widths[i] + } + pdf.Ln(hHeaderRowH) +} + +func hDrawMainDataRow(pdf *gofpdf.Fpdf, row []string, widths []float64, rowH float64, rowIndex int) { + x := hMarginL + y := pdf.GetY() + + // ✅ Zebra efekti + wTotal := hPageWidth - hMarginL - hMarginR + if rowIndex%2 == 1 { + pdf.SetFillColor(hColorSecondary[0], hColorSecondary[1], hColorSecondary[2]) + pdf.Rect(x, y, wTotal, rowH, "F") + } + + pdf.SetFont(hFontFamilyReg, "", 8.2) + pdf.SetDrawColor(242, 235, 222) + pdf.SetTextColor(30, 30, 30) + + for i, val := range row { + pdf.Rect(x, y, widths[i], rowH, "") + switch { + case i == 4: // Açıklama wrap + hDrawWrapText(pdf, val, x+hCellPadX, y+0.5, widths[i]-2*hCellPadX, hLineHMain) + case i >= 6: + pdf.SetXY(x+hCellPadX, y+(rowH-hLineHMain)/2) + pdf.CellFormat(widths[i]-2*hCellPadX, hLineHMain, val, "", 0, "R", false, 0, "") + default: + pdf.SetXY(x+hCellPadX, y+(rowH-hLineHMain)/2) + pdf.CellFormat(widths[i]-2*hCellPadX, hLineHMain, val, "", 0, "L", false, 0, "") + } + x += widths[i] + } + + // ❌ pdf.Ln(rowH) YOK + // ✅ Manuel olarak Y'yi arttırıyoruz + pdf.SetY(y + rowH) +} + +/* ============================ MAIN HANDLER ============================ */ + +func ExportStatementHeaderReportPDFHandler(mssql *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + started := time.Now() + + accountCode := r.URL.Query().Get("accountcode") + startDate := r.URL.Query().Get("startdate") + endDate := r.URL.Query().Get("enddate") + rawParis := r.URL.Query()["parislemler"] + + var parislemler []string + for _, v := range rawParis { + v = strings.TrimSpace(v) + if v != "" && v != "undefined" && v != "null" { + parislemler = append(parislemler, v) + } + } + + headers, _, err := queries.GetStatementsHPDF(accountCode, startDate, endDate, parislemler) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + type grp struct { + code string + rows []models.StatementHeader + sonBakiye float64 + } + order := []string{} + groups := map[string]*grp{} + + for _, h := range headers { + g, ok := groups[h.ParaBirimi] + if !ok { + g = &grp{code: h.ParaBirimi} + groups[h.ParaBirimi] = g + order = append(order, h.ParaBirimi) + } + g.rows = append(g.rows, h) + } + for _, k := range order { + sort.SliceStable(groups[k].rows, func(i, j int) bool { + ri, rj := groups[k].rows[i], groups[k].rows[j] + if ri.BelgeTarihi == rj.BelgeTarihi { + return ri.BelgeNo < rj.BelgeNo + } + return ri.BelgeTarihi < rj.BelgeTarihi + }) + if n := len(groups[k].rows); n > 0 { + groups[k].sonBakiye = groups[k].rows[n-1].Bakiye + } + } + + pdf := gofpdf.New("L", "mm", "A4", "") + pdf.SetMargins(hMarginL, hMarginT, hMarginR) + pdf.SetAutoPageBreak(false, hMarginB) + hEnsureFonts(pdf) + + wAvail := hPageWidth - hMarginL - hMarginR + mainWn := hNormalizeWidths(hMainWbase, wAvail) + + cariIsim := "" + if len(headers) > 0 { + cariIsim = headers[0].CariIsim + } + + pageNum := 0 + newPage := func() { + pageNum++ + pdf.AddPage() + tableTop := hDrawPageHeader(pdf, accountCode, cariIsim, startDate, endDate) + pdf.SetY(tableTop) + } + + newPage() + + for _, cur := range order { + g := groups[cur] + hDrawGroupBar(pdf, cur, g.sonBakiye) + hDrawMainHeaderRow(pdf, hMainCols, mainWn) + + rowIndex := 0 + for _, h := range g.rows { + row := []string{ + h.BelgeNo, h.BelgeTarihi, h.VadeTarihi, h.IslemTipi, + h.Aciklama, h.ParaBirimi, + hFormatCurrencyTR(h.Borc), + hFormatCurrencyTR(h.Alacak), + hFormatCurrencyTR(h.Bakiye), + } + + rh := hCalcRowHeightForText(pdf, row[4], mainWn[4], hLineHMain, hCellPadX) + if hNeedNewPage(pdf, rh+hHeaderRowH) { + newPage() + hDrawGroupBar(pdf, cur, g.sonBakiye) + hDrawMainHeaderRow(pdf, hMainCols, mainWn) + } + + hDrawMainDataRow(pdf, row, mainWn, rh, rowIndex) + rowIndex++ + } + pdf.Ln(1) + } + + var buf bytes.Buffer + if err := pdf.Output(&buf); err != nil { + http.Error(w, "PDF oluşturulamadı: "+err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/pdf") + w.Header().Set("Content-Disposition", "inline; filename=statement-header-report.pdf") + _, _ = w.Write(buf.Bytes()) + + log.Printf("✅ Header-only PDF üretimi tamamlandı (%s)", time.Since(started)) + } +} diff --git a/svc/routes/statements_pdf.go b/svc/routes/statements_pdf.go new file mode 100644 index 0000000..9908fa7 --- /dev/null +++ b/svc/routes/statements_pdf.go @@ -0,0 +1,642 @@ +// routes/statements_pdf.go +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/models" + "bssapp-backend/queries" + "bytes" + "database/sql" + "fmt" + "log" + "net/http" + "os" + "path/filepath" + "sort" + "strings" + "time" + + "github.com/jung-kurt/gofpdf" +) + +/* ============================ SABİTLER ============================ */ + +// A4 Landscape (mm) +const ( + pageWidth = 297.0 + pageHeight = 210.0 + + // Kenar boşlukları (mm) + marginL = 8.0 + marginT = 8.0 + marginR = 8.0 + marginB = 15.0 + + // Satır aralıkları (mm) + lineHMain = 6.0 // ana satır biraz iri + lineHDetail = 5.2 + cellPadX = 2.2 + + // Satır yükseklikleri (mm) + headerRowH = 8.4 + subHeaderRowH = 6.2 + groupBarH = 9.0 + + // Çizgi kalınlığı + gridLineWidth = 0.3 + + // Logo genişliği (yükseklik oranlanır) + logoW = 42.0 +) + +// Ana tablo kolonları +var mainCols = []string{ + "Belge No", "Tarih", "Vade", "İşlem", + "Açıklama", "Para", "Borç", "Alacak", "Bakiye", +} + +// Ana tablo kolon genişlikleri (ilk 3 geniş) +var mainWbase = []float64{ + 34, // Belge No + 30, // Tarih + 28, // Vade + 24, // İşlem + 60, // Açıklama (biraz daraltıldı) + 20, // Para + 36, // Borç (genişletildi) + 36, // Alacak (genişletildi) + 36, // Bakiye (genişletildi) +} + +// Detay tablo kolonları ve genişlikleri +var dCols = []string{ + "Ana Grup", "Alt Grup", "Garson", "Fit", "İçerik", + "Ürün", "Renk", "Adet", "Fiyat", "Tutar", +} +var dWbase = []float64{ + 30, 28, 22, 20, 56, 30, 22, 20, 20, 26} + +// Font dosyaları +const ( + fontFamilyReg = "dejavu" + fontFamilyBold = "dejavu-b" + fontPathReg = "fonts/DejaVuSans.ttf" + fontPathBold = "fonts/DejaVuSans-Bold.ttf" +) + +// Kurumsal renkler +var ( + colorPrimary = [3]int{149, 113, 22} // #957116 (altın) + colorSecondary = [3]int{218, 193, 151} // #dac197 (bej) + colorDetailFill = [3]int{242, 235, 222} // secondary’den daha açık (detay satır zemin) +) + +/* ============================ HELPERS ============================ */ + +// Genişlikleri normalize et +func normalizeWidths(base []float64, targetTotal float64) []float64 { + sum := 0.0 + for _, v := range base { + sum += v + } + out := make([]float64, len(base)) + if sum <= 0 { + each := targetTotal / float64(len(base)) + for i := range out { + out[i] = each + } + return out + } + scale := targetTotal / sum + for i, v := range base { + out[i] = v * scale + } + return out +} + +// Türkçe formatlı sayı +func formatCurrencyTR(n float64) string { + s := fmt.Sprintf("%.2f", n) // "864000.00" + parts := strings.Split(s, ".") + intPart := parts[0] + decPart := parts[1] + + // Binlik ayırıcı (.) + var out strings.Builder + for i, c := range intPart { + if (len(intPart)-i)%3 == 0 && i != 0 { + out.WriteRune('.') + } + out.WriteRune(c) + } + + return out.String() + "," + decPart +} + +// Fontları yükle +func ensureFonts(pdf *gofpdf.Fpdf) { + if _, err := os.Stat(fontPathReg); err == nil { + pdf.AddUTF8Font(fontFamilyReg, "", fontPathReg) + } else { + log.Printf("⚠️ Font bulunamadı: %s", fontPathReg) + } + if _, err := os.Stat(fontPathBold); err == nil { + pdf.AddUTF8Font(fontFamilyBold, "", fontPathBold) + } else { + log.Printf("⚠️ Font bulunamadı: %s", fontPathBold) + } +} + +// Güvenli satır kırma +func splitLinesSafe(pdf *gofpdf.Fpdf, text string, width float64) [][]byte { + if width <= 0 { + width = 1 + } + defer func() { + if rec := recover(); rec != nil { + log.Printf("⚠️ splitLinesSafe recover: %v", rec) + } + }() + return pdf.SplitLines([]byte(text), width) +} + +// Metin wrap çizimi +func drawWrapText(pdf *gofpdf.Fpdf, text string, x, y, width, lineH float64) { + if text == "" { + return + } + lines := splitLinesSafe(pdf, text, width) + cy := y + for _, ln := range lines { + pdf.SetXY(x, cy) + pdf.CellFormat(width, lineH, string(ln), "", 0, "L", false, 0, "") + cy += lineH + } +} + +// Wrap satır yüksekliği +func calcRowHeightForText(pdf *gofpdf.Fpdf, text string, colWidth, lineHeight, padX float64) float64 { + if colWidth <= 2*padX { + colWidth = 2*padX + 1 + } + if text == "" { + return lineHeight + } + lines := splitLinesSafe(pdf, text, colWidth-(2*padX)) + if len(lines) == 0 { + return lineHeight + } + h := float64(len(lines)) * lineHeight + if h < lineHeight { + h = lineHeight + } + return h +} + +// Alt tarafa sığmıyor mu? +func needNewPage(pdf *gofpdf.Fpdf, needH float64) bool { + return pdf.GetY()+needH+marginB > pageHeight +} + +// NULL/boş’ları uzun çizgiye çevir +func nullToDash(s string) string { + if strings.TrimSpace(s) == "" { + return "—" + } + return s +} + +/* ============================ HEADER DRAW ============================ */ + +// Küçük yardımcı: kutu içine otomatik 1-2 satır metin (taşarsa 2) +func drawLabeledBox(pdf *gofpdf.Fpdf, x, y, w, h float64, label, value string, align string) { + // Çerçeve + pdf.Rect(x, y, w, h, "") + // İç marj + ix := x + 2 + iy := y + 1.8 + iw := w - 4 + // Etiket (kalın, küçük) + pdf.SetFont(fontFamilyBold, "", 8) + pdf.SetXY(ix, iy) + pdf.CellFormat(iw, 4, label, "", 0, "L", false, 0, "") + + // Değer (normal, 1-2 satır) + pdf.SetFont(fontFamilyReg, "", 8) + vy := iy + 4.2 + lineH := 4.2 + lines := splitLinesSafe(pdf, value, iw) + if len(lines) > 2 { + lines = lines[:2] // en fazla 2 satır göster + } + for _, ln := range lines { + pdf.SetXY(ix, vy) + pdf.CellFormat(iw, lineH, string(ln), "", 0, align, false, 0, "") + vy += lineH + } +} + +func drawPageHeader(pdf *gofpdf.Fpdf, cariKod, cariIsim, start, end string) float64 { + logoPath, _ := filepath.Abs("./public/Baggi-Tekstil-A.s-Logolu.jpeg") + + // Logo + pdf.ImageOptions(logoPath, hMarginL, 2, hLogoW, 0, false, gofpdf.ImageOptions{}, 0, "") + + // Başlıklar + pdf.SetFont(hFontFamilyBold, "", 16) + pdf.SetTextColor(hColorPrimary[0], hColorPrimary[1], hColorPrimary[2]) + pdf.SetXY(hMarginL+hLogoW+8, hMarginT+2) + pdf.CellFormat(120, 7, "Baggi Software System", "", 0, "L", false, 0, "") + + pdf.SetFont(hFontFamilyBold, "", 12) + pdf.SetXY(hMarginL+hLogoW+8, hMarginT+10) + pdf.CellFormat(120, 6, "Cari Hesap Raporu", "", 0, "L", false, 0, "") + + // Bugünün tarihi (sağ üst) + today := time.Now().Format("02.01.2006") + pdf.SetFont(hFontFamilyReg, "", 9) + pdf.SetXY(hPageWidth-hMarginR-40, hMarginT+3) + pdf.CellFormat(40, 6, "Tarih: "+today, "", 0, "R", false, 0, "") + + // Cari & Tarih kutuları (daha yukarı taşındı) + boxY := hMarginT + hLogoW - 6 + pdf.SetFont(hFontFamilyBold, "", 10) + + pdf.Rect(hMarginL, boxY, 140, 11, "") + pdf.SetXY(hMarginL+2, boxY+3) + pdf.CellFormat(136, 5, fmt.Sprintf("Cari: %s — %s", cariKod, cariIsim), "", 0, "L", false, 0, "") + + pdf.Rect(hPageWidth-hMarginR-140, boxY, 140, 11, "") + pdf.SetXY(hPageWidth-hMarginR-138, boxY+3) + pdf.CellFormat(136, 5, fmt.Sprintf("Tarih Aralığı: %s → %s", start, end), "", 0, "R", false, 0, "") + + // Alt çizgi + y := boxY + 13 + pdf.SetDrawColor(hColorPrimary[0], hColorPrimary[1], hColorPrimary[2]) + pdf.Line(hMarginL, y, hPageWidth-hMarginR, y) + pdf.SetDrawColor(200, 200, 200) + + return y + 4 +} + +/* ============================ GROUP BAR ============================ */ + +func drawGroupBar(pdf *gofpdf.Fpdf, currency string, sonBakiye float64) { + // Kutu alanı (tam genişlik) + x := marginL + y := pdf.GetY() + w := pageWidth - marginL - marginR + h := groupBarH + + // Çerçeve + pdf.SetDrawColor(colorPrimary[0], colorPrimary[1], colorPrimary[2]) + pdf.SetLineWidth(0.6) + pdf.Rect(x, y, w, h, "") + + // Metinler + pdf.SetFont(fontFamilyBold, "", 11.3) // bir tık büyük + pdf.SetTextColor(colorPrimary[0], colorPrimary[1], colorPrimary[2]) + + pdf.SetXY(x+cellPadX+1.0, y+(h-5.0)/2) + pdf.CellFormat(w*0.6, 5.0, fmt.Sprintf("%s", currency), "", 0, "L", false, 0, "") + + txt := "Son Bakiye = " + formatCurrencyTR(sonBakiye) + pdf.SetXY(x+w*0.4, y+(h-5.0)/2) + pdf.CellFormat(w*0.6-2.0, 5.0, txt, "", 0, "R", false, 0, "") + + // Renk/kalınlık geri + pdf.SetLineWidth(gridLineWidth) + pdf.SetDrawColor(200, 200, 200) + pdf.SetTextColor(0, 0, 0) + + pdf.Ln(h) +} + +/* ============================ HEADER ROWS ============================ */ + +func drawMainHeaderRow(pdf *gofpdf.Fpdf, cols []string, widths []float64) { + // Ana başlık: Primary arkaplan, beyaz yazı + pdf.SetFont(fontFamilyBold, "", 10.2) + pdf.SetTextColor(255, 255, 255) + pdf.SetFillColor(colorPrimary[0], colorPrimary[1], colorPrimary[2]) + pdf.SetDrawColor(120, 90, 20) + + x := marginL + y := pdf.GetY() + for i, c := range cols { + pdf.Rect(x, y, widths[i], headerRowH, "DF") + pdf.SetXY(x+cellPadX, y+1.6) + pdf.CellFormat(widths[i]-2*cellPadX, headerRowH-3.2, c, "", 0, "C", false, 0, "") + x += widths[i] + } + pdf.SetY(y + headerRowH) + +} + +func drawDetailHeaderRow(pdf *gofpdf.Fpdf, cols []string, widths []float64) { + // Detay başlık: Secondary (daha açık) + pdf.SetFont(fontFamilyBold, "", 9.2) + pdf.SetFillColor(colorSecondary[0], colorSecondary[1], colorSecondary[2]) + pdf.SetTextColor(0, 0, 0) + pdf.SetDrawColor(160, 140, 100) + + x := marginL + y := pdf.GetY() + for i, c := range cols { + pdf.Rect(x, y, widths[i], subHeaderRowH, "DF") + pdf.SetXY(x+cellPadX, y+1.2) + pdf.CellFormat(widths[i]-2*cellPadX, subHeaderRowH-2.4, c, "", 0, "C", false, 0, "") + x += widths[i] + } + pdf.Ln(subHeaderRowH) +} + +/* ============================ DATA ROWS ============================ */ + +// Ana veri satırı: daha büyük ve kalın görünsün +// Ana veri satırı (zebrasız, sıkı grid – satırlar yapışık) +func drawMainDataRow(pdf *gofpdf.Fpdf, row []string, widths []float64, rowH float64) { + x := marginL + y := pdf.GetY() + + // Arka plan beyaz, çizgiler gri + pdf.SetFont(fontFamilyBold, "", 8.5) + pdf.SetDrawColor(210, 210, 210) + pdf.SetTextColor(30, 30, 30) + pdf.SetFillColor(255, 255, 255) + + for i, val := range row { + // Hücre çerçevesi + pdf.Rect(x, y, widths[i], rowH, "") + switch { + case i == 4: // Açıklama wrap + drawWrapText(pdf, val, x+cellPadX, y+0.8, widths[i]-2*cellPadX, lineHMain) + case i >= 6: // Sayısal sağ + pdf.SetXY(x+cellPadX, y+(rowH-lineHMain)/2) + pdf.CellFormat(widths[i]-2*cellPadX, lineHMain, val, "", 0, "R", false, 0, "") + default: // Normal sol + pdf.SetXY(x+cellPadX, y+(rowH-lineHMain)/2) + pdf.CellFormat(widths[i]-2*cellPadX, lineHMain, val, "", 0, "L", false, 0, "") + } + x += widths[i] + } + + // ❌ pdf.Ln(rowH) yerine: + // ✅ bir alt satıra tam yapışık in + pdf.SetY(y + rowH) +} + +// Detay veri satırı: açık zemin, biraz küçük; zebra opsiyonel +func drawDetailDataRow(pdf *gofpdf.Fpdf, row []string, widths []float64, rowH float64, fillBg bool) { + pdf.SetFont(fontFamilyReg, "", 8.0) + pdf.SetTextColor(60, 60, 60) + pdf.SetDrawColor(220, 220, 220) + + x := marginL + y := pdf.GetY() + + for i, val := range row { + // Zemin + if fillBg { + pdf.SetFillColor(colorDetailFill[0], colorDetailFill[1], colorDetailFill[2]) + pdf.Rect(x, y, widths[i], rowH, "DF") + pdf.SetFillColor(255, 255, 255) // geri + } else { + pdf.Rect(x, y, widths[i], rowH, "") + } + + switch { + case i == 4: // İçerik wrap + drawWrapText(pdf, val, x+cellPadX, y+1.4, widths[i]-2*cellPadX, lineHDetail) + case i >= 7: // Sayısal sağ + pdf.SetXY(x+cellPadX, y+(rowH-lineHDetail)/2) + pdf.CellFormat(widths[i]-2*cellPadX, lineHDetail, val, "", 0, "R", false, 0, "") + default: // Sol + pdf.SetXY(x+cellPadX, y+(rowH-lineHDetail)/2) + pdf.CellFormat(widths[i]-2*cellPadX, lineHDetail, val, "", 0, "L", false, 0, "") + } + x += widths[i] + } + pdf.Ln(rowH) +} + +/* ============================ HANDLER ============================ */ + +func ExportPDFHandler(mssql *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + started := time.Now() + + defer func() { + if rec := recover(); rec != nil { + log.Printf("❌ PANIC ExportPDFHandler: %v", rec) + http.Error(w, "PDF oluşturulurken hata oluştu", http.StatusInternalServerError) + } + }() + + accountCode := r.URL.Query().Get("accountcode") + startDate := r.URL.Query().Get("startdate") + endDate := r.URL.Query().Get("enddate") + + // parislemler sanitize + rawParis := r.URL.Query()["parislemler"] + parislemler := make([]string, 0, len(rawParis)) + for _, v := range rawParis { + v = strings.TrimSpace(v) + if v == "" || strings.EqualFold(v, "undefined") || strings.EqualFold(v, "null") { + continue + } + parislemler = append(parislemler, v) + } + log.Printf("▶️ ExportPDFHandler: account=%s start=%s end=%s parislemler=%v", + accountCode, startDate, endDate, parislemler) + + // 1) Header verileri + headers, belgeNos, err := queries.GetStatementsPDF(accountCode, startDate, endDate, parislemler) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + log.Printf("✅ Header verileri alındı: %d kayıt, %d belge no", len(headers), len(belgeNos)) + + // 2) Detay verileri + detailMap, err := queries.GetDetailsMapPDF(belgeNos, startDate, endDate) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + log.Printf("✅ Detay verileri alındı: %d belge için detay var", len(detailMap)) + + // 3) Gruplama + type grp struct { + code string + rows []models.StatementHeader + sonBakiye float64 + } + order := []string{} + groups := map[string]*grp{} + + for _, h := range headers { + g, ok := groups[h.ParaBirimi] + if !ok { + g = &grp{code: h.ParaBirimi} + groups[h.ParaBirimi] = g + order = append(order, h.ParaBirimi) + } + g.rows = append(g.rows, h) + } + + for _, k := range order { + sort.SliceStable(groups[k].rows, func(i, j int) bool { + ri, rj := groups[k].rows[i], groups[k].rows[j] + if ri.BelgeTarihi == rj.BelgeTarihi { + return ri.BelgeNo < rj.BelgeNo + } + return ri.BelgeTarihi < rj.BelgeTarihi + }) + if n := len(groups[k].rows); n > 0 { + groups[k].sonBakiye = groups[k].rows[n-1].Bakiye + } + } + + // 4) Kolon genişlikleri + wAvail := pageWidth - marginL - marginR + mainWn := normalizeWidths(mainWbase, wAvail) + dWn := normalizeWidths(dWbase, wAvail) + + // 5) PDF init + pdf := gofpdf.New("L", "mm", "A4", "") + pdf.SetMargins(marginL, marginT, marginR) + pdf.SetAutoPageBreak(false, marginB) + ensureFonts(pdf) + pdf.SetFont(fontFamilyReg, "", 8.5) + pdf.SetTextColor(0, 0, 0) + + pageNum := 0 + cariIsim := "" + if len(headers) > 0 { + cariIsim = headers[0].CariIsim + } + + // Sayfa başlatıcı (header yüksekliği dinamik) + newPage := func() { + pageNum++ + pdf.AddPage() + + // drawPageHeader tablo başlangıç yüksekliğini döndürüyor + tableTop := drawPageHeader(pdf, accountCode, cariIsim, startDate, endDate) + + // Sayfa numarası + pdf.SetFont(fontFamilyReg, "", 6) + pdf.SetXY(pageWidth-marginR-28, pageHeight-marginB+3) + pdf.CellFormat(28, 5, fmt.Sprintf("Sayfa %d", pageNum), "", 0, "R", false, 0, "") + + // Tablo Y konumunu ayarla + pdf.SetY(tableTop) + } + + newPage() + + // 6) Gruplar yaz + for _, cur := range order { + g := groups[cur] + + if needNewPage(pdf, groupBarH+headerRowH) { + newPage() + } + drawGroupBar(pdf, cur, g.sonBakiye) + drawMainHeaderRow(pdf, mainCols, mainWn) + + for _, h := range g.rows { + row := []string{ + h.BelgeNo, h.BelgeTarihi, h.VadeTarihi, h.IslemTipi, + h.Aciklama, h.ParaBirimi, + formatCurrencyTR(h.Borc), + formatCurrencyTR(h.Alacak), + formatCurrencyTR(h.Bakiye), + } + + pdf.SetFont(fontFamilyBold, "", 9.6) + rh := calcRowHeightForText(pdf, row[4], mainWn[4], lineHMain, cellPadX) + + if needNewPage(pdf, rh+headerRowH) { + newPage() + drawGroupBar(pdf, cur, g.sonBakiye) + drawMainHeaderRow(pdf, mainCols, mainWn) + } + drawMainDataRow(pdf, row, mainWn, rh) + + // detaylar + details := detailMap[h.BelgeNo] + if len(details) > 0 { + if needNewPage(pdf, subHeaderRowH) { + newPage() + drawGroupBar(pdf, cur, g.sonBakiye) + drawMainHeaderRow(pdf, mainCols, mainWn) + } + drawDetailHeaderRow(pdf, dCols, dWn) + + for i, d := range details { + drow := []string{ + nullToDash(d.UrunAnaGrubu), + nullToDash(d.UrunAltGrubu), + nullToDash(d.YetiskinGarson), + nullToDash(d.Fit), + nullToDash(d.Icerik), + nullToDash(d.UrunKodu), + nullToDash(d.UrunRengi), + formatCurrencyTR(d.ToplamAdet), + formatCurrencyTR(d.ToplamFiyat), + formatCurrencyTR(d.ToplamTutar), + } + + pdf.SetFont(fontFamilyReg, "", 8) + rh2 := calcRowHeightForText(pdf, drow[4], dWn[4], lineHDetail, cellPadX) + + if needNewPage(pdf, rh2) { + newPage() + drawGroupBar(pdf, cur, g.sonBakiye) + drawMainHeaderRow(pdf, mainCols, mainWn) + drawDetailHeaderRow(pdf, dCols, dWn) + } + // zebra: çift indekslerde açık zemin + fill := (i%2 == 0) + drawDetailDataRow(pdf, drow, dWn, rh2, fill) + } + } + } + pdf.Ln(3) + } + + // 7) Çıktı + var buf bytes.Buffer + if err := pdf.Output(&buf); err != nil { + http.Error(w, "PDF oluşturulamadı: "+err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/pdf") + w.Header().Set("Content-Disposition", "inline; filename=statement.pdf") + _, _ = w.Write(buf.Bytes()) + + log.Printf("✅ PDF üretimi tamam: %s", time.Since(started)) + } +} + +/* +NOTLAR: +- Header artık dinamik yüksekliğe sahip (drawPageHeader -> contentTopY döner). +- Logo sol üst köşe, başlık “toolbar” gibi; “Cari / Tarih” kutuları + 1–2 satır metni çerçeve içinde otomatik kırar. +- Grup barı primary renkte çerçeveli ve yazı biraz büyük. +- Ana satırlar kalın & bir tık büyük (detaydan farklı). +- Detay satırlar açık (bej) zeminle zebra (i%2==0) uygulanır. +- SplitLines her yerde splitLinesSafe ile korunuyor (panic yok). +- AddPage sadece newPage()’de. +- Font bulunamazsa gömme fontlarla devam edilir (log yazar). +*/ diff --git a/svc/routes/test_mail.go b/svc/routes/test_mail.go new file mode 100644 index 0000000..3dc107a --- /dev/null +++ b/svc/routes/test_mail.go @@ -0,0 +1,49 @@ +package routes + +import ( + "context" + "encoding/json" + "net/http" + + "bssapp-backend/auth" + "bssapp-backend/internal/mailer" +) + +func TestMailHandler(ml *mailer.GraphMailer) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + var req struct { + To string `json:"to"` + } + + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, "invalid body", http.StatusBadRequest) + return + } + + err := ml.Send( + context.Background(), + mailer.Message{ + To: []string{req.To}, + Subject: "BSSApp Test Mail", + BodyHTML: "

🎉 Test mail başarılı

Microsoft Graph üzerinden gönderildi.

", + }, + ) + + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + _ = json.NewEncoder(w).Encode(map[string]string{ + "message": "Mail gönderildi", + }) + }) +} diff --git a/svc/routes/todaycurrencyv3.go b/svc/routes/todaycurrencyv3.go new file mode 100644 index 0000000..5704e95 --- /dev/null +++ b/svc/routes/todaycurrencyv3.go @@ -0,0 +1,30 @@ +package routes + +import ( + "bssapp-backend/queries" + "database/sql" + "encoding/json" + "fmt" + "net/http" +) + +// ✅ Handler artık parametre alıyor +func GetTodayCurrencyV3Handler(mssql *sql.DB) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + + code := r.URL.Query().Get("code") + if code == "" { + http.Error(w, "Eksik parametre: code", http.StatusBadRequest) + return + } + + currency, err := queries.GetTodayCurrencyV3(mssql, code) // 👈 MSSQL + if err != nil { + http.Error(w, fmt.Sprintf("Kur bulunamadı: %v", err), http.StatusNotFound) + return + } + + w.Header().Set("Content-Type", "application/json") + _ = json.NewEncoder(w).Encode(currency) + } +} diff --git a/svc/routes/user_detail.go b/svc/routes/user_detail.go new file mode 100644 index 0000000..9a00706 --- /dev/null +++ b/svc/routes/user_detail.go @@ -0,0 +1,320 @@ +package routes + +import ( + "bssapp-backend/internal/auditlog" + "bssapp-backend/internal/mailer" + "bssapp-backend/internal/security" + "bssapp-backend/models" + "bssapp-backend/queries" + "bytes" + "database/sql" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "strconv" + "time" + + "github.com/gorilla/mux" +) + +// ====================================================== +// 👤 USER DETAIL ROUTE (GET + PUT) +// URL: /api/users/{id} +// ====================================================== +type LoginUser struct { + ID int64 `json:"id"` + Username string `json:"username"` + Email string `json:"email"` + RoleID int `json:"role_id"` + RoleCode string `json:"role_code"` + ForcePasswordChange bool `json:"force_password_change"` +} + +func UserDetailRoute(db *sql.DB) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + idStr := mux.Vars(r)["id"] + userID, err := strconv.ParseInt(idStr, 10, 64) + if err != nil || userID <= 0 { + http.Error(w, "Geçersiz kullanıcı id", http.StatusBadRequest) + return + } + + switch r.Method { + case http.MethodGet: + handleUserGet(db, w, userID) + case http.MethodPut: + handleUserUpdate(db, w, r, userID) + case http.MethodOptions: + w.WriteHeader(http.StatusOK) + default: + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + } + }) +} + +// ====================================================== +// 📥 GET USER +// ====================================================== +// ====================================================== +// 📥 GET USER (FINAL - mk_dfusr Uyumlu) +// ====================================================== +func handleUserGet(db *sql.DB, w http.ResponseWriter, userID int64) { + + var u models.UserDetail + + // -------------------------------------------------- + // 🟢 HEADER + // -------------------------------------------------- + err := db.QueryRow( + queries.GetUserHeader, + userID, + ).Scan( + &u.ID, + &u.Code, // username + &u.IsActive, + &u.FullName, + &u.Email, + &u.Mobile, + &u.Address, + &u.HasPassword, + ) + + if err != nil { + + // detaylı log (çok önemli) + fmt.Println("❌ [UserDetail] HEADER SCAN ERROR:", err) + + if err == sql.ErrNoRows { + http.Error(w, "Kullanıcı bulunamadı", http.StatusNotFound) + return + } + + http.Error(w, "User header error", http.StatusInternalServerError) + return + } + + // -------------------------------------------------- + // 🟢 ROLES + // -------------------------------------------------- + roleRows, err := db.Query(queries.GetUserRoles, userID) + if err != nil { + fmt.Println("⚠️ [UserDetail] ROLE QUERY:", err) + } else { + defer roleRows.Close() + + for roleRows.Next() { + var code string + + if err := roleRows.Scan(&code); err == nil { + u.Roles = append(u.Roles, code) + } + } + } + + // -------------------------------------------------- + // 🟢 DEPARTMENTS + // -------------------------------------------------- + deptRows, err := db.Query(queries.GetUserDepartments, userID) + if err != nil { + fmt.Println("⚠️ [UserDetail] DEPT QUERY:", err) + } else { + defer deptRows.Close() + + for deptRows.Next() { + + var d models.DeptOption + + if err := deptRows.Scan(&d.Code, &d.Title); err == nil { + u.Departments = append(u.Departments, d) + } + } + } + + // -------------------------------------------------- + // 🟢 PIYASALAR + // -------------------------------------------------- + piyRows, err := db.Query(queries.GetUserPiyasalar, userID) + if err != nil { + fmt.Println("⚠️ [UserDetail] PIYASA QUERY:", err) + } else { + defer piyRows.Close() + + for piyRows.Next() { + + var p models.DeptOption + + if err := piyRows.Scan(&p.Code, &p.Title); err == nil { + u.Piyasalar = append(u.Piyasalar, p) + } + } + } + + // -------------------------------------------------- + // 🟢 NEBIM USERS + // -------------------------------------------------- + nebimRows, err := db.Query(queries.GetUserNebim, userID) + if err != nil { + fmt.Println("⚠️ [UserDetail] NEBIM QUERY:", err) + } else { + defer nebimRows.Close() + + for nebimRows.Next() { + + var n models.NebimOption + + if err := nebimRows.Scan( + &n.Username, + &n.UserGroupCode, + ); err == nil { + + u.NebimUsers = append(u.NebimUsers, n) + } + } + } + + // -------------------------------------------------- + // 🟢 RESPONSE + // -------------------------------------------------- + w.WriteHeader(http.StatusOK) + + if err := json.NewEncoder(w).Encode(u); err != nil { + fmt.Println("❌ [UserDetail] JSON ENCODE:", err) + } +} + +// ====================================================== +// ✍️ UPDATE USER (PUT) +// ====================================================== +func handleUserUpdate(db *sql.DB, w http.ResponseWriter, r *http.Request, userID int64) { + + raw, _ := io.ReadAll(r.Body) + + fmt.Println("🟥 RAW BODY:", string(raw)) + + // body tekrar okunabilsin diye reset + r.Body = io.NopCloser(bytes.NewBuffer(raw)) + + var payload models.UserWrite + + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + fmt.Printf("🟦 DECODED PAYLOAD: %+v\n", payload) + + fmt.Println("❌ JSON DECODE ERROR:", err) + + http.Error(w, "Geçersiz payload", http.StatusBadRequest) + return + } + + tx, err := db.Begin() + if err != nil { + http.Error(w, "Transaction başlatılamadı", http.StatusInternalServerError) + return + } + defer tx.Rollback() + + _, err = tx.Exec( + queries.UpdateUserHeader, + userID, + payload.Code, + payload.IsActive, + payload.FullName, + payload.Email, + payload.Mobile, + payload.Address, + ) + if err != nil { + http.Error(w, "Header güncellenemedi", http.StatusInternalServerError) + return + } + + tx.Exec(`DELETE FROM dfrole_usr WHERE dfusr_id = $1`, userID) + for _, code := range payload.Roles { + tx.Exec(queries.InsertUserRole, userID, code) + } + + tx.Exec(`DELETE FROM dfusr_dprt WHERE dfusr_id = $1`, userID) + for _, d := range payload.Departments { + tx.Exec(queries.InsertUserDepartment, userID, d.Code) + } + + tx.Exec(`DELETE FROM dfusr_piyasa WHERE dfusr_id = $1`, userID) + for _, p := range payload.Piyasalar { + tx.Exec(queries.InsertUserPiyasa, userID, p.Code) + } + + tx.Exec(`DELETE FROM dfusr_nebim_user WHERE dfusr_id = $1`, userID) + for _, n := range payload.NebimUsers { + tx.Exec(queries.InsertUserNebim, userID, n.Username) + } + + if err := tx.Commit(); err != nil { + http.Error(w, "Commit başarısız", http.StatusInternalServerError) + return + } + + _ = json.NewEncoder(w).Encode(map[string]any{"success": true}) +} + +// ====================================================== +// 🔐 ADMIN — PASSWORD RESET MAIL +// ====================================================== +func SendPasswordResetMailHandler( + db *sql.DB, + mailer *mailer.GraphMailer, +) http.HandlerFunc { + + return func(w http.ResponseWriter, r *http.Request) { + + userID, _ := strconv.ParseInt(mux.Vars(r)["id"], 10, 64) + + var email string + err := db.QueryRow(` + SELECT email + FROM mk_dfusr + WHERE id = $1 AND is_active = true + `, userID).Scan(&email) + + if err != nil || email == "" { + w.WriteHeader(http.StatusOK) + return + } + + // 🔑 TOKEN (PLAIN + HASH) + plain, hash, err := security.GenerateResetToken() + if err != nil { + w.WriteHeader(http.StatusOK) + return + } + + expires := time.Now().Add(30 * time.Minute) + + // 💾 DB → SADECE HASH + _, _ = db.Exec(` + INSERT INTO dfusr_password_reset (dfusr_id, token, expires_at) + VALUES ($1,$2,$3) + `, userID, hash, expires) + + // 🔗 URL → PLAIN + resetURL := fmt.Sprintf( + "%s/password-reset/%s", + os.Getenv("FRONTEND_URL"), + plain, + ) + + _ = mailer.SendPasswordResetMail(email, resetURL) + + // 🕵️ AUDIT + auditlog.ForcePasswordChangeStarted( + r.Context(), + userID, + "admin_reset", + ) + + w.WriteHeader(http.StatusOK) + } +} diff --git a/svc/routes/user_list.go b/svc/routes/user_list.go new file mode 100644 index 0000000..56ddc08 --- /dev/null +++ b/svc/routes/user_list.go @@ -0,0 +1,81 @@ +package routes + +import ( + "bssapp-backend/models" + "bssapp-backend/queries" + "database/sql" + "encoding/json" + "log" + "net/http" +) + +// ====================================================== +// 📌 UserListRoute — Kullanıcı Listeleme API (FINAL) +// ====================================================== +func UserListRoute(pg *sql.DB) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Content-Type", "application/json; charset=utf-8") + + // -------------------------------------------------- + // 🔍 Query Param + // -------------------------------------------------- + search := r.URL.Query().Get("search") + log.Printf("📥 /api/users/list çağrıldı | search='%s'", search) + + // -------------------------------------------------- + // 🗄️ SQL CALL + // -------------------------------------------------- + rows, err := queries.GetUserList(pg, search) + if err != nil { + log.Printf("❌ SQL sorgu hatası (GetUserList): %v", err) + http.Error(w, "Veritabanı hatası", http.StatusInternalServerError) + return + } + defer rows.Close() + + // -------------------------------------------------- + // 📦 Sonuç Listesi + // -------------------------------------------------- + list := make([]models.UserListRow, 0, 100) + count := 0 + + // ================================================== + // 🧠 SCAN — SQL SELECT ile BİRE BİR (8 kolon) + // ================================================== + for rows.Next() { + + var u models.UserListRow + + err = rows.Scan( + &u.ID, // 1 + &u.Code, // 2 + &u.IsActive, // 3 + &u.NebimUsername, // 4 (nullable) + &u.UserGroupCode, // 5 (nullable) + &u.RoleNames, // 6 + &u.DepartmentNames, // 7 + &u.PiyasaNames, // 8 + ) + + if err != nil { + log.Printf("⚠️ Satır atlandı (SCAN hatası): %v", err) + continue + } + + list = append(list, u) + count++ + } + + if err := rows.Err(); err != nil { + log.Printf("⚠️ rows.Err(): %v", err) + } + + log.Printf("✅ User listesi tamamlandı — %d kayıt gönderildi.", count) + + // -------------------------------------------------- + // 📤 JSON OUTPUT + // -------------------------------------------------- + _ = json.NewEncoder(w).Encode(list) + }) +} diff --git a/svc/routes/userpermissions.go b/svc/routes/userpermissions.go new file mode 100644 index 0000000..be6252b --- /dev/null +++ b/svc/routes/userpermissions.go @@ -0,0 +1,232 @@ +package routes + +import ( + "bssapp-backend/auth" + "bssapp-backend/internal/auditlog" + "bssapp-backend/permissions" + "database/sql" + "encoding/json" + "fmt" + "log" + "net/http" + "strconv" + "strings" + + "github.com/gorilla/mux" +) + +/* ===================================================== + GET USER OVERRIDES + GET /api/users/{id}/permissions +===================================================== */ + +func GetUserPermissionsHandler(db *sql.DB) http.HandlerFunc { + + return func(w http.ResponseWriter, r *http.Request) { + + // ✅ Auth kontrolü yeterli (Yetki middleware'de) + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + idStr := mux.Vars(r)["id"] + + id, err := strconv.ParseInt(idStr, 10, 64) + if err != nil || id <= 0 { + http.Error(w, "invalid id", http.StatusBadRequest) + return + } + + repo := permissions.NewPermissionRepository(db) + + rows, err := repo.GetUserOverridesByUserID(id) + if err != nil { + http.Error(w, "db error", http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Type", "application/json") + + json.NewEncoder(w).Encode(rows) + } +} + +/* ===================================================== + SAVE USER OVERRIDES + POST /api/users/{id}/permissions +===================================================== */ + +func SaveUserPermissionsHandler(db *sql.DB) http.HandlerFunc { + + return func(w http.ResponseWriter, r *http.Request) { + + // ✅ Auth kontrolü yeterli + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + userIDStr := mux.Vars(r)["id"] + + userID, err := strconv.ParseInt(userIDStr, 10, 64) + if err != nil || userID <= 0 { + http.Error(w, "invalid id", http.StatusBadRequest) + return + } + + /* ================= PAYLOAD ================= */ + + var list []permissions.UserPermissionRequest + + if err := json.NewDecoder(r.Body).Decode(&list); err != nil { + http.Error(w, "bad payload", http.StatusBadRequest) + return + } + + repo := permissions.NewPermissionRepository(db) + + /* ================= OLD ================= */ + + oldRows, _ := repo.GetUserOverridesByUserID(userID) + + oldMap := map[string]bool{} + + for _, p := range oldRows { + key := p.Module + ":" + p.Action + oldMap[key] = p.Allowed + } + + /* ================= NEW ================= */ + + newMap := map[string]bool{} + + for _, p := range list { + key := p.Module + ":" + p.Action + newMap[key] = p.Allowed + } + + /* ================= DIFF ================= */ + + var changes []map[string]any + + for key, newVal := range newMap { + + oldVal := oldMap[key] + + if oldVal != newVal { + + parts := strings.Split(key, ":") + if len(parts) != 2 { + continue + } + + changes = append(changes, map[string]any{ + "module": parts[0], + "action": parts[1], + "before": oldVal, + "after": newVal, + }) + } + } + + /* ================= SAVE ================= */ + + if err := repo.SaveUserOverrides(userID, list); err != nil { + http.Error(w, "db error", http.StatusInternalServerError) + return + } + + /* ================= AUDIT ================= */ + + if len(changes) > 0 && claims != nil { + + var targetUsername string + + _ = db.QueryRow(` + SELECT username + FROM mk_dfusr + WHERE id = $1 + `, userID).Scan(&targetUsername) + + auditlog.Enqueue(r.Context(), auditlog.ActivityLog{ + + ActionType: "user_permission_change", + ActionCategory: "permission", + + ActionTarget: fmt.Sprintf( + "/api/users/%d/permissions", + userID, + ), + + Description: "user permission overrides updated", + + Username: claims.Username, + RoleCode: claims.RoleCode, + DfUsrID: int64(claims.ID), + + TargetDfUsrID: userID, + TargetUsername: targetUsername, + + ChangeBefore: map[string]any{ + "permissions": oldRows, + }, + + ChangeAfter: map[string]any{ + "changes": changes, + }, + + IsSuccess: true, + }) + } + + /* ================= RESPONSE ================= */ + + w.Header().Set("Content-Type", "application/json") + + json.NewEncoder(w).Encode(map[string]any{ + "success": true, + }) + } +} + +/* ===================================================== + OPTIONAL METHOD +===================================================== */ + +func (h *PermissionHandler) SaveUserOverrides(w http.ResponseWriter, r *http.Request) { + + claims, ok := auth.GetClaimsFromContext(r.Context()) + if !ok || claims == nil { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + + userID, _ := strconv.ParseInt(mux.Vars(r)["id"], 10, 64) + + var list []permissions.UserPermissionRequest + + if err := json.NewDecoder(r.Body).Decode(&list); err != nil { + http.Error(w, "bad payload", 400) + return + } + + log.Println("➡️ SAVE USER PERMISSIONS") + log.Println("USER ID:", userID) + log.Println("ITEM COUNT:", len(list)) + + if err := h.Repo.SaveUserOverrides(userID, list); err != nil { + + log.Println("🔥 USER PERMISSION SAVE ERROR") + log.Println("ERROR:", err) + + http.Error(w, err.Error(), 500) + return + } + + json.NewEncoder(w).Encode(map[string]bool{ + "success": true, + }) +} diff --git a/svc/services/auth.go b/svc/services/auth.go new file mode 100644 index 0000000..474d071 --- /dev/null +++ b/svc/services/auth.go @@ -0,0 +1,42 @@ +package services + +import ( + "bssapp-backend/models" + "strings" + + "golang.org/x/crypto/bcrypt" +) + +// CheckPasswordWithLegacy +// - SADECE doğrulama yapar +// - DB write YAPMAZ +// - Migration kararını caller verir +func CheckPasswordWithLegacy(user *models.User, plain string) bool { + if user == nil { + return false + } + + plain = strings.TrimSpace(plain) + if plain == "" { + return false + } + + stored := strings.TrimSpace(user.Upass) + if stored == "" { + return false + } + + // 1️⃣ bcrypt hash mi? + if isBcryptHash(stored) { + return bcrypt.CompareHashAndPassword([]byte(stored), []byte(plain)) == nil + } + + // 2️⃣ TAM LEGACY — düz metin (eski kayıtlar) + return stored == plain +} + +func isBcryptHash(s string) bool { + return strings.HasPrefix(s, "$2a$") || + strings.HasPrefix(s, "$2b$") || + strings.HasPrefix(s, "$2y$") +} diff --git a/svc/utils/error.go b/svc/utils/error.go new file mode 100644 index 0000000..527cec1 --- /dev/null +++ b/svc/utils/error.go @@ -0,0 +1,8 @@ +// utils/logger.go +package utils + +import "log" + +func LogError(scope string, err error) { + log.Printf("[%s] %v", scope, err) +} diff --git a/svc/utils/mail.env b/svc/utils/mail.env new file mode 100644 index 0000000..bbd1fe0 --- /dev/null +++ b/svc/utils/mail.env @@ -0,0 +1,6 @@ +SMTP_HOST=smtp.office365.com +SMTP_PORT=587 +SMTP_USERNAME=admin@baggi.com.tr +SMTP_PASSWORD=Tav34909 +SMTP_FROM=admin@baggi.com.tr +SMTP_STARTTLS=true diff --git a/svc/utils/utils.go b/svc/utils/utils.go new file mode 100644 index 0000000..cf9addd --- /dev/null +++ b/svc/utils/utils.go @@ -0,0 +1,17 @@ +package utils + +import ( + "bssapp-backend/auth" + "bssapp-backend/models" +) + +func UserFromClaims(c *auth.Claims) *models.User { + if c == nil { + return nil + } + + return &models.User{ + ID: int(c.ID), + Username: c.Username, + } +} diff --git a/svc/utils/uuid.go b/svc/utils/uuid.go new file mode 100644 index 0000000..b45d29f --- /dev/null +++ b/svc/utils/uuid.go @@ -0,0 +1,11 @@ +// utils/uuid.go +package utils + +import ( + "github.com/google/uuid" +) + +// NewUUID returns a new random UUID (v4) +func NewUUID() string { + return uuid.New().String() +} diff --git a/ui/-.editorconfig b/ui/-.editorconfig new file mode 100644 index 0000000..f654551 --- /dev/null +++ b/ui/-.editorconfig @@ -0,0 +1,7 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}] +charset = utf-8 +indent_size = 2 +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/ui/.editorconfig b/ui/.editorconfig new file mode 100644 index 0000000..f654551 --- /dev/null +++ b/ui/.editorconfig @@ -0,0 +1,7 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}] +charset = utf-8 +indent_size = 2 +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/ui/.gitignore b/ui/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/ui/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/ui/.idea/.gitignore b/ui/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/ui/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/ui/.idea/baggisoftwaresystem.iml b/ui/.idea/baggisoftwaresystem.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/ui/.idea/baggisoftwaresystem.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/ui/.idea/modules.xml b/ui/.idea/modules.xml new file mode 100644 index 0000000..bd6893d --- /dev/null +++ b/ui/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/ui/.idea/vcs.xml b/ui/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/ui/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ui/.npmrc b/ui/.npmrc new file mode 100644 index 0000000..eb19082 --- /dev/null +++ b/ui/.npmrc @@ -0,0 +1,5 @@ +# pnpm-related options +shamefully-hoist=true +strict-peer-dependencies=false +# to get the latest compatible packages when creating the project https://github.com/pnpm/pnpm/issues/6463 +resolution-mode=highest diff --git a/ui/.quasar/dev-spa/app.js b/ui/.quasar/dev-spa/app.js new file mode 100644 index 0000000..608c77d --- /dev/null +++ b/ui/.quasar/dev-spa/app.js @@ -0,0 +1,77 @@ +/* eslint-disable */ +/** + * THIS FILE IS GENERATED AUTOMATICALLY. + * DO NOT EDIT. + * + * You are probably looking on adding startup/initialization code. + * Use "quasar new boot " and add it there. + * One boot file per concern. Then reference the file(s) in quasar.config file > boot: + * boot: ['file', ...] // do not add ".js" extension to it. + * + * Boot files are your "main.js" + **/ + + + + + +import { Quasar } from 'quasar' +import { markRaw } from 'vue' +import RootComponent from 'app/src/App.vue' + +import createStore from 'app/src/stores/index' +import createRouter from 'app/src/router/index' + + + + + +export default async function (createAppFn, quasarUserOptions) { + + + // Create the app instance. + // Here we inject into it the Quasar UI, the router & possibly the store. + const app = createAppFn(RootComponent) + + + app.config.performance = true + + + app.use(Quasar, quasarUserOptions) + + + + + const store = typeof createStore === 'function' + ? await createStore({}) + : createStore + + + app.use(store) + + + + + + const router = markRaw( + typeof createRouter === 'function' + ? await createRouter({store}) + : createRouter + ) + + + // make router instance available in store + + store.use(({ store }) => { store.router = router }) + + + + // Expose the app, the router and the store. + // Note that we are not mounting the app here, since bootstrapping will be + // different depending on whether we are in a browser or on the server. + return { + app, + store, + router + } +} diff --git a/ui/.quasar/dev-spa/client-entry.js b/ui/.quasar/dev-spa/client-entry.js new file mode 100644 index 0000000..9e9e8bf --- /dev/null +++ b/ui/.quasar/dev-spa/client-entry.js @@ -0,0 +1,158 @@ +/* eslint-disable */ +/** + * THIS FILE IS GENERATED AUTOMATICALLY. + * DO NOT EDIT. + * + * You are probably looking on adding startup/initialization code. + * Use "quasar new boot " and add it there. + * One boot file per concern. Then reference the file(s) in quasar.config file > boot: + * boot: ['file', ...] // do not add ".js" extension to it. + * + * Boot files are your "main.js" + **/ + + +import { createApp } from 'vue' + + + + + + + +import '@quasar/extras/roboto-font/roboto-font.css' + +import '@quasar/extras/material-icons/material-icons.css' + + + + +// We load Quasar stylesheet file +import 'quasar/dist/quasar.sass' + + + + +import 'src/css/app.css' + + +import createQuasarApp from './app.js' +import quasarUserOptions from './quasar-user-options.js' + + + + + + +console.info('[Quasar] Running SPA.') + + + +const publicPath = `/` + + +async function start ({ + app, + router + , store +}, bootFiles) { + + let hasRedirected = false + const getRedirectUrl = url => { + try { return router.resolve(url).href } + catch (err) {} + + return Object(url) === url + ? null + : url + } + const redirect = url => { + hasRedirected = true + + if (typeof url === 'string' && /^https?:\/\//.test(url)) { + window.location.href = url + return + } + + const href = getRedirectUrl(url) + + // continue if we didn't fail to resolve the url + if (href !== null) { + window.location.href = href + window.location.reload() + } + } + + const urlPath = window.location.href.replace(window.location.origin, '') + + for (let i = 0; hasRedirected === false && i < bootFiles.length; i++) { + try { + await bootFiles[i]({ + app, + router, + store, + ssrContext: null, + redirect, + urlPath, + publicPath + }) + } + catch (err) { + if (err && err.url) { + redirect(err.url) + return + } + + console.error('[Quasar] boot error:', err) + return + } + } + + if (hasRedirected === true) return + + + app.use(router) + + + + + + + app.mount('#q-app') + + + +} + +createQuasarApp(createApp, quasarUserOptions) + + .then(app => { + // eventually remove this when Cordova/Capacitor/Electron support becomes old + const [ method, mapFn ] = Promise.allSettled !== void 0 + ? [ + 'allSettled', + bootFiles => bootFiles.map(result => { + if (result.status === 'rejected') { + console.error('[Quasar] boot error:', result.reason) + return + } + return result.value.default + }) + ] + : [ + 'all', + bootFiles => bootFiles.map(entry => entry.default) + ] + + return Promise[ method ]([ + + import(/* webpackMode: "eager" */ 'boot/axios'), + + import(/* webpackMode: "eager" */ 'boot/dayjs') + + ]).then(bootFiles => { + const boot = mapFn(bootFiles).filter(entry => typeof entry === 'function') + start(app, boot) + }) + }) + diff --git a/ui/.quasar/dev-spa/client-prefetch.js b/ui/.quasar/dev-spa/client-prefetch.js new file mode 100644 index 0000000..9bbe3c5 --- /dev/null +++ b/ui/.quasar/dev-spa/client-prefetch.js @@ -0,0 +1,116 @@ +/* eslint-disable */ +/** + * THIS FILE IS GENERATED AUTOMATICALLY. + * DO NOT EDIT. + * + * You are probably looking on adding startup/initialization code. + * Use "quasar new boot " and add it there. + * One boot file per concern. Then reference the file(s) in quasar.config file > boot: + * boot: ['file', ...] // do not add ".js" extension to it. + * + * Boot files are your "main.js" + **/ + + + +import App from 'app/src/App.vue' +let appPrefetch = typeof App.preFetch === 'function' + ? App.preFetch + : ( + // Class components return the component options (and the preFetch hook) inside __c property + App.__c !== void 0 && typeof App.__c.preFetch === 'function' + ? App.__c.preFetch + : false + ) + + +function getMatchedComponents (to, router) { + const route = to + ? (to.matched ? to : router.resolve(to).route) + : router.currentRoute.value + + if (!route) { return [] } + + const matched = route.matched.filter(m => m.components !== void 0) + + if (matched.length === 0) { return [] } + + return Array.prototype.concat.apply([], matched.map(m => { + return Object.keys(m.components).map(key => { + const comp = m.components[key] + return { + path: m.path, + c: comp + } + }) + })) +} + +export function addPreFetchHooks ({ router, store, publicPath }) { + // Add router hook for handling preFetch. + // Doing it after initial route is resolved so that we don't double-fetch + // the data that we already have. Using router.beforeResolve() so that all + // async components are resolved. + router.beforeResolve((to, from, next) => { + const + urlPath = window.location.href.replace(window.location.origin, ''), + matched = getMatchedComponents(to, router), + prevMatched = getMatchedComponents(from, router) + + let diffed = false + const preFetchList = matched + .filter((m, i) => { + return diffed || (diffed = ( + !prevMatched[i] || + prevMatched[i].c !== m.c || + m.path.indexOf('/:') > -1 // does it has params? + )) + }) + .filter(m => m.c !== void 0 && ( + typeof m.c.preFetch === 'function' + // Class components return the component options (and the preFetch hook) inside __c property + || (m.c.__c !== void 0 && typeof m.c.__c.preFetch === 'function') + )) + .map(m => m.c.__c !== void 0 ? m.c.__c.preFetch : m.c.preFetch) + + + if (appPrefetch !== false) { + preFetchList.unshift(appPrefetch) + appPrefetch = false + } + + + if (preFetchList.length === 0) { + return next() + } + + let hasRedirected = false + const redirect = url => { + hasRedirected = true + next(url) + } + const proceed = () => { + + if (hasRedirected === false) { next() } + } + + + + preFetchList.reduce( + (promise, preFetch) => promise.then(() => hasRedirected === false && preFetch({ + store, + currentRoute: to, + previousRoute: from, + redirect, + urlPath, + publicPath + })), + Promise.resolve() + ) + .then(proceed) + .catch(e => { + console.error(e) + proceed() + }) + }) +} diff --git a/ui/.quasar/dev-spa/quasar-user-options.js b/ui/.quasar/dev-spa/quasar-user-options.js new file mode 100644 index 0000000..ac1dae3 --- /dev/null +++ b/ui/.quasar/dev-spa/quasar-user-options.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +/** + * THIS FILE IS GENERATED AUTOMATICALLY. + * DO NOT EDIT. + * + * You are probably looking on adding startup/initialization code. + * Use "quasar new boot " and add it there. + * One boot file per concern. Then reference the file(s) in quasar.config file > boot: + * boot: ['file', ...] // do not add ".js" extension to it. + * + * Boot files are your "main.js" + **/ + +import lang from 'quasar/lang/tr.js' + + + +import {Loading,Dialog,Notify} from 'quasar' + + + +export default { config: {"notify":{"position":"top","timeout":2500}},lang,plugins: {Loading,Dialog,Notify} } + diff --git a/ui/.quasar/feature-flags.d.ts b/ui/.quasar/feature-flags.d.ts new file mode 100644 index 0000000..dab07b3 --- /dev/null +++ b/ui/.quasar/feature-flags.d.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +import "quasar/dist/types/feature-flag.d.ts"; + +declare module "quasar/dist/types/feature-flag.d.ts" { + interface QuasarFeatureFlags { + store: true; + } +} diff --git a/ui/.quasar/pinia.d.ts b/ui/.quasar/pinia.d.ts new file mode 100644 index 0000000..5bc0a53 --- /dev/null +++ b/ui/.quasar/pinia.d.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +import { Router } from 'vue-router'; + +declare module 'pinia' { + export interface PiniaCustomProperties { + readonly router: Router; + } +} diff --git a/ui/.quasar/quasar.d.ts b/ui/.quasar/quasar.d.ts new file mode 100644 index 0000000..e37de88 --- /dev/null +++ b/ui/.quasar/quasar.d.ts @@ -0,0 +1,4 @@ +/* eslint-disable */ +/// + +/// diff --git a/ui/.quasar/tsconfig.json b/ui/.quasar/tsconfig.json new file mode 100644 index 0000000..99f52b3 --- /dev/null +++ b/ui/.quasar/tsconfig.json @@ -0,0 +1,94 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "skipLibCheck": true, + "target": "esnext", + "allowJs": true, + "resolveJsonModule": true, + "moduleDetection": "force", + "isolatedModules": true, + "module": "preserve", + "noEmit": true, + "lib": [ + "esnext", + "dom", + "dom.iterable" + ], + "paths": { + "src": [ + "./../src" + ], + "src/*": [ + "./../src/*" + ], + "app": [ + "./.." + ], + "app/*": [ + "./../*" + ], + "components": [ + "./../src/components" + ], + "components/*": [ + "./../src/components/*" + ], + "layouts": [ + "./../src/layouts" + ], + "layouts/*": [ + "./../src/layouts/*" + ], + "pages": [ + "./../src/pages" + ], + "pages/*": [ + "./../src/pages/*" + ], + "assets": [ + "./../src/assets" + ], + "assets/*": [ + "./../src/assets/*" + ], + "boot": [ + "./../src/boot" + ], + "boot/*": [ + "./../src/boot/*" + ], + "stores": [ + "./../src/stores" + ], + "stores/*": [ + "./../src/stores/*" + ], + "#q-app": [ + "./../node_modules/@quasar/app-webpack/types/index.d.ts" + ], + "#q-app/wrappers": [ + "./../node_modules/@quasar/app-webpack/types/app-wrappers.d.ts" + ], + "#q-app/bex/background": [ + "./../node_modules/@quasar/app-webpack/types/bex/entrypoints/background.d.ts" + ], + "#q-app/bex/content": [ + "./../node_modules/@quasar/app-webpack/types/bex/entrypoints/content.d.ts" + ], + "#q-app/bex/private/bex-bridge": [ + "./../node_modules/@quasar/app-webpack/types/bex/bex-bridge.d.ts" + ] + } + }, + "include": [ + "./**/*.d.ts", + "./../**/*" + ], + "exclude": [ + "./../dist", + "./../node_modules", + "./../src-capacitor", + "./../src-cordova", + "./../quasar.config.*.temporary.compiled*" + ] +} \ No newline at end of file diff --git a/ui/.vscode/extensions.json b/ui/.vscode/extensions.json new file mode 100644 index 0000000..f7f50b4 --- /dev/null +++ b/ui/.vscode/extensions.json @@ -0,0 +1,13 @@ +{ + "recommendations": [ + "editorconfig.editorconfig", + "vue.volar", + "wayou.vscode-todo-highlight" + ], + "unwantedRecommendations": [ + "octref.vetur", + "hookyqr.beautify", + "dbaeumer.jshint", + "ms-vscode.vscode-typescript-tslint-plugin" + ] +} \ No newline at end of file diff --git a/ui/.vscode/settings.json b/ui/.vscode/settings.json new file mode 100644 index 0000000..fdb070a --- /dev/null +++ b/ui/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.bracketPairColorization.enabled": true, + "editor.guides.bracketPairs": true +} \ No newline at end of file diff --git a/ui/README.md b/ui/README.md new file mode 100644 index 0000000..ebe8f5b --- /dev/null +++ b/ui/README.md @@ -0,0 +1,24 @@ +# Quasar App (baggisowtfaresystem) + +A Quasar Project + +## Install the dependencies +```bash +yarn +# or +npm install +``` + +### Start the app in development mode (hot-code reloading, error reporting, etc.) +```bash +quasar dev +``` + + +### Build the app for production +```bash +quasar build +``` + +### Customize the configuration +See [Configuring quasar.config.js](https://v2.quasar.dev/quasar-cli-webpack/quasar-config-js). diff --git a/ui/babel.config.js b/ui/babel.config.js new file mode 100644 index 0000000..d907762 --- /dev/null +++ b/ui/babel.config.js @@ -0,0 +1,12 @@ +export default api => { + return { + presets: [ + [ + '@quasar/babel-preset-app', + api.caller(caller => caller && caller.target === 'node') + ? { targets: { node: 'current' } } + : {} + ] + ] + } +} diff --git a/ui/index.html b/ui/index.html new file mode 100644 index 0000000..3c8c78f --- /dev/null +++ b/ui/index.html @@ -0,0 +1,21 @@ + + + + <%= productName %> + + + + + + + + + + + + + + + + + diff --git a/ui/jsconfig.json b/ui/jsconfig.json new file mode 100644 index 0000000..f154205 --- /dev/null +++ b/ui/jsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./.quasar/tsconfig.json" +} \ No newline at end of file diff --git a/ui/package-lock.json b/ui/package-lock.json new file mode 100644 index 0000000..beb6054 --- /dev/null +++ b/ui/package-lock.json @@ -0,0 +1,12102 @@ +{ + "name": "baggisowtfaresystem", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "baggisowtfaresystem", + "version": "0.0.1", + "hasInstallScript": true, + "dependencies": { + "@quasar/extras": "^1.16.4", + "axios": "^1.12.2", + "core-js": "^3.31.1", + "dayjs": "^1.11.18", + "pinia": "^3.0.1", + "quasar": "^2.16.0", + "vue": "3.5.20", + "vue-router": "^4.0.12" + }, + "devDependencies": { + "@quasar/app-webpack": "^4.1.0", + "autoprefixer": "^10.4.2" + }, + "engines": { + "node": "^28 || ^26 || ^24 || ^22 || ^20 || ^18", + "npm": ">= 6.13.4", + "yarn": ">= 1.21.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-function-sent": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.27.1.tgz", + "integrity": "sha512-xA8Bqt8p12TxOFy3os20LxmOoHjyhzRC3zBql57d2W/YarNHgxHB4IlLHf3nXb7N6vSZ6kAdOoK2z5h0evGMhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-throw-expressions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.27.1.tgz", + "integrity": "sha512-pnGZCFdGiN3vHk54wWIvLJV3MXviRjCkSWhPtCkra6AW3AP3AcrRByT5jOnuk6nwu9VYT/B7ujdaLiBnkmc0hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.9.0.tgz", + "integrity": "sha512-rnJenoStJ8nvmt9Gzye8nkYd6V22xUAnu4086ER7h1zJ508vStko4pMvDeQ446ilDTFpV5wnoc5YS7XvMwwMqA==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-3.0.1.tgz", + "integrity": "sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-4.0.1.tgz", + "integrity": "sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.5.5", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.18.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.8.tgz", + "integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@inquirer/core/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@inquirer/editor": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-3.0.1.tgz", + "integrity": "sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-3.0.1.tgz", + "integrity": "sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", + "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-3.0.1.tgz", + "integrity": "sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-2.0.1.tgz", + "integrity": "sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-3.0.1.tgz", + "integrity": "sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-6.0.1.tgz", + "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^3.0.1", + "@inquirer/confirm": "^4.0.1", + "@inquirer/editor": "^3.0.1", + "@inquirer/expand": "^3.0.1", + "@inquirer/input": "^3.0.1", + "@inquirer/number": "^2.0.1", + "@inquirer/password": "^3.0.1", + "@inquirer/rawlist": "^3.0.1", + "@inquirer/search": "^2.0.1", + "@inquirer/select": "^3.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-3.0.1.tgz", + "integrity": "sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-2.0.1.tgz", + "integrity": "sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-3.0.1.tgz", + "integrity": "sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", + "dev": true, + "license": "MIT", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", + "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.15.0.tgz", + "integrity": "sha512-7jK0nAXj7g2hiwJ7b3wx569ZohkTFYcgDP18OvaYQ+Bg+D7rzrwaYxkdM6snrxIoKCisbudao8kfJZ4NCLiHjw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.1", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@quasar/app-webpack": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@quasar/app-webpack/-/app-webpack-4.3.1.tgz", + "integrity": "sha512-u1fgzDcGkMwf82mLNO2P+4uBE0FM0nR/f8Xrpsim7jMTakhQv5mmMzGcZjnGkxZRQbYx9M4FDT3paSfCPJoxrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quasar/babel-preset-app": "^2.0.3", + "@quasar/render-ssr-error": "^1.0.3", + "@quasar/ssl-certificate": "^1.0.0", + "@quasar/ssr-helpers": "3.0.2", + "@rollup/pluginutils": "^5.1.0", + "@types/chrome": "^0.0.271", + "@types/compression": "^1.7.5", + "@types/cordova": "^11.0.3", + "@types/express": "^4.17.21", + "@types/webpack-bundle-analyzer": "^4.7.0", + "archiver": "^7.0.1", + "browserslist": "^4.23.3", + "chokidar": "^4.0.0", + "ci-info": "^4.0.0", + "compression-webpack-plugin": "^11.1.0", + "confbox": "^0.1.8", + "copy-webpack-plugin": "^12.0.2", + "cross-spawn": "^7.0.6", + "css-loader": "^7.1.2", + "css-minimizer-webpack-plugin": "^7.0.0", + "cssnano": "^7.0.6", + "dot-prop": "^9.0.0", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "elementtree": "0.1.7", + "error-stack-parser": "^2.1.4", + "esbuild": "^0.25.0", + "express": "^4.21.2", + "file-loader": "^6.2.0", + "fs-extra": "^11.2.0", + "hash-sum": "^2.0.0", + "html-minifier-terser": "^7.2.0", + "html-webpack-plugin": "^5.6.0", + "inquirer": "^11.0.2", + "isbinaryfile": "^5.0.2", + "kolorist": "^1.8.0", + "launch-editor-middleware": "^2.9.1", + "lodash": "^4.17.21", + "log-update": "^6.1.0", + "mini-css-extract-plugin": "^2.9.1", + "minimist": "^1.2.8", + "node-loader": "^2.0.0", + "null-loader": "^4.0.1", + "open": "^10.1.0", + "postcss": "^8.4.47", + "postcss-loader": "^8.1.1", + "postcss-rtlcss": "^5.4.0", + "rollup-plugin-visualizer": "^5.12.0", + "sass-embedded": "^1.80.2", + "sass-loader": "^16.0.1", + "semver": "^7.6.3", + "serialize-javascript": "^6.0.2", + "terser-webpack-plugin": "^5.3.10", + "tinyglobby": "^0.2.10", + "ts-essentials": "^10.0.2", + "url-loader": "^4.1.1", + "vue-loader": "^17.4.2", + "vue-style-loader": "^4.1.3", + "webpack": "^5.94.0", + "webpack-5-chain": "8.0.2", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-middleware": "^7.4.2", + "webpack-dev-server": "^5.1.0", + "webpack-hot-middleware": "^2.26.1", + "webpack-merge": "^6.0.1", + "webpack-node-externals": "^3.0.0" + }, + "bin": { + "quasar": "bin/quasar" + }, + "engines": { + "node": "^28 || ^26 || ^24 || ^22 || ^20 || ^18 || ^16", + "npm": ">= 6.14.12", + "yarn": ">= 1.17.3" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + }, + "peerDependencies": { + "@electron/packager": ">= 18", + "electron-builder": ">= 22", + "eslint": "^8.57.1 || ^9.0.0", + "pinia": "^2.0.0 || ^3.0.0", + "quasar": "^2.16.0", + "typescript": ">= 5.4", + "vue": "^3.2.29", + "vue-router": "^4.0.12", + "workbox-webpack-plugin": ">= 6" + }, + "peerDependenciesMeta": { + "@electron/packager": { + "optional": true + }, + "electron-builder": { + "optional": true + }, + "eslint": { + "optional": true + }, + "pinia": { + "optional": true + }, + "typescript": { + "optional": true + }, + "workbox-build": { + "optional": true + }, + "workbox-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/@quasar/babel-preset-app": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@quasar/babel-preset-app/-/babel-preset-app-2.0.3.tgz", + "integrity": "sha512-PYvVXU/TBwF1JU+nEKw8VTsbNi4mdhu7l+l9HIqfY0XZGWbDQLOGjBR8TO6A8dn5SUoilvRh85TG3ZQV01VCBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.4.4", + "@babel/plugin-proposal-function-sent": "^7.2.0", + "@babel/plugin-proposal-throw-expressions": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-import-meta": "^7.2.0", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-runtime": "^7.9.0", + "@babel/preset-env": "^7.9.0", + "@babel/runtime": "^7.9.0", + "babel-loader": "^9.1.2", + "babel-plugin-dynamic-import-node": "^2.3.0", + "babel-plugin-module-resolver": "^5.0.0", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 5.6.0", + "yarn": ">= 1.6.0" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + } + }, + "node_modules/@quasar/extras": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.17.0.tgz", + "integrity": "sha512-KqAHdSJfIDauiR1nJ8rqHWT0diqD0QradZKoVIZJAilHAvgwyPIY7MbyR2z4RIMkUIMUSqBZcbshMpEw+9A30w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + } + }, + "node_modules/@quasar/render-ssr-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@quasar/render-ssr-error/-/render-ssr-error-1.0.3.tgz", + "integrity": "sha512-A8RF99q6/sOSe1Ighnh5syEIbliD3qUYEJd2HyfFyBPSMF+WYGXon5dmzg4nUoK662NgOggInevkDyBDJcZugg==", + "dev": true, + "license": "MIT", + "dependencies": { + "stack-trace": "^1.0.0-pre2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + } + }, + "node_modules/@quasar/ssl-certificate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@quasar/ssl-certificate/-/ssl-certificate-1.0.0.tgz", + "integrity": "sha512-RhZF7rO76T7Ywer1/5lCe7xl3CIiXxSAH1xgwOj0wcHTityDxJqIN/5YIj6BxMvlFw8XkJDoB1udEQafoVFA4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "selfsigned": "^2.1.1" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + } + }, + "node_modules/@quasar/ssr-helpers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@quasar/ssr-helpers/-/ssr-helpers-3.0.2.tgz", + "integrity": "sha512-JhHDk86o1ucR6toNkpIaAsgA0KuKKYDrOKJHN0O7IEvI2bQOCnmL9ttgRI/A4EeWOe4davqNFfwcwjuk0Ecv/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 12.22.1" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chrome": { + "version": "0.0.271", + "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.271.tgz", + "integrity": "sha512-K0qgXvkwA5ic+/eygF1xiypHEvCoBgH5lwrhg3yva2mqJuCWyYm0vpZQ22GksAxgGfo0PWev9Zx3plp2clMlwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/filesystem": "*", + "@types/har-format": "*" + } + }, + "node_modules/@types/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cordova": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-11.0.3.tgz", + "integrity": "sha512-kyuRQ40/NWQVhqGIHq78Ehu2Bf9Mlg0LhmSmis6ZFJK7z933FRfYi8tHe/k/0fB+PGfCf95rJC6TO7dopaFvAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/filesystem": { + "version": "0.0.36", + "resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.36.tgz", + "integrity": "sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/filewriter": "*" + } + }, + "node_modules/@types/filewriter": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.33.tgz", + "integrity": "sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/har-format": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz", + "integrity": "sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", + "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.14.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.0.tgz", + "integrity": "sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz", + "integrity": "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/webpack-bundle-analyzer": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz", + "integrity": "sha512-c5i2ThslSNSG8W891BRvOd/RoCjI2zwph8maD22b1adtSns20j+0azDDMCK06DiVrzTgnwiDl5Ntmu1YRJw8Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" + } + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.20.tgz", + "integrity": "sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@vue/shared": "3.5.20", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.20.tgz", + "integrity": "sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.20.tgz", + "integrity": "sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@vue/compiler-core": "3.5.20", + "@vue/compiler-dom": "3.5.20", + "@vue/compiler-ssr": "3.5.20", + "@vue/shared": "3.5.20", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.20.tgz", + "integrity": "sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.20.tgz", + "integrity": "sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.20.tgz", + "integrity": "sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.20.tgz", + "integrity": "sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.20", + "@vue/runtime-core": "3.5.20", + "@vue/shared": "3.5.20", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.20.tgz", + "integrity": "sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.20", + "@vue/shared": "3.5.20" + }, + "peerDependencies": { + "vue": "3.5.20" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.20.tgz", + "integrity": "sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-module-resolver": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.2.tgz", + "integrity": "sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-babel-config": "^2.1.1", + "glob": "^9.3.3", + "pkg-up": "^3.1.0", + "reselect": "^4.1.7", + "resolve": "^1.22.8" + } + }, + "node_modules/babel-plugin-module-resolver/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-module-resolver/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/babel-plugin-module-resolver/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.12.tgz", + "integrity": "sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birpc": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.6.1.tgz", + "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "dev": true, + "license": "MIT/X11" + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001748", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz", + "integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true, + "license": "ISC" + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression-webpack-plugin": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-11.1.0.tgz", + "integrity": "sha512-zDOQYp10+upzLxW+VRSjEpRRwBXJdsb5lBMlRxx1g8hckIFBpe3DTI0en2w7h+beuq89576RVzfiXrkdPGrHhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.1", + "globby": "^14.0.0", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/core-js": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.45.1.tgz", + "integrity": "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", + "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.2.tgz", + "integrity": "sha512-nBRWZtI77PBZQgcXMNqiIXVshiQOVLGSf2qX/WZfG8IQfMbeHUMXaBWQmiiSTmPJUflQxHjZjzAmuyO7tpL2Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "cssnano": "^7.0.4", + "jest-worker": "^29.7.0", + "postcss": "^8.4.40", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.1.tgz", + "integrity": "sha512-fm4D8ti0dQmFPeF8DXSAA//btEmqCOgAc/9Oa3C1LW94h5usNrJEfrON7b4FkPZgnDEn6OUs5NdxiJZmAtGOpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^7.0.9", + "lilconfig": "^3.1.3" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/cssnano-preset-default": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.9.tgz", + "integrity": "sha512-tCD6AAFgYBOVpMBX41KjbvRh9c2uUjLXRyV7KHSIrwHiq5Z9o0TFfUCoM3TwVrRsRteN3sVXGNvjVNxYzkpTsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.1", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.1", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^7.0.4", + "postcss-convert-values": "^7.0.7", + "postcss-discard-comments": "^7.0.4", + "postcss-discard-duplicates": "^7.0.2", + "postcss-discard-empty": "^7.0.1", + "postcss-discard-overridden": "^7.0.1", + "postcss-merge-longhand": "^7.0.5", + "postcss-merge-rules": "^7.0.6", + "postcss-minify-font-values": "^7.0.1", + "postcss-minify-gradients": "^7.0.1", + "postcss-minify-params": "^7.0.4", + "postcss-minify-selectors": "^7.0.5", + "postcss-normalize-charset": "^7.0.1", + "postcss-normalize-display-values": "^7.0.1", + "postcss-normalize-positions": "^7.0.1", + "postcss-normalize-repeat-style": "^7.0.1", + "postcss-normalize-string": "^7.0.1", + "postcss-normalize-timing-functions": "^7.0.1", + "postcss-normalize-unicode": "^7.0.4", + "postcss-normalize-url": "^7.0.1", + "postcss-normalize-whitespace": "^7.0.1", + "postcss-ordered-values": "^7.0.2", + "postcss-reduce-initial": "^7.0.4", + "postcss-reduce-transforms": "^7.0.1", + "postcss-svgo": "^7.1.0", + "postcss-unique-selectors": "^7.0.4" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/cssnano-utils": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz", + "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", + "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^4.18.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.232", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.232.tgz", + "integrity": "sha512-ENirSe7wf8WzyPCibqKUG1Cg43cPaxH4wRR7AJsX7MCABCHBIOFqvaYODSLKUuZdraxUTHRE/0A2Aq8BYKEHOg==", + "dev": true, + "license": "ISC" + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-babel-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-2.1.2.tgz", + "integrity": "sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.3" + } + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true, + "license": "MIT" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-11.1.0.tgz", + "integrity": "sha512-CmLAZT65GG/v30c+D2Fk8+ceP6pxD6RL+hIUOWAltCmeyEqWYwqu9v76q03OvjyZ3AB0C1Ala2stn1z/rMqGEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^9.2.1", + "@inquirer/prompts": "^6.0.1", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "ansi-escapes": "^4.3.2", + "mute-stream": "^1.0.0", + "run-async": "^3.0.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", + "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.6.tgz", + "integrity": "sha512-I+NmIfBHUl+r2wcDd6JwE9yWje/PIVY/R5/CmV8dXLZd5K+L9X2klAOwfAHNnondLXkbHyTAleQAWonpTJBTtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/launch-editor-middleware": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.11.1.tgz", + "integrity": "sha512-6xpn4pJz5mDg2kUH7L6gK5BuZcZPdVwoSs/DhfebefwLyszNXqFFjksGup/w4CTRzzrr8FSEufDzb/gKFLle6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "launch-editor": "^2.11.1" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", + "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.49.0.tgz", + "integrity": "sha512-L9uC9vGuc4xFybbdOpRLoOAOq1YEBBsocCs5NVW32DfU+CZWWIn3OVF+lB8Gp4ttBVSMazwrTrjv8ussX/e3VQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-loader": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.1.0.tgz", + "integrity": "sha512-OwjPkyh8+7jW8DMd/iq71uU1Sspufr/C2+c3t0p08J3CrM9ApZ4U53xuisNrDXOHyGi5OYHgtfmmh+aK9zJA6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz", + "integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/postcss-colormin": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.4.tgz", + "integrity": "sha512-ziQuVzQZBROpKpfeDwmrG+Vvlr0YWmY/ZAk99XD+mGEBuEojoFekL41NCsdhyNUtZI7DPOoIWIR7vQQK9xwluw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.1", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-convert-values": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.7.tgz", + "integrity": "sha512-HR9DZLN04Xbe6xugRH6lS4ZQH2zm/bFh/ZyRkpedZozhvh+awAfbA0P36InO4fZfDhvYfNJeNvlTf1sjwGbw/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-comments": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz", + "integrity": "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", + "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-empty": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", + "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", + "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-loader": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.0.tgz", + "integrity": "sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^2.5.1", + "semver": "^7.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-merge-longhand": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", + "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.5" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-merge-rules": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.6.tgz", + "integrity": "sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.1", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.1", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", + "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", + "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-params": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.4.tgz", + "integrity": "sha512-3OqqUddfH8c2e7M35W6zIwv7jssM/3miF9cbCSb1iJiWvtguQjlxZGIHK9JRmc8XAKmE2PFGtHSM7g/VcW97sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.1", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", + "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", + "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", + "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", + "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", + "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-string": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", + "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", + "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.4.tgz", + "integrity": "sha512-LvIURTi1sQoZqj8mEIE8R15yvM+OhbR1avynMtI9bUzj5gGKR/gfZFd8O7VMj0QgJaIFzxDwxGl/ASMYAkqO8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-url": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", + "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", + "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-ordered-values": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", + "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.4.tgz", + "integrity": "sha512-rdIC9IlMBn7zJo6puim58Xd++0HdbvHeHaPgXsimMfG1ijC5A9ULvNLSE0rUKVJOvNMcwewW4Ga21ngyJjY/+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.1", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", + "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-rtlcss": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/postcss-rtlcss/-/postcss-rtlcss-5.7.1.tgz", + "integrity": "sha512-zE68CuARv5StOG/UQLa0W1Y/raUTzgJlfjtas43yh3/G1BFmoPEaHxPRHgeowXRFFhW33FehrNgsljxRLmPVWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "rtlcss": "4.3.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz", + "integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^4.0.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", + "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quasar": { + "version": "2.18.5", + "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.18.5.tgz", + "integrity": "sha512-5ItDSsNjqBVRrC7SqcdvT1F5mghVyJ/KmaWNwnaT5mM91a7gWpT/d7wTCIFxxDbWLZdkHKI+cpdudEqnfcSw9A==", + "license": "MIT", + "engines": { + "node": ">= 10.18.1", + "npm": ">= 6.13.4", + "yarn": ">= 1.21.1" + }, + "funding": { + "type": "github", + "url": "https://donate.quasar.dev" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup-plugin-visualizer": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz", + "integrity": "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "open": "^8.4.0", + "picomatch": "^4.0.2", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "rolldown": "1.x", + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "dev": true, + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", + "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-embedded": { + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.93.2.tgz", + "integrity": "sha512-FvQdkn2dZ8DGiLgi0Uf4zsj7r/BsiLImNa5QJ10eZalY6NfZyjrmWGFcuCN5jNwlDlXFJnftauv+UtvBKLvepQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.93.2", + "sass-embedded-android-arm": "1.93.2", + "sass-embedded-android-arm64": "1.93.2", + "sass-embedded-android-riscv64": "1.93.2", + "sass-embedded-android-x64": "1.93.2", + "sass-embedded-darwin-arm64": "1.93.2", + "sass-embedded-darwin-x64": "1.93.2", + "sass-embedded-linux-arm": "1.93.2", + "sass-embedded-linux-arm64": "1.93.2", + "sass-embedded-linux-musl-arm": "1.93.2", + "sass-embedded-linux-musl-arm64": "1.93.2", + "sass-embedded-linux-musl-riscv64": "1.93.2", + "sass-embedded-linux-musl-x64": "1.93.2", + "sass-embedded-linux-riscv64": "1.93.2", + "sass-embedded-linux-x64": "1.93.2", + "sass-embedded-unknown-all": "1.93.2", + "sass-embedded-win32-arm64": "1.93.2", + "sass-embedded-win32-x64": "1.93.2" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.93.2.tgz", + "integrity": "sha512-BbSucRP6PVRZGIwlEBkp+6VQl2GWdkWFMN+9EuOTPrLxCJZoq+yhzmbjspd3PeM8+7WJ7AdFu/uRYdO8tor1iQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true, + "license": "ISC" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "1.0.0-pre2", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylehacks": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.6.tgz", + "integrity": "sha512-iitguKivmsueOmTO0wmxURXBP8uqOO+zikLGZ7Mm9e/94R4w5T999Js2taS/KBOnQ/wdC3jN3vNSrkGDrlnqQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.1", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svgo": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.4.1" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/svgo/node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC" + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thingies": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/ts-essentials": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-10.1.1.tgz", + "integrity": "sha512-4aTB7KLHKmUvkjNj8V+EdnmuVTiECzn3K+zIbRthumvHu+j44x3w63xpfs0JL3NGIzGXqoQ7AV591xHO+XrOTw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vue": { + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.20.tgz", + "integrity": "sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.20", + "@vue/compiler-sfc": "3.5.20", + "@vue/runtime-dom": "3.5.20", + "@vue/server-renderer": "3.5.20", + "@vue/shared": "3.5.20" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-loader": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.4.2.tgz", + "integrity": "sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "watchpack": "^2.4.0" + }, + "peerDependencies": { + "webpack": "^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz", + "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-style-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-style-loader/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/vue-style-loader/node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.102.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.0.tgz", + "integrity": "sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.2.3", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-5-chain": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/webpack-5-chain/-/webpack-5-chain-8.0.2.tgz", + "integrity": "sha512-gpzlChffrVUu5YwIw9i240/wdcglw53mSEV/7WoK7L/ddfb6Al8/sRjztyPYV8VgJAmkapH5T1AOUfMFryQ/VA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.21.2", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-dev-server/node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-server/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-hot-middleware": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", + "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000..b033588 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,45 @@ +{ + "name": "baggisowtfaresystem", + "version": "0.0.1", + "description": "A Quasar Project", + "productName": "Baggi SS", + "author": "MehmetKececi", + "private": true, + "type": "module", + "scripts": { + "test": "echo \"No test specified\" && exit 0", + "dev": "quasar dev", + "build": "quasar build", + "postinstall": "quasar prepare" + }, + "dependencies": { + "@quasar/extras": "^1.16.4", + "axios": "^1.12.2", + "core-js": "^3.31.1", + "dayjs": "^1.11.18", + "pinia": "^3.0.1", + "quasar": "^2.16.0", + "vue": "3.5.20", + "vue-router": "^4.0.12" + }, + "devDependencies": { + "@quasar/app-webpack": "^4.1.0", + "autoprefixer": "^10.4.2" + }, + "browserslist": [ + "last 10 Chrome versions", + "last 10 Firefox versions", + "last 4 Edge versions", + "last 7 Safari versions", + "last 8 Android versions", + "last 8 ChromeAndroid versions", + "last 8 FirefoxAndroid versions", + "last 10 iOS versions", + "last 5 Opera versions" + ], + "engines": { + "node": "^28 || ^26 || ^24 || ^22 || ^20 || ^18", + "npm": ">= 6.13.4", + "yarn": ">= 1.21.1" + } +} diff --git a/ui/postcss.config.js b/ui/postcss.config.js new file mode 100644 index 0000000..513a8fd --- /dev/null +++ b/ui/postcss.config.js @@ -0,0 +1,9 @@ +// https://github.com/michael-ciniawsky/postcss-load-config +import autoprefixer from 'autoprefixer' + +export default { + plugins: [ + // to edit target browsers: use "browserslist" field in package.json + autoprefixer + ] +} diff --git a/ui/public/favicon.ico b/ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..580e20736fe6c8a96eb2b34ee174b0a9f98ac093 GIT binary patch literal 33368 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

+a*jJ8WZG=pQY_|#?^KlBNa99?}J^> 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 T=(2|-{!*NO1@7rT{@Q;7?-Nh- literal 0 HcmV?d00001 diff --git a/ui/public/icons/baggi-icon.png b/ui/public/icons/baggi-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2584b7336f2e4dba81e5d90bc68666dc1dd34bad GIT binary patch literal 148396 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

vIex1qp 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�st(5p}wfIaxInVmjW1pGmVwe?qWUNnzTCJMzKWa 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 EKS|d&RR910 literal 0 HcmV?d00001 diff --git a/ui/public/icons/favicon-128x128.png b/ui/public/icons/favicon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..a7acfdf7e21fee08d8c21907a54c883c5c586d5d GIT binary patch literal 3053 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 CX6`uv literal 0 HcmV?d00001 diff --git a/ui/public/icons/favicon-96x96.png b/ui/public/icons/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..0245b4b947bcaf75fc44e713cd65510d21a05aa7 GIT binary patch literal 2396 zcmcIk2~<;88onVI6$6S&P(+Og1;y+H$zw5W1~g$8#FZD4kO)~w0tDO;ilT@DibX8q z6i~qdwRNi~#DWE_EJ~#UvM7~BPoN4|L?C@}X`LBo&YUx6-Z}T(?fd`x|KI)oyWh`; zWoTe#001!b_VNfo`Y>IahDQDmSMSqp=tsD6TmiUvc*Zz91(~B10W3FAR&U-90D8O9 zbG>pshYf{G#YC7V&)GVJ&LMMT?tG!h zD?!c=Oz;T`Plya>@T^z47#cXKAjDeCSHgIeI7*^`RL&OfoI=Q0w@k8dagy@{P=Lqk z4+v!DY#~%CWe|xJ7Z*p2qY9WMDc+EgbR`imXRn#vMyjGCCFXQhm}%!kW?Dw;;N$w?0j196Y0AfKs4@xT+YXe(3QuZRmGPer4)zMOyq{|y^xx; z)RkeNRG^H5<$UlT1a{76^VbO8T!(+BNhB(uQw2n}hsX~2kE(E`;TZ^Sy38w70RZ8x zuA#>Ft?5M;-Tc@=o-7%A{LSkZPg?p~8zv{-4r}^e_I7HKZ*p>Mc%c2>t%1gpl06YO zj_*kiTiafq{jj2}u{f!=BsPfdiJ%_ANo0b9-ES{*a|tK+_SdD(l`Hmow$Letq)GTZ(q?8V_k`XqX~HZ33q1 zDZgpa_@^PLS=)`rfcgYOHEsqH@`ehpI}C$UE5*b70B3Uu%o-u1pE|it{UIJ)9Gnie zrTEgA;8`8H$rn0c+{Lr3r>g5FC3aS$mgwOnx!3H(eZqpvP4v(OU4bAmdj8(k*1b2% zir9grbgK~tru)?EDhl2gHTqj{oDE{?$1A;1eo+ zW6Mm2IRGOK#?Ca*o&N11)o8otUH4_IX)G+eV9W&L!Q5^LD_tL?&R5ZWpBrKxEY88u z8qZ!@`n#n@J&0{w99x0LaK5p{s%;By#u*o~qOd?r*FG;qW3HI2@r5shBt_Q}Tf@7m zj&^XF)9lcaY<6(o3>$BcZ1&A{*<)L9#{1a*sVhP0*Lu^bw8RVblXWXB+^<4i1-G6o z#r(}=$9G2h@PTOc0(9ElfzY|F&pXR_``xe89Ty**;X}=zhi%z?%JiaP&fe`_kL_!1 zDn!l&TYWfos={TDvu3+E$Q(F?m;hVrM`~8fT$eM;g!m&l^X3-?1kR$Fh}5Zx@Mjxt>RMA^Yf*+_%D7PNeS4A z3F|Go9li6C-j0EO7C9rhs>|eLOlHrQD_?MkHs#vn$>wPDg3L_jsG!hRY?5UY9DAu3 z2qlC~-vwr+?^m|(Abpt?(ap}AeS{LfkiJ!9SE_H?e&n9&uG-L+KYL?KUvGP*r1nG` zw$tn@|0F%{K&(Mhk`ZQ6o#n|TF`JuHUqwYeUM}phVF`a)(PktfnLRjuEW#o0^ziBM z&D{fU;uob|b0W5}HufC7JrLsbOwPzZU7ZMes2XA&^!MC*sds8fhMM2qBNv16+U7ei zUmV9W$2cAFX({q!`c9Ds{-$#Wf%(V7#iB0INVdvL`E=c4*Jyqsk%j>#G8Pxef2 zFm3%2EP2QrD-m(sQ7G>PMwYeJcl57Xp(vU|D0CRNoqXVW$x+J=Viiswl{$>OfKIGF zm3#}|5M2M-ehtSz)OHmqYOlZy&D=PO8#l!WL^w*b`UHxVi<=*seK#wedpWoELfzUY z9<*vObdHpH(!QK(w_N`K=xd&rsI0bxe##){_7-n@`E!oq_#30@E6;~C8!o=O70JZFM5I&A a>>^E=XbWGht@#Rh&w#h5k4KqXSkfN|^w9nQ literal 0 HcmV?d00001 diff --git a/ui/public/images/Baggi-Exclusive-Logo.jpg b/ui/public/images/Baggi-Exclusive-Logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19694f10c8787b64d21345564f0424c053685b13 GIT binary patch literal 372776 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 z zH7*gkr3H2cA5fZ$CN!L5K7FMY#)A`Q1h;gwysxO(1Zq4_+|+nx3lmjWHpQj^(FlOs z;rBgy`N|Fjg@w3S6`m3g^DsF`%UO&1i)0!mSP)Z4S@G~!ugX@!Tgm`s^&Y`#{>;Ze zf)cyZzPBcHkLZFQMofYlG@{mC^77nl!9dYmki3>cx3kHSO>hlyIAjWcG%TH=>lQ0L zAq`w^66H|J*SfS5eoG!F&*{+ycJAhD&_Pc)wsDgrN@f~-6EDT2T%b}&WmM`Rd$iDF ziq#?Ktm2Ejx zc~ZhL$>(XbBs9iT`}wQ!Q#o0$WSqMXva;560tK!rxJ)09@Qn>_|np%__OQFFZOzYU|nLo&cUIQ%|#LOzH$ z+MFkweJdsJ^QC&OIhap?Hd8MtQP0s9+gCSK$NSqUUucTVm(GIcLB}+wG6m~3FS{%} zq?&VyM+!tGW{orv*^d@6R;~Mm=SZ})~m=EJQ(n+mPc!H-P z%KVf+%}*2=O23M^o-Lv zwD;8cwNfowgr2+VxOMY`fjcG`KxIhGjQ|bpWA%4O6{nfq6A~;-8vRQ4+NYE&?k9{< z@2!_#TUotvewv)W>Y~;}2)`tc($khT^cz8z(+ok}sntnH;B~fL=)G!cQaJu#%Y~W$lpa!K;QUbxkT0}yHRg?eKT$ZF9_G8_+-r1KFD!& z4hr9Rh%4ns#xSYxff+I3DmfrEx768D;@Ud1T>oXN%ipb}FrLU@>(s&+7MvJivfY!E z#QI;IO8O;t4v{CWtMhD+^;EJn_6`xLzcL2Z`eXk;} zbLQ$Rxdj|bZ_%wi9?uSb*k#hCVWC6iyXB4=+irua)uZ*?twu&3FkZ`io8_m_l$hj~ z9i-?A5#_fr`gHiZwnx+~(UY{i$}m)fynR5jue^!|Joqmgq>!)`(vh@}IP#Gv%qbA1 zZrl}|SWG4H_ej?GmxKR?ueiS%J5ca=uxqj=e(1u9+Pdu}^N0ZNN{T*vWm&65^4^y1 zssuOhHVWs)jkjXK^9N&*W|e0!i!#ebUh_jEkgkZvG@J4(xxpWm?e+wwn#*rh3)N-vU#;5rD6fT z?gTqwOKz~x4$1cn!o28Q2%4fjNLrd5;BMyAa_N#@vZD4>MPR(^EBPFa0=p zIVExbjvoCAfGRqmy23CbXq#AMHvE{>`N*UXZ13-eU^eVaHJ3+(K~vo*;?pF%nwDO3 zI_LjaHrFPQ^J$2VpEx%<_Va4;H4uC?PxfO{3Df(zu}2*PsEHT4>#LWqoCD+o>pDJr zdfMWrP$+K&WPhr=Q$I(frEzM(+IOlBq3lXa(KbPVANGY|>}JnVb>nrZLTAS27DN{Y zH}`Tbj%hX^yca>eh5k#{^=#PpNdrAzpIgx#>2NqogC`( zJgb|vH?H?lwlamMBih&p_9rpl6}mP8POpV=XnUT6kV2)j5U5}2n79C@4bNE=fDM_b z2|-G;IVW;o#1a{Ov_~nyf>sxtMC_Mx)t5*nh3;CC7Z%>_2Vbv26kTsTwM|5)hi>6x zawM>_FXM_k*+61z7JP4pJE*X^Nip``?N}}DTV#d`rS&MmN6Kf*HpTLWPr{MzhWG@O zZTEcq+S^q*!v+FTjiTW#5kDTdBYghZysp>nK0di87>sUpY~sgHXbPOo-W#z9W6Gm&RMb$Jn1p_ z4nqPw?ueo%i1ICN8_muVZVXKHgwR;Z1rE{SWyFS&Y!KXz~>+;|iy;rGcBS>LFewvz+?9y)Gl;wK*1WLbQyT98*yj9)bwerZm?v`x5 ze~`E6`G#G|bo_IdTzM|_F>%^hozEr{!4 z!ZsFWR{;;W7_kzM{G3{l8g_C4$v@PDO6DYp8hh~)-dFJTKb!_Y_;7G8kKkphV;Uzh zPuDT7aq?E4sD7IM)wh#&DZ7jF53$#vD$3d0__11;XZUOg2seo0LO!>4x;d}vRB{ne z#X4QlXnn2pUzk|Im-?vvAYFn^EH6YH|E{9qqdOu4f!46!XXf_*(mqBYasw-d4tzS+ z7w;&ni}K<7EOEF_NYWw74~?`Bc4PVDs^h3ccmRdFR^o3e#XNrANoGicPd~(F5NjjS}}<+Y*GVu5yMNW5M;m%0A{U;67`{{Afeie3DdAdB1yC{+V; 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 G+8-PY!S-B4G*7}N)=r3{i}VzRJ%yTw zw7D_v#!9fp@uJj_-pE{wJ5mN>@F>E>j}b$kOQ^o=sLDQEm>DH>At6i-uV`ab^wwM! zp6`FL6~LulNQGN6Y2I^sceOg<)oT=Z1@$7G=7p-W{CL(huKy)={P*`*{&+O;Uv%d` z2nX5!7T?0U_r2TdjgFU5FW=FA36da!-z&Liz@!2@peDQw8=DjD}->1>6o4lhF zPd-|~RUAMREwfT;Y9dec>0y4(S!X{}W+15{3;&`>R(WH`?HF88E-Q)rut}$s*_7^n zPvNJ*ck3Eue}rok_T>@hJG?9t2@|hY&>l#j_L;*#TpUUVCS^tO^+NAeHIvk`=4MBW z+^OPY>|d`o{-kFbyS5ak1`e}}j;sg6XTmNKMp);+)0(pVRuL+=C)SAfv*Tu79&iE8 zu+ozaYk{Hms`12jt0|oIXaBAY4C@#7;ZiLYe!=g5iaY2OK60b)IqLQ_$W-1d>{&pI z_Y)4uP-C#8$uGHu1`jK?8n>*<_*5e4uU4hj8=)J;V0`8Cs~d2H+8=ujT_)2tix+f} zBJZyupVii1NFQxlS6*hnoyd>Q-nVJ8y#bQA1pA42TH0)PQa&iZCuZJ_&Oo$MjcLb* zzcF2{cKWrLh|=Vw`1A;AIskAYKz1O&$5K=4#^OQ80-u-_G}RzT79|6&VtjOydfADSxLFa3w<~)%*n1 zd9?@vHhlG=iSgT#>lDk;|w4qv#@9Y~u0*NwKRkpnp=yn7e`380u1DrWjH25Qr>az8RB z()RL1e*={34`tt1hi2$+Y&=@6`o&l=)d@Z%bzO=PRiL-*a+%BgzeQWX+jmk5wa%u~aDR7Ou24MX8?ztN;X;IP7%E>%SdH4Z_vO1~LhXC6GhL8RqHrl6;@(m@H+@?b z5mREI_fx25;obaEn}!G^P+wS3Y7Kg1J1y@_fUhuhbxp&wnjCoYVCOsHX_5ZJOzfmAd!W`h$3|D@u{lYx5QDf* zF_|koI)|KgW-Isk8AFwP020}>1ST$&R5$$N@hgcy4fA^s*Lp#1OuowS8(_$M zHz5`}pz?`^&8fcWyVE)P<-WNatLs!d2bD204wxKa5^8L{i4nA!w_PU9R*i=u`fk1O z@?XL;e{7Zeedb)MR3^26YfM^PWB7 z6Zgoe?D3GbgTT>RG2Ld0t@cl9CInpacl4VqglblUrUU>sPO$o;Jn1{8i4+-dTGmuc z0q@I~Zg|z%`QDI8*|6ET+8(?wed&OY(nMQ*r#US-@eOhOjj9ABR`NsqnnsPj9VEA; z5RXDe@TeNkrBZ{xmwaRCfa86X&MS5#+!lj(?ziP~w zuHN+_BBLWPB#4nNzxf(54Tcf?Cosvixf2zv^!PQY}~3`fai3Y84dqdj?N=K2^`CR#K2lLvS=jT#hQrH``OJkAIc0 z@$jHF+(m#a$maX}OryQ#mQxB-5>X{M*j1)@i+l++XpbF9bkxW$fbB*A0k)6Qh3p4p zG*J^w99HOh*rIv#E@97ZU)MpM3RY@nkqY>izOx9{dv`DOEa)Y~ID_1d+PWM7Nw5F`f(C~K zf`;I30fGm22=4AKJ3w%EcXtmK+}+*X-C;v+FMb+J$>ffJI^!yBR{HAyY{BO z`j)(Ft@jn^o8cDems6I72oezC$LYiYqdVS^7Q?AR#_KqvC$@D=*FJ& z>CRay186PE1vbHOTqI}3=wUrZD3g50>i4ei+yr@5M_ zH0hfO+WjI}|0ACG`PTRs9Q}u|3;uXg|AU4Lbr3q`oyxGhQWE-MU78P+)q&aP`J-(W z4sz2>a$Zgm;(4XwMtGQmZV1Zy+lWcLzXC6DfOe^+K)3hKS>5?%M+qx7N!*GQq-30C z_;{*zX5-;iW%yCXF4lBQh{xrNRT!UGnVxt)fi}oQY^r)y(NEA!>)|VjY-SEXl_P{7 z-7q&XKa!bK#TSkW*i(^cayZ^f1%I^iT0v?YX47fnIJRmW>idRBcKDvvDJAlx$gl4# zO3%L?13&kqkR;<|gN!dhUiy5Zw^)$}7nsJd=Ny%l-8s&TZu`idoXL7=#yE}Ilk**d z1RF6R{W}CXSG}W6#$x0V&t}WOQREuW!kA#|1E*sOzWlReOp~G*TviYYA^enT{H8SG zKMg_u^a1tbmCaFR;{k^f)^FTqcPqD_k-Kum zhbuZIQvukd<>EVpsTO)4ZpCqyoI`k4kbDt{tsp1#ssbud!)B$senr$5ubQ7E9c7)JE<*nk#u~fK= zLgMVh0Z@8geq0EG&(=qn%6IE1{`piZF)6xS32bti`FC!$qdT z%4F>EsQ8YR8sUmBR`;mrZ40uVV7%c?NVKqsO}!{n-Qk0s99l9@v1RdWEex;nQ@m-1 zJT4L#C`OFz11KCf?4@-!fGaSA6kF|BP&| zA(qog@h7VV<7PS?d8I3gS1}nCiV1?+B5yY$^SAX6i^mP;RNj9MgTUu2Yn(A5_qTi6r##rs-q z-di><0w-z-1oqKJ<}W3(vB`qpI5x%q@;BF5w8v&^haz^==LWQVh-S{o(#OH-D%n3> zpdNrY^x`_k48$CQJAKFQ2)P@qE4Za(BwB*bypsBkwAeVbW_o}?Uc&Z4vde@ofnmy_ z_0B4i4(~8jxLj6iQvfH1H_0KCFyp;>eq=uBvvt|K>`9^PYwZ1fHQfH=P7tcabnIb|a zJn;3AnQ3O(x&oUEn~qiv>WlE8Cr>5jDoZKO^YtY~()NAP6MhM(SXl6ZE=_J39xqSM z1MlwvkijMNbWk5t=sN^z%_Di{CD0V>iwGCZ_lU4y#g^3-;hxvLH(j~>unSOk@1m?6 z+cj@ybl+>cGZGB&)Y5=uHMjwe{(gYY3z&j-VB(;95v;xWuNd0?)s6hyxBUN;D>eS0 zbo(uoZuVRj&f=FSlNxePzO);7#qxe56LBA9yUU27{drmRG0Vr3nHQ*!`>m6*b4mzA zx7KB)Q<{|g8TPxwu0qrnmMIaHcoLJdsBrMUhDzPi2a-kT>kpPQRtEoA|A!M-)B@@ii(0)!@* zx2T$Z=&@xuc(H!MJd9zNdTz_0_lEN&j#kgn)SaFHUdTDpe4Hq#S6P~8xrJcO@HBW> znWswW;=#E0j_QWrS#&o(q>@f*IKkvKp%jo%F$qT^8$RR#;!s`^w}eH4DHQHP@NDW^jp4u3{Ei|M2JzTCj%BvmkWie0hDC^ zB&lwQBcEr!_~FaF9=jq`L<^YBRwMA-PArfoaHm=hP)8ndEmR&c_tKV@+ZH{gW_~68 zvJqTQD#nyplhhJMedTh!rF~^FyLavjy}2f=M=OJT3iLy{5!?kbEbOR~RE?hEH)<3c zjVmh3YskMbGYw`OXW(ck*Vosv9_W@4IdYnS$|8E-g6Ns{+5k=Z*17oiggSBu42UIN zbXc@S%*+WH*;A~e0{slQ5U?Gm93|ObqVrmwitId15)~al%&FnHC?Bh3ryFst2_uFa z%+3;uFV@zJy$A*QQCk!yi7pi_Y{z@mkZDJ~Kf^-y)|XH;xg|wie&0Q?E@+;57@8U0 zn%S;$_{gwm7>GaY_)?HIAws8h&A4FZ8|Uu(Gs#K($46VQa?_}C^Ub|3Dt0MQBd*(J zD3CN48|f0(pl#W^6olR;MI%nGKR)Bqd@Q~UCD?`5d4i;wr4kp&^f@Nx8sSvWqCZZ2 zUP1ack@=`=YBKAV>g09y;#mFBqO8!(m%D&DUfvlwnZW5xjypdss)@*+WAvTCs# zr{JW(2P}CPD}C-rBSx-ApwO-?m%>qMSbF*CoSOruw=32{jxHIFOQZ9w$bFfkokG(o zHCm2`p+4<@ORpqfj?oS)SXT}`ut_;y8sd~>28njxBPzNO0xH1@j*18|=c~@nkVHn0 z8e^+<@zVoQW2GA8%NYyMEo+LEi(@5*eoaZ!H_;fk&n?&RgW&oZ6*)FugMlA}76H2Lo913M5URxeed3vL$eZ>Vo3j9Qv`C83Dk{ z)&4%1k7M0!@oUVJ`*Lo6gQk3{WQ-!4Uxq{f16<N8~O8s7t61gRZknze8jRc{NS}osofr zhyFJsF0_v;&8On7HwHkLIH0Xd40c+WI4I&{3jEJeEdzRQ{!{3ZN^bWq&5U-fDKszc zqh800R;=27_F8c9N>W&UijnXMmZ9N8cM@xYI>~;GiECKtuPcSv+z#VKJr-7YBTK?8>_JIJF$X}b8uda-a~5?SRhAXsxV4WCjGTCiAM z^~y*zk$Ds-58Xm?+D;QhQeDD6D{QsGsy23>bMSf3p<((N71`s!DOw>mSR?bBo{@?q zdYDjsW;c#3nP@9)Ndz84*5&VsBo*LpOl`H@3+^J?>709#%NFY0-Ho0uy3SmBE0hkg!Lw$CpQj(jO8>C@k?{q4kfvLek)EZQ znwXadMl-WqSKc`Rq(B_)6*9Cb%8<7(v1tI7F~{{bf`;yVZO&vhiPw&HC3dwhgwz^o zEF;LkpGx0TLnaxsor~{+kp99KUF$^``9=tvC=8t_*UlpEDU_vILwtP&)l^Aji1$;$ zUOWNRWmSZ(D4@r3`#iB?>P@7L1aZ`<-yCHTbB3{zbf=%;LVhie5J#wqW#ZSdJvw-Z zP-!N=5TYM#mRMQGFUNlgasR^2PMEu)ZPZn2s9Elvq^Gy>%L_lNErZ7V4sr6qhOpt| zfVYoam6iPqZn6bR!9^2UEBnY+)`aFAK&3P(hbflvUi`|jwLo^`c>zm#+0%^_mam0v z)zO#I6YwEfcH;!y`Ygf*#!A(-XDe?omm!CG%oP;qgQ|0U#=x6iU1x zd$a_$BZ{GZb^76#+1<}8$bln4hiq2H7{$vm5FEB{RW}$Yp%Nio>)B# z8h?rKts-*0FjaT`L%1D=gRZZ1IS}NKVo27|^6^o(Li79Ulm)VvJXNO&BgM9EHrq}N zxp_%i3X=5C8T9Z-aD($$a6zqTLtpL9VxKotSUjVOPG#_If$!kjtOIw>)uVmR0QK&D z{tXK<`Fl3tk7fO%sqSAEYWz9y_zxk`C<+4_nl!RN1k$R2Fi-yl*kUxPLh^wjAGFCk zL~_gmt^!meO#u(7Lk&!nj6RazNL>O7Z1BZZc0c(@Mo?uiPI`uTDgdp3#24QU-NZ^( zeyH_a!;)+I_^3v@v8d@bwU`I=iAG;(#cvh8-b@RoLVY8pQzRfX&CzRSylN&((X#q6 zYB>;;mDjV#Oa|0cHO>K&gGg3Gi73K1?$K4p0tF#sT;zSapbm!7BTGZA^q~vJ^Fgz+iAuq1Zp_!y zcQ>%#4(?ehq4K@MSaVSX4-H~U4wNo48>7!jH3lY7)|}kG;`BKwT65Al&f<9J+4@Os?k4n6mPo`c(8areO!FIWl zB!E4Xe!RH2#PMQy>)%g<>MF9k#<`d9jA&*@h+h5k`Hy(Ji4*OAa$VfiMbcK9^IqWeUp6Te7@eTi~Gr;aw=~{u|5rw z_UC+df0{Lp$*EnI>?Es`+o`wwSaR(vvWqeLaCC$pbkAH5rpX>H5^C~9Rijffl4Ot5 zNKe%s6(*&u6dZ?(=wM@_o0o&eyW6V}?X>N4$@iM-?ZkGxnt0ZnvBUUdGDPRA{ z{{B?s(Yp+9V<}g+w4l4Pj(uOv^bO3^1+& znC?v;7`w-4q^&M>o_x-EnH*g}V%|q3D-!l34cfkD%4yQQr{?ok3}KA&DIGxF_~L+j z79&J;Q18~Ep|u=Dz$EsqUo`l~Z~F(XsbG=^@u0~E&~vg6Zq3MP4lW{C7NQmUs#^KB zd_wW8$aBHR(rWnCd7+N)9h;|q?wniBJ*Va*MIpC#p~nWE$x9uJ*z^Lc3%`WrRHU;U z9tP`iH!1*ubVgUTZ#vATN+a|(j#gD8yg9*b}; zlr!B8lGC}ZLG3aQUdqTY;8Df3sf~B5t=2-!)s}&+FH>J_+YgXl6DMW05&jK}@w+ei z150*p{6*~eyF(Qq#L@Ty3-JFjDtHhyyXSomO_gKBH#GGkz8z9 zyplADC+0s)*SyG*xiU|xq4$2_9Q>&{$D$iHfA+PCY2zLw!l!QEJow3p!_BFurYu|! z-H>%dt;F7bgZ`i5d=(6TE@L-b3ky2JsRtDho{; z;|TV<_g53D3A%93p9~;JTOO-(9vypT8*=I@nqO}Zu)9*dY$tW3G%_ZpATjspz_94K zB9_i&=P|Ke+}E0lLXU<6^s)1lyZS$5^F7PT{Y^R7kA1_(BYX!6xD?B0W#(^9H`?kj z&Il^FKD&k_b`!B_>9UC@Ca<<$)qjdAS)_HyXkcJ&z9?q2268hGjy&7K1^y96TiVTw z`SRj(@=KQEc&jfz8Nyvsqr9BtY_8MIyNzT@2xi0nUlw6o178jez^(L8+!bS{c3cOHk?oRr~>c*Ox{TzGyebTN^V`9QvoK4Zr| z7_8UfD&rAqNB3^G<@7oO%G&*4o#&B1o+z&k?+ewmLD>imR|R;pE;zr#^)}mlak%hp-`UD;p3`1pq@uCy@ z+#7waD8x&p&8E`M+wS+KalhenW;{MeSR*USftY&CDTc(b?F-LMxgRx=O-uLeeC|*) z4~b8T0vCK%k*Kml?Ns!5d})Iwwk2)dnwsbfvgzzz=NNM*>qJZO#Ow-4@w*_kx59k< zyg4uOnpef0QPJ79qJk&G9it#y6|*opQARCvduWmQ6>*OOVxgJP`lRT;Jj(*wc7D3& z{QOAjgUaJaV2sR_bM5gFsJ5!FgKd<(!+}N?pz0Ms{s2&bzG~;wlWO+7#*;9j%StVv zxvM_72I3)=?+|w%961&(ZVk&HXHtV7fa&+?VIR=hFp!w=bSDo=^mPy`)j3c8 zp7PFb42b^SZv7uJb^iay(f(zzr4q-?%k9Y0>$(!TZEG-7pLOiU3rD;pVuiUUQ6KW{ zl<@U97^bWl!g;%pMos3iI>nBx_O7N*t)Tj==G1bk&-Ge&M5C;0uBdaBcB{=S?rR9> z+|r7LDzXY;abT9^WIU;TxnxjnvA6DPbb0rk@cAyj9nU8AnZ-9G&1S1JFy+ZkT|gAi zPg1i+TD(`V`>UOdi&S~v*lfpP@@q~_z@!xb1Ddz|q?^5n?KV^4>jG}mff@6UeQ`dmC2r^EW7 zqF=xk6FZIc!4I{NR;BE9O97lYcEmV)1ayxV+LtmDv?sVBpMfzT>$9LbZ1GC_o|!LS z?x_&ol^~7>SRP6zAUhIg-2G&>Fr6_b78EnxH2N3CTUGT0QIyeJfYOs&>2*3Mf`OB< zjf)UNg_T8&!H_`2Fiza*Gr1~hVr2#NcR_4`hxMPQF+h9m1M;3`YDcy*6d%)(=# z_?@HAq7qGcH~Tf`8a*&NmkiY5V102k`_w!@&J0;5JF)a3h!8b)&MoPXV9g-Yk$!54 zR1U`5c25H8?yyLH2#8Ec?jqX_&lm-rXh+olQEq$Y1_K%j4}Cn-eMs8;4q@DUHqNsa z(DyJ3;6z;F1UsP2xISa4+&PQNE<_oRWm%2$^z)YwYc(W;13)bcZ^tz`1p7a=2@|E*Ew1A`#0}~h7tzi2e-~4>piC%-~vjHs1*(I{|56W?*i!DF= zWucCbBIRN$%eDy&(-*;7>&b#Y9Od5SU+m+*zxVtP8KM6F?I?e|2&`I4C1f6JQaV^n zAEKgdhbjaZC8S3u7U(NxJh}0-y2j2#6`sI8MIs8Qmy^-eG_n2;(MER4;XBa9QJ0+;+ zJaq_ZcevJ+XY9fFF`tvo&ohf(3?8|RM+1o>XID*NwLd2gP^LLx-6_DCuy{n5zOj|j z5>2VER}_97px_fpFWZiVu*GrU^R>TZn}jN54syuzN~AG+_(thAE@GC<7yZr*1K9#b zgRn;Ob~)IXZQv{~;~&|xB&({5x5DoR-b1cA$!Ln3>ZqDHWA8%jOy_<>cv|Sy(_x}> z+c)BJTd{xprmk!7JH*g;h!lPE+DLMdvCvm{gL+p2dbd=%St}A`1EXWUwHp-t@I|4W zF2x#K_i5p__s`=6>7O30EkS?A>nG^3=GkKNs8c$rAR)j3sP9N7h$eq4SjgPD<7-z5k?O67`W|Dd8oT zt?ctl=+7;~ew#)yDf!w#s27#Vx?#cg9W5rS?)ttuzy#>V(WG|es;#K*fs7+EdjLyD zf1@cob1vit2!28%nKcjoA3WiLf6hT2%Tf-G1a+XJy35}KsRNRTOPmga0oaQ7p?-yz|C}My^T96A7j?F!Ar315ls_XiA#frjDTRe2Ri7I6j61VliYSX?=)L>U zMZgxWh9%up(6;iR^O?y);!^~#TOF2LTL{dj+iu<~x%8dVNf);yub|ZXb$8i&#TYX1b-Mt_wZhET=q9ZZ@A@eTNu_pFRU7)zaLe!<-2(trzQE zfWrU6`jUk8=t#t-G{^6B0OyFI|KyWde4$; zV|zAD4bM7!dYRK}QOSz%{@vUODz~J_;MDsoInW>;!=oM0NP}9=Efps#Aw&?@a~Q2l`0Dctu9fqTVvW~^emqfd)ogb`HIQB_s@=GN zhT`(RLwvh!_B>DE0^Zbq5uQV%+bLOd3$Q4ti%Ik15wDX$rjrY3?6~PGh#H-MXR~_l z5j6V#y%YH!1X;}tCubiXq8f8%88r_Mb%Vs$7+BsLg#wHMnF=|s_A>A=hwE&V*8~+z zvq64}) z_^(Tje_Zlo$&tGnZxwkm+OuZH2hpPNstGnlIW66y(khhVuqe~gR%4sp}X z0v_#uG%DRCo1?797%@u4XrWtx9^fIfXs1%Bl3x8}nKY%0q&R?_@$___ryg-lFs3pi`NBYL;uDidf+Kqd4Q7mH?hC$5u zqk6dTH+kW=gH>)(v4>>sJKI>-{q`^GYYH^iyw>>YW!!bNijw^L@W0qi`boKY z+}&8yX3i-}J6iANAigE%Kw_u#iL0*}`;L4f{W6p(gzj|1G5yij(JjISC9z zl_F1j+TcJty7m^O$>qJ3B>Gpy3&h%E$l*ak=|#GAy7NV8CybDm;=+Fu%KR*_$s4<4 z+GV+2zl8g&7m(+Ahoz4pA7Ekenz*ji!l-ORpqXv>jI(^2*Bd39a2-F2x);cfxvZn` z-qX8!n+^K5<1<=~w=rjFQif_iZLtY5mX?m}s)Q#JAb)kl+UZ;^2Nu4YCR211USmYJ z@jn@8aE6y@3@#ccyrZzXv?+Or+t4BHf06x6wTa2Kank?3*X6b$;z=tja%xlIcZhhj z_wYZ@AnSNqWlIspk!2?FSvwYW(uNq@VDukmcdt1iT$Rf4I!b2fCAX9BNkJzcF0($N{0QQ@b6Y2^;@w!apKSA*#N7<{XL+mD@TAAN!-INF= zqdMGOQFKe))eoaDSW~Z81r+m+v6UV#z*KVEg24mkZ{@;-I&5mvhF+KHu6}Ydp8V~Z zDceeIqy3X0ne|#7)BMZ?wl!@UgJ7@xnqa>*2NmS3bXD|c+(PhHKp~1%VM09~M9>s1 zr^%|Xe2L*Hw;DZh(vB$jM$pqxPfrz_^9%0y*EEgQAzOoopoMH>>rO2Zk}z*9;zH?` ziDiREa-ugYylaBodyOeyoRfB5=9#|3lgx?_3B+U&)V;Nh7U0V}Qh(~&dDl%x#=LmH z5H7$%o&Q2xr_D8_UFJ>Wx}vtK6c129!x3JunI#~=gB8b0kQwX7_pRqX;zVTXimD3h z5C{laY8~v&8S0Z79hXfxEwwlaA%~|E7oapUG79lw`VJ8$^bXyqHXBN=)|6a7fqW80 zL|gtngs}*BYj>MJr%?fkds;KW4QiSO+2Hw_hBi=Pp}EJIuRJOBXkBZVQ=`2X+mZ2`;PjCil^|`Kl=c-3PQM6a9b2 zc39>aSrV^*ED{yoE0(e`$7e=Kpu?k27yX8T_6kb1 zG8M^zpmXJ(TxmuIxxP&P0&^-W1!~N}XCmUad)^8Gs#eND?8;ZqkvnihDxD8DVM?P2ukVE;urUbOSa(Qc+e6ozz&25IAISA||C=ROMXT={) zX!_5?vkD1_$Ge~B3X83yfcZ}fH+FmrQ$H@cWai}Wh8VXOW*5}NijI@mvEN|f`8H1u z@DDoZe}^C?`NUY|QPoOu6+|gm)2zSai2kGUikl$n?BeGA;}w8N2*xFsiHS)`1tYB9 zXNJBJj1Q2N9v}Y>;Q`t}8QfzWMbFO8$)zqb`3^x8!ilb(5FjffE2{xcxN+ZEPZul@ zWQsmx7V9)_vO#Mz+>S1Gh)7`8xrnIYq!aJ=dl8MYXGF&*F+v`1cRY2xI=Jf`VN_ok zvO*`v>vj=k$*(Av<%mV}d8~-vt8>}`$$!Fi4dN(a%?biS0k{UPrwmxhF&;A6217f{rXX?_eRK)P0aRCx>fO192>(0=a; zM2<}7tEu2hz>bBUZrjLKls}t#r(XRpZKwG6zS(~W0l~jX6!-(6PzJ5)?8`Ka*5tc# zV09G`-sOgrWpurwrwx|A5H0rNJ4u;7Aq&$m#4Tb;=oArtDBu*P3kuFp@!}gurDaC) zbRYKsyHV{Z$6DcV>LBEFmTjYsPYU6Uva&o6Nssnz@fzYRhOS00eEOV_PMI93NPq_D zf0P>+j6uiu#mC?mV@F%QwxR9>52%AvMcgtzwS1{!DNotlr&$ zUDMOEL(x|p35kg;)bfv2X|fynWHSPMsvTXvPrFZ_yHP2b>r)HK|94e!x8*N2LgNU1 zST#!JDwbp&dbcVRoUU;IKhMLlMMKi&VIt>os(B|Y6rvd6GGWc4GD_W)3a;#iwk5$Q zw@X{OWm6kiad8-+Ji(?6exk=Axw)k-HFPLU2;e&@cb?W9aEqwm~MXWYYfa+O|M-&3@5q9+?r z@a+P5MG=ncQmh$?f9@{+Q{6keM!fRtn{o3r&ARUp&$O$tn9P{8mFBjvF~ysCt3%-` z5g50gQ+pq%$VKkGj;7t!($evOoz>uL3f*4dD8OfKW%uwFj^GcJmYrC{dV%xd`F?Id zIZ>!Dt9<-SA$6@P{0pfJx;<7xl>tnA#A=Iw7Oj zV?W;o^-r`?FyJr|5bZVYzkV6)Pq^mic+WOg(#7x{VorWIzLs6l2sBY`;^JIUy6i>`?h+AZVtcFt3YS=;_fpIe($AHby-O+ zud80DQ)iq*{KB&W^cKaWYv`lFzPf#-gT;8fQq>6q`N!KX?z^_PonEGQBaUbXtGos< zRU-eixfK0anq*@x)X~KfNhkV^v|QlJg&ivIn}&JUkHr?=H$H2Vg;hIt6iPc%P%em^ zzUZ@25y%P{Wn`<@H%oSjl-uB!+3Go@p@jXlK@(MC{vw8Zh92B1JqH=%)IAGI3y2m2 z%**fksLip}IzLm_hRLUCN1u9(IKR$XsC4|q=Sk3kN9G4Mv34b`h<%ai)8r!%gFUJn z3;^b33q{C&M9WDtGNN#>PidK0Az1?yWdQxNY-S@Nf#tn5kBWrc0I<3jL>uMlf&woF zHM-0&LrOoMq1wy?JltB0>btx*93l`-2}VK^q*df#nP%*eD(CDyQnGP#|8)#Di`*GA z{&vYT3{-wD_cpm<&e3SI(3Q_~i^oIx=8^_6v&0n6o3AX$MJArWr9co6=cI8Cv#N~+ zNNEvg21_%^%gfvGPfqoWi@kb#bf6rUvKhB0NpD60_ktE3meiQ%{}THZDubC%u?FAi zwj~-`UW_5y5&6JMYSz%QeASo8!CQqVgzpjWR!1W1nJkgLv4I|xl)L_ED&vqV#5ZWF z@ROt}8}*q+UXV3LXuoIOQ~`>`qLq%t4UyBd`cNhE7Pgq6ZW?+j-JJsAF@E#r(e#KF zL6xi%>j>s=58ZycGMU!Z0=s|ai{sZPicE-dg1bzdrRV`}1v~u6d8Zu3uP%0#;9)%= zLbVFB1z-d*>^PiDnsVxm0q z4~x}mq%ho%2izp z`cUuSYnz+n$o!#Q8wDOmDds%~wx}1Cn}xd-B=;aj(qf%uC3}?cSrXS|!W47cVANOE zCx`3&YAo}3unCMz!l{AR%DKUo+ZcVSbDxepkg>czEb?14DY^8Vor?q*j&^{m4oi7dhLblhPfVdY$&bIi*h<%0DV#Rod`$}>3*yMoqUXOOlTpK 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

<7Ae_C3f7P~^5w$o9X(6`!FX1Mif6&N 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 sU|DKEJ?&iG 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⁣ObH`AY*y{vq#^ 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 S=!4QF$#vI~um1oNUH{o%DMu6l literal 0 HcmV?d00001 diff --git a/ui/quasar.config.js b/ui/quasar.config.js new file mode 100644 index 0000000..520371a --- /dev/null +++ b/ui/quasar.config.js @@ -0,0 +1,78 @@ +// quasar.config.js +import { defineConfig } from '#q-app/wrappers' + +export default defineConfig(() => { + return { + + // ✅ UYGULAMA KİMLİĞİ (WEB'DE GÖRÜNEN İSİM) + productName: 'Baggi BSS', + productDescription: 'Baggi Tekstil Business Support System', + + // 🔹 Boot dosyaları + boot: ['axios', 'dayjs'], + + // 🔹 Global CSS + css: ['app.css'], + + // 🔹 Ekstra icon/font setleri + extras: [ + 'roboto-font', + 'material-icons' + ], + + // 🔹 Derleme Ayarları + build: { + vueRouterMode: 'hash', + env: { + VITE_API_BASE_URL: 'http://localhost:8080/api' + }, + esbuildTarget: { + browser: ['es2022', 'firefox115', 'chrome115', 'safari14'], + node: 'node20' + } + }, + + // 🔹 Geliştirme Sunucusu + devServer: { + server: { type: 'http' }, + port: 9000, + open: true + }, + + // 🔹 Quasar Framework ayarları + framework: { + config: { + notify: { position: 'top', timeout: 2500 } + }, + lang: 'tr', + plugins: ['Loading', 'Dialog', 'Notify'] + }, + + animations: [], + + ssr: { + prodPort: 3000, + middlewares: ['render'], + pwa: false + }, + + pwa: { + workboxMode: 'GenerateSW' + }, + + capacitor: { + hideSplashscreen: true + }, + + electron: { + preloadScripts: ['electron-preload'], + inspectPort: 5858, + bundler: 'packager', + builder: { appId: 'baggisowtfaresystem' } + }, + + bex: { + extraScripts: [] + } + } +}) diff --git a/ui/quasar.config.js.temporary.compiled.1770820662971.mjs b/ui/quasar.config.js.temporary.compiled.1770820662971.mjs new file mode 100644 index 0000000..b4f411c --- /dev/null +++ b/ui/quasar.config.js.temporary.compiled.1770820662971.mjs @@ -0,0 +1,83 @@ +/* eslint-disable */ +/** + * THIS FILE IS GENERATED AUTOMATICALLY. + * 1. DO NOT edit this file directly as it won't do anything. + * 2. EDIT the original quasar.config file INSTEAD. + * 3. DO NOT git commit this file. It should be ignored. + * + * This file is still here because there was an error in + * the original quasar.config file and this allows you to + * investigate the Node.js stack error. + * + * After you fix the original file, this file will be + * deleted automatically. + **/ + + +// quasar.config.js +import { defineConfig } from "@quasar/app-webpack/wrappers"; +var quasar_config_default = defineConfig(() => { + return { + // ✅ UYGULAMA KİMLİĞİ (WEB'DE GÖRÜNEN İSİM) + productName: "Baggi BSS", + productDescription: "Baggi Tekstil Business Support System", + // 🔹 Boot dosyaları + boot: ["axios", "dayjs"], + // 🔹 Global CSS + css: ["app.css"], + // 🔹 Ekstra icon/font setleri + extras: [ + "roboto-font", + "material-icons" + ], + // 🔹 Derleme Ayarları + build: { + vueRouterMode: "hash", + env: { + VITE_API_BASE_URL: "http://localhost:8080/api" + }, + esbuildTarget: { + browser: ["es2022", "firefox115", "chrome115", "safari14"], + node: "node20" + } + }, + // 🔹 Geliştirme Sunucusu + devServer: { + server: { type: "http" }, + port: 9e3, + open: true + }, + // 🔹 Quasar Framework ayarları + framework: { + config: { + notify: { position: "top", timeout: 2500 } + }, + lang: "tr", + plugins: ["Loading", "Dialog", "Notify"] + }, + animations: [], + ssr: { + prodPort: 3e3, + middlewares: ["render"], + pwa: false + }, + pwa: { + workboxMode: "GenerateSW" + }, + capacitor: { + hideSplashscreen: true + }, + electron: { + preloadScripts: ["electron-preload"], + inspectPort: 5858, + bundler: "packager", + builder: { appId: "baggisowtfaresystem" } + }, + bex: { + extraScripts: [] + } + }; +}); +export { + quasar_config_default as default +}; diff --git a/ui/src/App.vue b/ui/src/App.vue new file mode 100644 index 0000000..b22f395 --- /dev/null +++ b/ui/src/App.vue @@ -0,0 +1,7 @@ + + + diff --git a/ui/src/assets/quasar-logo-vertical.svg b/ui/src/assets/quasar-logo-vertical.svg new file mode 100644 index 0000000..8210831 --- /dev/null +++ b/ui/src/assets/quasar-logo-vertical.svg @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/ui/src/boot/.gitkeep b/ui/src/boot/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui/src/boot/axios.js b/ui/src/boot/axios.js new file mode 100644 index 0000000..400dbfd --- /dev/null +++ b/ui/src/boot/axios.js @@ -0,0 +1,21 @@ +import { boot } from 'quasar/wrappers' +import axios from 'axios' + +export const api = axios.create({ + baseURL: 'http://localhost:8080/api', + timeout: 180000, + withCredentials: true // refresh cookie kullanıyorsan kalsın +}) + +export default boot(() => { + api.interceptors.request.use((config) => { + const token = localStorage.getItem('token') // ✅ senin authStore key’in + + if (token) { + config.headers = config.headers || {} + config.headers.Authorization = `Bearer ${token}` + } + + return config + }) +}) diff --git a/ui/src/boot/dayjs.js b/ui/src/boot/dayjs.js new file mode 100644 index 0000000..ba3697e --- /dev/null +++ b/ui/src/boot/dayjs.js @@ -0,0 +1,14 @@ +// src/boot/dayjs.js +import dayjs from 'dayjs' +import customParseFormat from 'dayjs/plugin/customParseFormat.js' +import relativeTime from 'dayjs/plugin/relativeTime.js' +import localizedFormat from 'dayjs/plugin/localizedFormat.js' +import 'dayjs/locale/tr.js' + +// 🔹 Plugin’leri aktif et +dayjs.extend(customParseFormat) +dayjs.extend(relativeTime) +dayjs.extend(localizedFormat) +dayjs.locale('tr') + +export default dayjs diff --git a/ui/src/components/EssentialLink.vue b/ui/src/components/EssentialLink.vue new file mode 100644 index 0000000..54afb06 --- /dev/null +++ b/ui/src/components/EssentialLink.vue @@ -0,0 +1,44 @@ + + + diff --git a/ui/src/composables/usePermission.js b/ui/src/composables/usePermission.js new file mode 100644 index 0000000..a17fd33 --- /dev/null +++ b/ui/src/composables/usePermission.js @@ -0,0 +1,20 @@ +import { computed } from 'vue' +import { usePermissionStore } from 'stores/permissionStore' + +export function usePermission () { + + const perm = usePermissionStore() + + return { + + canRead: (m) => computed(() => perm.hasPermission(m, 'read')), + canWrite: (m) => computed(() => perm.hasPermission(m, 'write')), + canUpdate:(m) => computed(() => perm.hasPermission(m, 'update')), + canDelete:(m) => computed(() => perm.hasPermission(m, 'delete')), + canExport:(m) => computed(() => perm.hasPermission(m, 'export')), + + canApi: (p) => computed(() => perm.hasApiPermission(p)), + + hasModule: (m) => computed(() => perm.hasModule(m)) + } +} diff --git a/ui/src/css/app.css b/ui/src/css/app.css new file mode 100644 index 0000000..2a742bc --- /dev/null +++ b/ui/src/css/app.css @@ -0,0 +1,1532 @@ +/* =========================================================== + GLOBAL CUSTOM CSS + =========================================================== */ + .with-bg { + position: relative; + min-height: 100%; +} +.with-bg::before { + content: ""; + position: absolute; + inset: 0; + background: url('/images/Baggi-tekstilas-logolu.jpg') no-repeat center top; + background-size: 400px auto; + opacity: 0.15; + pointer-events: none; + z-index: 0; +} +.with-bg > * { + position: relative; + z-index: 1; +} + +.q-page { + margin-top: 5px; +} + +@media (max-width: 768px) { + .with-bg::before { + background-size: 260px auto; + } +} + +/* ===== ÜST BLOKLAR (SABİT) ===== */ +.filter-sticky { + position: sticky; + top: 56px; /* q-header yüksekliği */ + z-index: 300; + background: #fff; +} + +.filter-collapsible { + background: #fff; +} + +/* ===== TABLO SCROLL ===== */ +.table-scroll { + margin-top: 0; /* 🔹 Boşluğu kaldır */ + height: calc(100vh - 56px); /* 🔹 Header yüksekliği kadar kısalt */ + overflow-y: auto; + overflow-x: auto; + position: relative; +} + +.sticky-table .q-table__middle { + overflow: visible !important; + max-height: none !important; +} + +.sticky-table .q-table__top { + position: sticky; + top: 0; + z-index: 220; + background: #fff; + box-shadow: 0 2px 4px rgba(0,0,0,0.08); +} + +.sticky-table thead th { + position: sticky; + top: 40px; + z-index: 210; + background: #fff; +} + +/* 🔹 Toggle bar */ +.sticky-bar { + position: sticky; + top: 0; /* tablo scroll başladığında en üstte kalsın */ + z-index: 230; + background: #fff; + padding: 4px 8px; + border-bottom: 1px solid #ddd; +} + +/* ===== KOLON DARALTMA + WRAP ===== */ +.sticky-table thead th { + resize: horizontal; + overflow: auto; + min-width: 80px; + max-width: 400px; +} + +.sticky-table td { + min-width: 80px; + max-width: 400px; + white-space: normal !important; + word-break: break-word !important; + overflow-wrap: break-word !important; + line-height: 1.2rem; + padding: 4px 8px !important; + font-weight: 600; + font-size: 0.95rem; +} + +/* ===== GÖRSEL ===== */ +.baggi-ppct { + display: block; + margin: 30px auto 0; + max-width: 400px; + opacity: 0.4; +} + +.col-desc { + white-space: normal !important; + word-break: break-word !important; + overflow-wrap: break-word; + font-size: 0.75rem !important; + line-height: 1.1rem; + width: 220px !important; + max-width: 220px !important; + min-width: 180px !important; +} + +/* ===== TABLO GÖRÜNÜM ===== */ +.custom-table { font-size: 0.8rem; } +.custom-table th { background: #fff; font-weight: 800; color: #222; } +.custom-table td { font-weight: 600; color: #333; } + +.custom-subtable { font-size: 0.72rem; background: #fafafa; } +.custom-subtable th { background: #f9f9f9; font-weight: 500; color: #555; } +.custom-subtable td { font-weight: 400; color: #666; } + +/* dar sütunlar için */ +.col-narrow { + font-size: 0.72rem; + padding: 2px 6px !important; + max-width: 90px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* ===== GRUP SATIRI ===== */ +.group-row { + background: #f1f1f1 !important; + font-weight: 700 !important; + color: #222; + border-top: 2px solid #ccc; + border-bottom: 2px solid #ccc; +} + +/* ===== BALANCE CARD ===== */ +.balance-card { + width: 100%; + min-height: 120px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; +} + +.q-table td[data-col="belge_no"], +.q-table td[data-col="Belge_No"], +.q-table td[data-col="BELGE_NO"] { + color: var(--q-primary) !important; + font-weight: 600 !important; +} + +/* =========================================================== + PERMISSIONS PAGE (FINAL) + =========================================================== */ + +/* Toolbar */ +.permissions-toolbar { + position: sticky; + top: 42px; /* q-header yüksekliği */ + z-index: 300; + background: #fff; + display: flex; + align-items: center; + gap: 12px; + padding: 8px 16px; + border-bottom: 1px solid #ddd; +} + +/* Table scroll alanı */ +.permissions-table-scroll { + height: calc(100vh - 112px); /* header (56) + toolbar (56) */ + overflow-y: auto; + overflow-x: auto; + position: relative; +} + +/* Tablo gövdesi */ +.permissions-table .q-table__middle { + overflow: auto !important; + max-height: none !important; + padding-top: 0px; /* 🔑 Başlık yüksekliği kadar boşluk bırak */ +} + +/* Sticky başlıklar – toolbar’ın altında */ +.permissions-table thead th { + position: sticky; + top:10px; /* toolbar altında hizalanır */ + z-index: 210; + background: #fff; + box-shadow: 0 2px 4px rgba(0,0,0,0.08); +} + +/* Hücreler */ +.permissions-table td { + min-width: 80px; + max-width: 400px; + white-space: normal !important; + word-break: break-word !important; + overflow-wrap: break-word !important; + line-height: 1.2rem; + padding: 4px 8px !important; + font-weight: 600; + font-size: 0.95rem; + background: #fff; +} + +/* İlk kolon (role) sabit */ +.permissions-table .permissions-sticky-col { + position: sticky; + left: 0; + z-index: 205; + background: #fff; + box-shadow: 2px 0 4px rgba(0,0,0,0.04); +} + +/* =========================================================== + 1️⃣ ROOT & GLOBAL RESET + =========================================================== */ +:root { + --header-h: 0px; + --filter-h: 72px; + --save-h: 60px; + --grid-header-h: 172px; + --sub-header-h: 34px; + --drawer-w: 240px; + + /* Grid kolon genişlikleri */ + --col-model: 90px; + --col-renk: 80px; + --col-ana: 100px; + --col-alt: 100px; + --col-aciklama: 140px; + --col-adet: 70px; + --col-fiyat: 70px; + --col-pb: 70px; + --col-tutar: 70px; + --col-termin: 142px; /* 🔹 termin tarihi kolon genişliği */ + + /* Beden blok ölçüleri */ + --grp-title-w: 90px; + --grp-title-gap: 4px; + --beden-w: 44px; + --beden-h: 28px; + --beden-count: 16; + + /* Tema renkleri */ + --baggi-gold: #c9a227; + --baggi-gold-pale: #fff9e6; + --baggi-gold-light: #fff7d2; + --baggi-cream: #fffef9; + --baggi-gray-border: #bbb; +} + +*, *::before, *::after { box-sizing: border-box; } +html, body { height: 100%; margin: 0; } +body { + background: #fff; + color: #222; + font-family: Inter, "Segoe UI", Arial, sans-serif; + font-size: 14px; + line-height: 1.4; +} +#q-app, .q-page-container { margin: 0; padding: 0; } +.q-layout__page { top: 0 !important; } +/* =========================================================== + 2️⃣ PAGE STRUCTURE & SCROLL + =========================================================== */ +.order-page { + display: flex; + flex-direction: column; + height: calc(100vh - var(--header-h)); + overflow-y: auto; + overflow-x: visible; + background: #fff; +} + +.body--drawer-left-open .q-page-container { + margin-left: var(--drawer-w); + width: calc(100% - var(--drawer-w)); +} +.body--drawer-left-closed .q-page-container { + margin-left: 0; width: 100%; +} + +/* 🔸 Yatay scroll sadece grid alanında */ +.order-scroll-x { + flex: 1; + overflow-x: auto; + overflow-y: visible; + background: #fff; +} +/* 🔸 Scrollbar stili */ + +.order-page::-webkit-scrollbar-thumb, +.order-scroll-x::-webkit-scrollbar { + height: 8px; width: 8px; +} +.order-scroll-x::-webkit-scrollbar-thumb { + background: #c0a75e; + border-radius: 4px; +} +.order-scroll-x::-webkit-scrollbar-track { + background: #f9f5e6; +} + +/* =========================================================== + 3️⃣ STICKY STACK (HEADER + TOOLBARS) + =========================================================== */ +.q-header { + position: sticky; + top: 0; + z-index: 1000; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +.sticky-stack { + position: sticky; + top: var(--header-h); + margin-top: 0 !important; + z-index: 950; + display: flex; + flex-direction: column; + background: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,0.05); +} + +/* 🔹 Filtre bar */ +.filter-bar { + background: #fafafa; + border-bottom: 1px solid #ddd; + padding: 12px 24px; + margin-top:0 !important; +} + +/* 🔹 Save toolbar */ +.save-toolbar { + background: var(--baggi-gold-pale); + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + padding: 10px 16px; + display: flex; + justify-content: space-between; + align-items: center; + z-index: 940; +} +.save-toolbar .label { font-weight: 700; color: #6a5314; } +.save-toolbar .value { font-weight: 700; color: #000; } +.save-toolbar .q-btn { + font-weight: 600; + border-radius: 6px; + text-transform: none; +} +/* =========================================================== + 4️⃣ GRID HEADER (ANA BAŞLIK BLOKU) + =========================================================== */ +.order-grid-header { + position: sticky; + top: calc(var(--header-h) + var(--filter-h) + var(--save-h)); + z-index: 700; + display: grid; + grid-auto-flow: column; + grid-template-columns: + var(--col-model) + var(--col-renk) + var(--col-ana) + var(--col-alt) + var(--col-aciklama) + calc(var(--grp-title-w) + var(--grp-title-gap) + (var(--beden-w)*var(--beden-count))) + var(--col-adet) + var(--col-fiyat) + var(--col-pb) + var(--col-tutar) + var(--col-termin); + background: var(--baggi-cream); + border-bottom: 2px solid var(--baggi-gray-border); + box-shadow: 0 2px 3px rgba(0,0,0,0.05); +} + +/* Sabit kolonlar */ +.order-grid-header .col-fixed { + display: flex; + justify-content: center; + align-items: center; + writing-mode: vertical-lr; + transform: rotate(180deg); + background: var(--baggi-gold-light); + border: 1px solid #aaa; + font-weight: 700; + font-size: 12.5px; + height: var(--grid-header-h); +} + +.order-grid-header .aciklama-col { + background: #fff9c4; + border-right: 2px solid #a6a6a6; +} +/* =========================================================== + 5️⃣ BEDEN BLOKLARI & SAĞ TOPLAM + =========================================================== */ +.order-grid-header .beden-block { + display: flex; + flex-direction: column; + height: var(--grid-header-h); + background: #fff; + border: 1px solid #ccc; +} + +.order-grid-header .grp-row { + display: flex; + align-items: center; + height: var(--beden-h); +} + +.order-grid-header .grp-title { + width: var(--grp-title-w); + text-align: right; + font-weight: 700; + font-size: 12px; + padding-right: 4px; +} + +.order-grid-header .grp-body { + display: grid; + grid-auto-flow: column; + grid-auto-columns: var(--beden-w); +} +.order-grid-header .grp-cell.hdr { + width: var(--beden-w); + height: var(--beden-h); + border: 1px solid #bbb; + font-size: 11.5px; + font-weight: 600; + display: flex; + align-items: center; + justify-content: center; +} + +.order-grid-header .total-row { + display: flex; + align-items: stretch; + justify-content: space-between; + background: #fff59d; +} +.order-grid-header .total-cell { + width: var(--col-adet); + display: flex; + justify-content: center; + align-items: center; + writing-mode: vertical-lr; + transform: rotate(180deg); + border-right: 1px solid #bbb; + background: var(--baggi-gold-pale); + font-weight: 700; + font-size: 12px; +} +/* =========================================================== + 6️⃣ SUB-HEADER (ÜRÜN GRUBU BAR) — TAM HİZALANMIŞ + =========================================================== */ + .order-sub-header { + padding-right: 0 !important; /* 🔹 Ekstra sağ boşluğu kaldır */ + margin-right: 0 !important; +} +.order-sub-header { + position: sticky; + top: calc( + var(--header-h) + + var(--filter-h) + + var(--save-h) + + var(--grid-header-h) + ); + z-index: 650; + + /* 🔹 Header ile birebir grid düzeni */ + display: grid; + grid-auto-flow: column; + grid-template-columns: + var(--col-model) + var(--col-renk) + var(--col-ana) + var(--col-alt) + var(--col-aciklama) + calc(var(--grp-title-w) + var(--grp-title-gap) + (var(--beden-w) * var(--beden-count))) + var(--col-adet) + var(--col-fiyat) + var(--col-pb) + var(--col-tutar) + var(--col-termin); + + align-items: center; + justify-items: stretch; + height: var(--sub-header-h); + min-height: var(--sub-header-h); + + /* 🔹 Görsel */ + background: linear-gradient(90deg, #fffbe9 0%, #fff4c4 50%, #fff1b0 100%); + border-top: 1px solid #d6c06a; + border-bottom: 1px solid #d6c06a; + + /* 🔹 Hatalı hizalamaları engelle */ + box-sizing: border-box; + overflow: hidden; + padding: 0 !important; + margin: 0 !important; + padding-right: 0 !important; /* ✅ sağ taşmayı önler */ +} + +/* 🔹 Genişlik eşitleme */ +:root { + --col-termin: 142px; /* ✅ q-input genişliğiyle birebir */ +} + +/* 🔹 Sub-header hover efekti */ +.order-sub-header:hover { + background: linear-gradient(90deg, #fff9cf 0%, #fff3b0 70%, #ffe88f 100%); +} + + +/* 🔹 Sol taraf (MODEL–AÇIKLAMA alanı) */ +.order-sub-header .sub-left { + grid-column: 1 / span 5; + font-weight: 800; + padding-left: 6px; + color: #2b1f05; + display: flex; + align-items: center; +} + +/* 🔹 Orta beden bloğu (header’la aynı yapı) */ +.order-sub-header .sub-center { + grid-column: 6 / 7; + display: grid; + grid-auto-flow: column; + grid-auto-columns: var(--beden-w); + justify-content: start; + align-items: center; + width: calc(var(--grp-title-w) + var(--grp-title-gap) + (var(--beden-w) * var(--beden-count))); + padding-left: var(--grp-title-w); + margin-left: var(--grp-title-gap); + height: 100%; + box-sizing: border-box; +} + +.order-sub-header .beden-cell { + width: var(--beden-w); + height: 100%; + border: 1px solid #d8c16b; + border-right: none; + background: #fffdf3; + font-size: 12px; + font-weight: 600; + display: flex; + justify-content: center; + align-items: center; + box-sizing: border-box; +} +.order-sub-header .beden-cell:last-child { + border-right: 1px solid #d8c16b; +} + +/* 🔹 Sağ taraf (adet–fiyat–pb–tutar–termin toplamları) */ +.order-sub-header .sub-right { + grid-column: 7 / -1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-end; + text-align: right; + padding-right: 0px; + font-weight: 900; + color: #3b2f09; + line-height: 1.3; + text-transform: uppercase; + font-size: 13.5px; + transform: translateX(-60px); +} + +.order-sub-header:hover { + background: linear-gradient(90deg,#fff9cf 0%,#fff3b0 70%,#ffe88f 100%); +} + +:root { + --sub-header-h: 60px; +} + + +/* Taşmayı engelle (ihtiyaten) */ +.order-sub-header { + overflow: hidden; +} + +/* =========================================================== + 7️⃣ GRID BODY & SATIRLAR — TAM HİZALANMIŞ + =========================================================== */ +.order-grid-body { + position: relative; + background: #fff; + margin-top: 0 !important; + padding-top: var(--sub-header-h); + z-index: 100; +} + +.summary-row { + display: grid; + grid-template-columns: + var(--col-model) + var(--col-renk) + var(--col-ana) + var(--col-alt) + var(--col-aciklama) + calc(var(--grp-title-w) + var(--grp-title-gap) + (var(--beden-w) * var(--beden-count))) + var(--col-adet) + var(--col-fiyat) + var(--col-pb) + var(--col-tutar) + var(--col-termin);} + +.summary-row:hover { + background: #fffce0; +} +.summary-row.is-editing { + background: #fff3cd; + outline: 2px solid #caa83f; +} + +.summary-row .cell { + display: flex; + align-items: center; + justify-content: center; + height: var(--beden-h); + padding: 4px 6px; + font-size: 13px; + color: #222; + box-sizing: border-box; +} +.summary-row.row-closed { + opacity: 0.55; + background: #f5f5f5; + pointer-events: none; +} +.summary-row.row-closed:hover { + background: #f5f5f5 !important; +} + +.summary-row:nth-child(odd) { background: #fffef9; } + +/* 🔹 Beden blok hizalaması */ +.summary-row .grp-area { + display: flex; + flex-direction: column; + justify-content: center; + transform: translateX(calc(var(--grp-title-w) - var(--beden-w))); +} +.summary-row .grp-row { + display: grid; + grid-auto-flow: column; + grid-auto-columns: var(--beden-w); +} +.summary-row .grp-row .cell.beden { + width: var(--beden-w); + height: var(--beden-h); + border: 1px solid #ddd; + font-size: 12px; + display: flex; + align-items: center; + justify-content: center; +} +.cell.beden.ghost { + opacity: 0; + pointer-events: none; + border: 1px solid transparent !important; +} + +/* 🔹 Sağ kolonlar */ +.summary-row .cell.adet, +.summary-row .cell.fiyat, +.summary-row .cell.pb, +.summary-row .cell.tutar, +.summary-row .cell.termin { + font-weight: 600; + color: #000; + border-left: none !important; + height: 100%; +} + +.summary-row .cell.tutar { + text-align: right; + justify-content: flex-end; + padding-right: 8px; + border-right: none !important; +} + +.summary-row .cell.termin { + background: #fffef9; + justify-content: center; + align-items: center; + min-width: var(--col-termin); +} +.summary-row .cell.termin .q-input { + width: 100%; + max-width: 142px !important; + box-sizing: border-box; +} +.summary-row .cell.termin input { + text-align: center; + font-size: 13px; +} + +/* =========================================================== + 9️⃣ ORDER EDITOR (ALT FORM) + =========================================================== */ +.editor { + position: relative; + z-index: 50; + background: #fffef9; + border-top: 1px solid #ddd; + margin-top: 24px; + padding: 16px; +} +.editor::before { + content: ""; + display: block; + height: 4px; + background: linear-gradient(to right,#c9a227,#e5d28b,#fff7d2); + margin-bottom: 12px; + border-radius: 2px; +} +.editor .q-btn:hover { background: #d2b04d; } +.editor .q-input, +.editor .q-select { margin-bottom: 8px; font-size: 14px; } +.cell.termin .termin-label { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + font-weight: 600; + font-size: 13px; + color: #222; + background: #fffef9; + border-left: 1px solid #ccc; + box-sizing: border-box; +} + +/* =========================================================== + 🔟 RESPONSIVE + MİNÖR DÜZEN + =========================================================== */ +@media (max-width: 1024px) { + :root { --beden-w: 40px; --col-aciklama: 120px; } + .order-grid-header .col-fixed { font-size: 11px; } + .order-sub-header { font-size: 12.5px; } +} +@media (max-width: 768px) { + :root { + --beden-w: 36px; + --col-model: 70px; + --col-renk: 60px; + --col-aciklama: 100px; + } + .order-page { font-size: 13px; } + .order-grid-header .total-cell { font-size: 10.5px; } +} + +.summary-row .cell { + display: flex; + justify-content: center; + align-items: center; + padding: 4px 6px; + height: auto; + text-align: center; + white-space: normal; + word-wrap: break-word; +} + +.summary-row .grp-area, +.summary-row .grp-row, +.summary-row .grp-row .cell.beden { + align-items: center; + height: 100%; +} +.summary-row .cell.aciklama { + grid-column: 5 / 6 !important; /* sadece 5. kolon */ + position: relative !important; + width: calc(var(--col-aciklama) + 92px) !important; /* 🔹 74px genişletme */ + margin-right: -92px !important; /* 🔹 bedenle tam hizalanır */ + white-space: normal !important; + word-break: break-word !important; + overflow-wrap: break-word !important; + line-height: 1.4 !important; + padding: 6px 12px !important; + font-size: 13px !important; + text-align: left !important; + display: flex !important; + flex-direction: column !important; + align-items: flex-start !important; + justify-content: flex-start !important; + min-height: 36px !important; + background: #fff !important; + box-sizing: border-box !important; + border-right: 1px solid #ccc !important; + z-index: 10 !important; +} +/* 🧩 Grid çizgi kontrastı güçlendirme */ +.summary-row .cell, +.order-grid-header .col-fixed, +.summary-row .grp-row .cell.beden { + border-color: #bbb !important; /* 🔹 daha belirgin çizgi */ +} + +.summary-row .cell:not(:last-child) { + border-right: 1px solid #bdbdbd !important; +} +/* =========================================================== + 🧱 ALT GRID ÇİZGİLERİ – TÜM SATIRLAR İÇİN + =========================================================== */ +.summary-row { + border-bottom: 1px solid #ccc; /* 🔹 satır alt çizgisi */ +} + +.summary-row:last-child { + border-bottom: 2px solid #b7a33a; /* 🔹 son satırda Baggi gold tonu */ +} + +/* 🔹 Hücrelerin alt çizgisi (beden dahil) */ +.summary-row .cell, +.summary-row .grp-row .cell.beden { + border-bottom: 1px solid #ddd !important; +} + +/* 🔹 Hover olduğunda grid çizgileri kaybolmasın */ +.summary-row:hover .cell, +.summary-row:hover .grp-row .cell.beden { + border-bottom: 1px solid #ccc !important; +} +.summary-row:hover { + background: #fffce0; +} + +.summary-row.is-editing { + background: #fff3cd; + outline: 2px solid #caa83f; + z-index: 2; +} + +.editor .q-btn:hover { + background: #d2b04d; + color: #fff; +} + +/* 🔹 Hover olduğunda grid çizgileri kaybolmasın */ +.summary-row:hover .cell, +.summary-row:hover .grp-row .cell.beden { + border-bottom: 1px solid #ccc !important; +} + +/* =========================================================== + 🎨 STOK RENKLERİ (LOW–MID–HIGH) + =========================================================== */ +.stok-red { + color: #e53935; /* 🔴 Kırmızı */ + font-weight: 600; +} + +.stok-yellow { + color: #f9a825; /* 🟡 Sarı */ + font-weight: 600; +} + +.stok-green { + color: #43a047; /* 🟢 Yeşil */ + font-weight: 600; +} +.q-banner.rounded-borders { + border-radius: 8px; +} +.order-gateway { + background: linear-gradient(145deg, #fff 0%, #fafafa 100%); + height: 100%; +} + +.order-btn { + font-size: 1.2rem; + padding: 20px 40px; + border-radius: 12px; + min-width: 280px; + transition: all 0.2s ease; +} +.order-btn:hover { + transform: translateY(-3px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} +/* =========================================================== + 🧭 DRAWER AÇIKKEN GRID HİZALAMA FIX + =========================================================== */ + +/* Drawer açıkken içerik kaymaması */ +.body--drawer-left-open .order-page { + width: calc(100vw - var(--drawer-w)); /* viewport'tan drawer genişliği kadar düş */ + overflow-x: visible; /* dış overflow’u kes */ +} + +/* Scroll konteyner sadece grid içinde çalışsın */ +.order-scroll-x { + max-width: 100%; + overflow-x: auto; + overflow-y: visible; + background: #fff; + box-sizing: border-box; +} + +/* Scrollbar ve sağ boşluğu dengeler */ +.order-grid-header, +.order-sub-header, +.order-grid-body { + min-width: fit-content; + width: 100%; + box-sizing: border-box; +} +/* =========================================================== + 🧱 DRAWER AÇIKKEN TAM HİZALAMA FIX (v2) + =========================================================== */ + +/* Drawer açıkken tüm üst bloklar sağdan taşmasın */ +.body--drawer-left-open .filter-bar, +.body--drawer-left-open .save-toolbar, +.body--drawer-left-open .order-grid-header, +.body--drawer-left-open .order-sub-header, +.body--drawer-left-open .order-grid-body { + width: calc(100vw - var(--drawer-w)); /* drawer genişliği kadar daralt */ + margin-left: 0; + margin-right: 0; + overflow-x: hidden; + box-sizing: border-box; +} + +/* Drawer kapalıyken tam genişlik */ +.body--drawer-left-closed .filter-bar, +.body--drawer-left-closed .save-toolbar, +.body--drawer-left-closed .order-grid-header, +.body--drawer-left-closed .order-sub-header, +.body--drawer-left-closed .order-grid-body { + width: 100vw; +} + +/* Order grid sağ sınırı altın kenarlıkla bitir (optik kapanış) */ +.order-grid-header, +.order-sub-header, +.order-grid-body { + border-right: 2px solid var(--baggi-gold); +} +/* =========================================================== + 🎯 SAĞ ALT BOŞLUK FİNAL FIX + =========================================================== */ + +/* Drawer açıkken tüm grid konteynerleri sağdan tam sıfırla */ +.body--drawer-left-open .order-page, +.body--drawer-left-open .filter-bar, +.body--drawer-left-open .save-toolbar, +.body--drawer-left-open .order-grid-header, +.body--drawer-left-open .order-sub-header, +.body--drawer-left-open .order-grid-body { + width: calc(100vw - var(--drawer-w) - 8px); /* 🔹 scrollbar toleransı */ + padding-right: 0 !important; + margin-right: 0 !important; + overflow-x: visible !important; +} + +/* Son altın kenarlık hizasını koru */ +.order-grid-body { + border-right: 2px solid var(--baggi-gold); +} +/* =========================================================== + 🎯 GRID SAĞ HİZALAMA (FILTER + SAVE + HEADER) + =========================================================== */ + +/* Ana scroll container referansı */ +.order-scroll-x { + display: flex; + flex-direction: column; + align-items: flex-start; /* hizalama sola */ + overflow-x: auto; + overflow-y: visible; + background: #fff; +} + +/* Filter ve Save barlar grid genişliğini takip etsin */ +.filter-bar, +.save-toolbar, +.order-grid-header, +.order-sub-header { + width: fit-content; /* içeriğe göre genişlik */ + min-width: 100%; /* minimum ekran kadar */ + box-sizing: border-box; +} + +/* Grid body’nin genişliği kadar sağ hizalama */ +.order-grid-body { + width: fit-content; + box-sizing: border-box; +} +/* 🔒 Kapalı satır */ +.summary-row.row-closed { + background: #e6e6e6 !important; + opacity: 0.65; + pointer-events: none; /* tüm inputları disable eder */ +} + +/* Hover iptal */ +.summary-row.row-closed:hover { + background: #e6e6e6 !important; +} + +/* Edit efekti de kapansın */ +.summary-row.row-closed.is-editing { + outline: none !important; +} + +/* Sağ kenarda taşma veya padding olmasın */ +.filter-bar, +.save-toolbar, +.order-grid-header, +.order-sub-header, +.order-grid-body { + margin-right: 0 !important; + padding-right: 0 !important; + border-right: none !important; /* altın çizgi istemiyorsan kaldırılır */ +} +.summary-row.row-error { + background: rgba(193, 0, 21, 0.08); +} + +.row-error-icon { + position: absolute; + left: 4px; + top: 50%; + transform: translateY(-50%); +} + + +/* Drawer açık/kapalı fark etmeden */ +.body--drawer-left-open .order-scroll-x, +.body--drawer-left-closed .order-scroll-x { + width: 100%; + overflow-x: auto; +} + +/* =============================== + ORDER LIST (ol-) — Sticky Stack + =============================== */ + +:root { + /* Quasar header yüksekliği */ + --ol-header-h: 56px; + /* Filter bar yüksekliği (px) — inputlar tek satırsa 56 idealdir */ + --ol-filter-h: 96px; +} + +/* q-page tek scroller: header altından başlar */ +.ol-page { + height: calc(100vh - var(--ol-header-h)); + overflow: auto; /* 🔑 tek scroll container */ + background: #fff; + display: flex; + flex-direction: column; +} + +/* Filter bar: q-header’ın altında sticky */ +.ol-filter-bar { + position: sticky; + top: 0; /* 🔑 .ol-page scroller’ında en üst */ + z-index: 600; + background: #fff; + border-bottom: 1px solid #ddd; + padding: 10px 16px; + box-shadow: 0 1px 2px rgba(0,0,0,0.06); + min-height: var(--ol-filter-h); + display: flex; + align-items: center; +} + +/* QTable: sticky thead, zebra aktif ve çakışma yok */ +.ol-table .q-table__middle { + overflow: visible !important; /* sticky thead için güvenli */ + max-height: none !important; +} + +/* thead sabitleme: filter bar’ın ALTINA oturur */ +.ol-table thead th { + position: sticky; + top: var(--ol-filter-h); /* 🔑 filter yüksekliği kadar boşluk */ + z-index: 500; + background: #fff; + box-shadow: 0 2px 4px rgba(0,0,0,0.08); + font-weight: 700; +} + +/* Zebra */ +.ol-table .q-table__body .q-tr:nth-child(odd) { + background-color: #f7f7f7 !important; +} +.ol-table .q-table__body .q-tr:nth-child(even) { + background-color: #ffffff !important; +} +.ol-table .q-table__body .q-tr:hover { + background-color: #fff7d1 !important; + transition: background-color .15s ease; +} + +/* Hücreler */ +.ol-table .q-td { + font-size: .9rem; + line-height: 1.3; + padding: 6px 8px !important; +} + +/* Güvenli z-index hiyerarşisi */ +.q-header { z-index: 1000 !important; } /* header en üstte */ +.q-drawer { z-index: 950 !important; } /* drawer header’ın altında */ + +/* Mobile */ +@media (max-width: 768px) { + :root { --ol-filter-h: 64px; } /* input kırılıyorsa biraz artır */ + .ol-filter-bar { padding: 8px 12px; } +} +/* =========================================================== + 🟡 ORDERLIST ZEBRA FIX (v3) + =========================================================== */ + +/* Her iki tr katmanını da hedefliyoruz (Quasar q-tr + native tr) */ +.ol-table tbody tr:nth-child(odd), +.ol-table .q-table__body .q-tr:nth-child(odd) { + background-color: #faf8ef !important; /* açık krem tonu */ +} + +.ol-table tbody tr:nth-child(even), +.ol-table .q-table__body .q-tr:nth-child(even) { + background-color: #ffffff !important; +} + +/* Hover tonu: hafif Baggi gold dokunuşu */ +.ol-table tbody tr:hover, +.ol-table .q-table__body .q-tr:hover { + background-color: #fff4cc !important; + transition: background-color 0.2s ease; +} +/* ========================================================= + 📌 OrderList — Toplam USD Banner + ========================================================= */ +.ol-qbanner { + background: #f9fafb; + border: 1px solid #e0e0e0; + border-radius: 6px; + padding: 8px 12px; +} + +.ol-qbanner-amount { + color: #1976d2; /* Quasar primary */ + margin-left: 6px; +} +/* ========================================================= + 📌 ORDER LIST (ol-) — MULTILINE COLUMN FIX + ========================================================= */ + +/* Ortak çok satırlı davranış */ +.ol-col-multiline { + white-space: normal !important; + overflow: hidden; + word-break: break-word; + line-height: 1.25rem; +} + +/* 🧾 Cari Adı — 2 SATIR */ +.ol-col-cari { + max-width: 200px; + min-width: 150px; + + display: -webkit-box; + -webkit-box-orient: vertical; + + font-weight: 600; + font-size: 0.88rem; +} + +/* 📝 Açıklama — 5 SATIR */ +.ol-col-desc { + max-width: 220px; + min-width: 160px; + + display: -webkit-box; + -webkit-box-orient: vertical; + + font-size: 0.82rem; + color: #444; +} + +/* Hücre padding iyileştirme */ +.ol-table .q-td.ol-col-cari, +.ol-table .q-td.ol-col-desc { + padding-top: 6px !important; + padding-bottom: 6px !important; +} + +/* Header hizalama */ +.ol-table th.ol-col-cari, +.ol-table th.ol-col-desc { + white-space: nowrap; +} +/* ========================================================= + ORDER LIST — FILTER BAR FLEX FIX (FINAL) + ========================================================= */ + +.ol-filter-bar { + position: sticky; + top: 0; + z-index: 600; + background: #fff; + border-bottom: 1px solid #ddd; + padding: 10px 12px; +} + +/* 🔑 TEK SATIR */ +.ol-filter-row { + display: flex; + align-items: flex-end; /* 🔑 tüm input & butonlar aynı çizgi */ + gap: 12px; + flex-wrap: nowrap; /* ❌ alt satıra düşme */ +} + +/* Inputlar */ +.ol-filter-input { + min-width: 180px; + max-width: 260px; +} + +/* Arama biraz geniş */ +.ol-search { + min-width: 280px; +} + +/* Butonlar */ +.ol-filter-actions { + display: flex; + gap: 8px; + align-items: center; + white-space: nowrap; +} + +/* Toplam banner */ +.ol-filter-total { + margin-left: auto; /* 🔑 sağa yasla */ + background: #f9fafb; + border: 1px solid #e0e0e0; + border-radius: 6px; + padding: 8px 12px; + white-space: nowrap; +} + +/* Mobile fallback */ +@media (max-width: 1200px) { + .ol-filter-row { + flex-wrap: wrap; + row-gap: 8px; + } + + .ol-filter-total { + width: 100%; + justify-content: flex-end; + } +} + +.order-gateway { + min-height: 100vh; +} + +.draft-card { + width: 320px; + max-width: 90vw; +} +/* =========================================================== + 🕵️ ACTIVITY LOGS (act-) — GLOBAL + =========================================================== */ + +/* Sayfa konteyneri */ +.act-page { + height: calc(100vh - 56px); /* q-header */ + overflow: auto; + background: #fff; +} + +/* Sticky filter bar */ +.act-filter-bar { + position: sticky; + top: 0; + z-index: 620; + background: #fff; + border-bottom: 1px solid #ddd; + padding: 10px 16px; + box-shadow: 0 1px 2px rgba(0,0,0,0.06); +} + +/* Filtre satırı */ +.act-filter-row { + display: flex; + align-items: flex-end; + gap: 12px; + flex-wrap: nowrap; +} + +/* Input genişlikleri */ +.act-filter-input { + min-width: 160px; + max-width: 240px; +} + +.act-filter-wide { + min-width: 260px; +} + +/* Aksiyon butonları */ +.act-filter-actions { + display: flex; + gap: 8px; + margin-left: auto; + white-space: nowrap; +} + +/* Tablo */ +.act-table { + font-size: 0.85rem; +} + +/* Sticky thead */ +.act-table thead th { + position: sticky; + top: 56px; /* filter bar yüksekliği */ + z-index: 500; + background: #fff; + box-shadow: 0 2px 4px rgba(0,0,0,0.08); + font-weight: 700; +} + +/* Zebra */ +.act-table tbody tr:nth-child(odd) { + background: #faf8ef; +} +.act-table tbody tr:nth-child(even) { + background: #fff; +} +.act-table tbody tr:hover { + background: #fff4cc; +} + +/* Hücreler */ +.act-table .q-td { + padding: 6px 8px !important; + line-height: 1.25; + font-weight: 600; +} + +/* Başarılı / hatalı satır */ +.act-row-success { + background: rgba(67, 160, 71, 0.06); +} +.act-row-fail { + background: rgba(211, 47, 47, 0.06); +} + +/* Badge renkleri */ +.act-badge-ok { + background: #43a047; +} +.act-badge-fail { + background: #e53935; +} + +/* Dar kolon */ +.act-col-narrow { + max-width: 90px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* Route kolonu */ +.act-col-route { + max-width: 260px; + white-space: normal; + word-break: break-word; + font-size: 0.8rem; +} + +/* IP / UA */ +.act-col-meta { + font-size: 0.75rem; + color: #555; +} +/* ================================ + UserList — Piyasa Wrap (NO CUT) + ================================ */ + +/* Hücre yukarıdan başlasın */ +.ol-col-piyasa { + vertical-align: top; + padding-top: 6px !important; + padding-bottom: 6px !important; +} + +/* Chip konteyner */ +.piyasa-wrap { + display: flex; + flex-wrap: wrap; /* 🔑 alt satıra insin */ + align-content: flex-start; + + row-gap: 4px; + column-gap: 6px; + + /* ❌ KESİNLİKLE YOK */ + max-height: none; + overflow: visible; +} + +/* Chip */ +.piyasa-chip { + flex: 0 0 calc(25% - 6px); /* 🔑 satırda 4 adet */ + max-width: calc(25% - 6px); + + font-size: 11px; + font-weight: 600; + line-height: 1.1; + + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.user-detail-page { + background: #fafafa; +} +.image-preview { + width: 100%; + border-radius: 6px; +} + +.image-thumb { + width: 100%; + border-radius: 4px; +} + +.workorder-page { + padding-bottom: 80px; +} +/* =============================== + PERMISSIONS — BAGGI THEME + =============================== */ + +.permissions-page { + background: #fff; + height: calc(100vh - 56px); + display: flex; + flex-direction: column; +} + +/* Scroll alanı */ +.permissions-table-scroll { + flex: 1; + overflow: auto; + background: #fff; +} + +/* Tablo */ +.permissions-table { + font-size: 0.85rem; +} + +/* Sticky header */ +.permissions-table thead th { + position: sticky; + top: 0; + z-index: 300; + background: var(--baggi-cream); + font-weight: 800; + color: #222; + box-shadow: 0 2px 3px rgba(0,0,0,0.06); +} + +/* Hücreler */ +.permissions-table td { + font-weight: 600; + padding: 6px 8px !important; + color: #333; +} + +/* Zebra */ +.permissions-table tbody tr:nth-child(odd) { + background: #fffef7; +} +.permissions-table tbody tr:nth-child(even) { + background: #ffffff; +} +.permissions-table tbody tr:hover { + background: #fff4cc; +} + +/* Sol kolon sabit */ +.permissions-sticky-col { + position: sticky; + left: 0; + z-index: 250; + background: #fff; + box-shadow: 2px 0 4px rgba(0,0,0,0.04); + font-weight: 700; +} + +/* Header checkbox */ +.permissions-table .q-th .column { + gap: 2px; +} + diff --git a/ui/src/css/quasar.variables.sass b/ui/src/css/quasar.variables.sass new file mode 100644 index 0000000..de35157 --- /dev/null +++ b/ui/src/css/quasar.variables.sass @@ -0,0 +1,8 @@ +$primary : #957116e8 // baggi altın +$secondary : #dac197 // baggi ikinci ton +$accent : #ff9800 // turuncu +$dark : #5a4c4c // siyah-gri +$positive : #21ba45 // yeşil +$negative : #c10015 // kırmızı +$info : #31ccec // açık mavi +$warning : #f2c037 // sarı \ No newline at end of file diff --git a/ui/src/layouts/EmptyLayout.vue b/ui/src/layouts/EmptyLayout.vue new file mode 100644 index 0000000..bf35919 --- /dev/null +++ b/ui/src/layouts/EmptyLayout.vue @@ -0,0 +1,7 @@ + diff --git a/ui/src/layouts/MainLayout.vue b/ui/src/layouts/MainLayout.vue new file mode 100644 index 0000000..a58a79d --- /dev/null +++ b/ui/src/layouts/MainLayout.vue @@ -0,0 +1,302 @@ + + + diff --git a/ui/src/pages/ActivityLogs.vue b/ui/src/pages/ActivityLogs.vue new file mode 100644 index 0000000..9748805 --- /dev/null +++ b/ui/src/pages/ActivityLogs.vue @@ -0,0 +1,341 @@ + + + + + diff --git a/ui/src/pages/ChangePassword.vue b/ui/src/pages/ChangePassword.vue new file mode 100644 index 0000000..4d51503 --- /dev/null +++ b/ui/src/pages/ChangePassword.vue @@ -0,0 +1,120 @@ + + + + diff --git a/ui/src/pages/Dashboard.vue b/ui/src/pages/Dashboard.vue new file mode 100644 index 0000000..2bffd6f --- /dev/null +++ b/ui/src/pages/Dashboard.vue @@ -0,0 +1,9 @@ + + + diff --git a/ui/src/pages/ErrorNotFound.vue b/ui/src/pages/ErrorNotFound.vue new file mode 100644 index 0000000..4b53e5a --- /dev/null +++ b/ui/src/pages/ErrorNotFound.vue @@ -0,0 +1,27 @@ + + + diff --git a/ui/src/pages/FirstPasswordChange.vue b/ui/src/pages/FirstPasswordChange.vue new file mode 100644 index 0000000..ad0a69d --- /dev/null +++ b/ui/src/pages/FirstPasswordChange.vue @@ -0,0 +1,120 @@ + + + + + + + diff --git a/ui/src/pages/MainPage.vue b/ui/src/pages/MainPage.vue new file mode 100644 index 0000000..1d2b0ab --- /dev/null +++ b/ui/src/pages/MainPage.vue @@ -0,0 +1,306 @@ + + + + + + diff --git a/ui/src/pages/MainPanel.vue b/ui/src/pages/MainPanel.vue new file mode 100644 index 0000000..172bc15 --- /dev/null +++ b/ui/src/pages/MainPanel.vue @@ -0,0 +1,9 @@ + + + diff --git a/ui/src/pages/MePassword.vue b/ui/src/pages/MePassword.vue new file mode 100644 index 0000000..637cbc5 --- /dev/null +++ b/ui/src/pages/MePassword.vue @@ -0,0 +1,107 @@ + + + diff --git a/ui/src/pages/OrderEntry.vue b/ui/src/pages/OrderEntry.vue new file mode 100644 index 0000000..2afd629 --- /dev/null +++ b/ui/src/pages/OrderEntry.vue @@ -0,0 +1,2987 @@ + + + diff --git a/ui/src/pages/OrderGateway.vue b/ui/src/pages/OrderGateway.vue new file mode 100644 index 0000000..5e06f90 --- /dev/null +++ b/ui/src/pages/OrderGateway.vue @@ -0,0 +1,272 @@ + + + + diff --git a/ui/src/pages/OrderList.vue b/ui/src/pages/OrderList.vue new file mode 100644 index 0000000..bc3f043 --- /dev/null +++ b/ui/src/pages/OrderList.vue @@ -0,0 +1,408 @@ + + + + diff --git a/ui/src/pages/OrderPdf.vue b/ui/src/pages/OrderPdf.vue new file mode 100644 index 0000000..cc340bc --- /dev/null +++ b/ui/src/pages/OrderPdf.vue @@ -0,0 +1 @@ + diff --git a/ui/src/pages/PermissionMatrix.vue b/ui/src/pages/PermissionMatrix.vue new file mode 100644 index 0000000..e4cd983 --- /dev/null +++ b/ui/src/pages/PermissionMatrix.vue @@ -0,0 +1,301 @@ + + + + diff --git a/ui/src/pages/ProductionWorker.vue b/ui/src/pages/ProductionWorker.vue new file mode 100644 index 0000000..a4c56f2 --- /dev/null +++ b/ui/src/pages/ProductionWorker.vue @@ -0,0 +1,224 @@ + + diff --git a/ui/src/pages/ProductionWorkerGateway.vue b/ui/src/pages/ProductionWorkerGateway.vue new file mode 100644 index 0000000..d2c4b70 --- /dev/null +++ b/ui/src/pages/ProductionWorkerGateway.vue @@ -0,0 +1,211 @@ + + + diff --git a/ui/src/pages/ResetPassword.vue b/ui/src/pages/ResetPassword.vue new file mode 100644 index 0000000..b8ffe92 --- /dev/null +++ b/ui/src/pages/ResetPassword.vue @@ -0,0 +1,264 @@ + + + + diff --git a/ui/src/pages/RoleDepartmentPermissionPage.vue b/ui/src/pages/RoleDepartmentPermissionPage.vue new file mode 100644 index 0000000..e6d2cab --- /dev/null +++ b/ui/src/pages/RoleDepartmentPermissionPage.vue @@ -0,0 +1,435 @@ + + + + + + + + diff --git a/ui/src/pages/StatementHeaderReport.vue b/ui/src/pages/StatementHeaderReport.vue new file mode 100644 index 0000000..515e9a7 --- /dev/null +++ b/ui/src/pages/StatementHeaderReport.vue @@ -0,0 +1,103 @@ + + + + diff --git a/ui/src/pages/StatementReport.vue b/ui/src/pages/StatementReport.vue new file mode 100644 index 0000000..491987f --- /dev/null +++ b/ui/src/pages/StatementReport.vue @@ -0,0 +1,499 @@ + + + diff --git a/ui/src/pages/TestMail.vue b/ui/src/pages/TestMail.vue new file mode 100644 index 0000000..55ddcee --- /dev/null +++ b/ui/src/pages/TestMail.vue @@ -0,0 +1,63 @@ + + + diff --git a/ui/src/pages/UserDetail.vue b/ui/src/pages/UserDetail.vue new file mode 100644 index 0000000..5c0721a --- /dev/null +++ b/ui/src/pages/UserDetail.vue @@ -0,0 +1,383 @@ + + + diff --git a/ui/src/pages/UserGateway.vue b/ui/src/pages/UserGateway.vue new file mode 100644 index 0000000..86af299 --- /dev/null +++ b/ui/src/pages/UserGateway.vue @@ -0,0 +1,108 @@ + + + + + + diff --git a/ui/src/pages/UserList.vue b/ui/src/pages/UserList.vue new file mode 100644 index 0000000..f0c76b0 --- /dev/null +++ b/ui/src/pages/UserList.vue @@ -0,0 +1,272 @@ + + + diff --git a/ui/src/pages/UserPermissionPage.vue b/ui/src/pages/UserPermissionPage.vue new file mode 100644 index 0000000..bde7e1a --- /dev/null +++ b/ui/src/pages/UserPermissionPage.vue @@ -0,0 +1,357 @@ + + + diff --git a/ui/src/pages/UserSync.vue b/ui/src/pages/UserSync.vue new file mode 100644 index 0000000..dd4c278 --- /dev/null +++ b/ui/src/pages/UserSync.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/ui/src/pages/statementofaccount.vue b/ui/src/pages/statementofaccount.vue new file mode 100644 index 0000000..9231b0f --- /dev/null +++ b/ui/src/pages/statementofaccount.vue @@ -0,0 +1,521 @@ + + + diff --git a/ui/src/router/index.js b/ui/src/router/index.js new file mode 100644 index 0000000..c74e02c --- /dev/null +++ b/ui/src/router/index.js @@ -0,0 +1,96 @@ +import { route } from 'quasar/wrappers' +import { createRouter, createWebHashHistory } from 'vue-router' + +import routes from 'src/router/routes.js' + +import { useAuthStore } from 'stores/authStore' +import { usePermissionStore } from 'stores/permissionStore' + + +export default route(function () { + + const router = createRouter({ + history: createWebHashHistory(), + routes + }) + + + /* ============================================================ + 🔐 GLOBAL GUARD + ============================================================ */ + router.beforeEach(async (to, from, next) => { + + const auth = useAuthStore() + const perm = usePermissionStore() + + + /* ================= PUBLIC ================= */ + + if (to.meta?.public === true) { + return next() + } + + + /* ================= LOGIN ================= */ + + if (!auth.isAuthenticated) { + return next('/login') + } + + + /* ================= PASSWORD ================= */ + + if ( + auth.mustChangePassword && + to.path !== '/first-password-change' + ) { + return next('/first-password-change') + } + + + /* ================= ADMIN ================= */ + + if (auth.isAdmin) { + return next() + } + + + /* ================= LOAD PERMS ================= */ + + if (!perm.loaded) { + try { + await perm.fetchPermissions() + } catch (e) { + console.error('Permission load failed', e) + } + } + + + /* ================= CHECK ================= */ + + const required = to.meta?.permission + + if (!required) { + return next() + } + + + const allowed = perm.hasApiPermission(required) + + if (!allowed) { + + console.warn('⛔ ACCESS DENIED:', { + path: to.fullPath, + permission: required + }) + + return next('/unauthorized') + } + + + next() + }) + + + return router +}) diff --git a/ui/src/router/meta.d.js b/ui/src/router/meta.d.js new file mode 100644 index 0000000..f750359 --- /dev/null +++ b/ui/src/router/meta.d.js @@ -0,0 +1,10 @@ +// src/router/meta.js + +/** + * Route meta fields reference + * + * @typedef {Object} RouteMeta + * @property {boolean} [public] - Auth gerekmez + * @property {string} [permission] - Backend route permission (/api/...) + */ +export {} diff --git a/ui/src/router/routes.js b/ui/src/router/routes.js new file mode 100644 index 0000000..0f50c21 --- /dev/null +++ b/ui/src/router/routes.js @@ -0,0 +1,260 @@ +// src/router/routes.js + +const routes = [ + + /* ========================================================== + 🌍 ROOT + ========================================================== */ + { + path: '/', + redirect: '/login' + }, + + + /* ========================================================== + 🔐 PUBLIC + ========================================================== */ + { + path: '/login', + component: () => import('layouts/EmptyLayout.vue'), + meta: { public: true }, + children: [ + { + path: '', + name: 'login', + component: () => import('pages/MainPage.vue') + } + ] + }, + + { + path: '/first-password-change', + component: () => import('layouts/EmptyLayout.vue'), + meta: { public: true }, + children: [ + { + path: '', + name: 'first-password-change', + component: () => import('pages/FirstPasswordChange.vue') + } + ] + }, + + { + path: '/password-reset/:token', + component: () => import('layouts/EmptyLayout.vue'), + meta: { public: true }, + children: [ + { + path: '', + name: 'password-reset', + component: () => import('pages/ResetPassword.vue') + } + ] + }, + + + /* ========================================================== + 🏠 MAIN APP + ========================================================== */ + { + path: '/app', + component: () => import('layouts/MainLayout.vue'), + + children: [ + + /* ================= DASHBOARD ================= */ + + { + path: '', + name: 'dashboard', + component: () => import('pages/Dashboard.vue'), + meta: { permission: 'system:read' } + }, + + + /* ================= PERMISSIONS ================= */ + + { + path: 'permissions', + name: 'permissions', + component: () => import('pages/PermissionMatrix.vue'), + meta: { permission: 'system:read' } + }, + + { + path: 'role-dept-permissions', + name: 'role-dept-permissions', + component: () => import('pages/RoleDepartmentPermissionPage.vue'), + meta: { permission: 'user:update' } + }, + + { + path: 'user-permissions', + name: 'user-permissions', + component: () => import('pages/UserPermissionPage.vue'), + meta: { permission: 'user:update' } + }, + + + /* ================= FINANCE ================= */ + + { + path: 'statementofaccount', + name: 'statementofaccount', + component: () => import('pages/statementofaccount.vue'), + meta: { permission: 'finance:view' } + }, + + { + path: 'statementreport', + name: 'statementreport', + component: () => import('pages/StatementReport.vue'), + meta: { permission: 'finance:view' } + }, + + { + path: 'statementheaderreport', + name: 'statementheaderreport', + component: () => import('pages/StatementHeaderReport.vue'), + meta: { permission: 'finance:view' } + }, + + + /* ================= USERS ================= */ + + { + path: 'users', + name: 'user-gateway', + component: () => import('pages/UserGateway.vue'), + meta: { permission: 'user:view' } + }, + + { + path: 'users/list', + name: 'user-list', + component: () => import('pages/UserList.vue'), + meta: { permission: 'user:view' } + }, + + { + path: 'users/new', + name: 'user-new', + component: () => import('pages/UserDetail.vue'), + meta: { + mode: 'new', + permission: 'user:insert' + } + }, + + { + path: 'users/edit/:id', + name: 'user-edit', + component: () => import('pages/UserDetail.vue'), + props: true, + meta: { + mode: 'edit', + permission: 'user:update' + } + }, + + { + path: 'users/view/:id', + name: 'user-view', + component: () => import('pages/UserDetail.vue'), + props: true, + meta: { + mode: 'view', + permission: 'user:view' + } + }, + + + /* ================= LOGS ================= */ + + { + path: 'activity-logs', + name: 'activity-logs', + component: () => import('pages/ActivityLogs.vue'), + meta: { permission: 'user:view' } + }, + + + /* ================= TEST MAIL ================= */ + + { + path: 'test-mail', + name: 'test-mail', + component: () => import('pages/TestMail.vue'), + meta: { permission: 'user:insert' } + }, + + + /* ================= ORDERS ================= */ + + { + path: 'order-gateway', + name: 'order-gateway', + component: () => import('pages/OrderGateway.vue'), + meta: { permission: 'order:view' } + }, + + { + path: 'order-entry/:orderHeaderID', + name: 'order-entry', + component: () => import('pages/OrderEntry.vue'), + props: true, + meta: { + mode: 'new', + permission: 'order:insert' + } + }, + + { + path: 'order-edit/:orderHeaderID', + name: 'order-edit', + component: () => import('pages/OrderEntry.vue'), + props: true, + meta: { + mode: 'edit', + permission: 'order:update' + } + }, + + { + path: 'order-list', + name: 'order-list', + component: () => import('pages/OrderList.vue'), + meta: { permission: 'order:view' } + }, + + { + path: 'order-pdf/:id', + name: 'order-pdf', + component: () => import('pages/OrderPdf.vue'), + props: true, + meta: { permission: 'order:export' } + }, + + + /* ================= PASSWORD ================= */ + + { + path: 'change-password', + name: 'change-password', + component: () => import('pages/ChangePassword.vue') + } + ] + }, + + + /* ========================================================== + ❌ 404 + ========================================================== */ + { + path: '/:catchAll(.*)*', + component: () => import('pages/ErrorNotFound.vue') + } +] + +export default routes diff --git a/ui/src/services/api.js b/ui/src/services/api.js new file mode 100644 index 0000000..7c85019 --- /dev/null +++ b/ui/src/services/api.js @@ -0,0 +1,67 @@ +// src/services/api.js +import axios from 'axios' +import qs from 'qs' +import { useAuthStore } from 'stores/authStore' + +const api = axios.create({ + baseURL: 'http://localhost:8080/api', + timeout: 180000, + paramsSerializer: params => + qs.stringify(params, { arrayFormat: 'repeat' }) +}) + +// REQUEST +api.interceptors.request.use((config) => { + const auth = useAuthStore() + const url = config.url || '' + + const isPublic = + url.startsWith('/auth/login') || + url.startsWith('/auth/refresh') || + url.startsWith('/password/forgot') || + url.startsWith('/password/reset') + + + if (!isPublic && auth?.token) { + config.headers ||= {} + config.headers.Authorization = `Bearer ${auth.token}` + } + + return config +}) + +// RESPONSE +let isLoggingOut = false +api.interceptors.response.use( + r => r, + async (error) => { + if (error?.response?.status === 401 && !isLoggingOut) { + isLoggingOut = true + try { + useAuthStore().clearSession() + } finally { + isLoggingOut = false + } + } + return Promise.reject(error) + } +) + +// HELPERS +export const get = (u, p = {}, c = {}) => + api.get(u, { params: p, ...c }).then(r => r.data) + +export const post = (u, b = {}, c = {}) => + api.post(u, b, c).then(r => r.data) + +export const put = (u, b = {}, c = {}) => + api.put(u, b, c).then(r => r.data) + +export const del = (u, p = {}, c = {}) => + api.delete(u, { params: p, ...c }).then(r => r.data) + +export const download = (u, p = {}, c = {}) => + api.get(u, { params: p, responseType: 'blob', ...c }) + .then(r => r.data) + +export default api diff --git a/ui/src/services/orderService.js b/ui/src/services/orderService.js new file mode 100644 index 0000000..91e9935 --- /dev/null +++ b/ui/src/services/orderService.js @@ -0,0 +1,62 @@ +// src/services/orderService.js +import { get, post, put } from './api' + +/** + * 🔹 Tek bir siparişi ID’ye göre getirir. + * @param {string} id - OrderHeaderID (GUID) + */ +export async function getOrderById(id) { + try { + const data = await get(`/order/get/${id}`) + return data + } catch (err) { + console.error('❌ getOrderById hatası:', err.message) + throw err + } +} + +/** + * 🔹 Yeni sipariş oluşturur (insert). + * Backend: POST /api/order/create + * @param {Object} header - Sipariş başlığı (OrderHeader tablosu) + * @param {Array} lines - Satırlar (OrderLine tablosu) + */ +export async function createOrder(header, lines) { + const payload = { + header, + lines, + username: header?.CreatedUserName || 'system', + } + + try { + const data = await post('/order/create', payload) + console.log('✅ Sipariş oluşturuldu:', data) + return data + } catch (err) { + console.error('❌ createOrder hatası:', err.message) + throw err + } +} + +/** + * 🔹 Mevcut siparişi günceller (update). + * Backend: PUT /api/order/update + * @param {Object} header - Sipariş başlığı (OrderHeader tablosu) + * @param {Array} lines - Satırlar (OrderLine tablosu) + */ +export async function updateOrder(header, lines) { + const payload = { + header, + lines, + username: header?.LastUpdatedUserName || 'system', + } + + try { + const data = await put('/order/update', payload) + console.log('✅ Sipariş güncellendi:', data) + return data + } catch (err) { + console.error('❌ updateOrder hatası:', err.message) + throw err + } +} diff --git a/ui/src/stores/OrdernewListStore.js b/ui/src/stores/OrdernewListStore.js new file mode 100644 index 0000000..c71aea4 --- /dev/null +++ b/ui/src/stores/OrdernewListStore.js @@ -0,0 +1,167 @@ +// src/stores/OrdernewListStore.js +import { defineStore } from 'pinia' +import api from 'src/services/api' + +let lastRequestId = 0 + +export const useOrderListStore = defineStore('orderlist', { + state: () => ({ + orders: [], + loading: false, + error: null, + + filters: { + search: '', + CurrAccCode: '', + OrderDate: '' + } + }), + + getters: { + filteredOrders (state) { + let result = state.orders + + if (state.filters.CurrAccCode) { + result = result.filter(o => o.CurrAccCode === state.filters.CurrAccCode) + } + + if (state.filters.OrderDate) { + result = result.filter(o => + o.OrderDate?.startsWith(state.filters.OrderDate) + ) + } + + return result + }, + + totalVisibleUSD (state) { + return state.filteredOrders.reduce( + (sum, o) => sum + Number(o.TotalAmountUSD || 0), + 0 + ) + } + }, + + actions: { + async fetchOrders () { + + // ============================== + // 📌 REQUEST ID + // ============================== + const rid = ++lastRequestId + + // ============================== + // 📌 SEARCH SNAPSHOT + // ============================== + const raw = this.filters.search ?? '' + const trimmed = String(raw).trim() + + // ============================== + // 📌 REQUEST LOG + // ============================== + console.groupCollapsed( + `%c[orders] FETCH rid=${rid}`, + 'color:#1976d2;font-weight:bold' + ) + + console.log('raw =', JSON.stringify(raw), 'len=', String(raw).length) + console.log('trimmed =', JSON.stringify(trimmed), 'len=', trimmed.length) + console.log('filters =', JSON.parse(JSON.stringify(this.filters))) + console.log('lastRID =', lastRequestId) + + console.groupEnd() + + this.loading = true + this.error = null + + try { + + // ============================== + // 📌 PARAMS + // ============================== + const params = {} + if (trimmed) params.search = trimmed + + // ============================== + // 📌 API CALL + // ============================== + const res = await api.get('/orders/list', { params }) + + // ============================== + // 📌 STALE CHECK + // ============================== + if (rid !== lastRequestId) { + console.warn( + `[orders] IGNORE stale response rid=${rid} last=${lastRequestId}` + ) + return + } + + // ============================== + // 📌 DATA + // ============================== + const data = res?.data + this.orders = Array.isArray(data) ? data : [] + + // ============================== + // 📌 RESPONSE LOG + // ============================== + console.groupCollapsed( + `%c[orders] RESPONSE rid=${rid} count=${this.orders.length}`, + 'color:#2e7d32;font-weight:bold' + ) + + console.log('status =', res?.status) + + console.log( + 'sample =', + this.orders.slice(0, 5).map(o => ({ + id: o.OrderHeaderID, + no: o.OrderNumber, + code: o.CurrAccCode, + name: o.CurrAccDescription + })) + ) + + // ============================== + // 📌 DUPLICATE CHECK + // ============================== + const ids = this.orders.map(o => String(o.OrderHeaderID)) + const dup = ids.filter((v, i) => ids.indexOf(v) !== i) + + if (dup.length) { + console.warn( + 'DUPLICATE OrderHeaderID sample =', + dup.slice(0, 10) + ) + } + + console.groupEnd() + + } catch (err) { + + if (rid !== lastRequestId) return + + console.error( + '[orders] FETCH FAILED', + err?.response?.status, + err?.response?.data || err + ) + + this.orders = [] + + this.error = + err?.response?.data || + err?.message || + 'Sipariş listesi alınamadı' + + } finally { + + if (rid === lastRequestId) { + this.loading = false + } + + } + } + } +}) diff --git a/ui/src/stores/UserDetailStore.js b/ui/src/stores/UserDetailStore.js new file mode 100644 index 0000000..6d1dd0a --- /dev/null +++ b/ui/src/stores/UserDetailStore.js @@ -0,0 +1,238 @@ +// src/stores/userDetailStore.js +import { defineStore } from 'pinia' +import api, { get, post, put } from 'src/services/api' + +export const useUserDetailStore = defineStore('userDetail', { + state: () => ({ + sendingPasswordMail: false, + lastPasswordMailSentAt: null, + hasPassword: false, + + /* ================= FLAGS ================= */ + loading: false, + saving: false, + error: null, + + /* ================= FORM ================= */ + form: { + id: null, + code: '', + full_name: '', + email: '', + mobile: '', + is_active: true, + address: '', + roles: [], + departments: [], + piyasalar: [], + nebim_users: [] + }, + + /* ================= LOOKUPS ================= */ + roleOptions: [], + departmentOptions: [], + piyasaOptions: [], + nebimUserOptions: [] + }), + + actions: { + /* ===================================================== + 🔄 RESET (NEW MODE) + ===================================================== */ + resetForm () { + this.form = { + id: null, + code: '', + full_name: '', + email: '', + mobile: '', + is_active: true, + address: '', + roles: [], + departments: [], + piyasalar: [], + nebim_users: [] + } + this.error = null + this.hasPassword = false + this.lastPasswordMailSentAt = null + }, + + /* ===================================================== + 🔐 ADMIN RESET PASSWORD + ===================================================== */ + async adminResetPassword (id, payload) { + // token otomatik (interceptor) + await post(`/users/${id}/admin-reset-password`, payload) + this.hasPassword = true + }, + + /* ===================================================== + ✉️ SEND PASSWORD MAIL + ===================================================== */ + async sendPasswordMail (id) { + this.sendingPasswordMail = true + this.error = null + + try { + await post(`/users/${id}/send-password-mail`, {}) + + // UI takip (DB’siz): sadece “son gönderim” gösterir + this.lastPasswordMailSentAt = new Date().toLocaleString('tr-TR') + } catch (e) { + this.error = 'Parola maili gönderilemedi' + throw e + } finally { + this.sendingPasswordMail = false + } + }, + + /* ===================================================== + 📦 PAYLOAD BUILDER (BACKEND SÖZLEŞMESİYLE UYUMLU) + ===================================================== */ + buildPayload () { + return { + code: this.form.code, + full_name: this.form.full_name, + email: this.form.email, + mobile: this.form.mobile, + is_active: this.form.is_active, + address: this.form.address, + + roles: this.form.roles, + + // ✅ TEK DEPARTMAN (string → backend array) + departments: this.form.departments + ? [{ code: this.form.departments }] + : [], + + piyasalar: (this.form.piyasalar || []).map(code => ({ code })), + + nebim_users: (this.form.nebim_users || []).map(username => { + const opt = (this.nebimUserOptions || []).find(x => x.value === username) + return { + username, + user_group_code: opt?.user_group_code || '' + } + }) + } + }, + + /* ===================================================== + 📥 GET USER (EDIT MODE) + ===================================================== */ + async fetchUser (id) { + this.loading = true + this.error = null + + try { + const data = await get(`/users/${id}`) + + this.form.id = data.id + this.form.code = data.code || '' + this.form.full_name = data.full_name || '' + this.form.email = data.email || '' + this.form.mobile = data.mobile || '' + this.form.is_active = !!data.is_active + this.form.address = data.address || '' + + this.form.roles = data.roles || [] + this.form.departments = (data.departments || []).map(x => x.code) + this.form.piyasalar = (data.piyasalar || []).map(x => x.code) + this.form.nebim_users = (data.nebim_users || []).map(x => x.username) + + this.hasPassword = !!data.has_password + } catch (e) { + this.error = 'Kullanıcı bilgileri alınamadı' + throw e + } finally { + this.loading = false + } + }, + + /* ===================================================== + ✍️ UPDATE USER (PUT) + ===================================================== */ + async saveUser (id) { + this.saving = true + this.error = null + + try { + console.log('🟦 saveUser() START', id) + + const payload = this.buildPayload() + console.log('📤 PUT payload', payload) + + await put(`/users/${id}`, payload) + + console.log('✅ PUT OK → REFETCH USER') + await this.fetchUser(id) + + console.log('🔄 USER REFRESHED', { + hasPassword: this.hasPassword, + roles: this.form.roles, + departments: this.form.departments + }) + } catch (e) { + console.error('❌ saveUser FAILED', e) + this.error = 'Kullanıcı güncellenemedi' + throw e + } finally { + this.saving = false + } + }, + + /* ===================================================== + ➕ CREATE USER (POST) + ===================================================== */ + async createUser () { + this.saving = true + this.error = null + + try { + console.log('🟢 createUser() START') + + const payload = this.buildPayload() + console.log('📤 POST payload', payload) + + const data = await post('/users', payload) + + console.log('✅ CREATE OK response', data) + + const newId = data?.id + if (!newId) { + throw new Error('CREATE response id yok') + } + + console.log('🔁 FETCH NEW USER id=', newId) + await this.fetchUser(newId) + + return newId + } catch (e) { + console.error('❌ createUser FAILED', e) + this.error = 'Kullanıcı oluşturulamadı' + throw e + } finally { + this.saving = false + } + }, + + /* ===================================================== + 📚 LOOKUPS (NEW + EDIT ORTAK) + ===================================================== */ + async fetchLookups () { + // token otomatik + const [roles, depts, piyasalar, nebims] = await Promise.all([ + api.get('/lookups/roles'), + api.get('/lookups/departments'), + api.get('/lookups/piyasalar'), + api.get('/lookups/nebim-users') + ]) + + this.roleOptions = roles?.data || roles || [] + this.departmentOptions = depts?.data || depts || [] + this.piyasaOptions = piyasalar?.data || piyasalar || [] + this.nebimUserOptions = nebims?.data || nebims || [] + } + } +}) diff --git a/ui/src/stores/UserListStore.js b/ui/src/stores/UserListStore.js new file mode 100644 index 0000000..66d2c52 --- /dev/null +++ b/ui/src/stores/UserListStore.js @@ -0,0 +1,72 @@ +// src/stores/userListStore.js +import { defineStore } from 'pinia' +import api from 'src/services/api' + +export const useUserListStore = defineStore('userlist', { + state: () => ({ + users: [], + loading: false, + error: null, + + filters: { + search: '', + onlyActive: false + } + }), + + getters: { + filteredUsers(state) { + let result = state.users + const term = state.filters.search?.toLowerCase() || '' + + if (term) { + result = result.filter(u => + u.code?.toLowerCase().includes(term) || + u.nebim_username?.toLowerCase().includes(term) || + u.role_names?.toLowerCase().includes(term) || + u.department_names?.toLowerCase().includes(term) || + u.piyasa_names?.toLowerCase().includes(term) + ) + } + + if (state.filters.onlyActive) { + result = result.filter(u => u.is_active) + } + + return result + } + }, + + actions: { + async fetchUsers() { + this.loading = true + this.error = null + + try { + const params = {} + + if (this.filters.search) { + params.search = this.filters.search + } + + const { data } = await api.get( + '/users/list', + { params } + ) + + this.users = Array.isArray(data) ? data : [] + + console.log('✅ User listesi alındı:', this.users.length) + + } catch (err) { + console.error('❌ User listesi alınamadı:', err) + this.users = [] + this.error = + err?.message || + 'Kullanıcı listesi alınamadı' + } finally { + this.loading = false + } + } + } +}) diff --git a/ui/src/stores/accountStore.js b/ui/src/stores/accountStore.js new file mode 100644 index 0000000..35b351b --- /dev/null +++ b/ui/src/stores/accountStore.js @@ -0,0 +1,43 @@ +// src/stores/accountStore.js +import { defineStore } from 'pinia' +import api from 'src/services/api' + +export const useAccountStore = defineStore('account', { + state: () => ({ + accountOptions: [], + loading: false, + error: null + }), + + actions: { + async fetchAccounts () { + this.loading = true + this.error = null + + try { + // 🔐 Token interceptor ile otomatik eklenir + const { data } = await api.get('/accounts') + + this.accountOptions = (Array.isArray(data) ? data : []).map(acc => ({ + label: `${acc.display_code || ''} ${acc.account_name || ''}`.trim(), + value: acc.account_code + })) + + } catch (err) { + console.error('❌ Error fetching accounts:', err) + + if (err?.response?.status === 401) { + this.error = 'Cari hesapları görüntüleme yetkiniz yok.' + } else { + this.error = + err?.response?.data?.message || + err?.message || + 'Cari hesaplar yüklenemedi' + } + } finally { + this.loading = false + } + } + + } +}) diff --git a/ui/src/stores/activityLogStore.js b/ui/src/stores/activityLogStore.js new file mode 100644 index 0000000..9eb3c3c --- /dev/null +++ b/ui/src/stores/activityLogStore.js @@ -0,0 +1,102 @@ +import { defineStore } from 'pinia' +import { get } from 'src/services/api' + +export const useActivityLogStore = defineStore('activityLogStore', { + state: () => ({ + loading: false, + + rows: [], + total: 0, + + pagination: { + page: 1, + rowsPerPage: 0, // ✅ SINIRSIZ + sortBy: 'created_at', + descending: true + } + , + + filters: { + username: '', + actionCategory: null, + actionType: '', + success: null, + dateFrom: '', + dateTo: '' + } + }), + + actions: { + async fetchLogs () { + this.loading = true + try { + const params = {} + + if (this.pagination.rowsPerPage > 0) { + params.page = this.pagination.page + params.limit = this.pagination.rowsPerPage + } + + + if (this.filters.username) + params.username = this.filters.username + + if (this.filters.actionCategory) + params.action_category = this.filters.actionCategory + + if (this.filters.actionType) + params.action_type = this.filters.actionType + + if (this.filters.success !== null) + params.success = this.filters.success + + if (this.filters.dateFrom) + params.date_from = this.filters.dateFrom + + if (this.filters.dateTo) + params.date_to = this.filters.dateTo + + const data = await get('/activity-logs', params) + + this.rows = data.items || [] + this.total = data.total || 0 + } finally { + this.loading = false + } + }, + quickRoleChange () { + + this.filters.actionCategory = 'role_permission' + this.filters.actionType = 'role_department_permission_change' + + this.pagination.page = 1 + + this.fetchLogs() + } + , + + onTableRequest (props) { + const { page, rowsPerPage, sortBy, descending } = props.pagination + + this.pagination.page = page + this.pagination.rowsPerPage = rowsPerPage + this.pagination.sortBy = sortBy + this.pagination.descending = descending + + this.fetchLogs() + } +, + resetFilters () { + this.filters = { + username: '', + actionCategory: null, + actionType: '', + success: null, + dateFrom: '', + dateTo: '' + } + this.pagination.page = 1 + this.fetchLogs() + } + } +}) diff --git a/ui/src/stores/authStore.js b/ui/src/stores/authStore.js new file mode 100644 index 0000000..e17eda2 --- /dev/null +++ b/ui/src/stores/authStore.js @@ -0,0 +1,117 @@ +// src/stores/authStore.js +import { defineStore } from 'pinia' +import api from 'src/services/api' +import { usePermissionStore } from 'stores/permissionStore' + +export const useAuthStore = defineStore('auth', { + state: () => { + let user = null + + try { + const raw = localStorage.getItem('user') + if (raw && raw !== 'undefined' && raw !== 'null') { + user = JSON.parse(raw) + } + } catch { + console.warn('⚠️ Invalid user in localStorage, cleared') + localStorage.removeItem('user') + } + + return { + token: localStorage.getItem('token'), + user, + forcePasswordChange: localStorage.getItem('forcePasswordChange') === '1' + } + }, + + getters: { + isAuthenticated: s => !!s.token, + mustChangePassword: s => !!s.forcePasswordChange, + + // 🔥 TEK ADMIN KURALI + isAdmin: s => + String(s.user?.role_code || '').toLowerCase() === 'admin' + }, + + actions: { + /* ========================================================= + 🔐 SESSION + ========================================================= */ + setSession ({ token, user }) { + this.token = token + this.user = user ?? null + this.forcePasswordChange = !!user?.force_password_change + + localStorage.setItem('token', token) + + if (user) { + localStorage.setItem('user', JSON.stringify(user)) + } else { + localStorage.removeItem('user') + } + + localStorage.setItem( + 'forcePasswordChange', + this.forcePasswordChange ? '1' : '0' + ) + }, + + clearSession () { + this.token = null + this.user = null + this.forcePasswordChange = false + + localStorage.removeItem('token') + localStorage.removeItem('user') + localStorage.removeItem('forcePasswordChange') + + usePermissionStore().clear() + }, + + /* ========================================================= + 🔐 LOGIN + ========================================================= */ + async login (username, password) { + const res = await api.post('/auth/login', { username, password }) + + const token = + res?.token || + res?.data?.token || + res?.access_token || + res?.data?.access_token + + const user = + res?.user || + res?.data?.user + + // ✅ JWT doğrulama + const tokenStr = typeof token === 'string' ? token.trim() : '' + const looksLikeJwt = tokenStr.split('.').length === 3 + + if (!tokenStr || !looksLikeJwt) { + console.error('❌ LOGIN RESPONSE (unexpected):', res) + throw new Error('Invalid login token') + } + + this.setSession({ token: tokenStr, user }) + + // 🔥 PERMISSIONS + const perm = usePermissionStore() + await perm.fetchPermissions() + + + + + // 🧪 DEBUG (istersen sonra kaldır) + console.log('🔐 AUTH DEBUG', { + isAdmin: this.isAdmin, + users: perm.hasPermission('/api/users/list'), + orders: perm.hasPermission('/api/orders/list'), + logs: perm.hasPermission('/api/activity-logs'), + permissions: perm.hasPermission('/api/permissions/matrix') + }) + + return true + } + } +}) diff --git a/ui/src/stores/deneme b/ui/src/stores/deneme new file mode 100644 index 0000000..ebdca69 --- /dev/null +++ b/ui/src/stores/deneme @@ -0,0 +1,3023 @@ + + + diff --git a/ui/src/stores/deneme2 b/ui/src/stores/deneme2 new file mode 100644 index 0000000..60520f2 --- /dev/null +++ b/ui/src/stores/deneme2 @@ -0,0 +1,1128 @@ +/* =========================================================== + GLOBAL CUSTOM CSS + =========================================================== */ + .with-bg { + position: relative; + min-height: 100%; +} +.with-bg::before { + content: ""; + position: absolute; + inset: 0; + background: url('/images/Baggi-tekstilas-logolu.jpg') no-repeat center top; + background-size: 400px auto; + opacity: 0.15; + pointer-events: none; + z-index: 0; +} +.with-bg > * { + position: relative; + z-index: 1; +} + +.q-page { + margin-top: 5px; +} + +@media (max-width: 768px) { + .with-bg::before { + background-size: 260px auto; + } +} + +/* ===== ÜST BLOKLAR (SABİT) ===== */ +.filter-sticky { + position: sticky; + top: 56px; /* q-header yüksekliği */ + z-index: 300; + background: #fff; +} + +.filter-collapsible { + background: #fff; +} + +/* ===== TABLO SCROLL ===== */ +.table-scroll { + margin-top: 0; /* 🔹 Boşluğu kaldır */ + height: calc(100vh - 56px); /* 🔹 Header yüksekliği kadar kısalt */ + overflow-y: auto; + overflow-x: auto; + position: relative; +} + +.sticky-table .q-table__middle { + overflow: visible !important; + max-height: none !important; +} + +.sticky-table .q-table__top { + position: sticky; + top: 0; + z-index: 220; + background: #fff; + box-shadow: 0 2px 4px rgba(0,0,0,0.08); +} + +.sticky-table thead th { + position: sticky; + top: 40px; + z-index: 210; + background: #fff; +} + +/* 🔹 Toggle bar */ +.sticky-bar { + position: sticky; + top: 0; /* tablo scroll başladığında en üstte kalsın */ + z-index: 230; + background: #fff; + padding: 4px 8px; + border-bottom: 1px solid #ddd; +} + +/* ===== KOLON DARALTMA + WRAP ===== */ +.sticky-table thead th { + resize: horizontal; + overflow: auto; + min-width: 80px; + max-width: 400px; +} + +.sticky-table td { + min-width: 80px; + max-width: 400px; + white-space: normal !important; + word-break: break-word !important; + overflow-wrap: break-word !important; + line-height: 1.2rem; + padding: 4px 8px !important; + font-weight: 600; + font-size: 0.95rem; +} + +/* ===== GÖRSEL ===== */ +.baggi-ppct { + display: block; + margin: 30px auto 0; + max-width: 400px; + opacity: 0.4; +} + +.col-desc { + white-space: normal !important; + word-break: break-word !important; + overflow-wrap: break-word; + font-size: 0.75rem !important; + line-height: 1.1rem; + width: 220px !important; + max-width: 220px !important; + min-width: 180px !important; +} + +/* ===== TABLO GÖRÜNÜM ===== */ +.custom-table { font-size: 0.8rem; } +.custom-table th { background: #fff; font-weight: 800; color: #222; } +.custom-table td { font-weight: 600; color: #333; } + +.custom-subtable { font-size: 0.72rem; background: #fafafa; } +.custom-subtable th { background: #f9f9f9; font-weight: 500; color: #555; } +.custom-subtable td { font-weight: 400; color: #666; } + +/* dar sütunlar için */ +.col-narrow { + font-size: 0.72rem; + padding: 2px 6px !important; + max-width: 90px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +/* ===== GRUP SATIRI ===== */ +.group-row { + background: #f1f1f1 !important; + font-weight: 700 !important; + color: #222; + border-top: 2px solid #ccc; + border-bottom: 2px solid #ccc; +} + +/* ===== BALANCE CARD ===== */ +.balance-card { + width: 100%; + min-height: 120px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; +} + +.q-table td[data-col="belge_no"], +.q-table td[data-col="Belge_No"], +.q-table td[data-col="BELGE_NO"] { + color: var(--q-primary) !important; + font-weight: 600 !important; +} + +/* =========================================================== + PERMISSIONS PAGE (FINAL) + =========================================================== */ + +/* Toolbar */ +.permissions-toolbar { + position: sticky; + top: 42px; /* q-header yüksekliği */ + z-index: 300; + background: #fff; + display: flex; + align-items: center; + gap: 12px; + padding: 8px 16px; + border-bottom: 1px solid #ddd; +} + +/* Table scroll alanı */ +.permissions-table-scroll { + height: calc(100vh - 112px); /* header (56) + toolbar (56) */ + overflow-y: auto; + overflow-x: auto; + position: relative; +} + +/* Tablo gövdesi */ +.permissions-table .q-table__middle { + overflow: auto !important; + max-height: none !important; + padding-top: 0px; /* 🔑 Başlık yüksekliği kadar boşluk bırak */ +} + +/* Sticky başlıklar – toolbar’ın altında */ +.permissions-table thead th { + position: sticky; + top:10px; /* toolbar altında hizalanır */ + z-index: 210; + background: #fff; + box-shadow: 0 2px 4px rgba(0,0,0,0.08); +} + +/* Hücreler */ +.permissions-table td { + min-width: 80px; + max-width: 400px; + white-space: normal !important; + word-break: break-word !important; + overflow-wrap: break-word !important; + line-height: 1.2rem; + padding: 4px 8px !important; + font-weight: 600; + font-size: 0.95rem; + background: #fff; +} + +/* İlk kolon (role) sabit */ +.permissions-table .permissions-sticky-col { + position: sticky; + left: 0; + z-index: 205; + background: #fff; + box-shadow: 2px 0 4px rgba(0,0,0,0.04); +} + +/* =========================================================== + 1️⃣ ROOT & GLOBAL RESET + =========================================================== */ +:root { + --header-h: 0px; + --filter-h: 72px; + --save-h: 60px; + --grid-header-h: 172px; + --sub-header-h: 34px; + --drawer-w: 240px; + + /* Grid kolon genişlikleri */ + --col-model: 90px; + --col-renk: 80px; + --col-ana: 100px; + --col-alt: 100px; + --col-aciklama: 140px; + --col-adet: 70px; + --col-fiyat: 70px; + --col-pb: 70px; + --col-tutar: 70px; + --col-termin: 142px; /* 🔹 termin tarihi kolon genişliği */ + + /* Beden blok ölçüleri */ + --grp-title-w: 90px; + --grp-title-gap: 4px; + --beden-w: 44px; + --beden-h: 28px; + --beden-count: 16; + + /* Tema renkleri */ + --baggi-gold: #c9a227; + --baggi-gold-pale: #fff9e6; + --baggi-gold-light: #fff7d2; + --baggi-cream: #fffef9; + --baggi-gray-border: #bbb; +} + +*, *::before, *::after { box-sizing: border-box; } +html, body { height: 100%; margin: 0; } +body { + background: #fff; + color: #222; + font-family: Inter, "Segoe UI", Arial, sans-serif; + font-size: 14px; + line-height: 1.4; +} +#q-app, .q-page-container { margin: 0; padding: 0; } +.q-layout__page { top: 0 !important; } +/* =========================================================== + 2️⃣ PAGE STRUCTURE & SCROLL + =========================================================== */ +.order-page { + display: flex; + flex-direction: column; + height: calc(100vh - var(--header-h)); + overflow-y: auto; + overflow-x: hidden; + background: #fff; +} + +.body--drawer-left-open .q-page-container { + margin-left: var(--drawer-w); + width: calc(100% - var(--drawer-w)); +} +.body--drawer-left-closed .q-page-container { + margin-left: 0; width: 100%; +} + +/* 🔸 Yatay scroll sadece grid alanında */ +.order-scroll-x { + flex: 1; + overflow-x: auto; + overflow-y: visible; + background: #fff; +} + +/* 🔸 Scrollbar stili */ +.order-page::-webkit-scrollbar, +.order-scroll-x::-webkit-scrollbar { + height: 8px; width: 8px; +} +.order-page::-webkit-scrollbar-thumb, +.order-scroll-x::-webkit-scrollbar-thumb { + background: #c0a75e; + border-radius: 4px; +} +.order-page::-webkit-scrollbar-track, +.order-scroll-x::-webkit-scrollbar-track { + background: #f9f5e6; +} +/* =========================================================== + 3️⃣ STICKY STACK (HEADER + TOOLBARS) + =========================================================== */ +.q-header { + position: sticky; + top: 0; + z-index: 1000; + box-shadow: 0 1px 2px rgba(0,0,0,0.08); +} + +.sticky-stack { + position: sticky; + top: var(--header-h); + margin-top: 0 !important; + z-index: 950; + display: flex; + flex-direction: column; + background: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,0.05); +} + +/* 🔹 Filtre bar */ +.filter-bar { + background: #fafafa; + border-bottom: 1px solid #ddd; + padding: 12px 24px; + margin-top:0 !important; +} + +/* 🔹 Save toolbar */ +.save-toolbar { + background: var(--baggi-gold-pale); + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + padding: 10px 16px; + display: flex; + justify-content: space-between; + align-items: center; + z-index: 940; +} +.save-toolbar .label { font-weight: 700; color: #6a5314; } +.save-toolbar .value { font-weight: 700; color: #000; } +.save-toolbar .q-btn { + font-weight: 600; + border-radius: 6px; + text-transform: none; +} +/* =========================================================== + 4️⃣ GRID HEADER (ANA BAŞLIK BLOKU) + =========================================================== */ +.order-grid-header { + position: sticky; + top: calc(var(--header-h) + var(--filter-h) + var(--save-h)); + z-index: 700; + display: grid; + grid-auto-flow: column; + grid-template-columns: + var(--col-model) + var(--col-renk) + var(--col-ana) + var(--col-alt) + var(--col-aciklama) + calc(var(--grp-title-w) + var(--grp-title-gap) + (var(--beden-w)*var(--beden-count))) + var(--col-adet) + var(--col-fiyat) + var(--col-pb) + var(--col-tutar) + var(--col-termin); + background: var(--baggi-cream); + border-bottom: 2px solid var(--baggi-gray-border); + box-shadow: 0 2px 3px rgba(0,0,0,0.05); +} + +/* Sabit kolonlar */ +.order-grid-header .col-fixed { + display: flex; + justify-content: center; + align-items: center; + writing-mode: vertical-lr; + transform: rotate(180deg); + background: var(--baggi-gold-light); + border: 1px solid #aaa; + font-weight: 700; + font-size: 12.5px; + height: var(--grid-header-h); +} + +.order-grid-header .aciklama-col { + background: #fff9c4; + border-right: 2px solid #a6a6a6; +} +/* =========================================================== + 5️⃣ BEDEN BLOKLARI & SAĞ TOPLAM + =========================================================== */ +.order-grid-header .beden-block { + display: flex; + flex-direction: column; + height: var(--grid-header-h); + background: #fff; + border: 1px solid #ccc; +} + +.order-grid-header .grp-row { + display: flex; + align-items: center; + height: var(--beden-h); +} + +.order-grid-header .grp-title { + width: var(--grp-title-w); + text-align: right; + font-weight: 700; + font-size: 12px; + padding-right: 4px; +} + +.order-grid-header .grp-body { + display: grid; + grid-auto-flow: column; + grid-auto-columns: var(--beden-w); +} +.order-grid-header .grp-cell.hdr { + width: var(--beden-w); + height: var(--beden-h); + border: 1px solid #bbb; + font-size: 11.5px; + font-weight: 600; + display: flex; + align-items: center; + justify-content: center; +} + +.order-grid-header .total-row { + display: flex; + align-items: stretch; + justify-content: space-between; + background: #fff59d; +} +.order-grid-header .total-cell { + width: var(--col-adet); + display: flex; + justify-content: center; + align-items: center; + writing-mode: vertical-lr; + transform: rotate(180deg); + border-right: 1px solid #bbb; + background: var(--baggi-gold-pale); + font-weight: 700; + font-size: 12px; +} +/* =========================================================== + 6️⃣ SUB-HEADER (ÜRÜN GRUBU BAR) — TAM HİZALANMIŞ + =========================================================== */ + .order-sub-header { + padding-right: 0 !important; /* 🔹 Ekstra sağ boşluğu kaldır */ + margin-right: 0 !important; +} +.order-sub-header { + position: sticky; + top: calc( + var(--header-h) + + var(--filter-h) + + var(--save-h) + + var(--grid-header-h) + ); + z-index: 650; + + /* 🔹 Header ile birebir grid düzeni */ + display: grid; + grid-auto-flow: column; + grid-template-columns: + var(--col-model) + var(--col-renk) + var(--col-ana) + var(--col-alt) + var(--col-aciklama) + calc(var(--grp-title-w) + var(--grp-title-gap) + (var(--beden-w) * var(--beden-count))) + var(--col-adet) + var(--col-fiyat) + var(--col-pb) + var(--col-tutar) + var(--col-termin); + + align-items: center; + justify-items: stretch; + height: var(--sub-header-h); + min-height: var(--sub-header-h); + + /* 🔹 Görsel */ + background: linear-gradient(90deg, #fffbe9 0%, #fff4c4 50%, #fff1b0 100%); + border-top: 1px solid #d6c06a; + border-bottom: 1px solid #d6c06a; + + /* 🔹 Hatalı hizalamaları engelle */ + box-sizing: border-box; + overflow: hidden; + padding: 0 !important; + margin: 0 !important; + padding-right: 0 !important; /* ✅ sağ taşmayı önler */ +} + +/* 🔹 Genişlik eşitleme */ +:root { + --col-termin: 142px; /* ✅ q-input genişliğiyle birebir */ +} + +/* 🔹 Sub-header hover efekti */ +.order-sub-header:hover { + background: linear-gradient(90deg, #fff9cf 0%, #fff3b0 70%, #ffe88f 100%); +} + + +/* 🔹 Sol taraf (MODEL–AÇIKLAMA alanı) */ +.order-sub-header .sub-left { + grid-column: 1 / span 5; + font-weight: 800; + padding-left: 6px; + color: #2b1f05; + display: flex; + align-items: center; +} + +/* 🔹 Orta beden bloğu (header’la aynı yapı) */ +.order-sub-header .sub-center { + grid-column: 6 / 7; + display: grid; + grid-auto-flow: column; + grid-auto-columns: var(--beden-w); + justify-content: start; + align-items: center; + width: calc(var(--grp-title-w) + var(--grp-title-gap) + (var(--beden-w) * var(--beden-count))); + padding-left: var(--grp-title-w); + margin-left: var(--grp-title-gap); + height: 100%; + box-sizing: border-box; +} + +.order-sub-header .beden-cell { + width: var(--beden-w); + height: 100%; + border: 1px solid #d8c16b; + border-right: none; + background: #fffdf3; + font-size: 12px; + font-weight: 600; + display: flex; + justify-content: center; + align-items: center; + box-sizing: border-box; +} +.order-sub-header .beden-cell:last-child { + border-right: 1px solid #d8c16b; +} + +/* 🔹 Sağ taraf (adet–fiyat–pb–tutar–termin toplamları) */ +.order-sub-header .sub-right { + grid-column: 7 / -1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-end; + text-align: right; + padding-right: 6px; + font-weight: 900; + color: #3b2f09; + line-height: 1.3; + text-transform: uppercase; + font-size: 13.5px; +} + +.order-sub-header:hover { + background: linear-gradient(90deg,#fff9cf 0%,#fff3b0 70%,#ffe88f 100%); +} + +:root { + --sub-header-h: 60px; +} +/* SUB-HEADER sağ yazıyı 3 beden kolonu sola kaydır */ +.order-sub-header .sub-right { + transform: translateX(calc(-1 * var(--beden-w) * 4)); +} + +/* Taşmayı engelle (ihtiyaten) */ +.order-sub-header { + overflow: hidden; +} + +/* =========================================================== + 7️⃣ GRID BODY & SATIRLAR — TAM HİZALANMIŞ + =========================================================== */ +.order-grid-body { + position: relative; + background: #fff; + margin-top: 0 !important; + padding-top: 0; + z-index: 100; +} + +.summary-row { + display: grid; + grid-template-columns: + var(--col-model) + var(--col-renk) + var(--col-ana) + var(--col-alt) + var(--col-aciklama) + calc(var(--grp-title-w) + var(--grp-title-gap) + (var(--beden-w) * var(--beden-count))) + var(--col-adet) + var(--col-fiyat) + var(--col-pb) + var(--col-tutar) + var(--col-termin);} + +.summary-row:hover { + background: #fffce0; +} +.summary-row.is-editing { + background: #fff3cd; + outline: 2px solid #caa83f; +} + +.summary-row .cell { + display: flex; + align-items: center; + justify-content: center; + height: var(--beden-h); + padding: 4px 6px; + font-size: 13px; + color: #222; + box-sizing: border-box; +} + +.summary-row:nth-child(odd) { background: #fffef9; } + +/* 🔹 Beden blok hizalaması */ +.summary-row .grp-area { + display: flex; + flex-direction: column; + justify-content: center; + transform: translateX(calc(var(--grp-title-w) - var(--beden-w))); +} +.summary-row .grp-row { + display: grid; + grid-auto-flow: column; + grid-auto-columns: var(--beden-w); +} +.summary-row .grp-row .cell.beden { + width: var(--beden-w); + height: var(--beden-h); + border: 1px solid #ddd; + font-size: 12px; + display: flex; + align-items: center; + justify-content: center; +} +.cell.beden.ghost { + opacity: 0; + pointer-events: none; + border: 1px solid transparent !important; +} + +/* 🔹 Sağ kolonlar */ +.summary-row .cell.adet, +.summary-row .cell.fiyat, +.summary-row .cell.pb, +.summary-row .cell.tutar, +.summary-row .cell.termin { + font-weight: 600; + color: #000; + border-left: none !important; + height: 100%; +} + +.summary-row .cell.tutar { + text-align: right; + justify-content: flex-end; + padding-right: 8px; + border-right: none !important; +} + +.summary-row .cell.termin { + background: #fffef9; + justify-content: center; + align-items: center; + min-width: var(--col-termin); +} +.summary-row .cell.termin .q-input { + width: 100%; + max-width: 142px !important; + box-sizing: border-box; +} +.summary-row .cell.termin input { + text-align: center; + font-size: 13px; +} + +/* =========================================================== + 9️⃣ ORDER EDITOR (ALT FORM) + =========================================================== */ +.editor { + position: relative; + z-index: 50; + background: #fffef9; + border-top: 1px solid #ddd; + margin-top: 24px; + padding: 16px; +} +.editor::before { + content: ""; + display: block; + height: 4px; + background: linear-gradient(to right,#c9a227,#e5d28b,#fff7d2); + margin-bottom: 12px; + border-radius: 2px; +} +.editor .q-btn:hover { background: #d2b04d; } +.editor .q-input, +.editor .q-select { margin-bottom: 8px; font-size: 14px; } +.cell.termin .termin-label { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + font-weight: 600; + font-size: 13px; + color: #222; + background: #fffef9; + border-left: 1px solid #ccc; + box-sizing: border-box; +} + +/* =========================================================== + 🔟 RESPONSIVE + MİNÖR DÜZEN + =========================================================== */ +@media (max-width: 1024px) { + :root { --beden-w: 40px; --col-aciklama: 120px; } + .order-grid-header .col-fixed { font-size: 11px; } + .order-sub-header { font-size: 12.5px; } +} +@media (max-width: 768px) { + :root { + --beden-w: 36px; + --col-model: 70px; + --col-renk: 60px; + --col-aciklama: 100px; + } + .order-page { font-size: 13px; } + .order-grid-header .total-cell { font-size: 10.5px; } +} + +.summary-row .cell { + display: flex; + justify-content: center; + align-items: center; + padding: 4px 6px; + height: auto; + text-align: center; + white-space: normal; + word-wrap: break-word; +} + +.summary-row .grp-area, +.summary-row .grp-row, +.summary-row .grp-row .cell.beden { + align-items: center; + height: 100%; +} +.summary-row .cell.aciklama { + grid-column: 5 / 6 !important; /* sadece 5. kolon */ + position: relative !important; + width: calc(var(--col-aciklama) + 92px) !important; /* 🔹 74px genişletme */ + margin-right: -92px !important; /* 🔹 bedenle tam hizalanır */ + white-space: normal !important; + word-break: break-word !important; + overflow-wrap: break-word !important; + line-height: 1.4 !important; + padding: 6px 12px !important; + font-size: 13px !important; + text-align: left !important; + display: flex !important; + flex-direction: column !important; + align-items: flex-start !important; + justify-content: flex-start !important; + min-height: 36px !important; + background: #fff !important; + box-sizing: border-box !important; + border-right: 1px solid #ccc !important; + z-index: 10 !important; +} +/* 🧩 Grid çizgi kontrastı güçlendirme */ +.summary-row .cell, +.order-grid-header .col-fixed, +.summary-row .grp-row .cell.beden { + border-color: #bbb !important; /* 🔹 daha belirgin çizgi */ +} + +.summary-row .cell:not(:last-child) { + border-right: 1px solid #bdbdbd !important; +} +/* =========================================================== + 🧱 ALT GRID ÇİZGİLERİ – TÜM SATIRLAR İÇİN + =========================================================== */ +.summary-row { + border-bottom: 1px solid #ccc; /* 🔹 satır alt çizgisi */ +} + +.summary-row:last-child { + border-bottom: 2px solid #b7a33a; /* 🔹 son satırda Baggi gold tonu */ +} + +/* 🔹 Hücrelerin alt çizgisi (beden dahil) */ +.summary-row .cell, +.summary-row .grp-row .cell.beden { + border-bottom: 1px solid #ddd !important; +} + +/* 🔹 Hover olduğunda grid çizgileri kaybolmasın */ +.summary-row:hover .cell, +.summary-row:hover .grp-row .cell.beden { + border-bottom: 1px solid #ccc !important; +} +.summary-row:hover { + background: #fffce0; +} + +.summary-row.is-editing { + background: #fff3cd; + outline: 2px solid #caa83f; + z-index: 2; +} + +.editor .q-btn:hover { + background: #d2b04d; + color: #fff; +} + +/* 🔹 Hover olduğunda grid çizgileri kaybolmasın */ +.summary-row:hover .cell, +.summary-row:hover .grp-row .cell.beden { + border-bottom: 1px solid #ccc !important; +} + +/* =========================================================== + 🎨 STOK RENKLERİ (LOW–MID–HIGH) + =========================================================== */ +.stok-red { + color: #e53935; /* 🔴 Kırmızı */ + font-weight: 600; +} + +.stok-yellow { + color: #f9a825; /* 🟡 Sarı */ + font-weight: 600; +} + +.stok-green { + color: #43a047; /* 🟢 Yeşil */ + font-weight: 600; +} +.q-banner.rounded-borders { + border-radius: 8px; +} +.order-gateway { + background: linear-gradient(145deg, #fff 0%, #fafafa 100%); + height: 100%; +} + +.order-btn { + font-size: 1.2rem; + padding: 20px 40px; + border-radius: 12px; + min-width: 280px; + transition: all 0.2s ease; +} +.order-btn:hover { + transform: translateY(-3px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} +/* =========================================================== + 🧭 DRAWER AÇIKKEN GRID HİZALAMA FIX + =========================================================== */ + +/* Drawer açıkken içerik kaymaması */ +.body--drawer-left-open .order-page { + width: calc(100vw - var(--drawer-w)); /* viewport'tan drawer genişliği kadar düş */ + overflow-x: hidden; /* dış overflow’u kes */ +} + +/* Scroll konteyner sadece grid içinde çalışsın */ +.order-scroll-x { + max-width: 100%; + overflow-x: auto; + overflow-y: visible; + background: #fff; + box-sizing: border-box; +} + +/* Scrollbar ve sağ boşluğu dengeler */ +.order-grid-header, +.order-sub-header, +.order-grid-body { + min-width: fit-content; + width: 100%; + box-sizing: border-box; +} +/* =========================================================== + 🧱 DRAWER AÇIKKEN TAM HİZALAMA FIX (v2) + =========================================================== */ + +/* Drawer açıkken tüm üst bloklar sağdan taşmasın */ +.body--drawer-left-open .filter-bar, +.body--drawer-left-open .save-toolbar, +.body--drawer-left-open .order-grid-header, +.body--drawer-left-open .order-sub-header, +.body--drawer-left-open .order-grid-body { + width: calc(100vw - var(--drawer-w)); /* drawer genişliği kadar daralt */ + margin-left: 0; + margin-right: 0; + overflow-x: hidden; + box-sizing: border-box; +} + +/* Drawer kapalıyken tam genişlik */ +.body--drawer-left-closed .filter-bar, +.body--drawer-left-closed .save-toolbar, +.body--drawer-left-closed .order-grid-header, +.body--drawer-left-closed .order-sub-header, +.body--drawer-left-closed .order-grid-body { + width: 100vw; +} + +/* Order grid sağ sınırı altın kenarlıkla bitir (optik kapanış) */ +.order-grid-header, +.order-sub-header, +.order-grid-body { + border-right: 2px solid var(--baggi-gold); +} +/* =========================================================== + 🎯 SAĞ ALT BOŞLUK FİNAL FIX + =========================================================== */ + +/* Drawer açıkken tüm grid konteynerleri sağdan tam sıfırla */ +.body--drawer-left-open .order-page, +.body--drawer-left-open .filter-bar, +.body--drawer-left-open .save-toolbar, +.body--drawer-left-open .order-grid-header, +.body--drawer-left-open .order-sub-header, +.body--drawer-left-open .order-grid-body { + width: calc(100vw - var(--drawer-w) - 8px); /* 🔹 scrollbar toleransı */ + padding-right: 0 !important; + margin-right: 0 !important; + overflow-x: hidden !important; +} + +/* Son altın kenarlık hizasını koru */ +.order-grid-body { + border-right: 2px solid var(--baggi-gold); +} +/* =========================================================== + 🎯 GRID SAĞ HİZALAMA (FILTER + SAVE + HEADER) + =========================================================== */ + +/* Ana scroll container referansı */ +.order-scroll-x { + display: flex; + flex-direction: column; + align-items: flex-start; /* hizalama sola */ + overflow-x: auto; + overflow-y: visible; + background: #fff; +} + +/* Filter ve Save barlar grid genişliğini takip etsin */ +.filter-bar, +.save-toolbar, +.order-grid-header, +.order-sub-header { + width: fit-content; /* içeriğe göre genişlik */ + min-width: 100%; /* minimum ekran kadar */ + box-sizing: border-box; +} + +/* Grid body’nin genişliği kadar sağ hizalama */ +.order-grid-body { + width: fit-content; + box-sizing: border-box; +} + +/* Sağ kenarda taşma veya padding olmasın */ +.filter-bar, +.save-toolbar, +.order-grid-header, +.order-sub-header, +.order-grid-body { + margin-right: 0 !important; + padding-right: 0 !important; + border-right: none !important; /* altın çizgi istemiyorsan kaldırılır */ +} + +/* Drawer açık/kapalı fark etmeden */ +.body--drawer-left-open .order-scroll-x, +.body--drawer-left-closed .order-scroll-x { + width: 100%; + overflow-x: auto; +} + +/* =============================== + ORDER LIST (ol-) — Sticky Stack + =============================== */ + +:root { + /* Quasar header yüksekliği */ + --ol-header-h: 56px; + /* Filter bar yüksekliği (px) — inputlar tek satırsa 56 idealdir */ + --ol-filter-h: 96px; +} + +/* q-page tek scroller: header altından başlar */ +.ol-page { + height: calc(100vh - var(--ol-header-h)); + overflow: auto; /* 🔑 tek scroll container */ + background: #fff; + display: flex; + flex-direction: column; +} + +/* Filter bar: q-header’ın altında sticky */ +.ol-filter-bar { + position: sticky; + top: 0; /* 🔑 .ol-page scroller’ında en üst */ + z-index: 600; + background: #fff; + border-bottom: 1px solid #ddd; + padding: 10px 16px; + box-shadow: 0 1px 2px rgba(0,0,0,0.06); + min-height: var(--ol-filter-h); + display: flex; + align-items: center; +} + +/* QTable: sticky thead, zebra aktif ve çakışma yok */ +.ol-table .q-table__middle { + overflow: visible !important; /* sticky thead için güvenli */ + max-height: none !important; +} + +/* thead sabitleme: filter bar’ın ALTINA oturur */ +.ol-table thead th { + position: sticky; + top: var(--ol-filter-h); /* 🔑 filter yüksekliği kadar boşluk */ + z-index: 500; + background: #fff; + box-shadow: 0 2px 4px rgba(0,0,0,0.08); + font-weight: 700; +} + +/* Zebra */ +.ol-table .q-table__body .q-tr:nth-child(odd) { + background-color: #f7f7f7 !important; +} +.ol-table .q-table__body .q-tr:nth-child(even) { + background-color: #ffffff !important; +} +.ol-table .q-table__body .q-tr:hover { + background-color: #fff7d1 !important; + transition: background-color .15s ease; +} + +/* Hücreler */ +.ol-table .q-td { + font-size: .9rem; + line-height: 1.3; + padding: 6px 8px !important; +} + +/* Güvenli z-index hiyerarşisi */ +.q-header { z-index: 1000 !important; } /* header en üstte */ +.q-drawer { z-index: 950 !important; } /* drawer header’ın altında */ + +/* Mobile */ +@media (max-width: 768px) { + :root { --ol-filter-h: 64px; } /* input kırılıyorsa biraz artır */ + .ol-filter-bar { padding: 8px 12px; } +} +/* =========================================================== + 🟡 ORDERLIST ZEBRA FIX (v3) + =========================================================== */ + +/* Her iki tr katmanını da hedefliyoruz (Quasar q-tr + native tr) */ +.ol-table tbody tr:nth-child(odd), +.ol-table .q-table__body .q-tr:nth-child(odd) { + background-color: #faf8ef !important; /* açık krem tonu */ +} + +.ol-table tbody tr:nth-child(even), +.ol-table .q-table__body .q-tr:nth-child(even) { + background-color: #ffffff !important; +} + +/* Hover tonu: hafif Baggi gold dokunuşu */ +.ol-table tbody tr:hover, +.ol-table .q-table__body .q-tr:hover { + background-color: #fff4cc !important; + transition: background-color 0.2s ease; +} diff --git a/ui/src/stores/deneme3 b/ui/src/stores/deneme3 new file mode 100644 index 0000000..84a44eb --- /dev/null +++ b/ui/src/stores/deneme3 @@ -0,0 +1,653 @@ +// src/stores/orderentryStore.js +import { defineStore } from 'pinia' +import axios from 'axios' +import qs from 'qs' +import { useAuthStore } from 'src/stores/authStore' +import dayjs from 'src/boot/dayjs' +import { ref, watch } from 'vue' + +/* ========================================================== + Reaktif shared referanslar (bazı UI yardımcıları) +========================================================== */ +const stockMap = ref({}) // { "48": 12, "50": 7, ... } +const bedenStock = ref([]) // [{beden:'48', stok:12}, ...] +const sizeCache = ref({}) // beden/stok cache (component tarafı çağırıyor) + +/* ========================================================== + STORE +========================================================== */ +export const useOrderentryStore = defineStore('orderentry', { + state: () => ({ + /* 🔹 Ana durumlar */ + orders: [], // grid kaynak array’i (summaryRows ile senkron) + loading: false, + selected: null, // UI’de seçili satır + error: null, + + /* 🔹 Cari */ + customers: [], + selectedCustomer: null, + + /* 🔹 Ürün zinciri */ + products: [], + colors: [], + secondColors: [], + inventory: [], + + selectedProduct: null, + selectedColor: null, + selectedColor2: null, + + /* 🔹 Transaction & Storage */ + activeTransactionId: null, + persistKey: 'bss_orderentry_data', // ♻️ kalıcı depolama key’i + lastSnapshotKey: 'bss_orderentry_snapshot', // son-kaydedilen-sipariş + + /* 🔹 Düzenleme durumu */ + editingIndex: -1, + currentOrderId: null, // edit modunda header ID + header: {}, // backend header modeli + mode: 'new' // 'new' | 'edit' + }), + + getters: { + /* 🔹 Toplam adet */ + totalQty(state) { + return state.orders.reduce((sum, r) => sum + (Number(r.adet) || 0), 0) + }, + /* 🔹 Toplam tutar (string fix2) */ + totalAmount(state) { + const n = state.orders.reduce((s, r) => s + (Number(r.tutar) || 0), 0) + return isNaN(n) ? '0.00' : n.toFixed(2) + }, + /* 🔹 Müşteri bazlı gruplanmış (opsiyonel) */ + groupedByCustomer(state) { + const out = {} + for (const row of state.orders) { + const k = row.musteri || '—' + if (!out[k]) out[k] = [] + out[k].push(row) + } + return out + }, + /* 🔹 2. renk var mı? */ + hasSecondColor(state) { + return Array.isArray(state.secondColors) && state.secondColors.length > 0 + }, + /* 🔹 Envanter toplamı */ + totalInventoryQty(state) { + return state.inventory.reduce((s, r) => s + (Number(r.kullanilabilir) || 0), 0) + } + }, + actions: { + /* ========================================================== + STORAGE — Kalıcı kayıt yardımcıları + ========================================================== */ + saveToStorage() { + try { + const payload = { + orders: this.orders, + header: this.header, + currentOrderId: this.currentOrderId, + selectedCustomer: this.selectedCustomer, + activeTransactionId: this.activeTransactionId, + mode: this.mode, + savedAt: dayjs().toISOString() + } + localStorage.setItem(this.persistKey, JSON.stringify(payload)) + } catch (err) { + console.warn('⚠️ localStorage kaydı başarısız:', err) + } + }, + + /* Kayıt sonrası görüntülenecek "snapshot". + UI’yi temizlesen bile sayfa yenilenince bu snapshot geri yüklenebilir. */ + saveSnapshot(tag = 'post-submit') { + try { + const snap = { + tag, + orders: this.orders, + header: this.header, + currentOrderId: this.currentOrderId, + selectedCustomer: this.selectedCustomer, + mode: this.mode, + savedAt: dayjs().toISOString() + } + localStorage.setItem(this.lastSnapshotKey, JSON.stringify(snap)) + } catch (e) { + console.warn('⚠️ saveSnapshot hatası:', e) + } + }, + + loadFromStorage() { + try { + const raw = localStorage.getItem(this.persistKey) + if (!raw) return + const data = JSON.parse(raw) + if (Array.isArray(data.orders)) this.orders = data.orders + this.header = data.header || {} + this.currentOrderId = data.currentOrderId || null + this.selectedCustomer = data.selectedCustomer || null + this.activeTransactionId = data.activeTransactionId || null + this.mode = data.mode || 'new' + console.log(`♻️ Storage yüklendi • mode:${this.mode} • rows:${this.orders.length}`) + } catch (err) { + console.warn('⚠️ localStorage okuma hatası:', err) + } + }, + + loadSnapshot() { + try { + const raw = localStorage.getItem(this.lastSnapshotKey) + if (!raw) return null + return JSON.parse(raw) + } catch (e) { + console.warn('⚠️ loadSnapshot hatası:', e) + return null + } + }, + + clearStorage() { + localStorage.removeItem(this.persistKey) + // snapshot’ı silmiyoruz → kullanıcı isterse elle siler + }, + /* ========================================================== + TRANSACTION STATE + ========================================================== */ + setTransaction(id) { + this.activeTransactionId = id + this.saveToStorage() + }, + + async initTransaction() { + if (this.activeTransactionId) { + console.log('🔹 Aktif transaction:', this.activeTransactionId) + return this.activeTransactionId + } + try { + const dummyId = Math.floor(100000 + Math.random() * 900000) + this.activeTransactionId = dummyId + this.saveToStorage() + console.log('🧩 Dummy Transaction başlatıldı:', dummyId) + return dummyId + } catch (err) { + console.error('❌ Dummy transaction başlatılamadı:', err) + return null + } + }, + + clearTransaction() { + this.activeTransactionId = null + this.saveToStorage() + }, + + /* Orders’ı otomatik kaydeden watcher (component’ten çağrılır) */ + watchOrders() { + watch( + () => this.orders, + () => { + // her değişimde full storage yaz + this.saveToStorage() + }, + { deep: true } + ) + }, + /* ========================================================== + CRUD — Frontend grid’i ile senkron temel aksiyonlar + ========================================================== */ + + addRow(row) { + if (!row) return + this.orders.push({ ...row }) + this.saveToStorage() + }, + + updateRow(idOrIndex, patch) { + if (idOrIndex == null) return + let idx = -1 + if (typeof idOrIndex === 'number') { + idx = idOrIndex + } else { + // id ile bul + idx = this.orders.findIndex(r => r.id === idOrIndex) + } + if (idx >= 0 && this.orders[idx]) { + this.orders[idx] = { ...this.orders[idx], ...patch } + this.saveToStorage() + } + }, + + removeRow(idOrIndex) { + let idx = -1 + if (typeof idOrIndex === 'number') { + idx = idOrIndex + } else { + idx = this.orders.findIndex(r => r.id === idOrIndex) + } + if (idx >= 0) { + this.orders.splice(idx, 1) + this.saveToStorage() + } + }, + /* ========================================================== + PRICE / LIMIT — Minimum fiyat sorgusu (model + PB) + Beklenen response: { price, priceTRY, rateToTRY } + ========================================================== */ + async fetchMinPrice(modelCode, pb) { + if (!modelCode || !pb) return null + try { + const baseURL = 'http://localhost:8080' + const res = await axios.get(`${baseURL}/api/min-price`, { + params: { code: modelCode, pb } + }) + const d = res?.data || null + if (!d) return null + + // normalize + return { + price: Number(d.price ?? d.Price ?? 0), + priceTRY: Number(d.priceTRY ?? d.PriceTRY ?? d.price_try ?? 0), + rateToTRY: Number(d.rateToTRY ?? d.RateToTRY ?? d.rate ?? 1) + } + } catch (e) { + console.warn('⚠️ fetchMinPrice hata:', e) + return null + } + }, + /* ========================================================== + LOAD (EDIT MODE) — Sunucudan Siparişi Açma + ========================================================== */ + async openById(id) { + if (!id) return + this.loading = true + try { + const auth = useAuthStore() + const res = await axios.get(`http://localhost:8080/api/order/get/${id}`, { + headers: { Authorization: `Bearer ${auth.token}` } + }) + const data = res.data || {} + + // 🔹 sql.Null* flatten helper + const flat = (v) => { + if (v === null || v === undefined) return null + if (typeof v === 'object' && 'Valid' in v) { + return v.Valid + ? v.String ?? v.Float64 ?? v.Int32 ?? v.Time ?? null + : null + } + return v + } + + /* ============================================================ + 🧾 HEADER MAPPING (73 kolon) + ============================================================ */ + const h = data.header || {} + const header = { + // Görünen alanlar + OrderHeaderID: flat(h.OrderHeaderID) || '', + OrderNumber: flat(h.OrderNumber) || '', + OrderDate: flat(h.OrderDate) + ? String(flat(h.OrderDate)).substring(0, 10) + : '', + AverageDueDate: flat(h.AverageDueDate) + ? String(flat(h.AverageDueDate)).substring(0, 10) + : '', + Description: flat(h.Description) || '', + CurrAccCode: flat(h.CurrAccCode) || '', + DocCurrencyCode: flat(h.DocCurrencyCode) || 'TRY', + + // Arka plan alanlar (backend roundtrip) + OrderTypeCode: flat(h.OrderTypeCode) || 1, + ProcessCode: flat(h.ProcessCode) || 'WS', + IsCancelOrder: flat(h.IsCancelOrder) || 0, + OrderTime: flat(h.OrderTime) || '', + DocumentNumber: flat(h.DocumentNumber) || '', + PaymentTerm: flat(h.PaymentTerm) || '', + InternalDescription: flat(h.InternalDescription) || '', + CurrAccTypeCode: flat(h.CurrAccTypeCode) || '', + SubCurrAccID: flat(h.SubCurrAccID) || '', + ContactID: flat(h.ContactID) || '', + ShipmentMethodCode: flat(h.ShipmentMethodCode) || '', + ShippingPostalAddressID: flat(h.ShippingPostalAddressID) || '', + BillingPostalAddressID: flat(h.BillingPostalAddressID) || '', + GuarantorContactID: flat(h.GuarantorContactID) || '', + GuarantorContactID2: flat(h.GuarantorContactID2) || '', + RoundsmanCode: flat(h.RoundsmanCode) || '', + DeliveryCompanyCode: flat(h.DeliveryCompanyCode) || '', + TaxTypeCode: flat(h.TaxTypeCode) || '', + WithHoldingTaxTypeCode: flat(h.WithHoldingTaxTypeCode) || '', + DOVCode: flat(h.DOVCode) || '', + TaxExemptionCode: flat(h.TaxExemptionCode) || 0, + CompanyCode: flat(h.CompanyCode) || 1, + OfficeCode: flat(h.OfficeCode) || '101', + StoreTypeCode: flat(h.StoreTypeCode) || 5, + StoreCode: flat(h.StoreCode) || 0, + POSTerminalID: flat(h.POSTerminalID) || 0, + WarehouseCode: flat(h.WarehouseCode) || '1-0-12', + ToWarehouseCode: flat(h.ToWarehouseCode) || '', + OrdererCompanyCode: flat(h.OrdererCompanyCode) || 1, + OrdererOfficeCode: flat(h.OrdererOfficeCode) || '101', + OrdererStoreCode: flat(h.OrdererStoreCode) || '', + GLTypeCode: flat(h.GLTypeCode) || '', + LocalCurrencyCode: flat(h.LocalCurrencyCode) || 'TRY', + ExchangeRate: flat(h.ExchangeRate) || 1, + DiscountReasonCode: flat(h.DiscountReasonCode) || 0, + SurplusOrderQtyToleranceRate: flat(h.SurplusOrderQtyToleranceRate) || 0, + IncotermCode1: flat(h.IncotermCode1) || '', + IncotermCode2: flat(h.IncotermCode2) || '', + PaymentMethodCode: flat(h.PaymentMethodCode) || '', + IsInclutedVat: flat(h.IsInclutedVat) || 0, + IsCreditSale: flat(h.IsCreditSale) || 1, + IsCreditableConfirmed: flat(h.IsCreditableConfirmed) || 1, + CreditableConfirmedUser: flat(h.CreditableConfirmedUser) || '', + CreditableConfirmedDate: flat(h.CreditableConfirmedDate) || '', + ApplicationCode: flat(h.ApplicationCode) || 'Order', + ApplicationID: flat(h.ApplicationID) || '', + CreatedUserName: flat(h.CreatedUserName) || '', + CreatedDate: flat(h.CreatedDate) || '', + LastUpdatedUserName: flat(h.LastUpdatedUserName) || '', + LastUpdatedDate: flat(h.LastUpdatedDate) || '', + IsProposalBased: flat(h.IsProposalBased) || 0 + } + + this.header = header + this.currentOrderId = header.OrderHeaderID || id + this.mode = 'edit' + + // 🔹 Cari görünümü (QSelect) + this.selectedCustomer = { + value: header.CurrAccCode || '', + label: `${header.CurrAccCode || ''} - ${flat(h.CurrAccDescription) || ''}` + } + + /* ============================================================ + 📦 LINES MAPPING (57 kolon) + ============================================================ */ + this.orders = (data.lines || []).map((l, idx) => ({ + // Görünen alanlar + id: flat(l.OrderLineID) || `row-${idx + 1}`, + model: flat(l.ItemCode), + renk: flat(l.ColorCode), + renk2: flat(l.ItemDim2Code), + fiyat: Number(flat(l.Price) || 0), + pb: flat(l.DocCurrencyCode) || flat(l.PriceCurrencyCode) || 'USD', + adet: Number(flat(l.Qty1) || 0), + tutar: Number(flat(l.Price) || 0) * Number(flat(l.Qty1) || 0), + aciklama: flat(l.LineDescription) || '', + terminTarihi: flat(l.DeliveryDate) + ? String(flat(l.DeliveryDate)).substring(0, 10) + : '', + urunAnaGrubu: flat(l.ProductGroup) || '', + urunAltGrubu: flat(l.ProductSubGroup) || '', + grpKey: l.grpKey || 'tak', + bedenMap: l.BedenMap || {}, + + // Backend roundtrip alanları + SortOrder: flat(l.SortOrder) || 0, + ItemTypeCode: flat(l.ItemTypeCode) || 1, + ItemDim1Code: flat(l.ItemDim1Code) || '', + ItemDim3Code: flat(l.ItemDim3Code) || '', + Qty2: flat(l.Qty2) || 0, + CancelQty1: flat(l.CancelQty1) || 0, + CancelQty2: flat(l.CancelQty2) || 0, + CancelDate: flat(l.CancelDate) || null, + OrderCancelReasonCode: flat(l.OrderCancelReasonCode) || '', + ClosedDate: flat(l.ClosedDate) || null, + IsClosed: flat(l.IsClosed) || false, + VatRate: flat(l.VatRate) || 10, + PCTRate: flat(l.PCTRate) || 0, + PriceCurrencyCode: flat(l.PriceCurrencyCode) || 'TRY', + PriceExchangeRate: flat(l.PriceExchangeRate) || header.ExchangeRate || 1, + CreatedUserName: flat(l.CreatedUserName) || '', + CreatedDate: flat(l.CreatedDate) || '', + LastUpdatedUserName: flat(l.LastUpdatedUserName) || '', + LastUpdatedDate: flat(l.LastUpdatedDate) || '', + SurplusOrderQtyToleranceRate: + flat(l.SurplusOrderQtyToleranceRate) || 0 + })) + + /* ============================================================ + 💾 LOCAL STORAGE + ============================================================ */ + localStorage.setItem( + `bssapp:order:last:${id}`, + JSON.stringify({ header, lines: this.orders }) + ) + + console.log(`📦 Sipariş (${id}) yüklendi • rows:${this.orders.length}`) + } catch (err) { + console.error('❌ openById hatası:', err) + this.error = err.message + } finally { + this.loading = false + } +} +, + /* ========================================================== + NEW TEMPLATE — Yeni sipariş başlatma + ========================================================== */ + newOrderTemplate() { + const today = dayjs().format('YYYY-MM-DD') + const due = dayjs().add(30, 'day').format('YYYY-MM-DD') + + this.header = { + OrderHeaderID: '', + OrderTypeCode: 1, + ProcessCode: 'WS', + OrderNumber: '', + OrderDate: today, + AverageDueDate: due, + Description: '', + CurrAccCode: '', + CurrAccDescription: '', + DocCurrencyCode: 'USD', + LocalCurrencyCode: 'TRY', + ExchangeRate: 1, + CompanyCode: 1, + OfficeCode: '101', + StoreTypeCode: 5, + WarehouseCode: '1-0-12', + IsCreditSale: true, + CreatedUserName: '', + CreatedDate: today, + LastUpdatedUserName: '', + LastUpdatedDate: today + } + + this.orders = [] + this.currentOrderId = null + this.activeTransactionId = null + this.selectedCustomer = null + this.mode = 'new' + this.error = null + + // Temiz bir başlangıcı storage’a yaz + this.saveToStorage() + console.log('🧾 Yeni sipariş template yüklendi.') + }, + /* ========================================================== + SUBMIT — Create/Update (SQL tablo INSERT/UPDATE) + ➜ Kayıt sonrası: transaction kapanır AMA snapshot tutulur. + ========================================================== */ + async submitAll() { + const auth = useAuthStore() + const baseURL = 'http://localhost:8080' + + const toNullable = (v, type = 'string') => { + if (v === null || v === undefined || v === '') { + if (type === 'number') return { Float64: 0, Valid: false } + if (type === 'time') return { Time: null, Valid: false } + return { String: '', Valid: false } + } + if (type === 'number') return { Float64: Number(v), Valid: true } + if (type === 'time') return { Time: v, Valid: true } + return { String: String(v), Valid: true } + } + + try { + this.loading = true + + // Header payload (backend’in beklediği Null* formatıyla) + const h = this.header || {} + const headerPayload = { + OrderHeaderID: h.OrderHeaderID || this.currentOrderId || '', + OrderTypeCode: toNullable(1, 'number'), + ProcessCode: toNullable('WS'), + OrderNumber: toNullable(h.OrderNumber), + OrderDate: toNullable(h.OrderDate || dayjs().format('YYYY-MM-DD'), 'time'), + AverageDueDate: toNullable(h.AverageDueDate || dayjs().add(30, 'day').format('YYYY-MM-DD'), 'time'), + Description: toNullable(h.Description || ''), + CurrAccCode: toNullable(h.CurrAccCode || this.selectedCustomer?.value || ''), + CurrAccDescription: toNullable(h.CurrAccDescription || this.selectedCustomer?.label || ''), + DocCurrencyCode: toNullable(h.DocCurrencyCode || 'USD'), + LocalCurrencyCode: toNullable(h.LocalCurrencyCode || 'TRY'), + ExchangeRate: toNullable(h.ExchangeRate || 1, 'number'), + CompanyCode: toNullable(1, 'number'), + OfficeCode: toNullable('101'), + StoreTypeCode: toNullable(5, 'number'), + WarehouseCode: toNullable(h.WarehouseCode || '1-0-12'), + IsCreditSale: true, + CreatedUserName: toNullable(auth.user?.Username || 'admin'), + CreatedDate: toNullable(h.CreatedDate || dayjs().format('YYYY-MM-DD'), 'time'), + LastUpdatedUserName: toNullable(auth.user?.Username || 'admin'), + LastUpdatedDate: toNullable(dayjs().format('YYYY-MM-DD HH:mm:ss'), 'time') + } + + // Lines payload + const linesPayload = this.orders.map((l, idx) => ({ + OrderLineID: l.id || '', + SortOrder: idx + 1, + ItemTypeCode: toNullable(1, 'number'), + ItemCode: toNullable(l.model), + ColorCode: toNullable(l.renk), + ItemDim1Code: toNullable(Object.keys(l.bedenMap?.[l.grpKey] || {})[0] || ''), + ItemDim2Code: toNullable(l.renk2), + Qty1: toNullable(Number(l.adet || 0), 'number'), + Price: toNullable(Number(l.fiyat || 0), 'number'), + DocCurrencyCode: toNullable(l.pb || 'USD'), + VatRate: toNullable(10, 'number'), + PCTRate: toNullable(0, 'number'), + DeliveryDate: toNullable(l.terminTarihi || null, 'time'), + LineDescription: toNullable(l.aciklama || ''), + IsClosed: false, + CreatedUserName: toNullable(auth.user?.Username || 'admin'), + CreatedDate: toNullable(dayjs().format('YYYY-MM-DD HH:mm:ss'), 'time'), + LastUpdatedUserName: toNullable(auth.user?.Username || 'admin'), + LastUpdatedDate: toNullable(dayjs().format('YYYY-MM-DD HH:mm:ss'), 'time') + })) + + // Final payload + const payload = { + header: headerPayload, + lines: linesPayload, + user: auth.user?.Username || 'admin' + } + + let res + if (this.currentOrderId) { + // UPDATE + res = await axios.post(`${baseURL}/api/order/update`, payload, { + headers: { Authorization: `Bearer ${auth.token}` } + }) + console.log('✅ UPDATE ok:', res.data) + } else { + // CREATE + res = await axios.post(`${baseURL}/api/order/create`, payload, { + headers: { Authorization: `Bearer ${auth.token}` } + }) + console.log('✅ CREATE ok:', res.data) + if (res.data?.orderID) { + this.currentOrderId = res.data.orderID + this.header.OrderHeaderID = res.data.orderID + this.mode = 'edit' + } + } + + // 🟩 Kayıt sonrası: snapshot’ı al ve storage’a da yaz + this.saveSnapshot('post-submit') + this.saveToStorage() + + // 🧹 Transaction’ı kapat (UI temizliği ayrı fonksiyonda) + this.clearTransaction() + this.afterSubmit({ keepLocalStorage: true }) // 👈 önemli + + } catch (err) { + console.error('❌ submitAll hatası:', err) + this.error = err.message + throw err + } finally { + this.loading = false + } + }, + /* ========================================================== + AFTER SUBMIT — UI temizliği (snapshot kalır!) + keepLocalStorage=true → persistKey SİLİNMEZ + ========================================================== */ + afterSubmit(opts = { keepLocalStorage: true }) { + try { + // Snapshot zaten kaydedildi; istenirse persistKey’i bırak + if (!opts?.keepLocalStorage) { + localStorage.removeItem(this.persistKey) + } else { + // son hal zaten saveToStorage ile yazıldı — dokunma + } + + // UI temizliği (hafızada formu boşaltalım) + // Ama edit’e dönmek istersen, snapshot/loadFromStorage ile geri getirirsin. + this.orders = [] + // header’ı hafızadan temizliyoruz ama snapshot yerinde. + this.header = {} + this.selectedCustomer = null + this.editingIndex = -1 + // currentOrderId’yi istersen koruyabilirsin; biz editte geri yüklüyoruz. + // burada null’lıyoruz: + this.currentOrderId = null + this.mode = 'new' + this.loading = false + this.error = null + + console.log('🧹 afterSubmit: UI temizlendi, snapshot storage’da.') + } catch (err) { + console.warn('⚠️ afterSubmit temizleme hatası:', err) + } + }, + + /* ========================================================== + MANUAL UPDATE — mevcut header/lines yapılarına göre + (İsteğe bağlı kullanılır) + ========================================================== */ + async updateOrder() { + if (!this.currentOrderId) { + console.warn('⚠️ currentOrderId yok, update yapılamaz.') + return + } + try { + const auth = useAuthStore() + const payload = { + header: this.header, + lines: this.orders, + username: auth.user?.Username || 'admin' + } + const res = await axios.post( + 'http://localhost:8080/api/order/update', + payload, + { headers: { Authorization: `Bearer ${auth.token}` } } + ) + console.log('✅ Güncelleme tamamlandı:', res.data) + + // kayıt sonrası snapshot + persist + this.saveSnapshot('manual-update') + this.saveToStorage() + } catch (err) { + console.error('❌ updateOrder hatası:', err) + this.error = err.message + } + } + } // actions +}) // defineStore +// (opsiyonel) Bu referanslara component tarafından erişmek istersen: +export const sharedOrderEntryRefs = { + stockMap, + bedenStock, + sizeCache +} diff --git a/ui/src/stores/downloadstHeadStore.js b/ui/src/stores/downloadstHeadStore.js new file mode 100644 index 0000000..ad60b1f --- /dev/null +++ b/ui/src/stores/downloadstHeadStore.js @@ -0,0 +1,50 @@ +// src/stores/downloadstHeadStore.js +import { defineStore } from 'pinia' +import { download } from 'src/services/api' + +export const useDownloadstHeadStore = defineStore('downloadstHead', { + actions: { + // 📄 Statement Header PDF indir / aç + async handlestHeadDownload ( + accountCode, + startDate, + endDate, + parislemler + ) { + try { + // ✅ Params (axios paramsSerializer array=repeat destekliyor) + const params = { + accountcode: accountCode, + startdate: startDate, + enddate: endDate + } + + if (Array.isArray(parislemler) && parislemler.length > 0) { + params.parislemler = parislemler.filter( + p => p !== undefined && p !== null && p !== '' + ) + } + + // 🔥 API CALL (TOKEN + BLOB + ERROR HANDLING OTOMATİK) + const blob = await download( + '/exportstamentheaderreport-pdf', + params + ) + + const pdfUrl = window.URL.createObjectURL(blob) + window.open(pdfUrl, '_blank') + + return { ok: true, message: '📄 PDF hazırlandı' } + + } catch (err) { + console.error('❌ PDF açma hatası:', err) + return { + ok: false, + message: + err?.message || + '❌ PDF açma hatası' + } + } + } + } +}) diff --git a/ui/src/stores/downloadstpdfStore.js b/ui/src/stores/downloadstpdfStore.js new file mode 100644 index 0000000..d857edd --- /dev/null +++ b/ui/src/stores/downloadstpdfStore.js @@ -0,0 +1,51 @@ +// src/stores/downloadstpdfStore.js +import { defineStore } from 'pinia' +import { download } from 'src/services/api' + +export const useDownloadstpdfStore = defineStore('downloadstpdf', { + actions: { + /* ========================================================== + 📄 PDF İNDİR / AÇ + ========================================================== */ + async downloadPDF(accountCode, startDate, endDate, parislemler = []) { + try { + // 🔹 Query params + const params = { + accountcode: accountCode, + startdate: startDate, + enddate: endDate + } + + if (Array.isArray(parislemler) && parislemler.length > 0) { + params.parislemler = parislemler.filter( + p => p !== undefined && p !== null && p !== '' + ) + } + + // 🔥 MERKEZİ API — BLOB + const blob = await download('/export-pdf', params) + + // 🔹 Blob → URL + const pdfUrl = window.URL.createObjectURL( + new Blob([blob], { type: 'application/pdf' }) + ) + + // 🔹 Yeni sekmede aç + window.open(pdfUrl, '_blank') + + console.log('✅ PDF yeni sekmede açıldı') + return { ok: true, message: '📄 PDF hazırlandı' } + + } catch (err) { + console.error('❌ PDF açma hatası:', err) + + return { + ok: false, + message: + err?.message || + '❌ PDF alınamadı' + } + } + } + } +}) diff --git a/ui/src/stores/example-store.js b/ui/src/stores/example-store.js new file mode 100644 index 0000000..83e8390 --- /dev/null +++ b/ui/src/stores/example-store.js @@ -0,0 +1,15 @@ +import { defineStore } from 'pinia'; + +export const useCounterStore = defineStore('counter', { + state: () => ({ + counter: 0, + }), + getters: { + doubleCount: (state) => state.counter * 2, + }, + actions: { + increment() { + this.counter++; + }, + }, +}); diff --git a/ui/src/stores/index.js b/ui/src/stores/index.js new file mode 100644 index 0000000..a260a8c --- /dev/null +++ b/ui/src/stores/index.js @@ -0,0 +1,20 @@ +import { defineStore } from '#q-app/wrappers' +import { createPinia } from 'pinia' + +/* + * If not building with SSR mode, you can + * directly export the Store instantiation; + * + * The function below can be async too; either use + * async/await or return a Promise which resolves + * with the Store instance. + */ + +export default defineStore((/* { ssrContext } */) => { + const pinia = createPinia() + + // You can add Pinia plugins here + // pinia.use(SomePiniaPlugin) + + return pinia +}) diff --git a/ui/src/stores/mailTestStore.js b/ui/src/stores/mailTestStore.js new file mode 100644 index 0000000..c3e4091 --- /dev/null +++ b/ui/src/stores/mailTestStore.js @@ -0,0 +1,29 @@ +import { defineStore } from 'pinia' +import { post } from 'src/services/api' + +export const useMailTestStore = defineStore('mailTest', { + state: () => ({ + loading: false, + lastResult: null + }), + + actions: { + async sendTestMail (to) { + this.loading = true + try { + const data = await post('/test-mail', { + to + }) + + this.lastResult = data + return true + } catch (err) { + this.lastResult = err + throw err + } finally { + this.loading = false + } + } + } +}) + diff --git a/ui/src/stores/mePasswordStore.js b/ui/src/stores/mePasswordStore.js new file mode 100644 index 0000000..61bc99b --- /dev/null +++ b/ui/src/stores/mePasswordStore.js @@ -0,0 +1,38 @@ +// src/stores/mePasswordStore.js +import { defineStore } from 'pinia' +import api from 'src/services/api' + +export const useMePasswordStore = defineStore('mePassword', { + state: () => ({ + loading: false, + error: null + }), + + actions: { + async changePassword (currentPassword, newPassword) { + this.loading = true + this.error = null + + try { + // 🔐 Token interceptor ile otomatik + await api.post('/me/password', { + current_password: currentPassword, + new_password: newPassword + }) + + return true + + } catch (e) { + // 🔥 api.js normalize error + this.error = + e?.message || + 'Şifre güncellenemedi' + + throw e + + } finally { + this.loading = false + } + } + } +}) diff --git a/ui/src/stores/orderentryStore.js b/ui/src/stores/orderentryStore.js new file mode 100644 index 0000000..3019e53 --- /dev/null +++ b/ui/src/stores/orderentryStore.js @@ -0,0 +1,3340 @@ +/* =========================================================== + 📦 orderentryStore.js (v3.4 CLEAN — AUTH + LOCAL PERSIST + AUTO RESUME) +=========================================================== */ + +import { defineStore } from 'pinia' +import api from 'src/services/api' +import dayjs from 'src/boot/dayjs' +import { ref, toRaw, nextTick } from 'vue' // ✅ düzeltildi +import { useAuthStore } from 'src/stores/authStore' + +// =========================================================== +// 🔹 Shared Reactive Referanslar (Global, Reaktif Nesneler) +// =========================================================== +/* =========================================================== + 🔹 BEDEN ŞEMALARI — STORE SOURCE OF TRUTH +=========================================================== */ +// ⬆️ orderentryStore.js EN ÜSTÜNE +// =========================================================== +// 🔑 COMBO KEY CONTRACT (Frontend ↔ Backend) — v1 +// - trim + UPPER +// - dim1 boşsa " " +// - dim2 boşsa "" +// =========================================================== +const BEDEN_EMPTY = '_' + +const norm = (v) => (v == null ? '' : String(v)).trim() +const normUpper = (v) => norm(v).toUpperCase() + +export function buildComboKey(row, beden) { + const model = normUpper(row?.model || row?.ItemCode) + const renk = normUpper(row?.renk || row?.ColorCode) + const renk2 = normUpper(row?.renk2 || row?.ItemDim2Code) + const bdn = normUpper(beden) + const bedenFinal = bdn === '' ? BEDEN_EMPTY : bdn + + // 🔒 KANONİK SIRA + return `${model}||${renk}||${renk2}||${bedenFinal}` +} + + + + + + +export const BEDEN_SCHEMA = [ + { key: 'ayk', title: 'AYAKKABI', values: ['39','40','41','42','43','44','45'] }, + { key: 'yas', title: 'YAŞ', values: ['2','4','6','8','10','12','14'] }, + { key: 'pan', title: 'PANTOLON', values: ['38','40','42','44','46','48','50','52','54','56','58','60','62','64','66','68'] }, + { key: 'gom', title: 'GÖMLEK', values: ['XS','S','M','L','XL','2XL','3XL','4XL','5XL','6XL','7XL'] }, + { key: 'tak', title: 'TAKIM ELBİSE', values: ['44','46','48','50','52','54','56','58','60','62','64','66','68','70','72','74'] }, + { key: 'aksbir', title: 'AKSESUAR', values: [' ', '44', 'STD', '110CM', '115CM', '120CM', '125CM', '130CM', '135CM'] } +] + +export const schemaByKey = BEDEN_SCHEMA.reduce((m, g) => { + m[g.key] = g + return m +}, {}) + + +export const stockMap = ref({}) +export const bedenStock = ref([]) +export const sizeCache = ref({}) +// =========================================================== +// 🔹 Shared Reactive Referanslar (Global, Reaktif Nesneler) +// =========================================================== +// ======================== +// 🧰 GLOBAL DATE NORMALIZER +// ======================== + +function newGuid() { + return crypto.randomUUID() +} + + + +// 🔑 Her beden satırı için deterministik clientKey üretimi +function makeLineClientKey(row, grpKey, beden) { + const base = + row.clientRowKey || + row.clientKey || + row.id || + row._id || + row.tmpId || + `${row.model || ''}|${row.renk || ''}|${row.renk2 || ''}` + + return `${base}::${grpKey}::${beden}` +} + + + +// =========================================================== +// 🧩 Pinia Store — ORDER ENTRY STORE (REV 2025-11-03.2) +// =========================================================== +export const useOrderEntryStore = defineStore('orderentry', { + state: () => ({ + + isControlledSubmit: false, + + allowRouteLeaveOnce: false, + schemaMap: {}, + productCache: {}, + _lastSavedFingerprint: null, + + activeNewHeaderId: localStorage.getItem("bss_active_new_header") || null, + + loading: false, + selected: null, + error: null, + + customers: [], + selectedCustomer: null, + + products: [], + colors: [], + secondColors: [], + inventory: [], + + selectedProduct: null, + selectedColor: null, + selectedColor2: null, + + OrderHeaderID: null, + + // Persist config + persistKey: 'bss_orderentry_data', + lastSnapshotKey: 'bss_orderentry_snapshot', + + // Editor state + editingKey: null, + currentOrderId: null, + mode: 'new', + + // Grid state + orders: [], + header: {}, + summaryRows: [], + + lastSavedAt: null, + + // Guards + preventPersist: false, + _uiBusy: false, + _unsavedChanges: false, + }), + + getters: { + getDraftKey() { + // NEW taslak → GLOBAL ama tekil + return 'bss_orderentry_new_draft' + }, + + getEditKey() { + // EDIT → OrderHeaderID’ye bağlı + const id = this.header?.OrderHeaderID + return id ? `bss_orderentry_edit:${id}` : null + } + , + hasUnsavedChanges(state) { + try { + return ( + state._lastSavedFingerprint !== + state._persistFingerprint?.() + ) + } catch { + return false + } + }, + + getPersistKey: (state) => + state.header?.OrderHeaderID + ? `${state.persistKey}:${state.header.OrderHeaderID}` + : state.persistKey, + + getSnapshotKey: (state) => + state.header?.OrderHeaderID + ? `${state.lastSnapshotKey}:${state.header.OrderHeaderID}` + : state.lastSnapshotKey, + + totalQty: (state) => + (state.orders || []).reduce((sum, r) => sum + (Number(r?.adet) || 0), 0), + + hasAnyClosedLine(state) { + return Array.isArray(state.summaryRows) && + state.summaryRows.some(r => r?.isClosed === true) + }, + + totalAmount(state) { + if (!Array.isArray(state.summaryRows)) return 0 + return state.summaryRows.reduce( + (sum, r) => sum + Number(r?.tutar || 0), + 0 + ) + } + }, + + actions: { + + normalizeComboUI(row) { + return buildComboKey(row, BEDEN_EMPTY) + } + + , + /* =========================================================== + 🧩 initSchemaMap — BEDEN ŞEMA İNİT + - TEK SOURCE OF TRUTH: BEDEN_SCHEMA +=========================================================== */ + initSchemaMap() { + if (this.schemaMap && Object.keys(this.schemaMap).length > 0) { + return + } + + const map = {} + + for (const g of BEDEN_SCHEMA) { + map[g.key] = { + key: g.key, + title: g.title, + values: [...g.values] + } + } + + this.schemaMap = map + + console.log( + '🧩 schemaMap INIT edildi:', + Object.keys(this.schemaMap) + ) + }, + + + getRowKey(row) { + if (!row) return null + return row.OrderLineID || row.id || null + } + + + , + updateHeaderTotals() { + try { + if (!Array.isArray(this.summaryRows)) return 0 + + const total = this.summaryRows.reduce( + (sum, r) => sum + Number(r?.tutar || 0), + 0 + ) + + // Header sadece GÖSTERİM / BACKEND için + if (this.header) { + this.header.TotalAmount = Number(total.toFixed(2)) + } + + return total + } catch (err) { + console.error('❌ updateHeaderTotals hata:', err) + return 0 + } + } + + , + /* =========================================================== + 🚨 showInvalidVariantDialog — FINAL + ----------------------------------------------------------- + ✔ prItemVariant olmayan satırları listeler + ✔ Satıra tıkla → scroll + highlight + ✔ Kaydı BLOKLAYAN tek UI noktası + =========================================================== */ + async showInvalidVariantDialog($q, invalidList = []) { + if (!Array.isArray(invalidList) || invalidList.length === 0) return + + return new Promise(resolve => { + $q.dialog({ + title: '🚨 Tanımsız Ürün Kombinasyonları', + message: ` +
+ ${invalidList.map((v, i) => ` +
+
+ #${i + 1} | Item: ${v.itemCode} +
+
+ Beden: ${v.dim1 || '(boş)'} | + Renk: ${v.colorCode || '-'} | + Qty: ${v.qty1} +
+
+ Sebep: ${v.reason || 'Tanımsız ürün kombinasyonu'} +
+
+ `).join('')} +
+ `, + html: true, + ok: { + label: 'Düzelt', + color: 'negative' + }, + cancel: false, + persistent: true + }) + .onOk(() => resolve()) + .onDismiss(() => resolve()) + .onShown(() => { + // Satıra tıklama → scroll + highlight + const nodes = document.querySelectorAll('.invalid-row') + nodes.forEach(n => { + n.addEventListener('click', () => { + const ck = n.getAttribute('data-clientkey') + this.scrollToInvalidRow?.(ck) + }) + }) + }) + }) + } + , + /* =========================================================== + 🎯 scrollToInvalidRow — FINAL + ----------------------------------------------------------- + ✔ ClientKey bazlı scroll + ✔ Hem summaryRows hem orders destekli + ✔ Highlight otomatik kalkar + =========================================================== */ + scrollToInvalidRow(clientKey) { + if (!clientKey) return + + // 1️⃣ Store içindeki satırı bul + const idx = this.summaryRows?.findIndex( + r => r.clientKey === clientKey + ) + + if (idx === -1) { + console.warn('❌ Satır bulunamadı:', clientKey) + return + } + + // 2️⃣ DOM node + const el = document.querySelector( + `[data-clientkey="${clientKey}"]` + ) + + if (!el) { + console.warn('❌ DOM satırı bulunamadı:', clientKey) + return + } + + // 3️⃣ Scroll + el.scrollIntoView({ + behavior: 'smooth', + block: 'center' + }) + + // 4️⃣ Highlight + el.classList.add('invalid-highlight') + + setTimeout(() => { + el.classList.remove('invalid-highlight') + }, 2500) + } + , + + async checkHeaderExists(orderHeaderID) { + try { + if (!orderHeaderID) return false + + const res = await api.get(`/orders/check/${orderHeaderID}`) + + // Backend “true/false” döner varsayımı + return res?.data?.exists === true + } catch (err) { + console.warn("⚠ checkHeaderExists hata:", err) + return false + } + } + , + + async fetchOrderPdf(orderId) { + try { + const resp = await api.get(`/order/pdf/${orderId}`, { + responseType: 'blob' + }) + return resp.data + } catch (err) { + console.error("❌ fetchOrderPdf hata:", err) + throw err + } + } + , + + async downloadOrderPdf(id = null) { + try { + const orderId = id || this.header?.OrderHeaderID + if (!orderId) { + console.error('❌ PDF ID bulunamadı') + return + } + + const res = await api.get(`/order/pdf/${orderId}`, { + responseType: 'blob' + }) + + const blob = new Blob([res.data], { type: 'application/pdf' }) + const url = URL.createObjectURL(blob) + + window.open(url, '_blank') + setTimeout(() => URL.revokeObjectURL(url), 60_000) + + } catch (err) { + console.error('❌ PDF açma hatası:', err) + throw err + } + } + + + + + + , + setActiveNewHeader(id) { + this.activeNewHeaderId = id || null + if (id) localStorage.setItem("bss_active_new_header", id) + else localStorage.removeItem("bss_active_new_header") + }, + + getActiveNewHeaderId() { + return this.activeNewHeaderId || localStorage.getItem("bss_active_new_header") + }, + + /* =========================================================== + 🧩 initFromRoute (v5.6 — groupedRows TOUCH YOK) + ----------------------------------------------------------- + - Route ID ve bss_last_txn arasında en dolu snapshot'ı seçer + - header + orders + summaryRows restore edilir + - groupedRows hydrate edilmez / resetlenmez / dokunulmaz + - Route ID farklıysa router.replace ile URL düzeltilir + =========================================================== */ + async initFromRoute(orderId, router = null) { // ✅ NEW MODE → SADECE global draft + if (this.mode === 'new') { + const raw = localStorage.getItem(this.getDraftKey) + if (raw) { + try { + const payload = JSON.parse(raw) + this.header = payload.header || {} + this.orders = payload.orders || [] + this.summaryRows = payload.summaryRows || this.orders + console.log('♻️ NEW draft restore edildi (global)') + return + } catch {} + } + console.log('⚪ NEW draft yok, boş başlatılıyor') + return + } + if (!this.schemaMap || !Object.keys(this.schemaMap).length) { + this.initSchemaMap() + } + + try { + console.log('🧩 [initFromRoute] orderId:', orderId) + + const lastTxn = localStorage.getItem('bss_last_txn') || null + + const readPayload = (id) => { + if (!id) return null + const raw = localStorage.getItem(`bss_orderentry_data:${id}`) + if (!raw) return null + try { + return JSON.parse(raw) + } catch { + return null + } + } + + const fromRoute = readPayload(orderId) + const fromLast = readPayload(lastTxn) + + const hasData = (p) => + !!p && ( + (Array.isArray(p.orders) && p.orders.length > 0) || + (Array.isArray(p.summaryRows) && p.summaryRows.length > 0) + ) + + let chosenId = null + let chosenPayload = null + + if (hasData(fromRoute)) { + chosenId = orderId + chosenPayload = fromRoute + console.log('✅ [initFromRoute] Route ID snapshot seçildi:', chosenId) + } else if (hasData(fromLast)) { + chosenId = lastTxn + chosenPayload = fromLast + console.log('✅ [initFromRoute] lastTxn snapshot seçildi:', chosenId) + } + + /* ------------------------------------------------------- + 🚫 SNAPSHOT YOK → BOŞ BAŞLA + -------------------------------------------------------- */ + if (!chosenId || !chosenPayload) { + console.log('⚪ [initFromRoute] Snapshot yok, boş başlatılıyor') + + this.header = { + ...(this.header || {}), + OrderHeaderID: orderId || lastTxn || crypto.randomUUID() + } + + this.orders = [] + this.summaryRows = [] + + // ❗ groupedRows'a DOKUNMA + return + } + + /* ------------------------------------------------------- + ✅ SNAPSHOT RESTORE (SAFE CLONE) + -------------------------------------------------------- */ + this.header = { + ...(chosenPayload.header || {}), + OrderHeaderID: chosenId + } + + const orders = Array.isArray(chosenPayload.orders) + ? [...chosenPayload.orders] + : [] + + const summaryRows = Array.isArray(chosenPayload.summaryRows) + ? [...chosenPayload.summaryRows] + : orders + + this.orders = orders + this.summaryRows = summaryRows + + // ❗ groupedRows hydrate edilmez, resetlenmez + + /* ------------------------------------------------------- + 🔁 lastTxn SENKRON + -------------------------------------------------------- */ + try { + localStorage.setItem('bss_last_txn', chosenId) + } catch (e) { + console.warn('⚠️ bss_last_txn yazılamadı:', e) + } + + /* ------------------------------------------------------- + 🔁 ROUTE DÜZELTME (GEREKİRSE) + -------------------------------------------------------- */ + if (router && orderId && orderId !== chosenId) { + console.log('🔁 [initFromRoute] Route ID düzeltiliyor →', chosenId) + await router.replace({ + name: 'order-entry', + params: { orderHeaderID: chosenId } + }) + } + + console.log( + '✅ [initFromRoute] Restore tamam. Satır sayısı:', + this.summaryRows.length + ) + + } catch (err) { + console.error('❌ [initFromRoute] hata:', err) + } + } + + , + + /* =========================================================== + 🆕 startNewOrder (v8.3 — FINAL & STABLE) + =========================================================== */ + async startNewOrder({ $q }) { + + if (!this.schemaMap || !Object.keys(this.schemaMap).length) { + this.initSchemaMap() + } + + const headerId = crypto.randomUUID() + + let orderNumber = `LOCAL-${dayjs().format("YYMMDD-HHmmss")}` + + try { + const res = await api.get("/order/new-number") + if (res?.data?.OrderNumber) { + orderNumber = res.data.OrderNumber + } + } catch { + console.info('ℹ️ Backend order number yok, LOCAL kullanıldı') + } + + this.mode = 'new' + this.isControlledSubmit = false + this.allowRouteLeaveOnce = false + + this.header = { + OrderHeaderID: headerId, + OrderNumber: orderNumber, + OrderDate: new Date().toISOString().slice(0, 10), + CurrAccCode: null, + DocCurrencyCode: 'USD', + PriceCurrencyCode: 'USD', + PriceExchangeRate: 1 + } + + this.orders = [] + this.summaryRows = [] + + // ✅ fingerprint bazlı sistem için reset + this._lastSavedFingerprint = null + + // ✅ NEW draft hemen yazılır + this.persistLocalStorage?.() + + return this.header + } + + + + , + dedupeActiveLinesByCombo(lines) { + const map = new Map() + for (const ln of lines) { + const key = buildComboKey({ + model: ln.ItemCode, + renk: ln.ColorCode, + renk2: ln.ItemDim2Code + }, ln.ItemDim1Code) + + if (!map.has(key)) { + ln.ComboKey = key + map.set(key, ln) + continue + } + + const ex = map.get(key) + ex.Qty1 = (Number(ex.Qty1) || 0) + (Number(ln.Qty1) || 0) + + // OrderLineID boşsa doldur (editte önemli) + if (!ex.OrderLineID && ln.OrderLineID) ex.OrderLineID = ln.OrderLineID + } + return Array.from(map.values()) + } + + + , + /* =========================================================== + 🧹 Core reset helper — sadece state'i sıfırlar + =========================================================== */ + resetCoreState() { + this.orders = [] + this.summaryRows = [] + this.groupedRows = [] + this.header = {} + this.editingKey = null + this.currentOrderId = null + },resetForNewOrder() { + // mevcut her şeyi temizle + this.header = { + OrderHeaderID: this.header?.OrderHeaderID || null, + OrderDate: new Date().toISOString().slice(0,10), + CurrAccCode: null, + DocCurrencyCode: 'TRY', + PriceCurrencyCode: 'TRY', + // ihtiyaç duyduğun diğer default header alanları + } + + this.orders = [] + this.summaryRows = [] + this.productCache = {} + this.stockMap = {} + + this.setMode('new') + } + , + resetForEdit() { + // EDIT modda grid temizlenmez — sadece UI state resetlenir + this.editingKey = null + this.groupedRows = [] + this.mode = 'edit' + } + + ,markAsSaved() { + try { + this._lastSavedFingerprint = this._persistFingerprint() + console.log('✅ markAsSaved → fingerprint senkron') + } catch (e) { + console.warn('⚠️ markAsSaved hata:', e) + } + } + ,clearLocalSnapshot() { + try { + const id = this.header?.OrderHeaderID + if (!id) return + localStorage.removeItem(`bss_orderentry_data:${id}`) + console.log('🧹 Local snapshot temizlendi:', id) + } catch (e) { + console.warn('⚠️ clearLocalSnapshot hata:', e) + } + },/* =========================================================== + 🧹 HARD CLEAN — ALL ORDERENTRY SNAPSHOTS +=========================================================== */ + clearAllOrderSnapshots () { + Object.keys(localStorage) + .filter(k => + k.startsWith('bss_orderentry_data:') || + k.startsWith('bss_orderentry_edit:') + ) + .forEach(k => { + console.log('🧹 snapshot silindi:', k) + localStorage.removeItem(k) + }) + + localStorage.removeItem('bss_last_txn') + } + + + + + , + /* =========================================================== + 🧹 Store Hard Reset — Submit Sonrası Temizlik (FIXED) + - Grid, header, toplamlar, local state'ler sıfırlanır + - persistKey / lastSnapshotKey NULL yapılmaz (config sabit kalır) + - localStorage txn/snapshot temizliği güvenli yapılır + =========================================================== */ + hardResetAfterSubmit() { + try { + // 🔑 mevcut id’yi yakala (local temizliği için) + const id = this.header?.OrderHeaderID || null + + /* ------------------------------------------------------- + 1) Grid ve satırlar + -------------------------------------------------------- */ + this.orders = [] + this.summaryRows = [] + this.groupedRows = [] + + /* ------------------------------------------------------- + 2) Header & meta + -------------------------------------------------------- */ + this.header = {} + + /* ------------------------------------------------------- + 3) Mode & edit state + -------------------------------------------------------- */ + this.mode = 'new' + this.editingKey = null + this.currentOrderId = null + + /* ------------------------------------------------------- + 4) Snapshot / transaction meta + ⚠️ persistKey / lastSnapshotKey store config → NULL YAPMA + -------------------------------------------------------- */ + this.activeTransactionId = null + this.submitted = false + + // fingerprint / debounce meta varsa sıfırla + this._lastSavedFingerprint = null + this._lastPersistFingerprint = null + if (this._persistTimeout) { + clearTimeout(this._persistTimeout) + this._persistTimeout = null + } + + /* ------------------------------------------------------- + 5) LocalStorage temizlik (opsiyonel ama submit sonrası doğru) + -------------------------------------------------------- */ + try { + if (id) { + localStorage.removeItem(`bss_orderentry_data:${id}`) + localStorage.removeItem(`bss_orderentry_snapshot:${id}`) + } + localStorage.removeItem('bss_last_txn') + localStorage.removeItem('bss_active_new_header') + } catch (e) { + console.warn('⚠️ hardResetAfterSubmit localStorage temizliği hata:', e) + } + + console.log('🧹 Store resetlendi (submit sonrası).') + } catch (err) { + console.error('❌ hardResetAfterSubmit hata:', err) + } + } + + , + + /* =========================================================== + ✏️ openExistingForEdit (v12 — FINAL & CLEAN) + ----------------------------------------------------------- + ✔ Backend authoritative (orderlist açılışı local'i dikkate almaz) + ✔ mode=new → backend çağrısı YOK + ✔ normalizeOrderLines → grpKey + bedenMap garanti + ✔ isClosed varsa → view, yoksa → edit + ✔ Form sync opsiyonel + ✔ İlk açılışta snapshot yazılır (edit boyunca persist ile güncellenir) + =========================================================== */ + async openExistingForEdit( + orderId, + { $q = null, form = null, productCache = null } = {} + ) { + // 🔑 schemaMap garanti + if (!this.schemaMap || !Object.keys(this.schemaMap).length) { + this.initSchemaMap?.() + } + + if (!orderId) return false + + /* ======================================================= + 🟦 NEW MODE — ASLA backend çağrısı yok + ======================================================= */ + if (this.mode === 'new') { + console.log('⚪ openExistingForEdit skip (mode=new)') + return false + } + + // productCache hem ref hem reactive olabilir → güvenli oku + const pc = + productCache?.value + ? productCache.value + : (productCache && typeof productCache === 'object' ? productCache : {}) + + try { + // geçici varsayım (sonra isClosed durumuna göre set edilecek) + this.setMode?.('edit') + + /* ======================================================= + 🔹 BACKEND — authoritative load + ======================================================= */ + const res = await api.get(`/order/get/${orderId}`) + const backend = res?.data + + if (!backend?.header) { + throw new Error('Backend header yok') + } + + /* ======================================================= + 🔹 HEADER — SADECE BACKEND + (orderlist açılışında local merge YOK) + ======================================================= */ + this.header = { + ...backend.header, + OrderHeaderID: backend.header.OrderHeaderID || orderId + } + + /* ======================================================= + 🔹 NORMALIZE LINES (TEK KAYNAK) + normalizeOrderLines şu alanları üretmeli: + ✔ row.grpKey + ✔ row.bedenMap[grpKey] + ✔ row.isClosed (boolean) + ======================================================= */ + const normalized = this.normalizeOrderLines( + backend.lines || [], + this.header.DocCurrencyCode || 'USD', + pc + ) + + this.orders = Array.isArray(normalized) ? normalized : [] + this.summaryRows = [...this.orders] + + /* ======================================================= + 🔹 MODE KARARI (BACKEND SATIRLARI ÜZERİNDEN) + - herhangi bir isClosed=true → view + - değilse → edit + ======================================================= */ + const hasClosedLine = (this.summaryRows || []).some(r => r?.isClosed === true) + this.setMode?.(hasClosedLine ? 'view' : 'edit') + + /* ======================================================= + 🔹 FORM SYNC (opsiyonel) + ======================================================= */ + if (form) { + Object.assign(form, this.header) + } + + /* ======================================================= + 🔹 LOCAL SNAPSHOT (edit boyunca tutulacak temel) + - Açılışta snapshot yaz + - Sonraki değişikliklerde zaten persistLocalStorage çağrıları var + ======================================================= */ + this.persistLocalStorage?.() + try { + localStorage.setItem('bss_last_txn', String(orderId)) + } catch {} + + console.log('✅ openExistingForEdit OK:', { + id: orderId, + rows: this.summaryRows.length, + mode: this.mode, + hasClosedLine + }) + + return true + } catch (err) { + console.error('❌ openExistingForEdit hata:', err) + + // new değilse uyar + if (this.mode !== 'new') { + $q?.notify?.({ + type: 'negative', + message: 'Sipariş yüklenemedi' + }) + } + + return false + } + } + + , + /* =========================================================== + ♻️ hydrateFromLocalStorage (v5.5 — FIXED & CLEAN) + ----------------------------------------------------------- + - Tek assign (double overwrite YOK) + - groupedRows hydrate edilmez + - mode ASLA set edilmez + - header + rows güvenli restore + =========================================================== */ + async hydrateFromLocalStorage(orderId, log = false) {if (this.mode === 'new') { + return this.hydrateFromLocalStorageIfExists() + } + + try { + const key = `bss_orderentry_data:${orderId}` + const payload = JSON.parse(localStorage.getItem(key) || 'null') + + if (!payload) { + log && console.log('ℹ️ hydrate → snapshot yok:', orderId) + return null + } + + // 🔑 source bilgisi (mode set edilmez) + this.source = payload.source || 'local' + + /* ------------------------------------------------------- + MSSQL tarih helper’ları + -------------------------------------------------------- */ + const safeDateTime = v => { + if (!v) return null + const d = dayjs(v) + return d.isValid() ? d.format('YYYY-MM-DD HH:mm:ss') : null + } + + const safeDateOnly = v => { + if (!v) return null + const d = dayjs(v) + return d.isValid() ? d.format('YYYY-MM-DD') : null + } + + const safeTimeOnly = v => { + if (!v) return null + const d = dayjs(v) + return d.isValid() ? d.format('HH:mm:ss') : null + } + + /* ------------------------------------------------------- + HEADER + -------------------------------------------------------- */ + this.header = { + ...(payload.header || {}), + OrderHeaderID: payload.header?.OrderHeaderID ?? orderId, + OrderNumber : payload.header?.OrderNumber ?? null + } + + const h = this.header + h.CreatedDate = safeDateTime(h.CreatedDate) + h.LastUpdatedDate = safeDateTime(h.LastUpdatedDate) + h.CreditableConfirmedDate = safeDateTime(h.CreditableConfirmedDate) + h.OrderDate = safeDateOnly(h.OrderDate) + h.OrderTime = safeTimeOnly(h.OrderTime) + this.header = h + + /* ------------------------------------------------------- + ROWS (TEK KAYNAK) + -------------------------------------------------------- */ + const orders = Array.isArray(payload.orders) + ? payload.orders + : [] + + this.orders = orders + + this.summaryRows = Array.isArray(payload.summaryRows) + ? payload.summaryRows + : orders + + // ❌ groupedRows hydrate edilmez (computed olmalı) + this.groupedRows = [] + + /* ------------------------------------------------------- + SNAPSHOT ÖZET + -------------------------------------------------------- */ + const output = { + type : payload.submitted === true ? 'submitted' : 'draft', + source : this.source, + headerId : orderId, + orderNumber: this.header?.OrderNumber ?? null, + rows : this.summaryRows.length, + submitted : + payload.submitted === true || + payload.header?.IsSubmitted === true + } + + log && console.log('♻️ hydrate sonuc (FIXED):', output) + return output + + } catch (err) { + console.warn('⚠️ hydrateFromLocalStorage hata:', err) + return null + } + } + + + , + hydrateFromLocalStorageIfExists() { + try { + let raw = null + + if (this.mode === 'new') { + raw = localStorage.getItem(this.getDraftKey) // ✅ + } + + if (this.mode === 'edit') { + const key = this.getEditKey // ✅ + if (key) raw = localStorage.getItem(key) + } + + if (!raw) return false + + const payload = JSON.parse(raw) + + this.header = payload.header || {} + this.orders = payload.orders || [] + this.summaryRows = payload.summaryRows || this.orders + + console.log('♻️ hydrate OK:', this.mode) + return true + + } catch (err) { + console.warn('hydrateFromLocalStorageIfExists hata:', err) + return false + } + } + + , + + /* =========================================================== + 🔀 mergeOrders (local + backend) + normalizeISO → kaldırıldı + safe MSSQL helpers eklendi + =========================================================== */ + mergeOrders(local, backend, preferLocal = true) { + if (!backend && !local) return { header: {}, orders: [] } + + const safeMerge = (base = {}, override = {}) => { + const out = { ...base } + for (const [k, v] of Object.entries(override || {})) { + if (v === undefined || v === null) continue + if (typeof v === 'string' && v.trim() === '') continue + out[k] = v + } + return out + } + + // Header merge + const header = safeMerge(backend?.header || {}, local?.header || {}) + header.OrderHeaderID = + backend?.header?.OrderHeaderID || + local?.header?.OrderHeaderID || + header.OrderHeaderID || + null + + const getKey = (r) => + (r.OrderLineID || + `${r.model || r.ItemCode}_${r.renk || r.ColorCode}_${r.renk2 || r.ColorCode2}` + ).toString().toUpperCase() + + const map = new Map() + + // Backend satırları + for (const b of (backend?.lines || backend?.orders || [])) { + map.set(getKey(b), { ...b, _src: 'backend' }) + } + + // Local satırları merge et + for (const l of (local?.orders || [])) { + const k = getKey(l) + if (map.has(k)) { + const merged = safeMerge(map.get(k), l) + merged._src = preferLocal ? 'local' : 'backend' + map.set(k, merged) + } else { + map.set(k, { ...l, _src: 'local-only' }) + } + } + + const mergedOrders = Array.from(map.values()) + console.log(`🧩 mergeOrders → ${mergedOrders.length} satır birleşti (ID:${header.OrderHeaderID})`) + + // ==================================================== + // 🕒 HEADER TARİHLERİNİ MSSQL FORMATINA NORMALİZE ET + // ==================================================== + const safeDateTime = v => { + if (!v) return null + const d = dayjs(v) + return d.isValid() ? d.format("YYYY-MM-DD HH:mm:ss") : null + } + + const safeDateOnly = v => { + if (!v) return null + const d = dayjs(v) + return d.isValid() ? d.format("YYYY-MM-DD") : null + } + + const safeTimeOnly = v => { + if (!v) return null + const d = dayjs(v) + return d.isValid() ? d.format("HH:mm:ss") : null + } + + header.CreatedDate = safeDateTime(header.CreatedDate) + header.LastUpdatedDate = safeDateTime(header.LastUpdatedDate) + header.CreditableConfirmedDate = safeDateTime(header.CreditableConfirmedDate) + + header.OrderDate = safeDateOnly(header.OrderDate) + header.OrderTime = safeTimeOnly(header.OrderTime) + + return { header, orders: mergedOrders } + + } + , + + markRowSource(row) { + if (row._src === 'local-only') return '🟠 Offline' + if (row._src === 'local') return '🔵 Local' + return '⚪ Backend' + } + , + + /* =========================================================== + 🔄 mergeAndPersistBackendOrder (edit mode) + =========================================================== */ + mergeAndPersistBackendOrder(orderId, backendPayload) { + const key = `bss_orderentry_data:${orderId}` + const localPayload = JSON.parse(localStorage.getItem(key) || 'null') + + const merged = this.mergeOrders(localPayload, backendPayload, true) + + localStorage.setItem(key, JSON.stringify({ + ...merged, + source: 'db', + mode: 'edit', + updatedAt: new Date().toISOString() + })) + + console.log(`💾 mergeAndPersistBackendOrder → ${orderId} localStorage’a yazıldı`) + } + , + + persistLocalStorage() { + try { + if (this.preventPersist || this._uiBusy) return + + const payload = { + mode: this.mode, + header: toRaw(this.header || {}), + orders: toRaw(this.orders || []), + summaryRows: toRaw(this.summaryRows || []), + updatedAt: new Date().toISOString() + } + + /* =============================== + 🟢 NEW MODE — GLOBAL TEK TASLAK + =============================== */ + if (this.mode === 'new') { + localStorage.setItem(this.getDraftKey, JSON.stringify(payload)) + + // 🔒 sadece aktif new header bilgisi + this.setActiveNewHeader?.(this.header?.OrderHeaderID) + + return + } + + /* =============================== + 🔵 EDIT MODE — ID BAZLI + =============================== */ + if (this.mode === 'edit') { + const key = this.getEditKey + if (!key) return + localStorage.setItem(key, JSON.stringify(payload)) + } + + } catch (e) { + console.warn('persistLocalStorage error:', e) + } + } + + + + , + clearEditSnapshotIfExists() { + if (this.mode !== 'edit') return + + const key = this.getEditKey // ✅ + if (!key) return + + localStorage.removeItem(key) + console.log('🧹 EDIT snapshot silindi:', key) + } + + + + + ,/* =========================================================== + 🧠 _persistFingerprint — kritik state’leri tek stringe indirger + - X3: orders+header yetmez → mode, summaryRows, id/no, map’ler dahil +=========================================================== */ + _persistFingerprint() { + // 🔹 orders: çok büyürse pahalı olabilir ama snapshot tutarlılığı için önemli + // (istersen burada sadece length + rowKey listesi gibi optimize ederiz) + const ordersSnap = JSON.stringify(this.orders || []) + + // 🔹 header: sadece kritik alanları al (tam header yerine daha stabil) + const h = this.header || {} + const headerSnap = JSON.stringify({ + OrderHeaderID: h.OrderHeaderID || '', + OrderNumber: h.OrderNumber || '', + CurrAccCode: h.CurrAccCode || '', + DocCurrencyCode: h.DocCurrencyCode || '', + ExchangeRate: h.ExchangeRate ?? null + }) + + // 🔹 summaryRows: hash yerine şimdilik “length + rowKey listesi” (hafif + etkili) + const sr = Array.isArray(this.summaryRows) ? this.summaryRows : [] + const summaryMeta = JSON.stringify({ + len: sr.length, + keys: sr.map(r => this.getRowKey?.(r) || r?.key || r?.id || '').filter(Boolean) + }) + + // 🔹 comboLineIds / lineIdMap gibi kritik map’ler + // (sende hangisi varsa onu otomatik topluyoruz) + const mapSnap = JSON.stringify({ + lineIdMap: this.lineIdMap || null, + comboLineIds: this.comboLineIds || null, + comboLineIdMap: this.comboLineIdMap || null, + comboLineIdSet: this.comboLineIdSet ? Array.from(this.comboLineIdSet) : null + }) + + // 🔹 mode + const modeSnap = String(this.mode || 'new') + + // ✅ Tek fingerprint + return `${modeSnap}|${headerSnap}|${summaryMeta}|${mapSnap}|${ordersSnap}` + } + , + /* =========================================================== + 🕒 _safePersistDebounced — snapshot değişmediği sürece yazmaz (X3) + - fingerprint: mode + header(id/no) + summaryRows meta + lineIdMap/combo + orders + =========================================================== */ + _safePersistDebounced(delay = 1200) { + clearTimeout(this._persistTimeout) + + this._persistTimeout = setTimeout(() => { + try { + // ✅ Persist guard’ları (varsa) + if (this.preventPersist) return + if (this._uiBusy) return + + const fp = this._persistFingerprint() + + if (fp === this._lastPersistFingerprint) { + return + } + + this._lastPersistFingerprint = fp + + this.persistLocalStorage() + console.log(`🕒 Otomatik LocalStorage senkron (${this.orders?.length || 0} satır).`) + } catch (err) { + console.warn('⚠️ Debounce persist hata:', err) + } + }, delay) + } + + , + + /* =========================================================== + 💰 fetchMinPrice — model/pb için min fiyat + =========================================================== */ + async fetchMinPrice(model, currency, $q) { + try { + const res = await api.get('/min-price', { + params: { model, currency } + }) + const data = res?.data || {} + console.log('💰 [store.fetchMinPrice] yanıt:', data) + return { + price: Number(data.price || 0), + rateToTRY: Number(data.rateToTRY || 1), + priceTRY: Number(data.priceTRY || 0) + } + } catch (err) { + console.error('❌ [store.fetchMinPrice] Min fiyat alınamadı:', err) + $q?.notify?.({ + type: 'warning', + message: 'Min. fiyat bilgisi alınamadı, kontrol atlandı ⚠️', + position: 'top-right' + }) + return { price: 0, rateToTRY: 1, priceTRY: 0 } + } + } + , + applyCurrencyToLines(newPB) { + if (!newPB) return + + // 🔹 Header + if (this.header) { + this.header.DocCurrencyCode = newPB + this.header.PriceCurrencyCode = newPB + } + + // 🔹 Lines + if (Array.isArray(this.orders)) { + this.orders = this.orders.map(r => ({ + ...r, + pb: newPB, + DocCurrencyCode: newPB, + PriceCurrencyCode: newPB + })) + } + + // 🔹 Summary + if (Array.isArray(this.summaryRows)) { + this.summaryRows = this.summaryRows.map(r => ({ + ...r, + pb: newPB, + DocCurrencyCode: newPB, + PriceCurrencyCode: newPB + })) + } + + // ❗ totalAmount SET ETME + // ✔️ TEK MERKEZ + this.updateHeaderTotals?.() + } + , + + /* =========================================================== + 💠 HEADER SET & CURRENCY PROPAGATION + =========================================================== */ + setHeaderFields(fields, opts = {}) { + const { + applyCurrencyToLines = false, + immediatePersist = false + } = opts + + // 1️⃣ HEADER + this.header = { + ...(this.header || {}), + ...fields + } + + // 2️⃣ SATIRLARA GERÇEKTEN YAY + if (applyCurrencyToLines && Array.isArray(this.summaryRows)) { + this.summaryRows = this.summaryRows.map(r => ({ + ...r, + pb: fields.DocCurrencyCode ?? r.pb, + DocCurrencyCode: fields.DocCurrencyCode ?? r.DocCurrencyCode, + PriceCurrencyCode: fields.PriceCurrencyCode ?? fields.DocCurrencyCode ?? r.PriceCurrencyCode + })) + } + + // 3️⃣ STORE ORDERS REFERANSI + this.orders = [...this.summaryRows] + + + // 4️⃣ PERSIST + if (immediatePersist) { + this.persistLocalStorage('header-change') + } + } + + , + + applyHeaderCurrencyToOrders() { + if (!Array.isArray(this.orders)) return + + const doc = this.header?.DocCurrencyCode ?? null + const prc = this.header?.PriceCurrencyCode ?? null + const rate = this.header?.PriceExchangeRate ?? null + + let cnt = 0 + + for (const r of this.orders) { + if (doc) r.DocCurrencyCode = doc + if (prc) r.PriceCurrencyCode = prc + if (rate != null) r.PriceExchangeRate = rate + cnt++ + } + + console.log(`💱 ${cnt} satırda PB güncellendi → Doc:${doc} Price:${prc} Rate:${rate}`) + } + + + ,/* =========================================================== + 📸 saveSnapshot — küçük debug snapshot +=========================================================== */ + saveSnapshot(tag = 'snapshot') { + try { + const id = this.header?.OrderHeaderID + if (!id) return + + const key = `bss_orderentry_snapshot:${id}` + + const snap = { + tag, + mode: this.mode, + orders: toRaw(this.orders || []), + header: toRaw(this.header || {}), + savedAt: dayjs().toISOString() + } + + localStorage.setItem(key, JSON.stringify(snap)) + console.log(`📸 Snapshot kaydedildi [${key}]`) + } catch (err) { + console.warn('⚠️ saveSnapshot hata:', err) + } + } + , + + /* =========================================================== + ♻️ loadFromStorage — eski generic persist için + =========================================================== */ + loadFromStorage(force = false) { + try { + const raw = localStorage.getItem(this.getPersistKey) + if (!raw) { + console.info('ℹ️ LocalStorage boş, grid başlatılmadı.') + return false + } + + if (!force && this.mode === 'edit') { + console.info('⚠️ Edit modda local restore atlandı (force=false).') + return false + } + + const data = JSON.parse(raw) + + this.orders = Array.isArray(data.orders) ? data.orders : [] + this.header = data.header || {} + this.currentOrderId = data.currentOrderId || null + this.selectedCustomer = data.selectedCustomer || null + + // 🔧 Temiz ID + this.header.OrderHeaderID = data.header?.OrderHeaderID || null + + this.mode = data.mode || 'new' + this.lastSavedAt = data.savedAt || null + + console.log(`♻️ Storage yüklendi • txn:${this.header.OrderHeaderID} (${this.orders.length} satır)`) + + // Header PB -> satırlara + this.applyHeaderCurrencyToOrders() + this._safePersistDebounced(200) + + return data + } catch (err) { + console.warn('⚠️ localStorage okuma hatası:', err) + return false + } + } + , + + clearStorage() { + try { + localStorage.removeItem(this.getPersistKey) + console.log(`🗑️ LocalStorage temizlendi [${this.getPersistKey}]`) + } catch (err) { + console.warn('⚠️ clearStorage hatası:', err) + } + } + , + clearNewDraft() { + localStorage.removeItem(this.getDraftKey) // ✅ + localStorage.removeItem('bss_last_txn') + console.log('🧹 NEW taslak temizlendi') + } + + , +// =========================================================== +// 🔹 isSameCombo — STORE LEVEL (TEK KAYNAK) +// - model ZORUNLU eşleşir +// - renk / renk2 boşsa → joker +// =========================================================== + isSameCombo(a, b) { + if (!a || !b) return false + + const n = v => (v == null ? '' : String(v).trim().toUpperCase()) + + const A = { model: n(a.model), renk: n(a.renk), renk2: n(a.renk2) } + const B = { model: n(b.model), renk: n(b.renk), renk2: n(b.renk2) } + + if (!A.model || !B.model) return false + + const renkOk = (A.renk === B.renk) || !A.renk || !B.renk + const renk2Ok = (A.renk2 === B.renk2) || !A.renk2 || !B.renk2 + + return A.model === B.model && renkOk && renk2Ok + }, + + + +// =========================================================== +// 🔹 saveOrUpdateRowUnified (v6.6 — COMBO SAFE + FIXED STOCK+PRICE + UI) +// - v6.5 korunur (stok+min fiyat + this.loadProductSizes) +// - ✅ NEW MODE: dupIdx artık _deleteSignal satırlarını BAŞTAN hariç tutar +// - EDIT MODE: sameCombo → update, combo değişti → delete + insert (korundu) +// - lineIdMap koruması korunur +// =========================================================== + async saveOrUpdateRowUnified({ + form, + recalcVat = null, + resetEditor = null, + stockMap = null, + loadProductSizes = null, + $q = null + }) { + try { + console.log('🔥 saveOrUpdateRowUnified v6.6', { + model: form?.model, + mode: this.mode, + editingKey: this.editingKey + }) + + const getKey = + typeof this.getRowKey === 'function' + ? this.getRowKey + : (r => r?.clientKey || r?.id || r?.OrderLineID) + + const rows = Array.isArray(this.summaryRows) + ? [...this.summaryRows] + : [] + + /* ======================================================= + 1️⃣ ZORUNLU KONTROLLER + ======================================================= */ + if (!form?.model) { + $q?.notify?.({ type: 'warning', message: 'Model seçiniz' }) + return false + } + + if (!form.pb) { + form.pb = this.header?.DocCurrencyCode || 'USD' + } + + /* ======================================================= + 2️⃣ STOK KONTROLÜ (FIXED) + - stok guard’dan önce this.loadProductSizes(form,true,$q) + - opsiyonel callback loadProductSizes(true) + - tek dialog + doğru await + ======================================================= */ + + // ✅ store fonksiyonu + try { + if (typeof this.loadProductSizes === 'function') { + await this.loadProductSizes(form, true, $q) + } + } catch (err) { + console.warn('⚠ this.loadProductSizes hata:', err) + } + + // ✅ dışarıdan callback geldiyse + try { + if (typeof loadProductSizes === 'function') { + await loadProductSizes(true) + } + } catch (err) { + console.warn('⚠ loadProductSizes hata:', err) + } + + const stockMapLocal = stockMap?.value || stockMap || {} + const bedenLabels = form.bedenLabels || [] + const bedenValues = form.bedenler || [] + + const overLimit = [] + for (let i = 0; i < bedenLabels.length; i++) { + const lbl = String(bedenLabels[i] ?? '').trim() + const stok = Number(stockMapLocal?.[lbl] ?? 0) + const girilen = Number(bedenValues?.[i] ?? 0) + + if (stok > 0 && girilen > stok) { + overLimit.push({ beden: lbl, stok, girilen }) + } + } + + if (overLimit.length && $q) { + const msg = overLimit + .map(x => `• ${x.beden}: ${x.girilen} (Stok: ${x.stok})`) + .join('
') + + const stokOK = await new Promise(resolve => { + $q.dialog({ + title: 'Stok Uyarısı', + message: `Bazı bedenlerde stoktan fazla giriş yaptınız:

${msg}`, + html: true, + ok: { label: 'Devam', color: 'primary' }, + cancel: { label: 'İptal', color: 'negative' } + }) + .onOk(() => resolve(true)) + .onCancel(() => resolve(false)) + .onDismiss(() => resolve(false)) + }) + + if (!stokOK) return false + } + + /* ======================================================= + 3️⃣ FİYAT (MIN) KONTROLÜ (FIXED) + ======================================================= */ + let fiyatOK = true + try { + let minFiyat = 0 + + if (typeof this.fetchMinPrice === 'function') { + const p = await this.fetchMinPrice(form.model, form.pb, $q) + minFiyat = Number(p?.price || 0) + } else if (Number(form.minFiyat || 0) > 0) { + minFiyat = Number(form.minFiyat) + } + + const girilen = Number(form.fiyat || 0) + + if (minFiyat > 0 && girilen > 0 && girilen < minFiyat && $q) { + fiyatOK = await new Promise(resolve => { + $q.dialog({ + title: 'Fiyat Uyarısı', + message: + `Min. Fiyat: ${minFiyat} ${form.pb}
` + + `Girdiğiniz: ${girilen} ${form.pb}`, + html: true, + ok: { label: 'Devam', color: 'primary' }, + cancel: { label: 'İptal', color: 'negative' } + }) + .onOk(() => resolve(true)) + .onCancel(() => resolve(false)) + .onDismiss(() => resolve(false)) + }) + } + } catch (err) { + console.warn('⚠ Min fiyat hata:', err) + } + if (!fiyatOK) return false + + /* ======================================================= + 4️⃣ TOPLAM HESABI + ======================================================= */ + const adet = (form.bedenler || []).reduce((a, b) => a + Number(b || 0), 0) + form.adet = adet + form.tutar = Number((adet * Number(form.fiyat || 0)).toFixed(2)) + + const newRow = toSummaryRowFromForm(form) + + /* ======================================================= + 5️⃣ EDIT MODE (editingKey ZORUNLU) + ======================================================= */ + if (this.editingKey) { + const idx = rows.findIndex(r => getKey(r) === this.editingKey) + if (idx === -1) { + this.editingKey = null + resetEditor?.(true) + return false + } + + const prev = rows[idx] + + if (this.isRowLocked?.(prev)) { + $q?.notify?.({ type: 'warning', message: 'Satır kapalı' }) + this.editingKey = null + resetEditor?.(true) + return false + } + + // ✅ kritik: store-level + const sameCombo = this.isSameCombo(prev, newRow) + + const preservedLineIdMap = + (prev?.lineIdMap && typeof prev.lineIdMap === 'object') + ? { ...prev.lineIdMap } + : (newRow?.lineIdMap && typeof newRow.lineIdMap === 'object') + ? { ...newRow.lineIdMap } + : {} + + /* ===== SAME COMBO → UPDATE ===== */ + if (sameCombo) { + rows[idx] = { + ...prev, + ...newRow, + id: prev.id, + OrderLineID: prev.OrderLineID || null, + lineIdMap: preservedLineIdMap + } + + this.summaryRows = rows + this.orders = rows + + this.updateHeaderTotals?.() + this.persistLocalStorage?.() + + this.editingKey = null + resetEditor?.(true) + recalcVat?.() + + $q?.notify?.({ type: 'positive', message: 'Satır güncellendi' }) + return true + } + + /* ===== COMBO CHANGED → DELETE + INSERT ===== */ + const grpKey = + prev?.grpKey || + Object.keys(prev?.bedenMap || {})[0] || + 'tak' + + const emptyMap = {} + const srcMap = + (prev?.bedenMap?.[grpKey] && typeof prev.bedenMap[grpKey] === 'object') + ? prev.bedenMap[grpKey] + : (preservedLineIdMap && typeof preservedLineIdMap === 'object') + ? preservedLineIdMap + : null + + if (srcMap) { + for (const beden of Object.keys(srcMap)) emptyMap[beden] = 0 + } else { + emptyMap['STD'] = 0 + } + + const deleteRow = { + ...prev, + id: `DEL::${prev.id || prev.OrderLineID || crypto.randomUUID()}`, + _deleteSignal: true, + adet: 0, + Qty1: 0, + tutar: 0, + ComboKey: '', + + OrderLineID: prev.OrderLineID || null, + + grpKey, + bedenMap: { [grpKey]: emptyMap }, + lineIdMap: preservedLineIdMap, + comboLineIds: { ...(prev.comboLineIds || {}) } + } + + const insertedRow = { + ...newRow, + id: crypto.randomUUID(), + OrderLineID: null, + lineIdMap: {} + } + + rows.splice(idx, 1, insertedRow) + + this.summaryRows = rows + this.orders = [...rows, deleteRow] + + this.updateHeaderTotals?.() + this.persistLocalStorage?.() + + this.editingKey = null + resetEditor?.(true) + recalcVat?.() + + $q?.notify?.({ type: 'positive', message: 'Kombinasyon değişti' }) + return true + } + + /* ======================================================= + 6️⃣ NEW MODE (MERGE / INSERT) — COMBO SAFE + - aynı combo → bedenMap merge (satır sayısı artmaz) + - farklı combo → yeni satır + - ✅ FIX: _deleteSignal satırlarını dup aramasında hariç tut + ======================================================= */ + const dupIdx = rows.findIndex(r => + !r?._deleteSignal && + this.isSameCombo(r, newRow) + ) + + // helper: bedenMap çıkar (gruplu ya da düz) + const extractMap = (row) => { + const grpKey = + row?.grpKey || + Object.keys(row?.bedenMap || {})[0] || + 'GENEL' + + const grouped = row?.bedenMap?.[grpKey] + const flat = (row?.bedenMap && typeof row.bedenMap === 'object' && !grouped) + ? row.bedenMap + : null + + return { grpKey, map: (grouped || flat || {}) } + } + + if (dupIdx !== -1) { + const prev = rows[dupIdx] + + // delete satırına merge yapma (ek güvenlik) + if (prev?._deleteSignal !== true) { + const { grpKey: prevGrp, map: prevMap } = extractMap(prev) + const { grpKey: newGrp, map: newMap } = extractMap(newRow) + + // hangi grpKey kullanılacak? + const grpKey = newRow?.grpKey || prevGrp || newGrp || 'GENEL' + + // MERGE: bedenleri topluyoruz (override değil) + const merged = { ...(prevMap || {}) } + for (const [k, v] of Object.entries(newMap || {})) { + const beden = (k == null || String(k).trim() === '') ? ' ' : String(k).trim() + merged[beden] = Number(merged[beden] || 0) + Number(v || 0) + } + + // toplam adet/tutar recalc + const totalAdet = Object.values(merged).reduce((a, b) => a + Number(b || 0), 0) + const price = Number(newRow?.fiyat ?? prev?.fiyat ?? 0) + const totalTutar = Number((totalAdet * price).toFixed(2)) + + rows[dupIdx] = { + ...prev, + ...newRow, + + // kritik korumalar + id: prev.id, + OrderLineID: prev.OrderLineID || null, + lineIdMap: { ...(prev.lineIdMap || {}) }, + + // MERGED bedenMap + grpKey, + bedenMap: { [grpKey]: merged }, + + // adet/tutar + adet: totalAdet, + tutar: totalTutar, + + updatedAt: dayjs().toISOString() + } + + this.summaryRows = rows + this.orders = rows + + this.updateHeaderTotals?.() + this.persistLocalStorage?.() + resetEditor?.(true) + recalcVat?.() + + $q?.notify?.({ type: 'positive', message: 'Aynı kombinasyon bulundu, bedenler birleştirildi' }) + return true + } + } + + // dup yoksa (veya dup delete satırıydı) → yeni satır + rows.push({ + ...newRow, + id: newRow.id || crypto.randomUUID(), + OrderLineID: null, + lineIdMap: { ...(newRow.lineIdMap || {}) } + }) + + this.summaryRows = rows + this.orders = rows + + this.updateHeaderTotals?.() + this.persistLocalStorage?.() + resetEditor?.(true) + recalcVat?.() + + $q?.notify?.({ type: 'positive', message: 'Yeni satır eklendi' }) + return true + + } catch (err) { + console.error('❌ saveOrUpdateRowUnified:', err) + $q?.notify?.({ type: 'negative', message: 'Satır kaydı başarısız' }) + return false + } + } + + + + + , + + /* =========================================================== + 🔄 setTransaction — yeni transaction ID set et + =========================================================== */ + setTransaction(id, autoResume = true) { + if (!id) return + + // 🔧 temiz ID + this.header.OrderHeaderID = id + + localStorage.setItem('bss_last_txn', id) + console.log('🔄 Transaction değiştirildi:', id) + + if (autoResume) { + const hasData = Array.isArray(this.orders) && this.orders.length > 0 + if (!hasData) { + const ok = this.hydrateFromLocalStorage(id,true) + if (ok) console.info('📦 Local kayıt geri yüklendi (boş grid için).') + } else { + console.log('🚫 Grid dolu, auto-resume atlandı (mevcut satırlar korundu).') + } + } + } + , + + + /* =========================================================== + 🧹 clearTransaction — sadece NEW MODE taslaklarını temizler + =========================================================== */ + clearTransaction() { + try { + const id = this.header?.OrderHeaderID + if (id) { + localStorage.removeItem(`bss_orderentry_data:${id}`) + } + + this.orders = [] + this.summaryRows = [] + this.groupedRows = [] + this.header = {} + this.mode = 'new' + + localStorage.removeItem('bss_last_txn') + + console.log('🧹 Transaction temizlendi') + } catch (err) { + console.warn('⚠️ clearTransaction hata:', err) + } + } + , + + + // ======================================================= + // 🔒 KİLİT KONTROLÜ — Sadece EDIT modunda, backend satırı + // ======================================================= + isRowLocked(row) { + if (!row) return false + // Sadece edit modunda, + // ve backend'den gelen gerçek OrderLineID varsa, + // ve IsClosed=1 ise satır kilitli + return ( + this.mode === 'edit' && + !!row.OrderLineID && + row.isClosed === true + ) + }, + + + findExistingIndexByForm(form) { + return this.orders.findIndex(r => this.isSameCombo(r, form)) + }, + + addRow(row) { + if (!row) return + + const existingIndex = this.orders.findIndex(r => { + const sameId = r.id && row.id && r.id === row.id + const sameCombo = this.isSameCombo(r, row) + return sameId || sameCombo + }) + + if (existingIndex !== -1) { + const old = this.orders[existingIndex] + this.orders[existingIndex] = { + ...old, + adet: Number(row.adet ?? old.adet ?? 0), + fiyat: Number(row.fiyat ?? old.fiyat ?? 0), + tutar: Number(row.fiyat ?? old.fiyat ?? 0) * Number(row.adet ?? old.adet ?? 0), + ItemDim1Code: row.ItemDim1Code || old.ItemDim1Code, + aciklama: row.aciklama || old.aciklama, + updatedAt: dayjs().toISOString() + } + console.log(`⚠️ Aynı kombinasyon bulundu, satır güncellendi: ${row.model} ${row.renk || ''} ${row.renk2 || ''}`) + } else { + this.orders.push(toRaw(row)) + console.log(`➕ Yeni kombinasyon eklendi: ${row.model} ${row.renk || ''} ${row.renk2 || ''}`) + } + + this.persistLocalStorage() + this.saveSnapshot('after-add') + }, + + updateRow(index, patch) { + if (index < 0 || index >= this.orders.length) return + this.orders[index] = { + ...this.orders[index], + ...toRaw(patch), + updatedAt: dayjs().toISOString() + } + this.persistLocalStorage() + this.saveSnapshot('after-update') + console.log(`✏️ Satır güncellendi (store): #${index}`) + }, + + + removeRow(index) { + if (index < 0 || index >= this.orders.length) return + + const removed = this.orders.splice(index, 1) + if (Array.isArray(this.summaryRows)) { + this.summaryRows.splice(index, 1) + } + + this.persistLocalStorage() + this.saveSnapshot('after-remove') + console.log(`🗑️ Satır silindi: ${removed[0]?.model || '(model yok)'}`) + }, + removeSelectedRow(row, $q = null) { + if (!row) return + + // 1) Kilitli satır silinemez + if (this.isRowLocked(row)) { + $q?.notify?.({ + type: 'warning', + message: '🔒 Bu satır (IsClosed=1) kapatılmış. Silinemez.' + }) + return false + } + + // 2) Kullanıcıya onay sor + return new Promise(resolve => { + $q?.dialog({ + title: 'Satır Sil', + message: `${row.model} / ${row.renk} / ${row.renk2} kombinasyonu silinsin mi?`, + ok: { label: 'Evet', color: 'negative' }, + cancel: { label: 'Vazgeç' } + }) + .onOk(() => { + this.removeRowInternal(row) + resolve(true) + }) + .onCancel(() => resolve(false)) + }) + } + , + removeRowInternal(row) { + if (!row) return false + + // 1️⃣ Kilit kontrolü + if (this.isRowLocked(row)) { + console.warn('🔒 Kilitli satır silinemez.') + return false + } + + const getKey = + typeof this.getRowKey === 'function' + ? this.getRowKey + : (r => r?.clientKey || r?.id || r?.OrderLineID) + + const rowKey = getKey(row) + if (!rowKey) return false + + const idx = this.summaryRows.findIndex(r => getKey(r) === rowKey) + if (idx === -1) return false + + console.log('🗑️ X2 removeRowInternal →', row) + + // 🔐 UI BUSY + this._uiBusy = true + this.preventPersist = true + + try { + // 2️⃣ UI’dan kaldır + this.summaryRows.splice(idx, 1) + + // orders = UI satırları (temiz kopya) + this.orders = [...this.summaryRows] + + // 3️⃣ EDIT MODE → DELETE SİNYALİ + if (this.mode === 'edit') { + const grpKey = + row.grpKey || + Object.keys(row.bedenMap || {})[0] || + 'tak' + + // ✅ lineIdMap referansı (varsa) + const lineIdMap = + (row.lineIdMap && typeof row.lineIdMap === 'object') + ? { ...row.lineIdMap } + : {} + + const emptyMap = {} + + // Öncelik: bedenMap[grpKey] → lineIdMap → fallback + if (row.bedenMap && row.bedenMap[grpKey]) { + for (const beden of Object.keys(row.bedenMap[grpKey] || {})) { + emptyMap[beden] = 0 + } + } else if (Object.keys(lineIdMap).length) { + for (const beden of Object.keys(lineIdMap)) { + emptyMap[beden] = 0 + } + } else { + emptyMap['STD'] = 0 + } + + const deleteSignalRow = { + ...row, + + // 🔴 UI KEY + id: `DEL::${row.id || row.OrderLineID || crypto.randomUUID()}`, + + // 🔴 BACKEND DELETE SIGNAL + adet: 0, + Qty1: 0, + tutar: 0, + + // 🔴 CRITICAL: duplicate guard'a girmesin + ComboKey: '', + + // 🔴 legacy tekil alan (varsa kalsın) + OrderLineID: row.OrderLineID || null, + + // ✅ CRITICAL + grpKey, + bedenMap: { [grpKey]: emptyMap }, + lineIdMap, + comboLineIds: { ...(row.comboLineIds || {}) }, + + _deleteSignal: true + } + + console.log('📡 DELETE sinyali üretildi:', deleteSignalRow) + + this.orders.push(deleteSignalRow) + } + + // 4️⃣ Totals (persist YOK) + this.updateHeaderTotals?.() + + } finally { + // 🔓 GUARD KAPAT + this.preventPersist = false + this._uiBusy = false + } + + // 5️⃣ TEK VE KONTROLLÜ persist + this.persistLocalStorage() + + return true + } + + , + + + /* =========================================================== + 📦 normalizeOrderLines (v9 — lineIdMap FIXED + AKSBİR SAFE) + ----------------------------------------------------------- + ✔ grpKey SADECE burada set edilir + ✔ detectBedenGroup SADECE store’da kullanılır + ✔ aksbir → ' ' bedeni = GERÇEK adet + ✔ backend satırlarında BEDEN → OrderLineID map’i üretilir + =========================================================== */ + normalizeOrderLines(lines, pbFallback = 'USD') { + if (!Array.isArray(lines)) return [] + + const merged = Object.create(null) + + const makeBaseKey = (model, renk, renk2) => + `${model || ''}||${renk || ''}||${renk2 || ''}` + + for (const raw of lines) { + if (!raw) continue + + const isClosed = + raw.IsClosed === true || + raw.isClosed === true || + raw.IsClosed?.Bool === true + + /* ======================================================= + 1️⃣ UI / SNAPSHOT KAYNAKLI SATIR + ------------------------------------------------------- + ✔ ComboKey YOK + ✔ Sadece model / renk / renk2 bazında gruplanır + ======================================================= */ + if (raw.bedenMap && Object.keys(raw.bedenMap).length) { + const model = (raw.model || raw.ItemCode || '').trim() + const renk = (raw.renk || raw.ColorCode || '').trim() + const renk2 = (raw.renk2 || raw.ItemDim2Code || '').trim() + + // ❗ BEDEN YOK → bu SADECE üst seviye grup anahtarı + const modelKey = `${model}||${renk}||${renk2}` + + const grpKey = raw.grpKey || 'tak' + const srcMap = raw.bedenMap[grpKey] || {} + + const adet = Object.values(srcMap).reduce((a, b) => a + (Number(b) || 0), 0) + const fiyat = Number(raw.fiyat || 0) + const pb = raw.pb || raw.DocCurrencyCode || pbFallback + const tutar = Number(raw.tutar ?? adet * fiyat) + + merged[modelKey] ??= [] + merged[modelKey].push({ + ...raw, + grpKey, + bedenMap: { [grpKey]: { ...srcMap } }, + adet, + fiyat, + pb, + tutar, + isClosed + }) + continue + } + + + /* ======================================================= + 2️⃣ BACKEND / LEGACY SATIR (FIXED) + ------------------------------------------------------- + ✔ ComboKey YOK + ✔ Sadece model / renk / renk2 bazlı gruplanır + ✔ BEDEN sadece bedenMap + lineIdMap için kullanılır + ======================================================= */ + const model = (raw.Model || raw.ItemCode || '').trim() + const renk = (raw.ColorCode || '').trim() + const renk2 = (raw.ItemDim2Code || '').trim() + + // ❗ BEDEN HARİÇ — üst seviye grup anahtarı + const modelKey = `${model}||${renk}||${renk2}` + + merged[modelKey] ??= [] + + const beden = ( + raw.ItemDim1Code == null || String(raw.ItemDim1Code).trim() === '' + ? ' ' + : String(raw.ItemDim1Code).trim().toUpperCase() + ) + + const qty = Number(raw.Qty1 || raw.Qty || 0) + + let entry = merged[modelKey][0] + if (!entry) { + entry = { + id: raw.OrderLineID || crypto.randomUUID(), + + model, + renk, + renk2, + + urunAnaGrubu: raw.UrunAnaGrubu || 'GENEL', + urunAltGrubu: raw.UrunAltGrubu || '', + kategori: raw.Kategori || '', + + aciklama: raw.LineDescription || '', + fiyat: Number(raw.Price || 0), + pb: raw.DocCurrencyCode || pbFallback, + + __tmpMap: {}, // beden → qty + lineIdMap: {}, // beden → OrderLineID + + adet: 0, + tutar: 0, + + terminTarihi: raw.DeliveryDate || null, + isClosed + } + + merged[modelKey].push(entry) + } + + /* ------------------------------------------------------- + 🔑 BEDEN → OrderLineID (DETERMINISTIC & SAFE) + -------------------------------------------------------- */ + const rawLineId = + raw.OrderLineID || + raw.OrderLineId || + raw.orderLineID || + null + + if (rawLineId) { + entry.lineIdMap[beden] = String(rawLineId) + } + + if (qty > 0) { + entry.__tmpMap[beden] = (entry.__tmpMap[beden] || 0) + qty + entry.adet += qty + entry.tutar += qty * entry.fiyat + } + } + + /* ======================================================= + 3️⃣ FINAL — grpKey KESİN + AKSBİR FIX + ======================================================= */ + const out = [] + + for (const rows of Object.values(merged)) { + for (const row of rows) { + if (!row.__tmpMap) { + out.push(row) + continue + } + + const bedenList = Object.keys(row.__tmpMap) + + // 🔒 TEK VE KESİN KARAR + const grpKey = detectBedenGroup( + bedenList, + row.urunAnaGrubu, + row.kategori + ) + + row.grpKey = grpKey + row.bedenMap = { [grpKey]: { ...row.__tmpMap } } + + /* =================================================== + 🔒 AKSBİR — BOŞLUK BEDEN GERÇEK ADETİ ALIR + ❗ STD’ye dönme YOK + ❗ 0 yazma YOK + =================================================== */ + if (grpKey === 'aksbir') { + row.bedenMap[grpKey] ??= {} + row.bedenMap[grpKey][' '] = Number(row.adet || 0) + } + + delete row.__tmpMap + out.push(row) + } + } + + console.log( + `📦 normalizeOrderLines (v9 + lineIdMap) → ${out.length} satır` + ) + + return out + } + + , + + /** + * =========================================================== + * loadProductSizes — FINAL v4.2 (EDITOR SAFE) + * ----------------------------------------------------------- + * ✔ grpKey SADECE form.grpKey + * ✔ schemaMap TEK OTORİTE + * ✔ edit modda BEDEN LABEL DOKUNULMAZ + * ✔ ' ' (boş beden) korunur + * =========================================================== + */ + async loadProductSizes(form, forceRefresh = false, $q = null) { + if (!form?.model) return + + const store = this + const prevBusy = !!store._uiBusy + const prevPrevent = !!store.preventPersist + store._uiBusy = true + store.preventPersist = true + + try { + const grpKey = form.grpKey + if (!grpKey) { + console.warn('⛔ loadProductSizes iptal → grpKey yok') + return + } + + const colorKey = form.renk || 'nocolor' + const color2Key = form.renk2 || 'no2color' + const cacheKey = `${form.model}_${colorKey}_${color2Key}_${grpKey}` + + /* ======================================================= + ♻️ CACHE (LABEL DOKUNMADAN) + ======================================================= */ + if (!forceRefresh && sizeCache.value?.[cacheKey]) { + const cached = sizeCache.value[cacheKey] + bedenStock.value = [...cached.stockArray] + stockMap.value = { ...cached.stockMap } + console.log(`♻️ loadProductSizes CACHE → ${grpKey}`) + return + } + + /* ======================================================= + 📡 API + ======================================================= */ + const params = { code: form.model } + if (form.renk) params.color = form.renk + if (form.renk2) params.color2 = form.renk2 + + const res = await api.get('/product-colorsize', { params }) + const data = Array.isArray(res?.data) ? res.data : [] + + if (!data.length) { + bedenStock.value = [] + stockMap.value = {} + return + } + + /* ======================================================= + 📦 STOK MAP (' ' KORUNUR) + ======================================================= */ + const apiStockMap = {} + for (const x of data) { + const key = + x.item_dim1_code === null || x.item_dim1_code === '' + ? ' ' + : String(x.item_dim1_code) + apiStockMap[key] = Number(x.kullanilabilir_envanter ?? 0) + } + + const finalStockMap = {} + for (const lbl of form.bedenLabels) { + finalStockMap[lbl] = apiStockMap[lbl] ?? 0 + } + + stockMap.value = { ...finalStockMap } + bedenStock.value = Object.entries(stockMap.value).map( + ([beden, stok]) => ({ beden, stok }) + ) + + /* ======================================================= + 💾 CACHE + ======================================================= */ + sizeCache.value[cacheKey] = { + labels: [...form.bedenLabels], + stockArray: [...bedenStock.value], + stockMap: { ...stockMap.value } + } + + console.log(`✅ loadProductSizes FINAL v4.2 → ${grpKey}`) + } catch (err) { + console.error('❌ loadProductSizes hata:', err) + $q?.notify?.({ type: 'negative', message: 'Beden / stok alınamadı' }) + } finally { + store._uiBusy = prevBusy + store.preventPersist = prevPrevent + console.log('🧩 Editor beden hydrate', { + grpKey: form.grpKey, + labels: form.bedenLabels, + values: form.bedenler + }) + + } + } + + + + + , + + // ======================================================= +// 🔸 TOPLAM HESAPLAMA (store içi) — X3 SAFE +// ------------------------------------------------------- +// ✔ f.adet / f.tutar hesaplanır +// ✔ store.totalAmount ASLA set edilmez +// ✔ gerçek toplam → header.TotalAmount +// ======================================================= + updateTotals(f) { + // 1️⃣ Satır adet + f.adet = (f.bedenler || []).reduce( + (a, b) => a + Number(b || 0), + 0 + ) + + // 2️⃣ Satır tutar + const fiyat = Number(f.fiyat) || 0 + f.tutar = Number((f.adet * fiyat).toFixed(2)) + + // 3️⃣ Header toplam (tek gerçek state) + if (this.header) { + const total = (this.summaryRows || []).reduce( + (sum, r) => sum + Number(r?.tutar || 0), + 0 + ) + + this.header.TotalAmount = Number(total.toFixed(2)) + } + + return f + } + , + + // ======================================================= + // 🔸 GRUP ANAHTARI TESPİTİ + // ======================================================= + activeGroupKeyForRow(row) { + const g = (row?.urunAnaGrubu || '').toUpperCase() + if (g.includes('TAKIM')) return 'tak' + if (g.includes('PANTOLON')) return 'pan' + if (g.includes('GÖMLEK')) return 'gom' + if (g.includes('AYAKKABI')) return 'ayk' + if (g.includes('YAŞ')) return 'yas' + return 'tak' + }, + /* ======================================================= + 🔹 MODE YÖNETİMİ — new / edit arası geçiş +======================================================= */ + setMode(mode) { + if (!['new', 'edit', 'view'].includes(mode)) { + console.warn('⚠️ Geçersiz mode:', mode) + return + } + + this.mode = mode + console.log(`🧭 Order mode set edildi → ${mode}`) + } + , + /* =========================================================== + 🟦 submitAllReal (v12.1c — FINAL / CLEAN + PRE-VALIDATE) + ----------------------------------------------------------- + ✔ NEW → INSERT, EDIT → UPDATE (tek karar noktası) + ✔ Controlled submit → route guard SUSAR + ✔ Snapshot temizliği route öncesi + ✔ Kaydet → edit replace → backend reload + ✔ Listeye giderken guard popup 1 kez bypass + ✔ ✅ PRE-VALIDATE → prItemVariant olmayan kombinasyonlar kaydı DURDURUR + =========================================================== */ + async submitAllReal($q, router, form, summaryRows, productCache) { + let serverOrderId = null + let serverOrderNo = null + + try { + this.loading = true + + // 🔒 Kontrollü submit → route leave guard susar + this.isControlledSubmit = true + + const isNew = this.mode === 'new' + const { header, lines } = this.buildFinalOrderJson() + + // ======================================================= + // 🧾 DEBUG — FRONTEND → BACKEND GİDEN PAYLOAD + // ======================================================= + console.groupCollapsed( + `%c📤 ORDER PAYLOAD (${this.mode})`, + 'color:#c9a873;font-weight:bold' + ) + + console.log('HEADER:', JSON.parse(JSON.stringify(header))) + + lines.forEach((l, i) => { + console.log(`LINE[${i}]`, { + OrderLineID: l.OrderLineID, + ClientKey: l.ClientKey, + ItemCode: l.ItemCode, + ColorCode: l.ColorCode, + ItemDim1Code: l.ItemDim1Code, + ItemDim2Code: l.ItemDim2Code, + ItemDim3Code: l.ItemDim3Code, + Qty1: l.Qty1, + ComboKey: l.ComboKey + }) + }) + + console.groupEnd() + + // ======================================================= + // 🧾 DEBUG (opsiyonel helper) + // ======================================================= + this.debugOrderPayload?.(header, lines, 'PRE-VALIDATE') + + // ======================================================= + // 🧪 PRE-VALIDATE — prItemVariant ön kontrol + // - invalid varsa CREATE/UPDATE ÇALIŞMAZ + // ======================================================= + const v = await api.post('/order/validate', { header, lines }) + const invalid = v?.data?.invalid || [] + + if (invalid.length > 0) { + await this.showInvalidVariantDialog?.($q, invalid) + return // ❌ create / update ÇALIŞMAZ + } + + console.log('📤 submitAllReal payload', { + mode: this.mode, + lines: lines.length, + deletes: lines.filter(l => l._deleteSignal).length + }) + + /* ======================================================= + 🚀 API CALL — TEK NOKTA + ======================================================= */ + const resp = await api.post( + isNew ? '/order/create' : '/order/update', + { header, lines } + ) + + const data = resp?.data || {} + + serverOrderId = + data.orderID || + data.orderHeaderID || + data.id || + header?.OrderHeaderID + + serverOrderNo = + data.orderNumber || + data.orderNo || + header?.OrderNumber + + if (!serverOrderId) { + throw new Error('OrderHeaderID backend’den dönmedi') + } + + /* ======================================================= + 🔁 MODE SWITCH → EDIT + ======================================================= */ + this.setMode('edit') + + // Header patch (ID / No) + this.header = { + ...this.header, + OrderHeaderID: serverOrderId, + OrderNumber: serverOrderNo + } + + /* ======================================================= + 🧹 KRİTİK: Snapshot + Dirty temizliği + ❗ ROUTE değişmeden ÖNCE + ======================================================= */ + this.updateHeaderTotals?.() + this.markAsSaved?.() + + /* ======================================================= + 🧹 KRİTİK: NEW → EDIT geçişinde TÜM SNAPSHOT TEMİZLENİR + ======================================================= */ + this.clearAllOrderSnapshots() + + $q.notify({ + type: 'positive', + message: `Sipariş kaydedildi: ${serverOrderNo || ''}`.trim() + }) + + /* ======================================================= + 🔀 ROUTE REPLACE (EDIT MODE) + - aynı sayfa → param değişti + - guard 1 kez bypass + ======================================================= */ + this.allowRouteLeaveOnce = true + + await router.replace({ + name: 'order-entry', + params: { orderHeaderID: serverOrderId }, + query: { mode: 'edit', source: 'backend' } + }) + + /* ======================================================= + 🔄 BACKEND RELOAD (TEK GERÇEK KAYNAK) + ======================================================= */ + await this.openExistingForEdit(serverOrderId, { + $q, + form, + summaryRowsRef: summaryRows, + productCache + }) + + /* ======================================================= + ❓ USER NEXT STEP + ======================================================= */ + const choice = await new Promise(resolve => { + $q.dialog({ + title: 'Sipariş Kaydedildi', + options: { + type: 'radio', + model: 'continue', + items: [ + { label: '✏️ Düzenlemeye Devam', value: 'continue' }, + { label: '🖨 Yazdır', value: 'print' }, + { label: '📋 Listeye Dön', value: 'list' } + ] + }, + ok: { label: 'Seç' }, + cancel: { label: 'Kapat' } + }) + .onOk(v => resolve(v)) + .onCancel(() => resolve('continue')) + }) + + /* ======================================================= + 🧭 USER ROUTING + ======================================================= */ + if (choice === 'print') { + const id = this.header?.OrderHeaderID || serverOrderId + if (id) await this.downloadOrderPdf(id) + return + } + + if (choice === 'list') { + this.allowRouteLeaveOnce = true + await router.push({ name: 'order-list' }) + return + } + + // continue → sayfada kal (hiçbir şey yapma) + + } catch (err) { + console.error('❌ submitAllReal:', err) + + $q.notify({ + type: 'negative', + message: + err?.response?.data?.message || + err?.message || + 'Kayıt sırasında hata' + }) + + } finally { + // 🔓 Guard’lar normale dönsün + this.isControlledSubmit = false + this.loading = false + } + } + + , + + /* ======================================================= + 🧪 SUBMIT ALL TEST + ======================================================= */ + async submitAllTest($q = null) { + try { + const { header, lines } = this.buildFinalOrderJson() + + console.log('🧾 TEST HEADER', Object.keys(header).length, 'alan') + console.log(JSON.stringify(header, null, 2)) + + console.log('🧾 TEST LINES', lines.length, 'satır') + console.log(JSON.stringify(lines, null, 2)) + + $q?.notify?.({ + type: 'info', + message: `Header (${Object.keys(header).length}) + Lines (${lines.length}) gösterildi`, + position: 'top' + }) + } catch (err) { + console.error('❌ submitAllTest hata:', err) + $q?.notify?.({ + type: 'negative', + message: 'Gösterimde hata oluştu ❌', + position: 'top' + }) + } + }, + + + /* ======================================================= + 🧹 KAYIT SONRASI TEMİZLİK + ======================================================= */ + afterSubmit(opts = { + keepLocalStorage: true, + backendPayload: null, + resetMode: true // 🔑 yeni + }) { + try { + console.log('🧹 afterSubmit başlatıldı', opts) + + if (opts?.backendPayload?.header?.OrderHeaderID) { + this.mergeAndPersistBackendOrder( + opts.backendPayload.header.OrderHeaderID, + opts.backendPayload + ) + } + + if (!opts?.keepLocalStorage) { + this.clearStorage() + this.clearTransaction() + } else { + this.saveSnapshot() + } + + this.orders = [] + this.header = {} + this.editingKey = null + this.currentOrderId = null + + // 🔐 MODE RESET OPSİYONEL + if (opts.resetMode === true) { + this.mode = 'new' + } + + console.log('✅ afterSubmit tamamlandı.') + } catch (err) { + console.error('❌ afterSubmit hata:', err) + } + } + + , + + + /* =========================================================== + 🟦 BUILD FINAL ORDER JSON — SAFE v26.1 (FINAL) + ----------------------------------------------------------- + ✔ ComboKey TEK OTORİTE → buildComboKey (bedenKey ile) + ✔ UI/Map placeholder: '_' (bedenKey) + ✔ DB/payload: '' (bedenPayload) → "_" ASLA GİTMEZ + ✔ payload içinde aynı ComboKey TEK satır + ✔ backend duplicate guard %100 uyumlu (ComboKey stabil) + ✔ Final assert: payload’da "_" yakalanırsa patlatır + =========================================================== */ + buildFinalOrderJson () { + const auth = useAuthStore() + const u = auth?.user || {} + const now = dayjs() + + /* ========================= + HELPERS + ========================== */ + const toNum = v => Number(v) || 0 + const safeStr = v => (v == null ? '' : String(v).trim()) + + const formatDateOnly = v => (v ? dayjs(v).format('YYYY-MM-DD') : null) + const formatTimeOnly = v => dayjs(v).format('HH:mm:ss') + const formatDateTime = v => (v ? dayjs(v).format('YYYY-MM-DD HH:mm:ss') : null) + + // ✅ Payload beden normalize: "_" / "-" / "" => '' + const normBeden = (v) => { + const s = safeStr(v) + if (s === '' || s === '_' || s === '-') return '' // payload empty + return s + } + + /* ========================= + USER META + ========================== */ + const group = safeStr(u?.v3usergroup) + const v3name = safeStr(u?.v3_username) + const who = (group && v3name) ? `${group} ${v3name}` : (v3name || 'BSS') + + const PCT_CODE_ZERO = '%0' + const VAT_CODE_ZERO = '%0' + + /* ========================= + HEADER + ========================== */ + const headerId = this.header?.OrderHeaderID || crypto.randomUUID() + const docCurrency = safeStr(this.header?.DocCurrencyCode) || 'TRY' + const exRate = toNum(this.header?.ExchangeRate) || 1 + + const avgDueSource = + this.header?.AverageDueDate || + dayjs(this.header?.OrderDate || now).add(14, 'day') + + const header = { + ...this.header, + + OrderHeaderID: headerId, + OrderDate: formatDateOnly(this.header?.OrderDate || now), + OrderTime: formatTimeOnly(now), + AverageDueDate: formatDateOnly(avgDueSource), + + DocCurrencyCode: docCurrency, + LocalCurrencyCode: safeStr(this.header?.LocalCurrencyCode) || 'TRY', + ExchangeRate: exRate, + + CreatedUserName: + this.mode === 'edit' + ? (this.header?.CreatedUserName || who) + : who, + + CreatedDate: + this.mode === 'edit' + ? formatDateTime(this.header?.CreatedDate || now) + : formatDateTime(now), + + LastUpdatedUserName: who, + LastUpdatedDate: formatDateTime(now) + } + + /* ======================================================= + LINES — COMBOKEY AGGREGATE (TEK MAP) + ======================================================= */ + const lines = [] + const lineByCombo = new Map() // 🔒 KEY = ComboKey + + const pushOrMerge = (row, ctx) => { + const { + grpKey, + bedenKey, // ✅ sadece ComboKey / Map için ('_' olabilir) + bedenPayload, // ✅ DB için ('' / 'S' / 'M' ...) + qty, + orderLineId, + isDeleteSignal + } = ctx + + if (qty <= 0 && !isDeleteSignal) return + + // ComboKey stabil kalsın diye bedenKey kullan + const comboKey = buildComboKey(row, bedenKey) + + const makeLine = () => ({ + OrderLineID: orderLineId || '', + ClientKey: makeLineClientKey(row, grpKey, bedenKey), + ComboKey: comboKey, + + SortOrder: 0, + ItemTypeCode: 1, + + ItemCode: safeStr(row.model), + ColorCode: safeStr(row.renk), + + // ✅ PAYLOAD: "_" ASLA YOK + ItemDim1Code: bedenPayload, + + ItemDim2Code: safeStr(row.renk2), + ItemDim3Code: '', + + Qty1: isDeleteSignal ? 0 : qty, + Qty2: 0, + + CancelQty1: 0, + CancelQty2: 0, + + DeliveryDate: row.terminTarihi + ? formatDateTime(row.terminTarihi) + : null, + + PlannedDateOfLading: row.terminTarihi + ? formatDateOnly(row.terminTarihi) + : null, + + LineDescription: safeStr(row.aciklama), + UsedBarcode: '', + CostCenterCode: '', + + VatCode: VAT_CODE_ZERO, + VatRate: toNum(row.vatRate ?? row.VatRate ?? 0), + + PCTCode: PCT_CODE_ZERO, + PCTRate: 0, + + LDisRate1: 0, + LDisRate2: 0, + LDisRate3: 0, + LDisRate4: 0, + LDisRate5: 0, + + DocCurrencyCode: header.DocCurrencyCode, + PriceCurrencyCode: header.DocCurrencyCode, + PriceExchangeRate: toNum(header.ExchangeRate), + Price: toNum(row.fiyat), + + BaseProcessCode: 'WS', + BaseOrderNumber: header.OrderNumber, + BaseCustomerTypeCode: 0, + BaseCustomerCode: header.CurrAccCode, + BaseSubCurrAccID: null, + BaseStoreCode: '', + + OrderHeaderID: headerId, + + CreatedUserName: who, + CreatedDate: formatDateTime(row.CreatedDate || now), + LastUpdatedUserName: who, + LastUpdatedDate: formatDateTime(now), + + SurplusOrderQtyToleranceRate: 0, + WithHoldingTaxTypeCode: '', + DOVCode: '' + }) + + const existing = lineByCombo.get(comboKey) + + if (!existing) { + const ln = makeLine() + lineByCombo.set(comboKey, ln) + lines.push(ln) + return + } + + /* DELETE */ + if (isDeleteSignal) { + if (orderLineId && !existing.OrderLineID) { + existing.OrderLineID = orderLineId + } + existing.Qty1 = 0 + return + } + + /* MERGE */ + existing.Qty1 += qty + + if (this.mode === 'edit' && orderLineId && !existing.OrderLineID) { + existing.OrderLineID = orderLineId + } + + existing.Price = toNum(row.fiyat) + } + + /* ======================================================= + ORDER ROW LOOP + ======================================================= */ + for (const row of this.orders || []) { + if (row?.isClosed === true) continue + + const grpKey = + row.grpKey || + Object.keys(row.bedenMap || {})[0] || + 'GENEL' + + const lineIdMap = row.lineIdMap || {} + + const grouped = row.bedenMap?.[grpKey] + const flat = + (row.bedenMap && typeof row.bedenMap === 'object' && !grouped) + ? row.bedenMap + : null + + const map = grouped || flat + const hasAnyBeden = + map && typeof map === 'object' && Object.keys(map).length > 0 + + /* 🔹 BEDENSİZ / AKSBİR */ + if (!hasAnyBeden) { + const qty = toNum(row.qty ?? row.Qty1 ?? row.miktar ?? 0) + + // ✅ ComboKey stabil: bedenKey = '_' + const bedenKey = '_' + // ✅ Payload: boş string + const bedenPayload = '' + + let orderLineId = '' + if (this.mode === 'edit') { + // lineIdMap burada '_' ile tutuluyorsa onu da oku + orderLineId = + safeStr(lineIdMap?.[bedenKey]) || + safeStr(lineIdMap?.[bedenPayload]) || + safeStr(row.OrderLineID) + } + + pushOrMerge(row, { + grpKey, + bedenKey, + bedenPayload, + qty, + orderLineId, + isDeleteSignal: row._deleteSignal === true && !!orderLineId + }) + continue + } + + /* 🔹 BEDENLİ */ + for (const [bedenRaw, qtyRaw] of Object.entries(map)) { + const qty = toNum(qtyRaw) + + // ✅ payload beden: '' / 'S' / 'M' ... + const bedenPayload = normBeden(bedenRaw) + // ✅ combokey beden: boşsa '_' ile stabil kalsın + const bedenKey = bedenPayload || '_' + + let orderLineId = '' + if (this.mode === 'edit') { + // lineIdMap anahtarı sizde hangi bedenle tutuluyorsa ikisini de dene + orderLineId = + safeStr(lineIdMap?.[bedenKey]) || + safeStr(lineIdMap?.[bedenPayload]) || + (Object.keys(map).length === 1 + ? safeStr(row.OrderLineID) + : '') + } + + pushOrMerge(row, { + grpKey, + bedenKey, + bedenPayload, + qty, + orderLineId, + isDeleteSignal: row._deleteSignal === true && !!orderLineId + }) + } + } + + /* ======================================================= + FINAL SORT + ======================================================= */ + lines.forEach((ln, i) => { ln.SortOrder = i + 1 }) + + /* ======================================================= + ASSERT — payload’da "_" OLAMAZ + ======================================================= */ + if (lines.some(l => (l.ItemDim1Code || '') === '_' )) { + console.error('❌ Payload’da "_" yakalandı', lines.filter(l => l.ItemDim1Code === '_')) + throw new Error('Payload ItemDim1Code "_" olamaz') + } + /* ======================================================= + 🔍 DEBUG — BUILD FINAL ORDER JSON OUTPUT + ======================================================= */ + console.groupCollapsed('%c📦 BUILD FINAL ORDER JSON', 'color:#c9a873;font-weight:bold') + + console.log('🧾 HEADER:', header) + + console.table( + lines.map((l, i) => ({ + i: i + 1, + OrderLineID: l.OrderLineID, + ClientKey: l.ClientKey, + ComboKey: l.ComboKey, + ItemCode: l.ItemCode, + ColorCode: l.ColorCode, + ItemDim1Code: JSON.stringify(l.ItemDim1Code), // <-- kritik + ItemDim2Code: l.ItemDim2Code, + Qty1: l.Qty1, + Price: l.Price + })) + ) + + console.groupEnd() + + return { header, lines } + } + + + + + + + + ,/* =========================================================== + ✅ STORE ACTIONS — FIXED HELPERS + - setRowErrorByClientKey + - clearRowErrorByClientKey + - applyTerminToRowsIfEmpty +=========================================================== */ + setRowErrorByClientKey(clientKey, payload) { + if (!clientKey) return + if (!Array.isArray(this.summaryRows)) return + + const row = this.summaryRows.find(r => r?.clientKey === clientKey) + if (!row) return + + row._error = { + code: payload?.code, + message: payload?.message + } + }, + + clearRowErrorByClientKey(clientKey) { + if (!clientKey) return + if (!Array.isArray(this.summaryRows)) return + + const row = this.summaryRows.find(r => r?.clientKey === clientKey) + if (!row) return + + if (row._error) { + delete row._error + } + }, + + applyTerminToRowsIfEmpty(dateStr) { + if (!dateStr) return + if (!Array.isArray(this.summaryRows)) return + + // ❗ reassign YOK — patch/mutate + for (const r of this.summaryRows) { + if (!r?.terminTarihi || r.terminTarihi === '') { + r.terminTarihi = dateStr + } + } + + // opsiyonel ama genelde doğru: + this.persistLocalStorage?.() + } + + + + + + + + + + + + + + } // actions sonu +}) // defineStore sonu + + +/* =========================================================== + 🔹 BEDEN LABEL NORMALİZASYONU (exported helper) + =========================================================== */ +export function normalizeBedenLabel(v) { + if (v === null || v === undefined) return ' ' + let s = String(v).trim() + if (s === '') return ' ' + // 44R, 50L vb. son ekleri at + s = s.replace(/(^\d+)\s*[A-Z]?$/i, '$1') + s = s.toUpperCase() + + // harfli bedenlerin normalizasyonu + const map = { + 'XS': 'XS', 'S': 'S', 'M': 'M', 'L': 'L', 'XL': 'XL', + 'XXL': '2XL', '2XL': '2XL', '3XL': '3XL', '4XL': '4XL', + '5XL': '5XL', '6XL': '6XL', '7XL': '7XL', 'STD': 'STD' + } + if (map[s]) return map[s] + + // tamamen sayıysa string olarak döndür + if (/^\d+$/.test(s)) return s + + // virgüllü değer geldiyse ilkini al + if (s.includes(',')) return s.split(',')[0].trim() + return s +} + +/* =========================================================== + 🔹 BEDEN GRUBU ALGILAMA HELPER’I + ----------------------------------------------------------- + Gelen beden listesini, ürün grubu/kategori bilgisine göre + doğru grup anahtarına dönüştürür (ayk, yas, pan, gom, tak, aksbir). + ----------------------------------------------------------- +=========================================================== */ +export function detectBedenGroup(bedenList, urunAnaGrubu = '', urunKategori = '') { + const list = Array.isArray(bedenList) && bedenList.length > 0 + ? bedenList.map(v => (v || '').toString().trim().toUpperCase()) + : [' '] + + const ana = (urunAnaGrubu || '') + .toUpperCase() + .trim() + .replace(/\(.*?\)/g, '') + .replace(/[^A-ZÇĞİÖŞÜ0-9\s]/g, '') + .replace(/\s+/g, ' ') + + const kat = (urunKategori || '').toUpperCase().trim() +// 🔸 Aksesuar ise "aksbir" + const aksesuarGruplari = [ + 'AKSESUAR','KRAVAT','PAPYON','KEMER','CORAP','ÇORAP', + 'FULAR','MENDIL','MENDİL','KASKOL','ASKI', + 'YAKA','KOL DUGMESI','KOL DÜĞMESİ' + ] + const giyimGruplari = ['GÖMLEK','CEKET','PANTOLON','MONT','YELEK','TAKIM','TSHIRT','TİŞÖRT'] + // 🔸 Pantolon özel durumu + if ( + aksesuarGruplari.some(g => ana.includes(g) || kat.includes(g)) && + !giyimGruplari.some(g => ana.includes(g)) + ) return 'aksbir' + + if (ana.includes('PANTOLON') && kat.includes('YETİŞKİN')) return 'pan' + // 🔸 Tamamen numerik (örneğin 39-44 arası) → ayakkabı + const allNumeric = list.every(v => /^\d+$/.test(v)) + if (allNumeric) { + const nums = list.map(v => parseInt(v, 10)).filter(Boolean) + const diffs = nums.slice(1).map((v, i) => v - nums[i]) + if (diffs.every(d => d === 1) && nums[0] >= 35 && nums[0] <= 46) return 'ayk' + } + + // 🔸 Yaş grubu (çocuk/garson) + if (kat.includes('GARSON') || kat.includes('ÇOCUK')) return 'yas' + + // 🔸 Harfli beden varsa doğrudan "gom" (gömlek, üst giyim) + const harfliBedenler = ['XS','S','M','L','XL','XXL','3XL','4XL'] + if (list.some(b => harfliBedenler.includes(b))) return 'gom' + + + + + // 🔸 Varsayılan: takım elbise + return 'tak' +} + +export function toSummaryRowFromForm(form) { + if (!form) return null + + const grpKey = form.grpKey || 'tak' + const bedenMap = {} + + const labels = Array.isArray(form.bedenLabels) ? form.bedenLabels : [] + const values = Array.isArray(form.bedenler) ? form.bedenler : [] + + for (let i = 0; i < labels.length; i++) { + const rawLbl = labels[i] + const lbl = + rawLbl == null || String(rawLbl).trim() === '' + ? ' ' + : String(rawLbl).trim() + + const val = Number(values[i] || 0) + if (val > 0) { + bedenMap[lbl] = val + } + } + + return { + id: form.id || newGuid(), + OrderLineID: form.OrderLineID || null, + + model: form.model || '', + renk: form.renk || '', + renk2: form.renk2 || '', + + urunAnaGrubu: form.urunAnaGrubu || '', + urunAltGrubu: form.urunAltGrubu || '', + aciklama: form.aciklama || '', + + fiyat: Number(form.fiyat || 0), + pb: form.pb || 'USD', + + adet: Number(form.adet || 0), + tutar: Number(form.tutar || 0), + + grpKey, + bedenMap: { + [grpKey]: { ...bedenMap } + }, + + terminTarihi: (form.terminTarihi || '').substring(0, 10) + } +} + + + + +/* =========================================================== + 🔹 TOPLAM HESAPLAMA (EXPORT) + ----------------------------------------------------------- + Hem store içinde hem de component tarafında kullanılabilir. +=========================================================== */ +export function updateTotals(f) { + f.adet = (f.bedenler || []).reduce((a, b) => a + Number(b || 0), 0) + const fiyat = Number(f.fiyat) || 0 + f.tutar = (f.adet * fiyat).toFixed(2) + return f +} + +/* =========================================================== + 🔹 EXPORT SET — Tek Merkezli Dışa Aktarımlar + =========================================================== */ + +/** + * 🧩 Shared Reactive Refs + * ----------------------------------------------------------- + * import { sharedOrderEntryRefs } from 'src/stores/orderentryStore' + * const { stockMap, bedenStock, sizeCache } = sharedOrderEntryRefs + */ +export const sharedOrderEntryRefs = { + stockMap, + bedenStock, + sizeCache, + + +} + diff --git a/ui/src/stores/permissionStore.js b/ui/src/stores/permissionStore.js new file mode 100644 index 0000000..6fb2fb4 --- /dev/null +++ b/ui/src/stores/permissionStore.js @@ -0,0 +1,182 @@ +import { defineStore } from 'pinia' +import api from 'src/services/api' +import { useAuthStore } from 'stores/authStore' + + +export const usePermissionStore = defineStore('permission', { + + state: () => ({ + + // API route yetkileri + routes: [], + + // module+action matrix + matrix: [], + + loaded: false + }), + + + getters: { + + /* ================= ADMIN ================= */ + + isAdmin () { + const auth = useAuthStore() + return auth.isAdmin === true + }, + + + /* ================= API ROUTE ================= */ + + hasApiPermission: (state) => (apiPathOrPerm) => { + + const auth = useAuthStore() + + if (auth.isAdmin) return true + if (!state.loaded) return false + if (!apiPathOrPerm) return true + + + // ============================ + // 1️⃣ MODULE:ACTION GELDİYSE + // ============================ + + if (apiPathOrPerm.includes(':')) { + + const [module, action] = apiPathOrPerm.split(':') + + return state.matrix.some(p => + p.module === module && + p.action === action && + p.allowed === true + ) + } + + + // ============================ + // 2️⃣ API PATH GELDİYSE + // =========================== + + + const apiPath = apiPathOrPerm + + + // exact match + if (state.routes.some(p => + p.route === apiPath && p.can_access + )) { + return true + } + + + // /{id} normalize + const normalized = apiPath + .replace(/\/\d+/g, '/{id}') + + + if (state.routes.some(p => + p.route === normalized && p.can_access + )) { + return true + } + + + // prefix + return state.routes.some(p => + p.can_access && apiPath.startsWith(p.route) + ) + }, + + + /* ================= MODULE ================= */ + + hasModule: (state) => (module) => { + + const auth = useAuthStore() + + if (auth.isAdmin) return true + if (!state.loaded) return false + + return state.matrix.some(p => + p.module === module && + p.allowed === true + ) + }, + + + /* ================= ACTION ================= */ + + hasPermission: (state) => (module, action) => { + + const auth = useAuthStore() + + if (auth.isAdmin) return true + if (!state.loaded) return false + + return state.matrix.some(p => + p.module === module && + p.action === action && + p.allowed === true + ) + } + }, + + + actions: { + + async fetchPermissions () { + + const auth = useAuthStore() + + if (auth.isAdmin) { + + this.routes = [] + this.matrix = [] + this.loaded = true + + return + } + + + try { + + // API ROUTES + const routesRes = await api.get('/permissions/routes') + this.routes = routesRes.data || [] + + + // EFFECTIVE MATRIX + const effRes = await api.get('/permissions/effective') + this.matrix = effRes.data || [] + console.group('🔐 PERMISSION DEBUG') + + console.log('API ROUTES:', this.routes) + console.log('EFFECTIVE MATRIX:', this.matrix) + + console.groupEnd() + + + } catch (err) { + + console.error('❌ Permission load failed', err) + + this.routes = [] + this.matrix = [] + + + } finally { + + this.loaded = true + } + }, + + + clear () { + + this.routes = [] + this.matrix = [] + this.loaded = false + } + } +}) diff --git a/ui/src/stores/statementdetailStore.js b/ui/src/stores/statementdetailStore.js new file mode 100644 index 0000000..056cfa8 --- /dev/null +++ b/ui/src/stores/statementdetailStore.js @@ -0,0 +1,66 @@ +// src/stores/statementdetailStore.js +import { defineStore } from 'pinia' +import api from 'src/services/api' + +export const useStatementdetailStore = defineStore('statementdetail', { + state: () => ({ + details: [], + loading: false, + error: null + }), + + actions: { + async loadDetails ({ accountCode, startDate, endDate, parislemler }) { + if (!accountCode) { + this.error = 'Geçerli bir cari kod seçilmedi.' + return + } + + this.loading = true + this.error = null + + try { + // ✅ Params (arrayFormat=repeat global) + const params = { + startdate: startDate, + enddate: endDate + } + + if (Array.isArray(parislemler) && parislemler.length > 0) { + params.parislemler = parislemler.filter( + p => p !== undefined && p !== null && p !== '' + ) + } + + // 🔐 TOKEN + SERIALIZER + ERROR HANDLING OTOMATİK + const res = await api.get( + `/statements/${accountCode}/details`, + { params } + ) + + this.details = res.data || [] + + } catch (err) { + console.error('❌ Details yüklenemedi:', err) + this.error = + err?.data?.message || + err?.message || + 'Detaylar yüklenemedi' + } finally { + this.loading = false + } + }, + + getDetailsByBelge (belgeNo) { + return this.details.filter( + d => d.belge_ref_numarasi === belgeNo + ) + }, + + reset () { + this.details = [] + this.loading = false + this.error = null + } + } +}) diff --git a/ui/src/stores/statementheaderStore.js b/ui/src/stores/statementheaderStore.js new file mode 100644 index 0000000..609256c --- /dev/null +++ b/ui/src/stores/statementheaderStore.js @@ -0,0 +1,163 @@ +// src/stores/statementheaderStore.js +import { defineStore } from 'pinia' +import api from 'src/services/api' +import qs from 'qs' +import dayjs from 'src/boot/dayjs' + +export const useStatementheaderStore = defineStore('statementheader', { + state: () => ({ + headers: [], // Ana tablo verileri + details: {}, // Alt tablolar (belge bazlı) + loading: false, // Yükleme durumu + groupOpen: {} // Para birimi bazlı aç/kapa durumu + }), + + getters: { + // 🔹 Benzersiz para birimleri listesi + currencies(state) { + const set = new Set() + for (const r of state.headers) { + set.add(r.para_birimi || '—') + } + return Array.from(set).sort() + }, + + // 🔹 Her para birimi için toplam borç / alacak / bakiye + totalsByCurrency(state) { + const out = {} + + for (const r of state.headers) { + const k = r.para_birimi || '—' + if (!out[k]) { + out[k] = { borc: 0, alacak: 0, bakiye: 0, count: 0 } + } + + out[k].borc += Number(r.borc) || 0 + out[k].alacak += Number(r.alacak) || 0 + out[k].bakiye += Number(r.bakiye) || 0 + out[k].count += 1 + } + + return out + }, + + // 🔹 QTable için satırlar (group + data) + groupedRows: (state) => { + const grouped = {} + + for (const row of state.headers) { + const k = row.para_birimi || '—' + if (!grouped[k]) grouped[k] = [] + grouped[k].push(row) + } + + const output = [] + + for (const [currency, rows] of Object.entries(grouped)) { + if (!rows.length) continue + + // 📅 Tarihe göre sırala + const sorted = [...rows].sort( + (a, b) => new Date(a.belge_tarihi) - new Date(b.belge_tarihi) + ) + + const lastRow = sorted.at(-1) + const lastBalance = + lastRow && lastRow.bakiye != null + ? Number(lastRow.bakiye) + : 0 + + // 🔹 Grup satırı + output.push({ + _type: 'group', + para_birimi: currency, + sonBakiye: lastBalance + }) + + // 🔹 Alt satırlar + if (state.groupOpen[currency] !== false) { + sorted.forEach(r => { + output.push({ ...r, _type: 'data' }) + }) + } + } + + return output + } + }, + + actions: { + /* ========================================================== + 🔄 ANA STATEMENT LİSTESİ + ========================================================== */ + async loadStatements(params = {}) { + this.loading = true + + try { + const { data } = await api.get( + '/statements', + { + params, + paramsSerializer: p => + qs.stringify(p, { arrayFormat: 'repeat' }) + } + ) + + this.headers = Array.isArray(data) ? data : [] + + + // 🔹 Yeni gelen para birimleri default açık + for (const k of this.currencies) { + if (!(k in this.groupOpen)) { + this.groupOpen[k] = true + } + } + } catch (err) { + console.error('❌ Statements yüklenemedi:', err) + this.headers = [] + } finally { + this.loading = false + } + }, + + /* ========================================================== + 📄 BELGE DETAYLARI + ========================================================== */ + async loadDetails(belgeNo) { + if (!belgeNo || this.details[belgeNo]) return + + try { + const { data } = await api.get( + `/statements/${belgeNo}/details` + ) + + this.details[belgeNo] = Array.isArray(data) ? data : [] + + + } catch (err) { + console.error('❌ Details yüklenemedi:', err) + this.details[belgeNo] = [] + } + }, + + /* ========================================================== + 🔘 GRUP AÇ / KAPA + ========================================================== */ + toggleGroup(currency) { + const key = currency || '—' + this.groupOpen[key] = !this.groupOpen[key] + }, + + openAllGroups() { + for (const k of this.currencies) { + this.groupOpen[k] = true + } + }, + + closeAllGroups() { + for (const k of this.currencies) { + this.groupOpen[k] = false + } + } + } +}) diff --git a/ui/src/stores/store-flag.d.ts b/ui/src/stores/store-flag.d.ts new file mode 100644 index 0000000..5a3d510 --- /dev/null +++ b/ui/src/stores/store-flag.d.ts @@ -0,0 +1,13 @@ +/* + WARNING: DO NOT MODIFY OR DELETE + This file is auto-generated by Quasar CLI + It's recommended to NOT .gitignore it + You don't have to use TypeScript in your project, don't worry +*/ +import "quasar/dist/types/feature-flag.d.ts"; + +declare module "quasar/dist/types/feature-flag.d.ts" { + interface QuasarFeatureFlags { + store: true; + } +} diff --git a/ui/src/stores/userPermissionStore.js b/ui/src/stores/userPermissionStore.js new file mode 100644 index 0000000..eadaec0 --- /dev/null +++ b/ui/src/stores/userPermissionStore.js @@ -0,0 +1,31 @@ +import { defineStore } from 'pinia' +import api from 'src/services/api' + +export const useUserPermissionStore = defineStore('userPerm', { + + state: () => ({ + rows: [], + loading: false, + saving: false + }), + + actions: { + + async fetch (id) { + this.loading = true + + const res = await api.get(`/users/${id}/permissions`) + this.rows = res.data || [] + + this.loading = false + }, + + async save (id) { + this.saving = true + + await api.post(`/users/${id}/permissions`, this.rows) + + this.saving = false + } + } +}) diff --git a/ui/src/stores/userSyncStore.js b/ui/src/stores/userSyncStore.js new file mode 100644 index 0000000..c968651 --- /dev/null +++ b/ui/src/stores/userSyncStore.js @@ -0,0 +1,53 @@ +// src/stores/userSyncStore.js +import { defineStore } from 'pinia' + +export const useUserSyncStore = defineStore('userSync', { + state: () => ({ + pgUsers: [], // Postgre kullanıcıları + msUsers: [], // MSSQL kullanıcıları + loading: false, + selectedPg: null + }), + + actions: { + // 🧩 Dummy veri ile başlat + async loadDummy() { + this.loading = true + await new Promise(r => setTimeout(r, 600)) // küçük gecikme + this.pgUsers = [ + { id: 1, code: 'mehmetk', full_name: 'Mehmet Keçeci', email: 'm@b.com', mssql_username: 'MKECECI', sync_status: 'synced', is_active: true }, + { id: 2, code: 'ayse', full_name: 'Ayşe Yılmaz', email: 'a@y.com', mssql_username: null, sync_status: 'pending', is_active: true }, + { id: 3, code: 'ali', full_name: 'Ali Demir', email: 'a@d.com', mssql_username: 'ALI.D', sync_status: 'blocked', is_active: false } + ] + this.msUsers = [ + { username: 'MKECECI', first_name: 'Mehmet', last_name: 'Keçeci', email: 'm@b.com', is_blocked: 0 }, + { username: 'ALI.D', first_name: 'Ali', last_name: 'Demir', email: 'a@d.com', is_blocked: 1 }, + { username: 'YENIUSR', first_name: 'Yeni', last_name: 'Kullanıcı', email: 'y@b.com', is_blocked: 0 } + ] + this.loading = false + }, + + async syncNow() { + this.loading = true + console.log('🔄 Dummy sync tetiklendi...') + await new Promise(r => setTimeout(r, 800)) + this.loading = false + }, + + async map(pgId, msUsername) { + const user = this.pgUsers.find(u => u.id === pgId) + if (user) { + user.mssql_username = msUsername + user.sync_status = 'manual' + } + }, + + async unmap(pgId) { + const user = this.pgUsers.find(u => u.id === pgId) + if (user) { + user.mssql_username = null + user.sync_status = 'pending' + } + } + } +}) diff --git a/ui/src/utils/flatten.js b/ui/src/utils/flatten.js new file mode 100644 index 0000000..5d4c280 --- /dev/null +++ b/ui/src/utils/flatten.js @@ -0,0 +1,54 @@ +// src/utils/flatten.js + +/** + * 🔹 sql.Null* türlerini sadeleştirir. + * Backend'den gelen objelerde genellikle { String, Int32, Float64, Time, Bool, Valid } alanları vardır. + * Bu yardımcı, bunları otomatik olarak primitive değerlere dönüştürür. + * Örnek: + * { String: "ABC", Valid: true } → "ABC" + * { Float64: 10.5, Valid: true } → 10.5 + * { Bool: false, Valid: true } → false + * { Valid: false } → null + */ +export function flat(value) { + if (value === null || value === undefined) return null + + // Eğer sql.Null* objesi geldiyse + if (typeof value === 'object' && 'Valid' in value) { + if (!value.Valid) return null + + // Farklı tiplerde gelen alanları sırayla dene + if ('String' in value) return value.String + if ('Float64' in value) return value.Float64 + if ('Int32' in value) return value.Int32 + if ('Int16' in value) return value.Int16 + if ('Bool' in value) return value.Bool + if ('Time' in value) { + try { + // Tarih objesi veya ISO string olabilir + const t = value.Time + return typeof t === 'string' ? t : new Date(t).toISOString() + } catch { + return null + } + } + return null + } + + // Düz değer (primitive) + return value +} + +/** + * 🔹 Objeyi tamamen düzleştirir (tüm alanlarda flat uygular) + * Örnek: + * flattenObject({ A: { String: "x", Valid: true }, B: 5 }) + * → { A: "x", B: 5 } + */ +export function flattenObject(obj = {}) { + const result = {} + for (const [key, val] of Object.entries(obj)) { + result[key] = flat(val) + } + return result +} diff --git a/ui/src/utils/formatters.js b/ui/src/utils/formatters.js new file mode 100644 index 0000000..126bf76 --- /dev/null +++ b/ui/src/utils/formatters.js @@ -0,0 +1,86 @@ +/* =========================================================== + 📦 src/utils/formatters.js + Tarih, para, sayı, yüzde formatlama yardımcıları +=========================================================== */ + +/** + * 📅 formatDateInput(value) + * SQL veya ISO datetime'i "yyyy-MM-dd" formatına çevirir. + * için uygundur. + * Örnek: "2025-11-07 00:00:00" → "2025-11-07" + */ +export function formatDateInput(value) { + if (!value) return '' + try { + if (typeof value === 'string') { + // "2025-11-07 00:00:00" → "2025-11-07" + if (value.includes(' ')) return value.split(' ')[0] + // "2025-11-07T00:00:00Z" → "2025-11-07" + if (value.includes('T')) return value.split('T')[0] + // zaten yyyy-MM-dd ise aynen dön + if (/^\d{4}-\d{2}-\d{2}$/.test(value)) return value + } + if (value instanceof Date) { + return value.toISOString().split('T')[0] + } + return '' + } catch { + return '' + } +} + +/** + * 📅 formatDateDisplay(value) + * "2025-10-31" veya "2025-10-31 00:00:00" → "31.10.2025" + * Sadece ekranda gösterim için. + */ +export function formatDateDisplay(value) { + if (!value) return '' + try { + const d = new Date(value) + if (isNaN(d)) return '' + const dd = String(d.getDate()).padStart(2, '0') + const mm = String(d.getMonth() + 1).padStart(2, '0') + const yyyy = d.getFullYear() + return `${dd}.${mm}.${yyyy}` + } catch { + return '' + } +} + +/** + * 💰 formatMoney(value, currency) + * Sayıyı belirtilen para birimiyle biçimlendirir. + * Varsayılan: TRY + * Örnek: formatMoney(12500, 'USD') + */ +export function formatMoney(value, currency = 'TRY') { + const n = Number(value || 0) + return new Intl.NumberFormat('tr-TR', { + style: 'currency', + currency, + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }).format(n) +} + +/** + * 🔢 formatNumber(value, fraction) + * Genel sayı biçimlendirme (küsuratlı veya küsuratsız) + */ +export function formatNumber(value, fraction = 2) { + const n = Number(value || 0) + return n.toLocaleString('tr-TR', { + minimumFractionDigits: fraction, + maximumFractionDigits: fraction, + }) +} + +/** + * 💬 formatPercent(value) + * 0.1 → "%10.00" şeklinde gösterir + */ +export function formatPercent(value) { + const n = Number(value || 0) + return `${(n * 100).toFixed(2)}%` +}

9nyP&)%1+Th)t@ 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%0DpUJh6t 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%0DLs-B8qbLv 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ℌ*IIa96aU~;z(a&l-;O~SwKYI>8=rHgfLY=eO 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�f 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�BvDr!|Vt!C6}YIU`ST2rm1)>iANb=7)meYJu5 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 literal 0 HcmV?d00001 diff --git a/svc/fonts/DejaVuSans.ttf b/svc/fonts/DejaVuSans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e5f7eecce43be41ff0703ed99e1553029b849f14 GIT binary patch literal 757076 zcmeFa4SW^F)jvKn`*PoJ?#*4YS0E(37~UcxA|fIpA|mgGh=_=UH+cyWBO)RoA|g^s z5s@MyMdSgBNRc8UMMOlT7A+!DN-0I97z0Jb2nd+_`_7rY$%X*Mmp+gG&%bv+bN1Xb zGiPVcoH=uLc6OF=#+U`5v)1j}<#xXRt&*dR@lK#tzq##A?PmRX`a%33%$S&UbGNSD zdra7T6=T{N#^z7Gx%+Kx-rC;!4#pNvVXVr&&Nt+?U(%%cIL6i@z1ga3_sg5yaoMQL z7~8NE{Ce~so;PCSEm=U{M6j#&A2l+Q4N1R-v0c@1jnY9Q?iqex(@{ei+l~M1rF-)3 zAHh60*zT?PAG|03p+R}U6DI!eWZs7l3?7&_Ab61PV!qt9h;KF+gwSs?{)GRi1FJK5 z_{hvAo&C1{M|spY>kLd~237cKw@OQ;~!2cw+ z0e@e72z-b52>4EM0Qf(}7r=|f*T73e3Gi>kH^7gJ%g zxJUB<_i8@ie$5X&pap@4benNKu2*N8o^FH~H^N4k2_wab0FN4%FwLlHR0Ce!r~y2~ z$N-*cWCE{gTnaqP$O2y1=m@-%(Fu5Gqbu-kMlSf=X50^aq%i^XM~xZ4pE8~TKGTdb zZdxX;Yo?pm18;4%27ZIt2KbF;2jCseTY=}8w*&9#J;Av5r1v|fc}oK|7!PCwGMETt z2I>QE5Xc68S>O@i69N-}KN@%n_{_i@rUjl2JPXR)!1JKY5BvuBg1~FQ*9Kk(zAmr> z_(y?{fbWc=ahz(2D;1AZW$ z5B+P3SI%f{pt=JjKf^9qL-u%-P9^M^?#@^pY6V9;Jt;cbL?iQ<%q|A4DXi;^sjESpjGPsaG9 zwPVc*wi=#SIE9^!BuMDH0QhzXK)ab zF3-Dh)}g6`%yuXNQu@!}KhD8H>Rhv>qStDn{?|TG!~pJ;@Vl=OuNk9^hm7$q zOll15I?^*%Ri?wQ0%UvG3dXq!&K4xnm^EW9A(Qs33#8JE^<{$~mqIq0jfZ5WvKeeP znSe)-k2D@I z9yCT9V~mH5vBoo3b!6fD+6`!Rcx{kT2Zegf9(`=pi9$wBCe&<9}v0>*hZ0$~)w zScHiP7+2YJgjoo45f&gUM!aa7lUDgr$_QfNStKD^ycN>)L{5`5tSZZd)@37pl8G_=yL``sXTd?9f@CZ+ zF-G2Kwl!}u+nKlE8ft8WqlGI}MaV?RLdZsFg3w&@($S`X(AYBQrU2)?I5eNnLaA#1 z8?9W(mO__Tvvq7E+rqZ79c(w-#}2S!c9b1wXSm>A9_HvdrR=+X<*>Ah#1;H*PdVF~%tWj-2v<22G%r!h8zM%S9;bJao~-&uM70?Hob3{lQB%2}0irc=%g%9+V( zqV*;tOhcH7Fb82i!Xkua2rCiRAgo8&gs>Ii1B9Ijdl2>`97H&ba17xjLMhY`_K`y` zImSVbah1c%=Cu&&Av8j0iqHa~H9|Wn7yN!sP#V|oT^`YfLl?z#=ywa)nz67mQ($9e z!M-ejZCMVxvKBUFGkcG1XS>*5_9-i3M_36vB|9|_@>Cw@HFzD~fH&sNcuU@fx944W zF8WPhK8WY@LOz<0=acwUK7-HZ^Y}u(l&|2c`8vLlZ{gcyiOs>4;B`bH?KTx`TZ!_H zq6?C<+p1PY+*C?}ioYA0)JG+SF=>A)LvV1H+>N`h z=%!x~H%`h@{TukVv(uP0(8r{gj6MJl_y|iCM{#!)qx&M8{NOlwz?YEkTb;b#8gv(w zLH9p3>5if{-6zzCcV3G%w(Hn+*cEmbJoP5zmtTWx1i$Y!h;Ih*y_CHEY~pn_Y%+s> zF=!ZrjxlH%W2d0hIKe}JbAynI5J#wiPzRv_LSuwx2rUuXAhbv5f{=^Q3!yK;}IqyOhuT1FdJbW!a{_l2rCd)BdkN%h_D4=8^R8R-3a>-4j>dG97Q;ea0ZeV z2wsFRf`w2OArm1B0b^My(;uz`F;b&_F=m|~o+DRfK14Ymp9&n#bHxg2T-+4>VmO~K zO=WuJYyA)ktP}i4*!3X%(p2~z%`i&$g3mY}zM{M*f*+#wPrzqnTN6Wn8VZeg6*yO> zoab8Vju)!JQZRpzYQzl7sA8lUwh=cjk+TSxF;G6Vyt`y1suR^tO> zr?JP_ZyYoZ8^?^3MyaWreludGnbpl&W<9f!+0<+SAFrL+39}wO%|7M;bErAO9A%C* zCz?~t>E00Y|lK;LeEmq3eRfKI?qPW z7SA@%4$p4SKFdTE2R|M!u%L7QWWLcD_!&9A8ggAKw7qP~QmODBoD$MBfzObl)uBT;BrU zV&8J#D&Jb)2H$4id%o?yUB11(PklwcBfb*fDL?a@{-8hAANSYr*YP*-H}*I4xAeF1 zxA%AP=lXm3`}zm@^ZkYX(f;xNN&cz+8UES+dH#j|rT!KE)&6z^7Zg4?xad3HXRd8)^LvVBO zz2NrXuHfF_r@^A&kzh&iREUMlP%xAliic{1>Vz7E8i$&NT87$$+K0M?aznjBeM5sn z`Juwl=+OAkq|nsRjL_`RywJkX($I>~>d?B-#?Y3~w$P5y?$Ex_flzViXy|z8Ojv}y z;c(arR}E)|v%=ZoCgJAcR^hhc4&iR$9^u~Me&NC4g7C=jnDB(~{P3di zvhd3An(+GYrtsGA2jQLJJ>mV~gW<#BW8stG(iA<#pAtz)OR1hxE2Umaqm-s8EmB&i zv`gufl9SRirBBL$l%XjjQbwhWO_`W7C1rZbtdzMa3sM%REKgaLvNmNy%I1{!Qnsh; zO4*z8X-ZMbk(82@QxO(1Bf&^&Bp#^|sS{}sX&h-5X&Gq~X&>nl$&K`i^oVW1e|!|shd;ZOWmHjD|K(` zr>RA$M^Z~tPsLcwj0Iz+t%e=Ms1JCXg#2%WpCtGaQKZf0JiDAC-jX=`C(&OddQHL) z6TX&Usf6VFaQ<6~YY~ED6Q^*kxs>KsN<%3{U7~CzC=D~$;AMB%bCq0$ZjVDV^rJYpT2Rxm+ zD2l2V;mI1QdR+jP)fC)N1}QNGl^nhERO?8 zlG++-FPBuyWGh=XlO&LYki5eu)5%pS4e`(X4(+J<At-72uIG@V_*VOe3hh6a*zT zNpY@AGC!Xjlr}o><1=&1+C7bQ`xeq_>Sdx2QJ#0fzU8CuClqye=)eAzM!C6m)vD=_Z{AlERup`W0j>9x3WCYXE`cWNMBB`F!s5%^gQ}m!Jbc*B^L_1$IA23vnaiS?(}ZDYi#A+N&gAD z$J`3^sietj6sDT;BUHQd(9ti>X&=;>0x0bpwaYo|iA(3v?q#C}$|JoIf@+j^#(HC=^J$V=CYnzaU;5m4b z7AcK#>(#|kT-MU1T}qN}8LIkL==Dx|l2SU2UoI$UBy~fsd{-BAMp!k@RvvBDSXmkN zrE$;=E2UARvm2_B+6|piTaDeW5nRwXuAmyt-B69}Zm7{H?}lm|cSDUve>ZeI0e8tK zP`z9bD+Qzv;D#=L!0`>pb5Q<++lz2t-SH?~oZVhTWlzKHb+~cI15tiRC2yoMPennm zIk!)H!7*3$HD%efBJvLjCMo2}7t#F%SuKrl1)VgR%Bz&nv5@Y*Pd2TB)v9E#l*jA# zBF;sj@x4UZD6)H%dUWMJt~>$0i24pehvKqk$|@>PLqU!FXLuCS9uhoPE?HkbgRBt2 z%4yEoyJ0yi^mp>N9Z%pElD6l}Gh~J2od}JXn&(V^!pp3aIHGK6nJ+3>2& z@5=Q#e5-vl-d5DYJzM0$Gn!^Kxxxg`_8Deq8J_ksJmF`Ut7WV&!XSiv1kBIlX+OjK zEyELkhG+f^Gr0`U{TV&^|BuaU3bk6M1kY|co;n1X%`R>=Lh`vU7yU8&%K3*_!^YV$ z3Hfpf#j`|du2lowBFd{oF(rjRB5{77z!NAwgknFY*doGTBDkAh0gFR<@x<+Y@Ej!R z{D6eoP?;C2} zTio`xCd z^Q_Q_ZK$+HL*6BRKmEgEPUOM!Av|?pc-GJGw4bq!2wM=gA>jECp8I3wU9K(o$<|-| zAa1cvsYkFfZyILmd+Y1;jrtaSo4!Net?$zh=*9n?yZ`Up{eS1~|2ud8^Panh4b34- zdI`bq67qDXX_;9{zzCn4pXK`CcQ zT&%}B2|!BIQ_BQi8Qv+cB?#i`YRqu0>aL*HM+BoWeJmt#Mta){^c}lq3~> zlgx#BEh8v-u9tO0?Wm4QN|hm9WxbLl!OGHeQ zSi(0^yQdjP!R;0a`AdZNA^5xt_ASTxe!^oC@&ba2!xF-OE1~u$!v9WqZ3)Hm#xcMN z5^93zRf#@JLQW}Fthl2*R#R!JQA(mavDBNCrtyZPGX#@*SWZ!~=cg-;m5?{2-byg3 z=jWiSULYmhkhGDYTSIt>)MsJJ*z?ley}l>4qk=yXy<%^o7FWF~*^j6vTQEx%9eHK4wP%a z**nrADcj4l$!a-J#`0_h-D#wK0A0cIG@D5G(mmS|>p<@ui4$~MlWL*H8rO&;dg@h? zvLVSqL06jd^#zO_=mjE6LZrcnpdfFkxJh`vevur%T$=oE^jVf%OeNS;j#((P9J$=1 z0F8jW!Z=7RrAEWbW8ze8lH^IyW!0fSvdr_E znCqfD<8KLRh#HHJC|va>*XVqNYV8_j(08D*!X(|GF_)L9ak-q1KBC4xKzDykj_G8< zT;(Yn<Ntcy&e2kuCX%(DG^65zyOu=(d&epo5mnCbVMqb{Xd^v*fzGP_| zQo9gDUC_rJDW%i+<$`J?bwf3(x}i`btQ$U0W88(I8in1kQhGHyyP=?w+6|piTaDeW z5uDRFuArdN+zmO6>~5$=c{fz!xEpFT`n#dy2`GQST~rxcR$rp*#>bba^9gZf?ASHB(-01rJtPGdCp5qsC&gNU&Pc z>JoHpS0yWV4*PZv%jW33w7Sa6bylyVh=h?()f*H+gG0!Pzc3Y#_?YcC(U7u#RN7L-~Y?|E` zG`l^SX1AZB+3go;c6&L^Zof>k+ju(|bL8ipS;U*VRj^LgHsj_cW>vHLIc6GbU{-Jp z!UTlL2-6VcN|iYX^AQ#yEJIj{um)j0!X|{R2p=HqMA(C{AK@T^Tt9XUL9RY4WfyvP z<)@yBr1k5V*Tm}Zi-JFB<`S#@k3&l$n14>ci1z`LGw^4>dBu&pARi9hm+(;uwY{a7 z>o!b9PqYR;f$%#C)*@J+=&cC9i68({DtKJtrb;=U=nB#^Lx-EXViSs`Re{C=iJQM9 z3a#%`rSi6r6oPm&)U0h@hiUkJW`8E16=?E(Ir+9X(u5H#1lT7)8T}SH=0X{0BwwG{IpIb(sppOB5r;fgC)Y9=@ zo>5;P4A_cN-b9eexf;A6+YRuzey5Zf-k9gcc!?Y1jgf%QQyRrhU9pMOEF*>J3-no1 zX8IIRBKiY>qxBiG=6Z)D^tO<(1fh&D$bec*VUe0ZI?p?>tb&qW(w&Kf4UNDH6}5_Uwf+(A$#ojY+Y% z6rLE4-{N`5x!;jH;JhPu{MYEI?R{upD6(!diq42%8b!L)eb63t=z9 zrwBy|M-WO7PB9b)0e$8NzJY`HTI4(INhq0>0uZINobFEZAIHnDD}KnejFtKa(8slC zxjDQEZ_Zosw!8!H#(VJIydNLT3;0MrhEL#=`7}P0&*Ag=BEF2TSBgktV8(TG$7pk!UJfh}NQ==p=IB@%Iq}#85Fpj1ptTL@`B7 z7qi4%u|O;q%f%|OR%{TP#d~7A*d_LgPel>l_$m>nu;YcP1+`QyuGP@$XbrT+S~IPs z)<$cubn=RZJ%~P zE7p!`$F(!M(7k$CxAdxdrkrM3LdMmxH-a+rC_t1Om{q(_lfj&|nqfgK$>(lg^ z`W$_}zDQrDuhiG*>!mtL@B6>-zY_Sb1bzk*5bRRCIS0=JW8YmEk>=uPiYMFa*j0G0 z{Vv|A+s;13`1m!B7Q7y>&#vV+@Eh25c-OZ*YsGKnIqZ6V2fu^e!1H(>Yr`Mn53?IZ zsz_z+VA0ap&7vAsDYX~rBAwkL8i)q0gSc8;%{q!)k;^)1)v#)zv-d;qhpdaw>x;6k z(J!Kh*d5U$(Jxu==r_@CSfA*((NpYhyvOk+%Zqtq0oFejja6g!;7yLYtT0wTb{QKR zYZAMPJ&HFv+Ox-FonqbCOuM_?o&6fNMqpPO`TieceuT(b)~6rVqj302>Mg=Js{wf= zccb8hL-|Zm4tMW{q#j}4d;|^{=5^^-xI!P$7?gVhYgz~+4Kw7!S z8xl@Xt4nDX5|n-h7t$Ny+J}ToPX#Mn2+o$!Ss$3;!qX`Beu8urF^+JX(x@v|g6g_l z@u>s_aZ_c`6QvVmc_b9742qk|brHDY=9EglwaJ}YOP|Y;i9?~ftE-49())8HcEM|j zCy37`2}KS;>9unCW;7^DGWLbIIajBY=EE|V@sNb(RfJ1Fm}}QcDBhRQX+b4<)pn|V zXHu+^iMskY@?q~lFUn$dSv}Se`))L5SHRD120L;c>`Xg$GuDB1#GOhvb}Q~ydfL7>_v;7s!}>A( zq+V+1hTn+bz2WLcEzEi}GMZvtS8Jmk);{GJJ&iub0Ar{z0&fzJH6|KUjOoTKW3I8l zSZpjeRvBxJ4aR2UJ!8AE%h+ptY7`kqj1uFNi7iyjpqYwUj2dPgvw_*zY-YAJ+u#ng z3+|PA;eKk6nQs=Fqs{T=By*}c!<=o-GZ&gm%@yWqbDg=-++uDscbL1)edYnP*gR?; zH_v#4$Lk4uEKgNWrYFmj?P=m^?rG&|>*?U>=IP<-?dj(k>?!b!^o;RL@J#kh^UUDlAi?>Xo>>^bH+=_&Q5M_U-c>@D=-x`i}d~_=Vr=5Bn{D zRez>G%b)FU;&1M67<^RM); z@vrx9@^AHj;NR)r_biaqO-d z)6{h-m$IOukkTl7Pu5zzMwCSa-6Ni|yEGRdXgo}gT2wYgAxo@%L3xSdTwUd&kwlOM z6PL;~T;9!dXGH2FaqVWJ^ds1pIA6s0seLBXC(Cm-?(kO21*uf(>S8G6RZwy3M--(kG{QUbCw)_X2lq&Bd;&r0 zJ2ce;503I4kx*%@_JzWUu3FH6GOyBPooa-gJtakHHTfpOfif?zP8{+Ge~eO&B&b@P z-kcV7DVEBhO2WS?r-(4&B@#N?t7Pu(BZP|q#F@M*r)N1hagek3T(ppoJGi7f?U+Zg z?FlM*zL=1++|<_MCA#|E6svqd7dNd`(zR0Jrtq63u1_a=ro|upiC4s7xMro9zV=l@igtsQBVtYzly{RK65}nG!Um^UBN>F*1 zGl;IBy4F2Jp)xpDOIa$ChM=oB?=2}kaod^0rMN2-g9sij#g1pdB|I#5P6ICCVY%NL za6q?(apM|UcrNEgozX;ZLwF9g%OEOYSVHW&3#fJr(6T8_Q-XCUC8bfa#p(&kZ4N=z z`llo=#+38aC@()j^evQ<+8xgWWnLvQqVunD?9beM8!%3_?M^aF{HvV_z_ z)fnfDcO-3PIh77LecYuR>RwIhzf+6*N#B$;dpmIeWl$}pMocxzC<^J7c#+DWdNJ8; zzLO|V6Q2zdD#;rKlCH-j)C9$nmCzm}d_KVrr9E&((mewSk&^Bs^(zSfi-h_+<#f3} zGt!JA=-{#^Ch3Z^j1?;=%`*~my2}xNB3#j3_eSn=I+7$kRHK`=S@Lvxlj_}nBR4 zidF5tnsDM=!QXq3=ojt#Ib#q>6+3(3Ue2+K?-Cz5W(n4p#jr~yqZuzh&3M(pedkkn z_9N%L+TiVurR+xBf38BDoCCWBcc5?MiIAKL>qs+UoiVrbG3$z_Bwyn075AdJcRhup z7Z33eyAyY&DXcfI!mF^mXtt~m?o=;heQC}tkKe>^V*P05tUq?j>%s=m{MkV4nU~A% zp;@%SG>bL_yXWPzp?nk{#fH(0TE4u$W%uF^_kDIBKh96G2ZSMlY_tfA4r~IR6x_q! z5JT_=iD!*gv$+T4%Ojds2IneWE?5J;y%P4rzzkXSzrC zvVZEe_1f%ny{X=m73o*&SF`JjQxv-u*2SA-VyAG_kQogti=0>_c8XJ_X+Pb zF66u&_sV%Y?vwY~JSOk7c@^JD-?!WjJQsM5UlMpRu$Wg3EDbEiz=ymsb_V(jzY6>AY~$BN_eS^f z7SVmtfADLgpG1%G>!Kym zYsSRFnvYB~%gi>LnCIG|OwE@}GiRD}%=!Q4`;%3iEy?xv^7i!(^5%OBy`#P3y_39C zy)(SCz4N>ay-U3-ysN$Iyc@k+yxY7xyt}>oya&9+{|CF1{dcb9qUK6Mn?hSdAB1*> z_JsC_4u%egj)hK!O2c~CAC836!qvmI!u7(9!cD_1!mY#Y!kxl7;hy0>;Q`^H;Su3c z;j!U~;VI$i;aTCi;RWHv;pO2~;kDrn;mzUq!rQ~U!h6G?hKs^S!X@ETDJ;cI38ti` zR87fD$x6viX_C@BrBzDXlnyD~QhNN1_aJNkK zDK9~-6XAym&M${rZ;7k-M)>6t=Z(r^c>{{QpD5oDUbj3}Q}{TdJWWugJVLm-F69#M z6Qz*g20$S?VD(RJ>9x_nMfhi<9HsPcHvXj|PQ4E^6#rB@`84iw;0n6d)M{VIG~!7> zA?^pnDjTtwX!jDd3D%X6%Qs(y7zbQF>+2(F+RYT-k6>Sdlta}}`-~`xpRBFA2G(ae zD|%&3%W6b*;My|KIKNfK@O0#-^*+Q$mXc#lg)A}2i%Nv~2uX3)7rW{vR0~o2Dc+)| zL9yV^t{&SE0vaOCQMIaM30Rm`eI zmBeJba-k%x@YzI}BI~6}%TtI#5>U0~86*eN72(nwRU`3Bk_l;~YV`^_r>^BL!xO|U zm*6hSD{CS62f#Iyj@r;^A*pM4lb_P<I~!W9iLZ_1!DOl@_}pX|&R7w|0l2KO`BU^nNjw=t?T@l`fogTjUXa z1YLO|;nxzpm7u$=Re8Unl!S{g;YtUnW=cyd^qM|&#R0@kwMZq%S5lf561s7xHB|}Q z69-k77wNjx&&5j$r&yAG1r8)dcZ+H_%d6uBhsz?3%PYT#TpkDEX)!oow}+ zD26mtkY(c$%0VS^`i;`EG@`5YN;V{8M<+&7tfDJjsY;Y(1eLBxtH(7}3RNNn7f=~U z=Nx$xHz(zn#6ejjf)#p(q8yWH9P6ZXzCH1LT0&(N^p7R3Q}1zlzv_iq2=IA2mj(9{(JrQQCA9N$EI2>MPoFgsc9n`hjYrlaj6(6szc})t)DcOU^=Fr7xu) zM%Pm9s8V($`ftl2-Z+w+(ATsuV^z9tS$>56nMjpU&8 zfqzZXAUmeyulQ?|h+a$P)v49A*~BfI_{dSRBHg0&ml~%~W@>hd7?%?L2?tSe^I|vZQ(A1P_3!F2qklBHD|0syPG)QT!HyyCf9* zh)x=zH8tehe05}rv@qy`S^%Duqe*ip?cFk!I7M&_QHU#YOMdU^Z2{>D+H^_LJ5d@n zny4#(ZG4V2&r8V1nb_?{oSZ z>?F8a$_#t|Na(&-RITr(To@;r@EVej^MezPh42@Lj~JdntVMf<1JO`F1(e z-U{>Vzh&2Bo_!U&fo9s>X)#y%Wu@ zcji~|t5{deuD4;`Xm&jZv+K98?lil8n_QF6dhniDoq89)li$Ve<~T3|FITGe$2V#Q zVFrE(AIb(|zI_B{;74NZYCd1im$Q+WWB=BfV}FR|*dL`i_6;=0zK7=6|4wu4`?Pji zAIz=~#1og3+E8sMJB4-i`Rue-pcSw)+6Zj~`wpw@N3&AxaqSl@q5V?(B{#LFw5Pa7 zdscgnd$sx6Z+Jjkq`k~T+V8aYxvl+KJHVT1UuZ{pC#^&mJXbe#KktuO`Z|1w-cZlx z!}QDbtNC#K2K@#;O7Eg~;ScI}=y&kZ`rZ27{2{%+-k*<=bNKvWtizwi$LUY&v-o&@ zslJp?(0{M5=8s}U{u=(6zE)q$Ct;p{1b-Ye{A2laIm6HA$nO>K=P@TZgD;|a{{O*O z38H*4&F!zCx&4(ixBm*w?Y~NM`)g@#|8<(%f0O3+H`3hxTQs--HqGsCp}GBcX>K1g z`x}-=uz)dXS$<{UY@X z!BP*U9ui#6`3oWE{Dm&({DoJ}`3t|C^A~Bc%VU>|tk@N?t3=&ci&!_2Eoc74jdJE+ z^pG?E;&wUnFM8TJcCP3rXa2=NIrA?D*$>$diF@p^_Bb(EJ_Qg%DWV^Lqe!E;5t zYwj7PxJZ!r}CPx`U`RnVGfeAlqT8PBraYo%Ry#dH|M zTyY9lDbCL!nPaMUFXb+DL0G%esk)*_oJsrlW8imm_gVS~@wtH@`Fm%Ie;Z?5iV2eEdS>$~OntZkG~>M!tm5<07)<`KRjfvai1r&#C!egqsNMWG5Qo_W)w;MRB(ByvXX^dR-dM3b7bDl#7;nnfAk(^IT5}xz0`DHk^~8S#WDM(xzbnC6 zWF5u4AFJ88b|&7h=myIFCw_^K60bQ0?TB4Eufel$mVks3QxY#H<|abttVC9ln)su{ z5_^;XoipMSADu;GlJocZp=5i(8S4oYe+h}g5_!PJC1717rl^QX*2A41wLts>Do$~b z>5+-}N`B=>885|k1|*P&yfTHnqQqZL%qTsX(3o6TQTB6}&*9DzZ^>)QGG5FNsi}5n zr&XL4RhC0yNm`PB^1qYnwZse@sP)DCD&{?Zj^wq^pW@sxZvHO3On=I2b9R1}`l99M z$flf&>uTl1N|>8}5{KUXQT715g8v%YoG^FBvt^-DsN9KRGG*d5=j^n8IgdnJnGW$Y zfK}j}%ulTf)%7A0#N#UR)bo z9M_*N6{M;9CfSRhri?$S{ABs0mefzmFsTcmkybz}Az#uIX=9XCaJ6*8!OPCW5^~ib za-*DxgI#x}{=Sk$>E23~4CjiLkYrkV5Ld{M+FE)v$=xmIBwluQ^#n=#andZ!`|coJ z^%_{~N_N3r9yNv}DHl2?OM0O+7aK?88fu*Qs1$NkEpxuSauiK0lCi2!(|_0kRj=|= zC9%XJr4`Bl=i_@pdKSwnmF*~3^8E~dBtPggT37ZIIliBz&C>d+F;GfZc_K=Rsya!$ z>?}u2sdsb18`6dpN#;MS@(J`dm;7C0-4EmUpUQ<1D1=@rJ)5&e6IbbR@zR$|Aq^Rj zl6rpWqSB8_A@@>PAv(Y1jB8U8(bD~(m6U!iQ>#1@`+h(4jFT6eqheVvHrG#)E-?k3 z;2jnF@3~6j_^6OGR6E2v{5HAK*Do>I%4$oj*U%3<o$@VSpwaQzPd7QG)h*puug?pqUJ=yPn zM9)=Mg!Eq~I~yv^D?Lj6qfCb9lBSe3YD6QQl1p;bOH@hL0sV|@Qt3e%2d-r?$rKlV zmTf`uJBO4mp38qOr5u~i)enB?6@N-z?lM4*!+xwDL*L}MK_jx8_m9GF0LSm4A4)#% znj~>$t--CVx5|>r|H+siRnDJjX0+-IvI1E@jpqE+vXWXye#tnDnitiF$>WipAf-kd zVrHaV_{n<#MIp;YqYTnJXUuGUzh4hIvSU=rJD0uteyp5Q{lpf*v9@$K{X@!gcAlTs zVnKFv?{@Z8&i7xord!M0_}O`6Tr%FR1!t%G_x~}9>@6R8|9$!krTD4kSDMsZTvYNV z36<%P)Jo-%{JZieb5hxVePMZBIQD$CM_+dC##BjVI(g?SJvtonZOjY&DwNOZ-xo;! zy`so!{Kw}{leJbgQU4r|*O@<6g)WzFa{lz^S-$f5-Je(al1*P;z9i-6c82%7=wio> za;>;)ez7IREdWul79?N}141@6UARfb7~uK418rRsTtnOYI{s_a}dT zB#TF_BfT%09aI0Lb|y8MaCNVLPWwmwSIAk@pU%F3m&?OfWjufR5br8qQsiajm(RDT zd@3eMPo_(r75(D-`T6)H`Ca@Oa&w-~TzsDLl!@!h@&7D_xsv}S|NeW+R{8h;f%(7W zT%o*w_-W?<(Ar7e{z;!tpQG(No`d#pN$4$jnk1iz5QH~ao`vSh%I?&XF|ba!LshAy z_n7RxrQ=iz&@fk2`IpRJIp%_tEbxOpq$^!6Z8zElGghTj5?bOl_jAOg7CC8&DP|B` zqI{~fS?Wxj&T+}_Sw4Z?;UYLV)?w7as;f(JXbjIDu!^EC4ujRlVPe0=2H5waAr3FQ z42O?3!r_Mny_^NGdZP)}uUv^EguN}BvM|z8Xgq>pPm`4YO--#8?X) z7P}Tl6|DMbiSJ}yhr`Ala(foXo&dM7OR#5T7wndKD~@U?V-9u|xD7`-_Heudt44a^ z$Y6Kk$i!Ni-mE4Yj-wVEhod%|h@%dB4Bt4tls%3k3oB?Q1D}GUE_)J3J*=mhiQ3J= zs+u5s4l8R?*>7;9u?0BlvlnnQz*?J^Q69O5vLX9Dj%wIHaxF^oCXSlyEgUtm4rdeA zuWZJVjkT3qAe*f?>S1lp2Y}mg82E1G4oK_oIO15XvmcT?jU&JkI09T?v-iunpZi%g zo`w}_Dct5ZOUF)>Re@LI)mUSm$un7m*W$GRvv?M}f;Yz6wN&1Mw_s`fdVW2#{a^dP zW=;GFe}Y{Z-~rB>#>|+BFOk-W)nNWuMl1vJ6!^xbYVRo8L_nVDXm8o}I<>t)ZEsTB zd#LTb)b>7C+xtK4}g zw1pnD!-2g_aa7cU4p^~L6>EYzLHb>BRL82GZjNT8lV;Sww{CNhOX^1k)=u?+PTY>8 zCU%bK37wD{Q=2rV4r$D#q%m2fF?C5}>Oo&7LjqDi>XUvnAk7GnW~7j2#Gn^1pwH!xC7+Zc}lm%8pHUC-c`@Jq1ot<-ogX?zB+&a1N!uYuK?A=3U3ugPn&OzHz6UYpkj zUWeDg4!M`|OW9S_E5f`kughv;<#IjjncEP1YPP1`L0a?6vExl^>N6?)3ViRk7Qd2T z35s0Z+?qGz&Dah6YJN3#*KN+5vm5y}{2JDldRL5km&K>>DXb~2T)v6F%wJ~h_zJ#) z-Nb*#e+PUI--B}Q<$Kx9{O|YO-C?(kW=NA4A|AuwIE{EgU z4ZcTwkFbuu3BC!elkZXAqpXc@qHiMTkNF-0e$;oA-RS$u_Z4ePy}EM%-HmmjzTK62 zHCAP^JoM)}=(}<+(E8}B4WVOo&HH8K=LpwJ|3${Qz$rX0(VO_h>uAsM}U-Uwc z=#8E*4n08H%g50Vrl1GRg#JH+??V3?_VGD<8~S-z$lp*8SOyK3`n?L8y&C$whP?)T zeiM4T37WbEI{5)KZ3lE{KlCC2>*hyG+i2TrXvbP;r^b-$^{`fn06vR?dSt*3^+oSv zs7Fs&OS$6>eu>=(*vTq^{frXWT_=`WD2PC%0WvVR=^q=eOXxGUlj zCOUTn|9JPDHh@kV51sL~YmC(A%87S-5m)t`aad&xOBsg6K37gzmUb*~;|;l)tk+H5 zy8+&OLnpvnx_8cG{W=otM6h#L&_{J4Jf|ySM|JPm9cj7~g-YllnR(DPQq;Q;at{=F zU7TfHGNy{$mx$z7PODzId=QZi35PH`+LdF8cSY&BYnYyyb8B0+GA}QGBwIspJ;6== z^X?zWw)XEod<6S|;7)>j2_6`bKja>EgkTB5Q-g*;ix@$3Fk*R-VCs;9AtQO5U=5J- zcpZY-`SJUA3kuv5Z;Pl+d`SQ1Hs(;Q7Yb>U_XL`QCHbJBvdPZFCn}JK>#I3 zv?clv{;8fPbyWU0C?48^RPs3)hdxT^Bj_b)5wr=02nGQKWE-P@sRT`e&^P3Ufdljd zYS5n)=($X<&Rn)2VyhBNM}NqH{pyFE#S5`MdKRqIB3P!?7*RK41l)=5Z5+V5=n{5@ z>paLUj3{-muXj`45?_<(gdL%J^8t7(Wh5WVC*eC1vp8&wC25hkce>)>UGAJ$;tWpS)z0~(I{Waxr=%boLj@W+wT%{k}d z3_dA6o%1N?JPT5n^kq)Ey$*f9I!CZWgp7~0cg~WZ{O|CI^mYCZcFrTvc0s1aZ;H2z z-wc|@`m;w)QkB^zA5S)--Ff8vdjHqbx&yBZ_5~#c_(`6vrt}^7F!8 zWr1_~A@`tH|4=e;SDKilU>!d!XB>Ppsjh8g`SE_-HI!DShut)y_?C{q{?F9`YZx^E zvy3djYbYIA7nuubWez!hr9lJbfnI@cg0uxy^1TLLYiIVA2wjAuZwl!5BOf+8~DD+n_{DQOKcKv<4Ys&;GLH*#ZmEV|H3;jm*5*A)qD+of5ba4Ph%J2X9D{JpP(#5F^*n`+TDahBad36dnyf{ zbVpERnK*oauE3?AtYPe*12`A{twx@wMn0!T-lj%=rbZs7M!uy+UZqCKr$dpN8+_i-O!kVDJJ=hVpC)X2}&(C01CrJt$sIFAEL4^t!G zQX}6|A{PbQ8(*qDYs{{Uu{|fLa{xsk-{29PSd=a30 zPfjC0QzH*kBM(y}-%=xgQiE;J9tCzUGW~%#rxs_V6pfY;1Tf+ z=*Puz;3vch;3vf?;HSlRz)MAf>GW2W(C`C}18*cx(Wc;ykwe-cz<+7~!doJ7yeA@{ zcMTc${n7VF#-V@DFhSa<`eYjVB=sw&ht#Bha@0^gM*Ww5TscMdWtmTMkiAL<>ire| zt2`A`q+(o?_U6z6DD9-X=xC5(9k#^$W@x^t} z<0U^iMpouqyAt2pNOkdilbp{kU7bpN>wHhXiu2igFRjG)(u?A&T|_Y&m)*(%>yV#G{2l*U-*O z;r;i3&oAKf_j2WvCAk__^tRY_}q!R27$YVyMF*5NCkYB35=<+zPRrYxbGNn zQG6;&M(V92-`GIhxs*$ya*a4<83e{b?6!nEpEodaVdq_7Zvuplt=2YcyS3BWZSA%8TL-KntJpe>Z%JNbvDnGjVSG=r zP3&mwOsvGd$!>2&tf1Y|vaGmO%RXvUc5%UX1tEoCSKRdjyJHH#xJuP#~a%P z@hjua;@8AmTFtE%@$2JltX6gxtG(6E>R@%Ua_#%9F7_zYR>xN{;aB4e5%;r8=-ZgJ z>D!pHA4#cBwSQ^Pu%EVP+t1qb?BCc6?f{sm7_G|V!`we@e{kFZu{-eFk z{*XMJiNv~sK?_Eq+^mWZ8-9kFk)+s2N?N@K_Eo9zx(sui|7TWMBR`;484i?|W@ z#sl%N-8>$RTb3EOEq}afJl$##&y3fOXIX9I^{qznY^z!Pa;r(ai9I5IRlIrp+ITDb zI;&;;hIm`6wcX9?Vc&0cLz(?Xu8|9g^f0iGFutFGo@C@fMjrVU4VGdQLQ-iYsW>F{ z0;_7QHvY=$8~cp?@KBW0eqm3ypR#A!zqaSv&)W;^7wyINZ|&vw@9b6ftM*#^5B3K8 zEqk;5uKk| zWxZql(R$zd(E8Z=tMzy56YHPWt=7NnrgjU9$G(mI%WiGo82c*rUF;jXoqdZHwL*3$ ztBQ4recCRCbD_sQaeq8yUmcIcW0nz5vwZPO;?=GC@r-z__@&m3@p{%}@rKq_@kZ7a z@hj|m<4xmN$6Lg&vs+r%##_g4w63?iTDRGSmaO%UlN!hDj|R^>jb)-w>-J-iIriEI zHkmMiJDDKi4^f=-|22Hkq}SGXw>gv3pTATzwyScfaCDB zPhpIO%uqwz1!tm#vaN?ed)RsqaE$c;;6v8^fTOMZ03WpS0Y{>Qx`Ex9NuD}-qr%`t z8@CxljQh|7Im#>Rj+C)t#9s-F8+8HOpd?b0n#(vNj5r@gP^V>M>zU9?V(S2p#a;(I z99s+c9r5{tgK7A(&S}E{t^68tpWoX-;h3#=)7K>F_yQWoOr-P)>tXJ)9p?Odu|c@g zC!Gn%JI7i9dFLfPNN7=@p~M3XBpo^Rz(*)|9n5)3d;+NQI(h)5gRdd6*AZV2^Q01g z7C649hB(MJ@EiKqGccddIY{BfRcc{&Rn4Z#?<+x1!}9^TA$wRkF3>U_ZLoHaHbm}M zp$*f9BHn}VL$=UbW3TAW+HKmMxX#6;iZBDaA`BBT?3N(QVc?GWGCVEmicy+lu2=Tc zG-yH%lny?Y{RqM^_&_n7@kLkp#U;vTCi7wEY?;#xKLIH3dIjW)?2uWl5ZkTVmrWMA`dv4cZR+SB=4`iH$7>@hap=0~jS z?pNKl(%q`OOGOzX(laXe)Xm86&icRltpCuj3h6hv{>vE!BQ`X7xMGy|=*PWh5p<|! zka_+NPmzgJFc(8-TV&R zhZnQsn3E6VPB;s9v90i3)gHVbc4`@luc{XE@q8+u%@^XHa~(Ac`?FLP zS)z$(B|3;6qMsOq@1+)qLNOj+51%a-iWQj4*dn^2{v!}(Agn~#j@c0S{aRH7>{x-H z2+s9%jNjt#M)-5UvHvjP^MH5schg!U%^J_9cqji!qQ3^bvxBb%-o?RR2j11e*8%V5 z;C}#qtApbUSMeMNe*<`T2j2iZSK*^c@ z8qnk%CD7=-o~Pn>_@Vgy+6!5+d z{vhx?2OkZ*pMyUHyuX8w0Y1RN9|k_q!N&q03kj4nTMQKp~&?ZVV z2Wd7EhTT?Nv^Oc=W0Em`g2^wC)bmRGZW#lN%RkHry#rX!SCQl9b8vjSB1iwXGN0rK z%*{~?Eh3KhqC8uO&y&Djq}+1X5BU?Jb%08m6{R3hcNtT;?jlrChD^4FWCm^(CC6lL z6~i)du4l-Z-b`5nV96Lc`&v&24PFKyuw;yEk$R#B;C(U%*o9)G?-zjGliwJZo?vSn z8otopm+Ag*AsbI{Zg3v+2G;~Put2C|s0*_~Plsl+c=X=rM0k1_=TNpb?7l$FV6|X+ zFe7+*@QUD_!MlR=)fhd@XJG7Q#+AmiXtWyYto?-z5~(O#z|=IaE`XIz&cXdt zaTQOMR#m!H8CvD>DzmHnuFAeDpQPQKHY#mix|Lo#y;1s|=|j^;r$3xNF8%TJH`D)E z<8(%qjP#6~GCF76o^eOUof&s!jLTS^u{q2-)qbM(tlBGT|GD;O zwf|YWs7~!VL$c;&t<8En>(jb=U0>b0bvxGWTsNm~kGg&8&Z_&nx*O_lsk^`Kp?Zn> zp8A3MH`Je0|Ks|H>Yv6`YV`(}HyGAnL4$P-PBpCBuuj9=><6rr#S`5ZR7tbf1-OT`gxiFh6s+N~B8bDmhg~R+(C50kw0xw1Tt=SW1+Zo|WD> z{jT%}opydMeRB;w9?6JjWM;I_=;pNZ-5C=y)?{qS*p>13jAI$cGg;=)%#oQhG8bg7 zMLTcL+?Dw^v@@$2pmy$7^U0bsYR79=uU)5h!`k1If)w*trOQLu1+*bT%Kr@sGq2p$V${q)JRlKSc%j`G!aPzOOKUi zm)0+>d*ZVb3s1ao;x{MepO|-I_K9as%sTP(iJ2#6ocPs==_jV0_{E8-C#Ia3{LSWX z)*V}O?A2qdkNy7Gs$;Jl``xh>#}*&^pJR)TJ$LNa$EF|ad#uk_r@q?x)t?RxK6KBa zfrkbh>VN3=L$@8uJ=FP7^FvLGON&nxpDaFJTvB|j_^aZh#a|X5DL!0$sJOVesQB~Z ze-U@4T@_N$G`aYi-TYM^NY{ESoTFh(e9$Z6m2hBRWz&U>7u8KW)%IZXnN5v zil!D#DSEtUQqlOLfkl0bdKdL5$}P(L{2!ms{`}F;@BjSX&j)>;`+3#ReFx7R+;H&q zgRdTZ;-6#x`S5|$2fjK`bfEQt76+OiXuSD1!~dNBi~J|@AJ2a*|DpUo`91S{3@aLT zVA!X__6^%JZ1=ET!`>UVYS_!emJgdh?AAKB)*hB|Z$?4&L-AMQ{}W#j|4n>;{Q3C2 z_;c}R<4?y6;=|)Z;T zOo!)Z+<|a6@K12gLwEvs5zg=~4e&Hl5KwO8ZGZz{}W