Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save uqmessias/69927ddab3ccc77e43aec0f88e2b684c to your computer and use it in GitHub Desktop.
Save uqmessias/69927ddab3ccc77e43aec0f88e2b684c to your computer and use it in GitHub Desktop.
This is some data extracted from a simulation at http://www8.caixa.gov.br/siopiinternet-web/simulaOperacaoInternet.do?method=inicializarCasoUso in order to get some money to buy an apartment in Brazil.
const payments = [
{
"nr": 1,
"payment": 1180.01
},
{
"nr": 2,
"payment": 1177.81
},
{
"nr": 3,
"payment": 1175.61
},
{
"nr": 4,
"payment": 1173.42
},
{
"nr": 5,
"payment": 1171.22
},
{
"nr": 6,
"payment": 1169.02
},
{
"nr": 7,
"payment": 1166.83
},
{
"nr": 8,
"payment": 1164.63
},
{
"nr": 9,
"payment": 1162.43
},
{
"nr": 10,
"payment": 1160.23
},
{
"nr": 11,
"payment": 1158.04
},
{
"nr": 12,
"payment": 1155.84
},
{
"nr": 13,
"payment": 1153.64
},
{
"nr": 14,
"payment": 1151.44
},
{
"nr": 15,
"payment": 1149.25
},
{
"nr": 16,
"payment": 1147.05
},
{
"nr": 17,
"payment": 1144.85
},
{
"nr": 18,
"payment": 1142.66
},
{
"nr": 19,
"payment": 1140.46
},
{
"nr": 20,
"payment": 1138.26
},
{
"nr": 21,
"payment": 1136.06
},
{
"nr": 22,
"payment": 1133.87
},
{
"nr": 23,
"payment": 1131.67
},
{
"nr": 24,
"payment": 1129.47
},
{
"nr": 25,
"payment": 1127.27
},
{
"nr": 26,
"payment": 1125.08
},
{
"nr": 27,
"payment": 1122.88
},
{
"nr": 28,
"payment": 1120.68
},
{
"nr": 29,
"payment": 1118.49
},
{
"nr": 30,
"payment": 1116.29
},
{
"nr": 31,
"payment": 1114.09
},
{
"nr": 32,
"payment": 1111.89
},
{
"nr": 33,
"payment": 1109.7
},
{
"nr": 34,
"payment": 1107.5
},
{
"nr": 35,
"payment": 1105.3
},
{
"nr": 36,
"payment": 1103.1
},
{
"nr": 37,
"payment": 1100.91
},
{
"nr": 38,
"payment": 1098.71
},
{
"nr": 39,
"payment": 1096.51
},
{
"nr": 40,
"payment": 1094.32
},
{
"nr": 41,
"payment": 1092.12
},
{
"nr": 42,
"payment": 1089.92
},
{
"nr": 43,
"payment": 1087.72
},
{
"nr": 44,
"payment": 1085.53
},
{
"nr": 45,
"payment": 1083.33
},
{
"nr": 46,
"payment": 1081.13
},
{
"nr": 47,
"payment": 1078.93
},
{
"nr": 48,
"payment": 1076.74
},
{
"nr": 49,
"payment": 1074.54
},
{
"nr": 50,
"payment": 1072.34
},
{
"nr": 51,
"payment": 1070.14
},
{
"nr": 52,
"payment": 1067.95
},
{
"nr": 53,
"payment": 1065.75
},
{
"nr": 54,
"payment": 1063.55
},
{
"nr": 55,
"payment": 1061.36
},
{
"nr": 56,
"payment": 1059.16
},
{
"nr": 57,
"payment": 1056.96
},
{
"nr": 58,
"payment": 1054.76
},
{
"nr": 59,
"payment": 1052.57
},
{
"nr": 60,
"payment": 1050.37
},
{
"nr": 61,
"payment": 1048.17
},
{
"nr": 62,
"payment": 1045.97
},
{
"nr": 63,
"payment": 1043.78
},
{
"nr": 64,
"payment": 1041.58
},
{
"nr": 65,
"payment": 1039.38
},
{
"nr": 66,
"payment": 1037.19
},
{
"nr": 67,
"payment": 1034.99
},
{
"nr": 68,
"payment": 1032.79
},
{
"nr": 69,
"payment": 1030.59
},
{
"nr": 70,
"payment": 1028.4
},
{
"nr": 71,
"payment": 1026.2
},
{
"nr": 72,
"payment": 1024
},
{
"nr": 73,
"payment": 1021.8
},
{
"nr": 74,
"payment": 1019.61
},
{
"nr": 75,
"payment": 1017.41
},
{
"nr": 76,
"payment": 1015.21
},
{
"nr": 77,
"payment": 1013.02
},
{
"nr": 78,
"payment": 1010.82
},
{
"nr": 79,
"payment": 1008.62
},
{
"nr": 80,
"payment": 1006.42
},
{
"nr": 81,
"payment": 1004.23
},
{
"nr": 82,
"payment": 1002.03
},
{
"nr": 83,
"payment": 999.83
},
{
"nr": 84,
"payment": 997.63
},
{
"nr": 85,
"payment": 995.44
},
{
"nr": 86,
"payment": 993.24
},
{
"nr": 87,
"payment": 991.04
},
{
"nr": 88,
"payment": 988.85
},
{
"nr": 89,
"payment": 986.65
},
{
"nr": 90,
"payment": 984.45
},
{
"nr": 91,
"payment": 982.25
},
{
"nr": 92,
"payment": 980.06
},
{
"nr": 93,
"payment": 977.86
},
{
"nr": 94,
"payment": 975.66
},
{
"nr": 95,
"payment": 973.46
},
{
"nr": 96,
"payment": 971.27
},
{
"nr": 97,
"payment": 969.07
},
{
"nr": 98,
"payment": 966.87
},
{
"nr": 99,
"payment": 964.68
},
{
"nr": 100,
"payment": 962.48
},
{
"nr": 101,
"payment": 960.28
},
{
"nr": 102,
"payment": 958.08
},
{
"nr": 103,
"payment": 955.89
},
{
"nr": 104,
"payment": 953.69
},
{
"nr": 105,
"payment": 951.49
},
{
"nr": 106,
"payment": 949.29
},
{
"nr": 107,
"payment": 947.1
},
{
"nr": 108,
"payment": 944.9
},
{
"nr": 109,
"payment": 942.7
},
{
"nr": 110,
"payment": 940.51
},
{
"nr": 111,
"payment": 938.31
},
{
"nr": 112,
"payment": 936.11
},
{
"nr": 113,
"payment": 933.91
},
{
"nr": 114,
"payment": 931.72
},
{
"nr": 115,
"payment": 929.52
},
{
"nr": 116,
"payment": 927.32
},
{
"nr": 117,
"payment": 925.12
},
{
"nr": 118,
"payment": 922.93
},
{
"nr": 119,
"payment": 920.73
},
{
"nr": 120,
"payment": 918.53
},
{
"nr": 121,
"payment": 916.34
},
{
"nr": 122,
"payment": 914.14
},
{
"nr": 123,
"payment": 911.94
},
{
"nr": 124,
"payment": 909.74
},
{
"nr": 125,
"payment": 907.55
},
{
"nr": 126,
"payment": 905.35
},
{
"nr": 127,
"payment": 903.15
},
{
"nr": 128,
"payment": 900.95
},
{
"nr": 129,
"payment": 898.76
},
{
"nr": 130,
"payment": 896.56
},
{
"nr": 131,
"payment": 894.36
},
{
"nr": 132,
"payment": 892.17
},
{
"nr": 133,
"payment": 889.97
},
{
"nr": 134,
"payment": 887.77
},
{
"nr": 135,
"payment": 885.57
},
{
"nr": 136,
"payment": 883.38
},
{
"nr": 137,
"payment": 881.18
},
{
"nr": 138,
"payment": 878.98
},
{
"nr": 139,
"payment": 876.78
},
{
"nr": 140,
"payment": 874.59
},
{
"nr": 141,
"payment": 872.39
},
{
"nr": 142,
"payment": 870.19
},
{
"nr": 143,
"payment": 867.99
},
{
"nr": 144,
"payment": 865.8
},
{
"nr": 145,
"payment": 863.6
},
{
"nr": 146,
"payment": 861.4
},
{
"nr": 147,
"payment": 859.21
},
{
"nr": 148,
"payment": 857.01
},
{
"nr": 149,
"payment": 854.81
},
{
"nr": 150,
"payment": 852.61
},
{
"nr": 151,
"payment": 850.42
},
{
"nr": 152,
"payment": 848.22
},
{
"nr": 153,
"payment": 846.02
},
{
"nr": 154,
"payment": 843.82
},
{
"nr": 155,
"payment": 841.63
},
{
"nr": 156,
"payment": 839.43
},
{
"nr": 157,
"payment": 837.23
},
{
"nr": 158,
"payment": 835.04
},
{
"nr": 159,
"payment": 832.84
},
{
"nr": 160,
"payment": 830.64
},
{
"nr": 161,
"payment": 828.44
},
{
"nr": 162,
"payment": 826.25
},
{
"nr": 163,
"payment": 824.05
},
{
"nr": 164,
"payment": 821.85
},
{
"nr": 165,
"payment": 819.65
},
{
"nr": 166,
"payment": 817.46
},
{
"nr": 167,
"payment": 815.26
},
{
"nr": 168,
"payment": 813.06
},
{
"nr": 169,
"payment": 810.87
},
{
"nr": 170,
"payment": 808.67
},
{
"nr": 171,
"payment": 806.47
},
{
"nr": 172,
"payment": 804.27
},
{
"nr": 173,
"payment": 802.08
},
{
"nr": 174,
"payment": 799.88
},
{
"nr": 175,
"payment": 797.68
},
{
"nr": 176,
"payment": 795.48
},
{
"nr": 177,
"payment": 793.29
},
{
"nr": 178,
"payment": 791.09
},
{
"nr": 179,
"payment": 788.89
},
{
"nr": 180,
"payment": 786.7
},
{
"nr": 181,
"payment": 784.5
},
{
"nr": 182,
"payment": 782.3
},
{
"nr": 183,
"payment": 780.1
},
{
"nr": 184,
"payment": 777.91
},
{
"nr": 185,
"payment": 775.71
},
{
"nr": 186,
"payment": 773.51
},
{
"nr": 187,
"payment": 771.31
},
{
"nr": 188,
"payment": 769.12
},
{
"nr": 189,
"payment": 766.92
},
{
"nr": 190,
"payment": 764.72
},
{
"nr": 191,
"payment": 762.53
},
{
"nr": 192,
"payment": 760.33
},
{
"nr": 193,
"payment": 758.13
},
{
"nr": 194,
"payment": 755.93
},
{
"nr": 195,
"payment": 753.74
},
{
"nr": 196,
"payment": 751.54
},
{
"nr": 197,
"payment": 749.34
},
{
"nr": 198,
"payment": 747.14
},
{
"nr": 199,
"payment": 744.95
},
{
"nr": 200,
"payment": 742.75
},
{
"nr": 201,
"payment": 740.55
},
{
"nr": 202,
"payment": 738.36
},
{
"nr": 203,
"payment": 736.16
},
{
"nr": 204,
"payment": 733.96
},
{
"nr": 205,
"payment": 731.76
},
{
"nr": 206,
"payment": 729.57
},
{
"nr": 207,
"payment": 727.37
},
{
"nr": 208,
"payment": 725.17
},
{
"nr": 209,
"payment": 722.97
},
{
"nr": 210,
"payment": 720.78
},
{
"nr": 211,
"payment": 718.58
},
{
"nr": 212,
"payment": 716.38
},
{
"nr": 213,
"payment": 714.19
},
{
"nr": 214,
"payment": 711.99
},
{
"nr": 215,
"payment": 709.79
},
{
"nr": 216,
"payment": 707.59
},
{
"nr": 217,
"payment": 705.4
},
{
"nr": 218,
"payment": 703.2
},
{
"nr": 219,
"payment": 701
},
{
"nr": 220,
"payment": 698.8
},
{
"nr": 221,
"payment": 696.61
},
{
"nr": 222,
"payment": 694.41
},
{
"nr": 223,
"payment": 692.21
},
{
"nr": 224,
"payment": 690.02
},
{
"nr": 225,
"payment": 687.82
},
{
"nr": 226,
"payment": 685.62
},
{
"nr": 227,
"payment": 683.42
},
{
"nr": 228,
"payment": 681.23
},
{
"nr": 229,
"payment": 679.03
},
{
"nr": 230,
"payment": 676.83
},
{
"nr": 231,
"payment": 674.63
},
{
"nr": 232,
"payment": 672.44
},
{
"nr": 233,
"payment": 670.24
},
{
"nr": 234,
"payment": 668.04
},
{
"nr": 235,
"payment": 665.84
},
{
"nr": 236,
"payment": 663.65
},
{
"nr": 237,
"payment": 661.45
},
{
"nr": 238,
"payment": 659.25
},
{
"nr": 239,
"payment": 657.06
},
{
"nr": 240,
"payment": 654.86
},
{
"nr": 241,
"payment": 652.66
},
{
"nr": 242,
"payment": 650.46
},
{
"nr": 243,
"payment": 648.27
},
{
"nr": 244,
"payment": 646.07
},
{
"nr": 245,
"payment": 643.87
},
{
"nr": 246,
"payment": 641.67
},
{
"nr": 247,
"payment": 639.48
},
{
"nr": 248,
"payment": 637.28
},
{
"nr": 249,
"payment": 635.08
},
{
"nr": 250,
"payment": 632.89
},
{
"nr": 251,
"payment": 630.69
},
{
"nr": 252,
"payment": 628.49
},
{
"nr": 253,
"payment": 626.29
},
{
"nr": 254,
"payment": 624.1
},
{
"nr": 255,
"payment": 621.9
},
{
"nr": 256,
"payment": 619.7
},
{
"nr": 257,
"payment": 617.5
},
{
"nr": 258,
"payment": 615.31
},
{
"nr": 259,
"payment": 613.11
},
{
"nr": 260,
"payment": 610.91
},
{
"nr": 261,
"payment": 608.72
},
{
"nr": 262,
"payment": 606.52
},
{
"nr": 263,
"payment": 604.32
},
{
"nr": 264,
"payment": 602.12
},
{
"nr": 265,
"payment": 599.93
},
{
"nr": 266,
"payment": 597.73
},
{
"nr": 267,
"payment": 595.53
},
{
"nr": 268,
"payment": 593.33
},
{
"nr": 269,
"payment": 591.14
},
{
"nr": 270,
"payment": 588.94
},
{
"nr": 271,
"payment": 586.74
},
{
"nr": 272,
"payment": 584.55
},
{
"nr": 273,
"payment": 582.35
},
{
"nr": 274,
"payment": 580.15
},
{
"nr": 275,
"payment": 577.95
},
{
"nr": 276,
"payment": 575.76
},
{
"nr": 277,
"payment": 573.56
},
{
"nr": 278,
"payment": 571.36
},
{
"nr": 279,
"payment": 569.16
},
{
"nr": 280,
"payment": 566.97
},
{
"nr": 281,
"payment": 564.77
},
{
"nr": 282,
"payment": 562.57
},
{
"nr": 283,
"payment": 560.38
},
{
"nr": 284,
"payment": 558.18
},
{
"nr": 285,
"payment": 555.98
},
{
"nr": 286,
"payment": 553.78
},
{
"nr": 287,
"payment": 551.59
},
{
"nr": 288,
"payment": 549.39
},
{
"nr": 289,
"payment": 547.19
},
{
"nr": 290,
"payment": 544.99
},
{
"nr": 291,
"payment": 542.8
},
{
"nr": 292,
"payment": 540.6
},
{
"nr": 293,
"payment": 538.4
},
{
"nr": 294,
"payment": 536.21
},
{
"nr": 295,
"payment": 534.01
},
{
"nr": 296,
"payment": 531.81
},
{
"nr": 297,
"payment": 529.61
},
{
"nr": 298,
"payment": 527.42
},
{
"nr": 299,
"payment": 525.22
},
{
"nr": 300,
"payment": 523.02
},
{
"nr": 301,
"payment": 520.82
},
{
"nr": 302,
"payment": 518.63
},
{
"nr": 303,
"payment": 516.43
},
{
"nr": 304,
"payment": 514.23
},
{
"nr": 305,
"payment": 512.04
},
{
"nr": 306,
"payment": 509.84
},
{
"nr": 307,
"payment": 507.64
},
{
"nr": 308,
"payment": 505.44
},
{
"nr": 309,
"payment": 503.25
},
{
"nr": 310,
"payment": 501.05
},
{
"nr": 311,
"payment": 498.85
},
{
"nr": 312,
"payment": 496.65
},
{
"nr": 313,
"payment": 494.46
},
{
"nr": 314,
"payment": 492.26
},
{
"nr": 315,
"payment": 490.06
},
{
"nr": 316,
"payment": 487.86
},
{
"nr": 317,
"payment": 485.67
},
{
"nr": 318,
"payment": 483.47
},
{
"nr": 319,
"payment": 481.27
},
{
"nr": 320,
"payment": 479.08
},
{
"nr": 321,
"payment": 476.88
},
{
"nr": 322,
"payment": 474.68
},
{
"nr": 323,
"payment": 472.48
},
{
"nr": 324,
"payment": 470.29
},
{
"nr": 325,
"payment": 468.09
},
{
"nr": 326,
"payment": 465.89
},
{
"nr": 327,
"payment": 463.69
},
{
"nr": 328,
"payment": 461.5
},
{
"nr": 329,
"payment": 459.3
},
{
"nr": 330,
"payment": 457.1
},
{
"nr": 331,
"payment": 454.91
},
{
"nr": 332,
"payment": 452.71
},
{
"nr": 333,
"payment": 450.51
},
{
"nr": 334,
"payment": 448.31
},
{
"nr": 335,
"payment": 446.12
},
{
"nr": 336,
"payment": 443.92
},
{
"nr": 337,
"payment": 441.72
},
{
"nr": 338,
"payment": 439.52
},
{
"nr": 339,
"payment": 437.33
},
{
"nr": 340,
"payment": 435.13
},
{
"nr": 341,
"payment": 432.93
},
{
"nr": 342,
"payment": 430.74
},
{
"nr": 343,
"payment": 428.54
},
{
"nr": 344,
"payment": 426.34
},
{
"nr": 345,
"payment": 424.14
},
{
"nr": 346,
"payment": 421.95
},
{
"nr": 347,
"payment": 419.75
},
{
"nr": 348,
"payment": 417.55
},
{
"nr": 349,
"payment": 415.35
},
{
"nr": 350,
"payment": 413.16
},
{
"nr": 351,
"payment": 410.96
},
{
"nr": 352,
"payment": 408.76
},
{
"nr": 353,
"payment": 406.57
},
{
"nr": 354,
"payment": 404.37
},
{
"nr": 355,
"payment": 402.17
},
{
"nr": 356,
"payment": 399.97
},
{
"nr": 357,
"payment": 397.78
},
{
"nr": 358,
"payment": 395.58
},
{
"nr": 359,
"payment": 393.38
},
{
"nr": 360,
"payment": 391.18
},
{
"nr": 361,
"payment": 388.99
},
{
"nr": 362,
"payment": 386.79
},
{
"nr": 363,
"payment": 384.59
},
{
"nr": 364,
"payment": 382.4
},
{
"nr": 365,
"payment": 380.2
},
{
"nr": 366,
"payment": 378
},
{
"nr": 367,
"payment": 375.8
},
{
"nr": 368,
"payment": 373.61
},
{
"nr": 369,
"payment": 371.41
},
{
"nr": 370,
"payment": 369.21
},
{
"nr": 371,
"payment": 367.01
},
{
"nr": 372,
"payment": 364.82
},
{
"nr": 373,
"payment": 362.62
},
{
"nr": 374,
"payment": 360.42
},
{
"nr": 375,
"payment": 358.23
},
{
"nr": 376,
"payment": 356.03
},
{
"nr": 377,
"payment": 353.83
},
{
"nr": 378,
"payment": 351.63
},
{
"nr": 379,
"payment": 349.44
},
{
"nr": 380,
"payment": 347.24
},
{
"nr": 381,
"payment": 345.04
},
{
"nr": 382,
"payment": 342.84
},
{
"nr": 383,
"payment": 340.65
},
{
"nr": 384,
"payment": 338.45
},
{
"nr": 385,
"payment": 336.25
},
{
"nr": 386,
"payment": 334.06
},
{
"nr": 387,
"payment": 331.86
},
{
"nr": 388,
"payment": 329.66
},
{
"nr": 389,
"payment": 327.46
},
{
"nr": 390,
"payment": 325.27
},
{
"nr": 391,
"payment": 323.07
},
{
"nr": 392,
"payment": 320.87
},
{
"nr": 393,
"payment": 318.67
},
{
"nr": 394,
"payment": 316.48
},
{
"nr": 395,
"payment": 314.28
},
{
"nr": 396,
"payment": 312.08
},
{
"nr": 397,
"payment": 309.89
},
{
"nr": 398,
"payment": 307.69
},
{
"nr": 399,
"payment": 305.49
},
{
"nr": 400,
"payment": 303.29
},
{
"nr": 401,
"payment": 301.1
},
{
"nr": 402,
"payment": 298.9
},
{
"nr": 403,
"payment": 296.7
},
{
"nr": 404,
"payment": 294.5
},
{
"nr": 405,
"payment": 292.31
},
{
"nr": 406,
"payment": 290.11
},
{
"nr": 407,
"payment": 287.91
},
{
"nr": 408,
"payment": 285.71
},
{
"nr": 409,
"payment": 283.52
},
{
"nr": 410,
"payment": 281.32
},
{
"nr": 411,
"payment": 279.12
},
{
"nr": 412,
"payment": 276.93
},
{
"nr": 413,
"payment": 274.73
},
{
"nr": 414,
"payment": 272.53
},
{
"nr": 415,
"payment": 270.33
},
{
"nr": 416,
"payment": 268.14
},
{
"nr": 417,
"payment": 265.94
},
{
"nr": 418,
"payment": 263.74
},
{
"nr": 419,
"payment": 261.54
},
{
"nr": 420,
"payment": 260.55
},
];
const interestRateByYear = 5;
const interestRateByMonth = Math.pow(1 + (interestRateByYear / 100), 1 / 12) - 1;
/**
*
* @param {number} num Simple number to convert to currency (i.e.: 1234567890.12)
* @return {string} The number formatted as a currency (i.e.: 1.234.567.890,12)
*/
const formatCurrency = num => num.toFixed(2).replace('.', ',').replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1.");
/**
*
* @param {number} num A price as a simple number to convert to Real BR (i.e.: 1234567890.12)
* @return {string} The number formatted as Real BR (i.e.: R$ 1.234.567.890,12)
*/
const formatBRL = priceInBRL => `R$ ${formatCurrency(priceInBRL)}`;
/**
*
* @param {number} maximumToSave Max of Real you can save by month
* @param {Array<number>} initialPayments
*/
function savingAtLeast(maximumToSave, initialPayments) {
const paymentsByMinimumValue = payments.reduce((allPayments, { payment }, index) => {
if (index === 0) {
return [payment];
}
const lastPayment = allPayments.pop();
let currentPayment = lastPayment + payment;
if (lastPayment >= maximumToSave || (lastPayment + payment) > maximumToSave) {
allPayments.push(lastPayment);
currentPayment = payment;
}
allPayments.push(currentPayment);
return allPayments;
}, initialPayments);
const sumWithInterest = paymentsByMinimumValue.reduce((total, payment) =>
total + (total * interestRateByMonth) + payment,
0,
);
/// R$ 108.000,00 of loan from http://www8.caixa.gov.br/siopiinternet-web/simulaOperacaoInternet.do?method=inicializarCasoUso
console.log(`\n\nSAVING AT LEAST ${formatBRL(maximumToSave)} IN ${paymentsByMinimumValue.length} INSTALLMENTS`)
console.log(`${interestRateByYear}%/year = ${(interestRateByMonth * 100).toFixed(6)}%/month`)
console.log(`sumWithInterest: ${sumWithInterest} -> ${formatBRL(sumWithInterest)}`)
}
savingAtLeast(0);
savingAtLeast(1500);
savingAtLeast(2000);
savingAtLeast(2500);
savingAtLeast(3000);
savingAtLeast(4000);
savingAtLeast(5000);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment