package org.ei.drishti.service.scheduling; import org.joda.time.LocalDate; import org.joda.time.LocalTime; import org.motechproject.model.Time; import org.motechproject.scheduletracking.api.domain.Milestone; import org.motechproject.scheduletracking.api.domain.Schedule; import org.motechproject.scheduletracking.api.repository.AllSchedules; import org.motechproject.scheduletracking.api.service.EnrollmentRequest; import org.motechproject.scheduletracking.api.service.ScheduleTrackingService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import static org.ei.drishti.common.util.DateUtil.today; import static org.joda.time.LocalDate.parse; @Service public class ScheduleService { private final ScheduleTrackingService scheduleTrackingService; private final AllSchedules allSchedules; private int preferredTime; @Autowired public ScheduleService(ScheduleTrackingService scheduleTrackingService, AllSchedules allSchedules, @Value("#{drishti['preferred.time']}") int preferredTime) { this.scheduleTrackingService = scheduleTrackingService; this.allSchedules = allSchedules; this.preferredTime = preferredTime; } public void enroll(String entityId, String scheduleName, String referenceDate) { String startingMilestoneName = getStartingMilestoneName(scheduleName, parse(referenceDate)); EnrollmentRequest request = new EnrollmentRequest(entityId, scheduleName, new Time(new LocalTime(preferredTime, 0)), parse(referenceDate), null, null, null, startingMilestoneName, null); scheduleTrackingService.enroll(request); } private String getStartingMilestoneName(String name, LocalDate referenceDate) { Schedule schedule = allSchedules.getByName(name); for (Milestone milestone : schedule.getMilestones()) { if (referenceDate.plus(milestone.getMaximumDuration()).isAfter(today())) return milestone.getName(); } return null; } public void enroll(String entityId, String scheduleName, String milestone, String referenceDate) { EnrollmentRequest request = new EnrollmentRequest(entityId, scheduleName, new Time(new LocalTime(preferredTime, 0)), parse(referenceDate), null, null, null, milestone, null); scheduleTrackingService.enroll(request); } }