package kundedb.service; import kundedb.models.Datafil; import kundedb.models.Kunde; import kundedb.models.ButikkKunde; import kundedb.models.Kundefil; import kundedb.models.Produkt; import models.CustomerModel; import models.OrderModel; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import service.PoseidonPropertyService; import java.util.ArrayList; import java.util.Date; import java.util.List; public class KundedbSyncer { private final static Logger logger = LoggerFactory.getLogger(KundedbSyncer.class); private final static int kundegruppe = PoseidonPropertyService.getIntProperty("kundedb.kundegruppe"); public Kunde syncCustomer(CustomerModel customer) { Kunde kunde = Kunde.findKundeByBrukernavn(customer.username); boolean updateButikkKunde = false; if (kunde == null) { kunde = new Kunde(); kunde.navn = customer.name; kunde.brukernavn = customer.username; kunde.passord = customer.password; kunde.kundegruppe = kundegruppe; logger.info("Fant ikke kunde med brukernavn {}, oppretter ny {}", customer.username, kunde); kunde.insert("kundedb"); } else if ((!kunde.brukernavn.equals(customer.username)) || (!kunde.navn.equals(customer.name)) || (!kunde.passord.equals(customer.password))) { kunde.navn = customer.name; kunde.brukernavn = customer.username; kunde.passord = customer.password; kunde.kundegruppe = kundegruppe; logger.info("Brukernavn eller passord er endret, oppdaterer kundedb med {} ", kunde); kunde.update("kundedb"); updateButikkKunde = true; } else { logger.info("Kunden {} er uendret, oppdaterer ikke", kunde.brukernavn); } ButikkKunde butikkKunde = ButikkKunde.findById(kunde.id); if (butikkKunde == null) { butikkKunde = new ButikkKunde(); butikkKunde.id = kunde.id; butikkKunde.navn = kunde.navn; butikkKunde.brukernavn = kunde.brukernavn; butikkKunde.passord = KundedbCryptService.crypt(kunde.passord); butikkKunde.kundegruppe = kunde.kundegruppe; logger.info("Fant ikke butikk_kunde med id {}, oppretter ny {}", kunde.id, butikkKunde); butikkKunde.insert("kundedb"); } else if (updateButikkKunde) { butikkKunde.navn = kunde.navn; butikkKunde.brukernavn = kunde.brukernavn; butikkKunde.passord = KundedbCryptService.crypt(kunde.passord); butikkKunde.kundegruppe = kunde.kundegruppe; logger.info("ButikkKunde er endret, oppdaterer kundedb med {} ", butikkKunde); butikkKunde.update("kundedb"); } else { logger.info("ButikkKunden {} er uendret, oppdaterer ikke", butikkKunde.brukernavn); } return kunde; } public KundedbSyncResult syncOrder(OrderModel order, Produkt produkt) { KundedbSyncResult result = new KundedbSyncResult(); CustomerModel customer = order.customer; Kunde kunde = syncCustomer(customer); result.deleted = deleteKundefiler(order.id); Datafil datafil = fetchOrCreateDatafil(order, produkt); Kundefil kundefil = new Kundefil(); kundefil.pk.kundenr = kunde.id; kundefil.pk.filnr = datafil.filnr; // TODO: må også sjekke start_date2 og start_date3 kundefil.startdato = order.start_date1; Date endDate = order.findEndDate(); if(endDate == null) { endDate = new DateTime("9999-12-31").toDate(); logger.info("Using default end date for order {} ({})", order.id, endDate); } else { endDate = new DateTime(endDate).plusDays(5).toDate(); logger.info("Setting end date for order {} to {}", order.id, endDate); } kundefil.sluttdato = endDate; kundefil.datafil = datafil; datafil.kundefiler.add(kundefil); logger.info("Oppretter ny kundefil {}", kundefil); kundefil.insert("kundedb"); result.kundefil = kundefil; return result; } private Datafil fetchOrCreateDatafil(OrderModel order, Produkt produkt) { Datafil datafil = Datafil.findByOrdrenr(order.id); if (datafil == null) { datafil = new Datafil(); datafil.name = order.position_name != null && !order.position_name.isEmpty()? order.position_name:order.position.name; datafil.navn = datafil.name; datafil.produktnr = produkt.produktnr; datafil.assignUri(order.id); datafil.kundefiler = new ArrayList<>(); logger.info("Fant ikke kundefil for ordre {}, oppretter ny {}", order.id, datafil); datafil.insert("kundedb"); } else { datafil.name = order.position_name != null && !order.position_name.isEmpty()? order.position_name:order.position.name; datafil.navn = datafil.name; datafil.produktnr = produkt.produktnr; datafil.assignUri(order.id); datafil.kundefiler = new ArrayList<>(); logger.info("Kundefil for ordre {} eksisterer allerede, men oppdaterer den", order.id); datafil.update("kundedb"); } return datafil; } public int deleteKundefiler(Long ordrenr) { int deleted = 0; List<Kundefil> kundefiler = Kundefil.findByOrdrenr(ordrenr); logger.info("Fant {} kundefiler", kundefiler!=null?kundefiler.size():0); if (kundefiler != null && kundefiler.size() > 0) { for(Kundefil kundefil: kundefiler){ logger.info("Sletter kundefil {}", kundefil); kundefil.delete("kundedb"); deleted++; } } return deleted; } public int deleteDatafil(Long ordrenr) { int deleted = 0; Datafil datafil = Datafil.findByOrdrenr(ordrenr); if (datafil != null) { if (datafil.kundefiler == null || datafil.kundefiler.size() == 0) { logger.info("Sletter datafil {}", datafil); datafil.delete("kundedb"); deleted++; } else { logger.info("Datafil {} er i referert fra kundefil. Kan ikke slette", datafil); } } return deleted; } }