/*
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2014, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gses.activiti.forms.api.duration;
import org.apache.commons.lang.StringUtils;
import ru.codeinside.adm.database.Bid;
import ru.codeinside.adm.database.TaskDates;
import ru.codeinside.calendar.DueDateCalculator;
import java.io.Serializable;
import java.util.Date;
// TODO: разделить на API и реализацию
/**
* Граничные периоды выполнения заявок и этапов
*/
public class DurationPreference implements Serializable {
/**
* длительность интервала в днях, по истечении которого необходимо выслать оповещение о приближающейся просрочке
* выполнения этапа
*/
public int notificationInterval;
/**
* длительность интервала в днях, которое отведено на выполнение этапа
*/
public int executionInterval;
/**
* длительность интервала в днях, в течении которого этап может не поступить на исполнение.
*/
public int inactiveInterval;
/**
* длительность интервала в днях, по истечении которого необходимо выслать оповещение о приближающейся просрочке
* выполнения этапа, по умолчанию
*/
public int defaultNotificationInterval;
/**
* длительность интервала в днях, которое отведено на выполнение этапа, по умолчанию
*/
public int defaultExecutionInterval;
/**
* дни указываются в рабочих или календарных днях
*/
public boolean workedDays;
/**
* наличие данных о сроках
*/
public boolean dataExists;
/**
* наличие данных о сроках по умолчанию
*/
public boolean defaultDataExists;
/**
* Инициализация контрольных дат задачи
*
* @param taskDates контрольные даты задачи
*/
public void initializeTaskDates(TaskDates taskDates, LazyCalendar lazyCalendar) {
if (dataExists) {
Date startDate = taskDates.getStartDate();
DueDateCalculator calendar = lazyCalendar.getCalendar(workedDays);
taskDates.setInactionDate(calendar.calculate(startDate, inactiveInterval));
taskDates.setRestDate(calendar.calculate(startDate, notificationInterval));
taskDates.setMaxDate(calendar.calculate(startDate, executionInterval));
taskDates.setWorkedDays(workedDays);
} else {
Bid bid = taskDates.getBid();
if (bid.hasDefaultInterval()) {
Date startDate = taskDates.getStartDate();
DueDateCalculator calendar = lazyCalendar.getCalendar(bid.getWorkedDays());
taskDates.setRestDate(calendar.calculate(startDate, bid.getDefaultRestInterval()));
taskDates.setMaxDate(calendar.calculate(startDate, bid.getDefaultMaxInterval()));
taskDates.setWorkedDays(bid.getWorkedDays());
}
}
}
/**
* Обновление контрольных дат этапа по производственному каледарю.
*/
public boolean updateTaskDates(TaskDates taskDates, LazyCalendar lazyCalendar) {
if (dataExists && workedDays && taskDates.getWorkedDays()) {
Date start = taskDates.getStartDate();
DueDateCalculator calendar = lazyCalendar.getCalendar(true);
taskDates.setInactionDate(calendar.calculate(start, inactiveInterval));
taskDates.setRestDate(calendar.calculate(start, notificationInterval));
taskDates.setMaxDate(calendar.calculate(start, executionInterval));
return true;
}
if (!dataExists && taskDates.getBid().hasDefaultWorkInterval()) {
Date start = taskDates.getStartDate();
Bid bid = taskDates.getBid();
DueDateCalculator calendar = lazyCalendar.getCalendar(true);
taskDates.setRestDate(calendar.calculate(start, bid.getDefaultRestInterval()));
taskDates.setMaxDate(calendar.calculate(start, bid.getDefaultMaxInterval()));
return true;
}
return false;
}
/**
* Инициализация контрольных дат заявки и интервалов задач по умолчанию
*
* @param bid новая заявка
*/
public void initializeProcessDates(Bid bid, LazyCalendar lazyCalendar) {
DueDateCalculator calculator = lazyCalendar.getCalendar(workedDays);
bid.setWorkedDays(workedDays);
if (dataExists) {
bid.setRestDate(calculator.calculate(bid.getDateCreated(), notificationInterval));
bid.setMaxDate(calculator.calculate(bid.getDateCreated(), executionInterval));
}
if (defaultDataExists) {
bid.setDefaultRestInterval(defaultNotificationInterval);
bid.setDefaultMaxInterval(defaultExecutionInterval);
}
}
/**
* Обновление контрольных дат заявки по производственному календарю.
*/
public boolean updateProcessDates(Bid bid, LazyCalendar lazyCalendar) {
if (dataExists && workedDays && bid.getWorkedDays()) {
DueDateCalculator calendar = lazyCalendar.getCalendar(true);
bid.setRestDate(calendar.calculate(bid.getDateCreated(), notificationInterval));
bid.setMaxDate(calendar.calculate(bid.getDateCreated(), executionInterval));
return true;
}
return false;
}
public void parseTaskPreference(String expression) throws IllegalDurationExpression {
if (StringUtils.isNotBlank(expression)) {
String[] expressions = expression.split("/");
if (expressions.length == 3) {
try {
inactiveInterval = Integer.parseInt(expressions[0]);
notificationInterval = Integer.parseInt(expressions[1]);
executionInterval = Integer.parseInt(expressions[2]);
dataExists = true;
} catch (NumberFormatException e) {
throw new IllegalDurationExpression(String.format("Ошибка при разборе выражения ==> %s\n Причина: \n%s", expression, e.getMessage()));
}
} else {
throw new IllegalDurationExpression(String.format("Ошибка при разборе выражения ==> %s\n Причина: \n%s", expression, "В выражении должно быть задано 3 интервала. Подробности см. в документации"));
}
} else {
throw new IllegalDurationExpression(String.format("Ошибка при разборе выражения ==> %s", expression));
}
}
public void parseProcessPreference(String expression) throws IllegalDurationExpression {
if (StringUtils.isNotBlank(expression)) {
String[] expressions = expression.split("/");
if (expressions.length == 2) {
try {
notificationInterval = Integer.parseInt(expressions[0]);
executionInterval = Integer.parseInt(expressions[1]);
dataExists = true;
} catch (NumberFormatException e) {
throw new IllegalDurationExpression(String.format("Ошибка при разборе выражения ==> %s\n Причина: \n%s", expression, e.getMessage()));
}
} else {
throw new IllegalDurationExpression(String.format("Ошибка при разборе выражения ==> %s\n Причина: \n%s", expression, "В выражении должно быть задано 2 интервала. Подробности см. в документации"));
}
} else {
throw new IllegalDurationExpression(String.format("Ошибка при разборе выражения ==> %s", expression));
}
}
public void parseTaskDefaultPreference(String expression) throws IllegalDurationExpression {
if (StringUtils.isNotBlank(expression)) {
String[] expressions = expression.split("/");
if (expressions.length == 2) {
try {
defaultNotificationInterval = Integer.parseInt(expressions[0]);
defaultExecutionInterval = Integer.parseInt(expressions[1]);
defaultDataExists = true;
} catch (NumberFormatException e) {
throw new IllegalDurationExpression(String.format("Ошибка при разборе выражения ==> %s\n Причина: \n%s", expression, e.getMessage()));
}
} else {
throw new IllegalDurationExpression(String.format("Ошибка при разборе выражения ==> %s\n Причина: \n%s", expression, "В выражении должно быть задано 2 интервала. Подробности см. в документации"));
}
} else {
throw new IllegalDurationExpression(String.format("Ошибка при разборе выражения ==> %s", expression));
}
}
public void parseWorkedDaysPreference(String expression) {
workedDays = "w".equals(expression);
}
}