package no.dusken.barweb.plugin.statisticsplugin.control;
import no.dusken.barweb.model.BarPerson;
import no.dusken.barweb.model.Gjeng;
import no.dusken.barweb.model.Transaksjon;
import no.dusken.barweb.model.TransaksjonVare;
import no.dusken.barweb.plugin.statisticsplugin.model.StatisticsElement;
import no.dusken.barweb.plugin.statisticsplugin.service.StatisticsService;
import no.dusken.barweb.service.BarPersonService;
import no.dusken.barweb.service.GjengService;
import no.dusken.barweb.service.TransaksjonService;
import org.kantega.jexmec.store.PluginStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
/**
* @author Marvin B. Lillehaug <lillehau@underdusken.no>
* Contains methods that when evoked saves elements.
*/
@Component
public class CreateStatisticsController {
@Inject
private BarPersonService barPersonService;
@Inject
private GjengService gjengService;
@Inject
private TransaksjonService transaksjonService;
@Inject
private StatisticsService statisticsService;
@Inject
private PluginStore pluginStore;
private final Logger logger = LoggerFactory.getLogger(getClass());
private final String beer = "ØL";
@Scheduled(cron = "0 0 11 ? * THU")
public void createPersonBalance() {
logger.info("Creating statistics for person balance");
for(BarPerson p : getAllPersonsDefaultGjeng()){
StatisticsElement el = new StatisticsElement();
el.setName(StatisticsConstants.PERSON_BALANCE);
el.setAmount(p.getMoney().longValue());
el.setTrackedObjectId(p.getId());
el.getTimeCreated().getTimeInMillis();
statisticsService.save(el);
}
}
@Scheduled(cron = "0 0 11 ? * THU")
public void createPersonMoneyLastWeek() {
logger.info("Creating statistics for money spent last week");
List<BarPerson> allBarPersons = getAllPersonsDefaultGjeng();
Calendar now = new GregorianCalendar();
Calendar then = new GregorianCalendar();
then.add(Calendar.WEEK_OF_YEAR, -1);
for(BarPerson p : allBarPersons) {
StatisticsElement el = new StatisticsElement();
el.setName(StatisticsConstants.PERSON_MONEY_SPENT_LAST_WEEK);
List<Transaksjon> transaksjons = transaksjonService.getByBarPersonAndTimeCreatedBetween(p, then, now);
long sum = 0;
for (Transaksjon t : transaksjons) {
// Only count what has been used, not when a person pays to the bar.
if (t.getSum() > 0) sum += t.getSum();
}
el.setAmount(sum);
el.setTrackedObjectId(p.getId());
statisticsService.save(el);
}
}
@Scheduled(cron = "0 0 11 ? * THU")
public void createPersonBeersLastWeek() {
logger.info("Creating statistics for beers per person last week");
List<BarPerson> allBarPersons = getAllPersonsDefaultGjeng();
Calendar now = new GregorianCalendar();
Calendar then = new GregorianCalendar();
then.add(Calendar.WEEK_OF_YEAR, -1);
for(BarPerson p : allBarPersons) {
StatisticsElement el = new StatisticsElement();
el.setName(StatisticsConstants.PERSON_BEER_LAST_WEEK);
el.setTrackedObjectId(p.getId());
Integer sum = 0;
for (Transaksjon t : transaksjonService.getByBarPersonAndTimeCreatedBetween(p, then, now)){
for (TransaksjonVare tv : t.getTransaksjoner()) {
if (tv.getVare().getName().toLowerCase().equals(beer.toLowerCase())) sum += tv.getAmount();
}
}
el.setAmount(sum.longValue());
statisticsService.save(el);
}
}
@Scheduled(cron = "0 0 11 ? * THU")
public void createTotalBeersLastWeek() {
logger.info("Creating statistics for total number of beers last week");
List<BarPerson> allBarPersons = getAllPersonsDefaultGjeng();
Calendar now = new GregorianCalendar();
Calendar then = new GregorianCalendar();
then.add(Calendar.WEEK_OF_YEAR, -1);
StatisticsElement el = new StatisticsElement();
el.setName(StatisticsConstants.GJENG_BEER_LAST_WEEK);
el.setTrackedObjectId(gjengService.getByDefaultGjengTrue().getId());
Integer sum = 0;
for(BarPerson p : allBarPersons) {
for (Transaksjon t : transaksjonService.getByBarPersonAndTimeCreatedBetween(p, then, now)){
for (TransaksjonVare tv : t.getTransaksjoner()) {
if (tv.getVare().getName().toLowerCase().equals(beer.toLowerCase())) sum += tv.getAmount();
}
}
}
el.setAmount(sum.longValue());
statisticsService.save(el);
}
@Scheduled(cron = "0 0 11 ? * THU")
public void createTotalMoneySpentLastWeek() {
logger.info("Creating statistics for total money spent last week");
List<BarPerson> allBarPersons = getAllPersonsDefaultGjeng();
Calendar now = new GregorianCalendar();
Calendar then = new GregorianCalendar();
then.add(Calendar.WEEK_OF_YEAR, -1);
StatisticsElement el = new StatisticsElement();
el.setName(StatisticsConstants.GJENG_MONEY_SPENT_LAST_WEEK);
el.setTrackedObjectId(gjengService.getByDefaultGjengTrue().getId());
Integer sum = 0;
for(BarPerson p : allBarPersons) {
for (Transaksjon t : transaksjonService.getByBarPersonAndTimeCreatedBetween(p, then, now)){
for (TransaksjonVare tv : t.getTransaksjoner()) {
sum += tv.getAmount() * tv.getVare().getInternalPrice();
}
}
}
el.setAmount(sum.longValue());
statisticsService.save(el);
}
@Scheduled(cron = "0 0 11 ? * THU")
public void createSumPersonBalance() {
logger.info("Creating statistics for sum person balances");
StatisticsElement el = new StatisticsElement();
el.setName(StatisticsConstants.SUM_PERSON_BALANCE);
el.setTrackedObjectId(gjengService.getByDefaultGjengTrue().getId());
el.setShowOnlyInAdmin(true);
Integer sum = 0;
for(BarPerson p : getAllPersonsDefaultGjeng()){
sum += p.getMoney();
}
el.setAmount(sum.longValue());
statisticsService.save(el);
}
@Scheduled(cron = "0 0 11 ? * THU")
public void createValueInBar() {
logger.info("Creating statistics for value in bar");
StatisticsElement el = new StatisticsElement();
el.setName(StatisticsConstants.GJENG_VALUE_BAR);
el.setShowOnlyInAdmin(true);
el.setAmount(Long.valueOf(pluginStore.getString("valuesinbar", "0")));
el.setTrackedObjectId(gjengService.getByDefaultGjengTrue().getId());
statisticsService.save(el);
}
@Scheduled(cron = "0 0 11 ? * THU")
public void createValueInBank() {
logger.info("Creating statistics for value in bank");
StatisticsElement el = new StatisticsElement();
el.setName(StatisticsConstants.GJENG_VALUE_BANK);
el.setShowOnlyInAdmin(true);
el.setAmount(Long.valueOf(pluginStore.getString("valuesinbank", "0")));
el.setTrackedObjectId(gjengService.getByDefaultGjengTrue().getId());
statisticsService.save(el);
}
@Scheduled(cron = "0 0 11 ? * THU")
public void createLiquidity() {
logger.info("Creating statistics for bar liquidity");
Long amount = barPersonService.getSumPersonBalances(gjengService.getByDefaultGjengTrue());
Long valueInBar = Long.valueOf(pluginStore.getString("valuesinbar", "0"));
Long valueInBank = Long.valueOf(pluginStore.getString("valuesinbank", "0"));
StatisticsElement el = new StatisticsElement();
el.setName(StatisticsConstants.GJENG_LIQUIDITY);
el.setTrackedObjectId(gjengService.getByDefaultGjengTrue().getId());
el.setShowOnlyInAdmin(true);
el.setAmount(valueInBar + valueInBank - amount);
statisticsService.save(el);
}
private List<BarPerson> getAllPersonsDefaultGjeng() {
Gjeng g = gjengService.getByDefaultGjengTrue();
List<BarPerson> all = barPersonService.getActivePersons(g);
all.addAll(barPersonService.getNonActivePersons(g));
return all;
}
public void setGjengService(GjengService gjengService) {
this.gjengService = gjengService;
}
public void setStatisticsService(StatisticsService statisticsService) {
this.statisticsService = statisticsService;
}
public void setBarPersonService(BarPersonService barPersonService) {
this.barPersonService = barPersonService;
}
public void setTransaksjonService(TransaksjonService transaksjonService) {
this.transaksjonService = transaksjonService;
}
public void setPluginStore(PluginStore pluginStore) {
this.pluginStore = pluginStore;
}
}