1
package org.hisp.dhis.dashboard.ds.action;
3
import java.sql.Connection;
4
import java.sql.PreparedStatement;
5
import java.sql.ResultSet;
6
import java.util.ArrayList;
7
import java.util.Collection;
8
import java.util.Collections;
9
import java.util.HashMap;
10
import java.util.HashSet;
11
import java.util.Iterator;
12
import java.util.List;
16
import org.hisp.dhis.dashboard.util.DBConnection;
17
import org.hisp.dhis.dashboard.util.DashBoardService;
18
import org.hisp.dhis.dataelement.DataElement;
19
import org.hisp.dhis.dataelement.DataElementService;
20
import org.hisp.dhis.dataset.DataSet;
21
import org.hisp.dhis.dataset.DataSetStore;
22
import org.hisp.dhis.datavalue.DataValueService;
23
import org.hisp.dhis.organisationunit.OrganisationUnit;
24
import org.hisp.dhis.organisationunit.OrganisationUnitGroup;
25
import org.hisp.dhis.organisationunit.OrganisationUnitGroupService;
26
import org.hisp.dhis.organisationunit.OrganisationUnitService;
27
import org.hisp.dhis.organisationunit.comparator.OrganisationUnitShortNameComparator;
28
import org.hisp.dhis.period.Period;
29
import org.hisp.dhis.period.PeriodStore;
30
import org.hisp.dhis.period.PeriodType;
31
import org.hisp.dhis.source.Source;
33
import com.opensymphony.xwork.Action;
35
public class GenerateCommentsResultAction implements Action
38
// ---------------------------------------------------------------
40
// ---------------------------------------------------------------
41
private OrganisationUnitService organisationUnitService;
43
public void setOrganisationUnitService( OrganisationUnitService organisationUnitService )
45
this.organisationUnitService = organisationUnitService;
48
public OrganisationUnitService getOrganisationUnitService()
50
return organisationUnitService;
53
private OrganisationUnitGroupService organisationUnitGroupService;
55
public void setOrganisationUnitGroupService( OrganisationUnitGroupService organisationUnitGroupService )
57
this.organisationUnitGroupService = organisationUnitGroupService;
60
private PeriodStore periodStore;
62
public void setPeriodStore( PeriodStore periodStore )
64
this.periodStore = periodStore;
67
private DataSetStore dataSetStore;
69
public void setDataSetStore( DataSetStore dataSetStore )
71
this.dataSetStore = dataSetStore;
74
public DataSetStore getDataSetStore()
79
private DashBoardService dashBoardService;
81
public void setDashBoardService( DashBoardService dashBoardService )
83
this.dashBoardService = dashBoardService;
86
private DataValueService dataValueService;
88
public void setDataValueService( DataValueService dataValueService )
90
this.dataValueService = dataValueService;
93
private DataElementService dataElementService;
95
public void setDataElementService( DataElementService dataElementService )
97
this.dataElementService = dataElementService;
100
// ---------------------------------------------------------------
102
// ---------------------------------------------------------------
104
private List<OrganisationUnit> orgUnitList;
106
public List<OrganisationUnit> getOrgUnitList()
111
private List<DataSet> dataSetList;
113
public List<DataSet> getDataSetList()
118
private List<Integer> results;
120
public List<Integer> getResults()
125
private Map<DataSet, Map<OrganisationUnit, List<Integer>>> dataStatusResult;
127
public Map<DataSet, Map<OrganisationUnit, List<Integer>>> getDataStatusResult()
129
return dataStatusResult;
132
private Map<DataSet, Collection<Period>> dataSetPeriods;
134
public Map<DataSet, Collection<Period>> getDataSetPeriods()
136
return dataSetPeriods;
139
List<Period> selectedPeriodList;
141
public List<Period> getSelectedPeriodList()
143
return selectedPeriodList;
146
List<String> levelNames;
148
public List<String> getLevelNames()
153
private int maxOULevel;
155
public int getMaxOULevel()
161
// ---------------------------------------------------------------
163
// ---------------------------------------------------------------
167
public void setDsId( String dsId )
173
public void setOuId( String ouId )
178
private String immChildOption;
180
public void setImmChildOption( String immChildOption )
182
this.immChildOption = immChildOption;
187
public void setSDateLB( int dateLB )
192
public int getSDateLB()
199
public void setEDateLB( int dateLB )
204
public int getEDateLB()
209
private String facilityLB;
211
public void setFacilityLB( String facilityLB )
213
this.facilityLB = facilityLB;
216
private List<String> orgUnitListCB;
218
public void setOrgUnitListCB( List<String> orgUnitListCB )
220
this.orgUnitListCB = orgUnitListCB;
223
private List<String> selectedDataSets;
225
public void setSelectedDataSets( List<String> selectedDataSets )
227
this.selectedDataSets = selectedDataSets;
230
public List<String> getSelectedDataSets()
232
return selectedDataSets;
235
private int minOULevel;
237
public int getMinOULevel()
242
private Connection con = null;
247
private String dataTableName;
248
// ---------------------------------------------------------------
249
// Action Implementation
250
// ---------------------------------------------------------------
251
public String execute()
254
con = (new DBConnection()).openConnection();
259
results = new ArrayList<Integer>();
261
minOULevel = organisationUnitService.getNumberOfOrganisationalLevels();
264
if(immChildOption!= null && immChildOption.equalsIgnoreCase( "yes" ))
266
orgUnitListCB = new ArrayList<String>();
267
orgUnitListCB.add( ouId );
269
facilityLB = "immChildren";
271
selectedDataSets = new ArrayList<String>();
272
selectedDataSets.add( dsId );
275
// OrgUnit Related Info
276
OrganisationUnit selectedOrgUnit = new OrganisationUnit();
277
orgUnitList = new ArrayList<OrganisationUnit>();
278
if ( facilityLB.equals( "children" ) )
280
selectedOrgUnit = organisationUnitService.getOrganisationUnit( Integer.parseInt( orgUnitListCB.get( 0 ) ) );
281
orgUnitList = getChildOrgUnitTree( selectedOrgUnit );
283
else if ( facilityLB.equals( "immChildren" ) )
285
selectedOrgUnit = organisationUnitService.getOrganisationUnit( Integer.parseInt( orgUnitListCB.get( 0 ) ) );
287
// This is hard coded to get District and Corporation List
288
if(organisationUnitService.getLevelOfOrganisationUnit( selectedOrgUnit ) == 1)
290
orgUnitList = new ArrayList<OrganisationUnit>();
291
orgUnitList.add( selectedOrgUnit );
293
OrganisationUnitGroup oug = organisationUnitGroupService.getOrganisationUnitGroupByName( "Districts" );
296
List<OrganisationUnit> tempOUList = new ArrayList<OrganisationUnit>(oug.getMembers());
297
Collections.sort( tempOUList, new OrganisationUnitShortNameComparator() );
298
orgUnitList.addAll( tempOUList );
301
oug = organisationUnitGroupService.getOrganisationUnitGroupByName( "Corporations" );
304
List<OrganisationUnit> tempOUList = new ArrayList<OrganisationUnit>(oug.getMembers());
305
Collections.sort( tempOUList, new OrganisationUnitShortNameComparator() );
306
orgUnitList.addAll( tempOUList );
311
orgUnitList = new ArrayList<OrganisationUnit>();
313
Iterator<String> orgUnitIterator = orgUnitListCB.iterator();
314
while ( orgUnitIterator.hasNext() )
316
OrganisationUnit o = organisationUnitService.getOrganisationUnit( Integer.parseInt( (String) orgUnitIterator.next() ) );
317
orgUnitList.add( o );
318
List<OrganisationUnit> organisationUnits = new ArrayList<OrganisationUnit>( o.getChildren() );
319
Collections.sort( organisationUnits, new OrganisationUnitShortNameComparator() );
320
orgUnitList.addAll( organisationUnits );
326
Iterator<String> orgUnitIterator = orgUnitListCB.iterator();
328
while ( orgUnitIterator.hasNext() )
330
o = organisationUnitService.getOrganisationUnit( Integer
331
.parseInt( orgUnitIterator.next() ) );
332
orgUnitList.add( o );
337
for(OrganisationUnit ou : orgUnitList)
339
orgUnitInfo += "," + ou.getId();
343
// Period Related Info
344
Period startPeriod = periodStore.getPeriod( sDateLB );
345
Period endPeriod = periodStore.getPeriod( eDateLB );
347
selectedPeriodList = dashBoardService.getMonthlyPeriods( startPeriod.getStartDate(), endPeriod.getEndDate() );
350
for(Period p : selectedPeriodList)
351
periodInfo += "," + p.getId();
353
// DataSet Related Info
354
dataSetList = new ArrayList<DataSet>();
357
for(String ds : selectedDataSets)
359
DataSet dSet = dataSetStore.getDataSet( Integer.parseInt( ds ) );
360
for(DataElement de : dSet.getDataElements())
361
deInfo += "," + de.getId();
364
System.out.println(orgUnitInfo);
365
System.out.println(deInfo);
366
System.out.println(periodInfo);
368
dataTableName = dashBoardService.createDataTableForComments(orgUnitInfo, deInfo, periodInfo);
370
dataSetPeriods = new HashMap<DataSet, Collection<Period>>();
371
Iterator dataSetIterator = selectedDataSets.iterator();
374
Collection<DataElement> dataElements = new ArrayList<DataElement>();
375
PeriodType dataSetPeriodType;
376
Collection<Period> periodList = new ArrayList<Period>();
378
while ( dataSetIterator.hasNext() )
380
ds = dataSetStore.getDataSet( Integer.parseInt( (String) dataSetIterator.next() ) );
381
dataSetList.add( ds );
382
dataElements = ds.getDataElements();
383
deInfo = getDEInfo(dataElements);
385
dataSetPeriodType = ds.getPeriodType();
387
periodList = periodStore.getIntersectingPeriodsByPeriodType( dataSetPeriodType,
388
startPeriod.getStartDate(), endPeriod.getEndDate() );
389
dataSetPeriods.put( ds, periodList );
391
Iterator orgUnitListIterator = orgUnitList.iterator();
393
Set<Source> dso = new HashSet<Source>();
394
Iterator periodIterator;
396
while ( orgUnitListIterator.hasNext() )
399
o = (OrganisationUnit) orgUnitListIterator.next();
400
orgUnitInfo = ""+o.getId();
402
if(maxOULevel < organisationUnitService.getLevelOfOrganisationUnit( o ))
403
maxOULevel = organisationUnitService.getLevelOfOrganisationUnit( o );
405
if(minOULevel > organisationUnitService.getLevelOfOrganisationUnit( o ))
406
minOULevel = organisationUnitService.getLevelOfOrganisationUnit( o );
408
dso = ds.getSources();
409
periodIterator = periodList.iterator();
412
Collection dataValueResult;
413
double dataStatusPercentatge;
415
while ( periodIterator.hasNext() )
417
p = (Period) periodIterator.next();
418
periodInfo = ""+p.getId();
420
PreparedStatement ps1 = null;
421
ResultSet rs1 = null;
429
else if(!dso.contains( o ))
433
getOrgUnitInfo(o, dso);
435
query = "SELECT sourceid, dataelementid, periodid, comment FROM "+ dataTableName +" WHERE dataelementid IN ("+deInfo+") AND sourceid IN ("+orgUnitInfo+") AND periodid IN ("+periodInfo+")";
436
ps1 = con.prepareStatement(query);
437
rs1 = ps1.executeQuery(query);
441
OrganisationUnit ou = organisationUnitService.getOrganisationUnit( rs1.getInt( 1 ) );
442
DataElement de = dataElementService.getDataElement( rs1.getInt( 2 ));
443
Period per = periodStore.getPeriod( rs1.getInt(3) );
445
String tempStr = ou.getShortName() + " --- " + de.getName();
449
//results.add( new Integer( (int) dataStatusPercentatge ) );
454
dataValueResult = dataValueService.getDataValues( o, p, dataElements );
455
dataStatusPercentatge = ((double) dataValueResult.size() / (double) dataElements.size()) * 100.0;
459
orgUnitInfo = ""+ o.getId();
460
query = "SELECT COUNT(*) FROM "+ dataTableName +" WHERE dataelementid IN ("+deInfo+") AND sourceid IN ("+orgUnitInfo+") AND periodid IN ("+periodInfo+")";
461
ps1 = con.prepareStatement(query);
462
rs1 = ps1.executeQuery(query);
468
dataStatusPercentatge = ((double) rs1.getInt( 1 ) / (double) dataElements.size())*100.0;
472
dataStatusPercentatge = 0.0;
476
dataStatusPercentatge = 0.0;
478
if(dataStatusPercentatge > 100.0) dataStatusPercentatge = 100;
480
dataStatusPercentatge = Math.round( dataStatusPercentatge * Math.pow( 10, 0 ) ) / Math.pow( 10, 0 );
482
results.add( ( int ) dataStatusPercentatge );
492
if(rs1 != null) rs1.close();
493
if(ps1 != null) ps1.close();
497
System.out.println("Exception while closing Prepared Statement, ResultSet");
503
// System.out.println( o.getShortName() );
508
String ouLevelNames[] = { " ", "State", "District", "Block", "PHC", "Subcentre"};
509
levelNames = new ArrayList<String>();
510
int count1 = minOULevel;
511
while ( count1 <= maxOULevel )
513
levelNames.add( ouLevelNames[count1] );
525
if(con != null) con.close();
529
System.out.println("Exception while closing DB Connections : "+e.getMessage());
531
}// finally block end
533
dashBoardService.deleteDataTable( dataTableName );
538
// Returns the OrgUnitTree for which Root is the orgUnit
539
public List<OrganisationUnit> getChildOrgUnitTree( OrganisationUnit orgUnit )
541
List<OrganisationUnit> orgUnitTree = new ArrayList<OrganisationUnit>();
542
orgUnitTree.add( orgUnit );
544
Collection<OrganisationUnit> children = orgUnit.getChildren();
546
Iterator childIterator = children.iterator();
547
OrganisationUnit child;
548
while ( childIterator.hasNext() )
550
child = (OrganisationUnit) childIterator.next();
551
orgUnitTree.addAll( getChildOrgUnitTree( child ) );
554
}// getChildOrgUnitTree end
557
private void getOrgUnitInfo(OrganisationUnit organisationUnit)
559
Collection<OrganisationUnit> children = organisationUnit.getChildren();
561
Iterator<OrganisationUnit> childIterator = children.iterator();
562
OrganisationUnit child;
563
while ( childIterator.hasNext() )
565
child = childIterator.next();
566
orgUnitInfo += "," + child.getId();
567
getOrgUnitInfo( child);
571
private void getOrgUnitInfo(OrganisationUnit organisationUnit, Set<Source> dso)
573
Collection<OrganisationUnit> children = organisationUnit.getChildren();
575
Iterator<OrganisationUnit> childIterator = children.iterator();
576
OrganisationUnit child;
577
while ( childIterator.hasNext() )
579
child = childIterator.next();
580
if(dso.contains( child ))
582
orgUnitInfo += "," + child.getId();
585
getOrgUnitInfo( child, dso );
590
private String getDEInfo(Collection<DataElement> dataElements)
592
StringBuffer deInfo = new StringBuffer( "-1" );
594
for(DataElement de : dataElements)
596
deInfo.append( "," ).append( de.getId() );
598
return deInfo.toString();