From 6e627d0ebe1f7f596b6432cd5afa0bc91c1b3b9b Mon Sep 17 00:00:00 2001 From: Roo Date: Wed, 1 Jul 2026 02:27:38 +0000 Subject: [PATCH] =?UTF-8?q?admin=5Fszolg=C3=A1ltat=C3=B3k=5F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .roo/history.md | 682 ++-- backend/app/api/v1/api.py | 5 +- .../app/api/v1/endpoints/admin_providers.py | 1321 ++++++++ backend/app/api/v1/endpoints/expenses.py | 30 +- backend/app/api/v1/endpoints/services.py | 8 +- backend/app/core/i18n.py | 17 + .../app/models/gamification/gamification.py | 7 + backend/app/models/identity/__init__.py | 2 + backend/app/models/identity/social.py | 53 +- backend/app/models/marketplace/service.py | 10 +- backend/app/schemas/provider.py | 14 + .../app/scripts/check_provider_validations.py | 53 + .../scripts/seed_gamification_action_keys.py | 157 + .../app/scripts/seed_provider_point_rules.py | 124 + backend/app/services/asset_service.py | 4 +- backend/app/services/auth_service.py | 12 +- backend/app/services/cost_service.py | 10 +- backend/app/services/fleet_service.py | 14 +- backend/app/services/gamification_service.py | 61 +- backend/app/services/provider_service.py | 146 +- backend/app/services/social_service.py | 26 +- .../active/test_use_unverified_provider.py | 186 ++ ...7cd18fde7_feat_add_vehicle_classes_and_.py | 28 + backend/static/locales/cz.json | 131 + backend/static/locales/de.json | 131 + backend/static/locales/fr.json | 131 + backend/static/locales/ro.json | 131 + backend/static/locales/sk.json | 131 + docs/admin_providers_root_cause_analysis.md | 129 + ...ication_point_rules_disconnect_analysis.md | 187 ++ ...mification_provider_connection_analysis.md | 292 ++ ...8n_admin_audit_and_restructure_proposal.md | 376 +++ ...er_taxonomy_vehicle_compatibility_audit.md | 145 + ...vice_provider_gamification_audit_report.md | 336 ++ frontend_admin/.nuxt/components.d.ts | 4 + frontend_admin/.nuxt/dev/index.mjs | 2255 +++++-------- frontend_admin/.nuxt/dev/index.mjs.map | 2 +- .../client/_nuxt/{DFeMqB9v.js => 3DmZ0EM6.js} | 2 +- .../client/_nuxt/{CJMCLMKk.js => 8V3mnLXt.js} | 2 +- .../.nuxt/dist/client/_nuxt/B0cOE-5l.js | 5 - .../client/_nuxt/{LFK12hZo.js => B4o8ITTA.js} | 2 +- .../client/_nuxt/{jkQ9zsLP.js => BWG-H9Sq.js} | 2 +- .../.nuxt/dist/client/_nuxt/BalY_-5C.js | 1 + .../.nuxt/dist/client/_nuxt/BfC4gsFh.js | 1 + .../.nuxt/dist/client/_nuxt/BinThMrD.js | 1 + .../client/_nuxt/{VxZautWX.js => BmPpcd_L.js} | 2 +- .../.nuxt/dist/client/_nuxt/BooUk3hi.js | 1 + .../dist/client/_nuxt/BrLYzdOF.js} | 2 +- .../client/_nuxt/{C1E7awHm.js => Bz1JtWuj.js} | 2 +- .../client/_nuxt/{DP0xHAZ9.js => CBgSvLGj.js} | 2 +- .../.nuxt/dist/client/_nuxt/CDHQLGnI.js | 1 + .../client/_nuxt/{Bv5FHd8A.js => CKAu5_-p.js} | 2 +- .../dist/client/_nuxt/CMeyKwHf.js} | 2 +- .../client/_nuxt/{CefVczEW.js => CP4clZzX.js} | 2 +- .../client/_nuxt/{BGJXam6L.js => CVL-E3x9.js} | 2 +- .../.nuxt/dist/client/_nuxt/CX89BmAa.js | 1 - .../.nuxt/dist/client/_nuxt/CrbW--3P.js | 1 - .../client/_nuxt/{15rOo9Uq.js => CuTzR9Y8.js} | 2 +- .../.nuxt/dist/client/_nuxt/CvHtXo6X.js | 1 - .../client/_nuxt/{DoGvoIta.js => CzDsb7xY.js} | 2 +- .../.nuxt/dist/client/_nuxt/DEGVr_1D.js | 1 + .../dist/client/_nuxt/DLhH35Ps.js} | 2 +- .../.nuxt/dist/client/_nuxt/DMACJq_0.js | 1 + .../dist/client/_nuxt/DN2UwQHX.js} | 2 +- .../.nuxt/dist/client/_nuxt/DS0l42iM.js | 1 + .../.nuxt/dist/client/_nuxt/DV_XBBqZ.js | 1 + .../client/_nuxt/{Bih4sFwO.js => D_rgCg0x.js} | 2 +- .../.nuxt/dist/client/_nuxt/Dg60rhbS.js | 1 + .../dist/client/_nuxt/DhOP_KNN.js} | 2 +- .../.nuxt/dist/client/_nuxt/DljN7UFd.js | 1 - .../client/_nuxt/{BSOl8Atk.js => DloAqf4K.js} | 2 +- .../.nuxt/dist/client/_nuxt/DlsU4vEK.js | 1 - .../dist/client/_nuxt/Dm5GcHjR.js} | 2 +- .../.nuxt/dist/client/_nuxt/DoxiXr8X.js | 1 - .../dist/client/_nuxt/Duy9QquX.js} | 10 +- .../.nuxt/dist/client/_nuxt/DyDOOl3L.js | 5 + .../.nuxt/dist/client/_nuxt/F5Gy7C0t.js | 1 + .../.nuxt/dist/client/_nuxt/K3DaV60P.js | 1 + .../client/_nuxt/{BUr2qI1j.js => MRVcNo51.js} | 2 +- .../.nuxt/dist/client/_nuxt/OHsHjcwB.js | 1 + .../.nuxt/dist/client/_nuxt/QcXNNtwJ.js | 1 - .../.nuxt/dist/client/_nuxt/RU4T5TAq.js | 1 + .../.nuxt/dist/client/_nuxt/SEfBnA2b.js | 1 - .../.nuxt/dist/client/_nuxt/_id_.BbvSG4P_.css | 1 + .../.nuxt/dist/client/_nuxt/dxAJkDQw.js | 1 + .../.nuxt/dist/client/_nuxt/eAjy9X9S.js | 1 + .../.nuxt/dist/client/_nuxt/edit.DU9LJnkZ.css | 1 + .../dist/client/_nuxt/gIYfPFdX.js} | 2 +- .../.nuxt/dist/client/_nuxt/hxLu6bwn.js | 1 + .../client/_nuxt/{DJrjUIdP.js => iEY_AUwe.js} | 2 +- .../.nuxt/dist/client/_nuxt/iSrLnxnq.js | 1 + .../dist/client/_nuxt/index.DaNIpusu.css | 1 + .../dist/client/_nuxt/pending.COC_q5si.css | 1 + .../client/_nuxt/point-rules.BINQc_Qs.css | 1 - .../client/_nuxt/point-rules.vkD86dh6.css | 1 + .../dist/client/_nuxt/rejected.D_hI4g0u.css | 1 + .../{_id_-CoXhCsuZ.js => _id_-DvpH9xyV.js} | 4 +- ..._-CoXhCsuZ.js.map => _id_-DvpH9xyV.js.map} | 2 +- ....js.map.json => _id_-DvpH9xyV.js.map.json} | 2 +- .../.nuxt/dist/server/_nuxt/_id_-YGQP6BWl.js | 466 +++ .../dist/server/_nuxt/_id_-YGQP6BWl.js.map | 1 + .../server/_nuxt/_id_-YGQP6BWl.js.map.json | 1 + .../_nuxt/_id_-styles-1.mjs-QmIN6AFS.js | 5 + .../_nuxt/_id_-styles-1.mjs-QmIN6AFS.js.map | 1 + .../_id_-styles-1.mjs-QmIN6AFS.js.map.json | 1 + .../server/_nuxt/_id_-styles.nF0K7NP3.mjs | 4 + .../.nuxt/dist/server/_nuxt/cz-CP7lYDxM.js | 94 + .../dist/server/_nuxt/cz-CP7lYDxM.js.map | 1 + .../dist/server/_nuxt/cz-CP7lYDxM.js.map.json | 1 + .../.nuxt/dist/server/_nuxt/de-Cm6LRCyJ.js | 94 + .../dist/server/_nuxt/de-Cm6LRCyJ.js.map | 1 + .../dist/server/_nuxt/de-Cm6LRCyJ.js.map.json | 1 + .../dist/server/_nuxt/default-BHklGIzv.js.map | 1 - .../server/_nuxt/default-BHklGIzv.js.map.json | 1 - ...efault-BHklGIzv.js => default-BU4PyScw.js} | 111 +- .../dist/server/_nuxt/default-BU4PyScw.js.map | 1 + .../server/_nuxt/default-BU4PyScw.js.map.json | 1 + .../.nuxt/dist/server/_nuxt/edit-Db3uK3sd.js | 267 ++ .../dist/server/_nuxt/edit-Db3uK3sd.js.map | 1 + .../server/_nuxt/edit-Db3uK3sd.js.map.json | 1 + .../_nuxt/edit-styles-1.mjs-BA90eYv2.js | 5 + .../_nuxt/edit-styles-1.mjs-BA90eYv2.js.map | 1 + .../edit-styles-1.mjs-BA90eYv2.js.map.json | 1 + .../server/_nuxt/edit-styles.C6EseCac.mjs | 4 + .../.nuxt/dist/server/_nuxt/en-BsD3FKYP.js | 94 + .../dist/server/_nuxt/en-BsD3FKYP.js.map | 1 + .../dist/server/_nuxt/en-BsD3FKYP.js.map.json | 1 + .../.nuxt/dist/server/_nuxt/en-CjjyOvG7.js | 821 ----- .../dist/server/_nuxt/en-CjjyOvG7.js.map | 1 - .../dist/server/_nuxt/en-CjjyOvG7.js.map.json | 1 - .../_nuxt/entry-styles-1.mjs-63gfOghA.js | 5 - .../_nuxt/entry-styles-1.mjs-63gfOghA.js.map | 1 - .../entry-styles-1.mjs-63gfOghA.js.map.json | 1 - .../_nuxt/entry-styles-1.mjs-Dwi00BYZ.js | 5 + .../_nuxt/entry-styles-1.mjs-Dwi00BYZ.js.map | 1 + .../entry-styles-1.mjs-Dwi00BYZ.js.map.json | 1 + .../_nuxt/entry-styles-2.mjs-BuWm83RN.js | 5 - .../_nuxt/entry-styles-2.mjs-BuWm83RN.js.map | 1 - .../entry-styles-2.mjs-BuWm83RN.js.map.json | 1 - .../_nuxt/entry-styles-2.mjs-DlODQeqc.js | 5 + .../_nuxt/entry-styles-2.mjs-DlODQeqc.js.map | 1 + .../entry-styles-2.mjs-DlODQeqc.js.map.json | 1 + .../server/_nuxt/entry-styles.BpZkbTtd.mjs | 8 - .../server/_nuxt/entry-styles.rnjKdtip.mjs | 8 + ...-404-qU7XehyZ.js => error-404-BFLCmfEK.js} | 4 +- ...XehyZ.js.map => error-404-BFLCmfEK.js.map} | 2 +- ...ap.json => error-404-BFLCmfEK.js.map.json} | 2 +- .../.nuxt/dist/server/_nuxt/fr-Dw19bH13.js | 94 + .../dist/server/_nuxt/fr-Dw19bH13.js.map | 1 + .../dist/server/_nuxt/fr-Dw19bH13.js.map.json | 1 + .../.nuxt/dist/server/_nuxt/hu-CfkgEs2T.js | 94 + .../dist/server/_nuxt/hu-CfkgEs2T.js.map | 1 + .../dist/server/_nuxt/hu-CfkgEs2T.js.map.json | 1 + .../.nuxt/dist/server/_nuxt/hu-D4bAMIbU.js | 723 ----- .../dist/server/_nuxt/hu-D4bAMIbU.js.map | 1 - .../dist/server/_nuxt/hu-D4bAMIbU.js.map.json | 1 - .../{index-B6MDQHdV.js => index-B4tBHEvj.js} | 4 +- ...-B6MDQHdV.js.map => index-B4tBHEvj.js.map} | 2 +- ...js.map.json => index-B4tBHEvj.js.map.json} | 2 +- .../dist/server/_nuxt/index-B9tmK_Km.js.map | 1 - .../server/_nuxt/index-B9tmK_Km.js.map.json | 1 - .../dist/server/_nuxt/index-BD2eKDSC.js.map | 1 - .../server/_nuxt/index-BD2eKDSC.js.map.json | 1 - .../.nuxt/dist/server/_nuxt/index-BE0BbUXA.js | 164 + .../dist/server/_nuxt/index-BE0BbUXA.js.map | 1 + .../server/_nuxt/index-BE0BbUXA.js.map.json | 1 + .../{index-B9tmK_Km.js => index-BOjUVIK8.js} | 18 +- .../dist/server/_nuxt/index-BOjUVIK8.js.map | 1 + .../server/_nuxt/index-BOjUVIK8.js.map.json | 1 + .../dist/server/_nuxt/index-Bd_e7zBi.js.map | 1 - .../server/_nuxt/index-Bd_e7zBi.js.map.json | 1 - .../{index-CemkpUgu.js => index-Bi2XSDbq.js} | 24 +- .../dist/server/_nuxt/index-Bi2XSDbq.js.map | 1 + .../server/_nuxt/index-Bi2XSDbq.js.map.json | 1 + .../{index-BD2eKDSC.js => index-CQNxIjHJ.js} | 14 +- .../dist/server/_nuxt/index-CQNxIjHJ.js.map | 1 + .../server/_nuxt/index-CQNxIjHJ.js.map.json | 1 + .../dist/server/_nuxt/index-CemkpUgu.js.map | 1 - .../server/_nuxt/index-CemkpUgu.js.map.json | 1 - .../{index-Ci9UUd4C.js => index-CncnskcL.js} | 4 +- ...-Ci9UUd4C.js.map => index-CncnskcL.js.map} | 2 +- ...js.map.json => index-CncnskcL.js.map.json} | 2 +- .../dist/server/_nuxt/index-D8qGjmnz.js.map | 1 - .../server/_nuxt/index-D8qGjmnz.js.map.json | 1 - .../{index-DN4o4Z9u.js => index-DAqVPqqO.js} | 4 +- ...-DN4o4Z9u.js.map => index-DAqVPqqO.js.map} | 2 +- ...js.map.json => index-DAqVPqqO.js.map.json} | 2 +- .../{index-D8qGjmnz.js => index-DP7v0fI5.js} | 22 +- .../dist/server/_nuxt/index-DP7v0fI5.js.map | 1 + .../server/_nuxt/index-DP7v0fI5.js.map.json | 1 + .../{index-Bd_e7zBi.js => index-DwENgmvX.js} | 8 +- .../dist/server/_nuxt/index-DwENgmvX.js.map | 1 + .../server/_nuxt/index-DwENgmvX.js.map.json | 1 + .../{index-Bf37iyk4.js => index-kkjYgRlj.js} | 4 +- ...-Bf37iyk4.js.map => index-kkjYgRlj.js.map} | 2 +- ...js.map.json => index-kkjYgRlj.js.map.json} | 2 +- .../_nuxt/index-styles-1.mjs-BjK7Uv_f.js | 5 + .../_nuxt/index-styles-1.mjs-BjK7Uv_f.js.map | 1 + .../index-styles-1.mjs-BjK7Uv_f.js.map.json | 1 + .../server/_nuxt/index-styles.DvNtzTM4.mjs | 4 + ...rd-C-QWIlDh.js => leaderboard-CqTgptys.js} | 4 +- ...lDh.js.map => leaderboard-CqTgptys.js.map} | 2 +- ....json => leaderboard-CqTgptys.js.map.json} | 2 +- .../{login-BUpiBmf8.js => login-BxbJ5I4C.js} | 4 +- ...-BUpiBmf8.js.map => login-BxbJ5I4C.js.map} | 2 +- ...js.map.json => login-BxbJ5I4C.js.map.json} | 2 +- ...link-Ci8vU-Yt.js => nuxt-link-1NBbHb-h.js} | 4 +- ...vU-Yt.js.map => nuxt-link-1NBbHb-h.js.map} | 2 +- ...ap.json => nuxt-link-1NBbHb-h.js.map.json} | 2 +- .../dist/server/_nuxt/pending-B_DY9I_j.js | 150 + .../dist/server/_nuxt/pending-B_DY9I_j.js.map | 1 + .../server/_nuxt/pending-B_DY9I_j.js.map.json | 1 + .../_nuxt/pending-styles-1.mjs-BDEW_Ft1.js | 5 + .../pending-styles-1.mjs-BDEW_Ft1.js.map | 1 + .../pending-styles-1.mjs-BDEW_Ft1.js.map.json | 1 + .../server/_nuxt/pending-styles.B1sSYHqL.mjs | 4 + .../dist/server/_nuxt/point-rules-C1ou37W0.js | 101 - .../server/_nuxt/point-rules-C1ou37W0.js.map | 1 - .../_nuxt/point-rules-C1ou37W0.js.map.json | 1 - .../point-rules-styles-1.mjs-1zmlIYGa.js | 5 + .../point-rules-styles-1.mjs-1zmlIYGa.js.map | 1 + ...nt-rules-styles-1.mjs-1zmlIYGa.js.map.json | 1 + .../point-rules-styles-1.mjs-MLgCcaRj.js | 5 - .../point-rules-styles-1.mjs-MLgCcaRj.js.map | 1 - ...nt-rules-styles-1.mjs-MLgCcaRj.js.map.json | 1 - .../_nuxt/point-rules-styles.D6gDWcZt.mjs | 4 - .../_nuxt/point-rules-styles.Dzr7IExe.mjs | 4 + .../dist/server/_nuxt/point-rules-tyImSuJC.js | 132 + .../server/_nuxt/point-rules-tyImSuJC.js.map | 1 + .../_nuxt/point-rules-tyImSuJC.js.map.json | 1 + .../dist/server/_nuxt/rejected-jHmJwXbQ.js | 156 + .../server/_nuxt/rejected-jHmJwXbQ.js.map | 1 + .../_nuxt/rejected-jHmJwXbQ.js.map.json | 1 + .../_nuxt/rejected-styles-1.mjs-DnvnPedc.js | 5 + .../rejected-styles-1.mjs-DnvnPedc.js.map | 1 + ...rejected-styles-1.mjs-DnvnPedc.js.map.json | 1 + .../server/_nuxt/rejected-styles.B0U6TQLK.mjs | 4 + .../.nuxt/dist/server/_nuxt/ro-BGndMdxF.js | 94 + .../dist/server/_nuxt/ro-BGndMdxF.js.map | 1 + .../dist/server/_nuxt/ro-BGndMdxF.js.map.json | 1 + .../.nuxt/dist/server/_nuxt/sk-D2IJ1iK1.js | 94 + .../dist/server/_nuxt/sk-D2IJ1iK1.js.map | 1 + .../dist/server/_nuxt/sk-D2IJ1iK1.js.map.json | 1 + .../.nuxt/dist/server/client.manifest.mjs | 2 +- .../.nuxt/dist/server/client.precomputed.mjs | 2 +- frontend_admin/.nuxt/dist/server/server.mjs | 165 +- .../.nuxt/dist/server/server.mjs.map | 2 +- .../.nuxt/dist/server/server.mjs.map.json | 2 +- frontend_admin/.nuxt/dist/server/styles.mjs | 15 +- frontend_admin/.nuxt/manifest/latest.json | 2 +- .../4c3848a1-194c-473b-9dda-e023b39983cf.json | 1 + frontend_admin/.nuxt/manifest/meta/dev.json | 2 +- .../f5b6ccee-0c83-43d5-86e7-8dae6c4b4232.json | 1 - frontend_admin/.nuxt/nitro.json | 4 +- frontend_admin/.nuxt/nuxt.d.ts | 2 +- frontend_admin/.nuxt/tailwind/postcss.mjs | 2 +- frontend_admin/.nuxt/tsconfig.json | 12 +- frontend_admin/.nuxt/tsconfig.server.json | 12 +- frontend_admin/.nuxt/types/components.d.ts | 4 + frontend_admin/.nuxt/types/i18n-plugin.d.ts | 2 +- frontend_admin/.nuxt/types/schema.d.ts | 20 + frontend_admin/.output/nitro.json | 2 +- .../public/_nuxt/{DFeMqB9v.js => 3DmZ0EM6.js} | 2 +- .../public/_nuxt/{CJMCLMKk.js => 8V3mnLXt.js} | 2 +- .../.output/public/_nuxt/B0cOE-5l.js | 5 - .../public/_nuxt/{LFK12hZo.js => B4o8ITTA.js} | 2 +- .../public/_nuxt/{jkQ9zsLP.js => BWG-H9Sq.js} | 2 +- .../.output/public/_nuxt/BalY_-5C.js | 1 + .../.output/public/_nuxt/BfC4gsFh.js | 1 + .../.output/public/_nuxt/BinThMrD.js | 1 + .../public/_nuxt/{VxZautWX.js => BmPpcd_L.js} | 2 +- .../.output/public/_nuxt/BooUk3hi.js | 1 + .../public/_nuxt/BrLYzdOF.js} | 2 +- .../public/_nuxt/{C1E7awHm.js => Bz1JtWuj.js} | 2 +- .../public/_nuxt/{DP0xHAZ9.js => CBgSvLGj.js} | 2 +- .../.output/public/_nuxt/CDHQLGnI.js | 1 + .../public/_nuxt/{Bv5FHd8A.js => CKAu5_-p.js} | 2 +- .../public/_nuxt/CMeyKwHf.js} | 2 +- .../public/_nuxt/{CefVczEW.js => CP4clZzX.js} | 2 +- .../public/_nuxt/{BGJXam6L.js => CVL-E3x9.js} | 2 +- .../.output/public/_nuxt/CX89BmAa.js | 1 - .../.output/public/_nuxt/CrbW--3P.js | 1 - .../public/_nuxt/{15rOo9Uq.js => CuTzR9Y8.js} | 2 +- .../.output/public/_nuxt/CvHtXo6X.js | 1 - .../public/_nuxt/{DoGvoIta.js => CzDsb7xY.js} | 2 +- .../.output/public/_nuxt/DEGVr_1D.js | 1 + .../public/_nuxt/DLhH35Ps.js} | 2 +- .../.output/public/_nuxt/DMACJq_0.js | 1 + .../public/_nuxt/DN2UwQHX.js} | 2 +- .../.output/public/_nuxt/DS0l42iM.js | 1 + .../.output/public/_nuxt/DV_XBBqZ.js | 1 + .../public/_nuxt/{Bih4sFwO.js => D_rgCg0x.js} | 2 +- .../.output/public/_nuxt/Dg60rhbS.js | 1 + .../public/_nuxt/DhOP_KNN.js} | 2 +- .../.output/public/_nuxt/DljN7UFd.js | 1 - .../public/_nuxt/{BSOl8Atk.js => DloAqf4K.js} | 2 +- .../.output/public/_nuxt/DlsU4vEK.js | 1 - .../public/_nuxt/Dm5GcHjR.js} | 2 +- .../.output/public/_nuxt/DoxiXr8X.js | 1 - .../public/_nuxt/Duy9QquX.js} | 10 +- .../.output/public/_nuxt/DyDOOl3L.js | 5 + .../.output/public/_nuxt/F5Gy7C0t.js | 1 + .../.output/public/_nuxt/K3DaV60P.js | 1 + .../public/_nuxt/{BUr2qI1j.js => MRVcNo51.js} | 2 +- .../.output/public/_nuxt/OHsHjcwB.js | 1 + .../.output/public/_nuxt/QcXNNtwJ.js | 1 - .../.output/public/_nuxt/RU4T5TAq.js | 1 + .../.output/public/_nuxt/SEfBnA2b.js | 1 - .../.output/public/_nuxt/_id_.BbvSG4P_.css | 1 + .../.output/public/_nuxt/builds/latest.json | 2 +- .../4c3848a1-194c-473b-9dda-e023b39983cf.json | 1 + .../.output/public/_nuxt/builds/meta/dev.json | 2 +- .../f5b6ccee-0c83-43d5-86e7-8dae6c4b4232.json | 1 - .../.output/public/_nuxt/dxAJkDQw.js | 1 + .../.output/public/_nuxt/eAjy9X9S.js | 1 + .../.output/public/_nuxt/edit.DU9LJnkZ.css | 1 + .../public/_nuxt/gIYfPFdX.js} | 2 +- .../.output/public/_nuxt/hxLu6bwn.js | 1 + .../public/_nuxt/{DJrjUIdP.js => iEY_AUwe.js} | 2 +- .../.output/public/_nuxt/iSrLnxnq.js | 1 + .../.output/public/_nuxt/index.DaNIpusu.css | 1 + .../.output/public/_nuxt/pending.COC_q5si.css | 1 + .../public/_nuxt/point-rules.BINQc_Qs.css | 1 - .../public/_nuxt/point-rules.vkD86dh6.css | 1 + .../public/_nuxt/rejected.D_hI4g0u.css | 1 + .../{_id_-CoXhCsuZ.mjs => _id_-DvpH9xyV.mjs} | 4 +- ...CoXhCsuZ.mjs.map => _id_-DvpH9xyV.mjs.map} | 2 +- .../server/chunks/build/_id_-YGQP6BWl.mjs | 474 +++ .../server/chunks/build/_id_-YGQP6BWl.mjs.map | 1 + .../chunks/build/_id_-styles.nF0K7NP3.mjs | 8 + .../chunks/build/_id_-styles.nF0K7NP3.mjs.map | 1 + .../chunks/build/client.precomputed.mjs | 2 +- .../chunks/build/client.precomputed.mjs.map | 2 +- .../server/chunks/build/cz-CP7lYDxM.mjs | 93 + .../server/chunks/build/cz-CP7lYDxM.mjs.map | 1 + .../server/chunks/build/de-Cm6LRCyJ.mjs | 93 + .../server/chunks/build/de-Cm6LRCyJ.mjs.map | 1 + .../chunks/build/default-BHklGIzv.mjs.map | 1 - ...ault-BHklGIzv.mjs => default-BU4PyScw.mjs} | 117 +- .../chunks/build/default-BU4PyScw.mjs.map | 1 + .../server/chunks/build/edit-Db3uK3sd.mjs | 255 ++ .../server/chunks/build/edit-Db3uK3sd.mjs.map | 1 + .../chunks/build/edit-styles.C6EseCac.mjs | 8 + .../chunks/build/edit-styles.C6EseCac.mjs.map | 1 + .../server/chunks/build/en-BsD3FKYP.mjs | 93 + .../server/chunks/build/en-BsD3FKYP.mjs.map | 1 + .../server/chunks/build/en-CjjyOvG7.mjs | 820 ----- .../server/chunks/build/en-CjjyOvG7.mjs.map | 1 - .../chunks/build/entry-styles.BpZkbTtd.mjs | 14 - .../build/entry-styles.BpZkbTtd.mjs.map | 1 - .../chunks/build/entry-styles.rnjKdtip.mjs | 14 + .../build/entry-styles.rnjKdtip.mjs.map | 1 + ...04-qU7XehyZ.mjs => error-404-BFLCmfEK.mjs} | 4 +- ...hyZ.mjs.map => error-404-BFLCmfEK.mjs.map} | 2 +- .../server/chunks/build/fr-Dw19bH13.mjs | 93 + .../server/chunks/build/fr-Dw19bH13.mjs.map | 1 + .../server/chunks/build/hu-CfkgEs2T.mjs | 93 + .../server/chunks/build/hu-CfkgEs2T.mjs.map | 1 + .../server/chunks/build/hu-D4bAMIbU.mjs | 722 ----- .../server/chunks/build/hu-D4bAMIbU.mjs.map | 1 - ...{index-B6MDQHdV.mjs => index-B4tBHEvj.mjs} | 4 +- ...6MDQHdV.mjs.map => index-B4tBHEvj.mjs.map} | 2 +- .../chunks/build/index-B9tmK_Km.mjs.map | 1 - .../chunks/build/index-BD2eKDSC.mjs.map | 1 - .../server/chunks/build/index-BE0BbUXA.mjs | 166 + .../chunks/build/index-BE0BbUXA.mjs.map | 1 + ...{index-B9tmK_Km.mjs => index-BOjUVIK8.mjs} | 18 +- .../chunks/build/index-BOjUVIK8.mjs.map | 1 + ...{index-CemkpUgu.mjs => index-Bi2XSDbq.mjs} | 24 +- ...emkpUgu.mjs.map => index-Bi2XSDbq.mjs.map} | 2 +- ...{index-BD2eKDSC.mjs => index-CQNxIjHJ.mjs} | 14 +- .../chunks/build/index-CQNxIjHJ.mjs.map | 1 + ...{index-Ci9UUd4C.mjs => index-CncnskcL.mjs} | 4 +- ...i9UUd4C.mjs.map => index-CncnskcL.mjs.map} | 2 +- ...{index-DN4o4Z9u.mjs => index-DAqVPqqO.mjs} | 4 +- ...N4o4Z9u.mjs.map => index-DAqVPqqO.mjs.map} | 2 +- ...{index-D8qGjmnz.mjs => index-DP7v0fI5.mjs} | 22 +- ...8qGjmnz.mjs.map => index-DP7v0fI5.mjs.map} | 2 +- ...{index-Bd_e7zBi.mjs => index-DwENgmvX.mjs} | 8 +- ...d_e7zBi.mjs.map => index-DwENgmvX.mjs.map} | 2 +- ...{index-Bf37iyk4.mjs => index-kkjYgRlj.mjs} | 4 +- ...f37iyk4.mjs.map => index-kkjYgRlj.mjs.map} | 2 +- .../chunks/build/index-styles.DvNtzTM4.mjs | 8 + .../build/index-styles.DvNtzTM4.mjs.map | 1 + ...-C-QWIlDh.mjs => leaderboard-CqTgptys.mjs} | 4 +- ...h.mjs.map => leaderboard-CqTgptys.mjs.map} | 2 +- ...{login-BUpiBmf8.mjs => login-BxbJ5I4C.mjs} | 4 +- ...UpiBmf8.mjs.map => login-BxbJ5I4C.mjs.map} | 2 +- ...nk-Ci8vU-Yt.mjs => nuxt-link-1NBbHb-h.mjs} | 4 +- ...-Yt.mjs.map => nuxt-link-1NBbHb-h.mjs.map} | 2 +- .../server/chunks/build/pending-B_DY9I_j.mjs | 153 + .../chunks/build/pending-B_DY9I_j.mjs.map | 1 + .../chunks/build/pending-styles.B1sSYHqL.mjs | 8 + .../build/pending-styles.B1sSYHqL.mjs.map | 1 + .../chunks/build/point-rules-C1ou37W0.mjs | 104 - .../chunks/build/point-rules-C1ou37W0.mjs.map | 1 - .../build/point-rules-styles.D6gDWcZt.mjs | 8 - .../build/point-rules-styles.D6gDWcZt.mjs.map | 1 - .../build/point-rules-styles.Dzr7IExe.mjs | 8 + .../build/point-rules-styles.Dzr7IExe.mjs.map | 1 + .../chunks/build/point-rules-tyImSuJC.mjs | 136 + .../chunks/build/point-rules-tyImSuJC.mjs.map | 1 + .../server/chunks/build/rejected-jHmJwXbQ.mjs | 159 + .../chunks/build/rejected-jHmJwXbQ.mjs.map | 1 + .../chunks/build/rejected-styles.B0U6TQLK.mjs | 8 + .../build/rejected-styles.B0U6TQLK.mjs.map | 1 + .../server/chunks/build/ro-BGndMdxF.mjs | 93 + .../server/chunks/build/ro-BGndMdxF.mjs.map | 1 + .../.output/server/chunks/build/server.mjs | 157 +- .../server/chunks/build/server.mjs.map | 2 +- .../server/chunks/build/sk-D2IJ1iK1.mjs | 93 + .../server/chunks/build/sk-D2IJ1iK1.mjs.map | 1 + .../.output/server/chunks/build/styles.mjs | 15 +- .../server/chunks/build/styles.mjs.map | 2 +- .../.output/server/chunks/nitro/nitro.mjs | 2809 +++++++---------- .../components/LanguageSwitcher.vue | 145 + frontend_admin/components/TreeNode.vue | 67 + frontend_admin/i18n/locales/cz.json | 90 + frontend_admin/i18n/locales/de.json | 90 + frontend_admin/i18n/locales/en.json | 877 +---- frontend_admin/i18n/locales/en/badges.json | 35 + .../i18n/locales/en/competitions.json | 38 + frontend_admin/i18n/locales/en/config.json | 26 + frontend_admin/i18n/locales/en/dashboard.json | 23 + .../locales/en/gamification_user_detail.json | 49 + .../i18n/locales/en/gamification_users.json | 35 + .../i18n/locales/en/garages-analytics.json | 24 + .../i18n/locales/en/garages-details.json | 83 + .../i18n/locales/en/garages-employees.json | 37 + .../i18n/locales/en/garages-fleet.json | 13 + frontend_admin/i18n/locales/en/garages.json | 53 + .../i18n/locales/en/leaderboard.json | 40 + frontend_admin/i18n/locales/en/ledger.json | 29 + frontend_admin/i18n/locales/en/levels.json | 32 + frontend_admin/i18n/locales/en/packages.json | 68 + frontend_admin/i18n/locales/en/params.json | 26 + .../i18n/locales/en/permissions.json | 28 + .../i18n/locales/en/point_rules.json | 40 + frontend_admin/i18n/locales/en/providers.json | 84 + frontend_admin/i18n/locales/en/seasons.json | 31 + .../i18n/locales/en/user_detail.json | 52 + frontend_admin/i18n/locales/en/users.json | 46 + frontend_admin/i18n/locales/fr.json | 90 + frontend_admin/i18n/locales/hu.json | 783 +---- frontend_admin/i18n/locales/hu/badges.json | 35 + .../i18n/locales/hu/competitions.json | 38 + frontend_admin/i18n/locales/hu/config.json | 26 + frontend_admin/i18n/locales/hu/dashboard.json | 23 + .../locales/hu/gamification_user_detail.json | 49 + .../i18n/locales/hu/gamification_users.json | 35 + .../i18n/locales/hu/garages-analytics.json | 24 + .../i18n/locales/hu/garages-details.json | 83 + .../i18n/locales/hu/garages-employees.json | 37 + .../i18n/locales/hu/garages-fleet.json | 13 + frontend_admin/i18n/locales/hu/garages.json | 53 + .../i18n/locales/hu/leaderboard.json | 40 + frontend_admin/i18n/locales/hu/ledger.json | 29 + frontend_admin/i18n/locales/hu/levels.json | 32 + frontend_admin/i18n/locales/hu/packages.json | 68 + frontend_admin/i18n/locales/hu/params.json | 26 + .../i18n/locales/hu/permissions.json | 28 + .../i18n/locales/hu/point_rules.json | 40 + frontend_admin/i18n/locales/hu/providers.json | 84 + frontend_admin/i18n/locales/hu/seasons.json | 31 + .../i18n/locales/hu/user_detail.json | 52 + frontend_admin/i18n/locales/hu/users.json | 46 + frontend_admin/i18n/locales/ro.json | 90 + frontend_admin/i18n/locales/sk.json | 90 + frontend_admin/layouts/default.vue | 45 +- frontend_admin/locales/cz.json | 631 ++++ frontend_admin/locales/de.json | 631 ++++ frontend_admin/locales/fr.json | 631 ++++ frontend_admin/locales/ro.json | 631 ++++ frontend_admin/locales/sk.json | 631 ++++ frontend_admin/nuxt.config.ts | 7 +- .../pages/gamification/point-rules.vue | 227 +- frontend_admin/pages/garages/index.vue | 24 +- frontend_admin/pages/packages/index.vue | 22 +- frontend_admin/pages/permissions/index.vue | 14 +- frontend_admin/pages/providers/[id].vue | 566 ---- frontend_admin/pages/providers/[id]/edit.vue | 1138 +++++++ frontend_admin/pages/providers/[id]/index.vue | 1069 +++++++ frontend_admin/pages/providers/index.vue | 10 +- frontend_admin/pages/providers/pending.vue | 1 + frontend_admin/pages/providers/rejected.vue | 253 ++ frontend_admin/pages/users/[id]/index.vue | 4 +- frontend_admin/pages/users/index.vue | 24 +- plans/logic_spec_point_rules_admin_fix.md | 102 + ...c_spec_service_provider_discovery_admin.md | 469 +++ .../provider_admin_edit_analysis_and_plan.md | 346 ++ tests/active/test_use_unverified_provider.py | 186 ++ 491 files changed, 20965 insertions(+), 9703 deletions(-) create mode 100644 backend/app/api/v1/endpoints/admin_providers.py create mode 100644 backend/app/scripts/check_provider_validations.py create mode 100644 backend/app/scripts/seed_gamification_action_keys.py create mode 100644 backend/app/scripts/seed_provider_point_rules.py create mode 100644 backend/backend/tests/active/test_use_unverified_provider.py create mode 100644 backend/migrations/versions/2387cd18fde7_feat_add_vehicle_classes_and_.py create mode 100644 backend/static/locales/cz.json create mode 100644 backend/static/locales/de.json create mode 100644 backend/static/locales/fr.json create mode 100644 backend/static/locales/ro.json create mode 100644 backend/static/locales/sk.json create mode 100644 docs/admin_providers_root_cause_analysis.md create mode 100644 docs/gamification_point_rules_disconnect_analysis.md create mode 100644 docs/gamification_provider_connection_analysis.md create mode 100644 docs/i18n_admin_audit_and_restructure_proposal.md create mode 100644 docs/p0_provider_taxonomy_vehicle_compatibility_audit.md create mode 100644 docs/p0_service_provider_gamification_audit_report.md rename frontend_admin/.nuxt/dist/client/_nuxt/{DFeMqB9v.js => 3DmZ0EM6.js} (96%) rename frontend_admin/.nuxt/dist/client/_nuxt/{CJMCLMKk.js => 8V3mnLXt.js} (89%) delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/B0cOE-5l.js rename frontend_admin/.nuxt/dist/client/_nuxt/{LFK12hZo.js => B4o8ITTA.js} (99%) rename frontend_admin/.nuxt/dist/client/_nuxt/{jkQ9zsLP.js => BWG-H9Sq.js} (99%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/BalY_-5C.js create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/BfC4gsFh.js create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/BinThMrD.js rename frontend_admin/.nuxt/dist/client/_nuxt/{VxZautWX.js => BmPpcd_L.js} (94%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/BooUk3hi.js rename frontend_admin/{.output/public/_nuxt/D5UKrFBE.js => .nuxt/dist/client/_nuxt/BrLYzdOF.js} (98%) rename frontend_admin/.nuxt/dist/client/_nuxt/{C1E7awHm.js => Bz1JtWuj.js} (99%) rename frontend_admin/.nuxt/dist/client/_nuxt/{DP0xHAZ9.js => CBgSvLGj.js} (99%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/CDHQLGnI.js rename frontend_admin/.nuxt/dist/client/_nuxt/{Bv5FHd8A.js => CKAu5_-p.js} (86%) rename frontend_admin/{.output/public/_nuxt/VRBzZU6y.js => .nuxt/dist/client/_nuxt/CMeyKwHf.js} (63%) rename frontend_admin/.nuxt/dist/client/_nuxt/{CefVczEW.js => CP4clZzX.js} (98%) rename frontend_admin/.nuxt/dist/client/_nuxt/{BGJXam6L.js => CVL-E3x9.js} (96%) delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/CX89BmAa.js delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/CrbW--3P.js rename frontend_admin/.nuxt/dist/client/_nuxt/{15rOo9Uq.js => CuTzR9Y8.js} (98%) delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/CvHtXo6X.js rename frontend_admin/.nuxt/dist/client/_nuxt/{DoGvoIta.js => CzDsb7xY.js} (96%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/DEGVr_1D.js rename frontend_admin/{.output/public/_nuxt/Bn2ryKUU.js => .nuxt/dist/client/_nuxt/DLhH35Ps.js} (99%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/DMACJq_0.js rename frontend_admin/{.output/public/_nuxt/CGypILv6.js => .nuxt/dist/client/_nuxt/DN2UwQHX.js} (99%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/DS0l42iM.js create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/DV_XBBqZ.js rename frontend_admin/.nuxt/dist/client/_nuxt/{Bih4sFwO.js => D_rgCg0x.js} (98%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/Dg60rhbS.js rename frontend_admin/{.output/public/_nuxt/CUXMJ-zd.js => .nuxt/dist/client/_nuxt/DhOP_KNN.js} (87%) delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/DljN7UFd.js rename frontend_admin/.nuxt/dist/client/_nuxt/{BSOl8Atk.js => DloAqf4K.js} (99%) delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/DlsU4vEK.js rename frontend_admin/{.output/public/_nuxt/BrmL0SWZ.js => .nuxt/dist/client/_nuxt/Dm5GcHjR.js} (99%) delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/DoxiXr8X.js rename frontend_admin/{.output/public/_nuxt/BMplCfh_.js => .nuxt/dist/client/_nuxt/Duy9QquX.js} (69%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/DyDOOl3L.js create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/F5Gy7C0t.js create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/K3DaV60P.js rename frontend_admin/.nuxt/dist/client/_nuxt/{BUr2qI1j.js => MRVcNo51.js} (99%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/OHsHjcwB.js delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/QcXNNtwJ.js create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/RU4T5TAq.js delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/SEfBnA2b.js create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/_id_.BbvSG4P_.css create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/dxAJkDQw.js create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/eAjy9X9S.js create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/edit.DU9LJnkZ.css rename frontend_admin/{.output/public/_nuxt/CJmlBuup.js => .nuxt/dist/client/_nuxt/gIYfPFdX.js} (99%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/hxLu6bwn.js rename frontend_admin/.nuxt/dist/client/_nuxt/{DJrjUIdP.js => iEY_AUwe.js} (96%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/iSrLnxnq.js create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/index.DaNIpusu.css create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/pending.COC_q5si.css delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/point-rules.BINQc_Qs.css create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/point-rules.vkD86dh6.css create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/rejected.D_hI4g0u.css rename frontend_admin/.nuxt/dist/server/_nuxt/{_id_-CoXhCsuZ.js => _id_-DvpH9xyV.js} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{_id_-CoXhCsuZ.js.map => _id_-DvpH9xyV.js.map} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{_id_-CoXhCsuZ.js.map.json => _id_-DvpH9xyV.js.map.json} (99%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-YGQP6BWl.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-YGQP6BWl.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-YGQP6BWl.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-styles-1.mjs-QmIN6AFS.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-styles-1.mjs-QmIN6AFS.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-styles-1.mjs-QmIN6AFS.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-styles.nF0K7NP3.mjs create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/cz-CP7lYDxM.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/cz-CP7lYDxM.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/cz-CP7lYDxM.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/de-Cm6LRCyJ.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/de-Cm6LRCyJ.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/de-Cm6LRCyJ.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/default-BHklGIzv.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/default-BHklGIzv.js.map.json rename frontend_admin/.nuxt/dist/server/_nuxt/{default-BHklGIzv.js => default-BU4PyScw.js} (83%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/default-BU4PyScw.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/default-BU4PyScw.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-Db3uK3sd.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-Db3uK3sd.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-Db3uK3sd.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-styles-1.mjs-BA90eYv2.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-styles-1.mjs-BA90eYv2.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-styles-1.mjs-BA90eYv2.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-styles.C6EseCac.mjs create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/en-BsD3FKYP.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/en-BsD3FKYP.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/en-BsD3FKYP.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/en-CjjyOvG7.js delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/en-CjjyOvG7.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/en-CjjyOvG7.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-63gfOghA.js delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-63gfOghA.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-63gfOghA.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-Dwi00BYZ.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-Dwi00BYZ.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-Dwi00BYZ.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-BuWm83RN.js delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-BuWm83RN.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-BuWm83RN.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-DlODQeqc.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-DlODQeqc.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-DlODQeqc.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles.BpZkbTtd.mjs create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles.rnjKdtip.mjs rename frontend_admin/.nuxt/dist/server/_nuxt/{error-404-qU7XehyZ.js => error-404-BFLCmfEK.js} (98%) rename frontend_admin/.nuxt/dist/server/_nuxt/{error-404-qU7XehyZ.js.map => error-404-BFLCmfEK.js.map} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{error-404-qU7XehyZ.js.map.json => error-404-BFLCmfEK.js.map.json} (99%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/fr-Dw19bH13.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/fr-Dw19bH13.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/fr-Dw19bH13.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/hu-CfkgEs2T.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/hu-CfkgEs2T.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/hu-CfkgEs2T.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/hu-D4bAMIbU.js delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/hu-D4bAMIbU.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/hu-D4bAMIbU.js.map.json rename frontend_admin/.nuxt/dist/server/_nuxt/{index-B6MDQHdV.js => index-B4tBHEvj.js} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{index-B6MDQHdV.js.map => index-B4tBHEvj.js.map} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{index-B6MDQHdV.js.map.json => index-B4tBHEvj.js.map.json} (99%) delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-B9tmK_Km.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-B9tmK_Km.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-BD2eKDSC.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-BD2eKDSC.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-BE0BbUXA.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-BE0BbUXA.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-BE0BbUXA.js.map.json rename frontend_admin/.nuxt/dist/server/_nuxt/{index-B9tmK_Km.js => index-BOjUVIK8.js} (90%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-BOjUVIK8.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-BOjUVIK8.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-Bd_e7zBi.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-Bd_e7zBi.js.map.json rename frontend_admin/.nuxt/dist/server/_nuxt/{index-CemkpUgu.js => index-Bi2XSDbq.js} (85%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-Bi2XSDbq.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-Bi2XSDbq.js.map.json rename frontend_admin/.nuxt/dist/server/_nuxt/{index-BD2eKDSC.js => index-CQNxIjHJ.js} (94%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-CQNxIjHJ.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-CQNxIjHJ.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-CemkpUgu.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-CemkpUgu.js.map.json rename frontend_admin/.nuxt/dist/server/_nuxt/{index-Ci9UUd4C.js => index-CncnskcL.js} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{index-Ci9UUd4C.js.map => index-CncnskcL.js.map} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{index-Ci9UUd4C.js.map.json => index-CncnskcL.js.map.json} (99%) delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-D8qGjmnz.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-D8qGjmnz.js.map.json rename frontend_admin/.nuxt/dist/server/_nuxt/{index-DN4o4Z9u.js => index-DAqVPqqO.js} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{index-DN4o4Z9u.js.map => index-DAqVPqqO.js.map} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{index-DN4o4Z9u.js.map.json => index-DAqVPqqO.js.map.json} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{index-D8qGjmnz.js => index-DP7v0fI5.js} (83%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-DP7v0fI5.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-DP7v0fI5.js.map.json rename frontend_admin/.nuxt/dist/server/_nuxt/{index-Bd_e7zBi.js => index-DwENgmvX.js} (65%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-DwENgmvX.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-DwENgmvX.js.map.json rename frontend_admin/.nuxt/dist/server/_nuxt/{index-Bf37iyk4.js => index-kkjYgRlj.js} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{index-Bf37iyk4.js.map => index-kkjYgRlj.js.map} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{index-Bf37iyk4.js.map.json => index-kkjYgRlj.js.map.json} (99%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-styles-1.mjs-BjK7Uv_f.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-styles-1.mjs-BjK7Uv_f.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-styles-1.mjs-BjK7Uv_f.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-styles.DvNtzTM4.mjs rename frontend_admin/.nuxt/dist/server/_nuxt/{leaderboard-C-QWIlDh.js => leaderboard-CqTgptys.js} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{leaderboard-C-QWIlDh.js.map => leaderboard-CqTgptys.js.map} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{leaderboard-C-QWIlDh.js.map.json => leaderboard-CqTgptys.js.map.json} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{login-BUpiBmf8.js => login-BxbJ5I4C.js} (97%) rename frontend_admin/.nuxt/dist/server/_nuxt/{login-BUpiBmf8.js.map => login-BxbJ5I4C.js.map} (98%) rename frontend_admin/.nuxt/dist/server/_nuxt/{login-BUpiBmf8.js.map.json => login-BxbJ5I4C.js.map.json} (98%) rename frontend_admin/.nuxt/dist/server/_nuxt/{nuxt-link-Ci8vU-Yt.js => nuxt-link-1NBbHb-h.js} (97%) rename frontend_admin/.nuxt/dist/server/_nuxt/{nuxt-link-Ci8vU-Yt.js.map => nuxt-link-1NBbHb-h.js.map} (99%) rename frontend_admin/.nuxt/dist/server/_nuxt/{nuxt-link-Ci8vU-Yt.js.map.json => nuxt-link-1NBbHb-h.js.map.json} (99%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/pending-B_DY9I_j.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/pending-B_DY9I_j.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/pending-B_DY9I_j.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/pending-styles-1.mjs-BDEW_Ft1.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/pending-styles-1.mjs-BDEW_Ft1.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/pending-styles-1.mjs-BDEW_Ft1.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/pending-styles.B1sSYHqL.mjs delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-C1ou37W0.js delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-C1ou37W0.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-C1ou37W0.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-styles-1.mjs-1zmlIYGa.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-styles-1.mjs-1zmlIYGa.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-styles-1.mjs-1zmlIYGa.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-styles-1.mjs-MLgCcaRj.js delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-styles-1.mjs-MLgCcaRj.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-styles-1.mjs-MLgCcaRj.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-styles.D6gDWcZt.mjs create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-styles.Dzr7IExe.mjs create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-tyImSuJC.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-tyImSuJC.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/point-rules-tyImSuJC.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/rejected-jHmJwXbQ.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/rejected-jHmJwXbQ.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/rejected-jHmJwXbQ.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/rejected-styles-1.mjs-DnvnPedc.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/rejected-styles-1.mjs-DnvnPedc.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/rejected-styles-1.mjs-DnvnPedc.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/rejected-styles.B0U6TQLK.mjs create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/ro-BGndMdxF.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/ro-BGndMdxF.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/ro-BGndMdxF.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/sk-D2IJ1iK1.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/sk-D2IJ1iK1.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/sk-D2IJ1iK1.js.map.json create mode 100644 frontend_admin/.nuxt/manifest/meta/4c3848a1-194c-473b-9dda-e023b39983cf.json delete mode 100644 frontend_admin/.nuxt/manifest/meta/f5b6ccee-0c83-43d5-86e7-8dae6c4b4232.json rename frontend_admin/.output/public/_nuxt/{DFeMqB9v.js => 3DmZ0EM6.js} (96%) rename frontend_admin/.output/public/_nuxt/{CJMCLMKk.js => 8V3mnLXt.js} (89%) delete mode 100644 frontend_admin/.output/public/_nuxt/B0cOE-5l.js rename frontend_admin/.output/public/_nuxt/{LFK12hZo.js => B4o8ITTA.js} (99%) rename frontend_admin/.output/public/_nuxt/{jkQ9zsLP.js => BWG-H9Sq.js} (99%) create mode 100644 frontend_admin/.output/public/_nuxt/BalY_-5C.js create mode 100644 frontend_admin/.output/public/_nuxt/BfC4gsFh.js create mode 100644 frontend_admin/.output/public/_nuxt/BinThMrD.js rename frontend_admin/.output/public/_nuxt/{VxZautWX.js => BmPpcd_L.js} (94%) create mode 100644 frontend_admin/.output/public/_nuxt/BooUk3hi.js rename frontend_admin/{.nuxt/dist/client/_nuxt/D5UKrFBE.js => .output/public/_nuxt/BrLYzdOF.js} (98%) rename frontend_admin/.output/public/_nuxt/{C1E7awHm.js => Bz1JtWuj.js} (99%) rename frontend_admin/.output/public/_nuxt/{DP0xHAZ9.js => CBgSvLGj.js} (99%) create mode 100644 frontend_admin/.output/public/_nuxt/CDHQLGnI.js rename frontend_admin/.output/public/_nuxt/{Bv5FHd8A.js => CKAu5_-p.js} (86%) rename frontend_admin/{.nuxt/dist/client/_nuxt/VRBzZU6y.js => .output/public/_nuxt/CMeyKwHf.js} (63%) rename frontend_admin/.output/public/_nuxt/{CefVczEW.js => CP4clZzX.js} (98%) rename frontend_admin/.output/public/_nuxt/{BGJXam6L.js => CVL-E3x9.js} (96%) delete mode 100644 frontend_admin/.output/public/_nuxt/CX89BmAa.js delete mode 100644 frontend_admin/.output/public/_nuxt/CrbW--3P.js rename frontend_admin/.output/public/_nuxt/{15rOo9Uq.js => CuTzR9Y8.js} (98%) delete mode 100644 frontend_admin/.output/public/_nuxt/CvHtXo6X.js rename frontend_admin/.output/public/_nuxt/{DoGvoIta.js => CzDsb7xY.js} (96%) create mode 100644 frontend_admin/.output/public/_nuxt/DEGVr_1D.js rename frontend_admin/{.nuxt/dist/client/_nuxt/Bn2ryKUU.js => .output/public/_nuxt/DLhH35Ps.js} (99%) create mode 100644 frontend_admin/.output/public/_nuxt/DMACJq_0.js rename frontend_admin/{.nuxt/dist/client/_nuxt/CGypILv6.js => .output/public/_nuxt/DN2UwQHX.js} (99%) create mode 100644 frontend_admin/.output/public/_nuxt/DS0l42iM.js create mode 100644 frontend_admin/.output/public/_nuxt/DV_XBBqZ.js rename frontend_admin/.output/public/_nuxt/{Bih4sFwO.js => D_rgCg0x.js} (98%) create mode 100644 frontend_admin/.output/public/_nuxt/Dg60rhbS.js rename frontend_admin/{.nuxt/dist/client/_nuxt/CUXMJ-zd.js => .output/public/_nuxt/DhOP_KNN.js} (87%) delete mode 100644 frontend_admin/.output/public/_nuxt/DljN7UFd.js rename frontend_admin/.output/public/_nuxt/{BSOl8Atk.js => DloAqf4K.js} (99%) delete mode 100644 frontend_admin/.output/public/_nuxt/DlsU4vEK.js rename frontend_admin/{.nuxt/dist/client/_nuxt/BrmL0SWZ.js => .output/public/_nuxt/Dm5GcHjR.js} (99%) delete mode 100644 frontend_admin/.output/public/_nuxt/DoxiXr8X.js rename frontend_admin/{.nuxt/dist/client/_nuxt/BMplCfh_.js => .output/public/_nuxt/Duy9QquX.js} (69%) create mode 100644 frontend_admin/.output/public/_nuxt/DyDOOl3L.js create mode 100644 frontend_admin/.output/public/_nuxt/F5Gy7C0t.js create mode 100644 frontend_admin/.output/public/_nuxt/K3DaV60P.js rename frontend_admin/.output/public/_nuxt/{BUr2qI1j.js => MRVcNo51.js} (99%) create mode 100644 frontend_admin/.output/public/_nuxt/OHsHjcwB.js delete mode 100644 frontend_admin/.output/public/_nuxt/QcXNNtwJ.js create mode 100644 frontend_admin/.output/public/_nuxt/RU4T5TAq.js delete mode 100644 frontend_admin/.output/public/_nuxt/SEfBnA2b.js create mode 100644 frontend_admin/.output/public/_nuxt/_id_.BbvSG4P_.css create mode 100644 frontend_admin/.output/public/_nuxt/builds/meta/4c3848a1-194c-473b-9dda-e023b39983cf.json delete mode 100644 frontend_admin/.output/public/_nuxt/builds/meta/f5b6ccee-0c83-43d5-86e7-8dae6c4b4232.json create mode 100644 frontend_admin/.output/public/_nuxt/dxAJkDQw.js create mode 100644 frontend_admin/.output/public/_nuxt/eAjy9X9S.js create mode 100644 frontend_admin/.output/public/_nuxt/edit.DU9LJnkZ.css rename frontend_admin/{.nuxt/dist/client/_nuxt/CJmlBuup.js => .output/public/_nuxt/gIYfPFdX.js} (99%) create mode 100644 frontend_admin/.output/public/_nuxt/hxLu6bwn.js rename frontend_admin/.output/public/_nuxt/{DJrjUIdP.js => iEY_AUwe.js} (96%) create mode 100644 frontend_admin/.output/public/_nuxt/iSrLnxnq.js create mode 100644 frontend_admin/.output/public/_nuxt/index.DaNIpusu.css create mode 100644 frontend_admin/.output/public/_nuxt/pending.COC_q5si.css delete mode 100644 frontend_admin/.output/public/_nuxt/point-rules.BINQc_Qs.css create mode 100644 frontend_admin/.output/public/_nuxt/point-rules.vkD86dh6.css create mode 100644 frontend_admin/.output/public/_nuxt/rejected.D_hI4g0u.css rename frontend_admin/.output/server/chunks/build/{_id_-CoXhCsuZ.mjs => _id_-DvpH9xyV.mjs} (99%) rename frontend_admin/.output/server/chunks/build/{_id_-CoXhCsuZ.mjs.map => _id_-DvpH9xyV.mjs.map} (98%) create mode 100644 frontend_admin/.output/server/chunks/build/_id_-YGQP6BWl.mjs create mode 100644 frontend_admin/.output/server/chunks/build/_id_-YGQP6BWl.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/_id_-styles.nF0K7NP3.mjs create mode 100644 frontend_admin/.output/server/chunks/build/_id_-styles.nF0K7NP3.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/cz-CP7lYDxM.mjs create mode 100644 frontend_admin/.output/server/chunks/build/cz-CP7lYDxM.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/de-Cm6LRCyJ.mjs create mode 100644 frontend_admin/.output/server/chunks/build/de-Cm6LRCyJ.mjs.map delete mode 100644 frontend_admin/.output/server/chunks/build/default-BHklGIzv.mjs.map rename frontend_admin/.output/server/chunks/build/{default-BHklGIzv.mjs => default-BU4PyScw.mjs} (83%) create mode 100644 frontend_admin/.output/server/chunks/build/default-BU4PyScw.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/edit-Db3uK3sd.mjs create mode 100644 frontend_admin/.output/server/chunks/build/edit-Db3uK3sd.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/edit-styles.C6EseCac.mjs create mode 100644 frontend_admin/.output/server/chunks/build/edit-styles.C6EseCac.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/en-BsD3FKYP.mjs create mode 100644 frontend_admin/.output/server/chunks/build/en-BsD3FKYP.mjs.map delete mode 100644 frontend_admin/.output/server/chunks/build/en-CjjyOvG7.mjs delete mode 100644 frontend_admin/.output/server/chunks/build/en-CjjyOvG7.mjs.map delete mode 100644 frontend_admin/.output/server/chunks/build/entry-styles.BpZkbTtd.mjs delete mode 100644 frontend_admin/.output/server/chunks/build/entry-styles.BpZkbTtd.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/entry-styles.rnjKdtip.mjs create mode 100644 frontend_admin/.output/server/chunks/build/entry-styles.rnjKdtip.mjs.map rename frontend_admin/.output/server/chunks/build/{error-404-qU7XehyZ.mjs => error-404-BFLCmfEK.mjs} (98%) rename frontend_admin/.output/server/chunks/build/{error-404-qU7XehyZ.mjs.map => error-404-BFLCmfEK.mjs.map} (94%) create mode 100644 frontend_admin/.output/server/chunks/build/fr-Dw19bH13.mjs create mode 100644 frontend_admin/.output/server/chunks/build/fr-Dw19bH13.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/hu-CfkgEs2T.mjs create mode 100644 frontend_admin/.output/server/chunks/build/hu-CfkgEs2T.mjs.map delete mode 100644 frontend_admin/.output/server/chunks/build/hu-D4bAMIbU.mjs delete mode 100644 frontend_admin/.output/server/chunks/build/hu-D4bAMIbU.mjs.map rename frontend_admin/.output/server/chunks/build/{index-B6MDQHdV.mjs => index-B4tBHEvj.mjs} (99%) rename frontend_admin/.output/server/chunks/build/{index-B6MDQHdV.mjs.map => index-B4tBHEvj.mjs.map} (98%) delete mode 100644 frontend_admin/.output/server/chunks/build/index-B9tmK_Km.mjs.map delete mode 100644 frontend_admin/.output/server/chunks/build/index-BD2eKDSC.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/index-BE0BbUXA.mjs create mode 100644 frontend_admin/.output/server/chunks/build/index-BE0BbUXA.mjs.map rename frontend_admin/.output/server/chunks/build/{index-B9tmK_Km.mjs => index-BOjUVIK8.mjs} (90%) create mode 100644 frontend_admin/.output/server/chunks/build/index-BOjUVIK8.mjs.map rename frontend_admin/.output/server/chunks/build/{index-CemkpUgu.mjs => index-Bi2XSDbq.mjs} (85%) rename frontend_admin/.output/server/chunks/build/{index-CemkpUgu.mjs.map => index-Bi2XSDbq.mjs.map} (54%) rename frontend_admin/.output/server/chunks/build/{index-BD2eKDSC.mjs => index-CQNxIjHJ.mjs} (94%) create mode 100644 frontend_admin/.output/server/chunks/build/index-CQNxIjHJ.mjs.map rename frontend_admin/.output/server/chunks/build/{index-Ci9UUd4C.mjs => index-CncnskcL.mjs} (99%) rename frontend_admin/.output/server/chunks/build/{index-Ci9UUd4C.mjs.map => index-CncnskcL.mjs.map} (99%) rename frontend_admin/.output/server/chunks/build/{index-DN4o4Z9u.mjs => index-DAqVPqqO.mjs} (99%) rename frontend_admin/.output/server/chunks/build/{index-DN4o4Z9u.mjs.map => index-DAqVPqqO.mjs.map} (99%) rename frontend_admin/.output/server/chunks/build/{index-D8qGjmnz.mjs => index-DP7v0fI5.mjs} (83%) rename frontend_admin/.output/server/chunks/build/{index-D8qGjmnz.mjs.map => index-DP7v0fI5.mjs.map} (76%) rename frontend_admin/.output/server/chunks/build/{index-Bd_e7zBi.mjs => index-DwENgmvX.mjs} (65%) rename frontend_admin/.output/server/chunks/build/{index-Bd_e7zBi.mjs.map => index-DwENgmvX.mjs.map} (98%) rename frontend_admin/.output/server/chunks/build/{index-Bf37iyk4.mjs => index-kkjYgRlj.mjs} (99%) rename frontend_admin/.output/server/chunks/build/{index-Bf37iyk4.mjs.map => index-kkjYgRlj.mjs.map} (98%) create mode 100644 frontend_admin/.output/server/chunks/build/index-styles.DvNtzTM4.mjs create mode 100644 frontend_admin/.output/server/chunks/build/index-styles.DvNtzTM4.mjs.map rename frontend_admin/.output/server/chunks/build/{leaderboard-C-QWIlDh.mjs => leaderboard-CqTgptys.mjs} (99%) rename frontend_admin/.output/server/chunks/build/{leaderboard-C-QWIlDh.mjs.map => leaderboard-CqTgptys.mjs.map} (98%) rename frontend_admin/.output/server/chunks/build/{login-BUpiBmf8.mjs => login-BxbJ5I4C.mjs} (97%) rename frontend_admin/.output/server/chunks/build/{login-BUpiBmf8.mjs.map => login-BxbJ5I4C.mjs.map} (94%) rename frontend_admin/.output/server/chunks/build/{nuxt-link-Ci8vU-Yt.mjs => nuxt-link-1NBbHb-h.mjs} (97%) rename frontend_admin/.output/server/chunks/build/{nuxt-link-Ci8vU-Yt.mjs.map => nuxt-link-1NBbHb-h.mjs.map} (98%) create mode 100644 frontend_admin/.output/server/chunks/build/pending-B_DY9I_j.mjs create mode 100644 frontend_admin/.output/server/chunks/build/pending-B_DY9I_j.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/pending-styles.B1sSYHqL.mjs create mode 100644 frontend_admin/.output/server/chunks/build/pending-styles.B1sSYHqL.mjs.map delete mode 100644 frontend_admin/.output/server/chunks/build/point-rules-C1ou37W0.mjs delete mode 100644 frontend_admin/.output/server/chunks/build/point-rules-C1ou37W0.mjs.map delete mode 100644 frontend_admin/.output/server/chunks/build/point-rules-styles.D6gDWcZt.mjs delete mode 100644 frontend_admin/.output/server/chunks/build/point-rules-styles.D6gDWcZt.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/point-rules-styles.Dzr7IExe.mjs create mode 100644 frontend_admin/.output/server/chunks/build/point-rules-styles.Dzr7IExe.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/point-rules-tyImSuJC.mjs create mode 100644 frontend_admin/.output/server/chunks/build/point-rules-tyImSuJC.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/rejected-jHmJwXbQ.mjs create mode 100644 frontend_admin/.output/server/chunks/build/rejected-jHmJwXbQ.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/rejected-styles.B0U6TQLK.mjs create mode 100644 frontend_admin/.output/server/chunks/build/rejected-styles.B0U6TQLK.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/ro-BGndMdxF.mjs create mode 100644 frontend_admin/.output/server/chunks/build/ro-BGndMdxF.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/sk-D2IJ1iK1.mjs create mode 100644 frontend_admin/.output/server/chunks/build/sk-D2IJ1iK1.mjs.map create mode 100644 frontend_admin/components/LanguageSwitcher.vue create mode 100644 frontend_admin/components/TreeNode.vue create mode 100644 frontend_admin/i18n/locales/cz.json create mode 100644 frontend_admin/i18n/locales/de.json create mode 100644 frontend_admin/i18n/locales/en/badges.json create mode 100644 frontend_admin/i18n/locales/en/competitions.json create mode 100644 frontend_admin/i18n/locales/en/config.json create mode 100644 frontend_admin/i18n/locales/en/dashboard.json create mode 100644 frontend_admin/i18n/locales/en/gamification_user_detail.json create mode 100644 frontend_admin/i18n/locales/en/gamification_users.json create mode 100644 frontend_admin/i18n/locales/en/garages-analytics.json create mode 100644 frontend_admin/i18n/locales/en/garages-details.json create mode 100644 frontend_admin/i18n/locales/en/garages-employees.json create mode 100644 frontend_admin/i18n/locales/en/garages-fleet.json create mode 100644 frontend_admin/i18n/locales/en/garages.json create mode 100644 frontend_admin/i18n/locales/en/leaderboard.json create mode 100644 frontend_admin/i18n/locales/en/ledger.json create mode 100644 frontend_admin/i18n/locales/en/levels.json create mode 100644 frontend_admin/i18n/locales/en/packages.json create mode 100644 frontend_admin/i18n/locales/en/params.json create mode 100644 frontend_admin/i18n/locales/en/permissions.json create mode 100644 frontend_admin/i18n/locales/en/point_rules.json create mode 100644 frontend_admin/i18n/locales/en/providers.json create mode 100644 frontend_admin/i18n/locales/en/seasons.json create mode 100644 frontend_admin/i18n/locales/en/user_detail.json create mode 100644 frontend_admin/i18n/locales/en/users.json create mode 100644 frontend_admin/i18n/locales/fr.json create mode 100644 frontend_admin/i18n/locales/hu/badges.json create mode 100644 frontend_admin/i18n/locales/hu/competitions.json create mode 100644 frontend_admin/i18n/locales/hu/config.json create mode 100644 frontend_admin/i18n/locales/hu/dashboard.json create mode 100644 frontend_admin/i18n/locales/hu/gamification_user_detail.json create mode 100644 frontend_admin/i18n/locales/hu/gamification_users.json create mode 100644 frontend_admin/i18n/locales/hu/garages-analytics.json create mode 100644 frontend_admin/i18n/locales/hu/garages-details.json create mode 100644 frontend_admin/i18n/locales/hu/garages-employees.json create mode 100644 frontend_admin/i18n/locales/hu/garages-fleet.json create mode 100644 frontend_admin/i18n/locales/hu/garages.json create mode 100644 frontend_admin/i18n/locales/hu/leaderboard.json create mode 100644 frontend_admin/i18n/locales/hu/ledger.json create mode 100644 frontend_admin/i18n/locales/hu/levels.json create mode 100644 frontend_admin/i18n/locales/hu/packages.json create mode 100644 frontend_admin/i18n/locales/hu/params.json create mode 100644 frontend_admin/i18n/locales/hu/permissions.json create mode 100644 frontend_admin/i18n/locales/hu/point_rules.json create mode 100644 frontend_admin/i18n/locales/hu/providers.json create mode 100644 frontend_admin/i18n/locales/hu/seasons.json create mode 100644 frontend_admin/i18n/locales/hu/user_detail.json create mode 100644 frontend_admin/i18n/locales/hu/users.json create mode 100644 frontend_admin/i18n/locales/ro.json create mode 100644 frontend_admin/i18n/locales/sk.json create mode 100644 frontend_admin/locales/cz.json create mode 100644 frontend_admin/locales/de.json create mode 100644 frontend_admin/locales/fr.json create mode 100644 frontend_admin/locales/ro.json create mode 100644 frontend_admin/locales/sk.json delete mode 100644 frontend_admin/pages/providers/[id].vue create mode 100644 frontend_admin/pages/providers/[id]/edit.vue create mode 100644 frontend_admin/pages/providers/[id]/index.vue create mode 100644 frontend_admin/pages/providers/rejected.vue create mode 100644 plans/logic_spec_point_rules_admin_fix.md create mode 100644 plans/logic_spec_service_provider_discovery_admin.md create mode 100644 plans/provider_admin_edit_analysis_and_plan.md create mode 100644 tests/active/test_use_unverified_provider.py diff --git a/.roo/history.md b/.roo/history.md index 6f25528..468ffc7 100644 --- a/.roo/history.md +++ b/.roo/history.md @@ -18,506 +18,308 @@ Teljes körű adatbázis konzisztencia ellenőrzés és zombie API végpontok fe GAMIFICATION szekció létrehozása a `backend/static/locales/en.json` és `hu.json` fájlokban a `docs/gamification_i18n_audit_and_fix_proposal.md` dokumentáció alapján. ### 🔧 Módosított fájlok -- `backend/static/locales/en.json` - GAMIFICATION szekció hozzáadva (16 kulcs: SUBMIT_SERVICE, QUIZ, BADGE, SEASON, ACHIEVEMENTS) -- `backend/static/locales/hu.json` - GAMIFICATION szekció hozzáadva (16 kulcs, magyar fordításokkal) -### ✅ Ellenőrzés -- JSON szintaxis: ✅ Érvényes mindkét fájlban -- i18n helper `t()` függvény: ✅ Minden kulcs lekérdezhető angolul és magyarul -- Interpoláció: ✅ `{error}` helyőrzők működnek -- Leaf key count: 16 = 16 (en/hu egyezés) - -## 2026-06-30 - [#344] Fázis 5/7: Backend API endpointok átalakítása - hardcoded stringek eltávolítása +## 2026-07-01 - Opening Hours (JSONB) Admin UI támogatás ### 🎯 Cél -A `backend/app/api/v1/endpoints/gamification.py` végpontjaiban található összes hardcoded magyar és angol szöveg cseréje az i18n `t()` helper segítségével. +Nyitvatartás (Opening Hours) JSONB mező adminisztrációs támogatásának megvalósítása: backend API (GET/PATCH), frontend edit UI (7 napos grid), frontend detail display. ### 🔧 Módosított fájlok -- `backend/app/api/v1/endpoints/gamification.py` - 14 helyen hardcoded string → `t("GAMIFICATION.xxx")` hívás; `from app.core.i18n import t` import hozzáadva -- `backend/static/locales/hu.json` - +10 új GAMIFICATION kulcs (QUIZ.ALREADY_COMPLETED, QUIZ.COMPLETED_SUCCESS, QUIZ.QUESTION_NOT_FOUND, QUIZ.POINTS_FAILED, BADGE.AWARDED_SUCCESS, BADGE.POINTS_FAILED, SEASON.NO_ACTIVE, XP_*_DESC, QUIZ_*_DESC) -- `backend/static/locales/en.json` - +10 új GAMIFICATION kulcs angol fordítással +- `backend/app/api/v1/endpoints/admin_providers.py` - ProviderDetail + ProviderUpdateInput sémák `opening_hours` mezővel; get_provider_detail() és update_provider() végpontok kiegészítése a ServiceProfile JSONB oszlop olvasásával/írásával +- `frontend_admin/pages/providers/[id]/edit.vue` - "Nyitvatartás" tab (4. tab) 7 napos grid-del, checkbox + time input párokkal, 24/7 gyorsgombbal, hétköznap másolással, összes törléssel +- `frontend_admin/pages/providers/[id]/index.vue` - Nyitvatartás megjelenítő tábla a részletes nézetben -### ✅ Ellenőrzés -- Python import: ✅ `from app.api.v1.endpoints.gamification import router` sikeres -- Szintaxis: ✅ Nincs hiba -- i18n lefedettség: ✅ Minden korábbi hardcoded string i18n kulcsra cserélve -- Interpoláció: ✅ `{error}`, `{badge_name}` helyőrzők működnek +### ✅ Verifikáció +- Sync Engine: 1297 OK, 0 Fixed, 0 Extra - rendszer tökéletesen szinkronban +- GET /admin/providers/1 → 200, `opening_hours` mező visszatér +- PATCH /admin/providers/1 `opening_hours` → 200, adatok perzisztálódnak és visszaolvashatók -## 2026-06-23 - Cost Entry Wizard (CostEntryWizard.vue) - 4-lépéses Számla Űrlap +## 2026-06-30 - [#377] M4: Többnyelvű támogatás bevezetése (DE, FR, RO, CZ, SK) ### 🎯 Cél -4-lépéses stepper wizard építése részletes számla/invoice költségek rögzítésére a CostsActionsCard-ból indíthatóan. +5 új nyelv (Német, Francia, Román, Cseh, Szlovák) bevezetése a backend és frontend admin i18n rendszerekbe. + +### 🔧 Létrehozott fájlok +- `backend/static/locales/de.json` - Backend német lokációs fájl (7 szekció) +- `backend/static/locales/fr.json` - Backend francia lokációs fájl (7 szekció) +- `backend/static/locales/ro.json` - Backend román lokációs fájl (7 szekció) +- `backend/static/locales/cz.json` - Backend cseh lokációs fájl (7 szekció) +- `backend/static/locales/sk.json` - Backend szlovák lokációs fájl (7 szekció) +- `frontend_admin/locales/de.json` - Frontend admin német fő lokációs fájl +- `frontend_admin/locales/fr.json` - Frontend admin francia fő lokációs fájl +- `frontend_admin/locales/ro.json` - Frontend admin román fő lokációs fájl +- `frontend_admin/locales/cz.json` - Frontend admin cseh fő lokációs fájl +- `frontend_admin/locales/sk.json` - Frontend admin szlovák fő lokációs fájl +- `frontend_admin/i18n/locales/de.json` - Frontend admin német közös lokációs fájl +- `frontend_admin/i18n/locales/fr.json` - Frontend admin francia közös lokációs fájl +- `frontend_admin/i18n/locales/ro.json` - Frontend admin román közös lokációs fájl +- `frontend_admin/i18n/locales/cz.json` - Frontend admin cseh közös lokációs fájl +- `frontend_admin/i18n/locales/sk.json` - Frontend admin szlovák közös lokációs fájl + +### 🔧 Módosított fájlok +- `frontend_admin/nuxt.config.ts` - 5 új nyelv regisztrálása a @nuxtjs/i18n konfigurációban + +### ✅ Verifikáció +- Backend i18n: Mind az 5 nyelv betöltődik (7-7 szekció), leaf key fordítések működnek +- Sync Engine: 1293 OK, 0 Fixed, 0 Extra - rendszer tökéletesen szinkronban + +### 🎯 Cél +GAMIFICATION szekció létrehozása a `backend/static/locales/en.json` és `hu.json` fájlokban a `docs/gamification_i18n_audit_and_fix_proposal.md` dokumentáció alapján. ### 🔧 Módosított fájlok -## 2026-06-24 - P0 Fix & Enhance: Permissions Page Data Flow, Editing & i18n +## 2026-06-30 - [#376] M3: Admin nyelvválasztó átalakítása legördülő menüvé ### 🎯 Cél -Permissions oldal adatáramlás javítása, szerkesztés/mentés funkció bevezetése, és @nuxtjs/i18n telepítése/konfigurálása. +A jelenlegi kétállású HU/EN kapcsoló átalakítása bővíthető, legördülő nyelvválasztó dropdownná, amely a backend-ből érkező támogatott nyelveket listázza. ### 🔧 Módosított fájlok -- `frontend_admin/pages/permissions/index.vue` - Teljes átírás: client-side data fetch onMounted-ben, szerkeszthető toggle-ok (modifiedPermissions Map), PATCH mentés, toast notification, $t() hívások -- `frontend_admin/nuxt.config.ts` - @nuxtjs/i18n modul hozzáadása, locales konfiguráció (hu/en) -- `frontend_admin/i18n/locales/hu.json` - Magyar fordítási fájl (permissions oldal összes szövege) -- `frontend_admin/i18n/locales/en.json` - Angol fordítási fájl +- `frontend_admin/components/LanguageSwitcher.vue` — **LÉTREHOZVA**: Új önálló LanguageSwitcher dropdown komponens zászló emoji-kkal, nyelv nevével, localStorage + backend perzisztálással +- `frontend_admin/layouts/default.vue` — **MÓDOSÍTVA**: 157-170. sorokban a régi gomb-alapú kapcsoló kicserélve `` komponensre; felesleges `useI18n` import és `switchLocale`/`getAuthHeaders` függvények eltávolítva -### ✅ Eredmények -- Build: ✅ Sikeres (hu-DbjfOUfH.mjs, en-DnJ23n0t.mjs locale chunk-ok) -- i18n modul: @nuxtjs/i18n v10.4.0 telepítve, no_prefix stratégiával -- Szerkesztés: modified/original Map-ek, handleToggle, savePermissions (PATCH /admin/permissions/override/{org_id}) -- Adatmentés: success/error toast notification auto-clear-el +### 📊 Eredmény +- LanguageSwitcher komponens: ✅ Létrehozva (zászló emoji, dinamikus locale lista, backend PATCH perzisztálás, localStorage) +- default.vue cleanup: ✅ 25 sor kód eltávolítva (i18n logika kiszervezve) +- Nuxt production build: ✅ Sikeres -## 2026-06-24 - P0 Execution: Wire Packages UI to Real Database +## 2026-06-30 - Admin Provider Root Cause Analysis (#379) + +**Vizsgálat típusa:** Rendszer-Architect root cause analysis +**Gitea kártya:** #379 + +### Felfedezett probléma +Az admin felület (providers list & pending queue) csak 6 rekordot mutat a `marketplace.service_providers` táblából. A robotok által gyűjtött 8569 rekord a `marketplace.service_staging`-ben láthatatlan. + +### Root Cause +A `backend/app/api/v1/endpoints/admin_providers.py` `list_providers()` és `get_provider_stats()` endpointjai kizárólag a `ServiceProvider` modellt kérdezik le. A `provider_service.py` `search_providers()` (public API) már helyesen használ UNION ALL-t mindhárom forrásból. + +### Javítási terv +1. `ProviderListItem` response model kiegészítése `source_table` mezővel +2. `list_providers()` UNION ALL kiterjesztése ServiceStaging-re +3. `get_provider_stats()` kiterjesztése staging rekordokkal +4. Nem kell új validációs mező - a `provider_validations`, `service_profiles.trust_score` stb. már létezik + +### Dokumentáció +`docs/admin_providers_root_cause_analysis.md` + +## 2026-06-30 - Admin Provider Discovery Implementáció ### 🎯 Cél -A frontend_admin Packages oldal (packages/index.vue) mock adatok helyett valós API adatbázisból töltse a SubscriptionTier csomagokat. "Új Csomag Létrehozása" gomb és modal hozzáadása. +A `list_providers()` admin végpont kiterjesztése UNION ALL lekérdezéssel, hogy a bot által gyűjtött ServiceStaging rekordok (8569 db) és a verified organization-ök is megjelenjenek az admin felületen. Új `rejected.vue` oldal az elutasított szolgáltatók visszaállításához. + +### 🔧 Változtatások +1. `backend/app/api/v1/endpoints/admin_providers.py`: + - `_build_unified_providers_query()`: UNION ALL a ServiceProvider, ServiceStaging és Organizations táblákból + - `source_filter` és `source_table_filter` a UNION ALL eredményére alkalmazva (nem az egyes részekre) - kijavítva a SourceType enum ütközési hibát + - `get_provider_stats()`: staging_pending mező hozzáadása + - `restore_provider()`: POST végpont rejected->approved státuszváltáshoz + - `get_provider_history()`, `update_provider()` végpontok +2. `frontend_admin/pages/providers/rejected.vue`: új oldal az elutasított szolgáltatók listázásához és visszaállításához +3. `frontend_admin/pages/providers/index.vue`: source_table, bot/verified_org szűrés támogatás +4. `frontend_admin/pages/providers/pending.vue`: source_table mező hozzáadása + +### ✅ Tesztek +- `source=bot` filter: 200 OK, 5 staging rekord visszaadva +- `source=verified_org` filter: 200 OK, 1 organization rekord +- `source_table=service_staging` filter: 200 OK, 3 staging rekord +- Stats: total=8575, staging_pending=5096 +- Rejected filter: 200 OK, 2 rejected rekord + +## 2026-06-30 - Provider Admin Tabbed Edit UI (Status, Validations, History) + +### 🎯 Cél +A szolgáltatók admin felületének bővítése: többfülű szerkesztési nézet, státuszkezelés, gamification validációs lista és állapotváltoztatási előzmények megjelenítése. ### 🔧 Módosított fájlok -- `backend/app/schemas/subscription.py` - `tier_level` és `feature_capabilities` mezők hozzáadva a SubscriptionTierResponse, SubscriptionTierCreate, SubscriptionTierUpdate modellekhez -- `backend/app/api/v1/endpoints/admin_packages.py` - create/update végpontok frissítve az új mezők kezelésére -- `frontend_admin/pages/packages/index.vue` - Teljes átírás: mock adatok eltávolítva, fetchPackages() API hívás, create/edit/delete modal-ok, loading/error/empty állapotok, i18n támogatás -- `frontend_admin/locales/hu.json` - packages i18n kulcsok (magyar) -- `frontend_admin/locales/en.json` - packages i18n kulcsok (angol) -## 2026-06-29 - #327 Gitea Kártya: Backend - Meglévő PATCH /admin/users/{id}/penalty endpoint javítása +**1. `backend/app/api/v1/endpoints/admin_providers.py`** +- `ProviderUpdateInput` séma bővítése: `status` (pending/approved/rejected) és `validation_score` (0-100) mezőkkel +- `ProviderValidationEntry` response séma létrehozása (id, provider_id, voter_user_id, validation_type, weight, validation_metadata, created_at, voter_name) +- `GET /admin/providers/{id}/validations` végpont: gamification validációk lekérése voter névvel +- `PATCH /admin/providers/{id}` módosítása: státuszváltás kezelése (ModerationStatus enum), old_data audit snapshot, validation_score auto-állítás restore/reject esetén + +**2. `frontend_admin/pages/providers/[id].vue`** +- Teljes átírás: egysávos layout helyett 4 fül (Adatok, Státusz, Validációk, Előzmények) +- **Adatok fül**: változatlan alapadatok, cím, elérhetőség, moderációs műveletek +- **Státusz fül**: új űrlap státusz select, validation_score range slider (0-100), indoklás textarea +- **Validációk fül**: gamification validációs lista típus-badge-ekkel, szavazó név, súly, metadata, timestamp +- **Előzmények fül**: idővonal action-badge-ekkel, státusz átmenetek (régi→új), user info, expandálható részletek +- Elutasított/Megjelölt szekció: "Szerkesztés" és "Visszaállítás" gombok minden státuszhoz + +### ✅ Verifikáció +- Sync Engine: ✅ 1293 OK, 0 Fixed, 0 Extra - teljes szinkron +- Backend syntax: ✅ admin_providers.py AST parse OK +- Backend import: ✅ router modul betöltés sikeres + +## 2026-06-30 - P0 Rescue: Admin Providers API Blocker Fixes ### 🎯 Cél -A #327-es Gitea kártya (Epic 8 Gamification 2.0, 4. implementációs lépés) feladata a meglévő `PATCH /admin/users/{user_id}/penalty` végpont hibáinak kijavítása. Az endpoint már refaktorálva volt GamificationService `process_activity()` használatára, de 3 hibát tartalmazott. - -### 🔧 Javított hibák - -**1. Hiányzó `import logging` az [`admin.py`](backend/app/api/v1/endpoints/admin.py)-ban** -- `logger.error()` hívás volt a fájlban (483. sor), de `import logging` nem szerepelt -- Javítás: `import logging` és `logger = logging.getLogger("admin-endpoints")` hozzáadva - -**2. Undefined variable `admin` a `approve_action` endpointban** -- 82. sor: `admin.id` helyett `current_user.id` (az `admin` változó sosem volt definiálva) - -**3. Rossz [`SecurityAuditLog`](backend/app/models/system/audit.py:12) mezőnevek a penalty endpointban (464-471. sor)** -- `user_id=current_user.id` → `actor_id=current_user.id` -- `target_user_id=user_id` → `target_id=user_id` -- `details="..."` → `payload_after={"penalty_points_added": ..., "reason": ...}` (JSON dict, nem string) -- `ip_address="admin_api"` → eltávolítva (nem létező mező) -- `payload_before={}` hozzáadva (kötelező mező) - -### 🐛 Hibakeresési tapasztalat -- A kezdeti 500-as hibaüzenet félrevezető volt: `'UserStats' object has no attribute 'level'` - valójában a `current_level` mező helyesen létezik -- A valódi hiba a `SecurityAuditLog` létrehozásánál volt, de a `raise e` minta a [`process_activity()`](backend/app/services/gamification_service.py:174)-ben elnyelte a belső traceback-et -- Stratégiai debug logging segítségével sikerült lokalizálni a valódi hibát -- `.pyc` cache törlése és konténer újraindítás szükséges volt a friss kód betöltéséhez - -### ✅ Eredmények -- HTTP 200: `{"status":"success","message":"Gamification penalty applied to user 1","user_id":1,"penalty_points_added":100,"total_penalty_points":300,"restriction_level":1}` -- Adatbázis: user 1 `penalty_points=300`, `restriction_level=1` -- Audit log: `audit.security_audit_logs` bejegyzés `action="apply_gamification_penalty"`, `actor_id=2`, `target_id=1` -- Sync Engine: ✅ 1284 OK, 0 Fixed, 0 Extra -- Debug logging eltávolítva a [`gamification_service.py`](backend/app/services/gamification_service.py)-ból -- Gitea #327: ✅ Lezárva - -## 2026-06-29 - Gitea #328: Gamification Admin Integration - Bugfixes & Endpoint Verification - -### 🎯 Cél -Gitea #328 ("Backend: gamification.py endpointok Gami") kártya feladatainak befejezése: admin gamification végpontok hibáinak javítása és teljes körű tesztelése. - -### 🔧 Javítások - -**1. [`gamification.py`](backend/app/api/v1/endpoints/gamification.py) - submit-service végpont hibák:** -- Hiányzó `logger` import hozzáadva (`import logging`, `logger = logging.getLogger("gamification-endpoints")`) -- `metadata={...}` → `provided_fields={...}` javítás (a `UserContribution` modellben `provided_fields` a JSONB mező neve) -- Hiányzó kötelező mezők hozzáadva: `action_type=1`, `earned_xp=submission_rewards.get("xp", 100)` - -**2. [`admin_gamification.py`](backend/app/api/v1/endpoints/admin_gamification.py) - master-config végpont javítás:** -- `system_service.get_setting()` → `system_service.get_scoped_parameter()` (a `SystemService`-ben nincs `get_setting` metódus) -- `system_service.set_setting()` → `system_service.set_scoped_parameter()` ugyanezen okból - -**3. [`system_service.py`](backend/app/services/system_service.py) - set_scoped_parameter upsert logika javítás:** -- Az eredeti `ON CONFLICT ON CONSTRAINT uix_param_scope` nem működött `scope_id IS NULL` esetén, mert PostgreSQL-ben a UNIQUE constraint nem blokkolja a NULL értékű duplikátumokat (NULL != NULL) -- Kétlépéses megközelítésre váltva: először megkeresi a meglévő rekordot, ha van frissíti, ha nincs beszúrja -- Adatbázis: `system.system_parameters.scope_level` oszlop típusa átállítva custom PostgreSQL enum-ról `VARCHAR(50)`-re a SQLAlchemy String(50) modellel való kompatibilitás miatt - -### ✅ Teszt Eredmények -- **Admin Gamification végpontok:** 18/18 ✅ (GET/POST/PUT/DELETE point-rules, level-configs, badges, seasons, competitions, user-stats, master-config, system-params, points-ledger, contributions) -- **Penalty/Reward végpontok:** ✅ POST `/admin/gamification/user-stats/{id}/penalty` és `/reward` -- **Legacy PATCH `/admin/users/{id}/penalty`:** ✅ Továbbra is működik a GamificationService-en keresztül -- **Sync Engine:** ✅ 1284 OK, 0 Fixed, 0 Extra -- **Gitea #328:** ✅ Lezárva - -## 2026-06-29 - #329 Frontend: Gamification menüpont + routing - -### 🎯 Cél -Gamification menüpont és routing létrehozása a Nuxt 3 admin frontendben. - -### 📝 Megvalósítás -- **`frontend_admin/layouts/default.vue`:** Gamification menücsoport beszúrása a sidebar `menuGroups` tömbjébe 6 menüelemmel (Játékmenet Beállítások, Események & Szezonok, Felhasználói Adatok, Gamification HQ, Rendszer Konfig, Rendszerparaméterek) -- **`frontend_admin/pages/gamification/`:** 12 oldal létrehozása: - - `index.vue` — Gamification HQ Dashboard (stat kártyák, gyors műveletek, pontnapló, top 5 ranglista) - - `point-rules.vue`, `levels.vue`, `badges.vue` — Játékmenet beállítások - - `seasons.vue`, `competitions.vue` — Események & Szezonok - - `users/index.vue`, `users/[id].vue` — Felhasználói statisztikák - - `leaderboard.vue`, `ledger.vue` — Ranglista és Pontnapló - - `config.vue`, `parameters.vue` — Rendszer konfiguráció -- **Routing:** Nuxt 3 file-based routing automatikusan generálja a route-okat -- **Build:** Sikeres Nuxt build (Vite + Nitro), konténer újraindítva -- **Gitea #329:** ✅ Elkészült - -## 2026-06-29 - Gitea #330: Gamification Dashboard (Frontend Admin) - -### 🎯 Cél -Gamification HQ Dashboard oldal (`/gamification/index.vue`) elkészítése az admin felülethez, stat kártyákkal, gyors műveletekkel, pontnaplóval és top 5 ranglistával. - -### 🔧 Módosított fájlok -- **`backend/app/api/v1/endpoints/admin_gamification.py`:** - - Új `GET /admin/gamification/dashboard-summary` végpont hozzáadva, ami összesíti: összes felhasználó, aktív szezon neve, függő hozzájárulások száma, mai XP - - `list_points_ledger` végpont javítva: `user_name` mező hozzáadva (User.email JOIN-nel) - - `datetime.utcnow()` → `datetime.now(timezone.utc)` deprecation fix -- **`frontend_admin/pages/gamification/index.vue`:** - - API hívás átirányítva a dedikált `/api/v1/admin/gamification/dashboard-summary` végpontra - - Leaderboard adatok mapping-je kiegészítve: `username`/`current_level`/`total_xp` mezők támogatása a backend válaszhoz igazodva -- **Sync Engine:** ✅ 1284 elem szinkronban, 0 hiba -- **Gitea #330:** ✅ Elkészült - -## 2026-06-29 - Gitea #331: Frontend Pontszabályok + Szintek CRUD oldal (admin) - -### 🎯 Cél -A Gamification admin felület Pontszabályok és Szintek CRUD oldalainak implementálása a Nuxt 3 admin frontendben. +4 darab kritikus blokkoló hiba javítása az Admin Providers flow-ban. ### 🔧 Változtatások -- **`frontend_admin/pages/gamification/point-rules.vue`:** - - Teljes CRUD implementáció: listázás, létrehozás, szerkesztés, soft-delete (is_active=False) - - Adattábla: ID, action_key, points, description, is_active oszlopok - - Create/Edit modal: action_key, points, description, is_active mezők validációval - - Delete confirmation modal soft-delete-hez - - 409 Conflict kezelés (duplikált action_key) - - Toast értesítések minden művelethez - - API végpont: `/api/v1/admin/gamification/point-rules` +**FIX 1 - Silent Rollback (PATCH endpoint):** +- [`update_provider()`](backend/app/api/v1/endpoints/admin_providers.py:1147) `db.commit()` köré `try/except IntegrityError` blokk került +- IntegrityError esetén `db.rollback()` + `HTTPException(400)` a csendes 200 OK helyett -- **`frontend_admin/pages/gamification/levels.vue`:** - - Teljes CRUD implementáció: listázás, létrehozás, szerkesztés - - Adattábla: level_number, rank_name, min_points, is_penalty oszlopok - - Create/Edit modal: level_number, rank_name, min_points, is_penalty mezők validációval - - Vizuális szint fa diagram progress bar-okkal - - 409 Conflict kezelés (duplikált level_number) - - Toast értesítések minden művelethez - - API végpont: `/api/v1/admin/gamification/level-configs` +**FIX 2 - Unique Constraint on Restore:** +- [`_create_provider_validation()`](backend/app/api/v1/endpoints/admin_providers.py:198) átírva PostgreSQL `INSERT ... ON CONFLICT DO UPDATE` (UPSERT) használatára +- A `uq_voter_provider_validation` constraint tiszteletben tartva -- **Build:** ✅ Sikeres Nuxt build a `sf_admin_frontend` konténerben -- **Gitea #331:** ✅ Elkészült +**FIX 3 - Wrong Frontend URL:** +- Ellenőrizve: a frontend [`[id].vue`](frontend_admin/pages/providers/[id].vue:761) már a helyes `/api/v1/admin/providers/{id}/validations` URL-t használja -## 2026-06-29 - Gitea #332: Frontend: Kitüntetések (Badge) kezelő oldal +**FIX 4 - AuditLog Attribute Error:** +- [`get_provider_history()`](backend/app/api/v1/endpoints/admin_providers.py:1029) `AuditLog.created_at` → `AuditLog.timestamp` +- `timestamp=log.created_at` → `timestamp=log.timestamp` + +### ✅ Verifikáció +- Backend syntax: ✅ `py_compile` OK +- Modul import: ✅ `admin_providers` modul betöltés sikeres +- Container: ✅ `sf_api` restart sikeres, státusz Up + + +## 2026-06-30 - [#381] P0 Fix: Provider validations 500 error & missing edit/flag modals ### 🎯 Cél -A Gamification admin felület Kitüntetések (Badge) CRUD oldalának implementálása a Nuxt 3 admin frontendben. A backend API végpontok már léteztek a [`admin_gamification.py`](backend/app/api/v1/endpoints/admin_gamification.py)-ban (GET/POST/PUT/DELETE `/admin/gamification/badges`). +Két P0 hibajavítás az Admin Provider Details oldalon. ### 🔧 Módosított fájlok -- **`frontend_admin/pages/gamification/badges.vue`:** - - Teljes CRUD implementáció: listázás, létrehozás, szerkesztés, törlés - - Adattábla: ID, Név, Leírás, Ikon (kép előnézettel), Műveletek oszlopok - - Create/Edit modal: name (kötelező, max 100), description (kötelező, max 500), icon_url (opcionális URL élő előnézettel) - - Delete confirmation modal: badge név és leírás megjelenítése - - 409 Conflict kezelés (duplikált név) - - Toast értesítések minden művelethez (siker/hiba) - - Loading, error és empty állapotok kezelése - - Auth middleware (`useAuth()`) - - API végpont: `/api/v1/admin/gamification/badges` +**Bug #1 - `get_provider_validations()` 500 error:** +- [`admin_providers.py`](backend/app/api/v1/endpoints/admin_providers.py:1018) — `v.voter.display_name` → `v.voter.email` +- Root cause: `User` modellben nincs `display_name` mező -### ✅ Eredmények -- **GET /admin/gamification/badges:** ✅ 200 OK (2 meglévő badge listázva) -- **POST /admin/gamification/badges:** ✅ 201 Created (új badge létrehozva egyedi névvel) -- **PUT /admin/gamification/badges/{id}:** ✅ 200 Updated (badge adatok módosítva) -- **DELETE /admin/gamification/badges/{id}:** ✅ 204 No Content (badge törölve, GET visszaadja a maradékot) -- **Sync Engine:** ✅ Ellenőrizve -- **Gitea #332:** ✅ Elkészült +**Bug #2 - Dead "Szerkesztés" gomb:** +- [`[id].vue`](frontend_admin/pages/providers/[id].vue:540) — Edit modal template hozzáadva (name, city, address, contact, category mezőkkel) +- [`[id].vue`](frontend_admin/pages/providers/[id].vue:603) — Flag modal template hozzáadva (indoklás textarea-val) +- Root cause: A `