#!/usr/bin/perl -w

use 5.034;
# use Term::ANSIColor;
# print color('bold white');
 
my $DEBUG = 1;

my $RETARD = 0;

# VERSION 7 NOVEDAD: Hacer variar el IPC y la $r como cosas externas y meter en una matriz los resultados 
# dependiendo de esas dos variables "externas". Tanto la $r como el IPC puede ir variando a lo largo de 
# los aÃ±os. QuizÃ¡ sea mÃ¡s problemÃ¡tica la $r. De cualquier modo, hay que simular un $r a larguÃ­simo plazo
# mÃ¡s o menos relacionado con IPC. #Ver estudios empÃ­ricos. -> sinusoidal // TeorÃ­a, Barro, por encima inflaciÃ³n 

# Otro tema: si tengo en en cuenta los ingresos de desempleo, los gastos, tambiÃ©n.

# Otro tema: Todo ser reduce a 1) proyectar bien la pirÃ¡mide de poblaciÃ³n 2) tener el dato de renta de cada aÃ±o, por intervalos 
# de 10 aÃ±os NO

# NOTA: el problema de las pensiones va a ser relevante mucho mÃ¡s tiempo que el de las residencias. Solo hay unos 250.000 en residencias  

say $0;
say scalar localtime();

# Supuesto general: la pirÃ¡mide poblacional es la actual. Y suponemos que no puede variar mucho.
# v.3 -> objetivo de saber los parÃ¡metros de un sistema viable (saldo positivo de $fondo) pero no excesivo en el superÃ¡vit

my $cifra_deficit = -11_192_000_000 ; # aÃ±o 2021

my $gastos_generales_SS = -4_200_000_000; # aÃ±o 2021
my $gastos_transfer_2021 = -167_341_679.32; # -> base de ajuste 
  

my $pensiones_no_contributivas = -2_600_000_000; # redondeando, aÃ±o 2022. Son muy bajas mensualmente.

my $edad_trabajo = 21; # este es un supuesto medio entre 18 y 24 (graduados) pero la tendencia es a dejar que trajen antes
                       # sencillamente para mover el otro extremo de la vida laboral. En Holanda se puede cotizar desde los 15
                       # En EspaÃ±a, aunque siempre estuvo de moda decir que la FP "tipo alemana" era lo ideal, el caso es que 
                       # las universidades crecieron como setas y todavÃ­a tienen pedigree. Esta es una variable sensible, y puede
                       # ser necvesario que se cotice desde joven (16), 15 en Holanda
my $edad_jubilacion = 67;  # la adopciÃ³n de los 67 es gradual. Por otro lado es posible que sea imposible parar las jubilaciones anticipadas

my $esperanza_a_los_65 = 20.41; # aÃ±os
my $mortalidad_a_los_65 = 0.0955; # porcentaje

# my $muerte = 86;       # actualmente esta creo que es solo la de las mujeres, pero bueno
my $muerte_estadistica = 101;  # no hay dato       # no comments about comments

# En EspaÃ±a entre 1999 y 2019, la esperanza de vida al nacimiento de los hombres ha pasado de 75,4 a 80,9 aÃ±os y la de las mujeres de 82,3 a 86,2 aÃ±os, segÃºn los indicadores demogrÃ¡ficos bÃ¡sicos que publica el INE.5 jul 2021

# my $sueldo_nominal = 19_000; # a la edad de inicio. Es referencial y anual. En miles.
# my $sueldo_final = 29_000;  # datos medios artÃ­culo El PaÃ­s
# my $gradiente = $sueldo_final / $sueldo_nominal; # para toda la vida laboral, incremento adicional por experiencia
# my $g = $gradiente/($edad_jubilacion-$edad_trabajo);

my @renta;
my $z = 1.1;
for my $j (16 .. $edad_jubilacion){     # si parte de 16 o no, no importa, ya que el salario bruto que se usa es > $edad_trabajo que en media es mÃ¡s alto
    # 2018: Todas las edades        24.009,12
    # Como estamos en 2022 multiplico todo por ... 1.1, y en general, esto puede proyectarse
    if ($j < 25){
	$renta[$j] = 12417.98 * $z;
    }elsif ($j <= 34){
	$renta[$j] = 19350.14 * $z;
    }elsif ($j <= 44){
	$renta[$j] = 24380.69 * $z;
    }elsif ($j <= 54){
	$renta[$j] = 26416.99 * $z;
    }elsif ($j <= $edad_jubilacion){
	$renta[$j] = 27150.93 * $z;
    }else{
	die "Error gordo";
    }
    say "$j $renta[$j]" if $DEBUG;
}

my $desempleo = 0.14;  # a largo plazo (a largo plazo puede ser del 14% pero ahora para mayores de 24 estÃ¡ en 11.4%) RESUMIENDO: 14%
my $tasa_actividad = 0.5865; # tambiÃ©n a largo plazo, pero deberÃ­a ser mÃ¡s estable, este es de un nivel alto actual 2022. No veo el porquÃ© habrÃ­a que esperar 
                             # que decayese porque toda la nueva tecnologÃ­a abre mercados en fondo y forma. Lo que no lo hacÃ­an eran los mecheros de pastores 
my $actividad_efectiva = (1-$desempleo) * $tasa_actividad;  # lo mejor es aleatorizarlo porque min=52% MAX=60%

say "Supuesto: actividad_efectiva = $actividad_efectiva" if $DEBUG;


my $IPC = 0.05; # a largo plazo, objetivo BCE 2%, que subirÃ¡. Esto es importante pero desconocido. Â«SerÃ¡ lo que nos dÃ© la ganaÂ» dirÃ­a el BCE
my $r = $IPC+0.01; # tasa real, por encima del nominal (este es el problema)// suele ser algo menos de 2% + euribor   /* Como lo uso para capitalizar, resto */

my $eps = 0.05; # variable sin uso
my $otros_porcentajes = 0.0705 + 0.002 + 0.007; 
my $porcentaje_financiacion = 0.283+0.0705+0.002+0.007;           # aquÃ­ lo normal era 1/3 pero vamos a probar valores mÃ¡s altos
                                             # MÃ¡s bajos se puede meter 0.283 de contingencias comunes SS rÃ©gimen gral. actual, pero tambiÃ©n 
                                             # hay desempleo, FOGASA y formaciÃ³n profesional... 
my $morosos_SS = 0.04;   # artÃ­culo

my $gasto_2021 = 192_231_053; # total con todo, incluÃ­do mutuas

my $porcentaje_coste_jubilacion = 1.2;  # ADDENDA: Como me fustiga el dato positivo, vamos a suponer que cuestan mÃ¡s los ancianos
                                       # para simular a grosso modo, es derivado de que los cuidados pueden ir en relaciÃ³n 1:4
                                       # serÃ­a resultado de tratar de implantar un modelo comunal no necesariamente pÃºblico con incentivos
                                       # pero eso se derivarÃ­a de que alguien ahorrase con ello, lo que debe provenir de una renta mayor
                                       # Razonamiento: 5-6 ancianos pueden ser cuidados por 1 persona en 1 puesto, pero para cubrir un puesto 24/7
                                       # necesitamos 5 personas, luego la relaciÃ³n real puede ser 5/6, o mÃ¡s favorable, 4/6
                                        
                                       # A simple vista, las residencias de ancianos son de tamaÃ±o medio-pequeÃ±o 
                                       # Resumen: tomo 1 como punto de duda 

                                       # Los mayores residenciados son solo 120.000 del total. Una pequeÃ±a parte. Pero se demandan 30.000 plazas mÃ¡s.
                                       # Esa tendencia no se espera que baje. La soluciÃ³n obvia es migrarlos a paÃ­ses de baja renta y calor, en complejos.
                                       # Puede ser latinoamÃ©rica o Argelia, tanto da. La $q es tan determinante como la $p, y hasta cierto punto intercambiable
                                       # en el caso de los mayores residenciados.

# my $base = 1;       # 47_500_000;  # sustituido por @pob

my ($fondo, $cracks) = (0,0);
my @pob = (0) x 111;
# mirar alternativa "piramide2021.csv" separado por ;
my @tmp = <DATA>;
my $e;
my $s = 0;
for my $line (@tmp){
    chomp $line;
    next if ($line =~ /^#/);
    last if ($line =~ /__END__/);
    if ( $line =~ m/sexos\;(\d+)\s/ ){
	$e = $1;
	if ( $line =~ m/2021\;(\d+\.\d+)/ ){
	    $pob[$e] = $1;
	    $pob[$e] =~ s/\.//g;
	    $s += $pob[$e];
	    say "pob[$e] = $pob[$e]" if $DEBUG;
	}
    }
}
say "File readed. $s habitants.";

# my (@salario_que_cuenta, @salario_que_cuenta2);

my $k = 0;
my ($pmax, $qmax, $actmax) = ($porcentaje_financiacion, $porcentaje_coste_jubilacion, $actividad_efectiva);
my ($p, $q, $tope_fondo, $act, $yant) = ($pmax,$qmax,0,$actmax,0);

my $MINI = 9e99;
my $iteraciones = 10_000_000;

my $num_anos_calculo = 25;  # FÃ³rmula de media de los Ãºltimos 25 aÃ±os para calcular la pensiÃ³n. SubirÃ¡ a 35
my $num_anos_calculo2 = 28;  # fÃ³rmula alternativa 
#	    $pension = $renta[$i]*12/14;

my $pension = calculo_p25( @renta );        # splice que representa los Ãºltimos aÃ±os
my $pension2 = calculo_p28( @renta );

say "La diferencia de pensiones s25=$pension y s35=$pension2 es = ", ($pension-$pension2);

my $p2;  # pension actualizada

while (++$k <= $iteraciones){ 
# loop:
    $cracks=0;
#    $p = $pmax + (rand()-0.5) * (0.44 - $porcentaje_financiacion) / 1000;
    $p += (rand()-0.5) /1000;             # cada aleatorio con su lista de censuras, pero por cansancio y economÃ­a de la verdad, se queda fijo con taco.
    if ($p > 0.42) { $p = $pmax; }    # CENSURA A DEDO
    if ($p < 0.35) { $p = $pmax; }
    $q += (rand()-0.5) / 1000;
    if ($q < 0.8) { $q = $qmax; }    # CENSURA A DEDO
    if ($q > 1.5) { $q = $qmax; }     # LO MISMO
#    $q = 1.3;
#    $act = (53 + rand()*7) * (1-$desempleo);
    $act += (rand()-0.5) / 1000; 
    if ($act > 0.60) { $act = $actmax; }
    if ($act < 0.45) { $act = $actmax; }
    $fondo = $tope_fondo = 0;
    $p2 = $pension;  # poner $pension2 para la de 35 aÃ±os
 
    for my $i ( $edad_trabajo .. $edad_jubilacion-1 ) {    
	$fondo += $pob[$i] * $renta[$i] * $p * $act * (1-$morosos_SS);   # $actividad_efectiva);
#	    $renta[$i+1] += ($renta[$i] * $IPC); # * coef();  # incremento de sueldo NO aleatorizado            BUG GORDO: CORRUPCION EN LA RENTA!!!
	$fondo -= $pob[$i] * $renta[$i] * $desempleo if ($fondo > 0);  # Esto es nuevo v.7
	$fondo += ( $fondo * $r );     # rendimientos NO aleatorizados
    }
    
    for my $i ( $edad_jubilacion .. $muerte_estadistica-1){ 	
	if ($i == $edad_jubilacion) { 
	    $tope_fondo = $fondo;
	}	    
	$fondo +=  $pob[$i] * $p2 * $act * $q if ($fondo > 0);  
	$fondo += $gastos_generales_SS if ($fondo > 0);  # el que parte y reparte...
	$fondo += $pensiones_no_contributivas if ($fondo > 0);  # pensiones no contributivas, por mes natural al ser el dato medio de gasto 
	$cracks++ if $fondo < 0;
	$p2 += ( $p2 * $IPC ) if ($fondo >0); # * coef();  # NO aleatorizado
        $fondo += ( $fondo * $r ) if ($fondo > 0);     # rendimientos NO aleatorizados
#    say "$i $pob[$i] $renta[$i] $p2 -> $fondo" if $DEBUG;
    }
    
#    print "\r$k" if $DEBUG;
    
    my $y = $k / $iteraciones;
    print  "\r" . qw( Â· - o \ | / )[ $k % 6 ] . " |" . "=" x int(50*$y) . ">" . " " x int(50*(1-$y)) . "| " . int(100*$y) . "% ";    

    if ($tope_fondo >= $gasto_2021 && $fondo >= $cifra_deficit && $cracks == 0 && $fondo <= $MINI){
	$MINI = $fondo;
	$pmax = $p;
	$qmax = $q;
	$actmax = $act;
	my $rr = $p - $porcentaje_financiacion + $otros_porcentajes;
	say "\n$0  $k  p=$p  r=$rr  q=$q  criterio MIN  =>  actividad_efectiva $act  fondo $fondo  tope $tope_fondo  Ncracks $cracks";
#	    $MINI = 9e99;
#	    $qmax = $porcentaje_coste_jubilacion;
#	    $actmax = $actividad_efectiva;
#	    goto loop;
     
    }
#      if ($k % 10_000 == 1){
#	$q = $qmax;
#	$act = $actmax;
#	$yant = $y;
#    }    
    select(undef, undef, undef, 0.001) if $RETARD;
}

say "\n";

exit 2;

sub calculo_p28 {
    return calculo_p25(@_);
}

sub calculo_p25 {
    my @d = @_;
    @d = splice (@d, ($edad_jubilacion-$num_anos_calculo2), $num_anos_calculo2);
    die if scalar(@d) != $num_anos_calculo2;  # en realidad no son 25 aÃ±os sino 300 meses (12 meses por aÃ±o), y el divisor es 350 (14 pagas en el mismo periodo)
    my $sum = 0;
    my $c = 0;
    for (@d){
	$sum += $_;
	$c++;
    }
    return -$sum / $c;  # ($c*14/12); # mensual  # y vale ya (segÃºn la fÃ³rmula)
}


sub calculo_p35 {
    my @d = @_;
    @d = splice (@d, ($edad_jubilacion-$num_anos_calculo2), $num_anos_calculo2);
    die if scalar(@d) != $num_anos_calculo2;  # en realidad no son 25 aÃ±os sino 300 meses (12 meses por aÃ±o), y el divisor es 350 (14 pagas en el mismo periodo)
    my $sum = 0;
    my $c = 0;
    for (@d){
	$sum += $_;
	$c++;
    }
    return -$sum / $c;  # ($c*14/12); # mensual  # y vale ya (segÃºn la fÃ³rmula)
}

sub calculo_p2 {
    my @d = @_;
    my $sum;
    my $count;
    my $sumkount;
    $sumkount += (++$count) for (@d);    # mÃ©todo experimental de los dÃ­gitos
    $count = 0;
    for (@d){
	$count++;
	$sum += $_ * $count / $sumkount;
    }
    return $sum;
}

__DATA__
# Sexo;Edad;Provincias;Periodo;Total
#Ambos sexos;Total;Total Nacional;1 de julio de 2021;47.326.687
Ambos sexos;99 años;Total Nacional;1 de julio de 2021;10.681
Ambos sexos;98 años;Total Nacional;1 de julio de 2021;15.739
Ambos sexos;97 años;Total Nacional;1 de julio de 2021;22.271
Ambos sexos;96 años;Total Nacional;1 de julio de 2021;30.676
Ambos sexos;95 años;Total Nacional;1 de julio de 2021;41.505
Ambos sexos;94 años;Total Nacional;1 de julio de 2021;53.951
Ambos sexos;93 años;Total Nacional;1 de julio de 2021;70.290
Ambos sexos;92 años;Total Nacional;1 de julio de 2021;89.488
Ambos sexos;91 años;Total Nacional;1 de julio de 2021;111.608
Ambos sexos;90 años;Total Nacional;1 de julio de 2021;134.008
Ambos sexos;9 años;Total Nacional;1 de julio de 2021;478.212
Ambos sexos;89 años;Total Nacional;1 de julio de 2021;157.984
Ambos sexos;88 años;Total Nacional;1 de julio de 2021;183.365
Ambos sexos;87 años;Total Nacional;1 de julio de 2021;201.652
Ambos sexos;86 años;Total Nacional;1 de julio de 2021;218.905
#Ambos sexos;85 y más años;Total Nacional;1 de julio de 2021;1.597.299
Ambos sexos;85 años;Total Nacional;1 de julio de 2021;241.174
Ambos sexos;84 años;Total Nacional;1 de julio de 2021;249.399
Ambos sexos;83 años;Total Nacional;1 de julio de 2021;237.391
Ambos sexos;82 años;Total Nacional;1 de julio de 2021;220.949
Ambos sexos;81 años;Total Nacional;1 de julio de 2021;271.891
Ambos sexos;80 años;Total Nacional;1 de julio de 2021;305.482
Ambos sexos;8 años;Total Nacional;1 de julio de 2021;457.582
Ambos sexos;79 años;Total Nacional;1 de julio de 2021;295.593
Ambos sexos;78 años;Total Nacional;1 de julio de 2021;340.575
Ambos sexos;77 años;Total Nacional;1 de julio de 2021;376.560
Ambos sexos;76 años;Total Nacional;1 de julio de 2021;397.396
Ambos sexos;75 años;Total Nacional;1 de julio de 2021;405.656
Ambos sexos;74 años;Total Nacional;1 de julio de 2021;412.677
Ambos sexos;73 años;Total Nacional;1 de julio de 2021;448.047
Ambos sexos;72 años;Total Nacional;1 de julio de 2021;463.427
Ambos sexos;71 años;Total Nacional;1 de julio de 2021;449.760
Ambos sexos;70 años;Total Nacional;1 de julio de 2021;450.617
Ambos sexos;7 años;Total Nacional;1 de julio de 2021;447.990
Ambos sexos;69 años;Total Nacional;1 de julio de 2021;474.940
Ambos sexos;68 años;Total Nacional;1 de julio de 2021;495.196
Ambos sexos;67 años;Total Nacional;1 de julio de 2021;499.650
Ambos sexos;66 años;Total Nacional;1 de julio de 2021;514.402
Ambos sexos;65 años;Total Nacional;1 de julio de 2021;537.131
Ambos sexos;64 años;Total Nacional;1 de julio de 2021;567.567
Ambos sexos;63 años;Total Nacional;1 de julio de 2021;596.927
Ambos sexos;62 años;Total Nacional;1 de julio de 2021;613.965
Ambos sexos;61 años;Total Nacional;1 de julio de 2021;632.683
Ambos sexos;60 años;Total Nacional;1 de julio de 2021;642.574
Ambos sexos;6 años;Total Nacional;1 de julio de 2021;447.018
Ambos sexos;59 años;Total Nacional;1 de julio de 2021;650.962
Ambos sexos;58 años;Total Nacional;1 de julio de 2021;672.037
Ambos sexos;57 años;Total Nacional;1 de julio de 2021;702.554
Ambos sexos;56 años;Total Nacional;1 de julio de 2021;717.111
Ambos sexos;55 años;Total Nacional;1 de julio de 2021;716.900
Ambos sexos;54 años;Total Nacional;1 de julio de 2021;729.917
Ambos sexos;53 años;Total Nacional;1 de julio de 2021;737.967
Ambos sexos;52 años;Total Nacional;1 de julio de 2021;740.126
Ambos sexos;51 años;Total Nacional;1 de julio de 2021;747.929
Ambos sexos;50 años;Total Nacional;1 de julio de 2021;757.745
Ambos sexos;5 años;Total Nacional;1 de julio de 2021;437.754
Ambos sexos;49 años;Total Nacional;1 de julio de 2021;769.726
Ambos sexos;48 años;Total Nacional;1 de julio de 2021;777.865
Ambos sexos;47 años;Total Nacional;1 de julio de 2021;789.491
Ambos sexos;46 años;Total Nacional;1 de julio de 2021;802.135
Ambos sexos;45 años;Total Nacional;1 de julio de 2021;808.171
Ambos sexos;44 años;Total Nacional;1 de julio de 2021;803.885
Ambos sexos;43 años;Total Nacional;1 de julio de 2021;791.365
Ambos sexos;42 años;Total Nacional;1 de julio de 2021;769.113
Ambos sexos;41 años;Total Nacional;1 de julio de 2021;741.069
Ambos sexos;40 años;Total Nacional;1 de julio de 2021;713.066
Ambos sexos;4 años;Total Nacional;1 de julio de 2021;420.410
Ambos sexos;39 años;Total Nacional;1 de julio de 2021;681.233
Ambos sexos;38 años;Total Nacional;1 de julio de 2021;648.396
Ambos sexos;37 años;Total Nacional;1 de julio de 2021;620.402
Ambos sexos;36 años;Total Nacional;1 de julio de 2021;599.107
Ambos sexos;35 años;Total Nacional;1 de julio de 2021;578.241
Ambos sexos;34 años;Total Nacional;1 de julio de 2021;561.959
Ambos sexos;33 años;Total Nacional;1 de julio de 2021;551.906
Ambos sexos;32 años;Total Nacional;1 de julio de 2021;544.018
Ambos sexos;31 años;Total Nacional;1 de julio de 2021;535.499
Ambos sexos;30 años;Total Nacional;1 de julio de 2021;527.539
Ambos sexos;3 años;Total Nacional;1 de julio de 2021;395.826
Ambos sexos;29 años;Total Nacional;1 de julio de 2021;524.812
Ambos sexos;28 años;Total Nacional;1 de julio de 2021;518.210
Ambos sexos;27 años;Total Nacional;1 de julio de 2021;501.074
Ambos sexos;26 años;Total Nacional;1 de julio de 2021;487.416
Ambos sexos;25 años;Total Nacional;1 de julio de 2021;481.464
Ambos sexos;24 años;Total Nacional;1 de julio de 2021;480.356
Ambos sexos;23 años;Total Nacional;1 de julio de 2021;476.559
Ambos sexos;22 años;Total Nacional;1 de julio de 2021;476.459
Ambos sexos;21 años;Total Nacional;1 de julio de 2021;483.667
Ambos sexos;20 años;Total Nacional;1 de julio de 2021;484.377
Ambos sexos;2 años;Total Nacional;1 de julio de 2021;373.710
Ambos sexos;19 años;Total Nacional;1 de julio de 2021;480.033
Ambos sexos;18 años;Total Nacional;1 de julio de 2021;484.095
Ambos sexos;17 años;Total Nacional;1 de julio de 2021;493.014
Ambos sexos;16 años;Total Nacional;1 de julio de 2021;497.498
Ambos sexos;15 años;Total Nacional;1 de julio de 2021;503.573
Ambos sexos;14 años;Total Nacional;1 de julio de 2021;509.164
Ambos sexos;13 años;Total Nacional;1 de julio de 2021;519.047
Ambos sexos;12 años;Total Nacional;1 de julio de 2021;514.640
Ambos sexos;11 años;Total Nacional;1 de julio de 2021;496.537
Ambos sexos;100 y más años;Total Nacional;1 de julio de 2021;14.001
Ambos sexos;10 años;Total Nacional;1 de julio de 2021;489.217
Ambos sexos;1 año;Total Nacional;1 de julio de 2021;353.564
Ambos sexos;0 años;Total Nacional;1 de julio de 2021;328.226
__END__
  
Del cÃ¡lculo simple se deduce que es prÃ¡cticamente posible que una persona aislada 
  autofinancie su pensiÃ³n a menos que incremente notablemente su sueldo durante la
  vida laboral.
Al parecer el efecto de alisado a la baja de la fÃ³rmula de cÃ¡lculo de pensiones es
    suficente aplicÃ¡ndose a 25 aÃ±os y puede retrasarse la ampliaciÃ³n a 35.
Por contra, siempre parece buena idea que la incorporaciÃ³n al mercado sea cuanto 
    antes posible.
v5 .- Vamos a ver, el problema depende mucho de la tasa efectiva de empleo, lo cual
  depende de la tasa de actividad general (que puede descender) y la emigraciÃ³n,
  que, en cambio, puede ascender arbitrariamente. El problema es que, integrados en
  nuestra pirÃ¡mide financiera de poblaciÃ³n, sÃ­ nos importa la edad (y el sexo, pero
      bueno) de los inmigrantes.
  
