/* * Copyright 2014 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.dashbuilder.backend; import java.util.Calendar; import java.util.Date; import java.util.Map; import java.util.Random; import javax.enterprise.context.ApplicationScoped; import org.dashbuilder.dataset.DataSet; import org.dashbuilder.dataset.DataSetBuilder; import org.dashbuilder.dataset.DataSetFactory; import org.dashbuilder.dataset.DataSetGenerator; import static org.dashbuilder.shared.sales.SalesConstants.*; /** * Generates a random data set containing sales opportunity records. */ @ApplicationScoped public class SalesDataSetGenerator implements DataSetGenerator { private static String[] DIC_PIPELINE = {"EARLY", "STANDBY", "ADVANCED"}; private static String[] DIC_STATUS = {"CONTACTED", "STANDBY", "DEMO", "SHORT LISTED", "LOST", "WIN", "VERBAL COMMITMENT", "QUALIFIED"}; private static String[] DIC_COUNTRIES = {"United States", "China", "Japan", "Germany", "France", "United Kingdom", "Brazil", "Italy", "India", "Canada", "Russia", "Spain", "Australia", "Mexico", "South Korea", "Netherlands", "Turkey", "Indonesia", "Switzerland", "Poland", "Belgium", "Sweden", "Saudi Arabia", "Norway"}; private static String[] DIC_PRODUCT = {"PRODUCT 1", "PRODUCT 2", "PRODUCT 3", "PRODUCT 4", "PRODUCT 5", "PRODUCT 6", "PRODUCT 7", "PRODUCT 8", "PRODUCT 8", "PRODUCT 10", "PRODUCT 11"}; private static String[] DIC_SALES_PERSON = {"Roxie Foraker", "Jamie Gilbeau", "Nita Marling", "Darryl Innes", "Julio Burdge", "Neva Hunger", "Kathrine Janas", "Jerri Preble"}; private static String[] DIC_CUSTOMER = {"Company 1", "Company 2", "Company 3", "Company 3", "Company 4", "Company 5", "Company 6", "Company 7", "Company 8", "Company 9"}; private static String[] DIC_SOURCE = {"Customer", "Reference", "Personal contact", "Partner", "Website", "Lead generation", "Event"}; private static double MAX_AMOUNT = 15000; private static double MIN_AMOUNT = 8000; private static double AVG_CLOSING_DAYS = 90; private Random random = new Random(System.currentTimeMillis()); public DataSet buildDataSet(Map<String,String> params) { int currentYear = Calendar.getInstance().get(Calendar.YEAR); int startYear = currentYear + parseParam(params.get("startYear"), -2); int endYear = currentYear + parseParam(params.get("endYear"), 2); int opportunitiesPerMonth = parseParam(params.get("oppsPerMonth"), 30); DataSetBuilder builder = DataSetFactory.newDataSetBuilder() .number(AMOUNT) .date(CREATION_DATE) .date(CLOSING_DATE) .label(PIPELINE) .label(STATUS) .label(CUSTOMER) .label(COUNTRY) .label(PRODUCT) .label(SALES_PERSON) .number(PROBABILITY) .label(SOURCE) .number(EXPECTED_AMOUNT) .label(COLOR); for (int year = startYear; year <= endYear; year++) { for (int month = 0; month < 12; month++) { for (int i = 0; i < opportunitiesPerMonth; i++) { double amount = MIN_AMOUNT + random.nextDouble() * (MAX_AMOUNT - MIN_AMOUNT); double probability = random.nextDouble() * 100.0; Date creationDate = buildDate(month, year); String color = "GREEN"; if (probability < 25) color = "RED"; else if (probability < 50) color = "GREY"; else if (probability < 75) color = "YELLOW"; builder.row(amount, creationDate, addDates(creationDate, (int) (AVG_CLOSING_DAYS + random.nextDouble() * AVG_CLOSING_DAYS * 0.5)), randomValue(DIC_PIPELINE), randomValue(DIC_STATUS), randomValue(DIC_CUSTOMER), randomValue(DIC_COUNTRIES), randomValue(DIC_PRODUCT), randomValue(DIC_SALES_PERSON), probability, randomValue(DIC_SOURCE), amount * (1 + (random.nextDouble() * ((month*i)%10)/10)), color); } } } return builder.buildDataSet(); } protected int parseParam(String param, int defaultValue) { try { return Integer.parseInt(param); } catch (NumberFormatException e) { return defaultValue; } } private Date buildDate(int month, int year) { Calendar c = Calendar.getInstance(); c.set(Calendar.DAY_OF_MONTH, random.nextInt(28)); // No sales on 29, 30 and 31 ;-) c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, month - 1); // Some genius thought that the first month is 0 c.set(Calendar.HOUR_OF_DAY, random.nextInt(24)); c.set(Calendar.MINUTE, random.nextInt(60)); return c.getTime(); } private Date addDates(Date d, int days) { Calendar c = Calendar.getInstance(); c.setTime(d); c.add(Calendar.DAY_OF_MONTH, days); return c.getTime(); } private String randomValue(String[] dic) { return dic[random.nextInt(dic.length)]; } }