Source: modules/household.js

/**
 * Denna fil innehåller defintioner för modulen {@link houseHold} samt klasserna {@link Housing} och {@link Person}
 *
 * @file
 * @author Hanif Bali
 * @version 1.0
 */

(function () {
    /**
     * Detta är hjärtat i kalkylatorn, den håller reda på alla personer och boendet.
     * @alias houseHold
     * @implements {Module}
     * @type {houseHold}
     * @constructor
     */
    var houseHold = function () {
        /**
         * Här sparas alla hushållets medlemmar
         * @type {Array}
         */
        this.persons = [];
        /**
         * Skapar ett gratis boende automatiskt.
         * @type {Housing}
         */
        this.house = new Housing(0, 0, true);
        /**
         * Lägger till boende i hushållet
         * @param {Housing} house Hushållets nya boende.
         */
        this.addHouse = function (house) {
            this.house = house;
        };
        /**
         * Hämtar hushållets boende.
         * @returns {Housing}
         */
        this.getHouse = function () {
            return this.house;
        };
        /**
         * Lägger till Person i hushållet
         * @param {Person} person En ny person att lägga till i hushållet.
         */
        this.addPerson = function (person) {
            this.persons.push(person);
        };

        /**
         * Personer i hushållet
         *
         * Returnerar en array med personerna i hushållet.
         * @returns {Person[]} Persons
         */
        this.getPersons = function () {
            return this.persons.slice(0);
        };
        /**
         * Hushållets inkomster exklusive skatt
         * @returns {Number}
         */
        this.totalCalc = function () {
            return this.getHouseHoldTaxableIncome() / 12;
        };
        /**
         * Ger dig en array med alla personer i hushållet under definierad ålder.
         * @param {Number} age Ålder
         * @returns {Person[]} Persons below defined param age
         */
        this.getPersonsBelowAge = function (age) {
            filteredPersons = [];
            this.getPersons().forEach(function (person) {
                if (person.age < age) {
                    filteredPersons.push(person);
                }
            });
            return filteredPersons;
        };
        /**
         * Returnerar alla vuxna i hushållet.
         *
         * @returns {Person[]}
         */
        this.getGrownups = function () {
            var grownups = [];
            this.persons.forEach(function (person) {
                if (person.isGrownup()) {
                    grownups.push(person);
                }
            });
            return grownups;
        };
        /**
         * Summerar och returnerar den totala taxerbara inkomsten i hushållet
         * @returns {Number}
         */
        this.getHouseHoldTaxableIncome = function () {
            var persons = this.getPersons();
            var income = 0;
            persons.forEach(function (person) {
                income = income + parseInt(person.getTaxableIncome());
            });
            return income;

        };
        /**
         * Returnerar alla vuxnas inkomster före skatt.
         * @returns {Number}
         */
        this.getGrownupsIncomeBeforeTax = function () {
            var grownUps = this.getGrownups();
            var income = 0;
            grownUps.forEach(function (person) {
                income = income + parseInt(person.getTaxableIncome());
            });
            return income / 12;

        };
        /**
         * Returnerar alla barn.
         *
         * @returns {Person[]}
         */
        this.getKids = function () {
            var kids = [];
            this.persons.forEach(function (person) {
                if (!person.isGrownup()) {
                    kids.push(person);
                }
            });
            return kids;
        }
        /**
         * Antal personer i hushållet.
         *
         * @returns {Number}
         */
        this.numberOfPersons = function () {
            return this.persons.length
        }

    };

    marginalCalc.addModule("houseHold", houseHold, 0);
    marginalCalc.scriptLoader.loadComplete("household");
})();

/**
 * Denna klass använder hushållet och kalkylatorn för att göra uträkningar, tex bostadsbidraget och socialbidraget.
 *
 * @example // Skapa en hyresrätt på 50 kvadrat med 4000kr i hyra.
 * var lgh = new Housing(50, 4000);
 *
 * @param {Number} sqmtrs Boendets kvadratmeter
 * @param {Number} rent Boendets hyra eller avgift
 * @param {Boolean} [rental = true] Om boendet är en hyresrätt eller ej
 * @constructor
 */
function Housing(sqmtrs, rent, rental) {
    this.rental = typeof rental == "undefined" ? true : rental;
    this.sqmtrs = parseInt(sqmtrs);
    this.rent = parseInt(rent);
    this.getRent = function () {
        return this.rent;
    };
    this.setRent = function (rent) {
        this.rent = rent;
    };
    this.avgRent = function (household) {
        rent = 0;
        if (!household.getKids()) {
            if (household.getGrownups().length == 1) {
                rent = 44700;
            } else {
                rent = 58400;
            }

        } else {
            if (household.getGrownups().length == 1) {
                rent = 61400;
            }

            switch (household.getKids().length) {
                case 1:
                    rent = 65800;
                case 2:
                    rent = 69400;
                case 3:
                default:
                    rent = 75500;
                    break;
            }
        }
        return Math.round(rent / 12);
    }
}
/**
 * Personen som används av {@link houseHold} och andra moduler för att beräkna skatt och bidrag.
 *
 * @example //Skapa en person 30 årig person med 20000 kr i månadsinkomst
 * var Steffo = new Person(20000, 30);
 * @param {Number} salary Arbetsinkomster personen har
 * @param {Number} age  Ålder på personen
 * @constructor
 */

function Person(salary, age) {
    var that = this;
    this.data = [];
    this.age = parseInt(age);
    this.income = parseInt(salary);
    this.salary = parseInt(salary);
    this.setData = function(dataKey, data){
        this.data[dataKey] = data;
    };
    this.getData = function (dataKey) {
        if(typeof this.data[dataKey] === "undefined"){
            return undefined;
        }
        console.log(dataKey, this.data[dataKey]);
        return this.data[dataKey];
    };
    this.getTaxableIncome = function () {
        return this.salary * 12;
    };
    this.getWorkIncome = function () {
        return this.salary * 12;
    };
    this.isGrownup = function () {
        return this.age > 17
    }
}