From b0fcf8d0f33132844fb7bf89bd47198eceec1f68 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 13 Apr 2026 00:21:26 -0300 Subject: [PATCH] Fix 3 deliverable bugs: PDF env catalogue, business case, drawio diagram - oci_pdf_gen.py: add_environment_catalogue now auto-detects new schema (name/sizing/cost_pct) vs legacy (environment/tier/databases/ocpus), same fix as oci_deck_gen.py. Also normalizes cost_notes string to list. - business-case-spec.yaml: created PharmaCorp spec (was using MELI). Fixed schema: risks as {migration_risks, do_nothing_risks}, roadmap as {phases, total_duration}, recommendation as {summary, next_steps}. - diagram-spec.yaml: rewrote to match generator format (tenancy.regions[].vcns[].subnets[].services[] with explicit IDs). Now generates 231 cells, 11 containers, 15 services, 10 connections. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../business-case-spec.yaml | 151 ++++++++++++++++++ .../opt01-architecture-proposal.pptx | Bin 3698148 -> 3698148 bytes .../opt01-customer-proposal.pdf | 20 +-- .../opt08-business-case.pptx | Bin 3682337 -> 3680278 bytes tools/oci_pdf_gen.py | 40 +++-- 5 files changed, 190 insertions(+), 21 deletions(-) create mode 100644 examples/output-demo-pharma-mx/business-case-spec.yaml diff --git a/examples/output-demo-pharma-mx/business-case-spec.yaml b/examples/output-demo-pharma-mx/business-case-spec.yaml new file mode 100644 index 0000000..753d1a3 --- /dev/null +++ b/examples/output-demo-pharma-mx/business-case-spec.yaml @@ -0,0 +1,151 @@ +# OCI Deal Accelerator — Business Case +# Demo: PharmaCorp Mexico — ExaCS migration from on-prem Exadata X6 + +business_case: + customer_name: "PharmaCorp Mexico" + prepared_by: "Carlos Mendoza — Solutions Architect" + date: "2026-04-12" + + executive_summary: > + PharmaCorp Mexico operates 3 mission-critical Oracle databases (EBS R12, SAP, DW) + on aging Exadata X6 hardware. The hardware refresh quote is $1.8M and locks the + company into 5 more years of on-prem operations with no DR capability. Migration + to OCI ExaCS X11M reduces annual infrastructure costs by 61% ($1.75M over 3 years), + adds cross-region DR (RPO<15min, RTO<1h), and resolves the pending SOX audit + finding on automated patching — all while eliminating data center costs. + + drivers: + primary: "hardware_refresh_avoidance" + urgency: "HW refresh due in 6 months — must decide now or commit $1.8M" + cost_of_inaction: + financial: "$1.8M HW refresh + $300K/yr support + $80K/yr DC costs = $2.88M over 3yr" + risk: "No DR today — single site, single point of failure for EBS production" + compliance: "SOX audit finding: manual quarterly patching is non-compliant" + + tco_comparison: + current_state: + description: "On-premises Exadata X6 with hardware refresh" + line_items: + - item: "Hardware Refresh (Exadata X8M)" + year_1: 1800000 + year_2: 0 + year_3: 0 + notes: "One-time CapEx" + - item: "Annual Support & Maintenance" + year_1: 220000 + year_2: 220000 + year_3: 220000 + - item: "Data Center (power, cooling, space)" + year_1: 80000 + year_2: 80000 + year_3: 80000 + - item: "DBA Operations (patching)" + year_1: 60000 + year_2: 60000 + year_3: 60000 + - item: "DR Infrastructure" + year_1: 0 + year_2: 0 + year_3: 0 + notes: "No DR — risk accepted" + total_3yr: 2880000 + + proposed_oci: + description: "OCI ExaCS X11M with Data Guard DR" + line_items: + - item: "ExaCS X11M Queretaro (Prod, BYOL)" + year_1: 98400 + year_2: 98400 + year_3: 98400 + notes: "$8,200/mo" + - item: "ExaCS X11M Sao Paulo (DR, BYOL)" + year_1: 98400 + year_2: 98400 + year_3: 98400 + notes: "$8,200/mo — Data Guard standby" + - item: "FastConnect 10Gbps Dual" + year_1: 36720 + year_2: 36720 + year_3: 36720 + notes: "$3,060/mo" + - item: "OCI Vault + Monitoring + Storage" + year_1: 30000 + year_2: 30000 + year_3: 30000 + notes: "$2,500/mo" + - item: "Migration (one-time)" + year_1: 50000 + year_2: 0 + year_3: 0 + notes: "ZDM + Data Guard setup + testing" + total_3yr: 1130400 + + savings_3yr: 1749600 + savings_pct: 61 + + roi: + investment: 50000 + annual_savings: 583200 + payback_months: 1 + three_year_roi: "3,400%" + + value_drivers: + - driver: "Cost Avoidance" + impact: "$1.75M saved over 3 years vs HW refresh" + evidence: "BYOL pricing + elimination of DC costs + automated patching" + - driver: "Risk Reduction" + impact: "Cross-region DR where none exists today" + evidence: "RPO<15min, RTO<1h with Data Guard + FSDR" + - driver: "Compliance" + impact: "SOX audit finding resolved" + evidence: "ExaCS automated patching + OCI Audit + Vault for key management" + - driver: "Operational Agility" + impact: "DBA freed from patching + infrastructure management" + evidence: "Oracle-managed ExaCS infrastructure, automated backups" + + risks: + migration_risks: + - risk: "EBS customizations require testing" + mitigation: "Pre-Prod testing in Phase 2 before cutover" + - risk: "FastConnect provisioning delay (partner-dependent)" + mitigation: "Start in week 1; IPSec VPN as interim backup" + - risk: "HW refresh deadline pressure (6 months)" + mitigation: "16-week migration plan fits within window" + do_nothing_risks: + - risk: "No DR — single site, single point of failure for EBS" + mitigation: "Cannot be mitigated without investment" + - risk: "SOX audit finding remains unresolved (manual patching)" + mitigation: "Remediation requires automated patching — on-prem can't deliver" + - risk: "$1.8M HW refresh locks in 5 more years of on-prem" + mitigation: "Sunk cost — no cloud migration ROI for 5+ years" + + recommendation: + summary: > + Proceed with OCI ExaCS migration. 61% cost reduction over 3 years ($1.75M saved), + cross-region DR capability, and SOX compliance resolution. The alternative + (HW refresh) costs $1.75M more and leaves DR + compliance gaps unresolved. + next_steps: + - "Board approval with TCO presentation — May 2026" + - "Provision OCI tenancy + ExaCS in Queretaro — June 2026" + - "Start FastConnect provisioning with partner — June 2026" + - "EBS customization inventory and Pre-Prod testing — June 2026" + - "Production cutover — September 2026" + + roadmap: + total_duration: "16 weeks (May — September 2026)" + phases: + - phase: "Board Approval" + timeline: "May 2026" + key_action: "Present TCO + risk analysis to board" + - phase: "Foundation (networking + ExaCS)" + timeline: "June 2026 (4 weeks)" + key_action: "Provision OCI tenancy, ExaCS, FastConnect" + - phase: "EBS Migration" + timeline: "July 2026 (6 weeks)" + key_action: "Migrate EBS R12 with ZDM, configure Data Guard" + - phase: "SAP + DW Migration" + timeline: "August 2026 (4 weeks)" + key_action: "Migrate remaining databases" + - phase: "Cutover + Decommission" + timeline: "September 2026 (2 weeks)" + key_action: "Production cutover, decommission Exadata X6" diff --git a/examples/output-demo-pharma-mx/opt01-architecture-proposal.pptx b/examples/output-demo-pharma-mx/opt01-architecture-proposal.pptx index 39c932cbf32dbd5f9ee5fc08bb02345401f6608b..8929e3c523df484fad277b7bf8f7e10389254c9b 100644 GIT binary patch delta 8384 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 diff --git a/examples/output-demo-pharma-mx/opt01-customer-proposal.pdf b/examples/output-demo-pharma-mx/opt01-customer-proposal.pdf index 9f57bcf..18abe1b 100644 --- a/examples/output-demo-pharma-mx/opt01-customer-proposal.pdf +++ b/examples/output-demo-pharma-mx/opt01-customer-proposal.pdf @@ -142,7 +142,7 @@ endobj endobj 19 0 obj << -/Author (Carlos Mendoza) /CreationDate (D:20260412231513-03'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260412231513-03'00') /Producer (ReportLab PDF Library - \(opensource\)) +/Author (Carlos Mendoza) /CreationDate (D:20260413001815-03'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260413001815-03'00') /Producer (ReportLab PDF Library - \(opensource\)) /Subject (OCI Architecture Proposal) /Title (PharmaCorp Mexico \204 Oracle Database Migration to OCI) /Trapped /False >> endobj @@ -181,10 +181,10 @@ Gau0D?!#c?&:N_CbgW/j?!L$g^Wu7?8q>@-7nU((+*^X&-#p2l<48Luq]/7J#`q"tlTI8H[URM:RCOPJ endobj 25 0 obj << -/Filter [ /ASCII85Decode /FlateDecode ] /Length 2236 +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2349 >> stream -Gau`U=``=W%"?O+^dC2I[Y[=KeDYgsS2Atqe"j7Xh9P)8O_I=f%Tc/`m]TuZP'k3VI"\gfRFX2CiqabtKIIK1U\b!5"umX=aa4AZ_-dD1>9!j>i-]M5lbN(=@WrYkbi92P&+tpuc,B^9a+FL7%\D]I%$'B6<;<,DdE@jp`&b><1ChXdRDF6A;q)(/k&QmPC+6BK)Kp[un#&M.r.`c]a,<99U25#cI*nA1tB(#ksn2A\OHh6f.fK]WZY5J$ne=I>dL3pHtNAU'T6/)/l712;lmuE#k5Ctn?=[VDPZc0k$MGAOQg(o7b8[jG.lJjjg&Gk4?";kL]f'kUUGd,27ZF,C$i=&Md(DfRNZaZ%OeL_FUbT$02/2(qrqirh"k1":f'1J`Z>>_K'krdsArfo\9BY)bk0@YQU%'"[2)Nn2I%h`[jD$P`8o8=n_Wp6)MrAlpg8^LG/Y=I3oN&BlB/Saqo5ZYpK2=EHUGRU#R0:[;,(`/D"Y/B/1A-U;=?`5`:b'PsG"=e#;)uSH=0!:)H'-*%X/no,1f;7ro:^PF49FIb.o,M%jLpuBf\Snit@uP9V\hWL-0GXZ(?GH^lZNhJV`[SL5XmkE`'%2'boM)G^bnMs\L\1/3Z'kVq9,oSaC88%Yi!SEA;2DO`_)\3l7tOLWM"$B2!l<)oF%nlM\N<_)(FpuDDi`cfmegj).D8CDa[Y#m%Wa62PWrhN4%1aGL'$Fqj9"o*3[*a`,?bB`&\L19:OqBqh\1LmK/kDVSn/Ffb**C@l(FS/P`TKk:dmO$QhQO?1&g*0OCleH8DK0T7"a*1WHn6YZarl//KK&s(Vmc^)W86t'M:_DNe$g?uO6O'H]<%016e!L^V2Ir--rQA]]gAOK_\@LsTY)U`cS]We>QPT$/R?`3d^.318dd^FFl/)Mbbon:YG"o-oIPW#!B"p"F$Cce+Pl9mQI=Bn*7sP>.Lb7+<&EPSs+KF5f9Z-8$>p^7*>Re:1>E&D10ED?$NlYfhN/1s:2Po2^.+OqU/fnO5gjf9s=f<5se:U?XDOcI,Ss^[UcC\)6/#lcIWG$NN`RU2fZ\F@<.?u`;eZ,=GRb@*nH_h4k!7M#h]p`*>3)p!Qa/IO/[V+?r);3TaAoGYIQ-n-7/4O5]TWNYa`?S@k37Z?UC*':ak<(D-h9Y24[#M>hn*_]d/]cD)594u88]K,@:SF@B_Gqq7W#D_:?c_1'*25-KM&Q=UL;c<3C@7OWP=_4NP[:)eZ0&EqY*"o!%$[&M[3;=P"D*muM5=s@+uDSMdIOo@;TgBKe=)k'MZRfT;$=H@^X\[TksW++RekF,/D@6j8jDa4e*h@8=+fHcP)gfN23Q+5@F@ho%olmIP=\bUPY3MQe`;%/U@u=K^I$?DX+U7W-p_ErH]a<8HYRrb.,:g6Fdpts%fQWdQ&``~>endstream +Gau0F=``=U&:XAWfS="WD%q^)n%QoPijKN@Nhn)iN*ftMZC18[GW9SjIp:sui!u$0Or'*jU:1j"`4Ti]4[K'nY2U"A#A9RV4aRFT+$9/mXZQ4cBoG`SOo-4b&O"tZjn/N6BE#`5f&ss^tjF![;(iD^bYUtV82Ae>^T'LoXPaLJsECU79"%a,iLJg+G\eddb:@hp$(XZ_4k!-]K/'NGhEr@f<0g)phmPN6*nN=so=.U&Q/,?jc9be"3[pY%GWmi-'Yot^tBn=qrV+AXjlle"P/4IOoWMi4Jhpp*mh^=rMT]8`6^u4qfLWSVf'YV`-:K$L>4k.1*=Y!'+maqOieIG7uB.H"k#gm))"U?XT(@`1Q/:L(C\u+YSD&q5P/c:jrReL)l]l*B&F`_g);/.7;"OcmekP(O/^e@ZMl5s/CdV:YmUX3*'poNg"f]G4RgbW?:=Uu1/C:QkLinq[RJU&-+$J>Z@^\(#b1BYCBc\)#1l)`_jR8bXO0/E.e7j*p*Di83W;uJ79#*f^\MT![If!:4GqT:r5mRpI&]V470QqSn8GhqgdBoBn`JYb1+IV^-R[@T9ZL3Z3;YI]Z8'$6QtOf/%Rh,W!QLYG7NrSn@(jECRA-HS)=2I2oekE,o_fqFgBa^oRId#%R0(r:b)+L*CQ+*oJhZO2)pCNkTA$u^uDAMhEHuB>N<:!Nb9a'$D/u9m>D61UTR6-rF(g):dns'7j^4b!cBpi'MC1A^2DU9PgNACkQ@C?_`Yo/C,#=g8OQ'VE&QDJGPq2XO)e#2&uhrABLP?]>Gfc=\[H#AhGI(@T+"nD_.jL=&%.1NFq;ilp2H`!!gEP:BWBU?.M"M,OWHC'eMA-p7>4.3g*`Ma(Mf&sW8d+,^?+]6]%/E@\+uTJdM2[1_-\gq30!qY/g?*#Et56RObqmT!&IWI,2(g,cN=U3:%3e0c:SW_R]aI>Hei!u.888=ed@qGtX*<'i(7n=FMrGqYJ9Q*-*J8L%Q!,tj1C:h(o/k+7naaRT[;#*@3THEi:DR-J\&mu'5jYt$'$Y4ib&TiJ)JXjXFdm.92t5Lf#Xac_H7]W33b[2/UY3F>hQ+-`F>X(TTG<@9dS<_gH[CNeSY.dBI78c&VP'A3[#&3p_"gm.Fe$T>&$h5K7'[H_ehI)bN]c=pBHgm>F*-mLq&fYJu'_&(P!pB*:HAj5dDe%g+pF$cA5-+s%itC/n7Tgn(eN^GY:KN36M4SRW3Od"aA,e'`l]@fFG'c!C%n`69=n!FCbVp$gt.J?Y+c*hi^7OG0)Z05*i*D3<9VYqRs&#heC$jGcVE=l0jMNTo]crBiYN.4g,]mHV6.=4W[AQ>2&X#cXJM,*`CKVC2V,d(m:Bcj)Q/a'er3M)Bm`GL)PGrf*0`>?eMQXX?Bc&k!C-'rKUheh6_k-"PN$aWo]KM$0PHF4mjFaETO(/kJ3-%AGb@$d3g3ZFS[\6s+"oBfWMk\65GDiPiZFohfC?LA53=qL%V/<0LsD+Qkl^[9GME-=5\D_Ei6>G/kJ[PK[_>=/cKDXEY1Fg.V:$qg%$Q!jJR2YH.eeUp#I'iT)FkS)gemIglll5:Y)"_Z>T\Y2--P,UgPs/,S$T.7Xs=Ul5kVI]9`,1R25t)QX%DZLK:gFb9@E&,se"fSj?Hp"\gPI'M;1)q8Tala#Ybhl\!`W:l>ZBRj8#;LYp0"XIDa>8u$<%l>!9j+ahM`L[S`5XhfCV7,LEF23oKk``YC^V=,9f/=.iiO@g6YRTp@*%:8>t)fYL4#Pt/D6S.30..0oW1d,dI%cQs&p6*;?Ii9b0>l~>endstream endobj 26 0 obj << @@ -249,15 +249,15 @@ xref 0000005993 00000 n 0000008355 00000 n 0000010383 00000 n -0000012711 00000 n -0000014950 00000 n -0000017314 00000 n -0000018630 00000 n -0000019167 00000 n +0000012824 00000 n +0000015063 00000 n +0000017427 00000 n +0000018743 00000 n +0000019280 00000 n trailer << /ID -[<058687b5e54d5950ae70b0c7d0f56515><058687b5e54d5950ae70b0c7d0f56515>] +[<8c841a256005e9c14418567efe6f7d83><8c841a256005e9c14418567efe6f7d83>] % ReportLab generated PDF document -- digest (opensource) /Info 19 0 R @@ -265,5 +265,5 @@ trailer /Size 31 >> startxref -20023 +20136 %%EOF diff --git a/examples/output-demo-pharma-mx/opt08-business-case.pptx b/examples/output-demo-pharma-mx/opt08-business-case.pptx index 1f662f3a7302af56045402bc8ecdca7654ffd3d6..c1f117879eee9da0546b85d93b0af5f4f11f9426 100644 GIT binary patch delta 24823 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 Jq4$D{(*N*(UkU&K delta 26441 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 diff --git a/tools/oci_pdf_gen.py b/tools/oci_pdf_gen.py index a82c0b9..b032e16 100644 --- a/tools/oci_pdf_gen.py +++ b/tools/oci_pdf_gen.py @@ -619,20 +619,38 @@ class OCIPDFGenerator: self._add_bullet_list(items) def add_environment_catalogue(self, environments: list, - cost_notes: list = None): + cost_notes=None): """Environment Catalogue section.""" self._add_section_title("Environment Catalogue") - headers = ["Environment", "Tier", "Databases", "OCPUs", "Isolation"] - rows = [ - [e.get("environment", ""), e.get("tier", ""), - e.get("databases", ""), e.get("ocpus", ""), - e.get("isolation", "")] - for e in environments - ] - avail = self.PAGE_WIDTH - 2 * self.MARGIN - widths = [avail * 0.16, avail * 0.10, avail * 0.20, - avail * 0.10, avail * 0.44] + # Normalize cost_notes to list + if isinstance(cost_notes, str): + cost_notes = [s.strip() for s in cost_notes.split(".") if s.strip()] + + # Detect schema: new (name/sizing/cost_pct) vs legacy (environment/tier/databases/ocpus) + sample = environments[0] if environments else {} + if "sizing" in sample or "cost_pct" in sample: + headers = ["Environment", "Sizing", "Isolation", "Cost %"] + rows = [ + [e.get("name", e.get("environment", "")), + e.get("sizing", ""), + e.get("isolation", ""), + f"{e.get('cost_pct', '')}%" if e.get("cost_pct", "") != "" else ""] + for e in environments + ] + avail = self.PAGE_WIDTH - 2 * self.MARGIN + widths = [avail * 0.18, avail * 0.40, avail * 0.27, avail * 0.15] + else: + headers = ["Environment", "Tier", "Databases", "OCPUs", "Isolation"] + rows = [ + [e.get("environment", ""), e.get("tier", ""), + e.get("databases", ""), e.get("ocpus", ""), + e.get("isolation", "")] + for e in environments + ] + avail = self.PAGE_WIDTH - 2 * self.MARGIN + widths = [avail * 0.16, avail * 0.10, avail * 0.20, + avail * 0.10, avail * 0.44] self.story.append(self._make_table(headers, rows, widths)) if cost_notes: