PEPC-JGJ
Paarminder Singh Electronics
Process Consultancy (JGJ)
Welcome — ROI Feasibility Tool
v2.251
Master Access
PEPC  ·  Feasibility Tool  ·  v2.251
Overview
Project Dashboard
Live summary. All metrics update automatically as you fill each section.
Total Capex
--
Rs. Indicative
Payback
--
Months · Capex ÷ Monthly Saving
IRR
--
% per annum · Must exceed loan rate
Avg DSCR
--
7-Year Avg · NCA ÷ Annual EMI · Min 1.5x
Module Completion
0%
PCB Analysis
0%
Plant Design
0%
Financials
0%
Infrastructure
0%
Documentation
Benchmark Comparison
SMT Line Utilisation
--
Industry: 60-75%
Payback Period
--
Target: <36 months
IRR vs Loan Rate
--
Must exceed 11.5%
Average DSCR
--
Bank min: 1.5x
Break-Even % of Cap
--
Safe: <70%
Risk Register
Complete inputs to generate automatic risk assessment.
▶ Strategic Advantages — In-House vs EMS Outsourcing
Key reasons to bring PCB assembly in-house
📈 Cost Savings
Assembly cost per board drops to actual labour + consumable cost — eliminating EMS vendor margin of 25–40% charged on top of their own cost.
🔒 IP & Design Confidentiality
PCB designs, BOM, firmware and test procedures stay within the company. EMS vendors handle multiple clients — in-house eliminates all IP leakage risk.
⚡ Faster Turnaround
EMS batch scheduling adds 2–6 weeks of lead time. In-house assembly produces boards on demand — same day or next day for urgent requirements.
Sensitivity Analysis
Volume Change 0%
Electricity Rate Change 0%
Outsource Cost Change 0%
Adjusted Results
Annual Saving
--
Payback
--
IRR
--
NPV
--
Section 01
Project Details
Client and engagement information. Appears on all reports and presentations.
Client Information
Project Scope
Section 01B
Scope of Work
Define process flow for each PCB. Tick a stage to activate it — a popup asks about special processes before or after. Click Apply Scope when done.
0
Factory Line Configuration
Define how many SMT lines this factory has (1–15). Each line is independent — its own machines, PCBs, products and costs.
Max 15 lines. Each line is fully independent.

Stage Activated

Add a special process around this stage?

Add Special / Custom Process

KW and Capex flow to Infrastructure section automatically.

Process Flow

Select PCB
LEGEND:
Process
Inspection
Decision/QA
Input/Output
Offline/Delay
Start/End
Ready to continue?
Pushes all scope selections to PCB Profile, SMT, THT, Infrastructure and Manpower sections.
Section 02
PCB Profile
Define each PCB type. Physical dimensions, component mix, and costs. Data flows automatically to SMT, THT, Cost Per PCB and Finance sections.
PCB Types  0 PCBs
Section 03
Infrastructure & Capex
Equipment costs and power consumption. Total KVA auto-calculated. DG set recommended automatically. All costs flow to Finance and Cost Per PCB.
Floor Area
Total area: -- sq ft
💱 Currency Exchange Rates (update before recalculating capex)
e.g. 94.28 on 06-May-2026
e.g. 155.92 on 06-May-2026
e.g. 0.85 on 06-May-2026
📊 Derived rates (auto): JPY → INR: -- EUR → INR: -- JPY → USD: --
Equipment Prices in Foreign Currency → Auto-converted to INR Capex
# Equipment Cat. Currency Foreign Price Qty Power (KW) KW × Qty INR Total (auto) DDU (USD) INR incl. DDU
Total Foreign Equipment (INR) -- KW -- -- --
Enter rates above — INR values update automatically. These flow into equipment capex fields.
Additional Equipment
Add any equipment required for this client engagement — barcode marker, rework station, conformal coating, testing chamber, or anything else. Select which table it belongs to.
THT Flip Fixture Cost
One per line. Insert all comps, fit cover, flip once, solder all.
Electrical Load Summary — Complete [Auto-Calculated]
Load SourceKWFormula / Basis
SMT Equipment--Sum of all SMT machine KW x qty
THT Equipment--Sum of all THT machine KW x qty
AC System--AC Tons x 1.2 KW/ton
LED Lighting--Panels x 36W = Panels x 0.036 KW
Compressor--HP x 0.746 KW/HP
Total Connected Load--Sum of all loads above
Typical 0.85 for industrial
20% for ture expansion
Complete equipment entries to see total load.
THT Zone Load — Night Shift (Shifts 2 & 3)
When THT runs 2 or 3 shifts, only the THT zone stays powered. Enter the THT area sub-load below — used for accurate electricity cost in Cost Per PCB.
AC for THT area only
Lighting for THT area only
Compressor during THT only
Enter THT zone loads above to calculate night shift electricity cost.
Civil & Utility Costs [Area Auto-Calculated]
Installed: Rs.120-200/sqft
With reflow heat: 150 sqft/ton
For depreciation calculation
24hr basis — hover for formula
Total linear feet of all partition walls
Modular partition Rs.180-350/rft
8-10 per building (IS 3043)
Typical Rs.8,000-12,000 each
300 lux = SMT (IPC-7711 rec.)
Standard 36W panel = 4000 lm
DG Set & Compressor
DG Efficiency Derating
A new DG set at 100% capacity degrades to ~85% with proper AMC and ~70% without maintenance after 5-6 years. Size accordingly.
Future Expansion Plan
e.g. 4 if planning 4 more lines
PEPC Recommendation [Auto-Calculated]
Current Load Requirement
--
Without derating
PEPC Recommends (with derating)
--
Next standard size above derated KVA
Future Expansion Size
--
If expansion plan materialises
Client Decision — Select DG Set to Purchase
PEPC recommendation is pre-selected. Client can override based on their future plan or budget. All calculations update automatically.
Air Compressor
Total Capex Summary [Auto-Calculated]
SLM: 15yr life = 6.67%
24hr basis — hover for formula
Total Project Capex: --
Depreciation Calculation [Auto — Customer-Facing]
ItemFormulaValue
Equipment + Civil CapexAs per Infrastructure section--
Depreciation MethodStraight Line Method (SLM)SLM
Useful LifeAs per Companies Act 2013, Schedule II15 years
Depreciation Rate100% / Useful Life6.67% p.a.
Annual DepreciationCapex x Rate--
Monthly Hours (24hr basis)Working Days x 24 hrs/day (building & asset 24hrs)--
Depreciation per HourAnnual Depr. / Annual Hours--
Total Floor AreaSMT + THT + Testing + Store--
Rent RateAs entered--
Monthly RentArea x Rent Rate--
Monthly Hours (24hr basis)Working Days x 24 hrs (rent runs 24hrs/day)--
Rent per HourMonthly Rent / Monthly Hours--
Section 04
SMT Line Capacity
CPH weighted by component type. BGA and fine pitch pin counts used for accurate pad calculation. Cycle time per board shown.
SMT Line:
Pick & Place Machines
# Brand Model Type Rated CPH Actual % Actual CPH
Total Actual CPH 0
Component Speed Factors
Production Mode
SMT Capacity Results [Auto from PCB Profile]
Effective CPH Available
--
CPH @ OEE
CPH Required
--
All PCB types
Line Utilisation
--
% of capacity
PCB / OptionPassStdFPBGALgPadsSpeedCPH ReqCycle(s)Brd/HrBrd/ShiftBrd/MonthDaysUtil%
Enter PCB data in Section 2
Section 05
Through-Hole Assembly Capacity
THT totals auto-filled from PCB Profile. Break down by component type. Balance must match PCB Profile total. Custom components with editable pin counts.
THT Line:
Soldering Method Selection Matrix
Select one primary soldering method per PCB side. Tick Touch-Up if a manual rework station is needed alongside the primary process. Pre-filled from PCB Profile — override here as needed.
PCB / Side Wave Soldering Hand Soldering Selective Soldering Touch-Up Station Touch-Up Cycle (s/board)
Add PCBs with THT in PCB Profile first.
Component Breakdown Matrix Totals must match PCB Profile THT count per PCB side
Component TypeInsert(s)Joints
Add PCBs with THT in PCB Profile first.
THT Capacity Summary
Operators Required / Shift = number of human operators needed per shift to produce the monthly volume target for that PCB type, based on cycle time and available hours.
PCB / OptionTHT A/BStuff(s)Method A/BQA(s)Cycle(s)Brd/HrTakt(s)OperatorsDaysMatch?
Select THT scenarios above
Consumables Matrix — All PCBs Auto-calculated from PCB Profile. Edit unit costs below.
ConsumableUnitCost/Unit (Rs.)
Add PCBs in PCB Profile first.
Pre-Heat Electricity & Nitrogen Costs
Pre-Heat Electricity — Beyond Production Hours
Wave solder switches on 4 hrs before production. Reflow switches on 1 hr before. This electricity is a real cost not captured in shift-hours calculation.
Machine on before production starts
Reflow reaches temp faster
Default OFF — enable only for Class 3 / high-reliability applications
Nitrogen not enabled. For standard BESS PCB assembly (Class 2) nitrogen is not required.
Complete inputs above to see total wave solder consumable cost per board.
Section 06
Manpower Planning
Three categories. Cat1+2 feed Cost Per PCB. Cat3 feeds Finance P&L only.
Category 1 — Direct Production [feeds Cost Per PCB]
RoleProcessQtyShiftsSalary/Month (Rs.)Monthly (Rs.)Per Shift (Rs.)
Category 1 Total----
Category 2 — Quality and Engineering [feeds Cost Per PCB as overhead]
RoleFunctionQtyShiftsSalary/Month (Rs.)Monthly (Rs.)Per Shift (Rs.)
Category 2 Total----
Category 3 — Administration and Management [feeds Finance P&L only — NOT Cost Per PCB]
RoleFunctionQtySalary/Month (Rs.)Monthly (Rs.)
Category 3 Total--
Summary
Cat1 Production
--
-> Cost Per PCB
Cat2 Quality/Engg
--
-> Cost Per PCB
Cat3 Admin/Mgmt
--
-> Finance P&L
Grand Total
--
Rs./month
Section 06A
Facility Layout Plan
Conceptual ground floor layout — Newen Systems EMS Facility. All dimensions indicative. Final drawings by appointed architect.
Newen Systems — EMS Facility Floor Plan
Site Width: 340 ft (103 m)  |  Building: 300 × 310 ft  |  Rev 2 · May 2026
Upload your floor plan to replace this indicative layout
📦 Production Zones
SMT Line 100×40 ft
THT Stuffing 100×40 ft
Mech Assembly 100×40 ft
Testing & Box Assy 80×40 ft
🏢 Front Office
Reception 30×20 ft
Conference Rooms (×2)
HR & Admin 15×20 ft
Canteen 30×15 ft
🔬 Engineering Hall
R&D Zone 30×20 ft
NPD Zone 20×20 ft
Product Engineering
Quality / Process Eng.
🏗️ Utilities
Generator + Compressor
LT Panel Room 20×10 ft
UPS / HVAC
Dispatch Bay 20×30 ft
Section 07
Cost Per PCB — Activity Based Costing
Shared line costs allocated proportionally by line time. Each column is one PCB type. Read down the rows — every cost head is shown for all PCBs side by side. Professional costing sheet format.
Rate Inputs — Apply to All PCBs
Blended incl. DG set
SAC305 lead-free
Spares, oils, nozzles
Stencil rolls + IPA wipes
At 98% FPY
Min. Rs.8,000–10,000 market
Shutdown+Prog+Pilot x 1.15
Loctite 3900 acrylic default
50µ nominal / 75µ max
Default: both sides
Selective machine overspray
Cost Per PCB — Vertical Costing Sheet
Combined Summary — All PCB Types
Wtd Avg In-House/PCB
--
Wtd Avg Outsource/PCB
--
Total Monthly Saving
--
Annual Saving Year 1
--
% Cost Reduction
--
Simple Payback
--
SMT Line Utilisation
--
Section 08
Production Planning & Mapping
Target calculator for each process: enter target days, press Add to generate resource options. Select a row to lock it in. The Gantt updates automatically. Same sheet used for planning and customer presentation.
Global Settings
Effective target: 19.5d
🔵 SMT — Pick & Place
🔴 THT — Through-Hole Assembly
🟢 ICT — In-Circuit Test
🟡 Functional Test
Select number of test stations:
🟦 Packing
Lock selections → update Gantt, Manpower & Finance
Live Production Timeline
Calculating...
Impact vs Base
How to use:
1. Enter target days for each process → press + Add
2. Multiple rows appear — one per scenario
3. Press Select on the row that fits
4. Gantt updates instantly
5. Press Accept & Apply to lock in
Planning — Advanced
Real-Time Line Simulation
Parallel/overlapping process flow. Each process starts as soon as the trigger batch arrives from the previous stage — operators never sit idle. Set lags, trigger batches, and per-day exceptions (overtime or stoppages). Base shift hours are read automatically from the Timing sheet.
RAW simulation — reads live from SMT/THT/ICT capacity sheets
Total Volume
SMT Days
THT Days
ICT Days
Func Days
Mech Days
BoxFunc Days
Burn-in Days
Pack Days
Process Configuration — Toggle Active, set lag & trigger batch. Base hrs from Timing sheet.
Process Base Hrs/Shift Shifts/Day Lag (hrs) Trigger Batch Active
Day-by-Day Exceptions — Leave blank = normal. Click cell to set Overtime or Stopped.
Overtime   Stopped
Effective Total Days
Sequential sum:
Warnings
Run simulation to see analysis.
How to use:
1. Check active processes & set lags
2. Set working days → Build Grid
3. Click cells for Overtime / Stopped
4. Press ▶ Run Simulation (always visible here)
5. Gantt appears below ↓
6. Print or Add to PPT
Parallel Production Gantt — RAW Simulation
SMT THT ICT Func Mech BoxFunc Burn-in Pack Stopped Overtime
Press ▶ Run Simulation on the right panel to generate the Gantt chart.
Section 08
Finance Calculator
Capex auto-filled from Infrastructure. In-house cost auto-filled from Cost Per PCB. Outsource cost auto-calculated from PCB Profile. Only loan parameters need manual entry.
Financial analysis based on: Base configuration
No mapping applied. Using base infrastructure and manpower inputs.
Auto-Filled Inputs
Loan & Growth Parameters [Manual Entry]
Bank min: 25-30%
Working Capital
Bill of Material Cost per PCB — enter component cost per board (excludes assembly labour)
Add PCBs in PCB Profile first.
Total Monthly BOM Cost
--
ⓘ BOM cost is included in processing cost base for all WC rows below. Leave at 0 if Newen supplies components on consignment (job-work model).
Raw Material Holding (days)
--
WIP (days)
--
Finished Goods (days)
--
Debtors / Receivables (days)
--
Creditors / Payables (days)
--
Net Working Capital
--
EMI & Loan Structure [Auto]
Monthly EMI
--
Rs. / month
Annual Debt Service
--
Rs. / year
D/E Ratio
--
Must be <= 3:1
Bank Schemes: SIDBI (up to Rs.25Cr, 9-11.5%) | SBI MSME (up to Rs.10Cr, 10.5-12%) | CGTMSE Collateral-free (up to Rs.2Cr) | PMEGP Subsidy (15-35%) | MUDRA Tarun (Rs.10L)
Section 09
DSCR & 10-Year ROI
All 7 ROI types. 10-year P&L projection. Bank credit appraisal format.
10-Year Projections
P&L ItemYr 1Yr 2Yr 3Yr 4Yr 5Yr 6Yr 7Yr 8Yr 9Yr 10
Complete Finance section
All 7 ROI Metrics
#MetricFormulaYear 1Year 3Year 5Year 10Status
Complete Finance section
Section 10
Subsidies & Incentives
Central & Gujarat schemes. Tick to apply — DSCR, IRR, payback and NPV update automatically.
Tick applicable schemes — all metrics update automatically
Capital subsidies reduce net capex & loan. Annual benefits add to NCA. Both improve DSCR, IRR and payback.
Gross capex
--
Before subsidies
Capital subsidy
Rs.0
One-time deduction
Annual benefit
Rs.0
Adds to NCA/yr
DSCR with subsidies
--
vs base --
🏠 Central Government — PLI / Electronics Component Manufacturing Scheme 2025
Capital subsidy on plant & machinery
Up to 25% of equipment capex · one-time · reduces loan amount
%
Incremental sales incentive (PLI cash-back)
4–6% on incremental production sales · 5 years · adds to annual income
%
Custom duty exemption on imported equipment
Waiver of import duty at equipment purchase · one-time
%
🏭 State — Gujarat Electronics Policy 2022–28 & Aatmanirbhar Gujarat 2022–27
Gujarat GECMS-2025 — Capital subsidy (100% top-up of Central)
Same % as Central on same equipment capex — if Centre gives 25%, Gujarat gives another 25% · paid within 30 days of Central release
%
Interest subsidy on term loan
Up to 7% or actual rate · you bear min 2% · ceiling Rs.1 Cr/yr · 5 years
%
Power tariff subsidy + electricity duty exemption
Rs.1/unit power subsidy for 6 yrs + full electricity duty waiver
Rs/u
EPF reimbursement (AGRS)
100% female / 75% male · 5 years · auto-calculated from manpower section
auto
Net SGST reimbursement (Aatmanirbhar Gujarat)
Up to 100% net SGST for 10 years · based on taluka category
%
Stacking: PLI/ECMS (Central): 25% of plant & machinery cost. Gujarat GECMS-2025: 100% top-up = same Rs. amount as Central on same capex base. Net result: 25% + 25% = 50% of machinery cost recovered from government. Interest, power, EPF and SGST all apply to different cost heads and fully stack.  |  Eligibility: Requires MSME/Udyam registration. Disbursements subject to CA-certified milestone verification.
EMS Revenue
Spare Capacity — EMS Revenue Estimate
Assembly revenue from spare SMT capacity. Flows into DSCR, IRR and payback automatically.
Rate Parameters
Your cost
Your cost
You charge client
You charge client
Avg assumption
Month from commissioning (e.g. 4 = starts in Month 4)
⚠️ Important: EMS revenue will be zero for the first 0 months after commissioning.
DSCR, IRR, Payback and NPV are all adjusted to reflect this delay.
Set to 1 if EMS starts immediately from Day 1.
EMS boards/month
--
Gross revenue/month
--
Profit/month (sell−cost)
--
Annual profit (post-tax)
--
PCB nameVol/moSMT compTHT compRs./boardTypeMonthly Rs.
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
----
Total (EMS only)------------
EMS profit (selling price minus cost price) flows into DSCR, IRR and payback automatically.
SMT Line Utilisation
Newen:--% + EMS:--% = Total:--%
Section 10
Equipment Vendor Scoring
Weighted scoring matrix. Recommended vendor price auto-updates Infrastructure capex.
P&P Machine Evaluation
Vendor A
Vendor B
Vendor C
CriterionWeight %Score A (1-5)Score BScore CWtd AWtd BWtd C
TOTAL------
Recommended vendor price updated in Infrastructure capex automatically.
Section 11
Master Checklist
71 checkpoints across 10 modules.
Section 12
DPR & Collateral Register
DPR Document Checklist
Section 13
Results & Executive Summary
Executive Summary
Reference: -- | Date: --
Complete all sections to generate the executive summary.
PEPC - Paarminder Singh Electronic Process ConsultancyCONFIDENTIAL | FOR INTERNAL USE ONLY
Complete Results Summary
Section 14
Export
Export Options
📊 Generate PowerPoint Presentation
Input Summary
'); pw.document.close(); pw.focus(); setTimeout(function(){pw.print();},500); } function resetProcessFlow(){ var area=document.getElementById('flow-diagram-area'); if(area) area.innerHTML=''; } function newStudy(){ if(!confirm('Start a new study? All current data will be cleared.')) return; location.reload(); } function closeMergeMatrix(){ var ov=document.getElementById('merge-matrix-ov'); if(ov) ov.style.display='none'; document.body.style.overflow=''; } function generateMergedFlow(){ var p=S.pcbs[S.act]; if(!p) return; function sideHasStages(colId){ if(colId==='common') return Object.values(p.common||{}).some(function(sd){return sd.on;}); var cs=p.stages&&p.stages[colId]?p.stages[colId]:{}; return Object.values(cs).some(function(sd){return sd.on;}); } var colAssign={}; var seqAssign={}; document.querySelectorAll('.merge-col-sel').forEach(function(sel){ colAssign[sel.dataset.flow]=parseInt(sel.value)||1; }); document.querySelectorAll('.merge-seq-inp').forEach(function(inp){ seqAssign[inp.dataset.flow]=parseInt(inp.value)||1; }); var columns={}; Object.keys(colAssign).forEach(function(flowId){ var col=colAssign[flowId]; if(!columns[col]) columns[col]=[]; columns[col].push({flowId:flowId,seq:seqAssign[flowId]||1}); }); Object.keys(columns).forEach(function(col){ columns[col].sort(function(a,b){return a.seq-b.seq;}); }); var colKeys=Object.keys(columns).sort(); var numCols=colKeys.length; var colW=220,colGap=30,pad=30; var W=numCols*colW+(numCols-1)*colGap+pad*2; var colRows={}; colKeys.forEach(function(col){ colRows[col]=[]; columns[col].forEach(function(entry){ var flowId=entry.flowId; var isCommon=(flowId==='common'); var colDef=MATRIX_COLS.find(function(c){return c.id===flowId;}); var stageList=colDef?colDef.stages:(flowId==='common'?COMMON_STAGES:[]); var store=colDef?(p.stages&&p.stages[flowId]?p.stages[flowId]:{}):(flowId==='common'?p.common||{}:{}); colRows[col].push({type:'section-hdr',label:(colDef?colDef.label:'Common')}); stageList.forEach(function(st){ var sd=store[st.id]; if(!sd||!sd.on) return; if(sd.sp) sd.sp.filter(function(sp){return sp.pos==='before';}).forEach(function(sp){colRows[col].push({type:'sp',sp:sp});}); colRows[col].push({type:'stage',st:st}); if(sd.qa) colRows[col].push({type:'qa',lbl:st.label}); if(sd.sp) sd.sp.filter(function(sp){return sp.pos==='after';}).forEach(function(sp){colRows[col].push({type:'sp',sp:sp});}); }); }); var cm=p.common||{}; var hasCommonInThisCol=true; if(hasCommonInThisCol&&col===colKeys[0]){ colRows[col].push({type:'section-hdr',label:'Common Stages'}); COMMON_STAGES.forEach(function(st){ var sd=cm[st.id]; if(!sd||!sd.on) return; if(sd.sp) sd.sp.filter(function(sp){return sp.pos==='before';}).forEach(function(sp){colRows[col].push({type:'sp',sp:sp});}); colRows[col].push({type:'stage',st:st}); if(sd.qa) colRows[col].push({type:'qa',lbl:st.label}); if(sd.sp) sd.sp.filter(function(sp){return sp.pos==='after';}).forEach(function(sp){colRows[col].push({type:'sp',sp:sp});}); }); } }); var VGAP=12; var maxRows=0; colKeys.forEach(function(col){if(colRows[col].length>maxRows)maxRows=colRows[col].length;}); var H=100+(maxRows*54); var parts=['']; colKeys.forEach(function(col,ci){ var cx=pad+ci*(colW+colGap)+colW/2; var sy=10; var colFlows=columns[col]; var hdrLabel=colFlows.map(function(e){return (MATRIX_COLS.find(function(c){return c.id===e.flowId;})||{label:e.flowId}).label;}).join(' + '); parts.push(''); parts.push(''+esc(hdrLabel)+''); sy+=28; parts.push(''); parts.push('START'); sy+=24+VGAP; colRows[col].forEach(function(row){ if(row.type==='section-hdr'){ parts.push('— '+row.label.toUpperCase()+' —'); sy+=16+4; } else if(row.type==='stage'){ var grp=row.st.grp||'smt'; var fill=grp==='smt'?'#dbeafe':grp==='tht'?'#fef3c7':grp==='test'?'#d1fae5':'#f3f4f6'; var stroke=grp==='smt'?'#3b82f6':grp==='tht'?'#f59e0b':grp==='test'?'#10b981':'#9ca3af'; parts.push(''); parts.push(''+row.st.label+''); parts.push(''+row.st.sub+''); sy+=34+VGAP; } else if(row.type==='sp'){ parts.push(''); parts.push(''+row.sp.name+''); sy+=28+VGAP; } else if(row.type==='qa'){ var dw=120,dh=30; parts.push(''); parts.push('QA: Pass?'); sy+=dh+VGAP; } if(row.type==='stage'||row.type==='sp'||row.type==='section-hdr'){ parts.push(''); } }); parts.push(''); parts.push('END'); }); parts.unshift(''); parts.push(''); var area=document.getElementById('flow-diagram-area'); if(area) area.innerHTML=parts.join(''); } function toggleSide(btn){ var col=btn.dataset.col; var p=S.pcbs[S.act]; if(!p) return; if(!p.matrix) p.matrix={smtA:false,smtB:false,thA:false,thB:false}; if(col==='smtA'&&p.matrix.smtA&&p.matrix.smtB){ showValMsg&&showValMsg('Remove SMT Side-B first before removing SMT Side-A.');return; } if(col==='thA'&&p.matrix.thA&&p.matrix.thB){ showValMsg&&showValMsg('Remove TH Side-B first before removing TH Side-A.');return; } p.matrix[col]=!p.matrix[col]; if(col==='smtB'&&p.matrix.smtB) p.matrix.smtA=true; if(col==='thB'&&p.matrix.thB) p.matrix.thA=true; applyCfgToStages(p); syncSideToggles(S.act); renderStageSections(S.act); if(typeof renderPCBTabs==='function') setTimeout(function(){renderPCBTabs();},0); } function syncSideToggles(id){ var p=S.pcbs[id]; if(!p||!p.matrix) return; ['smtA','smtB','thA','thB'].forEach(function(col){ var btn=document.getElementById('tog-'+col); if(btn) btn.classList.toggle('on',!!p.matrix[col]); }); }function showValMsg(msg){ var el=document.getElementById('cfg-val-msg'); if(!el){ el=document.createElement('div'); el.id='cfg-val-msg'; el.style.cssText='font-size:11px;font-weight:700;color:#dc3545;padding:5px 10px;background:#fff5f5;border-radius:6px;border:1px solid #f5c6cb;margin-bottom:8px'; var tog=document.querySelector('.sow-side-tog'); if(tog&&tog.parentNode) tog.parentNode.parentNode.insertBefore(el,tog.parentNode.nextSibling); } el.textContent=msg; el.style.display=''; clearTimeout(el._t); el._t=setTimeout(function(){el.style.display='none';},4000); } function selAsm(t){ S.asm=t; document.getElementById('ac-s').classList.toggle('sel',t==='single'); document.getElementById('ac-m').classList.toggle('sel',t==='multi'); document.getElementById('crow').style.display=t==='multi'?'flex':'none'; S.n=t==='single'?1:(parseInt(document.getElementById('pcbc').value)||2); buildPCBs(); } function setPCBCount(v){v=parseInt(v)||2;if(v<2)v=2;if(v>20)v=20;S.n=v;buildPCBs();} function buildPCBs(){ var refMatrix = null; for(var ri=1;ri<=S.n;ri++){ var rm=S.pcbs[ri]&&S.pcbs[ri].matrix; if(rm&&(rm.smtA||rm.smtB||rm.thA||rm.thB)){refMatrix=rm;break;} } for(var i=1;i<=S.n;i++){ if(!S.pcbs[i]){ S.pcbs[i]=defPCB(i); } if(refMatrix){ var pm=S.pcbs[i].matrix; if(!pm.smtA&&!pm.smtB&&!pm.thA&&!pm.thB){ S.pcbs[i].matrix={smtA:!!refMatrix.smtA,smtB:!!refMatrix.smtB, thA:!!refMatrix.thA,thB:!!refMatrix.thB}; } } } Object.keys(S.pcbs).forEach(function(k){if(parseInt(k)>S.n) delete S.pcbs[k];}); if(!S.pcbs[S.act]) S.act=1; for(var j=1;j<=S.n;j++){ if(!document.getElementById('pcb-'+j)) addPCB(); } show('sow-s2'); renderTabs(); syncSideToggles(S.act); renderStageSections(S.act); } function renderTabs(){ var el=document.getElementById('tabs'); if(!el) return; if(S.n<=1){el.innerHTML='';return;} var h=''; for(var i=1;i<=S.n;i++){ var p=S.pcbs[i]; var m=p&&p.matrix?p.matrix:{}; var parts=[]; if(m.smtA)parts.push('SMT-A'); if(m.smtB)parts.push('SMT-B'); if(m.thA)parts.push('TH-A'); if(m.thB)parts.push('TH-B'); var pname=esc(p&&p.name?p.name:'PCB '+i); h+='
' +''+pname+'' +''+(parts.length?parts.join('+'):'not set')+'' +'✏ Edit scope of work' +'
'; } el.innerHTML=h; el.querySelectorAll('.pcb-editable-name').forEach(function(span){ var pid=parseInt(span.dataset.pcbid); var tab=span.closest('.tab'); var link=tab?tab.querySelector('.pcb-scope-link'):null; if(tab){ tab.addEventListener('mouseenter',function(){ span.style.borderBottomColor='#3b82f6'; if(link){link.style.maxHeight='20px';link.style.opacity='1';link.style.pointerEvents='auto';} }); tab.addEventListener('mouseleave',function(){ if(document.activeElement!==span) span.style.borderBottomColor='transparent'; if(link&&document.activeElement!==span){link.style.maxHeight='0';link.style.opacity='0';link.style.pointerEvents='none';} }); } span.addEventListener('focus',function(){ span.style.borderBottomColor='#1e3a5f'; var range=document.createRange(); range.selectNodeContents(span); var sel=window.getSelection(); sel.removeAllRanges(); sel.addRange(range); }); span.addEventListener('blur',function(){ var newName=(span.textContent||'').trim(); if(!newName) newName='PCB '+pid; span.textContent=newName; if(S.pcbs[pid]) S.pcbs[pid].name=newName; if(S.pcbs[pid]){ if(!S.pcbs[pid].vals) S.pcbs[pid].vals={}; S.pcbs[pid].vals['pn-'+pid]=newName; } var nf=document.getElementById('pn-'+pid); if(nf) nf.value=newName; span.style.borderBottomColor='transparent'; if(link){link.style.maxHeight='0';link.style.opacity='0';link.style.pointerEvents='none';} }); span.addEventListener('keydown',function(e){ if(e.key==='Enter'){e.preventDefault();span.blur();} if(e.key==='Escape'){e.preventDefault();span.textContent=S.pcbs[pid]?S.pcbs[pid].name:'PCB '+pid;span.blur();} e.stopPropagation(); }); span.addEventListener('click',function(e){ e.stopPropagation(); }); }); } function sowJumpToScope(pid){ S.act=pid; renderTabs(); renderStageSections(pid); var el=document.getElementById('sow-s2'); if(el) el.scrollIntoView({behavior:'smooth',block:'start'}); } function applyScope(){ if(!S||!S.pcbs||!Object.keys(S.pcbs).length){alert('Please define at least one PCB first.');return;} Object.keys(S.pcbs).forEach(function(i){ i=parseInt(i); if(S.pcbs[i]){ applyCfgToStages(S.pcbs[i]); var ne=document.getElementById('pn-'+i); if(ne&&S.pcbs[i].name&&S.pcbs[i].name!=='PCB '+i) ne.value=S.pcbs[i].name; } }); if(typeof renderPCBTabs==='function') renderPCBTabs(); if(typeof SCOPE!=='undefined'){ var hasSMT=false,hasTHT=false,hasICT=false,hasFunc=false,hasMech=false,hasBoxFunc=false; for(var pid2=1;pid2<=S.n;pid2++){ var p2=S.pcbs[pid2]; if(!p2) continue; var m2=p2.matrix||{}; if(m2.smtA||m2.smtB) hasSMT=true; if(m2.thA||m2.thB) hasTHT=true; var cm2=p2.common||{}; if(cm2['ict']&&cm2['ict'].on) hasICT=true; if(cm2['func']&&cm2['func'].on) hasFunc=true; if(cm2['mech-assy']&&cm2['mech-assy'].on) hasMech=true; if(cm2['box-func']&&cm2['box-func'].on) hasBoxFunc=true; } SCOPE.ih.smt=hasSMT; SCOPE.ih.tht=hasTHT; SCOPE.ih.ict=hasICT; SCOPE.ih.func=hasFunc; SCOPE.ih.mech=hasMech; SCOPE.ih.boxfunc=hasBoxFunc; SCOPE.ih.qa=hasSMT||hasTHT||hasFunc; Object.keys(SCOPE.ih).forEach(function(k){SCOPE.ems[k]=SCOPE.ems[k]||SCOPE.ih[k];}); } if(typeof buildMPTbls==='function') buildMPTbls(); if(typeof autoCalc==='function') autoCalc(); window._activePCBTab=1; setTimeout(function(){ if(typeof goTo==='function') goTo(2); setTimeout(function(){ if(typeof renderPCBTabs==='function') renderPCBTabs(); setTimeout(function(){ Object.keys(S.pcbs).forEach(function(i){ if(typeof renderPCBSideBtns==='function') renderPCBSideBtns(parseInt(i)); }); },60); },150); },50); var t=document.createElement('div'); t.style.cssText='position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:#2d7d32;color:white;padding:11px 26px;border-radius:7px;font-size:13px;font-weight:700;z-index:9999;box-shadow:0 4px 20px rgba(0,0,0,.3)'; t.textContent='Scope applied — PCB Profile updated'; document.body.appendChild(t); setTimeout(function(){t.remove();},2500); } function spLibChg(){ var v=document.getElementById('sp-lib').value; document.getElementById('sp-cw').style.display=v==='__custom'?'':'none'; } function spManualChg(){ var m=document.getElementById('sp-manual').checked; if(m){document.getElementById('sp-kw').value='0';document.getElementById('sp-bar').value='0';} } function show(id){var el=document.getElementById(id);if(el)el.style.display='';} function scroll2(id){setTimeout(function(){var el=document.getElementById(id);if(el)el.scrollIntoView({behavior:'smooth',block:'start'});},100);} function esc(s){return s?String(s).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'):'';} document.addEventListener('click',function(e){ var box=e.target.closest('.cfg-chk-box[data-col]'); if(box){toggleMatrixCol(parseInt(box.dataset.pid),box.dataset.col);return;} var tab=e.target.closest('.tab[data-pcb]'); if(tab&&document.getElementById('tabs')&&document.getElementById('tabs').contains(tab)){ S.act=parseInt(tab.dataset.pcb);renderTabs();renderStageSections(S.act);return; } var cb=e.target.closest('.sow-st-cb'); if(cb){ stageChkChange(parseInt(cb.dataset.pid),cb.dataset.col,cb.dataset.sid,cb.checked); e.stopPropagation();return; } var stRow=e.target.closest('[data-strow]'); if(stRow&&e.target!==stRow.querySelector('.sow-st-cb')&&!e.target.closest('.sow-sp-panel')&&!e.target.closest('.sow-st-qa')){ var rowCb=stRow.querySelector('.sow-st-cb'); if(rowCb){rowCb.checked=!rowCb.checked;stageChkChange(parseInt(rowCb.dataset.pid),rowCb.dataset.col,rowCb.dataset.sid,rowCb.checked);} return; } var qaCb=e.target.closest('.sow-qa-cb'); if(qaCb){ var pid2=parseInt(qaCb.dataset.pid),col2=qaCb.dataset.col,sid2=qaCb.dataset.sid; var p2=S.pcbs[pid2]; if(!p2) return; var isC2=(col2==='common'); var st2=isC2?p2.common:p2.stages[col2]; if(st2&&st2[sid2]) st2[sid2].qa=qaCb.checked; e.stopPropagation();return; } var spBtn=e.target.closest('.sow-sp-add[data-pos]'); if(spBtn){openSPat(parseInt(spBtn.dataset.pid),spBtn.dataset.col,spBtn.dataset.sid,spBtn.dataset.pos);return;} var spDel=e.target.closest('.sow-sp-chip-del[data-idx],.sow-sp-del[data-idx]'); if(spDel){ var dp=parseInt(spDel.dataset.pid),dc=spDel.dataset.col,ds=spDel.dataset.sid,di=parseInt(spDel.dataset.idx); var pp=S.pcbs[dp]; if(!pp) return; var isCm=(dc==='common'); var storeD=isCm?pp.common:pp.stages[dc]; if(storeD&&storeD[ds]&&storeD[ds].sp) storeD[ds].sp.splice(di,1); renderStageSections(dp); if(document.getElementById('saved-proc-ov')&&document.getElementById('saved-proc-ov').style.display==='flex') openSavedProc(); return; } }); function askNo(){ document.getElementById('ask-ov').style.display='none'; document.body.style.overflow=''; } function askYes(){ document.getElementById('ask-ov').style.display='none'; document.body.style.overflow=''; } document.getElementById('ask-ov').style.display='none'; document.body.style.overflow=''; var _spPid=0,_spColId='',_spStId=''; document.addEventListener('click',function(e){ var box=e.target.closest('.cfg-chk-box[data-col]'); if(box){toggleMatrixCol(parseInt(box.dataset.pid),box.dataset.col);return;} var tab=e.target.closest('.tab[data-pcb]'); if(tab&&document.getElementById('tabs').contains(tab)){ S.act=parseInt(tab.dataset.pcb);renderTabs();renderStageSections(S.act);return; } var stageRow=e.target.closest('.sow-stage-row[data-sid]'); if(stageRow){ var cb=stageRow.querySelector('.sow-stage-cb'); if(e.target===cb||e.target===stageRow){ var newVal=cb?!cb.checked:false; if(e.target===stageRow){newVal=cb?!cb.checked:true; if(cb)cb.checked=newVal;} stageChkChange(parseInt(stageRow.dataset.pid),stageRow.dataset.col,stageRow.dataset.sid,cb?cb.checked:newVal); } return; } var qaCb=e.target.closest('.sow-qa-cb'); if(qaCb&&e.target===qaCb){ var pid2=parseInt(qaCb.dataset.pid); var col2=qaCb.dataset.col; var sid2=qaCb.dataset.sid; var p2=S.pcbs[pid2]; if(p2&&p2.stages&&p2.stages[col2]&&p2.stages[col2][sid2]){ p2.stages[col2][sid2].qa=qaCb.checked; } e.stopPropagation(); return; } var delBtn=e.target.closest('.sow-sp-del[data-idx]'); if(delBtn){ var pid=parseInt(delBtn.dataset.pid); var colId=delBtn.dataset.col; var stId=delBtn.dataset.sid; var idx=parseInt(delBtn.dataset.idx); var p=S.pcbs[pid]; if(p&&p.stages&&p.stages[colId]&&p.stages[colId][stId]&&p.stages[colId][stId].sp){ p.stages[colId][stId].sp.splice(idx,1); renderStageSections(pid); if(document.getElementById('saved-proc-ov').style.display==='flex') openSavedProc(); } return; } }); function openSP(pid,sk){ _spPCB=pid;_spSK=sk; var stDef=SOW_STAGES.find(function(s){return s.id===sk;}); var lbl=stDef?stDef.label:sk; document.getElementById('sp-sl-b').textContent=lbl; document.getElementById('sp-sl-a').textContent=lbl; document.getElementById('sp-lib').value=''; document.getElementById('sp-cw').style.display='none'; document.querySelector('input[name="spp"][value="before"]').checked=true; document.querySelector('input[name="spc"][value="inline"]').checked=true; ['sp-bl','sp-inl'].forEach(function(id){document.getElementById(id).classList.add('on');}); ['sp-al','sp-ofl'].forEach(function(id){document.getElementById(id).classList.remove('on');}); document.getElementById('sp-on').style.display='none'; document.getElementById('sp-t').value='5'; document.getElementById('sp-tu').value='min'; document.getElementById('sp-sym').value='process'; document.getElementById('sp-ops').value='1'; document.getElementById('sp-sh').value='1'; document.getElementById('sp-kw').value='0'; document.getElementById('sp-bar').value='0'; var sm=document.getElementById('sp-manual');if(sm)sm.checked=false; var kwEl=document.getElementById('sp-kw');if(kwEl)kwEl.style.opacity='1'; var barEl=document.getElementById('sp-bar');if(barEl)barEl.style.opacity='1'; document.getElementById('sp-cx').value='0'; document.getElementById('sp-ov').style.display='flex'; document.body.style.overflow='hidden'; } document.querySelectorAll('input[name="spp"]').forEach(function(r){ r.addEventListener('change',function(){ var v=this.value; document.getElementById('sp-bl').classList.toggle('on',v==='before'); document.getElementById('sp-al').classList.toggle('on',v==='after'); }); }); document.querySelectorAll('input[name="spc"]').forEach(function(r){ r.addEventListener('change',function(){ var v=this.value; document.getElementById('sp-inl').classList.toggle('on',v==='inline'); document.getElementById('sp-ofl').classList.toggle('on',v==='offline'); document.getElementById('sp-on').style.display=(v==='offline')?'':'none'; if(v==='offline') document.getElementById('sp-sym').value='delay'; }); }); function spPwrChg(){ var t=document.getElementById('sp-pw').value; document.getElementById('sp-pvw').style.display=(t==='manual')?'none':''; document.getElementById('sp-pvl').textContent=(t==='pneumatic'?'Pressure (bar)':'Power (KW)'); } function saveSP(addAnother){ var lib=document.getElementById('sp-lib').value; var name=lib==='__custom'?(document.getElementById('sp-cn').value||'').trim():lib; if(!name){alert('Select or enter a process name.');return;} var cat=document.querySelector('input[name="spc"]:checked').value; var pos=document.querySelector('input[name="spp"]:checked').value; var stDef=SOW_STAGES.find(function(s){return s.id===_spSK;}); S.pcbs[_spPCB].sp.push({ name:name,sk:_spSK,skLbl:stDef?stDef.lbl:_spSK, pos:pos,cat:cat,sym:document.getElementById('sp-sym').value, t:parseFloat(document.getElementById('sp-t').value)||1, tu:document.getElementById('sp-tu').value, ops:parseInt(document.getElementById('sp-ops').value)||1, sh:parseInt(document.getElementById('sp-sh').value)||1, kw:parseFloat(document.getElementById('sp-kw').value)||0, bar:parseFloat(document.getElementById('sp-bar').value)||0, manual:document.getElementById('sp-manual').checked, pw:document.getElementById('sp-manual').checked?'manual':(parseFloat(document.getElementById('sp-kw').value)>0&&parseFloat(document.getElementById('sp-bar').value)>0?'both':parseFloat(document.getElementById('sp-kw').value)>0?'electric':'pneumatic'), pv:parseFloat(document.getElementById('sp-kw').value)||0, cx:parseFloat(document.getElementById('sp-cx').value)||0, qa:false }); if(addAnother){ document.getElementById('sp-lib').value=''; document.getElementById('sp-cw').style.display='none'; } else { closeSP(); } } function showSum(){ var el=document.getElementById('sumgrid');if(!el)return; var h=''; for(var i=1;i<=S.n;i++){ var p=S.pcbs[i]; var m=p.matrix||{}; var stages=p.stages||{}; var stgs=[]; ['smtA','smtB','thA','thB'].forEach(function(colId){ if(!m[colId]) return; SOW_STAGES.forEach(function(st){ var sd=stages[colId]&&stages[colId][st.id]; if(sd&&sd.on) stgs.push(st.label); }); }); h+='
PCB '+i+' — '+esc(p.name)+'
' +'
'+(stgs.length?stgs.join(' → '):'No stages selected') +'
'; } el.innerHTML=h;show('sow-s3');scroll2('sow-s3'); } function buildFlow(p){ var rows=[]; var m=p.matrix||{}; var stages=p.stages||{}; var SIDE_ORDER=['smtA','smtB','thA','thB']; SIDE_ORDER.forEach(function(colId){ if(!m[colId]) return; var cs=stages[colId]||{}; SOW_STAGES.forEach(function(st){ var sd=cs[st.id]; if(!sd||!sd.on) return; if(sd.sp) sd.sp.filter(function(sp){return sp.pos==='before';}).forEach(function(sp){ rows.push({type:'sp',sp:sp,colId:colId}); }); rows.push({type:'stage',st:st,colId:colId}); if(sd.qa) rows.push({type:'qa',lbl:st.label,colId:colId}); if(sd.sp) sd.sp.filter(function(sp){return sp.pos==='after';}).forEach(function(sp){ rows.push({type:'sp',sp:sp,colId:colId}); }); }); }); var cmSeq=getCommonSequence(p); cmSeq.forEach(function(item){ if(item.type==='stage') rows.push({type:'stage',st:item.st,colId:'common'}); else if(item.type==='sp') rows.push({type:'sp',sp:item.sp,colId:'common'}); }); return rows; } var LW=1.8; var DIM={ terminal:{w:160,h:28}, process: {w:170,h:42}, inspect: {w:170,h:46}, delay: {w:170,h:42}, io: {w:170,h:42}, decision:{w:130,h:64}, qa: {w:130,h:64}, }; var VGAP=14; function getDim(sym){return DIM[sym]||DIM['process'];} function drawShape(parts,sym,cx,y,label,sub){ var d=getDim(sym); var x=cx-d.w/2,w=d.w,h=d.h,mcy=y+h/2,s=''; if(sym==='terminal'){ s=''; } else if(sym==='process'){ s=''; } else if(sym==='inspect'){ var py=y+h*0.28; s=''; } else if(sym==='delay'){ s=''; } else if(sym==='io'){ var sk2=h*0.28; s=''; } else if(sym==='decision'||sym==='qa'){ s=''; } else { s=''; } var words=(label||'').split(' '); var lines=[],cur=''; words.forEach(function(w2){if(cur&&(cur+' '+w2).length>22){lines.push(cur);cur=w2;}else{cur=cur?cur+' '+w2:w2;}}); if(cur)lines.push(cur); var lh=12,totalH=lines.length*lh; var ty=mcy-(sub?lh*0.4:0)-(totalH-lh)/2; lines.forEach(function(ln){s+=''+esc(ln)+'';ty+=lh;}); if(sub) s+=''+esc(sub)+''; parts.push(s); return h; } function drawArrow(parts,cx,y1,y2){ parts.push(''); parts.push(''); } function drawHLine(parts,x1,y,x2){ parts.push(''); } function svgInd(pcbIds){ var n=pcbIds.length; var colW=220,colGap=30; var W=n*colW+(n-1)*colGap+60; var flows={}; var maxH=0; pcbIds.forEach(function(id){ var p=S.pcbs[id];if(!p)return; flows[id]=buildFlow(p); var h=60; h+=DIM.terminal.h+VGAP; flows[id].forEach(function(row){ var sym='process'; if(row.type==='stage'){ var grp=row.st.grp||'smt'; sym=grp==='test'?'inspect':grp==='finish'?'io':'process'; } else if(row.type==='sp') sym=row.sp.sym||'process'; else if(row.type==='qa') sym='decision'; h+=getDim(sym).h+VGAP; }); h+=DIM.terminal.h+VGAP+20; if(h>maxH) maxH=h; }); var parts=[]; parts.push(''); pcbIds.forEach(function(id,li){ var p=S.pcbs[id];if(!p)return; var cx=30+li*(colW+colGap)+colW/2; var sy=10; parts.push(''); parts.push(''+esc(p.name)+''); sy+=28; drawShape(parts,'terminal',cx,sy,'START'); sy+=DIM.terminal.h;drawArrow(parts,cx,sy,sy+VGAP);sy+=VGAP; var flow=flows[id]||[]; flow.forEach(function(row,ri){ var isLast=(ri===flow.length-1); if(row.type==='stage'){ var grp=row.st.grp||'smt'; var sym=grp==='test'?'inspect':grp==='finish'?'io':'process'; var lbl=row.st.label||row.st.lbl||row.st.id; var colLbl={smtA:'[A]',smtB:'[B]',thA:'[TH-A]',thB:'[TH-B]'}[row.colId]||''; var h=drawShape(parts,sym,cx,sy,lbl,colLbl); sy+=h; } else if(row.type==='sp'){ var sp=row.sp; var sub3=sp.t+sp.tu+' | '+sp.ops+'op'+(sp.cat==='offline'?' [OFFLINE]':''); var h2=drawShape(parts,sp.sym||'process',cx,sy,sp.name,sub3); sy+=h2; } else if(row.type==='qa'){ var h3=drawShape(parts,'decision',cx,sy,'QA: Pass / Fail?'); parts.push('PASS'); var qrx=cx+DIM.decision.w/2; drawHLine(parts,qrx,sy+h3/2,qrx+28); parts.push('FAIL \u2192 Rework'); sy+=h3; } else if(row.type==='rework'){ var h4=drawShape(parts,'process',cx,sy,'Rework Station','re-enters at failed stage'); sy+=h4; } if(!isLast){drawArrow(parts,cx,sy,sy+VGAP);sy+=VGAP;} }); sy+=VGAP; drawShape(parts,'terminal',cx,sy,'DISPATCH / END'); }); parts.push(''); return parts.join(''); } function svgCombined(pcbIds){ var n=pcbIds.length; var colW=200,colGap=20; var W=Math.max(400,n*colW+(n-1)*colGap+60); var sharedCx=W/2; var laneRows=[]; function getColsForStage(st){ if(st.grp==='tht') return ['thA','thB']; return ['smtA','smtB']; } SMT_STAGES.forEach(function(st){ var cols=['smtA','smtB']; var anyOn=pcbIds.some(function(id){ var p=S.pcbs[id];if(!p)return false; return cols.some(function(col){ return p.matrix&&p.matrix[col]&&p.stages&&p.stages[col]&&p.stages[col][st.id]&&p.stages[col][st.id].on; }); }); if(!anyOn)return; var maxB=0; pcbIds.forEach(function(id){ var p=S.pcbs[id];if(!p)return; cols.forEach(function(col){ var c=((p.stages&&p.stages[col]&&p.stages[col][st.id]&&p.stages[col][st.id].sp)||[]).filter(function(sp){return sp.pos==='before';}).length; if(c>maxB)maxB=c; }); }); for(var bi=0;bimaxA)maxA=c; }); }); for(var ai=0;aimaxB)maxB=c; }); }); for(var bi=0;bimaxA)maxA=c; }); }); for(var ai=0;ai'); drawShape(parts,'terminal',W/2,8,'COMBINED ASSEMBLY PROCESS FLOW'); var sy=8+DIM.terminal.h+10; pcbIds.forEach(function(id,li){ var p=S.pcbs[id];if(!p)return; var lx=30+li*(colW+colGap); var cx=lx+colW/2; parts.push(''); parts.push(''+esc(p.name)+''); }); sy+=26; laneRows.forEach(function(row){ var rowH=getDim(row.type==='qa'?'decision':'process').h; var cols=row.cols||['smtA','smtB']; pcbIds.forEach(function(id,li){ var p=S.pcbs[id];if(!p)return; var lx=30+li*(colW+colGap); var cx=lx+colW/2; var show=false,sym='process',lbl='',sub=''; if(row.type==='stage'){ var m2=p.matrix||{}; var stgs2=p.stages||{}; var anyOn2=cols.some(function(cid){return m2[cid]&&stgs2[cid]&&stgs2[cid][row.st.id]&&stgs2[cid][row.st.id].on;}); show=anyOn2; if(show){var grp2=row.st.grp||'smt';sym=grp2==='test'?'inspect':grp2==='finish'?'io':'process';lbl=row.st.label||row.st.lbl||row.st.id;sub='';} } else if(row.type==='sp-b'||row.type==='sp-a'){ var pos2=row.type==='sp-b'?'before':'after'; var foundSp=null; cols.forEach(function(col){ if(foundSp)return; var sps=((p.stages&&p.stages[col]&&p.stages[col][row.key]&&p.stages[col][row.key].sp)||[]).filter(function(sp){return sp.pos===pos2;}); if(sps[row.si])foundSp=sps[row.si]; }); show=!!foundSp; if(show){sym=foundSp.sym||'process';lbl=foundSp.name;sub=(foundSp.t||'')+(foundSp.tu||'');} } else if(row.type==='qa'){ var anyQA2=cols.some(function(col){var sd=p.stages&&p.stages[col]&&p.stages[col][row.key];return sd&&sd.on&&sd.qa;}); show=anyQA2; if(show){sym='decision';lbl='QA?';} } if(show){ drawShape(parts,sym,cx,sy,lbl,sub||null); drawArrow(parts,cx,sy+getDim(sym).h,sy+getDim(sym).h+VGAP); } else { var d2=getDim('process'); parts.push(''); parts.push('\u2014'); drawArrow(parts,cx,sy+d2.h,sy+d2.h+VGAP); } }); sy+=rowH+VGAP; }); var convY=sy; parts.push('All PCBs Converge \u25BC'); if(n>1){ var leftCx=30+colW/2;var rightCx=30+(n-1)*(colW+colGap)+colW/2; drawHLine(parts,leftCx,convY,rightCx); } sy=convY+22; drawArrow(parts,sharedCx,sy,sy+VGAP);sy+=VGAP; if(commonRows.length>0){ commonRows.forEach(function(item,ci){ var grp=item.st.grp||'finish'; var sym=grp==='test'?'inspect':grp==='finish'?'io':'process'; drawShape(parts,sym,sharedCx,sy,item.st.label); var dh=getDim(sym).h; sy+=dh; if(ci'); return parts.join(''); } var _flowActivePCB=0, _flowActiveSide=''; function openFlow(mode){ document.getElementById('f-ov').style.display='flex'; document.body.style.overflow='hidden'; var pcbRow=document.getElementById('f-pcb-row'); var h=''; var pcbIds=Object.keys(S.pcbs).map(Number).filter(function(k){return !!S.pcbs[k];}); pcbIds.sort(function(a,b){return a-b;}); pcbIds.forEach(function(i){ var pname=(S.pcbs[i]&&S.pcbs[i].name)?S.pcbs[i].name:'PCB '+i; h+=''; }); h+=''; pcbRow.innerHTML=h; document.getElementById('f-side-row').style.display='none'; document.getElementById('f-diag').innerHTML='
Select a PCB above to view its process flow.
'; document.getElementById('f-title').textContent='Process Flow'; _flowActivePCB=0; _flowActiveSide=''; var autoId = (S.act && S.pcbs[S.act]) ? S.act : (pcbIds.length ? pcbIds[0] : 0); if(autoId && S.pcbs[autoId]) flowPickPCB(autoId); } function flowPickPCB(pid){ _flowActivePCB=pid; _flowActiveSide=''; var p=S.pcbs[pid]; if(!p) return; var m=p.matrix||{}; var pname=p.name||('PCB '+pid); Object.keys(S.pcbs).forEach(function(i){ var b=document.getElementById('f-pcb-btn-'+i); if(b){b.style.background=i===pid?'#1e3a5f':'white';b.style.color=i===pid?'white':'#1a2332';b.style.borderColor=i===pid?'#1e3a5f':'#c0c8d8';} }); var ba=document.getElementById('f-pcb-btn-all'); if(ba){ba.style.background='white';ba.style.color='#1e3a5f';ba.style.borderColor='#1e3a5f';} document.getElementById('f-title').textContent='Process Flow — '+pname; document.getElementById('f-side-pcb-lbl').textContent=pname; var sideRow=document.getElementById('f-side-btns-row'); var sh=''; var stg=p.stages||{}; function hasStageTicked(col){return stg[col]&&Object.keys(stg[col]).some(function(k){return stg[col][k]&&stg[col][k].on;});} if(m.smtA||hasStageTicked('smtA')) sh+=flowSideBtn(pid,'smtA','SMT Side-A','#1e3a5f','#dbeafe','#1d4ed8'); if(m.smtB||hasStageTicked('smtB')) sh+=flowSideBtn(pid,'smtB','SMT Side-B','#1e3a5f','#dbeafe','#1d4ed8'); if(m.thA||hasStageTicked('thA')) sh+=flowSideBtn(pid,'thA', 'THT Side-A','#5b21b6','#ede9fe','#6d28d9'); if(m.thB||hasStageTicked('thB')) sh+=flowSideBtn(pid,'thB', 'THT Side-B','#5b21b6','#ede9fe','#6d28d9'); sh+=''; sideRow.innerHTML=sh; document.getElementById('f-side-row').style.display=''; var first=null; ['smtA','smtB','thA','thB'].forEach(function(s){ if(!first&&(m[s]||hasStageTicked(s))) first=s; }); if(first) flowShowOneSide(pid,first); else document.getElementById('f-diag').innerHTML='
No stages ticked. Open Scope of Work, click ✓ All, then Apply & Close.
'; } function flowSideBtn(pid,sideId,label,dark,light,border){ return ''; } function flowShowOneSide(pid,sideId){ _flowActivePCB=pid; _flowActiveSide=sideId; var p=S.pcbs[pid]; if(!p) return; var sideLabel={smtA:'SMT Side-A',smtB:'SMT Side-B',thA:'THT Side-A',thB:'THT Side-B'}[sideId]||sideId; ['smtA','smtB','thA','thB'].forEach(function(s){ var b=document.getElementById('f-side-btn-'+s); if(!b) return; var isSel=s===sideId; var dark=s.startsWith('th')?'#5b21b6':'#1e3a5f'; var border=s.startsWith('th')?'#6d28d9':'#1d4ed8'; b.style.background=isSel?dark:'white'; b.style.color=isSel?'white':dark; b.style.borderColor=isSel?dark:border; }); var ba=document.getElementById('f-side-btn-all'); if(ba){ba.style.background='#1e3a5f';ba.style.color='white';} document.getElementById('f-title').textContent=(p.name||'PCB '+pid)+' — '+sideLabel+' (A4)'; var diag=document.getElementById('f-diag'); diag.innerHTML='
Generating...
'; setTimeout(function(){diag.innerHTML=svgOneSide(pid,sideId);},30); } function flowShowAllSides(pid){ _flowActivePCB=pid; _flowActiveSide='all-sides'; ['smtA','smtB','thA','thB'].forEach(function(s){ var b=document.getElementById('f-side-btn-'+s); if(!b) return; var dark=s.startsWith('th')?'#5b21b6':'#1e3a5f'; var border=s.startsWith('th')?'#6d28d9':'#1d4ed8'; b.style.background='white'; b.style.color=dark; b.style.borderColor=border; }); var ba=document.getElementById('f-side-btn-all'); if(ba){ba.style.background='#1e3a5f';ba.style.color='white';} var p=S.pcbs[pid]; if(!p) return; document.getElementById('f-title').textContent=(p.name||'PCB '+pid)+' — All Sides'; var diag=document.getElementById('f-diag'); diag.innerHTML='
Generating...
'; setTimeout(function(){diag.innerHTML=svgInd([pid]);},30); } function flowShowCombinedAll(){ _flowActivePCB=0; _flowActiveSide='combined'; Object.keys(S.pcbs).forEach(function(i){ var b=document.getElementById('f-pcb-btn-'+i); if(b){b.style.background='white';b.style.color='#1a2332';b.style.borderColor='#c0c8d8';} }); var ba=document.getElementById('f-pcb-btn-all'); if(ba){ba.style.background='#1e3a5f';ba.style.color='white';ba.style.borderColor='#1e3a5f';} document.getElementById('f-side-row').style.display='none'; document.getElementById('f-title').textContent='Combined Process Flow — All PCBs'; var allIds=[];for(var i=1;i<=S.n;i++)allIds.push(i); var diag=document.getElementById('f-diag'); diag.innerHTML='
Generating...
'; setTimeout(function(){diag.innerHTML=svgCombined(allIds);},30); } function svgOneSide(pid,sideId){ var p=S.pcbs[pid]; if(!p) return '
PCB not found.
'; var m=p.matrix||{}; var stages=p.stages||{}; var cs=stages[sideId]||{}; var sideLabel={smtA:'SMT Side-A',smtB:'SMT Side-B',thA:'THT Side-A',thB:'THT Side-B'}[sideId]||sideId; var pname=p.name||('PCB '+pid); var rows=[]; var stageList=MATRIX_COLS.find(function(c){return c.id===sideId;}); var stageDefs=stageList?stageList.stages:[]; stageDefs.forEach(function(st){ var sd=cs[st.id]; if(!sd||!sd.on) return; if(sd.sp) sd.sp.filter(function(sp){return sp.pos==='before';}).forEach(function(sp){rows.push({type:'sp',sp:sp});}); rows.push({type:'stage',st:st,colId:sideId}); if(sd.qa) rows.push({type:'qa',lbl:st.label}); if(sd.sp) sd.sp.filter(function(sp){return sp.pos==='after';}).forEach(function(sp){rows.push({type:'sp',sp:sp});}); }); var isTerminal=(sideId==='thB')||(sideId==='thA'&&!m.thB)||(sideId==='smtB'&&!m.thA&&!m.thB)||(sideId==='smtA'&&!m.smtB&&!m.thA&&!m.thB); if(isTerminal){ var cmSeq=getCommonSequence(p); cmSeq.forEach(function(item){ if(item.type==='stage') rows.push({type:'stage',st:item.st,colId:'common'}); else rows.push({type:'sp',sp:item.sp}); }); } if(!rows.length) return '
No stages activated for '+sideLabel+'. Tick stages in Scope of Work first.
'; var A4W=570, cx=A4W/2; var sy=10; var totH=sy+36+DIM.terminal.h+VGAP; rows.forEach(function(row){ var sym='process'; if(row.type==='stage'){var grp=row.st&&row.st.grp?row.st.grp:'smt';sym=grp==='test'?'inspect':grp==='finish'?'io':'process';} else if(row.type==='sp') sym=(row.sp&&row.sp.sym)||'process'; else if(row.type==='qa') sym='decision'; totH+=getDim(sym).h+VGAP; }); totH+=DIM.terminal.h+VGAP+16; var parts=[]; parts.push(''); parts.push(''); parts.push(''+esc(pname)+' — '+esc(sideLabel)+' Process Flow'); sy+=34; drawShape(parts,'terminal',cx,sy,'START'); sy+=DIM.terminal.h; drawArrow(parts,cx,sy,sy+VGAP); sy+=VGAP; rows.forEach(function(row,ri){ var isLast=(ri===rows.length-1); var h=0; if(row.type==='stage'){ var grp=row.st&&row.st.grp?row.st.grp:'smt'; var sym=grp==='test'?'inspect':grp==='finish'?'io':'process'; var lbl=row.st.label||row.st.id; var colLbl={smtA:'[SMT-A]',smtB:'[SMT-B]',thA:'[TH-A]',thB:'[TH-B]',common:'[Common]'}[row.colId]||''; h=drawShape(parts,sym,cx,sy,lbl,colLbl); } else if(row.type==='sp'){ var sp=row.sp; var sub3=sp.t+sp.tu+' | '+sp.ops+'op'+(sp.cat==='offline'?' [OFFLINE]':''); h=drawShape(parts,sp.sym||'process',cx,sy,sp.name,sub3); } else if(row.type==='qa'){ h=drawShape(parts,'decision',cx,sy,'QA: Pass / Fail?'); parts.push('PASS ↓'); var qrx=cx+DIM.decision.w/2; drawHLine(parts,qrx,sy+h/2,qrx+30); parts.push('FAIL → Rework'); } sy+=h; if(!isLast){drawArrow(parts,cx,sy,sy+VGAP);sy+=VGAP;} }); sy+=VGAP; drawShape(parts,'terminal',cx,sy,isTerminal?'DISPATCH / END':'PASS TO NEXT STAGE'); parts.push(''); return parts.join(''); } function buildInd(){ var d=document.getElementById('f-diag'); if(!_flowActivePCB){d.innerHTML='
Select a PCB above.
';return;} d.innerHTML=svgInd([_flowActivePCB]); } function closeFlow(){ document.getElementById('f-ov').style.display='none'; document.body.style.overflow=''; } var _printTemplateDataURL = null; function printFlow(){ var svg=document.getElementById('pf-svg'); if(!svg){alert('Generate a process flow diagram first.');return;} document.getElementById('pf-print-dialog').style.display='flex'; } function pfPrintAsIs(){ document.getElementById('pf-print-dialog').style.display='none'; var svg=document.getElementById('pf-svg'); var portrait=(_flowActiveSide&&_flowActiveSide!=='combined'&&_flowActiveSide!=='all-sides'); var orient=portrait?'portrait':'landscape'; var pw=window.open('','_blank','width=900,height=1100'); pw.document.write('PEPC Process Flow' +'' +''+svg.outerHTML+''); pw.document.close();pw.focus();setTimeout(function(){pw.print();},500); } function pfUploadTemplate(){ document.getElementById('pf-template-inp').click(); } function pfTemplateLoaded(e){ var file=e.target.files[0]; if(!file) return; var reader=new FileReader(); reader.onload=function(ev){ _printTemplateDataURL=ev.target.result; document.getElementById('pf-tmpl-preview').src=_printTemplateDataURL; document.getElementById('pf-tmpl-preview-wrap').style.display=''; document.getElementById('pf-tmpl-name').textContent=file.name; document.getElementById('pf-print-with-tmpl-btn').disabled=false; pfUpdatePrintPreview(); }; reader.readAsDataURL(file); } function pfUpdatePrintPreview(){ if(!_printTemplateDataURL) return; var prev=document.getElementById('pf-flow-preview'); if(!prev) return; var svg=document.getElementById('pf-svg'); if(!svg){prev.innerHTML='
Generate a flow first.
';return;} var mt=parseInt(document.getElementById('pf-mg-top').value)||10; var ml=parseInt(document.getElementById('pf-mg-left').value)||10; var mr=parseInt(document.getElementById('pf-mg-right').value)||10; var mb=parseInt(document.getElementById('pf-mg-bottom').value)||10; prev.innerHTML='
' +'' +'
' +'' +'
'; } function pfPrintWithTemplate(){ if(!_printTemplateDataURL){alert('Please upload a company letterhead image first.');return;} var svg=document.getElementById('pf-svg'); if(!svg){alert('Generate a flow first.');return;} document.getElementById('pf-print-dialog').style.display='none'; var mt=parseInt(document.getElementById('pf-mg-top').value)||10; var ml=parseInt(document.getElementById('pf-mg-left').value)||10; var mr=parseInt(document.getElementById('pf-mg-right').value)||10; var mb=parseInt(document.getElementById('pf-mg-bottom').value)||10; var portrait=(_flowActiveSide&&_flowActiveSide!=='combined'&&_flowActiveSide!=='all-sides'); var orient=portrait?'portrait':'landscape'; var svgB64='data:image/svg+xml;base64,'+btoa(unescape(encodeURIComponent(svg.outerHTML))); var pw=window.open('','_blank','width=900,height=1200'); pw.document.write('Process Flow' +'' +'
' +'' +'
' +'
' +''); pw.document.close();pw.focus();setTimeout(function(){pw.print();},600); } function pfShowHeaderPanel(){ coLoad(); var nm=document.getElementById('pf-hdr-name'); var tg=document.getElementById('pf-hdr-tagline'); var ad=document.getElementById('pf-hdr-address'); var lo=document.getElementById('pf-hdr-logo'); if(nm&&_CO['co-name']&&!nm.value) nm.value=_CO['co-name']; if(tg&&_CO['co-tagline']&&!tg.value) tg.value=_CO['co-tagline']; if(ad&&_CO['co-address']&&!ad.value) ad.value=_CO['co-address']; if(lo&&_CO['co-logo']&&!lo.value) lo.value=_CO['co-logo']; var panel=document.getElementById('pf-hdr-panel'); if(panel) panel.style.display=''; pfUpdateHeaderPreview(); } function pfHideHeaderPanel(){ var panel=document.getElementById('pf-hdr-panel'); if(panel) panel.style.display='none'; } function pfGetHeaderCSS(){ var fs = document.getElementById('pf-hdr-fs')?.value||'18'; var ff = document.getElementById('pf-hdr-ff')?.value||'Arial'; var bold = document.getElementById('pf-hdr-bold')?.checked?'bold':'normal'; var ital = document.getElementById('pf-hdr-ital')?.checked?'italic':'normal'; return {fs:fs, ff:ff, bold:bold, ital:ital}; } function pfBuildHeaderHTML(forPrint){ var name = document.getElementById('pf-hdr-name')?.value||''; var tagline = document.getElementById('pf-hdr-tagline')?.value||''; var address = document.getElementById('pf-hdr-address')?.value||''; var logo = document.getElementById('pf-hdr-logo')?.value||''; var st = pfGetHeaderCSS(); var logoHTML = logo ? '' : ''; return '
' + logoHTML + '
' + (name?'
'+name+'
':'') + (tagline?'
'+tagline+'
':'') + (address?'
'+address+'
':'') + '
'; } function pfUpdateHeaderPreview(){ var prev=document.getElementById('pf-hdr-preview'); if(!prev) return; prev.innerHTML=pfBuildHeaderHTML(false); } function pfPrintWithHeader(){ var svg=document.getElementById('pf-svg'); if(!svg){alert('Generate a process flow first.');return;} document.getElementById('pf-print-dialog').style.display='none'; var portrait=(_flowActiveSide&&_flowActiveSide!=='combined'&&_flowActiveSide!=='all-sides'); var orient=portrait?'portrait':'landscape'; var svgB64='data:image/svg+xml;base64,'+btoa(unescape(encodeURIComponent(svg.outerHTML))); var headerHTML=pfBuildHeaderHTML(true); var pw=window.open('','_blank','width=900,height=1200'); pw.document.write('Process Flow' +'' + headerHTML +'' +''); pw.document.close();pw.focus();setTimeout(function(){pw.print();},600); } function resetAll(){ if(!confirm('Reset all scope selections?'))return; S={asm:'',n:1,act:1,pcbs:{}}; ['ac-s','ac-m'].forEach(function(id){document.getElementById(id).classList.remove('sel');}); document.getElementById('crow').style.display='none'; ['s2','s3'].forEach(function(id){document.getElementById(id).style.display='none';}); document.getElementById('tabs').innerHTML=''; document.getElementById('panel').innerHTML=''; document.getElementById('pcbc').value='2'; window.scrollTo({top:0,behavior:'smooth'}); } function pptStatus(msg){ var el=document.getElementById('ppt-status'); if(el){el.style.display='block';el.textContent=msg;} } function generatePPT(which){ pptStatus('⏳ Step 1/3 — Loading PptxGenJS library…'); if(typeof PptxGenJS==='undefined'){ var s=document.createElement('script'); s.src='https://cdn.jsdelivr.net/npm/pptxgenjs@3.12.0/dist/pptxgen.bundle.js'; s.onload=function(){ pptStatus('⏳ Step 2/3 — Running calculations on your data…'); setTimeout(function(){ _doPPT(which); },300); }; s.onerror=function(){ pptStatus('❌ Could not load PptxGenJS — check internet connection and try again.'); }; document.head.appendChild(s); } else { pptStatus('⏳ Step 2/3 — Running calculations on your data…'); setTimeout(function(){ _doPPT(which); },300); } } function _getPPTData(){ pptStatus('Running calculations on loaded data…'); try { calcSMT(); calcTHT(); buildMPTbls(); calcInfra(); calcCPCB(); calcFinance(); calcDSCR(); } catch(e){ console.warn('PPT pre-calc:',e); } function gVal(id){ var el=document.getElementById(id); return (el&&el.value&&el.value.trim()&&el.value!=='--')?el.value.trim():''; } function gTxt(id){ var el=document.getElementById(id); var t=(el?(el.textContent||el.innerText||''):'').trim(); return (t&&t!=='--')?t:''; } function gNum(id){ return parseFloat(gVal(id)||gTxt(id))||0; } coLoad(); var co=_CO||{}; var coName=co['co-name']||'Paarminder Singh Electronic Process Consultancy'; var coLogo=co['co-logo']||''; var clientName=(function(){ var ids=['p-client','f-client','co-client','client-name','sow-client']; for(var i=0;i1)return v;} return '[ Client Company Name ]'; })(); var refNo=(function(){ var ids=['p-ref','f-ref','sow-ref','ref-no','proj-ref']; for(var i=0;i0||(p.std+p.fp+p.bga+p.lg)>0;}); var totVol=window._totVol||pcbs.reduce(function(s,p){return s+(p.vol||0);},0); var capex=window._totCapex||0; var roi=window._roi||{}; var irr=roi.irr?((roi.irr)*100).toFixed(1):'--'; var pb=roi.pb||'--'; var avgDSCR=roi.avgDSCR||'--'; var npv=roi.npv||0; var aSave=roi.aSave||window._aSave||0; var smtUtil=(window._smtUtil||0).toFixed(1)+'%'; var smtCPH=window._effCPH?Math.round(window._effCPH).toLocaleString('en-IN'):'--'; var smtDays=window._smtMachineDays?window._smtMachineDays.toFixed(1)+' days/month':'--'; var smtShifts=gVal('smt-shifts')||'1'; var smtWorkDays=gVal('smt-days')||'26'; var kwLoad=window._totalKW?(window._totalKW.toFixed(1)+' KW'):(gTxt('tot-kw')||'--'); var spaceReq=window._totalArea?Math.round(window._totalArea).toLocaleString('en-IN')+' sq ft':'--'; var smtCapex=gNum('tot-smt-eq'); var thtCapex=gNum('tot-tht-eq'); var acTons=window._acTons||0; var dgKVA=gTxt('dg-rec')||gVal('dg-rec'); var mpStot=gTxt('mp-stot'); var mpTotal=mpStot||('Rs.'+Math.round((window._mpProdTotal||0)*26).toLocaleString('en-IN')); var mpHeadcount=gTxt('mp-hc')||gVal('mp-hc')||'--'; var mpCat1=gTxt('mp-s1-tot')||'--'; var mpCat2=gTxt('mp-s2-tot')||'--'; var mpCat3=gTxt('mp-s3-tot')||'--'; var wtdInh=window._inhProd||parseFloat(gVal('f-inh'))||0; var wtdOut=window._wtdOut||0; var cpjRows=[]; if(window._pcbCosts&&window._pcbCosts.length){ window._pcbCosts.forEach(function(r){ cpjRows.push({ name: r.name||'PCB', vol: r.vol||0, inhouse: 'Rs.'+r.inhPerPCB.toFixed(2), outside: r.outPerPCB?'Rs.'+r.outPerPCB.toFixed(2):'--', saving: 'Rs.'+r.savePerPCB.toFixed(2), msave: r.mSave }); }); } else { pcbs.forEach(function(p){ cpjRows.push({name:p.name||'PCB',vol:p.vol||0,inhouse:wtdInh?'Rs.'+wtdInh.toFixed(2):'--',outside:p.cost?'Rs.'+p.cost:'--',saving:'--',msave:0}); }); } var infraItems=[]; try{ var allEq=[].concat(typeof SMT_EQ!=='undefined'?SMT_EQ:[]).concat(typeof THT_EQ!=='undefined'?THT_EQ:[]); allEq.forEach(function(e){ var mode=(window._eqMode&&window._eqMode[e.id])||'new'; var kwEl=document.getElementById(e.id+'-kw'); var kw=kwEl?kwEl.value:e.kw; var qtyEl=document.getElementById(e.id+'-qty'); var qty=qtyEl?qtyEl.value:(e.qty||1); var capEl=document.getElementById(e.id+'-cap')||document.getElementById(e.id+'-orig'); var capVal=capEl?capEl.value:'--'; var coEq=_CO&&_CO.equipment&&_CO.equipment[e.id]; if(coEq){kw=coEq.kw||kw;qty=coEq.qty||qty;if(coEq.orig)capVal=coEq.orig;} infraItems.push({name:e.n||e.name||e.id,kw:kw,qty:qty,cost:capVal,mode:mode,range:e.range||''}); }); }catch(ex){console.warn('infraItems:',ex);} var flowSteps=['SMT Side A']; if(pcbs.some(function(p){return p.hasSideB;})) flowSteps.push('SMT Side B'); if(pcbs.some(function(p){return p.hasTHTA||p.hasTHTB;})) flowSteps.push('THT Assembly'); if(pcbs.some(function(p){return p.hasICT;})) flowSteps.push('ICT'); if(pcbs.some(function(p){return p.hasFunc;})) flowSteps.push('Functional Test'); if(pcbs.some(function(p){return p.hasCoat;})) flowSteps.push('Conformal Coat'); flowSteps.push('Packing & Dispatch'); return { coName:coName, coLogo:coLogo, clientName:clientName, refNo:refNo, dateStr:dateStr, pcbs:pcbs, totVol:totVol, capex:capex, smtCapex:smtCapex, thtCapex:thtCapex, roi:roi, irr:irr, pb:pb, avgDSCR:avgDSCR, npv:npv, aSave:aSave, smtUtil:smtUtil, smtCPH:smtCPH, smtDays:smtDays, smtShifts:smtShifts, smtWorkDays:smtWorkDays, kwLoad:kwLoad, spaceReq:spaceReq, acTons:acTons, dgKVA:dgKVA, mpTotal:mpTotal, mpHeadcount:mpHeadcount, mpCat1:mpCat1, mpCat2:mpCat2, mpCat3:mpCat3, cpjRows:cpjRows, infraItems:infraItems, wtdInh:wtdInh, wtdOut:wtdOut, flowSteps:flowSteps }; } function _crore(v){ if(!v||isNaN(v)) return 'Rs.--'; var c=v/10000000; return c>=1?'Rs.'+c.toFixed(2)+' Cr':'Rs.'+(v/100000).toFixed(2)+' L'; } function _lakh(v){ if(!v||isNaN(v)) return '--'; return 'Rs.'+(v/100000).toFixed(2)+' L'; } function _lakhFmt(v){ if(!v||isNaN(v)) return '--'; if(v>=10000000) return 'Rs.'+(v/10000000).toFixed(2)+' Cr'; if(v>=100000) return 'Rs.'+(v/100000).toFixed(1)+' L'; return 'Rs.'+Math.round(v).toLocaleString('en-IN'); } var _PEPC_LOGO_B64='PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMjAwIj4KICA8Y2lyY2xlIGN4PSIxMDAiIGN5PSIxMDAiIHI9Ijk4IiBmaWxsPSIjRkZFMDAwIi8+CiAgPGNpcmNsZSBjeD0iMTAwIiBjeT0iMTAwIiByPSI3MCIgZmlsbD0id2hpdGUiLz4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMDAsMTA1KSByb3RhdGUoLTQyKSI+CiAgICA8cmVjdCB4PSItMTMiIHk9Ii02NiIgd2lkdGg9IjI2IiBoZWlnaHQ9IjYwIiByeD0iNyIgZmlsbD0iI0NDMTExMSIvPgogIDwvZz4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMDAsMTA1KSByb3RhdGUoNDIpIj4KICAgIDxyZWN0IHg9Ii0xMyIgeT0iLTY2IiB3aWR0aD0iMjYiIGhlaWdodD0iNjAiIHJ4PSI3IiBmaWxsPSIjMTE0NEJCIi8+CiAgPC9nPgogIDxyZWN0IHg9Ijg3IiB5PSIxMDUiIHdpZHRoPSIyNiIgaGVpZ2h0PSI1NSIgcng9IjciIGZpbGw9IiMxQThDM0EiLz4KICA8Y2lyY2xlIGN4PSIxMDAiIGN5PSIxMDUiIHI9IjE2IiBmaWxsPSIjRkY4QzAwIi8+Cjwvc3ZnPg=='; function _addBranding(slide, d, dark){ var bgCol = dark ? '1E3A5F' : 'F0F4FA'; var txtCol = dark ? 'FFFFFF' : '1E3A5F'; var subCol = dark ? 'C8D8F8' : '3A5A8A'; slide.addShape('rect',{x:0, y:0, w:13.33, h:0.92, fill:{color: dark ? '0D1F35' : 'E8EFF8'}, line:{color: dark ? '0D1F35' : 'C8D8F0', width:0}}); slide.addShape('rect',{x:0, y:0, w:0.08, h:0.92, fill:{color:'C8961E'}, line:{color:'C8961E',width:0}}); var logoData = (d.coLogo && d.coLogo.trim()) ? d.coLogo : _PEPC_LOGO_B64; var logoIsUrl = logoData.startsWith('http'); try { if(logoIsUrl){ slide.addImage({path:logoData, x:0.18, y:0.06, w:0.80, h:0.80}); } else { slide.addImage({data:'data:image/svg+xml;base64,'+logoData.replace(/^data:image\/[^;]+;base64,/,''), x:0.18, y:0.06, w:0.80, h:0.80}); } } catch(e){ slide.addShape('ellipse',{x:0.18,y:0.07,w:0.78,h:0.78,fill:{color:'FFE000'},line:{color:'E5A800',width:1}}); slide.addText('P',{x:0.18,y:0.07,w:0.78,h:0.78,fontSize:26,bold:true,color:'1E3A5F',align:'center',valign:'middle',fontFace:'Georgia'}); } slide.addText(d.coName||'Paarminder Singh Electronic Process Consultancy',{ x:1.10, y:0.05, w:12.0, h:0.52, fontSize:18, bold:true, color:txtCol, fontFace:'Segoe UI', valign:'middle' }); slide.addText('Electronics Manufacturing Consultants',{ x:1.10, y:0.56, w:9.0, h:0.28, fontSize:9, color:subCol, fontFace:'Segoe UI', valign:'middle', italic:true }); slide.addShape('rect',{x:0, y:0.92, w:13.33, h:0.04, fill:{color:'C8961E'}, line:{color:'C8961E',width:0}}); slide.addShape('rect',{x:0, y:7.28, w:13.33, h:0.22, fill:{color: dark ? '0A1828' : 'E8EFF8'}, line:{color: dark ? '0A1828' : 'C8D8F0', width:0}}); slide.addShape('rect',{x:0, y:7.28, w:0.06, h:0.22, fill:{color:'C8961E'}, line:{color:'C8961E',width:0}}); slide.addText(d.coName||'Paarminder Singh Electronic Process Consultancy',{ x:0.15, y:7.29, w:7, h:0.18, fontSize:7.5, color:dark?'AAAAAA':'666666', fontFace:'Segoe UI'}); slide.addText('CONFIDENTIAL',{ x:7.2, y:7.29, w:2, h:0.18, fontSize:7.5, bold:true, color:'C8961E', fontFace:'Segoe UI', align:'center'}); } function _addSlideNum(slide, n){ slide.addText(String(n),{x:12.1,y:7.29,w:1.1,h:0.18,fontSize:7.5,color:'888888',fontFace:'Segoe UI',align:'right'}); } function _addTag(slide, tag){ slide.addShape('rect',{x:0.3,y:1.06,w:1.8,h:0.26,fill:{color:'C8961E'},line:{color:'C8961E',width:0},rounding:true}); slide.addText(tag,{x:0.3,y:1.06,w:1.8,h:0.26,fontSize:9,bold:true,color:'1E3A5F',fontFace:'Segoe UI',align:'center',valign:'middle'}); } function _addTitle(slide, title, sub){ slide.addText(title,{x:0.3,y:1.38,w:12.7,h:0.58,fontSize:24,bold:true,color:'1E3A5F',fontFace:'Georgia',valign:'middle'}); if(sub) slide.addText(sub,{x:0.3,y:1.98,w:12.7,h:0.30,fontSize:11,color:'555555',fontFace:'Segoe UI'}); } function _buildStyle1(d,selectedIds){ selectedIds=selectedIds||SLIDE_DEFS.map(function(s){return s.id;}); var pptx=new PptxGenJS(); pptx.layout='LAYOUT_WIDE'; pptx.author=d.coName; pptx.title='SMT Feasibility Study — '+d.clientName; var NAVY='1E3A5F', GOLD='C8961E', WHITE='FFFFFF', LIGHT='F4F7FC', GREEN='0A6B35', PURPLE='5B21B6'; // ── SLIDE 1 — TITLE ────────────────────────────────────────────────────────── if(selectedIds.indexOf(1)>=0){ var s1=pptx.addSlide(); s1.background={color:NAVY}; _addBranding(s1,d,true); s1.addText('Prepared exclusively for',{x:0.5,y:1.0,w:12.0,h:0.30,fontSize:11,color:'AAAAAA',fontFace:'Segoe UI',italic:true}); s1.addText(d.clientName.toUpperCase(),{x:0.5,y:1.32,w:12.0,h:0.60,fontSize:24,bold:true,color:GOLD,fontFace:'Georgia'}); s1.addText('IN-HOUSE SMT LINE\nFEASIBILITY STUDY',{x:0.5,y:1.96,w:12.0,h:1.6,fontSize:46,bold:true,color:WHITE,fontFace:'Georgia',lineSpacingMultiple:1.1}); s1.addShape('rect',{x:0.5,y:3.64,w:12.0,h:0.05,fill:{color:GOLD},line:{color:GOLD,width:0}}); s1.addText('Module 1 — Pre-Capex Feasibility | Ref: '+d.refNo+' | '+d.dateStr,{x:0.5,y:3.72,w:12.0,h:0.30,fontSize:11,color:'BBBBBB',fontFace:'Segoe UI'}); s1.addText('Your Savings. Our Strategy. Your Success.',{x:0.5,y:4.1,w:12.0,h:0.35,fontSize:13,italic:true,color:GOLD,fontFace:'Georgia'}); s1.addText('Jai Guru Ji 🙏',{x:0.5,y:6.8,w:12.0,h:0.3,fontSize:10,color:'888888',fontFace:'Segoe UI',align:'right'}); // ── SLIDE 2 — ABOUT PEPC ───────────────────────────────────────────────────── } // end slide if(selectedIds.indexOf(2)>=0){ var s2=pptx.addSlide(); s2.background={color:WHITE}; _addBranding(s2,d,false); _addTag(s2,'ABOUT PEPC'); _addTitle(s2,'Paarminder Singh Electronics Process Consultancy','Driven by Experience. Defined by Results. | Jai Guru Ji 🙏'); _addSlideNum(s2,2); // Pioneer banner s2.addShape('rect',{x:0.3,y:2.28,w:12.7,h:0.62,fill:{color:NAVY},line:{color:NAVY,width:0},rounding:true}); s2.addText('🏆 INDIA\'S FIRST AUTOMATIC SMT LINE — 1990 | 35+ YEARS | 20+ SMT LINES INSTALLED & RUNNING',{x:0.5,y:2.30,w:12.3,h:0.58,fontSize:11,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); // About text s2.addText('PEPC is a specialised electronics manufacturing consultancy based in Delhi-NCR, offering expert guidance and end-to-end solutions for companies setting up, optimising or scaling electronics manufacturing. With over 35 years of engineering experience, we serve EMS companies, OEMs, ODMs and startups across Automotive, EV, Defence, Railways, Telecom, Industrial Controls and Consumer Electronics.',{x:0.3,y:3.02,w:8.2,h:1.1,fontSize:9.5,color:'333333',fontFace:'Segoe UI',valign:'top'}); // Leadership box s2.addShape('rect',{x:8.7,y:3.0,w:4.3,h:1.14,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s2.addText('Mr. Parminder Singh',{x:8.85,y:3.05,w:4.0,h:0.32,fontSize:11,bold:true,color:NAVY,fontFace:'Georgia'}); s2.addText('Founder & Principal Consultant\nB.E. Electronics | 35+ Years\nPersonally installed 20+ SMT lines across India',{x:8.85,y:3.37,w:4.0,h:0.72,fontSize:8.5,color:'444444',fontFace:'Segoe UI'}); // 6 service cards var services=[ {icon:'🏗️',title:'Greenfield Setup',desc:'Turnkey plant setup from concept to first board'}, {icon:'⚙️',title:'SMT & TH Lines',desc:'Equipment selection, layout, commissioning, OEE'}, {icon:'📉',title:'Process Improvement',desc:'Lean, Six Sigma, 5S, cycle time reduction'}, {icon:'🧪',title:'NPI / DFM / DFT',desc:'APQP, PPAP, PFMEA, DFM and DFT reviews'}, {icon:'📊',title:'Financial Feasibility',desc:'Capex, DSCR, IRR, NPV — PEPC Tool'}, {icon:'🏛️',title:'Subsidy Advisory',desc:'Central ECMS + Gujarat GECMS guidance'}, ]; services.forEach(function(sv,i){ var col=i%3, row=Math.floor(i/3); var x=0.3+col*4.22, y=4.24+row*1.0; s2.addShape('rect',{x:x,y:y,w:4.0,h:0.86,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s2.addText(sv.icon+' '+sv.title,{x:x+0.12,y:y+0.06,w:3.76,h:0.3,fontSize:9.5,bold:true,color:NAVY,fontFace:'Segoe UI'}); s2.addText(sv.desc,{x:x+0.12,y:y+0.38,w:3.76,h:0.42,fontSize:8.5,color:'555555',fontFace:'Segoe UI'}); }); // Why PEPC footer bar s2.addShape('rect',{x:0.3,y:6.32,w:12.7,h:0.5,fill:{color:GOLD},line:{color:GOLD,width:0},rounding:true}); s2.addText('✅ India\'s First Auto SMT Line 1990 ✅ 35+ Years Experience ✅ 20+ Lines Running ✅ Proprietary PEPC Feasibility Tool ✅ PAN India Presence',{x:0.5,y:6.34,w:12.3,h:0.44,fontSize:9.5,bold:true,color:NAVY,fontFace:'Segoe UI',align:'center',valign:'middle'}); // ── SLIDE 3 — PRESENTATION ROADMAP ─────────────────────────────────────────── } // end slide if(selectedIds.indexOf(3)>=0){ var s3=pptx.addSlide(); s3.background={color:WHITE}; _addBranding(s3,d,false); _addTag(s3,'PRESENTATION GUIDE'); _addTitle(s3,'What This Presentation Covers','Your complete investment roadmap — from savings to go-live'); _addSlideNum(s3,3); var sections=[ {n:'01',title:'Why In-House SMT?',desc:'Advantages, risks and PCB cost savings vs EMS outsourcing',color:NAVY}, {n:'02',title:'The Investment',desc:'Capex breakdown, world-class equipment and factory layout',color:PURPLE}, {n:'03',title:'Financial Returns',desc:'DSCR, IRR, Payback, NPV — Base + EMS + Subsidy scenarios',color:GREEN}, {n:'04',title:'Government Subsidies',desc:'Central ECMS (25%) + Gujarat GECMS (25%) + EPF, Power, SGST',color:'B45309'}, {n:'05',title:'Implementation Plan',desc:'Timeline with and without subsidy — step by step',color:'0A6B35'}, {n:'06',title:'Manpower & Next Steps',desc:'Staffing plan and board approval actions',color:NAVY}, ]; sections.forEach(function(sec,i){ var col=i%2, row=Math.floor(i/2); var x=col===0?0.3:6.82, y=2.34+row*1.42; s3.addShape('rect',{x:x,y:y,w:6.3,h:1.28,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s3.addShape('rect',{x:x,y:y,w:0.7,h:1.28,fill:{color:sec.color},line:{color:sec.color,width:0},rounding:true}); s3.addText(sec.n,{x:x,y:y,w:0.7,h:1.28,fontSize:18,bold:true,color:WHITE,fontFace:'Georgia',align:'center',valign:'middle'}); s3.addText(sec.title,{x:x+0.82,y:y+0.12,w:5.34,h:0.36,fontSize:11,bold:true,color:NAVY,fontFace:'Segoe UI'}); s3.addText(sec.desc,{x:x+0.82,y:y+0.50,w:5.34,h:0.68,fontSize:9,color:'555555',fontFace:'Segoe UI'}); }); // ── SLIDE 4 — ADVANTAGES OF IN-HOUSE SMT ───────────────────────────────────── } // end slide if(selectedIds.indexOf(4)>=0){ var s4=pptx.addSlide(); s4.background={color:WHITE}; _addBranding(s4,d,false); _addTag(s4,'WHY IN-HOUSE SMT'); _addTitle(s4,'10 Compelling Advantages of In-House SMT','Strategic, operational and financial benefits for '+d.clientName); _addSlideNum(s4,4); var advs=[ {icon:'💰',title:'Cost Savings',desc:'Eliminate EMS margin (15-30%). Save Rs.'+_crore(d.aSave)+'/year from Day 1'}, {icon:'🔒',title:'IP Protection',desc:'Proprietary PCB designs, firmware and assembly remain confidential'}, {icon:'⚡',title:'Faster Lead Time',desc:'24-48 hr turnaround vs 2-4 weeks with EMS outsourcing'}, {icon:'🎯',title:'Quality Control',desc:'Direct control over IPC Class 2 standards, AOI, ICT and FT'}, {icon:'📈',title:'Scale on Demand',desc:'Increase production 3x without renegotiating EMS contracts'}, {icon:'🏭',title:'EMS Revenue',desc:'68% spare capacity generates EMS income — new revenue stream'}, {icon:'🔧',title:'Process Mastery',desc:'In-house process knowledge drives continuous improvement'}, {icon:'🛡️',title:'Supply Security',desc:'No dependency on EMS availability or priority allocation'}, {icon:'🏅',title:'Make in India',desc:'Qualify for Central & Gujarat government subsidies up to 50%'}, {icon:'💼',title:'Brand Credibility',desc:'Own manufacturing facility strengthens client and investor trust'}, ]; advs.forEach(function(a,i){ var col=i%5, row=Math.floor(i/2); var x=0.22+col*2.56, y=2.30+row*1.06; s4.addShape('rect',{x:x,y:y,w:2.42,h:0.94,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s4.addText(a.icon+' '+a.title,{x:x+0.1,y:y+0.05,w:2.22,h:0.32,fontSize:9.5,bold:true,color:NAVY,fontFace:'Segoe UI'}); s4.addText(a.desc,{x:x+0.1,y:y+0.38,w:2.22,h:0.50,fontSize:8,color:'444444',fontFace:'Segoe UI'}); }); s4.addShape('rect',{x:0.3,y:6.32,w:12.7,h:0.5,fill:{color:NAVY},line:{color:NAVY,width:0},rounding:true}); s4.addText('Bottom Line: In-house SMT pays for itself in '+d.pb+' months — and generates '+_crore(d.aSave)+' per year in perpetuity.',{x:0.5,y:6.34,w:12.3,h:0.44,fontSize:11,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); // ── SLIDE 5 — RISK ANALYSIS (BRIEF) ────────────────────────────────────────── } // end slide if(selectedIds.indexOf(5)>=0){ var s5=pptx.addSlide(); s5.background={color:WHITE}; _addBranding(s5,d,false); _addTag(s5,'RISK ANALYSIS'); _addTitle(s5,'Risk Assessment & Mitigation','3 identified risks — all manageable with proper planning'); _addSlideNum(s5,5); var risks=[ {risk:'Utilisation Risk',detail:'Current utilisation 32% at single shift. Volume may not fill line immediately.',mitigation:'68% spare capacity converted to EMS revenue — line is profitable even at 32% utilisation. DSCR '+d.avgDSCR+'x confirmed.'}, {risk:'Technology Risk',detail:'SMT technology requires trained operators and process engineers.',mitigation:'PEPC provides complete commissioning, process qualification, operator training and 3-month handholding post go-live.'}, {risk:'Working Capital',detail:'Initial ramp-up period before full savings are realised.',mitigation:'Payback achieved in '+d.pb+' months. DSCR '+d.avgDSCR+'x means loan repayment is secure from Month 1 savings.'}, ]; risks.forEach(function(r,i){ var y=2.28+i*1.46; s5.addShape('rect',{x:0.3,y:y,w:12.7,h:1.32,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s5.addShape('rect',{x:0.3,y:y,w:0.12,h:1.32,fill:{color:'B91C1C'},line:{color:'B91C1C',width:0}}); s5.addText('⚠ '+r.risk,{x:0.56,y:y+0.08,w:4.5,h:0.32,fontSize:11,bold:true,color:'B91C1C',fontFace:'Segoe UI'}); s5.addText(r.detail,{x:0.56,y:y+0.42,w:4.5,h:0.76,fontSize:9,color:'555555',fontFace:'Segoe UI'}); s5.addShape('rect',{x:5.2,y:y+0.08,w:0.05,h:1.16,fill:{color:'DDDDDD'},line:{color:'DDDDDD',width:0}}); s5.addText('✅ MITIGATION',{x:5.44,y:y+0.08,w:2.2,h:0.32,fontSize:10,bold:true,color:GREEN,fontFace:'Segoe UI'}); s5.addText(r.mitigation,{x:5.44,y:y+0.42,w:7.36,h:0.76,fontSize:9,color:'333333',fontFace:'Segoe UI'}); }); s5.addShape('rect',{x:0.3,y:6.62,w:12.7,h:0.42,fill:{color:GREEN},line:{color:GREEN,width:0},rounding:true}); s5.addText('Verdict: Risks are low and fully mitigated. Financial model confirms viability at current volumes.',{x:0.5,y:6.64,w:12.3,h:0.36,fontSize:10,bold:true,color:WHITE,fontFace:'Segoe UI',align:'center',valign:'middle'}); // ── SLIDE 6 — PCB COST COMPARISON ──────────────────────────────────────────── } // end slide if(selectedIds.indexOf(6)>=0){ var s6=pptx.addSlide(); s6.background={color:WHITE}; _addBranding(s6,d,false); _addTag(s6,'SAVINGS ANALYSIS'); _addTitle(s6,'PCB Cost: In-House vs EMS Outsourcing','The financial case for in-house manufacturing — your money, your factory'); _addSlideNum(s6,6); // Summary KPI bar s6.addShape('rect',{x:0.3,y:2.28,w:12.7,h:0.68,fill:{color:NAVY},line:{color:NAVY,width:0},rounding:true}); var sSavKpis=[ 'In-House Wtd.Avg: Rs.'+(d.wtdInh?d.wtdInh.toFixed(2):'--')+'/PCB', 'EMS Wtd.Avg: Rs.'+(d.wtdOut?d.wtdOut.toFixed(2):'--')+'/PCB', 'Saving/PCB: Rs.'+(d.wtdInh&&d.wtdOut?(d.wtdOut-d.wtdInh).toFixed(2):'--'), 'Annual Saving: '+_crore(d.aSave)+'/yr', ]; sSavKpis.forEach(function(t,i){s6.addText(t,{x:0.4+i*3.2,y:2.32,w:3.1,h:0.6,fontSize:10,bold:true,color:GOLD,fontFace:'Georgia',valign:'middle'});}); // PCB table var cpHdr=[ {text:'PCB Name',options:{bold:true,color:WHITE,fill:{color:'0D1F35'},fontSize:8.5}}, {text:'Vol/Month',options:{bold:true,color:WHITE,fill:{color:'0D1F35'},fontSize:8.5,align:'center'}}, {text:'EMS Cost/PCB',options:{bold:true,color:WHITE,fill:{color:'0D1F35'},fontSize:8.5,align:'center'}}, {text:'In-House Cost/PCB',options:{bold:true,color:WHITE,fill:{color:'0D1F35'},fontSize:8.5,align:'center'}}, {text:'Saving/PCB',options:{bold:true,color:WHITE,fill:{color:'0D1F35'},fontSize:8.5,align:'center'}}, {text:'Monthly Saving',options:{bold:true,color:GOLD,fill:{color:'0D1F35'},fontSize:8.5,align:'center'}}, ]; var cpRows=d.cpjRows.slice(0,10).map(function(p,i){ var bg=i%2===0?WHITE:LIGHT; return [ {text:p.name,options:{fontSize:8.5,color:'1A2332',fill:{color:bg}}}, {text:(p.vol||0).toLocaleString('en-IN'),options:{fontSize:8.5,align:'center',fill:{color:bg}}}, {text:p.outside||'--',options:{fontSize:8.5,align:'center',color:'B45309',fill:{color:bg}}}, {text:p.inhouse||'--',options:{fontSize:8.5,bold:true,align:'center',color:GREEN,fill:{color:bg}}}, {text:p.saving||'--',options:{fontSize:8.5,align:'center',color:(p.msave>0)?GREEN:'B91C1C',fill:{color:bg}}}, {text:p.msave?_crore(p.msave):'--',options:{fontSize:8.5,bold:true,align:'center',color:(p.msave>0)?GREEN:'B91C1C',fill:{color:bg}}}, ]; }); var totalMsave=d.cpjRows.reduce(function(s,r){return s+(r.msave||0);},0); cpRows.push([ {text:'WEIGHTED AVERAGE / TOTAL ('+d.pcbs.length+' PCBs)',options:{bold:true,fontSize:8.5,color:WHITE,fill:{color:NAVY}}}, {text:(d.totVol||0).toLocaleString('en-IN'),options:{bold:true,fontSize:8.5,align:'center',color:GOLD,fill:{color:NAVY}}}, {text:d.wtdOut?'Rs.'+d.wtdOut.toFixed(2):'--',options:{bold:true,fontSize:8.5,align:'center',color:'FFCC88',fill:{color:NAVY}}}, {text:d.wtdInh?'Rs.'+d.wtdInh.toFixed(2):'--',options:{bold:true,fontSize:8.5,align:'center',color:'AAFFAA',fill:{color:NAVY}}}, {text:d.wtdInh&&d.wtdOut?'Rs.'+(d.wtdOut-d.wtdInh).toFixed(2):'--',options:{bold:true,fontSize:8.5,align:'center',color:GOLD,fill:{color:NAVY}}}, {text:_crore(totalMsave)+'/mo',options:{bold:true,fontSize:8.5,align:'center',color:GOLD,fill:{color:NAVY}}}, ]); s6.addTable([cpHdr].concat(cpRows),{x:0.3,y:3.06,w:12.7,rowH:0.34,fontSize:8.5,border:{type:'solid',color:'DDEEFF',pt:0.5},fontFace:'Segoe UI'}); s6.addText('BOM verified against actual BOMs — 3rd May 2026. All 34 PCB component counts confirmed.',{x:0.3,y:6.64,w:12.7,h:0.26,fontSize:8,italic:true,color:'888888',fontFace:'Segoe UI',align:'center'}); // ── SLIDE 7 — CAPEX OVERVIEW ────────────────────────────────────────────────── } // end slide if(selectedIds.indexOf(7)>=0){ var s7=pptx.addSlide(); s7.background={color:WHITE}; _addBranding(s7,d,false); _addTag(s7,'INVESTMENT OVERVIEW'); _addTitle(s7,'Capital Investment — Rs.'+_crore(d.capex),'Equipment + Civil + Utilities + Contingency | Accuracy: ±20%'); _addSlideNum(s7,7); var capexCards=[ {label:'SMT Equipment',val:_crore(d.smtCapex),sub:'Printer, P&P, Reflow, AOI, SPI',color:NAVY}, {label:'THT & Test',val:_crore(d.thtCapex),sub:'Wave/Selective, ICT, FT, Packing',color:PURPLE}, {label:'Civil & Utilities',val:'Est.',sub:'ESD floor, AC, electrical, DG, UPS',color:'B45309'}, {label:'15% Contingency',val:'Included',sub:'Budgeted into total capex figure',color:GREEN}, ]; capexCards.forEach(function(c,i){ var x=0.3+i*3.22; s7.addShape('rect',{x:x,y:2.28,w:3.0,h:1.52,fill:{color:c.color},line:{color:c.color,width:0},rounding:true}); s7.addText(c.label,{x:x+0.1,y:2.34,w:2.8,h:0.3,fontSize:9,color:'AAAAAA',fontFace:'Segoe UI',align:'center'}); s7.addText(c.val,{x:x+0.06,y:2.62,w:2.88,h:0.72,fontSize:24,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); s7.addText(c.sub,{x:x+0.06,y:3.32,w:2.88,h:0.38,fontSize:8,color:'CCCCCC',fontFace:'Segoe UI',align:'center'}); }); // Total banner s7.addShape('rect',{x:0.3,y:3.96,w:12.7,h:0.72,fill:{color:GOLD},line:{color:GOLD,width:0},rounding:true}); s7.addText('TOTAL PROJECT CAPEX: '+_crore(d.capex),{x:0.5,y:3.98,w:12.3,h:0.68,fontSize:26,bold:true,color:NAVY,fontFace:'Georgia',align:'center',valign:'middle'}); // Infrastructure summary var infraRows=[ ['Total Connected Load',d.kwLoad,'KW'], ['DG Set Recommended',d.dgKVA,'KVA'], ['Air Conditioning',d.acTons,'Tons'], ['Space Required',d.spaceReq,'sq ft'], ]; infraRows.forEach(function(r,i){ var x=0.3+i*3.22; s7.addShape('rect',{x:x,y:4.82,w:3.0,h:0.82,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s7.addText(r[0],{x:x+0.1,y:4.86,w:2.8,h:0.26,fontSize:8.5,color:'666666',fontFace:'Segoe UI',align:'center'}); s7.addText(r[1]+' '+r[2],{x:x+0.1,y:5.12,w:2.8,h:0.44,fontSize:16,bold:true,color:NAVY,fontFace:'Georgia',align:'center',valign:'middle'}); }); s7.addText('Note: Costs are indicative (±20%). Firm vendor quotations to be obtained in Module 2 — Detailed Project Report.',{x:0.3,y:5.76,w:12.7,h:0.28,fontSize:8.5,italic:true,color:'888888',fontFace:'Segoe UI',align:'center'}); // Line capacity summary s7.addShape('rect',{x:0.3,y:6.12,w:12.7,h:0.62,fill:{color:NAVY},line:{color:NAVY,width:0},rounding:true}); s7.addText('Line Capacity: CPH 1,00,000 | Current Utilisation: '+d.smtUtil+' | SMT Shifts: '+d.smtShifts+' | Spare Capacity: 68% available for EMS revenue',{x:0.5,y:6.14,w:12.3,h:0.58,fontSize:10,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); // ── SLIDE 8 — EQUIPMENT LIST ────────────────────────────────────────────────── } // end slide if(selectedIds.indexOf(8)>=0){ var s8=pptx.addSlide(); s8.background={color:WHITE}; _addBranding(s8,d,false); _addTag(s8,'WORLD CLASS EQUIPMENT'); _addTitle(s8,'27-Item Equipment List — Best-in-Class Brands','Global leaders selected for reliability, accuracy and after-sales support in India'); _addSlideNum(s8,8); var eqHdr=[ {text:'Equipment',options:{bold:true,color:WHITE,fill:{color:NAVY},fontSize:9}}, {text:'Qty',options:{bold:true,color:WHITE,fill:{color:NAVY},fontSize:9,align:'center'}}, {text:'World Class Brands',options:{bold:true,color:GOLD,fill:{color:NAVY},fontSize:9,align:'center'}}, {text:'KW Load',options:{bold:true,color:WHITE,fill:{color:NAVY},fontSize:9,align:'center'}}, {text:'Indicative Cost',options:{bold:true,color:WHITE,fill:{color:NAVY},fontSize:9,align:'center'}}, ]; var eqData=d.infraItems.length?d.infraItems:[ {name:'Automatic Stencil Printer',qty:'1',kw:'3.3',cost:'--',range:'Rs.15L–40L'}, {name:'SPI — Solder Paste Inspection',qty:'1',kw:'1.5',cost:'--',range:'Rs.12L–35L'}, {name:'Pick & Place Machine — High Speed',qty:'2',kw:'2.6',cost:'--',range:'Rs.40L–2Cr'}, {name:'Reflow Oven — 10 Zone',qty:'1',kw:'65',cost:'--',range:'Rs.15L–50L'}, {name:'AOI — 3D Automated Optical Inspection',qty:'1',kw:'2.0',cost:'--',range:'Rs.20L–60L'}, {name:'Wave / Selective Soldering Machine',qty:'1',kw:'8.0',cost:'--',range:'Rs.15L–40L'}, {name:'ICT — In-Circuit Test',qty:'1',kw:'2.0',cost:'--',range:'Rs.30L–80L'}, {name:'Functional Test Equipment',qty:'1',kw:'1.5',cost:'--',range:'Rs.10L–50L'}, ]; var brandMap={ 'Stencil':'Ekra / DEK / Heller','SPI':'Koh Young / Saki','Pick':'Hanwha SM482 / Panasonic NPM-D3 / Fuji NXT III', 'Reflow':'Heller / BTU / Vitronics','AOI':'Koh Young / Omron / Saki','Wave':'Ersa / Pillarhouse / Seho', 'ICT':'Keysight / Teradyne / Spea','Functional':'Customer-specified / PEPC-assisted', }; var eqRows=eqData.map(function(e,i){ var bg=i%2===0?WHITE:LIGHT; var brandKey=Object.keys(brandMap).find(function(k){return e.name.indexOf(k)>=0;})||''; var brand=brandMap[brandKey]||'World class brands'; var costDisp=e.cost&&e.cost!=='--'?_lakhFmt(parseFloat(e.cost)):e.range||'--'; return [ {text:e.name,options:{fontSize:9,color:'1A2332',fill:{color:bg}}}, {text:String(e.qty||1),options:{fontSize:9,align:'center',fill:{color:bg}}}, {text:brand,options:{fontSize:8.5,align:'center',color:NAVY,bold:true,fill:{color:bg}}}, {text:String(e.kw||'--')+' KW',options:{fontSize:9,align:'center',fill:{color:bg}}}, {text:costDisp,options:{fontSize:8.5,align:'center',fill:{color:bg}}}, ]; }); eqRows.push([ {text:'TOTAL PROJECT CAPEX (incl. 15% contingency)',options:{bold:true,fontSize:9,color:WHITE,fill:{color:NAVY}}}, {text:'27 Items',options:{bold:true,fontSize:8.5,align:'center',color:GOLD,fill:{color:NAVY}}}, {text:'Best-in-class across all categories',options:{fontSize:8.5,align:'center',color:'CCCCCC',fill:{color:NAVY}}}, {text:d.kwLoad,options:{bold:true,fontSize:9,align:'center',color:GOLD,fill:{color:NAVY}}}, {text:_crore(d.capex),options:{bold:true,fontSize:11,align:'center',color:GOLD,fill:{color:NAVY}}}, ]); s8.addTable([eqHdr].concat(eqRows),{x:0.3,y:2.28,w:12.7,rowH:0.38,fontSize:9,border:{type:'solid',color:'DDEEFF',pt:0.5},fontFace:'Segoe UI'}); s8.addText('Three Pick & Place options evaluated: Hanwha SM482 | Panasonic NPM-D3 | Fuji NXT III — Final selection in Module 2 based on firm quotations.',{x:0.3,y:6.62,w:12.7,h:0.26,fontSize:8.5,italic:true,color:'888888',fontFace:'Segoe UI',align:'center'}); // ── SLIDE 9 — FACTORY LAYOUT ────────────────────────────────────────────────── } // end slide if(selectedIds.indexOf(9)>=0){ var s9=pptx.addSlide(); s9.background={color:WHITE}; _addBranding(s9,d,false); _addTag(s9,'FACTORY LAYOUT'); _addTitle(s9,'World-Class Factory Layout — 300 × 310 ft Site','Optimised material flow | ESD-compliant | Expandable design'); _addSlideNum(s9,9); // Zone cards var zones=[ {name:'SMT Zone',area:'2,300 sq ft',items:'Printer, P&P ×2, Reflow, AOI, SPI',color:NAVY}, {name:'THT & Selective Solder',area:'1,500 sq ft',items:'Wave/Selective, Hand solder stations',color:PURPLE}, {name:'Test & Inspection',area:'800 sq ft',items:'ICT, Functional Test, Final QC',color:GREEN}, {name:'Component Store',area:'756 sq ft',items:'Reel storage, SMD tower, dry cabinet',color:'B45309'}, {name:'Finished Goods',area:'600 sq ft',items:'Packing, dispatch, ESD packaging',color:'5E5E5E'}, {name:'Office & QA Lab',area:'400 sq ft',items:'Engineer office, QA documentation, calibration',color:'0A6B35'}, ]; zones.forEach(function(z,i){ var col=i%3, row=Math.floor(i/3); var x=0.3+col*4.22, y=2.26+row*2.0; s9.addShape('rect',{x:x,y:y,w:4.0,h:1.82,fill:{color:z.color},line:{color:z.color,width:0},rounding:true}); s9.addText(z.name,{x:x+0.12,y:y+0.1,w:3.76,h:0.36,fontSize:11,bold:true,color:WHITE,fontFace:'Georgia'}); s9.addText(z.area,{x:x+0.12,y:y+0.48,w:3.76,h:0.32,fontSize:16,bold:true,color:GOLD,fontFace:'Georgia'}); s9.addText(z.items,{x:x+0.12,y:y+0.84,w:3.76,h:0.86,fontSize:8.5,color:'CCCCCC',fontFace:'Segoe UI'}); }); s9.addShape('rect',{x:0.3,y:6.32,w:12.7,h:0.52,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s9.addText('Material Flow: Incoming Store → SMT → THT → AOI/ICT/FT → Packing → Dispatch | Total Area: '+d.spaceReq+' | ESD-compliant throughout',{x:0.5,y:6.34,w:12.3,h:0.44,fontSize:9.5,bold:true,color:NAVY,fontFace:'Segoe UI',align:'center',valign:'middle'}); // ── SLIDE 10 — FINANCIAL: BASE CASE ────────────────────────────────────────── } // end slide if(selectedIds.indexOf(10)>=0){ var s10=pptx.addSlide(); s10.background={color:WHITE}; _addBranding(s10,d,false); _addTag(s10,'FINANCIAL PROJECTION — SCENARIO 1'); _addTitle(s10,'Base Case: 34 PCBs Only (Current Volume)','No EMS revenue, no subsidy — conservative projection'); _addSlideNum(s10,10); var baseKpis=[ {label:'Total Capex',val:_crore(d.capex),sub:'Equipment + Civil + Contingency',color:NAVY}, {label:'Payback Period',val:d.pb+' Months',sub:'From commissioning date',color:PURPLE}, {label:'IRR (10-Year)',val:d.irr+'%',sub:'Threshold: >11.5%',color:GREEN}, {label:'Avg DSCR (7-Yr)',val:d.avgDSCR+'x',sub:'Bank minimum: 1.5x',color:GREEN}, {label:'NPV @ 12%',val:_crore(d.npv),sub:'10-year horizon',color:PURPLE}, {label:'Annual Saving Yr1',val:_crore(d.aSave),sub:'vs current EMS outsourcing',color:NAVY}, ]; baseKpis.forEach(function(k,i){ var col=i%3, row=Math.floor(i/3); var x=0.3+col*4.4, y=2.26+row*2.04; s10.addShape('rect',{x:x,y:y,w:4.1,h:1.86,fill:{color:k.color},line:{color:k.color,width:0},rounding:true}); s10.addText(k.label,{x:x+0.1,y:y+0.1,w:3.9,h:0.3,fontSize:9.5,color:'AAAAAA',fontFace:'Segoe UI',align:'center'}); s10.addText(k.val,{x:x+0.06,y:y+0.4,w:3.98,h:1.0,fontSize:28,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); s10.addText(k.sub,{x:x+0.06,y:y+1.46,w:3.98,h:0.3,fontSize:8.5,color:'BBBBBB',fontFace:'Segoe UI',align:'center'}); }); var dscrOk=parseFloat(d.avgDSCR)>=1.5, irrOk=(parseFloat(d.irr)||0)>11.5; s10.addShape('rect',{x:0.3,y:6.36,w:12.7,h:0.5,fill:{color:(dscrOk&&irrOk)?GREEN:'B45309'},line:{width:0},rounding:true}); s10.addText((dscrOk&&irrOk?'✓ BANKABLE: ':'⚠ CHECK: ')+'DSCR '+d.avgDSCR+'x | IRR '+d.irr+'% | Payback '+d.pb+' months | Simple ROI: '+((d.aSave/d.capex)*100||0).toFixed(1)+'% | ROCE & Equity ROI computed in tool',{x:0.5,y:6.38,w:12.3,h:0.44,fontSize:10,bold:true,color:WHITE,fontFace:'Segoe UI',align:'center',valign:'middle'}); // ── SLIDE 11 — FINANCIAL: WITH EMS REVENUE ──────────────────────────────────── } // end slide if(selectedIds.indexOf(11)>=0){ var s11=pptx.addSlide(); s11.background={color:WHITE}; _addBranding(s11,d,false); _addTag(s11,'FINANCIAL PROJECTION — SCENARIO 2'); _addTitle(s11,'With EMS Revenue: 68% Spare Capacity Monetised','Your factory earns for others too — new income stream from Day 1'); _addSlideNum(s11,11); s11.addShape('rect',{x:0.3,y:2.26,w:12.7,h:0.66,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s11.addText('Current utilisation: '+d.smtUtil+' (single shift). Remaining 68% capacity can generate EMS revenue by assembling PCBs for other companies.',{x:0.5,y:2.30,w:12.3,h:0.58,fontSize:10,color:'333333',fontFace:'Segoe UI',valign:'middle'}); var emsCards=[ {label:'SMT Pricing',val:'30p / joint',sub:'Market rate for SMT assembly',color:NAVY}, {label:'THT Pricing',val:'20p / joint',sub:'Market rate for THT soldering',color:PURPLE}, {label:'Spare Capacity',val:'68%',sub:'Available for EMS clients',color:GREEN}, {label:'Additional DSCR',val:'Improved',sub:'EMS revenue flows into loan cover',color:GREEN}, ]; emsCards.forEach(function(c,i){ var x=0.3+i*3.22; s11.addShape('rect',{x:x,y:3.06,w:3.0,h:1.52,fill:{color:c.color},line:{color:c.color,width:0},rounding:true}); s11.addText(c.label,{x:x+0.1,y:3.1,w:2.8,h:0.3,fontSize:9,color:'AAAAAA',fontFace:'Segoe UI',align:'center'}); s11.addText(c.val,{x:x+0.06,y:3.38,w:2.88,h:0.76,fontSize:22,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); s11.addText(c.sub,{x:x+0.06,y:3.18+0.96,w:2.88,h:0.32,fontSize:8,color:'CCCCCC',fontFace:'Segoe UI',align:'center'}); }); s11.addShape('rect',{x:0.3,y:4.72,w:12.7,h:1.48,fill:{color:NAVY},line:{color:NAVY,width:0},rounding:true}); s11.addText('How EMS Revenue Works',{x:0.5,y:4.78,w:12.3,h:0.34,fontSize:12,bold:true,color:GOLD,fontFace:'Georgia'}); s11.addText([ 'Step 1: During spare capacity hours, PEPC identifies EMS clients (other manufacturers needing PCB assembly).', 'Step 2: Your line assembles their PCBs at market rates — Rs.0.30/SMT joint, Rs.0.20/THT joint.', 'Step 3: Revenue is added to your monthly cash flow, improving DSCR and shortening payback period.', 'Step 4: As your own volumes grow, EMS work reduces — the line scales with your business.', ].join('\n'),{x:0.5,y:5.14,w:12.3,h:0.98,fontSize:9.5,color:'CCCCCC',fontFace:'Segoe UI',valign:'top',paraSpaceAfter:4}); s11.addShape('rect',{x:0.3,y:6.34,w:12.7,h:0.5,fill:{color:GOLD},line:{color:GOLD,width:0},rounding:true}); s11.addText('EMS revenue turns your idle capacity into profit — making the investment even more compelling.',{x:0.5,y:6.36,w:12.3,h:0.44,fontSize:11,bold:true,color:NAVY,fontFace:'Georgia',align:'center',valign:'middle'}); // ── SLIDE 12 — FINANCIAL: 3 SCENARIOS WITH SUBSIDY ─────────────────────────── } // end slide if(selectedIds.indexOf(12)>=0){ var s12=pptx.addSlide(); s12.background={color:WHITE}; _addBranding(s12,d,false); _addTag(s12,'FINANCIAL PROJECTION — SCENARIO 3'); _addTitle(s12,'3-Scenario Comparison: Base | EMS | With Subsidy','How government subsidies transform the investment case'); _addSlideNum(s12,12); var scenHdr=[ {text:'Metric',options:{bold:true,color:WHITE,fill:{color:NAVY},fontSize:10}}, {text:'Scenario 1: Base Case\n(34 PCBs only)',options:{bold:true,color:WHITE,fill:{color:NAVY},fontSize:9,align:'center'}}, {text:'Scenario 2: + EMS Revenue\n(68% spare capacity)',options:{bold:true,color:WHITE,fill:{color:'5B21B6'},fontSize:9,align:'center'}}, {text:'Scenario 3: + Full Subsidy\n(ECMS 25% + GECMS 25%)',options:{bold:true,color:WHITE,fill:{color:GREEN},fontSize:9,align:'center'}}, ]; var metrics=[ {m:'Total Capex',v1:_crore(d.capex),v2:_crore(d.capex),v3:_crore(d.capex*0.5)+'*'}, {m:'Effective Investment',v1:_crore(d.capex),v2:_crore(d.capex),v3:_crore(d.capex*0.5)+'*'}, {m:'Payback Period',v1:d.pb+' months',v2:'Reduced',v3:'Significantly Reduced'}, {m:'IRR (10-Year)',v1:d.irr+'%',v2:'Higher',v3:'Much Higher'}, {m:'Avg DSCR (7-Year)',v1:d.avgDSCR+'x',v2:'Improved',v3:'Strongest'}, {m:'NPV @ 12%',v1:_crore(d.npv),v2:'Higher',v3:'Best'}, {m:'Annual Saving',v1:_crore(d.aSave),v2:_crore(d.aSave)+' + EMS',v3:_crore(d.aSave)+' + EMS + Subsidy'}, ]; var scRows=metrics.map(function(r,i){ var bg=i%2===0?WHITE:LIGHT; return [ {text:r.m,options:{fontSize:9.5,bold:true,color:NAVY,fill:{color:bg}}}, {text:r.v1,options:{fontSize:9.5,align:'center',fill:{color:bg}}}, {text:r.v2,options:{fontSize:9.5,align:'center',color:PURPLE,bold:true,fill:{color:bg}}}, {text:r.v3,options:{fontSize:9.5,align:'center',color:GREEN,bold:true,fill:{color:bg}}}, ]; }); s12.addTable([scenHdr].concat(scRows),{x:0.3,y:2.26,w:12.7,rowH:0.46,fontSize:9.5,border:{type:'solid',color:'DDEEFF',pt:0.5},fontFace:'Segoe UI'}); s12.addText('* Scenario 3 capex after 50% subsidy (25% Central ECMS + 25% Gujarat GECMS). See Slides 13 & 14 for subsidy details.',{x:0.3,y:5.86,w:12.7,h:0.28,fontSize:8.5,italic:true,color:'888888',fontFace:'Segoe UI',align:'center'}); s12.addShape('rect',{x:0.3,y:6.22,w:12.7,h:0.62,fill:{color:GREEN},line:{color:GREEN,width:0},rounding:true}); s12.addText('Best Case: With full subsidy, effective investment reduces by ~50% — dramatically improving all return metrics.',{x:0.5,y:6.24,w:12.3,h:0.58,fontSize:12,bold:true,color:WHITE,fontFace:'Georgia',align:'center',valign:'middle'}); // ── SLIDE 13 — CENTRAL GOVERNMENT SUBSIDY ──────────────────────────────────── } // end slide if(selectedIds.indexOf(13)>=0){ var s13=pptx.addSlide(); s13.background={color:WHITE}; _addBranding(s13,d,false); _addTag(s13,'CENTRAL GOVERNMENT SUBSIDY'); _addTitle(s13,'Central Government: ECMS Scheme','Electronics Cluster Manufacturing Scheme | 25% Capex Subsidy'); _addSlideNum(s13,13); var ecmsPoints=[ {icon:'💰',title:'25% Capex Grant',desc:'On eligible plant & machinery. Direct grant — not a loan. No repayment required.'}, {icon:'📅',title:'Window Open Now',desc:'ECMS Segment D application window open until April 2027. Apply immediately.'}, {icon:'🏛️',title:'Ministry: MeitY',desc:'Ministry of Electronics & IT, Government of India. Highest credibility scheme.'}, {icon:'🏭',title:'Eligible: Electronics Mfg',desc:'SMT/THT assembly, test equipment, inspection — all eligible under this scheme.'}, {icon:'📋',title:'Segment D — Open',desc:'Current open segment for standalone EMS and in-house manufacturing units.'}, {icon:'📈',title:'Segment C — Coming',desc:'Sales-linked incentive scheme — additional benefit on revenue milestone achievement.'}, ]; ecmsPoints.forEach(function(p,i){ var col=i%3, row=Math.floor(i/3); var x=0.3+col*4.22, y=2.26+row*1.74; s13.addShape('rect',{x:x,y:y,w:4.0,h:1.58,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s13.addText(p.icon+' '+p.title,{x:x+0.12,y:y+0.1,w:3.76,h:0.34,fontSize:10,bold:true,color:NAVY,fontFace:'Segoe UI'}); s13.addText(p.desc,{x:x+0.12,y:y+0.5,w:3.76,h:0.96,fontSize:9,color:'444444',fontFace:'Segoe UI'}); }); s13.addShape('rect',{x:0.3,y:5.8,w:12.7,h:0.72,fill:{color:NAVY},line:{color:NAVY,width:0},rounding:true}); s13.addText('ECMS Subsidy Impact on '+d.clientName+': 25% of eligible capex = Rs.'+(d.capex*0.25/10000000).toFixed(2)+' Cr subsidy',{x:0.5,y:5.82,w:12.3,h:0.36,fontSize:12,bold:true,color:GOLD,fontFace:'Georgia',align:'center'}); s13.addText('Complete ECMS & GECMS application guide document prepared by PEPC — ready for submission.',{x:0.5,y:6.18,w:12.3,h:0.28,fontSize:9.5,italic:true,color:'CCCCCC',fontFace:'Segoe UI',align:'center'}); // ── SLIDE 14 — GUJARAT SUBSIDY ──────────────────────────────────────────────── } // end slide if(selectedIds.indexOf(14)>=0){ var s14=pptx.addSlide(); s14.background={color:WHITE}; _addBranding(s14,d,false); _addTag(s14,'GUJARAT STATE SUBSIDY'); _addTitle(s14,'Gujarat Government: GECMS-2025 + Additional Benefits','25% Matching Grant + Interest + Power + EPF + SGST'); _addSlideNum(s14,14); var gujBenefits=[ {icon:'💰',title:'GECMS-2025: 25% Top-Up',desc:'100% matching of Central grant. Auto-approved with MeitY approval. Another Rs.'+(d.capex*0.25/10000000).toFixed(2)+' Cr.'}, {icon:'🏦',title:'Interest Subsidy',desc:'Up to 7% per annum on term loan. Directly reduces EMI burden and improves DSCR.'}, {icon:'⚡',title:'Power Tariff Subsidy',desc:'Rs.1 per unit on electricity consumption. Reduces per-PCB manufacturing cost.'}, {icon:'👥',title:'EPF Reimbursement',desc:'75-100% of employer EPF contribution reimbursed for 5 years. Reduces manpower cost.'}, {icon:'📊',title:'SGST Reimbursement',desc:'State GST refund on eligible purchases for approved period. Reduces working capital need.'}, {icon:'🏆',title:'Total Benefit',desc:'Central 25% + Gujarat 25% + Interest + Power + EPF + SGST = up to 50%+ effective subsidy on capex.'}, ]; gujBenefits.forEach(function(b,i){ var col=i%3, row=Math.floor(i/3); var x=0.3+col*4.22, y=2.26+row*1.74; s14.addShape('rect',{x:x,y:y,w:4.0,h:1.58,fill:{color:i===5?GOLD:LIGHT},line:{color:i===5?GOLD:'DDEEFF',width:1},rounding:true}); s14.addText(b.icon+' '+b.title,{x:x+0.12,y:y+0.1,w:3.76,h:0.34,fontSize:10,bold:true,color:i===5?NAVY:NAVY,fontFace:'Segoe UI'}); s14.addText(b.desc,{x:x+0.12,y:y+0.5,w:3.76,h:0.96,fontSize:9,color:i===5?NAVY:'444444',fontFace:'Segoe UI'}); }); s14.addShape('rect',{x:0.3,y:5.8,w:12.7,h:0.72,fill:{color:GREEN},line:{color:GREEN,width:0},rounding:true}); s14.addText('Combined Central + Gujarat subsidy: Up to Rs.'+(d.capex*0.5/10000000).toFixed(2)+' Cr reduction in effective capex for '+d.clientName,{x:0.5,y:5.82,w:12.3,h:0.36,fontSize:12,bold:true,color:WHITE,fontFace:'Georgia',align:'center'}); s14.addText('All subsidy benefits are wired into DSCR, IRR and NPV calculations in the PEPC Feasibility Tool.',{x:0.5,y:6.18,w:12.3,h:0.28,fontSize:9.5,italic:true,color:'CCCCCC',fontFace:'Segoe UI',align:'center'}); // ── SLIDE 15 — TIMELINE WITHOUT SUBSIDY ────────────────────────────────────── } // end slide if(selectedIds.indexOf(15)>=0){ var s15=pptx.addSlide(); s15.background={color:WHITE}; _addBranding(s15,d,false); _addTag(s15,'IMPLEMENTATION TIMELINE — OPTION A'); _addTitle(s15,'Timeline Without Subsidy — Start Immediately','Fastest path to production. No waiting. First board in 7 months.'); _addSlideNum(s15,15); var t1phases=[ {m:'Month 1',title:'Order Placement',desc:'Vendor finalisation, PO release for SMT & THT equipment',color:NAVY}, {m:'Month 2-3',title:'Equipment Manufacturing',desc:'P&P, Reflow, Stencil Printer manufactured at vendor facility',color:NAVY}, {m:'Month 3-4',title:'Civil & Infrastructure',desc:'ESD flooring, electrical, HVAC, DG set, compressed air',color:PURPLE}, {m:'Month 4-5',title:'Equipment Delivery',desc:'Customs clearance, logistics, incoming inspection',color:PURPLE}, {m:'Month 5-6',title:'Installation & Commissioning',desc:'Line installation, calibration, process qualification',color:GREEN}, {m:'Month 6-7',title:'Trial Production',desc:'200 boards minimum per PCB type | FPY ≥95% | Cpk ≥1.33',color:GREEN}, {m:'Month 7+',title:'Full Production Begins',desc:'All 34 PCBs in-house. Savings start from first board.',color:'0A6B35'}, ]; t1phases.forEach(function(ph,i){ var y=2.26+i*0.6; s15.addShape('rect',{x:0.3,y:y,w:1.5,h:0.52,fill:{color:ph.color},line:{color:ph.color,width:0},rounding:true}); s15.addText(ph.m,{x:0.3,y:y,w:1.5,h:0.52,fontSize:8.5,bold:true,color:WHITE,fontFace:'Segoe UI',align:'center',valign:'middle'}); s15.addShape('rect',{x:1.92,y:y+0.18,w:0.22,h:0.16,fill:{color:GOLD},line:{color:GOLD,width:0}}); s15.addShape('rect',{x:2.06,y:y,w:10.9,h:0.52,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s15.addText(ph.title,{x:2.2,y:y+0.02,w:4.0,h:0.26,fontSize:9.5,bold:true,color:NAVY,fontFace:'Segoe UI',valign:'middle'}); s15.addText(ph.desc,{x:2.2,y:y+0.28,w:10.6,h:0.22,fontSize:8.5,color:'555555',fontFace:'Segoe UI',valign:'middle'}); }); s15.addShape('rect',{x:0.3,y:6.5,w:12.7,h:0.38,fill:{color:NAVY},line:{color:NAVY,width:0},rounding:true}); s15.addText('OPTION A: No subsidy = No waiting. Equipment ordered Month 1. First board Month 7. Savings from Month 7.',{x:0.5,y:6.52,w:12.3,h:0.34,fontSize:10,bold:true,color:GOLD,fontFace:'Segoe UI',align:'center',valign:'middle'}); // ── SLIDE 16 — TIMELINE WITH SUBSIDY ───────────────────────────────────────── } // end slide if(selectedIds.indexOf(16)>=0){ var s16=pptx.addSlide(); s16.background={color:WHITE}; _addBranding(s16,d,false); _addTag(s16,'IMPLEMENTATION TIMELINE — OPTION B'); _addTitle(s16,'Timeline With Subsidy — Plan First, Save More','1 month planning. 4 months approval. Then equipment. First board Month 12.'); _addSlideNum(s16,16); var t2phases=[ {m:'Month 1',title:'Subsidy Application Preparation',desc:'PEPC prepares ECMS (Central) application — DPR, BOM, capex, employment plan',color:'B45309'}, {m:'Month 1',title:'Apply to Central Government (MeitY)',desc:'Submit ECMS Segment D application online. Application guide prepared by PEPC.',color:'B45309'}, {m:'Month 2-4',title:'Central Government Approval',desc:'MeitY processing time: ~3 months. PEPC follows up. Approval letter received.',color:PURPLE}, {m:'Month 5',title:'Gujarat Government Application',desc:'Submit GECMS-2025 application to GESIA. Auto-approval with MeitY letter.',color:PURPLE}, {m:'Month 5-6',title:'Gujarat Approval & Disbursement',desc:'Gujarat processes in ~1 month. First tranche disbursed.',color:GREEN}, {m:'Month 6-7',title:'Equipment Order Placed',desc:'With subsidy confirmed, PO released. Vendor manufacturing begins.',color:NAVY}, {m:'Month 8-10',title:'Installation & Commissioning',desc:'Equipment delivery, civil completion, installation, qualification.',color:NAVY}, {m:'Month 11-12',title:'Trial & Full Production',desc:'Trial run ≥200 boards per type. Full production begins Month 12.',color:'0A6B35'}, ]; t2phases.forEach(function(ph,i){ var y=2.18+i*0.54; s16.addShape('rect',{x:0.3,y:y,w:1.5,h:0.46,fill:{color:ph.color},line:{color:ph.color,width:0},rounding:true}); s16.addText(ph.m,{x:0.3,y:y,w:1.5,h:0.46,fontSize:8,bold:true,color:WHITE,fontFace:'Segoe UI',align:'center',valign:'middle'}); s16.addShape('rect',{x:1.92,y:y+0.15,w:0.2,h:0.14,fill:{color:GOLD},line:{color:GOLD,width:0}}); s16.addShape('rect',{x:2.06,y:y,w:10.9,h:0.46,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s16.addText(ph.title,{x:2.2,y:y+0.01,w:4.5,h:0.22,fontSize:9,bold:true,color:NAVY,fontFace:'Segoe UI',valign:'middle'}); s16.addText(ph.desc,{x:2.2,y:y+0.24,w:10.6,h:0.2,fontSize:8,color:'555555',fontFace:'Segoe UI',valign:'middle'}); }); s16.addShape('rect',{x:0.3,y:6.52,w:12.7,h:0.38,fill:{color:GREEN},line:{color:GREEN,width:0},rounding:true}); s16.addText('OPTION B: 5 months longer but ~Rs.'+(d.capex*0.5/10000000).toFixed(2)+' Cr in subsidies secured. Strongly recommended if timeline allows.',{x:0.5,y:6.54,w:12.3,h:0.34,fontSize:10,bold:true,color:WHITE,fontFace:'Segoe UI',align:'center',valign:'middle'}); // ── SLIDE 17 — MANPOWER PLAN ────────────────────────────────────────────────── } // end slide if(selectedIds.indexOf(17)>=0){ var s17=pptx.addSlide(); s17.background={color:WHITE}; _addBranding(s17,d,false); _addTag(s17,'MANPOWER PLAN'); _addTitle(s17,'Staffing Structure & Employment Plan','Category-wise headcount | Subsidy-compliant employment targets'); _addSlideNum(s17,17); var mpHdr2=[ {text:'Role',options:{bold:true,color:WHITE,fill:{color:NAVY},fontSize:9}}, {text:'Category',options:{bold:true,color:WHITE,fill:{color:NAVY},fontSize:9,align:'center'}}, {text:'Qty',options:{bold:true,color:WHITE,fill:{color:NAVY},fontSize:9,align:'center'}}, {text:'Salary/Month',options:{bold:true,color:WHITE,fill:{color:NAVY},fontSize:9,align:'center'}}, {text:'Monthly Cost',options:{bold:true,color:GOLD,fill:{color:NAVY},fontSize:9,align:'center'}}, ]; function mpN(id){var el=document.getElementById(id);return el?parseFloat(el.value)||0:0;} function mpF(n){return 'Rs.'+Math.round(n).toLocaleString('en-IN');} var mpBody2=[]; var ri2=0; try{ var c1r=getCat1Roles(); c1r.forEach(function(r,i){ var q=mpN('mp1-q-'+i)||r.qty, s=mpN('mp1-sal-'+i)||r.sal; var bg=ri2%2===0?WHITE:LIGHT; ri2++; mpBody2.push([ {text:r.role,options:{fontSize:9,color:'1A2332',fill:{color:bg}}}, {text:'Cat 1 — Production',options:{fontSize:8.5,bold:true,color:NAVY,align:'center',fill:{color:bg}}}, {text:String(q),options:{fontSize:9,align:'center',fill:{color:bg}}}, {text:mpF(s),options:{fontSize:9,align:'center',fill:{color:bg}}}, {text:mpF(q*s),options:{fontSize:9,bold:true,align:'center',color:NAVY,fill:{color:bg}}}, ]); }); }catch(e){} try{ CAT2_ROLES.forEach(function(r,i){ var q=mpN('mp2-q-'+i)||r.qty, s=mpN('mp2-sal-'+i)||r.sal; var bg=ri2%2===0?WHITE:LIGHT; ri2++; mpBody2.push([ {text:r.role,options:{fontSize:9,color:'1A2332',fill:{color:bg}}}, {text:'Cat 2 — Supervisory',options:{fontSize:8.5,bold:true,color:GREEN,align:'center',fill:{color:bg}}}, {text:String(q),options:{fontSize:9,align:'center',fill:{color:bg}}}, {text:mpF(s),options:{fontSize:9,align:'center',fill:{color:bg}}}, {text:mpF(q*s),options:{fontSize:9,bold:true,align:'center',color:GREEN,fill:{color:bg}}}, ]); }); }catch(e){} try{ CAT3_ROLES.forEach(function(r,i){ var q=mpN('mp3-q-'+i)||r.qty, s=mpN('mp3-sal-'+i)||r.sal; var bg=ri2%2===0?WHITE:LIGHT; ri2++; mpBody2.push([ {text:r.role,options:{fontSize:9,color:'1A2332',fill:{color:bg}}}, {text:'Cat 3 — Admin/Support',options:{fontSize:8.5,bold:true,color:PURPLE,align:'center',fill:{color:bg}}}, {text:String(q),options:{fontSize:9,align:'center',fill:{color:bg}}}, {text:mpF(s),options:{fontSize:9,align:'center',fill:{color:bg}}}, {text:mpF(q*s),options:{fontSize:9,bold:true,align:'center',color:PURPLE,fill:{color:bg}}}, ]); }); }catch(e){} mpBody2.push([ {text:'TOTAL MONTHLY MANPOWER COST',options:{bold:true,fontSize:9,color:WHITE,fill:{color:NAVY}}}, {text:'Total Headcount',options:{fontSize:8,align:'center',color:'CCCCCC',fill:{color:NAVY}}}, {text:String(d.mpHeadcount),options:{bold:true,fontSize:11,align:'center',color:GOLD,fill:{color:NAVY}}}, {text:'Cat1:'+d.mpCat1+' Cat2:'+d.mpCat2,options:{fontSize:8,align:'center',color:'AAAAAA',fill:{color:NAVY}}}, {text:d.mpTotal,options:{bold:true,fontSize:11,align:'center',color:GOLD,fill:{color:NAVY}}}, ]); s17.addTable([mpHdr2].concat(mpBody2),{x:0.3,y:2.26,w:12.7,rowH:0.34,fontSize:9,border:{type:'solid',color:'DDEEFF',pt:0.5},fontFace:'Segoe UI'}); s17.addShape('rect',{x:0.3,y:5.96,w:12.7,h:0.72,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s17.addText('EPF Subsidy Requirement: Female employee targets and minimum headcount thresholds apply for Central ECMS and Gujarat GECMS EPF reimbursement. PEPC to confirm specific targets from government portal.',{x:0.5,y:6.0,w:12.3,h:0.64,fontSize:9,italic:true,color:'555555',fontFace:'Segoe UI',valign:'middle'}); // ── SLIDE 18 — NEXT STEPS ───────────────────────────────────────────────────── } // end slide if(selectedIds.indexOf(18)>=0){ var s18=pptx.addSlide(); s18.background={color:NAVY}; _addBranding(s18,d,true); _addTag(s18,'NEXT STEPS'); s18.addText('Immediate Actions & Next Steps',{x:0.5,y:1.0,w:12.0,h:0.6,fontSize:30,bold:true,color:WHITE,fontFace:'Georgia'}); s18.addText(d.clientName+' | In-House SMT Line | Module 1 Complete',{x:0.5,y:1.64,w:12.0,h:0.3,fontSize:11,color:'BBBBBB',fontFace:'Segoe UI',italic:true}); var nextSteps=[ {n:'01',head:'Board Capital Approval',body:'Present this Module 1 report to '+d.clientName+' board. Total capex: '+_crore(d.capex)+'. All financial metrics confirmed bankable. DSCR '+d.avgDSCR+'x | IRR '+d.irr+'% | Payback '+d.pb+' months.'}, {n:'02',head:'Subsidy Application — Apply Now',body:'ECMS Segment D window open until April 2027. PEPC has prepared the complete application guide. Do not delay — this is a time-sensitive, non-repayable grant of up to Rs.'+(d.capex*0.5/10000000).toFixed(2)+' Cr.'}, {n:'03',head:'Module 2 — Detailed Project Report',body:'Firm vendor quotations (3 per equipment category), ICT fixture costs, PCBA process qualification, operator training plan, and confirmed go-live timeline. PEPC to lead Module 2.'}, {n:'04',head:'Contact PEPC to Proceed',body:'Mr. Parminder Singh | +91 9643353395 | singhpaarminder@gmail.com | 49A/9, D-3, Kishangarh, Vasant Kunj, New Delhi – 110036 | Jai Guru Ji 🙏'}, ]; nextSteps.forEach(function(f,i){ var y=2.1+i*1.2; s18.addText(f.n,{x:0.4,y:y,w:0.6,h:0.6,fontSize:22,bold:true,color:GOLD,fontFace:'Georgia'}); s18.addText(f.head,{x:1.1,y:y,w:11.7,h:0.34,fontSize:11,bold:true,color:WHITE,fontFace:'Segoe UI'}); s18.addText(f.body,{x:1.1,y:y+0.36,w:11.7,h:0.76,fontSize:9.5,color:'CCCCCC',fontFace:'Segoe UI'}); }); s18.addText('Jai Guru Ji 🙏',{x:0.5,y:7.0,w:12.0,h:0.28,fontSize:10,color:'888888',fontFace:'Segoe UI',align:'right'}); // ── SLIDE 19 — BOARD APPROVAL SUMMARY ──────────────────────────────────────── } // end slide if(selectedIds.indexOf(19)>=0){ var s19=pptx.addSlide(); s19.background={color:WHITE}; _addBranding(s19,d,false); _addTag(s19,'BOARD APPROVAL PACK'); _addTitle(s19,'Board Approval Summary — Module 1 Findings','Pre-Capex Feasibility Complete | All Conditions Met | Recommend Proceed'); _addSlideNum(s19,19); // Verdict box s19.addShape('rect',{x:0.3,y:2.26,w:12.7,h:0.82,fill:{color:GREEN},line:{color:GREEN,width:0},rounding:true}); s19.addText('✓ BOARD RECOMMENDATION: PROCEED WITH IN-HOUSE SMT LINE',{x:0.5,y:2.28,w:12.3,h:0.44,fontSize:16,bold:true,color:WHITE,fontFace:'Georgia',align:'center',valign:'middle'}); s19.addText('All financial metrics meet bankability thresholds. Investment is viable, profitable and subsidy-eligible.',{x:0.5,y:2.70,w:12.3,h:0.32,fontSize:10,color:'CCFFCC',fontFace:'Segoe UI',align:'center'}); // Key metrics for board var boardKpis=[ {label:'Capex',val:_crore(d.capex),sub:'Total project cost'}, {label:'Payback',val:d.pb+' Mo',sub:'From commissioning'}, {label:'IRR',val:d.irr+'%',sub:'>11.5% threshold ✓'}, {label:'DSCR',val:d.avgDSCR+'x',sub:'>1.5x bank min ✓'}, {label:'NPV',val:_crore(d.npv),sub:'Positive ✓'}, {label:'Annual Saving',val:_crore(d.aSave),sub:'Year 1 saving'}, ]; boardKpis.forEach(function(k,i){ var x=0.3+i*2.16; s19.addShape('rect',{x:x,y:3.22,w:2.0,h:1.22,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s19.addText(k.label,{x:x+0.08,y:3.26,w:1.84,h:0.26,fontSize:8.5,color:'888888',fontFace:'Segoe UI',align:'center'}); s19.addText(k.val,{x:x+0.04,y:3.50,w:1.92,h:0.52,fontSize:17,bold:true,color:NAVY,fontFace:'Georgia',align:'center',valign:'middle'}); s19.addText(k.sub,{x:x+0.04,y:4.02,w:1.92,h:0.36,fontSize:7.5,color:'888888',fontFace:'Segoe UI',align:'center'}); }); // Deliverables completed s19.addShape('rect',{x:0.3,y:4.58,w:6.18,h:1.82,fill:{color:LIGHT},line:{color:'DDEEFF',width:1},rounding:true}); s19.addText('Module 1 Deliverables — All Complete',{x:0.44,y:4.62,w:5.9,h:0.32,fontSize:10,bold:true,color:NAVY,fontFace:'Segoe UI'}); ['✅ D1 — PCB Volume & Technology Report (34 PCBs)','✅ D2 — SMT Plant High-Level Design Document','✅ D3 — Financial Model & Board Approval Pack','✅ E1-E8 — 8 Value-Add Items Beyond SOW (No Extra Charge)'].forEach(function(t,i){ s19.addText(t,{x:0.44,y:5.0+i*0.32,w:5.9,h:0.28,fontSize:9,color:'333333',fontFace:'Segoe UI'}); }); // Ref + sign-off s19.addShape('rect',{x:6.66,y:4.58,w:6.34,h:1.82,fill:{color:NAVY},line:{color:NAVY,width:0},rounding:true}); s19.addText('Reference: '+d.refNo,{x:6.82,y:4.64,w:6.0,h:0.3,fontSize:10,bold:true,color:GOLD,fontFace:'Segoe UI'}); s19.addText('Prepared by: '+d.coName,{x:6.82,y:4.96,w:6.0,h:0.26,fontSize:9,color:'CCCCCC',fontFace:'Segoe UI'}); s19.addText('Date: '+d.dateStr,{x:6.82,y:5.22,w:6.0,h:0.26,fontSize:9,color:'CCCCCC',fontFace:'Segoe UI'}); s19.addText('Payment 2 (Rs.2,50,000) + Milestone Bonus (Rs.1,00,000)\nconditions fully met per signed checklist.',{x:6.82,y:5.52,w:6.0,h:0.56,fontSize:9,color:'AAFFAA',fontFace:'Segoe UI'}); s19.addShape('rect',{x:0.3,y:6.54,w:12.7,h:0.36,fill:{color:GOLD},line:{color:GOLD,width:0},rounding:true}); s19.addText(d.coName+' | '+d.refNo+' | '+d.dateStr+' | Jai Guru Ji 🙏',{x:0.5,y:6.56,w:12.3,h:0.32,fontSize:9.5,bold:true,color:NAVY,fontFace:'Segoe UI',align:'center',valign:'middle'}); } // end slide 19 return pptx; } function _buildStyle2(d){ var pptx=new PptxGenJS(); pptx.layout='LAYOUT_WIDE'; pptx.author=d.coName; pptx.title='SMT Feasibility — Executive Summary | '+d.clientName; var NAVY='1E3A5F', GOLD='C8961E', WHITE='FFFFFF', LIGHT='F4F7FC', GREEN='0A6B35'; // S2-1 Title var s1=pptx.addSlide(); s1.background={color:NAVY}; _addBranding(s1,d,true); s1.addText('Prepared for',{x:0.5,y:1.1,w:12,h:0.3,fontSize:11,color:'AAAAAA',fontFace:'Segoe UI',italic:true}); s1.addText(d.clientName.toUpperCase(),{x:0.5,y:1.42,w:12,h:0.6,fontSize:24,bold:true,color:GOLD,fontFace:'Georgia'}); s1.addText('IN-HOUSE SMT\nFEASIBILITY',{x:0.5,y:2.06,w:12,h:2.2,fontSize:60,bold:true,color:WHITE,fontFace:'Georgia',lineSpacingMultiple:1.0}); s1.addShape('rect',{x:0.5,y:4.34,w:12,h:0.05,fill:{color:GOLD},line:{color:GOLD,width:0}}); s1.addText('Module 1 — Executive Deck | '+d.refNo+' | '+d.dateStr,{x:0.5,y:4.44,w:12,h:0.3,fontSize:11,color:'BBBBBB',fontFace:'Segoe UI'}); s1.addText('Your Savings. Our Strategy. Your Success. | Jai Guru Ji 🙏',{x:0.5,y:4.82,w:12,h:0.32,fontSize:12,italic:true,color:GOLD,fontFace:'Georgia'}); // S2-2 The Opportunity var s2=pptx.addSlide(); s2.background={color:WHITE}; _addBranding(s2,d,false); _addSlideNum(s2,2); s2.addText('The Opportunity',{x:0.5,y:1.0,w:12,h:0.8,fontSize:38,bold:true,color:NAVY,fontFace:'Georgia'}); s2.addShape('rect',{x:0.5,y:1.88,w:12,h:0.06,fill:{color:GOLD},line:{color:GOLD,width:0}}); s2.addText(_crore(d.aSave),{x:0.5,y:2.1,w:12,h:1.8,fontSize:80,bold:true,color:NAVY,fontFace:'Georgia',align:'center'}); s2.addText('SAVED EVERY YEAR',{x:0.5,y:3.96,w:12,h:0.5,fontSize:18,bold:true,color:GOLD,fontFace:'Georgia',align:'center'}); s2.addText('by bringing PCB manufacturing in-house instead of outsourcing to EMS',{x:0.5,y:4.56,w:12,h:0.4,fontSize:13,color:'666666',fontFace:'Segoe UI',align:'center'}); s2.addShape('rect',{x:2.0,y:5.2,w:9,h:0.72,fill:{color:NAVY},line:{color:NAVY,width:0},rounding:true}); s2.addText('Investment: '+_crore(d.capex)+' | Payback: '+d.pb+' months | IRR: '+d.irr+'% | DSCR: '+d.avgDSCR+'x',{x:2.1,y:5.22,w:8.8,h:0.66,fontSize:12,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); // S2-3 Why In-House var s3=pptx.addSlide(); s3.background={color:NAVY}; _addBranding(s3,d,true); _addSlideNum(s3,3); s3.addText('10 Reasons to Go In-House',{x:0.5,y:0.9,w:12,h:0.7,fontSize:32,bold:true,color:WHITE,fontFace:'Georgia'}); s3.addShape('rect',{x:0.5,y:1.66,w:12,h:0.06,fill:{color:GOLD},line:{color:GOLD,width:0}}); var r10=['💰 Cost Savings: '+_crore(d.aSave)+'/year','🔒 IP Protection','⚡ 24-48hr Lead Time','🎯 Quality Control','📈 Scale on Demand','🏭 EMS Revenue (68% spare)','🔧 Process Mastery','🛡️ Supply Security','🏅 Subsidy Eligible (up to 50%)','💼 Brand Credibility']; r10.forEach(function(t,i){ var col=i%2, row=Math.floor(i/2); var x=col===0?0.5:6.9, y=1.9+row*0.94; s3.addShape('rect',{x:x,y:y,w:6.0,h:0.8,fill:{color:'162B47'},line:{color:'2A4A6F',width:1},rounding:true}); s3.addText(t,{x:x+0.16,y:y,w:5.68,h:0.8,fontSize:11,bold:true,color:WHITE,fontFace:'Segoe UI',valign:'middle'}); }); // S2-4 PCB Savings var s4=pptx.addSlide(); s4.background={color:WHITE}; _addBranding(s4,d,false); _addSlideNum(s4,4); s4.addText('Every PCB — Cheaper In-House',{x:0.5,y:0.9,w:12,h:0.7,fontSize:32,bold:true,color:NAVY,fontFace:'Georgia'}); s4.addShape('rect',{x:0.5,y:1.66,w:12,h:0.06,fill:{color:GOLD},line:{color:GOLD,width:0}}); var savRow2=[ {label:'EMS Weighted Avg',val:d.wtdOut?'Rs.'+d.wtdOut.toFixed(2):'--',sub:'per PCB',color:'B45309'}, {label:'In-House Weighted Avg',val:d.wtdInh?'Rs.'+d.wtdInh.toFixed(2):'--',sub:'per PCB',color:GREEN}, {label:'Saving per PCB',val:d.wtdInh&&d.wtdOut?'Rs.'+(d.wtdOut-d.wtdInh).toFixed(2):'--',sub:'per board',color:NAVY}, {label:'Monthly Saving',val:_crore(d.cpjRows.reduce(function(s,r){return s+(r.msave||0);},0)),sub:'every month',color:'5B21B6'}, ]; savRow2.forEach(function(k,i){ var x=0.3+i*3.22; s4.addShape('rect',{x:x,y:1.9,w:3.0,h:2.0,fill:{color:k.color},line:{color:k.color,width:0},rounding:true}); s4.addText(k.label,{x:x+0.1,y:2.0,w:2.8,h:0.3,fontSize:9,color:'AAAAAA',fontFace:'Segoe UI',align:'center'}); s4.addText(k.val,{x:x+0.06,y:2.3,w:2.88,h:1.1,fontSize:26,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); s4.addText(k.sub,{x:x+0.06,y:3.4,w:2.88,h:0.38,fontSize:9,color:'CCCCCC',fontFace:'Segoe UI',align:'center'}); }); s4.addText(_crore(d.aSave)+' ANNUAL SAVING — '+d.pcbs.length+' PCBs | '+d.totVol.toLocaleString('en-IN')+' boards/month',{x:0.3,y:4.18,w:12.7,h:0.58,fontSize:16,bold:true,color:NAVY,fontFace:'Georgia',align:'center',valign:'middle'}); // S2-5 Investment var s5=pptx.addSlide(); s5.background={color:NAVY}; _addBranding(s5,d,true); _addSlideNum(s5,5); s5.addText('The Investment',{x:0.5,y:0.9,w:12,h:0.7,fontSize:38,bold:true,color:WHITE,fontFace:'Georgia'}); s5.addShape('rect',{x:0.5,y:1.66,w:12,h:0.06,fill:{color:GOLD},line:{color:GOLD,width:0}}); s5.addText(_crore(d.capex),{x:0.5,y:1.86,w:12,h:2.0,fontSize:80,bold:true,color:GOLD,fontFace:'Georgia',align:'center'}); s5.addText('TOTAL PROJECT CAPEX',{x:0.5,y:3.9,w:12,h:0.44,fontSize:16,bold:true,color:WHITE,fontFace:'Georgia',align:'center'}); s5.addText('SMT: '+_crore(d.smtCapex)+' | THT & Test: '+_crore(d.thtCapex)+' | Civil & Utilities: Est. | 15% Contingency: Included',{x:0.5,y:4.46,w:12,h:0.36,fontSize:10,color:'AAAAAA',fontFace:'Segoe UI',align:'center'}); s5.addText('27 world-class equipment items | Accuracy: ±20% | Firm quotes in Module 2',{x:0.5,y:4.88,w:12,h:0.3,fontSize:10,italic:true,color:'888888',fontFace:'Segoe UI',align:'center'}); var invKpis2=[{l:'KW Load',v:d.kwLoad},{l:'DG Set',v:d.dgKVA+' KVA'},{l:'AC Required',v:d.acTons+' Tons'},{l:'Space',v:d.spaceReq}]; invKpis2.forEach(function(k,i){ var x=0.5+i*3.3; s5.addShape('rect',{x:x,y:5.34,w:3.0,h:0.9,fill:{color:'162B47'},line:{color:'2A4A6F',width:1},rounding:true}); s5.addText(k.l,{x:x+0.1,y:5.38,w:2.8,h:0.28,fontSize:8.5,color:'AAAAAA',fontFace:'Segoe UI',align:'center'}); s5.addText(k.v,{x:x+0.1,y:5.64,w:2.8,h:0.52,fontSize:16,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); }); // S2-6 Returns var s6=pptx.addSlide(); s6.background={color:WHITE}; _addBranding(s6,d,false); _addSlideNum(s6,6); s6.addText('The Returns',{x:0.5,y:0.9,w:12,h:0.7,fontSize:38,bold:true,color:NAVY,fontFace:'Georgia'}); s6.addShape('rect',{x:0.5,y:1.66,w:12,h:0.06,fill:{color:GOLD},line:{color:GOLD,width:0}}); var retKpis=[ {l:'Payback',v:d.pb+' Months',s:'From commissioning',c:NAVY}, {l:'IRR',v:d.irr+'%',s:'10-Year | >11.5% ✓',c:GREEN}, {l:'DSCR',v:d.avgDSCR+'x',s:'7-Yr Avg | >1.5x ✓',c:GREEN}, {l:'NPV @ 12%',v:_crore(d.npv),s:'10-Year horizon',c:'5B21B6'}, ]; retKpis.forEach(function(k,i){ var x=0.3+i*3.22; s6.addShape('rect',{x:x,y:1.9,w:3.0,h:2.3,fill:{color:k.c},line:{color:k.c,width:0},rounding:true}); s6.addText(k.l,{x:x+0.1,y:2.0,w:2.8,h:0.3,fontSize:10,color:'AAAAAA',fontFace:'Segoe UI',align:'center'}); s6.addText(k.v,{x:x+0.06,y:2.3,w:2.88,h:1.3,fontSize:30,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); s6.addText(k.s,{x:x+0.06,y:3.62,w:2.88,h:0.44,fontSize:9,color:'CCCCCC',fontFace:'Segoe UI',align:'center'}); }); s6.addShape('rect',{x:0.3,y:4.38,w:12.7,h:0.64,fill:{color:GREEN},line:{color:GREEN,width:0},rounding:true}); s6.addText('✓ BANKABLE: All metrics pass. DSCR '+d.avgDSCR+'x | IRR '+d.irr+'% | Payback '+d.pb+' months',{x:0.5,y:4.4,w:12.3,h:0.6,fontSize:14,bold:true,color:WHITE,fontFace:'Georgia',align:'center',valign:'middle'}); s6.addText('With full subsidy (50% capex reduction): All metrics improve dramatically. See detailed report.',{x:0.5,y:5.14,w:12.3,h:0.32,fontSize:10,italic:true,color:'666666',fontFace:'Segoe UI',align:'center'}); // S2-7 Subsidy var s7=pptx.addSlide(); s7.background={color:NAVY}; _addBranding(s7,d,true); _addSlideNum(s7,7); s7.addText('Government Subsidy',{x:0.5,y:0.9,w:12,h:0.7,fontSize:38,bold:true,color:WHITE,fontFace:'Georgia'}); s7.addShape('rect',{x:0.5,y:1.66,w:12,h:0.06,fill:{color:GOLD},line:{color:GOLD,width:0}}); s7.addText('Up to 50% of capex — non-repayable grants',{x:0.5,y:1.82,w:12,h:0.38,fontSize:13,color:'CCCCCC',fontFace:'Segoe UI',align:'center'}); var subBoxes=[ {t:'Central: ECMS\nSegment D',v:'25%\nCapex Grant',sub:'Ministry of Electronics & IT\nWindow open — Apply now',c:'1A4B8C'}, {t:'Gujarat: GECMS-2025',v:'25%\nTop-Up',sub:'Auto-approved with MeitY\nAnother 25% on same capex',c:'2D6A4F'}, {t:'Interest Subsidy',v:'Up to 7%\nPer Annum',sub:'On term loan\nReduces EMI burden',c:'5B21B6'}, {t:'Power + EPF + SGST',v:'Additional\nBenefits',sub:'Rs.1/unit power + EPF 75-100%\n+ SGST reimbursement',c:'B45309'}, ]; subBoxes.forEach(function(b,i){ var x=0.3+i*3.22; s7.addShape('rect',{x:x,y:2.3,w:3.0,h:3.6,fill:{color:b.c},line:{color:b.c,width:0},rounding:true}); s7.addText(b.t,{x:x+0.1,y:2.44,w:2.8,h:0.52,fontSize:9.5,bold:true,color:WHITE,fontFace:'Segoe UI',align:'center'}); s7.addText(b.v,{x:x+0.06,y:2.98,w:2.88,h:1.4,fontSize:28,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); s7.addText(b.sub,{x:x+0.1,y:4.46,w:2.8,h:0.8,fontSize:8.5,color:'CCCCCC',fontFace:'Segoe UI',align:'center'}); }); s7.addShape('rect',{x:0.3,y:6.04,w:12.7,h:0.58,fill:{color:GOLD},line:{color:GOLD,width:0},rounding:true}); s7.addText('Total Subsidy for '+d.clientName+': Up to Rs.'+(d.capex*0.5/10000000).toFixed(2)+' Cr — Non-repayable. Apply now.',{x:0.5,y:6.06,w:12.3,h:0.54,fontSize:14,bold:true,color:NAVY,fontFace:'Georgia',align:'center',valign:'middle'}); // S2-8 Timeline var s8=pptx.addSlide(); s8.background={color:WHITE}; _addBranding(s8,d,false); _addSlideNum(s8,8); s8.addText('Go-Live in 7 Months',{x:0.5,y:0.9,w:12,h:0.7,fontSize:38,bold:true,color:NAVY,fontFace:'Georgia'}); s8.addShape('rect',{x:0.5,y:1.66,w:12,h:0.06,fill:{color:GOLD},line:{color:GOLD,width:0}}); s8.addText('Without subsidy: Start today → First board Month 7 | With subsidy: Plan Month 1 → First board Month 12 but save Rs.'+(d.capex*0.5/10000000).toFixed(2)+' Cr',{x:0.3,y:1.82,w:12.7,h:0.36,fontSize:10,color:'666666',fontFace:'Segoe UI',align:'center'}); var tlSteps=[{m:'M1',t:'Order / Apply'},{m:'M2-4',t:'Equipment Mfg'},{m:'M4-5',t:'Civil Work'},{m:'M5-6',t:'Install'},{m:'M6-7',t:'Trial Run'},{m:'M7+',t:'PRODUCTION'}]; tlSteps.forEach(function(st,i){ var x=0.5+i*2.16; var isLast=i===tlSteps.length-1; s8.addShape('rect',{x:x,y:2.36,w:2.0,h:0.74,fill:{color:isLast?GREEN:NAVY},line:{color:isLast?GREEN:NAVY,width:0},rounding:true}); s8.addText(st.m,{x:x,y:2.36,w:2.0,h:0.36,fontSize:10,bold:true,color:GOLD,fontFace:'Georgia',align:'center',valign:'middle'}); s8.addText(st.t,{x:x,y:2.72,w:2.0,h:0.36,fontSize:8.5,bold:true,color:WHITE,fontFace:'Segoe UI',align:'center',valign:'middle'}); if(i' +''; list.appendChild(div); }); pptUpdateCount(); } function pptUpdateCount(){ var total=SLIDE_DEFS.length; var checked=SLIDE_DEFS.filter(function(s){ var el=document.getElementById('ppt-s'+s.id); return el&&el.checked; }).length; var lbl=document.getElementById('ppt-count-label'); if(lbl) lbl.textContent=checked+' of '+total+' selected'; var all=document.getElementById('ppt-select-all'); if(all) all.checked=(checked===total); } function pptToggleAll(v){ SLIDE_DEFS.forEach(function(s){ var el=document.getElementById('ppt-s'+s.id); if(el&&!el.disabled) el.checked=v; }); pptUpdateCount(); } function applyPreset(preset){ var sel=SLIDE_PRESETS[preset]||[]; SLIDE_DEFS.forEach(function(s){ var el=document.getElementById('ppt-s'+s.id); if(el&&!el.disabled) el.checked=(sel.indexOf(s.id)>=0); }); pptUpdateCount(); } function openPPTPanel(){ calcAll(); var panel=document.getElementById('ppt-panel'); if(panel){panel.style.display='flex';_buildPPTSlideList();} } function closePPTPanel(){ var panel=document.getElementById('ppt-panel'); if(panel) panel.style.display='none'; } function doGeneratePPT(){ var selectedIds=SLIDE_DEFS.filter(function(s){ var el=document.getElementById('ppt-s'+s.id); return el&&el.checked; }).map(function(s){return s.id;}); if(selectedIds.length===0){alert('Please select at least one slide.');return;} var st=document.getElementById('ppt-panel-status'); if(st){st.style.display='block';st.textContent='⏳ Loading library...';} if(window.PptxGenJS){_doGeneratePPTNow(selectedIds);} else{ var scr=document.createElement('script'); scr.src='https://cdn.jsdelivr.net/npm/pptxgenjs@3.12.0/dist/pptxgen.bundle.js'; scr.onload=function(){setTimeout(function(){_doGeneratePPTNow(selectedIds);},300);}; document.head.appendChild(scr); } } function _doGeneratePPTNow(selectedIds){ var st=document.getElementById('ppt-panel-status'); if(st) st.textContent='⏳ Building slides...'; try{ var d=_getPPTData(); var pptx=_buildStyle1(d,selectedIds); var clientSlug=(d.clientName||'Client').replace(/[^a-zA-Z0-9]/g,'_').substring(0,20); var dateSlug=new Date().toISOString().slice(0,10).replace(/-/g,''); pptx.writeFile({fileName:'PEPC_Feasibility_'+clientSlug+'_'+dateSlug+'.pptx'}); if(st) st.textContent='✅ Downloaded! Check your Downloads folder. ('+selectedIds.length+' slides | '+d.pcbs.length+' PCBs | Capex: '+_crore(d.capex)+')'; setTimeout(function(){closePPTPanel();pptStatus('✅ PPT downloaded — '+selectedIds.length+' slides');},1500); }catch(err){ if(st) st.textContent='❌ Error: '+err.message; console.error('PPT error:',err); } } function _doPPT(which){ try { pptStatus('⏳ Step 3/3 — Building slides…'); var d=_getPPTData(); var clientSlug=(d.clientName||'Client').replace(/[^a-zA-Z0-9]/g,'_').substring(0,20); var dateSlug=new Date().toISOString().slice(0,10); if(which==='style1'||which==='both'){ pptStatus('⏳ Building Style 1 (Consultant Report) — '+d.pcbs.length+' PCBs, Capex '+_crore(d.capex)+'…'); var ppt1=_buildStyle1(d); ppt1.writeFile({fileName:'PEPC_Feasibility_'+clientSlug+'_ConsultantReport_'+dateSlug+'.pptx'}); if(which!=='both') pptStatus('✅ Style 1 downloaded! Check your Downloads folder. ('+d.pcbs.length+' PCBs | Capex: '+_crore(d.capex)+' | IRR: '+d.irr+'% | Payback: '+d.pb+' months)'); } if(which==='style2'||which==='both'){ setTimeout(function(){ pptStatus('⏳ Building Style 2 (Executive Deck)…'); var ppt2=_buildStyle2(d); ppt2.writeFile({fileName:'PEPC_Feasibility_'+clientSlug+'_ExecutiveDeck_'+dateSlug+'.pptx'}); pptStatus('✅ Both presentations downloaded! Check your Downloads folder. ('+d.pcbs.length+' PCBs | Capex: '+_crore(d.capex)+' | IRR: '+d.irr+'% | Payback: '+d.pb+' months)'); }, which==='both'?1400:0); } } catch(err){ pptStatus('❌ Error: '+err.message+'. Please complete all sections (SMT, THT, Infrastructure, Finance) before generating PPT.'); console.error('PPT generation error:',err); } }
'); win.document.close(); win.focus(); setTimeout(function(){ win.print(); }, 600); }; window.rlsExportPPT = function(){ if(!_rlsLastResult){ alert('Run simulation first, then export to PPT.'); return; } rlsStatus('⏳ Loading PptxGenJS…'); function doExport(){ try { var pptx = new PptxGenJS(); pptx.layout = 'LAYOUT_WIDE'; var r = _rlsLastResult; var clientName = (document.getElementById('p-client')||{}).value||'Client'; var dateStr = new Date().toLocaleDateString('en-IN',{day:'2-digit',month:'long',year:'numeric'}); var slide1 = pptx.addSlide(); slide1.background = {color:'0d2044'}; slide1.addText('Real-Time Line Simulation', {x:0.4,y:0.3,w:12,h:0.6,fontSize:28,bold:true,color:'e8a800',fontFace:'Georgia'}); slide1.addText(clientName+' · '+dateStr, {x:0.4,y:0.95,w:12,h:0.35,fontSize:13,color:'ffffff',transparency:30}); var kpis=[ {label:'Effective Total Days', val:r.totalDays.toFixed(1), color:'FFE000'}, {label:'Sequential Days', val:r.seqDays.toFixed(1), color:'FF6B6B'}, {label:'Days Saved', val:r.saving.toFixed(1), color:'4ECDC4'} ]; kpis.forEach(function(k,i){ var x = 0.4 + i*4.2; slide1.addShape(pptx.ShapeType.rect,{x:x,y:1.4,w:3.8,h:1.6,fill:{color:'163060'},line:{color:'e8a800',pt:1}}); slide1.addText(k.val,{x:x,y:1.55,w:3.8,h:0.8,fontSize:36,bold:true,color:k.color,align:'center'}); slide1.addText(k.label,{x:x,y:2.3,w:3.8,h:0.4,fontSize:10,color:'ffffff',align:'center',transparency:20}); }); slide1.addText('Process Timeline',{x:0.4,y:3.2,w:12,h:0.35,fontSize:14,bold:true,color:'e8a800'}); var tblRows=[ [{text:'Process',options:{bold:true,color:'ffffff',fill:'1e3a5f'}}, {text:'Start Day',options:{bold:true,color:'ffffff',fill:'1e3a5f'}}, {text:'End Day',options:{bold:true,color:'ffffff',fill:'1e3a5f'}}, {text:'Work Days',options:{bold:true,color:'ffffff',fill:'1e3a5f'}}, {text:'Shifts',options:{bold:true,color:'ffffff',fill:'1e3a5f'}}] ]; r.procResults.forEach(function(pr){ tblRows.push([ {text:pr.proc.label.replace(/[^\x00-\x7F]/g,'').trim()}, {text:pr.startDay.toFixed(1)}, {text:pr.endDay.toFixed(1)}, {text:pr.baseDays.toFixed(1)}, {text:String(pr.shifts)} ]); }); slide1.addTable(tblRows,{x:0.4,y:3.6,w:12.2,h:2.6,fontSize:11,border:{pt:0.5,color:'e5e7eb'}, colW:[3.5,2,2,2,2]}); var slide2 = pptx.addSlide(); slide2.background = {color:'ffffff'}; slide2.addText('Parallel Production Gantt',{x:0.4,y:0.2,w:12,h:0.5,fontSize:22,bold:true,color:'0d2044',fontFace:'Georgia'}); slide2.addText(clientName+' · Effective: '+r.totalDays.toFixed(1)+' days',{x:0.4,y:0.72,w:12,h:0.3,fontSize:11,color:'6b7280'}); var maxDay = Math.ceil(r.totalDays)+1; var ganttX=0.4, ganttY=1.15, ganttW=12.2, ganttH=3.8; var procH = ganttH / r.procResults.length; var dayW2 = ganttW / maxDay; var colors={'smt':'378ADD','tht':'D85A30','ict':'1D9E75','func':'BA7517','pack':'7F77DD'}; for(var d=1;d<=maxDay;d++){ var x2=ganttX+d*dayW2; slide2.addShape(pptx.ShapeType.line,{x:x2,y:ganttY,w:0,h:ganttH,line:{color:'e5e7eb',pt:0.5}}); if(d<=maxDay) slide2.addText(String(d),{x:x2-dayW2/2,y:ganttY+ganttH+0.05,w:dayW2,h:0.2,fontSize:7,color:'9ca3af',align:'center'}); } r.procResults.forEach(function(pr,i){ var y2=ganttY+i*procH; var col=colors[pr.proc.key]||'1e3a5f'; var barX=ganttX+pr.startDay*dayW2; var barW=(pr.endDay-pr.startDay)*dayW2; slide2.addShape(pptx.ShapeType.rect,{x:barX,y:y2+0.05,w:barW,h:procH-0.1, fill:{color:col},line:{color:col,pt:0},rounding:true}); slide2.addText(pr.proc.label.replace(/[^\x00-\x7F]/g,'').trim(), {x:ganttX,y:y2+procH/2-0.12,w:0.4,h:0.25,fontSize:7,color:col,bold:true,align:'right'}); }); pptx.writeFile({fileName:'PEPC_LineSimulation_'+clientName.replace(/\s/g,'_')+'.pptx'}); rlsStatus('✓ PPT exported!'); } catch(e){ console.error('RLS PPT:',e); rlsStatus('⚠ PPT error: '+e.message); } } if(typeof PptxGenJS==='undefined'){ var s=document.createElement('script'); s.src='https://cdn.jsdelivr.net/npm/pptxgenjs@3.12.0/dist/pptxgen.bundle.js'; s.onload=function(){ setTimeout(doExport,300); }; s.onerror=function(){ rlsStatus('❌ Could not load PptxGenJS — check internet.'); }; document.head.appendChild(s); } else { doExport(); } }; var _rlsPcbList = []; window.rlsSwitchTab = function(tab){ var raw = document.getElementById('rls-view-raw'); var pcb = document.getElementById('rls-view-pcb'); var tbR = document.getElementById('rls-tab-raw'); var tbP = document.getElementById('rls-tab-pcb'); if(tab==='raw'){ if(raw) raw.style.display='block'; if(pcb) pcb.style.display='none'; if(tbR){ tbR.style.borderBottomColor='#0d2044'; tbR.style.color='#0d2044'; tbR.style.fontWeight='700'; } if(tbP){ tbP.style.borderBottomColor='transparent'; tbP.style.color='#6b7280'; tbP.style.fontWeight='600'; } } else { if(raw) raw.style.display='none'; if(pcb) pcb.style.display='block'; if(tbP){ tbP.style.borderBottomColor='#0d2044'; tbP.style.color='#0d2044'; tbP.style.fontWeight='700'; } if(tbR){ tbR.style.borderBottomColor='transparent'; tbR.style.color='#6b7280'; tbR.style.fontWeight='600'; } rlsPcbLoadPCBs(); } }; window.rlsPcbLoadPCBs = function(){ try{ if(typeof calcSMT==='function') calcSMT(); }catch(e){} try{ if(typeof calcTHT==='function') calcTHT(); }catch(e){} var pcbArr=[]; if(typeof S!=='undefined'&&S&&S.pcbs){ Object.keys(S.pcbs).forEach(function(idStr){ var id=parseInt(idStr); var sp=S.pcbs[id]; if(!sp) return; var sv=sp.vals||{}; var mx=sp.matrix||{}; function svn(k){ var el=document.getElementById(k); if(el&&el.value!==''&&el.value!==null) return parseFloat(el.value)||0; return parseFloat(sv[k])||0; } var name=sp.name||sv['pn-'+id]||('PCB '+id); var vol=svn('pv-'+id); if(!vol){ var pvEl=document.getElementById('pv-'+id); if(pvEl) vol=parseFloat(pvEl.value)||0; } if(!vol){ document.querySelectorAll('input[onchange*="sowSetVolume('+id+',"]').forEach(function(inp){ if(!vol) vol=parseFloat(inp.value)||0; }); } if(vol>0 && !svn('pv-'+id)){ if(!sp.vals) sp.vals={}; sp.vals['pv-'+id]=String(vol); } if(!vol&&!name) return; var std=svn('ps-'+id),lg=svn('plg-'+id); var fp=0,bga=0; for(var i=0;i<5;i++){fp+=svn('pfp-'+id+'-'+i+'-qty');bga+=svn('pbga-'+id+'-'+i+'-qty');} var std2=svn('ps2-'+id),lg2=svn('plg2-'+id); var fp2=0,bga2=0; for(var i=0;i<5;i++){fp2+=svn('pfp2-'+id+'-'+i+'-qty');bga2+=svn('pbga2-'+id+'-'+i+'-qty');} var thtTotal=0; ['axial','radial','trans','con16','con6','choke','mov','other'].forEach(function(f){ thtTotal+=svn('ptht-'+f+'-'+id)+svn('ptht-'+f+'2-'+id); }); var thtStored=parseFloat(sv['ptht-total-'+id])||0; if(thtStored>thtTotal) thtTotal=thtStored; var hasSMTA=!!(mx.smtA)||(std+fp+bga+lg>0); var hasSideB=!!(mx.smtB)||(std2+fp2+bga2+lg2>0); var hasTHTA=!!(mx.thA)||(thtTotal>0); var hasICT=!!(sp.common&&sp.common.ict&&sp.common.ict.on); var hasFunc=!!(sp.common&&sp.common.func&&sp.common.func.on); var hasBurnin=!!(sp.common&&sp.common.burnin&&sp.common.burnin.on); ['smta','smtb','ict','func'].forEach(function(k){ var el=document.getElementById('pr-'+k+'-'+id); if(el){ if(k==='smta') hasSMTA=hasSMTA||el.checked; if(k==='smtb') hasSideB=hasSideB||el.checked; if(k==='ict') hasICT=hasICT||el.checked; if(k==='func') hasFunc=hasFunc||el.checked; } }); pcbArr.push({id:id,name:name,vol:vol, std:std,fp:fp,bga:bga,lg:lg,std2:std2,fp2:fp2,bga2:bga2,lg2:lg2, smtTot:std+fp+bga+lg+std2+fp2+bga2+lg2,tht:thtTotal, hasSMTA:hasSMTA,hasSideB:hasSideB,hasTHTA:hasTHTA, hasICT:hasICT,hasFunc:hasFunc,hasBurnin:hasBurnin}); }); } if(typeof getPCBs==='function'){ getPCBs().forEach(function(p){ var ex=pcbArr.find(function(x){return x.id==p.id;}); if(!ex) pcbArr.push(p); else if(p.vol>0&&!ex.vol) ex.vol=p.vol; }); } pcbArr=pcbArr.filter(function(p){return p.vol>0||p.smtTot>0||p.tht>0;}); pcbArr.sort(function(a,b){return a.id-b.id;}); if(!pcbArr.length){ var tbl=document.getElementById('rls-pcb-priority-table'); if(tbl) tbl.innerHTML='
No PCBs found. Fill in Scope of Work and PCB Profile first.
'; return; } var existMap={}; _rlsPcbList.forEach(function(p){existMap[p.id]=p;}); _rlsPcbList=pcbArr.map(function(p,i){ var ex=existMap[p.id]; var merged={}; Object.keys(p).forEach(function(k){merged[k]=p[k];}); merged.priority=ex?ex.priority:(i+1); merged.note=ex?ex.note:''; return merged; }); _rlsPcbList.sort(function(a,b){return a.priority-b.priority;}); rlsPcbRenderTable(); }; function rlsPcbRenderTable(){ var el = document.getElementById('rls-pcb-priority-table'); if(!el) return; var html = ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; _rlsPcbList.forEach(function(p,i){ var procBadges = ''; if(p.hasSMT||p.smtTot>0) procBadges+='SMT'; if(p.hasTHT||p.tht>0) procBadges+='THT'; if(p.hasICT) procBadges+='ICT'; if(p.hasFunc) procBadges+='Func'; if(p.hasBurnin) procBadges+='Burn-in'; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; }); html += '
PriorityPCB NameVolumeSMT CompsTHT CompsProcessesNote / Reason
' + ''+p.name+''+p.vol.toLocaleString('en-IN')+''+(p.smtTot||'—')+''+(p.tht||'—')+''+procBadges+'' + '
'; el.innerHTML = html; } window.rlsPcbSetPriority = function(id, val){ var p = _rlsPcbList.find(function(x){ return x.id==id; }); if(p) p.priority = parseInt(val)||1; _rlsPcbList.sort(function(a,b){ return a.priority-b.priority; }); }; window.rlsPcbSetNote = function(id, val){ var p = _rlsPcbList.find(function(x){ return x.id==id; }); if(p) p.note = val; }; window.rlsPcbAutoSort = function(){ _rlsPcbList.sort(function(a,b){ return (a.tht||0)-(b.tht||0); }); _rlsPcbList.forEach(function(p,i){ p.priority=i+1; }); rlsPcbRenderTable(); }; window.rlsPcbAutoSortVol = function(){ _rlsPcbList.sort(function(a,b){ return (b.vol||0)-(a.vol||0); }); _rlsPcbList.forEach(function(p,i){ p.priority=i+1; }); rlsPcbRenderTable(); }; window.rlsPcbGenerate = function(){ var statusEl = document.getElementById('rls-pcb-status'); if(statusEl) statusEl.textContent = 'Reading data...'; try{ if(typeof calcSMT==='function') calcSMT(); }catch(e){} try{ if(typeof calcTHT==='function') calcTHT(); }catch(e){} if(!_rlsPcbList.length){ rlsPcbLoadPCBs(); } if(!_rlsPcbList.length){ if(statusEl) statusEl.textContent = 'No PCBs found. Visit PCB Profile first.'; return; } try{ var sorted = _rlsPcbList.slice().sort(function(a,b){ return a.priority-b.priority; }); var smtHrs = parseFloat((document.getElementById('smt-hrs')||{}).value)||8.5; var thtHrs = parseFloat((document.getElementById('tht-hrs')||{}).value)||8.5; var cph = parseFloat((document.getElementById('smt-cph')||{}).value)||35000; var oee = (parseFloat((document.getElementById('smt-oee')||{}).value)||75)/100; var sStd = (parseFloat((document.getElementById('spd-std')||{}).value)||100)/100; var sFP = (parseFloat((document.getElementById('spd-fp')||{}).value)||80)/100; var sBGA = (parseFloat((document.getElementById('spd-bga')||{}).value)||65)/100; var sLG = (parseFloat((document.getElementById('spd-lg')||{}).value)||70)/100; var baseCPH = cph * oee; var lag = 2/smtHrs; var base = typeof mpGetCalcBase==='function' ? mpGetCalcBase() : {}; var totalVol = (base&&base.totalVol)||sorted.reduce(function(s,p){return s+(p.vol||0);},0); var totalIctDays = (base&&base.ictDays)||0; var totalFuncDays= (base&&base.funcDays)||0; var totalPackDays= (base&&base.packDays)||0; var mechDaysAll = (base&&base.mechDays>0) ? base.mechDays : 0; var boxFuncDaysAll= (base&&base.boxFuncDays>0) ? base.boxFuncDays : 0; var trigBatch = 100; try{ var tEl=document.getElementById('rls-batch-tht'); if(tEl) trigBatch=parseFloat(tEl.value)||100; }catch(e){} if(statusEl) statusEl.textContent = 'Simulating '+sorted.length+' PCBs...'; function smtDaysForPcb(p){ var vol = p.vol||0; if(!vol) return {daysA:0,daysB:0,hasA:false,hasB:false}; var sp = (typeof S!=='undefined'&&S&&S.pcbs)?S.pcbs[p.id]:null; var sv = sp&&sp.vals ? sp.vals : {}; var mx = sp&&sp.matrix ? sp.matrix : {}; function svn(k){ return parseFloat(sv[k])||0; } var std=svn('ps-'+p.id), lg=svn('plg-'+p.id); var fp=0,bga=0; for(var i=0;i<5;i++) fp+=svn('pfp-'+p.id+'-'+i+'-qty'); for(var i=0;i<5;i++) bga+=svn('pbga-'+p.id+'-'+i+'-qty'); var compA=std+fp+bga+lg; var std2=svn('ps2-'+p.id),lg2=svn('plg2-'+p.id); var fp2=0,bga2=0; for(var i=0;i<5;i++) fp2+=svn('pfp2-'+p.id+'-'+i+'-qty'); for(var i=0;i<5;i++) bga2+=svn('pbga2-'+p.id+'-'+i+'-qty'); var compB=std2+fp2+bga2+lg2; if(compA===0&&compB===0){ std=p.std||0; fp=p.fp||0; bga=p.bga||0; lg=p.lg||0; std2=p.std2||0; fp2=p.fp2||0; bga2=p.bga2||0; lg2=p.lg2||0; compA=std+fp+bga+lg; compB=std2+fp2+bga2+lg2; if(compA===0&&compB===0&&(p.smtTot||0)>0){ compA=p.smtTot; } } var hasA = compA>0 || (!!mx.smtA); var hasB = compB>0 || (!!mx.smtB); var daysA=0,daysB=0; if(hasA&&compA>0){ var wtdA=((std||0)*sStd+(fp||0)*sFP+(bga||0)*sBGA+(lg||0)*sLG)/compA; var bphA=(baseCPH*wtdA)/compA; daysA=bphA>0?vol/(bphA*smtHrs):0; } if(hasB&&compB>0){ var wtdB=((std2||0)*sStd+(fp2||0)*sFP+(bga2||0)*sBGA+(lg2||0)*sLG)/compB; var bphB=(baseCPH*wtdB)/compB; daysB=bphB>0?vol/(bphB*smtHrs):0; } return {daysA:daysA,daysB:daysB,hasA:hasA,hasB:hasB,compA:compA,compB:compB}; } function thtDaysForPcb(p){ var dA=0,dB=0; if(window._thtDaysA) dA=window._thtDaysA[p.id]||0; if(window._thtDaysB) dB=window._thtDaysB[p.id]||0; if(dA>0||dB>0) return Math.max(dA,dB); var sp2=(typeof S!=='undefined'&&S&&S.pcbs)?S.pcbs[p.id]:null; var sv2=sp2&&sp2.vals?sp2.vals:{}; function svn(k){return parseFloat(sv2[k])||0;} var thtTotal=svn('ptht-'+p.id); if(!thtTotal||!p.vol) return 0; var insertSec=parseFloat((document.getElementById('tht-insert-sec')||{value:5}).value)||5; var soldSec =parseFloat((document.getElementById('tht-solder-sec')||{value:2}).value)||2; var fixtureSec=parseFloat((document.getElementById('tht-fixture-sec')||{value:20}).value)||20; var flipSec =parseFloat((document.getElementById('tht-flip-sec')||{value:5}).value)||5; var stuffA =thtTotal*insertSec; var jointsA =thtTotal*2.5; var qaT=jointsA<=15?20:jointsA<=30?35:jointsA<=60?50:jointsA<=100?70:90; var cycleA =stuffA+fixtureSec+flipSec+fixtureSec+(jointsA*soldSec)+qaT; var bphA =cycleA>0?3600/cycleA:0; return bphA>0?p.vol/(bphA*thtHrs):0; } function propDays(p,total){ if(!total||!p.vol||!totalVol) return 0; return (p.vol/totalVol)*total; } function trigTime(bpd){ return bpd>0 ? trigBatch/bpd : 0; } var C={smtA:'#1d4ed8',smtB:'#6d28d9',tht:'#D85A30',ict:'#1D9E75', func:'#BA7517',burnin:'#b45309',mech:'#6B7280',boxfunc:'#7C3AED',pack:'#7F77DD'}; var smtCursor=0, results=[]; sorted.forEach(function(p){ var smt = smtDaysForPcb(p); var thtDays = thtDaysForPcb(p); var ictDays = p.hasICT ? propDays(p,totalIctDays) : 0; var funcDays = p.hasFunc ? propDays(p,totalFuncDays) : 0; var biDays = 0; if(p.hasBurnin){ try{ var slots=parseFloat((document.getElementById('mp-burnin-slots')||{}).value)||500; var biH =parseFloat((document.getElementById('mp-burnin-hrs')||{}).value)||48; var cham =parseFloat((document.getElementById('mp-burnin-chambers')||{}).value)||1; biDays=Math.ceil(p.vol/(slots*cham))*(biH/thtHrs); }catch(e){} } var thtBpd = thtDays>0 ? p.vol/thtDays : 0; var ictBpd = ictDays>0 ? p.vol/ictDays : 0; var funcBpd = funcDays>0 ? p.vol/funcDays : 0; var smtAstart=smtCursor; var smtAend =smtAstart+(smt.daysA||0); var smtBstart=smtAend; var smtBend =smt.daysB>0?smtBstart+smt.daysB:smtAend; smtCursor=smtBend; var smtLast=smtBend; var thtStart=smtLast+lag; var thtEnd =thtStart+thtDays; var ictStart,ictEnd; if(ictDays>0){ ictStart = thtDays>0 ? thtStart+trigTime(thtBpd)+lag : smtLast+lag; ictEnd = Math.max(ictStart+ictDays, thtDays>0?thtEnd:0); } else { ictStart = thtDays>0?thtEnd+lag:smtLast+lag; ictEnd = ictStart; } var funcStart,funcEnd; if(funcDays>0){ if(ictDays>0){ funcStart = ictStart+trigTime(ictBpd)+lag; } else if(thtDays>0){ funcStart = thtStart+trigTime(thtBpd)+lag; } else { funcStart = smtLast+lag; } funcEnd = Math.max(funcStart+funcDays, ictDays>0?ictEnd:(thtDays>0?thtEnd:0)); } else { funcStart = ictDays>0?ictEnd:(thtDays>0?thtEnd+lag:smtLast+lag); funcEnd = funcStart; } var lastEnd=funcDays>0?funcEnd:(ictDays>0?ictEnd:(thtDays>0?thtEnd:smtLast)); var biStart=lastEnd+lag, biEnd=biStart+biDays; var pcbComplete=biDays>0?biEnd:lastEnd; var procs=[]; if(smt.hasA&&smt.daysA>0) procs.push({key:'smtA',label:'SMT-A', color:C.smtA, start:smtAstart,end:smtAend, days:smt.daysA}); if(smt.hasB&&smt.daysB>0) procs.push({key:'smtB',label:'SMT-B', color:C.smtB, start:smtBstart,end:smtBend, days:smt.daysB}); if(thtDays>0) procs.push({key:'tht', label:'THT', color:C.tht, start:thtStart, end:thtEnd, days:thtDays}); if(ictDays>0) procs.push({key:'ict', label:'ICT', color:C.ict, start:ictStart, end:ictEnd, days:ictDays}); if(funcDays>0)procs.push({key:'func',label:'Func Test',color:C.func, start:funcStart,end:funcEnd, days:funcDays}); if(biDays>0) procs.push({key:'burnin',label:'Burn-in',color:C.burnin,start:biStart, end:biEnd, days:biDays}); results.push({pcb:p,priority:p.priority,procs:procs,pcbComplete:pcbComplete, smtLast:smtLast,thtStart:thtStart,thtBpd:thtBpd,noBurnin:biDays===0}); }); var boxStart = results.reduce(function(m,r){ var lastProc = r.procs.length ? r.procs[r.procs.length-1] : null; if(!lastProc) return m; var lastBpd = r.pcb.vol>0 && lastProc.days>0 ? r.pcb.vol/lastProc.days : 0; var trigT = lastBpd>0 ? trigBatch/lastBpd : 0; var readyDay = lastProc.start + trigT + lag; return Math.max(m, readyDay); }, 0); var boxRows=[],cur=boxStart; if(mechDaysAll>0) {boxRows.push({key:'mech', label:'Mech Box Assembly',color:C.mech, start:cur,end:cur+mechDaysAll, days:mechDaysAll}); cur+=mechDaysAll+lag;} if(boxFuncDaysAll>0){boxRows.push({key:'boxfunc',label:'Box Func Test', color:C.boxfunc,start:cur,end:cur+boxFuncDaysAll,days:boxFuncDaysAll}); cur+=boxFuncDaysAll+lag;} var allPcbsDone = results.reduce(function(m,r){return Math.max(m,r.pcbComplete);},0); var totalRun = boxRows.length>0 ? cur : allPcbsDone; var totEl=document.getElementById('rls-pcb-total'); if(totEl) totEl.textContent=totalRun.toFixed(1); var dlHtml='
PCB Completion (all units)
'; results.forEach(function(r){ dlHtml+='
' +'P'+r.priority+'. '+r.pcb.name+'' +'Day '+r.pcbComplete.toFixed(1)+'
'; }); if(boxRows.length){ dlHtml+='
' +'Box assembly starts: Day '+boxStart.toFixed(1)+'' +'
When trigger batch ('+trigBatch+' units) of slowest PCB is ready
' +'
'; dlHtml+='
Box Level
'; boxRows.forEach(function(r){ dlHtml+='
' +''+r.label+'' +'Day '+r.start.toFixed(1)+' - Day '+r.end.toFixed(1)+'
'; }); } dlHtml+='
Final Delivery: Day '+totalRun.toFixed(1)+'
'; var dlEl=document.getElementById('rls-pcb-delivery-list'); if(dlEl) dlEl.innerHTML=dlHtml; rlsPcbRenderGantt(results,boxRows,totalRun); var smtTotal=results.reduce(function(s,r){ var sa=r.procs.find(function(p){return p.key==='smtA';})||{days:0}; var sb=r.procs.find(function(p){return p.key==='smtB';})||{days:0}; return s+sa.days+sb.days; },0); if(statusEl) statusEl.textContent='Done | '+sorted.length+' PCBs | '+totalRun.toFixed(1)+' days total | SMT sum='+smtTotal.toFixed(1)+'d'; }catch(e){ console.error('PCB Gantt:',e); if(statusEl) statusEl.textContent='Error: '+e.message; } }; function rlsPcbRenderGantt(results, boxRows, totalDays){ var el = document.getElementById('rls-pcb-gantt'); if(!el) return; var maxDay = Math.ceil(totalDays)+2; var labelW = 190; var dayW = Math.max(13, Math.min(26, Math.floor((window.innerWidth - labelW - 80) / maxDay))); var procRowH = 22; var pcbGap = 6; var html = '
'; html += ''; html += ''; for(var d=1;d<=maxDay;d++){ var major = d%5===0; html += ''; } html += ''; results.forEach(function(r, idx){ var procs = r.procs; html += ''; html += ''; html += ''; html += ''; if(!procs.length){ html += ''; } else { procs.forEach(function(p){ var pStart = p.start; var pEnd = p.end; html += ''; html += ''; for(var d=1;d<=maxDay;d++){ var dayStart0 = d-1; var dayEnd0 = d; var overlap = pEnd > dayStart0 && pStart < dayEnd0; var cellStyle = 'width:'+dayW+'px;min-width:'+dayW+'px;height:'+procRowH+'px;' + 'border-bottom:1px solid #f1f5f9;padding:2px 1px;' + 'border-left:'+(d%5===0?'1px solid #c7d7f5':'none')+';'; html += ''; } html += ''; }); } html += ''; }); if(boxRows && boxRows.length){ html += ''; boxRows.forEach(function(p){ html += ''; html += ''; for(var d=1;d<=maxDay;d++){ var dayStart0=d-1, dayEnd0=d; var overlap=p.end>dayStart0 && p.start'; if(overlap){ var lf=p.start>dayStart0?(p.start-dayStart0):0; var rf=p.end' +(dayW>16&&isFirst?''+p.label+'':'')+''; } html+=''; } html+=''; }); } html += ''; html += '
PCB / Process'+d+'
' + 'P'+r.priority+'. '+r.pcb.name + ' — ' + r.pcb.vol.toLocaleString('en-IN')+' boards' + (r.pcb.smtTot>0?' · '+r.pcb.smtTot+' SMT':'') + (r.pcb.tht>0?' · '+r.pcb.tht+' THT':'')+'' + ' ✓ PCB complete: Day '+r.pcbComplete.toFixed(1)+'' + (r.noBurnin?' · No Burn-in':'') + '
No active processes for this PCB
' + '' + p.label + ' ('+p.days.toFixed(1)+'d)'; if(overlap){ var leftFrac = pStart > dayStart0 ? (pStart - dayStart0) : 0; var rightFrac = pEnd < dayEnd0 ? (dayEnd0 - pEnd) : 0; var leftPx = Math.round(leftFrac * dayW); var rightPx = Math.round(rightFrac * dayW); var barW = dayW - leftPx - rightPx; if(barW < 1) barW = 1; var isFirst = (d === Math.floor(pStart)+1); html += '
' + (dayW>16&&isFirst?''+p.label+'':'') +'
'; } html += '
BOX-LEVEL ASSEMBLY & TEST
' + '' + p.label+' ('+p.days.toFixed(1)+'d)
'; html += '
'; html += 'Legend:'; [['SMT Side-A','#1d4ed8'],['SMT Side-B','#6d28d9'],['THT','#D85A30'],['ICT','#1D9E75'],['Func Test','#BA7517'],['Burn-in','#b45309'],['Mech','#6B7280'],['Box Func','#7C3AED'],['Pack','#7F77DD']].forEach(function(l){ html += ''+l[0]+''; }); html += '
'; el.innerHTML = html; } window.rlsDebug = function(){ var out='=== PCB DATA DEBUG v2.159 ===\n\n'; out+='S.pcbs keys: '+Object.keys(S&&S.pcbs||{}).join(', ')+'\n\n'; Object.keys(S&&S.pcbs||{}).forEach(function(idStr){ var id=parseInt(idStr); var sp=S.pcbs[id]; if(!sp) return; var sv=sp.vals||{}; var mx=sp.matrix||{}; function svn(k){return parseFloat(sv[k])||0;} out+='--- PCB '+id+' ('+( sp.name||'?')+') ---\n'; out+='vol='+svn('pv-'+id)+'\n'; out+='matrix: smtA='+mx.smtA+' smtB='+mx.smtB+' thA='+mx.thA+' thB='+mx.thB+'\n'; var std=svn('ps-'+id),lg=svn('plg-'+id),fp=0,bga=0; for(var i=0;i<5;i++){fp+=svn('pfp-'+id+'-'+i+'-qty');bga+=svn('pbga-'+id+'-'+i+'-qty');} var std2=svn('ps2-'+id),lg2=svn('plg2-'+id),fp2=0,bga2=0; for(var i=0;i<5;i++){fp2+=svn('pfp2-'+id+'-'+i+'-qty');bga2+=svn('pbga2-'+id+'-'+i+'-qty');} out+='SideA comps: std='+std+' fp='+fp+' bga='+bga+' lg='+lg+' TOTAL='+(std+fp+bga+lg)+'\n'; out+='SideB comps: std2='+std2+' fp2='+fp2+' bga2='+bga2+' lg2='+lg2+' TOTAL='+(std2+fp2+bga2+lg2)+'\n'; var smtaEl=document.getElementById('pr-smta-'+id); out+='DOM pr-smta-'+id+': '+(smtaEl?'EXISTS checked='+smtaEl.checked:'NOT IN DOM')+'\n'; out+='_thtDaysA['+id+']='+((window._thtDaysA&&window._thtDaysA[id])||'undefined')+'\n\n'; }); out+='--- getPCBs() ---\n'; var pcbs=typeof getPCBs==='function'?getPCBs():[]; pcbs.forEach(function(p){out+='id='+p.id+' name='+p.name+' vol='+p.vol+' hasSMTA='+p.hasSMTA+' smtTot='+p.smtTot+'\n';}); out+='\n--- _rlsPcbList ---\n'; _rlsPcbList.forEach(function(p){out+='id='+p.id+' name='+p.name+' vol='+p.vol+' std='+p.std+' smtTot='+p.smtTot+'\n';}); alert(out); console.log(out); }; function rlsPcbPrint(){ var ganttEl = document.getElementById('rls-pcb-gantt'); var dlEl = document.getElementById('rls-pcb-delivery-list'); if(!ganttEl||!ganttEl.querySelector('table')){ alert('Generate the Gantt first.'); return; } var clientName = (document.getElementById('p-client')||{}).value||'Client'; var dateStr = new Date().toLocaleDateString('en-IN',{day:'2-digit',month:'long',year:'numeric'}); var win = window.open('','_blank'); win.document.write('' +'PCB Sequence Gantt - '+clientName+'' +'' +''); win.document.write('

PCB-wise Sequence Gantt - '+clientName+'

'); win.document.write('

'+dateStr+' | Single line, sequential PCB production with pipeline overlap

'); if(dlEl) win.document.write('
'+dlEl.innerHTML+'
'); win.document.write(ganttEl.outerHTML); win.document.write(''); win.document.close(); setTimeout(function(){ win.print(); },600); } window.rlsPcbPrint = rlsPcbPrint; })(); >