Files
claude-projects/limbach/folie2.py
T
marcus hinz 52ce98626c initial
2026-06-12 10:40:47 +02:00

162 lines
7.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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)