Manipulate[

Column[
{
Grid[{
{Style["Vklady celkem (s úroky, po zdanění):",Bold],
NumberForm[Style[savings,Bold],
{Infinity,2},DigitBlock->3,NumberSeparator->" "],Style["Kč",Bold]},

{Style["Poplatky (uzavření produktu + vedení účtu):",Red,Bold],Style[ToString@NumberForm[feeTotal,{Infinity,2},DigitBlock->3,NumberSeparator->" "],Red,Bold],Style["Kč",Bold,Red]},

{Style["Státní podpora celkem (s úroky, po zdanění):",Bold,Darker@Green],Style[NumberForm[subventionTotal,{Infinity,2},DigitBlock->3,NumberSeparator->" "],Darker@Green,Bold],Style["Kč",Bold,Darker@Green]},
{},
{Style["Celkem našetřeno:",Blue,Bold,20],Style[NumberForm[total,{Infinity,2},DigitBlock->3,NumberSeparator->" "],Blue,Bold,20],Style["Kč",Blue,Bold,20]}
},
Alignment->Right],

"",
"Struktura uspořené částky",
PieChart[{
N[fK*term*K],
N[savings-fK*term*K],
N[subventionTotal-subventionInterest],
N[subventionInterest]
},
ChartLegends->{
"vklady",
"úroky z vkladů",
"státní podpora",
"úroky ze státní podpory"
}],
"",

Grid[
calculateOutput[fK*term,K,(1-tax/100)*i,f,fK,tax,term,subvention, subventionMax,monthSubvention,isDue,feeAccount,feeAccountFrequency,feeProduct],
Alignment->Right,
Frame->All,
ItemSize->Automatic]
},
Alignment->Center],

Style["Stavební spoření",Bold],
Delimiter,
"Vklady",
{{K,1700,"pravidelný vklad [Kč]"}, 0,10000,100,Appearance->"Labeled",AppearanceElements->None},
{{fK,12,"frekvence vkladů"}, {1->"rok",2->"půlrok",4->"čtvrtletí",12->"měsíc"},AppearanceElements->None,ControlType->PopupMenu},
{{isDue,False,"typ spoření"}, {True->"předlhůtní",False->"polhůtní"},AppearanceElements->None},

Delimiter,
"Úročení",
{{i,1.2,"nominální úroková míra (p.a.) [%]"}, 0.1,100,Appearance->"Labeled",AppearanceElements->None},
{{f,12,"frekvence úročení"}, {1->"rok",2->"půlrok",4->"čtvrtletí",12->"měsíc"},AppearanceElements->None,ControlType->PopupMenu},

Delimiter,
"Státní podpora",
{{subvention,10,"státní podpora (% z ročního vkladu) [%]"}, 0,25,1,Appearance->"Labeled",AppearanceElements->None},
{{subventionMax,2000,"maximální státní podpora [Kč]"}, 0,10000,100,Appearance->"Labeled",AppearanceElements->None},
{{monthSubvention,4,"připsání podpory k začátku"}, {
1->"ledna",
2->"února",
3->"března",
4->"dubna",
5->"května",
6->"června",
7->"července",
8->"srpna",
9->"září",
10->"října",
11->"listopadu",
12->"prosince"
},AppearanceElements->None,ControlType->PopupMenu},

Delimiter,
"Poplatky",
{{feeAccount,0,"poplatek (vedení účtu) [Kč]"}, 0,500,10,Appearance->"Labeled",AppearanceElements->None},
{{feeAccountFrequency,1,"frekvence poplatku (vedení účtu) "}, {1->"rok",2->"půlrok",4->"čtvrtletí",12->"měsíc"},AppearanceElements->None,ControlType->PopupMenu},
{{feeProduct,0,"poplatek (uzavření produktu) [Kč]"}, 0,5000,100,Appearance->"Labeled",AppearanceElements->None},

Delimiter,
"Další parametry",
{{tax,0,"zdanění úroků [%]"}, 0,25,1,Appearance->"Labeled",AppearanceElements->None},
{{term,6,"doba spoření [v letech]"}, 6,25,1,Appearance->"Labeled",AppearanceElements->None},

{payments,ControlType->None},
{feeTotal,ControlType->None},
{subventionTotal,ControlType->None},
{subventionInterest,ControlType->None},
{savings,ControlType->None},
{total,ControlType->None},
{res,ControlType->None},

Initialization:>(
res=Array[{#-1,0,0,0,0,0,0,0}&,term+2];

AnnuityGeneral[k_,K_,i_,f_,fK_,initialDeposit_,isDue_]:=(
Clear@m;
Clear@x;
m=fK/f;
ir=r/.NSolve[{(1+r)^fK==(1+i*0.01/12)^12,r≥0},Reals][[1]];
K*((1+ir)^k-1)/ir*If[isDue==True,(ir+1),1]
);

getRemainingTerms[month_,f_]:=(
If[f==12,12-month+1,
If[f==2,If[month≤6,2,1],
If[f==4,
If[month≤3,4,If[month≤6,3,If[month≤9,2,1]]],
0
]
]
]
);

calculateOutput[k_,K_,i_,f_,fK_,tax_,term_,subvention_, subventionMax_,monthSubvention_,isDue_,arg1_,arg2_,arg3_]:=(
(* vytvoreni pole *)
Clear@res;
res=Array[{#-1,0,0,0,0,0,0,0}&,term+2];

(* hlavicka *)
res[[1]]={
Style["Rok\nN",Bold],
Style["Roční vklad",Bold],
Style["Roční vklady\n(kumulativní)",Bold],
Style["Úroky\nz vkladů",Bold],
Style["Roční vklady\nvč. úroků",Bold],
Style["Státní podpora\nv roce (N+1)",Bold],
Style["Státní podpora\nv roce (N+1),zúročená\nke konci spoření",Bold],
"Počet úrok.\nobdobí státní\npodpory z r. N+1"
};

For[a=2,a≤term+1,a++,
(* rocni vklad (single, cumulative) *)
res[[a]][[2]]=fK*K;
res[[a]][[3]]=fK*K+If[a≤2,0,res[[a-1]][[3]]];

(* uroky *)
res[[a]][[5]]=AnnuityGeneral[(a-1)*fK,K,i,f,fK,0,isDue]//N;
res[[a]][[4]]=-res[[a]][[3]]+res[[a]][[5]]//N;

(* podpora *)
res[[a]][[6]]=Clip[res[[a]][[2]]*subvention/100,{0,subventionMax}]//N;
remainingTerms=Clip[(term-a)*f+getRemainingTerms[monthSubvention,f],{0,Infinity}];
res[[a]][[7]]=res[[a]][[6]]*(1+i/(100*f))^remainingTerms;
res[[a]][[8]]=remainingTerms;
];

(* paticka *)
res[[term+2]]={
Style["Celkem",Bold],
Style[res[[term+1]][[3]],Bold],
Style[res[[term+1]][[3]],Bold],
Style[res[[term+1]][[4]],Bold],
Style[res[[term+1]][[5]],Bold],
Style[Sum[res[[x]][[6]],{x,2,term+1}],Bold],
Style[Sum[res[[x]][[7]],{x,2,term+1}],Bold]
};

feeTotal=feeAccount*feeAccountFrequency*term+feeProduct;
savings=res[[term+1]][[5]];
subventionTotal=Sum[res[[x]][[7]],{x,2,term+1}];
subventionInterest=subventionTotal-Sum[res[[x]][[6]],{x,2,term+1}];
total=savings+subventionTotal-feeTotal;

res
);
),

AppearanceElements->"ResetButton",
ControlPlacement->Top,
ContinuousAction->False,
SaveDefinitions->True
]