• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

openmrs / openmrs-core / 24403205906

14 Apr 2026 01:59PM UTC coverage: 63.88% (+0.04%) from 63.836%
24403205906

push

github

ibacher
Fix compilation issue

0 of 2 new or added lines in 1 file covered. (0.0%)

193 existing lines in 14 files now uncovered.

22202 of 34756 relevant lines covered (63.88%)

0.64 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.18
/api/src/main/java/org/openmrs/api/impl/ProgramWorkflowServiceImpl.java
1
/**
2
 * This Source Code Form is subject to the terms of the Mozilla Public License,
3
 * v. 2.0. If a copy of the MPL was not distributed with this file, You can
4
 * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
5
 * the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
6
 *
7
 * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
8
 * graphic logo is a trademark of OpenMRS Inc.
9
 */
10
package org.openmrs.api.impl;
11

12
import java.util.ArrayList;
13
import java.util.Set;
14
import java.util.Collection;
15
import java.util.Date;
16
import java.util.List;
17
import java.util.Map;
18
import org.openmrs.Cohort;
19
import org.openmrs.Concept;
20
import org.openmrs.ConceptAnswer;
21
import org.openmrs.ConceptStateConversion;
22
import org.openmrs.Patient;
23
import org.openmrs.PatientProgram;
24
import org.openmrs.PatientProgramAttribute;
25
import org.openmrs.PatientState;
26
import org.openmrs.Program;
27
import org.openmrs.ProgramAttributeType;
28
import org.openmrs.ProgramWorkflow;
29
import org.openmrs.ProgramWorkflowState;
30
import org.openmrs.api.APIException;
31
import org.openmrs.api.ProgramNameDuplicatedException;
32
import org.openmrs.api.ProgramWorkflowService;
33
import org.openmrs.api.context.Context;
34
import org.openmrs.api.db.ProgramWorkflowDAO;
35
import org.slf4j.Logger;
36
import org.slf4j.LoggerFactory;
37
import org.springframework.transaction.annotation.Transactional;
38

39
/**
40
 * Default implementation of the ProgramWorkflow-related services class. This method should not be
41
 * invoked by itself. Spring injection is used to inject this implementation into the
42
 * ServiceContext. Which implementation is injected is determined by the spring application context
43
 * file: /metadata/api/spring/applicationContext.xml
44
 *
45
 * @see org.openmrs.api.ProgramWorkflowService
46
 */
47
@Transactional
48
public class ProgramWorkflowServiceImpl extends BaseOpenmrsService implements ProgramWorkflowService {
49
        
50
        private static final Logger log = LoggerFactory.getLogger(ProgramWorkflowServiceImpl.class);
1✔
51
        
52
        protected ProgramWorkflowDAO dao;
53
        
54
        public ProgramWorkflowServiceImpl() {
1✔
55
        }
1✔
56
        
57
        /**
58
         * @see org.openmrs.api.ProgramWorkflowService#setProgramWorkflowDAO(org.openmrs.api.db.ProgramWorkflowDAO)
59
         */
60
        @Override
61
        public void setProgramWorkflowDAO(ProgramWorkflowDAO dao) {
62
                this.dao = dao;
1✔
63
        }
1✔
64
        
65
        // **************************
66
        // PROGRAM
67
        // **************************
68
        
69
        /**
70
         * @see org.openmrs.api.ProgramWorkflowService#saveProgram(org.openmrs.Program)
71
         */
72
        @Override
73
        public Program saveProgram(Program program) throws APIException {
74
                // Program
75
                if (program.getConcept() == null) {
1✔
76
                        throw new APIException("Program.concept.required", (Object[]) null);
1✔
77
                }
78
                
79
                for (ProgramWorkflow workflow : program.getAllWorkflows()) {
1✔
80
                        if (workflow.getConcept() == null) {
1✔
81
                                throw new APIException("ProgramWorkflow.concept.required", (Object[]) null);
1✔
82
                        }                        
83
                        ensureProgramIsSet(workflow, program);                                                
1✔
84
                        for (ProgramWorkflowState state : workflow.getStates()) {
1✔
85
                                if (state.getConcept() == null || state.getInitial() == null || state.getTerminal() == null) {
1✔
86
                                        throw new APIException("ProgramWorkflowState.requires", (Object[]) null);
1✔
87
                                }                                
88

89
                                ensureProgramWorkflowIsSet(state, workflow);
1✔
90
                        }
1✔
91
                }
1✔
92
                return dao.saveProgram(program);
1✔
93
        }
94
         
95
        private void ensureProgramIsSet(ProgramWorkflow workflow, Program program) {                
96
                if (workflow.getProgram() == null) {
1✔
97
                        workflow.setProgram(program);
×
98
                } else if (!workflow.getProgram().equals(program)) {
1✔
99
                        throw new APIException("Program.error.contains.ProgramWorkflow", new Object[] { workflow.getProgram() });
×
100
                }
101
        }
1✔
102
        
103
        private void ensureProgramWorkflowIsSet(ProgramWorkflowState state, ProgramWorkflow workflow) {
104
                if (state.getProgramWorkflow() == null) {
1✔
105
                        state.setProgramWorkflow(workflow);
×
106
                } else if (!state.getProgramWorkflow().equals(workflow)) {
1✔
107
                        throw new APIException("ProgramWorkflow.error.contains.state", new Object[] { workflow.getProgram() });
×
108
                }
109
                
110
        }
1✔
111
        
112
        /**
113
         * @see org.openmrs.api.ProgramWorkflowService#getProgram(java.lang.Integer)
114
         */
115
        @Override
116
        @Transactional(readOnly = true)
117
        public Program getProgram(Integer id) {
118
                return dao.getProgram(id);
1✔
119
        }
120
        
121
        /**
122
         * @see org.openmrs.api.ProgramWorkflowService#getProgramByName(String)
123
         */
124
        @Transactional(readOnly = true)
125
        public Program getProgram(String name) {
126
                return Context.getProgramWorkflowService().getProgramByName(name);
×
127
        }
128
        
129
        /**
130
         * @see org.openmrs.api.ProgramWorkflowService#getProgramByName(String)
131
         */
132
        @Override
133
        @Transactional(readOnly = true)
134
        public Program getProgramByName(String name) throws APIException {
135
                List<Program> programs = dao.getProgramsByName(name, false);
1✔
136
                
137
                if (programs.isEmpty()) {
1✔
138
                        programs = dao.getProgramsByName(name, true);
1✔
139
                }
140
                
141
                //Must be unique not retired or unique retired
142
                if (programs.size() > 1) {
1✔
143
                        throw new ProgramNameDuplicatedException(name);
1✔
144
                }
145
                return programs.isEmpty() ? null : programs.get(0);
1✔
146
        }
147
        
148
        /**
149
         * @see org.openmrs.api.ProgramWorkflowService#getAllPrograms()
150
         */
151
        @Override
152
        @Transactional(readOnly = true)
153
        public List<Program> getAllPrograms() throws APIException {
154
                return Context.getProgramWorkflowService().getAllPrograms(true);
1✔
155
        }
156
        
157
        /**
158
         * @see org.openmrs.api.ProgramWorkflowService#getAllPrograms(boolean)
159
         */
160
        @Override
161
        @Transactional(readOnly = true)
162
        public List<Program> getAllPrograms(boolean includeRetired) throws APIException {
163
                return dao.getAllPrograms(includeRetired);
1✔
164
        }
165
        
166
        /**
167
         * @see org.openmrs.api.ProgramWorkflowService#getPrograms(String)
168
         */
169
        @Override
170
        @Transactional(readOnly = true)
171
        public List<Program> getPrograms(String nameFragment) throws APIException {
172
                return dao.findPrograms(nameFragment);
1✔
173
        }
174
        
175
        /**
176
         * @see org.openmrs.api.ProgramWorkflowService#purgeProgram(org.openmrs.Program)
177
         */
178
        @Override
179
        public void purgeProgram(Program program) throws APIException {
180
                Context.getProgramWorkflowService().purgeProgram(program, false);
1✔
181
        }
1✔
182
        
183
        /**
184
         * @see org.openmrs.api.ProgramWorkflowService#purgeProgram(org.openmrs.Program, boolean)
185
         */
186
        @Override
187
        public void purgeProgram(Program program, boolean cascade) throws APIException {
188
                if (cascade && !program.getAllWorkflows().isEmpty()) {
1✔
189
                        throw new APIException("Program.cascade.purging.not.implemented", (Object[]) null);
1✔
190
                }
191
                for (PatientProgram patientProgram : Context.getProgramWorkflowService().getPatientPrograms(null, program, null,
1✔
192
                    null, null, null, true)) {
193
                        purgePatientProgram(patientProgram);
1✔
194
                }
1✔
195
                dao.deleteProgram(program);
1✔
196
        }
1✔
197
        
198
        /**
199
         * @see org.openmrs.api.ProgramWorkflowService#retireProgram(org.openmrs.Program, java.lang.String)
200
         */
201
        @Override
202
        public Program retireProgram(Program program, String reason) throws APIException {
203
                //program.setRetired(true); - Note the BaseRetireHandler aspect is already setting the retired flag and reason
204
                for (ProgramWorkflow workflow : program.getWorkflows()) {
1✔
205
                        workflow.setRetired(true);
1✔
206
                        for (ProgramWorkflowState state : workflow.getStates()) {
1✔
207
                                state.setRetired(true);
1✔
208
                        }
1✔
209
                }
1✔
210
                return saveProgram(program);
1✔
211
        }
212
        
213
        /**
214
         * @see org.openmrs.api.ProgramWorkflowService#unretireProgram(org.openmrs.Program)
215
         */
216
        @Override
217
        public Program unretireProgram(Program program) throws APIException {
218
                Date lastModifiedDate = program.getDateChanged();
1✔
219
                program.setRetired(false);
1✔
220
                for (ProgramWorkflow workflow : program.getAllWorkflows()) {
1✔
221
                        if (lastModifiedDate != null && lastModifiedDate.equals(workflow.getDateChanged())) {
×
222
                                workflow.setRetired(false);
×
223
                                for (ProgramWorkflowState state : workflow.getStates()) {
×
224
                                        if (lastModifiedDate.equals(state.getDateChanged())) {
×
225
                                                state.setRetired(false);
×
226
                                        }
227
                                }
×
228
                        }
229
                }
×
230
                return saveProgram(program);
1✔
231
        }
232
        
233
        // **************************
234
        // PATIENT PROGRAM 
235
        // **************************
236
        
237
        /**
238
         * @see org.openmrs.api.ProgramWorkflowService#savePatientProgram(org.openmrs.PatientProgram)
239
         */
240
        @Override
241
        public PatientProgram savePatientProgram(PatientProgram patientProgram) throws APIException {
242
                
243
                if (patientProgram.getPatient() == null || patientProgram.getProgram() == null) {
1✔
244
                        throw new APIException("PatientProgram.requires", (Object[]) null);
1✔
245
                }
246
                
247
                // Patient State
248
                for (PatientState state : patientProgram.getStates()) {
1✔
249
                        if (state.getState() == null) {
1✔
250
                                throw new APIException("PatientState.requires", (Object[]) null);
×
251
                        }
252
                        if (state.getPatientProgram() == null) {
1✔
253
                                state.setPatientProgram(patientProgram);
1✔
254
                        } else if (!state.getPatientProgram().equals(patientProgram)) {
1✔
255
                                throw new APIException("PatientProgram.already.assigned", new Object[] { state.getPatientProgram() });
1✔
256
                        }
257
                        if (patientProgram.getVoided() || state.getVoided()) {
1✔
258
                                state.setVoided(true);
1✔
259
                                if (state.getVoidReason() == null && patientProgram.getVoidReason() != null) {
1✔
260
                                        state.setVoidReason(patientProgram.getVoidReason());
1✔
261
                                }
262
                        }
263
                }
1✔
264
                // Makes sure that the end dates of most recent states in each workflow
265
                // and the program end date are consistent
266
                if (patientProgram.getDateCompleted() != null) {
1✔
267
                        for (PatientState state : patientProgram.getMostRecentStateInEachWorkflow()) {
1✔
268
                                // The EndDate of active states only should be updated
269
                                if (state.getEndDate() == null) {
1✔
270
                                        state.setEndDate(patientProgram.getDateCompleted());
1✔
271
                                }
272
                        }
1✔
273
                }
274

275
                return dao.savePatientProgram(patientProgram);
1✔
276
        }
277
        
278
        /**
279
         * @see org.openmrs.api.ProgramWorkflowService#getPatientProgram(java.lang.Integer)
280
         */
281
        @Override
282
        @Transactional(readOnly = true)
283
        public PatientProgram getPatientProgram(Integer patientProgramId) {
284
                return dao.getPatientProgram(patientProgramId);
1✔
285
        }
286
        
287
        /**
288
         * @see org.openmrs.api.ProgramWorkflowService#getPatientPrograms(Patient, Program, Date, Date,
289
         *      Date, Date, boolean)
290
         */
291
        @Override
292
        @Transactional(readOnly = true)
293
        public List<PatientProgram> getPatientPrograms(Patient patient, Program program, Date minEnrollmentDate,
294
                Date maxEnrollmentDate, Date minCompletionDate, Date maxCompletionDate, boolean includeVoided)
295
                        throws APIException {
296
                return dao.getPatientPrograms(patient, program, minEnrollmentDate, maxEnrollmentDate, minCompletionDate,
1✔
297
                    maxCompletionDate, includeVoided);
298
        }
299
        
300
        /**
301
         * @see org.openmrs.api.ProgramWorkflowService#getPatientPrograms(Cohort, Collection)
302
         */
303
        @Override
304
        @Transactional(readOnly = true)
305
        public List<PatientProgram> getPatientPrograms(Cohort cohort, Collection<Program> programs) {
306
                if (cohort.getMemberIds().isEmpty()) {
×
307
                        return dao.getPatientPrograms(null, programs);
×
308
                } else {
309
                        return dao.getPatientPrograms(cohort, programs);
×
310
                }
311
        }
312
        
313
        /**
314
         * @see org.openmrs.api.ProgramWorkflowService#purgePatientProgram(org.openmrs.PatientProgram)
315
         */
316
        @Override
317
        public void purgePatientProgram(PatientProgram patientProgram) throws APIException {
318
                Context.getProgramWorkflowService().purgePatientProgram(patientProgram, false);
1✔
319
                
320
        }
1✔
321
        
322
        /**
323
         * @see org.openmrs.api.ProgramWorkflowService#purgePatientProgram(org.openmrs.PatientProgram,
324
         *      boolean)
325
         */
326
        @Override
327
        public void purgePatientProgram(PatientProgram patientProgram, boolean cascade) throws APIException {
328
                if (cascade && !patientProgram.getStates().isEmpty()) {
1✔
329
                        throw new APIException("PatientProgram.cascade.purging.not.implemented", (Object[]) null);
1✔
330
                }
331
                dao.deletePatientProgram(patientProgram);
1✔
332
        }
1✔
333
        
334
        /**
335
         * @see org.openmrs.api.ProgramWorkflowService#voidPatientProgram(org.openmrs.PatientProgram,
336
         *      java.lang.String)
337
         */
338
        @Override
339
        public PatientProgram voidPatientProgram(PatientProgram patientProgram, String reason) {
340
                patientProgram.setVoided(true);
1✔
341
                patientProgram.setVoidReason(reason);
1✔
342
                return Context.getProgramWorkflowService().savePatientProgram(patientProgram); // The savePatientProgram method handles all of the voiding defaults and cascades
1✔
343
        }
344
        
345
        /**
346
         * @see org.openmrs.api.ProgramWorkflowService#voidPatientProgram(org.openmrs.PatientProgram,
347
         *      java.lang.String)
348
         */
349
        @Override
350
        public PatientProgram unvoidPatientProgram(PatientProgram patientProgram) {
351
                Date voidDate = patientProgram.getDateVoided();
1✔
352
                patientProgram.setVoided(false);
1✔
353
                for (PatientState state : patientProgram.getStates()) {
1✔
354
                        if (voidDate != null && voidDate.equals(state.getDateVoided())) {
1✔
355
                                state.setVoided(false);
×
356
                                state.setVoidedBy(null);
×
357
                                state.setDateVoided(null);
×
358
                                state.setVoidReason(null);
×
359
                        }
360
                }
1✔
361
                return Context.getProgramWorkflowService().savePatientProgram(patientProgram); // The savePatientProgram method handles all of the unvoiding defaults
1✔
362
        }
363
        
364
        /**
365
         * @see org.openmrs.api.ProgramWorkflowService#getPossibleOutcomes(Integer)
366
         */
367
        @Override
368
        @Transactional(readOnly = true)
369
        public List<Concept> getPossibleOutcomes(Integer programId) {
370
                List<Concept> possibleOutcomes = new ArrayList<>();
1✔
371
                Program program = Context.getProgramWorkflowService().getProgram(programId);
1✔
372
                if (program == null) {
1✔
373
                        return possibleOutcomes;
1✔
374
                }
375
                Concept outcomesConcept = program.getOutcomesConcept();
1✔
376
                if (outcomesConcept == null) {
1✔
377
                        return possibleOutcomes;
1✔
378
                }
379
                if (!outcomesConcept.getAnswers().isEmpty()) {
1✔
380
                        for (ConceptAnswer conceptAnswer : outcomesConcept.getAnswers()) {
1✔
381
                                possibleOutcomes.add(conceptAnswer.getAnswerConcept());
1✔
382
                        }
1✔
383
                        return possibleOutcomes;
1✔
384
                }
385
                if (!outcomesConcept.getSetMembers().isEmpty()) {
1✔
386
                        return outcomesConcept.getSetMembers();
1✔
387
                }
388
                return possibleOutcomes;
×
389
        }
390
        
391
        // **************************
392
        // CONCEPT STATE CONVERSION 
393
        // **************************
394
        
395
        /**
396
         * @see org.openmrs.api.ProgramWorkflowService#saveConceptStateConversion(org.openmrs.ConceptStateConversion)
397
         */
398
        @Override
399
        public ConceptStateConversion saveConceptStateConversion(ConceptStateConversion csc) throws APIException {
400
                if (csc.getConcept() == null || csc.getProgramWorkflow() == null || csc.getProgramWorkflowState() == null) {
1✔
401
                        throw new APIException("ConceptStateConversion.requires", (Object[]) null);
×
402
                }
403
                return dao.saveConceptStateConversion(csc);
1✔
404
        }
405
        
406
        /**
407
         * @see org.openmrs.api.ProgramWorkflowService#getConceptStateConversion(java.lang.Integer)
408
         */
409
        @Override
410
        @Transactional(readOnly = true)
411
        public ConceptStateConversion getConceptStateConversion(Integer id) {
412
                return dao.getConceptStateConversion(id);
1✔
413
        }
414
        
415
        /**
416
         * @see org.openmrs.api.ProgramWorkflowService#getAllConceptStateConversions()
417
         */
418
        @Override
419
        @Transactional(readOnly = true)
420
        public List<ConceptStateConversion> getAllConceptStateConversions() throws APIException {
421
                return dao.getAllConceptStateConversions();
1✔
422
        }
423
        
424
        /**
425
         * @see org.openmrs.api.ProgramWorkflowService#purgeConceptStateConversion(org.openmrs.ConceptStateConversion)
426
         */
427
        @Override
428
        public void purgeConceptStateConversion(ConceptStateConversion conceptStateConversion) throws APIException {
429
                Context.getProgramWorkflowService().purgeConceptStateConversion(conceptStateConversion, false);
×
430
        }
×
431
        
432
        /**
433
         * @see org.openmrs.api.ProgramWorkflowService#purgeConceptStateConversion(org.openmrs.ConceptStateConversion,
434
         *      boolean)
435
         */
436
        @Override
437
        public void purgeConceptStateConversion(ConceptStateConversion conceptStateConversion, boolean cascade)
438
                throws APIException {
439
                dao.deleteConceptStateConversion(conceptStateConversion);
1✔
440
        }
1✔
441
        
442
        /**
443
         * Trigger state conversion for a patient based on a concept trigger.
444
         */
445
        public void triggerStateConversion(Patient patient, Concept trigger, Date dateConverted) {
446
                
447
                // Check input parameters
448
                if (patient == null) {
1✔
449
                        throw new APIException("convert.state.invalid.patient", (Object[]) null);
1✔
450
                }
451
                if (trigger == null) {
1✔
452
                        throw new APIException("convert.state.patient.without.valid.trigger", (Object[]) null);
1✔
453
                }
454
                if (dateConverted == null) {
1✔
455
                        throw new APIException("convert.state.invalid.date", (Object[]) null);
1✔
456
                }
457
                
458
                for (PatientProgram patientProgram : getPatientPrograms(patient, null, null, null, null, null, false)) {
1✔
459
                        //skip past patient programs that already completed
460
                        if (patientProgram.getDateCompleted() == null) {
1✔
461
                                Set<ProgramWorkflow> workflows = patientProgram.getProgram().getWorkflows();
1✔
462
                                for (ProgramWorkflow workflow : workflows) {
1✔
463
                                        // (getWorkflows() is only returning over nonretired workflows)
464
                                        PatientState patientState = patientProgram.getCurrentState(workflow);
1✔
465
                                        
466
                                        // #1080 cannot exit patient from care  
467
                                        // Should allow a transition from a null state to a terminal state
468
                                        // Or we should require a user to ALWAYS add an initial workflow/state when a patient is added to a program
469
                                        ProgramWorkflowState currentState = (patientState != null) ? patientState.getState() : null;
1✔
470
                                        ProgramWorkflowState transitionState = workflow.getState(trigger);
1✔
471
                                        
472
                                        log.debug("Transitioning from current state [" + currentState + "]");
1✔
473
                                        log.debug("|---> Transitioning to final state [" + transitionState + "]");
1✔
474
                                        
475
                                        if (transitionState != null && workflow.isLegalTransition(currentState, transitionState)) {
1✔
476
                                                patientProgram.transitionToState(transitionState, dateConverted);
1✔
477
                                                log.debug("State Conversion Triggered: patientProgram=" + patientProgram + " transition from "
1✔
478
                                                        + currentState + " to " + transitionState + " on " + dateConverted);
479
                                        }
480
                                }
1✔
481
                                
482
                                // #1068 - Exiting a patient from care causes "not-null property references
483
                                // a null or transient value: org.openmrs.PatientState.dateCreated". Explicitly
484
                                // calling the savePatientProgram() method will populate the metadata properties.
485
                                // 
486
                                // #1067 - We should explicitly save the patient program rather than let 
487
                                // Hibernate do so when it flushes the session.
488
                                Context.getProgramWorkflowService().savePatientProgram(patientProgram);
1✔
489
                        }
490
                }
1✔
491
        }
1✔
492
        
493
        /**
494
         * @see org.openmrs.api.ProgramWorkflowService#getConceptStateConversion(org.openmrs.ProgramWorkflow,
495
         *      org.openmrs.Concept)
496
         */
497
        @Override
498
        @Transactional(readOnly = true)
499
        public ConceptStateConversion getConceptStateConversion(ProgramWorkflow workflow, Concept trigger) {
UNCOV
500
                return dao.getConceptStateConversion(workflow, trigger);
×
501
        }
502
        
503
        /**
504
         * @see org.openmrs.api.ProgramWorkflowService#getProgramsByConcept(org.openmrs.Concept)
505
         */
506
        @Override
507
        @Transactional(readOnly = true)
508
        public List<Program> getProgramsByConcept(Concept concept) {
509
                return dao.getProgramsByConcept(concept);
1✔
510
        }
511
        
512
        /**
513
         * @see org.openmrs.api.ProgramWorkflowService#getProgramWorkflowsByConcept(org.openmrs.Concept)
514
         */
515
        @Override
516
        @Transactional(readOnly = true)
517
        public List<ProgramWorkflow> getProgramWorkflowsByConcept(Concept concept) {
518
                return dao.getProgramWorkflowsByConcept(concept);
1✔
519
        }
520
        
521
        /**
522
         * @see org.openmrs.api.ProgramWorkflowService#getProgramWorkflowStatesByConcept(org.openmrs.Concept)
523
         */
524
        @Override
525
        @Transactional(readOnly = true)
526
        public List<ProgramWorkflowState> getProgramWorkflowStatesByConcept(Concept concept) {
527
                return dao.getProgramWorkflowStatesByConcept(concept);
1✔
528
        }
529
        
530
        /**
531
         * @see org.openmrs.api.ProgramWorkflowService#getConceptStateConversionByUuid(java.lang.String)
532
         */
533
        @Override
534
        @Transactional(readOnly = true)
535
        public ConceptStateConversion getConceptStateConversionByUuid(String uuid) {
536
                return dao.getConceptStateConversionByUuid(uuid);
1✔
537
        }
538
        
539
        /**
540
         * @see org.openmrs.api.ProgramWorkflowService#getPatientProgramByUuid(java.lang.String)
541
         */
542
        @Override
543
        @Transactional(readOnly = true)
544
        public PatientProgram getPatientProgramByUuid(String uuid) {
545
                return dao.getPatientProgramByUuid(uuid);
1✔
546
        }
547
        
548
        /**
549
         * @see org.openmrs.api.ProgramWorkflowService#getProgramByUuid(java.lang.String)
550
         */
551
        @Override
552
        @Transactional(readOnly = true)
553
        public Program getProgramByUuid(String uuid) {
554
                return dao.getProgramByUuid(uuid);
1✔
555
        }
556
        
557
        /**
558
         * @see org.openmrs.api.ProgramWorkflowService#getWorkflow(Integer)
559
         */
560
        @Override
561
        @Transactional(readOnly = true)
562
        public ProgramWorkflowState getState(Integer stateId) {
563
                return dao.getState(stateId);
1✔
564
        }
565
        
566
        /**
567
         * @see org.openmrs.api.ProgramWorkflowService#getStateByUuid(java.lang.String)
568
         */
569
        @Override
570
        @Transactional(readOnly = true)
571
        public ProgramWorkflowState getStateByUuid(String uuid) {
572
                return dao.getStateByUuid(uuid);
1✔
573
        }
574
        
575
        @Override
576
        @Transactional(readOnly = true)
577
        public PatientState getPatientStateByUuid(String uuid) {
578
                return dao.getPatientStateByUuid(uuid);
1✔
579
        }
580
        
581
        /**
582
         * @see org.openmrs.api.ProgramWorkflowService#getWorkflow(Integer)
583
         */
584
        @Override
585
        @Transactional(readOnly = true)
586
        public ProgramWorkflow getWorkflow(Integer workflowId) {
587
                return dao.getWorkflow(workflowId);
1✔
588
        }
589
        
590
        /**
591
         * @see org.openmrs.api.ProgramWorkflowService#getWorkflowByUuid(java.lang.String)
592
         */
593
        @Override
594
        @Transactional(readOnly = true)
595
        public ProgramWorkflow getWorkflowByUuid(String uuid) {
596
                return dao.getWorkflowByUuid(uuid);
1✔
597
        }
598
        
599
        @Override
600
        public List<ProgramAttributeType> getAllProgramAttributeTypes() {
601
            return dao.getAllProgramAttributeTypes();
1✔
602
        }
603

604
        @Override
605
        public ProgramAttributeType getProgramAttributeType(Integer id) {
606
            return dao.getProgramAttributeType(id);
1✔
607
        }
608
        
609
        @Override
610
        public ProgramAttributeType getProgramAttributeTypeByUuid(String uuid) {
611
            return dao.getProgramAttributeTypeByUuid(uuid);
1✔
612
        }
613

614
        @Override
615
        public ProgramAttributeType saveProgramAttributeType(ProgramAttributeType type) {
616
            return dao.saveProgramAttributeType(type);
1✔
617
        }
618

619
        @Override
620
        public void purgeProgramAttributeType(ProgramAttributeType type) {
621
            dao.purgeProgramAttributeType(type);
1✔
622
        }
1✔
623

624
        @Override
625
        public PatientProgramAttribute getPatientProgramAttributeByUuid(String uuid) {
UNCOV
626
            return dao.getPatientProgramAttributeByUuid(uuid);
×
627
        }
628

629
        @Override
630
        public Map<Object, Object> getPatientProgramAttributeByAttributeName(List<Integer> patients, String attributeName){
UNCOV
631
            return dao.getPatientProgramAttributeByAttributeName(patients, attributeName);
×
632
        }
633
        @Override
634
        public List<PatientProgram> getPatientProgramByAttributeNameAndValue(String attributeName, String attributeValue) {
UNCOV
635
            return dao.getPatientProgramByAttributeNameAndValue(attributeName, attributeValue);
×
636
        }        
637
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc