import pandas as pd

# Importa la librería financiera.
# Solo es necesario ejecutar la importación una sola vez.
import cashflows as cf

"""
Explanation: Depreciación de Activos
Juan David Velásquez Henao
jdvelasq@unal.edu.co 
Universidad Nacional de Colombia, Sede Medellín
Facultad de Minas
Medellín, Colombia

Haga click aquí para acceder a la última versión online
Haga click aquí para ver la última versión online en nbviewer.
End of explanation
"""


costs = cf.cashflow(const_value=0,  # valor 0 por defecto
                    periods=6,      # compra + vida útil
                    start=2000,
                    freq='A')
costs[0] = 200
costs

life  = cf.cashflow(const_value=0, # vida util = 0
                    periods=6,     # compra + vida útil
                    start=2000,
                    freq='A')
life[0]=5 # vida útil del activo
life

cf.depreciation_sl(costs=costs,    # costos de las inversiones 
                   life=life)      # vida útil de cada inversión


"""
Explanation: Depreciación en línea recta
La depreciación permite la deducción de los costos de las inversiones (pérdida de valor de ellas) con el fin de reducir el impuesto de renta.
La depreciación en todos los años es igual.


$P$ -- valor de compra en libros.


$N$ -- número de años en que ocurre la depreciación (vida útil del activo).


$D_n$ -- depreciación en el año $n$.


$F$ -- valor de salvamento al final de la vida útil.


$$D_n = \frac{P-F}{N}$$
Ejemplo.-- Un activo cuesta  $ 200. Si la depreciación ocurre durante 5 años, ¿cuál es su depreciación anual?.
End of explanation
"""


costs = cf.cashflow(const_value=0,   # valor por defecto 
                    periods=20,      # cantidad de períodos
                    start=2000,
                    freq='A')
costs['2001'] = 200
costs['2006'] = 300
costs

life = cf.cashflow(const_value=0,    # valor por defecto 
                   periods=20,       # cantidad de períodos
                   start=2000,
                   freq='A')
life['2001'] = 5
life['2006'] = 10
life

cf.depreciation_sl(costs=costs,    # inversiones
                   life=life)      # vida útil

"""
Explanation: Ejemplo.-- En el año 2001 se compra un activo por valor de $ 200 y en el año 2006 otro activo por valor de $ 300. Los activos tienen vidas útiles de 5 y 10 años respectivamente. Calcule la depreciación total anual para cada año. Haga sus cálculos iniciando en el año 2000.
End of explanation
"""


costs = cf.cashflow(const_value=[200]+[0]*5,
                    start=2000,
                    freq='A')

life  = cf.cashflow(const_value=[5]+[0]*5,
                    start='2000',
                    freq='A')

cf.depreciation_soyd(costs=costs, life=life)

"""
Explanation: Depreciación por suma de los dígitos de los años (o depreciación acelerada)
En este método de depreciación se hace mayor al principio y más pequeña al final. Se basa en la progresión desde $N$ hasta 1.
$$S = \sum_{i=1}^N i = \frac{1}{2} N(N + 1)$$
$$D_n = (P - F) * \frac{(N - n + 1)}{S} = 2 * (P - F) * \frac{N-n+1}{N(N+1)}$$ 
Ejemplo.-- Un activo cuesta  $ 200. Si la depreciación ocurre durante 5 años, ¿cuál es su depreciación anual?.
End of explanation
"""


def compute_cf(ingreso_operativo,
               tax_rate,
               depreciacion):
    utilidad_AI = ingreso_operativo - depreciacion
    impuestos   = cf.after_tax_cashflow(utilidad_AI, tax_rate=tax_rate)
    utilidad_DI = utilidad_AI - impuestos
    cashf       = utilidad_DI + depreciacion
    
    return impuestos, cashf
    

## impuesto de renta del 35%
tax_rate = cf.interest_rate(const_value=[35]*6, start=2018, freq='A')

## crea el flujo de caja
ingreso_operativo = cf.cashflow(const_value=[0]+[500]*5, start=2018, freq='A') 

## activo depreciable
costs = cf.cashflow(const_value=[200]+[0]*5, start=2018, freq='A')
life  = cf.cashflow(const_value=[5]+[0]*5,   start=2018, freq='A')

"""
Explanation: Efecto de la depreciación sobre el impuesto de renta y el flujo de caja
End of explanation
"""


depreciacion_1 = cf.cashflow(const_value=[0]*6, start=2018, freq='A') 
impuesto_1, cf_1 = compute_cf(ingreso_operativo, tax_rate, depreciacion_1)
impuesto_1

cf_1

"""
Explanation: Caso 1: sin depreciación.
End of explanation
"""


## considere un activo depreciable
depreciacion_2 = cf.depreciation_sl(costs=costs, life=life)['Depr']
depreciacion_2

impuesto_2, cf_2 = compute_cf(ingreso_operativo, tax_rate, depreciacion_2)
impuesto_2

cf_2

"""
Explanation: Caso 2: depreciación en linea recta.
End of explanation
"""


depreciacion_3 = cf.depreciation_soyd(costs=costs, life=life)['Depr']
depreciacion_3

impuesto_3, cf_3 = compute_cf(ingreso_operativo, tax_rate, depreciacion_3)
impuesto_3

cf_3

"""
Explanation: Note que en el resultado anterior el ingreso después de impuestos es mayor que en el caso 1.
Caso 3: depreciación acelerada.
End of explanation
"""


pd.DataFrame({'impuesto_1':impuesto_1, 'impuesto_2':impuesto_2, 'impuesto_3':impuesto_3}).round(2)

pd.DataFrame({'cf_1':cf_1, 'cf_2':cf_2, 'cf_3':cf_3}).round(2)

"""
Explanation: Comparación
End of explanation
"""


