1
package org.hisp.dhis.dashboard.dm.action;
4
* Copyright (c) 2004-2007, University of Oslo
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions are met:
9
* * Redistributions of source code must retain the above copyright notice, this
10
* list of conditions and the following disclaimer.
11
* * Redistributions in binary form must reproduce the above copyright notice,
12
* this list of conditions and the following disclaimer in the documentation
13
* and/or other materials provided with the distribution.
14
* * Neither the name of the HISP project nor the names of its contributors may
15
* be used to endorse or promote products derived from this software without
16
* specific prior written permission.
18
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
22
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
25
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
import java.util.ArrayList;
31
import java.util.Collection;
32
import java.util.Collections;
33
import java.util.Date;
34
import java.util.HashMap;
35
import java.util.Iterator;
36
import java.util.List;
39
import org.hisp.dhis.aggregation.AggregationService;
40
import org.hisp.dhis.indicator.Indicator;
41
import org.hisp.dhis.indicator.IndicatorGroup;
42
import org.hisp.dhis.indicator.IndicatorService;
43
import org.hisp.dhis.organisationunit.OrganisationUnit;
44
import org.hisp.dhis.organisationunit.OrganisationUnitGroup;
45
import org.hisp.dhis.organisationunit.OrganisationUnitGroupService;
46
import org.hisp.dhis.organisationunit.OrganisationUnitGroupSet;
47
import org.hisp.dhis.organisationunit.OrganisationUnitService;
48
import org.hisp.dhis.organisationunit.comparator.OrganisationUnitShortNameComparator;
49
import org.hisp.dhis.period.Period;
50
import org.hisp.dhis.period.PeriodStore;
51
import org.hisp.dhis.period.PeriodType;
52
import org.hisp.dhis.source.Source;
53
import org.hisp.dhis.source.SourceStore;
54
import org.hisp.dhis.target.Target;
55
import org.hisp.dhis.target.TargetService;
57
import com.opensymphony.xwork.Action;
59
public class DashBoardMatrixResultAction
63
// -------------------------------------------------------------------------
65
// -------------------------------------------------------------------------
67
private OrganisationUnitService organisationUnitService;
69
public void setOrganisationUnitService( OrganisationUnitService organisationUnitService )
71
this.organisationUnitService = organisationUnitService;
74
private OrganisationUnitGroupService organisationUnitGroupService;
76
public void setOrganisationUnitGroupService( OrganisationUnitGroupService organisationUnitGroupService )
78
this.organisationUnitGroupService = organisationUnitGroupService;
81
private PeriodStore periodStore;
83
public void setPeriodStore( PeriodStore periodStore )
85
this.periodStore = periodStore;
88
private IndicatorService indicatorService;
90
public void setIndicatorService( IndicatorService indicatorService )
92
this.indicatorService = indicatorService;
95
private TargetService targetService;
97
public void setTargetService( TargetService targetService )
99
this.targetService = targetService;
102
private AggregationService aggregationService;
104
public void setAggregationService( AggregationService aggregationService )
106
this.aggregationService = aggregationService;
109
private SourceStore sourceStore;
111
public void setSourceStore( SourceStore sourceStore )
113
this.sourceStore = sourceStore;
116
// -------------------------------------------------------------------
118
// -------------------------------------------------------------------
122
public void setSDateLB( int dateLB )
127
private String ougSetCB;
129
public void setOugSetCB( String ougSetCB )
131
this.ougSetCB = ougSetCB;
134
private List<String> orgUnitListCB;
136
public void setOrgUnitListCB( List<String> orgUnitListCB )
138
this.orgUnitListCB = orgUnitListCB;
143
public void setEDateLB( int dateLB )
148
private String ouNameTB;
150
public String getOuNameTB()
155
private Integer ouLevel;
157
public Integer getOuLevel()
162
private String selectedGroup;
164
public String getSelectedGroup()
166
return selectedGroup;
169
public void setSelectedGroup( String selectedGroup )
171
this.selectedGroup = selectedGroup;
174
// -----------------------------------------------------------------
176
// -----------------------------------------------------------------
178
private List<String> selectedIndicators;
180
public List<String> getSelectedIndicators()
182
return selectedIndicators;
185
public void setSelectedIndicators( List<String> selectedIndicators )
187
this.selectedIndicators = selectedIndicators;
190
private List<String> indicatorNames;
192
public List<String> getIndicatorNames()
194
return indicatorNames;
197
private Indicator indicator;
199
public Indicator getIndicator()
204
private List<Indicator> indicators;
206
public List<Indicator> getIndicators()
211
private String indicatorName;
213
public String getIndicatorName()
215
return indicatorName;
218
private ArrayList<OrganisationUnit> orgUnitList;
220
public ArrayList<OrganisationUnit> getOrgUnitList()
225
private OrganisationUnitGroup organisationUnitGroup;
227
public void setOrganisationUnitGroup( OrganisationUnitGroup organisationUnitGroup )
229
this.organisationUnitGroup = organisationUnitGroup;
232
private OrganisationUnit organisationUnit;
234
public OrganisationUnit getOrganisationUnit()
236
return organisationUnit;
239
private Collection<OrganisationUnit> corporations;
241
public Collection<OrganisationUnit> getCorporations()
246
private Source source;
248
public Source getSource()
253
private Period period;
255
public Period getPeriod()
260
private PeriodType periodType;
262
public PeriodType getPeriodType()
267
private Period startPeriod;
269
public Period getStartPeriod()
275
private Period endPeriod;
277
public Period getEndPeriod()
282
private Target target;
284
public Target getTarget()
289
private List<Target> targets;
291
public List<Target> getTargets()
296
private String minMaxOrgUnit;
298
public String getMinMaxOrganisationUnit()
300
return minMaxOrgUnit;
303
private List<Double> collectedIndicatorValues;
305
public List<Double> getCollectedIndicatorValues()
307
return collectedIndicatorValues;
310
private Double indicatorValueResult;
312
public Double getIndicatorValueResult()
314
return indicatorValueResult;
317
private String minMaxArray[][];
319
public String[][] getMinMaxArray()
324
private Double indicatorValue;
326
public Double getIndicatorValue()
328
return indicatorValue;
331
private List<String> minValues;
333
public List<String> getMinValues()
338
private List<String> maxValues;
340
public List<String> getMaxValues()
345
private List<String> achievementRates;
347
public List<String> getAchievementRates()
349
return achievementRates;
352
private List<Double> targetValues;
354
public List<Double> getTargetValues()
359
private String achievementRate;
361
public String getAchievementRate()
363
return achievementRate;
366
private Double targetValue;
368
public Double getTargetValue()
373
private String minValue;
375
public String getMinValue()
381
private String maxValue;
383
public String getMaxValue()
388
private String value;
390
public String getValue()
395
private String minOrgUnit;
397
public String getMinOrgUnit()
402
private String maxOrgUnit;
404
public String getMaxOrgUnit()
409
private String message;
411
public String getMessage()
416
private Collection<OrganisationUnitGroup> orgUnitGroups;
418
public Collection<OrganisationUnitGroup> getOrgUnitGroups()
420
return orgUnitGroups;
423
private Integer counter;
425
private Integer ougSetControl;
427
public Integer getOugSetControl()
429
return ougSetControl;
432
// ------------------------------------------------------------------
433
// Action implementation
434
// ------------------------------------------------------------------
436
@SuppressWarnings( { "unchecked", "static-access" } )
437
public String execute()
441
organisationUnit = new OrganisationUnit();
443
organisationUnitGroup = new OrganisationUnitGroup();
445
orgUnitList = new ArrayList<OrganisationUnit>();
447
orgUnitGroups = new ArrayList<OrganisationUnitGroup>();
453
if ( ougSetCB == null )
457
organisationUnit = organisationUnitService.getOrganisationUnit( Integer.parseInt( orgUnitListCB.get( 0 ) ) );
459
ouLevel = organisationUnitService.getLevelOfOrganisationUnit( organisationUnit );
461
Collection orgList = new ArrayList<OrganisationUnit>();
463
orgList = organisationUnit.getChildren();
465
organisationUnitGroup = new OrganisationUnitGroup();
467
if ( orgList == null || orgList.isEmpty() || (orgList.size() == 0) )
469
message = "Please select an Organisation Unit with Children";
476
if ( selectedGroup == null || selectedGroup.equals( "" ) )
478
organisationUnitGroup = organisationUnitGroupService
479
.getOrganisationUnitGroupByName( "Corporations" );
481
corporations = new ArrayList<OrganisationUnit>();
483
corporations = organisationUnitGroup.getMembers();
485
Iterator corpIterator = corporations.iterator();
487
while ( corpIterator.hasNext() )
489
OrganisationUnit currentCorp = (OrganisationUnit) corpIterator.next();
491
if ( orgList.contains( currentCorp ) )
493
orgList.remove( currentCorp );
497
orgUnitList.addAll( orgList );
502
if ( selectedGroup.equalsIgnoreCase( "corporations" ) && (ouLevel == 1) )
504
organisationUnitGroup = organisationUnitGroupService
505
.getOrganisationUnitGroupByName( "Corporations" );
507
corporations = new ArrayList<OrganisationUnit>();
509
corporations = organisationUnitGroup.getMembers();
511
orgUnitList.addAll( corporations );
515
else if ( selectedGroup.equalsIgnoreCase( "corporations" ) && (ouLevel != 1) )
517
List<OrganisationUnit> rootOrgUnits = new ArrayList<OrganisationUnit>( organisationUnitService
518
.getRootOrganisationUnits() );
520
OrganisationUnit topOrgUnit = new OrganisationUnit();
522
topOrgUnit = rootOrgUnits.get( 0 );
524
message = "Please select " + topOrgUnit.getShortName() + " or select another group";
532
organisationUnitGroup = organisationUnitGroupService
533
.getOrganisationUnitGroupByName( "Corporations" );
535
corporations = new ArrayList<OrganisationUnit>();
537
corporations = organisationUnitGroup.getMembers();
539
Iterator corpIterator = corporations.iterator();
541
while ( corpIterator.hasNext() )
543
OrganisationUnit currentCorp = (OrganisationUnit) corpIterator.next();
545
if ( orgList.contains( currentCorp ) )
547
orgList.remove( currentCorp );
551
orgUnitList.addAll( orgList );
558
ouLevel = organisationUnitService.getLevelOfOrganisationUnit( organisationUnit );
560
Collections.sort( orgUnitList, new OrganisationUnitShortNameComparator() );
568
Iterator cbIterator = orgUnitListCB.iterator();
570
while ( cbIterator.hasNext() )
572
String cb = (String) cbIterator.next();
574
OrganisationUnitGroup og = new OrganisationUnitGroup();
576
og = organisationUnitGroupService.getOrganisationUnitGroup( Integer.parseInt( cb ) );
578
orgUnitGroups.add( og );
586
indicatorNames = new ArrayList<String>();
588
minValues = new ArrayList<String>();
590
maxValues = new ArrayList<String>();
592
targetValues = new ArrayList<Double>();
596
collectedIndicatorValues = new ArrayList<Double>();
598
startPeriod = periodStore.getPeriod( sDateLB );
600
endPeriod = periodStore.getPeriod( eDateLB );
602
indicators = new ArrayList<Indicator>();
604
Iterator indiIterator = selectedIndicators.iterator();
606
while ( indiIterator.hasNext() )
608
String str = (String) indiIterator.next();
610
Indicator ind = new Indicator();
612
ind = indicatorService.getIndicator( Integer.parseInt( str ) );
614
indicators.add( ind );
617
Date startDate = startPeriod.getStartDate();
619
Date endDate = endPeriod.getEndDate();
623
if ( ougSetCB == null )
626
Iterator indicatorsIterator = selectedIndicators.iterator();
632
indicatorNames = new ArrayList<String>();
634
minValues = new ArrayList<String>();
636
maxValues = new ArrayList<String>();
638
targetValues = new ArrayList<Double>();
640
collectedIndicatorValues = new ArrayList<Double>();
642
while ( indicatorsIterator.hasNext() )
647
indicator = indicatorService.getIndicator( Integer.parseInt( (String) indicatorsIterator.next() ) );
649
indicatorNames.add( indicator.getName() );
651
period = periodStore.getPeriod( startDate, endDate, PeriodType.getPeriodTypeByName( "monthly" ) );
653
targets = new ArrayList<Target>();
655
List<Period> tempPeriodList = new ArrayList<Period>( periodStore
656
.getIntersectingPeriods( startDate, endDate ) );
657
Iterator tempPeriodListIterator = tempPeriodList.iterator();
658
while ( tempPeriodListIterator.hasNext() )
660
Period tempPeriod = (Period) tempPeriodListIterator.next();
661
List<Target> tempTarget = new ArrayList<Target>( targetService.getTargets( indicator, tempPeriod,
662
organisationUnit ) );
663
if ( tempTarget != null )
664
targets.addAll( tempTarget );
667
if (targets != null && targets.size() > 0)
669
targetValue = targets.get( 0 ).getValue();
677
targetValue = Math.round( targetValue * Math.pow( 10, 0 ) ) / Math.pow( 10, 0 );
679
if ( targetValue == -1 )
684
targetValues.add(targetValue);
686
if ( organisationUnit != null )
688
indicatorValue = aggregationService.getAggregatedIndicatorValue( indicator, startDate, endDate,
695
indicatorValue = aggregationService.getAggregatedIndicatorValue( indicator, startDate, endDate,
700
indicatorValue = Math.round( indicatorValue * Math.pow( 10, 0 ) ) / Math.pow( 10, 0 );
702
if ( indicatorValue == -1 )
704
indicatorValue = 0.0;
707
collectedIndicatorValues.add( indicatorValue );
709
Iterator organisationUnitListIterator = orgUnitList.iterator();
711
minMaxArray = new String[orgUnitList.size()][2];
713
while ( organisationUnitListIterator.hasNext() )
716
OrganisationUnit o = (OrganisationUnit) organisationUnitListIterator.next();
718
indicatorValueResult = aggregationService.getAggregatedIndicatorValue( indicator, startDate,
721
indicatorValueResult = Math.round( indicatorValueResult * Math.pow( 10, 0 ) ) / Math.pow( 10, 0 );
723
if ( indicatorValueResult == -1 )
725
indicatorValueResult = 0.0;
728
minMaxOrgUnit = o.getShortName();
730
minMaxArray[i][0] = String.valueOf( 0 );
732
minMaxArray[i][1] = String.valueOf( 0 );
734
minMaxArray[i][0] = String.valueOf( indicatorValueResult );
736
minMaxArray[i][1] = minMaxOrgUnit;
742
minMaxSort( minMaxArray );
744
StringBuffer minValue = new StringBuffer( minMaxArray[0][0] + " " );
746
StringBuffer maxValue = new StringBuffer( minMaxArray[orgUnitList.size() - 1][0] + " " );
750
if (selectedGroup != null && selectedGroup.equalsIgnoreCase( "corporations" ))
760
for ( int q = 0; q < minMaxArray.length; q++ )
762
String currentValue = minMaxArray[q][0];
764
String currentOrgUnit = minMaxArray[q][1];
766
if ( currentValue.equalsIgnoreCase( minMaxArray[0][0] ) )
768
if ( q == 0 || q % count == 0 )
770
minValue.append( "<br>" );
773
if ( q == minMaxArray.length - 1 )
775
minValue.append( currentOrgUnit );
780
minValue.append( currentOrgUnit ).append( ", " );
785
if ( currentValue.equalsIgnoreCase( minMaxArray[orgUnitList.size() - 1][0] ) )
787
if ( q == 0 || q % count == 0 )
789
maxValue.append( "<br>" );
792
if ( q == minMaxArray.length - 1 )
794
maxValue.append( currentOrgUnit );
798
maxValue.append( currentOrgUnit ).append( ", " );
804
minValues.add( minValue.toString() );
806
maxValues.add( maxValue.toString() );
816
OrganisationUnitGroup oGroup = new OrganisationUnitGroup();
818
Iterator orgUnitGroupIterator = orgUnitGroups.iterator();
820
minMaxArray = new String[orgUnitList.size()][2];
822
while ( orgUnitGroupIterator.hasNext() )
824
oGroup = (OrganisationUnitGroup) orgUnitGroupIterator.next();
826
Iterator indicatorsIterator = selectedIndicators.iterator();
828
while ( indicatorsIterator.hasNext() )
833
Double indicatorSum = 0.0;
835
indicator = indicatorService.getIndicator( Integer.parseInt( (String) indicatorsIterator.next() ) );
837
indicatorNames.add( indicator.getName() );
839
period = periodStore.getPeriod( startDate, endDate, PeriodType.getPeriodTypeByName( "monthly" ) );
841
/*targets = new ArrayList<Target>();
843
List<Period> tempPeriodList = new ArrayList<Period>( periodStore
844
.getIntersectingPeriods( startDate, endDate ) );
845
Iterator tempPeriodListIterator = tempPeriodList.iterator();
846
while ( tempPeriodListIterator.hasNext() )
848
Period tempPeriod = (Period) tempPeriodListIterator.next();
849
List<Target> tempTarget = new ArrayList<Target>( targetService.getTargets( indicator, tempPeriod,
850
organisationUnit ) );
851
if ( tempTarget != null )
852
targets.addAll( tempTarget );
862
target = targets.get(0);
864
targetValue = target.getValue();
867
targetValue = Math.round( targetValue * Math.pow( 10, 0 ) ) / Math.pow( 10, 0 );
869
if ( targetValue == -1 )
874
targetValues.add(targetValue);*/
876
orgUnitList = new ArrayList<OrganisationUnit>();
878
orgUnitList.addAll( oGroup.getMembers() );
880
Iterator organisationUnitListIterator = orgUnitList.iterator();
882
minMaxArray = new String[orgUnitList.size()][2];
884
while ( organisationUnitListIterator.hasNext() )
887
OrganisationUnit o = (OrganisationUnit) organisationUnitListIterator.next();
889
indicatorValueResult = aggregationService.getAggregatedIndicatorValue( indicator, startDate,
892
indicatorValueResult = Math.round( indicatorValueResult * Math.pow( 10, 0 ) )
895
if ( indicatorValueResult == -1 )
897
indicatorValueResult = 0.0;
900
minMaxOrgUnit = o.getShortName();
902
minMaxArray[i][0] = String.valueOf( 0 );
904
minMaxArray[i][1] = String.valueOf( 0 );
906
minMaxArray[i][0] = String.valueOf( indicatorValueResult );
908
minMaxArray[i][1] = minMaxOrgUnit;
912
indicatorSum += indicatorValueResult;
916
indicatorValue = indicatorSum / orgUnitList.size();
918
indicatorValue = Math.round( indicatorValue * Math.pow( 10, 0 ) ) / Math.pow( 10, 0 );
920
collectedIndicatorValues.add( indicatorValue );
922
minMaxSort( minMaxArray );
924
String minValue = minMaxArray[0][0] + " ";
926
String maxValue = minMaxArray[orgUnitList.size() - 1][0] + " ";
930
for ( int q = 0; q < minMaxArray.length; q++ )
932
String currentValue = minMaxArray[q][0];
934
String currentOrgUnit = minMaxArray[q][1];
936
if ( currentValue.equalsIgnoreCase( minMaxArray[0][0] ) )
938
if ( q == 0 || q % count == 0 )
943
if ( q == minMaxArray.length - 1 )
945
minValue += currentOrgUnit;
950
minValue += currentOrgUnit + ", ";
955
if ( currentValue.equalsIgnoreCase( minMaxArray[orgUnitList.size() - 1][0] ) )
957
if ( q == 0 || q % count == 0 )
962
if ( q == minMaxArray.length - 1 )
964
maxValue += currentOrgUnit;
968
maxValue += currentOrgUnit + ", ";
974
minValues.add( minValue );
976
maxValues.add( maxValue );
989
public String[][] minMaxSort( String[][] minMaxArray )
991
int n = minMaxArray.length;
993
boolean doMore = true;
999
String currentOrgUnit;
1009
for ( int m = 0; m < n; m++ )
1013
currentValue = Double.valueOf( minMaxArray[m][0] );
1015
nextValue = Double.valueOf( minMaxArray[m + 1][0] );
1017
currentOrgUnit = minMaxArray[m][1];
1019
nextOrgUnit = minMaxArray[m + 1][1];
1024
currentValue = Double.valueOf( minMaxArray[m][0] );
1026
nextValue = currentValue;
1028
currentOrgUnit = minMaxArray[m][1];
1030
nextOrgUnit = currentOrgUnit;
1033
if ( currentValue > nextValue )
1035
String tempValue = minMaxArray[m][0];
1037
String tempOrgUnit = minMaxArray[m][1];
1039
minMaxArray[m][0] = minMaxArray[m + 1][0];
1041
minMaxArray[m + 1][0] = tempValue;
1043
minMaxArray[m][1] = minMaxArray[m + 1][1];
1045
minMaxArray[m + 1][1] = tempOrgUnit;
1050
if ( currentValue == nextValue )
1052
if ( currentOrgUnit.compareTo( nextOrgUnit ) < 0 )
1054
String tempValue = minMaxArray[m][0];
1056
String tempOrgUnit = minMaxArray[m][1];
1058
minMaxArray[m][0] = minMaxArray[m + 1][0];
1060
minMaxArray[m + 1][0] = tempValue;
1062
minMaxArray[m][1] = minMaxArray[m + 1][1];
1064
minMaxArray[m + 1][1] = tempOrgUnit;