NAME
    App::CalcAccumulatedDiscounts - Calculate multi-year discounts from a
    per-year discount rate

VERSION
    This document describes version 0.080 of App::CalcAccumulatedDiscounts
    (from Perl distribution App-CalcAccumulatedDiscounts), released on
    2021-07-17.

SYNOPSIS
    See the included script calc-accumulated-discounts.

FUNCTIONS
  calc_accumulated_discounts
    Usage:

     calc_accumulated_discounts(%args) -> [$status_code, $reason, $payload, \%result_meta]

    Calculate multi-year discounts from a per-year discount rate.

    Examples:

    *   Example #1:

         calc_accumulated_discounts();

        Result:

         [
           200,
           "OK",
           [
             [
               "Disc p.a. \\ Year",
               "5y",
               "10y",
               "15y",
               "20y",
               "25y",
               "30y",
               "35y",
               "40y",
               "45y",
               "50y",
             ],
             [
               "0.25%",
               "1.2%",
               "2.5%",
               "3.7%",
               "4.9%",
               "6.1%",
               "7.2%",
               "8.4%",
               "9.5%",
               "10.7%",
               "11.8%",
             ],
             [
               "0.50%",
               "2.5%",
               "4.9%",
               "7.2%",
               "9.5%",
               "11.8%",
               "14.0%",
               "16.1%",
               "18.2%",
               "20.2%",
               "22.2%",
             ],
             [
               "0.75%",
               "3.7%",
               "7.3%",
               "10.7%",
               "14.0%",
               "17.2%",
               "20.2%",
               "23.2%",
               "26.0%",
               "28.7%",
               "31.4%",
             ],
             [
               "1.00%",
               "4.9%",
               "9.6%",
               "14.0%",
               "18.2%",
               "22.2%",
               "26.0%",
               "29.7%",
               "33.1%",
               "36.4%",
               "39.5%",
             ],
             [
               "1.25%",
               "6.1%",
               "11.8%",
               "17.2%",
               "22.2%",
               "27.0%",
               "31.4%",
               "35.6%",
               "39.5%",
               "43.2%",
               "46.7%",
             ],
             [
               "1.50%",
               "7.3%",
               "14.0%",
               "20.3%",
               "26.1%",
               "31.5%",
               "36.5%",
               "41.1%",
               "45.4%",
               "49.3%",
               "53.0%",
             ],
             [
               "1.75%",
               "8.4%",
               "16.2%",
               "23.3%",
               "29.7%",
               "35.7%",
               "41.1%",
               "46.1%",
               "50.6%",
               "54.8%",
               "58.6%",
             ],
             [
               "2.00%",
               "9.6%",
               "18.3%",
               "26.1%",
               "33.2%",
               "39.7%",
               "45.5%",
               "50.7%",
               "55.4%",
               "59.7%",
               "63.6%",
             ],
             [
               "2.25%",
               "10.8%",
               "20.4%",
               "28.9%",
               "36.6%",
               "43.4%",
               "49.5%",
               "54.9%",
               "59.8%",
               "64.1%",
               "67.9%",
             ],
             [
               "2.50%",
               "11.9%",
               "22.4%",
               "31.6%",
               "39.7%",
               "46.9%",
               "53.2%",
               "58.8%",
               "63.7%",
               "68.0%",
               "71.8%",
             ],
             [
               "2.75%",
               "13.0%",
               "24.3%",
               "34.2%",
               "42.7%",
               "50.2%",
               "56.7%",
               "62.3%",
               "67.2%",
               "71.5%",
               "75.2%",
             ],
             [
               "3.00%",
               "14.1%",
               "26.3%",
               "36.7%",
               "45.6%",
               "53.3%",
               "59.9%",
               "65.6%",
               "70.4%",
               "74.6%",
               "78.2%",
             ],
             [
               "3.25%",
               "15.2%",
               "28.1%",
               "39.1%",
               "48.4%",
               "56.2%",
               "62.9%",
               "68.5%",
               "73.3%",
               "77.4%",
               "80.8%",
             ],
             [
               "3.50%",
               "16.3%",
               "30.0%",
               "41.4%",
               "51.0%",
               "59.0%",
               "65.7%",
               "71.3%",
               "76.0%",
               "79.9%",
               "83.2%",
             ],
             [
               "3.75%",
               "17.4%",
               "31.8%",
               "43.6%",
               "53.4%",
               "61.5%",
               "68.2%",
               "73.8%",
               "78.3%",
               "82.1%",
               "85.2%",
             ],
             [
               "4.00%",
               "18.5%",
               "33.5%",
               "45.8%",
               "55.8%",
               "64.0%",
               "70.6%",
               "76.0%",
               "80.5%",
               "84.1%",
               "87.0%",
             ],
             [
               "4.50%",
               "20.6%",
               "36.9%",
               "49.9%",
               "60.2%",
               "68.4%",
               "74.9%",
               "80.0%",
               "84.1%",
               "87.4%",
               "90.0%",
             ],
             [
               "5.00%",
               "22.6%",
               "40.1%",
               "53.7%",
               "64.2%",
               "72.3%",
               "78.5%",
               "83.4%",
               "87.1%",
               "90.1%",
               "92.3%",
             ],
           ],
           {
             "table.field_aligns" => [
               "number",
               "number",
               "number",
               "number",
               "number",
               "number",
               "number",
               "number",
               "number",
               "number",
               "number",
             ],
           },
         ]

    *   Modify years and discount rates to generate:

         calc_accumulated_discounts(discounts => [1, 2, 2.5], years => [5, 10]);

        Result:

         [
           200,
           "OK",
           [
             ["Disc p.a. \\ Year", "5y", "10y"],
             ["1.00%", "4.9%", "9.6%"],
             ["2.00%", "9.6%", "18.3%"],
             ["2.50%", "11.9%", "22.4%"],
           ],
           { "table.field_aligns" => ["number", "number", "number"] },
         ]

    This routine generates a table of accumulated discounts over a period of
    several years, given the annual discount rates.

    I first wrote this to see the accumulated fees when choosing mutual
    funds products. The moral of the story is, if you plan to hold a fund
    for a long time (e.g. 5-10 years or longer) you should pick funds that
    are low in annual fees (e.g. 1% or lower). Otherwise, the annual
    management fees will eat up most, if not all, your potential profits.

    This function is not exported.

    Arguments ('*' denotes required arguments):

    *   discounts => *array[float]* (default:
        [0.25,0.5,0.75,1,1.25,1.5,1.75,2,2.25,2.5,2.75,3,3.25,3.5,3.75,4,4.5
        ,5])

    *   years => *array[int]* (default: [5,10,15,20,25,30,35,40,45,50])

    Returns an enveloped result (an array).

    First element ($status_code) is an integer containing HTTP-like status
    code (200 means OK, 4xx caller error, 5xx function error). Second
    element ($reason) is a string containing error message, or something
    like "OK" if status is 200. Third element ($payload) is the actual
    result, but usually not present when enveloped result is an error
    response ($status_code is not 2xx). Fourth element (%result_meta) is
    called result metadata and is optional, a hash that contains extra
    information, much like how HTTP response headers provide additional
    metadata.

    Return value: (any)

HOMEPAGE
    Please visit the project's homepage at
    <https://metacpan.org/release/App-CalcAccumulatedDiscounts>.

SOURCE
    Source repository is at
    <https://github.com/perlancar/perl-App-CalcAccumulatedDiscounts>.

BUGS
    Please report any bugs or feature requests on the bugtracker website
    <https://rt.cpan.org/Public/Dist/Display.html?Name=App-CalcAccumulatedDi
    scounts>

    When submitting a bug or request, please include a test-file or a patch
    to an existing test-file that illustrates the bug or desired feature.

AUTHOR
    perlancar <perlancar@cpan.org>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2021, 2017, 2015 by perlancar@cpan.org.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.

