Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
76197a19df | ||
|
|
56020a7529 | ||
|
|
5830ee5180 |
@@ -25,12 +25,11 @@ public class BackgroundTasks extends TimerTask {
|
|||||||
|
|
||||||
private void movePastTasks() throws IOException {
|
private void movePastTasks() throws IOException {
|
||||||
List<Task> taskList = this.taskList.getTaskList(LocalDate.MIN, LocalDate.now().minusDays(1));
|
List<Task> taskList = this.taskList.getTaskList(LocalDate.MIN, LocalDate.now().minusDays(1));
|
||||||
for (Task task : taskList) {
|
taskList.forEach(task -> {
|
||||||
if (!task.isDone()) {
|
if (!task.isDone()) {
|
||||||
task.setNextExecution(LocalDate.now());
|
task.setNextExecution(LocalDate.now());
|
||||||
this.taskList.saveTask(task);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public BackgroundTasks(TaskList taskList, CropList cropList, PlantList plantList) {
|
public BackgroundTasks(TaskList taskList, CropList cropList, PlantList plantList) {
|
||||||
|
|||||||
+6
-58
@@ -9,12 +9,8 @@ import ch.zhaw.gartenverwaltung.types.*;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static java.util.stream.Collectors.toList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The WeatherGardenTaskPlanner creates Tasks based on weather events and the rain amount from the last days
|
* The WeatherGardenTaskPlanner creates Tasks based on weather events and the rain amount from the last days
|
||||||
*
|
*
|
||||||
@@ -47,7 +43,8 @@ public class WeatherGradenTaskPlanner {
|
|||||||
private void getSevereWeatherEvents() throws IOException {
|
private void getSevereWeatherEvents() throws IOException {
|
||||||
SevereWeather actualWeather = weatherService.causeSevereWeather(1);
|
SevereWeather actualWeather = weatherService.causeSevereWeather(1);
|
||||||
if (SevereWeather.HAIL.equals(actualWeather)) {
|
if (SevereWeather.HAIL.equals(actualWeather)) {
|
||||||
createPreHailTask();
|
//ToDo creates hail task all 3 seconds, pls fix
|
||||||
|
//createPreHailTask();
|
||||||
} else if (SevereWeather.FROST.equals(actualWeather)) {
|
} else if (SevereWeather.FROST.equals(actualWeather)) {
|
||||||
createPreFrostTask();
|
createPreFrostTask();
|
||||||
} else if (SevereWeather.SNOW.equals(actualWeather)) {
|
} else if (SevereWeather.SNOW.equals(actualWeather)) {
|
||||||
@@ -66,27 +63,11 @@ public class WeatherGradenTaskPlanner {
|
|||||||
*/
|
*/
|
||||||
private void createPreHailTask() throws IOException {
|
private void createPreHailTask() throws IOException {
|
||||||
|
|
||||||
List<Crop> actualCrops = cropList.getCrops();
|
|
||||||
|
|
||||||
for (Crop crop : actualCrops) {
|
|
||||||
Task preHailTask = new Task("Hail",
|
Task preHailTask = new Task("Hail",
|
||||||
"During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin",
|
"During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin",
|
||||||
dateSevereWeather,dateSevereWeather.plusDays(1L),crop.getCropId().orElse(-1L));
|
dateSevereWeather.minusDays(1L),dateSevereWeather.plusDays(1L),1L);
|
||||||
|
|
||||||
List<Task> actualCropTaskList = taskList.getTaskForCrop(crop.getCropId().orElse(-1L));
|
|
||||||
List<Task> hailTasklist = actualCropTaskList.stream().filter(task -> task.getName().equals("Hail")).toList();
|
|
||||||
|
|
||||||
List<Task> hailTaskListAtDate = new ArrayList<>();
|
|
||||||
for (Task task : hailTasklist) {
|
|
||||||
if (task.getStartDate() == (preHailTask.getStartDate())) {
|
|
||||||
hailTaskListAtDate.add(task);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(hailTaskListAtDate.isEmpty() && hailTasklist.isEmpty()){
|
|
||||||
taskList.saveTask(preHailTask);
|
taskList.saveTask(preHailTask);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -94,56 +75,23 @@ public class WeatherGradenTaskPlanner {
|
|||||||
* @throws IOException If the database cannot be accessed
|
* @throws IOException If the database cannot be accessed
|
||||||
*/
|
*/
|
||||||
private void createPreFrostTask() throws IOException {
|
private void createPreFrostTask() throws IOException {
|
||||||
List<Crop> actualCrops = cropList.getCrops();
|
|
||||||
for (Crop crop : actualCrops) {
|
|
||||||
|
|
||||||
Task preFrostTask = new Task("Frost",
|
Task preFrostTask = new Task("Frost",
|
||||||
"The temperatur falls below zero degrees, cover especially the root with wool",
|
"The temperatur falls below zero degrees, cover especially the root with wool",
|
||||||
dateSevereWeather,dateSevereWeather.plusDays(1L),crop.getCropId().orElse(-1L));
|
dateSevereWeather.minusDays(1L),dateSevereWeather.plusDays(1L),1L);
|
||||||
|
|
||||||
List<Task> actualCropTaskList = taskList.getTaskForCrop(crop.getCropId().orElse(-1L));
|
|
||||||
List<Task> frostTasklist = actualCropTaskList.stream().filter(task -> task.getName().equals("Frost")).toList();
|
|
||||||
|
|
||||||
List<Task> frostTaskListAtDate = new ArrayList<>();
|
|
||||||
for (Task task : frostTasklist) {
|
|
||||||
if (task.getStartDate() == preFrostTask.getStartDate()) {
|
|
||||||
frostTaskListAtDate.add(task);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(frostTaskListAtDate.isEmpty() && frostTasklist.isEmpty()){
|
|
||||||
taskList.saveTask(preFrostTask);
|
taskList.saveTask(preFrostTask);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method to create a PreSnowTask
|
* Method to create a PreSnowTask
|
||||||
* @throws IOException If the database cannot be accessed
|
* @throws IOException If the database cannot be accessed
|
||||||
*/
|
*/
|
||||||
private void createPreSnowTask() throws IOException {
|
private void createPreSnowTask() throws IOException {
|
||||||
List<Crop> actualCrops = cropList.getCrops();
|
|
||||||
for (Crop crop : actualCrops) {
|
|
||||||
|
|
||||||
Task preSnowTask = new Task("Snow",
|
Task preSnowTask = new Task("Snow",
|
||||||
"The weather brings little snowfall. Cover your crops",
|
"The weather brings little snowfall. Cover your crops",
|
||||||
dateSevereWeather, dateSevereWeather.plusDays(1L), crop.getCropId().orElse(-1L));
|
dateSevereWeather.minusDays(1L),dateSevereWeather.plusDays(1L),1L);
|
||||||
|
|
||||||
List<Task> actualCropTaskList = taskList.getTaskForCrop(crop.getCropId().orElse(-1L));
|
|
||||||
List<Task> snowTasklist = actualCropTaskList.stream().filter(task -> task.getName().equals("Snow")).toList();
|
|
||||||
|
|
||||||
List<Task> snowTaskListAtDate = new ArrayList<>();
|
|
||||||
for (Task task : snowTasklist) {
|
|
||||||
if (task.getStartDate() == preSnowTask.getStartDate()) {
|
|
||||||
snowTaskListAtDate.add(task);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(snowTaskListAtDate .isEmpty() && snowTasklist.isEmpty()){
|
|
||||||
taskList.saveTask(preSnowTask);
|
taskList.saveTask(preSnowTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method to adjust the water plant tasks
|
* Method to adjust the water plant tasks
|
||||||
* @param rainAmount Amount of rain from the last 7 days
|
* @param rainAmount Amount of rain from the last 7 days
|
||||||
|
|||||||
@@ -63,7 +63,6 @@ public class Task {
|
|||||||
this.startDate = startDate;
|
this.startDate = startDate;
|
||||||
nextExecution = startDate;
|
nextExecution = startDate;
|
||||||
this.endDate = endDate;
|
this.endDate = endDate;
|
||||||
this.cropId = cropId;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-1
@@ -52,7 +52,7 @@ public class WeatherGardenTaskPlannerTest {
|
|||||||
exampleTask.setNextExecution(LocalDate.now().plusDays(1L));
|
exampleTask.setNextExecution(LocalDate.now().plusDays(1L));
|
||||||
exampleWeatherTask = new Task("Hail",
|
exampleWeatherTask = new Task("Hail",
|
||||||
"During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin",
|
"During a summer Thunderstorm it could hail heavily. THe Hail could damage the crops. To prevent damage cover the plants with a strong tarpaulin",
|
||||||
LocalDate.now(),LocalDate.now().plusDays(1L),3L);
|
LocalDate.now().minusDays(1L),LocalDate.now().plusDays(1L),3L);
|
||||||
|
|
||||||
taskList = new JsonTaskList(testFile);
|
taskList = new JsonTaskList(testFile);
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
package ch.zhaw.gartenverwaltung.io;
|
package ch.zhaw.gartenverwaltung.io;
|
||||||
|
|
||||||
|
import ch.zhaw.gartenverwaltung.models.GardenSchedule;
|
||||||
|
import ch.zhaw.gartenverwaltung.models.PlantNotFoundException;
|
||||||
|
import ch.zhaw.gartenverwaltung.types.Crop;
|
||||||
import ch.zhaw.gartenverwaltung.types.Task;
|
import ch.zhaw.gartenverwaltung.types.Task;
|
||||||
|
import javafx.application.Platform;
|
||||||
import org.junit.jupiter.api.*;
|
import org.junit.jupiter.api.*;
|
||||||
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.ArgumentMatchers;
|
import org.mockito.ArgumentMatchers;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
@@ -13,6 +18,7 @@ import java.nio.file.Path;
|
|||||||
import java.nio.file.StandardCopyOption;
|
import java.nio.file.StandardCopyOption;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
@@ -27,6 +33,22 @@ public class JsonTaskListTest {
|
|||||||
private final URL dbDataSource = this.getClass().getResource("test-taskdb.json");
|
private final URL dbDataSource = this.getClass().getResource("test-taskdb.json");
|
||||||
private final URL testFile = this.getClass().getResource("template-taskdb.json");
|
private final URL testFile = this.getClass().getResource("template-taskdb.json");
|
||||||
|
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
static void setUpAll() {
|
||||||
|
try{
|
||||||
|
Platform.startup(()->{});
|
||||||
|
}catch (IllegalStateException ise){
|
||||||
|
//ignore double launches
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterAll
|
||||||
|
static void tearDownAll() {
|
||||||
|
//Dont do: Platform.exit();
|
||||||
|
}
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
void connectToDb() throws URISyntaxException, IOException {
|
void connectToDb() throws URISyntaxException, IOException {
|
||||||
assertNotNull(testFile);
|
assertNotNull(testFile);
|
||||||
@@ -35,6 +57,10 @@ public class JsonTaskListTest {
|
|||||||
testDatabase = new JsonTaskList(dbDataSource);
|
testDatabase = new JsonTaskList(dbDataSource);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void reloadDb() {
|
||||||
|
testDatabase = new JsonTaskList(dbDataSource);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@DisplayName("Check if results are retrieved completely")
|
@DisplayName("Check if results are retrieved completely")
|
||||||
void getTasks() {
|
void getTasks() {
|
||||||
@@ -47,7 +73,8 @@ public class JsonTaskListTest {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
Assertions.assertEquals(3, taskList.size());
|
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList();
|
||||||
|
Assertions.assertEquals(Arrays.asList(1L, 2L, 5L), ids);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +92,8 @@ public class JsonTaskListTest {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
Assertions.assertEquals(4, taskList.size());
|
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList();
|
||||||
|
Assertions.assertEquals(Arrays.asList(1L, 2L, 5L, 9L), ids);
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
@@ -83,7 +111,8 @@ public class JsonTaskListTest {
|
|||||||
taskList = testDatabase.getTaskList(LocalDate.parse("2022-04-30", formatter),
|
taskList = testDatabase.getTaskList(LocalDate.parse("2022-04-30", formatter),
|
||||||
LocalDate.parse("2022-05-31", formatter));
|
LocalDate.parse("2022-05-31", formatter));
|
||||||
|
|
||||||
Assertions.assertEquals(2, taskList.size());
|
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList();
|
||||||
|
Assertions.assertEquals(Arrays.asList(1L, 5L), ids);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
@@ -100,8 +129,8 @@ public class JsonTaskListTest {
|
|||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
Assertions.assertEquals(6, taskList.size());
|
List<Long> ids = taskList.stream().map(t -> t.getId().orElse(0L)).toList();
|
||||||
|
Assertions.assertEquals(Arrays.asList(1L, 2L, 3L, 4L, 5L, 6L), ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -116,6 +145,16 @@ public class JsonTaskListTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Assertions.assertEquals(0, taskList.size());
|
Assertions.assertEquals(0, taskList.size());
|
||||||
|
|
||||||
|
try {
|
||||||
|
taskList = testDatabase.getTaskForCrop(1);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Long> ids = (taskList.stream().map( task -> task.getId().orElse(0L)).toList());
|
||||||
|
Assertions.assertEquals(Arrays.asList(7L, 8L), ids);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -138,6 +177,43 @@ public class JsonTaskListTest {
|
|||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
verify(mockObs, times(1)).onChange(ArgumentMatchers.anyList());
|
|
||||||
|
ArgumentCaptor<List<Task>> captor = ArgumentCaptor.forClass(List.class);
|
||||||
|
|
||||||
|
verify(mockObs, times(1)).onChange(captor.capture());
|
||||||
|
List<Long> ids = captor.getValue().stream().map(t -> t.getId().orElse(0L)).toList();
|
||||||
|
Assertions.assertEquals(Arrays.asList(7L, 8L), ids);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Tag("IntegrationTest")
|
||||||
|
void testComplete() {
|
||||||
|
JsonPlantList plantList = new JsonPlantList();
|
||||||
|
try {
|
||||||
|
testDatabase.removeTasksForCrop(0);
|
||||||
|
testDatabase.removeTasksForCrop(1);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
GardenSchedule gardenSchedule = null;
|
||||||
|
try {
|
||||||
|
gardenSchedule = new GardenSchedule(testDatabase, plantList);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
Crop crop = new Crop(3L, LocalDate.parse("2022-12-01", formatter));
|
||||||
|
|
||||||
|
try {
|
||||||
|
gardenSchedule.planTasksForCrop(crop);
|
||||||
|
|
||||||
|
reloadDb();
|
||||||
|
|
||||||
|
List<Task> tasks = gardenSchedule.getTaskList();
|
||||||
|
List<String> tasknames = (tasks.stream().map( task -> task.getName().substring(0,3).toLowerCase()).toList());
|
||||||
|
Assertions.assertEquals(Arrays.asList("ger","wat","hil","har"), tasknames);
|
||||||
|
} catch (IOException | PlantNotFoundException | HardinessZoneNotSetException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,9 @@ package ch.zhaw.gartenverwaltung.models;
|
|||||||
import ch.zhaw.gartenverwaltung.io.*;
|
import ch.zhaw.gartenverwaltung.io.*;
|
||||||
import ch.zhaw.gartenverwaltung.models.GardenSchedule;
|
import ch.zhaw.gartenverwaltung.models.GardenSchedule;
|
||||||
import ch.zhaw.gartenverwaltung.types.*;
|
import ch.zhaw.gartenverwaltung.types.*;
|
||||||
|
import javafx.application.Platform;
|
||||||
|
import org.junit.jupiter.api.AfterAll;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
@@ -29,6 +32,21 @@ class GardenScheduleTest {
|
|||||||
List<TaskTemplate> exampleTaskTemplateList;
|
List<TaskTemplate> exampleTaskTemplateList;
|
||||||
GardenSchedule model;
|
GardenSchedule model;
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
static void setUpAll() {
|
||||||
|
try{
|
||||||
|
Platform.startup(()->{});
|
||||||
|
}catch (IllegalStateException ise){
|
||||||
|
//ignore double launches
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterAll
|
||||||
|
static void tearDownAll() {
|
||||||
|
//Dont do: Platform.exit();
|
||||||
|
}
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
void setUp() throws IOException, HardinessZoneNotSetException {
|
void setUp() throws IOException, HardinessZoneNotSetException {
|
||||||
createExampleTaskList();
|
createExampleTaskList();
|
||||||
@@ -221,5 +239,8 @@ class GardenScheduleTest {
|
|||||||
testTaskList.getTaskList(LocalDate.MIN,LocalDate.MAX).get(0);
|
testTaskList.getTaskList(LocalDate.MIN,LocalDate.MAX).get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testPlantNotFoundException() throws HardinessZoneNotSetException, IOException {
|
||||||
|
assertThrowsExactly(PlantNotFoundException.class, () -> { model.planTasksForCrop(new Crop(0, exampleStartDate)); });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -26,8 +26,8 @@
|
|||||||
"name" : "fertilize plant",
|
"name" : "fertilize plant",
|
||||||
"description": "The fertilizer has to be mixed with water. Then fertilize the plants soil with the mixture",
|
"description": "The fertilizer has to be mixed with water. Then fertilize the plants soil with the mixture",
|
||||||
"startDate" : "2022-06-01",
|
"startDate" : "2022-06-01",
|
||||||
"nextExecution": "2022-05-01",
|
"nextExecution": "2022-06-01",
|
||||||
"nextNotification": "2022-05-01",
|
"nextNotification": "2022-06-01",
|
||||||
"endDate" : "2022-08-01",
|
"endDate" : "2022-08-01",
|
||||||
"interval" : 28,
|
"interval" : 28,
|
||||||
"cropId" : 0
|
"cropId" : 0
|
||||||
@@ -37,8 +37,8 @@
|
|||||||
"name" : "covering plant",
|
"name" : "covering plant",
|
||||||
"description": "Take a big enough coverage for the plants. Cover the whole plant with a bit space between the plant and the coverage",
|
"description": "Take a big enough coverage for the plants. Cover the whole plant with a bit space between the plant and the coverage",
|
||||||
"startDate" : "2022-07-01",
|
"startDate" : "2022-07-01",
|
||||||
"nextExecution": "2022-05-01",
|
"nextExecution": "2022-07-01",
|
||||||
"nextNotification": "2022-05-01",
|
"nextNotification": "2022-07-01",
|
||||||
"endDate" : "2022-07-01",
|
"endDate" : "2022-07-01",
|
||||||
"interval" : 0,
|
"interval" : 0,
|
||||||
"cropId" : 0
|
"cropId" : 0
|
||||||
@@ -59,10 +59,32 @@
|
|||||||
"name" : "harvest plant",
|
"name" : "harvest plant",
|
||||||
"description": "Pull the ripe vegetables out from the soil. Clean them with clear, fresh water. ",
|
"description": "Pull the ripe vegetables out from the soil. Clean them with clear, fresh water. ",
|
||||||
"startDate" : "2022-09-01",
|
"startDate" : "2022-09-01",
|
||||||
"nextExecution": "2022-05-01",
|
"nextExecution": "2022-09-01",
|
||||||
"nextNotification": "2022-05-01",
|
"nextNotification": "2022-09-01",
|
||||||
"endDate" : "2022-09-01",
|
"endDate" : "2022-09-01",
|
||||||
"interval" : 0,
|
"interval" : 0,
|
||||||
"cropId" : 0
|
"cropId" : 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : 7,
|
||||||
|
"name" : "sow plant",
|
||||||
|
"description": "Plant the seeds, crops in de bed.",
|
||||||
|
"startDate" : "2022-11-01",
|
||||||
|
"nextExecution": "2022-11-01",
|
||||||
|
"nextNotification": "2022-11-01",
|
||||||
|
"endDate" : "2022-11-01",
|
||||||
|
"interval" : 0,
|
||||||
|
"cropId" : 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id" : 8,
|
||||||
|
"name" : "harvest plant",
|
||||||
|
"description": "Pull the ripe vegetables out from the soil. Clean them with clear, fresh water. ",
|
||||||
|
"startDate" : "2022-12-01",
|
||||||
|
"nextExecution": "2022-12-01",
|
||||||
|
"nextNotification": "2022-12-01",
|
||||||
|
"endDate" : "2022-12-01",
|
||||||
|
"interval" : 0,
|
||||||
|
"cropId" : 1
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
Reference in New Issue
Block a user