Finanzen & Controlling · Projektmodul

LV-Positionen: wofür der Bereich im Projektkontext gedacht ist.

Leistungsverzeichnis für Mengen, Leistungen und budgetnahe Steuerung. Das Modul erscheint innerhalb eines einzelnen Projekts und wirkt damit unmittelbar im Projektkontext.

  • Neue LV-Positionen koennen einen Standard-MwSt-Satz automatisch uebernehmen, statt dass derselbe Wert pro Position immer wieder manuell gesetzt werden muss.
  • Im Projekt wird der Satz im Feld Standard-MwSt fuer LV-Positionen gesteuert. Dort bleibt er entweder vererbt oder wird bewusst per Projekt-Override gesetzt.
  • Ohne Projekt-Override kommt der Wert tenantweit aus Administration > App-Einstellungen > Projekte > Standard-MwSt LV (%).
  • Wenn auch dort kein Wert gepflegt ist, greift fuer neue LV-Positionen aktuell der technische Standard von 19%.
Modulzweck

Wofür das Modul gedacht ist

LV-Positionen ist Teil des aktiven Modul-Katalogs und deckt einen klaren Ausschnitt des Produktalltags ab.

Leistungsverzeichnis für Mengen, Leistungen und budgetnahe Steuerung. Im Projektkontext bedeutet das, dass der Bereich nicht isoliert funktioniert, sondern direkt an Team, Status und weitere Projektbereiche anknüpft.

LV-Positionen ist als eigenständiger Produktbaustein gedacht. Gerade deshalb lohnt sich ein Blick darauf, wie der Bereich mit Rollen, Datenkontext und angrenzenden Modulen zusammenspielt.

Das Modul erscheint innerhalb eines einzelnen Projekts und wirkt damit unmittelbar im Projektkontext.
Praxisbezug

Typische Einsatzfälle

Diese Situationen zeigen, wann der Bereich in einem sauberen Rollout oder im laufenden Betrieb konkret Mehrwert liefert.

Projektvorgabe fuer neue LV-Positionen setzen

Im Projekt kann im Feld Standard-MwSt fuer LV-Positionen bewusst zwischen Vererbung und Projekt-Override gewechselt werden. So wird der passende Satz direkt im Projektkontext festgelegt.

Tenant-Standard zentral pflegen

Wenn Projekte keinen Override setzen, zieht der Bereich den Wert zentral aus Administration > App-Einstellungen > Projekte > Standard-MwSt LV (%). Das schafft einen gemeinsamen Ausgangspunkt fuer neue LV-Positionen.

Einzelpositionen bei Bedarf abweichend erfassen

Beim Anlegen einer LV-Position wird der aufgeloeste Satz nur vorbelegt. Eine einzelne Position kann weiterhin bewusst mit einem anderen Prozentsatz gespeichert werden.

Modulverbindungen

Wie das Modul mit anderen Bereichen zusammenspielt

struct-i-vio ist als zusammenhängende Plattform gedacht. Diese Module liegen fachlich am nächsten bei diesem Bereich.

Sichtbarkeit

Berechtigungen und Sichtbarkeit

Die öffentliche Dokumentation beschreibt die Logik auf Produktniveau - nicht als technische Policy-Liste, sondern als Rollout-Leitfaden.

Der tenantweite Ausgangswert liegt in Administration > App-Einstellungen > Projekte > Standard-MwSt LV (%). Diese Pflege gehoert in einen kleinen Administrationskreis.
Im Projektkontext wird der Satz ueber das Feld Standard-MwSt fuer LV-Positionen bewusst vererbt oder per Projekt-Override gesetzt.
Neue LV-Positionen uebernehmen zuerst den Projekt-Override, danach den Tenant-Standard und erst zuletzt den technischen Fallback von 19%.
Eine abweichende einzelne LV-Position bleibt trotzdem moeglich, ohne den Projekt- oder Tenant-Standard selbst zu veraendern.
Empfohlener Einsatz

Best Practices

So bleibt der Bereich bei Einführung und Nutzung anschlussfähig an den restlichen Produktfluss.

Den tenantweiten Standard nur als gemeinsamen Ausgangspunkt pflegen und projektspezifische Abweichungen ueber das Projekt-Override steuern, statt jede Position manuell neu zu setzen.
Die Herkunftskette im Team klar machen: Projekt-Override vor Tenant-Standard vor technischem Fallback 19%, damit Vorbelegungen nachvollziehbar bleiben.
Wenn nur eine einzelne LV-Position abweichen soll, den Satz direkt in der Position anpassen und nicht vorschnell den Projekt- oder Tenant-Standard ueberschreiben.
Tiefer einsteigen

Entwickler Info

Größtes Modul der App (18 Actions). Dreigliedrig: LV-Positionen + Kostenanpassungen + Mengenerweiterungen, plus internal_transfer und save_export_config_team. Drei interessante Schema-Eigenheiten dokumentiert unten.

Entwickler-Info aufklappen (5)

⚠ KRITISCHBackdoor: cost_adjustments scoped Sicht ohne action-key

cost_adjustments_select_project gates über eine pure project_members EXISTS-Subquery, OHNE can_perform_action. Es existiert KEINE view_cost_adj scoped-Variante — nur view_cost_adj_all (global). Konsequenz: jeder Projekt-Member liest die Mehr-/Minderkosten des Projekts ohne explizite view-Permission. Asymmetrisch zu quantity_extensions, wo der scoped Pfad sauber über view_project_lv gates.

  • RLS: public.cost_adjustments :: cost_adjustments_select_project
  • Vergleich: quantity_extensions_select_project nutzt sauber view_project_lv

view_project_lv ist Träger der Mengenerweiterungs-Sicht

quantity_extensions_select_project nutzt view_project_lv (statt einer eigenen view_quantity_ext-Permission). Pragmatisch: wer LV sieht, sieht auch Erweiterungen. Saubere kontextuelle Coupling — unterschiedlich zu cost_adj, das auf Membership fällt.

  • RLS: quantity_extensions_select_project

⚡ MERKWÜRDIGlv_position_assignees_select hat keine action-permission

Die SELECT-Policy auf lv_position_assignees prüft NUR tenant_id — keine action-Permission. Jeder im Tenant sieht alle Zuweisungen, unabhängig von Projekt-Mitgliedschaft. Mutations (INSERT/UPDATE/DELETE) sind über edit_lv gegated. Möglicherweise absichtlich, da Zuweisungen nicht sensitiv sind — sollte aber bewusst entschieden sein.

  • RLS: public.lv_position_assignees :: lv_position_assignees_select

⚡ MERKWÜRDIGconfirm_extension ist Trigger-enforced — UI-Gate fehlt

check_quantity_extension_status_change ist ein Trigger auf quantity_extensions. Wer die Permission nicht hat, sieht den "Bestätigen"-Knopf trotzdem im UI; das DB-UPDATE wirft erst beim Speichern eine Exception. Schöner wäre ein Frontend-Gate.

  • DB Trigger: check_quantity_extension_status_change

Stage-1-Couplings (bereits in MANUAL_PERMISSION_DEPENDENCIES)

create_quantity_ext und confirm_extension brauchen view_project_lv (view-before-edit). view_project_lv selbst braucht projects.view_all_projects. Plus generische view-before-edit / edit-before-delete-Regeln zwischen den 18 Actions.