app foldee
This commit is contained in:
+95
-82
@@ -1,31 +1,21 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Folie 2 – Grenzen der Vault-Integration. Kette: Auftrag -> altes LIS ->
|
||||
Schattenbuchhaltung/Metadaten -> Vault (am Ende). Der Layer wird zum SPOT."""
|
||||
"""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
|
||||
|
||||
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"
|
||||
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])
|
||||
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):
|
||||
@@ -39,62 +29,62 @@ def shp(kind, x, y, w, h, fill=None, line=None, lw=Pt(1), rot=0):
|
||||
return sh
|
||||
|
||||
|
||||
def boxtext(sh, t, size=14, color=INK, bold=False):
|
||||
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 = F; r.font.color.rgb = color
|
||||
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):
|
||||
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 = F; r.font.color.rgb = color
|
||||
r.font.name = font; 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)
|
||||
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=ACCENT)
|
||||
txt(Inches(1.28), y, Inches(4.5), Inches(0.4), t, size=16.5, color=INK, bold=bold)
|
||||
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=MUTE, italic=True)
|
||||
size=12.5, color=LIGHT, 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",
|
||||
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=ACCENT)
|
||||
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=NAVY, bold=True, lead=1.08)
|
||||
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=MUTE, italic=True)
|
||||
"Genau die Rolle, die Vault halten müsste.", size=13.5, color=LIGHT, italic=True)
|
||||
|
||||
# ===========================================================================
|
||||
# RECHTS: Kette Auftrag -> altes LIS -> Layer (SPOT) -> Vault (Ende)
|
||||
# RECHTS: Kette Auftrag -> Auftragsannahme -> SPOT -> Vault -> Zusammenführung
|
||||
# ===========================================================================
|
||||
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)
|
||||
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)
|
||||
@@ -102,60 +92,83 @@ 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)
|
||||
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.6), Inches(0.3), label,
|
||||
size=11, color=MUTE, italic=True, anchor=MSO_ANCHOR.MIDDLE)
|
||||
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.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))
|
||||
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) 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")
|
||||
# 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 = 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")
|
||||
# 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)
|
||||
|
||||
# 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)
|
||||
# Ü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(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)
|
||||
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))
|
||||
|
||||
# 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)
|
||||
# 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)
|
||||
|
||||
out = "/home/marcuh/claude-projects/limbach/Folie2.pptx"
|
||||
# 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)
|
||||
|
||||
Reference in New Issue
Block a user