David Malinowski f284399fec feat(msp): License Coverage — lieferantenneutrale Inklusiv-Lizenzen mit Builder-Integration
Generalisierung des bisher nur in adnconnect existierenden Konzepts „inkludierte
Lizenzen" (über IT-Verträge gedeckte Microsoft-Seats) in einen lieferantenneutralen
DocType im MSP-Modul. Damit wird die Pauschal-Vertrags-Logik unabhängig vom
Distributor (ADN heute, ALSO/Ingram/Pax8 morgen).

Datenmodell:
- License Coverage (parent): customer + optional it_contract / valid_from /
  valid_to + enabled-Toggle + freie Notes. Mehrere Coverages pro Kunde sind
  zulässig (z. B. mehrere Standorte, parallele Verträge).
- License Coverage Item (child): item-Link (lieferantenagnostisch) + qty.
  vendor_product_id wird vom Item gefetched für Plausibilität / Dokumentation.

Builder-Integration (msp.importers.coverage + builder.py):
- Pro Importlauf wird ein CoverageCache aller relevanten Kunden einmal aus der
  DB geladen (eine SQL-Abfrage statt N pro Position).
- _append_line splittet jede CanonicalRow bei Bedarf in zwei Sales-Invoice-/
  Delivery-Note-Items: min(qty, covered) mit discount_percentage=100 +
  „ohne Berechnung"-Hinweis, plus Restmenge zum Listpreis.
- Subscription-Event referenziert die primäre (=erste) Item-Row, das
  supply_subscription-Link wird auf allen Item-Rows der kanonischen Zeile
  gesetzt.
- Coverage greift nur bei echten Rechnungen, nicht bei Gutschriften.

Migration:
- Patch migrate_adn_included_services_to_license_coverage übernimmt bestehende
  ADN Included Services (parent + items) idempotent in License Coverage. Marker
  im Notes-Feld verhindert Doppel-Migration. Auf dem Testsystem 5/5 Records
  korrekt portiert.

Validation:
- Re-Import der 5 Test-Monate (Nov 2025 – Mär 2026) zeigt: die 5 Coverage-Kunden
  produzieren jetzt deckungsgleiche Beträge zu adnconnect (z. B. CUST-21877:
  10× Premium berechnet + 11× zum 100%-Rabatt = exakt das Muster von
  SINV-269822). Verbleibende Diffs nur noch durch Power-BI-Pro-Tax-Template
  auf Testsystem.

Reconciliation-POC erweitert: erp_coverage() liest die License Coverage über
die ERPNext-REST-API; Reconciliation-Tabelle zeigt jetzt Spalten Graph / ERP /
Coverage / Billable mit klassifizierten Status-Hinweisen (z. B. „Coverage > Graph
= Upsell-Chance").
2026-04-14 14:03:56 +02:00
2024-05-31 10:53:56 +01:00
2021-03-24 01:36:20 +01:00
2021-03-24 01:36:20 +01:00
2021-03-24 01:36:20 +01:00
2021-03-24 01:36:20 +01:00

MSP

App for Managed Service Providers

License

GPLv3# msp

S
Description
ERPNext App for Managed Service Providers and IT-Service Companys
Readme
681 KiB
Languages
Python 65.7%
JavaScript 30.5%
PowerShell 3.8%