Package no.ugland.utransprod.service.impl

Source Code of no.ugland.utransprod.service.impl.SalesVManagerImpl

package no.ugland.utransprod.service.impl;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.log4j.Logger;

import no.ugland.utransprod.ProTransException;
import no.ugland.utransprod.dao.SalesDataSnapshotDAO;
import no.ugland.utransprod.dao.SalesVDAO;
import no.ugland.utransprod.gui.handlers.CheckObject;
import no.ugland.utransprod.gui.model.BudgetType;
import no.ugland.utransprod.model.Budget;
import no.ugland.utransprod.model.ProductArea;
import no.ugland.utransprod.model.SalesmanGoal;
import no.ugland.utransprod.model.SalesmanGoal.PeriodeEnum;
import no.ugland.utransprod.service.BudgetManager;
import no.ugland.utransprod.service.OrderManager;
import no.ugland.utransprod.service.ProductAreaManager;
import no.ugland.utransprod.service.SalesVManager;
import no.ugland.utransprod.util.Periode;
import no.ugland.utransprod.util.Util;
import no.ugland.utransprod.util.YearWeek;
import no.ugland.utransprod.util.excel.ExcelReportEnum;
import no.ugland.utransprod.util.excel.ExcelReportSetting;
import no.ugland.utransprod.util.report.ProbabilityEnum;
import no.ugland.utransprod.util.report.SaleReportData;
import no.ugland.utransprod.util.report.SaleReportSum;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.google.inject.internal.Lists;
import com.google.inject.internal.Maps;

public class SalesVManagerImpl implements SalesVManager {
  private SalesVDAO dao;

  private SalesDataSnapshotDAO salesDataSnapshotDAO;

  private OrderManager orderManager;
  private BudgetManager budgetManager;

  private ProductAreaManager productAreaManager;
  private static Map<ProbabilityEnum, Set<SaleReportData>> reportMap = com.google.common.collect.Maps
      .newHashMap();
 
  private static Logger LOGGER = Logger.getLogger(SalesVManagerImpl.class);

  public final void setSalesDataSnapshotDAO(final SalesDataSnapshotDAO aDao) {
    this.salesDataSnapshotDAO = aDao;
  }

  public final void setSalesVDAO(final SalesVDAO aDao) {
    this.dao = aDao;
  }

  public final void setOrderManager(final OrderManager aOrderManager) {
    this.orderManager = aOrderManager;
  }

  public final List<SaleReportSum> groupSumCountyByProbabilityProductAreaPeriode(
      ProbabilityEnum probabilityEnum, ProductArea productArea,
      Periode periode) throws ProTransException {
    int currentWeek = Util.getCurrentWeek();
    int currentYear = Util.getCurrentYear();

    checkPeriode(periode, currentWeek, currentYear);
    // dersom det skal hentes data for gjeldende uke hentes livedata
    if (currentYear == periode.getYear()
        && currentWeek == periode.getWeek()) {
      return dao.groupSumCountyByProbabilityProductAreaPeriode(
          probabilityEnum, productArea, periode);
    }
    return salesDataSnapshotDAO
        .groupSumCountyByProbabilityProductAreaPeriode(probabilityEnum,
            productArea, periode);

  }

  public final List<SaleReportSum> groupSumSalesmanByProbabilityProductAreaPeriode(
      ProbabilityEnum probabilityEnum, ProductArea productArea,
      Periode periode) throws ProTransException {
    int currentWeek = Util.getCurrentWeek();
    int currentYear = Util.getCurrentYear();

    checkPeriode(periode, currentWeek, currentYear);
    // dersom det skal hentes data for gjeldende uke hentes livedata
    if (currentYear == periode.getYear()
        && currentWeek == periode.getWeek()) {
      return dao.groupSumSalesmanByProbabilityProductAreaPeriode(
          probabilityEnum, productArea, periode);
    }
    return salesDataSnapshotDAO
        .groupSumSalesmanByProbabilityProductAreaPeriode(
            probabilityEnum, productArea, periode);

  }

  public List<?> findByParams(ExcelReportSetting params)
      throws ProTransException {
    SalesReportType reportType = SalesReportType.valueOf(params
        .getExcelReportType().name());
    return createReportMapAndGetData(reportType, params.getPeriode(),
        params.getProductArea());
  }

  public List<?> createReportMapAndGetData(SalesReportType reportType,
      Periode periode, ProductArea productArea) throws ProTransException {

    if (reportType == SalesReportType.SALES_REPORT
        || reportType == SalesReportType.SALES_REPORT_SALESMAN) {
      createReportMap(productArea, periode);
    }
    return reportType
        .getData(reportMap, orderManager, productArea, periode);
  }

  public Multimap<ProbabilityEnum, SaleReportSum> getAllReportData(
      ProductArea productArea, Periode periode) throws ProTransException {
   
    Multimap<ProbabilityEnum, SaleReportSum> salesMap = ArrayListMultimap
    .create();
   
    for(ProbabilityEnum probability:ProbabilityEnum.getAllSalesProbabilityEnums()){
      salesMap.put(probability, getGroupSumByProbabilityProductAreaPeriod(probability, productArea, periode));
    }
   
    salesMap.put(ProbabilityEnum.PROBABILITY_CONFRIM_ORDER, orderManager.groupSumByProductAreaConfirmPeriode(productArea, periode));
   
    /*createReportMap(productArea, periode);
    Multimap<ProbabilityEnum, SaleReportSum> salesMap = ArrayListMultimap
        .create();
    for (SalesReportType reportType : SalesReportType.values()) {
      if (reportType.isPartOfSalesStatistic()) {
        salesMap.putAll(reportType.getProbability(),
            (List<SaleReportSum>) reportType.getData(reportMap,
                orderManager, productArea, periode));
      }
    }*/

    return salesMap;
  }

  private void createReportMap(ProductArea productArea, Periode periode)
      throws ProTransException {

    getSalesMap(productArea, periode);

  }

  public Map<ProbabilityEnum, Set<SaleReportData>> getSalesMap(
      ProductArea productArea, Periode periode) throws ProTransException {
    reportMap.clear();
    LOGGER.debug("getSalesMap");
    LOGGER.debug("Produktomr�de: "+productArea.getProductArea());
    LOGGER.debug("Periode: "+periode.getFormattetYearFromWeekToWeek());
    List<SaleReportData> salesDataList = getSaleReportByProductAreaPeriode(
        productArea, periode);
    LOGGER.debug("SalesDataList Antall: "+salesDataList.size());

    for (SaleReportData sale : salesDataList) {
      //LOGGER.debug("getSalesMap - "+sale.getProbabilityEnum());
      sale.getProbabilityEnum().addToSalesReportMap(reportMap, sale,
          periode);
    }
    return reportMap;
  }

  public Map<Object, Object> getReportDataMap(ExcelReportSetting params) throws ProTransException {
    List<SalesmanGoal> dataList=getSalesGoalList(params.getPeriode());
    Map<Object,Object> dataMap=Maps.newHashMap();
    dataMap.put("Reportdata", dataList);
    return dataMap;
  }

  public String getInfoButtom(ExcelReportSetting params)
      throws ProTransException {
    SalesReportType reportType = SalesReportType.valueOf(params
        .getExcelReportType().name());
    return reportType.getInfoButtom(params.getProductArea(), params
        .getPeriode(), this, orderManager);
  }

  public String getInfoTop(ExcelReportSetting params) {
    SalesReportType reportType = SalesReportType.valueOf(params
        .getExcelReportType().name());
    return reportType.getInfoTop();
  }

  public Integer countByProbabilityProductAreaPeriode(
      ProbabilityEnum probabilityEnum, ProductArea productArea,
      Periode periode) throws ProTransException {
    int currentWeek = Util.getCurrentWeek();
    int currentYear = Util.getCurrentYear();

    checkPeriode(periode, currentWeek, currentYear);

    // dersom det skal hentes data for gjeldende uke hentes livedata
    if (currentYear == periode.getYear()
        && currentWeek == periode.getWeek()) {
      return dao.countByProbabilityProductAreaPeriode(probabilityEnum,
          productArea, periode);
    }
    return salesDataSnapshotDAO.countByProbabilityProductAreaPeriode(
        probabilityEnum, productArea, periode);
  }

  private void checkPeriode(Periode periode, int currentWeek, int currentYear)
      throws ProTransException {
    if (periode.getYear() == currentYear
        && ((periode.getWeek() == currentWeek && periode.getToWeek() != currentWeek) || (periode
            .getWeek() != currentWeek && periode.getToWeek() == currentWeek))) {
      throw new ProTransException(
          "Salgsdata for gjeldende uke m� genereres for seg selv");
    }
  }

  public List<SaleReportData> getSaleReportByProbabilityProductAreaPeriode(
      ProbabilityEnum probabilityEnum, ProductArea productArea,
      Periode periode, String typeName) throws ProTransException {
    int currentWeek = Util.getCurrentWeek();
    int currentYear = Util.getCurrentYear();
    checkPeriode(periode, currentWeek, currentYear);

    // dersom det skal hentes data for gjeldende uke hentes livedata
    if (currentYear == periode.getYear()
        && currentWeek == periode.getWeek()) {
      return dao.getSaleReportByProbabilityProductAreaPeriode(
          probabilityEnum, productArea, periode, typeName);
    }
    return salesDataSnapshotDAO
        .getSaleReportByProbabilityProductAreaPeriode(probabilityEnum,
            productArea, periode, typeName);
  }

  public List<SaleReportData> getSaleReportByProductAreaPeriode(
      ProductArea productArea, Periode periode) throws ProTransException {
    int currentWeek = Util.getCurrentWeek();
    int currentYear = Util.getCurrentYear();
    checkPeriode(periode, currentWeek, currentYear);

    // dersom det skal hentes data for gjeldende uke hentes livedata
    if (currentYear == periode.getYear()
        && currentWeek == periode.getWeek()) {
      return dao.getSaleReportByProductAreaPeriode(productArea, periode);
    }
    return salesDataSnapshotDAO.getSaleReportByProductAreaPeriode(
        productArea, periode);
  }

  public CheckObject checkExcel(ExcelReportSetting params) {
    return null;
  }

  public List<SalesmanGoal> getSalesGoalList(Periode periode)
      throws ProTransException {
    Map<String, SalesmanGoal> salesmanGoals = Maps.newHashMap();

    for (PeriodeEnum periodeEnum : PeriodeEnum.values()) {
      generateForProductAreaAndReportType(periodeEnum
          .convertPeriode(periode), salesmanGoals, periodeEnum);

    }

    setBudgetValues(salesmanGoals, periode);

    List<SalesmanGoal> salemanGoalList = Lists.newArrayList(salesmanGoals
        .values());
    Collections.sort(salemanGoalList);
    return salemanGoalList;
  }

  private void setBudgetValues(Map<String, SalesmanGoal> salesmanGoals,
      Periode periode) {
    for (SalesmanGoal goal : salesmanGoals.values()) {
      Budget budget = budgetManager.findByYearAndSalesman(periode
          .getYear(), goal.getSalesman(), goal.getProductArea(),
          BudgetType.SALESMAN);
      goal.setBudgetValue(budget.getBudgetValue());
      goal.setBudgetValueOffer(budget.getBudgetValueOffer());
    }

  }

  private void generateForProductAreaAndReportType(Periode periode,
      Map<String, SalesmanGoal> salesmanGoals, PeriodeEnum periodeEnum)
      throws ProTransException {
    for (ProductArea productArea : productAreaManager.findAll()) {
      generateForEachReportType(periode, productArea, salesmanGoals,
          periodeEnum);
    }
  }

  @SuppressWarnings("unchecked")
  private void generateForEachReportType(Periode periode,
      ProductArea productArea, Map<String, SalesmanGoal> salesmanGoals,
      PeriodeEnum periodeEnum) throws ProTransException {
    for (SalesReportType reportType : SalesReportType
        .getSalesGoalReportTypes()) {
      // f�rste uka i �ret
      if (periode.getToWeek() == 0) {
        setAccumulatedLikeWeek(salesmanGoals);
      } else {
        List<SaleReportSum> saleReportSumList = (List<SaleReportSum>) createReportMapAndGetData(
            reportType, periode, productArea);
        for (SaleReportSum saleReportSum : saleReportSumList) {
          SalesmanGoal salesmanGoal = getSalesmanGoal(productArea,
              salesmanGoals, saleReportSum, periodeEnum);

          if (salesmanGoal != null) {
            salesmanGoal.setSalesman(saleReportSum.getSalesman());
            salesmanGoal.setProductArea(productArea);

            salesmanGoal.setValue(reportType.getInfoTop(),
                saleReportSum.getSumOwnProduction(),
                periodeEnum);
            salesmanGoal.setDbValue(reportType.getInfoTop(),
                periodeEnum, saleReportSum.getSumDb());
            salesmanGoals.put(saleReportSum.getSalesman()
                + productArea.getProductArea(), salesmanGoal);
          }
        }
      }

    }
  }

  private void setAccumulatedLikeWeek(Map<String, SalesmanGoal> salesmanGoals) {
    for(SalesmanGoal goal:salesmanGoals.values()){
      goal.setOfferSumOwnProductionAccumulated(goal.getOfferSumOwnProduction());
      goal.setOrderSumOwnProductionAccumulated(goal.getOrderSumOwnProduction());
      goal.setConfirmedOrderSumOwnProductionAccumulated(goal.getConfirmedOrderSumOwnProduction());
      goal.setDbAccumulated(goal.getDb());
      goal.setOfferSumOwnProductionAccumulatedLastYear(goal.getOfferSumOwnProductionLastYear());
      goal.setOrderSumOwnProductionAccumulatedLastYear(goal.getOrderSumOwnProductionLastYear());
     
     
    }
   
  }

  private SalesmanGoal getSalesmanGoal(ProductArea productArea,
      Map<String, SalesmanGoal> salesmanGoals,
      SaleReportSum saleReportSum, PeriodeEnum periodeEnum) {
    SalesmanGoal salesmanGoal = salesmanGoals.get(saleReportSum
        .getSalesman()
        + productArea.getProductArea());
    salesmanGoal = salesmanGoal != null ? salesmanGoal : periodeEnum
        .salesmanShouldExist() ? null : new SalesmanGoal();
    return salesmanGoal;
  }

  public void setProductAreaManager(ProductAreaManager productAreaManager) {
    this.productAreaManager = productAreaManager;
  }

  public void setBudgetManager(BudgetManager budgetManager) {
    this.budgetManager = budgetManager;
  }

  public SaleReportSum getGroupSumByProbabilityProductAreaPeriod(
      ProbabilityEnum probability, ProductArea productArea,
      Periode periode) throws ProTransException{
    int currentWeek = Util.getCurrentWeek();
    int currentYear = Util.getCurrentYear();
    checkPeriode(periode, currentWeek, currentYear);

    // dersom det skal hentes data for gjeldende uke hentes livedata
    if (currentYear == periode.getYear()
        && currentWeek == periode.getWeek()) {
      return dao.getGroupSumByProbabilityProductAreaPeriod(
          probability, productArea,
          periode);
    }
    return salesDataSnapshotDAO.getGroupSumByProbabilityProductAreaPeriod(
        probability, productArea,
        periode);
  }

}
TOP

Related Classes of no.ugland.utransprod.service.impl.SalesVManagerImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.