From 7ac1371aff7dd19b61dfcda2d488906dc5c094f0 Mon Sep 17 00:00:00 2001 From: Olaf Rabing Date: Mon, 18 May 2026 04:37:23 +0000 Subject: [PATCH] Add AI workspace reviews --- AI Workspace einrichten Erste Schritte.docx | Bin 0 -> 19065 bytes README.md | 29 ++ Z-Archiv/Hosting-Backoffice-Update-v0.10.zip | Bin 0 -> 3693 bytes Z-Archiv/Hosting-Backoffice-Update-v0.11.zip | Bin 0 -> 8033 bytes Z-Archiv/Hosting-Backoffice-Update-v0.12.zip | Bin 0 -> 8663 bytes Z-Archiv/Hosting-Backoffice-Update-v0.13.zip | Bin 0 -> 1935 bytes Z-Archiv/Hosting-Backoffice-Update-v0.14.zip | Bin 0 -> 4826 bytes Z-Archiv/Hosting-Backoffice-Update-v0.15.zip | Bin 0 -> 1540 bytes Z-Archiv/Hosting-Backoffice-Update-v0.16.zip | Bin 0 -> 2827 bytes Z-Archiv/Hosting-Backoffice-Update-v0.17.zip | Bin 0 -> 1683 bytes Z-Archiv/Hosting-Backoffice-Update-v0.18.zip | Bin 0 -> 1519 bytes Z-Archiv/Hosting-Backoffice-Update-v0.19.zip | Bin 0 -> 1285 bytes Z-Archiv/Hosting-Backoffice-Update-v0.2.zip | Bin 0 -> 22005 bytes Z-Archiv/Hosting-Backoffice-Update-v0.20.zip | Bin 0 -> 821 bytes Z-Archiv/Hosting-Backoffice-Update-v0.3.zip | Bin 0 -> 28636 bytes Z-Archiv/Hosting-Backoffice-Update-v0.4.zip | Bin 0 -> 17784 bytes Z-Archiv/Hosting-Backoffice-Update-v0.5.zip | Bin 0 -> 3252 bytes Z-Archiv/Hosting-Backoffice-Update-v0.6.zip | Bin 0 -> 5558 bytes Z-Archiv/Hosting-Backoffice-Update-v0.7.zip | Bin 0 -> 9516 bytes Z-Archiv/Hosting-Backoffice-Update-v0.8.zip | Bin 0 -> 5960 bytes Z-Archiv/Hosting-Backoffice-Update-v0.9.zip | Bin 0 -> 5042 bytes .../Hosting-Backoffice_Basisdateien_v0.1.zip | Bin 0 -> 26607 bytes architecture/api-strategy-v0.1.md | 47 ++ architecture/api-strategy-v0.2.md | 91 ++++ architecture/core-architecture-v0.1.md | 44 ++ architecture/core-architecture-v0.2.md | 72 +++ architecture/data-model-v0.1.md | 96 ++++ architecture/data-model-v0.2-direction.md | 78 +++ architecture/deployment-strategy-v0.1.md | 32 ++ architecture/gobd-archive-strategy-v0.1.md | 41 ++ architecture/hosting-strategy-v0.1.md | 51 ++ .../integration-adapter-pattern-v0.1.md | 38 ++ .../logging-monitoring-strategy-v0.1.md | 34 ++ architecture/module-structure-v0.2.md | 65 +++ architecture/multi-tenancy-strategy-v0.1.md | 30 ++ architecture/notification-strategy-v0.1.md | 29 ++ architecture/payment-policy-v0.1.md | 28 ++ architecture/security-and-rights-v0.1.md | 49 ++ architecture/security-and-rights-v0.2.md | 47 ++ decisions/0001-standalone-core.md | 24 + decisions/0002-customer-centric-platform.md | 28 ++ decisions/0003-no-own-payment-system.md | 27 + decisions/0004-tenancy-model.md | 162 ++++++ decisions/0005-database-choice.md | 80 +++ decisions/0006-auth-strategy.md | 96 ++++ decisions/0007-module-system.md | 102 ++++ decisions/0008-external-reference-pattern.md | 97 ++++ decisions/0009-core-boundaries.md | 106 ++++ decisions/0010-secrets-management.md | 99 ++++ decisions/0011-gobd-responsibility.md | 76 +++ decisions/0012-frontend-strategy.md | 69 +++ decisions/0013-customer-domain-model.md | 108 ++++ decisions/0014-audit-log-strategy.md | 92 ++++ decisions/0015-tax-and-vat-strategy.md | 60 +++ decisions/0016-module-lifecycle.md | 66 +++ decisions/0017-adapter-error-resilience.md | 69 +++ decisions/0018-wordpress-plugin-security.md | 61 +++ decisions/0019-v1-scope-finalization.md | 77 +++ decisions/0020-customer-portal-scope.md | 58 +++ decisions/0021-dsgvo-deletion-retention.md | 53 ++ decisions/0022-document-hierarchy.md | 55 ++ decisions/0023-numbering-sequences.md | 62 +++ development/api-conventions-v0.1.md | 34 ++ development/coding-standards-v0.1.md | 28 ++ development/development-principles-v0.1.md | 22 + .../module-development-guidelines-v0.1.md | 29 ++ modules/ai-assistant-module-v0.1.md | 29 ++ modules/billing-module-v0.1.md | 39 ++ modules/customer-portal-module-v0.1.md | 33 ++ modules/document-archive-module-v0.1.md | 27 + modules/import-assistant-module-v0.1.md | 29 ++ modules/keyhelp-module-v0.1.md | 26 + modules/module-structure-v0.1.md | 47 ++ modules/registrar-module-v0.1.md | 39 ++ modules/server-migration-module-future.md | 21 + modules/server-template-module-future.md | 24 + modules/ticket-system-module-v0.1.md | 33 ++ modules/wordpress-plugin-strategy-v0.1.md | 32 ++ notizen.txt | 10 + notizen.txt.bak | 0 processes/customer-onboarding-process-v0.1.md | 21 + processes/invoice-import-ai-process-future.md | 25 + processes/payment-status-process-v0.1.md | 25 + processes/registrar-import-process-v0.1.md | 21 + processes/ticket-workflow-v0.1.md | 22 + prompts/architecture-review-prompt.md | 192 +++++++ prompts/architecture-review-prompt.md.bak | 96 ++++ prompts/product-review-prompt.md | 18 + prompts/security-review-prompt.md | 14 + .../chatgpt-consolidation-20260518-042851.md | 472 ++++++++++++++++++ reviews/claude-critical-risks.md | 312 ++++++++++++ reviews/claude-open-questions.md | 168 +++++++ reviews/claude-review-20260518-042429.md | 94 ++++ reviews/claude-review-placeholder.md | 9 + reviews/claude-review-response-map-v0.3.md | 123 +++++ reviews/claude-review-round1.md | 289 +++++++++++ reviews/open-decisions-for-olaf.md | 62 +++ reviews/perplexity-research-placeholder.md | 12 + reviews/review-notes-template.md | 32 ++ roadmap/roadmap-v1-v3.md | 39 ++ roadmap/v1-minimum-viable-product.md | 38 ++ roadmap/v1-non-goals.md | 35 ++ roadmap/v1-scope-v0.2.md | 53 ++ ui/customer-dashboard-concept-v0.1.md | 24 + ui/ui-principles-v0.1.md | 33 ++ vision/product-vision-v0.1.md | 19 + 106 files changed, 5378 insertions(+) create mode 100644 AI Workspace einrichten Erste Schritte.docx create mode 100644 README.md create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.10.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.11.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.12.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.13.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.14.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.15.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.16.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.17.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.18.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.19.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.2.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.20.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.3.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.4.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.5.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.6.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.7.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.8.zip create mode 100644 Z-Archiv/Hosting-Backoffice-Update-v0.9.zip create mode 100644 Z-Archiv/Hosting-Backoffice_Basisdateien_v0.1.zip create mode 100644 architecture/api-strategy-v0.1.md create mode 100644 architecture/api-strategy-v0.2.md create mode 100644 architecture/core-architecture-v0.1.md create mode 100644 architecture/core-architecture-v0.2.md create mode 100644 architecture/data-model-v0.1.md create mode 100644 architecture/data-model-v0.2-direction.md create mode 100644 architecture/deployment-strategy-v0.1.md create mode 100644 architecture/gobd-archive-strategy-v0.1.md create mode 100644 architecture/hosting-strategy-v0.1.md create mode 100644 architecture/integration-adapter-pattern-v0.1.md create mode 100644 architecture/logging-monitoring-strategy-v0.1.md create mode 100644 architecture/module-structure-v0.2.md create mode 100644 architecture/multi-tenancy-strategy-v0.1.md create mode 100644 architecture/notification-strategy-v0.1.md create mode 100644 architecture/payment-policy-v0.1.md create mode 100644 architecture/security-and-rights-v0.1.md create mode 100644 architecture/security-and-rights-v0.2.md create mode 100644 decisions/0001-standalone-core.md create mode 100644 decisions/0002-customer-centric-platform.md create mode 100644 decisions/0003-no-own-payment-system.md create mode 100644 decisions/0004-tenancy-model.md create mode 100644 decisions/0005-database-choice.md create mode 100644 decisions/0006-auth-strategy.md create mode 100644 decisions/0007-module-system.md create mode 100644 decisions/0008-external-reference-pattern.md create mode 100644 decisions/0009-core-boundaries.md create mode 100644 decisions/0010-secrets-management.md create mode 100644 decisions/0011-gobd-responsibility.md create mode 100644 decisions/0012-frontend-strategy.md create mode 100644 decisions/0013-customer-domain-model.md create mode 100644 decisions/0014-audit-log-strategy.md create mode 100644 decisions/0015-tax-and-vat-strategy.md create mode 100644 decisions/0016-module-lifecycle.md create mode 100644 decisions/0017-adapter-error-resilience.md create mode 100644 decisions/0018-wordpress-plugin-security.md create mode 100644 decisions/0019-v1-scope-finalization.md create mode 100644 decisions/0020-customer-portal-scope.md create mode 100644 decisions/0021-dsgvo-deletion-retention.md create mode 100644 decisions/0022-document-hierarchy.md create mode 100644 decisions/0023-numbering-sequences.md create mode 100644 development/api-conventions-v0.1.md create mode 100644 development/coding-standards-v0.1.md create mode 100644 development/development-principles-v0.1.md create mode 100644 development/module-development-guidelines-v0.1.md create mode 100644 modules/ai-assistant-module-v0.1.md create mode 100644 modules/billing-module-v0.1.md create mode 100644 modules/customer-portal-module-v0.1.md create mode 100644 modules/document-archive-module-v0.1.md create mode 100644 modules/import-assistant-module-v0.1.md create mode 100644 modules/keyhelp-module-v0.1.md create mode 100644 modules/module-structure-v0.1.md create mode 100644 modules/registrar-module-v0.1.md create mode 100644 modules/server-migration-module-future.md create mode 100644 modules/server-template-module-future.md create mode 100644 modules/ticket-system-module-v0.1.md create mode 100644 modules/wordpress-plugin-strategy-v0.1.md create mode 100644 notizen.txt create mode 100644 notizen.txt.bak create mode 100644 processes/customer-onboarding-process-v0.1.md create mode 100644 processes/invoice-import-ai-process-future.md create mode 100644 processes/payment-status-process-v0.1.md create mode 100644 processes/registrar-import-process-v0.1.md create mode 100644 processes/ticket-workflow-v0.1.md create mode 100644 prompts/architecture-review-prompt.md create mode 100644 prompts/architecture-review-prompt.md.bak create mode 100644 prompts/product-review-prompt.md create mode 100644 prompts/security-review-prompt.md create mode 100644 reviews/chatgpt-consolidation-20260518-042851.md create mode 100644 reviews/claude-critical-risks.md create mode 100644 reviews/claude-open-questions.md create mode 100644 reviews/claude-review-20260518-042429.md create mode 100644 reviews/claude-review-placeholder.md create mode 100644 reviews/claude-review-response-map-v0.3.md create mode 100644 reviews/claude-review-round1.md create mode 100644 reviews/open-decisions-for-olaf.md create mode 100644 reviews/perplexity-research-placeholder.md create mode 100644 reviews/review-notes-template.md create mode 100644 roadmap/roadmap-v1-v3.md create mode 100644 roadmap/v1-minimum-viable-product.md create mode 100644 roadmap/v1-non-goals.md create mode 100644 roadmap/v1-scope-v0.2.md create mode 100644 ui/customer-dashboard-concept-v0.1.md create mode 100644 ui/ui-principles-v0.1.md create mode 100644 vision/product-vision-v0.1.md diff --git a/AI Workspace einrichten Erste Schritte.docx b/AI Workspace einrichten Erste Schritte.docx new file mode 100644 index 0000000000000000000000000000000000000000..fccf30a033bdbe0233409e3be3ce9b2fb64eabd3 GIT binary patch literal 19065 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..fe577e5 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Hosting-Backoffice + +Ein europäisches, kundenzentriertes Hosting-Backoffice für kleine Anbieter, Webagenturen, Freelancer und IT-Dienstleister. + +## Vision + +Ein europäisches Hosting-Backoffice für kleine Anbieter, das Ordnung in Kunden, Hostingpakete, Domains, Rechnungen und Support bringt – professionell, verständlich und nutzbar ab dem ersten Kunden. + +## Arbeits-Slogan + +Professionelles Hosting-Backoffice. Einfach ab dem ersten Kunden. + +## Zielgruppe + +Kleine europäische Hostinganbieter, Webagenturen, Freelancer, IT-Dienstleister und Einzelunternehmer mit ca. 1–500 Kunden. + +## Grundarchitektur + +- Standalone-Core +- Laravel +- REST API +- modulare Integrationen +- optionales WordPress-Plugin +- Mandantenfähigkeit von Anfang an vorbereiten +- kundenzentrierter Ansatz + +## V1-Ziel + +Eine erste produktiv nutzbare Version für 3–5 echte Bestandskunden. diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.10.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.10.zip new file mode 100644 index 0000000000000000000000000000000000000000..1005b385b12955f89f78c0241532bf5dd02b36d8 GIT binary patch literal 3693 zcmaKvcQ71k*T7ecAV{LD?na4TSBoVPgcWU(C3;!CMel7xB%(yy=mgPOAv#O+ve6gO zdtEJhjW4 zE(Ci)0w8$nMrt4RJ3W2K0C`0 zRs#P31-yg>MT7;NEdM_)QorAM8gjq+kcS~Ha)*Wn)4S6B&BClRlf!|FuOo#-m`g`n zb?e?Fbwk=o*S@*NB>+6pIlwt6TrhL=&^P|N*dhW$kN#o3I# zEb+b=+2Hf6pWoTx>YX#WDxF=NGdb)Tm`O3avdzzso)}NmV6GqjPAE&dmCdlCpPYz- za(UU8jyrn`SgVNu%b&AGW#nHwiV1O1fkrkzM7q*?ym!d*F7IEG-;sfJpLN+{me0QO z`qZ43mdsfyF>kZVw4Sa%_{#RRKGH%{6^EILiuOWg6gx_dK_!IH6E(Sl*}D}3{dr!j zuqR}>DblY$H#ej56Fn^3VVke}iX$56`YVNv!?1QOAulq*MVTXjImMl4Y$_vS>hZ*s zSk;}cYMFl3?n+LrOkMn?B;WXb>dSPI6Z|aE6*7kfD`5#O-}JE9G&4uq%7qu;!ai@BRGC=fH<+(A zICQWD;o0`pv zOu#DQTceigufwzv!3j8s{LBY0i4fFxfW_SFAkSBOBHB-pY%M1?^Es#R)}F${n#e~F zyjkS1s#MyqHAJuZ-6!(~MknfgF2|+&w$il$2otW0hCNZT8@!oyEy{&tbH_|D6f9S& z%jMi~Wm&!$HtTc4F1>bU%z*ajY#OV-pHX!35#O*PwEjb4jd{&gB5`k4wNyb|`p?X6 zsm6#o)p?lEb4Jk~_p}sRBX_WySj)&QiTT2Jd7jinFs%#kvwCEW1M7y;wsDP7-Eo}P znV(3&cTe&>r`~l5@kGO{+audEc4y{DtQw{!DTq66MW39lh^Wb+c5B%3xMS-?+8tyj z1>YnXU&_#QJxhbRVMZ7N)r*+)AQDOx8*l?zTi@db`7iMt_)b|}M#&a&IDAx;^hIoa ztl)tfHjra$Y3UPQcc6Ik$_wTX8zfleLvb&PcR68>_yFXVvv9>j=P{=GZ^foVC3jq| zjnEVg`}PItlLGZBZjM7RY~0ODYU#gbEp`O8;(%g^j8H3wb9zo|zaI^Xnj3aGKDp0x zj!ZU<&e};UH|Y4SODwi=?oVhPZQX3u#M7tbD9YG*Lo-!~%9&@Madze=xiqa_XfO4mCxzYY^{rAI7%}yfv0k2CA<9WNJGIu+aJCyWyiGIJ-qvb2K{%e>2MPR^ zV8Gdw+hp>Iy4v%_gr0oPxM$|URy;Ps>D@EsuQo;ORcnrg6YKu-s)szZRI+dd_~3&k z+AHx{&1oLIvt$(s(x8lcV77T`!@^0L8jCSLxIV878Y|^QnXt07#I_L}zCt%wHztGg zDQn|YU)_D3_@xCaK~NpE15I0OtdV@#=HTAALWtweMp67kFcdsNQn2A7!G8tR`7MJt zn@EnSY^IcaYZzL*Hgg39n)u!f`%C(C3kLiwOI0vlG(89ri!Um6luAXCDdqx!i0x=**gQ<4b-lC8hTwsg zR0rgd%b~{T?dd}kih<><%~Be~s3yg1@3)SH<;B_348xCwZ1%_WB{~ugNSK(Ix|TO0 z-1AiD!FT=JFGW}g6PX{yGj<%K^=G8p=B$G)gu_WI8swMjA1zA7g|xf zCJ-m|8D$lQTRwoccYQ}x;B`93!+dA&@v-*h6q((Zo@H~XKGaj;?Rk2KdX1Q5XwHNT z0r~O+5N%Cx)I;UsUS|or|I#FCt`PcJ2QJR1Y=$SN5Z!{%|HNUKk%@x}5E3712ibve zS@(7!4D$j{KCHEuZaJ^ZO#Ym)jwFh`Qb^JCoO&VSDUwfyA$lUyM2x}{c0dvpky4-E zdLck`3hiL-&zLBiM8y@E-|&=hs50L68ZfdO@m`G|@EY#}ZQgrHPqpYQPrB5wAR}x= zU>WzF-QyB1)beXw*`cXlJB@gpNxZ&a<_=^&rvvUTFb3}%YJL3G$;5=!|JD6U(B_ef3UpZH(XawQ)=I4syCOt`q-e;NFczM6m-EA3J24GkI^#>+MGuy)C zM}V7n)GyzQeWwVoaPy~tCKZl7hHJ^h-beR8o8?9A2t?_-X$g6q(PQMM9K-l0w-e z*J3o2pW_#IHt~~+r3ImL3u$ogb+6WH1Vx7xq-&u2qi_Pc8PZJ*0SOZVcuM^WtCRN4n_L~Pd|uv+l?$O1o_@p~-l`0G zHsoG%*Zi}P4g3y$*lY|tr5zrXs8^j1%3#*RXo9AH z=qZ@eGDO|qK8qcre^!N6ZqajGbTmuD>Nad2cWIIr>6Ps^4^Iz&&o$YEHmnODx1m+} zqSIni8{+#i2K$ez!}DoYOddFNfJBI6t2vvA?k#OaS6imF-3GAt$IX%HzJ1pnwxh&4 zD{F6p5~V#?!EAY%z7l0MFQhj?7P<>7lSZgX@HMcVcJY)$Ux5OYCq`=vjMhlvvwhG3 zG1Vv{q9LO3Z90OsgeT1_;qO}8R_@TS@C{8BVcuKhohJofg9mo6mVttrxgs5_h<&Y4J+I#+r0A6D5>0(NbJ^Adr^5)-mw35|3pi~dMs-K;f-j$xd3_bqbFj$Du zi0BN!CkmS)V@b-gswMHDw=7ERXLw`ls9$}Rk?(eTCgmgmM3q?h6Af3zj;@WhceQCB zq-*SP_L3MwYYY7{yveVz#4aiw=tzk3c^g!H98+o ze$hU1%!}*ev~%;1L3Raux%eZJGD~$wGm+-4`p+2N1_%JFXBE#Ymtzhfp1MNV*}3L@~gr*UzU5;Z9E8h1>!dx zErMYj;sl$!U&0P;O#|317FtMb#1X;lZ4#GO7F84I5?9pG@JAuxj`Un4^F}L16Ek0H z@T`Ux(%6f)N|EX-AefR2v~BEB2G31{jo`Az>Ikq6`pnOYs%l4)*JsU4(pT~P)os2; zw$x+rGunl@RzYeTSZe9ouGdp|iO(!QWciZROpN0L&xrsd=lZSj`;(I>V!W={w%nIm(MUXnhCrw4X2xbb|1&I5h1BI-$1>h_ornwDOb;)dFDKHe{Ia zSp)P9TnD*8@&WTJTUw7}`UESx#~bO;_4Kh#5zo*Ijjg93}kgmZ{EQ_F;MdVZOCYWu9S>)}Sf%OcK!ty+1CFu?-vAlqXUKQY-rPlBJaJ zFcC{SCS#~oFfcGEFzWaXMk{_^5o5S8FvH?7Fcg19&D||+?L2^% z9-i(%HlRC;lZzG5k;RLhm4nsEYQkv3nVhd>^Xe1Yh5Py$)6@jwU=Q>DunOE-JvGq% z+-k1okA*jvagbyKU8_zb$v8X)1fnP^sk3>ad`Wjj@k*$#&C;Aowhbq*CEYN5HFZwj za7735BgTnF z&#u*Ui{@OruGK|2S|6`;2NPYd*_$)stbnzTEWajBfnBRSznk@-0+udnU8Z)IOQ? z+v%9cKnCYhwz#ur2r>khat*Fh7TY7LnwFPoXmQa?8awoz8Yxi57O88Boeh9lOPwo# z`eYqEdj{#seCzKtmkzrhpJYPAIJaDBJ!unK+sA8tR)TEHgSIXoub%-z#t@+w(jeA$ zNT?10<(tHWXs{;u+=h!JJhwHis0+8c2f>P#;WI|)>9r$^8A@EP#Ck6&H9XT-%&pDW z_fXe4pjou;3V^K&pd^-^MO+k&3fb`t=;yG(q!%jjt)&bNo0CKtWt)`C5 z(5^s_Bb=P-KvTYy{$kOhio-(UQw7ekuNVw#hna+1T@eLj4y#h-_VN-rKESQH9=S~L zj?6^i6L3YmTuFTGV)G&4ycObDAwRE+`K|}DPgVPQq+&wuY<5+bn~D$N@Ic~{C(?ez zaa?U`i|RrbjPBP-Mg>(AXi z$RN|Vys^TwYxXF<+>?8e=Z^d3NC@<46i<9u&C^`ITOH)%@pGA9EX%y$eh7aE4lLA0 zD1lk;)mtsj2a01L*kj}&i$3$7 z8^q68rBowH=5sm1gu%zyO;PscW_48&`W zo`VQY4zcdpPpD# z!}ZE~#0lENe0s8n?#Z<}${D{pQTj#cStRj(tT2#r7t+|Tta8K>)r3?7zcWRiIohxG z?D7PhyQ&{W&Il>4asG^nRh&CqJOmk}A~ZY2NX6AKJjSg|lLyseHI8CWCw9eQZ%#atU+pgee3c~F+EbR z;dD?xnifOXofM-AMe6DTy8{+oG^cQ0okjPeL%+ShK-8n|%>6_6emTf+xxaA<2}ybl zm6w#C-);5$(Nj15p<%yjl4(+F#VIq5UDChTM4j1vqNC*^(K!fP&Iy6O&V@154n&L| zSsk$a?j~H1{S<1#>v*RFY*m%?lEN+xP0IRJr%ydi%$!llVi4nj-E7rxZjX*+a@jG* zm*fu1pILAWKm^GZk*8+hbZRWcGsi)FVKdq}#i?fCLVrlEZ^b;4M#T_ejQJ0Hv5Un% zOu??)bR;jFHuNKXAtnq@OCwkM=;(FT-vIlo85;;MkA+})$LckM(;@3q-aa7G&b_U1 zv(4#%;^;DJot2T8hPREYSy_7EZD^dx_>#k-$1q78VJF%h5R$p%P~PoCR*@C!|0x#g zHEsgyd8GlTdJI}nM(7vQNqx8dJ2HhL$1ITk-t*f2D4O)tk@-I2r3YSF{oQ5`)i}M& z*pH+61TCYv#ezdul7W@_2;v_YB=EbN3$3QBJpO>sF>g2d`542T5>SjxwoiHCiSTjp zFZSYlNOMTYT=>~MMbQ(wnWJp%<{Tr8xE>Zk6}Xx%qWCc;?g@8KH_BmaQ4zW z#U(;iW;6N$wpGuEYQ1Ia{?p=0+p3wmi*)LEAtvyaD-<0Y&8DS&!!Kev6 zvbV~yKx+G3=aOk=S|loXHYk#{y;b}}gB)$0B&wO<992UgnpL>nR|g@gX+0+!7c-r8 zAjn3b;mOha3H`m)hKn)^PSKe{2HM=L9FH6u3Q<%H!nG4A=XtXL*ms4GJb5S`!0H#5 z@9n@xZr446k&rl3)jpW2qJEgHq|d7hw-t_zoq|`5jCQgYZLPH5yRTO9VY5;=^L_R8 z8Fm~6D^SGuRn}*^y8++otA3OJt!U6ov@xk;R=`c#yUU34Zt2UcIKhAio))37dsawQ zqv*>>T#y6)oYnJ66Lqn0 z+dJ-NYJI7d5_%M&RK@+gu2hM%3WrcM_4=WbxgRIei-MDlUFVEaXMT|ob+=LWXWj># z#WTkQ-!3AmdI~xCwbM{Bd}(pRccG!M19&+uw}~5J&s8*??&p*dYpn>SNGP%z$FLL& z%Z|dKqo0XrD5vg|DCr!v6V#*xPDI|BJ>RO}!*m_`ZCgi#StUfJ99+@A8rQcN_Td$1 zp#8xpuhx%VNAmu0W6?&e%tDca7Tl-}VfyN48cmkiP|DF%#%6fg(A$-EGDr{q#aKn= zgUi+(EuNec&W%Tg(DV`Xwv9o29ag&iJ1iiQFw@M1dI!|rOH{Cq<9ts%SQdZLwDsRAnK?q(u6bKArWY$#5xZ?B*>9cdm=j zZR>gsJsxevK2>%uU}Z9O5BCvuZHQ@VEFnRUPN-w37rRfglK?r*E}~_(Yx&BggLcp9 zLqD2ovZl`~@=u!Eh)wT~ju)ULhu07|FjeXqBJ&=JrπICQH5{5ianKaL^Fp^8_0 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 literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.12.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.12.zip new file mode 100644 index 0000000000000000000000000000000000000000..0414ca3935fafd9a94e3b3e8b4ae922f975128ce GIT binary patch literal 8663 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 O>YrZ!PevvGxB4$6z?a(q literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.13.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.13.zip new file mode 100644 index 0000000000000000000000000000000000000000..7c079508bdf4eb32f154ace556465db369b64942 GIT binary patch literal 1935 zcmbW2XHe7W7RLXSP!=#Ogd!k;rJ6t}p$Z5HUZn?+&{2Y+g%Xk=BGL)Hw-sq30fj(N zk*;)H>8or45+J)&r7!4;u;}9Y<=&mSGk5O$emHZ^`<{8eJo9@{RverV004M^>C;a< z8nGVirknsE#0vo0CsP9UMgTT~sOIDEP4dH&R0&ujJ~V`gRV9V0`UH80U&pFq2`AI9 zzf^CiBQ%hR;OkjVqXed&;In-=Y6V%-Qm~2swA$tUe4^AvVKwMX}dO9pUi_xgXwZrB5R|k4D`L=iQ)%!%M`HiA_?y zLwe7Z5`IYY$E5`aCp&vmuwRQGw{!K)Ysl9UlRla}f>&W+xkmn2oeoX&Y@=*!Ij%?) z>A+@@F1h!FpLcv1WQ&lSUJ+)&kV-3cbtVlgP8Fmk=7XH9u5)3*@T{26Xuh>t`oyq1 z$0e_^@6SFgBdP?Wad!{mV1^6a(|*SV8%V=pYjphFpqll$PrkyR(=o~@ojloY@F{1) zMdsr9ys{y=B!=(&f_Jd5cR|@NUi=R{lq}6I7l0h@4mN8ueKj1EnjDOUsIfXbxF&%+ zKRrJd;_SHn0aKg=kuHjwPn4|Ja!}AH=Eb}UfEXDWfesDKkIH)kAkpQH=avux2c=~o z5KP?_zf7g`&6;6k<}=yn5(JK`Xl(UhS_OGF*nJ7^R$sRlV9GtgpqY0ZF608!-B&sa zfG%UyO`ee_c8^YZ1dN=2r{Qp4Esh>r_$OW})`=1UJHyIK3H!mQzgl>A3Vqb6>$_&T z)t5woDJhWqeY=hDg|mKy42$oUJ1b;6BA%P=Ny&c-YWaihQpv~{ac4@XeQn#pA75`%&|?=mfTi(|VQ)J|i~{caPs6J=c0 z^-_Ib3alE{DJ((P`g9>pn|8 z@)Q;DNOd#u)l0l;$E!=Kt?>~Es&6PG2ZBH|?ahuQqFG{L7LHiR z1EK^k+t#m{B@0!NLo4(Md`~phkY1vl;h@dG{O^nQi$6rT{X#Z zN^ME`HlGX{>E1^)L!!f%Ux($q@HL)g1l7KBDeLbE0&5sR|=_tr{c=98H& zw^JpeGt?S*g^tFDy23-YVsa2Wq0-xnze!8}Vf{IE8>T6ait|$PSoY~^pQT4|Y&4V# zpxyJ}0=cHa6)QKGCgZ|2QB0b_tHw2(o`~t)O2(KJ*#_nr+T>xIX5XFVj$vWG1EWK0 zrS`7fj_DYk84_%ktYs99DUKxWs&KQERm_lKo7V?hwjIriifV0rg(^np=O$&}HcEZw zL;VMn>>0X!n`{68;s5}J6DHvap}~0436s9@=ilI?rTXpdgh8GTqajT7uM861b-ge} z0l&x0q|J+)x((PetIe$70q|RAbK#Q1AD5B0_j9lTx;CYf!z@&&&Q)tJx#Ds#du!7@bIcu;C&Kqdl{|#ylC^eU5Z`B8_Ww+59Ey~IDpzdJO2&ch zE((KA(|&#>I$+kSayR#(1X8@Whw|o5vsCe*!rRMwo73Vmp*k;T&+l~5EA#HOE$9bF z#^+Z>Rt~6)JjV44WpLG5^Gip$q!*p{orVm-56V5OiRbLCLq&OLjQcfqiWV7D&|vN@~B8GHXJm)?7F zGwT5w(w-Nhe$mr{5)UkKY?+Tx*v3U#-nFICh2LQHf{h1Ho!n<_BWa5qVpLYlnUvM3 zw3#gurF$qYJ+bqp@gO}T{orZCWGsC_mKqmStLP>>xlYKkEs^(&sR5ya$Flwf6d`?@ zF!}AuDM|>7l|c5c;@dziT_&uuSol+#6LaxO#lEW@r5Vp`9C=nWd-8;y2gHT KTTkl1-`!uF=2)`; literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.14.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.14.zip new file mode 100644 index 0000000000000000000000000000000000000000..91b050a05beab5fc42373e6d83d5cf6145ea70c9 GIT binary patch literal 4826 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 Zf3ijYGy?lQR-a(hEv-i&BdV z^7D#QbxZPflXDVFQ&M%y4D<|5^>R~kgBUDxvJvF%Q$C=Gzo2S z&^J=u$bNbY=@9D6D=fn_IOd3svCNhbX<<+r8k)%R8&$ zn%kZ}daSN^jjbf}4r5z9KZjJ`vgg$-&v*0XDIUoW-hR?#!OQiRIre5(q*&XsU)u9} z+45bzoF%y%=Em>mP<+YW!~ECjh0mI3x6BWHVGHxl8Ys9tmfift@3Pc21EW*xD_FdD zE_P@)GdRCJ=w1bH_U8M>Rx=hvnk7tM@$jh5ObxZELbJ^|85_A)8+nH4$<}xjoZ0+x z&pX{!HeEYTddLf|%3HmPZ{^otEIcb}w}o8QsXa0^tU7J|qZhAU9lU@3MW3>1&F;sa z&2xk}cLilC=LaXuJf^VzleP6kwW`%Z_jQ@2JB^<2e^K%*a;+lN+>!V4fi7Qe?Vi|e zR9ye@>@C))?hUO^KUMyFmZZvkp6%FmOSgXaFt^h}F=tM*->kMSvwL$>dwceUb9cEu zexB?9d0RHyyR@KPzvjzKwcI)Rz!CcZlr+%(@4aXQFbz0B(?DWTaz9BG&!PNp8r#5kcuy#_?mCaJ+nvA0@(|VPKHE1XMC7*Yfrvka_TMLbD<^Ne)iwz z{}nTADoTGE`C#hd?+=!yT+Mp6TF&sXV&s3TXKS|~Z5J$Buzd1zLFcxcf-hBy=D$7g zKU1gce&<=I)BBTy8)W!vryUG1w=mjexb@k4vkP;WTr$;TB3{2cl=3l7;pFjfM`p)W z3&VJK%2h{fIFY&h+}|{guZy)<{|U}&YTRd_b0hvu&$6Qm^W}XPntM1z=)4bR<=-ojRh^x|rK#otw{Aa<_$3`wqP|KWHG-7CGhX=!%ACMR(go5fsmYnez_=*ZH!v_V z(=9GZEGaG4&B!b+$uFwZEi2Xq=F`j)-JJY%U=)=G*!mp~;JH`K zr5Xy)On&}KGX2^;@BZSZPUnIaxn^DShbk5;C!9Kvbb8x9`{yBH(NQ{i?_d0WJXtPT zcCuLZwHJq__bO!sX$7C&Sn)yc^rtytLR()R$Q6qI<0|6+m9Lh6VJ!bWUs8&uu=;> zeM&dusL&D9Pd5yst)r9cr!AIFyk)bfB^^wOBz8G2?ZXy!RYx0Vk`s0 ol13I_P9h-}p&N`I-w1=3GLsnl0p6@^AnnXR$O}w94_QDw08PS)asU7T literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.16.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.16.zip new file mode 100644 index 0000000000000000000000000000000000000000..02b2d1c9f3d6fe523f0f8ef24269c74269367c89 GIT binary patch literal 2827 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 I^k?(`1&r<;3IG5A literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.17.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.17.zip new file mode 100644 index 0000000000000000000000000000000000000000..612add58251d83033599c477926b38a0c96d6f66 GIT binary patch literal 1683 zcmWIWW@Zs#U|`^2_$;+4CilaB&TvKs1}7#425q2dQEFLcYI(7KazpXu-e+mq{_w$* zJsQVa3cT+qN#080J8_}*oI!Dv-b8lSk3OHHRyw_~vq;F>VRS0{`%J|fdgZq(b-N1u zfBfo=6KQQeUC4R(;Y-Pcb-Qyz4tx(?!Yf%g%eFgSynwXmbY&GowNP=CYS2N)?sUm zUf%L8h^tmJ+&kaTF#PT`^Iz5eS8S_7v!nkh^c4ve2IpT}_g$mBRo11RRbTF3MQiix zOTIw|B+BLO|L&hBXKVAW`X5sOO8gXFy_x(N7(bhsA@P$~l$?=SlA2snT9m3^lA4#8 zSE8F)oS&0el9`{UTU45pS`3OHBVhbY4L;p>#erwf_wa~W#fKj6*e*NGwL##p(IczJ zDt^mckIU|y8=Gd|bNSx0;|1!UBNQh*xbdzmbmytP4W@>h4*eEkUe(W2p1gqNyZ-6x z=XAw3WHqlZ*SZpz@SN+1$2`ucHRV5>5_&~j9R$k5u5so*p8ff-xlpiH+O$V~X+lZ6 z>&25=ul-0>xq0}y72nM1DKjKHjZbLZI{5$LqmGJexgwtR_0!lbcu#oEt+;EQKI6CD zsf0(XpEZQ~&d;3kxs$ z*ytTGJ#j;8&(pMyd*>{+E#2)H%=rBqZ{PZ97i8uw*{W1+bcn^$U~PcH&ARg&*YCqox&(nqQy%foX*Sn3s)!R7z@cW-%~X6zdxp7@6r7mn4>y7VBnY z7MJ7~RqB=%>jJZLW{GZ2emX44)CO4lF&hfJt?in4iQ$r4AXisOrx}xq%SKKw$;xu| zdl##6pL|qP5^aCLv6IvMp-K-gtBJ@qQ~$cpcESHn}?Rm3yT4(L@ zU|Z)W!Jt>~hc7J>K7)eKfMc>sXX|t=XQV zz-aq)=<@-I^Oj#^_eH!l+8LuOX4q}!`Q=sAhNXs#y?qfm1~Mxh4_0ktT>N@3zpmvW z0oPSa8ftA+qa$-$mrq=(zta6y?pAB<&`awD&n?eU`~EdQnyG1><=5P&lN3^xva|`! z?0LNM7ceU`GKnzbE^L8u1O`hQK@=Kufz literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.18.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.18.zip new file mode 100644 index 0000000000000000000000000000000000000000..8f2a384c347064fbcfde6ac2d807aa3a384a777d GIT binary patch literal 1519 zcmWIWW@h1H009r_O)+2wl;B{HVJJ#1%S@wcbBoyTaS` zkK!j?U;LNh_QIm1i$34KRR8_;m2a-Z)u%q;HLHL2%e&N5@a`s`v+i>bf&^N8=7d*R)AlVj><%lJS3xOr9R&!4Lk^rkF3+RdiToTA(m{@u?H> z-pbm07K$^>SCOB(d=Yoh5y4+uT{~xQe!6$@Hp9=m3Ug1sc;r;v=`m-m!^L;ISF%Su zso%Eh6;G`09KO#YYaV?~-@;(9oaZuos>zk>789eoe%mdXuEnr)>D}vVSdz5jSDGg5 zJU=}zU|nB~v$*fQne*=jCtP8XfXw&buT@I&F5_HKo-z zg6#*df<4!rdt5R9HC}wQoHe!lqs6>mL6+y_muOcvI~|M^W&E>WE6Q|wnVrsmYZw3Y z2z#D`FAjMb+5cHK!?#KP?pxP>?F&s+3I-Wh6L$R$+#QzK_)Yxuc`;*$@>v(Ro=g$? z5!@k^wM;4Cmz%}?(`gd<_m#HudrVXAx|g+4Fy(r%jdtA6y&Xbl8ft#deYkVIVfhOA zcSg&P&UGs*Y~GrFbM2X`X)Lo}rOhajFx$|PWf+)uZAVOuR|7{yp@fBNW>{#%*{w`m z7m`)jjy=EqG+l7h+eI^epS;-=_ghET%IEv1IQ z%d@K`(>)e1y4d_A#;x@7lzq!$&ofE*FPx}!^Ill$+R)S0FAHu&-@K)Jlh1$E_ygiAZ^aH#ZndF#p6_gUtB2$3jts{tuC^lIk r#U@(O1~Cm+p$RdK5opemMkgfGa227r>|kXBxrGS`HvwsNRuB&WN4AP= literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.19.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.19.zip new file mode 100644 index 0000000000000000000000000000000000000000..09bc43b63169b840c4d15d9edcf05642153c62ce GIT binary patch literal 1285 zcmWIWW@Zs#U|`^2NR{3c({X5-oDm}f!ww+U28tG?mSv`v7wacyB$lKXl;{?v78m5_ z6{qT!XsSk8CvS)ri4yB>vz~dpyhpC*Hnw;TDA%oqoeCu9W>s`?mYQm zhSls7Wh+k1bbo35<;v{%9$#*zylFPp_ussc)YX#BpC3L&c?&OlKu*TPlJKT`#}|M0 zUb;@_#ko&nVRhR-sLr^Q$a~&5w%OflslVPsYqJL{PiZun9zWA|>}7`Zxtiw!9QT&U zexJB&)|O&6Qyu36Yy>DE;}7Q?h%jBm;AfL|pVX6MAFZeZSMvq)vq!Y%pn2UV}$%Garxa&jMc zruc71-l!jHEjgvPUS9v~&+MhUxGz?sY<}!h6FGl9kM+Dq?w;JBVPqwF;jh2u6nXET z`oaF0;US8LE^k_~`f#G>Sk z%#zgPlG377{gTwY#Jm#S%;Nl<#FEVXJl&$woYZ1a*c$_bzBRs5dJAT`n45k)K?HXBa%|jn=$Z|OE!+EYzPf=-o z#Ak=l1!v8drrR-Gn-Y7-$hu9`>2mPe@Nx-Ozh5iXwcgi6#sl@6ONF?`7Ek zU0~X;WuIa{u{fERv3RM3$Ju?D+0Fa-$;vGqe|G5nJ#eiiX$AAAAkBv{+w4k|>WX+? z1b94DcUE}Z#Zb)QAnIbdb>FM#!ZigR-7Buhwmg}nna$~{BjA3$-kYQIVYH-TM~COb zE9SFVn{}RRFXVc8yk4UH+6ESn=1aYy%Ssdilimo(Xq0v(Z7)|cES;-Y;!T-+ z&vemFT=#zW&MQxpA6>H+ul(Dtb8Ufra>|5FQr_1*w;Yk(+8S2BY!Eo?h9~Yunj0?N;8I^PWp` zHEY2|ryjRA=X}ri@*l1DIyOs|?d7#()@sFP(X8vc^;5pwUf!Trar^y$$H&UbR~Idb z;yD$Ue{tqh1Gnm3^E_%L_vU6KO{w*FF|1cf;+AtS;Fg{4FfF;paM83q)#|(bURNKR zb@|35{BkE6eK)*Z4j% zUzl~|hF0NzPQA1=hN;XNliNSU-i!Lm5a7+oB*Kil_yCq5V6dbSM3GRKpc{;yIUvR| dFf3`T29{JLWR(DKRyL4kCLr7dq-|M1JOH9%79jut literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.2.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.2.zip new file mode 100644 index 0000000000000000000000000000000000000000..db17bbf432c972c447719edd2cb0d0908521b19e GIT binary patch literal 22005 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 literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.20.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.20.zip new file mode 100644 index 0000000000000000000000000000000000000000..c6c6397cce1a462dfae1e73fc2c4821ee6e16e33 GIT binary patch literal 821 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 literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.4.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.4.zip new file mode 100644 index 0000000000000000000000000000000000000000..baa26aa66d03bb0f0645ffe0fb65d99bf37294f3 GIT binary patch literal 17784 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 C0Hsy{ literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.5.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.5.zip new file mode 100644 index 0000000000000000000000000000000000000000..bc8c677fcf92c491e7dfba73ee6c97346fe267ad GIT binary patch literal 3252 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 T#`))FkN(c?zx&ER%>n-fg@$6X literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.7.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.7.zip new file mode 100644 index 0000000000000000000000000000000000000000..ff1f692201018e24b1b3630ed4d656dc78caf2e4 GIT binary patch literal 9516 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 literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice-Update-v0.8.zip b/Z-Archiv/Hosting-Backoffice-Update-v0.8.zip new file mode 100644 index 0000000000000000000000000000000000000000..7b9844e29a7d065c5e190bdb7a29eee9b3645129 GIT binary patch literal 5960 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 P3I5i@$GR5n@74bRK_k^7 literal 0 HcmV?d00001 diff --git a/Z-Archiv/Hosting-Backoffice_Basisdateien_v0.1.zip b/Z-Archiv/Hosting-Backoffice_Basisdateien_v0.1.zip new file mode 100644 index 0000000000000000000000000000000000000000..f773ea96cf59c4fe14db2bb859d77db51ad3a13c GIT binary patch literal 26607 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 BJ`Vr@ literal 0 HcmV?d00001 diff --git a/architecture/api-strategy-v0.1.md b/architecture/api-strategy-v0.1.md new file mode 100644 index 0000000..892f627 --- /dev/null +++ b/architecture/api-strategy-v0.1.md @@ -0,0 +1,47 @@ +# API Strategy v0.1 + +## Grundprinzip + +Hosting-Backoffice ist API-first aufgebaut. + +Alle Module und spätere Erweiterungen sollen über definierte API- und Service-Schnittstellen kommunizieren. + +## API-Typ + +V1: REST API + +Später möglich: +- GraphQL +- interne Service-Bus-Strukturen +- Webhooks + +## API-Bereiche + +- Kunden +- Verträge +- Domains +- Hostingpakete +- Rechnungen +- Tickets +- Dokumente +- Server +- Integrationen + +## API-Sicherheit + +Alle API-Zugriffe benötigen: +- Authentifizierung +- Rechteprüfung +- Auditierbarkeit +- Rate-Limiting +- Logging + +## Versionierung + +Beispiel: +- /api/v1/ +- /api/v2/ + +## WordPress-Plugin + +Das spätere WordPress-Plugin nutzt ausschließlich die REST API. Keine direkte Datenbankkopplung. diff --git a/architecture/api-strategy-v0.2.md b/architecture/api-strategy-v0.2.md new file mode 100644 index 0000000..8011c49 --- /dev/null +++ b/architecture/api-strategy-v0.2.md @@ -0,0 +1,91 @@ +# API Strategy v0.2 + +## Zweck +Dieses Dokument konkretisiert API-first nach dem Architekturreview. + +## Kurz erklärt +API-first bedeutet: + +```text +Die Schnittstelle wird als Vertrag geplant, +nicht nachträglich aus Controllern abgeleitet. +``` + +## Entscheidung +V1 verwendet REST API mit OpenAPI 3.x als Spezifikation. + +## OpenAPI +OpenAPI ist eine maschinenlesbare Beschreibung der API. + +Sie definiert: + +- Endpoints +- Datenformate +- Auth +- Fehler +- Parameter +- Responses + +## API-Konventionen + +### Versionierung + +```text +/api/v1/ +``` + +### Pagination +Cursor Pagination wird bevorzugt. + +### Fehlerformat +Problem Details nach RFC 7807 wird als Zielmodell verwendet. + +### Idempotenz +Für kritische POST-Vorgänge wird ein Idempotency-Key vorbereitet. + +Idempotenz bedeutet: + +```text +Ein Vorgang kann mehrfach gesendet werden, +ohne mehrfach ausgeführt zu werden. +``` + +### Filtering + +```text +filter[status]=active +filter[customer_id]=123 +``` + +### Sorting + +```text +sort=-created_at +``` + +## Auth +V1 nutzt Laravel Sanctum gemäß ADR 0006. + +## Long Running Jobs +Lange Vorgänge laufen asynchron. + +Beispiele: + +- große Importe +- Syncs +- spätere Migrationen + +Sie erhalten Job-Status-Endpunkte. + +## Webhooks +Webhooks sind nicht V1-Pflicht, werden aber architektonisch vorbereitet. + +Webhook bedeutet: + +```text +Das System informiert andere Systeme automatisch, +wenn ein Ereignis passiert. +``` + +## Nächster Schritt +OpenAPI-Stub für V1 erstellen. diff --git a/architecture/core-architecture-v0.1.md b/architecture/core-architecture-v0.1.md new file mode 100644 index 0000000..5738e9c --- /dev/null +++ b/architecture/core-architecture-v0.1.md @@ -0,0 +1,44 @@ +# Core Architecture v0.1 + +## Grundarchitektur + +Hosting-Backoffice basiert auf einem modularen Standalone-Core mit REST API. + +Die Plattform soll modular erweiterbar, kundenzentriert, API-first, mandantenfähig vorbereitbar, sicher und verständlich sein. + +## Technologischer Ansatz + +- Backend: Laravel +- API: REST API +- Datenbank: MariaDB oder PostgreSQL +- Frontend: Laravel Blade oder später Vue/Nuxt +- Integrationen: modular angebunden, niemals direkt im Core verdrahten + +## Architekturprinzip + +Der Core enthält ausschließlich zentrale Datenobjekte und Kernlogik. + +Externe Systeme werden über Module/Integrationen angebunden. + +## Core-Module + +- Benutzer & Rechte +- Kunden +- Verträge +- Produkte +- Domains +- Hostingpakete +- Server +- Dokumente +- Audit-Logs +- Benachrichtigungen +- API +- Einstellungen + +## Integrationsprinzip + +Der Core kennt keine direkte Anbieterlogik. + +Nicht: Customer → direkt Lexware + +Sondern: Customer → Billing Interface → Lexware Modul diff --git a/architecture/core-architecture-v0.2.md b/architecture/core-architecture-v0.2.md new file mode 100644 index 0000000..16f9f89 --- /dev/null +++ b/architecture/core-architecture-v0.2.md @@ -0,0 +1,72 @@ +# Core Architecture v0.2 + +## Zweck +Dieses Dokument ersetzt die bisherige Core-Definition aus v0.1. + +## Wichtigste Änderung +Der Core wird deutlich verkleinert. + +In v0.1 war der Core zu groß und enthielt zu viele Fachdomänen. + +## Core enthält nur noch + +- Identity +- Authentication +- Tenant Context +- RBAC / Policies +- Audit Base +- Module Registry +- Settings Base +- Event Routing +- API Base +- System Health + +## Core enthält nicht + +- Kundenfachlogik +- Vertragsfachlogik +- Produktfachlogik +- Domainfachlogik +- Hostingfachlogik +- Billingfachlogik +- Ticketfachlogik +- Dokumentenarchivfachlogik +- Integrationslogik + +## Service-Module + +- Customers +- Contracts +- Products +- Domains +- Hosting +- Billing +- Tickets +- Documents +- Notifications + +## Integrationsmodule + +- KeyHelp +- 1blu +- Lexware +- Invoice Ninja +- SMTP/Transactional Mail später +- Payment-Adapter später + +## Grundregel + +Wenn ein Bereich fachliche Geschäftslogik enthält, gehört er nicht in den Core. + +## Kommunikation + +Module kommunizieren über: + +- Service Contracts +- Events +- API-Schichten +- External References + +## Ziel + +Der Core soll stabil bleiben, auch wenn Fachmodule wachsen oder ersetzt werden. diff --git a/architecture/data-model-v0.1.md b/architecture/data-model-v0.1.md new file mode 100644 index 0000000..f9b7ae7 --- /dev/null +++ b/architecture/data-model-v0.1.md @@ -0,0 +1,96 @@ +# Data Model v0.1 + +## Grundprinzip + +Hosting-Backoffice ist kundenzentriert aufgebaut. + +Der Kunde ist das zentrale Objekt. + +## Hauptobjekte + +### Kunde +- Stammdaten +- Ansprechpartner +- Kontaktdaten +- Kundennummer +- Status +- Historie + +### Vertrag +- Vertragsnummer +- Laufzeiten +- Kündigungsstatus +- Abrechnungsmodell +- Produktreferenzen + +### Produkt +- Produktname +- Beschreibung +- Preis +- Abrechnungsintervall +- Status + +### Domain +- Domainname +- TLD +- Registrar +- Registrar-Account +- Laufzeiten +- Status + +### Registrar-Account +- Anbieter +- Accountbeschreibung +- Zugangsdaten/API-Referenzen +- Status + +### Hostingpaket +- Paketname +- Serverzuordnung +- Ressourcen +- Status + +### Server +- Hostname +- Rolle +- Provider +- KeyHelp-Referenz +- Status + +### Rechnung +- Rechnungsnummer +- Rechnungsdatum +- Betrag +- Zahlungsstatus +- externes System + +### Zahlung +- Zahlungsart +- Status +- externe Referenzen +- Gebührenregeln später möglich + +### Ticket +- Status +- Priorität +- Verlauf +- interne Notizen + +### Dokument +- Datei +- Hashes +- Archivinformationen +- Referenzen + +### Audit-Log +- Benutzer +- Aktion +- Zeitstempel +- Objektbezug +- Änderungshistorie + +## Mandantenfähigkeit + +Von Anfang an vorbereiten: +- organisation_id +- tenant_id diff --git a/architecture/data-model-v0.2-direction.md b/architecture/data-model-v0.2-direction.md new file mode 100644 index 0000000..a0fc75f --- /dev/null +++ b/architecture/data-model-v0.2-direction.md @@ -0,0 +1,78 @@ +# Data Model v0.2 — Korrekturrichtung + +## Zweck +Dieses Dokument beschreibt die Richtung für das überarbeitete Datenmodell v0.2. + +## Hauptänderungen gegenüber v0.1 + +- `organisation_id` wird entfernt bzw. nicht standardmäßig verwendet +- `tenant_id` wird zentrale Mandantenreferenz +- anbieter-spezifische Felder werden entfernt +- External References werden eingeführt +- Kunde wird in Customer / Party / Address / ContactPoint aufgeteilt +- Billing wird eigene Domäne +- Core wird fachlich verkleinert + +## Zentrale Tabellenbereiche + +### Core +- tenants +- users +- roles +- permissions +- module_registry +- audit_logs +- settings +- external_references +- secrets_references + +### Customer Module +- customers +- parties +- addresses +- contact_points +- customer_contacts + +### Contract Module +- contracts +- contract_items +- contract_status_history + +### Product Module +- products +- product_prices +- product_tax_metadata + +### Domain Module +- domains +- domain_status_history +- registrar_accounts + +### Hosting Module +- hosting_packages +- servers +- hosting_assignments +- hosting_status_history + +### Billing Module +- invoice_references +- payment_references +- billing_accounts +- payment_methods + +### Ticket Module +- tickets +- ticket_messages +- ticket_notes +- ticket_status_history + +### Document Module +- documents +- document_hashes +- document_links + +## Wichtig +Dieses Dokument ist noch kein vollständiges ER-Modell. + +Nächster Schritt: +- ER-Modell mit Beziehungen und Kardinalitäten erstellen. diff --git a/architecture/deployment-strategy-v0.1.md b/architecture/deployment-strategy-v0.1.md new file mode 100644 index 0000000..d32ee4a --- /dev/null +++ b/architecture/deployment-strategy-v0.1.md @@ -0,0 +1,32 @@ +# Deployment Strategy v0.1 + +## Grundprinzip + +Hosting-Backoffice soll sicher, reproduzierbar und verständlich installiert werden können. + +## V1-Ansatz + +- Laravel-Anwendung +- Webserver mit PHP +- MariaDB oder PostgreSQL +- Composer +- Queue optional +- Cron/Scheduler + +## Später möglich + +- Docker-Deployment +- SaaS-Variante +- Installer +- Update-System +- Systemchecks + +## Sicherheitsprinzip + +Produktivsysteme dürfen nicht direkt durch KI-Agenten verändert werden. + +Änderungen laufen über: +- Entwicklungsumgebung +- Tests +- Review +- kontrolliertes Deployment diff --git a/architecture/gobd-archive-strategy-v0.1.md b/architecture/gobd-archive-strategy-v0.1.md new file mode 100644 index 0000000..7a12444 --- /dev/null +++ b/architecture/gobd-archive-strategy-v0.1.md @@ -0,0 +1,41 @@ +# GoBD & Archive Strategy v0.1 + +## Grundprinzip + +Dokumente und relevante Änderungen sollen nachvollziehbar und revisionsfreundlich gespeichert werden. + +## Ziele + +Das System soll: +- PDFs archivieren +- Änderungen nachvollziehbar machen +- Auditinformationen speichern +- Dokumente referenzieren +- Hash-Prüfungen ermöglichen + +## Dokumenttypen + +- Rechnungen +- Vertragsdokumente +- Anhänge +- Supportdokumente +- Importdateien + +## V1 + +- PDFs speichern +- Hashes speichern +- Audit-Logs schreiben +- Archivmetadaten speichern + +## Später möglich + +- WORM-Speicher +- S3 Object Lock +- externe Archivsysteme +- Langzeitarchivierung +- Signaturprüfungen + +## Wichtig + +Hosting-Backoffice ist zunächst kein vollständiges DMS oder Buchhaltungssystem. diff --git a/architecture/hosting-strategy-v0.1.md b/architecture/hosting-strategy-v0.1.md new file mode 100644 index 0000000..f7bb29d --- /dev/null +++ b/architecture/hosting-strategy-v0.1.md @@ -0,0 +1,51 @@ +# Hosting Strategy v0.1 + +## Grundprinzip + +Hosting-Backoffice ist kundenzentriert aufgebaut. + +Server, Domains und Hostingpakete werden zentral verwaltet. + +## Hostingbereiche + +### Hostingpakete +- Zuordnung zu Kunden +- Zuordnung zu Servern +- Status +- Ressourcen später möglich + +### Domains +- Registrar-Zuordnung +- Laufzeiten +- Status +- Kundenzuordnung + +### Server +- zentrale Serverobjekte +- Rollen später möglich +- KeyHelp-Referenzen + +## V1 + +Unterstützt: +- KeyHelp +- 1blu Business + +## Registrarstrategie + +V1: +- Import +- manuelle Zuordnung +- mehrere Accounts + +Später: +- API-Synchronisation +- mehrere Registrare +- TLD-Regeln +- Registrarrouting + +## Nicht Teil von V1 + +- automatische Provisionierung +- VM-Orchestrierung +- Cloudmanagement diff --git a/architecture/integration-adapter-pattern-v0.1.md b/architecture/integration-adapter-pattern-v0.1.md new file mode 100644 index 0000000..8528c3d --- /dev/null +++ b/architecture/integration-adapter-pattern-v0.1.md @@ -0,0 +1,38 @@ +# Integration Adapter Pattern v0.1 + +## Grundprinzip + +Externe Anbieter werden über Adapter angebunden. + +Der Core kennt keine direkte Anbieterlogik. + +## Beispiel + +Nicht: +- Kunde → direkt Lexware + +Sondern: +- Kunde → Billing Interface → Lexware Adapter + +## Adapterbereiche + +- Billing Adapter +- Registrar Adapter +- Hosting Panel Adapter +- Payment Reference Adapter +- Notification Adapter + +## Vorteile + +- Anbieter austauschbar +- Core bleibt stabil +- Module sind testbar +- spätere Erweiterungen werden einfacher + +## Anforderungen an Adapter + +- definierte Interfaces +- Fehlerbehandlung +- Logging +- Auditierbarkeit bei kritischen Aktionen +- sichere Speicherung von Zugangsdaten diff --git a/architecture/logging-monitoring-strategy-v0.1.md b/architecture/logging-monitoring-strategy-v0.1.md new file mode 100644 index 0000000..bc89582 --- /dev/null +++ b/architecture/logging-monitoring-strategy-v0.1.md @@ -0,0 +1,34 @@ +# Logging & Monitoring Strategy v0.1 + +## Grundprinzip + +Alle wichtigen Aktionen sollen nachvollziehbar sein. + +Das System soll Fehler erkennen, Änderungen protokollieren und Systemzustände überwachen können. + +## Logging + +Geplant: +- Login-Logs +- API-Logs +- Import-Logs +- Fehler-Logs +- Ticketaktionen +- Benutzeraktionen + +## Audit-Logs + +Audit-Logs sind getrennt von technischen Logs. + +Sie dienen Nachvollziehbarkeit, Compliance und Archivierung. + +## Monitoring später + +- Serverstatus +- API-Status +- Integrationsstatus +- Benachrichtigungen + +## Sicherheitsprinzip + +Logs dürfen nicht manipulierbar sein und müssen nachvollziehbar, filterbar und geschützt gespeichert werden. diff --git a/architecture/module-structure-v0.2.md b/architecture/module-structure-v0.2.md new file mode 100644 index 0000000..7afead3 --- /dev/null +++ b/architecture/module-structure-v0.2.md @@ -0,0 +1,65 @@ +# Module Structure v0.2 + +## Zweck +Dieses Dokument ersetzt die Modulstruktur v0.1 als verbindliche Modulübersicht. + +## Core +- Identity +- Authentication +- Tenancy +- RBAC +- Audit Base +- Module Registry +- Settings Base +- Event Routing +- API Base + +## Service-Module + +### Customers +Kunden, Parteien, Adressen, Kontakte. + +### Contracts +Verträge, Laufzeiten, Vertragspositionen. + +### Products +Produkte, Leistungen, Preise, Steuer-Metadaten. + +### Domains +Domains, TLD, Status, Registrar-Zuordnung. + +### Hosting +Hostingpakete, Server, Zuordnungen. + +### Billing +Rechnungsreferenzen, Zahlungsreferenzen, externe Billing-Konten. + +### Tickets +Tickets, Antworten, interne Notizen, Status. + +### Documents +PDFs, Anhänge, Hashes, Dokumentenverknüpfungen. + +### Notifications +Benachrichtigungsrouting und spätere Kanäle. + +## Integrationsmodule + +### KeyHelp Adapter +Verbindung zu KeyHelp. + +### 1blu Adapter +Import und spätere Synchronisation. + +### Lexware Adapter +Billing-Referenzen und spätere Synchronisation. + +### Invoice Ninja Adapter +Alternative Billing-Anbindung. + +## Nicht V1 +- AI Assistant +- WordPress Plugin +- Customer Portal +- Plesk/cPanel +- Cloud Provisioning diff --git a/architecture/multi-tenancy-strategy-v0.1.md b/architecture/multi-tenancy-strategy-v0.1.md new file mode 100644 index 0000000..3b1eb5c --- /dev/null +++ b/architecture/multi-tenancy-strategy-v0.1.md @@ -0,0 +1,30 @@ +# Multi-Tenancy Strategy v0.1 + +## Grundprinzip + +Mandantenfähigkeit wird von Anfang an architektonisch vorbereitet. + +V1 bleibt zunächst einfach nutzbar, spätere Multi-Tenant- und Resellerstrukturen sollen jedoch möglich bleiben. + +## Ziele + +Das System soll später ermöglichen: +- mehrere Organisationen +- Reseller +- getrennte Kundenbereiche +- Datenisolation +- Rechteisolation + +## Architekturprinzip + +Alle zentralen Objekte sollen vorbereitet sein für: +- organisation_id +- tenant_id + +## V1 + +V1 arbeitet zunächst primär als Single-Tenant-System. Die Datenstruktur bleibt vorbereitet. + +## Sicherheitsprinzip + +Mandanten dürfen niemals auf fremde Daten zugreifen können. diff --git a/architecture/notification-strategy-v0.1.md b/architecture/notification-strategy-v0.1.md new file mode 100644 index 0000000..09c5439 --- /dev/null +++ b/architecture/notification-strategy-v0.1.md @@ -0,0 +1,29 @@ +# Notification Strategy v0.1 + +## Grundprinzip + +Benachrichtigungen sollen Kunden und Administratoren über relevante Ereignisse informieren. + +## V1-Benachrichtigungen + +- Ticket erstellt +- Ticket beantwortet +- Rechnungsstatus geändert +- Domainlaufzeit-Hinweis später +- Import abgeschlossen +- kritische Systemereignisse + +## Kanäle + +V1: +- E-Mail +- interne Systemmeldungen + +Später: +- Webhooks +- Kundenportal-Benachrichtigungen +- optionale Messenger-/Push-Systeme + +## Architektur + +Benachrichtigungen sollen über ein zentrales Notification-System laufen, nicht direkt aus einzelnen Modulen heraus hart verdrahtet werden. diff --git a/architecture/payment-policy-v0.1.md b/architecture/payment-policy-v0.1.md new file mode 100644 index 0000000..1b475e5 --- /dev/null +++ b/architecture/payment-policy-v0.1.md @@ -0,0 +1,28 @@ +# Payment Policy v0.1 + +## Grundprinzip + +Hosting-Backoffice ist kein Payment-Service-Provider und kein Banking-System. + +Das System verwaltet Zahlungsarten, Status, Hinweise und externe Referenzen. + +## Zahlungsarten V1 + +- Rechnung +- Überweisung +- Lastschrift +- PayPal +- Wero + +## Gebührenregeln + +Später sollen Zahlungsarten mit Regeln versehen werden können: +- bevorzugte Zahlungsart +- Hinweistext +- mögliche Zusatzgebühr +- rechtlicher Hinweis +- Aktivierung je Kunde oder Produkt + +## Rechtlicher Hinweis + +Gebühren für Zahlungsarten müssen rechtlich geprüft werden. Die Software soll Konfiguration ermöglichen, aber keine pauschalen rechtlichen Annahmen hart einbauen. diff --git a/architecture/security-and-rights-v0.1.md b/architecture/security-and-rights-v0.1.md new file mode 100644 index 0000000..c4d236b --- /dev/null +++ b/architecture/security-and-rights-v0.1.md @@ -0,0 +1,49 @@ +# Security & Rights Model v0.1 + +## Grundprinzip + +Hosting-Backoffice ist ein kundenzentriertes System mit sensiblen Daten. + +Sicherheit, Nachvollziehbarkeit und Rechtekontrolle haben hohe Priorität. + +## Benutzerrollen V1 + +### Superadmin +Vollzugriff auf Systemeinstellungen, Module, Benutzer, Server, Integrationen und Auditdaten. + +### Administrator +Zugriff auf Kunden, Verträge, Domains, Tickets, Rechnungsreferenzen und Hostingpakete. + +### Support-Mitarbeiter +Zugriff auf Tickets, Kundeninformationen und Hostingstatus. Kein Zugriff auf kritische Einstellungen. + +### Kunde +Zugriff ausschließlich auf eigene Verträge, Domains, Rechnungen, Tickets und Dokumente. + +## API-Sicherheit + +- Authentifizierung +- Rechteprüfung +- Auditierung +- Tokenbasierte API +- später OAuth/Sanctum möglich + +## Audit-Logs + +Alle kritischen Aktionen sollen protokolliert werden. + +Beispiele: +- Loginversuche +- Änderungen +- Löschungen +- Ticketaktionen +- Domainänderungen +- Benutzerrechte +- Importvorgänge + +## Mandantenfähigkeit + +- tenant_id / organisation_id +- Datenisolation +- Rechteisolation +- spätere Resellerfähigkeit diff --git a/architecture/security-and-rights-v0.2.md b/architecture/security-and-rights-v0.2.md new file mode 100644 index 0000000..d50044d --- /dev/null +++ b/architecture/security-and-rights-v0.2.md @@ -0,0 +1,47 @@ +# Security & Rights Model v0.2 + +## Zweck +Dieses Dokument ergänzt das Sicherheitsmodell um konkrete Entscheidungen aus den ADRs. + +## Zentrale Sicherheitsentscheidungen + +- tenant_id als Mandantenkontext +- PostgreSQL als Datenbank +- Laravel Sanctum als Auth-Basis +- Secrets nicht in Fachtabellen speichern +- Audit-Logs append-only +- API-Zugriffe auditierbar +- Plugin-Scopes später minimal halten + +## Rollen V1 + +### Superadmin +Systemweiter Zugriff, aber alle mandantenübergreifenden Aktionen werden auditierbar. + +### Tenant Admin +Verwaltet den eigenen Mandanten. + +### Staff / Support +Bearbeitet Kunden, Tickets und operative Daten innerhalb eines Mandanten. + +### Kunde +Nicht V1, erst Customer Portal V2. + +## Tenant-Isolation +Alle mandantenbezogenen Daten benötigen: + +- tenant_id +- Policy-Prüfung +- Query-Scope +- Tests gegen Tenant-Leaks + +## Secrets +Secrets werden nur über einen Secret-Service gelesen/geschrieben. + +## Audit +Kritische Aktionen werden in Audit-Logs erfasst. + +## Offene Punkte +- genaue MFA-Pflicht +- Impersonation-Regeln +- RLS-Umsetzung im Detail diff --git a/decisions/0001-standalone-core.md b/decisions/0001-standalone-core.md new file mode 100644 index 0000000..9ec0bb6 --- /dev/null +++ b/decisions/0001-standalone-core.md @@ -0,0 +1,24 @@ +# Entscheidung 0001: Standalone-Core statt WordPress-Core + +## Entscheidung + +Das Hosting-Backoffice wird als eigenständiges Laravel-System entwickelt. + +WordPress wird nicht als Kernsystem verwendet, sondern später optional über ein Plugin angebunden. + +## Begründung + +- höhere Sicherheit +- bessere Kontrolle über Rechte, Daten und APIs +- weniger Abhängigkeit von Fremdplugins +- bessere Skalierbarkeit +- sauberere Modularchitektur +- bessere Trennung zwischen Backoffice und Frontend + +## Zielarchitektur + +Standalone-Core + REST API + optionale Integrationen + optionales WordPress-Plugin. + +## Status + +Akzeptiert. diff --git a/decisions/0002-customer-centric-platform.md b/decisions/0002-customer-centric-platform.md new file mode 100644 index 0000000..566de7a --- /dev/null +++ b/decisions/0002-customer-centric-platform.md @@ -0,0 +1,28 @@ +# Entscheidung 0002: Kundenzentriertes Hosting-Backoffice + +## Entscheidung + +Das System wird kundenzentriert aufgebaut. + +Nicht Server, Domains oder Rechnungen stehen im Zentrum, sondern der Kunde mit allen zugehörigen Objekten. + +## Zentrale Sicht + +Kunde: +- Verträge +- Domains +- Hostingpakete +- Serverbezug +- Rechnungen +- Zahlungen +- Tickets +- Dokumente +- Historie + +## Begründung + +Ein kleines Hostinggeschäft benötigt vor allem Übersicht und Beziehungskontext. Support, Abrechnung und technische Informationen müssen aus einer Kundenakte heraus verständlich sein. + +## Status + +Akzeptiert. diff --git a/decisions/0003-no-own-payment-system.md b/decisions/0003-no-own-payment-system.md new file mode 100644 index 0000000..efeb199 --- /dev/null +++ b/decisions/0003-no-own-payment-system.md @@ -0,0 +1,27 @@ +# Entscheidung 0003: Kein eigenes Payment-/Banking-System + +## Entscheidung + +Hosting-Backoffice wird keine eigene Zahlungs- oder Banking-Plattform. + +Das System verwaltet Zahlungsarten, Zahlungsstatus, Hinweise, externe Referenzen und spätere Gebührenregeln. Die eigentliche Zahlungsabwicklung erfolgt über externe Anbieter oder Rechnungssysteme. + +## Begründung + +- weniger rechtliche Risiken +- weniger Sicherheitsrisiken +- weniger Compliance-Aufwand +- keine unnötige PCI-/Banking-Komplexität +- bessere Austauschbarkeit externer Anbieter + +## Beispiele + +- Lexware Office +- Invoice Ninja CE +- PayPal +- Wero +- SEPA-/Bankprozesse außerhalb des Cores + +## Status + +Akzeptiert. diff --git a/decisions/0004-tenancy-model.md b/decisions/0004-tenancy-model.md new file mode 100644 index 0000000..6d372f2 --- /dev/null +++ b/decisions/0004-tenancy-model.md @@ -0,0 +1,162 @@ +# ADR 0004 — Tenancy-Modell + +## Status +Accepted + +## Kurz erklärt +Tenancy bedeutet Mandantenfähigkeit. + +Ein Mandant ist z. B. ein Anbieter, eine Agentur oder später ein Reseller, der seine eigenen Kunden, Verträge, Domains und Rechnungen verwaltet. + +Das Tenancy-Modell legt fest, wie Daten verschiedener Mandanten technisch voneinander getrennt werden. + +## Kontext +Hosting-Backoffice soll zunächst einfach nutzbar sein, später aber mandantenfähig und ggf. resellerfähig erweitert werden können. + +Die bisherige Planung enthielt die Begriffe `tenant_id` und `organisation_id`, ohne deren Verhältnis eindeutig zu definieren. + +Das wurde im Architekturreview als kritisches Risiko bewertet, da eine nachträgliche Mandantenfähigkeit sehr teuer und fehleranfällig wäre. + +## Entscheidung +Hosting-Backoffice verwendet von Beginn an ein mandantenfähiges Datenmodell mit: + +- `tenant_id` als zentrale Mandantenreferenz +- Shared Database Modell +- PostgreSQL als bevorzugte Datenbank +- Tenant Scope auf Anwendungsebene +- Row Level Security als spätere zusätzliche Sicherheitsschicht + +`organisation_id` wird vorerst nicht als separates Standardfeld verwendet. + +Falls später eine Organisationshierarchie benötigt wird, wird diese über das Tenant-Modell abgebildet. + +## Gewähltes Modell + +```text +Platform +└── Tenant + └── Kunde + └── Verträge + └── Domains + └── Hostingpakete + └── Tickets + └── Dokumente +``` + +Später möglich: + +```text +Platform +└── Tenant + └── Reseller-Tenant + └── Kunden +``` + +Dafür kann später ein Feld wie `parent_tenant_id` in der Tenant-Struktur ergänzt oder vorbereitet werden. + +## Begründung +Ein Shared-Database-Modell mit `tenant_id` ist für den Start sinnvoll, weil: + +- V1 klein bleiben soll +- alle Daten zentral verwaltbar bleiben +- Migrationen einfacher sind +- Betrieb und Backups weniger komplex sind +- spätere Mandantenfähigkeit vorbereitet wird +- Resellerstrukturen später möglich bleiben + +PostgreSQL wird bevorzugt, weil es Row Level Security unterstützt. + +Row Level Security bedeutet: + +```text +Die Datenbank selbst kann verhindern, +dass Mandant A Datensätze von Mandant B sieht. +``` + +Das ist eine zusätzliche Sicherheitsschicht neben der Anwendung. + +## Konsequenzen + +### Positiv +- Mandantenfähigkeit wird nicht später „angeklebt“ +- bessere Grundlage für spätere SaaS-/Resellerfähigkeit +- klare Datenisolation +- bessere Sicherheitsarchitektur +- weniger Refactoring-Risiko + +### Negativ +- jede mandantenbezogene Tabelle braucht `tenant_id` +- alle Abfragen müssen tenant-aware sein +- Entwickler müssen von Anfang an sauber mit Tenant-Kontext arbeiten +- Tests müssen Mandantenisolation prüfen + +## Technische Leitlinien +Alle mandantenbezogenen Tabellen erhalten: + +```text +tenant_id +``` + +Beispiele: + +```text +customers.tenant_id +contracts.tenant_id +domains.tenant_id +hosting_packages.tenant_id +tickets.tenant_id +documents.tenant_id +``` + +Nicht mandantenbezogene Tabellen können global sein, z. B.: + +```text +system_settings +module_registry +global_permissions +``` + +## Anwendungsebene +Laravel soll sicherstellen, dass mandantenbezogene Daten nur im aktuellen Tenant-Kontext geladen werden. + +Dafür vorgesehen: + +- Tenant Context +- Eloquent Global Scopes +- Policies +- Tests gegen Tenant-Leaks + +Tenant-Leak bedeutet: + +```text +Ein Benutzer oder Prozess sieht versehentlich Daten eines anderen Mandanten. +``` + +## Datenbankebene +PostgreSQL Row Level Security soll als spätere zweite Schutzschicht vorbereitet werden. + +V1 kann zunächst mit sauberem Tenant Scope in Laravel starten. + +RLS sollte jedoch nicht durch Datenmodellentscheidungen blockiert werden. + +## Offene Punkte +Noch zu klären: + +- genaue Tenant-Tabelle +- ob `parent_tenant_id` sofort angelegt wird +- ob V1 technisch bereits echtes Multi-Tenant-Login erlaubt +- wie Plattform-Admins mandantenübergreifend arbeiten dürfen +- wie Tenant-Offboarding später funktioniert + +## Nicht entschieden +Diese ADR entscheidet noch nicht: + +- ob Hosting-Backoffice später SaaS oder nur self-hosted wird +- ob einzelne Mandanten später eigene Datenbanken erhalten können +- ob Resellerstrukturen bereits in V1 aktiv sichtbar sind + +## Verwandte ADRs +- ADR 0005 — Datenbankwahl +- ADR 0006 — Auth-Strategie +- ADR 0009 — Core-Grenzen +- ADR 0011 — GoBD-Verantwortlichkeit diff --git a/decisions/0005-database-choice.md b/decisions/0005-database-choice.md new file mode 100644 index 0000000..f8b6e0d --- /dev/null +++ b/decisions/0005-database-choice.md @@ -0,0 +1,80 @@ +# ADR 0005 — Datenbankwahl + +## Status +Accepted + +## Kurz erklärt +Die Datenbank ist der zentrale Speicher für Kunden, Verträge, Domains, Tickets, Dokumente und technische Referenzen. + +Die Wahl der Datenbank beeinflusst später besonders: + +- Mandantenfähigkeit +- Sicherheit +- Performance +- Auditierbarkeit +- Skalierbarkeit +- Entwicklungsaufwand + +## Kontext +In der ersten Planung waren MariaDB und PostgreSQL offen. + +Das Architekturreview hat kritisiert, dass eine offene Datenbankwahl bei Multi-Tenancy und API-first zu einem kleinsten gemeinsamen Nenner führen würde. + +## Entscheidung +Hosting-Backoffice verwendet PostgreSQL als primäre Datenbank. + +## Begründung +PostgreSQL bietet wichtige Funktionen für das Zielbild: + +- Row Level Security +- starke Datenintegrität +- JSONB-Unterstützung +- gute Indexierungsoptionen +- transaktionale Migrationen +- gute Grundlage für Mandantenfähigkeit +- gute Grundlage für spätere SaaS-/Reseller-Strukturen + +## Row Level Security +Row Level Security bedeutet: + +```text +Die Datenbank kann Regeln erzwingen, +welche Datensätze ein Benutzer oder Prozess sehen darf. +``` + +Das ist besonders relevant, wenn mehrere Mandanten in einer gemeinsamen Datenbank verwaltet werden. + +## Nicht gewählt + +### MariaDB / MySQL +Vorteile: + +- sehr weit verbreitet +- vielen Hostern bekannt +- einfacher Einstieg + +Nachteile: + +- schwächer für Row-Level-Isolation +- schwächer als Sicherheitsbasis für Mandantenfähigkeit +- langfristig weniger geeignet für das geplante SaaS-/Reseller-Modell + +## Konsequenzen + +### Positiv +- bessere Sicherheitsarchitektur +- bessere Grundlage für Multi-Tenancy +- bessere technische Zukunftsfähigkeit + +### Negativ +- etwas höhere Einstiegshürde +- nicht jeder kleine Shared-Hosting-Anbieter bietet PostgreSQL gleichwertig an +- Self-hosted-Installationen benötigen klare Systemvoraussetzungen + +## Leitlinie +Hosting-Backoffice wird nicht primär für beliebiges Billig-Shared-Hosting optimiert, sondern für eine seriöse, betreibbare Hosting-/Backoffice-Umgebung. + +## Verwandte ADRs +- ADR 0004 — Tenancy-Modell +- ADR 0010 — Secrets-Management +- ADR 0014 — Audit-Log-Strategie diff --git a/decisions/0006-auth-strategy.md b/decisions/0006-auth-strategy.md new file mode 100644 index 0000000..34c9084 --- /dev/null +++ b/decisions/0006-auth-strategy.md @@ -0,0 +1,96 @@ +# ADR 0006 — Auth-Strategie + +## Status +Accepted + +## Kurz erklärt +Auth bedeutet Authentifizierung und Autorisierung. + +Authentifizierung beantwortet: + +```text +Wer bist du? +``` + +Autorisierung beantwortet: + +```text +Was darfst du? +``` + +## Kontext +Das System benötigt mehrere Zugriffstypen: + +- Admin-Login +- Mitarbeiter-Login +- Kundenlogin später +- API-Zugriffe +- Integrationen +- später WordPress-Plugin + +Das Architekturreview hat kritisiert, dass „Tokenbasiert, später OAuth/Sanctum“ zu unscharf ist. + +## Entscheidung +V1 verwendet Laravel Sanctum als Auth-Basis. + +Sanctum wird genutzt für: + +- Admin-/Backoffice-Login +- interne API +- Personal Access Tokens für technische Clients +- spätere einfache API-Zugriffe + +OAuth2/Passport wird nicht in V1 eingeführt. + +## Warum Sanctum? +Sanctum ist für V1 passend, weil: + +- es Laravel-nah ist +- wenig Overhead erzeugt +- API-Tokens unterstützt +- SPA-/Frontend-Sessions unterstützt +- für ein kleines V1-Team einfacher beherrschbar ist + +## OAuth2 später +OAuth2 kann später relevant werden für: + +- Drittanbieter-Apps +- öffentliches Plugin-Ökosystem +- externe Entwickler +- komplexere WordPress-Plugin-Szenarien + +## Rechteprüfung +Auth allein reicht nicht. + +Jeder Zugriff benötigt zusätzlich: + +- Tenant-Kontext +- Rollenprüfung +- Policy-Prüfung +- Auditierbarkeit bei kritischen Aktionen + +## MFA +MFA bedeutet Multi-Faktor-Authentifizierung. + +Für V1 gilt: + +- MFA für Superadmins empfohlen +- MFA für normale Kunden optional später +- WebAuthn kann später geprüft werden + +## Konsequenzen + +### Positiv +- einfacher Einstieg +- Laravel-nah +- gut für V1 +- weniger Komplexität + +### Negativ +- für öffentliche Drittanbieter-Ökosysteme später eventuell nicht ausreichend +- OAuth2 muss ggf. später zusätzlich eingeführt werden + +## Verwandte ADRs +- ADR 0004 — Tenancy-Modell +- ADR 0012 — Frontend-Strategie +- ADR 0018 — WordPress-Plugin-Security diff --git a/decisions/0007-module-system.md b/decisions/0007-module-system.md new file mode 100644 index 0000000..f7bc860 --- /dev/null +++ b/decisions/0007-module-system.md @@ -0,0 +1,102 @@ +# ADR 0007 — Modul-System + +## Status +Accepted + +## Kurz erklärt +Das Modul-System legt fest, wie Funktionen voneinander getrennt werden. + +Ziel ist: + +```text +modular denken, +aber V1 nicht technisch überkomplizieren. +``` + +## Kontext +Das Projekt soll kein klassischer Monolith werden. + +Gleichzeitig wäre ein echtes Microservice-System für V1 zu komplex. + +## Entscheidung +V1 verwendet ein modulares In-App-Modell innerhalb einer Laravel-Anwendung. + +Module sind logisch getrennt, laufen aber im selben Deployment. + +## Warum kein Microservice-System? +Microservices bedeuten: + +- mehrere Deployments +- mehrere Services +- Service-Kommunikation +- verteiltes Logging +- verteilte Fehlerbilder +- mehr DevOps-Aufwand + +Für V1 wäre das zu schwer. + +## Modularten + +### Core +Minimaler Plattformkern. + +### Service-Module +Fachliche Module wie: + +- Kunden +- Verträge +- Domains +- Hosting +- Tickets +- Dokumente +- Billing + +### Integrationsmodule +Adapter zu externen Systemen wie: + +- KeyHelp +- 1blu +- Lexware +- Invoice Ninja + +## Technische Leitlinien +Module kommunizieren über: + +- Service-Contracts +- Events +- definierte Interfaces + +Nicht erlaubt: + +```text +Modul A verändert ungeprüft interne Tabellen von Modul B. +``` + +## Modul-Lifecycle +Module sollen später Zustände haben: + +- installiert +- aktiviert +- deaktiviert +- aktualisiert +- archiviert + +Deinstallation mit Datenlöschung ist nicht Standard. + +## Konsequenzen + +### Positiv +- V1 bleibt betreibbar +- Architektur bleibt modular +- keine Microservice-Komplexität +- spätere Auslagerung einzelner Module bleibt möglich + +### Negativ +- strikte Disziplin nötig +- Modulgrenzen müssen geprüft werden +- ohne klare Contracts droht trotzdem ein Monolith + +## Verwandte ADRs +- ADR 0009 — Core-Grenzen +- ADR 0008 — External-Reference-Pattern +- ADR 0016 — Modul-Lifecycle diff --git a/decisions/0008-external-reference-pattern.md b/decisions/0008-external-reference-pattern.md new file mode 100644 index 0000000..6f9ead9 --- /dev/null +++ b/decisions/0008-external-reference-pattern.md @@ -0,0 +1,97 @@ +# ADR 0008 — External-Reference-Pattern + +## Status +Accepted + +## Kurz erklärt +External Reference bedeutet: + +```text +Ein internes Objekt merkt sich, +wie es in einem externen System heißt. +``` + +Beispiel: + +- Kunde im Backoffice +- derselbe Kunde in Lexware +- dieselbe Domain bei 1blu +- derselbe Hostingaccount in KeyHelp + +## Kontext +Das Architekturreview hat kritisiert, dass konkrete Anbieterfelder wie `keyhelp_id` oder `lexware_id` im Core das Adapter-Pattern zerstören würden. + +## Entscheidung +Hosting-Backoffice verwendet ein generisches External-Reference-Pattern. + +Der Core erhält keine Anbieterfelder wie: + +```text +keyhelp_id +lexware_id +oneblu_id +``` + +Stattdessen gibt es eine generische Referenzstruktur. + +## Beispielstruktur + +```text +external_references +- id +- tenant_id +- owner_type +- owner_id +- provider +- provider_account_id +- external_id +- external_type +- metadata +- last_synced_at +- created_at +- updated_at +``` + +## Beispiel + +```text +owner_type: Domain +owner_id: 123 +provider: 1blu +external_id: ABC-987 +``` + +Oder: + +```text +owner_type: Server +owner_id: 55 +provider: KeyHelp +external_id: server-user-4711 +``` + +## Begründung +Dieses Pattern sorgt für: + +- Providerneutralität +- weniger Core-Abhängigkeiten +- einfachere neue Integrationen +- saubere Migrationen +- bessere Austauschbarkeit von Modulen + +## Konsequenzen + +### Positiv +- keine harte Anbieterlogik im Core +- bessere Erweiterbarkeit +- sauberer Wechsel von Anbietern möglich + +### Negativ +- etwas komplexeres Datenmodell +- Entwickler müssen über Adapter denken +- direkte Fremdschlüssel zu externen Systemen sind nicht erlaubt + +## Verwandte ADRs +- ADR 0007 — Modul-System +- ADR 0009 — Core-Grenzen +- ADR 0017 — Adapter-Fehlerresilienz diff --git a/decisions/0009-core-boundaries.md b/decisions/0009-core-boundaries.md new file mode 100644 index 0000000..d6f07df --- /dev/null +++ b/decisions/0009-core-boundaries.md @@ -0,0 +1,106 @@ +# ADR 0009 — Core-Grenzen + +## Status +Accepted + +## Kurz erklärt +Core-Grenzen legen fest, was wirklich in den Plattformkern gehört. + +Je größer der Core wird, desto höher ist das Risiko, dass das System trotz Modulidee zu einem Monolithen wird. + +## Kontext +Das Architekturreview hat kritisiert, dass der bisherige Core zu groß definiert war. + +Bisher waren u. a. Kunden, Domains, Server, Produkte, Dokumente und Benachrichtigungen im Core vorgesehen. + +Das widerspricht dem Ziel eines modularen Systems. + +## Entscheidung +Der Core wird bewusst klein gehalten. + +Der Core enthält nur technische und organisatorische Plattformfunktionen, die alle Module benötigen. + +## Core enthält + +- Identity +- Authentication +- Tenant Context +- RBAC / Policies +- Audit-Grundstruktur +- Module Registry +- Settings-Grundstruktur +- Event Routing +- API-Basis +- System Health + +## Core enthält NICHT + +- Kundenfachlogik +- Domainfachlogik +- Billingfachlogik +- Hostingfachlogik +- Ticketsystemfachlogik +- Dokumentenarchivfachlogik +- Anbieterlogik + +Diese Bereiche werden als Service-Module oder Integrationsmodule behandelt. + +## Neue Struktur + +```text +Core +├── Identity +├── Tenancy +├── RBAC +├── Audit Base +├── Module Registry +├── Settings Base +├── Event Routing +└── API Base + +Service Modules +├── Customers +├── Contracts +├── Products +├── Domains +├── Hosting +├── Billing +├── Tickets +├── Documents +└── Notifications + +Integration Modules +├── KeyHelp +├── 1blu +├── Lexware +└── Invoice Ninja +``` + +## Begründung +Ein kleiner Core reduziert: + +- Kopplung +- Refactoring-Risiken +- Monolith-Gefahr +- Abhängigkeiten zwischen Fachbereichen + +## Konsequenzen + +### Positiv +- sauberere Modulgrenzen +- leichter testbar +- langfristig besser erweiterbar +- neue Integrationen einfacher möglich + +### Negativ +- mehr Architekturdisziplin nötig +- Module brauchen definierte Contracts +- anfänglich mehr Planungsaufwand + +## Regel +Wenn ein Bereich fachliche Geschäftslogik enthält, gehört er nicht in den Core. + +## Verwandte ADRs +- ADR 0007 — Modul-System +- ADR 0008 — External-Reference-Pattern +- ADR 0016 — Modul-Lifecycle diff --git a/decisions/0010-secrets-management.md b/decisions/0010-secrets-management.md new file mode 100644 index 0000000..62a7454 --- /dev/null +++ b/decisions/0010-secrets-management.md @@ -0,0 +1,99 @@ +# ADR 0010 — Secrets-Management + +## Status +Accepted + +## Kurz erklärt +Secrets sind geheime technische Zugangsdaten, z. B.: + +- API-Keys +- Registrar-Zugänge +- Tokens +- Passwörter +- Webhook-Secrets + +Secrets dürfen nicht wie normale Stammdaten gespeichert werden. + +## Kontext +Hosting-Backoffice wird später Zugangsdaten zu externen Systemen verwalten: + +- KeyHelp +- 1blu +- Lexware +- Invoice Ninja +- SMTP +- Zahlungsanbieter + +Das Architekturreview hat fehlendes Secrets-Management als kritisches Risiko bewertet. + +## Entscheidung +Das Datenmodell speichert keine Secrets direkt in fachlichen Tabellen. + +Fachliche Tabellen speichern nur Referenzen auf Secrets. + +## V1-Strategie +Für V1 wird mindestens verwendet: + +- verschlüsselte Speicherung mit Laravel Encryption +- getrennte Secret-Tabelle +- Zugriff nur über Secret-Service +- keine Ausgabe von Secrets im UI +- Audit-Log bei Secret-Erstellung/Änderung +- Rotation vorbereiten + +## Spätere Strategie +Für SaaS- oder größere Multi-Tenant-Nutzung wird ein externer Vault vorbereitet, z. B.: + +- HashiCorp Vault +- Bitwarden Secrets Manager +- Cloud KMS / Secrets Manager + +## Beispiel + +Nicht erlaubt: + +```text +registrar_accounts.api_password +``` + +Erlaubt: + +```text +registrar_accounts.secret_reference_id +``` + +## Begründung +Bei einem Einbruch darf nicht sofort der direkte Zugriff auf alle externen Systeme möglich sein. + +Secrets brauchen: + +- Verschlüsselung +- Zugriffskontrolle +- Rotation +- Auditierung +- Mandantenisolation + +## Konsequenzen + +### Positiv +- höheres Sicherheitsniveau +- bessere Mandantenisolation +- spätere Vault-Anbindung möglich + +### Negativ +- mehr technische Komplexität +- Secret-Service muss früh gebaut werden +- Backups müssen besonders betrachtet werden + +## Mindestregeln + +- Secrets nie im Klartext loggen +- Secrets nie im UI vollständig anzeigen +- Secrets nie in normalen Exporten ausgeben +- Secret-Zugriff auditieren +- API-Keys rotierbar halten + +## Verwandte ADRs +- ADR 0004 — Tenancy-Modell +- ADR 0006 — Auth-Strategie +- ADR 0017 — Adapter-Fehlerresilienz diff --git a/decisions/0011-gobd-responsibility.md b/decisions/0011-gobd-responsibility.md new file mode 100644 index 0000000..5338978 --- /dev/null +++ b/decisions/0011-gobd-responsibility.md @@ -0,0 +1,76 @@ +# ADR 0011 — GoBD-Verantwortlichkeit + +## Status +Accepted + +## Kurz erklärt +GoBD beschreibt Anforderungen an ordnungsgemäße Buchführung und Aufbewahrung steuerlich relevanter Daten in Deutschland. + +Wichtige Frage: + +```text +Ist Hosting-Backoffice das führende Rechnungssystem +oder nur ein Verwaltungs-/Spiegelsystem? +``` + +## Kontext +Das System soll Rechnungen anzeigen, archivieren und mit Kunden/Verträgen verknüpfen. + +Gleichzeitig soll die eigentliche Rechnungsstellung über externe Systeme wie Lexware oder Invoice Ninja erfolgen. + +Das Architekturreview hat zurecht bemängelt, dass die GoBD-Rolle nicht eindeutig war. + +## Entscheidung +Hosting-Backoffice ist in V1 nicht das führende GoBD-Rechnungssystem. + +Das führende Rechnungssystem ist: + +- Lexware Office +- oder Invoice Ninja CE, sofern der Betreiber dies bewusst so nutzt + +Hosting-Backoffice ist in V1: + +- Referenzsystem +- Spiegel +- Dokumentenablage +- Prozess- und Audit-System + +## Konsequenz +Hosting-Backoffice erzeugt in V1 keine steuerlich führenden Originalrechnungen. + +Es speichert: + +- Rechnungsreferenzen +- PDF-Kopien +- Hashes +- Zahlungsstatus-Referenzen +- Audit-Ereignisse + +## Begründung +Damit werden reduziert: + +- Buchhaltungsrisiken +- GoBD-Komplexität +- Haftungsfragen +- technische Anforderungen an unveränderbare Originalbelege + +## Archivierung +PDF-Kopien können gespeichert werden, aber die Originalverantwortung liegt beim externen Billing-System. + +## Später möglich +Ein späteres eigenes GoBD-fähiges Billing-Modul wäre möglich, aber nicht Teil von V1. + +Dafür wären nötig: + +- lückenlose Nummernkreise +- Beleg-Festschreibung +- unveränderbare Speicherung +- Exportfunktionen +- Verfahrensdokumentation +- Steuerlogik +- Retention-Strategie + +## Verwandte ADRs +- ADR 0014 — Audit-Log-Strategie +- ADR 0015 — Tax- und VAT-Strategie +- ADR 0021 — DSGVO-Löschung und Retention diff --git a/decisions/0012-frontend-strategy.md b/decisions/0012-frontend-strategy.md new file mode 100644 index 0000000..0c14a8a --- /dev/null +++ b/decisions/0012-frontend-strategy.md @@ -0,0 +1,69 @@ +# ADR 0012 — Frontend-Strategie + +## Status +Accepted + +## Kurz erklärt +Die Frontend-Strategie legt fest, wie Benutzer die Anwendung bedienen. + +Wichtig ist die Frage: + +```text +Klassische Laravel-Seiten +oder modernes API-basiertes Frontend? +``` + +## Kontext +Das Architekturreview hat kritisiert, dass „Blade oder später Vue/Nuxt“ eine offene Grundsatzentscheidung ist. + +Für API-first darf das Frontend nicht direkt an Datenbanklogik hängen. + +## Entscheidung +V1 verwendet ein Laravel-basiertes Admin-Frontend, aber strikt über interne Service-/API-Schichten. + +Es wird kein vollständig getrenntes Nuxt/Vue-SPA in V1 gebaut. + +Das Frontend darf nicht direkt fachliche Datenbanklogik umgehen. + +## Warum? +Ein vollständiges SPA erhöht V1-Komplexität: + +- separater Build-Prozess +- separate Auth-Flows +- mehr Frontend-Architektur +- mehr Testing-Aufwand + +Für V1 ist ein Laravel-nahes Frontend effizienter. + +## API-first bleibt bestehen +API-first bedeutet hier: + +- Geschäftslogik liegt in Services/Contracts +- REST API wird parallel sauber definiert +- spätere externe Clients bleiben möglich +- WordPress-Plugin nutzt später ausschließlich API + +## Später möglich +In V2/V3 kann ein SPA-Frontend entstehen, wenn: + +- API stabil ist +- Auth-Scopes klar sind +- Kundenportal ausgebaut wird +- Plugin-/App-Ökosystem entsteht + +## Konsequenzen + +### Positiv +- schnellerer V1-Start +- weniger Komplexität +- gute Laravel-Integration + +### Negativ +- API-first muss diszipliniert umgesetzt werden +- Gefahr eines klassischen Laravel-Monolithen bleibt +- klare Architekturregeln nötig + +## Verwandte ADRs +- ADR 0006 — Auth-Strategie +- ADR 0018 — WordPress-Plugin-Security +- ADR 0020 — Customer-Portal-Scope diff --git a/decisions/0013-customer-domain-model.md b/decisions/0013-customer-domain-model.md new file mode 100644 index 0000000..cfe775e --- /dev/null +++ b/decisions/0013-customer-domain-model.md @@ -0,0 +1,108 @@ +# ADR 0013 — Kunden-/Adress-/Kontaktmodell + +## Status +Accepted + +## Kurz erklärt +Ein Kunde ist nicht einfach nur ein Datensatz mit Name, Adresse und E-Mail. + +Es gibt: + +- Privatpersonen +- Firmen +- Ansprechpartner +- Rechnungsadressen +- technische Kontakte +- abweichende Postadressen + +## Kontext +Das Architekturreview hat kritisiert, dass das Objekt „Kunde“ zu monolithisch gedacht war. + +Ein zu einfaches Kundenmodell erschwert später: + +- DSGVO-Auskunft +- DSGVO-Löschung +- B2B/B2C-Unterscheidung +- mehrere Ansprechpartner +- getrennte Rechnungsadressen +- spätere Mandantenfähigkeit + +## Entscheidung +Das fachliche Kundenmodell wird aufgeteilt in: + +- Customer +- Party +- Address +- ContactPoint +- CustomerContact + +## Begriffe + +### Customer +Die Kundenbeziehung im System. + +### Party +Eine Person oder Organisation. + +### Address +Eine Adresse mit Verwendungszweck, z. B.: + +- Rechnungsadresse +- Postadresse +- Firmensitz + +### ContactPoint +Kontaktmöglichkeit, z. B.: + +- E-Mail +- Telefon +- Mobil +- Website + +### CustomerContact +Verknüpfung zwischen Kunde und Ansprechpartner. + +## Beispiel + +```text +Customer: Müller Webservice +Party: Müller Webservice GmbH +Address: Rechnungsadresse +ContactPoint: buchhaltung@... +ContactPoint: technik@... +CustomerContact: Max Müller als technischer Ansprechpartner +``` + +## B2B/B2C +Das Modell muss unterscheiden können: + +- B2B +- B2C +- öffentliche Einrichtung +- Verein/Organisation + +## Begründung +Das ist notwendig für: + +- korrekte Rechnungsdaten +- DSGVO +- Supportprozesse +- Vertragsverwaltung +- spätere Erweiterbarkeit + +## Konsequenzen + +### Positiv +- saubereres Datenmodell +- bessere DSGVO-Fähigkeit +- bessere B2B/B2C-Unterstützung +- bessere Kundenrealität + +### Negativ +- mehr Tabellen +- mehr UI-Komplexität +- Importlogik muss sauber mappen + +## Verwandte ADRs +- ADR 0021 — DSGVO-Löschung und Retention +- ADR 0015 — Tax- und VAT-Strategie diff --git a/decisions/0014-audit-log-strategy.md b/decisions/0014-audit-log-strategy.md new file mode 100644 index 0000000..3cdcf69 --- /dev/null +++ b/decisions/0014-audit-log-strategy.md @@ -0,0 +1,92 @@ +# ADR 0014 — Audit-Log-Strategie + +## Status +Accepted + +## Kurz erklärt +Audit-Logs dokumentieren wichtige Änderungen und Aktionen. + +Sie beantworten: + +```text +Wer hat wann was geändert? +``` + +## Kontext +Das Architekturreview hat bemängelt, dass „nicht manipulierbare Logs“ gefordert wurden, aber kein Mechanismus definiert war. + +## Entscheidung +V1 verwendet ein append-only Audit-Log. + +Append-only bedeutet: + +```text +Einträge werden nur hinzugefügt, +aber nicht geändert oder gelöscht. +``` + +## V1-Mindestmechanismus +Audit-Logs werden gespeichert mit: + +- tenant_id +- actor_id +- actor_type +- action +- object_type +- object_id +- old_values +- new_values +- created_at +- request_id +- ip_address +- user_agent + +## Integrität +V1 bereitet eine Hash-Chain vor. + +Hash-Chain bedeutet: + +```text +Jeder Logeintrag enthält einen Prüfwert +und verweist rechnerisch auf den vorherigen Eintrag. +``` + +Dadurch werden nachträgliche Manipulationen besser erkennbar. + +## Trennung +Es gibt unterschiedliche Logarten: + +- App-Logs +- Security-Logs +- Audit-Logs + +Audit-Logs sind keine normalen Debug-Logs. + +## Kritische Aktionen +Immer auditieren: + +- Login/Logout +- fehlgeschlagene Logins +- Rechteänderungen +- Kundendatenänderungen +- Vertragsänderungen +- Zahlungsstatusänderungen +- Importvorgänge +- Secret-Änderungen +- Modulaktivierungen +- API-Token-Erstellung + +## Nicht-Ziel +V1 garantiert noch keine vollständige externe WORM-Archivierung. + +## Später möglich +- Export in externes Audit-Sink +- WORM-Speicher +- signierte Logs +- tägliche Hash-Summen +- revisionssichere Langzeitablage + +## Verwandte ADRs +- ADR 0011 — GoBD-Verantwortlichkeit +- ADR 0010 — Secrets-Management +- ADR 0021 — DSGVO-Löschung und Retention diff --git a/decisions/0015-tax-and-vat-strategy.md b/decisions/0015-tax-and-vat-strategy.md new file mode 100644 index 0000000..932c215 --- /dev/null +++ b/decisions/0015-tax-and-vat-strategy.md @@ -0,0 +1,60 @@ +# ADR 0015 — Tax- und VAT-Strategie + +## Status +Accepted + +## Kurz erklärt +Tax/VAT bedeutet Steuer- und Mehrwertsteuerlogik. + +Auch wenn Hosting-Backoffice V1 keine eigene Buchhaltung sein soll, muss das System steuerlich relevante Informationen verstehen und sauber an externe Rechnungssysteme übergeben oder anzeigen können. + +## Kontext +Das Architekturreview hat bemängelt, dass MwSt, B2B/B2C, OSS und Reverse Charge nicht erwähnt wurden. + +Für V1 muss mindestens der deutsche Standardfall sauber abgebildet werden. + +## Entscheidung +V1 enthält ein minimales Steuer-Metadatenmodell, erzeugt aber keine führenden Steuerbelege. + +Führende Steuerberechnung bleibt in: + +- Lexware +- Invoice Ninja +- späterem externen Billing-System + +## V1-Mindestumfang + +- Kundentyp: B2B / B2C +- Land des Kunden +- USt-IdNr. optional +- Standard-Steuersatz je Produktreferenz +- Steuerhinweis je Vertrag/Rechnungsreferenz +- Brutto-/Netto-Anzeige nur als Referenz aus Billing-System + +## Nicht Teil von V1 + +- vollständige OSS-Automatisierung +- vollständige Reverse-Charge-Prüfung +- eigene Steuerberechnung als führendes System +- komplexe internationale Steuerlogik + +## Warum trotzdem Tax-Metadaten? +Weil das System sonst nicht zuverlässig erkennen kann: + +- welche Kunden B2B/B2C sind +- welche Rechnungslogik extern nötig ist +- welche Daten für Lexware/Invoice Ninja relevant sind +- welche Kunden steuerlich anders behandelt werden müssen + +## Später möglich + +- OSS-Unterstützung +- EU-B2B Reverse Charge +- Steuerprofile pro Mandant +- Steuerregeln pro Produkt +- Prüfung von USt-IdNr. +- tiefe Billing-Synchronisation + +## Verwandte ADRs +- ADR 0011 — GoBD-Verantwortlichkeit +- ADR 0013 — Kunden-/Adress-/Kontaktmodell diff --git a/decisions/0016-module-lifecycle.md b/decisions/0016-module-lifecycle.md new file mode 100644 index 0000000..2691845 --- /dev/null +++ b/decisions/0016-module-lifecycle.md @@ -0,0 +1,66 @@ +# ADR 0016 — Modul-Lifecycle + +## Status +Accepted + +## Kurz erklärt +Der Modul-Lifecycle beschreibt, was mit einem Modul passiert, wenn es installiert, aktiviert, deaktiviert oder entfernt wird. + +## Kontext +Das Architekturreview hat kritisiert, dass Module zwar aktivierbar/deaktivierbar sein sollen, aber nicht definiert war, was mit bestehenden Daten passiert. + +## Entscheidung +Module haben definierte Zustände: + +- available +- installed +- enabled +- disabled +- archived + +Deinstallation mit Datenlöschung ist kein Standardfall. + +## Zustände + +### available +Modul ist im System vorhanden, aber nicht installiert. + +### installed +Modul ist installiert, aber nicht aktiv. + +### enabled +Modul ist aktiv. + +### disabled +Modul ist deaktiviert, Daten bleiben erhalten. + +### archived +Modul wird nicht mehr genutzt, Daten bleiben aus Nachvollziehbarkeitsgründen erhalten. + +## Datenregel +Daten werden beim Deaktivieren nicht gelöscht. + +Grund: + +- Audit +- GoBD +- Nachvollziehbarkeit +- Referenzintegrität + +## Modul-Abhängigkeiten +Module müssen Abhängigkeiten deklarieren. + +Beispiel: + +```text +Invoice Ninja Adapter benötigt Billing-Modul. +``` + +## Migrationen +Jedes Modul verwaltet eigene Migrationen. + +Core-Migrationen dürfen keine Anbieterlogik enthalten. + +## Verwandte ADRs +- ADR 0007 — Modul-System +- ADR 0009 — Core-Grenzen diff --git a/decisions/0017-adapter-error-resilience.md b/decisions/0017-adapter-error-resilience.md new file mode 100644 index 0000000..3d32a75 --- /dev/null +++ b/decisions/0017-adapter-error-resilience.md @@ -0,0 +1,69 @@ +# ADR 0017 — Adapter-Fehlerresilienz + +## Status +Accepted + +## Kurz erklärt +Adapter verbinden Hosting-Backoffice mit externen Systemen. + +Fehlerresilienz bedeutet: + +```text +Das System darf nicht kaputt gehen, +nur weil ein externer Anbieter gerade nicht erreichbar ist. +``` + +## Kontext +Integrationen zu KeyHelp, 1blu, Lexware und Invoice Ninja sind geschäftskritisch. + +Das Architekturreview hat fehlende Retry-, Backoff- und Reconciliation-Strategien bemängelt. + +## Entscheidung +Alle Integrationsmodule müssen ein gemeinsames Fehlerverhalten unterstützen. + +## Pflichtmechanismen + +- Retry +- Backoff +- Dead Letter Queue +- Reconciliation +- sichtbarer Job-Status +- Audit-Log bei kritischen Fehlern + +## Begriffe + +### Retry +Ein fehlgeschlagener Vorgang wird erneut versucht. + +### Backoff +Wiederholungen erfolgen mit zunehmender Wartezeit. + +### Dead Letter Queue +Fehlgeschlagene Jobs werden gesammelt, damit ein Admin sie prüfen kann. + +### Reconciliation +Abgleich zwischen internem System und externem Anbieter, um Abweichungen zu erkennen. + +## Beispiel +Wenn Lexware nicht erreichbar ist: + +- Job schlägt nicht still fehl +- System versucht später erneut +- Admin sieht den Fehler +- Daten bleiben nachvollziehbar + +## Konsequenzen + +### Positiv +- stabilere Integrationen +- weniger stille Fehler +- bessere Admin-Kontrolle + +### Negativ +- mehr Implementierungsaufwand +- Job-System erforderlich +- Monitoring wird wichtiger + +## Verwandte ADRs +- ADR 0008 — External-Reference-Pattern +- ADR 0010 — Secrets-Management diff --git a/decisions/0018-wordpress-plugin-security.md b/decisions/0018-wordpress-plugin-security.md new file mode 100644 index 0000000..53df2f2 --- /dev/null +++ b/decisions/0018-wordpress-plugin-security.md @@ -0,0 +1,61 @@ +# ADR 0018 — WordPress-Plugin-Sicherheit + +## Status +Proposed + +## Kurz erklärt +Das WordPress-Plugin ist später ein API-Client. + +Es läuft in einer WordPress-Umgebung, die möglicherweise durch andere Plugins, Themes oder schlechte Wartung gefährdet ist. + +## Kontext +WordPress soll nicht Core sein, aber später als Frontend-/Widget-Schicht dienen. + +Das Architekturreview hat gewarnt, dass das Plugin eine zweite Sicherheitsdomäne erzeugt. + +## Entscheidung +Das WordPress-Plugin wird nicht Teil von V1. + +Für spätere Versionen gilt: + +- Plugin nutzt ausschließlich REST API +- Plugin bekommt minimale API-Scopes +- keine direkten Datenbankzugriffe +- keine lokalen Kopien sensibler Daten, außer technisch zwingend nötig +- Token-Rotation muss möglich sein +- Plugin-Zugriffe werden auditierbar + +## API-Scopes +Das Plugin darf nur das, was für seine Widgets nötig ist. + +Beispiele: + +- Kundenbereich anzeigen +- Ticket erstellen +- Rechnungsreferenzen anzeigen +- Vertragsdaten lesen + +Nicht erlaubt: + +- globale Adminfunktionen +- Anbieter-Credentials lesen +- fremde Mandantendaten lesen + +## Bei kompromittierter WordPress-Seite +Ein kompromittiertes Plugin-Token darf nicht das gesamte Backoffice gefährden. + +Deshalb: + +- Token widerrufbar +- Scope begrenzt +- Mandant begrenzt +- Audit-Logs +- Rate-Limits + +## Status +Diese ADR bleibt zunächst Proposed, weil das WordPress-Plugin erst nach V1 konkret geplant wird. + +## Verwandte ADRs +- ADR 0006 — Auth-Strategie +- ADR 0012 — Frontend-Strategie +- ADR 0020 — Customer-Portal-Scope diff --git a/decisions/0019-v1-scope-finalization.md b/decisions/0019-v1-scope-finalization.md new file mode 100644 index 0000000..e922380 --- /dev/null +++ b/decisions/0019-v1-scope-finalization.md @@ -0,0 +1,77 @@ +# ADR 0019 — V1-Scope-Finalisierung + +## Status +Accepted + +## Kurz erklärt +Der V1-Scope legt fest, was in die erste produktiv nutzbare Version gehört und was bewusst nicht. + +Das verhindert Feature-Explosion. + +## Kontext +Das Architekturreview hat Widersprüche festgestellt: + +- 1–500 Kunden vs. 1–50 Kunden +- KI in V1 vs. V2 +- Customer Portal in V1 vs. unklar +- SEPA als Zahlungsart ohne Modell + +## Entscheidung +V1 wird auf eine interne produktive Grundversion für kleine Anbieter mit 1–50 Kunden begrenzt. + +## V1 enthält + +- Admin-/Backoffice-Oberfläche +- Kundenverwaltung +- Kontakt-/Adressmodell +- Verträge +- Produkte/Leistungen +- Domains +- Registrar-Import 1blu +- Server-/Hosting-Zuordnung +- Rechnungsreferenzen +- Billing-Referenzen zu Lexware/Invoice Ninja +- Tickets light intern +- Dokumentenablage +- Audit-Logs +- Tax-/VAT-Metadaten minimal +- Nummernkreise +- einfache Statuslogik + +## V1 enthält NICHT + +- KI-Assistent +- öffentliches WordPress-Plugin +- vollständiges Customer Portal +- SEPA-Lastschrift mit Mandatsverwaltung +- eigenes Payment-System +- eigene Rechnungsstellung als führendes System +- automatische Servermigration +- automatische VM-/Cloud-Provisionierung +- Plesk/cPanel +- Marketplace + +## Customer Portal +Ein vollständiges Kundenportal wird auf V2 verschoben. + +In V1 kann optional eine interne Kundenansicht vorbereitet werden, aber kein öffentlicher Self-Service. + +## KI +KI wird auf V2 verschoben. + +Grund: + +- Datenschutz +- Subprozessoren +- Drittlandtransfer +- unnötige V1-Komplexität + +## Zahlungsarten +In V1 werden Zahlungsarten nur als Referenz/Status geführt. + +Keine echte Zahlungsabwicklung im Backoffice. + +## Verwandte ADRs +- ADR 0011 — GoBD-Verantwortlichkeit +- ADR 0015 — Tax- und VAT-Strategie +- ADR 0020 — Customer-Portal-Scope diff --git a/decisions/0020-customer-portal-scope.md b/decisions/0020-customer-portal-scope.md new file mode 100644 index 0000000..66fb439 --- /dev/null +++ b/decisions/0020-customer-portal-scope.md @@ -0,0 +1,58 @@ +# ADR 0020 — Customer-Portal-Scope + +## Status +Accepted + +## Kurz erklärt +Das Kundenportal ist der Bereich, in dem Endkunden später selbst Daten, Rechnungen, Verträge und Tickets sehen können. + +## Kontext +Das Architekturreview hat kritisiert, dass das Customer Portal gleichzeitig als V1-Modul genannt, aber nicht konsistent im MVP enthalten war. + +## Entscheidung +Ein vollständiges Customer Portal ist nicht Teil von V1. + +## V1 +V1 enthält nur eine interne Kundenansicht für Admins/Mitarbeiter. + +Diese zeigt: + +- Kundendaten +- Verträge +- Domains +- Hostingpakete +- Rechnungsreferenzen +- Tickets +- Dokumente + +## V2 +Das öffentliche Customer Portal wird in V2 geplant. + +Dann müssen zusätzlich geklärt werden: + +- Kundenlogin +- Self-Service +- Barrierefreiheit +- AGB-/Datenschutz-Hinweise +- Session-Sicherheit +- Passwort-Reset +- MFA optional +- WordPress-Integration + +## Warum nicht V1? +Ein öffentliches Portal erhöht V1-Komplexität stark: + +- Sicherheitsrisiko +- Supportaufwand +- rechtliche Anforderungen +- UI-/UX-Aufwand +- Barrierefreiheit +- Auth-Komplexität + +## Konsequenz +V1 wird stabiler und schneller erreichbar. + +## Verwandte ADRs +- ADR 0012 — Frontend-Strategie +- ADR 0018 — WordPress-Plugin-Sicherheit +- ADR 0019 — V1-Scope-Finalisierung diff --git a/decisions/0021-dsgvo-deletion-retention.md b/decisions/0021-dsgvo-deletion-retention.md new file mode 100644 index 0000000..3990a39 --- /dev/null +++ b/decisions/0021-dsgvo-deletion-retention.md @@ -0,0 +1,53 @@ +# ADR 0021 — DSGVO-Löschung und Retention + +## Status +Proposed + +## Kurz erklärt +DSGVO-Löschung bedeutet, dass personenbezogene Daten unter bestimmten Voraussetzungen gelöscht werden müssen. + +Retention bedeutet Aufbewahrungspflicht, z. B. für Rechnungsunterlagen. + +Diese Anforderungen können kollidieren. + +## Kontext +Das Architekturreview hat bemängelt, dass DSGVO-Löschung und GoBD-Aufbewahrung nicht modelliert wurden. + +## Entscheidung +V1 muss ein Lösch-/Pseudonymisierungskonzept vorbereiten. + +## Grundprinzip +Personenbezogene Stammdaten sollen von retentionspflichtigen Belegdaten getrennt werden. + +## Modell +Bei Löschanforderung: + +- nicht aufbewahrungspflichtige Daten werden gelöscht +- aufbewahrungspflichtige Daten bleiben erhalten +- personenbezogene Daten werden soweit möglich pseudonymisiert +- Audit-Log dokumentiert den Vorgang + +## Beispiel +Statt Kundenname: + +```text +Gelöschter Kunde 8f3a... +``` + +## Nicht einfach löschen +Rechnungsrelevante Daten dürfen ggf. nicht vollständig gelöscht werden, wenn gesetzliche Aufbewahrungspflichten bestehen. + +## V1-Mindestanforderung + +- Kennzeichnung gelöschter/pseudonymisierter Kunden +- Export der Kundendaten vorbereiten +- Trennung von Stammdaten und Belegdaten +- Audit-Log für Löschung/Pseudonymisierung + +## Offener Punkt +Rechtliche Prüfung erforderlich. + +## Verwandte ADRs +- ADR 0011 — GoBD-Verantwortlichkeit +- ADR 0013 — Kunden-/Adress-/Kontaktmodell +- ADR 0014 — Audit-Log-Strategie diff --git a/decisions/0022-document-hierarchy.md b/decisions/0022-document-hierarchy.md new file mode 100644 index 0000000..dfe214b --- /dev/null +++ b/decisions/0022-document-hierarchy.md @@ -0,0 +1,55 @@ +# ADR 0022 — Dokumentenhierarchie und Single Source of Truth + +## Status +Accepted + +## Kurz erklärt +Single Source of Truth bedeutet: + +```text +Es gibt eine verbindliche Quelle, +wenn sich Dokumente widersprechen. +``` + +## Kontext +Das Architekturreview hat kritisiert, dass mehrere Dokumente unterschiedliche Aussagen enthalten. + +Beispiele: + +- V1-Kundenzahl +- KI in V1 oder V2 +- Customer Portal in V1 oder V2 +- Module im Core oder Service-Modul + +## Entscheidung +Es gilt folgende Dokumentenhierarchie: + +1. ADRs +2. Architektur-Dokumente +3. Modulstruktur +4. Roadmap +5. Modul-Detaildokumente +6. Brainstorming-/Ideendokumente + +## Konsequenz +Wenn sich Dokumente widersprechen, gilt die höhere Ebene. + +Beispiel: + +Wenn ADR 0019 sagt „KI ist V2“, aber ein altes Modul-Dokument KI als V1 beschreibt, gilt ADR 0019. + +## Pflege-Regel +Nach jeder größeren ADR-Serie müssen betroffene Dokumente aktualisiert werden. + +## Ziel +Architekturdrift verhindern. + +Architekturdrift bedeutet: + +```text +Planung und tatsächliche Umsetzung entfernen sich schleichend voneinander. +``` + +## Verwandte ADRs +- ADR 0019 — V1-Scope-Finalisierung +- ADR 0009 — Core-Grenzen diff --git a/decisions/0023-numbering-sequences.md b/decisions/0023-numbering-sequences.md new file mode 100644 index 0000000..f4d8fba --- /dev/null +++ b/decisions/0023-numbering-sequences.md @@ -0,0 +1,62 @@ +# ADR 0023 — Nummernkreise + +## Status +Accepted + +## Kurz erklärt +Nummernkreise erzeugen eindeutige Nummern für: + +- Kunden +- Verträge +- Rechnungsreferenzen +- Tickets + +Bei Rechnungen sind Nummern besonders sensibel, weil sie steuerlich relevant sein können. + +## Kontext +Das Architekturreview hat fehlende Nummernkreislogik als V1-Risiko bewertet. + +## Entscheidung +V1 erhält eine zentrale Nummernkreisverwaltung pro Tenant. + +## Beispielstruktur + +```text +number_sequences +- tenant_id +- sequence_key +- prefix +- current_number +- padding +- reset_strategy +- locked_at +``` + +## Beispiele + +```text +K-00001 +V-00001 +T-2026-00001 +``` + +## Rechnungen +Da Hosting-Backoffice V1 nicht führendes Rechnungssystem ist, erzeugt es keine verbindlichen Rechnungsnummern. + +Es speichert externe Rechnungsnummern aus Lexware/Invoice Ninja. + +## Interne Referenzen +Für interne Vorgänge dürfen eigene Referenzen erzeugt werden. + +## Technische Regel +Nummernvergabe muss atomar erfolgen. + +Atomar bedeutet: + +```text +Zwei gleichzeitige Vorgänge dürfen nicht dieselbe Nummer erhalten. +``` + +## Verwandte ADRs +- ADR 0011 — GoBD-Verantwortlichkeit +- ADR 0019 — V1-Scope-Finalisierung diff --git a/development/api-conventions-v0.1.md b/development/api-conventions-v0.1.md new file mode 100644 index 0000000..a64ef7f --- /dev/null +++ b/development/api-conventions-v0.1.md @@ -0,0 +1,34 @@ +# API Conventions v0.1 + +## Grundprinzip + +Die REST API soll konsistent und verständlich aufgebaut sein. + +## Versionierung + +- /api/v1/ + +## Ressourcenbeispiele + +- /customers +- /contracts +- /domains +- /hosting-packages +- /servers +- /invoices +- /tickets +- /documents + +## Antworten + +API-Antworten sollen konsistent sein: +- data +- meta +- errors + +## Sicherheit + +- Authentifizierung erforderlich +- Rechteprüfung je Ressource +- Rate-Limiting +- API-Logs diff --git a/development/coding-standards-v0.1.md b/development/coding-standards-v0.1.md new file mode 100644 index 0000000..f828c8d --- /dev/null +++ b/development/coding-standards-v0.1.md @@ -0,0 +1,28 @@ +# Coding Standards v0.1 + +## Grundprinzip + +Code soll verständlich, testbar und wartbar sein. + +## Laravel-Konventionen + +- klare Services +- Controller schlank halten +- Businesslogik nicht in Views +- Migrations nachvollziehbar benennen +- Policies für Rechteprüfungen verwenden +- Events/Jobs für asynchrone Prozesse prüfen + +## Sicherheit + +- keine Secrets im Code +- Eingaben validieren +- Rechte prüfen +- Audit-Logs bei kritischen Aktionen + +## Tests + +- kritische Workflows testen +- Importprozesse testen +- Rechteprüfungen testen +- API-Endpunkte testen diff --git a/development/development-principles-v0.1.md b/development/development-principles-v0.1.md new file mode 100644 index 0000000..b7abb4b --- /dev/null +++ b/development/development-principles-v0.1.md @@ -0,0 +1,22 @@ +# Development Principles v0.1 + +## Grundprinzip + +Hosting-Backoffice soll modular, verständlich, wartbar und nachvollziehbar entwickelt werden. + +## Architekturprinzipien + +- kein Monolith +- API-first +- Sicherheit zuerst +- kundenzentriert +- modulare Erweiterbarkeit +- Logging und Auditierung + +## Erweiterbarkeit + +Neue Module sollen aktivierbar, deaktivierbar und austauschbar sein. + +## Ziel + +Hosting-Backoffice soll langfristig professionell, stabil, verständlich und modular bleiben. diff --git a/development/module-development-guidelines-v0.1.md b/development/module-development-guidelines-v0.1.md new file mode 100644 index 0000000..2d55819 --- /dev/null +++ b/development/module-development-guidelines-v0.1.md @@ -0,0 +1,29 @@ +# Module Development Guidelines v0.1 + +## Grundprinzip + +Module erweitern das System, ohne den Core hart zu koppeln. + +## Anforderungen + +Jedes Modul soll: +- klaren Zweck haben +- aktivierbar/deaktivierbar sein +- definierte Interfaces nutzen +- eigene Konfiguration haben +- Fehler sauber protokollieren + +## Nicht erlaubt + +- direkte Core-Manipulation ohne Service-Schicht +- unprotokollierte kritische Änderungen +- direkte Anbieterlogik im Core + +## Dokumentation + +Jedes Modul benötigt: +- Zweck +- Datenobjekte +- API-Endpunkte falls vorhanden +- Rechteanforderungen +- Risiken diff --git a/modules/ai-assistant-module-v0.1.md b/modules/ai-assistant-module-v0.1.md new file mode 100644 index 0000000..114aca2 --- /dev/null +++ b/modules/ai-assistant-module-v0.1.md @@ -0,0 +1,29 @@ +# AI Assistant Module v0.1 + +## Grundprinzip + +KI-Funktionen unterstützen Benutzer und Prozesse. + +Die KI ersetzt keine Kernlogik und trifft keine finalen Entscheidungen. + +## V1-Prinzip + +Die KI darf: +- Vorschläge machen +- Daten erkennen +- Zusammenfassungen erstellen + +Die endgültige Entscheidung trifft ein Benutzer. + +## Geplante Funktionen + +- Ticketzusammenfassungen +- Antwortvorschläge +- Rechnungserkennung +- Kundenerkennung +- Vertragsvorschläge +- Importunterstützung + +## Sicherheitsprinzip + +KI erhält nur notwendige Daten, keine direkten Systemrechte und keine direkten Schreibrechte im Core. diff --git a/modules/billing-module-v0.1.md b/modules/billing-module-v0.1.md new file mode 100644 index 0000000..f1c4eca --- /dev/null +++ b/modules/billing-module-v0.1.md @@ -0,0 +1,39 @@ +# Billing Module v0.1 + +## Grundprinzip + +Hosting-Backoffice ist kein eigenes Buchhaltungs- oder Banking-System. + +Billing wird über externe Systeme integriert. + +## Unterstützte Systeme V1 + +- Lexware Office +- Invoice Ninja CE + +## Zahlungsarten + +- Rechnung +- Überweisung +- Lastschrift +- PayPal +- Wero + +## Zahlungslogik + +Das System verarbeitet zunächst keine echten Zahlungen selbst. + +Es verwaltet: +- Status +- Referenzen +- Hinweise +- spätere Gebührenregeln + +## Rechnungen + +Das System speichert: +- Rechnungsnummern +- Zahlungsstatus +- Beträge +- Referenzen +- Archivverweise diff --git a/modules/customer-portal-module-v0.1.md b/modules/customer-portal-module-v0.1.md new file mode 100644 index 0000000..66de227 --- /dev/null +++ b/modules/customer-portal-module-v0.1.md @@ -0,0 +1,33 @@ +# Customer Portal Module v0.1 + +## Grundprinzip + +Das Kundenportal ist die zentrale Kundenansicht. + +Der Kunde soll professionell betreut, informiert und sicher eingebunden werden. + +## V1-Funktionen + +### Kundenbereich +- Stammdaten +- Verträge +- Domains +- Hostingpakete + +### Rechnungen +- Rechnungsübersicht +- Zahlungsstatus +- Dokumente + +### Support +- Tickets +- Antworten +- Ticketstatus + +### Dokumente +- PDFs +- Anhänge + +## Sicherheitsprinzip + +Kunden sehen ausschließlich eigene Daten. diff --git a/modules/document-archive-module-v0.1.md b/modules/document-archive-module-v0.1.md new file mode 100644 index 0000000..394cd83 --- /dev/null +++ b/modules/document-archive-module-v0.1.md @@ -0,0 +1,27 @@ +# Document Archive Module v0.1 + +## Grundprinzip + +Das Dokumentenarchiv verwaltet Dateien, Metadaten, Hashes und Objektbezüge. + +## V1-Funktionen + +- PDF-Ablage +- Dokumentenmetadaten +- Hash-Erzeugung +- Objektverknüpfung +- Audit-Log bei Upload und Änderung + +## Dokumentenarten + +- Rechnungen +- Verträge +- Supportanhänge +- Importdateien +- Kundenunterlagen + +## Nicht Ziel von V1 + +- vollständiges DMS +- eigene Buchhaltung +- rechtlich garantierte GoBD-Zertifizierung diff --git a/modules/import-assistant-module-v0.1.md b/modules/import-assistant-module-v0.1.md new file mode 100644 index 0000000..be32f3d --- /dev/null +++ b/modules/import-assistant-module-v0.1.md @@ -0,0 +1,29 @@ +# Import Assistant Module v0.1 + +## Grundprinzip + +Importe sollen kleinen Anbietern den Einstieg erleichtern. + +Bestehende Daten sollen möglichst einfach übernommen werden können. + +## V1 + +### Registrar-Import +- 1blu Exporte +- mehrere Accounts +- Domains erkennen + +### Kundenzuordnung +- manuelle Zuordnung +- Vorschläge später möglich + +## KI-Unterstützung später + +- Rechnungserkennung +- Kundenerkennung +- Vertragsvorschläge +- automatische Vorschläge + +## Sicherheitsprinzip + +Importe verändern niemals ungeprüft Core-Daten. Sie werden geprüft, protokolliert und bestätigt. diff --git a/modules/keyhelp-module-v0.1.md b/modules/keyhelp-module-v0.1.md new file mode 100644 index 0000000..6bbb029 --- /dev/null +++ b/modules/keyhelp-module-v0.1.md @@ -0,0 +1,26 @@ +# KeyHelp Module v0.1 + +## Grundprinzip + +KeyHelp wird als modular angebundenes Hostingpanel integriert. + +Die Plattform bleibt providerneutral. + +## V1-Funktionen + +- Serverobjekte +- KeyHelp-Referenzen +- Hostingpaket-Zuordnung +- Serverstatus später möglich + +## Später geplant + +- Hostingdaten synchronisieren +- Ressourceninformationen +- Benutzerinformationen +- Servertemplates +- Konfigurationsprofile +- API-gestützte Abläufe +- Paketverschiebungen +- Mailmigrationen +- Downtimeplanung diff --git a/modules/module-structure-v0.1.md b/modules/module-structure-v0.1.md new file mode 100644 index 0000000..ccb5dcd --- /dev/null +++ b/modules/module-structure-v0.1.md @@ -0,0 +1,47 @@ +# Module Structure v0.1 + +## Grundprinzip + +Hosting-Backoffice basiert auf: +- Core +- Service-Modulen +- Integrationsmodulen + +Der Core enthält ausschließlich zentrale Plattformlogik. + +## Core-Bereiche + +- Benutzer +- Rollen/Rechte +- Kunden +- Verträge +- Produkte +- Domains +- Hostingpakete +- Server +- Dokumente +- Audit-Logs +- Benachrichtigungen +- API +- Einstellungen + +## Service-Module + +- Ticketsystem +- KI-Assistent +- Import-Assistent +- Dokumentenarchiv +- Migrationen später + +## Integrationsmodule + +- Lexware Office +- Invoice Ninja CE +- KeyHelp +- 1blu Business +- PayPal +- Wero + +## WordPress-Plugin + +Das WordPress-Plugin ist kein Corebestandteil. Es dient später als Frontend-Integration über die REST API. diff --git a/modules/registrar-module-v0.1.md b/modules/registrar-module-v0.1.md new file mode 100644 index 0000000..f8cb9ec --- /dev/null +++ b/modules/registrar-module-v0.1.md @@ -0,0 +1,39 @@ +# Registrar Module v0.1 + +## Grundprinzip + +Domains und Registrarinformationen werden zentral verwaltet. + +Registrare werden modular angebunden. + +## V1 + +Unterstützt: +- 1blu Business + +## Funktionen + +### Registrar-Accounts +- mehrere Accounts +- Accountbeschreibung +- Anbieterreferenz + +### Domainverwaltung +- Domainname +- TLD +- Status +- Laufzeiten +- Kundenzuordnung + +### Importfunktionen +- Exportdateien einlesen +- Domains erkennen +- Kundenzuordnung +- Audit-Protokollierung + +## Später geplant + +- API-Synchronisation +- weitere Registrare +- TLD-Regeln +- Routinglogik diff --git a/modules/server-migration-module-future.md b/modules/server-migration-module-future.md new file mode 100644 index 0000000..b805f80 --- /dev/null +++ b/modules/server-migration-module-future.md @@ -0,0 +1,21 @@ +# Server Migration Module Future + +## Grundprinzip + +Servermigrationen sind eine spätere Erweiterung und nicht Teil von V1. + +## Geplante Funktionen + +- Hostingpaket von Server A nach Server B verschieben +- Webdaten übertragen +- Datenbanken übertragen +- Maildaten übertragen +- DNS vorbereiten +- Downtime planen +- Kunden informieren +- Rollback ermöglichen +- Migration protokollieren + +## Architekturhinweis + +V1 muss bereits wissen, auf welchem Server ein Hostingpaket liegt, damit spätere Migrationen möglich werden. diff --git a/modules/server-template-module-future.md b/modules/server-template-module-future.md new file mode 100644 index 0000000..df48b01 --- /dev/null +++ b/modules/server-template-module-future.md @@ -0,0 +1,24 @@ +# Server Template Module Future + +## Grundprinzip + +Server-Templates sind eine spätere Automatisierungsfunktion. + +## Ziel + +Neue Server sollen nach definierten Profilen eingerichtet werden können. + +## Mögliche Inhalte + +- KeyHelp-Installation +- Basiskonfiguration +- PHP-Versionen +- Mailserver-Konfiguration +- DNS-Konfiguration +- Sicherheitsregeln +- Backup-Konfiguration +- Monitoring + +## V1-Vorbereitung + +V1 sollte Serverrollen und Servermetadaten so erfassen, dass spätere Templates möglich bleiben. diff --git a/modules/ticket-system-module-v0.1.md b/modules/ticket-system-module-v0.1.md new file mode 100644 index 0000000..7f5ee54 --- /dev/null +++ b/modules/ticket-system-module-v0.1.md @@ -0,0 +1,33 @@ +# Ticket System Module v0.1 + +## Grundprinzip + +Das Ticketsystem ist kundenzentriert aufgebaut. + +Support soll direkt mit Kunden, Domains, Hostingpaketen und Verträgen verbunden sein. + +## V1-Funktionen + +- Tickets erstellen +- Tickets beantworten +- Tickets schließen +- Priorität setzen +- Status setzen +- interne Notizen + +## Verknüpfungen + +Ein Ticket kann verbunden sein mit: +- Kunde +- Domain +- Hostingpaket +- Vertrag +- Rechnung später möglich + +## KI-Unterstützung später + +- Ticketzusammenfassungen +- Antwortvorschläge +- automatische Kategorisierung +- Priorisierung +- Wissensdatenbankintegration diff --git a/modules/wordpress-plugin-strategy-v0.1.md b/modules/wordpress-plugin-strategy-v0.1.md new file mode 100644 index 0000000..9aa41f3 --- /dev/null +++ b/modules/wordpress-plugin-strategy-v0.1.md @@ -0,0 +1,32 @@ +# WordPress Plugin Strategy v0.1 + +## Grundprinzip + +Das WordPress-Plugin ist eine optionale Frontend-Erweiterung. + +Der Plattformkern bleibt unabhängig. + +## Wichtig + +WordPress ist nicht der Core. + +Alle Funktionen laufen über die REST API. Keine direkte Datenbankkopplung. + +## Geplante Funktionen + +- Login-Widget +- Kundenbereich +- Verträge +- Domains +- Rechnungen +- Tickets +- Produktdarstellung +- Supportintegration + +## Langfristige Ziele + +- Elementor-Widgets +- Gutenberg-Blöcke +- Bestellprozesse +- Kunden-Dashboards +- API-basierte Echtzeitdaten diff --git a/notizen.txt b/notizen.txt new file mode 100644 index 0000000..1d43671 --- /dev/null +++ b/notizen.txt @@ -0,0 +1,10 @@ +AI Workspace einrichten: + +1. Basisserver absichern +2. Arbeitsuser anlegen +3. Git installieren +4. Docker installieren +5. Projektordner anlegen +6. Gitea installieren +7. Projekt als privates Git-Repo ablegen +8. Danach optional: VS Code Server / Open WebUI \ No newline at end of file diff --git a/notizen.txt.bak b/notizen.txt.bak new file mode 100644 index 0000000..e69de29 diff --git a/processes/customer-onboarding-process-v0.1.md b/processes/customer-onboarding-process-v0.1.md new file mode 100644 index 0000000..fd95da0 --- /dev/null +++ b/processes/customer-onboarding-process-v0.1.md @@ -0,0 +1,21 @@ +# Customer Onboarding Process v0.1 + +## Ziel + +Ein neuer Kunde soll einfach, nachvollziehbar und professionell angelegt werden können. + +## Ablauf V1 + +1. Kunde anlegen +2. Ansprechpartner erfassen +3. Vertrag anlegen +4. Produkt/Hostingpaket zuweisen +5. Domain zuweisen oder importieren +6. Serverbezug erfassen +7. Rechnungsreferenz anlegen oder später synchronisieren +8. Dokumente ablegen +9. Audit-Log schreiben + +## Erfolgsziel + +Ein Anbieter kann einen Kunden vollständig erfassen, ohne auf Excel oder verstreute Notizen angewiesen zu sein. diff --git a/processes/invoice-import-ai-process-future.md b/processes/invoice-import-ai-process-future.md new file mode 100644 index 0000000..66b56a8 --- /dev/null +++ b/processes/invoice-import-ai-process-future.md @@ -0,0 +1,25 @@ +# Invoice Import AI Process Future + +## Ziel + +Alte Kundenrechnungen sollen KI-gestützt analysiert werden, um Bestandsdaten einfacher zu übernehmen. + +## Mögliche Erkennung + +- Kundennamen +- Anschriften +- alte Kundennummern +- Rechnungsnummern +- Leistungspositionen +- Domains +- Hostingpakete +- Leistungszeiträume +- Beträge + +## Prinzip + +Die KI macht Vorschläge. Der Admin bestätigt. + +## Sicherheitsprinzip + +Keine automatische Übernahme ohne menschliche Prüfung. diff --git a/processes/payment-status-process-v0.1.md b/processes/payment-status-process-v0.1.md new file mode 100644 index 0000000..ebf42a9 --- /dev/null +++ b/processes/payment-status-process-v0.1.md @@ -0,0 +1,25 @@ +# Payment Status Process v0.1 + +## Ziel + +Zahlungsstatus sollen nachvollziehbar und einfach verwaltet werden. + +## Statusbeispiele + +- offen +- bezahlt +- teilweise bezahlt +- überfällig +- storniert +- extern verwaltet + +## Ablauf V1 + +1. Rechnung oder Referenz wird importiert/angelegt +2. Zahlungsart wird angezeigt +3. Status wird manuell oder per Integration aktualisiert +4. Änderung wird protokolliert + +## Wichtig + +Hosting-Backoffice verarbeitet keine Zahlung selbst. diff --git a/processes/registrar-import-process-v0.1.md b/processes/registrar-import-process-v0.1.md new file mode 100644 index 0000000..2d4dd22 --- /dev/null +++ b/processes/registrar-import-process-v0.1.md @@ -0,0 +1,21 @@ +# Registrar Import Process v0.1 + +## Ziel + +Bestehende Domains sollen aus 1blu-Exporten übernommen und Kunden zugeordnet werden können. + +## Ablauf V1 + +1. Registrar-Account anlegen +2. Exportdatei hochladen +3. Import prüfen +4. Domains erkennen +5. Dubletten erkennen +6. Kunden manuell zuweisen +7. Import bestätigen +8. Audit-Log schreiben +9. Importdatei archivieren + +## Sicherheitsprinzip + +Der Import verändert keine finalen Kundenzuordnungen ohne Bestätigung. diff --git a/processes/ticket-workflow-v0.1.md b/processes/ticket-workflow-v0.1.md new file mode 100644 index 0000000..676ba60 --- /dev/null +++ b/processes/ticket-workflow-v0.1.md @@ -0,0 +1,22 @@ +# Ticket Workflow v0.1 + +## Ziel + +Supportanfragen sollen professionell, kundenzentriert und nachvollziehbar bearbeitet werden. + +## Ablauf + +1. Kunde erstellt Ticket oder Admin legt Ticket an +2. Ticket wird Kunde zugeordnet +3. Optional: Domain/Hostingpaket/Vertrag verknüpfen +4. Priorität setzen +5. Antwort verfassen +6. interne Notizen nutzen +7. Status aktualisieren +8. Abschluss dokumentieren + +## Später + +- KI-Zusammenfassung +- Antwortvorschläge +- automatische Kategorisierung diff --git a/prompts/architecture-review-prompt.md b/prompts/architecture-review-prompt.md new file mode 100644 index 0000000..9151542 --- /dev/null +++ b/prompts/architecture-review-prompt.md @@ -0,0 +1,192 @@ +# Architecture Review Prompt + +## Wichtiger Hinweis + +Die Projektinformationen werden schrittweise in mehreren Nachrichten übergeben. + +Bitte: + +* zunächst nur analysieren +* noch kein finales Gesamtfazit ziehen +* Inkonsistenzen und Risiken bereits notieren +* offene Fragen sammeln +* erst nach der letzten Nachricht ein vollständiges Review erstellen + +Ein finales Architekturreview erfolgt erst nach der letzten Nachricht mit dem Hinweis: + +"Bitte jetzt Gesamtreview erstellen." + +--- + +## Deine Rolle + +Du agierst als kritischer Senior Software Architect und Platform Engineer. + +Deine Aufgabe ist NICHT, das Projekt zu bestätigen oder zu loben. + +Deine Aufgabe ist es: + +* Architekturfehler zu erkennen +* spätere Skalierungsprobleme zu identifizieren +* gefährliche Entscheidungen aufzudecken +* unnötige Komplexität zu erkennen +* fehlende Kernkonzepte zu finden +* Sicherheitsrisiken zu analysieren +* problematische Modulgrenzen aufzudecken +* zukünftige Monolith-Risiken zu erkennen +* spätere Refactoring-Kosten sichtbar zu machen + +--- + +## Bitte vermeide + +* oberflächliche Zustimmung +* generisches SaaS-Lob +* allgemeine Laravel-Standardantworten +* unkritische Bestätigung der Planung +* zu frühe Lösungsvorschläge ohne Risikoanalyse + +--- + +## Fokus der Analyse + +Der Fokus liegt auf: + +* echten Architekturproblemen +* Skalierungsrisiken +* Sicherheitsrisiken +* problematischen Modulgrenzen +* zukünftigen Refactoring-Risiken +* versteckter Komplexität +* unklaren Verantwortlichkeiten zwischen Core und Modulen +* Risiken bei Mandantenfähigkeit +* Risiken bei API-first-Architektur +* Risiken durch spätere WordPress-Anbindung + +--- + +## Projektkontext + +Das Projekt ist ein neues europäisches Hosting-Backoffice-System für kleine professionelle Anbieter. + +Wichtige Prinzipien: + +* Laravel Standalone-Core +* REST API +* modularer Aufbau +* kundenzentriert +* kein Enterprise-Monolith +* kein eigenes Payment-/Banking-System +* WordPress nur als optionales Frontend-Plugin +* API-first +* Mandantenfähigkeit von Anfang an vorbereiten +* europäischer Fokus mit DSGVO-/GoBD-Orientierung +* Integrationen über Module, nicht direkt im Core + +--- + +## Wichtige Prüffragen + +Bitte analysiere die bereitgestellten Dateien kritisch anhand dieser Fragen: + +1. Welche Architekturentscheidungen sind gefährlich? +2. Welche Teile werden später schwer skalierbar? +3. Welche Module sind falsch getrennt? +4. Wo droht ein zukünftiger Monolith? +5. Welche Datenobjekte fehlen? +6. Welche Sicherheitsprobleme erkennst du? +7. Welche Probleme siehst du bei Mandantenfähigkeit? +8. Welche API-Strategien sind problematisch? +9. Welche V1-Funktionen sind zu groß gedacht? +10. Welche Funktionen fehlen für eine produktive V1? +11. Welche Integrationen sind architektonisch riskant? +12. Welche Entscheidungen sollten JETZT getroffen werden, bevor Entwicklung beginnt? +13. Welche Teile wirken unnötig kompliziert? +14. Welche Teile wirken noch nicht klar genug definiert? +15. Welche Bereiche würden später hohe Refactoring-Kosten verursachen? +16. Welche Datenobjekte oder Beziehungen fehlen im Datenmodell? +17. Welche Modulgrenzen sind unscharf? +18. Welche Sicherheitsannahmen sind gefährlich? +19. Welche V1-Ziele sollten reduziert werden? +20. Welche V1-Ziele dürfen nicht weiter nach hinten geschoben werden? + +--- + +## Arbeitsweise während der Dateiübergabe + +Solange noch nicht ausdrücklich "Bitte jetzt Gesamtreview erstellen." geschrieben wurde: + +* nur Zwischenanalyse erstellen +* erkannte Risiken notieren +* offene Fragen sammeln +* keine finale Gesamtbewertung abgeben +* keine endgültige Priorisierung vornehmen + +--- + +## Finales Ausgabeformat + +Wenn die Nachricht "Bitte jetzt Gesamtreview erstellen." kommt, strukturiere die finale Ausgabe bitte exakt in diese drei Markdown-Dateien: + +--- + +# reviews/claude-review-round1.md + +Inhalt: + +* Gesamtanalyse +* Architekturkritik +* Core-/Modulbewertung +* Datenmodellbewertung +* API-Bewertung +* Mandantenfähigkeitsbewertung +* V1-Scope-Bewertung +* Roadmap-Bewertung +* Empfehlungen für die nächste Arbeitsphase + +--- + +# reviews/claude-open-questions.md + +Inhalt: + +* offene Architekturfragen +* unklare Entscheidungen +* fehlende Definitionen +* notwendige Produktentscheidungen +* Fragen, die vor Entwicklungsbeginn geklärt werden müssen + +--- + +# reviews/claude-critical-risks.md + +Inhalt: + +* kritische Architekturprobleme +* Monolith-Risiken +* Sicherheitsprobleme +* problematische Skalierungsentscheidungen +* spätere Refactoring-Gefahren +* Compliance-/Mandantenfähigkeitsrisiken + +Bitte kennzeichne jedes Risiko zusätzlich mit: + +* Schweregrad: LOW / MEDIUM / HIGH / CRITICAL +* Zeitpunkt: NOW / V1 / V2 / V3 / LATER +* Empfehlung: was konkret entschieden oder geprüft werden sollte + +--- + +## Wichtig + +Sei kritisch. + +Stelle Annahmen infrage. + +Suche aktiv nach Problemen. + +Denke wie ein erfahrener SaaS-/Platform-Architekt. + +Denke langfristig. + +Das Ziel ist Architekturqualität, nicht Bestätigung. diff --git a/prompts/architecture-review-prompt.md.bak b/prompts/architecture-review-prompt.md.bak new file mode 100644 index 0000000..275f0cc --- /dev/null +++ b/prompts/architecture-review-prompt.md.bak @@ -0,0 +1,96 @@ +# Wichtiger Hinweis + +Die Projektinformationen werden schrittweise in mehreren Nachrichten übergeben. + +Bitte: + +* zunächst nur analysieren +* noch kein finales Gesamtfazit ziehen +* Inkonsistenzen und Risiken bereits notieren +* offene Fragen sammeln + +Ein finales Architekturreview erfolgt erst nach der letzten Nachricht mit dem Hinweis: + +"Bitte jetzt Gesamtreview erstellen." + +Bitte vermeide: + +* oberflächliche Zustimmung +* generisches SaaS-Lob +* allgemeine Laravel-Standardantworten + +Der Fokus liegt auf: + +* echten Architekturproblemen +* Skalierungsrisiken +* Sicherheitsrisiken +* problematischen Modulgrenzen +* zukünftigen Refactoring-Risiken +* versteckter Komplexität + + +# Architecture Review Prompt + +Du agierst als kritischer Senior Software Architect und Platform Engineer. + +Deine Aufgabe ist NICHT, das Projekt zu bestätigen oder zu loben. + +Deine Aufgabe ist es: + +* Architekturfehler zu erkennen +* spätere Skalierungsprobleme zu identifizieren +* gefährliche Entscheidungen aufzudecken +* unnötige Komplexität zu erkennen +* fehlende Kernkonzepte zu finden +* Sicherheitsrisiken zu analysieren +* problematische Modulgrenzen aufzudecken +* zukünftige Monolith-Risiken zu erkennen + +Das Projekt ist ein neues europäisches Hosting-Backoffice-System für kleine professionelle Anbieter. + +Wichtige Prinzipien: + +* Laravel Standalone-Core +* REST API +* modularer Aufbau +* kundenzentriert +* kein Enterprise-Monolith +* kein eigenes Payment-/Banking-System +* WordPress nur als optionales Frontend-Plugin +* API-first +* Mandantenfähigkeit vorbereiten +* europäischer Fokus (DSGVO/GoBD) + +Bitte analysiere die bereitgestellten Dateien kritisch. + +Wichtige Fragen: + +1. Welche Architekturentscheidungen sind gefährlich? +2. Welche Teile werden später schwer skalierbar? +3. Welche Module sind falsch getrennt? +4. Wo droht ein zukünftiger Monolith? +5. Welche Datenobjekte fehlen? +6. Welche Sicherheitsprobleme erkennst du? +7. Welche Probleme siehst du bei Mandantenfähigkeit? +8. Welche API-Strategien sind problematisch? +9. Welche V1-Funktionen sind zu groß gedacht? +10. Welche Funktionen fehlen für eine produktive V1? +11. Welche Integrationen sind architektonisch riskant? +12. Welche Entscheidungen sollten JETZT getroffen werden, bevor Entwicklung beginnt? +13. Welche Teile wirken unnötig kompliziert? +14. Welche Teile wirken noch nicht klar genug definiert? +15. Welche Bereiche würden später hohe Refactoring-Kosten verursachen? + +Wichtig: + +* Sei kritisch. +* Stelle Annahmen infrage. +* Suche aktiv nach Problemen. +* Denke wie ein erfahrener SaaS-/Platform-Architekt. +* Denke langfristig. +* Vermeide oberflächliches Lob. + +Das Ziel ist Architekturqualität, nicht Bestätigung. + + + diff --git a/prompts/product-review-prompt.md b/prompts/product-review-prompt.md new file mode 100644 index 0000000..039b770 --- /dev/null +++ b/prompts/product-review-prompt.md @@ -0,0 +1,18 @@ +# Prompt: Produktreview + +Bitte prüfe die Produktidee für Hosting-Backoffice kritisch. + +Vision: +Ein europäisches Hosting-Backoffice für kleine Anbieter, das Ordnung in Kunden, Hostingpakete, Domains, Rechnungen und Support bringt – professionell, verständlich und nutzbar ab dem ersten Kunden. + +Zielgruppe: +Kleine Hostinganbieter, Webagenturen, Freelancer und IT-Dienstleister mit 1–500 Kunden. + +Bitte bewerte: +- Positionierung +- Zielgruppe +- USP +- V1-Scope +- Risiken +- fehlende Funktionen +- mögliche Überforderung diff --git a/prompts/security-review-prompt.md b/prompts/security-review-prompt.md new file mode 100644 index 0000000..91f7044 --- /dev/null +++ b/prompts/security-review-prompt.md @@ -0,0 +1,14 @@ +# Prompt: Security Review + +Bitte prüfe das Konzept für Hosting-Backoffice aus Sicherheits- und Datenschutzsicht. + +Fokus: +- Rechtekonzept +- API-Sicherheit +- Mandantenfähigkeit +- Audit-Logs +- externe Integrationen +- Dokumentenarchiv +- KI-Funktionen + +Bitte liefere konkrete Risiken und empfohlene Gegenmaßnahmen. diff --git a/reviews/chatgpt-consolidation-20260518-042851.md b/reviews/chatgpt-consolidation-20260518-042851.md new file mode 100644 index 0000000..5015b21 --- /dev/null +++ b/reviews/chatgpt-consolidation-20260518-042851.md @@ -0,0 +1,472 @@ +## 1. Zusammenfassung + +Claude benennt valide Architektur-Risiken. Für das Projekt werden daraus keine neuen Produktziele abgeleitet, sondern konkrete Korrekturen an Datenmodell, Security-Dokumentation, ADRs und Betriebsregeln. + +Kernentscheidungen: + +- `tenant_id` wird der einzige technische Mandanten-Isolationsschlüssel. +- `organisation_id` wird nicht mehr für Tenant-Isolation verwendet. +- Multi-Tenancy wird nicht „halb vorbereitet“, sondern technisch sauber in V1 angelegt. +- Secrets werden nicht im Domainmodell gespeichert, sondern nur referenziert. +- Audit-Hash-Chain wird nicht als manipulationssichere Security-Maßnahme verkauft. +- DLQ, Dokumente, Rollen und Reconciliation erhalten konkrete Regeln. +- Bounded Contexts werden als Modul-/Schema-Grenzen dokumentiert, keine Microservice-Aufspaltung. + +--- + +## 2. Übernommene Punkte + +### Tenant-Isolation + +Übernehmen. + +Änderung: + +- `tenant_id` ist Pflichtfeld auf allen mandantenbezogenen Tabellen. +- `organisation_id` wird aus der technischen Isolation entfernt. +- Falls Organisation benötigt wird, dann nur fachlich, z. B. als `customer_organisation_id`. +- PostgreSQL Row-Level-Security wird vorgesehen. +- Tenant-Kontext wird pro Request/Job explizit gesetzt. +- Queries ohne Tenant-Kontext müssen fehlschlagen. + +Konkrete Modellregel: + +```text +tenant_id UUID NOT NULL REFERENCES tenants(id) +``` + +Für mandantenbezogene Relationen: + +```text +FOREIGN KEY (tenant_id, customer_id) +REFERENCES customers(tenant_id, id) +``` + +--- + +### Secrets-Management + +Übernehmen. + +Änderung: + +- Keine API-Keys, Passwörter oder Tokens in Fachentitäten. +- Domainmodelle speichern nur `secret_ref`. +- Secret-Service wird als technischer Baustein dokumentiert. +- Encryption-at-rest wird verpflichtend für Secret-Storage. +- Zugriff auf Secrets nur über Service-Layer, nicht über direkte DB-Reads. + +Beispiel: + +```text +registrar_accounts.secret_ref +``` + +statt: + +```text +registrar_accounts.api_key +registrar_accounts.password +``` + +--- + +### Audit-Log + +Teilweise übernehmen. + +Änderung: + +- Hash-Chain wird nicht als Schutz gegen DB-Admin-Manipulation beschrieben. +- Audit-Log bleibt append-only auf Anwendungsebene. +- Integritätsprüfung wird klar abgegrenzt. +- Optional: periodischer Export/Checkpoint in externes System. + +ADR 0014 muss entsprechend korrigiert werden. + +--- + +### Dead Letter Queue + +Übernehmen. + +Änderung: + +- DLQ erhält Retention-Regeln. +- PII in Fehlerpayloads wird vermieden oder redaktiert. +- Maximale Aufbewahrung wird festgelegt. +- Reprocessing und Löschung werden beschrieben. + +Vorschlag: + +```text +DLQ default retention: 30 Tage +DLQ max retention: 90 Tage +PII payloads: nicht speichern oder redaktieren +``` + +--- + +### Bounded Contexts + +Übernehmen, aber pragmatisch. + +Änderung: + +- Keine sofortige Service-Aufteilung. +- Einführung klarer Modulgrenzen im Monolithen. +- Datenmodell wird nach fachlichen Bereichen gegliedert. + +Kontexte: + +- Identity & Access +- CRM +- Billing +- Provisioning +- Registry +- Support +- Documents +- Audit + +--- + +### Reconciliation + +Teilweise übernehmen. + +Änderung: + +- Kein vollständiges Event-Sourcing für V1. +- Stattdessen Operation-/Job-Historie und Status-Snapshots. +- Reconciliation basiert auf: + - gewünschtem Zustand + - aktuellem externem Zustand + - letzter Operation + - Fehlerhistorie + +Benötigte Tabellen/Modelle: + +```text +provisioning_operations +external_resource_snapshots +job_runs +job_attempts +``` + +--- + +### Rollen und Scopes + +Übernehmen. + +Änderung: + +- Rollen werden nicht nur benannt, sondern mit konkreten Berechtigungen dokumentiert. +- Zugriff auf Secrets, Rechnungen, Serverdaten und Kundendaten wird explizit geregelt. + +Beispielrollen: + +- Owner +- Admin +- Billing +- Support +- Provisioning Operator +- Read-only Auditor + +--- + +### Dokument-Storage + +Übernehmen. + +Änderung: + +- Dokumente speichern keine Datei direkt im Datenmodell. +- Dokumente referenzieren Object Storage. +- Tenant-Isolation über Bucket/Prefix plus DB-Zugriffskontrolle. +- Löschung, Archivierung und Legal Hold werden dokumentiert. + +Beispiel: + +```text +documents.object_key +documents.storage_provider +documents.checksum_sha256 +documents.retention_until +documents.legal_hold +documents.deleted_at +``` + +--- + +## 3. Abgelehnte oder verschobene Punkte + +### Vollständiges Event-Sourcing + +Verschoben. + +Begründung: + +- Für V1 nicht erforderlich. +- Reconciliation kann über Operation-Historie, Job-Historie und Snapshots umgesetzt werden. + +--- + +### Microservice-Aufteilung nach Bounded Contexts + +Abgelehnt für V1. + +Begründung: + +- Zu hoher Betriebs- und Integrationsaufwand. +- Modulgrenzen im Monolithen reichen aktuell aus. + +--- + +### Audit-Hash-Chain als Manipulationsschutz + +Abgelehnt. + +Änderung: + +- Hash-Chain darf maximal als Integritätsindikator beschrieben werden. +- Kein Sicherheitsversprechen gegen privilegierte DB-Manipulation. + +--- + +### Parallele Nutzung von `organisation_id` und `tenant_id` + +Abgelehnt. + +Änderung: + +- Nur `tenant_id` ist technischer Scope. +- Organisation ist, falls benötigt, ein CRM-/Kundenkonzept. + +--- + +### Single-Tenant V1 ohne Tenant-Schutz + +Abgelehnt. + +Änderung: + +- V1 darf fachlich nur einen aktiven Tenant haben. +- Technisch wird Tenant-Isolation trotzdem sauber eingebaut. + +--- + +## 4. Neue/geänderte Dateien + +### Geändert + +#### `docs/data-model-v0.2.md` + +Änderungen: + +- `organisation_id` aus technischer Mandanten-Isolation entfernen. +- `tenant_id` als verbindlichen Scope definieren. +- Tenant-FK-Regeln ergänzen. +- Tabellen nach Bounded Contexts gruppieren. +- Secret-Felder durch `secret_ref` ersetzen. +- Dokumentmodell um Storage-Metadaten erweitern. +- Operation-/Job-Historie ergänzen. + +--- + +#### `docs/security.md` + +Änderungen: + +- Tenant-Isolation konkretisieren. +- Secrets-Management konkretisieren. +- RBAC/Scopes verlinken. +- RLS und Tenant-Kontext als Pflichtmechanismus aufnehmen. + +--- + +#### `docs/adr/0014-audit-log.md` + +Änderungen: + +- Hash-Chain nicht mehr als manipulationssicher beschreiben. +- Algorithmus konkretisieren, falls beibehalten. +- Optionalen externen Checkpoint/Export dokumentieren. +- Grenzen des Mechanismus explizit nennen. + +--- + +#### `docs/adr/0017-jobs-reconciliation-dlq.md` + +Änderungen: + +- DLQ-Retention ergänzen. +- PII-Regeln ergänzen. +- Reprocessing-Regeln ergänzen. +- Reconciliation-Datenbasis ergänzen. + +--- + +### Neu + +#### `docs/architecture/tenant-isolation.md` + +Inhalt: + +- `tenant_id` als einziger technischer Mandantenschlüssel +- Request-/Job-Tenant-Kontext +- Fail-closed-Verhalten +- RLS-Grundregeln +- Cross-Tenant-Zugriffe verboten +- Composite FK-Regeln + +--- + +#### `docs/architecture/bounded-contexts.md` + +Inhalt: + +- Modulgrenzen +- erlaubte Abhängigkeiten +- Besitz von Tabellen/Entitäten +- keine direkten Fremdzugriffe zwischen Kontexten ohne definierte Schnittstelle + +--- + +#### `docs/security/secrets-management.md` + +Inhalt: + +- Secret-Service-Konzept +- `secret_ref` +- keine Klartext-Secrets in DB +- Rotation +- Zugriffskontrolle +- Auditierung von Secret-Zugriffen + +--- + +#### `docs/security/rbac-matrix.md` + +Inhalt: + +| Bereich | Owner | Admin | Billing | Support | Provisioning | Auditor | +|---|---:|---:|---:|---:|---:|---:| +| Kunden lesen | ja | ja | ja | ja | ja | ja | +| Kunden ändern | ja | ja | nein | eingeschränkt | nein | nein | +| Rechnungen lesen | ja | ja | ja | nein | nein | ja | +| Rechnungen ändern | ja | ja | ja | nein | nein | nein | +| Serverdaten lesen | ja | ja | nein | eingeschränkt | ja | ja | +| Server ändern | ja | ja | nein | nein | ja | nein | +| Secrets lesen | nein | nein | nein | nein | nein | nein | +| Secret nutzen | ja | ja | nein | nein | system | nein | + +--- + +#### `docs/storage/document-storage.md` + +Inhalt: + +- Object-Storage-Strategie +- Tenant-Isolation per Prefix/Bucket +- Checksums +- Archivierung +- Löschanfragen +- Legal Hold +- Zugriffskontrolle + +--- + +#### `docs/operations/dlq-retention.md` + +Inhalt: + +- DLQ-Retention +- PII-Regeln +- Reprocessing +- manuelle Freigabe +- endgültige Löschung +- Monitoring + +--- + +#### `docs/operations/reconciliation.md` + +Inhalt: + +- gewünschter Zustand +- externer Ist-Zustand +- Operation-Historie +- Snapshot-Modell +- Konfliktbehandlung +- Retry-Strategie + +--- + +#### `db/policies/tenant_rls.sql` + +Inhalt: + +- PostgreSQL RLS-Grundstruktur +- Policy pro mandantenbezogener Tabelle +- Nutzung von `current_setting('app.tenant_id')` +- Fail-closed bei fehlendem Tenant-Kontext + +Beispiel: + +```sql +ALTER TABLE customers ENABLE ROW LEVEL SECURITY; + +CREATE POLICY tenant_isolation_customers +ON customers +USING ( + tenant_id = current_setting('app.tenant_id')::uuid +); +``` + +--- + +#### `db/migrations/xxxx_add_tenant_scope.sql` + +Inhalt: + +- `tenants`-Tabelle +- `tenant_id` auf mandantenbezogenen Tabellen +- NOT NULL Constraints +- Composite Foreign Keys +- Indizes auf `(tenant_id, id)` + +--- + +## 5. Konkrete nächste Schritte + +1. `docs/data-model-v0.2.md` anpassen: + - `tenant_id` festlegen + - `organisation_id` aus Isolation entfernen + - Secret-Felder durch `secret_ref` ersetzen + +2. `docs/architecture/tenant-isolation.md` neu erstellen. + +3. `db/migrations/xxxx_add_tenant_scope.sql` vorbereiten: + - `tenants` + - `tenant_id` + - Constraints + - Indizes + +4. `db/policies/tenant_rls.sql` erstellen. + +5. `docs/security/secrets-management.md` erstellen. + +6. `docs/security/rbac-matrix.md` erstellen. + +7. ADR 0014 überarbeiten: + - keine falsche Sicherheitsbehauptung zur Hash-Chain + +8. ADR 0017 überarbeiten: + - DLQ-Retention + - PII-Regeln + - Reconciliation-Datenbasis + +9. `docs/storage/document-storage.md` erstellen. + +10. `docs/architecture/bounded-contexts.md` erstellen und Datenmodell danach gruppieren. \ No newline at end of file diff --git a/reviews/claude-critical-risks.md b/reviews/claude-critical-risks.md new file mode 100644 index 0000000..504b921 --- /dev/null +++ b/reviews/claude-critical-risks.md @@ -0,0 +1,312 @@ +# Kritische Risiken und Refactoring-Gefahren + +**Stand:** 15. Mai 2026 +**Reviewer:** Claude +**Bezug:** Hosting-Backoffice v0.1 (vollständiger Basisbestand) + +Jedes Risiko ist mit Schweregrad, Zeitpunkt und konkreter Empfehlung markiert. + +**Legende:** +- Schweregrad: `LOW` / `MEDIUM` / `HIGH` / `CRITICAL` +- Zeitpunkt: `NOW` (vor Codebeginn) / `V1` / `V2` / `V3` / `LATER` + +--- + +## R-01 — Mandantenfähigkeit ist Absichtserklärung, kein Design + +- **Schweregrad:** `CRITICAL` +- **Zeitpunkt:** `NOW` +- **Problem:** Die Multi-Tenancy-Strategie listet Ziele, keinen Mechanismus. V1 läuft als Single-Tenant mit zwei ungeklärten ID-Spalten (`tenant_id`, `organisation_id`). Wenn V1 ohne Tenant-Scope-Enforcement deployt wird, ist V2/V3-Reseller-Fähigkeit ein Komplett-Refactor jeder Query, Policy, Job-Payload, Cache-Key und Webhook-Definition. +- **Empfehlung:** Tenancy-Modell jetzt entscheiden und in ADR festschreiben. Vorschlag: Shared Database, `tenant_id`-Scope, Postgres Row-Level Security als zweite Verteidigungsschicht. Eloquent Global Scope von Tag 1 auf allen mandantenscoped Modellen. Statische Analyse oder Runtime-Assertion in CI gegen ungescopte Queries. `organisation_id` vs. `tenant_id` mit ER-Modell klären oder eine der beiden Spalten streichen. + +--- + +## R-02 — Anbieterlogik im Core-Datenmodell bricht das eigene Adapter-Pattern + +- **Schweregrad:** `CRITICAL` +- **Zeitpunkt:** `NOW` +- **Problem:** `Server.KeyHelp-Referenz` und `Rechnung.externes System` stehen im Core-Datenmodell. Das widerspricht direkt dem Integration-Adapter-Pattern, das „Core kennt keine direkte Anbieterlogik" als Grundprinzip formuliert. Sobald V1 mit dieser Schema-Form deployt wird, ist das Adapter-Pattern in der Praxis tot, und jedes neue Hostingpanel braucht Core-Schema-Änderungen. +- **Empfehlung:** Vor dem ersten Migration-File ein generisches External-Reference-Pattern einführen, z. B. Tabelle `external_references(id, owner_type, owner_id, adapter_id, external_id, metadata, last_synced_at)`. Im Core nur diese Tabelle, keine anbieter-spezifischen Felder. + +--- + +## R-03 — Daten im Core, Logik in Modulen (Billing-Anti-Pattern) + +- **Schweregrad:** `CRITICAL` +- **Zeitpunkt:** `NOW` +- **Problem:** `Rechnung` und `Zahlung` sind im Core-Datenmodell. Billing-Logik ist als Integrationsmodul gedacht (Lexware, Invoice Ninja). Konsequenz: Module schreiben in Core-Tabellen, kennen das Core-Schema, jede Schema-Änderung im Core bricht potenziell mehrere Module. Genau die Konstruktion, in der „modularer Aufbau" zum erweiterten Monolithen wird. +- **Empfehlung:** Billing als eigene Bounded-Context-Domäne (Service-Modul) etablieren. Core kennt höchstens `InvoiceReference` mit Adapter-ID und externer ID, nicht aber `Rechnung.Betrag`. Eigenes Datenmodell pro Modul, Kommunikation per definierten Service-Contract. + +--- + +## R-04 — Modulstruktur und Modul-Dokumente widersprechen sich + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `NOW` +- **Problem:** `module-structure-v0.1.md` listet weder Billing noch Customer Portal, obwohl beide eigene Modul-Beschreibungen haben. KeyHelp und Registrar sind als Modul-Doks vorhanden – einer ist Integrationsmodul, der andere möglicherweise eine Mischform. Solange diese drei verschiedenen „Wahrheiten" parallel existieren, gibt es kein gemeinsames Architekturverständnis. +- **Empfehlung:** Modulstruktur als alleinige Wahrheit etablieren. Jedes Modul-Dokument muss in der Modul-Struktur gelistet sein, oder es existiert nicht. Inkonsistenzen vor Codebeginn beheben. + +--- + +## R-05 — Secrets-Management vollständig undefiniert + +- **Schweregrad:** `CRITICAL` +- **Zeitpunkt:** `NOW` +- **Problem:** `Registrar-Account.Zugangsdaten/API-Referenzen` impliziert Credentials im Datenmodell. Im gesamten Bestand findet sich kein Wort zu Vault, Verschlüsselung, Key Rotation, KMS, HSM oder Mandanten-Isolation der Schlüssel. Bei kompromittierter DB hätte ein Angreifer Zugriff auf Registrar-Accounts aller Mandanten – das wäre ein Vorfall mit Branchenrelevanz. +- **Empfehlung:** Externes Secret-Management (HashiCorp Vault, AWS Secrets Manager, Bitwarden Secrets Manager) oder mindestens Envelope-Encryption mit pro-Mandant abgeleiteten Schlüsseln und externem KMS. Datenmodell darf keine Credentials enthalten, nur Referenzen in den Vault. Vor V1-Codebeginn entscheiden. + +--- + +## R-06 — Core ist zu groß, Monolith-Pfad voraussehbar + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `NOW` +- **Problem:** Core enthält 13 Bereiche, davon mindestens 6 mit eigener Geschäftslogik (Domains, Hostingpakete, Server, Dokumente, Notifications, Produkte). Diese Konstellation produziert einen Bounded Context für die gesamte Anwendung und macht den Modul-Ansatz architektonisch wirkungslos. +- **Empfehlung:** Core auf Identity, RBAC, Audit, Settings, Module-Registry, Event-Routing, Tenant-Scope reduzieren. Domains, Hostingpakete, Server, Dokumente, Notifications-Channels in eigene Service-Module auslagern. Adapter-Pattern und Modul-Contract als verbindliche Grenze. + +--- + +## R-07 — GoBD-Verantwortlichkeit nicht entschieden + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `V1` +- **Problem:** `Rechnung.externes System` impliziert, dass Lexware/Invoice Ninja der Beleg-Originalspeicher ist. Die GoBD-Archive-Strategie sagt aber gleichzeitig „PDFs archivieren, Hashes speichern, Audit-Logs schreiben" – das klingt nach lokalem Originalspeicher. Wenn Hosting-Backoffice der Originalspeicher ist, gelten harte GoBD-Anforderungen (unveränderbare Belege, lückenlose Nummernkreise pro Mandant, 10-Jahres-Retention, Z3-Export). Aktuell ist das nicht entschieden. +- **Empfehlung:** Klärungs-ADR. Empfehlung: Lexware/Invoice Ninja als Original, Hosting-Backoffice als Referenz-/Spiegel-System mit Archivkopie und Hash. Audit-Logs intern, aber keine GoBD-Originalrolle. + +--- + +## R-08 — DSGVO-Löschung vs. GoBD-Retention nicht modelliert + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `V1` +- **Problem:** Endkunde verlangt Löschung nach DSGVO Art. 17, gleichzeitig müssen Rechnungsbelege 10 Jahre aufbewahrt werden. Diese Spannung muss technisch abgebildet sein. Im aktuellen Datenmodell gibt es weder Soft-Delete-Modell noch Pseudonymisierungs-Strategie noch Tombstone-Mechanismus. +- **Empfehlung:** Tombstone- und Pseudonymisierungs-Modell entwerfen. Pflicht: Trennung von Personen-Stammdaten (löschbar/pseudonymisierbar) und Beleg-Inhalt (retentionspflichtig). Konkrete Felder definieren, was bei „Löschung" mit der Person passiert (z. B. `Anonymized` als Name). + +--- + +## R-09 — API-Auth-Strategie unentschieden + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `NOW` +- **Problem:** „Tokenbasiert, später OAuth/Sanctum möglich" mischt Konzeptebenen. Das WordPress-Plugin und das Customer Portal können nicht entwickelt werden, bevor entschieden ist, welcher Auth-Mechanismus für welchen Client-Typ gilt. +- **Empfehlung:** ADR. Vorschlag für V1: Sanctum Personal Access Tokens (M2M, einfache Clients) plus Sanctum SPA-Mode (eigenes Frontend, falls vorhanden). V2: Passport/OAuth2 für WordPress-Plugin und Drittanbieter-Apps. + +--- + +## R-10 — Datenbankwahl offen + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `NOW` +- **Problem:** „MariaDB oder PostgreSQL" als Nicht-Entscheidung. Postgres bietet Row-Level Security (relevant für Tenancy als Defense-in-Depth), JSONB mit Indizes, transaktionales DDL, partielle Indizes. MariaDB nicht in gleichem Umfang. „Später entscheiden" ist faktisch eine Festlegung auf den kleinsten gemeinsamen Nenner. +- **Empfehlung:** ADR. Vorschlag: PostgreSQL 15+, mit expliziter Begründung an Tenancy-, Audit-, JSON- und Performance-Anforderungen. + +--- + +## R-11 — KI-Modul in V1 birgt DSGVO-Sprengstoff + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `NOW` (Scope-Entscheidung) / `V2` (technisch) +- **Problem:** KI-Funktionen verarbeiten potenziell personenbezogene Support-Ticket-Inhalte über US-Provider, was Auftragsverarbeitungsvertrag, SCC, Drittlandtransfer-Risikobewertung, Subprozessor-Transparenz und Endkunden-Information erfordert. Für V1 (3–5 Pilotkunden, „Ordnung schaffen") ist das Aufwand ohne Geschäftswert. +- **Empfehlung:** KI-Modul aus V1 entfernen, in V2 wieder aufnehmen. Bis dahin: Subprozessor-Strategie, DPA-Vorlage, Datenklassifikation und Mensch-im-Loop-Konzept ausarbeiten. + +--- + +## R-12 — SEPA-Lastschrift ohne SEPA-Modell + +- **Schweregrad:** `MEDIUM` +- **Zeitpunkt:** `V1` +- **Problem:** Payment Policy listet Lastschrift als V1-Zahlungsart. SEPA-Lastschrift erfordert Mandate (UMR, Mandatsdatum, Mandatstext), Pre-Notification (mind. 1 Tag), IBAN-Speicherung (personenbezogen + sicherheitsrelevant), Mandatsänderungs-Historie. Davon ist nichts modelliert. +- **Empfehlung:** Entweder Lastschrift aus V1 entfernen, oder SEPA-Mandat-Modell vollständig spezifizieren (eigene Tabellen, Statusmaschine, Verschlüsselung der IBAN, Audit-Log). + +--- + +## R-13 — V1-Scope intern widersprüchlich + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `NOW` +- **Problem:** Mehrere Dokumente erzählen unterschiedliche V1-Geschichten: KI in V1 vs. V2, Customer Portal in V1 vs. nicht in MVP, Kundenzahl 1–500 vs. 1–50. Das macht den V1-Scope unentscheidbar und damit das Erfolgsversprechen unprüfbar. +- **Empfehlung:** V1-Scope-Liste als einzelne Quelle der Wahrheit etablieren. Empfehlung: KI raus, Customer Portal raus oder mit reduziertem Umfang, Kundenzahl auf 1–50 festgelegt. Alle Dokumente daran ausrichten. + +--- + +## R-14 — Audit-Log-Unveränderbarkeit als Wunsch, kein Mechanismus + +- **Schweregrad:** `MEDIUM` +- **Zeitpunkt:** `V1` +- **Problem:** „Logs dürfen nicht manipulierbar sein" steht als Anforderung, aber kein Mechanismus ist beschrieben. Eine normale DB-Tabelle ist manipulierbar. +- **Empfehlung:** Mindestens Append-only-Tabelle ohne UPDATE/DELETE-Berechtigung des App-Users, Hash-Chain der Einträge, regelmäßiger Export in WORM-Storage oder externes Audit-Sink. ADR. + +--- + +## R-15 — Tenant-Offboarding und Datenexport nicht definiert + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `V2` +- **Problem:** Wenn ein Mandant das System verlässt, muss er DSGVO-konform seine Daten erhalten (Datenportabilität) und der Plattformbetreiber muss löschen. Kein Konzept im Bestand. +- **Empfehlung:** Tenant-Lifecycle-Domäne entwerfen. Export-Format: maschinenlesbar (JSON Lines, oder pro-Tenant DB-Dump bei DB-per-Tenant-Modell). Aufbewahrungspflichten der GoBD beachten. + +--- + +## R-16 — Steuer-/MwSt-Logik komplett fehlend + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `V1` +- **Problem:** Im gesamten Bestand kein Wort zu MwSt-Sätzen, OSS (One-Stop-Shop für EU-B2C), Reverse Charge B2B EU, oder MwSt-Befreiungen. Eine Rechnungs-Software ohne Steuermodell ist nicht produktiv einsetzbar. +- **Empfehlung:** Minimal-Modell für V1: deutscher Standardfall (19%/7%/0%), B2B/B2C-Flag pro Kunde, Erweiterbarkeit für OSS in V2. ADR + Daten-Modell-Update. + +--- + +## R-17 — Reseller-Hierarchie V3 ohne V1-Vorbereitung + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `NOW` +- **Problem:** V3 verspricht „Resellerstrukturen" und „tiefere Mandantenfähigkeit". Das setzt mindestens dreistufige Hierarchie (Plattform → Reseller → Endkunde) voraus. V1 plant zweistufig oder einstufig (siehe R-01). Ohne saubere Hierarchie-Definition heute wird V3 ein Modellbruch. +- **Empfehlung:** Hierarchie als Datenmodell-Entscheidung heute festlegen (selbst wenn V1 nur eine Ebene aktiv nutzt). ADR. Tabelle `tenants` mit `parent_tenant_id` als Vorbereitung. + +--- + +## R-18 — Fehlerresilienz für Integrationen nicht entworfen + +- **Schweregrad:** `MEDIUM` +- **Zeitpunkt:** `V1` +- **Problem:** Adapter-Anforderungen sagen „Fehlerbehandlung" – aber Retry-Strategie, Backoff, Circuit Breaker, Dead-Letter-Queue, Reconciliation bei inkonsistentem Zustand sind nicht beschrieben. Bei Domain-Renewal kann ein nicht behandelter Adapter-Fehler einen geschäftskritischen Datenverlust bedeuten. +- **Empfehlung:** Standardpattern für alle Adapter: Retry mit exponentiellem Backoff, Circuit Breaker, Dead Letter, Reconciliation-Job nightly. Job-Status sichtbar im UI. + +--- + +## R-19 — API-Versionierungsstrategie unvollständig + +- **Schweregrad:** `MEDIUM` +- **Zeitpunkt:** `V1` +- **Problem:** Nur Pfad-Versionierung (`/api/v1/`) ohne Deprecation/Sunset/Compatibility-Strategie. Bei API-first-Anspruch zu wenig. +- **Empfehlung:** ADR mit klaren Regeln: Breaking Changes nur über neue Major-Version, Minor-Changes additiv, Deprecation-Header (`Deprecation`, `Sunset`), Mindest-Support-Zeitraum für ältere Versionen. + +--- + +## R-20 — Nummernkreise pro Mandant ohne Mechanismus + +- **Schweregrad:** `HIGH` +- **Zeitpunkt:** `V1` +- **Problem:** Rechnungsnummern müssen lückenlos sein und pro Mandant separat. Kunden-, Vertrags-, Rechnungsnummern: pro Mandant? Global? Konfigurierbar? Aktuell nicht modelliert. +- **Empfehlung:** Dedicate Sequence-Tabelle pro Mandant und pro Nummernkreis. Atomic-Increment mit DB-Lock. Konfigurierbares Format (Präfix, Padding, Reset-Verhalten). Pflicht für GoBD-Konformität. + +--- + +## R-21 — Personen-/Adressmodell als undifferenziertes Bündel + +- **Schweregrad:** `MEDIUM` +- **Zeitpunkt:** `NOW` +- **Problem:** `Kunde` enthält „Stammdaten + Ansprechpartner + Kontaktdaten" als monolithisches Objekt. Klassisches Anti-Pattern. Erschwert DSGVO-Auskunft/Löschung, B2B-Modell, Mehrfach-Ansprechpartner, getrennte Rechnungs-/Postanschriften. +- **Empfehlung:** Trennung in `Party` (Person oder Organisation) + `Address` (mit Verwendungszweck: Rechnung/Post/Rechtssitz) + `ContactPoint` (Mail/Tel/etc. mit Verwendungszweck). N:M zwischen Customer und Party für Ansprechpartner. + +--- + +## R-22 — WordPress-Plugin als zweite Sicherheitsdomäne + +- **Schweregrad:** `MEDIUM` +- **Zeitpunkt:** `V2` +- **Problem:** Plugin ist API-Client mit eigener Session-Domäne, eigenem Update-Lifecycle, eigener Plugin-Ökosystem-Risikofläche. Wenn die WP-Site kompromittiert ist, sind die API-Tokens des Plugins gefährdet. Aktuell ist nicht definiert, welche Scopes das Plugin erhält und wie kompromittierte Tokens rotiert werden. +- **Empfehlung:** Plugin nur mit minimal-Scope-Token. Token-Revocation aus Admin-UI. Lifetime begrenzen. Audit-Log bei jeder Plugin-API-Nutzung. Strategie für Sandbox-Tests bei kompromittiertem WP-Setup. + +--- + +## R-23 — Frontend-Strategie offen widerspricht API-first-Anspruch + +- **Schweregrad:** `MEDIUM` +- **Zeitpunkt:** `NOW` +- **Problem:** „Blade oder später Vue/Nuxt" lässt eine fundamentale Architekturentscheidung offen. Klassischer Laravel-Monolith mit angeflanschter API ist eine andere Architekturklasse als ein API-first-System mit echtem SPA-Client. +- **Empfehlung:** ADR. Entweder Blade-als-API-Konsument (Blade-Views rufen interne API auf, kein direkter DB-Zugriff aus Views) oder Vue-/Nuxt-SPA. Nicht „später". + +--- + +## R-24 — BFSG / Barrierefreiheit für Customer Portal + +- **Schweregrad:** `MEDIUM` +- **Zeitpunkt:** `V1` (falls Portal in V1) / `V2` +- **Problem:** Seit 28. Juni 2025 sind in der EU kommerzielle digitale Dienste an Verbraucher barrierefrei zu gestalten (BFSG, Umsetzung der EU-Richtlinie 2019/882). Customer Portal fällt darunter. +- **Empfehlung:** UI-Komponenten und Frontend-Stack barrierefrei gestalten (WCAG 2.1 AA als Ziel). Wenn Portal aus V1 raus ist (R-13), entschärft sich das auf V2. + +--- + +## R-25 — Modul-Lifecycle (Deinstallation, Datenreferenzen) ungeklärt + +- **Schweregrad:** `MEDIUM` +- **Zeitpunkt:** `V1` +- **Problem:** Module sollen aktivierbar/deaktivierbar sein. Was passiert mit referenzierten Daten in anderen Modulen, wenn ein Modul deinstalliert wird? Was passiert bei Re-Installation? Diese Semantik ist nirgendwo beschrieben. +- **Empfehlung:** Modul-Lifecycle definieren: aktivieren / deaktivieren (Daten bleiben) / deinstallieren (Daten archivieren, optional löschen). Dependencies zwischen Modulen explizit deklarieren. Migrations-Strategie bei Re-Installation. + +--- + +## R-26 — Logging-/Audit-Sink-Architektur unspezifiziert + +- **Schweregrad:** `MEDIUM` +- **Zeitpunkt:** `V1` +- **Problem:** Logging-Strategie sagt was geloggt werden soll, aber nicht wohin oder wie. App-Logs vs. Audit-Logs sind getrennt, aber Speicherort, Retention, Mandantenscope, Integritätsschutz fehlen. +- **Empfehlung:** Drei getrennte Senken: App-Logs (lokal, kurzfristig, optional externer Aggregator wie Loki/Sentry), Audit-Logs (DB-Append-only, langfristig, pro Mandant), Security-Logs (Login, Auth-Fehler, Admin-Aktionen, separat). + +--- + +## R-27 — „Vorbereitende" Felder ohne Verwendung in V1 + +- **Schweregrad:** `LOW` +- **Zeitpunkt:** `NOW` +- **Problem:** Mehrfach „… später möglich" als Feld-Anmerkung (Server.Rollen später, Hostingpaket.Ressourcen später, Gebührenregeln später). Erfahrung: solche Felder werden entweder nie genutzt oder mit Bedeutung versehen, die nicht zur ursprünglichen Form passt. +- **Empfehlung:** „Später"-Felder aus dem v0.1-Datenmodell entfernen. Wenn ein Feld V1 nicht braucht, wird es V1 nicht migriert. Bei Bedarf später eigene Migration. + +--- + +## R-28 — Mehrere parallele Single Sources of Truth + +- **Schweregrad:** `LOW` (organisatorisch) / `HIGH` (in Konsequenz) +- **Zeitpunkt:** `NOW` +- **Problem:** Strategie-Dokumente, Modul-Dokumente, Roadmap und MVP-Liste enthalten sich widersprechende Aussagen (siehe R-04, R-13). Ohne klare Hierarchie zwischen den Dokumenten wird im Code-Schritt jede Person eine andere Variante implementieren. +- **Empfehlung:** Dokumenthierarchie festlegen: ADRs > Strategie-Dokumente > Modul-Beschreibungen > Roadmap. Konflikte werden in dieser Reihenfolge aufgelöst. Bei Konflikt: ADR ergänzen oder Strategie-Doc aktualisieren, untere Ebenen nachziehen. + +--- + +## Zusammenfassende Priorisierung + +**CRITICAL / NOW** (vor Codebeginn unverzichtbar): +- R-01 Mandantenfähigkeits-Mechanismus +- R-02 Anbieterlogik aus Core entfernen +- R-03 Billing aus Core entfernen +- R-05 Secrets-Management + +**HIGH / NOW** (vor Codebeginn entscheiden): +- R-04 Modulstruktur als einzige Wahrheit +- R-06 Core verkleinern +- R-09 API-Auth-Strategie +- R-10 Datenbank-Engine +- R-11 KI-Scope-Entscheidung +- R-13 V1-Scope vereinheitlichen +- R-17 Reseller-Hierarchie-Vorbereitung +- R-21 Personen-/Adressmodell +- R-23 Frontend-Strategie +- R-28 Dokumenten-Hierarchie + +**HIGH / V1** (muss in V1 enthalten sein): +- R-07 GoBD-Verantwortlichkeit +- R-08 DSGVO-Löschung-Modell +- R-16 Steuer-/MwSt-Logik +- R-20 Nummernkreise + +**MEDIUM / V1**: +- R-12 SEPA-Modell oder raus +- R-14 Audit-Unveränderbarkeit +- R-18 Adapter-Fehlerresilienz +- R-19 API-Versionierung +- R-24 Barrierefreiheit (falls Portal in V1) +- R-25 Modul-Lifecycle +- R-26 Logging-Architektur + +**MEDIUM/HIGH / V2-V3**: +- R-15 Tenant-Offboarding +- R-22 WP-Plugin-Sicherheitsmodell +- R-24 Barrierefreiheit (Portal in V2) + +**LOW / NOW**: +- R-27 Spekulative Felder entfernen + +--- + +Die Gesamtbotschaft: Die Anzahl der CRITICAL/NOW-Punkte (4) ist überschaubar und alle in 2–4 Wochen entscheidungsreif. Die HIGH/NOW-Punkte (10) sind ADR-Material. Wenn diese 14 Punkte vor Codebeginn entschieden sind, hat das Projekt eine sehr gute Ausgangslage. Werden sie nicht entschieden, ist V1 voraussichtlich produktiv nutzbar, aber V2/V3 wird teurer als V1 selbst. diff --git a/reviews/claude-open-questions.md b/reviews/claude-open-questions.md new file mode 100644 index 0000000..dbece85 --- /dev/null +++ b/reviews/claude-open-questions.md @@ -0,0 +1,168 @@ +# Offene Fragen vor Entwicklungsbeginn + +**Stand:** 15. Mai 2026 +**Reviewer:** Claude +**Bezug:** Hosting-Backoffice v0.1 (vollständiger Basisbestand) + +Diese Fragen müssen vor Beginn der V1-Implementierung beantwortet sein. Sie sind nach Themenbereich gruppiert. Innerhalb jedes Bereichs sind sie nach Dringlichkeit geordnet. + +--- + +## 1. Mandantenfähigkeit + +1. Welches Tenancy-Modell gilt für V1: Shared Database mit `tenant_id`-Scope, Schema-pro-Tenant, oder Database-pro-Tenant? +2. Was bedeutet `organisation_id` zusätzlich zu `tenant_id`? Sind beide Synonyme (eines streichen) oder Hierarchieebenen (dann mit ER-Modell zeigen)? +3. Wie wird Tenant-Isolation technisch erzwungen? Eloquent Global Scope, Policy-Layer, Row-Level Security in Postgres, Connection-Switching, oder Kombination? +4. Wie viele Subjektebenen hat das Berechtigungsmodell? Plattformbetreiber → Mandant → Endkunde, oder mit Reseller-Zwischenebene? +5. Wie sieht der Tenant-Lifecycle aus: Provisioning, Suspend, Termination, Datenexport, Offboarding? +6. Wie wird Cross-Tenant-Datenzugriff für Plattform-Admins technisch geregelt (Impersonation, Read-only-Bypass, Audit-Pflicht)? +7. Wie wird beim Wechsel von V1 (Single-Tenant) zu V2/V3 (Multi-Tenant) der erste Mandant migriert? +8. Gibt es Cross-Tenant-Ressourcen (gemeinsame Templates, Knowledge Base, Module Registry), und wie sind sie modelliert? + +--- + +## 2. Datenmodell + +1. Wie sieht das vollständige ER-Modell mit Beziehungen und Kardinalitäten aus? +2. Welche Statusmaschinen existieren für Vertrag, Domain, Hostingpaket, Ticket, Rechnung, und welche Übergänge sind erlaubt? +3. Wie werden Nummernkreise pro Mandant verwaltet (lückenlos, GoBD-konform, separat für Kunde/Vertrag/Rechnung)? +4. Wird `Kunde` in Party/Address/ContactPoint aufgespalten, oder als monolithisches Objekt gehalten? +5. Wie wird B2B vs. B2C unterschieden im Datenmodell? +6. Wie wird das Spannungsfeld Soft-Delete / GoBD-Retention / DSGVO-Löschung technisch aufgelöst? Tombstone-Modell mit Pseudonymisierung? +7. Wie werden externe Referenzen modelliert (generisches Pattern statt anbieter-spezifischer Felder im Core)? +8. Wie ist das Audit-Log-Schema, und wie wird Unveränderbarkeit garantiert (Hash-Chain, Append-only-DB, externes Sink)? +9. Werden Verträge versioniert (Vertragsversion, Änderungshistorie)? +10. Wie werden Subscriptions/Laufzeiten modelliert (Vertrag.Laufzeit reicht nicht für Up-/Downgrade und Pro-rata)? +11. Wie wird die Many-to-many-Beziehung Vertrag↔Produkt, Vertrag↔Domain, Vertrag↔Hostingpaket modelliert? +12. Wie ist das Asset-/Dokument-Modell (Hashes, Content-Addressing, Versionen, Storage-Backend-Abstraktion)? + +--- + +## 3. API + +1. Welcher Auth-Stack: Sanctum Personal Access Tokens, Sanctum SPA-Mode, Passport/OAuth2, oder Kombination je Client-Typ? +2. Gibt es OpenAPI 3.x als verbindliche Spec, und ist die Implementierung spec-first? +3. Welches Error-Modell wird verwendet (Problem Details RFC 7807 empfohlen)? +4. Welche Pagination-Strategie: Offset, Cursor, Page? +5. Welche Idempotenz-Strategie für nicht-idempotente Operationen (Domain-Registrierung, Rechnungsanlage)? +6. Wie sieht das Filtering-/Sorting-Schema aus? +7. Wie wird API-Versionierung über `/api/v1/` hinaus gehandhabt (Deprecation, Sunset, Compatibility)? +8. Gibt es Webhooks/Outbound Events? Welches Format, welche Signaturen, welche Delivery-Garantien? +9. Wie werden Rate-Limits pro Mandant skaliert (nicht nur pro IP/Token)? +10. Welche Endpoints sind read-only, welche schreibend, und wie ist das in der Auth-Scope-Logik abgebildet? +11. Wie werden Long-Running-Operations modelliert (Domain-Imports, große Synchronisationen) – synchron, asynchron mit Job-Status-Endpoint, oder via Webhook-Callback? + +--- + +## 4. Core- und Modulgrenzen + +1. Was gehört verbindlich in den Core, was in Service-Module, was in Integrationsmodule? (Aktuelle Liste in `module-structure-v0.1.md` ist unvollständig.) +2. Wo lebt Billing architektonisch? Im Core (Daten heute dort), als Service-Modul, als Adapter-Verbund? +3. Wo lebt das Customer Portal? Service-Modul oder eigenes UI-Modul? +4. Wie ist ein Modul technisch verpackt – Composer-Package, in-app Namespace, Nwidart-Modul, anderes? +5. Wie kommunizieren Module untereinander: Events, Service-Contracts, beides? +6. Wie wird die Modul↔Core-API versioniert? Wie deklariert ein Modul seine Core-API-Mindestversion? +7. Was passiert bei Modul-Deinstallation mit existierenden Datenreferenzen? +8. Wie sind Modul-Migrationen mit Core-Migrationen verzahnt? +9. Wer ist „Owner" jeder Entität (Aggregate Root)? Insbesondere: Wer besitzt `Rechnung` – Billing-Modul oder Core? +10. Wie wird ein generisches External-Reference-Pattern eingeführt, ohne die heutigen anbieter-spezifischen Felder zu zementieren? + +--- + +## 5. Sicherheit und Compliance + +1. Wie werden Registrar-/Provider-API-Credentials gespeichert? Externer Vault, eigenes Verschlüsselungsschema, KMS, HSM? +2. Wer ist GoBD-Verantwortlicher für Rechnungen – Hosting-Backoffice oder das externe Billing-System (Lexware/Invoice Ninja)? +3. Falls Hosting-Backoffice GoBD-Verantwortlicher ist: Welcher Mechanismus garantiert Unveränderbarkeit nach Festschreibung? +4. Wie wird DSGVO-Auskunft pro Endkunde umgesetzt (vollständiger Datenexport in maschinenlesbarer Form)? +5. Wie wird DSGVO-Löschung pro Endkunde umgesetzt, ohne GoBD-Retention zu verletzen (Pseudonymisierung)? +6. Wer ist Auftragsverarbeiter zwischen Plattformbetreiber und Mandant (DPA)? Wie ist die Beziehung Mandant↔Endkunde geregelt? +7. Welche Subprozessoren werden eingesetzt (insbesondere KI-Provider, Mail-Versand, Hosting-Region, Backup-Region)? +8. Wo werden Audit-Logs gespeichert, und wie wird ihre Integrität garantiert? +9. Welche Authentication-Faktoren werden unterstützt (Password, 2FA, WebAuthn)? Pflicht für Admins? +10. Welche Session-Strategie (Lifetime, Idle-Timeout, Refresh, Revocation)? +11. Wie wird Datenresidenz garantiert („europäisch" auf welcher Ebene: Hosting, DB, Backup, Subprozessoren)? +12. Wer haftet bei kompromittierten Registrar-Credentials? Welche technischen Maßnahmen reduzieren das Risiko? +13. Welche AGB-/Widerrufs-Mechanismen werden bei Customer Portal benötigt? +14. Ist BFSG/Barrierefreiheit für das Customer Portal relevant (EU-Verordnung seit 28.06.2025)? + +--- + +## 6. Integrationen + +1. Wie ist der formale Adapter-Contract definiert (Interface-Methoden, Fehler-Schema, Auth, Idempotenz)? +2. Wie werden Adapter-Fehler behandelt (Retry, Backoff, Circuit Breaker, Dead Letter)? +3. Wie wird inkonsistenter Zustand zwischen Core und externem System aufgelöst (Reconciliation, manueller Eingriff)? +4. Wie werden Adapter-Konfigurationen pro Mandant verwaltet (Mandant A nutzt Lexware, Mandant B Invoice Ninja)? +5. Was ist die Bedeutung von „Zahlungsart PayPal/Wero": reine Statusanzeige oder echte Integration? +6. Wie wird SEPA-Lastschrift modelliert (Mandate, UMR, Pre-Notification, IBAN-Verschlüsselung)? +7. Welche Steuer-/MwSt-Logik liegt im System, welche im Billing-Adapter? +8. Was passiert bei Modul-Updates eines Adapters mit nicht-rückwärtskompatiblen Änderungen? +9. Wie wird Mail-Versand (SMTP/Transactional) als eigene Integration gehandhabt? Welcher Anbieter? SPF/DKIM/DMARC-Strategie? + +--- + +## 7. WordPress-Plugin + +1. Welche Auth-Brücke zwischen WordPress und Hosting-Backoffice? OAuth2 Client Credentials? App-Token pro Mandant? Endkunden-Delegation? +2. Speichert das Plugin Daten lokal in WordPress (Sync-Risiko) oder ist es reiner API-Konsument? +3. Wie wird WP-User-Identität auf Backoffice-User-Identität gemappt? +4. Wie ist das Plugin-Update-Lifecycle (eigener Auto-Updater, WordPress.org-Repository, privates Repo)? +5. Welche API-Scopes erhält das Plugin? Was passiert bei kompromittierter WP-Site? +6. Wer ist Mandant aus Sicht der API, wenn ein WP-User klickt – der WP-Site-Betreiber oder der endgültige Endkunde? +7. Welche Caching-/Stale-Data-Strategie hat das Plugin gegenüber der API? + +--- + +## 8. KI-Assistent + +1. Bleibt KI in V1 oder rückt es in V2 (Empfehlung: V2)? +2. Welcher KI-Provider? OpenAI, Anthropic, Mistral, lokal? +3. Wenn US-basierter Provider: DPA, SCC, Drittlandtransfer-Risikobewertung? +4. Welche Daten gehen an die KI – Inhalte oder nur Metadaten? Auf welcher Datenklassifikation basiert das? +5. Wie wird Endkunden-Zustimmung eingeholt, falls Support-Tickets KI-verarbeitet werden? +6. Wie werden Halluzinationen kontrolliert (Mensch-im-Loop, Confidence-Schwellen, Quellen-Citation)? +7. Wer haftet bei falschen KI-Vorschlägen (insbesondere bei Rechnungs-/Vertragsdaten)? +8. Wie wird KI-Output protokolliert und auditiert? + +--- + +## 9. V1-Scope + +1. Endgültige V1-Kundenzahl: 1–50 oder 1–500? (Empfehlung: 1–50, Roadmap-Wert) +2. Kundenportal in V1 oder V2? (Empfehlung: V2) +3. KI-Assistent in V1 oder V2? (Empfehlung: V2) +4. SEPA-Lastschrift in V1 oder V2? (Empfehlung: V2 oder vollständiges Modell jetzt) +5. PayPal/Wero in V1: reine Anzeige oder Integration? +6. Welche Mahnwesen-Funktionalität ist V1-Minimum (Status „überfällig" + manuelle Mail)? +7. Welche Tax-/MwSt-Funktionalität ist V1-Minimum? +8. Welche DSGVO-Funktionen sind V1-Pflicht (Auskunft, Löschung, Datenportabilität)? +9. Welche Backup-/Restore-Funktion ist V1-Pflicht? + +--- + +## 10. Deployment und Operations + +1. Self-hosted-only oder SaaS-Variante geplant? Welcher Mix? +2. Welche PHP-Version? Welche Laravel-Version? +3. Welcher Queue-Driver in V1 (Database, Redis)? +4. Welche Backup-Strategie pro Mandant? +5. Welche Disaster-Recovery-Strategie? +6. Welche Logging-/Monitoring-Tools (Sentry, Loki, Grafana, Telemetry-Provider)? +7. Welcher CI/CD-Stack? +8. Welche Update-/Migration-Strategie auf Kundensystemen (bei Self-hosted)? +9. Welche Update-Strategie für Module unabhängig vom Core? + +--- + +## 11. Lizenz und Geschäftsmodell + +1. Welche Open-Source-Lizenz, oder Closed-Source? +2. Welche kommerzielle Lizenz für Mandanten? +3. Werden Module einzeln verkauft, oder als Bundle? +4. Wer darf Module von Drittanbietern entwickeln und verteilen? +5. Wie wird das Versprechen „europäisch" geschäftlich umgesetzt (Hosting-Region, Subprozessoren, Vertragsrecht)? + +--- + +Diese Liste ist nicht vollständig, aber priorisiert. Die Punkte unter 1, 2, 4 und 5 sind harte Blocker für Codebeginn. Die übrigen können in v0.2 oder begleitend zur ersten Implementierungsphase entschieden werden. diff --git a/reviews/claude-review-20260518-042429.md b/reviews/claude-review-20260518-042429.md new file mode 100644 index 0000000..3a5321a --- /dev/null +++ b/reviews/claude-review-20260518-042429.md @@ -0,0 +1,94 @@ +## Kritische Architekturprobleme + +### 1. Fataler Tenant-Isolation-Fehler + +Das Datenmodell nennt sowohl `organisation_id` als auch `tenant_id`, aber ohne klare Abgrenzung. Dies ist ein **kritischer Designfehler**: + +``` +# Problem in data-model-v0.1.md: +"Von Anfang an vorbereiten: +- organisation_id +- tenant_id" +``` + +**Warum kritisch:** +- Unklare Hierarchie zwischen Organisation und Tenant +- Potenzielle Tenant-Leaks durch falsche Filterung +- Kein explizites Constraint-Modell definiert + +**Lösung erforderlich:** Eine klare Entscheidung - entweder Organisation ODER Tenant, nicht beides halbherzig. + +### 2. Secrets-Management ohne Implementierung + +Das Security-Dokument behauptet: +``` +"Secrets werden nur über einen Secret-Service gelesen/geschrieben" +``` + +Aber: +- Kein Secret-Service definiert +- Registrar-Account hat "Zugangsdaten/API-Referenzen" direkt im Modell +- Keine Encryption-at-Rest-Strategie + +**Risiko:** Passwörter landen im Klartext in der Datenbank. + +### 3. Audit-Log Hash-Chain ist Pseudo-Security + +ADR 0014 schlägt eine Hash-Chain vor, aber: +- Kein Schutz gegen DB-Admin-Manipulation +- Hash-Algorithm nicht spezifiziert +- "V1 bereitet vor" = wird nicht implementiert + +**Problem:** Security-Theater ohne echten Schutz. Ein DB-Admin kann die gesamte Chain neu berechnen. + +### 4. Dead Letter Queue ohne Retention-Strategie + +ADR 0017 fordert Dead Letter Queues, aber: +- Keine maximale Retention definiert +- Potenzielle Speicher-Explosion +- DSGVO-Konflikt bei personenbezogenen Daten in fehlgeschlagenen Jobs + +### 5. Fehlende Core-Domain-Boundaries + +Das Datenmodell mischt alles: +- Billing (Rechnung, Zahlung) +- Provisioning (Server, Hostingpaket) +- CRM (Kunde, Ticket) +- Registry (Domain, Registrar) + +**Problem:** Keine Bounded Contexts = massive Kopplung, unmöglich zu skalieren. + +### 6. Reconciliation ohne Event-Sourcing + +ADR 0017 fordert Reconciliation, aber das Datenmodell hat keine Event-Historie. Wie soll man reconcilen ohne zu wissen, was passiert ist? + +### 7. Security-Rollen ohne Scope-Definition + +"Staff/Support" hat Zugriff auf "operative Daten" - was heißt das konkret? +- Kann Support Passwörter sehen? +- Kann Support Rechnungen ändern? +- Kann Support Server-Zugänge einsehen? + +### 8. Single Point of Failure: tenant_id + +Alles hängt an einem einzigen Feld. Ein fehlerhafter Query-Scope = Datenleck über alle Mandanten. + +**Fehlende Sicherheitsschicht:** +- Kein Row-Level-Security auf DB-Ebene +- Keine Tenant-Context-Validierung +- Kein Fail-Safe-Mechanismus + +### 9. Dokument-Objekt ohne Storage-Strategy + +"Dokument" hat "Hashes" und "Archivinformationen", aber: +- Wo werden Dateien gespeichert? +- Wie wird Tenant-Isolation im Filesystem sichergestellt? +- Was passiert bei Löschanfragen? + +### 10. Keine Migrationsstrategie für Multi-Tenancy + +"V1 arbeitet als Single-Tenant" aber "Struktur vorbereitet" - das ist ein Widerspruch. Entweder man designed multi-tenant von Anfang an oder man plant eine Migration. Beides fehlt. + +## Fazit + +Die Architektur versucht, zu viele Probleme gleichzeitig zu lösen, ohne eines davon richtig zu durchdenken. Kritischster Punkt: Die Tenant-Isolation ist nur oberflächlich geplant und wird mit hoher Wahrscheinlichkeit zu Datenleaks führen. \ No newline at end of file diff --git a/reviews/claude-review-placeholder.md b/reviews/claude-review-placeholder.md new file mode 100644 index 0000000..018fa98 --- /dev/null +++ b/reviews/claude-review-placeholder.md @@ -0,0 +1,9 @@ +# Claude Review Placeholder + +Hier können spätere Claude-Reviews abgelegt werden. + +Empfohlene Nutzung: +- Architektur kritisch prüfen lassen +- Sicherheitsrisiken identifizieren +- V1-Scope hinterfragen +- Datenmodell kommentieren lassen diff --git a/reviews/claude-review-response-map-v0.3.md b/reviews/claude-review-response-map-v0.3.md new file mode 100644 index 0000000..057d4ef --- /dev/null +++ b/reviews/claude-review-response-map-v0.3.md @@ -0,0 +1,123 @@ +# Claude Review Response Map v0.3 + +## Zweck +Dieses Dokument zeigt, welche Claude-Risiken durch dieses Update adressiert wurden. + +## Bereits adressiert + +### R-01 Mandantenfähigkeit +Adressiert durch: +- ADR 0004 Tenancy-Modell +- ADR 0005 Datenbankwahl +- security-and-rights-v0.2.md + +### R-02 Anbieterlogik im Core +Adressiert durch: +- ADR 0008 External-Reference-Pattern +- data-model-v0.2-direction.md + +### R-03 Billing im Core +Adressiert durch: +- ADR 0009 Core-Grenzen +- module-structure-v0.2.md +- data-model-v0.2-direction.md + +### R-04 Modulstruktur widersprüchlich +Adressiert durch: +- ADR 0022 Dokumentenhierarchie +- module-structure-v0.2.md + +### R-05 Secrets-Management +Adressiert durch: +- ADR 0010 Secrets-Management + +### R-06 Core zu groß +Adressiert durch: +- ADR 0009 Core-Grenzen +- core-architecture-v0.2.md + +### R-07 GoBD-Verantwortlichkeit +Adressiert durch: +- ADR 0011 GoBD-Verantwortlichkeit + +### R-08 DSGVO-Löschung vs. Retention +Adressiert durch: +- ADR 0021 DSGVO-Löschung und Retention + +### R-09 API-Auth +Adressiert durch: +- ADR 0006 Auth-Strategie + +### R-10 Datenbankwahl +Adressiert durch: +- ADR 0005 Datenbankwahl + +### R-11 KI in V1 +Adressiert durch: +- ADR 0019 V1-Scope-Finalisierung + +### R-12 SEPA ohne Modell +Adressiert durch: +- ADR 0019 V1-Scope-Finalisierung + +### R-13 V1-Scope widersprüchlich +Adressiert durch: +- ADR 0019 V1-Scope-Finalisierung +- roadmap/v1-scope-v0.2.md + +### R-14 Audit-Unveränderbarkeit +Adressiert durch: +- ADR 0014 Audit-Log-Strategie + +### R-16 Steuer-/MwSt-Logik +Adressiert durch: +- ADR 0015 Tax- und VAT-Strategie + +### R-18 Adapter-Fehlerresilienz +Adressiert durch: +- ADR 0017 Adapter-Fehlerresilienz + +### R-20 Nummernkreise +Adressiert durch: +- ADR 0023 Nummernkreise + +### R-21 Personen-/Adressmodell +Adressiert durch: +- ADR 0013 Kunden-/Adress-/Kontaktmodell + +### R-23 Frontend-Strategie +Adressiert durch: +- ADR 0012 Frontend-Strategie + +### R-25 Modul-Lifecycle +Adressiert durch: +- ADR 0016 Modul-Lifecycle + +### R-28 Dokumentenhierarchie +Adressiert durch: +- ADR 0022 Dokumentenhierarchie + +## Noch nicht vollständig adressiert + +### R-15 Tenant-Offboarding +Teilweise durch ADR 0021 vorbereitet. +Braucht später eigenes Dokument. + +### R-19 API-Versionierungsstrategie +Teilweise durch api-strategy-v0.2 adressiert. +Braucht später API-Conventions-Datei. + +### R-22 WordPress-Plugin-Sicherheitsmodell +Teilweise durch ADR 0018 adressiert. +Später konkreter. + +### R-24 Barrierefreiheit +Noch offen. +Relevant für Customer Portal V2. + +### R-26 Logging-/Audit-Sink-Architektur +Teilweise durch ADR 0014 adressiert. +Braucht später Logging-Strategy v0.2. + +### R-27 Spekulative Felder +Wird durch data-model-v0.2-Überarbeitung behandelt. diff --git a/reviews/claude-review-round1.md b/reviews/claude-review-round1.md new file mode 100644 index 0000000..8d4c806 --- /dev/null +++ b/reviews/claude-review-round1.md @@ -0,0 +1,289 @@ +# Architecture Review – Runde 1 + +**Reviewer:** Claude (kritischer Senior Architect / Platform Engineer) +**Reviewed:** Hosting-Backoffice v0.1 – vollständiger Basisbestand (49 Dateien) +**Datum:** 15. Mai 2026 +**Stand:** v0.1 Konzeptphase, vor Entwicklungsbeginn + +--- + +## Gesamtanalyse + +Hosting-Backoffice befindet sich in einer ungewöhnlich gut dokumentierten v0.1-Konzeptphase. ADR-Kultur, explizite Non-Goals, ein erkanntes Adapter-Pattern und eine konsistente Vision sind mehr Strukturhygiene, als die meisten Projekte in dieser Phase vorweisen. + +Genau diese Stärken erschweren aber die ehrliche Bewertung. Die Dokumentenmenge täuscht über das tatsächliche Spezifikationsniveau hinweg. Mehrere zentrale Architekturentscheidungen sind nicht entschieden, sondern als „vorbereiten" umschrieben – Mandantenfähigkeit, Datenbankwahl, API-Authentifizierung, Modul-Contract, Secrets-Management, Audit-Unveränderbarkeit, Frontend-Strategie. „Vorbereiten" ist in Softwarearchitektur fast immer das Synonym für „später unter Schmerzen nachrüsten". + +Das zweite Grundmuster ist innere Widersprüchlichkeit. Strategie-Dokumente, Modulbeschreibungen, Roadmap und MVP-Liste erzählen an mehreren Stellen unterschiedliche Geschichten: + +- V1-Zielgröße: 1–500 Kunden (Vision) vs. 1–50 Kunden (Roadmap/MVP) +- KI-Assistent: V1-Modul vs. V2-Roadmap-Eintrag +- Kundenportal: eigenes V1-Modul vs. fehlt in MVP-Muss-Funktionen +- Billing/Customer-Portal: existieren als Modul-Dokument, aber tauchen in `module-structure-v0.1.md` weder unter Service- noch unter Integrationsmodulen auf +- Adapter-Pattern („Core kennt keine Anbieterlogik") vs. Datenmodell (`Server.KeyHelp-Referenz`) +- Mandantenfähigkeit: zwei IDs (`organisation_id` + `tenant_id`) ohne erklärte Beziehung + +Diese Inkonsistenzen sind keine Schönheitsfehler. Sie zeigen, dass Strategie- und Modul-Dokumente unabhängig voneinander gewachsen sind, ohne dass eine Quelle die andere kontrolliert. Bevor Code geschrieben wird, muss die Modul-Struktur zur einzigen verbindlichen Wahrheit erhoben werden – sonst entstehen drei verschiedene Implementierungen aus drei verschiedenen Dokumenten. + +Die zentrale Empfehlung dieses Reviews ist nicht „Stoppt das Projekt" und auch nicht „Macht weiter wie geplant". Sie lautet: **Entscheidet jetzt eine begrenzte Anzahl harter Architekturfragen, reduziert V1 weiter, und stellt sicher, dass die Adapter-/Modul-Architektur nicht durch das Datenmodell sabotiert wird.** Alles andere lässt sich später korrigieren. Diese drei Punkte nicht. + +Das Projekt ist gut positioniert, schlank zu bleiben. Es ist gleichzeitig schlecht positioniert, modular zu bleiben. Beide Eigenschaften kollidieren in der aktuellen Core-Größe. + +--- + +## Architekturkritik + +**Der Core ist faktisch die ganze Anwendung.** +Die Aussage „Core enthält ausschließlich zentrale Plattformlogik" wird durch die Core-Liste sofort widerlegt: Kunden, Verträge, Produkte, Domains, Hostingpakete, Server, Dokumente, Benachrichtigungen, plus Identity/RBAC/Audit/API/Settings. Das sind 13 Bereiche, davon mindestens 6 (Domains, Hostingpakete, Server, Dokumente, Notifications, Produkte) klare Service-Domänen mit eigener Geschäftslogik. Wenn diese sechs Bereiche im Core leben, gibt es genau einen Bounded Context, und das System ist per Definition ein Monolith mit angeflanschten Integrationen – exakt das, was in der Vision vermieden werden soll. Modularität entsteht nicht durch Modul-Verzeichnisse, sondern durch klare Bounded Contexts mit eigenen Datenmodellen und definierten Kontrakten. + +**„API-first" wird nicht konsequent durchgehalten.** +„API-first" ist in den Strategiepapieren proklamiert, aber: +- Frontend-Strategie ist offen („Blade oder später Vue/Nuxt") – das ist mit echtem API-first nicht vereinbar +- Es existiert kein API-Vertrag (kein OpenAPI/Stoplight/etc.), keine spec-first-Disziplin +- Auth-Strategie ist nicht entschieden („Tokenbasiert, später OAuth/Sanctum möglich") +- Idempotenz, Pagination, Filterung, Error-Modell sind nicht beschrieben +- Versionierung beschränkt sich auf URL-Path (`/api/v1/`), ohne Deprecation/Sunset-Strategie + +Solange die API kein Vertrag vor dem ersten Endpoint ist, ist „API-first" Marketing, nicht Architektur. + +**Adapter-Pattern und Datenmodell widersprechen sich direkt.** +Das Adapter-Pattern wird als zentrales Architekturprinzip beschrieben („Core kennt keine direkte Anbieterlogik"). Im Datenmodell stehen aber `Server.KeyHelp-Referenz` und `Rechnung.externes System` als Core-Felder. Das ist nicht ein bisschen unsauber – das ist genau der Verstoß gegen das eigene Pattern. Sobald V1 mit dieser Schema-Form deployt wird, ist das Adapter-Pattern auf Konzept-Ebene tot. + +**Mandantenfähigkeit ist eine Absichtserklärung, kein Design.** +Das Multi-Tenancy-Dokument beschreibt nur Ziele, nicht den Mechanismus. Zwei ID-Spalten auf jeder Tabelle (`tenant_id` und `organisation_id`, ohne dass deren Verhältnis erklärt ist) sind keine Multi-Tenancy. Ohne entschiedenes Isolationsmodell (Scope-basiert, Schema-basiert, DB-basiert) und ohne enforcement-Mechanismus (Global Scope, Row-Level Security, Connection-Switching) ist V1 ein Single-Tenant-System, das *behauptet*, vorbereitet zu sein. Diese Behauptung trägt nicht in V3, wenn Reseller-Strukturen kommen sollen. + +**Daten im Core, Logik in Modulen – das klassische Anti-Pattern.** +`Rechnung` und `Zahlung` stehen im Core-Datenmodell. Billing-Logik ist als Modul gedacht und über externe Integrationen (Lexware, Invoice Ninja) angebunden. Das ergibt: Module schreiben in Core-Tabellen, kennen also das Core-Schema, und jede Schema-Änderung im Core bricht Module. Saubere Variante: Billing ist eine eigene Bounded-Context-Domäne mit eigenem Datenmodell, der Core kennt höchstens eine `InvoiceReference`-Tabelle ohne semantische Tiefe. + +**WordPress-Plugin ist eine zweite Datensphäre ohne Sicherheitsmodell.** +Die Entscheidung gegen WordPress als Core ist richtig und gut begründet (ADR 0001). Die Folgekosten sind aber unterschätzt: Das Plugin ist ein vollständiger API-Client mit eigener Session-Domäne, eigenem Update-Zyklus, eigener Plugin-Ökosystem-Risikofläche und eigener Auth-Brücke zu Hosting-Backoffice. Was passiert, wenn die WP-Site kompromittiert ist – welche API-Rechte hatte das Plugin? Gibt es Scope-begrenzte Tokens? Wer ist Mandant aus Sicht der API, wenn ein WP-User auf das Plugin klickt? Diese Fragen sind nicht beantwortet, und Plugin-Entwicklung kann nicht beginnen, bevor sie es sind. + +--- + +## Core- und Modulbewertung + +Die Modulstruktur in `module-structure-v0.1.md` ist nicht die einzige Quelle der Wahrheit. Sie listet weniger Module, als das Repository tatsächlich definiert. Vor allem fehlen **Billing** und **Customer Portal** in der Struktur, obwohl sie eigene Modul-Dokumente haben. Vor dem Codebeginn muss diese Liste verbindlich und vollständig sein. + +**Was sinnvoll im Core gehört (kleinster nötiger Core):** +- Identity / Authentication (User, Tenant) +- RBAC / Policy +- Audit Trail (append-only) +- Settings / Configuration +- Module Registry & Lifecycle +- Event Bus / Notification Routing (Routing, nicht Channels) +- Tenant Scope Enforcement + +**Was aktuell im Core ist und herausgeschoben werden sollte:** +- Domains → eigene Domäne (Service-Modul) +- Hostingpakete → eigene Domäne (Service-Modul) +- Server → eigene Domäne (Service-Modul) +- Dokumente / Content → Document-Archive-Modul (existiert bereits separat – warum dann auch im Core?) +- Notifications (Channels, nicht Routing) → eigenes Modul oder Adapter +- Produkte → entweder zu Billing-Domäne oder eigene kleine Domäne + +**Module, die fehlen oder unscharf sind:** +- **Billing/Invoicing-Domäne** als eigenständige Service-Domäne (heute im Core-Datenmodell, in Modul-Beschreibung unspezifisch) +- **Mahnwesen / Offene Posten** – „kein Payment-System" heißt nicht „kein Forderungsmanagement" +- **DNS-Management** – gehört nicht in Domain-Verwaltung +- **Provisioning** – Hostingpaket-Lifecycle ist eigene Domäne +- **Tenant-Lifecycle** (Onboarding, Suspend, Offboarding, Export) +- **Secrets-Vault** für Registrar-/Provider-Credentials +- **Reporting/Export** (GoBD-Z3-Export, DSGVO-Auskunft) +- **Webhooks / Outbound-Events** – für API-first praktisch zwingend +- **Tax/VAT-Logik** (kein Wort zu MwSt, OSS, Reverse Charge B2B EU) + +**Modul-Contract muss formalisiert werden.** +„Definierte Interfaces" reicht nicht. Konkret zu spezifizieren: +- Wie ist ein Modul aufgebaut (Composer-Package, in-app Namespace, Nwidart-Module) +- Wie deklariert ein Modul Abhängigkeiten zur Core-API-Version +- Wie kommunizieren Module untereinander (Events? Service-Contracts? Beides?) +- Was passiert bei Deinstallation eines Moduls mit existierenden Daten und Referenzen +- Wie sind Migrationen pro Modul versioniert und mit Core-Migrationen verzahnt + +--- + +## Datenmodellbewertung + +Das Dokument `data-model-v0.1.md` ist kein Datenmodell. Es ist eine Objektliste mit Feldnamen. Die schwierigen Teile fehlen vollständig: Beziehungen, Kardinalitäten, Lebenszyklen, Statusmaschinen, Nummernkreise, Aggregat-Grenzen. + +**Konkrete Probleme im aktuellen Stand:** +- `Server.KeyHelp-Referenz` und `Rechnung.externes System` verdrahten konkrete Anbieter im Core und brechen das Adapter-Pattern. Saubere Form: generische `external_references`-Tabelle mit `owner_type`, `owner_id`, `adapter_id`, `external_id`, `metadata`. +- `Registrar-Account.Zugangsdaten/API-Referenzen` impliziert Credentials im Core-Datenmodell. Es darf keine Credential-Spalten in DB-Tabellen geben – nur Referenzen in einen Vault. +- `Kunde` enthält „Stammdaten + Ansprechpartner + Kontaktdaten" als undifferenziertes Bündel. Klassisches Anti-Pattern. Üblich: `Party` (Person/Organisation) + `Address` (mit Verwendungszweck) + `ContactPoint`. DSGVO-Auskunft und -Löschung werden sonst sehr teuer. +- `organisation_id` + `tenant_id` parallel ohne erklärte Semantik – entweder Duplikat (eines streichen) oder Hierarchie (dann benennen und Modell zeigen). +- B2B/B2C-Unterscheidung fehlt komplett – beeinflusst Steuer, AGB, Widerrufsrecht, Rechnungsfelder. +- Nummernkreise (Kundennummer, Vertragsnummer, Rechnungsnummer) – pro Mandant lückenlos, GoBD-konform – nirgends modelliert. + +**Was im Datenmodell fehlt:** +- Statusmaschinen für Vertrag, Domain, Hostingpaket, Ticket, Rechnung mit erlaubten Übergängen +- Beziehungstabellen explizit (Many-to-many: Vertrag–Produkt? Domain–Vertrag? Hostingpaket–Vertrag?) +- Subscription-/Recurring-Logik (Laufzeit, Up-/Downgrade, Pro-rata) +- Soft-Delete vs. Archivierung vs. DSGVO-Löschung – diese drei Anforderungen konkurrieren und müssen entschieden werden +- Audit-Log-Schema (was wird wie granular geloggt, append-only-Mechanismus) +- Versionierung von Belegen (für GoBD: unveränderbar nach Festschreibung) +- Datei-/Asset-Modell mit Hashes, Content-Addressing, Versionen + +**Empfehlung:** +Vor dem Codebeginn sollte ein vollständiges ER-Modell (z.B. dbdiagram.io oder vergleichbar) entstehen, das Beziehungen, Kardinalitäten und mindestens die wichtigsten Statusmaschinen zeigt. Aus dem aktuellen Objektliste-Format lassen sich keine sauberen Migrationen ableiten. + +--- + +## API-Bewertung + +Die API-Strategie und API-Conventions sind die schwächsten Dokumente im Bestand, gemessen daran, dass „API-first" das zentrale Architekturversprechen ist. + +**Was vorhanden ist:** +- URL-Path-Versionierung (`/api/v1/`) +- Ressourcen-Endpoints sinnvoll benannt +- Konsistentes Antwortformat (`data`, `meta`, `errors`) +- Bewusstsein für Auth, Rechteprüfung, Rate-Limiting, Logging + +**Was fehlt:** +- **Spec-first**: Kein OpenAPI/AsyncAPI-Dokument. Ohne maschinenlesbare API-Spec gibt es keinen Vertrag, kein Contract-Testing, keinen Client-Generator, kein verbindliches Schema. Für API-first ist OpenAPI 3.x die Mindestanforderung. +- **Auth-Strategie konkret**: „Tokenbasiert, später OAuth/Sanctum" mischt Konzeptebenen. Konkret zu entscheiden: Sanctum Personal Access Tokens (gut für M2M und einfache Clients), Sanctum SPA-Mode (für eigenes Frontend), oder Passport/OAuth2 (für Drittanbieter-Apps). Antwort: vermutlich Sanctum für V1 (alles), Passport in V2/V3 wenn das WP-Plugin von Mandant zu Mandant deployed wird. +- **Idempotenz**: Bei `POST` auf Domain-Registrierung, Vertragsanlage, Rechnungserstellung essentiell. Idempotency-Key-Header sollte Standard sein. +- **Pagination-Strategie**: Offset/Limit, Cursor, Page? Cursor ist für skalierende APIs robuster. +- **Filtering & Sorting**: einheitliches Schema (z.B. `filter[status]=open`, `sort=-created_at`). +- **Error-Modell**: Problem Details (RFC 7807) ist Standard – kein einzelnes Wort dazu. +- **Deprecation/Sunset**: `/api/v2/` ohne Strategie, wie alte Versionen abgekündigt werden. +- **Webhooks**: Out-of-band Notifications nach außen (an WordPress-Plugin, an Integratoren) sind in den V1-Plänen unsichtbar. +- **Rate-Limit pro Mandant**: nicht nur pro IP/Token, sondern pro Tenant-Budget. + +**Empfehlung:** +Bevor der erste Endpoint implementiert wird, sollte ein OpenAPI-Stub mit den ~20 wichtigsten Ressourcen und Auth-Flows entstehen. Daraus folgen Controller-Skelette, Resource-Klassen und Validation Rules praktisch automatisch. + +--- + +## Mandantenfähigkeitsbewertung + +Dies ist der größte einzelne Risikobereich des Projekts. + +**Aktueller Stand:** +- Multi-Tenancy-Strategie listet Ziele, keinen Mechanismus +- V1 ist explizit Single-Tenant +- `tenant_id` und `organisation_id` werden auf alle Tabellen gehängt +- Sicherheitsprinzip lautet: „Mandanten dürfen niemals auf fremde Daten zugreifen" + +**Was problematisch ist:** +1. **„Vorbereiten" ohne Mechanismus** ist keine Vorbereitung. Wenn V1 ohne Tenant-Scope-Enforcement implementiert wird (Global Scopes, Policy-Checks, RLS, Connection-Switching), wird jede Query, jede Policy, jeder Job, jeder Cache-Key, jeder Webhook und jede Integration beim Multi-Tenant-Schritt aufgegriffen werden müssen. +2. **Zwei IDs ohne erklärtes Modell.** Falls die Doppelung eine Hierarchie meint (z.B. Plattformbetreiber → Reseller-Organisation → Mandant), muss das ER-Modell die Hierarchie zeigen. Falls beides Synonym ist, muss eines weg. +3. **Tenant-Lifecycle nirgends modelliert.** Provisioning, Suspend, Termination, Datenexport, Datenmigration, Offboarding – keine dieser Operationen ist beschrieben. Bei DSGVO-Beendigung muss ein Mandant seine Daten innerhalb angemessener Frist erhalten und der Plattformbetreiber sie löschen können (mit GoBD-Vorbehalt). +4. **Cross-Tenant-Datenflüsse** (z.B. shared Templates, shared Knowledge Base, shared Module Registry) – architektonisch nicht vorgesehen, aber realistisch. + +**Empfehlung:** +- Tenancy-Modell *jetzt* entscheiden – mein Vorschlag: Shared Database, Tenant-ID-Scope, Row-Level Security on Postgres als zweite Verteidigungsschicht. Begründung: gut testbar, ein Schema, gute Migration-Hygiene, RLS als Defense-in-Depth, später ohne Datenstruktur-Bruch auf DB-per-Tenant für Premium-Mandanten erweiterbar. +- Tenant-Scope von Tag 1 als Global Scope auf allen mandantenscoped Eloquent-Modellen. +- Verpflichtende Tenant-ID-Spalte auf allen mandantenrelevanten Tabellen mit FK, NOT NULL, indexed. +- Audit-Test in CI: keine Query ohne Tenant-Scope (statische Analyse oder Runtime-Assertion). +- Klarstellung `organisation_id` vs. `tenant_id` mit ER-Modell. + +--- + +## V1-Scope-Bewertung + +V1 hat ein klares Erfolgsversprechen („Ordnung schaffen für kleine Anbieter mit 1–50 Kunden"), das durch die V1-Non-Goals-Disziplin unterstützt wird. Allerdings ist V1 intern nicht konsistent und an mehreren Stellen ambitionierter, als das Erfolgsversprechen rechtfertigt. + +**Was widersprüchlich oder zu groß ist:** +- **KI-Assistent** ist v0.1-Modul, aber Roadmap listet KI in V2. KI bringt DSGVO-Subprozessor-Komplexität (Auftragsverarbeitung, Drittlandtransfer), die V1 nicht braucht. Empfehlung: aus V1 raus, in V2 zusammen mit WordPress-Plugin. +- **Customer Portal** ist v0.1-Modul, fehlt aber in den MVP-Muss-Funktionen. Empfehlung: explizit entscheiden. Wenn V1 kein Kundenportal hat, sind viele Folgekosten weg (Self-Service-Auth, BFSG, AGB-Annahme). Wenn ja, dann mit reduziertem Funktionsumfang. +- **SEPA-Lastschrift** als V1-Zahlungsart ohne SEPA-Modell (Mandate, UMR, Pre-Notification, IBAN-Speicherung). Empfehlung: Lastschrift aus V1 raus oder Modell ergänzen. +- **1blu Business** + **KeyHelp** als V1-Integrationen mit Import-Funktion – realistisch für 3–5 Pilotkunden, aber **API-Sync** sollte explizit V2 bleiben (steht so in der Roadmap, sollte aber auch im V1-Modul-Dokument klargestellt sein). +- **PayPal, Wero** als V1-Zahlungsarten – sind Zahlungsarten reine Anzeige/Status (dann OK) oder Integrationen (dann viel mehr Aufwand)? Aktuell mehrdeutig. + +**Was in V1 fehlt und gebraucht wird:** +- **Steuer-/MwSt-Logik** mindestens minimal (deutscher Standardfall, mit Erweiterbarkeit für EU-OSS) +- **Mahnwesen** mindestens als Status („überfällig" + manuelle Erinnerung) – steht in V1-Non-Goals als „eigenes Mahnwesen in voller Tiefe", aber ohne *jegliches* Mahnwesen ist Hosting-Betrieb nicht durchführbar +- **DSGVO-Auskunft** als Funktion (Datenexport pro Endkunde) – wenn V1 wirklich produktiv genutzt wird, ist das Pflicht +- **Nummernkreis-Verwaltung** (mindestens Rechnungs- und Kundennummer pro Mandant) +- **E-Mail-Versand-Infrastruktur** (SMTP/Transactional Mail, SPF/DKIM/DMARC-Hinweise) + +**Empfehlung:** +- V1-Kundenzahl auf 1–50 vereinheitlichen (Roadmap-Wert). +- KI raus aus V1. +- Customer Portal entweder explizit IN oder OUT, mit allen Folgekosten. +- SEPA aus V1 raus oder vollständig modellieren. +- Tax und Nummernkreise als V1-Pflicht ergänzen. + +--- + +## Roadmap-Bewertung + +Die V1→V2→V3-Progression ist als Konzept stimmig. V1 schafft Ordnung, V2 automatisiert, V3 öffnet Plattform-Funktionen. Das Problem liegt in den V1-Vorarbeiten für V2/V3. + +**Was V2/V3 voraussetzt und V1 nicht liefert:** +- V3-Reseller / tiefere Mandantenfähigkeit: setzt voraus, dass V1 strikten Tenant-Scope von Tag 1 hat. V1 hat das aktuell nicht. +- V3-Servermigration: setzt voraus, dass Hostingpaket-Server-Zuordnung versioniert und auditierbar ist. V1 hat heute nur eine direkte Zuordnung ohne History. +- V2-API-Synchronisation: setzt voraus, dass externe Referenzen als generisches Pattern existieren. V1 hat hartkodierte Anbieter-Referenzen. +- V2-WordPress-Plugin: setzt voraus, dass die API ein vollständiger, versionierter, mit Auth-Scopes versehener Vertrag ist. V1 hat „/api/v1/" ohne Vertrag. +- V2-KI-Funktionen: setzt DSGVO-Auftragsverarbeitungsmodell und Subprozessor-Transparenz voraus. Beides fehlt. + +**Empfehlung:** +Die Roadmap sollte um eine Spalte ergänzt werden: *„V1-Voraussetzungen für dieses V2/V3-Feature"*. Jedes V2/V3-Feature, dessen V1-Voraussetzungen heute fehlen, ist entweder ein verstecktes V1-Item oder ein gefährlicher Selbstbetrug. + +--- + +## Empfehlungen für die nächste Arbeitsphase + +Diese Empfehlungen sind die Konsequenz der bisherigen Bewertung. Sie sind in absteigender Priorität sortiert. + +### 1. NOW-Entscheidungen vor Codebeginn + +Zehn Entscheidungen, die *jetzt* fallen müssen: + +1. **Tenancy-Modell konkret entscheiden** (Vorschlag: Shared DB + Tenant-Scope + Postgres RLS) +2. **Datenbank-Engine entscheiden** (Postgres empfohlen, weil RLS, JSONB, transaktionales DDL) +3. **`organisation_id` vs. `tenant_id` klären** und einen davon streichen, oder Hierarchie als ER-Modell +4. **Auth-Stack festlegen** (Vorschlag: Sanctum für V1, Passport für V2 WP-Plugin) +5. **Modul-Container festlegen** (Composer-Packages, Nwidart-Module, oder eigenes Modul-System) +6. **Secrets-Strategie** (Laravel Encryption nicht ausreichend für Mandanten-Credentials; eigener Vault-Service oder externer Secret-Manager) +7. **Frontend-Modell** (Blade-Renderer als API-Konsument *oder* echtes SPA – nicht „später entscheiden") +8. **GoBD-Eigner** (ist Hosting-Backoffice der Beleg-Originalspeicher oder nur Spiegel? Empfehlung: Spiegel) +9. **KI-Assistent V1 oder V2** (Empfehlung: V2) +10. **Customer Portal V1 oder V2** (Empfehlung: V2, falls möglich) + +### 2. Strukturhygiene vor Codebeginn + +- Modulstruktur in `module-structure-v0.1.md` als einzige Wahrheit etablieren. Alle Modul-Dokumente müssen darin gelistet sein. +- Roadmap und MVP-Liste auf gleichen Kundenzahl-Bereich (1–50) bringen. +- Adapter-Pattern-Konformität im Datenmodell herstellen: keine anbieter-spezifischen Felder im Core, generische `external_references`. +- ADRs ergänzen: ADR 0004 (Tenancy-Modell), ADR 0005 (Datenbankwahl), ADR 0006 (Auth-Strategie), ADR 0007 (Modul-Container), ADR 0008 (GoBD-Verantwortlichkeit). + +### 3. Datenmodell auf v0.2 bringen + +- ER-Diagramm mit Beziehungen und Kardinalitäten +- Statusmaschinen für Vertrag, Domain, Hostingpaket, Ticket, Rechnung +- Party/Address/ContactPoint-Trennung statt monolithischem `Kunde`-Objekt +- Nummernkreis-Mechanismus +- Generisches External-Reference-Pattern +- Audit-Log-Schema mit Unveränderbarkeitsmechanismus + +### 4. API-Vertrag vor Endpoint-Implementierung + +- OpenAPI 3.x als verbindliche API-Spezifikation +- Auth-Flows dokumentiert +- Idempotency-, Pagination-, Filtering-, Error-Modell festgelegt +- Webhook-Strategie als eigenes Dokument + +### 5. V1 weiter verschlanken + +- KI raus +- Customer Portal entscheiden (idealerweise raus) +- SEPA raus oder vollständig modellieren +- Aber: Tax, Nummernkreise, einfaches Mahnwesen, DSGVO-Auskunft hinzunehmen + +### 6. Was bewusst nicht jetzt entschieden werden muss + +- SaaS-vs-Self-hosted-Mix +- Konkrete Cloud-Strategie +- Marketplace-/Reseller-Detail +- Mehrsprachigkeit (außer dass UI-Layer das nicht blockiert) +- Mobile App + +Diese Bereiche dürfen in v0.x bleiben – sie sind unkritisch für die Architekturqualität. + +--- + +## Schlussbemerkung + +Hosting-Backoffice ist nicht in der Gefahr, ein schlechtes Produkt zu werden. Vision, Positionierung und Disziplin sind über dem Branchendurchschnitt. Es ist aber in der Gefahr, **als modulares Produkt geplant und als verstecker Monolith gebaut zu werden**, wenn die hier beschriebenen NOW-Entscheidungen nicht vor dem ersten Endpoint fallen. Die einzelnen Probleme sind alle lösbar – aber in Summe und ungelöst sind sie das Material, aus dem teure Refactorings gemacht sind. + +Die nächste Arbeitsphase sollte nicht „mit V1-Implementierung beginnen" heißen, sondern „v0.2 mit den entschiedenen NOW-Punkten herausgeben". Erst dann lohnt sich Code. diff --git a/reviews/open-decisions-for-olaf.md b/reviews/open-decisions-for-olaf.md new file mode 100644 index 0000000..21b7fd3 --- /dev/null +++ b/reviews/open-decisions-for-olaf.md @@ -0,0 +1,62 @@ +# Offene Entscheidungen für Olaf + +## Zweck +Diese Datei sammelt Punkte, bei denen später eine geschäftliche oder strategische Entscheidung nötig ist. + +Technische Architekturentscheidungen wurden soweit sinnvoll vorbereitet. + +## 1. SaaS oder Self-hosted? + +### Kurz erklärt +SaaS bedeutet: +Du betreibst die Software zentral für Kunden. + +Self-hosted bedeutet: +Kunden installieren/betreiben die Software selbst. + +### Empfehlung aktuell +Noch nicht final entscheiden. + +V1 als eigene interne produktive Instanz planen. +Später SaaS-/Self-hosted-Strategie bewerten. + +## 2. Customer Portal in V2 wirklich öffentlich? + +### Kurz erklärt +Ein öffentliches Kundenportal bedeutet, dass Endkunden sich selbst einloggen können. + +### Empfehlung aktuell +V1 ohne öffentliches Portal. +V2 bewusst entscheiden. + +## 3. WordPress-Plugin früh oder später? + +### Empfehlung aktuell +Architektur vorbereiten, aber nicht in V1 bauen. + +## 4. KI-Assistent + +### Empfehlung aktuell +Nicht V1. +In V2 neu bewerten, wenn Datenschutz- und Anbieterfrage klar ist. + +## 5. Zahlungsarten mit Gebühren + +### Kurz erklärt +Ein Zahlungsaufschlag für bestimmte Zahlungsarten kann rechtlich heikel sein. + +### Empfehlung aktuell +Architektur erlaubt Gebührenregeln. +Aktivierung erst nach rechtlicher Prüfung. + +## 6. Invoice Ninja als echte Alternative zu Lexware? + +### Empfehlung aktuell +Als Referenz-/Integrationsziel ja. +Aber GoBD-Rolle sauber prüfen, wenn produktiv für echte Rechnungen genutzt. + +## 7. Marke / Produktname + +### Empfehlung aktuell +Später separat behandeln. +Nicht vor Architektur v0.2 abschließend entscheiden. diff --git a/reviews/perplexity-research-placeholder.md b/reviews/perplexity-research-placeholder.md new file mode 100644 index 0000000..aec65c0 --- /dev/null +++ b/reviews/perplexity-research-placeholder.md @@ -0,0 +1,12 @@ +# Perplexity Research Placeholder + +Hier können spätere Rechercheergebnisse abgelegt werden. + +Themen: +- WHMCS-Alternativen +- KeyHelp API +- Lexware API +- Invoice Ninja CE +- 1blu Export/API +- GoBD-Archivierung +- Wero/Payment-Integration diff --git a/reviews/review-notes-template.md b/reviews/review-notes-template.md new file mode 100644 index 0000000..c9ae385 --- /dev/null +++ b/reviews/review-notes-template.md @@ -0,0 +1,32 @@ +# Review Notes Template + +## Quelle / Modell + + +## Datum + + +## Thema + + +## Wichtigste Erkenntnisse + +- + +## Risiken + +- + +## Vorschläge + +- + +## Entscheidung erforderlich? + +Ja / Nein + +## Übernahme ins Projekt + +- übernehmen +- später prüfen +- verwerfen diff --git a/roadmap/roadmap-v1-v3.md b/roadmap/roadmap-v1-v3.md new file mode 100644 index 0000000..ee6e293 --- /dev/null +++ b/roadmap/roadmap-v1-v3.md @@ -0,0 +1,39 @@ +# Roadmap V1–V3 + +## V1 — Produktiv nutzbare Grundversion + +Ziel: Produktiv nutzbar für kleine Anbieter mit 1–50 Kunden. + +Fokus: +- Kundenverwaltung +- Verträge +- Produkte +- Domains +- Registrar-Import +- Hostingpakete +- Server +- Rechnungsübersicht +- Billing-Integrationen +- Ticketsystem light +- Dokumentenarchiv +- Audit-Logs + +## V2 — Erweiterte Automatisierung + +- API-Synchronisation +- weitere Registrare +- TLD-Regeln +- tiefere KeyHelp-Synchronisation +- KI-Funktionen +- verbessertes Kundenportal +- WordPress-Plugin + +## V3 — Erweiterte Plattformfunktionen + +- Hostingmigrationen +- Serverwechsel +- Mailmigrationen +- Server-Templates +- tiefere Mandantenfähigkeit +- Resellerstrukturen +- erweiterte APIs diff --git a/roadmap/v1-minimum-viable-product.md b/roadmap/v1-minimum-viable-product.md new file mode 100644 index 0000000..cbd51d0 --- /dev/null +++ b/roadmap/v1-minimum-viable-product.md @@ -0,0 +1,38 @@ +# V1 Minimum Viable Product + +## Ziel + +Eine erste stabile und produktiv nutzbare Version für kleine Hostinganbieter mit ca. 1–50 Kunden. + +## Kernziel + +Ordnung schaffen. + +## V1 Muss-Funktionen + +- Kundenverwaltung +- Verträge +- Domains +- Registrar-Import +- Hostingpakete +- Server +- Rechnungsübersicht +- Billing-Integrationen +- Ticketsystem light +- Archivierung +- Audit-Logs + +## Kein Ziel von V1 + +- automatische Provisionierung +- VM-Orchestrierung +- Kubernetes +- automatische Migrationen +- cPanel/Plesk +- große Resellerstrukturen +- Marketplace +- komplexes ERP + +## Erfolgsdefinition V1 + +Ein kleiner Anbieter soll sein Hostinggeschäft organisieren, Kunden zentral verwalten, Domains nachvollziehen, Rechnungen referenzieren und Support professionell bearbeiten können. diff --git a/roadmap/v1-non-goals.md b/roadmap/v1-non-goals.md new file mode 100644 index 0000000..3c92855 --- /dev/null +++ b/roadmap/v1-non-goals.md @@ -0,0 +1,35 @@ +# V1 Non-Goals + +## Grundprinzip + +V1 soll bewusst klein bleiben. + +## Nicht Teil von V1 + +### Infrastruktur +- Cloud-Orchestrierung +- VM-Management +- Kubernetes +- automatische Serverbestellung + +### Hosting +- automatische Provisionierung +- automatische Migrationen +- Plesk/cPanel +- komplexe Serversteuerung + +### Billing +- eigenes Payment-System +- eigene Buchhaltung +- komplexe Steuerlogik +- eigenes Mahnwesen in voller Tiefe + +### Enterprise +- Marketplace +- große Multi-Provider-Systeme +- komplexe Resellerstrukturen +- Enterprise-Ticketsystem + +## Ziel + +Feature-Explosion vermeiden. diff --git a/roadmap/v1-scope-v0.2.md b/roadmap/v1-scope-v0.2.md new file mode 100644 index 0000000..60f6a3a --- /dev/null +++ b/roadmap/v1-scope-v0.2.md @@ -0,0 +1,53 @@ +# V1 Scope v0.2 + +## Zweck +Dieses Dokument ersetzt frühere widersprüchliche V1-Beschreibungen. + +## Zielgruppe V1 +Kleine Anbieter mit 1–50 Kunden. + +## V1-Ziel +Ordnung schaffen und internes Backoffice produktiv nutzbar machen. + +## V1 enthält + +- Admin-/Backoffice-Oberfläche +- Tenant-Grundstruktur +- Benutzer und Rollen +- Kundenverwaltung +- Kontakt-/Adressmodell +- Verträge +- Produkte/Leistungen +- Domains +- 1blu Import +- Server-/Hosting-Zuordnung +- Rechnungsreferenzen +- Lexware-/Invoice-Ninja-Referenzfähigkeit +- Tickets light intern +- Dokumentenablage +- Audit-Logs +- Nummernkreise +- minimale Tax-/VAT-Metadaten +- Secret-Service-Grundlage +- External References + +## V1 enthält nicht + +- vollständiges öffentliches Kundenportal +- WordPress-Plugin +- KI-Assistent +- SEPA-Mandatsverwaltung +- eigenes Payment-System +- eigene führende Rechnungsstellung +- automatische Servermigration +- Plesk/cPanel +- Marketplace +- Cloud-/VM-Provisionierung + +## Erfolgsdefinition +Ein kleiner Anbieter kann seine Kunden, Domains, Hostingpakete, Rechnungsreferenzen und Supportfälle intern professionell verwalten. + +## Wichtig +V1 ist keine WHMCS-Kopie. + +V1 ist ein stabiles internes Hosting-Backoffice. diff --git a/ui/customer-dashboard-concept-v0.1.md b/ui/customer-dashboard-concept-v0.1.md new file mode 100644 index 0000000..b0b5193 --- /dev/null +++ b/ui/customer-dashboard-concept-v0.1.md @@ -0,0 +1,24 @@ +# Customer Dashboard Concept v0.1 + +## Ziel + +Das Kundendashboard zeigt alle wichtigen Informationen eines Kunden auf einen Blick. + +## Bereiche + +- Kundendaten +- aktive Verträge +- Domains +- Hostingpakete +- offene Rechnungen oder Zahlungsstatus +- offene Tickets +- letzte Aktivitäten +- Dokumente + +## Supportkontext + +Bei jedem Ticket soll der Mitarbeiter sofort den Kundenkontext sehen. + +## Zielgefühl + +Der Kunde soll professionell betreut wirken; der Anbieter soll schnell handlungsfähig sein. diff --git a/ui/ui-principles-v0.1.md b/ui/ui-principles-v0.1.md new file mode 100644 index 0000000..445ec65 --- /dev/null +++ b/ui/ui-principles-v0.1.md @@ -0,0 +1,33 @@ +# UI Principles v0.1 + +## Grundprinzip + +Die Oberfläche soll Ordnung schaffen und nicht überfordern. + +## Leitlinien + +- kundenzentriert +- verständlich +- ruhig +- professionell +- keine Enterprise-Überladung +- klare Statusanzeigen +- wenig Klickwege + +## Zentrale Ansicht + +Die Kundenakte ist der wichtigste UI-Bereich. + +Dort sichtbar: +- Stammdaten +- Verträge +- Domains +- Hostingpakete +- Rechnungen +- Tickets +- Dokumente +- Historie + +## Ziel + +Ein Anwender ohne tiefes Entwicklerwissen soll das System sicher bedienen können. diff --git a/vision/product-vision-v0.1.md b/vision/product-vision-v0.1.md new file mode 100644 index 0000000..3e409ec --- /dev/null +++ b/vision/product-vision-v0.1.md @@ -0,0 +1,19 @@ +# Produktvision v0.1 + +Hosting-Backoffice ist ein europäisches, kundenzentriertes Backoffice-System für kleine Hostinganbieter, Webagenturen, Freelancer und IT-Dienstleister. + +Es soll Ordnung in Kunden, Hostingpakete, Domains, Rechnungen, Zahlungen, Support und Dokumentation bringen. + +Das System richtet sich an Anbieter mit 1–500 Kunden und soll bereits ab dem ersten Kunden sinnvoll nutzbar sein. + +## Kernversprechen + +Professionelles Hosting-Backoffice. Einfach ab dem ersten Kunden. + +## Positionierung + +Keine Enterprise-Monsterlösung, kein WHMCS-Klon, sondern ein verständliches, modulares und europäisch ausgerichtetes Hosting-Backoffice. + +## Grundidee + +Der Kunde steht im Mittelpunkt.