package service;
import api.v1.Customer;
import com.avaje.ebean.Expr;
import exceptions.PoseidonException;
import kundedb.models.Kunde;
import kundedb.service.KundedbService;
import mapper.CustomerMapper;
import models.CustomerModel;
import models.OrderModel;
import org.joda.time.DateTime;
import play.mvc.Http;
import validators.CustomerValidator;
import validators.ValidationResult;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class CustomerService extends PoseidonService {
public CustomerService(String username) {
super(username);
}
public List<CustomerModel> findAll() {
return CustomerModel.find.all();
}
public CustomerModel getById(long id) {
return CustomerModel.find.byId(id);
}
public CustomerModel findByName(String name) {
return CustomerModel.find.where().ieq("name", name).findUnique();
}
public CustomerModel createOrUpdate(Customer apiCustomer) {
CustomerModel mCustomer = null;
if ((apiCustomer.id != null) && (apiCustomer.id > 0)) {
mCustomer = getById(apiCustomer.id);
mCustomer.updated = PoseidonService.getNow().toDate();
mCustomer.updatedBy = getUser();
} else {
mCustomer = new CustomerModel();
mCustomer.created = PoseidonService.getNow().toDate();
mCustomer.createdBy = getUser();
}
mCustomer = new CustomerMapper().mapToModel(apiCustomer, mCustomer);
ValidationResult validationResult = new CustomerValidator().validateModel(mCustomer);
if (!validationResult.ok) {
throw new PoseidonException(Http.Status.BAD_REQUEST, "Validering av kunde feilet: " + validationResult.getMessage());
}
mCustomer.save();
syncCustomerToKundeDb(mCustomer);
return mCustomer;
}
private void syncCustomerToKundeDb(CustomerModel mCustomer) {
DateTime now = new DateTime(PoseidonService.getTimeZone());
String startHourProp = PoseidonPropertyService.getProperty("kundedbsync.start_hour");
int startHour = Integer.valueOf(startHourProp);
if ( now.getHourOfDay() >= startHour){
KundedbService service = new KundedbService(getUser());
service.syncKundeImmediately(mCustomer);
}
}
public List<OrderModel> getOrdersForCustomer(Long id) {
List<OrderModel> orders = OrderModel.find.fetch("customer").fetch("position").where().eq("customer_id", id).findList();
if (orders != null) {
List<OrderModel> nonDeletedOrders = new ArrayList<>();
for (OrderModel model : orders) {
model.assignStatus(getNow());
if (!model.isDeleted()) {
nonDeletedOrders.add(model);
}
}
return nonDeletedOrders;
}
return orders;
}
public List<CustomerModel> findNewOrUpdatedCustomersSince(DateTime yesterday) {
List<CustomerModel> result = CustomerModel.find.where().or(
Expr.gt("created",yesterday),
Expr.gt("updated",yesterday)
).findList();
return result;
}
public CustomerModel checkCustomerExists(Customer apiCustomer) {
CustomerModel customermodel=null;
Kunde kunde = null;
if ( apiCustomer.name != null && !apiCustomer.name.isEmpty()) {
customermodel = CustomerModel.findByName(apiCustomer.name);
}
if ( customermodel != null) {
throw new PoseidonException(Http.Status.BAD_REQUEST,"Navn " + apiCustomer.name + " finnes allerede");
}
if ( apiCustomer.username != null && !apiCustomer.username.isEmpty()) {
customermodel = CustomerModel.findByUserName(apiCustomer.username);
}
if ( customermodel != null) {
throw new PoseidonException(Http.Status.BAD_REQUEST,"Brukernavn " + apiCustomer.username + " finnes allerede");
}
if ( apiCustomer.name != null && !apiCustomer.name.isEmpty()){
kunde = Kunde.findKundeByName(apiCustomer.name);
}
if ( kunde != null) {
throw new PoseidonException(Http.Status.BAD_REQUEST,"Kundedb: Navn " + apiCustomer.name + " finnes allerede");
}
if ( apiCustomer.username != null && !apiCustomer.username.isEmpty()){
kunde = Kunde.findKundeByBrukernavn(apiCustomer.username);
}
if ( kunde != null) {
throw new PoseidonException(Http.Status.BAD_REQUEST,"Kundedb: Brukernavn " + apiCustomer.username + " finnes allerede");
}
return null;
}
}