com.xumpy.thuisadmin.services.implementations.BedragenSrvImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.xumpy.thuisadmin.services.implementations.BedragenSrvImpl.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.xumpy.thuisadmin.services.implementations;

import com.xumpy.security.model.UserInfo;
import com.xumpy.thuisadmin.controllers.model.BeheerBedragenInp;
import com.xumpy.thuisadmin.controllers.model.BeheerBedragenReport;
import com.xumpy.thuisadmin.dao.implementations.BedragenDaoImpl;
import com.xumpy.thuisadmin.dao.implementations.GroepenDaoImpl;
import com.xumpy.thuisadmin.dao.implementations.RekeningenDaoImpl;
import com.xumpy.thuisadmin.dao.model.BedragenDaoPojo;
import com.xumpy.thuisadmin.controllers.model.BeheerBedragenReportLst;
import com.xumpy.thuisadmin.controllers.model.FinanceOverzichtGroep;
import com.xumpy.thuisadmin.controllers.model.NieuwBedrag;
import com.xumpy.thuisadmin.controllers.model.OverzichtGroep;
import com.xumpy.thuisadmin.controllers.model.OverzichtGroepBedragen;
import com.xumpy.thuisadmin.controllers.model.OverzichtGroepBedragenTotal;
import com.xumpy.thuisadmin.controllers.model.RekeningOverzicht;
import com.xumpy.thuisadmin.dao.model.RekeningenDaoPojo;
import com.xumpy.thuisadmin.domain.Bedragen;
import com.xumpy.thuisadmin.domain.Groepen;
import com.xumpy.thuisadmin.domain.Rekeningen;
import com.xumpy.thuisadmin.services.BedragenSrv;
import com.xumpy.thuisadmin.services.model.BedragenSrvPojo;
import com.xumpy.thuisadmin.services.model.GroepenSrvPojo;
import com.xumpy.thuisadmin.services.model.PersonenSrvPojo;
import com.xumpy.thuisadmin.services.model.RekeningenSrvPojo;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author Nico
 */
@Service
public class BedragenSrvImpl implements BedragenSrv, Serializable {

    @Autowired
    private BedragenDaoImpl bedragenDao;
    @Autowired
    private GroepenDaoImpl groepenDao;

    @Autowired
    private RekeningenDaoImpl rekeningenDao;

    @Autowired
    private UserInfo userInfo;

    static final Logger Log = Logger.getLogger(BedragenSrvImpl.class.getName());

    public static final String NEGATIEF = "NEGATIEF";
    public static final String POSITIEF = "POSITIEF";
    public static final String UPDATE = "UPDATE";
    public static final String INSERT = "INSERT";
    public static final String DELETE = "DELETE";

    @Override
    @Transactional
    public Bedragen save(NieuwBedrag nieuwBedrag) {
        nieuwBedrag.setPersoon(new PersonenSrvPojo(userInfo.getPersoon()));
        BedragenDaoPojo bedragen = new BedragenDaoPojo(convertNieuwBedrag(nieuwBedrag));

        if (bedragen.getPk_id() == null) {
            bedragen.setPk_id(bedragenDao.getNewPkId());

            bedragen = new BedragenDaoPojo(processRekeningBedrag(bedragen, INSERT));
        } else {
            bedragen = new BedragenDaoPojo(processRekeningBedrag(bedragen, UPDATE));
        }
        rekeningenDao.save(new RekeningenDaoPojo(bedragen.getRekening()));
        bedragenDao.save(bedragen);

        return bedragen;
    }

    @Override
    @Transactional
    public Bedragen delete(NieuwBedrag nieuwBedrag) {
        nieuwBedrag.setPersoon(new PersonenSrvPojo(userInfo.getPersoon()));
        Bedragen bedragen = convertNieuwBedrag(nieuwBedrag);
        bedragen = processRekeningBedrag(bedragen, DELETE);

        Rekeningen rekening = bedragen.getRekening();

        rekeningenDao.save(new RekeningenDaoPojo(rekening));
        bedragenDao.delete(new BedragenDaoPojo(bedragen));

        return bedragen;
    }

    @Override
    @Transactional
    public List<RekeningOverzicht> graphiekBedrag(Rekeningen rekening, Date beginDate, Date eindDate) {
        List<? extends Bedragen> lstBedragenSrv;
        if (rekening == null) {
            lstBedragenSrv = bedragenDao.BedragInPeriode(beginDate, eindDate, null, 0,
                    userInfo.getPersoon().getPk_id());
        } else {
            lstBedragenSrv = bedragenDao.BedragInPeriode(beginDate, eindDate, rekening.getPk_id(), 0,
                    userInfo.getPersoon().getPk_id());
        }

        Map overzichtBedragen = OverviewRekeningData(lstBedragenSrv);

        Iterator entries = overzichtBedragen.entrySet().iterator();
        List<RekeningOverzicht> rekeningOverzicht = new ArrayList<RekeningOverzicht>();
        while (entries.hasNext()) {
            Entry entry = (Entry) entries.next();
            rekeningOverzicht.add(new RekeningOverzicht(entry.getKey(), entry.getValue()));
        }

        return rekeningOverzicht;
    }

    @Override
    @Transactional
    public FinanceOverzichtGroep graphiekOverzichtGroep(Date beginDate, Date eindDate,
            Integer showBedragPublicGroep) {
        List<? extends Bedragen> bedragInPeriode = bedragenDao.BedragInPeriode(beginDate, eindDate, null,
                showBedragPublicGroep, userInfo.getPersoon().getPk_id());

        FinanceOverzichtGroep financeOverzichtGroep = new FinanceOverzichtGroep();

        List<? extends Bedragen> lstBedragen = bedragInPeriode;

        Map<Groepen, Map<String, BigDecimal>> bedragenOverzicht = OverviewRekeningGroep(bedragInPeriode);

        BigDecimal totaalKosten = new BigDecimal(0);
        BigDecimal totaalOpbrengsten = new BigDecimal(0);

        List<OverzichtGroep> overzichtGroepen = new ArrayList<OverzichtGroep>();
        for (Entry entry : bedragenOverzicht.entrySet()) {

            GroepenSrvPojo groep = new GroepenSrvPojo((Groepen) entry.getKey());

            if (groep.getCodeId() == null) {
                groep.setCodeId("NULL");
            }

            if (!groep.getCodeId().equals("INTER_REKENING")) {
                OverzichtGroep overzichtGroep = new OverzichtGroep();
                overzichtGroep.setGroepId(groep.getPk_id());
                overzichtGroep.setNaam(groep.getNaam());

                Map<String, BigDecimal> bedragen = (Map<String, BigDecimal>) entry.getValue();
                overzichtGroep.setTotaal_kosten(bedragen.get(NEGATIEF).doubleValue());
                overzichtGroep.setTotaal_opbrengsten(bedragen.get(POSITIEF).doubleValue());

                overzichtGroepen.add(overzichtGroep);

                totaalKosten = totaalKosten.add(bedragen.get(NEGATIEF));
                totaalOpbrengsten = totaalOpbrengsten.add(bedragen.get(POSITIEF));
            }
        }
        financeOverzichtGroep.setTotaal_kosten(totaalKosten.doubleValue());
        financeOverzichtGroep.setTotaal_opbrengsten(totaalOpbrengsten.doubleValue());

        financeOverzichtGroep.setOverzichtGroep(overzichtGroepen);

        return financeOverzichtGroep;
    }

    @Override
    @Transactional
    public OverzichtGroepBedragenTotal rapportOverzichtGroepBedragen(Integer typeGroepId, Date beginDate,
            Date eindDate, Integer showBedragPublicGroep, OverzichtGroepBedragenTotal overzichtGroepBedragenTotal) {
        List<? extends Bedragen> lstBedragenInPeriode = bedragenDao.BedragInPeriode(beginDate, eindDate, null,
                showBedragPublicGroep, userInfo.getPersoon().getPk_id());

        Groepen groepenSrv = groepenDao.findOne(typeGroepId);

        List<? extends Bedragen> lstBedragenNeg = getBedragenInGroep(lstBedragenInPeriode, groepenSrv, 1);
        List<? extends Bedragen> lstBedragenPos = getBedragenInGroep(lstBedragenInPeriode, groepenSrv, 0);

        List<OverzichtGroepBedragen> overzichtGroepBedragen = new ArrayList<OverzichtGroepBedragen>();

        BigDecimal somOverzicht = new BigDecimal(0);

        for (Bedragen bedrag : lstBedragenNeg) {
            OverzichtGroepBedragen overzichtGroepBedrag = new OverzichtGroepBedragen();

            BedragenSrvPojo bedragSrvPojo = new BedragenSrvPojo(bedrag);
            bedragSrvPojo.setBedrag(bedrag.getBedrag().multiply(new BigDecimal(-1)));
            overzichtGroepBedrag.setWithBedrag(bedragSrvPojo);

            overzichtGroepBedragen.add(overzichtGroepBedrag);
            somOverzicht = somOverzicht.add(bedragSrvPojo.getBedrag());
        }

        for (Bedragen bedrag : lstBedragenPos) {
            OverzichtGroepBedragen overzichtGroepBedrag = new OverzichtGroepBedragen();
            overzichtGroepBedrag.setWithBedrag(bedrag);

            overzichtGroepBedragen.add(overzichtGroepBedrag);
            somOverzicht = somOverzicht.add(bedrag.getBedrag());
        }

        overzichtGroepBedragenTotal.setSomBedrag(somOverzicht);
        overzichtGroepBedragenTotal.setOverzichtGroepBedragen(overzichtGroepBedragen);

        return overzichtGroepBedragenTotal;
    }

    @Override
    @Transactional
    public OverzichtGroepBedragenTotal rapportOverzichtGroepBedragen(Integer typeGroepId,
            Integer typeGroepKostOpbrengst, Date beginDate, Date eindDate, Integer showBedragPublicGroep,
            OverzichtGroepBedragenTotal overzichtGroepBedragenTotal) {
        List<? extends Bedragen> lstBedragenInPeriode = bedragenDao.BedragInPeriode(beginDate, eindDate, null,
                showBedragPublicGroep, userInfo.getPersoon().getPk_id());

        Groepen groepenSrv = groepenDao.findOne(typeGroepId);

        Integer negatief = new Integer(0);

        if (typeGroepKostOpbrengst.equals(1)) {
            negatief = 0;
        } else {
            negatief = 1;
        }
        List<? extends Bedragen> lstBedragen = getBedragenInGroep(lstBedragenInPeriode, groepenSrv, negatief);

        List<OverzichtGroepBedragen> overzichtGroepBedragen = new ArrayList<OverzichtGroepBedragen>();

        BigDecimal somOverzicht = new BigDecimal(0);

        for (Bedragen bedrag : lstBedragen) {
            OverzichtGroepBedragen overzichtGroepBedrag = new OverzichtGroepBedragen();
            overzichtGroepBedrag.setWithBedrag(bedrag);

            overzichtGroepBedragen.add(overzichtGroepBedrag);
            somOverzicht = somOverzicht.add(overzichtGroepBedrag.getBedrag());
        }
        overzichtGroepBedragenTotal.setSomBedrag(somOverzicht);

        overzichtGroepBedragenTotal.setOverzichtGroepBedragen(overzichtGroepBedragen);

        return overzichtGroepBedragenTotal;
    }

    @Override
    @Transactional
    public BeheerBedragenReportLst reportBedragen(BeheerBedragenReportLst beheerBedragenReportLst, Integer offset,
            Rekeningen rekening, String searchText) {

        searchText = StringUtils.isEmpty(searchText) ? null : "%" + searchText + "%";

        List<BeheerBedragenReport> beheerBedragenReport = new ArrayList<BeheerBedragenReport>();

        Pageable topTen = new PageRequest(offset, 10);

        Integer rekeningId;
        if (rekening == null) {
            rekeningId = null;
        } else {
            rekeningId = rekening.getPk_id();
        }

        for (Bedragen bedrag : bedragenDao.reportBedragen(rekeningId, searchText, userInfo.getPersoon().getPk_id(),
                topTen)) {
            beheerBedragenReport.add(new BeheerBedragenReport(bedrag));
        }

        beheerBedragenReportLst.setBeheerBedragenReport(beheerBedragenReport);

        return beheerBedragenReportLst;
    }

    @Override
    @Transactional(value = "transactionManager")
    public Bedragen findBedrag(Integer bedragId) {
        return bedragenDao.findOne(bedragId);
    }

    public Map OverviewRekeningData(List<? extends Bedragen> bedragen) {
        Map overviewRekeningData = new LinkedHashMap();

        BigDecimal rekeningStand;
        if (isRekeningUnique(bedragen)) {
            rekeningStand = getBedragAtDate(bedragen.get(0).getDatum(), bedragen.get(0).getRekening());
        } else {
            rekeningStand = getBedragAtDate(bedragen.get(0).getDatum(), null);
        }
        overviewRekeningData.put(bedragen.get(0).getDatum(), rekeningStand);

        for (Integer i = 1; i < bedragen.size(); i++) {
            if (!bedragen.get(i).getDatum().equals(bedragen.get(0).getDatum())) {
                if (bedragen.get(i).getGroep().getNegatief().equals(1)) {
                    rekeningStand = rekeningStand.subtract(bedragen.get(i).getBedrag());
                }
                if (bedragen.get(i).getGroep().getNegatief().equals(0)) {
                    rekeningStand = rekeningStand.add(bedragen.get(i).getBedrag());
                }
                overviewRekeningData.put(bedragen.get(i).getDatum(), rekeningStand);
            }
        }

        return overviewRekeningData;
    }

    @Override
    public OverzichtGroepBedragenTotal filterOverzichtGroepBedragenTotalGroep(
            OverzichtGroepBedragenTotal overzichtGroepBedragenTotal, Groepen groep) {
        List<OverzichtGroepBedragen> overzichtGroepBedragen = new ArrayList<OverzichtGroepBedragen>();
        BigDecimal newSomBedrag = new BigDecimal(0);

        OverzichtGroepBedragenTotal newOverzichtGroepBedragenTotal = new OverzichtGroepBedragenTotal();

        for (OverzichtGroepBedragen overzichtGroepBedrag : overzichtGroepBedragenTotal
                .getOverzichtGroepBedragen()) {
            if (overzichtGroepBedrag.getType_naam().equals(groep.getNaam())) {
                overzichtGroepBedragen.add(overzichtGroepBedrag);
                newSomBedrag = newSomBedrag.add(overzichtGroepBedrag.getBedrag());
            }
        }
        newOverzichtGroepBedragenTotal.setSomBedrag(newSomBedrag);
        newOverzichtGroepBedragenTotal.setOverzichtGroepBedragen(overzichtGroepBedragen);

        return newOverzichtGroepBedragenTotal;
    }

    @Override
    public OverzichtGroepBedragenTotal filterOverzichtGroepBedragenTotalFilter(
            OverzichtGroepBedragenTotal overzichtGroepBedragenTotal, String filter) {
        List<OverzichtGroepBedragen> overzichtGroepBedragen = new ArrayList<OverzichtGroepBedragen>();
        BigDecimal newSomBedrag = new BigDecimal(0);

        OverzichtGroepBedragenTotal newOverzichtGroepBedragenTotal = new OverzichtGroepBedragenTotal();

        if (overzichtGroepBedragenTotal.getOverzichtGroepBedragen() != null) {
            for (OverzichtGroepBedragen overzichtGroepBedrag : overzichtGroepBedragenTotal
                    .getOverzichtGroepBedragen()) {
                if (overzichtGroepBedrag.contains(filter)) {
                    overzichtGroepBedragen.add(overzichtGroepBedrag);
                    newSomBedrag = newSomBedrag.add(overzichtGroepBedrag.getBedrag());
                }
            }
        }
        newOverzichtGroepBedragenTotal.setSomBedrag(newSomBedrag);
        newOverzichtGroepBedragenTotal.setOverzichtGroepBedragen(overzichtGroepBedragen);

        return newOverzichtGroepBedragenTotal;
    }

    @Override
    public List<? extends Bedragen> orderByGroup(List<? extends Bedragen> bedragen) {
        List<String> groupNames = new ArrayList<String>();

        for (Bedragen bedrag : bedragen) {
            if (!groupNames.contains(bedrag.getGroep().getNaam())) {
                groupNames.add(bedrag.getGroep().getNaam());
            }
        }

        Collections.sort(groupNames);

        List<Bedragen> orderBedragen = new ArrayList<Bedragen>();

        for (String groupName : groupNames) {
            for (Bedragen bedrag : bedragen) {
                if (bedrag.getGroep().getNaam().equals(groupName)) {
                    orderBedragen.add(bedrag);
                }
            }
        }

        return orderBedragen;
    }

    public BigDecimal getTotalRekeningBedragen(List<? extends Bedragen> bedragen) {
        BigDecimal totaalRekeningen = new BigDecimal(0);
        List<Rekeningen> rekeningen = new ArrayList<Rekeningen>();

        for (Bedragen bedrag : bedragen) {
            if (!rekeningen.contains(bedrag.getRekening())) {
                rekeningen.add(bedrag.getRekening());
            }
        }

        for (Rekeningen rekening : rekeningen) {
            totaalRekeningen = totaalRekeningen.add(rekening.getWaarde());
        }

        return totaalRekeningen;
    }

    public boolean isRekeningUnique(List<? extends Bedragen> bedragen) {
        List<Rekeningen> rekeningen = new ArrayList<Rekeningen>();

        for (Bedragen bedrag : bedragen) {
            if (!rekeningen.contains(bedrag.getRekening())) {
                rekeningen.add(bedrag.getRekening());
            }
        }

        if (rekeningen.size() == 1) {
            return true;
        } else {
            return false;
        }
    }

    public Map<Groepen, Map<String, BigDecimal>> OverviewRekeningGroep(List<? extends Bedragen> bedragen) {
        Map<Groepen, Map<String, BigDecimal>> overviewRekeningGroep = new LinkedHashMap<Groepen, Map<String, BigDecimal>>();

        for (Bedragen bedrag : bedragen) {
            if (bedrag.getGroep().getCodeId() == null || !bedrag.getGroep().getCodeId().equals("INTER_REKENING")) {
                Groepen hoofdGroep = GroepenSrvImpl.getHoofdGroep(bedrag.getGroep());
                Map<String, BigDecimal> bedragInGroep = (Map<String, BigDecimal>) overviewRekeningGroep
                        .get(hoofdGroep);

                if (bedragInGroep == null) {
                    bedragInGroep = new LinkedHashMap<String, BigDecimal>();
                    bedragInGroep.put(POSITIEF, new BigDecimal(0));
                    bedragInGroep.put(NEGATIEF, new BigDecimal(0));
                }

                BigDecimal bedragNegatief = (BigDecimal) bedragInGroep.get(NEGATIEF);
                BigDecimal bedragPositief = (BigDecimal) bedragInGroep.get(POSITIEF);

                if (bedrag.getGroep().getNegatief().equals(1)) {
                    bedragNegatief = bedragNegatief.add(bedrag.getBedrag());
                } else {
                    bedragPositief = bedragPositief.add(bedrag.getBedrag());
                }

                bedragInGroep.put(POSITIEF, bedragPositief);
                bedragInGroep.put(NEGATIEF, bedragNegatief);

                overviewRekeningGroep.put(hoofdGroep, bedragInGroep);
            }
        }

        return overviewRekeningGroep;
    }

    public List<? extends Bedragen> getBedragenInGroep(List<? extends Bedragen> bedragen, Groepen hoofdGroep,
            Integer negatief) {
        List<Bedragen> bedragenInGroep = new ArrayList<Bedragen>();

        for (Bedragen bedrag : bedragen) {
            if (GroepenSrvImpl.getHoofdGroep(bedrag.getGroep()).getPk_id().equals(hoofdGroep.getPk_id())
                    && bedrag.getGroep().getNegatief().equals(negatief)) {
                bedragenInGroep.add(bedrag);
            }
        }

        return bedragenInGroep;
    }

    public static BigDecimal convertComma(String bedrag) {
        if (bedrag.contains(",")) {
            bedrag = bedrag.replace(".", "");
            bedrag = bedrag.replace(",", ".");
        } else {
            if (bedrag.indexOf(".", bedrag.indexOf(".") + 1) != -1) {
                bedrag = bedrag.replace(".", "");
            }
        }

        NumberFormat nf = NumberFormat.getInstance(new Locale("US"));
        BigDecimal bigDecimalBedrag = new BigDecimal(0);
        try {
            bigDecimalBedrag = new BigDecimal(nf.parse(bedrag).doubleValue());
        } catch (ParseException ex) {
            Logger.getLogger(BedragenSrvImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        bigDecimalBedrag = bigDecimalBedrag.setScale(2, BigDecimal.ROUND_HALF_UP);

        return bigDecimalBedrag;
    }

    public Bedragen convertNieuwBedrag(NieuwBedrag nieuwBedrag) {
        BedragenSrvPojo bedragen = new BedragenSrvPojo();

        bedragen.setPk_id(nieuwBedrag.getPk_id());
        bedragen.setDatum(nieuwBedrag.getDatum());
        bedragen.setGroep(nieuwBedrag.getGroep());
        bedragen.setOmschrijving(nieuwBedrag.getOmschrijving());
        bedragen.setPersoon(nieuwBedrag.getPersoon());
        bedragen.setRekening(nieuwBedrag.getRekening());

        BigDecimal bigDecimalBedrag = convertComma(nieuwBedrag.getBedrag());

        bedragen.setBedrag(bigDecimalBedrag);

        return bedragen;
    }

    public Bedragen processRekeningBedrag(Bedragen bedrag, String transaction) {
        BedragenSrvPojo bedragenSrvPojo = new BedragenSrvPojo(bedrag);
        RekeningenSrvPojo rekening = new RekeningenSrvPojo(bedrag.getRekening());

        if (transaction.equals(INSERT)) {
            if (bedragenSrvPojo.getGroep().getNegatief().equals(1)) {
                rekening.setWaarde(rekening.getWaarde().subtract(bedragenSrvPojo.getBedrag()));
            } else {
                rekening.setWaarde(rekening.getWaarde().add(bedragenSrvPojo.getBedrag()));
            }
        }

        if (transaction.equals(UPDATE)) {
            BedragenSrvPojo oldBedrag = new BedragenSrvPojo(bedragenDao.findOne(bedragenSrvPojo.getPk_id()));

            if (!oldBedrag.getRekening().equals(bedragenSrvPojo.getRekening())) {
                rekening = new RekeningenSrvPojo(moveBedragToRekening(oldBedrag, rekening));
            }

            if (bedragenSrvPojo.getGroep().getNegatief().equals(1)) {
                if (oldBedrag.getGroep().getNegatief().equals(1)) {
                    rekening.setWaarde((rekening.getWaarde().add(oldBedrag.getBedrag())));
                } else {
                    rekening.setWaarde((rekening.getWaarde().subtract(oldBedrag.getBedrag())));
                }
                rekening.setWaarde((rekening.getWaarde().subtract(bedragenSrvPojo.getBedrag())));
            } else {
                if (oldBedrag.getGroep().getNegatief().equals(1)) {
                    rekening.setWaarde((rekening.getWaarde().add(oldBedrag.getBedrag())));
                } else {
                    rekening.setWaarde((rekening.getWaarde().subtract(oldBedrag.getBedrag())));
                }
                rekening.setWaarde((rekening.getWaarde().add(bedragenSrvPojo.getBedrag())));
            }
        }

        if (transaction.equals(DELETE)) {
            if (bedragenSrvPojo.getGroep().getNegatief().equals(1)) {
                rekening.setWaarde((rekening.getWaarde().add(bedragenSrvPojo.getBedrag())));
            } else {
                rekening.setWaarde((rekening.getWaarde().subtract(bedragenSrvPojo.getBedrag())));
            }

        }

        bedragenSrvPojo.setRekening(rekening);

        return bedragenSrvPojo;
    }

    public Rekeningen moveBedragToRekening(BedragenSrvPojo bedrag, Rekeningen rekening2) {
        RekeningenSrvPojo rekening2SrvPojo = new RekeningenSrvPojo(rekening2);

        if (bedrag.getGroep().getNegatief().equals(0)) {
            bedrag.getRekening().setWaarde(bedrag.getRekening().getWaarde().subtract(bedrag.getBedrag()));
            rekeningenDao.save(new RekeningenDaoPojo(bedrag.getRekening()));
            rekening2 = rekeningenDao.findOne(rekening2.getPk_id());
            rekening2SrvPojo.setWaarde(rekening2.getWaarde().add(bedrag.getBedrag()));
        } else {
            bedrag.getRekening().setWaarde(bedrag.getRekening().getWaarde().add(bedrag.getBedrag()));
            rekeningenDao.save(new RekeningenDaoPojo(bedrag.getRekening()));
            rekening2 = rekeningenDao.findOne(rekening2.getPk_id());
            rekening2SrvPojo.setWaarde(rekening2.getWaarde().subtract(bedrag.getBedrag()));
        }
        return rekening2SrvPojo;
    }

    public static BeheerBedragenReportLst setButtons(BeheerBedragenReportLst beheerBedragenReportLst,
            BeheerBedragenInp beheerBedragenInp) {
        if (beheerBedragenInp.getOffset().equals(0)) {
            beheerBedragenReportLst.setShowPrevious(false);
        } else {
            beheerBedragenReportLst.setShowPrevious(true);
        }

        if (beheerBedragenReportLst.getBeheerBedragenReport() != null
                && beheerBedragenReportLst.getBeheerBedragenReport().size() == 10) {
            beheerBedragenReportLst.setShowNext(true);
        } else {
            beheerBedragenReportLst.setShowNext(false);
        }

        return beheerBedragenReportLst;
    }

    @Override
    public List<String> findAllMonthsBedragen(List<? extends Bedragen> bedragen) {
        SimpleDateFormat dt = new SimpleDateFormat("MM/yyyy");
        List<String> months = new ArrayList<String>();

        for (Bedragen bedrag : bedragen) {
            if (!months.contains(dt.format(bedrag.getDatum()))) {
                months.add(dt.format(bedrag.getDatum()));
            }
        }

        return months;
    }

    @Override
    public Map<Integer, BigDecimal> findMainBedragen(List<? extends Bedragen> bedragen, String Month) {
        SimpleDateFormat dt = new SimpleDateFormat("MM/yyyy");
        Map<GroepenSrvPojo, BigDecimal> mainBedragenPerGroup = new HashMap<GroepenSrvPojo, BigDecimal>();

        for (Bedragen bedrag : bedragen) {
            if (dt.format(bedrag.getDatum()).equals(Month)) {
                GroepenSrvPojo mainGroup = new GroepenSrvPojo(GroepenSrvImpl.getHoofdGroep(bedrag.getGroep()));
                if (mainBedragenPerGroup.containsKey(mainGroup)) {
                    BigDecimal ammount = mainBedragenPerGroup.get(mainGroup);
                    if (bedrag.getGroep().getNegatief().equals(1)) {
                        ammount = ammount.add(bedrag.getBedrag());
                    } else {
                        ammount = ammount.subtract(bedrag.getBedrag());
                    }
                    mainBedragenPerGroup.put(mainGroup, ammount);
                } else {
                    if (bedrag.getGroep().getNegatief().equals(1)) {
                        mainBedragenPerGroup.put(mainGroup, bedrag.getBedrag());
                    } else {
                        mainBedragenPerGroup.put(mainGroup, bedrag.getBedrag().multiply(new BigDecimal(-1)));
                    }
                }
            }
        }

        BigDecimal average = new BigDecimal(0);
        for (Map.Entry bedrag : mainBedragenPerGroup.entrySet()) {
            average = average.add((BigDecimal) bedrag.getValue());
        }
        average = average.divide(new BigDecimal(mainBedragenPerGroup.size()), 2, RoundingMode.HALF_UP);

        Map<Integer, BigDecimal> result = new HashMap<Integer, BigDecimal>();

        result.put(0, average);

        for (Map.Entry bedrag : mainBedragenPerGroup.entrySet()) {
            result.put(((GroepenSrvPojo) bedrag.getKey()).getPk_id(), (BigDecimal) bedrag.getValue());
        }

        return result;
    }

    @Override
    @Transactional(value = "jpaTransactionManager")
    public List<? extends Bedragen> selectBedragenInPeriode(Date beginDate, Date endDate) {
        List<? extends Bedragen> bedragen = bedragenDao.BedragInPeriode(beginDate, endDate, null, 0,
                userInfo.getPersoon().getPk_id());

        return bedragen;
    }

    @Override
    public List<? extends Bedragen> filterBedragenWithMainGroup(List<? extends Bedragen> bedragen,
            List<Integer> MainGroupId) {
        List<Bedragen> result = new ArrayList<Bedragen>();

        for (Bedragen bedrag : bedragen) {
            if (MainGroupId.contains(GroepenSrvImpl.getHoofdGroep(bedrag.getGroep()).getPk_id())) {
                result.add(bedrag);
            }
        }

        return result;
    }

    @Override
    @Transactional(value = "jpaTransactionManager")
    public BigDecimal getBedragAtDate(Date date, Rekeningen rekening) {
        BigDecimal rekeningStand;

        List<BedragenDaoPojo> lstBedragen;
        if (rekening != null) {
            lstBedragen = bedragenDao.getBedragenUntilDate(date, rekening.getPk_id(),
                    userInfo.getPersoon().getPk_id());
            rekeningStand = rekening.getWaarde();
        } else {
            lstBedragen = bedragenDao.getBedragenUntilDate(date, null, userInfo.getPersoon().getPk_id());
            rekeningStand = rekeningenDao.totalAllRekeningen(userInfo.getPersoon().getPk_id());
        }

        for (BedragenDaoPojo bedrag : lstBedragen) {
            if (bedrag.getGroep().getNegatief().equals(1)) {
                rekeningStand = rekeningStand.add(bedrag.getBedrag());
            }
            if (bedrag.getGroep().getNegatief().equals(0)) {
                rekeningStand = rekeningStand.subtract(bedrag.getBedrag());
            }
        }

        return rekeningStand;
    }

    @Override
    @Transactional(value = "jpaTransactionManager")
    public Map<String, BigDecimal> getPositiveNegativeBedragen(Date startDate, Date endDate) {
        Map<String, BigDecimal> bedragen = new HashMap<String, BigDecimal>();

        List<BedragenDaoPojo> bedragenDaoPojos = bedragenDao.BedragInPeriode(startDate, endDate,
                userInfo.getPersoon().getPk_id());

        bedragen.put("POS", new BigDecimal(0));
        bedragen.put("NEG", new BigDecimal(0));

        for (BedragenDaoPojo bedragenDaoPojo : bedragenDaoPojos) {
            if (bedragenDaoPojo.getGroep().getNegatief() == 1) {
                bedragen.put("NEG", bedragen.get("NEG").add(bedragenDaoPojo.getBedrag()));
            } else {
                bedragen.put("POS", bedragen.get("POS").add(bedragenDaoPojo.getBedrag()));
            }
        }

        return bedragen;
    }

    public List<List<Object>> getBedragenInMonthRange(String startMonth, String endMonth) throws ParseException {
        List<List<Object>> bedragenInMonthRange = new ArrayList<List<Object>>();

        for (String month : getAllMonths(startMonth, endMonth)) {
            SimpleDateFormat dt = new SimpleDateFormat("dd/MM/yyyy");
            Date startDate = dt.parse("01/" + month);
            Calendar c = Calendar.getInstance();
            c.setTime(startDate);
            c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
            Date endDate = c.getTime();

            Map<String, BigDecimal> bedragen = getPositiveNegativeBedragen(startDate, endDate);

            List<Object> values = new ArrayList<Object>();
            values.add(month);
            values.add(bedragen.get("POS"));
            values.add(bedragen.get("NEG"));

            bedragenInMonthRange.add(values);
        }

        return bedragenInMonthRange;
    }

    private Integer monthToInteger(String monthYear) {
        String[] monthSplit = monthYear.split("/");
        Integer month = Integer.parseInt(monthSplit[0]);
        Integer year = Integer.parseInt(monthSplit[1]);

        return (year * 12) + month;
    }

    private String integerToMonth(Integer monthInteger) {
        Integer month = monthInteger % 12;
        Integer year = (int) Math.floor(monthInteger / 12);

        if (month == 0) {
            month = 12;
            year = year - 1;
        }

        return String.format("%02d", month) + "/" + Integer.toString(year);
    }

    public List<String> getAllMonths(String startMonth, String endMonth) {
        List<String> allMonths = new ArrayList<String>();
        for (int i = monthToInteger(startMonth); i <= monthToInteger(endMonth); i++) {
            allMonths.add(integerToMonth(i));
        }

        return allMonths;
    }
}