@Override public Entity getShiftFromDateWithTime(final Date date) { List<Entity> shifts = getShiftsWorkingAtDate(date); for (Entity shift : shifts) { String stringHours = shift.getStringField(getDayOfWeekName(date) + HOURS_LITERAL); LocalTime[][] dayHours = convertDayHoursToInt(stringHours); for (LocalTime[] dayHour : dayHours) { if (dayHour[1].getHourOfDay() < dayHour[0].getHourOfDay()) { if (checkIfStartDateShiftIsEarlierThanDate(dayHour, date) || checkIfEndDateShiftIsLaterThanDate(dayHour, date)) { return shift; } } else { if (checkIfStartDateShiftIsEarlierThanDate(dayHour, date) && checkIfEndDateShiftIsLaterThanDate(dayHour, date)) { return shift; } } } } return null; }
public List<ShiftsServiceImpl.ShiftHour> getHoursForAllShifts(final Date dateFrom, final Date dateTo) { return shiftsService.getHoursForAllShifts(dateFrom, dateTo); }
@Override public List<ShiftHour> getHoursForShift(final Entity shift, final Date dateFrom, final Date dateTo) { List<ShiftHour> hours = Lists.newArrayList(); hours.addAll(getHourForDay(shift, dateFrom, dateTo, L_MONDAY, 1)); hours.addAll(getHourForDay(shift, dateFrom, dateTo, L_TUESDAY, 2)); hours.addAll(getHourForDay(shift, dateFrom, dateTo, L_WENSDAY, 3)); hours.addAll(getHourForDay(shift, dateFrom, dateTo, L_THURSDAY, 4)); hours.addAll(getHourForDay(shift, dateFrom, dateTo, L_FRIDAY, 5)); hours.addAll(getHourForDay(shift, dateFrom, dateTo, L_SATURDAY, 6)); hours.addAll(getHourForDay(shift, dateFrom, dateTo, L_SUNDAY, 7)); List<Entity> exceptions = shift.getHasManyField(TIMETABLE_EXCEPTIONS_FIELD); addWorkTimeExceptions(hours, exceptions); removeFreeTimeExceptions(hours, exceptions); Collections.sort(hours, new ShiftHoursComparator()); return removeHoursOutOfRange(mergeOverlappedHours(hours), dateFrom, dateTo); }
@Override public Optional<DateTime> getNearestWorkingDate(DateTime dateFrom, Entity productionLine, List<Entity> shiftsEntities) { List<Shift> shifts = transformEntitiesToShifts(shiftsEntities); List<DateTimeRange> finalShiftWorkTimes = Lists.newArrayList(); DateTime currentDate = dateFrom.minusDays(1); if (shifts.stream().noneMatch(shift -> checkShiftWorkingAfterDate(dateFrom, productionLine, shift))) { return Optional.empty(); } while (finalShiftWorkTimes.isEmpty()) { for (Shift shift : shifts) { getNearestWorkingDateForShift(shift, productionLine, dateFrom, currentDate, finalShiftWorkTimes); } currentDate = currentDate.plusDays(1); } DateTime result = finalShiftWorkTimes.stream().min((a, b) -> a.getFrom().compareTo(b.getFrom())).get().getFrom(); if (result.compareTo(dateFrom) <= 0) { return Optional.of(dateFrom); } return Optional.of(result); }
@Override public List<ShiftHour> getHoursForAllShifts(final Date dateFrom, final Date dateTo) { List<Entity> shifts = dataDefinitionService.get(BasicConstants.PLUGIN_IDENTIFIER, BasicConstants.MODEL_SHIFT).find() .list().getEntities(); List<ShiftHour> hours = Lists.newArrayList(); for (Entity shift : shifts) { hours.addAll(getHoursForShift(shift, dateFrom, dateTo)); } hours.sort(new ShiftHoursComparator()); return mergeOverlappedHours(hours); }
public LocalTime[][] convertDayHoursToInt(final String string) { return shiftsService.convertDayHoursToInt(string); }
Date dateFrom = shiftsService.findDateToForOrder(startDate, offset); if (dateFrom == null) { continue; Date dateTo = shiftsService.findDateToForOrder(startDate, offset + duration); if (dateTo == null) { continue;
dateFromField.addMessage("orders.validate.global.error.dateFromIsNull", MessageType.FAILURE); } else { Date stopTime = shiftsService.findDateToForOrder(startTime, maxPathTime); dateToField.setFieldValue(orderRealizationTimeService.setDateToField(stopTime)); startTime = shiftsService.findDateFromForOrder(stopTime, maxPathTime);
@Override public List<GanttChartItem> getItemsForShift(final Entity shift, final GanttChartScale scale) { String shiftName = shift.getStringField("name"); List<ShiftHour> hours = shiftsService.getHoursForShift(shift, scale.getDateFrom(), scale.getDateTo()); List<GanttChartItem> items = new ArrayList<GanttChartItem>(); for (ShiftHour hour : hours) { items.add(scale.createGanttChartItem(shiftName, shiftName, null, hour.getDateFrom(), hour.getDateTo())); } return items; }
private LocalTime[] convertRangeHoursToInt(final String string) { String[] parts = string.trim().split("-"); if (parts.length != 2) { throw new IllegalStateException("Invalid time range " + string + ", should be hh:mm-hh:mm"); } LocalTime[] range = new LocalTime[2]; range[0] = convertHoursToInt(parts[0]); range[1] = convertHoursToInt(parts[1]); return range; }
@Override public LocalTime[][] convertDayHoursToInt(final String string) { if (!StringUtils.hasText(string)) { return new LocalTime[][] {}; } String[] parts = string.trim().split(","); LocalTime[][] hours = new LocalTime[parts.length][]; for (int i = 0; i < parts.length; i++) { hours[i] = convertRangeHoursToInt(parts[i]); } return hours; }
public boolean validateHourField(final String day, final DataDefinition dataDefinition, final Entity entity) { boolean isDayActive = (Boolean) entity.getField(day + WORKING_LITERAL); String fieldValue = entity.getStringField(day + HOURS_LITERAL); if (!isDayActive) { return true; } if (fieldValue == null || "".equals(fieldValue.trim())) { entity.addError(dataDefinition.getField(day + HOURS_LITERAL), "qcadooView.validate.field.error.missing"); return false; } try { convertDayHoursToInt(fieldValue); } catch (IllegalStateException e) { entity.addError(dataDefinition.getField(day + HOURS_LITERAL), "basic.validate.global.error.shift.hoursFieldWrongFormat"); return false; } return true; }
ComponentState.MessageType.FAILURE); } else { Date stopTime = shiftsService.findDateToForOrder(startTime, maxPathTime);
private Collection<ShiftHour> getHourForDay(final Entity shift, final Date dateFrom, final Date dateTo, final String day, final int offset) { if ((Boolean) shift.getField(day + WORKING_LITERAL) && StringUtils.hasText(shift.getStringField(day + HOURS_LITERAL))) { List<ShiftHour> hours = Lists.newArrayList(); LocalTime[][] dayHours = convertDayHoursToInt(shift.getStringField(day + HOURS_LITERAL)); DateTime from = new DateTime(dateFrom).withSecondOfMinute(0); DateTime to = new DateTime(dateTo); DateTime current = from.plusDays(offset - from.getDayOfWeek()); if (current.compareTo(from) < 0) { current = current.plusDays(7); } while (current.compareTo(to) <= 0) { for (LocalTime[] dayHour : dayHours) { hours.add(new ShiftHour(current.withHourOfDay(dayHour[0].getHourOfDay()) .withMinuteOfHour(dayHour[0].getMinuteOfHour()).toDate(), current .withHourOfDay(dayHour[1].getHourOfDay()).withMinuteOfHour(dayHour[1].getMinuteOfHour()).toDate())); } current = current.plusDays(7); } return hours; } else { return Collections.emptyList(); } }
@Override public Date findDateFromForOrder(final Date dateTo, final long seconds) { if (dataDefinitionService.get(BasicConstants.PLUGIN_IDENTIFIER, BasicConstants.MODEL_SHIFT).find().list() .getTotalNumberOfEntities() == 0) { return null; } long stop = dateTo.getTime(); long remaining = seconds; while (remaining >= 0) { List<ShiftHour> hours = getHoursForAllShifts(new Date(stop - STEP), new Date(stop)); for (int i = hours.size() - 1; i >= 0; i--) { ShiftHour hour = hours.get(i); long diff = (hour.getDateTo().getTime() - hour.getDateFrom().getTime()) / 1000; if (diff >= remaining) { return new Date(hour.getDateTo().getTime() - (remaining * 1000)); } else { remaining -= diff; } } stop -= STEP; if (stop < MIN_TIMESTAMP) { return null; } } return null; }
startTimeField.addMessage("orders.validate.global.error.dateFromIsNull", MessageType.FAILURE); } else { Date stopTime = shiftsService.findDateToForOrder(startTime, maxPathTime);
@Override public Date findDateToForOrder(final Date dateFrom, final long seconds) { if (dataDefinitionService.get(BasicConstants.PLUGIN_IDENTIFIER, BasicConstants.MODEL_SHIFT).find().list() .getTotalNumberOfEntities() == 0) { return null; } long start = dateFrom.getTime(); long remaining = seconds; while (remaining >= 0) { List<ShiftHour> hours = getHoursForAllShifts(new Date(start), new Date(start + STEP)); for (ShiftHour hour : hours) { long diff = (hour.getDateTo().getTime() - hour.getDateFrom().getTime()) / 1000; if (diff >= remaining) { return new Date(hour.getDateFrom().getTime() + (remaining * 1000)); } else { remaining -= diff; } } start += STEP; if (start > MAX_TIMESTAMP) { return null; } } return null; }