Skip to content

Commit 031e87d

Browse files
committed
BAH-4464 changed into default method for extensibility
1 parent 7e0346c commit 031e87d

File tree

3 files changed

+67
-16
lines changed

3 files changed

+67
-16
lines changed

api/src/main/java/org/openmrs/module/appointments/service/AppointmentNumberGenerator.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,28 @@
44
import org.springframework.transaction.annotation.Transactional;
55

66
import javax.validation.constraints.NotNull;
7+
import java.util.List;
8+
import java.util.Objects;
79

810
@Transactional
911
public interface AppointmentNumberGenerator {
1012
String generateAppointmentNumber(@NotNull Appointment appointment);
13+
14+
/**
15+
* Apply appointment numbers to a batch of appointments.
16+
* Default behavior: generate one number and apply to all (shared number strategy).*
17+
* @param appointments List of appointments to apply numbers to. Null or empty lists are ignored.
18+
*/
19+
default void applyAppointmentNumbers(@NotNull List<Appointment> appointments) {
20+
if (appointments == null || appointments.isEmpty()) {
21+
return;
22+
}
23+
24+
String sharedNumber = generateAppointmentNumber(appointments.get(0));
25+
appointments.forEach(appointment -> {
26+
if (appointment.getAppointmentNumber() == null) {
27+
appointment.setAppointmentNumber(sharedNumber);
28+
}
29+
});
30+
}
1131
}

api/src/main/java/org/openmrs/module/appointments/service/impl/AppointmentRecurringPatternServiceImpl.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -90,45 +90,45 @@ public AppointmentRecurringPattern update(AppointmentRecurringPattern appointmen
9090
}
9191

9292
private void updateAppointmentsDetails(AppointmentRecurringPattern appointmentRecurringPattern, List<Appointment> appointments) {
93-
// Generate or reuse appointment number for the entire recurring series
94-
String sharedAppointmentNumber = getOrGenerateSharedAppointmentNumber(appointments);
93+
assignAppointmentNumbers(appointments);
9594

9695
appointments.forEach(appointment -> {
97-
// Use the shared appointment number for all appointments
98-
if (appointment.getAppointmentNumber() == null) {
99-
appointment.setAppointmentNumber(sharedAppointmentNumber);
100-
}
10196
setAppointmentAudit(appointment);
10297
appointment.setAppointmentRecurringPattern(appointmentRecurringPattern);
10398
});
10499
}
105100

106-
private String getOrGenerateSharedAppointmentNumber(List<Appointment> appointments) {
101+
private void assignAppointmentNumbers(List<Appointment> appointments) {
107102
if (appointments.isEmpty()) {
108-
return null;
103+
return;
109104
}
110105

111-
// Check if any appointment already has a number (for adding to existing series)
112106
String existingAppointmentNumber = appointments.stream()
113107
.map(Appointment::getAppointmentNumber)
114108
.filter(number -> number != null)
115109
.findFirst()
116110
.orElse(null);
117111

118112
if (existingAppointmentNumber != null) {
119-
return existingAppointmentNumber;
113+
// All must use existing number
114+
appointments.forEach(appointment -> {
115+
if (appointment.getAppointmentNumber() == null) {
116+
appointment.setAppointmentNumber(existingAppointmentNumber);
117+
}
118+
});
119+
return;
120120
}
121121

122-
// Generate new number for new series
122+
// Delegate to generator's batch method
123123
AppointmentNumberGenerator appointmentNumberGenerator =
124124
appointmentNumberGeneratorLocator.retrieveAppointmentNumberGenerator();
125125

126126
if (appointmentNumberGenerator == null) {
127127
log.warn("Can not generate appointment number. No generator found");
128-
return null;
128+
return;
129129
}
130130

131-
return appointmentNumberGenerator.generateAppointmentNumber(appointments.get(0));
131+
appointmentNumberGenerator.applyAppointmentNumbers(appointments);
132132
}
133133

134134
@Override

api/src/test/java/org/openmrs/module/appointments/service/impl/AppointmentRecurringPatternServiceImplTest.java

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import static org.mockito.Matchers.anyString;
4444
import static org.mockito.Mockito.any;
4545
import static org.mockito.Mockito.anyListOf;
46+
import static org.mockito.Mockito.doAnswer;
4647
import static org.mockito.Mockito.doNothing;
4748
import static org.mockito.Mockito.doReturn;
4849
import static org.mockito.Mockito.doThrow;
@@ -96,10 +97,18 @@ public void shouldSaveRecurringAppointmentsForGivenRecurringPatternAndAppointmen
9697
List<Appointment> appointments = Collections.singletonList(appointment);
9798
appointmentRecurringPattern.setAppointments(new HashSet<>(appointments));
9899
String notes = "Notes";
100+
String generatedNumber = "TEST123";
101+
99102
doReturn(notes).when(appointmentServiceHelper).getAppointmentAsJsonString(appointment);
100103
doReturn(appointmentAudit).when(appointmentServiceHelper).getAppointmentAuditEvent(appointment, notes);
101104
doNothing().when(appointmentRecurringPatternDao).save(appointmentRecurringPattern);
102105

106+
// Mock applyAppointmentNumbers to set the appointment number
107+
doAnswer(invocation -> {
108+
List<Appointment> appts = invocation.getArgument(0);
109+
appts.forEach(a -> a.setAppointmentNumber(generatedNumber));
110+
return null;
111+
}).when(appointmentNumberGenerator).applyAppointmentNumbers(anyListOf(Appointment.class));
103112

104113
//setting up the number generator locator
105114
recurringAppointmentService.setAppointmentNumberGeneratorLocator(
@@ -112,7 +121,7 @@ public void shouldSaveRecurringAppointmentsForGivenRecurringPatternAndAppointmen
112121
verify(appointmentRecurringPatternDao).save(appointmentRecurringPattern);
113122
verify(appointmentServiceHelper).getAppointmentAsJsonString(appointment);
114123
verify(appointmentServiceHelper).getAppointmentAuditEvent(appointment, notes);
115-
verify(appointmentNumberGenerator).generateAppointmentNumber(appointment);
124+
verify(appointmentNumberGenerator).applyAppointmentNumbers(anyListOf(Appointment.class));
116125
assertEquals(1, appointmentRecurringPattern.getAppointments().size());
117126
assertEquals(1, appointmentsList.get(0).getAppointmentAudits().size());
118127
}
@@ -284,18 +293,27 @@ public void shouldSaveAndReturnTheUpdatedRecurringPatternWhenUpdateIsCalled() th
284293
AppointmentAudit appointmentAudit = new AppointmentAudit();
285294
appointmentRecurringPattern.setAppointments(new HashSet<>(appointments));
286295
String notes = "Notes";
296+
String generatedNumber = "TEST123";
297+
287298
doNothing().when(appointmentRecurringPatternDao).save(appointmentRecurringPattern);
288299
doReturn(notes).when(appointmentServiceHelper).getAppointmentAsJsonString(appointment);
289300
doReturn(appointmentAudit).when(appointmentServiceHelper).getAppointmentAuditEvent(appointment, notes);
290301

302+
// Mock applyAppointmentNumbers to set the appointment number
303+
doAnswer(invocation -> {
304+
List<Appointment> appts = invocation.getArgument(0);
305+
appts.forEach(a -> a.setAppointmentNumber(generatedNumber));
306+
return null;
307+
}).when(appointmentNumberGenerator).applyAppointmentNumbers(anyListOf(Appointment.class));
308+
291309
recurringAppointmentService.setAppointmentNumberGeneratorLocator(
292310
new AppointmentNumberGeneratorLocatorImpl(appointmentNumberGenerator));
293311
recurringAppointmentService.update(appointmentRecurringPattern, appointment);
294312

295313
verify(appointmentRecurringPatternDao, times(1)).save(appointmentRecurringPattern);
296314
verify(appointmentServiceHelper).getAppointmentAsJsonString(appointment);
297315
verify(appointmentServiceHelper).getAppointmentAuditEvent(appointment, notes);
298-
verify(appointmentNumberGenerator).generateAppointmentNumber(appointment);
316+
verify(appointmentNumberGenerator).applyAppointmentNumbers(anyListOf(Appointment.class));
299317
}
300318

301319
@Test
@@ -383,6 +401,19 @@ public void shouldAssignSameAppointmentNumberToAllNewRecurringAppointments() thr
383401

384402
when(appointmentNumberGenerator.generateAppointmentNumber(any(Appointment.class)))
385403
.thenReturn(sharedAppointmentNumber);
404+
405+
// Mock applyAppointmentNumbers to use the mocked generateAppointmentNumber
406+
doAnswer(invocation -> {
407+
List<Appointment> appts = invocation.getArgument(0);
408+
String number = appointmentNumberGenerator.generateAppointmentNumber(appts.get(0));
409+
appts.forEach(a -> {
410+
if (a.getAppointmentNumber() == null) {
411+
a.setAppointmentNumber(number);
412+
}
413+
});
414+
return null;
415+
}).when(appointmentNumberGenerator).applyAppointmentNumbers(anyListOf(Appointment.class));
416+
386417
doReturn(notes).when(appointmentServiceHelper).getAppointmentAsJsonString(any());
387418
doReturn(appointmentAudit).when(appointmentServiceHelper).getAppointmentAuditEvent(any(), anyString());
388419
doNothing().when(appointmentRecurringPatternDao).save(appointmentRecurringPattern);
@@ -395,7 +426,7 @@ public void shouldAssignSameAppointmentNumberToAllNewRecurringAppointments() thr
395426
assertEquals(sharedAppointmentNumber, appointmentOne.getAppointmentNumber());
396427
assertEquals(sharedAppointmentNumber, appointmentTwo.getAppointmentNumber());
397428
assertEquals(sharedAppointmentNumber, appointmentThree.getAppointmentNumber());
398-
verify(appointmentNumberGenerator, times(1)).generateAppointmentNumber(any());
429+
verify(appointmentNumberGenerator, times(1)).applyAppointmentNumbers(anyListOf(Appointment.class));
399430
}
400431

401432
@Test

0 commit comments

Comments
 (0)