package service; import api.v1.DistributionlistParams; import exceptions.PoseidonException; import models.CustomerModel; import models.OrderModel; import models.RecipientModel; import org.joda.time.DateTime; import play.mvc.Http; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*; public class DistributionlistsService extends PoseidonService { public DistributionlistsService(String user) { super(user); } public List<CustomerModel> findActiveCustomers(DistributionlistParams distributionlistParams) { List<CustomerModel> result = new ArrayList<>(); Map<CustomerModel,Boolean> map = new HashMap<>(); List<OrderModel> activeOrders = findActiveOrders(distributionlistParams); // extract distinct customers for (OrderModel activeOrder : activeOrders) { if ( !map.containsKey(activeOrder.customer)){ map.put(activeOrder.customer,Boolean.TRUE); } } for (CustomerModel customerModel : map.keySet()) { result.add(customerModel); } return result; } public List<OrderModel> findActiveOrders(DistributionlistParams distributionlistParams) { List<OrderModel> result = new ArrayList<>(); DateTime dateTime = new DateTime(distributionlistParams.date,getTimeZone()); OrderService orderService = new OrderService(getUser()); List<OrderModel> orders = orderService.getOrdersForDate(dateTime); for (OrderModel order : orders) { order.assignStatus(getNow()); Set<Integer> activeTermins = order.getActiveTerminsForDayContainingTimestamp(dateTime); if ( activeTermins == null) continue ; for (int i = 0; i < distributionlistParams.termins.length; i++) { api.v1.Termin t = distributionlistParams.termins[i]; if ( activeTermins.contains(t.hour) && t.selected ){ result.add(order); break; } } } return result; } public List<RecipientModel> findRecipients(DistributionlistParams distributionlistParams){ List<RecipientModel> recipientModels = new ArrayList<>(); List<OrderModel> orderModels = findActiveOrders(distributionlistParams); switch (distributionlistParams.mode){ case ALL: for (OrderModel orderModel : orderModels) { List<RecipientModel> orderRecipients = orderModel.recipients; for (RecipientModel orderRecipient : orderRecipients) { if ( !recipientModels.contains(orderRecipient)) recipientModels.add(orderRecipient); } } break; case ORDER: for (OrderModel orderModel : orderModels) { if ( orderModel.met_ref.equals(distributionlistParams.met_ref)) { List<RecipientModel> orderRecipients = orderModel.recipients; for (RecipientModel orderRecipient : orderRecipients) { if (!recipientModels.contains(orderRecipient)) recipientModels.add(orderRecipient); } } } break; case CUSTOMER: for (OrderModel orderModel : orderModels) { if ( orderModel.customer.name.equals(distributionlistParams.customer)) { List<RecipientModel> orderRecipients = orderModel.recipients; for (RecipientModel orderRecipient : orderRecipients) { if (!recipientModels.contains(orderRecipient)) recipientModels.add(orderRecipient); } } } break; default: break; } return recipientModels; } public String writeRecipientsToDisk(DistributionlistParams params, List<RecipientModel> recipientModels) { String csv = createCSV(params,recipientModels); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String id = "" ; switch (params.mode){ case ALL: id = "all"; break; case ORDER: id = params.met_ref; break; case CUSTOMER: id = params.customer; break; } String filename = "offshore_" + id + "_" + sdf.format(new Date()) + ".csv"; String csvdir = getCsvDirectory(); new CsvWriter().writeCsvToFile(csv, filename, csvdir); return filename; } private String getCsvDirectory() { String csvdir = PoseidonPropertyService.getProperty("csvfile.distributionlist.dir"); return csvdir.endsWith("/")?csvdir:csvdir + "/"; } private String createCSV(DistributionlistParams params, List<RecipientModel> recipientModels) { String CSV_COLUMN_HEADER = "Name,Group Membership,E-mail1-Type,E-mail1-Value\n"; String type = "Work"; String group =""; switch (params.mode) { case ALL: group = "All"; break; case ORDER: group = params.met_ref; break; case CUSTOMER: group = params.customer; break; } StringBuilder builder = new StringBuilder(CSV_COLUMN_HEADER); for (RecipientModel recipientModel : recipientModels) { builder .append("").append(",") .append(group).append(",") .append(type).append(",") .append(recipientModel.email).append("\n"); } return builder.toString(); } }