From 7654913d21a1228f2d38ad5b08167c5fcc076d77 Mon Sep 17 00:00:00 2001 From: Roo Date: Wed, 1 Jul 2026 19:49:58 +0000 Subject: [PATCH] =?UTF-8?q?refaktor=20c=C3=ADmt=C3=A1r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .roo/history.md | 424 ++++---------- backend/app/api/v1/endpoints/admin.py | 33 +- .../api/v1/endpoints/admin_organizations.py | 149 +++-- backend/app/api/v1/endpoints/admin_persons.py | 134 +---- .../app/api/v1/endpoints/admin_providers.py | 85 ++- backend/app/api/v1/endpoints/expenses.py | 31 +- backend/app/api/v1/endpoints/organizations.py | 61 +- backend/app/api/v1/endpoints/search.py | 13 +- backend/app/api/v1/endpoints/users.py | 46 +- .../app/models/marketplace/organization.py | 57 +- backend/app/models/marketplace/service.py | 7 +- backend/app/schemas/address.py | 60 ++ backend/app/schemas/organization.py | 32 +- backend/app/schemas/provider.py | 28 + backend/app/schemas/user.py | 33 +- backend/app/services/address_manager.py | 267 +++++++++ backend/app/services/address_service.py | 140 +++++ backend/app/services/provider_service.py | 240 +++++--- .../active/test_use_unverified_provider.py | 100 ++-- docs/address_api_consistency_audit.md | 209 +++++++ ..._address_manager_usage_audit_2026-07-01.md | 72 +++ docs/sql/cleanup_ghost_columns_2026_07.sql | 65 +++ docs/tag_category_system_audit_report.md | 305 ++++++++++ frontend_admin/.nuxt/dev/index.mjs | 17 +- frontend_admin/.nuxt/dev/index.mjs.map | 2 +- .../client/_nuxt/{BrLYzdOF.js => 23m5KMmx.js} | 2 +- .../client/_nuxt/{Dm5GcHjR.js => B2Ol2ho3.js} | 2 +- .../dist/client/_nuxt/BBd0Wshd.js} | 2 +- .../client/_nuxt/{CBgSvLGj.js => BCVwWzC0.js} | 2 +- .../client/_nuxt/{Duy9QquX.js => BIbQr1Hg.js} | 6 +- .../client/_nuxt/{BfC4gsFh.js => BMOhxdBV.js} | 2 +- .../client/_nuxt/{8V3mnLXt.js => BYMyrldA.js} | 2 +- .../.nuxt/dist/client/_nuxt/BalY_-5C.js | 1 - .../client/_nuxt/{CKAu5_-p.js => BixZQTWP.js} | 2 +- .../dist/client/_nuxt/Bo3NTH2Q.js} | 2 +- .../client/_nuxt/{DMACJq_0.js => BugbZ1zh.js} | 2 +- .../dist/client/_nuxt/Bxonjlt7.js} | 2 +- .../client/_nuxt/{CuTzR9Y8.js => C2l6xpLd.js} | 2 +- .../client/_nuxt/{gIYfPFdX.js => C57rlNin.js} | 2 +- .../dist/client/_nuxt/C62YIs1e.js} | 2 +- .../dist/client/_nuxt/C9Ay6noc.js} | 2 +- .../dist/client/_nuxt/CVcegVGg.js} | 2 +- .../dist/client/_nuxt/CnITbLbn.js} | 2 +- .../dist/client/_nuxt/CqV8RqXK.js} | 2 +- .../dist/client/_nuxt/Cw6-IYbc.js} | 2 +- .../dist/client/_nuxt/Czx1Pqa5.js} | 2 +- .../client/_nuxt/{DyDOOl3L.js => D3BEzqbk.js} | 2 +- .../client/_nuxt/{CzDsb7xY.js => DBdXA9xc.js} | 2 +- .../dist/client/_nuxt/DFRN20X-.js} | 2 +- .../client/_nuxt/{3DmZ0EM6.js => DSGpJkej.js} | 2 +- .../client/_nuxt/{BmPpcd_L.js => DXATb271.js} | 2 +- .../.nuxt/dist/client/_nuxt/D_wdxHVu.js | 1 + .../dist/client/_nuxt/DgPVyq19.js} | 2 +- .../client/_nuxt/{DV_XBBqZ.js => Die-uL3s.js} | 2 +- .../.nuxt/dist/client/_nuxt/DlWXh2WJ.js | 1 + .../client/_nuxt/{K3DaV60P.js => DlkOUcOd.js} | 2 +- .../dist/client/_nuxt/DumZSuM0.js} | 2 +- .../dist/client/_nuxt/OCjlko5P.js} | 2 +- .../client/_nuxt/{iEY_AUwe.js => XheHpngv.js} | 2 +- .../.nuxt/dist/client/_nuxt/_id_.BbvSG4P_.css | 1 - .../client/_nuxt/{D_rgCg0x.js => dQhiM-C1.js} | 2 +- .../.nuxt/dist/client/_nuxt/dxAJkDQw.js | 1 - .../.nuxt/dist/client/_nuxt/edit.BOptDYkB.css | 1 + .../.nuxt/dist/client/_nuxt/edit.DU9LJnkZ.css | 1 - .../dist/client/_nuxt/index.oH-TzkFb.css | 1 + .../dist/client/_nuxt/mLQoXw9h.js} | 2 +- .../dist/client/_nuxt/sgHKqTNd.js} | 2 +- .../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 - .../{edit-Db3uK3sd.js => edit-DQMBygGu.js} | 142 +++-- .../dist/server/_nuxt/edit-DQMBygGu.js.map | 1 + .../server/_nuxt/edit-DQMBygGu.js.map.json | 1 + .../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 - .../_nuxt/edit-styles-1.mjs-YVNjgFq6.js | 5 + .../_nuxt/edit-styles-1.mjs-YVNjgFq6.js.map | 1 + .../edit-styles-1.mjs-YVNjgFq6.js.map.json | 1 + .../server/_nuxt/edit-styles.C6EseCac.mjs | 4 - .../server/_nuxt/edit-styles.DRyZamYQ.mjs | 4 + .../_nuxt/entry-styles-1.mjs-BTLckatc.js | 5 + .../_nuxt/entry-styles-1.mjs-BTLckatc.js.map | 1 + .../entry-styles-1.mjs-BTLckatc.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-CjBdWjhK.js | 5 + .../_nuxt/entry-styles-2.mjs-CjBdWjhK.js.map | 1 + .../entry-styles-2.mjs-CjBdWjhK.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.CDharU4c.mjs | 8 + .../server/_nuxt/entry-styles.rnjKdtip.mjs | 8 - .../{_id_-YGQP6BWl.js => index-Dzq5Dk7S.js} | 263 ++++++--- .../dist/server/_nuxt/index-Dzq5Dk7S.js.map | 1 + .../server/_nuxt/index-Dzq5Dk7S.js.map.json | 1 + .../_nuxt/index-styles-1.mjs-C1Gt4hz3.js | 5 + .../_nuxt/index-styles-1.mjs-C1Gt4hz3.js.map | 1 + .../index-styles-1.mjs-C1Gt4hz3.js.map.json | 1 + .../server/_nuxt/index-styles.3Ehc3-Kw.mjs | 4 + .../.nuxt/dist/server/client.manifest.mjs | 2 +- .../.nuxt/dist/server/client.precomputed.mjs | 2 +- frontend_admin/.nuxt/dist/server/server.mjs | 22 +- .../.nuxt/dist/server/server.mjs.map | 2 +- .../.nuxt/dist/server/server.mjs.map.json | 2 +- frontend_admin/.nuxt/dist/server/styles.mjs | 8 +- frontend_admin/.nuxt/manifest/latest.json | 2 +- .../4c3848a1-194c-473b-9dda-e023b39983cf.json | 1 - .../9690941d-48a2-40dc-830a-194c40a17965.json | 1 + frontend_admin/.nuxt/manifest/meta/dev.json | 2 +- frontend_admin/.nuxt/nitro.json | 4 +- frontend_admin/.nuxt/nuxt.d.ts | 4 +- frontend_admin/.nuxt/tailwind/postcss.mjs | 2 +- frontend_admin/.nuxt/tsconfig.json | 12 +- frontend_admin/.nuxt/tsconfig.server.json | 12 +- frontend_admin/.output/nitro.json | 2 +- .../public/_nuxt/{BrLYzdOF.js => 23m5KMmx.js} | 2 +- .../public/_nuxt/{Dm5GcHjR.js => B2Ol2ho3.js} | 2 +- .../public/_nuxt/BBd0Wshd.js} | 2 +- .../public/_nuxt/{CBgSvLGj.js => BCVwWzC0.js} | 2 +- .../public/_nuxt/{Duy9QquX.js => BIbQr1Hg.js} | 6 +- .../public/_nuxt/{BfC4gsFh.js => BMOhxdBV.js} | 2 +- .../public/_nuxt/{8V3mnLXt.js => BYMyrldA.js} | 2 +- .../.output/public/_nuxt/BalY_-5C.js | 1 - .../public/_nuxt/{CKAu5_-p.js => BixZQTWP.js} | 2 +- .../public/_nuxt/Bo3NTH2Q.js} | 2 +- .../public/_nuxt/{DMACJq_0.js => BugbZ1zh.js} | 2 +- .../public/_nuxt/Bxonjlt7.js} | 2 +- .../public/_nuxt/{CuTzR9Y8.js => C2l6xpLd.js} | 2 +- .../public/_nuxt/{gIYfPFdX.js => C57rlNin.js} | 2 +- .../public/_nuxt/C62YIs1e.js} | 2 +- .../public/_nuxt/C9Ay6noc.js} | 2 +- .../public/_nuxt/CVcegVGg.js} | 2 +- .../public/_nuxt/CnITbLbn.js} | 2 +- .../public/_nuxt/CqV8RqXK.js} | 2 +- .../public/_nuxt/Cw6-IYbc.js} | 2 +- .../public/_nuxt/Czx1Pqa5.js} | 2 +- .../public/_nuxt/{DyDOOl3L.js => D3BEzqbk.js} | 2 +- .../public/_nuxt/{CzDsb7xY.js => DBdXA9xc.js} | 2 +- .../public/_nuxt/DFRN20X-.js} | 2 +- .../public/_nuxt/{3DmZ0EM6.js => DSGpJkej.js} | 2 +- .../public/_nuxt/{BmPpcd_L.js => DXATb271.js} | 2 +- .../.output/public/_nuxt/D_wdxHVu.js | 1 + .../public/_nuxt/DgPVyq19.js} | 2 +- .../public/_nuxt/{DV_XBBqZ.js => Die-uL3s.js} | 2 +- .../.output/public/_nuxt/DlWXh2WJ.js | 1 + .../public/_nuxt/{K3DaV60P.js => DlkOUcOd.js} | 2 +- .../public/_nuxt/DumZSuM0.js} | 2 +- .../public/_nuxt/OCjlko5P.js} | 2 +- .../public/_nuxt/{iEY_AUwe.js => XheHpngv.js} | 2 +- .../.output/public/_nuxt/_id_.BbvSG4P_.css | 1 - .../.output/public/_nuxt/builds/latest.json | 2 +- .../4c3848a1-194c-473b-9dda-e023b39983cf.json | 1 - .../9690941d-48a2-40dc-830a-194c40a17965.json | 1 + .../.output/public/_nuxt/builds/meta/dev.json | 2 +- .../public/_nuxt/{D_rgCg0x.js => dQhiM-C1.js} | 2 +- .../.output/public/_nuxt/dxAJkDQw.js | 1 - .../.output/public/_nuxt/edit.BOptDYkB.css | 1 + .../.output/public/_nuxt/edit.DU9LJnkZ.css | 1 - .../.output/public/_nuxt/index.oH-TzkFb.css | 1 + .../public/_nuxt/mLQoXw9h.js} | 2 +- .../public/_nuxt/sgHKqTNd.js} | 2 +- .../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 +- .../{edit-Db3uK3sd.mjs => edit-DQMBygGu.mjs} | 144 +++-- .../server/chunks/build/edit-DQMBygGu.mjs.map | 1 + .../server/chunks/build/edit-Db3uK3sd.mjs.map | 1 - .../chunks/build/edit-styles.C6EseCac.mjs | 8 - .../chunks/build/edit-styles.C6EseCac.mjs.map | 1 - .../chunks/build/edit-styles.DRyZamYQ.mjs | 8 + .../chunks/build/edit-styles.DRyZamYQ.mjs.map | 1 + .../chunks/build/entry-styles.CDharU4c.mjs | 14 + .../build/entry-styles.CDharU4c.mjs.map | 1 + .../chunks/build/entry-styles.rnjKdtip.mjs | 14 - .../build/entry-styles.rnjKdtip.mjs.map | 1 - .../{_id_-YGQP6BWl.mjs => index-Dzq5Dk7S.mjs} | 269 ++++++--- .../chunks/build/index-Dzq5Dk7S.mjs.map | 1 + .../chunks/build/index-styles.3Ehc3-Kw.mjs | 8 + .../build/index-styles.3Ehc3-Kw.mjs.map | 1 + .../.output/server/chunks/build/server.mjs | 22 +- .../server/chunks/build/server.mjs.map | 2 +- .../.output/server/chunks/build/styles.mjs | 8 +- .../server/chunks/build/styles.mjs.map | 2 +- .../.output/server/chunks/nitro/nitro.mjs | 546 +++++++++--------- frontend_admin/pages/providers/[id]/index.vue | 91 +++ .../logic_spec_unified_address_refactoring.md | 125 ++++ plans/p0_unified_address_search_audit.md | 356 ++++++++++++ tests/active/test_use_unverified_provider.py | 98 ++-- 198 files changed, 3485 insertions(+), 1609 deletions(-) create mode 100644 backend/app/schemas/address.py create mode 100644 backend/app/services/address_manager.py create mode 100644 backend/app/services/address_service.py create mode 100644 docs/address_api_consistency_audit.md create mode 100644 docs/p0_address_manager_usage_audit_2026-07-01.md create mode 100644 docs/sql/cleanup_ghost_columns_2026_07.sql create mode 100644 docs/tag_category_system_audit_report.md rename frontend_admin/.nuxt/dist/client/_nuxt/{BrLYzdOF.js => 23m5KMmx.js} (98%) rename frontend_admin/.nuxt/dist/client/_nuxt/{Dm5GcHjR.js => B2Ol2ho3.js} (99%) rename frontend_admin/{.output/public/_nuxt/CVL-E3x9.js => .nuxt/dist/client/_nuxt/BBd0Wshd.js} (96%) rename frontend_admin/.nuxt/dist/client/_nuxt/{CBgSvLGj.js => BCVwWzC0.js} (99%) rename frontend_admin/.nuxt/dist/client/_nuxt/{Duy9QquX.js => BIbQr1Hg.js} (85%) rename frontend_admin/.nuxt/dist/client/_nuxt/{BfC4gsFh.js => BMOhxdBV.js} (97%) rename frontend_admin/.nuxt/dist/client/_nuxt/{8V3mnLXt.js => BYMyrldA.js} (99%) delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/BalY_-5C.js rename frontend_admin/.nuxt/dist/client/_nuxt/{CKAu5_-p.js => BixZQTWP.js} (86%) rename frontend_admin/{.output/public/_nuxt/MRVcNo51.js => .nuxt/dist/client/_nuxt/Bo3NTH2Q.js} (99%) rename frontend_admin/.nuxt/dist/client/_nuxt/{DMACJq_0.js => BugbZ1zh.js} (73%) rename frontend_admin/{.output/public/_nuxt/B4o8ITTA.js => .nuxt/dist/client/_nuxt/Bxonjlt7.js} (99%) rename frontend_admin/.nuxt/dist/client/_nuxt/{CuTzR9Y8.js => C2l6xpLd.js} (98%) rename frontend_admin/.nuxt/dist/client/_nuxt/{gIYfPFdX.js => C57rlNin.js} (99%) rename frontend_admin/{.output/public/_nuxt/iSrLnxnq.js => .nuxt/dist/client/_nuxt/C62YIs1e.js} (99%) rename frontend_admin/{.output/public/_nuxt/DhOP_KNN.js => .nuxt/dist/client/_nuxt/C9Ay6noc.js} (98%) rename frontend_admin/{.output/public/_nuxt/DN2UwQHX.js => .nuxt/dist/client/_nuxt/CVcegVGg.js} (99%) rename frontend_admin/{.output/public/_nuxt/BooUk3hi.js => .nuxt/dist/client/_nuxt/CnITbLbn.js} (99%) rename frontend_admin/{.output/public/_nuxt/DloAqf4K.js => .nuxt/dist/client/_nuxt/CqV8RqXK.js} (99%) rename frontend_admin/{.output/public/_nuxt/DS0l42iM.js => .nuxt/dist/client/_nuxt/Cw6-IYbc.js} (99%) rename frontend_admin/{.output/public/_nuxt/CP4clZzX.js => .nuxt/dist/client/_nuxt/Czx1Pqa5.js} (98%) rename frontend_admin/.nuxt/dist/client/_nuxt/{DyDOOl3L.js => D3BEzqbk.js} (99%) rename frontend_admin/.nuxt/dist/client/_nuxt/{CzDsb7xY.js => DBdXA9xc.js} (96%) rename frontend_admin/{.output/public/_nuxt/BWG-H9Sq.js => .nuxt/dist/client/_nuxt/DFRN20X-.js} (99%) rename frontend_admin/.nuxt/dist/client/_nuxt/{3DmZ0EM6.js => DSGpJkej.js} (96%) rename frontend_admin/.nuxt/dist/client/_nuxt/{BmPpcd_L.js => DXATb271.js} (94%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/D_wdxHVu.js rename frontend_admin/{.output/public/_nuxt/DLhH35Ps.js => .nuxt/dist/client/_nuxt/DgPVyq19.js} (99%) rename frontend_admin/.nuxt/dist/client/_nuxt/{DV_XBBqZ.js => Die-uL3s.js} (99%) create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/DlWXh2WJ.js rename frontend_admin/.nuxt/dist/client/_nuxt/{K3DaV60P.js => DlkOUcOd.js} (98%) rename frontend_admin/{.output/public/_nuxt/hxLu6bwn.js => .nuxt/dist/client/_nuxt/DumZSuM0.js} (99%) rename frontend_admin/{.output/public/_nuxt/Bz1JtWuj.js => .nuxt/dist/client/_nuxt/OCjlko5P.js} (99%) rename frontend_admin/.nuxt/dist/client/_nuxt/{iEY_AUwe.js => XheHpngv.js} (96%) delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/_id_.BbvSG4P_.css rename frontend_admin/.nuxt/dist/client/_nuxt/{D_rgCg0x.js => dQhiM-C1.js} (98%) delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/dxAJkDQw.js create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/edit.BOptDYkB.css delete mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/edit.DU9LJnkZ.css create mode 100644 frontend_admin/.nuxt/dist/client/_nuxt/index.oH-TzkFb.css rename frontend_admin/{.output/public/_nuxt/eAjy9X9S.js => .nuxt/dist/client/_nuxt/mLQoXw9h.js} (97%) rename frontend_admin/{.output/public/_nuxt/CMeyKwHf.js => .nuxt/dist/client/_nuxt/sgHKqTNd.js} (99%) delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-YGQP6BWl.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-YGQP6BWl.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-styles-1.mjs-QmIN6AFS.js delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-styles-1.mjs-QmIN6AFS.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-styles-1.mjs-QmIN6AFS.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/_id_-styles.nF0K7NP3.mjs rename frontend_admin/.nuxt/dist/server/_nuxt/{edit-Db3uK3sd.js => edit-DQMBygGu.js} (52%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-DQMBygGu.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-DQMBygGu.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-Db3uK3sd.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-Db3uK3sd.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-styles-1.mjs-BA90eYv2.js delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-styles-1.mjs-BA90eYv2.js.map delete 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-1.mjs-YVNjgFq6.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-styles-1.mjs-YVNjgFq6.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-styles-1.mjs-YVNjgFq6.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-styles.C6EseCac.mjs create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/edit-styles.DRyZamYQ.mjs create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-BTLckatc.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-BTLckatc.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-BTLckatc.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-Dwi00BYZ.js delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-Dwi00BYZ.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-Dwi00BYZ.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-CjBdWjhK.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-CjBdWjhK.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-CjBdWjhK.js.map.json delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-DlODQeqc.js delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-DlODQeqc.js.map delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-DlODQeqc.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles.CDharU4c.mjs delete mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/entry-styles.rnjKdtip.mjs rename frontend_admin/.nuxt/dist/server/_nuxt/{_id_-YGQP6BWl.js => index-Dzq5Dk7S.js} (50%) create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-Dzq5Dk7S.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-Dzq5Dk7S.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-styles-1.mjs-C1Gt4hz3.js create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-styles-1.mjs-C1Gt4hz3.js.map create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-styles-1.mjs-C1Gt4hz3.js.map.json create mode 100644 frontend_admin/.nuxt/dist/server/_nuxt/index-styles.3Ehc3-Kw.mjs delete mode 100644 frontend_admin/.nuxt/manifest/meta/4c3848a1-194c-473b-9dda-e023b39983cf.json create mode 100644 frontend_admin/.nuxt/manifest/meta/9690941d-48a2-40dc-830a-194c40a17965.json rename frontend_admin/.output/public/_nuxt/{BrLYzdOF.js => 23m5KMmx.js} (98%) rename frontend_admin/.output/public/_nuxt/{Dm5GcHjR.js => B2Ol2ho3.js} (99%) rename frontend_admin/{.nuxt/dist/client/_nuxt/CVL-E3x9.js => .output/public/_nuxt/BBd0Wshd.js} (96%) rename frontend_admin/.output/public/_nuxt/{CBgSvLGj.js => BCVwWzC0.js} (99%) rename frontend_admin/.output/public/_nuxt/{Duy9QquX.js => BIbQr1Hg.js} (85%) rename frontend_admin/.output/public/_nuxt/{BfC4gsFh.js => BMOhxdBV.js} (97%) rename frontend_admin/.output/public/_nuxt/{8V3mnLXt.js => BYMyrldA.js} (99%) delete mode 100644 frontend_admin/.output/public/_nuxt/BalY_-5C.js rename frontend_admin/.output/public/_nuxt/{CKAu5_-p.js => BixZQTWP.js} (86%) rename frontend_admin/{.nuxt/dist/client/_nuxt/MRVcNo51.js => .output/public/_nuxt/Bo3NTH2Q.js} (99%) rename frontend_admin/.output/public/_nuxt/{DMACJq_0.js => BugbZ1zh.js} (73%) rename frontend_admin/{.nuxt/dist/client/_nuxt/B4o8ITTA.js => .output/public/_nuxt/Bxonjlt7.js} (99%) rename frontend_admin/.output/public/_nuxt/{CuTzR9Y8.js => C2l6xpLd.js} (98%) rename frontend_admin/.output/public/_nuxt/{gIYfPFdX.js => C57rlNin.js} (99%) rename frontend_admin/{.nuxt/dist/client/_nuxt/iSrLnxnq.js => .output/public/_nuxt/C62YIs1e.js} (99%) rename frontend_admin/{.nuxt/dist/client/_nuxt/DhOP_KNN.js => .output/public/_nuxt/C9Ay6noc.js} (98%) rename frontend_admin/{.nuxt/dist/client/_nuxt/DN2UwQHX.js => .output/public/_nuxt/CVcegVGg.js} (99%) rename frontend_admin/{.nuxt/dist/client/_nuxt/BooUk3hi.js => .output/public/_nuxt/CnITbLbn.js} (99%) rename frontend_admin/{.nuxt/dist/client/_nuxt/DloAqf4K.js => .output/public/_nuxt/CqV8RqXK.js} (99%) rename frontend_admin/{.nuxt/dist/client/_nuxt/DS0l42iM.js => .output/public/_nuxt/Cw6-IYbc.js} (99%) rename frontend_admin/{.nuxt/dist/client/_nuxt/CP4clZzX.js => .output/public/_nuxt/Czx1Pqa5.js} (98%) rename frontend_admin/.output/public/_nuxt/{DyDOOl3L.js => D3BEzqbk.js} (99%) rename frontend_admin/.output/public/_nuxt/{CzDsb7xY.js => DBdXA9xc.js} (96%) rename frontend_admin/{.nuxt/dist/client/_nuxt/BWG-H9Sq.js => .output/public/_nuxt/DFRN20X-.js} (99%) rename frontend_admin/.output/public/_nuxt/{3DmZ0EM6.js => DSGpJkej.js} (96%) rename frontend_admin/.output/public/_nuxt/{BmPpcd_L.js => DXATb271.js} (94%) create mode 100644 frontend_admin/.output/public/_nuxt/D_wdxHVu.js rename frontend_admin/{.nuxt/dist/client/_nuxt/DLhH35Ps.js => .output/public/_nuxt/DgPVyq19.js} (99%) rename frontend_admin/.output/public/_nuxt/{DV_XBBqZ.js => Die-uL3s.js} (99%) create mode 100644 frontend_admin/.output/public/_nuxt/DlWXh2WJ.js rename frontend_admin/.output/public/_nuxt/{K3DaV60P.js => DlkOUcOd.js} (98%) rename frontend_admin/{.nuxt/dist/client/_nuxt/hxLu6bwn.js => .output/public/_nuxt/DumZSuM0.js} (99%) rename frontend_admin/{.nuxt/dist/client/_nuxt/Bz1JtWuj.js => .output/public/_nuxt/OCjlko5P.js} (99%) rename frontend_admin/.output/public/_nuxt/{iEY_AUwe.js => XheHpngv.js} (96%) delete mode 100644 frontend_admin/.output/public/_nuxt/_id_.BbvSG4P_.css delete mode 100644 frontend_admin/.output/public/_nuxt/builds/meta/4c3848a1-194c-473b-9dda-e023b39983cf.json create mode 100644 frontend_admin/.output/public/_nuxt/builds/meta/9690941d-48a2-40dc-830a-194c40a17965.json rename frontend_admin/.output/public/_nuxt/{D_rgCg0x.js => dQhiM-C1.js} (98%) delete mode 100644 frontend_admin/.output/public/_nuxt/dxAJkDQw.js create mode 100644 frontend_admin/.output/public/_nuxt/edit.BOptDYkB.css delete mode 100644 frontend_admin/.output/public/_nuxt/edit.DU9LJnkZ.css create mode 100644 frontend_admin/.output/public/_nuxt/index.oH-TzkFb.css rename frontend_admin/{.nuxt/dist/client/_nuxt/eAjy9X9S.js => .output/public/_nuxt/mLQoXw9h.js} (97%) rename frontend_admin/{.nuxt/dist/client/_nuxt/CMeyKwHf.js => .output/public/_nuxt/sgHKqTNd.js} (99%) delete mode 100644 frontend_admin/.output/server/chunks/build/_id_-YGQP6BWl.mjs.map delete mode 100644 frontend_admin/.output/server/chunks/build/_id_-styles.nF0K7NP3.mjs delete mode 100644 frontend_admin/.output/server/chunks/build/_id_-styles.nF0K7NP3.mjs.map rename frontend_admin/.output/server/chunks/build/{edit-Db3uK3sd.mjs => edit-DQMBygGu.mjs} (51%) create mode 100644 frontend_admin/.output/server/chunks/build/edit-DQMBygGu.mjs.map delete mode 100644 frontend_admin/.output/server/chunks/build/edit-Db3uK3sd.mjs.map delete mode 100644 frontend_admin/.output/server/chunks/build/edit-styles.C6EseCac.mjs delete mode 100644 frontend_admin/.output/server/chunks/build/edit-styles.C6EseCac.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/edit-styles.DRyZamYQ.mjs create mode 100644 frontend_admin/.output/server/chunks/build/edit-styles.DRyZamYQ.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/entry-styles.CDharU4c.mjs create mode 100644 frontend_admin/.output/server/chunks/build/entry-styles.CDharU4c.mjs.map delete mode 100644 frontend_admin/.output/server/chunks/build/entry-styles.rnjKdtip.mjs delete mode 100644 frontend_admin/.output/server/chunks/build/entry-styles.rnjKdtip.mjs.map rename frontend_admin/.output/server/chunks/build/{_id_-YGQP6BWl.mjs => index-Dzq5Dk7S.mjs} (50%) create mode 100644 frontend_admin/.output/server/chunks/build/index-Dzq5Dk7S.mjs.map create mode 100644 frontend_admin/.output/server/chunks/build/index-styles.3Ehc3-Kw.mjs create mode 100644 frontend_admin/.output/server/chunks/build/index-styles.3Ehc3-Kw.mjs.map create mode 100644 plans/logic_spec_unified_address_refactoring.md create mode 100644 plans/p0_unified_address_search_audit.md diff --git a/.roo/history.md b/.roo/history.md index 468ffc7..42731a1 100644 --- a/.roo/history.md +++ b/.roo/history.md @@ -8,318 +8,124 @@ Teljes körű adatbázis konzisztencia ellenőrzés és zombie API végpontok fe ### 🔧 Eredmények **1. ADATBÁZIS TISZTASÁG:** ✅ PASS -- API modul import: ✅ Sikeres (2 route: GET, POST) -- Sync Engine: ✅ 1210 OK, 0 Fixed, 0 Extra -- E2E test: ⚠️ Pre-existing conftest hiba (verification token timeout - nem kapcsolódó) - -## 2026-06-30 - [#343] Fázis 4/7: Gamification kulcsok felvétele backend lokációs fájlokba - -### 🎯 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-07-01 - Opening Hours (JSONB) Admin UI támogatás - -### 🎯 Cél -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/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 - -### ✅ 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-30 - [#377] M4: Többnyelvű támogatás bevezetése (DE, FR, RO, CZ, SK) - -### 🎯 Cél -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-30 - [#376] M3: Admin nyelvválasztó átalakítása legördülő menüvé - -### 🎯 Cél -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/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é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-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 `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 - -**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 -4 darab kritikus blokkoló hiba javítása az Admin Providers flow-ban. - -### 🔧 Változtatások - -**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 - -**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 - -**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 - -**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 -Két P0 hibajavítás az Admin Provider Details oldalon. - -### 🔧 Módosított fájlok - -**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ő - -**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 `