From 5c0cd48f5a2e29687f86ff7afe897deaffcf2f03 Mon Sep 17 00:00:00 2001 From: Daniel Holbach Date: Thu, 30 Jul 2026 12:35:35 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20add=20per-client=20"no=20diagnosis"=20o?= =?UTF-8?q?ption=20for=20Geb=C3=BCH=20invoices?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some GebüH clients need the fee-schedule breakdown but must not have a diagnosis line on their invoice. Add a Client.gebueh_no_diagnosis checkbox (default off) that suppresses just that line, on both the invoice PDF and the web invoice detail view. Co-Authored-By: Claude Sonnet 5 --- app/locale/de/LC_MESSAGES/django.po | 312 +++++++++--------- app/locale/en/LC_MESSAGES/django.po | 312 +++++++++--------- app/my_practice/admin.py | 10 +- app/my_practice/forms.py | 2 + .../migrations/0019_gebueh_no_diagnosis.py | 21 ++ app/my_practice/models/client.py | 5 + app/my_practice/tests/test_gebueh.py | 11 + app/templates/my_practice/client_intake.html | 9 + app/templates/my_practice/invoice_detail.html | 2 +- app/templates/my_practice/invoice_pdf_de.html | 2 + app/templates/my_practice/invoice_pdf_en.html | 2 + 11 files changed, 386 insertions(+), 302 deletions(-) create mode 100644 app/my_practice/migrations/0019_gebueh_no_diagnosis.py diff --git a/app/locale/de/LC_MESSAGES/django.po b/app/locale/de/LC_MESSAGES/django.po index 512b29f..45b3f47 100644 --- a/app/locale/de/LC_MESSAGES/django.po +++ b/app/locale/de/LC_MESSAGES/django.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: my-practice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-29 23:11+0200\n" +"POT-Creation-Date: 2026-07-30 12:14+0200\n" "PO-Revision-Date: 2026-06-22 23:01+0200\n" "Language-Team: German\n" "Language: de\n" @@ -22,7 +22,7 @@ msgstr "Grundinformationen" msgid "Basic information about the practice" msgstr "Basis-Informationen über die Praxis" -#: my_practice/admin.py:59 my_practice/forms.py:101 +#: my_practice/admin.py:59 my_practice/forms.py:102 #: my_practice/models/client.py:111 #: templates/my_practice/client_detail.html:483 #: templates/my_practice/practice_form.html:78 @@ -130,26 +130,26 @@ msgstr "Honorare" msgid "Standard hourly rates for this client" msgstr "Standard-Stundensätze für diesen Klienten" -#: my_practice/admin.py:294 my_practice/admin.py:1011 +#: my_practice/admin.py:294 my_practice/admin.py:1019 msgid "Organization" msgstr "Organisation" -#: my_practice/admin.py:297 my_practice/models/client.py:199 +#: my_practice/admin.py:297 my_practice/models/client.py:204 msgid "Tags for organizing and categorizing clients" msgstr "Tags zur Organisation und Kategorisierung von Klienten" -#: my_practice/admin.py:301 my_practice/admin.py:504 +#: my_practice/admin.py:301 my_practice/admin.py:512 msgid "Additional" msgstr "Zusätzliches" -#: my_practice/admin.py:305 my_practice/admin.py:506 my_practice/admin.py:591 -#: my_practice/admin.py:623 my_practice/admin.py:649 my_practice/admin.py:676 -#: my_practice/admin.py:914 +#: my_practice/admin.py:313 my_practice/admin.py:514 my_practice/admin.py:599 +#: my_practice/admin.py:631 my_practice/admin.py:657 my_practice/admin.py:684 +#: my_practice/admin.py:922 msgid "Timestamps" msgstr "Zeitstempel" -#: my_practice/admin.py:310 my_practice/admin.py:847 my_practice/admin.py:1015 -#: my_practice/admin.py:1198 my_practice/models/calendar.py:124 +#: my_practice/admin.py:318 my_practice/admin.py:855 my_practice/admin.py:1023 +#: my_practice/admin.py:1206 my_practice/models/calendar.py:124 #: my_practice/models/clinical.py:318 my_practice/models/inquiry.py:110 #: my_practice/models/invoice.py:90 #: templates/includes/calendar_preflight_widget.html:27 @@ -170,7 +170,7 @@ msgstr "Zeitstempel" msgid "Status" msgstr "Status" -#: my_practice/admin.py:314 my_practice/admin.py:884 my_practice/admin.py:1291 +#: my_practice/admin.py:322 my_practice/admin.py:892 my_practice/admin.py:1299 #: my_practice/models/calendar.py:47 my_practice/models/client.py:182 #: my_practice/models/practice.py:50 templates/my_practice/analytics.html:415 #: templates/my_practice/client_detail.html:11 @@ -180,7 +180,7 @@ msgstr "Status" msgid "Active" msgstr "Aktiv" -#: my_practice/admin.py:316 my_practice/models/calendar.py:47 +#: my_practice/admin.py:324 my_practice/models/calendar.py:47 #: templates/my_practice/client_detail.html:11 #: templates/my_practice/client_list_cards.html:42 #: templates/my_practice/client_list_cards.html:76 @@ -188,38 +188,38 @@ msgstr "Aktiv" msgid "Inactive" msgstr "Inaktiv" -#: my_practice/admin.py:318 +#: my_practice/admin.py:326 msgid "Format" msgstr "Format" -#: my_practice/admin.py:321 my_practice/models/clinical.py:145 +#: my_practice/admin.py:329 my_practice/models/clinical.py:145 msgid "Online" msgstr "Online" -#: my_practice/admin.py:322 +#: my_practice/admin.py:330 msgid "On-site" msgstr "Vor Ort" -#: my_practice/admin.py:324 my_practice/admin.py:628 -#: my_practice/models/client.py:198 +#: my_practice/admin.py:332 my_practice/admin.py:636 +#: my_practice/models/client.py:203 #: templates/my_practice/client_detail.html:418 #: templates/my_practice/client_list_cards.html:26 #: templates/my_practice/tag_list.html:6 msgid "Tags" msgstr "Tags" -#: my_practice/admin.py:345 +#: my_practice/admin.py:353 msgid "Assignment" msgstr "Zuordnung" -#: my_practice/admin.py:351 my_practice/admin.py:537 my_practice/admin.py:697 -#: my_practice/admin.py:792 +#: my_practice/admin.py:359 my_practice/admin.py:545 my_practice/admin.py:705 +#: my_practice/admin.py:800 msgid "Details" msgstr "Details" -#: my_practice/admin.py:358 my_practice/admin.py:585 my_practice/admin.py:672 -#: my_practice/admin.py:1315 my_practice/models/calendar.py:110 -#: my_practice/models/client.py:207 my_practice/models/client.py:258 +#: my_practice/admin.py:366 my_practice/admin.py:593 my_practice/admin.py:680 +#: my_practice/admin.py:1323 my_practice/models/calendar.py:110 +#: my_practice/models/client.py:212 my_practice/models/client.py:263 #: my_practice/models/client_alias.py:32 my_practice/models/clinical.py:170 #: my_practice/models/clinical.py:306 my_practice/models/clinical.py:351 #: my_practice/models/invoice.py:77 my_practice/models/session.py:22 @@ -234,8 +234,8 @@ msgstr "Details" msgid "Client" msgstr "Klient:in" -#: my_practice/admin.py:367 my_practice/admin.py:719 my_practice/forms.py:110 -#: my_practice/forms.py:186 my_practice/import_forms.py:67 +#: my_practice/admin.py:375 my_practice/admin.py:727 my_practice/forms.py:112 +#: my_practice/forms.py:188 my_practice/import_forms.py:67 #: my_practice/models/bank_statement.py:128 my_practice/models/client.py:118 #: my_practice/models/client_alias.py:41 my_practice/models/financial.py:93 #: my_practice/models/inquiry.py:123 my_practice/models/invoice.py:126 @@ -247,68 +247,68 @@ msgstr "Klient:in" msgid "Notes" msgstr "Notizen" -#: my_practice/admin.py:385 my_practice/models/invoice.py:253 +#: my_practice/admin.py:393 my_practice/models/invoice.py:253 msgid "Service Type" msgstr "Leistungsart" -#: my_practice/admin.py:388 my_practice/admin.py:910 +#: my_practice/admin.py:396 my_practice/admin.py:918 msgid "Settings" msgstr "Einstellungen" -#: my_practice/admin.py:391 +#: my_practice/admin.py:399 msgid "Scope" msgstr "Geltungsbereich" -#: my_practice/admin.py:396 +#: my_practice/admin.py:404 msgid "GLOBAL" msgstr "GLOBAL" -#: my_practice/admin.py:436 +#: my_practice/admin.py:444 msgid "Mark as sent" msgstr "Als versendet markieren" -#: my_practice/admin.py:442 +#: my_practice/admin.py:450 #, python-format msgid "%(count)s invoice marked as sent." msgid_plural "%(count)s invoices marked as sent." msgstr[0] "%(count)s Rechnung als versendet markiert." msgstr[1] "%(count)s Rechnungen als versendet markiert." -#: my_practice/admin.py:448 +#: my_practice/admin.py:456 msgid "Mark as paid" msgstr "Als bezahlt markieren" -#: my_practice/admin.py:462 +#: my_practice/admin.py:470 #, python-format msgid "%(count)s invoice marked as paid." msgid_plural "%(count)s invoices marked as paid." msgstr[0] "%(count)s Rechnung als bezahlt markiert." msgstr[1] "%(count)s Rechnungen als bezahlt markiert." -#: my_practice/admin.py:468 +#: my_practice/admin.py:476 msgid "Mark as cancelled" msgstr "Als storniert markieren" -#: my_practice/admin.py:474 +#: my_practice/admin.py:482 #, python-format msgid "%(count)s invoice marked as cancelled." msgid_plural "%(count)s invoices marked as cancelled." msgstr[0] "%(count)s Rechnung als storniert markiert." msgstr[1] "%(count)s Rechnungen als storniert markiert." -#: my_practice/admin.py:484 +#: my_practice/admin.py:492 msgid "Invoice Information" msgstr "Rechnungsinformationen" -#: my_practice/admin.py:496 +#: my_practice/admin.py:504 msgid "Amounts" msgstr "Beträge" -#: my_practice/admin.py:500 +#: my_practice/admin.py:508 msgid "Amounts are calculated automatically from invoice items" msgstr "Beträge werden automatisch aus den Rechnungspositionen berechnet" -#: my_practice/admin.py:511 my_practice/models/invoice.py:263 +#: my_practice/admin.py:519 my_practice/models/invoice.py:263 #: templates/my_practice/bank_review.html:75 #: templates/my_practice/invoice_detail.html:86 #: templates/my_practice/invoice_list.html:21 @@ -316,23 +316,23 @@ msgstr "Beträge werden automatisch aus den Rechnungspositionen berechnet" msgid "Total" msgstr "Gesamt" -#: my_practice/admin.py:535 my_practice/admin.py:616 +#: my_practice/admin.py:543 my_practice/admin.py:624 #: my_practice/models/calendar.py:132 my_practice/models/clinical.py:222 #: my_practice/models/gebueh.py:87 my_practice/models/invoice.py:281 #: my_practice/models/session.py:63 msgid "Session" msgstr "Sitzung" -#: my_practice/admin.py:536 templates/base.html:53 +#: my_practice/admin.py:544 templates/base.html:53 #: templates/my_practice/client_detail.html:51 msgid "Billing" msgstr "Abrechnung" -#: my_practice/admin.py:562 +#: my_practice/admin.py:570 msgid "Log" msgstr "Protokoll" -#: my_practice/admin.py:566 my_practice/admin.py:1251 +#: my_practice/admin.py:574 my_practice/admin.py:1259 #: my_practice/models/invoice.py:133 my_practice/models/invoice.py:250 #: templates/my_practice/bank_review.html:259 #: templates/my_practice/billing_open_overview.html:57 @@ -344,89 +344,89 @@ msgstr "Protokoll" msgid "Invoice" msgstr "Rechnung" -#: my_practice/admin.py:587 +#: my_practice/admin.py:595 msgid "Clinical Fields (Fernet-encrypted)" msgstr "Klinische Felder (Fernet-verschlüsselt)" -#: my_practice/admin.py:596 +#: my_practice/admin.py:604 msgid "Working Diagnosis" msgstr "Arbeitsdiagnose" -#: my_practice/admin.py:617 +#: my_practice/admin.py:625 msgid "Metadata (unencrypted)" msgstr "Metadaten (unverschlüsselt)" -#: my_practice/admin.py:619 my_practice/admin.py:647 my_practice/admin.py:674 +#: my_practice/admin.py:627 my_practice/admin.py:655 my_practice/admin.py:682 msgid "Content (Fernet-encrypted)" msgstr "Inhalt (Fernet-verschlüsselt)" -#: my_practice/admin.py:646 +#: my_practice/admin.py:654 msgid "Client & Status" msgstr "Klient & Status" -#: my_practice/admin.py:654 my_practice/admin.py:681 +#: my_practice/admin.py:662 my_practice/admin.py:689 #: my_practice/models/clinical.py:310 my_practice/models/clinical.py:360 msgid "Content" msgstr "Inhalt" -#: my_practice/admin.py:673 +#: my_practice/admin.py:681 msgid "Metadata" msgstr "Metadaten" -#: my_practice/admin.py:696 templates/my_practice/bank_import.html:120 +#: my_practice/admin.py:704 templates/my_practice/bank_import.html:120 msgid "Withdrawal" msgstr "Entnahme" -#: my_practice/admin.py:702 +#: my_practice/admin.py:710 msgid "Flag for current tax year" msgstr "Für aktuelles Steuerjahr markieren" -#: my_practice/admin.py:711 +#: my_practice/admin.py:719 #, python-format msgid "%(count)s withdrawal found for tax year %(year)s." msgid_plural "%(count)s withdrawals found for tax year %(year)s." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:744 +#: my_practice/admin.py:752 msgid "Mark as tax deductible" msgstr "Als steuerlich absetzbar markieren" -#: my_practice/admin.py:750 +#: my_practice/admin.py:758 #, python-format msgid "%(count)s expense marked as tax deductible." msgid_plural "%(count)s expenses marked as tax deductible." msgstr[0] "%(count)s Ausgabe als steuerlich absetzbar markiert." msgstr[1] "%(count)s Ausgaben als steuerlich absetzbar markiert." -#: my_practice/admin.py:758 +#: my_practice/admin.py:766 msgid "Not tax deductible" msgstr "Steuerlich nicht absetzbar" -#: my_practice/admin.py:764 +#: my_practice/admin.py:772 #, python-format msgid "%(count)s expense marked as not deductible." msgid_plural "%(count)s expenses marked as not deductible." msgstr[0] "%(count)s Ausgabe als nicht absetzbar markiert." msgstr[1] "%(count)s Ausgaben als nicht absetzbar markiert." -#: my_practice/admin.py:772 +#: my_practice/admin.py:780 msgid "Mark as invoice available" msgstr "Mit Rechnung vorhanden markieren" -#: my_practice/admin.py:778 +#: my_practice/admin.py:786 #, python-format msgid "%(count)s expense marked with invoice." msgid_plural "%(count)s expenses marked with invoice." msgstr[0] "%(count)s Ausgabe mit Rechnung markiert." msgstr[1] "%(count)s Ausgaben mit Rechnung markiert." -#: my_practice/admin.py:788 my_practice/models/tag.py:49 +#: my_practice/admin.py:796 my_practice/models/tag.py:49 msgid "General" msgstr "Allgemein" -#: my_practice/admin.py:797 my_practice/forms.py:134 my_practice/forms.py:162 -#: my_practice/import_forms.py:119 my_practice/models/client.py:274 +#: my_practice/admin.py:805 my_practice/forms.py:136 my_practice/forms.py:164 +#: my_practice/import_forms.py:119 my_practice/models/client.py:279 #: my_practice/models/financial.py:180 my_practice/models/gebueh.py:27 #: my_practice/models/inquiry.py:212 my_practice/models/tag.py:84 #: templates/my_practice/expense_confirm_delete.html:23 @@ -439,8 +439,8 @@ msgstr "Allgemein" msgid "Description" msgstr "Beschreibung" -#: my_practice/admin.py:804 my_practice/admin.py:943 my_practice/admin.py:1048 -#: my_practice/forms.py:133 my_practice/forms.py:163 +#: my_practice/admin.py:812 my_practice/admin.py:951 my_practice/admin.py:1056 +#: my_practice/forms.py:135 my_practice/forms.py:165 #: my_practice/import_forms.py:114 my_practice/models/financial.py:99 #: my_practice/models/financial.py:185 my_practice/models/tag.py:77 #: templates/my_practice/bank_expense_review.html:31 @@ -455,7 +455,7 @@ msgstr "Beschreibung" msgid "Category" msgstr "Kategorie" -#: my_practice/admin.py:809 my_practice/admin.py:1218 +#: my_practice/admin.py:817 my_practice/admin.py:1226 #: my_practice/models/bank_statement.py:83 my_practice/models/financial.py:89 #: my_practice/models/financial.py:177 #: templates/my_practice/bank_import.html:86 @@ -476,35 +476,35 @@ msgstr "Kategorie" msgid "Amount" msgstr "Betrag" -#: my_practice/admin.py:839 +#: my_practice/admin.py:847 msgid "Additional Information" msgstr "Zusätzliche Informationen" -#: my_practice/admin.py:852 +#: my_practice/admin.py:860 msgid "Currently Off" msgstr "Aktuell geschlossen" -#: my_practice/admin.py:855 templates/my_practice/time_off_list.html:52 +#: my_practice/admin.py:863 templates/my_practice/time_off_list.html:52 msgid "Upcoming" msgstr "Bevorstehend" -#: my_practice/admin.py:858 templates/my_practice/time_off_list.html:70 +#: my_practice/admin.py:866 templates/my_practice/time_off_list.html:70 msgid "Past" msgstr "Vergangen" -#: my_practice/admin.py:906 +#: my_practice/admin.py:914 msgid "Tag Information" msgstr "Tag-Informationen" -#: my_practice/admin.py:919 +#: my_practice/admin.py:927 msgid "Tag" msgstr "Tag" -#: my_practice/admin.py:958 +#: my_practice/admin.py:966 msgid "Used By" msgstr "Verwendet von" -#: my_practice/admin.py:964 +#: my_practice/admin.py:972 #: templates/my_practice/monthly_billing_overview.html:39 #: templates/my_practice/tag_list.html:56 #, python-format @@ -513,107 +513,107 @@ msgid_plural "%(count)s clients" msgstr[0] "%(count)s Klient" msgstr[1] "%(count)s Klienten" -#: my_practice/admin.py:1007 +#: my_practice/admin.py:1015 msgid "Task Information" msgstr "Aufgabeninformationen" -#: my_practice/admin.py:1019 +#: my_practice/admin.py:1027 msgid "Focus Queue (P-050)" msgstr "Fokus-Warteschlange (P-050)" -#: my_practice/admin.py:1023 +#: my_practice/admin.py:1031 msgid "Set automatically for materialized tasks — not manually editable." msgstr "Wird für materialisierte Aufgaben automatisch gesetzt — nicht manuell editierbar." -#: my_practice/admin.py:1038 my_practice/models/todo.py:149 +#: my_practice/admin.py:1046 my_practice/models/todo.py:149 msgid "Task" msgstr "Aufgabe" -#: my_practice/admin.py:1066 +#: my_practice/admin.py:1074 msgid "Priority" msgstr "Priorität" -#: my_practice/admin.py:1082 templates/includes/focus_queue_row.html:15 +#: my_practice/admin.py:1090 templates/includes/focus_queue_row.html:15 msgid "Mark as completed" msgstr "Als erledigt markieren" -#: my_practice/admin.py:1092 +#: my_practice/admin.py:1100 #, python-format msgid "%(count)s task marked as completed." msgid_plural "%(count)s tasks marked as completed." msgstr[0] "%(count)s Aufgabe als erledigt markiert." msgstr[1] "%(count)s Aufgaben als erledigt markiert." -#: my_practice/admin.py:1100 +#: my_practice/admin.py:1108 msgid "Mark as incomplete" msgstr "Als unerledigt markieren" -#: my_practice/admin.py:1110 +#: my_practice/admin.py:1118 #, python-format msgid "%(count)s task marked as incomplete." msgid_plural "%(count)s tasks marked as incomplete." msgstr[0] "%(count)s Aufgabe als unerledigt markiert." msgstr[1] "%(count)s Aufgaben als unerledigt markiert." -#: my_practice/admin.py:1118 +#: my_practice/admin.py:1126 msgid "Set high priority" msgstr "Hohe Priorität setzen" -#: my_practice/admin.py:1125 +#: my_practice/admin.py:1133 #, python-format msgid "%(count)s task set to high priority." msgid_plural "%(count)s tasks set to high priority." msgstr[0] "%(count)s Aufgabe auf hohe Priorität gesetzt." msgstr[1] "%(count)s Aufgaben auf hohe Priorität gesetzt." -#: my_practice/admin.py:1169 +#: my_practice/admin.py:1177 msgid "Transaction Data" msgstr "Transaktionsdaten" -#: my_practice/admin.py:1181 +#: my_practice/admin.py:1189 msgid "Payment Partner" msgstr "Zahlungspartner" -#: my_practice/admin.py:1187 +#: my_practice/admin.py:1195 msgid "Matching" msgstr "Zuordnung" -#: my_practice/admin.py:1211 +#: my_practice/admin.py:1219 msgid "Payer" msgstr "Zahler" -#: my_practice/admin.py:1229 +#: my_practice/admin.py:1237 msgid "Match" msgstr "Zuordnung" -#: my_practice/admin.py:1264 +#: my_practice/admin.py:1272 msgid "Therapy Practice Management" msgstr "Praxisverwaltung" -#: my_practice/admin.py:1265 +#: my_practice/admin.py:1273 msgid "Payments Admin" msgstr "Zahlungsverwaltung" -#: my_practice/admin.py:1266 +#: my_practice/admin.py:1274 msgid "Welcome to Therapy Practice Management" msgstr "Willkommen bei der Praxisverwaltung" -#: my_practice/admin.py:1319 +#: my_practice/admin.py:1327 msgid "Mark as pending" msgstr "Als ausstehend markieren" -#: my_practice/admin.py:1325 +#: my_practice/admin.py:1333 #, python-format msgid "%(count)s event marked as pending." msgid_plural "%(count)s events marked as pending." msgstr[0] "%(count)s Termin als ausstehend markiert." msgstr[1] "%(count)s Termine als ausstehend markiert." -#: my_practice/admin.py:1331 +#: my_practice/admin.py:1339 msgid "Mark as skipped" msgstr "Als übersprungen markieren" -#: my_practice/admin.py:1337 +#: my_practice/admin.py:1345 #, python-format msgid "%(count)s event marked as skipped." msgid_plural "%(count)s events marked as skipped." @@ -645,33 +645,33 @@ msgstr "Nachricht (Englisch)" msgid "Date of birth" msgstr "Geburtsdatum" -#: my_practice/forms.py:79 +#: my_practice/forms.py:80 msgid "e.g. DE, JM" msgstr "z.B. DE, JM" -#: my_practice/forms.py:80 my_practice/forms.py:98 +#: my_practice/forms.py:81 my_practice/forms.py:99 #: my_practice/models/client.py:101 msgid "Full name" msgstr "Vollständiger Name" -#: my_practice/forms.py:84 +#: my_practice/forms.py:85 msgid "Street, postal code city" msgstr "Straße, PLZ Ort" -#: my_practice/forms.py:87 +#: my_practice/forms.py:88 msgid "e.g. self-pay, Allianz PKV, Beihilfe" msgstr "z.B. Selbstzahler, Allianz PKV, Beihilfe" -#: my_practice/forms.py:94 +#: my_practice/forms.py:95 msgid "Additional notes" msgstr "Zusätzliche Notizen" -#: my_practice/forms.py:97 my_practice/inquiry_forms.py:79 +#: my_practice/forms.py:98 my_practice/inquiry_forms.py:79 #: my_practice/models/client.py:98 msgid "Client code" msgstr "Klientenkürzel" -#: my_practice/forms.py:99 my_practice/models/client.py:109 +#: my_practice/forms.py:100 my_practice/models/client.py:109 #: my_practice/models/inquiry.py:99 #: templates/my_practice/client_detail.html:474 #: templates/my_practice/client_list_cards.html:109 @@ -681,7 +681,7 @@ msgstr "Klientenkürzel" msgid "Email" msgstr "E-Mail" -#: my_practice/forms.py:100 my_practice/models/client.py:110 +#: my_practice/forms.py:101 my_practice/models/client.py:110 #: my_practice/models/financial.py:146 my_practice/models/inquiry.py:100 #: templates/my_practice/bank_expense_review.html:34 #: templates/my_practice/client_detail.html:478 @@ -690,40 +690,44 @@ msgstr "E-Mail" msgid "Phone" msgstr "Telefon" -#: my_practice/forms.py:102 my_practice/models/client.py:115 +#: my_practice/forms.py:103 my_practice/models/client.py:115 #: templates/my_practice/client_detail.html:488 msgid "Cost carrier" msgstr "Kostenträger" -#: my_practice/forms.py:103 my_practice/models/client.py:171 +#: my_practice/forms.py:104 my_practice/models/client.py:171 msgid "Preferred language" msgstr "Bevorzugte Sprache" -#: my_practice/forms.py:104 +#: my_practice/forms.py:105 msgid "Custom Email Salutation" msgstr "Individuelle E-Mail-Anrede" -#: my_practice/forms.py:105 +#: my_practice/forms.py:106 msgid "Active client" msgstr "Aktiver Klient" -#: my_practice/forms.py:106 +#: my_practice/forms.py:107 msgid "Online client (video sessions)" msgstr "Online-Klient (Videositzungen)" -#: my_practice/forms.py:107 +#: my_practice/forms.py:108 msgid "GebüH-Abrechnung" msgstr "GebüH-Abrechnung" -#: my_practice/forms.py:108 +#: my_practice/forms.py:109 my_practice/models/client.py:190 +msgid "No diagnosis on invoice" +msgstr "Keine Diagnose auf Rechnung" + +#: my_practice/forms.py:110 msgid "Fee 60 min (€)" msgstr "Honorar 60 Min (€)" -#: my_practice/forms.py:109 +#: my_practice/forms.py:111 msgid "Fee 90 min (€)" msgstr "Honorar 90 Min (€)" -#: my_practice/forms.py:117 my_practice/forms.py:141 +#: my_practice/forms.py:119 my_practice/forms.py:143 #: my_practice/models/calendar.py:101 my_practice/models/clinical.py:355 #: my_practice/models/financial.py:85 my_practice/models/financial.py:173 #: templates/my_practice/bank_import.html:83 @@ -749,46 +753,46 @@ msgstr "Honorar 90 Min (€)" msgid "Date" msgstr "Datum" -#: my_practice/forms.py:127 +#: my_practice/forms.py:129 msgid "Optional: purpose or notes" msgstr "Optional: Verwendungszweck oder Notizen" -#: my_practice/forms.py:132 my_practice/forms.py:164 +#: my_practice/forms.py:134 my_practice/forms.py:166 msgid "Amount (€)" msgstr "Betrag (€)" -#: my_practice/forms.py:156 +#: my_practice/forms.py:158 msgid "Description of the expense" msgstr "Beschreibung der Ausgabe" -#: my_practice/forms.py:165 my_practice/import_forms.py:132 +#: my_practice/forms.py:167 my_practice/import_forms.py:132 #: my_practice/models/financial.py:188 #: templates/my_practice/bank_expense_review.html:66 #: templates/my_practice/expense_list.html:27 msgid "Tax deductible" msgstr "Steuerlich absetzbar" -#: my_practice/forms.py:166 my_practice/import_forms.py:126 +#: my_practice/forms.py:168 my_practice/import_forms.py:126 #: my_practice/models/financial.py:187 #: templates/my_practice/bank_expense_review.html:62 msgid "Invoice available" msgstr "Rechnung vorhanden" -#: my_practice/forms.py:167 my_practice/models/financial.py:190 +#: my_practice/forms.py:169 my_practice/models/financial.py:190 #: templates/my_practice/expense_list.html:84 #: templates/my_practice/expense_list.html:121 msgid "Filed in tax return" msgstr "In Steuererklärung eingetragen" -#: my_practice/forms.py:174 my_practice/models/timeoff.py:34 +#: my_practice/forms.py:176 my_practice/models/timeoff.py:34 msgid "Start Date" msgstr "Startdatum" -#: my_practice/forms.py:175 my_practice/models/timeoff.py:35 +#: my_practice/forms.py:177 my_practice/models/timeoff.py:35 msgid "End Date" msgstr "Enddatum" -#: my_practice/forms.py:184 my_practice/models/clinical.py:368 +#: my_practice/forms.py:186 my_practice/models/clinical.py:368 #: my_practice/models/timeoff.py:40 templates/my_practice/analytics.html:398 #: templates/my_practice/tax_workday_audit.html:61 #: templates/my_practice/time_off_confirm_delete.html:23 @@ -797,7 +801,7 @@ msgstr "Enddatum" msgid "Type" msgstr "Typ" -#: my_practice/forms.py:185 my_practice/models/timeoff.py:44 +#: my_practice/forms.py:187 my_practice/models/timeoff.py:44 #: templates/my_practice/calendar_approval_queue.html:93 #: templates/my_practice/time_off_confirm_delete.html:19 #: templates/my_practice/time_off_list.html:31 @@ -805,36 +809,36 @@ msgstr "Typ" msgid "Title" msgstr "Titel" -#: my_practice/forms.py:191 +#: my_practice/forms.py:193 msgid "Monday" msgstr "Montag" -#: my_practice/forms.py:192 +#: my_practice/forms.py:194 msgid "Tuesday" msgstr "Dienstag" -#: my_practice/forms.py:193 +#: my_practice/forms.py:195 msgid "Wednesday" msgstr "Mittwoch" -#: my_practice/forms.py:194 +#: my_practice/forms.py:196 msgid "Thursday" msgstr "Donnerstag" -#: my_practice/forms.py:195 +#: my_practice/forms.py:197 msgid "Friday" msgstr "Freitag" -#: my_practice/forms.py:206 my_practice/models/practice.py:295 +#: my_practice/forms.py:208 my_practice/models/practice.py:295 #: templates/my_practice/practice_form.html:261 msgid "Practice days (weekdays)" msgstr "Praxistage (Wochentage)" -#: my_practice/forms.py:207 templates/my_practice/practice_form.html:269 +#: my_practice/forms.py:209 templates/my_practice/practice_form.html:269 msgid "Weekdays on which you commute to the practice." msgstr "Wochentage, an denen Sie zur Praxis fahren." -#: my_practice/forms.py:262 my_practice/models/practice.py:353 +#: my_practice/forms.py:264 my_practice/models/practice.py:353 #: templates/my_practice/practice_form.html:284 msgid "Valid from" msgstr "Gültig ab" @@ -1318,73 +1322,77 @@ msgstr "GebüH-Rechnung" msgid "GebüH-Ziffern und Diagnose auf der Rechnung ausweisen (PKV / Beihilfe)" msgstr "GebüH-Ziffern und Diagnose auf der Rechnung ausweisen (PKV / Beihilfe)" -#: my_practice/models/client.py:190 +#: my_practice/models/client.py:191 +msgid "Omit the diagnosis line from GebüH invoices for this client" +msgstr "Diagnosezeile auf GebüH-Rechnungen für diesen Klienten weglassen" + +#: my_practice/models/client.py:195 msgid "Online client" msgstr "Online Klient" -#: my_practice/models/client.py:191 +#: my_practice/models/client.py:196 msgid "Check if this client primarily has online sessions" msgstr "Ankreuzen, wenn dieser Klient hauptsächlich Online-Sitzungen hat" -#: my_practice/models/client.py:208 templates/base.html:14 +#: my_practice/models/client.py:213 templates/base.html:14 #: templates/base.html:56 templates/my_practice/analytics.html:104 #: templates/my_practice/analytics.html:592 #: templates/my_practice/client_list_cards.html:8 msgid "Clients" msgstr "Klient:innen" -#: my_practice/models/client.py:246 +#: my_practice/models/client.py:251 msgid "Intro meeting (notes)" msgstr "Vorgespräch (Notizen)" -#: my_practice/models/client.py:247 +#: my_practice/models/client.py:252 msgid "Intake form" msgstr "Aufnahmebogen" -#: my_practice/models/client.py:248 +#: my_practice/models/client.py:253 msgid "Anamnesis questionnaire" msgstr "Anamnesebogen" -#: my_practice/models/client.py:249 +#: my_practice/models/client.py:254 msgid "Treatment contract" msgstr "Behandlungsvertrag" -#: my_practice/models/client.py:250 my_practice/models/inquiry.py:29 +#: my_practice/models/client.py:255 my_practice/models/inquiry.py:29 msgid "Referral" msgstr "Überweisung" -#: my_practice/models/client.py:251 my_practice/models/financial.py:61 +#: my_practice/models/client.py:256 my_practice/models/financial.py:61 #: my_practice/models/financial.py:162 my_practice/models/inquiry.py:33 #: my_practice/models/todo.py:80 my_practice/views/inquiry_views.py:385 #: templates/my_practice/bank_expense_review.html:50 msgid "Other" msgstr "Sonstiges" -#: my_practice/models/client.py:264 +#: my_practice/models/client.py:269 msgid "Document type" msgstr "Dokumententyp" -#: my_practice/models/client.py:268 my_practice/models/financial.py:238 +#: my_practice/models/client.py:273 my_practice/models/financial.py:238 msgid "File" msgstr "Datei" -#: my_practice/models/client.py:269 +#: my_practice/models/client.py:274 msgid "PDF, JPG, PNG or DOCX" msgstr "PDF, JPG, PNG oder DOCX" -#: my_practice/models/client.py:278 +#: my_practice/models/client.py:283 msgid "Document date" msgstr "Dokumentdatum" -#: my_practice/models/client.py:279 +#: my_practice/models/client.py:284 msgid "Date of the document (e.g. signing date)" msgstr "Datum des Dokuments (z.B. Unterzeichnungsdatum)" -#: my_practice/models/client.py:284 +#: my_practice/models/client.py:289 msgid "Client document" msgstr "Klientendokument" -#: my_practice/models/client.py:285 +#: my_practice/models/client.py:290 msgid "Client documents" msgstr "Klientendokumente" @@ -5803,7 +5811,7 @@ msgstr "Duplikate ausblenden" #: templates/my_practice/client_detail.html:381 #: templates/my_practice/client_detail_documents.html:28 #: templates/my_practice/client_gdpr_delete_confirm.html:55 -#: templates/my_practice/client_intake.html:123 +#: templates/my_practice/client_intake.html:132 #: templates/my_practice/expense_confirm_delete.html:41 #: templates/my_practice/expense_form.html:100 #: templates/my_practice/gebueh_leistung_form.html:42 @@ -6589,12 +6597,16 @@ msgstr "💻 Für Klienten, die hauptsächlich Online-Sitzungen (Video) haben." msgid "Enable GebüH billing (official German fee schedule for licensed alternative practitioners) for this client." msgstr "GebüH-Abrechnung (Gebührenverzeichnis für Heilpraktiker) für diesen Klienten aktivieren." -#: templates/my_practice/client_intake.html:122 +#: templates/my_practice/client_intake.html:76 +msgid "Omit the diagnosis line from this client's GebüH invoices." +msgstr "Diagnosezeile auf den GebüH-Rechnungen dieses Klienten weglassen." + +#: templates/my_practice/client_intake.html:131 #: templates/my_practice/practice_form.html:305 msgid "Save changes" msgstr "Änderungen speichern" -#: templates/my_practice/client_intake.html:122 +#: templates/my_practice/client_intake.html:131 msgid "Save client" msgstr "Klient:in speichern" diff --git a/app/locale/en/LC_MESSAGES/django.po b/app/locale/en/LC_MESSAGES/django.po index 01ae9fb..6bec66a 100644 --- a/app/locale/en/LC_MESSAGES/django.po +++ b/app/locale/en/LC_MESSAGES/django.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: my-practice\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-29 23:11+0200\n" +"POT-Creation-Date: 2026-07-30 12:14+0200\n" "PO-Revision-Date: 2026-06-22 23:01+0200\n" "Language-Team: English\n" "Language: en\n" @@ -22,7 +22,7 @@ msgstr "" msgid "Basic information about the practice" msgstr "" -#: my_practice/admin.py:59 my_practice/forms.py:101 +#: my_practice/admin.py:59 my_practice/forms.py:102 #: my_practice/models/client.py:111 #: templates/my_practice/client_detail.html:483 #: templates/my_practice/practice_form.html:78 @@ -130,26 +130,26 @@ msgstr "" msgid "Standard hourly rates for this client" msgstr "" -#: my_practice/admin.py:294 my_practice/admin.py:1011 +#: my_practice/admin.py:294 my_practice/admin.py:1019 msgid "Organization" msgstr "" -#: my_practice/admin.py:297 my_practice/models/client.py:199 +#: my_practice/admin.py:297 my_practice/models/client.py:204 msgid "Tags for organizing and categorizing clients" msgstr "" -#: my_practice/admin.py:301 my_practice/admin.py:504 +#: my_practice/admin.py:301 my_practice/admin.py:512 msgid "Additional" msgstr "" -#: my_practice/admin.py:305 my_practice/admin.py:506 my_practice/admin.py:591 -#: my_practice/admin.py:623 my_practice/admin.py:649 my_practice/admin.py:676 -#: my_practice/admin.py:914 +#: my_practice/admin.py:313 my_practice/admin.py:514 my_practice/admin.py:599 +#: my_practice/admin.py:631 my_practice/admin.py:657 my_practice/admin.py:684 +#: my_practice/admin.py:922 msgid "Timestamps" msgstr "" -#: my_practice/admin.py:310 my_practice/admin.py:847 my_practice/admin.py:1015 -#: my_practice/admin.py:1198 my_practice/models/calendar.py:124 +#: my_practice/admin.py:318 my_practice/admin.py:855 my_practice/admin.py:1023 +#: my_practice/admin.py:1206 my_practice/models/calendar.py:124 #: my_practice/models/clinical.py:318 my_practice/models/inquiry.py:110 #: my_practice/models/invoice.py:90 #: templates/includes/calendar_preflight_widget.html:27 @@ -170,7 +170,7 @@ msgstr "" msgid "Status" msgstr "Status" -#: my_practice/admin.py:314 my_practice/admin.py:884 my_practice/admin.py:1291 +#: my_practice/admin.py:322 my_practice/admin.py:892 my_practice/admin.py:1299 #: my_practice/models/calendar.py:47 my_practice/models/client.py:182 #: my_practice/models/practice.py:50 templates/my_practice/analytics.html:415 #: templates/my_practice/client_detail.html:11 @@ -180,7 +180,7 @@ msgstr "Status" msgid "Active" msgstr "Active" -#: my_practice/admin.py:316 my_practice/models/calendar.py:47 +#: my_practice/admin.py:324 my_practice/models/calendar.py:47 #: templates/my_practice/client_detail.html:11 #: templates/my_practice/client_list_cards.html:42 #: templates/my_practice/client_list_cards.html:76 @@ -188,38 +188,38 @@ msgstr "Active" msgid "Inactive" msgstr "Inactive" -#: my_practice/admin.py:318 +#: my_practice/admin.py:326 msgid "Format" msgstr "" -#: my_practice/admin.py:321 my_practice/models/clinical.py:145 +#: my_practice/admin.py:329 my_practice/models/clinical.py:145 msgid "Online" msgstr "" -#: my_practice/admin.py:322 +#: my_practice/admin.py:330 msgid "On-site" msgstr "" -#: my_practice/admin.py:324 my_practice/admin.py:628 -#: my_practice/models/client.py:198 +#: my_practice/admin.py:332 my_practice/admin.py:636 +#: my_practice/models/client.py:203 #: templates/my_practice/client_detail.html:418 #: templates/my_practice/client_list_cards.html:26 #: templates/my_practice/tag_list.html:6 msgid "Tags" msgstr "" -#: my_practice/admin.py:345 +#: my_practice/admin.py:353 msgid "Assignment" msgstr "" -#: my_practice/admin.py:351 my_practice/admin.py:537 my_practice/admin.py:697 -#: my_practice/admin.py:792 +#: my_practice/admin.py:359 my_practice/admin.py:545 my_practice/admin.py:705 +#: my_practice/admin.py:800 msgid "Details" msgstr "" -#: my_practice/admin.py:358 my_practice/admin.py:585 my_practice/admin.py:672 -#: my_practice/admin.py:1315 my_practice/models/calendar.py:110 -#: my_practice/models/client.py:207 my_practice/models/client.py:258 +#: my_practice/admin.py:366 my_practice/admin.py:593 my_practice/admin.py:680 +#: my_practice/admin.py:1323 my_practice/models/calendar.py:110 +#: my_practice/models/client.py:212 my_practice/models/client.py:263 #: my_practice/models/client_alias.py:32 my_practice/models/clinical.py:170 #: my_practice/models/clinical.py:306 my_practice/models/clinical.py:351 #: my_practice/models/invoice.py:77 my_practice/models/session.py:22 @@ -234,8 +234,8 @@ msgstr "" msgid "Client" msgstr "" -#: my_practice/admin.py:367 my_practice/admin.py:719 my_practice/forms.py:110 -#: my_practice/forms.py:186 my_practice/import_forms.py:67 +#: my_practice/admin.py:375 my_practice/admin.py:727 my_practice/forms.py:112 +#: my_practice/forms.py:188 my_practice/import_forms.py:67 #: my_practice/models/bank_statement.py:128 my_practice/models/client.py:118 #: my_practice/models/client_alias.py:41 my_practice/models/financial.py:93 #: my_practice/models/inquiry.py:123 my_practice/models/invoice.py:126 @@ -247,68 +247,68 @@ msgstr "" msgid "Notes" msgstr "" -#: my_practice/admin.py:385 my_practice/models/invoice.py:253 +#: my_practice/admin.py:393 my_practice/models/invoice.py:253 msgid "Service Type" msgstr "" -#: my_practice/admin.py:388 my_practice/admin.py:910 +#: my_practice/admin.py:396 my_practice/admin.py:918 msgid "Settings" msgstr "" -#: my_practice/admin.py:391 +#: my_practice/admin.py:399 msgid "Scope" msgstr "" -#: my_practice/admin.py:396 +#: my_practice/admin.py:404 msgid "GLOBAL" msgstr "" -#: my_practice/admin.py:436 +#: my_practice/admin.py:444 msgid "Mark as sent" msgstr "" -#: my_practice/admin.py:442 +#: my_practice/admin.py:450 #, python-format msgid "%(count)s invoice marked as sent." msgid_plural "%(count)s invoices marked as sent." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:448 +#: my_practice/admin.py:456 msgid "Mark as paid" msgstr "" -#: my_practice/admin.py:462 +#: my_practice/admin.py:470 #, python-format msgid "%(count)s invoice marked as paid." msgid_plural "%(count)s invoices marked as paid." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:468 +#: my_practice/admin.py:476 msgid "Mark as cancelled" msgstr "" -#: my_practice/admin.py:474 +#: my_practice/admin.py:482 #, python-format msgid "%(count)s invoice marked as cancelled." msgid_plural "%(count)s invoices marked as cancelled." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:484 +#: my_practice/admin.py:492 msgid "Invoice Information" msgstr "" -#: my_practice/admin.py:496 +#: my_practice/admin.py:504 msgid "Amounts" msgstr "" -#: my_practice/admin.py:500 +#: my_practice/admin.py:508 msgid "Amounts are calculated automatically from invoice items" msgstr "" -#: my_practice/admin.py:511 my_practice/models/invoice.py:263 +#: my_practice/admin.py:519 my_practice/models/invoice.py:263 #: templates/my_practice/bank_review.html:75 #: templates/my_practice/invoice_detail.html:86 #: templates/my_practice/invoice_list.html:21 @@ -316,23 +316,23 @@ msgstr "" msgid "Total" msgstr "" -#: my_practice/admin.py:535 my_practice/admin.py:616 +#: my_practice/admin.py:543 my_practice/admin.py:624 #: my_practice/models/calendar.py:132 my_practice/models/clinical.py:222 #: my_practice/models/gebueh.py:87 my_practice/models/invoice.py:281 #: my_practice/models/session.py:63 msgid "Session" msgstr "" -#: my_practice/admin.py:536 templates/base.html:53 +#: my_practice/admin.py:544 templates/base.html:53 #: templates/my_practice/client_detail.html:51 msgid "Billing" msgstr "" -#: my_practice/admin.py:562 +#: my_practice/admin.py:570 msgid "Log" msgstr "" -#: my_practice/admin.py:566 my_practice/admin.py:1251 +#: my_practice/admin.py:574 my_practice/admin.py:1259 #: my_practice/models/invoice.py:133 my_practice/models/invoice.py:250 #: templates/my_practice/bank_review.html:259 #: templates/my_practice/billing_open_overview.html:57 @@ -344,89 +344,89 @@ msgstr "" msgid "Invoice" msgstr "" -#: my_practice/admin.py:587 +#: my_practice/admin.py:595 msgid "Clinical Fields (Fernet-encrypted)" msgstr "" -#: my_practice/admin.py:596 +#: my_practice/admin.py:604 msgid "Working Diagnosis" msgstr "" -#: my_practice/admin.py:617 +#: my_practice/admin.py:625 msgid "Metadata (unencrypted)" msgstr "" -#: my_practice/admin.py:619 my_practice/admin.py:647 my_practice/admin.py:674 +#: my_practice/admin.py:627 my_practice/admin.py:655 my_practice/admin.py:682 msgid "Content (Fernet-encrypted)" msgstr "" -#: my_practice/admin.py:646 +#: my_practice/admin.py:654 msgid "Client & Status" msgstr "" -#: my_practice/admin.py:654 my_practice/admin.py:681 +#: my_practice/admin.py:662 my_practice/admin.py:689 #: my_practice/models/clinical.py:310 my_practice/models/clinical.py:360 msgid "Content" msgstr "" -#: my_practice/admin.py:673 +#: my_practice/admin.py:681 msgid "Metadata" msgstr "" -#: my_practice/admin.py:696 templates/my_practice/bank_import.html:120 +#: my_practice/admin.py:704 templates/my_practice/bank_import.html:120 msgid "Withdrawal" msgstr "" -#: my_practice/admin.py:702 +#: my_practice/admin.py:710 msgid "Flag for current tax year" msgstr "" -#: my_practice/admin.py:711 +#: my_practice/admin.py:719 #, python-format msgid "%(count)s withdrawal found for tax year %(year)s." msgid_plural "%(count)s withdrawals found for tax year %(year)s." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:744 +#: my_practice/admin.py:752 msgid "Mark as tax deductible" msgstr "" -#: my_practice/admin.py:750 +#: my_practice/admin.py:758 #, python-format msgid "%(count)s expense marked as tax deductible." msgid_plural "%(count)s expenses marked as tax deductible." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:758 +#: my_practice/admin.py:766 msgid "Not tax deductible" msgstr "" -#: my_practice/admin.py:764 +#: my_practice/admin.py:772 #, python-format msgid "%(count)s expense marked as not deductible." msgid_plural "%(count)s expenses marked as not deductible." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:772 +#: my_practice/admin.py:780 msgid "Mark as invoice available" msgstr "" -#: my_practice/admin.py:778 +#: my_practice/admin.py:786 #, python-format msgid "%(count)s expense marked with invoice." msgid_plural "%(count)s expenses marked with invoice." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:788 my_practice/models/tag.py:49 +#: my_practice/admin.py:796 my_practice/models/tag.py:49 msgid "General" msgstr "" -#: my_practice/admin.py:797 my_practice/forms.py:134 my_practice/forms.py:162 -#: my_practice/import_forms.py:119 my_practice/models/client.py:274 +#: my_practice/admin.py:805 my_practice/forms.py:136 my_practice/forms.py:164 +#: my_practice/import_forms.py:119 my_practice/models/client.py:279 #: my_practice/models/financial.py:180 my_practice/models/gebueh.py:27 #: my_practice/models/inquiry.py:212 my_practice/models/tag.py:84 #: templates/my_practice/expense_confirm_delete.html:23 @@ -439,8 +439,8 @@ msgstr "" msgid "Description" msgstr "" -#: my_practice/admin.py:804 my_practice/admin.py:943 my_practice/admin.py:1048 -#: my_practice/forms.py:133 my_practice/forms.py:163 +#: my_practice/admin.py:812 my_practice/admin.py:951 my_practice/admin.py:1056 +#: my_practice/forms.py:135 my_practice/forms.py:165 #: my_practice/import_forms.py:114 my_practice/models/financial.py:99 #: my_practice/models/financial.py:185 my_practice/models/tag.py:77 #: templates/my_practice/bank_expense_review.html:31 @@ -455,7 +455,7 @@ msgstr "" msgid "Category" msgstr "" -#: my_practice/admin.py:809 my_practice/admin.py:1218 +#: my_practice/admin.py:817 my_practice/admin.py:1226 #: my_practice/models/bank_statement.py:83 my_practice/models/financial.py:89 #: my_practice/models/financial.py:177 #: templates/my_practice/bank_import.html:86 @@ -476,35 +476,35 @@ msgstr "" msgid "Amount" msgstr "" -#: my_practice/admin.py:839 +#: my_practice/admin.py:847 msgid "Additional Information" msgstr "" -#: my_practice/admin.py:852 +#: my_practice/admin.py:860 msgid "Currently Off" msgstr "" -#: my_practice/admin.py:855 templates/my_practice/time_off_list.html:52 +#: my_practice/admin.py:863 templates/my_practice/time_off_list.html:52 msgid "Upcoming" msgstr "" -#: my_practice/admin.py:858 templates/my_practice/time_off_list.html:70 +#: my_practice/admin.py:866 templates/my_practice/time_off_list.html:70 msgid "Past" msgstr "" -#: my_practice/admin.py:906 +#: my_practice/admin.py:914 msgid "Tag Information" msgstr "" -#: my_practice/admin.py:919 +#: my_practice/admin.py:927 msgid "Tag" msgstr "" -#: my_practice/admin.py:958 +#: my_practice/admin.py:966 msgid "Used By" msgstr "" -#: my_practice/admin.py:964 +#: my_practice/admin.py:972 #: templates/my_practice/monthly_billing_overview.html:39 #: templates/my_practice/tag_list.html:56 #, python-format @@ -513,107 +513,107 @@ msgid_plural "%(count)s clients" msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:1007 +#: my_practice/admin.py:1015 msgid "Task Information" msgstr "" -#: my_practice/admin.py:1019 +#: my_practice/admin.py:1027 msgid "Focus Queue (P-050)" msgstr "" -#: my_practice/admin.py:1023 +#: my_practice/admin.py:1031 msgid "Set automatically for materialized tasks — not manually editable." msgstr "" -#: my_practice/admin.py:1038 my_practice/models/todo.py:149 +#: my_practice/admin.py:1046 my_practice/models/todo.py:149 msgid "Task" msgstr "" -#: my_practice/admin.py:1066 +#: my_practice/admin.py:1074 msgid "Priority" msgstr "" -#: my_practice/admin.py:1082 templates/includes/focus_queue_row.html:15 +#: my_practice/admin.py:1090 templates/includes/focus_queue_row.html:15 msgid "Mark as completed" msgstr "" -#: my_practice/admin.py:1092 +#: my_practice/admin.py:1100 #, python-format msgid "%(count)s task marked as completed." msgid_plural "%(count)s tasks marked as completed." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:1100 +#: my_practice/admin.py:1108 msgid "Mark as incomplete" msgstr "" -#: my_practice/admin.py:1110 +#: my_practice/admin.py:1118 #, python-format msgid "%(count)s task marked as incomplete." msgid_plural "%(count)s tasks marked as incomplete." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:1118 +#: my_practice/admin.py:1126 msgid "Set high priority" msgstr "" -#: my_practice/admin.py:1125 +#: my_practice/admin.py:1133 #, python-format msgid "%(count)s task set to high priority." msgid_plural "%(count)s tasks set to high priority." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:1169 +#: my_practice/admin.py:1177 msgid "Transaction Data" msgstr "" -#: my_practice/admin.py:1181 +#: my_practice/admin.py:1189 msgid "Payment Partner" msgstr "" -#: my_practice/admin.py:1187 +#: my_practice/admin.py:1195 msgid "Matching" msgstr "" -#: my_practice/admin.py:1211 +#: my_practice/admin.py:1219 msgid "Payer" msgstr "" -#: my_practice/admin.py:1229 +#: my_practice/admin.py:1237 msgid "Match" msgstr "" -#: my_practice/admin.py:1264 +#: my_practice/admin.py:1272 msgid "Therapy Practice Management" msgstr "" -#: my_practice/admin.py:1265 +#: my_practice/admin.py:1273 msgid "Payments Admin" msgstr "" -#: my_practice/admin.py:1266 +#: my_practice/admin.py:1274 msgid "Welcome to Therapy Practice Management" msgstr "" -#: my_practice/admin.py:1319 +#: my_practice/admin.py:1327 msgid "Mark as pending" msgstr "" -#: my_practice/admin.py:1325 +#: my_practice/admin.py:1333 #, python-format msgid "%(count)s event marked as pending." msgid_plural "%(count)s events marked as pending." msgstr[0] "" msgstr[1] "" -#: my_practice/admin.py:1331 +#: my_practice/admin.py:1339 msgid "Mark as skipped" msgstr "" -#: my_practice/admin.py:1337 +#: my_practice/admin.py:1345 #, python-format msgid "%(count)s event marked as skipped." msgid_plural "%(count)s events marked as skipped." @@ -645,33 +645,33 @@ msgstr "" msgid "Date of birth" msgstr "" -#: my_practice/forms.py:79 +#: my_practice/forms.py:80 msgid "e.g. DE, JM" msgstr "" -#: my_practice/forms.py:80 my_practice/forms.py:98 +#: my_practice/forms.py:81 my_practice/forms.py:99 #: my_practice/models/client.py:101 msgid "Full name" msgstr "" -#: my_practice/forms.py:84 +#: my_practice/forms.py:85 msgid "Street, postal code city" msgstr "" -#: my_practice/forms.py:87 +#: my_practice/forms.py:88 msgid "e.g. self-pay, Allianz PKV, Beihilfe" msgstr "" -#: my_practice/forms.py:94 +#: my_practice/forms.py:95 msgid "Additional notes" msgstr "" -#: my_practice/forms.py:97 my_practice/inquiry_forms.py:79 +#: my_practice/forms.py:98 my_practice/inquiry_forms.py:79 #: my_practice/models/client.py:98 msgid "Client code" msgstr "" -#: my_practice/forms.py:99 my_practice/models/client.py:109 +#: my_practice/forms.py:100 my_practice/models/client.py:109 #: my_practice/models/inquiry.py:99 #: templates/my_practice/client_detail.html:474 #: templates/my_practice/client_list_cards.html:109 @@ -681,7 +681,7 @@ msgstr "" msgid "Email" msgstr "" -#: my_practice/forms.py:100 my_practice/models/client.py:110 +#: my_practice/forms.py:101 my_practice/models/client.py:110 #: my_practice/models/financial.py:146 my_practice/models/inquiry.py:100 #: templates/my_practice/bank_expense_review.html:34 #: templates/my_practice/client_detail.html:478 @@ -690,40 +690,44 @@ msgstr "" msgid "Phone" msgstr "" -#: my_practice/forms.py:102 my_practice/models/client.py:115 +#: my_practice/forms.py:103 my_practice/models/client.py:115 #: templates/my_practice/client_detail.html:488 msgid "Cost carrier" msgstr "" -#: my_practice/forms.py:103 my_practice/models/client.py:171 +#: my_practice/forms.py:104 my_practice/models/client.py:171 msgid "Preferred language" msgstr "" -#: my_practice/forms.py:104 +#: my_practice/forms.py:105 msgid "Custom Email Salutation" msgstr "" -#: my_practice/forms.py:105 +#: my_practice/forms.py:106 msgid "Active client" msgstr "" -#: my_practice/forms.py:106 +#: my_practice/forms.py:107 msgid "Online client (video sessions)" msgstr "" -#: my_practice/forms.py:107 +#: my_practice/forms.py:108 msgid "GebüH-Abrechnung" msgstr "" -#: my_practice/forms.py:108 +#: my_practice/forms.py:109 my_practice/models/client.py:190 +msgid "No diagnosis on invoice" +msgstr "" + +#: my_practice/forms.py:110 msgid "Fee 60 min (€)" msgstr "" -#: my_practice/forms.py:109 +#: my_practice/forms.py:111 msgid "Fee 90 min (€)" msgstr "" -#: my_practice/forms.py:117 my_practice/forms.py:141 +#: my_practice/forms.py:119 my_practice/forms.py:143 #: my_practice/models/calendar.py:101 my_practice/models/clinical.py:355 #: my_practice/models/financial.py:85 my_practice/models/financial.py:173 #: templates/my_practice/bank_import.html:83 @@ -749,46 +753,46 @@ msgstr "" msgid "Date" msgstr "" -#: my_practice/forms.py:127 +#: my_practice/forms.py:129 msgid "Optional: purpose or notes" msgstr "" -#: my_practice/forms.py:132 my_practice/forms.py:164 +#: my_practice/forms.py:134 my_practice/forms.py:166 msgid "Amount (€)" msgstr "" -#: my_practice/forms.py:156 +#: my_practice/forms.py:158 msgid "Description of the expense" msgstr "" -#: my_practice/forms.py:165 my_practice/import_forms.py:132 +#: my_practice/forms.py:167 my_practice/import_forms.py:132 #: my_practice/models/financial.py:188 #: templates/my_practice/bank_expense_review.html:66 #: templates/my_practice/expense_list.html:27 msgid "Tax deductible" msgstr "" -#: my_practice/forms.py:166 my_practice/import_forms.py:126 +#: my_practice/forms.py:168 my_practice/import_forms.py:126 #: my_practice/models/financial.py:187 #: templates/my_practice/bank_expense_review.html:62 msgid "Invoice available" msgstr "" -#: my_practice/forms.py:167 my_practice/models/financial.py:190 +#: my_practice/forms.py:169 my_practice/models/financial.py:190 #: templates/my_practice/expense_list.html:84 #: templates/my_practice/expense_list.html:121 msgid "Filed in tax return" msgstr "" -#: my_practice/forms.py:174 my_practice/models/timeoff.py:34 +#: my_practice/forms.py:176 my_practice/models/timeoff.py:34 msgid "Start Date" msgstr "" -#: my_practice/forms.py:175 my_practice/models/timeoff.py:35 +#: my_practice/forms.py:177 my_practice/models/timeoff.py:35 msgid "End Date" msgstr "" -#: my_practice/forms.py:184 my_practice/models/clinical.py:368 +#: my_practice/forms.py:186 my_practice/models/clinical.py:368 #: my_practice/models/timeoff.py:40 templates/my_practice/analytics.html:398 #: templates/my_practice/tax_workday_audit.html:61 #: templates/my_practice/time_off_confirm_delete.html:23 @@ -797,7 +801,7 @@ msgstr "" msgid "Type" msgstr "" -#: my_practice/forms.py:185 my_practice/models/timeoff.py:44 +#: my_practice/forms.py:187 my_practice/models/timeoff.py:44 #: templates/my_practice/calendar_approval_queue.html:93 #: templates/my_practice/time_off_confirm_delete.html:19 #: templates/my_practice/time_off_list.html:31 @@ -805,36 +809,36 @@ msgstr "" msgid "Title" msgstr "" -#: my_practice/forms.py:191 +#: my_practice/forms.py:193 msgid "Monday" msgstr "" -#: my_practice/forms.py:192 +#: my_practice/forms.py:194 msgid "Tuesday" msgstr "" -#: my_practice/forms.py:193 +#: my_practice/forms.py:195 msgid "Wednesday" msgstr "" -#: my_practice/forms.py:194 +#: my_practice/forms.py:196 msgid "Thursday" msgstr "" -#: my_practice/forms.py:195 +#: my_practice/forms.py:197 msgid "Friday" msgstr "" -#: my_practice/forms.py:206 my_practice/models/practice.py:295 +#: my_practice/forms.py:208 my_practice/models/practice.py:295 #: templates/my_practice/practice_form.html:261 msgid "Practice days (weekdays)" msgstr "" -#: my_practice/forms.py:207 templates/my_practice/practice_form.html:269 +#: my_practice/forms.py:209 templates/my_practice/practice_form.html:269 msgid "Weekdays on which you commute to the practice." msgstr "" -#: my_practice/forms.py:262 my_practice/models/practice.py:353 +#: my_practice/forms.py:264 my_practice/models/practice.py:353 #: templates/my_practice/practice_form.html:284 msgid "Valid from" msgstr "" @@ -1318,73 +1322,77 @@ msgstr "" msgid "GebüH-Ziffern und Diagnose auf der Rechnung ausweisen (PKV / Beihilfe)" msgstr "" -#: my_practice/models/client.py:190 +#: my_practice/models/client.py:191 +msgid "Omit the diagnosis line from GebüH invoices for this client" +msgstr "" + +#: my_practice/models/client.py:195 msgid "Online client" msgstr "" -#: my_practice/models/client.py:191 +#: my_practice/models/client.py:196 msgid "Check if this client primarily has online sessions" msgstr "" -#: my_practice/models/client.py:208 templates/base.html:14 +#: my_practice/models/client.py:213 templates/base.html:14 #: templates/base.html:56 templates/my_practice/analytics.html:104 #: templates/my_practice/analytics.html:592 #: templates/my_practice/client_list_cards.html:8 msgid "Clients" msgstr "" -#: my_practice/models/client.py:246 +#: my_practice/models/client.py:251 msgid "Intro meeting (notes)" msgstr "" -#: my_practice/models/client.py:247 +#: my_practice/models/client.py:252 msgid "Intake form" msgstr "" -#: my_practice/models/client.py:248 +#: my_practice/models/client.py:253 msgid "Anamnesis questionnaire" msgstr "" -#: my_practice/models/client.py:249 +#: my_practice/models/client.py:254 msgid "Treatment contract" msgstr "" -#: my_practice/models/client.py:250 my_practice/models/inquiry.py:29 +#: my_practice/models/client.py:255 my_practice/models/inquiry.py:29 msgid "Referral" msgstr "" -#: my_practice/models/client.py:251 my_practice/models/financial.py:61 +#: my_practice/models/client.py:256 my_practice/models/financial.py:61 #: my_practice/models/financial.py:162 my_practice/models/inquiry.py:33 #: my_practice/models/todo.py:80 my_practice/views/inquiry_views.py:385 #: templates/my_practice/bank_expense_review.html:50 msgid "Other" msgstr "" -#: my_practice/models/client.py:264 +#: my_practice/models/client.py:269 msgid "Document type" msgstr "" -#: my_practice/models/client.py:268 my_practice/models/financial.py:238 +#: my_practice/models/client.py:273 my_practice/models/financial.py:238 msgid "File" msgstr "" -#: my_practice/models/client.py:269 +#: my_practice/models/client.py:274 msgid "PDF, JPG, PNG or DOCX" msgstr "" -#: my_practice/models/client.py:278 +#: my_practice/models/client.py:283 msgid "Document date" msgstr "" -#: my_practice/models/client.py:279 +#: my_practice/models/client.py:284 msgid "Date of the document (e.g. signing date)" msgstr "" -#: my_practice/models/client.py:284 +#: my_practice/models/client.py:289 msgid "Client document" msgstr "" -#: my_practice/models/client.py:285 +#: my_practice/models/client.py:290 msgid "Client documents" msgstr "" @@ -5803,7 +5811,7 @@ msgstr "" #: templates/my_practice/client_detail.html:381 #: templates/my_practice/client_detail_documents.html:28 #: templates/my_practice/client_gdpr_delete_confirm.html:55 -#: templates/my_practice/client_intake.html:123 +#: templates/my_practice/client_intake.html:132 #: templates/my_practice/expense_confirm_delete.html:41 #: templates/my_practice/expense_form.html:100 #: templates/my_practice/gebueh_leistung_form.html:42 @@ -6587,12 +6595,16 @@ msgstr "" msgid "Enable GebüH billing (official German fee schedule for licensed alternative practitioners) for this client." msgstr "" -#: templates/my_practice/client_intake.html:122 +#: templates/my_practice/client_intake.html:76 +msgid "Omit the diagnosis line from this client's GebüH invoices." +msgstr "" + +#: templates/my_practice/client_intake.html:131 #: templates/my_practice/practice_form.html:305 msgid "Save changes" msgstr "" -#: templates/my_practice/client_intake.html:122 +#: templates/my_practice/client_intake.html:131 msgid "Save client" msgstr "" diff --git a/app/my_practice/admin.py b/app/my_practice/admin.py index 043fc47..953f353 100644 --- a/app/my_practice/admin.py +++ b/app/my_practice/admin.py @@ -299,7 +299,15 @@ class ClientAdmin(admin.ModelAdmin): ), ( gettext_lazy("Additional"), - {"fields": ("notes", "active", "is_online_client", "needs_gebueh_invoice")}, + { + "fields": ( + "notes", + "active", + "is_online_client", + "needs_gebueh_invoice", + "gebueh_no_diagnosis", + ) + }, ), ( gettext_lazy("Timestamps"), diff --git a/app/my_practice/forms.py b/app/my_practice/forms.py index 4863aec..1807748 100644 --- a/app/my_practice/forms.py +++ b/app/my_practice/forms.py @@ -71,6 +71,7 @@ class Meta: "active", "is_online_client", "needs_gebueh_invoice", + "gebueh_no_diagnosis", "hourly_rate_60", "hourly_rate_90", "notes", @@ -105,6 +106,7 @@ class Meta: "active": _("Active client"), "is_online_client": _("Online client (video sessions)"), "needs_gebueh_invoice": _("GebüH-Abrechnung"), + "gebueh_no_diagnosis": _("No diagnosis on invoice"), "hourly_rate_60": _("Fee 60 min (€)"), "hourly_rate_90": _("Fee 90 min (€)"), "notes": _("Notes"), diff --git a/app/my_practice/migrations/0019_gebueh_no_diagnosis.py b/app/my_practice/migrations/0019_gebueh_no_diagnosis.py new file mode 100644 index 0000000..f690553 --- /dev/null +++ b/app/my_practice/migrations/0019_gebueh_no_diagnosis.py @@ -0,0 +1,21 @@ +# Generated by Django 6.0.7 on 2026-07-30 10:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("my_practice", "0018_remove_practicetodo_is_focus"), + ] + + operations = [ + migrations.AddField( + model_name="client", + name="gebueh_no_diagnosis", + field=models.BooleanField( + default=False, + help_text="Omit the diagnosis line from GebüH invoices for this client", + verbose_name="No diagnosis on invoice", + ), + ), + ] diff --git a/app/my_practice/models/client.py b/app/my_practice/models/client.py index fcba96d..e7118ea 100644 --- a/app/my_practice/models/client.py +++ b/app/my_practice/models/client.py @@ -185,6 +185,11 @@ class Language(StrEnum): verbose_name=_("GebüH-Rechnung"), help_text=_("GebüH-Ziffern und Diagnose auf der Rechnung ausweisen (PKV / Beihilfe)"), ) + gebueh_no_diagnosis = models.BooleanField( + default=False, + verbose_name=_("No diagnosis on invoice"), + help_text=_("Omit the diagnosis line from GebüH invoices for this client"), + ) is_online_client = models.BooleanField( default=False, verbose_name=_("Online client"), diff --git a/app/my_practice/tests/test_gebueh.py b/app/my_practice/tests/test_gebueh.py index 739f890..821af7e 100644 --- a/app/my_practice/tests/test_gebueh.py +++ b/app/my_practice/tests/test_gebueh.py @@ -503,6 +503,17 @@ def test_gebueh_gesamt_total_hidden_when_no_leistungen(self): html = self._render() self.assertNotIn("GebüH gesamt", html) + def test_diagnosis_line_shown_by_default(self): + html = self._render() + self.assertIn("gebueh-diagnose", html) + self.assertIn("Probatorik", html) + + def test_diagnosis_line_hidden_when_gebueh_no_diagnosis_set(self): + self.client_obj.gebueh_no_diagnosis = True + self.client_obj.save() + html = self._render() + self.assertNotIn("gebueh-diagnose", html) + class GebuhInvoiceDetailViewTest(TestCase): """Tests the tightened GebüH block on the web invoice_detail.html view: diff --git a/app/templates/my_practice/client_intake.html b/app/templates/my_practice/client_intake.html index 69f5c0f..7c9f4d5 100644 --- a/app/templates/my_practice/client_intake.html +++ b/app/templates/my_practice/client_intake.html @@ -68,6 +68,15 @@ +
+ {{ form.gebueh_no_diagnosis.label_tag }} + {{ form.gebueh_no_diagnosis }} + {{ form.gebueh_no_diagnosis.errors }} +
+ {% trans "Omit the diagnosis line from this client's GebüH invoices." %} +
+
+
{{ form.full_name.label_tag }} {{ form.full_name }} diff --git a/app/templates/my_practice/invoice_detail.html b/app/templates/my_practice/invoice_detail.html index 79794c5..b02842a 100644 --- a/app/templates/my_practice/invoice_detail.html +++ b/app/templates/my_practice/invoice_detail.html @@ -88,7 +88,7 @@

📋 {% trans "Line items" %}

{% if gebueh_blocks %} - {% if arbeitsdiagnose %} + {% if arbeitsdiagnose and not invoice.client.gebueh_no_diagnosis %} {% trans "Diagnosis" %}: {{ arbeitsdiagnose }} diff --git a/app/templates/my_practice/invoice_pdf_de.html b/app/templates/my_practice/invoice_pdf_de.html index a30c475..c1ddc2e 100644 --- a/app/templates/my_practice/invoice_pdf_de.html +++ b/app/templates/my_practice/invoice_pdf_de.html @@ -46,11 +46,13 @@

Rechnung

{% if invoice.client.needs_gebueh_invoice and gebueh_blocks %} +{% if not invoice.client.gebueh_no_diagnosis %} {% if arbeitsdiagnose %}
Diagnose: {{ arbeitsdiagnose }}
{% else %}
Diagnose: Probatorik
{% endif %} +{% endif %} diff --git a/app/templates/my_practice/invoice_pdf_en.html b/app/templates/my_practice/invoice_pdf_en.html index 78e69d6..14dcf08 100644 --- a/app/templates/my_practice/invoice_pdf_en.html +++ b/app/templates/my_practice/invoice_pdf_en.html @@ -46,11 +46,13 @@

Invoice

{% if invoice.client.needs_gebueh_invoice and gebueh_blocks %} +{% if not invoice.client.gebueh_no_diagnosis %} {% if arbeitsdiagnose %}
Diagnosis: {{ arbeitsdiagnose }}
{% else %}
Diagnosis: Probatory phase
{% endif %} +{% endif %}