@@ -129,33 +129,36 @@ public List<Mapping> getTableRows(final LocalDate currentReportDate, final List<
129129 pr .appendToWorkNotes (currentWorkNote );
130130 }
131131 final String keeptimeNotes = pr .getNotes ();
132- String canBeSynced ;
132+ String canBeSyncedMessage ;
133133 if (!isMappedInHeimat ) {
134- canBeSynced = "Not mapped to Heimat task.\n Map in settings dialog." ;
134+ canBeSyncedMessage = "Not mapped to Heimat task.\n Map in settings dialog." ;
135135 } else if (heimatTasks .stream ().noneMatch (ht -> ht .id () == optHeimatMapping .get ().getExternalTaskId ())) {
136- canBeSynced = "Heimat Task is not available (anymore).\n Please check mappings in settings dialog." ;
136+ canBeSyncedMessage = "Heimat Task is not available (anymore).\n Please check mappings in settings dialog." ;
137137 isMappedInHeimat = false ;
138138 } else {
139139 final ExternalProjectMapping externalProjectMapping = optHeimatMapping .get ();
140- canBeSynced = "Sync to " + externalProjectMapping .getExternalTaskName () + "\n ("
140+ canBeSyncedMessage = "Sync to " + externalProjectMapping .getExternalTaskName () + "\n ("
141141 + externalProjectMapping .getExternalProjectName () + ")" ;
142142 }
143143
144144 if (optionalExistingMapping .isPresent ()) {
145145 final Mapping existingMapping = optionalExistingMapping .get ();
146146 final ArrayList <Project > projects = new ArrayList <>(existingMapping .projects ());
147147 projects .add (project );
148+ final long keepTimeSeconds = existingMapping .keeptimeSeconds () + projectWorkSeconds ;
149+ final long heimatSeconds = existingMapping .heimatSeconds ();
150+ final boolean shouldBeSynced = isMappedInHeimat && differenceGreater15Minutes (heimatSeconds , keepTimeSeconds );
148151 final Mapping mapping = new Mapping (isMappedInHeimat ? optHeimatMapping .get ().getExternalTaskId () : -1 ,
149- isMappedInHeimat , canBeSynced , existingMapping .existingTimes (), projects ,
150- existingMapping .heimatNotes (), existingMapping .keeptimeNotes () + ". " + keeptimeNotes ,
151- existingMapping .heimatSeconds (), existingMapping .keeptimeSeconds () + projectWorkSeconds );
152+ isMappedInHeimat , shouldBeSynced , canBeSyncedMessage , existingMapping .existingTimes (), projects ,
153+ existingMapping .heimatNotes (), existingMapping .keeptimeNotes () + ". " + keeptimeNotes , heimatSeconds , keepTimeSeconds );
152154 list .remove (existingMapping );
153155 list .add (mapping );
154156 } else {
157+ final boolean shouldBeSynced = isMappedInHeimat && differenceGreater15Minutes (heimatTimeSeconds , projectWorkSeconds );
155158 final List <Project > projects = Collections .singletonList (project );
156159 final Mapping mapping = new Mapping (isMappedInHeimat ? optHeimatMapping .get ().getExternalTaskId () : -1 ,
157- isMappedInHeimat , canBeSynced , optionalAlreadyBookedTimes , projects , heimatNotes , keeptimeNotes ,
158- heimatTimeSeconds , projectWorkSeconds );
160+ isMappedInHeimat , shouldBeSynced , canBeSyncedMessage , optionalAlreadyBookedTimes , projects ,
161+ heimatNotes , keeptimeNotes , heimatTimeSeconds , projectWorkSeconds );
159162 list .add (mapping );
160163 }
161164 }
@@ -175,7 +178,7 @@ public List<Mapping> getTableRows(final LocalDate currentReportDate, final List<
175178 .filter (t -> t .id () == times .get (0 ).taskId ())
176179 .findAny ()
177180 .orElseThrow ();
178- final Mapping mapping = new Mapping (id , false ,
181+ final Mapping mapping = new Mapping (id , true , false ,
179182 "Not mapped in KeepTime\n \n " + heimatTask .name () + "\n " + heimatTask .taskHolderName (), times ,
180183 new ArrayList <>(0 ), heimatNotes , "" , heimatTimeSeconds , 0 );
181184 list .add (mapping );
@@ -199,7 +202,7 @@ public List<Mapping> getTableRows(final LocalDate currentReportDate, final List<
199202 String heimatNotes = addHeimatNotes (times );
200203 long heimatTimeSeconds = addHeimatTimes (times );
201204
202- final Mapping mapping2 = new Mapping (id , true ,
205+ final Mapping mapping2 = new Mapping (id , true , false ,
203206 "Present in HEIMAT but not KeepTime\n \n " + externalProjectMapping .getExternalTaskName () + "\n "
204207 + externalProjectMapping .getExternalProjectName (), times , mappedProjects .stream ()
205208 .filter (
@@ -214,6 +217,10 @@ public List<Mapping> getTableRows(final LocalDate currentReportDate, final List<
214217 return list ;
215218 }
216219
220+ private static boolean differenceGreater15Minutes (final long heimatTimeSeconds , final long projectWorkSeconds ) {
221+ return heimatTimeSeconds == 0L || Math .abs (heimatTimeSeconds - projectWorkSeconds ) > 15 * 60L ;
222+ }
223+
217224 private static long addHeimatTimes (final List <HeimatTime > optionalAlreadyBookedTimes ) {
218225 long heimatTimeSeconds ;
219226 heimatTimeSeconds = optionalAlreadyBookedTimes .stream ()
@@ -309,9 +316,9 @@ public void updateMappings(final List<ProjectMapping> newMappings) {
309316 ExternalSystem .Heimat ,
310317 heimatTask .taskHolderName (),
311318 heimatTask .id (),
312- heimatTask .name (), getAsJson (
313- heimatTask )
314- , projectMapping .getProject ());
319+ heimatTask .name (),
320+ getAsJson ( heimatTask ),
321+ projectMapping .getProject ());
315322 })
316323 .filter (Objects ::nonNull )
317324 .toList ();
@@ -338,7 +345,7 @@ public void updateMappings(final List<ProjectMapping> newMappings) {
338345 externalProjectsMappingsRepository .deleteAll (mappingsToRemove );
339346 }
340347
341- private String getAsJson (final HeimatTask heimatTask ){
348+ private String getAsJson (final HeimatTask heimatTask ) {
342349 try {
343350 return objectMapper .writeValueAsString (heimatTask );
344351 } catch (JsonProcessingException e ) {
@@ -394,9 +401,9 @@ public ExistingAndInvalidMappings getExistingProjectMappings(List<HeimatTask> ex
394401
395402 public record UserMapping (Mapping mapping , boolean shouldSync , String userNotes , int userMinutes ) {}
396403
397- public record Mapping (long heimatTaskId , boolean canBeSynced , String syncMessage , List < HeimatTime > existingTimes ,
398- List <Project > projects , String heimatNotes , String keeptimeNotes , long heimatSeconds ,
399- long keeptimeSeconds ) {}
404+ public record Mapping (long heimatTaskId , boolean canBeSynced , boolean shouldBeSynced , String syncMessage ,
405+ List <HeimatTime > existingTimes , List < Project > projects , String heimatNotes ,
406+ String keeptimeNotes , long heimatSeconds , long keeptimeSeconds ) {}
400407
401408 public record HeimatErrors (UserMapping mapping , String errorMessage ) {}
402409
0 commit comments