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;
}
}