aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--schema/changelog-5.6.xml6
-rw-r--r--src/main/java/org/traccar/model/Calendar.java16
-rw-r--r--src/main/java/org/traccar/model/Report.java22
-rw-r--r--src/main/java/org/traccar/schedule/TaskReports.java51
4 files changed, 34 insertions, 61 deletions
diff --git a/schema/changelog-5.6.xml b/schema/changelog-5.6.xml
index 38b206902..dc302c6a4 100644
--- a/schema/changelog-5.6.xml
+++ b/schema/changelog-5.6.xml
@@ -25,12 +25,6 @@
<column name="calendarid" type="INT">
<constraints nullable="false" />
</column>
- <column name="from" type="TIMESTAMP">
- <constraints nullable="false" />
- </column>
- <column name="to" type="TIMESTAMP">
- <constraints nullable="false" />
- </column>
<column name="attributes" type="VARCHAR(4000)">
<constraints nullable="false" />
</column>
diff --git a/src/main/java/org/traccar/model/Calendar.java b/src/main/java/org/traccar/model/Calendar.java
index c1f98a957..62c51cc4a 100644
--- a/src/main/java/org/traccar/model/Calendar.java
+++ b/src/main/java/org/traccar/model/Calendar.java
@@ -24,6 +24,7 @@ import net.fortuna.ical4j.filter.predicate.PeriodRule;
import net.fortuna.ical4j.model.DateTime;
import net.fortuna.ical4j.model.Period;
import net.fortuna.ical4j.model.component.CalendarComponent;
+import net.fortuna.ical4j.model.component.VEvent;
import org.traccar.storage.QueryIgnore;
import org.traccar.storage.StorageName;
@@ -32,6 +33,7 @@ import java.io.IOException;
import java.time.Duration;
import java.util.Collection;
import java.util.Date;
+import java.util.List;
@StorageName("tc_calendars")
public class Calendar extends ExtendedModel {
@@ -66,14 +68,18 @@ public class Calendar extends ExtendedModel {
return calendar;
}
- public boolean checkMoment(Date date) {
+ public Collection<VEvent> findEvents(Date date) {
if (calendar != null) {
Period period = new Period(new DateTime(date), Duration.ZERO);
- Filter<CalendarComponent> filter = new Filter<>(new PeriodRule<>(period));
- Collection<CalendarComponent> events = filter.filter(calendar.getComponents(CalendarComponent.VEVENT));
- return events != null && !events.isEmpty();
+ Filter<VEvent> filter = new Filter<>(new PeriodRule<>(period));
+ return filter.filter(calendar.getComponents(CalendarComponent.VEVENT));
+ } else {
+ return List.of();
}
- return false;
+ }
+
+ public boolean checkMoment(Date date) {
+ return !findEvents(date).isEmpty();
}
}
diff --git a/src/main/java/org/traccar/model/Report.java b/src/main/java/org/traccar/model/Report.java
index 83bb2e920..1556ecc9e 100644
--- a/src/main/java/org/traccar/model/Report.java
+++ b/src/main/java/org/traccar/model/Report.java
@@ -17,8 +17,6 @@ package org.traccar.model;
import org.traccar.storage.StorageName;
-import java.util.Date;
-
@StorageName("tc_reports")
public class Report extends ScheduledModel {
@@ -42,24 +40,4 @@ public class Report extends ScheduledModel {
this.description = description;
}
- private Date from;
-
- public Date getFrom() {
- return from;
- }
-
- public void setFrom(Date from) {
- this.from = from;
- }
-
- private Date to;
-
- public Date getTo() {
- return to;
- }
-
- public void setTo(Date to) {
- this.to = to;
- }
-
}
diff --git a/src/main/java/org/traccar/schedule/TaskReports.java b/src/main/java/org/traccar/schedule/TaskReports.java
index 259eb10d4..c80b786e9 100644
--- a/src/main/java/org/traccar/schedule/TaskReports.java
+++ b/src/main/java/org/traccar/schedule/TaskReports.java
@@ -15,6 +15,7 @@
*/
package org.traccar.schedule;
+import net.fortuna.ical4j.model.component.VEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.traccar.model.BaseModel;
@@ -86,8 +87,15 @@ public class TaskReports implements ScheduleTask {
for (Report report : storage.getObjects(Report.class, new Request(new Columns.All()))) {
Calendar calendar = storage.getObject(Calendar.class, new Request(
new Columns.All(), new Condition.Equals("id", report.getCalendarId())));
- if (calendar.checkMoment(currentCheck) && !calendar.checkMoment(lastCheck)) {
- executeReport(report);
+
+ var lastEvents = calendar.findEvents(lastCheck);
+ var currentEvents = calendar.findEvents(currentCheck);
+
+ if (!lastEvents.isEmpty() && currentEvents.isEmpty()) {
+ VEvent event = lastEvents.iterator().next();
+ Date from = event.getStartDate().getDate();
+ Date to = event.getEndDate().getDate();
+ executeReport(report, from, to);
}
}
} catch (StorageException e) {
@@ -95,7 +103,8 @@ public class TaskReports implements ScheduleTask {
}
}
- private void executeReport(Report report) throws StorageException {
+ private void executeReport(Report report, Date from, Date to) throws StorageException {
+
var deviceIds = storage.getObjects(Device.class, new Request(
new Columns.Include("id"),
new Condition.Permission(Device.class, Report.class, report.getId())))
@@ -107,42 +116,28 @@ public class TaskReports implements ScheduleTask {
var users = storage.getObjects(User.class, new Request(
new Columns.Include("id"),
new Condition.Permission(User.class, Report.class, report.getId())));
+
for (User user : users) {
switch (report.getType()) {
case "events":
- reportMailer.sendAsync(user.getId(), stream -> {
- eventsReportProvider.getExcel(
- stream, user.getId(), deviceIds, groupIds,
- List.of(), report.getFrom(), report.getTo());
- });
+ reportMailer.sendAsync(user.getId(), stream -> eventsReportProvider.getExcel(
+ stream, user.getId(), deviceIds, groupIds, List.of(), from, to));
break;
case "route":
- reportMailer.sendAsync(user.getId(), stream -> {
- routeReportProvider.getExcel(
- stream, user.getId(), deviceIds, groupIds,
- report.getFrom(), report.getTo());
- });
+ reportMailer.sendAsync(user.getId(), stream -> routeReportProvider.getExcel(
+ stream, user.getId(), deviceIds, groupIds, from, to));
break;
case "summary":
- reportMailer.sendAsync(user.getId(), stream -> {
- summaryReportProvider.getExcel(
- stream, user.getId(), deviceIds, groupIds,
- report.getFrom(), report.getTo(), false);
- });
+ reportMailer.sendAsync(user.getId(), stream -> summaryReportProvider.getExcel(
+ stream, user.getId(), deviceIds, groupIds, from, to, false));
break;
case "trips":
- reportMailer.sendAsync(user.getId(), stream -> {
- tripsReportProvider.getExcel(
- stream, user.getId(), deviceIds, groupIds,
- report.getFrom(), report.getTo());
- });
+ reportMailer.sendAsync(user.getId(), stream -> tripsReportProvider.getExcel(
+ stream, user.getId(), deviceIds, groupIds, from, to));
break;
case "stops":
- reportMailer.sendAsync(user.getId(), stream -> {
- stopsReportProvider.getExcel(
- stream, user.getId(), deviceIds, groupIds,
- report.getFrom(), report.getTo());
- });
+ reportMailer.sendAsync(user.getId(), stream -> stopsReportProvider.getExcel(
+ stream, user.getId(), deviceIds, groupIds, from, to));
break;
default:
LOGGER.warn("Unsupported report type {}", report.getType());