diff --git a/limbach/.$RollsRoyce - Architektur - cad zentral.drawio.bkp b/limbach/.$RollsRoyce - Architektur - cad zentral.drawio.bkp
deleted file mode 100644
index 733dad4..0000000
--- a/limbach/.$RollsRoyce - Architektur - cad zentral.drawio.bkp
+++ /dev/null
@@ -1,138 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/limbach/.$RollsRoyce - Architektur.drawio.bkp b/limbach/.$RollsRoyce - Architektur.drawio.bkp
deleted file mode 100644
index 13d2222..0000000
--- a/limbach/.$RollsRoyce - Architektur.drawio.bkp
+++ /dev/null
@@ -1,138 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/limbach/.$integration-server.drawio.bkp b/limbach/.$integration-server.drawio.bkp
deleted file mode 100644
index 2b7bfd6..0000000
--- a/limbach/.$integration-server.drawio.bkp
+++ /dev/null
@@ -1,362 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/limbach/.$integration-server_sngle.drawio.bkp b/limbach/.$integration-server_sngle.drawio.bkp
deleted file mode 100644
index c83d7c5..0000000
--- a/limbach/.$integration-server_sngle.drawio.bkp
+++ /dev/null
@@ -1,181 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/limbach/Anforderungskatalog_LIS_Fit-Gap v2.xlsx b/limbach/Anforderungskatalog_LIS_Fit-Gap v2.xlsx
deleted file mode 100644
index c0caca3..0000000
Binary files a/limbach/Anforderungskatalog_LIS_Fit-Gap v2.xlsx and /dev/null differ
diff --git a/limbach/Folie10.pptx b/limbach/Folie10.pptx
deleted file mode 100644
index 0d37167..0000000
Binary files a/limbach/Folie10.pptx and /dev/null differ
diff --git a/limbach/Folie2.pptx b/limbach/Folie2.pptx
deleted file mode 100644
index 00bd175..0000000
Binary files a/limbach/Folie2.pptx and /dev/null differ
diff --git a/limbach/Folie3.pptx b/limbach/Folie3.pptx
deleted file mode 100644
index 35afb03..0000000
Binary files a/limbach/Folie3.pptx and /dev/null differ
diff --git a/limbach/Folie3b.pptx b/limbach/Folie3b.pptx
deleted file mode 100644
index 8051a42..0000000
Binary files a/limbach/Folie3b.pptx and /dev/null differ
diff --git a/limbach/Folie4.pptx b/limbach/Folie4.pptx
deleted file mode 100644
index f280531..0000000
Binary files a/limbach/Folie4.pptx and /dev/null differ
diff --git a/limbach/Folie5.pptx b/limbach/Folie5.pptx
deleted file mode 100644
index 87efe3c..0000000
Binary files a/limbach/Folie5.pptx and /dev/null differ
diff --git a/limbach/Folie6.pptx b/limbach/Folie6.pptx
deleted file mode 100644
index b25e8c1..0000000
Binary files a/limbach/Folie6.pptx and /dev/null differ
diff --git a/limbach/Folie7.pptx b/limbach/Folie7.pptx
deleted file mode 100644
index a36ffd8..0000000
Binary files a/limbach/Folie7.pptx and /dev/null differ
diff --git a/limbach/Folie8.pptx b/limbach/Folie8.pptx
deleted file mode 100644
index b907b44..0000000
Binary files a/limbach/Folie8.pptx and /dev/null differ
diff --git a/limbach/Folie9.pptx b/limbach/Folie9.pptx
deleted file mode 100644
index 7a46ce8..0000000
Binary files a/limbach/Folie9.pptx and /dev/null differ
diff --git a/limbach/Vault_Impuls_Workshop.pptx b/limbach/Vault_Impuls_Workshop.pptx
deleted file mode 100644
index 43d1cb8..0000000
Binary files a/limbach/Vault_Impuls_Workshop.pptx and /dev/null differ
diff --git a/limbach/Workshop_LIS.pptx b/limbach/Workshop_LIS.pptx
deleted file mode 100644
index 7342471..0000000
Binary files a/limbach/Workshop_LIS.pptx and /dev/null differ
diff --git a/limbach/adesso_style.py b/limbach/adesso_style.py
deleted file mode 100644
index dbfe85f..0000000
--- a/limbach/adesso_style.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/usr/bin/env python3
-"""Gemeinsames adesso-Styling für die Workshop-Folien.
-Teal->Blau-Verlauf, Fira Sans, weiße Shapes + Coral-Akzente,
-Header (Pill + Titel) und schlanke Fußzeile (Seitenzahl + adesso)."""
-
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE
-from pptx.oxml.ns import qn
-
-# ---- adesso Palette --------------------------------------------------------
-WHITE = RGBColor(0xFF, 0xFF, 0xFF)
-INK = RGBColor(0x0E, 0x2A, 0x47) # tiefes Navy – Text auf hellen Boxen / dunkle Füllungen
-BLUE = RGBColor(0x00, 0x6E, 0xC7)
-TEAL = RGBColor(0x28, 0xDC, 0xAA)
-GREEN = RGBColor(0x76, 0xC8, 0x00)
-CORAL = RGBColor(0xFF, 0x98, 0x68)
-PINK = RGBColor(0xF5, 0x66, 0xBA)
-TAUPE = RGBColor(0x88, 0x7D, 0x75)
-LIGHT = RGBColor(0xD7, 0xE6, 0xF4) # helle, gedämpfte Schrift/Linien auf dem Verlauf
-MUTE = RGBColor(0x6B, 0x77, 0x85) # mittleres Grau – Text auf weißen Flächen
-RECF = RGBColor(0xE6, 0xEF, 0xF8) # helle Kästchen in weißen Boxen
-
-F = "Fira Sans"
-FC = "Fira Sans Condensed"
-
-
-def alpha(shape, opacity_pct):
- """Deckkraft (0-100) auf die Solid-Füllung setzen."""
- srgb = shape._element.spPr.find(qn('a:solidFill')).find(qn('a:srgbClr'))
- srgb.append(srgb.makeelement(qn('a:alpha'), {'val': str(int(opacity_pct * 1000))}))
-
-
-def line_alpha(shape, opacity_pct):
- ln = shape._element.spPr.find(qn('a:ln'))
- srgb = ln.find(qn('a:solidFill')).find(qn('a:srgbClr'))
- srgb.append(srgb.makeelement(qn('a:alpha'), {'val': str(int(opacity_pct * 1000))}))
-
-
-def paint_background(s, width, height):
- """Teal->Blau-Verlauf als Folienhintergrund."""
- bgr = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, width, height)
- bgr.line.fill.background(); bgr.shadow.inherit = False
- bgr.fill.gradient()
- try:
- bgr.fill.gradient_angle = 90.0
- except Exception:
- pass
- st = bgr.fill.gradient_stops
- st[0].position = 0.0; st[0].color.rgb = TEAL
- st[1].position = 1.0; st[1].color.rgb = BLUE
- return bgr
-
-
-def chrome(s, title, page):
- """Header (Pill + Titel) + schlanke Fußzeile (Seitenzahl + adesso)."""
- pill = s.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE,
- Inches(0.55), Inches(0.46), Inches(0.5), Inches(0.26))
- pill.fill.background(); pill.line.color.rgb = WHITE; pill.line.width = Pt(1.5)
- pill.shadow.inherit = False
- try: pill.adjustments[0] = 0.5
- except Exception: pass
-
- def _t(x, y, w, h, t, size, color, bold=False, align=PP_ALIGN.LEFT, font=FC):
- tb = s.shapes.add_textbox(x, y, w, h); tf = tb.text_frame
- tf.word_wrap = True; tf.margin_left = tf.margin_right = Pt(0)
- tf.margin_top = tf.margin_bottom = Pt(0)
- p = tf.paragraphs[0]; p.alignment = align
- r = p.add_run(); r.text = t
- r.font.size = Pt(size); r.font.bold = bold; r.font.name = font; r.font.color.rgb = color
-
- _t(Inches(1.25), Inches(0.34), Inches(11), Inches(0.7), title, 30, WHITE, bold=True)
- _t(Inches(0.55), Inches(7.06), Inches(1.0), Inches(0.3), str(page), 11, LIGHT)
- _t(Inches(10.95), Inches(6.99), Inches(1.85), Inches(0.4), "adesso", 17, WHITE,
- bold=True, align=PP_ALIGN.RIGHT)
diff --git a/limbach/aufwand.pptx b/limbach/aufwand.pptx
deleted file mode 100644
index 043867a..0000000
Binary files a/limbach/aufwand.pptx and /dev/null differ
diff --git a/limbach/build_deck.py b/limbach/build_deck.py
deleted file mode 100644
index d9743d3..0000000
--- a/limbach/build_deck.py
+++ /dev/null
@@ -1,246 +0,0 @@
-#!/usr/bin/env python3
-"""Workshop-Folien 'Vault – Technischer Impuls': ruhig, visuell, wenig Text."""
-
-import os
-from pptx import Presentation
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE
-
-# ---- Palette ---------------------------------------------------------------
-INK = RGBColor(0x2A, 0x2F, 0x3A)
-NAVY = RGBColor(0x1F, 0x3A, 0x5F)
-ACCENT = RGBColor(0xC0, 0x49, 0x2F)
-MUTE = RGBColor(0x8A, 0x93, 0xA0)
-SOFT = RGBColor(0xE9, 0xEC, 0xEF) # heller Kasten
-SOFT2 = RGBColor(0xDD, 0xE5, 0xEC) # heller Kasten blau
-LINEC = RGBColor(0xC3, 0xC9, 0xD1)
-BG = RGBColor(0xFF, 0xFF, 0xFF)
-WHITE = RGBColor(0xFF, 0xFF, 0xFF)
-F = "Calibri"
-
-prs = Presentation()
-prs.slide_width = Inches(13.333)
-prs.slide_height = Inches(7.5)
-SW, SH = prs.slide_width, prs.slide_height
-BLANK = prs.slide_layouts[6]
-MX = Inches(0.95)
-
-
-def slide(bg=BG):
- s = prs.slides.add_slide(BLANK)
- r = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, SW, SH)
- r.fill.solid(); r.fill.fore_color.rgb = bg; r.line.fill.background()
- r.shadow.inherit = False
- s.shapes._spTree.remove(r._element); s.shapes._spTree.insert(2, r._element)
- return s
-
-
-def shape(s, kind, x, y, w, h, fill=None, line=None, lw=Pt(1)):
- sh = s.shapes.add_shape(kind, x, y, w, h)
- if fill is None: sh.fill.background()
- else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
- if line is None: sh.line.fill.background()
- else: sh.line.color.rgb = line; sh.line.width = lw
- sh.shadow.inherit = False
- return sh
-
-
-def box(s, x, y, w, h, text="", fill=SOFT, tc=INK, size=15, bold=False,
- rounded=True, line=None, sub=None, sub_c=None):
- kind = MSO_SHAPE.ROUNDED_RECTANGLE if rounded else MSO_SHAPE.RECTANGLE
- sh = shape(s, kind, x, y, w, h, fill=fill, line=line)
- tf = sh.text_frame; tf.word_wrap = True
- tf.vertical_anchor = MSO_ANCHOR.MIDDLE
- tf.margin_top = tf.margin_bottom = Pt(2)
- p = tf.paragraphs[0]; p.alignment = PP_ALIGN.CENTER
- r = p.add_run(); r.text = text
- r.font.size = Pt(size); r.font.bold = bold; r.font.name = F; r.font.color.rgb = tc
- if sub:
- p2 = tf.add_paragraph(); p2.alignment = PP_ALIGN.CENTER; p2.space_before = Pt(2)
- r2 = p2.add_run(); r2.text = sub
- r2.font.size = Pt(11); r2.font.name = F; r2.font.color.rgb = sub_c or MUTE
- return sh
-
-
-def text(s, x, y, w, h, runs, align=PP_ALIGN.LEFT, anchor=MSO_ANCHOR.TOP,
- leading=1.1, space=0):
- tb = s.shapes.add_textbox(x, y, w, h); tf = tb.text_frame
- tf.word_wrap = True; tf.vertical_anchor = anchor
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- p = tf.paragraphs[0]; p.alignment = align; p.line_spacing = leading; p.space_after = Pt(space)
- for t, kw in runs:
- r = p.add_run(); r.text = t
- r.font.size = Pt(kw.get("size", 16)); r.font.bold = kw.get("bold", False)
- r.font.italic = kw.get("italic", False); r.font.name = F
- r.font.color.rgb = kw.get("color", INK)
- return tb
-
-
-def kicker(s, t):
- tb = text(s, MX, Inches(0.62), Inches(11), Inches(0.4),
- [(t.upper(), {"size": 12.5, "color": ACCENT, "bold": True})])
- tb.text_frame.paragraphs[0].runs[0].font._rPr.set('spc', '240')
-
-
-def head(s, t):
- text(s, MX, Inches(1.0), Inches(11.4), Inches(0.9),
- [(t, {"size": 32, "color": NAVY, "bold": True})])
- shape(s, MSO_SHAPE.RECTANGLE, MX, Inches(1.78), Inches(0.6), Pt(4), fill=ACCENT)
-
-
-def caption(s, t):
- text(s, MX, Inches(6.62), Inches(11.4), Inches(0.6),
- [(t, {"size": 16, "color": MUTE})], leading=1.15)
-
-
-def vline(s, x, y, h, color=LINEC):
- shape(s, MSO_SHAPE.RECTANGLE, x, y, Pt(1.6), h, fill=color)
-
-
-# ===========================================================================
-# TITEL
-# ===========================================================================
-s = slide(NAVY)
-shape(s, MSO_SHAPE.RECTANGLE, 0, 0, Inches(0.24), SH, fill=ACCENT)
-shape(s, MSO_SHAPE.RECTANGLE, MX, Inches(2.7), Inches(0.85), Pt(5), fill=ACCENT)
-text(s, MX, Inches(1.7), Inches(10), Inches(0.5),
- [("TECHNISCHER IMPULS", {"size": 14, "color": RGBColor(0xC6,0xD1,0xDE), "bold": True})]
- ).text_frame.paragraphs[0].runs[0].font._rPr.set('spc', '280')
-text(s, MX, Inches(3.05), Inches(11.4), Inches(2.0),
- [("LIS – wohin", {"size": 50, "color": WHITE, "bold": True})])
-text(s, MX, Inches(4.05), Inches(11.4), Inches(2.0),
- [("technisch denken?", {"size": 50, "color": WHITE, "bold": True})])
-
-# ===========================================================================
-# FOLIE 1 – Produkt oder Projekt (Balken-Bild)
-# ===========================================================================
-s = slide()
-kicker(s, "Diagnose")
-head(s, "Produkt oder Projekt?")
-
-base = Inches(5.45) # Grundlinie
-bw, gap = Inches(0.52), Inches(0.16)
-
-
-def bars(cx_start, heights, colors, label):
- n = len(heights)
- for i, (hh, col) in enumerate(zip(heights, colors)):
- x = cx_start + i * (bw + gap)
- h = Inches(hh)
- shape(s, MSO_SHAPE.ROUNDED_RECTANGLE, x, base - h, bw, h, fill=col)
- total = n * bw + (n - 1) * gap
- # Grundlinie
- shape(s, MSO_SHAPE.RECTANGLE, cx_start, base, total, Pt(2), fill=LINEC)
- text(s, cx_start, base + Inches(0.18), total, Inches(0.4),
- [(label, {"size": 18, "color": NAVY, "bold": True})], align=PP_ALIGN.CENTER)
-
-
-bars(Inches(1.5), [0.45, 0.5, 2.7, 0.5, 0.45],
- [MUTE, MUTE, ACCENT, MUTE, MUTE], "Projekt")
-bars(Inches(8.0), [1.7, 2.0, 1.8, 2.1, 1.7],
- [NAVY, NAVY, NAVY, NAVY, NAVY], "Produkt")
-
-# kleine neutrale Unterschriften
-text(s, Inches(1.5), base + Inches(0.6), Inches(3.42), Inches(0.4),
- [("tief in einer Dimension", {"size": 13, "color": MUTE})], align=PP_ALIGN.CENTER)
-text(s, Inches(8.0), base + Inches(0.6), Inches(3.42), Inches(0.4),
- [("breit über viele", {"size": 13, "color": MUTE})], align=PP_ALIGN.CENTER)
-
-# ===========================================================================
-# FOLIE 2 – Eine Schicht dazwischen (Layer-Diagramm)
-# ===========================================================================
-s = slide()
-kicker(s, "Architektur")
-head(s, "Eine Schicht dazwischen")
-
-cxL, cxR = MX, Inches(12.38)
-full_w = cxR - cxL
-
-# oben: Gruppe / Prozesse
-top_y = Inches(2.2)
-chips = ["Reporting", "DFÜ / Anlieferung", "Fusion"]
-cw = Inches(3.2); cg = (full_w - 3 * cw) / 2
-for i, c in enumerate(chips):
- box(s, cxL + i * (cw + cg), top_y, cw, Inches(0.72), c,
- fill=BG, tc=NAVY, size=15, bold=True, line=LINEC)
-
-# Mitte: die Schicht (Hero)
-mid_y = Inches(3.55)
-box(s, cxL, mid_y, full_w, Inches(0.95),
- "Integrations- & Abstraktionsschicht",
- fill=NAVY, tc=WHITE, size=20, bold=True)
-
-# unten: Systeme
-bot_y = Inches(5.15)
-labs = [("Labor A", "LIS"), ("Labor B", "LIS"), ("Vault", "LIS"), ("Labor C", "eigenes LIS")]
-lw = Inches(2.65); lg = (full_w - 4 * lw) / 3
-for i, (nm, sub) in enumerate(labs):
- x = cxL + i * (lw + lg)
- box(s, x, bot_y, lw, Inches(0.95), nm, fill=SOFT, tc=INK, size=16, bold=True,
- sub=sub, sub_c=MUTE)
- # Verbinder Schicht -> System
- vline(s, x + lw / 2, mid_y + Inches(0.95), bot_y - (mid_y + Inches(0.95)))
-
-# Verbinder oben -> Schicht
-for i in range(3):
- cx = cxL + i * (cw + cg) + cw / 2
- vline(s, cx, top_y + Inches(0.72), mid_y - (top_y + Inches(0.72)))
-
-caption(s, "Labore docken an und behalten ihr LIS. Die Schicht verbindet.")
-
-# ===========================================================================
-# FOLIE 3 – Zustand oder Ereignis (Event Sourcing, visuell)
-# ===========================================================================
-s = slide()
-kicker(s, "Modell")
-head(s, "Zustand oder Ereignis")
-
-cxL, cxR = MX, Inches(12.38)
-full_w = cxR - cxL
-
-# --- obere Spur: Zustand ---
-ay = Inches(2.35)
-text(s, cxL, ay - Inches(0.05), Inches(3), Inches(0.4),
- [("Zustand", {"size": 15, "color": MUTE, "bold": True})])
-zy = ay + Inches(0.42)
-box(s, cxL, zy, Inches(2.4), Inches(0.95), "Probe", fill=SOFT, tc=INK, size=16, bold=True)
-# Pfeil "überschreiben"
-shape(s, MSO_SHAPE.RIGHT_ARROW, cxL + Inches(2.65), zy + Inches(0.27),
- Inches(1.5), Inches(0.42), fill=LINEC)
-text(s, cxL + Inches(2.55), zy - Inches(0.18), Inches(1.7), Inches(0.3),
- [("überschreiben", {"size": 11, "color": MUTE, "italic": True})], align=PP_ALIGN.CENTER)
-box(s, cxL + Inches(4.4), zy, Inches(2.7), Inches(0.95), "1 Abrechnung",
- fill=BG, tc=NAVY, size=16, bold=True, line=LINEC)
-
-# Trennlinie
-shape(s, MSO_SHAPE.RECTANGLE, cxL, Inches(4.25), full_w, Pt(1.2), fill=LINEC)
-
-# --- untere Spur: Ereignisse ---
-by = Inches(4.55)
-text(s, cxL, by - Inches(0.05), Inches(3), Inches(0.4),
- [("Ereignisse", {"size": 15, "color": MUTE, "bold": True})])
-ey = by + Inches(0.42)
-ev = ["Eingang", "Messung", "Abrechnung", "Abrechnung"]
-ew = Inches(1.85); eg = Inches(0.32)
-for i, e in enumerate(ev):
- x = cxL + i * (ew + eg)
- col = ACCENT if e == "Abrechnung" else NAVY
- box(s, x, ey, ew, Inches(0.85), e, fill=col, tc=WHITE, size=14, bold=True)
- if i < len(ev) - 1:
- shape(s, MSO_SHAPE.CHEVRON, x + ew + Inches(0.02), ey + Inches(0.24),
- Inches(0.28), Inches(0.38), fill=LINEC)
-# Pfeil zum abgeleiteten Zustand
-last_x = cxL + 4 * (ew + eg)
-shape(s, MSO_SHAPE.RIGHT_ARROW, last_x - Inches(0.05), ey + Inches(0.22),
- Inches(0.7), Inches(0.42), fill=LINEC)
-box(s, last_x + Inches(0.75), ey - Inches(0.05), Inches(2.7), Inches(0.95),
- "Zustand", fill=SOFT2, tc=NAVY, size=15, bold=True,
- sub="abgeleitet", sub_c=MUTE)
-
-caption(s, "Der Zustand entsteht aus den Ereignissen – Mehrfaches inklusive.")
-
-out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Vault_Impuls_Workshop.pptx")
-prs.save(out)
-print("saved", out)
diff --git a/limbach/folie10.py b/limbach/folie10.py
deleted file mode 100644
index 53242d1..0000000
--- a/limbach/folie10.py
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/usr/bin/env python3
-"""Folie 10 – Was bringt der Integrationsserver? Wichtige Funktionen (adesso-Stil, deutsch)."""
-
-import os
-from pptx import Presentation
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE
-from adesso_style import (WHITE, INK, BLUE, TEAL, GREEN, CORAL, LIGHT, MUTE, RECF,
- F, FC, chrome)
-
-BG = RGBColor(0x0A, 0x3D, 0x6B)
-SUBC = RGBColor(0x3C, 0x4A, 0x5A)
-
-prs = Presentation(); prs.slide_width = Inches(13.333); prs.slide_height = Inches(7.5)
-SW, SH = prs.slide_width, prs.slide_height
-s = prs.slides.add_slide(prs.slide_layouts[6])
-
-
-def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), adj=None):
- sh = s.shapes.add_shape(kind, Inches(x), Inches(y), Inches(w), Inches(h))
- if fill is None: sh.fill.background()
- else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
- if line is None: sh.line.fill.background()
- else: sh.line.color.rgb = line; sh.line.width = lw
- if adj is not None:
- try: sh.adjustments[0] = adj
- except Exception: pass
- sh.shadow.inherit = False
- return sh
-
-
-def txt(x, y, w, h, t, size=12, color=WHITE, bold=False, italic=False,
- align=PP_ALIGN.LEFT, font=F, anchor=MSO_ANCHOR.MIDDLE):
- tb = s.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)); tf = tb.text_frame
- tf.word_wrap = True; tf.vertical_anchor = anchor
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- p = tf.paragraphs[0]; p.alignment = align
- r = p.add_run(); r.text = t
- r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic
- r.font.name = font; r.font.color.rgb = color
- return tb
-
-
-def card(x, y, w, h, title, body):
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=WHITE, adj=0.06)
- shp(MSO_SHAPE.RECTANGLE, x, y + 0.16, 0.12, h - 0.32, fill=CORAL)
- txt(x + 0.32, y + 0.18, w - 0.48, 0.78, title, size=13.5, color=INK, bold=True,
- anchor=MSO_ANCHOR.TOP)
- txt(x + 0.32, y + 0.92, w - 0.52, h - 1.06, body, size=11, color=SUBC,
- anchor=MSO_ANCHOR.TOP)
-
-
-# ---- Hintergrund + Header --------------------------------------------------
-shp(MSO_SHAPE.RECTANGLE, 0, 0, SW.inches, SH.inches, fill=BG)
-chrome(s, "Was bringt der Integrationsserver?", 11)
-
-shp(MSO_SHAPE.RECTANGLE, 0.45, 1.12, 0.16, 0.22, fill=CORAL)
-txt(0.71, 1.05, 9.0, 0.34, "Wichtige Funktionen", size=15, color=WHITE, bold=True,
- anchor=MSO_ANCHOR.MIDDLE)
-
-cards = [
- ("Zentrale Anbindung (Adapter)",
- "Jedes System über einen Adapter — neues System = neuer Adapter, ohne Eingriff in den Bestand."),
- ("Routing der Aufträge",
- "Integriert mehrere LIS- und Abrechnungs-Instanzen — Aufträge werden gezielt an das passende LIS bzw. die richtige Abrechnung verteilt."),
- ("Routing Engine",
- "Verteilt Events regelbasiert an die richtigen Ziele — z. B. Proben-Routing."),
- ("Event Store (append-only)",
- "Kanonische Wahrheit, vollständige Historie, jederzeit Replay-fähig."),
- ("Projektionen / Read-Models",
- "Bedarfsgerechte Sichten: Auftragsstatus, Reporting, Leistungsverzeichnis …"),
- ("Stammdaten / MDM",
- "Single Point of Truth — Daten einmal pflegen, doppelte Stammdatenpflege entfällt."),
- ("Monitoring & Überwachung",
- "Status, Fehler-Queues und Alerting für alle Schnittstellen an einer Stelle."),
- ("Audit-Trail, Replay & Archiv",
- "Revisionssicher & manipulationssicher; Wiederaufsetzen per Replay; Langzeit-Archiv."),
-]
-
-cw, ch = 2.92, 2.45
-cols = [0.45, 3.62, 6.79, 9.96]
-rows = [1.58, 4.22]
-for i, (title, body) in enumerate(cards):
- card(cols[i % 4], rows[i // 4], cw, ch, title, body)
-
-out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Folie10.pptx")
-prs.save(out)
-print("saved", out)
diff --git a/limbach/folie2.py b/limbach/folie2.py
deleted file mode 100644
index 28f6e8f..0000000
--- a/limbach/folie2.py
+++ /dev/null
@@ -1,174 +0,0 @@
-#!/usr/bin/env python3
-"""Folie 2 – Grenzen der Vault-Integration (adesso-Styling).
-Kette: Auftrag -> Auftragsannahme -> Schattenbuchhaltung (SPOT) -> Vault ->
-Zusammenführung."""
-
-import os
-from pptx import Presentation
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE
-from adesso_style import (WHITE, INK, CORAL, LIGHT, RECF, F, FC,
- alpha, line_alpha, paint_background, chrome)
-
-prs = Presentation()
-prs.slide_width = Inches(13.333)
-prs.slide_height = Inches(7.5)
-s = prs.slides.add_slide(prs.slide_layouts[6])
-
-
-def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), rot=0):
- sh = s.shapes.add_shape(kind, x, y, w, h)
- if fill is None: sh.fill.background()
- else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
- if line is None: sh.line.fill.background()
- else: sh.line.color.rgb = line; sh.line.width = lw
- if rot: sh.rotation = rot
- sh.shadow.inherit = False
- return sh
-
-
-def boxtext(sh, t, size=14, color=INK, bold=False, font=F):
- tf = sh.text_frame; tf.word_wrap = True
- tf.vertical_anchor = MSO_ANCHOR.MIDDLE
- tf.margin_left = tf.margin_right = Pt(4); tf.margin_top = tf.margin_bottom = Pt(1)
- p = tf.paragraphs[0]; p.alignment = PP_ALIGN.CENTER
- r = p.add_run(); r.text = t
- r.font.size = Pt(size); r.font.bold = bold; r.font.name = font; r.font.color.rgb = color
-
-
-def txt(x, y, w, h, t, size=14, color=INK, bold=False, italic=False,
- align=PP_ALIGN.LEFT, spc=None, lead=1.1, anchor=MSO_ANCHOR.TOP, font=F):
- tb = s.shapes.add_textbox(x, y, w, h); tf = tb.text_frame
- tf.word_wrap = True; tf.vertical_anchor = anchor
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- p = tf.paragraphs[0]; p.alignment = align; p.line_spacing = lead
- r = p.add_run(); r.text = t
- r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic
- r.font.name = font; r.font.color.rgb = color
- if spc: r.font._rPr.set('spc', str(spc))
- return tb
-
-
-paint_background(s, prs.slide_width, prs.slide_height)
-chrome(s, "Grenzen der Vault-Integration?", 2)
-
-# ---- Linke Spalte ----------------------------------------------------------
-def claim(y, t, bold=False, sub=None):
- shp(MSO_SHAPE.RECTANGLE, Inches(0.95), y + Inches(0.08), Inches(0.14), Inches(0.14), fill=CORAL)
- txt(Inches(1.28), y, Inches(4.5), Inches(0.4), t, size=16.5, color=WHITE, bold=bold)
- if sub:
- txt(Inches(1.28), y + Inches(0.34), Inches(4.5), Inches(0.32), sub,
- size=12.5, color=LIGHT, italic=True)
-
-
-claim(Inches(2.2), "Middleware kapselt den Rand – den Kern nicht", bold=True)
-claim(Inches(2.95), "Mischaufträge nur als Schattenmodell",
- sub="aufwändig · fragil · fehleranfällig")
-claim(Inches(3.95), "die Fachwahrheit verlässt den Kern")
-
-shp(MSO_SHAPE.RECTANGLE, Inches(0.95), Inches(4.95), Inches(0.5), Pt(3.5), fill=CORAL)
-txt(Inches(0.95), Inches(5.12), Inches(4.85), Inches(1.1),
- "Die Schattenbuchhaltung wird zum Single Point of Truth – nicht Vault.",
- size=19, color=WHITE, bold=True, lead=1.08, font=FC)
-txt(Inches(0.95), Inches(6.45), Inches(4.85), Inches(0.4),
- "Genau die Rolle, die Vault halten müsste.", size=13.5, color=LIGHT, italic=True)
-
-# ===========================================================================
-# RECHTS: Kette Auftrag -> Auftragsannahme -> SPOT -> Vault -> Zusammenführung
-# ===========================================================================
-fx, fy, fw, fh = Inches(6.25), Inches(2.1), Inches(5.9), Inches(4.72)
-panel = shp(MSO_SHAPE.ROUNDED_RECTANGLE, fx, fy, fw, fh, fill=WHITE)
-alpha(panel, 10)
-panel.line.color.rgb = WHITE; panel.line.width = Pt(1)
-line_alpha(panel, 35)
-txt(fx + Inches(0.3), fy + Inches(0.12), fw - Inches(0.6), Inches(0.3),
- "Auftragsweg – hin und zurück durch den Layer", size=12.5, color=WHITE, bold=True)
-
-cxc = fx + Inches(2.05)
-bw = Inches(2.7)
-bx = cxc - bw / 2
-
-
-def down(y, label=None):
- shp(MSO_SHAPE.DOWN_ARROW, cxc - Inches(0.11), y, Inches(0.22), Inches(0.22), fill=LIGHT)
- if label:
- txt(cxc + Inches(0.22), y - Inches(0.02), Inches(1.7), Inches(0.3), label,
- size=11, color=LIGHT, italic=True, anchor=MSO_ANCHOR.MIDDLE)
-
-
-# 1) Auftrag
-b = shp(MSO_SHAPE.ROUNDED_RECTANGLE, bx, fy + Inches(0.44), bw, Inches(0.40), fill=WHITE)
-boxtext(b, "Auftrag · Mischauftrag", size=12.5, color=INK, bold=True)
-down(fy + Inches(0.86))
-
-# 2) Auftragsannahme (ersetzt altes LIS)
-b = shp(MSO_SHAPE.ROUNDED_RECTANGLE, bx, fy + Inches(1.06), bw, Inches(0.40), fill=WHITE)
-boxtext(b, "Auftragsannahme", size=13, color=INK, bold=True)
-down(fy + Inches(1.48), "Magic")
-
-# 3) Schattenbuchhaltung = Rahmen um den Vault-Kasten
-frx, fry = bx - Inches(0.22), fy + Inches(1.72)
-frw, frh = bw + Inches(0.50), Inches(2.22)
-frame = shp(MSO_SHAPE.ROUNDED_RECTANGLE, frx, fry, frw, frh,
- fill=RGBColor(0xFF, 0xE3, 0x9B))
-alpha(frame, 22)
-frame.line.color.rgb = CORAL; frame.line.width = Pt(2)
-
-# Überschrift + Positions-Mapping (oben im Rahmen)
-txt(frx, fy + Inches(1.78), frw, Inches(0.28), "Schattenbuchhaltung",
- size=13, color=CORAL, bold=True, align=PP_ALIGN.CENTER)
-txt(frx, fy + Inches(2.07), frw, Inches(0.24), "Positions-Mapping",
- size=11.5, color=WHITE, align=PP_ALIGN.CENTER)
-
-# aktiver SPOT-Stern (rechts neben dem Rahmen)
-shp(MSO_SHAPE.STAR_5_POINT, Inches(10.75), fy + Inches(1.80), Inches(0.5), Inches(0.5), fill=CORAL)
-txt(Inches(9.95), fy + Inches(2.32), Inches(2.1), Inches(0.28), "Single Point of Truth",
- size=10.5, color=CORAL, bold=True, align=PP_ALIGN.CENTER)
-down(fy + Inches(2.33))
-
-# 4) Vault speichert (aufgesplittet) – im Rahmen
-b = shp(MSO_SHAPE.ROUNDED_RECTANGLE, bx, fy + Inches(2.50), bw, Inches(0.70), fill=WHITE)
-txt(bx, fy + Inches(2.55), bw, Inches(0.3), "Vault · 1:1 · Speicher",
- size=13, color=INK, bold=True, align=PP_ALIGN.CENTER)
-for k in range(3):
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, cxc - Inches(1.08) + k * Inches(0.78),
- fy + Inches(2.87), Inches(0.62), Inches(0.3), fill=RECF)
- txt(cxc - Inches(1.08) + k * Inches(0.78), fy + Inches(2.87), Inches(0.62), Inches(0.3),
- "Rec", size=9.5, color=INK, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
-# Geist-Stern (durchgestrichen) – die Wahrheit müsste hier liegen
-gx = Inches(10.79)
-gs = shp(MSO_SHAPE.STAR_5_POINT, gx, fy + Inches(2.55), Inches(0.42), Inches(0.42))
-gs.fill.background(); gs.line.color.rgb = LIGHT; gs.line.width = Pt(1.25)
-shp(MSO_SHAPE.RECTANGLE, gx - Inches(0.02), fy + Inches(2.73), Inches(0.46), Pt(2),
- fill=CORAL, rot=20)
-txt(Inches(9.95), fy + Inches(3.02), Inches(2.1), Inches(0.3), "müsste hier liegen",
- size=10, color=LIGHT, align=PP_ALIGN.CENTER)
-down(fy + Inches(3.22))
-
-# 5) Daten zusammenführen (unten im Rahmen)
-txt(frx, fy + Inches(3.42), frw, Inches(0.28), "Daten Zusammenführen",
- size=12.5, color=WHITE, bold=True, align=PP_ALIGN.CENTER)
-
-# 6) Weiterverarbeitung – grauer Pfeil + weißer Kasten unter dem Rahmen
-shp(MSO_SHAPE.DOWN_ARROW, cxc - Inches(0.11), fy + Inches(4.00), Inches(0.22), Inches(0.22),
- fill=RGBColor(0x8C, 0x8C, 0x8C))
-b = shp(MSO_SHAPE.ROUNDED_RECTANGLE, bx, fy + Inches(4.26), bw, Inches(0.40), fill=WHITE)
-boxtext(b, "Weiterverarbeitung", size=12.5, color=INK, bold=True)
-
-# Rückweg (Lesen) – Pfeil links nach oben, Label vertikal daneben
-ua = shp(MSO_SHAPE.UP_ARROW, fx + Inches(0.08), fy + Inches(1.55), Inches(0.26), Inches(2.30),
- fill=LIGHT)
-alpha(ua, 55)
-lt = s.shapes.add_textbox(fx - Inches(0.95), fy + Inches(2.40), Inches(2.2), Inches(0.3))
-ltf = lt.text_frame; ltf.word_wrap = False
-ltf.margin_left = ltf.margin_right = ltf.margin_top = ltf.margin_bottom = Pt(0)
-lp = ltf.paragraphs[0]; lp.alignment = PP_ALIGN.CENTER
-lr = lp.add_run(); lr.text = "Lesen: zurück durch den Layer"
-lr.font.size = Pt(9.5); lr.font.name = F; lr.font.color.rgb = CORAL
-lt.rotation = 270
-
-out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Folie2.pptx")
-prs.save(out)
-print("saved", out)
diff --git a/limbach/folie3.py b/limbach/folie3.py
deleted file mode 100644
index 829bc44..0000000
--- a/limbach/folie3.py
+++ /dev/null
@@ -1,283 +0,0 @@
-#!/usr/bin/env python3
-"""Folie 3 – LIS mit Umsystemen (Adapter, links/rechts) und andockenden Modulen
-(unten), unter einer Steuerungs-/Governance-Schicht; weitere LIS angedeutet."""
-
-import os
-from pptx import Presentation
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE
-from adesso_style import (WHITE, INK, BLUE, TEAL, GREEN, CORAL, LIGHT, MUTE, RECF,
- F, FC, paint_background, chrome)
-
-# Rollen-Mapping auf die adesso-Palette
-NAVY = INK # dunkle Strukturelemente (Bar, LIS-Kern)
-ACCENT = CORAL # Adapter-Linien
-AMBER = GREEN # zweites Modul
-LINEC = LIGHT # Verbinder / feine Linien
-HINT = RGBColor(0xE6, 0xEF, 0xF8) # helle "weitere LIS"-Karten
-HINTL = RGBColor(0xC4, 0xD6, 0xE8)
-TINT_T = WHITE # Modul-Boxen weiß
-TINT_A = WHITE
-UMS = WHITE # Umsystem-Boxen weiß
-BG = WHITE
-
-prs = Presentation()
-prs.slide_width = Inches(13.333)
-prs.slide_height = Inches(7.5)
-s = prs.slides.add_slide(prs.slide_layouts[6])
-paint_background(s, prs.slide_width, prs.slide_height)
-
-
-def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), rot=0):
- sh = s.shapes.add_shape(kind, x, y, w, h)
- if fill is None: sh.fill.background()
- else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
- if line is None: sh.line.fill.background()
- else: sh.line.color.rgb = line; sh.line.width = lw
- if rot: sh.rotation = rot
- sh.shadow.inherit = False
- return sh
-
-
-def boxtext(sh, t, size=14, color=INK, bold=False):
- tf = sh.text_frame; tf.word_wrap = True
- tf.vertical_anchor = MSO_ANCHOR.MIDDLE
- tf.margin_left = tf.margin_right = Pt(3); tf.margin_top = tf.margin_bottom = Pt(1)
- p = tf.paragraphs[0]; p.alignment = PP_ALIGN.CENTER
- r = p.add_run(); r.text = t
- r.font.size = Pt(size); r.font.bold = bold; r.font.name = F; r.font.color.rgb = color
-
-
-def txt(x, y, w, h, t, size=14, color=INK, bold=False, italic=False,
- align=PP_ALIGN.LEFT, spc=None):
- tb = s.shapes.add_textbox(x, y, w, h); tf = tb.text_frame
- tf.word_wrap = True; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- p = tf.paragraphs[0]; p.alignment = align
- r = p.add_run(); r.text = t
- r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic
- r.font.name = F; r.font.color.rgb = color
- if spc: r.font._rPr.set('spc', str(spc))
- return tb
-
-
-def hline(x, y, w, color=LINEC, weight=Pt(1.4)):
- shp(MSO_SHAPE.RECTANGLE, x, y - weight / 2, w, weight, fill=color)
-
-
-def vline(x, y, h, color=LINEC, weight=Pt(1.4)):
- shp(MSO_SHAPE.RECTANGLE, x - weight / 2, y, weight, h, fill=color)
-
-
-# ---- Kopf ------------------------------------------------------------------
-chrome(s, "Offen – und gesteuert", 3)
-
-x0, x1 = Inches(0.95), Inches(12.38)
-
-
-# ===========================================================================
-# GOVERNANCE – Icon-Karten + Strich
-# ===========================================================================
-def card(cx, label):
- cw_, ch_ = Inches(2.05), Inches(1.25)
- x, y = cx - cw_ / 2, Inches(1.5)
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, cw_, ch_, fill=BG, line=LINEC, lw=Pt(1.25))
- txt(x, y + ch_ - Inches(0.4), cw_, Inches(0.34), label,
- size=14, color=NAVY, bold=True, align=PP_ALIGN.CENTER)
- return cx, y + Inches(0.42)
-
-
-def regler(cx, cy):
- tw = Inches(0.62)
- left = cx - tw / 2
- for j, frac in enumerate([0.30, 0.68, 0.48]):
- ty = cy - Inches(0.18) + j * Inches(0.18)
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, left, ty - Inches(0.022), tw, Inches(0.045), fill=LINEC)
- kx = left + Inches(0.62 * frac)
- shp(MSO_SHAPE.OVAL, kx - Inches(0.07), ty - Inches(0.07),
- Inches(0.14), Inches(0.14), fill=NAVY)
-
-
-cx1, cy1 = card(Inches(4.75), "Steuerung")
-cx2, cy2 = card(Inches(6.95), "Reporting")
-cx3, cy3 = card(Inches(9.15), "Governance")
-
-regler(cx1, cy1)
-
-# Reporting – Zahlenreihen
-nb = s.shapes.add_textbox(cx2 - Inches(0.85), cy2 - Inches(0.36), Inches(1.7), Inches(0.72))
-tf = nb.text_frame; tf.word_wrap = False; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
-tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
-for i, row in enumerate(["3 8 1 4 7", "6 0 9 2 5", "5 7 2 8 1"]):
- p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
- p.alignment = PP_ALIGN.CENTER; p.line_spacing = 0.95
- r = p.add_run(); r.text = row
- r.font.size = Pt(11); r.font.name = "Consolas"; r.font.color.rgb = MUTE
-
-# Governance – §
-gtb = s.shapes.add_textbox(cx3 - Inches(0.6), cy3 - Inches(0.42), Inches(1.2), Inches(0.8))
-gtf = gtb.text_frame; gtf.vertical_anchor = MSO_ANCHOR.MIDDLE
-gp = gtf.paragraphs[0]; gp.alignment = PP_ALIGN.CENTER
-gr = gp.add_run(); gr.text = "§"; gr.font.size = Pt(34); gr.font.bold = True
-gr.font.name = F; gr.font.color.rgb = NAVY
-
-gov_y = Inches(3.05)
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, x0, gov_y - Inches(0.07), x1 - x0, Inches(0.14), fill=NAVY)
-for cc in (cx1, cx2, cx3):
- vline(cc, Inches(2.75), gov_y - Inches(0.07) - Inches(2.75), color=LINEC, weight=Pt(1))
-
-
-# ===========================================================================
-# LIS + Umsysteme (Adapter links/rechts) + Module (andocken, unten)
-# ===========================================================================
-core_x, core_w = Inches(3.7), Inches(2.3)
-core_y, core_h = Inches(4.3), Inches(1.2)
-core_cx = core_x + core_w / 2
-core_by = core_y + core_h
-
-# Adapter-Schicht: echte Schicht als Hülle um den Kern (Trennung)
-lay_pad_x, lay_pad_t = Inches(0.24), Inches(0.30)
-lay_x = core_x - lay_pad_x
-lay_w = core_w + lay_pad_x * 2
-lay_y = core_y - lay_pad_t
-lay_h = core_h + lay_pad_t
-lay_right = lay_x + lay_w
-
-
-def adapter(xc, yc):
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, xc - Inches(0.10), yc - Inches(0.11),
- Inches(0.16), Inches(0.22), fill=ACCENT)
- shp(MSO_SHAPE.RECTANGLE, xc + Inches(0.06), yc - Inches(0.055), Inches(0.1), Pt(2.4), fill=ACCENT)
- shp(MSO_SHAPE.RECTANGLE, xc + Inches(0.06), yc + Inches(0.03), Inches(0.1), Pt(2.4), fill=ACCENT)
-
-
-def dock(xc, yc):
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, xc - Inches(0.1), yc - Inches(0.1),
- Inches(0.2), Inches(0.2), fill=NAVY)
- shp(MSO_SHAPE.OVAL, xc - Inches(0.055), yc - Inches(0.055), Inches(0.11), Inches(0.11),
- fill=ACCENT)
-
-
-def icon_truck(ix, iy): # Anlieferung
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, ix - Inches(0.20), iy - Inches(0.10),
- Inches(0.24), Inches(0.16), fill=NAVY)
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, ix + Inches(0.05), iy - Inches(0.035),
- Inches(0.12), Inches(0.095), fill=NAVY)
- for wx in (ix - Inches(0.11), ix + Inches(0.08)):
- shp(MSO_SHAPE.OVAL, wx - Inches(0.038), iy + Inches(0.05),
- Inches(0.076), Inches(0.076), fill=NAVY)
-
-
-def icon_device(ix, iy): # Gerät
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, ix - Inches(0.16), iy - Inches(0.14),
- Inches(0.32), Inches(0.28), fill=NAVY)
- shp(MSO_SHAPE.RECTANGLE, ix - Inches(0.11), iy - Inches(0.10),
- Inches(0.22), Inches(0.085), fill=RGBColor(0x34, 0x4E, 0x70))
- shp(MSO_SHAPE.OVAL, ix - Inches(0.085), iy + Inches(0.03), Inches(0.055), Inches(0.055), fill=TEAL)
- shp(MSO_SHAPE.OVAL, ix + Inches(0.03), iy + Inches(0.03), Inches(0.055), Inches(0.055), fill=AMBER)
-
-
-def icon_dfu(ix, iy): # DFÜ
- shp(MSO_SHAPE.RIGHT_ARROW, ix - Inches(0.16), iy - Inches(0.12), Inches(0.32), Inches(0.095),
- fill=NAVY)
- shp(MSO_SHAPE.LEFT_ARROW, ix - Inches(0.16), iy + Inches(0.025), Inches(0.32), Inches(0.095),
- fill=ACCENT)
-
-
-g = Inches(0.10) # Abstand Adapter-Linie <-> LIS
-th = Inches(0.08) # Dicke der roten Adapter-Linie
-
-# Governance -> obere Adapter-Linie am Kern
-vline(core_cx, gov_y + Inches(0.07), (core_y - g - th) - (gov_y + Inches(0.07)),
- color=LINEC, weight=Pt(1))
-
-uw, uh = Inches(1.55), Inches(0.6)
-
-
-def ums_box(bx, yc, name, icon_fn):
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, bx, yc - uh / 2, uw, uh, fill=UMS, line=LINEC)
- icon_fn(bx + Inches(0.32), yc)
- txt(bx + Inches(0.58), yc - Inches(0.16), uw - Inches(0.64), Inches(0.32), name,
- size=12, color=INK, align=PP_ALIGN.LEFT)
-
-
-# Umsysteme links -> Adapter-Schichten am linken Kernrand
-lx = Inches(0.8)
-ums_box(lx, Inches(4.6), "Anlieferung", icon_truck)
-ums_box(lx, Inches(5.2), "DFÜ", icon_dfu)
-for yc in (Inches(4.6), Inches(5.2)):
- hline(lx + uw, yc, (core_x - g - th) - (lx + uw))
-
-# Umsystem rechts -> Adapter-Linie am rechten Kernrand
-gx = Inches(6.65)
-ums_box(gx, Inches(4.9), "Geräte", icon_device)
-hline(core_x + core_w + g + th, Inches(4.9), gx - (core_x + core_w + g + th))
-
-# ---- LIS-Kern -------------------------------------------------------------
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, core_x, core_y, core_w, core_h, fill=NAVY)
-sh = shp(MSO_SHAPE.ROUNDED_RECTANGLE, core_x, core_y, core_w, core_h, fill=NAVY)
-boxtext(sh, "LIS", size=22, color=WHITE, bold=True)
-
-
-# ---- 5 Adapter-Linien – je Schnittstelle eine, mit Abstand zum Kern -------
-def rbar_v(outer_x, yc, h=Inches(0.55)): # vertikal, linker/rechter Rand
- shp(MSO_SHAPE.RECTANGLE, outer_x, yc - h / 2, th, h, fill=ACCENT)
-
-
-def rbar_h(xc, outer_y, w): # horizontal, oben/unten
- shp(MSO_SHAPE.RECTANGLE, xc - w / 2, outer_y, w, th, fill=ACCENT)
-
-
-rbar_v(core_x - g - th, Inches(4.6)) # 1) Anlieferung
-rbar_v(core_x - g - th, Inches(5.2)) # 2) DFÜ
-rbar_h(core_cx, core_y - g - th, Inches(1.15)) # 3) nach oben (Steuerung)
-rbar_v(core_x + core_w + g, Inches(4.9)) # 4) Geräte
-rbar_h(core_cx, core_by + g, core_w - Inches(0.2)) # 5) Fachliche Verarbeitung
-
-# Fachliche Verarbeitung (unten): Module an der unteren Adapter-Linie
-mw, mh = Inches(1.7), Inches(0.6)
-my = Inches(6.05)
-for nm, fill, tc, mcx in [("Hochdurchsatz", TINT_T, TEAL, Inches(3.85)),
- ("Spezial", TINT_A, AMBER, Inches(5.85))]:
- vline(mcx, core_by + g + th, my - (core_by + g + th), color=LINEC, weight=Pt(1))
- sh = shp(MSO_SHAPE.ROUNDED_RECTANGLE, mcx - mw / 2, my, mw, mh, fill=fill, line=tc, lw=Pt(1.5))
- boxtext(sh, nm, size=12.5, color=INK, bold=True)
-
-txt(Inches(2.9), my + mh + Inches(0.12), Inches(4.0), Inches(0.3), "Fachliche Verarbeitung",
- size=12, color=LIGHT, bold=True, align=PP_ALIGN.CENTER)
-
-
-# ===========================================================================
-# WEITERE LIS – überlappend, nur angedeutet
-# ===========================================================================
-hw_, hh_ = Inches(1.8), Inches(2.0)
-
-def mini_lis(hx, hy, faded=False):
- fill = RGBColor(0xF4, 0xF6, 0xF8) if faded else HINT
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, hx, hy, hw_, hh_, fill=fill, line=HINTL, lw=Pt(1.25))
- hdc = shp(MSO_SHAPE.ROUNDED_RECTANGLE, hx, hy, hw_, Inches(0.46),
- fill=HINTL if not faded else RGBColor(0xDF, 0xE4, 0xEA))
- boxtext(hdc, "LIS", size=14, color=NAVY, bold=True)
- for k in range(3):
- yy = hy + Inches(0.66) + k * Inches(0.4)
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, hx + Inches(0.2), yy, hw_ - Inches(0.4),
- Inches(0.28), fill=WHITE, line=HINTL, lw=Pt(0.75))
-
-mini_lis(Inches(10.5), Inches(4.35), faded=True)
-mini_lis(Inches(10.0), Inches(4.75), faded=False)
-vline(Inches(10.0) + hw_ / 2, gov_y + Inches(0.07), Inches(4.75) - (gov_y + Inches(0.07)),
- color=LINEC, weight=Pt(1))
-txt(Inches(9.9), Inches(4.35) + hh_ + Inches(0.2), Inches(2.4), Inches(0.35), "weitere LIS",
- size=13, color=LIGHT, align=PP_ALIGN.CENTER)
-
-# ---- Mini-Legende ----------------------------------------------------------
-ly = Inches(7.05)
-shp(MSO_SHAPE.RECTANGLE, Inches(7.55), ly - Inches(0.11), th, Inches(0.22), fill=ACCENT)
-txt(Inches(7.8), ly - Inches(0.16), Inches(3.2), Inches(0.32),
- "Adapter-Schicht – je Schnittstelle eine", size=11.5, color=LIGHT)
-
-out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Folie3.pptx")
-prs.save(out)
-print("saved", out)
diff --git a/limbach/folie3b.py b/limbach/folie3b.py
deleted file mode 100644
index 2ba128c..0000000
--- a/limbach/folie3b.py
+++ /dev/null
@@ -1,180 +0,0 @@
-#!/usr/bin/env python3
-"""Folie 4 (eingehängt nach Folie 3) – Architektur der Modularisierung:
-Modularer Monolith vs. Microservices, anschaulich im Containerumfeld.
-Links: 1 Container, Module mit In-Process-Calls, 1 geteilte DB.
-Rechts: N Container, Services über Netzwerk, DB je Service.
-Unten: kompakte Gegenüberstellung der wesentlichen Unterschiede."""
-
-import os
-from pptx import Presentation
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE
-from adesso_style import (WHITE, INK, BLUE, TEAL, GREEN, CORAL, LIGHT, MUTE, RECF,
- F, FC, paint_background, chrome)
-
-NAVY = INK
-ACCENT = CORAL
-LINEC = LIGHT
-
-prs = Presentation()
-prs.slide_width = Inches(13.333)
-prs.slide_height = Inches(7.5)
-s = prs.slides.add_slide(prs.slide_layouts[6])
-paint_background(s, prs.slide_width, prs.slide_height)
-
-
-def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), rot=0):
- sh = s.shapes.add_shape(kind, x, y, w, h)
- if fill is None: sh.fill.background()
- else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
- if line is None: sh.line.fill.background()
- else: sh.line.color.rgb = line; sh.line.width = lw
- if rot: sh.rotation = rot
- sh.shadow.inherit = False
- return sh
-
-
-def boxtext(sh, t, size=14, color=INK, bold=False):
- tf = sh.text_frame; tf.word_wrap = True
- tf.vertical_anchor = MSO_ANCHOR.MIDDLE
- tf.margin_left = tf.margin_right = Pt(3); tf.margin_top = tf.margin_bottom = Pt(1)
- p = tf.paragraphs[0]; p.alignment = PP_ALIGN.CENTER
- r = p.add_run(); r.text = t
- r.font.size = Pt(size); r.font.bold = bold; r.font.name = F; r.font.color.rgb = color
-
-
-def txt(x, y, w, h, t, size=14, color=INK, bold=False, italic=False,
- align=PP_ALIGN.LEFT, spc=None):
- tb = s.shapes.add_textbox(x, y, w, h); tf = tb.text_frame
- tf.word_wrap = True; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- p = tf.paragraphs[0]; p.alignment = align
- r = p.add_run(); r.text = t
- r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic
- r.font.name = F; r.font.color.rgb = color
- if spc: r.font._rPr.set('spc', str(spc))
- return tb
-
-
-def vline(x, y, h, color=LINEC, weight=Pt(1.4)):
- shp(MSO_SHAPE.RECTANGLE, x - weight / 2, y, weight, h, fill=color)
-
-
-def hline(x, y, w, color=LINEC, weight=Pt(1.4)):
- shp(MSO_SHAPE.RECTANGLE, x, y - weight / 2, w, weight, fill=color)
-
-
-# ---- Kopf + Kernaussage ----------------------------------------------------
-chrome(s, "Architektur der Modularisierung", 4)
-txt(Inches(1.25), Inches(0.98), Inches(11.6), Inches(0.34),
- "Gleiche fachlichen Schnitte – der Unterschied ist die Laufzeit- und Deployment-Grenze.",
- size=14, color=LIGHT, italic=True)
-
-DOT = [TEAL, GREEN, BLUE] # gleiche Module/Services beidseitig farblich verankert
-LET = ["A", "B", "C"]
-
-# ===========================================================================
-# Spalten-Titel
-# ===========================================================================
-cL = Inches(3.6) # Mittelpunkt linke Spalte
-cR = Inches(9.75) # Mittelpunkt rechte Spalte
-
-txt(Inches(0.95), Inches(1.5), Inches(5.3), Inches(0.32), "Modularer Monolith",
- size=18, color=WHITE, bold=True, align=PP_ALIGN.CENTER)
-txt(Inches(0.95), Inches(1.84), Inches(5.3), Inches(0.26), "1 Deployable · 1 Prozess",
- size=11.5, color=LIGHT, align=PP_ALIGN.CENTER)
-
-txt(Inches(7.0), Inches(1.5), Inches(5.5), Inches(0.32), "Microservices",
- size=18, color=WHITE, bold=True, align=PP_ALIGN.CENTER)
-txt(Inches(7.0), Inches(1.84), Inches(5.5), Inches(0.26), "N Deployables · N Prozesse",
- size=11.5, color=LIGHT, align=PP_ALIGN.CENTER)
-
-# ===========================================================================
-# LINKS – Modularer Monolith: 1 Container, Module, geteilte DB
-# ===========================================================================
-cx_x, cx_w, cx_y, cx_h = Inches(0.95), Inches(5.3), Inches(2.2), Inches(1.6)
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, cx_x, cx_y, cx_w, cx_h, line=WHITE, lw=Pt(1.5))
-txt(cx_x + Inches(0.15), cx_y + Inches(0.05), Inches(2.0), Inches(0.26), "1 Container",
- size=11, color=LIGHT, bold=True)
-
-mw, mh, my = Inches(1.35), Inches(0.8), Inches(2.62)
-mcx = [Inches(2.05), Inches(3.6), Inches(5.15)]
-for i, mx in enumerate(mcx):
- sh = shp(MSO_SHAPE.ROUNDED_RECTANGLE, mx - mw / 2, my, mw, mh, fill=WHITE, line=LINEC, lw=Pt(1))
- boxtext(sh, "Modul " + LET[i], size=13, color=INK, bold=True)
- shp(MSO_SHAPE.OVAL, mx - Inches(0.07), my + Inches(0.12), Inches(0.14), Inches(0.14), fill=DOT[i])
-# In-Process-Pfeile zwischen den Modulen
-for ax in (Inches(2.725), Inches(4.275)):
- shp(MSO_SHAPE.RIGHT_ARROW, ax, my + mh / 2 - Inches(0.09), Inches(0.2), Inches(0.18), fill=ACCENT)
-txt(cx_x, cx_y + cx_h - Inches(0.34), cx_w, Inches(0.26), "In-Process-Aufrufe · Nanosekunden",
- size=11, color=LIGHT, align=PP_ALIGN.CENTER)
-
-# geteilte Datenbank
-db_w, db_h, db_y = Inches(1.5), Inches(0.95), Inches(4.0)
-vline(cL, cx_y + cx_h, db_y - (cx_y + cx_h), color=LINEC, weight=Pt(1.4))
-sh = shp(MSO_SHAPE.CAN, cL - db_w / 2, db_y, db_w, db_h, fill=WHITE, line=LINEC, lw=Pt(1))
-boxtext(sh, "DB", size=14, color=INK, bold=True)
-txt(cx_x, db_y + db_h + Inches(0.06), cx_w, Inches(0.28), "1 geteilte Datenbank",
- size=12.5, color=WHITE, bold=True, align=PP_ALIGN.CENTER)
-
-# ===========================================================================
-# RECHTS – Microservices: Netzwerk-Bus, N Container, DB je Service
-# ===========================================================================
-bar_x, bar_w, bar_y, bar_h = Inches(7.1), Inches(5.3), Inches(2.2), Inches(0.26)
-bar = shp(MSO_SHAPE.ROUNDED_RECTANGLE, bar_x, bar_y, bar_w, bar_h, fill=NAVY)
-boxtext(bar, "Netzwerk-Grenze · HTTP / gRPC / Events", size=11, color=WHITE, bold=True)
-
-scx = [Inches(7.95), Inches(9.75), Inches(11.55)]
-sc_w, sc_h, sc_y = Inches(1.5), Inches(1.2), Inches(2.62)
-sdb_w, sdb_h, sdb_y = Inches(0.85), Inches(0.7), Inches(3.97)
-for i, cx in enumerate(scx):
- vline(cx, bar_y + bar_h, sc_y - (bar_y + bar_h), color=LINEC, weight=Pt(1.1))
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, cx - sc_w / 2, sc_y, sc_w, sc_h, line=WHITE, lw=Pt(1.5))
- sh = shp(MSO_SHAPE.ROUNDED_RECTANGLE, cx - Inches(0.55), sc_y + Inches(0.3),
- Inches(1.1), Inches(0.62), fill=WHITE, line=LINEC, lw=Pt(1))
- boxtext(sh, "Svc " + LET[i], size=12.5, color=INK, bold=True)
- shp(MSO_SHAPE.OVAL, cx - Inches(0.06), sc_y + Inches(0.4), Inches(0.12), Inches(0.12), fill=DOT[i])
- # eigene DB je Service
- vline(cx, sc_y + sc_h, sdb_y - (sc_y + sc_h), color=LINEC, weight=Pt(1.1))
- sh = shp(MSO_SHAPE.CAN, cx - sdb_w / 2, sdb_y, sdb_w, sdb_h, fill=WHITE, line=LINEC, lw=Pt(1))
- boxtext(sh, "DB", size=11, color=INK, bold=True)
-txt(bar_x, sdb_y + sdb_h + Inches(0.06), bar_w, Inches(0.28), "Datenbank je Service",
- size=12.5, color=WHITE, bold=True, align=PP_ALIGN.CENTER)
-
-# ===========================================================================
-# Trenner + vs.
-# ===========================================================================
-vline(Inches(6.65), Inches(1.55), Inches(3.5), color=LINEC, weight=Pt(1))
-vs = shp(MSO_SHAPE.OVAL, Inches(6.65) - Inches(0.31), Inches(3.05), Inches(0.62), Inches(0.46),
- line=WHITE, lw=Pt(1.5))
-vs.fill.background()
-boxtext(vs, "vs.", size=13, color=WHITE, bold=True)
-
-# ===========================================================================
-# Gegenüberstellung – wesentliche Unterschiede
-# ===========================================================================
-rows = [
- ("Skalierung", "als Ganzes (mehr Replicas)", "je Service gezielt"),
- ("Datenhaltung", "1 geteilte DB", "DB je Service"),
- ("Deployment", "gemeinsam, 1 Pipeline", "unabhängig je Service"),
- ("Konsistenz", "ACID, lokal", "eventual / Saga"),
-]
-ry = Inches(5.5)
-rh = Inches(0.33)
-chip_w = Inches(1.95)
-for i, (dim, mono, ms) in enumerate(rows):
- y = ry + rh * i
- chip = shp(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(6.65) - chip_w / 2, y, chip_w, Inches(0.28),
- line=LINEC, lw=Pt(0.75))
- chip.fill.background()
- boxtext(chip, dim, size=11, color=LIGHT, bold=True)
- txt(Inches(2.5), y - Inches(0.02), Inches(3.1), Inches(0.32), mono,
- size=12, color=WHITE, align=PP_ALIGN.RIGHT)
- txt(Inches(7.72), y - Inches(0.02), Inches(3.1), Inches(0.32), ms,
- size=12, color=WHITE, align=PP_ALIGN.LEFT)
-
-out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Folie3b.pptx")
-prs.save(out)
-print("saved", out)
diff --git a/limbach/folie4.py b/limbach/folie4.py
deleted file mode 100644
index a090e9c..0000000
--- a/limbach/folie4.py
+++ /dev/null
@@ -1,161 +0,0 @@
-#!/usr/bin/env python3
-"""Folie 4 – Eventstream als Quelle; Aussagen links, Lupen rechts, Strecke unten
-(adesso-Styling)."""
-
-import os
-from pptx import Presentation
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE
-from adesso_style import (WHITE, INK, BLUE, TEAL, GREEN, CORAL, LIGHT, RECF, F, FC,
- paint_background, chrome)
-
-# Rollen-Mapping auf die adesso-Palette
-NAVY = INK # dunkle Füllungen (Lupe, Maschine)
-ACCENT = CORAL
-AMBER = GREEN
-GLASS = RECF
-BELT = RECF
-DARK = INK
-LINEC = LIGHT
-THIN = LIGHT
-STREAM = INK
-MID = RGBColor(0x34, 0x4E, 0x70)
-
-prs = Presentation()
-prs.slide_width = Inches(13.333)
-prs.slide_height = Inches(7.5)
-SW, SH = prs.slide_width, prs.slide_height
-s = prs.slides.add_slide(prs.slide_layouts[6])
-
-
-def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), rot=0):
- sh = s.shapes.add_shape(kind, x, y, w, h)
- if fill is None: sh.fill.background()
- else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
- if line is None: sh.line.fill.background()
- else: sh.line.color.rgb = line; sh.line.width = lw
- if rot: sh.rotation = rot
- sh.shadow.inherit = False
- return sh
-
-
-def txt(x, y, w, h, t, size=16, color=WHITE, bold=False, italic=False,
- align=PP_ALIGN.LEFT, spc=None, font=F):
- tb = s.shapes.add_textbox(x, y, w, h); tf = tb.text_frame
- tf.word_wrap = True; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- p = tf.paragraphs[0]; p.alignment = align
- r = p.add_run(); r.text = t
- r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic
- r.font.name = font; r.font.color.rgb = color
- if spc: r.font._rPr.set('spc', str(spc))
- return tb
-
-
-paint_background(s, SW, SH)
-chrome(s, "Zustand oder Ereignis", 5)
-
-x0, x1 = Inches(1.0), Inches(12.33)
-beltw = x1 - x0
-
-# ---- Aussagen links --------------------------------------------------------
-claims = [
- "Eventstream = einzige Quelle der Wahrheit",
- "kann nicht überschrieben werden",
- "vollständige 3D-Sicht auf Maschine / Strang",
-]
-cy = Inches(1.95)
-for i, c in enumerate(claims):
- y = cy + Inches(0.6) * i
- shp(MSO_SHAPE.RECTANGLE, Inches(0.95), y + Inches(0.1), Inches(0.14), Inches(0.14), fill=ACCENT)
- txt(Inches(1.28), y, Inches(4.6), Inches(0.45), c, size=16.5, color=WHITE, bold=(i == 0))
-
-# ===========================================================================
-# LUPEN (Projektionen)
-# ===========================================================================
-def lupe(cx, label, label_w):
- cyy = Inches(2.45)
- d = Inches(0.9)
- shp(MSO_SHAPE.OVAL, cx - d / 2, cyy - d / 2, d, d, fill=WHITE, line=NAVY, lw=Pt(4))
- shp(MSO_SHAPE.OVAL, cx - d / 2 + Inches(0.13), cyy - d / 2 + Inches(0.12),
- Inches(0.17), Inches(0.13), fill=RECF)
- hw, hh = Inches(0.48), Inches(0.15)
- hcx, hcy = cx + d * 0.52, cyy + d * 0.52
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, hcx - hw / 2, hcy - hh / 2, hw, hh, fill=NAVY, rot=45)
- txt(cx - label_w / 2, cyy + d / 2 + Inches(0.16), label_w, Inches(0.6),
- label, size=14, color=WHITE, bold=True, align=PP_ALIGN.CENTER)
- return cyy + d / 2
-
-
-lupes = [
- (Inches(7.05), "Gruppen-Reporting", Inches(2.3)),
- (Inches(9.45), "Optimierung der Auslastung", Inches(2.3)),
- (Inches(11.55), "Abrechnungen", Inches(1.9)),
-]
-lens_bottoms = [lupe(cx, lb, lw) for cx, lb, lw in lupes]
-
-# ===========================================================================
-# EVENTSTREAM (Pfeil)
-# ===========================================================================
-ay, ah = Inches(4.45), Inches(0.46)
-shp(MSO_SHAPE.RIGHT_ARROW, x0, ay, beltw, ah, fill=STREAM)
-acx = ay + ah / 2
-txt(Inches(5.65), ay + Inches(0.04), Inches(2.0), ah - Inches(0.08),
- "Eventstream", size=14, color=WHITE, bold=True, align=PP_ALIGN.CENTER)
-
-# Verbinder Lupe -> Strom
-for (cx, _, _), lb_y in zip(lupes, lens_bottoms):
- shp(MSO_SHAPE.RECTANGLE, cx - Pt(0.5), lb_y, Pt(1), ay - lb_y, fill=LINEC)
-
-# ===========================================================================
-# RÖHRCHEN-STRECKE durch Maschine – unten
-# ===========================================================================
-belt_top = Inches(6.1)
-belt_h = Inches(0.30)
-
-for rx in (x0 - Inches(0.18), x1 - Inches(0.32)):
- shp(MSO_SHAPE.OVAL, rx, belt_top - Inches(0.10), Inches(0.5), Inches(0.5),
- fill=BELT, line=LINEC)
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, x0, belt_top, beltw, belt_h, fill=BELT)
-
-mx, mw = Inches(5.45), Inches(2.45)
-my, mh = Inches(5.2), Inches(1.5)
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, mx, my, mw, mh, fill=NAVY)
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, mx + Inches(0.3), my + Inches(0.22),
- mw - Inches(0.6), Inches(0.32), fill=MID)
-shp(MSO_SHAPE.OVAL, mx + Inches(0.35), my + Inches(0.74), Inches(0.15), Inches(0.15), fill=TEAL)
-shp(MSO_SHAPE.OVAL, mx + Inches(0.6), my + Inches(0.74), Inches(0.15), Inches(0.15), fill=AMBER)
-shp(MSO_SHAPE.RECTANGLE, mx - Inches(0.02), belt_top - Inches(0.02),
- Inches(0.14), belt_h + Inches(0.04), fill=DARK)
-shp(MSO_SHAPE.RECTANGLE, mx + mw - Inches(0.12), belt_top - Inches(0.02),
- Inches(0.14), belt_h + Inches(0.04), fill=DARK)
-
-
-def tube(cx, liquid):
- bw, bh = Inches(0.22), Inches(0.6)
- bx, by = cx - bw / 2, belt_top - bh
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, bx, by, bw, bh, fill=GLASS, line=LINEC, lw=Pt(0.75))
- lh = Inches(0.25)
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, bx + Pt(1), belt_top - lh, bw - Pt(2), lh, fill=liquid)
- cw, ch = Inches(0.26), Inches(0.12)
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, cx - cw / 2, by - Inches(0.06), cw, ch, fill=DARK)
-
-
-cols = [ACCENT, TEAL, AMBER]
-pre_x = [1.55, 2.1, 2.65, 3.2, 3.75, 4.3, 4.85]
-post_x = [8.25, 8.8, 9.35, 9.9, 10.45, 11.0]
-for i, xv in enumerate(pre_x + post_x):
- tube(Inches(xv), cols[i % 3])
-
-tube_top = belt_top - Inches(0.6)
-for xv in pre_x + post_x:
- shp(MSO_SHAPE.RECTANGLE, Inches(xv) - Pt(0.4), ay + ah,
- Pt(0.8), tube_top - (ay + ah), fill=THIN)
- shp(MSO_SHAPE.OVAL, Inches(xv) - Inches(0.05), acx - Inches(0.05),
- Inches(0.1), Inches(0.1), fill=AMBER)
-
-out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Folie4.pptx")
-prs.save(out)
-print("saved", out)
diff --git a/limbach/folie5.py b/limbach/folie5.py
deleted file mode 100644
index cfc515a..0000000
--- a/limbach/folie5.py
+++ /dev/null
@@ -1,177 +0,0 @@
-#!/usr/bin/env python3
-"""Folie 5 – Event Sourcing: das groessere Bild (DEUTSCH).
-Quellen differenziert (Publisher / Subsysteme), Event-Prozessoren als Teil des Stores,
-Hot Store & Cold Store als Kernfunktion (Coral, CORE-Tag), Projektionen dazwischen,
-darunter Cold Store / Monitoring / Reporting. Tech-Impls als Chips. (adesso-Styling)
-Hintergrund: solides dunkles Blau (BG) – Farbe frei anpassbar."""
-
-import os
-from pptx import Presentation
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE
-from adesso_style import (WHITE, INK, BLUE, TEAL, GREEN, CORAL, LIGHT, MUTE, RECF,
- F, FC, chrome)
-
-# ---- Hintergrundfarbe (solid, keine Transparenz) – frei anpassbar ----------
-BG = RGBColor(0x0A, 0x3D, 0x6B) # dunkles Blau
-
-prs = Presentation()
-prs.slide_width = Inches(13.333)
-prs.slide_height = Inches(7.5)
-SW, SH = prs.slide_width, prs.slide_height
-s = prs.slides.add_slide(prs.slide_layouts[6])
-
-
-def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), rot=0, adj=None):
- sh = s.shapes.add_shape(kind, x, y, w, h)
- if fill is None: sh.fill.background()
- else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
- if line is None: sh.line.fill.background()
- else: sh.line.color.rgb = line; sh.line.width = lw
- if rot: sh.rotation = rot
- if adj is not None:
- try: sh.adjustments[0] = adj
- except Exception: pass
- sh.shadow.inherit = False
- return sh
-
-
-def txt(x, y, w, h, t, size=16, color=WHITE, bold=False, italic=False,
- align=PP_ALIGN.LEFT, font=F, anchor=MSO_ANCHOR.MIDDLE):
- tb = s.shapes.add_textbox(x, y, w, h); tf = tb.text_frame
- tf.word_wrap = True; tf.vertical_anchor = anchor
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- first = True
- for line in t.split("\n"):
- p = tf.paragraphs[0] if first else tf.add_paragraph()
- first = False
- p.alignment = align
- r = p.add_run(); r.text = line
- r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic
- r.font.name = font; r.font.color.rgb = color
- return tb
-
-
-def chip(cx, y, text, fill=INK, fg=WHITE, size=11):
- """Tech-Impl als kleine Pill, zentriert um cx."""
- w = Inches(0.34 + 0.092 * len(text)); h = Inches(0.30)
- x = cx - w / 2
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=fill, adj=0.5)
- txt(x, y, w, h, text, size=size, color=fg, bold=False,
- align=PP_ALIGN.CENTER, font=FC)
-
-
-def core_tag(x, y):
- w, h = Inches(0.62), Inches(0.26)
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=INK, adj=0.5)
- txt(x, y, w, h, "CORE", size=9.5, color=TEAL, bold=True,
- align=PP_ALIGN.CENTER, font=FC)
-
-
-# ---- solider Hintergrund (zuerst -> liegt hinten) --------------------------
-bg = shp(MSO_SHAPE.RECTANGLE, 0, 0, SW, SH, fill=BG)
-
-chrome(s, "System Landscape", 6)
-
-CX = Inches(6.665) # Folienmitte (x)
-
-# ---- Quellen: differenziert ------------------------------------------------
-src_y, src_h = Inches(1.36), Inches(0.92)
-
-
-def source_box(x, w, title, examples):
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, src_y, w, src_h, fill=WHITE, adj=0.10)
- txt(x + Inches(0.28), src_y + Inches(0.10), w - Inches(0.56), Inches(0.32),
- title, size=14.5, color=INK, bold=True, anchor=MSO_ANCHOR.TOP)
- txt(x + Inches(0.28), src_y + Inches(0.46), w - Inches(0.56), Inches(0.36),
- examples, size=12, color=MUTE, anchor=MSO_ANCHOR.TOP)
-
-
-pub_x, pub_w = Inches(0.9), Inches(5.6)
-sub_x, sub_w = Inches(6.83), Inches(5.6)
-pub_cx = pub_x + pub_w / 2
-sub_cx = sub_x + sub_w / 2
-
-source_box(pub_x, pub_w, "Publisher (nur publizieren)",
- "z. B. AB+M · LabAccess · MDN · Stammdaten — proprietär")
-source_box(sub_x, sub_w, "Subsysteme (konsumieren & publizieren)",
- "z. B. LIS · Geräte / Analyzer — proprietär")
-
-# ---- Pfeile Quellen -> Hot Store ------------------------------------------
-ay, ah = src_y + src_h + Inches(0.02), Inches(0.30)
-shp(MSO_SHAPE.DOWN_ARROW, pub_cx - Inches(0.16), ay, Inches(0.32), ah, fill=CORAL)
-txt(pub_cx + Inches(0.28), ay - Inches(0.01), Inches(1.6), ah + Inches(0.02),
- "publizieren", size=11, color=LIGHT, italic=True)
-shp(MSO_SHAPE.UP_DOWN_ARROW, sub_cx - Inches(0.11), ay - Inches(0.05), Inches(0.22),
- ah + Inches(0.10), fill=CORAL)
-txt(sub_cx - Inches(2.85), ay - Inches(0.01), Inches(2.5), ah + Inches(0.02),
- "konsumieren & publizieren", size=11, color=LIGHT, italic=True, align=PP_ALIGN.RIGHT)
-
-# ---- HOT STORE (Kern) + Event-Prozessoren (Teil des Stores) ----------------
-hx, hy, hw, hh = Inches(3.4), Inches(2.62), Inches(6.53), Inches(1.50)
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, hx, hy, hw, hh, fill=CORAL, line=INK, lw=Pt(3.5), adj=0.07)
-core_tag(hx + Inches(0.16), hy + Inches(0.13))
-txt(hx, hy + Inches(0.05), hw, Inches(0.34),
- "Event Store — Hot Store", size=20, color=INK, bold=True, align=PP_ALIGN.CENTER)
-txt(hx, hy + Inches(0.40), hw, Inches(0.20),
- "append-only · kanonische Wahrheit", size=12.5, color=INK, align=PP_ALIGN.CENTER)
-chip(CX, hy + Inches(0.62), "z. B. Kafka")
-
-# Event-Prozessoren als eingebetteter Bestandteil des Stores
-ep_x, ep_y, ep_w, ep_h = hx + Inches(0.28), hy + Inches(0.98), hw - Inches(0.56), Inches(0.44)
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, ep_x, ep_y, ep_w, ep_h, fill=WHITE, adj=0.22)
-txt(ep_x, ep_y, ep_w, ep_h,
- "Event-Prozessoren (konsumieren & publizieren) · z. B. Proben-Routing",
- size=11.5, color=INK, bold=True, align=PP_ALIGN.CENTER)
-
-# ---- Hot -> Projektionen ---------------------------------------------------
-shp(MSO_SHAPE.DOWN_ARROW, CX - Inches(0.16), hy + hh + Inches(0.03),
- Inches(0.32), Inches(0.28), fill=CORAL)
-
-# ---- PROJEKTIONEN ----------------------------------------------------------
-px, py, pw, ph = Inches(3.4), Inches(4.46), Inches(6.53), Inches(0.66)
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, px, py, pw, ph, fill=WHITE, adj=0.14)
-txt(px + Inches(0.3), py, Inches(3.0), ph, "Projektionen", size=16, color=INK, bold=True)
-chip(px + pw - Inches(2.0), py + ph / 2 - Inches(0.15), "Kafka Streams → PostgreSQL")
-
-# ---- Verteiler (Projektionen -> 3 Bloecke) --------------------------------
-boxes_y = Inches(5.34)
-bw = Inches(3.7); bh = Inches(1.56)
-cold_x = Inches(0.9); cold_cx = cold_x + bw / 2
-mon_x = Inches(4.815); mon_cx = mon_x + bw / 2
-rep_x = Inches(8.73); rep_cx = rep_x + bw / 2
-
-bus_y = py + ph + Inches(0.10)
-shp(MSO_SHAPE.RECTANGLE, CX - Pt(0.75), py + ph, Pt(1.5), bus_y - (py + ph), fill=LIGHT)
-shp(MSO_SHAPE.RECTANGLE, cold_cx, bus_y, rep_cx - cold_cx, Pt(1.5), fill=LIGHT)
-for cx in (cold_cx, mon_cx, rep_cx):
- shp(MSO_SHAPE.DOWN_ARROW, cx - Inches(0.11), bus_y, Inches(0.22), boxes_y - bus_y,
- fill=LIGHT)
-
-
-def block(x, title, body, tech, core=False):
- fill = CORAL if core else WHITE
- line = INK if core else None
- lw = Pt(3.5) if core else Pt(1)
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, boxes_y, bw, bh, fill=fill, line=line, lw=lw, adj=0.07)
- ty = boxes_y + (Inches(0.30) if core else Inches(0.20))
- if core:
- core_tag(x + Inches(0.16), boxes_y + Inches(0.16))
- txt(x, ty, bw, Inches(0.42), title, size=17, color=INK, bold=True, align=PP_ALIGN.CENTER)
- txt(x + Inches(0.25), ty + Inches(0.46), bw - Inches(0.5), Inches(0.5), body,
- size=12.5, color=(INK if core else MUTE), align=PP_ALIGN.CENTER)
- chip(x + bw / 2, boxes_y + bh - Inches(0.42), tech)
-
-
-block(cold_x, "Cold Store",
- "Archiv · Audit-Trail · Dokumente", "z. B. PostgreSQL", core=True)
-block(mon_x, "Monitoring",
- "Auftragsstatus / Auslastung", "z. B. Grafana")
-block(rep_x, "Reporting",
- "Bericht an Gruppe · KPIs", "z. B. Power BI")
-
-out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Folie5.pptx")
-prs.save(out)
-print("saved", out)
diff --git a/limbach/folie6.py b/limbach/folie6.py
deleted file mode 100644
index ca460e4..0000000
--- a/limbach/folie6.py
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bin/env python3
-"""Folie 6 – Core / Rationale (DEUTSCH): kompakte Landscape links, Argumente als Karten rechts.
-(adesso-Styling). Hintergrund: solides dunkles Blau (BG) – Farbe frei anpassbar."""
-
-import os
-from pptx import Presentation
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE
-from adesso_style import (WHITE, INK, BLUE, TEAL, GREEN, CORAL, LIGHT, MUTE, RECF,
- F, FC, chrome)
-
-# ---- Hintergrundfarbe (solid, keine Transparenz) – frei anpassbar ----------
-BG = RGBColor(0x0A, 0x3D, 0x6B) # dunkles Blau
-
-prs = Presentation()
-prs.slide_width = Inches(13.333)
-prs.slide_height = Inches(7.5)
-SW, SH = prs.slide_width, prs.slide_height
-s = prs.slides.add_slide(prs.slide_layouts[6])
-
-
-def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), rot=0, adj=None):
- sh = s.shapes.add_shape(kind, x, y, w, h)
- if fill is None: sh.fill.background()
- else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
- if line is None: sh.line.fill.background()
- else: sh.line.color.rgb = line; sh.line.width = lw
- if rot: sh.rotation = rot
- if adj is not None:
- try: sh.adjustments[0] = adj
- except Exception: pass
- sh.shadow.inherit = False
- return sh
-
-
-def txt(x, y, w, h, t, size=16, color=WHITE, bold=False, italic=False,
- align=PP_ALIGN.LEFT, font=F, anchor=MSO_ANCHOR.MIDDLE, sp=None):
- tb = s.shapes.add_textbox(x, y, w, h); tf = tb.text_frame
- tf.word_wrap = True; tf.vertical_anchor = anchor
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- first = True
- for line in t.split("\n"):
- p = tf.paragraphs[0] if first else tf.add_paragraph()
- first = False
- p.alignment = align
- if sp is not None: p.space_after = Pt(sp)
- r = p.add_run(); r.text = line
- r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic
- r.font.name = font; r.font.color.rgb = color
- return tb
-
-
-def chip(cx, y, text, size=10):
- w = Inches(0.30 + 0.085 * len(text)); h = Inches(0.27)
- x = cx - w / 2
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=INK, adj=0.5)
- txt(x, y, w, h, text, size=size, color=WHITE, align=PP_ALIGN.CENTER, font=FC)
-
-
-def core_tag(x, y):
- w, h = Inches(0.54), Inches(0.23)
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=INK, adj=0.5)
- txt(x, y, w, h, "CORE", size=8.5, color=TEAL, bold=True, align=PP_ALIGN.CENTER, font=FC)
-
-
-# ---- solider Hintergrund (zuerst -> liegt hinten) --------------------------
-bg = shp(MSO_SHAPE.RECTANGLE, 0, 0, SW, SH, fill=BG)
-
-chrome(s, "Warum Event Sourcing passt", 7)
-
-# ===========================================================================
-# LINKS – kompakte Landscape
-# ===========================================================================
-LCX = Inches(3.35)
-
-# Quellen
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(0.7), Inches(1.58), Inches(5.3), Inches(0.7),
- fill=WHITE, adj=0.12)
-txt(Inches(0.92), Inches(1.66), Inches(4.9), Inches(0.26), "Quellen",
- size=12.5, color=INK, bold=True, anchor=MSO_ANCHOR.TOP)
-txt(Inches(0.92), Inches(1.94), Inches(4.9), Inches(0.28),
- "Publisher (publizieren) · Subsysteme (konsumieren & publizieren)",
- size=10.5, color=MUTE, anchor=MSO_ANCHOR.TOP)
-
-shp(MSO_SHAPE.DOWN_ARROW, LCX - Inches(0.13), Inches(2.30), Inches(0.26), Inches(0.26),
- fill=CORAL)
-
-# Hot Store (CORE) inkl. Event-Prozessoren
-hy, hh = Inches(2.58), Inches(0.98)
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(1.35), hy, Inches(4.0), hh,
- fill=CORAL, line=INK, lw=Pt(3), adj=0.08)
-core_tag(Inches(1.50), hy + Inches(0.12))
-txt(Inches(1.35), hy + Inches(0.08), Inches(4.0), Inches(0.34),
- "Event Store — Hot Store", size=15, color=INK, bold=True, align=PP_ALIGN.CENTER)
-txt(Inches(1.35), hy + Inches(0.40), Inches(4.0), Inches(0.24),
- "inkl. Event-Prozessoren", size=10.5, color=INK, align=PP_ALIGN.CENTER)
-chip(LCX, hy + hh - Inches(0.34), "Kafka")
-
-shp(MSO_SHAPE.DOWN_ARROW, LCX - Inches(0.13), hy + hh + Inches(0.02),
- Inches(0.26), Inches(0.24), fill=CORAL)
-
-# Projektionen
-py, ph = Inches(3.82), Inches(0.56)
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, Inches(1.35), py, Inches(4.0), ph, fill=WHITE, adj=0.16)
-txt(Inches(1.55), py, Inches(2.0), ph, "Projektionen", size=12.5, color=INK, bold=True)
-chip(Inches(4.25), py + ph / 2 - Inches(0.135), "Kafka Streams → PostgreSQL")
-
-# Verteiler -> 3 Bloecke
-boxes_y = Inches(4.72); mbh = Inches(1.28)
-mb_w = Inches(1.65)
-cold_x = Inches(0.7); cold_cx = cold_x + mb_w / 2
-mon_x = Inches(2.55); mon_cx = mon_x + mb_w / 2
-rep_x = Inches(4.40); rep_cx = rep_x + mb_w / 2
-bus_y = py + ph + Inches(0.10)
-shp(MSO_SHAPE.RECTANGLE, LCX - Pt(0.75), py + ph, Pt(1.5), bus_y - (py + ph), fill=LIGHT)
-shp(MSO_SHAPE.RECTANGLE, cold_cx, bus_y, rep_cx - cold_cx, Pt(1.5), fill=LIGHT)
-for cx in (cold_cx, mon_cx, rep_cx):
- shp(MSO_SHAPE.DOWN_ARROW, cx - Inches(0.10), bus_y, Inches(0.20), boxes_y - bus_y, fill=LIGHT)
-
-
-def minibox(x, title, tech, core=False):
- fill = CORAL if core else WHITE
- line = INK if core else None
- lw = Pt(3) if core else Pt(1)
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, boxes_y, mb_w, mbh, fill=fill, line=line, lw=lw, adj=0.10)
- if core:
- core_tag(x + Inches(0.12), boxes_y + Inches(0.12))
- txt(x, boxes_y + (Inches(0.42) if core else Inches(0.26)), mb_w, Inches(0.5), title,
- size=12, color=INK, bold=True, align=PP_ALIGN.CENTER)
- chip(x + mb_w / 2, boxes_y + mbh - Inches(0.36), tech)
-
-
-minibox(cold_x, "Cold\nStore", "PostgreSQL", core=True)
-minibox(mon_x, "Monitoring", "Grafana")
-minibox(rep_x, "Reporting", "Power BI")
-
-# ===========================================================================
-# RECHTS – Argumente als Karten
-# ===========================================================================
-cards = [
- ("Bewährte Technologie",
- "Erprobt in regulierten Branchen mit hohem Volumen — z. B. ING setzt auf Kafka / Event-Streaming."),
- ("Flexibel",
- "Neues System = neuer Adapter, ohne Eingriff in den Rest. Neue Event-Folgen & Projektionen jederzeit baubar."),
- ("Skalierbar",
- "Selbst massive Lastzunahme wird durch mehr Hardware aufgefangen — horizontal, ohne Redesign."),
- ("Kosteneffizient",
- "Wiederverwendbare Adapter statt Punkt-zu-Punkt. Open Source auf Standard-Hardware — kein Lock-in."),
- ("Auditierbar & revisionssicher",
- "Append-only, vollständige & manipulationssichere Historie — vollständig replay-fähig."),
- ("Resilient & entkoppelt",
- "Systeme fallen aus und holen per Replay auf; ein Log statt N² Schnittstellen."),
-]
-
-cw, ch = Inches(3.0), Inches(1.42)
-col_x = [Inches(6.55), Inches(9.8)]
-row_y = [Inches(1.62), Inches(3.30), Inches(4.98)]
-for i, (title, body) in enumerate(cards):
- x = col_x[i % 2]; y = row_y[i // 2]
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, cw, ch, fill=WHITE, adj=0.08)
- shp(MSO_SHAPE.RECTANGLE, x + Inches(0.0), y + Inches(0.14), Inches(0.11), ch - Inches(0.28),
- fill=CORAL)
- txt(x + Inches(0.32), y + Inches(0.15), cw - Inches(0.5), Inches(0.36), title,
- size=13.5, color=INK, bold=True, anchor=MSO_ANCHOR.TOP)
- txt(x + Inches(0.32), y + Inches(0.55), cw - Inches(0.52), ch - Inches(0.68), body,
- size=10.5, color=MUTE, anchor=MSO_ANCHOR.TOP)
-
-out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Folie6.pptx")
-prs.save(out)
-print("saved", out)
diff --git a/limbach/folie7.py b/limbach/folie7.py
deleted file mode 100644
index 2335fb0..0000000
--- a/limbach/folie7.py
+++ /dev/null
@@ -1,192 +0,0 @@
-#!/usr/bin/env python3
-"""Folie 7 – Integrationsserver / Event-Sourcing-Anbindung (DEUTSCH, adesso-Stil).
-Eingaenge (Order Entry/CLAB, Probeneingang [Atras+PVT], Geraete, Middleware, MiBi/Hybase,
-Stammdaten) -> Adapter-Ebene -> Event Store -> unten Event-Prozessoren, Projektionen,
-Konsumenten (SinaBI, Archivierung). Hintergrund: solides dunkles Blau (BG)."""
-
-import os
-from pptx import Presentation
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR
-from pptx.oxml.ns import qn
-from adesso_style import (WHITE, INK, BLUE, TEAL, GREEN, CORAL, LIGHT, MUTE, RECF,
- F, FC, chrome)
-
-BG = RGBColor(0x0A, 0x3D, 0x6B)
-GRAY = RGBColor(0xAE, 0xB7, 0xC2)
-ADC = RGBColor(0xCF, 0xE2, 0xF7)
-SUBC = RGBColor(0x3C, 0x4A, 0x5A) # zweite Zeile – dunkel & gut lesbar
-
-prs = Presentation(); prs.slide_width = Inches(13.333); prs.slide_height = Inches(7.5)
-SW, SH = prs.slide_width, prs.slide_height
-s = prs.slides.add_slide(prs.slide_layouts[6])
-
-
-def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), adj=None):
- sh = s.shapes.add_shape(kind, Inches(x), Inches(y), Inches(w), Inches(h))
- if fill is None: sh.fill.background()
- else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
- if line is None: sh.line.fill.background()
- else: sh.line.color.rgb = line; sh.line.width = lw
- if adj is not None:
- try: sh.adjustments[0] = adj
- except Exception: pass
- sh.shadow.inherit = False
- return sh
-
-
-def txt(x, y, w, h, t, size=11, color=WHITE, bold=False, italic=False,
- align=PP_ALIGN.LEFT, font=F, anchor=MSO_ANCHOR.MIDDLE):
- tb = s.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)); tf = tb.text_frame
- tf.word_wrap = True; tf.vertical_anchor = anchor
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- first = True
- for line in t.split("\n"):
- p = tf.paragraphs[0] if first else tf.add_paragraph(); first = False
- p.alignment = align
- r = p.add_run(); r.text = line
- r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic
- r.font.name = font; r.font.color.rgb = color
- return tb
-
-
-def conn(x1, y1, x2, y2, color=LIGHT, w=1.6, both=False):
- c = s.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, Inches(x1), Inches(y1),
- Inches(x2), Inches(y2))
- c.line.color.rgb = color; c.line.width = Pt(w); c.shadow.inherit = False
- ln = c.line._get_or_add_ln()
- if both:
- ln.append(ln.makeelement(qn('a:headEnd'), {'type': 'triangle'}))
- ln.append(ln.makeelement(qn('a:tailEnd'), {'type': 'triangle'}))
- return c
-
-
-def group(x, y, w, h, title, tsize=11.5):
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=None, line=LIGHT, lw=Pt(1.25), adj=0.04)
- txt(x, y + 0.05, w, 0.26, title, size=tsize, color=WHITE, bold=True,
- align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.TOP)
-
-
-def box(x, y, w, h, title, sub=None, fill=WHITE, tcol=INK, tsize=10.5, line=None, lw=Pt(1)):
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=fill, line=line, lw=lw, adj=0.16)
- tb = s.shapes.add_textbox(Inches(x + 0.05), Inches(y), Inches(w - 0.10), Inches(h))
- tf = tb.text_frame; tf.word_wrap = True; tf.vertical_anchor = MSO_ANCHOR.MIDDLE
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- p = tf.paragraphs[0]; p.alignment = PP_ALIGN.CENTER; p.line_spacing = 0.98
- r = p.add_run(); r.text = title; r.font.size = Pt(tsize); r.font.bold = True
- r.font.name = F; r.font.color.rgb = tcol
- if sub is not None:
- p.space_after = Pt(2)
- p2 = tf.add_paragraph(); p2.alignment = PP_ALIGN.CENTER; p2.line_spacing = 0.98
- r2 = p2.add_run(); r2.text = sub; r2.font.size = Pt(tsize - 0.5)
- r2.font.name = F; r2.font.color.rgb = SUBC
- return tb
-
-
-AD_Y, AD_H = 3.50, 0.48
-def adapter(x, w, title):
- box(x, AD_Y, w, AD_H, title, fill=ADC, tcol=INK, tsize=9, line=BLUE, lw=Pt(1.1))
-
-
-# ---- Hintergrund + Header --------------------------------------------------
-shp(MSO_SHAPE.RECTANGLE, 0, 0, SW.inches, SH.inches, fill=BG)
-chrome(s, "Event Sourcing — Integrationsserver", 8)
-
-# ---- Legende ---------------------------------------------------------------
-ly = 0.95
-def legsq(x, color, label, lw_txt):
- shp(MSO_SHAPE.RECTANGLE, x, ly + 0.02, 0.15, 0.15, fill=color)
- txt(x + 0.21, ly - 0.03, lw_txt, 0.26, label, size=10, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
-legsq(0.40, CORAL, "Event Store", 1.2)
-legsq(1.76, GREEN, "Prop-Limbach", 1.3)
-legsq(3.28, ADC, "Adapter (own)", 1.4)
-legsq(4.90, WHITE, "System", 0.9)
-txt(6.30, 0.92, 6.63, 0.3,
- "↕ publizieren & abonnieren ↓ publizieren grau = Kommunikation",
- size=10, color=LIGHT, italic=True, anchor=MSO_ANCHOR.MIDDLE, align=PP_ALIGN.RIGHT)
-
-# ---- EVENT STORE -----------------------------------------------------------
-ST_X, ST_Y, ST_W, ST_H = 0.40, 4.18, 12.53, 0.60
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, ST_X, ST_Y, ST_W, ST_H, fill=CORAL, line=INK, lw=Pt(3.5), adj=0.10)
-txt(ST_X, ST_Y + 0.06, ST_W, 0.30, "Event Store — append-only Event-Log",
- size=15, color=INK, bold=True, align=PP_ALIGN.CENTER)
-txt(ST_X, ST_Y + 0.35, ST_W, 0.22, "kanonische Wahrheit · Replay-fähig · (Kafka)",
- size=10.5, color=INK, align=PP_ALIGN.CENTER)
-
-# ===========================================================================
-# OBEN – Systeme + Adapter-Ebene
-# ===========================================================================
-TGY, TGH = 1.28, 2.78
-
-# --- 1: Order Entry ueber CLAB ---------------------------------------------
-group(0.40, TGY, 2.70, TGH, "Order Entry über CLAB")
-box(0.52, 1.62, 1.16, 0.42, "LabAccess")
-box(1.82, 1.62, 1.16, 0.42, "MDN")
-box(1.18, 2.22, 1.14, 0.44, "AB+M")
-box(1.05, 2.84, 1.40, 0.42, "CLAB (LIS)", fill=GREEN)
-adapter(0.78, 1.94, "CLAB-Adapter")
-conn(1.10, 2.04, 1.55, 2.22); conn(2.40, 2.04, 1.95, 2.22)
-conn(1.75, 2.66, 1.75, 2.84); conn(1.75, 3.26, 1.75, AD_Y)
-conn(1.75, AD_Y + AD_H, 1.75, ST_Y, both=True)
-
-# --- 2: Probeneingang (Atras SL + PVT) -------------------------------------
-group(3.26, TGY, 1.95, TGH, "Probeneingang")
-box(3.34, 2.30, 0.86, 0.52, "Atras SL")
-box(4.27, 2.30, 0.86, 0.52, "PVT")
-adapter(3.34, 1.79, "Adapter (Probe → Event)")
-conn(2.32, 2.50, 3.34, 2.56, color=GRAY, both=True) # Praeanalytik-Kommunikation
-txt(2.28, 2.04, 1.30, 0.34, "Präanalytik-\nKomm.", size=8, color=GRAY, italic=True,
- align=PP_ALIGN.CENTER)
-conn(3.77, 2.82, 3.95, AD_Y); conn(4.70, 2.82, 4.55, AD_Y)
-conn(4.235, AD_Y + AD_H, 4.235, ST_Y)
-
-# --- 3: Geraete -------------------------------------------------------------
-group(5.37, TGY, 1.78, TGH, "Geräte-Adapter")
-box(5.49, 2.10, 1.54, 0.70, "Geräte", "Sysmex · Analyzer")
-adapter(5.45, 1.62, "Adapter (Device → Event)")
-conn(6.26, 2.80, 6.26, AD_Y); conn(6.26, AD_Y + AD_H, 6.26, ST_Y, both=True)
-
-# --- 4: Middleware ----------------------------------------------------------
-group(7.31, TGY, 1.78, TGH, "Middleware")
-box(7.43, 2.10, 1.54, 0.70, "Middleware-Systeme", "Myla/Maestria · LabOps · Liason")
-adapter(7.39, 1.62, "Adapter (Middleware → Event)")
-conn(8.20, 2.80, 8.20, AD_Y); conn(8.20, AD_Y + AD_H, 8.20, ST_Y, both=True)
-
-# --- 5: MiBi (Hybase) -------------------------------------------------------
-group(9.25, TGY, 1.70, TGH, "MiBi")
-box(9.37, 2.10, 1.46, 0.70, "Hybase", "Resistenz / ID-Daten")
-adapter(9.33, 1.54, "Adapter (MiBi → Event)")
-conn(10.10, 2.80, 10.10, AD_Y); conn(10.10, AD_Y + AD_H, 10.10, ST_Y, both=True)
-
-# --- 6: Stammdaten ----------------------------------------------------------
-group(11.11, TGY, 1.82, TGH, "Stammdaten")
-box(11.23, 2.10, 1.58, 0.70, "Stammdaten-Quellen", "SinaCRM · OTS/Znooni")
-adapter(11.19, 1.66, "Adapter (MasterData → Event)")
-conn(12.02, 2.80, 12.02, AD_Y); conn(12.02, AD_Y + AD_H, 12.02, ST_Y)
-
-# ===========================================================================
-# UNTEN – Event-Prozessoren · Projektionen · Konsumenten
-# ===========================================================================
-BGY, BGH = 4.96, 1.96
-
-group(0.40, BGY, 2.95, BGH, "Event-Prozessoren")
-box(0.56, 5.42, 2.63, 0.55, "Mapping / Transformation")
-box(0.56, 6.12, 2.63, 0.55, "Routing Engine")
-conn(1.85, ST_Y + ST_H, 1.85, BGY, both=True)
-
-group(3.50, BGY, 5.85, BGH, "Projektionen")
-box(3.66, 5.46, 1.78, 1.02, "Auftragsstatus")
-box(5.56, 5.46, 1.78, 1.02, "Audit Trail")
-box(7.46, 5.46, 1.73, 1.02, "Reporting")
-conn(6.40, ST_Y + ST_H, 6.40, BGY)
-
-group(9.50, BGY, 3.43, BGH, "Konsumenten")
-box(9.66, 5.38, 3.11, 0.68, "SinaBI (Power BI)", "Reporting / BI")
-box(9.66, 6.12, 3.11, 0.68, "Archivierung · Vaultbox", "Roche Navify · LDT2")
-conn(11.21, ST_Y + ST_H, 11.21, BGY)
-
-out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Folie7.pptx")
-prs.save(out)
-print("saved", out)
diff --git a/limbach/folie8.py b/limbach/folie8.py
deleted file mode 100644
index 8d5e94f..0000000
--- a/limbach/folie8.py
+++ /dev/null
@@ -1,138 +0,0 @@
-#!/usr/bin/env python3
-"""Folie 8 – Funktionszuordnung je System (aus Anforderungskatalog_LIS_Fit-Gap v2.xlsx).
-Pro System eine Kachel; Funktionen NUR dort = kraeftig/dunkel, auch woanders = grau mit
-'· auch: ...'. Einspaltig, Fira Sans Condensed. (adesso-Stil, deutsch, dunkelblau.)"""
-
-import os
-from pptx import Presentation
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE
-from openpyxl import load_workbook
-from openpyxl.utils import column_index_from_string as ci
-from adesso_style import (WHITE, INK, BLUE, TEAL, GREEN, CORAL, LIGHT, MUTE, RECF,
- F, FC, chrome)
-
-BG = RGBColor(0x0A, 0x3D, 0x6B)
-SHARE = RGBColor(0x6B, 0x77, 0x85) # grau fuer "auch woanders"
-
-# ---- Daten aus dem Excel lesen --------------------------------------------
-HERE = os.path.dirname(os.path.abspath(__file__))
-wb = load_workbook(os.path.join(HERE, "Anforderungskatalog_LIS_Fit-Gap v2.xlsx"), data_only=True)
-ws = wb["Anforderungen & Fit-Gap"]
-SYS = [('H', 'Order Entry'), ('N', 'AB+M'), ('O', 'Integrationsserver'), ('P', 'PVT'),
- ('Q', 'R. LabOps'), ('R', 'Sysmex'), ('S', 'SAP'), ('T', 'Consens')]
-ABBR = {'Order Entry': 'OE', 'AB+M': 'AB+M', 'Integrationsserver': 'Int.-Server',
- 'PVT': 'PVT', 'R. LabOps': 'R.LabOps', 'Sysmex': 'Sysmex', 'SAP': 'SAP',
- 'Consens': 'Consens'}
-
-reqs = []; cur = None
-for r in range(5, ws.max_row + 1):
- b = ws.cell(r, 2).value; c = ws.cell(r, 3).value
- marks = {d: (ws.cell(r, ci(col)).value not in (None, '')) for col, d in SYS}
- if b:
- cur = {'name': (str(c).strip() if c else str(b)), 'm': dict(marks)}
- reqs.append(cur)
- elif cur:
- for d, v in marks.items():
- if v: cur['m'][d] = True
- if c: cur['name'] = (cur['name'] + ' / ' + str(c).strip())
-
-persys = {d: [] for _, d in SYS}
-for req in reqs:
- active = [d for _, d in SYS if req['m'][d]]
- for d in active:
- persys[d].append((req['name'], [o for o in active if o != d]))
-for d in persys:
- persys[d].sort(key=lambda it: (1 if it[1] else 0))
-
-# ---- PPTX ------------------------------------------------------------------
-prs = Presentation(); prs.slide_width = Inches(13.333); prs.slide_height = Inches(7.5)
-SW, SH = prs.slide_width, prs.slide_height
-s = prs.slides.add_slide(prs.slide_layouts[6])
-
-
-def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), adj=None):
- sh = s.shapes.add_shape(kind, Inches(x), Inches(y), Inches(w), Inches(h))
- if fill is None: sh.fill.background()
- else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
- if line is None: sh.line.fill.background()
- else: sh.line.color.rgb = line; sh.line.width = lw
- if adj is not None:
- try: sh.adjustments[0] = adj
- except Exception: pass
- sh.shadow.inherit = False
- return sh
-
-
-def txt(x, y, w, h, t, size=12, color=WHITE, bold=False, align=PP_ALIGN.LEFT,
- font=F, anchor=MSO_ANCHOR.MIDDLE):
- tb = s.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)); tf = tb.text_frame
- tf.word_wrap = True; tf.vertical_anchor = anchor
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- p = tf.paragraphs[0]; p.alignment = align
- r = p.add_run(); r.text = t
- r.font.size = Pt(size); r.font.bold = bold; r.font.name = font; r.font.color.rgb = color
- return tb
-
-
-def cut(t, n):
- return t if len(t) <= n else t[:n].rstrip() + "…"
-
-
-def tile(x, y, w, h, title, items, accent, isize, sa, name_max):
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=WHITE, adj=0.05)
- txt(x + 0.22, y + 0.14, w - 0.44, 0.32, title, size=14, color=INK, bold=True,
- anchor=MSO_ANCHOR.MIDDLE)
- n = len([i for i in items if not i[1]])
- txt(x + w - 1.7, y + 0.18, 1.5, 0.24, "%d · %d nur hier" % (len(items), n),
- size=8.5, color=SHARE, align=PP_ALIGN.RIGHT, font=FC, anchor=MSO_ANCHOR.MIDDLE)
- shp(MSO_SHAPE.RECTANGLE, x + 0.22, y + 0.50, w - 0.44, 0.030, fill=accent)
-
- tb = s.shapes.add_textbox(Inches(x + 0.22), Inches(y + 0.62), Inches(w - 0.40),
- Inches(h - 0.74))
- tf = tb.text_frame; tf.word_wrap = True; tf.vertical_anchor = MSO_ANCHOR.TOP
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- for i, (name, others) in enumerate(items):
- p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
- p.alignment = PP_ALIGN.LEFT; p.line_spacing = 0.96; p.space_after = Pt(sa)
- r = p.add_run(); r.font.name = FC; r.font.size = Pt(isize)
- if others:
- r.text = cut(name, name_max); r.font.bold = False; r.font.color.rgb = SHARE
- r2 = p.add_run(); r2.text = " · auch: " + ", ".join(ABBR[o] for o in others)
- r2.font.name = FC; r2.font.size = Pt(isize - 1); r2.font.color.rgb = SHARE
- else:
- r.text = cut(name, name_max + 4); r.font.bold = True; r.font.color.rgb = INK
-
-
-# ---- Hintergrund + Header --------------------------------------------------
-shp(MSO_SHAPE.RECTANGLE, 0, 0, SW.inches, SH.inches, fill=BG)
-chrome(s, "Funktionszuordnung je System", 9)
-txt(0.42, 0.96, 12.5, 0.3,
- "Dunkel/fett = nur dieses System · grau „· auch: …" + chr(34) + " = Funktion liegt auch in anderen Systemen",
- size=11, color=LIGHT, anchor=MSO_ANCHOR.MIDDLE, font=FC)
-
-CY, CH = 1.46, 5.42
-COLS = [0.40, 3.58, 6.76, 9.94]; CW = 2.98
-
-# Spalte 1: Integrationsserver (hoch)
-tile(COLS[0], CY, CW, CH, "Integrationsserver", persys['Integrationsserver'],
- CORAL, isize=9, sa=1.5, name_max=30)
-# Spalte 2: Order Entry (hoch)
-tile(COLS[1], CY, CW, CH, "Order Entry", persys['Order Entry'],
- BLUE, isize=10.5, sa=5, name_max=30)
-
-# Spalten 3 & 4: je 3 kleine Kacheln
-SH3 = 1.68; GAP = 0.19
-ys = [CY, CY + SH3 + GAP, CY + 2 * (SH3 + GAP)]
-small3 = ['AB+M', 'Consens', 'R. LabOps']
-small4 = ['PVT', 'Sysmex', 'SAP']
-for name, y in zip(small3, ys):
- tile(COLS[2], y, CW, SH3, name, persys[name], TEAL, isize=9.5, sa=3, name_max=30)
-for name, y in zip(small4, ys):
- tile(COLS[3], y, CW, SH3, name, persys[name], TEAL, isize=9.5, sa=3, name_max=30)
-
-out = os.path.join(HERE, "Folie8.pptx")
-prs.save(out)
-print("saved", out)
diff --git a/limbach/folie9.py b/limbach/folie9.py
deleted file mode 100644
index 8dc763e..0000000
--- a/limbach/folie9.py
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env python3
-"""Folie 9 – Golden Master (adesso-Stil, deutsch, dunkelblau).
-Was ist das? · Vorgehen (3 Schritte) · Nutzen 1 + Nutzen 2."""
-
-import os
-from pptx import Presentation
-from pptx.util import Inches, Pt
-from pptx.dml.color import RGBColor
-from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
-from pptx.enum.shapes import MSO_SHAPE, MSO_CONNECTOR
-from pptx.oxml.ns import qn
-from adesso_style import (WHITE, INK, BLUE, TEAL, GREEN, CORAL, LIGHT, MUTE, RECF,
- F, FC, chrome)
-
-BG = RGBColor(0x0A, 0x3D, 0x6B)
-
-prs = Presentation(); prs.slide_width = Inches(13.333); prs.slide_height = Inches(7.5)
-SW, SH = prs.slide_width, prs.slide_height
-s = prs.slides.add_slide(prs.slide_layouts[6])
-
-
-def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), adj=None):
- sh = s.shapes.add_shape(kind, Inches(x), Inches(y), Inches(w), Inches(h))
- if fill is None: sh.fill.background()
- else: sh.fill.solid(); sh.fill.fore_color.rgb = fill
- if line is None: sh.line.fill.background()
- else: sh.line.color.rgb = line; sh.line.width = lw
- if adj is not None:
- try: sh.adjustments[0] = adj
- except Exception: pass
- sh.shadow.inherit = False
- return sh
-
-
-def txt(x, y, w, h, t, size=12, color=WHITE, bold=False, italic=False,
- align=PP_ALIGN.LEFT, font=F, anchor=MSO_ANCHOR.MIDDLE):
- tb = s.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h)); tf = tb.text_frame
- tf.word_wrap = True; tf.vertical_anchor = anchor
- tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = Pt(0)
- first = True
- for line in t.split("\n"):
- p = tf.paragraphs[0] if first else tf.add_paragraph(); first = False
- p.alignment = align
- r = p.add_run(); r.text = line
- r.font.size = Pt(size); r.font.bold = bold; r.font.italic = italic
- r.font.name = font; r.font.color.rgb = color
- return tb
-
-
-def conn(x1, y1, x2, y2, color=LIGHT, w=2.0):
- c = s.shapes.add_connector(MSO_CONNECTOR.STRAIGHT, Inches(x1), Inches(y1),
- Inches(x2), Inches(y2))
- c.line.color.rgb = color; c.line.width = Pt(w); c.shadow.inherit = False
- ln = c.line._get_or_add_ln()
- ln.append(ln.makeelement(qn('a:tailEnd'), {'type': 'triangle'}))
- return c
-
-
-def heading(x, y, t):
- shp(MSO_SHAPE.RECTANGLE, x, y + 0.05, 0.16, 0.20, fill=CORAL)
- txt(x + 0.26, y - 0.04, 8.0, 0.34, t, size=15, color=WHITE, bold=True,
- anchor=MSO_ANCHOR.MIDDLE)
-
-
-def step(x, y, w, h, num, title, sub):
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=WHITE, adj=0.08)
- shp(MSO_SHAPE.OVAL, x + 0.16, y + 0.16, 0.42, 0.42, fill=BLUE)
- txt(x + 0.16, y + 0.16, 0.42, 0.42, str(num), size=15, color=WHITE, bold=True,
- align=PP_ALIGN.CENTER)
- txt(x + 0.70, y + 0.14, w - 0.85, 0.34, title, size=13, color=INK, bold=True,
- anchor=MSO_ANCHOR.TOP)
- txt(x + 0.70, y + 0.50, w - 0.85, h - 0.60, sub, size=10.5, color=MUTE,
- anchor=MSO_ANCHOR.TOP)
-
-
-def nutzen(x, y, w, h, title, body):
- shp(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h, fill=WHITE, adj=0.05)
- shp(MSO_SHAPE.RECTANGLE, x, y + 0.16, 0.13, h - 0.32, fill=CORAL)
- txt(x + 0.34, y + 0.20, w - 0.55, 0.40, title, size=15, color=INK, bold=True,
- anchor=MSO_ANCHOR.TOP)
- txt(x + 0.34, y + 0.70, w - 0.6, h - 0.85, body, size=12, color=INK,
- anchor=MSO_ANCHOR.TOP)
-
-
-# ---- Hintergrund + Header --------------------------------------------------
-shp(MSO_SHAPE.RECTANGLE, 0, 0, SW.inches, SH.inches, fill=BG)
-chrome(s, "Golden Master", 10)
-
-# ---- Was ist das? ----------------------------------------------------------
-heading(0.50, 1.22, "Was ist das?")
-shp(MSO_SHAPE.ROUNDED_RECTANGLE, 0.50, 1.58, 12.33, 0.82, fill=WHITE, adj=0.06)
-txt(0.78, 1.58, 11.8, 0.82,
- "Ein umfassender Acceptance-/Approval-Test der Software: Das System wird als Ganzes gegen einen "
- "einmal erfassten, freigegebenen Referenz-Stand („Golden Master“) geprüft — weicht ein "
- "Ergebnis ab, schlägt der Test an.",
- size=12.5, color=INK)
-
-# ---- Vorgehen --------------------------------------------------------------
-heading(0.50, 2.64, "Vorgehen")
-SY, SH_ = 3.00, 1.06
-step(0.50, SY, 3.70, SH_, 1, "Code- & Ergebnis-Analyse",
- "Prüfen, wie die Software arbeitet und wie/wo Ergebnisse abgelegt werden.")
-step(4.82, SY, 3.70, SH_, 2, "Testtool aufbauen",
- "Werkzeug, das Referenz-Ergebnisse erfasst und bei jedem Lauf vergleicht.")
-step(9.13, SY, 3.70, SH_, 3, "Test-Suite (Fachseite)",
- "Die FS baut die fachlichen Testfälle / Szenarien auf.")
-conn(4.24, SY + SH_ / 2, 4.78, SY + SH_ / 2)
-conn(8.56, SY + SH_ / 2, 9.09, SY + SH_ / 2)
-
-# ---- Nutzen ----------------------------------------------------------------
-heading(0.50, 4.34, "Nutzen")
-NY, NH = 4.70, 2.02
-nutzen(0.50, NY, 6.00, NH, "Nutzen 1 · Funktionssicherung CLAB",
- "Nach jeder Änderung lässt sich die Funktionsfähigkeit der Software prüfen — "
- "schnelle, wiederholbare Regressionssicherheit ohne manuelles Nachtesten.")
-nutzen(6.83, NY, 6.00, NH, "Nutzen 2 · Vollständigkeit bei LIS-Migration",
- "Ein Ziel-LIS, auf das migriert werden soll, lässt sich hart gegen die eigenen "
- "Anforderungen testen.\n\n⚠ Setzt ein neues Aufsetzen des Testtools voraus.")
-
-out = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Folie9.pptx")
-prs.save(out)
-print("saved", out)
diff --git a/limbach/integration-server-new.drawio b/limbach/integration-server-new.drawio
deleted file mode 100644
index ed42931..0000000
--- a/limbach/integration-server-new.drawio
+++ /dev/null
@@ -1,139 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/limbach/integration-server.drawio b/limbach/integration-server.drawio
deleted file mode 100644
index 7924336..0000000
--- a/limbach/integration-server.drawio
+++ /dev/null
@@ -1,474 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/limbach/integration-server_single.pdf b/limbach/integration-server_single.pdf
deleted file mode 100644
index a2a6fea..0000000
Binary files a/limbach/integration-server_single.pdf and /dev/null differ
diff --git a/limbach/integration-server_sngle.drawio b/limbach/integration-server_sngle.drawio
deleted file mode 100644
index cd502a8..0000000
--- a/limbach/integration-server_sngle.drawio
+++ /dev/null
@@ -1,181 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/limbach/merge.py b/limbach/merge.py
deleted file mode 100644
index 5f56f20..0000000
--- a/limbach/merge.py
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/usr/bin/env python3
-"""Fügt Folie2, Folie3, Folie4 zu einer Datei zusammen (Reihenfolge 2, 3, 4)."""
-
-import copy
-import os
-from pptx import Presentation
-
-base = os.path.dirname(os.path.abspath(__file__)) + "/"
-dst = Presentation(base + "Folie2.pptx") # Seite 1 = Folie 2
-blank = dst.slide_layouts[6]
-
-for fname in ("Folie3.pptx", "Folie3b.pptx", "Folie4.pptx"): # Seiten 2, 3, 4, 5
- src = Presentation(base + fname)
- new_slide = dst.slides.add_slide(blank)
- for shape in src.slides[0].shapes:
- new_slide.shapes._spTree.append(copy.deepcopy(shape._element))
-
-out = base + "Workshop_LIS.pptx"
-dst.save(out)
-print("saved", out)