#!/usr/bin/env python3 """Folie 2 – Grenzen der Vault-Integration. Kette: Auftrag -> altes LIS -> Schattenbuchhaltung/Metadaten -> Vault (am Ende). Der Layer wird zum SPOT.""" 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 INK = RGBColor(0x2A, 0x2F, 0x3A) NAVY = RGBColor(0x1F, 0x3A, 0x5F) ACCENT = RGBColor(0xC0, 0x49, 0x2F) MUTE = RGBColor(0x8A, 0x93, 0xA0) LINEC = RGBColor(0xC3, 0xC9, 0xD1) FRAME = RGBColor(0xF4, 0xF6, 0xF8) TINT_R = RGBColor(0xF6, 0xE5, 0xDF) 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) s = prs.slides.add_slide(prs.slide_layouts[6]) bgr = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height) bgr.fill.solid(); bgr.fill.fore_color.rgb = BG; bgr.line.fill.background() bgr.shadow.inherit = False 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(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 = 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, lead=1.1, anchor=MSO_ANCHOR.TOP): 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 = F; r.font.color.rgb = color if spc: r.font._rPr.set('spc', str(spc)) return tb # ---- Kopf ------------------------------------------------------------------ txt(Inches(0.95), Inches(0.32), Inches(8), Inches(0.35), "INTEGRATION", size=12.5, color=ACCENT, bold=True, spc=240) txt(Inches(0.95), Inches(0.62), Inches(11.5), Inches(0.85), "Grenzen der Vault-Integration?", size=31, color=NAVY, bold=True) shp(MSO_SHAPE.RECTANGLE, Inches(0.95), Inches(1.34), Inches(0.6), Pt(4), fill=ACCENT) # ---- 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=ACCENT) txt(Inches(1.28), y, Inches(4.5), Inches(0.4), t, size=16.5, color=INK, bold=bold) if sub: txt(Inches(1.28), y + Inches(0.34), Inches(4.5), Inches(0.32), sub, size=12.5, color=MUTE, italic=True) claim(Inches(2.2), "Middleware kapselt den Rand – den Kern nicht", bold=True) claim(Inches(2.95), "1:n geht 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=ACCENT) 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=NAVY, bold=True, lead=1.08) 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=MUTE, italic=True) # =========================================================================== # RECHTS: Kette Auftrag -> altes LIS -> Layer (SPOT) -> Vault (Ende) # =========================================================================== fx, fy, fw, fh = Inches(6.25), Inches(2.4), Inches(5.9), Inches(4.55) shp(MSO_SHAPE.ROUNDED_RECTANGLE, fx, fy, fw, fh, fill=FRAME, line=LINEC, lw=Pt(1.5)) txt(fx + Inches(0.3), fy + Inches(0.14), fw - Inches(0.6), Inches(0.3), "Auftragsweg – hin und zurück durch den Layer", size=12.5, color=NAVY, 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.26), fill=MUTE) if label: txt(cxc + Inches(0.22), y - Inches(0.02), Inches(1.6), Inches(0.3), label, size=11, color=MUTE, italic=True, anchor=MSO_ANCHOR.MIDDLE) # 1) Auftrag b = shp(MSO_SHAPE.ROUNDED_RECTANGLE, bx, fy + Inches(0.52), bw, Inches(0.48), fill=BG, line=LINEC) boxtext(b, "Auftrag · Mischauftrag (1:n)", size=12.5, color=INK, bold=True) down(fy + Inches(1.02)) # 2) Altes LIS b = shp(MSO_SHAPE.ROUNDED_RECTANGLE, bx, fy + Inches(1.3), bw, Inches(0.5), fill=NAVY) boxtext(b, "Altes LIS · nimmt 1:n an", size=13, color=WHITE, bold=True) down(fy + Inches(1.82), "Magic") # 3) Schattenbuchhaltung = SPOT b = shp(MSO_SHAPE.ROUNDED_RECTANGLE, bx - Inches(0.15), fy + Inches(2.1), bw + Inches(0.3), Inches(0.78), fill=TINT_R, line=ACCENT, lw=Pt(2)) txt(bx - Inches(0.15), fy + Inches(2.18), bw + Inches(0.3), Inches(0.32), "Schattenbuchhaltung / Metadaten", size=13, color=ACCENT, bold=True, align=PP_ALIGN.CENTER) txt(bx - Inches(0.15), fy + Inches(2.52), bw + Inches(0.3), Inches(0.3), "Mapping 1 ↔ 3", size=12, color=INK, align=PP_ALIGN.CENTER) # aktiver SPOT-Stern shp(MSO_SHAPE.STAR_5_POINT, fx + fw - Inches(0.78), fy + Inches(2.18), Inches(0.5), Inches(0.5), fill=ACCENT) txt(fx + fw - Inches(2.55), fy + Inches(2.7), Inches(1.75), Inches(0.28), "Single Point of Truth", size=10.5, color=ACCENT, bold=True, align=PP_ALIGN.RIGHT) down(fy + Inches(2.9), "1 → 3, Vault-kompatibel") # 4) Vault am Ende b = shp(MSO_SHAPE.ROUNDED_RECTANGLE, bx, fy + Inches(3.18), bw, Inches(0.82), fill=NAVY) txt(bx, fy + Inches(3.24), bw, Inches(0.3), "Vault · 1:1 · Speicher", size=13, color=WHITE, 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(3.58), Inches(0.62), Inches(0.3), fill=RGBColor(0x34, 0x4E, 0x70)) txt(cxc - Inches(1.08) + k * Inches(0.78), fy + Inches(3.58), Inches(0.62), Inches(0.3), "Rec", size=9.5, color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) # Geist-Stern (durchgestrichen) bei Vault gx = fx + fw - Inches(0.74) shp(MSO_SHAPE.STAR_5_POINT, gx, fy + Inches(3.32), Inches(0.44), Inches(0.44), fill=BG, line=LINEC, lw=Pt(1.25)) shp(MSO_SHAPE.RECTANGLE, gx - Inches(0.02), fy + Inches(3.52), Inches(0.48), Pt(2), fill=ACCENT, rot=20) txt(fx + fw - Inches(2.45), fy + Inches(3.3), Inches(1.65), Inches(0.4), "müsste hier liegen", size=10, color=MUTE, align=PP_ALIGN.RIGHT) # Rückweg (Lesen) – Pfeil links nach oben shp(MSO_SHAPE.UP_ARROW, fx + Inches(0.34), fy + Inches(1.45), Inches(0.26), Inches(2.45), fill=RGBColor(0xD8, 0xCB, 0xC6)) txt(fx + Inches(0.1), fy + Inches(3.95), Inches(1.55), Inches(0.5), "Lesen: zurück, wieder LIS-kompatibel", size=9.5, color=ACCENT, align=PP_ALIGN.LEFT, lead=1.0) out = "/home/marcuh/claude-projects/limbach/Folie2.pptx" prs.save(out) print("saved", out)