
function berechnen_nettocashflow() {
// TODO add your handling code here:
        //die vorhergehenden berechnungen löschen
            //ergebnis_loeschen();
//saldo berechnen----------------------------------------------------------------


    var anzahl_jahre=document.getElementById('field_anzahl_jahre').value;
	anzahl_jahre++;
	for(i=0;i<anzahl_jahre;i++){
        kosten=string_to_double(document.getElementById('tabelle_nettocashflow_'+i+'_2').value);
        erloese=string_to_double(document.getElementById('tabelle_nettocashflow_'+i+'_3').value);
        document.getElementById('tabelle_nettocashflow_'+i+'_4').value=format_double_to_string(erloese-kosten,2);
	}






    netto_cash_flow_angaben_einlesen();
    bewegungen_zusammenstellen();
            //index von Zinssatz-haben in bewegungen-zusammen merken; wird dann jeweils geändert für neuen Rechungslauf
    
    var abbruchmeldung="Die Berechnung wird abgebrochen";

    var index_zinssatz_haben=0;
    var index_zinssatz_soll=0;
            for (i=0;i<bewegungen_zusammen[0].length;i++){
                if (bewegungen_zusammen[2][i]==3){
                    index_zinssatz_haben=i;
                    break;
                }
            }
            for (i=0;i<bewegungen_zusammen[0].length;i++){
                if (bewegungen_zusammen[2][i]==2){
                    index_zinssatz_soll=i;
                    break;
                }
            }
            //Zinsstaffel berechnen----------------------------------------------------------
        var endsaldo_errechnet=0.01;
        var endsaldo_eingabe=0;     //nicht genau 0 wegen abbruchbedingung unten
        var zinskorrektur=0;
        var abbruch=false;
        zinskorrektur=10;
        //ausgabe der Bewegungen zur kontrolle
        /*
        for (i=0;i<bewegungen_zusammen[0].length;i++){
            var jahr_=new Date();
            jahr_.setTime(bewegungen_zusammen[0][i]);
            alert("Bewegungen" + jahr_.getDate()+"."+jahr_.getMonth()+"."+jahr_.getFullYear()+"."+" " + bewegungen_zusammen[1][i] + " " + bewegungen_zusammen[2][i] );
        }
        */
       
        while (endsaldo_eingabe <= endsaldo_errechnet){
            if (endsaldo_eingabe == endsaldo_errechnet){break;}
            bewegungen_zusammen[1][index_zinssatz_haben]=Number(bewegungen_zusammen[1][index_zinssatz_haben])+Number(zinskorrektur);
            bewegungen_zusammen[1][index_zinssatz_soll]=Number(bewegungen_zusammen[1][index_zinssatz_soll])+Number(zinskorrektur);
            if (bewegungen_zusammen[1][index_zinssatz_haben]>1000 || bewegungen_zusammen[1][index_zinssatz_haben] < -1000){
                //Meldung ausgeben-----------------------------------------------------
            abbruch=true;
            alert(abbruchmeldung);
            return;
            }
            ein_auszahlungen_berechnen();
            endsaldo_errechnet = g_variablen_endsaldo;
                //eventuell :Text_errechneter_Zinssatz = Format(Zinssatz_Haben, "#,###0.0000")
        }

        if (abbruch==false){
        zinskorrektur=-1;    
        while (endsaldo_eingabe >= endsaldo_errechnet){
            if (endsaldo_eingabe == endsaldo_errechnet){break;}
            bewegungen_zusammen[1][index_zinssatz_haben]=Number(bewegungen_zusammen[1][index_zinssatz_haben])+Number(zinskorrektur);
            bewegungen_zusammen[1][index_zinssatz_soll]=Number(bewegungen_zusammen[1][index_zinssatz_soll])+Number(zinskorrektur);
            if (bewegungen_zusammen[1][index_zinssatz_haben]>1000 || bewegungen_zusammen[1][index_zinssatz_haben] < -1000){
            alert(abbruchmeldung);
            return;
            }
            ein_auszahlungen_berechnen();
            endsaldo_errechnet = g_variablen_endsaldo;
                //eventuell :Text_errechneter_Zinssatz = Format(Zinssatz_Haben, "#,###0.0000")

        }
        //alert("endsaldo -1 "+g_variablen_endsaldo + "zinssatz+++"+bewegungen_zusammen[1][index_zinssatz_haben]);

        zinskorrektur=0.1;
        while (endsaldo_eingabe <= endsaldo_errechnet){
            if (endsaldo_eingabe == endsaldo_errechnet){break;}
            bewegungen_zusammen[1][index_zinssatz_haben]=Number(string_to_double(bewegungen_zusammen[1][index_zinssatz_haben]))+Number(zinskorrektur);
            bewegungen_zusammen[1][index_zinssatz_soll]=Number(string_to_double(bewegungen_zusammen[1][index_zinssatz_soll]))+Number(zinskorrektur);
            if (bewegungen_zusammen[1][index_zinssatz_haben]>1000){
            alert(abbruchmeldung);
            break;
            }
            ein_auszahlungen_berechnen();
            endsaldo_errechnet = g_variablen_endsaldo;
            //alert("endsaldo 0.1 "+g_variablen_endsaldo + "zinssatz+++"+bewegungen_zusammen[1][index_zinssatz_haben]);

                //eventuell :Text_errechneter_Zinssatz = Format(Zinssatz_Haben, "#,###0.0000")
        }
                //alert("endsaldo 0.1 "+g_variablen_endsaldo + "zinssatz+++"+bewegungen_zusammen[1][index_zinssatz_haben]);

        zinskorrektur=-0.01;
        while (endsaldo_eingabe >= endsaldo_errechnet){
            if (endsaldo_eingabe == endsaldo_errechnet){break;}
            bewegungen_zusammen[1][index_zinssatz_haben]=Number(bewegungen_zusammen[1][index_zinssatz_haben])+Number(zinskorrektur);
            bewegungen_zusammen[1][index_zinssatz_soll]=Number(bewegungen_zusammen[1][index_zinssatz_soll])+Number(zinskorrektur);
            if (bewegungen_zusammen[1][index_zinssatz_haben]>1000){
            alert(abbruchmeldung);
            break;
            }
            ein_auszahlungen_berechnen();
            endsaldo_errechnet = g_variablen_endsaldo;
                //eventuell :Text_errechneter_Zinssatz = Format(Zinssatz_Haben, "#,###0.0000")
        }
                //alert("endsaldo -0.01 "+g_variablen_endsaldo + "zinssatz+++"+bewegungen_zusammen[1][index_zinssatz_haben]);

        zinskorrektur=0.001;

        while (endsaldo_eingabe <= endsaldo_errechnet){
            if (endsaldo_eingabe == endsaldo_errechnet){break;}
            bewegungen_zusammen[1][index_zinssatz_haben]=Number(bewegungen_zusammen[1][index_zinssatz_haben])+Number(zinskorrektur);
            bewegungen_zusammen[1][index_zinssatz_soll]=Number(bewegungen_zusammen[1][index_zinssatz_soll])+Number(zinskorrektur);
            if (bewegungen_zusammen[1][index_zinssatz_haben]>1000){
            alert(abbruchmeldung);
            break;
            }
            ein_auszahlungen_berechnen();
            endsaldo_errechnet = g_variablen_endsaldo;
                //eventuell :Text_errechneter_Zinssatz = Format(Zinssatz_Haben, "#,###0.0000")
        }
        errechneter_Zinssatz=bewegungen_zusammen[1][index_zinssatz_haben];
        document.getElementById('interner_ertragssatz').value=format_double_to_string(bewegungen_zusammen[1][index_zinssatz_haben],3);
        }           //Abbruchbedingung wegen zu hohem Zinssatz fertig (Portfolio)
    
        //nur für Portfolio fertig ------------------------------------------------------

            beschreibung="";

            //Berechnung nach Excel Methode-------------------------------------------
            Nettobarwert=0;
            //alert("zinssatz "+errechneter_Zinssatz+"----------"+endsaldo_errechnet);
            var tbl = document.getElementById('tabelle_nettocashflow'); // Spricht die Tabelle &uuml;ber die ID an
            anz_zeilen=tbl.rows.length;
            //alert("anzahlzeilen"+anz_zeilen);

            for (i=0; i < anz_zeilen;i++){
                //double NPV(double bewegung, int ratennummer, double zinssatz){
                betrag=string_to_double(document.getElementById('tabelle_nettocashflow_'+i+'_4').value);
                Nettobarwert=Number(Nettobarwert)+Number(NPV(betrag,Number(i)+Number(1),errechneter_Zinssatz));
                document.getElementById('tabelle_nettocashflow_'+i+'_5').value=format_double_to_string(Nettobarwert,2);  //Saldo ausgeben

            }
        //Abbruchbedingung wegen zu hohem Zinssatz fertig (Portfolio)

        //wenn ein alternetiver Zinnsatz zu berechnen ist....
        Nettobarwert=0;
        var alternativer_zinssatz=document.getElementById('field_alternativer_zinssatz').value;
        if (alternativer_zinssatz!=""){
            alternativer_zinssatz=string_to_double(alternativer_zinssatz);
            //alert("zinssatz "+errechneter_Zinssatz+"----------"+endsaldo_errechnet);
            tbl = document.getElementById('tabelle_nettocashflow'); // Spricht die Tabelle &uuml;ber die ID an
            anz_zeilen=tbl.rows.length;
            //alert("anzahlzeilen"+anz_zeilen);

            for (i=0; i < anz_zeilen;i++){
                //double NPV(double bewegung, int ratennummer, double zinssatz){
                betrag=string_to_double(document.getElementById('tabelle_nettocashflow_'+i+'_4').value);
                Nettobarwert=Number(Nettobarwert)+Number(NPV(betrag,Number(i)+Number(1),alternativer_zinssatz));
                document.getElementById('tabelle_nettocashflow_'+i+'_6').value=format_double_to_string(Nettobarwert,2);  //Saldo ausgeben

            }
        }
}
function netto_cash_flow_angaben_einlesen()
	{

zinsaenderungen_haben[0][0]=stringdate_to_millisec("31.12.1900");
zinsaenderungen_haben[1][0]=0;
zinsaenderungen_haben[2][0]=3;

zinsaenderungen_soll[0][0]=zinsaenderungen_haben[0][0];
zinsaenderungen_soll[1][0]=0;
zinsaenderungen_soll[2][0]=2;

 var bewegungen_=werte_aus_tabellen_in_array_schreiben('tabelle_nettocashflow');
    if (bewegungen_.length==0){err="fehler";return err;}
    for(i=0;i<bewegungen_.length;i++){
        split_string=bewegungen_[i].split("#");
        bewegungen[0][i]=stringdate_to_millisec(split_string[0]);
        bewegungen[1][i]=split_string[1];
        bewegungen[2][i]=split_string[2];
    }

//am ende abschluß hinzufügen
g_variablen_periodenende=bewegungen[0][bewegungen[0].length-1]+Number(10);
bewegungen[0][bewegungen_.length]=bewegungen[0][bewegungen[0].length-1];
bewegungen[1][bewegungen_.length]=0;
bewegungen[2][bewegungen_.length]=4;                 //abschluß

g_variablen_periodenbeginn=Number(bewegungen[0][0]);        //sind bereits millisec durch funktion vorher - 10 Sekunden dazu, damit, wenn Abschuß gleich letzter Bewegung ist, noch der Abschluß dazugenommen wird
//kapitalisierung
kapitalisierungszeitraum='J';
tageberechnung_jahr='365';
tageberechnung_monat='31';
abschlusstag_verzinsen=false;
return "ok";
}
function NPV(bewegung, ratennummer, zinssatz){
        //NPV=0;
        zinssatz=zinssatz/100;
        return bewegung/(Math.pow(Number(1)+Number(zinssatz),ratennummer));
}
