parent
f26e5e12c9
commit
8c26d3e430
@ -1,8 +1,16 @@
|
|||||||
package info.bukova.isspst.services.tripbill;
|
package info.bukova.isspst.services.tripbill;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import info.bukova.isspst.data.TripBill;
|
import info.bukova.isspst.data.TripBill;
|
||||||
|
import info.bukova.isspst.data.TripRequirement;
|
||||||
import info.bukova.isspst.services.Service;
|
import info.bukova.isspst.services.Service;
|
||||||
|
|
||||||
public interface TripBillService extends Service<TripBill> {
|
public interface TripBillService extends Service<TripBill> {
|
||||||
|
|
||||||
|
public TripBill createTripBill(TripRequirement requirement);
|
||||||
|
public void loadItems(TripBill bill);
|
||||||
|
public void calculate(TripBill bill);
|
||||||
|
public List<TripBill> getMy();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,177 @@
|
|||||||
package info.bukova.isspst.services.tripbill;
|
package info.bukova.isspst.services.tripbill;
|
||||||
|
|
||||||
|
import info.bukova.isspst.data.SettingsData;
|
||||||
import info.bukova.isspst.data.TripBill;
|
import info.bukova.isspst.data.TripBill;
|
||||||
|
import info.bukova.isspst.data.TripBillItem;
|
||||||
|
import info.bukova.isspst.data.TripRequirement;
|
||||||
import info.bukova.isspst.services.AbstractOwnedService;
|
import info.bukova.isspst.services.AbstractOwnedService;
|
||||||
|
import info.bukova.isspst.services.LazyLoader;
|
||||||
|
import info.bukova.isspst.services.settings.GlobalSettingsService;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.hibernate.LazyInitializationException;
|
||||||
|
import org.hibernate.Query;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
public class TripBillServiceImpl extends AbstractOwnedService<TripBill> implements
|
public class TripBillServiceImpl extends AbstractOwnedService<TripBill> implements
|
||||||
TripBillService {
|
TripBillService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private GlobalSettingsService globalSettings;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TripBill createTripBill(TripRequirement requirement) {
|
||||||
|
TripBill bill = new TripBill();
|
||||||
|
|
||||||
|
bill.setRequirement(requirement);
|
||||||
|
long daysCount = TimeUnit.DAYS.convert(requirement.getEndDate().getTime() - requirement.getTripDate().getTime(), TimeUnit.MILLISECONDS) + 1;
|
||||||
|
|
||||||
|
for (int i = 0 ; i < daysCount ; i++) {
|
||||||
|
TripBillItem item = new TripBillItem();
|
||||||
|
if (i == 0) {
|
||||||
|
item.setTo(requirement.getFrom() + " - " + requirement.getTo());
|
||||||
|
item.setToVehicle(requirement.getVehicle());
|
||||||
|
}
|
||||||
|
if (i == daysCount - 1) {
|
||||||
|
item.setBack(requirement.getTo() + " - " + requirement.getFrom());
|
||||||
|
item.setBackVehicle(requirement.getVehicle());
|
||||||
|
}
|
||||||
|
|
||||||
|
Calendar calTripDate = Calendar.getInstance();
|
||||||
|
calTripDate.setTime(requirement.getTripDate());
|
||||||
|
calTripDate.add(Calendar.DATE, i);
|
||||||
|
item.setDate(calTripDate.getTime());
|
||||||
|
|
||||||
|
bill.getBillItems().add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.calculate(bill);
|
||||||
|
|
||||||
|
return bill;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
@LazyLoader("form")
|
||||||
|
public void loadItems(TripBill entity) {
|
||||||
|
try {
|
||||||
|
if (entity.getBillItems() == null) {
|
||||||
|
throw new LazyInitializationException("");
|
||||||
|
}
|
||||||
|
|
||||||
|
entity.getBillItems().size();
|
||||||
|
} catch (LazyInitializationException ex) {
|
||||||
|
TripBill e = dao.getById(entity.getId());
|
||||||
|
e.getBillItems().size();
|
||||||
|
entity.setBillItems(e.getBillItems());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void calculate(TripBill bill) {
|
||||||
|
bill.setTotal(BigDecimal.ZERO);
|
||||||
|
|
||||||
|
for (TripBillItem item : bill.getBillItems()) {
|
||||||
|
if (!bill.isFreeMeals()) {
|
||||||
|
item.setFreeMealsCount(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
calculateItem(item);
|
||||||
|
bill.setTotal(bill.getTotal().add(item.getTotal()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void calculateItem(TripBillItem item) {
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
Date to = item.getToArrival();
|
||||||
|
|
||||||
|
if (to == null) {
|
||||||
|
to = new Date();
|
||||||
|
cal.setTime(to);
|
||||||
|
cal.set(Calendar.HOUR_OF_DAY, 0);
|
||||||
|
cal.set(Calendar.MINUTE, 0);
|
||||||
|
} else {
|
||||||
|
cal.setTime(to);
|
||||||
|
}
|
||||||
|
|
||||||
|
cal.set(Calendar.DAY_OF_MONTH, 1);
|
||||||
|
cal.set(Calendar.MONTH, 1);
|
||||||
|
cal.set(Calendar.YEAR, 2000);
|
||||||
|
|
||||||
|
to.setTime(cal.getTimeInMillis());
|
||||||
|
|
||||||
|
Date back = item.getBackDeparture();
|
||||||
|
|
||||||
|
if (back == null) {
|
||||||
|
back = new Date(to.getTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
cal.setTime(back);
|
||||||
|
|
||||||
|
if (back.equals(to)) {
|
||||||
|
cal.set(Calendar.HOUR, 23);
|
||||||
|
cal.set(Calendar.MINUTE, 59);
|
||||||
|
}
|
||||||
|
|
||||||
|
cal.set(Calendar.DAY_OF_MONTH, 1);
|
||||||
|
cal.set(Calendar.MONTH, 1);
|
||||||
|
cal.set(Calendar.YEAR, 2000);
|
||||||
|
back.setTime(cal.getTimeInMillis());
|
||||||
|
|
||||||
|
if (to.getTime() > back.getTime()) {
|
||||||
|
item.setTotal(BigDecimal.ZERO);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SettingsData settings = globalSettings.getSettings();
|
||||||
|
long hours = TimeUnit.HOURS.convert(back.getTime() - to.getTime(), TimeUnit.MILLISECONDS);
|
||||||
|
int refundHour = 0;
|
||||||
|
List<Integer> refundHours = new ArrayList<Integer>(settings.getRefunds().keySet());
|
||||||
|
Collections.sort(refundHours);
|
||||||
|
|
||||||
|
for (int key : refundHours) {
|
||||||
|
if (refundHour <= hours && key > hours) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
refundHour = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
item.setMeals(settings.getRefunds().get(refundHour)[item.getFreeMealsCount()]);
|
||||||
|
|
||||||
|
BigDecimal carefare = item.getCarefare() == null ? BigDecimal.ZERO : item.getCarefare();
|
||||||
|
BigDecimal housing = item.getHousing() == null ? BigDecimal.ZERO : item.getHousing();
|
||||||
|
BigDecimal otherExp = item.getOtherExpenses() == null ? BigDecimal.ZERO : item.getOtherExpenses();
|
||||||
|
BigDecimal distanceAmount = item.getDistanceAmount() == null ? BigDecimal.ZERO : item.getDistanceAmount();
|
||||||
|
BigDecimal fuelAmount = item.getFuelAmount() == null ? BigDecimal.ZERO : item.getFuelAmount();
|
||||||
|
|
||||||
|
item.setTotal(carefare.add(housing).add(item.getMeals()).add(otherExp).add(distanceAmount).add(fuelAmount));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
@PreAuthorize("hasPermission(this, 'PERM_READ')")
|
||||||
|
public List<TripBill> getMy() {
|
||||||
|
Query q = dao.getQuery("from TripBill where ownedBy = :owner");
|
||||||
|
q.setParameter("owner", getLoggedInUser());
|
||||||
|
return q.list();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
@PreAuthorize("hasPermission(this, 'PERM_SHOW_ALL_BILL')")
|
||||||
|
public List<TripBill> getAll() {
|
||||||
|
return this.execQuery("from TripBill as tb join fetch tb.ownedBy");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,48 @@
|
|||||||
package info.bukova.isspst.ui.tripbill;
|
package info.bukova.isspst.ui.tripbill;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import info.bukova.isspst.data.TripBill;
|
import info.bukova.isspst.data.TripBill;
|
||||||
|
import info.bukova.isspst.data.Vehicle;
|
||||||
|
import info.bukova.isspst.services.settings.GlobalSettingsService;
|
||||||
|
import info.bukova.isspst.services.tripbill.TripBillService;
|
||||||
|
import info.bukova.isspst.ui.BigDecimalConverter;
|
||||||
import info.bukova.isspst.ui.FormViewModel;
|
import info.bukova.isspst.ui.FormViewModel;
|
||||||
|
|
||||||
|
import org.zkoss.bind.annotation.Command;
|
||||||
import org.zkoss.bind.annotation.Init;
|
import org.zkoss.bind.annotation.Init;
|
||||||
|
import org.zkoss.bind.annotation.NotifyChange;
|
||||||
|
import org.zkoss.zk.ui.select.annotation.WireVariable;
|
||||||
|
|
||||||
public class TripBillForm extends FormViewModel<TripBill> {
|
public class TripBillForm extends FormViewModel<TripBill> {
|
||||||
|
|
||||||
|
private BigDecimalConverter bigDecimalConverter;
|
||||||
|
@WireVariable
|
||||||
|
private TripBillService tripBillService;
|
||||||
|
private List<Vehicle> vehicles;
|
||||||
|
@WireVariable
|
||||||
|
private GlobalSettingsService settingsService;
|
||||||
|
|
||||||
@Init(superclass = true)
|
@Init(superclass = true)
|
||||||
public void init() {
|
public void init() {
|
||||||
|
bigDecimalConverter = new BigDecimalConverter();
|
||||||
|
vehicles = new ArrayList<Vehicle>();
|
||||||
|
vehicles.add(null);
|
||||||
|
vehicles.addAll(settingsService.getSettings().getVehicles());
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimalConverter getBigDecimalConverter() {
|
||||||
|
return bigDecimalConverter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command
|
||||||
|
@NotifyChange("dataBean")
|
||||||
|
public void calculate() {
|
||||||
|
tripBillService.calculate(getDataBean());
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Vehicle> getVehicles() {
|
||||||
|
return vehicles;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue