← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 1723: Show DataValueAudits on history pop-up.

 

------------------------------------------------------------
revno: 1723
committer: Quang <Quang@Quang-PC>
branch nick: dhis2
timestamp: Fri 2010-04-02 09:43:38 +0700
message:
  Show DataValueAudits on history pop-up.
modified:
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/datavalue/hibernate/HibernateDataValueStore.java
  dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml
  dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/datavalue/hibernate/DataValueAudit.hbm.xml
  dhis-2/dhis-web/dhis-web-dataentry/src/main/java/org/hisp/dhis/de/action/HistoryAction.java
  dhis-2/dhis-web/dhis-web-dataentry/src/main/java/org/hisp/dhis/de/action/SaveValueAction.java
  dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/META-INF/dhis/beans.xml
  dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/org/hisp/dhis/de/i18n_module.properties
  dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/org/hisp/dhis/de/i18n_module_vi_VN.properties
  dhis-2/dhis-web/dhis-web-dataentry/src/main/webapp/dhis-web-dataentry/history.vm


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/datavalue/hibernate/HibernateDataValueStore.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/datavalue/hibernate/HibernateDataValueStore.java	2009-12-24 14:47:25 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/datavalue/hibernate/HibernateDataValueStore.java	2010-04-02 02:43:38 +0000
@@ -42,6 +42,7 @@
 import org.hisp.dhis.dataelement.DataElement;
 import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo;
 import org.hisp.dhis.datavalue.DataValue;
+import org.hisp.dhis.datavalue.DataValueAuditStore;
 import org.hisp.dhis.datavalue.DataValueStore;
 import org.hisp.dhis.period.Period;
 import org.hisp.dhis.period.PeriodStore;
@@ -49,7 +50,8 @@
 
 /**
  * @author Torgeir Lorange Ostby
- * @version $Id: HibernateDataValueStore.java 5715 2008-09-17 14:05:28Z larshelg $
+ * @version $Id: HibernateDataValueStore.java 5715 2008-09-17 14:05:28Z larshelg
+ *          $
  */
 public class HibernateDataValueStore
     implements DataValueStore
@@ -78,7 +80,14 @@
     {
         this.periodStore = periodStore;
     }
-    
+
+    private DataValueAuditStore dataValueAuditStore;
+
+    public void setDataValueAuditStore( DataValueAuditStore dataValueAuditStore )
+    {
+        this.dataValueAuditStore = dataValueAuditStore;
+    }
+
     // -------------------------------------------------------------------------
     // Support methods for reloading periods
     // -------------------------------------------------------------------------
@@ -134,31 +143,40 @@
     public void deleteDataValue( DataValue dataValue )
     {
         Session session = sessionFactory.getCurrentSession();
-
+        session.beginTransaction();
+        dataValueAuditStore.deleteDataValuesByDataValue( dataValue );
         session.delete( dataValue );
     }
 
     public int deleteDataValuesBySource( Source source )
     {
         Session session = sessionFactory.getCurrentSession();
-
+        session.beginTransaction();
+        Query queryAudit = session.createQuery( "delete DataValueAudit where dataValue.source = :source" );
+        queryAudit.setEntity( "source", source );
+        queryAudit.executeUpdate();
+        
         Query query = session.createQuery( "delete DataValue where source = :source" );
         query.setEntity( "source", source );
-
         return query.executeUpdate();
     }
 
     public int deleteDataValuesByDataElement( DataElement dataElement )
     {
         Session session = sessionFactory.getCurrentSession();
-
+        session.beginTransaction();
+        Query queryAudit = session.createQuery( "delete DataValueAudit where dataValue.dataElement = :dataElement" );
+        queryAudit.setEntity( "dataElement", dataElement );
+        queryAudit.executeUpdate();
+        
         Query query = session.createQuery( "delete DataValue where dataElement = :dataElement" );
         query.setEntity( "dataElement", dataElement );
 
-        return query.executeUpdate();    
+        return query.executeUpdate();
     }
 
-    public DataValue getDataValue( Source source, DataElement dataElement, Period period, DataElementCategoryOptionCombo optionCombo )
+    public DataValue getDataValue( Source source, DataElement dataElement, Period period,
+        DataElementCategoryOptionCombo optionCombo )
     {
         Session session = sessionFactory.getCurrentSession();
 
@@ -177,20 +195,16 @@
 
         return (DataValue) criteria.uniqueResult();
     }
-    
+
     public String getValue( int dataElementId, int periodId, int sourceId, int categoryOptionComboId )
     {
-        final String sql = 
-            "SELECT value " + 
-            "FROM datavalue " + 
-            "WHERE dataelementid='" + dataElementId + "' " +
-            "AND periodid='" + periodId + "' " +
-            "AND sourceid='" + sourceId + "' " + 
-            "AND categoryoptioncomboid='" + categoryOptionComboId + "'";
-        
+        final String sql = "SELECT value " + "FROM datavalue " + "WHERE dataelementid='" + dataElementId + "' "
+            + "AND periodid='" + periodId + "' " + "AND sourceid='" + sourceId + "' " + "AND categoryoptioncomboid='"
+            + categoryOptionComboId + "'";
+
         return statementManager.getHolder().queryForString( sql );
     }
-    
+
     // -------------------------------------------------------------------------
     // Collections of DataValues
     // -------------------------------------------------------------------------
@@ -269,7 +283,8 @@
     }
 
     @SuppressWarnings( "unchecked" )
-    public Collection<DataValue> getDataValues( Source source, Period period, Collection<DataElement> dataElements, Collection<DataElementCategoryOptionCombo> optionCombos  )
+    public Collection<DataValue> getDataValues( Source source, Period period, Collection<DataElement> dataElements,
+        Collection<DataElementCategoryOptionCombo> optionCombos )
     {
         Period storedPeriod = reloadPeriod( period );
 
@@ -290,7 +305,8 @@
     }
 
     @SuppressWarnings( "unchecked" )
-    public Collection<DataValue> getDataValues( DataElement dataElement, Period period, Collection<? extends Source> sources )
+    public Collection<DataValue> getDataValues( DataElement dataElement, Period period,
+        Collection<? extends Source> sources )
     {
         Period storedPeriod = reloadPeriod( period );
 
@@ -336,7 +352,7 @@
     }
 
     @SuppressWarnings( "unchecked" )
-    public Collection<DataValue> getDataValues( DataElement dataElement, DataElementCategoryOptionCombo optionCombo, 
+    public Collection<DataValue> getDataValues( DataElement dataElement, DataElementCategoryOptionCombo optionCombo,
         Collection<Period> periods, Collection<? extends Source> sources )
     {
         Collection<Period> storedPeriods = new ArrayList<Period>();
@@ -396,7 +412,7 @@
             criteria.addOrder( Order.asc( "dataElement" ) );
             criteria.addOrder( Order.asc( "period" ) );
             criteria.addOrder( Order.asc( "source" ) );
-    
+
             criteria.setFirstResult( firstResult );
             criteria.setMaxResults( maxResults );
         }
@@ -409,7 +425,7 @@
     {
         Session session = sessionFactory.getCurrentSession();
 
-        Criteria criteria = session.createCriteria( DataValue.class );        
+        Criteria criteria = session.createCriteria( DataValue.class );
         criteria.add( Restrictions.in( "optionCombo", optionCombos ) );
 
         return criteria.list();
@@ -420,7 +436,7 @@
     {
         Session session = sessionFactory.getCurrentSession();
 
-        Criteria criteria = session.createCriteria( DataValue.class );        
+        Criteria criteria = session.createCriteria( DataValue.class );
         criteria.add( Restrictions.eq( "dataElement", dataElement ) );
 
         return criteria.list();

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml	2010-03-31 16:21:57 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml	2010-04-02 02:43:38 +0000
@@ -52,8 +52,8 @@
     class="org.hisp.dhis.datavalue.hibernate.HibernateDataValueStore">
     <property name="sessionFactory" ref="sessionFactory"/>
     <property name="statementManager" ref="statementManager"/>
-    <property name="periodStore" 
-      ref="org.hisp.dhis.period.PeriodStore"/>
+    <property name="periodStore" ref="org.hisp.dhis.period.PeriodStore"/>
+	<property name="dataValueAuditStore" ref="org.hisp.dhis.datavalue.DataValueAuditStore"/>
   </bean>
   
   <bean id="org.hisp.dhis.indicator.IndicatorStore"

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/datavalue/hibernate/DataValueAudit.hbm.xml'
--- dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/datavalue/hibernate/DataValueAudit.hbm.xml	2010-03-31 16:21:57 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/datavalue/hibernate/DataValueAudit.hbm.xml	2010-04-02 02:43:38 +0000
@@ -8,7 +8,7 @@
 			<generator class="native" />
 		</id>
 
-		<many-to-one name="dataValue" class="org.hisp.dhis.datavalue.DataValue">
+		<many-to-one name="dataValue" class="org.hisp.dhis.datavalue.DataValue" cascade="delete">
 			
 			<column name="dataelementid" />
 			<column name="periodid" />

=== modified file 'dhis-2/dhis-web/dhis-web-dataentry/src/main/java/org/hisp/dhis/de/action/HistoryAction.java'
--- dhis-2/dhis-web/dhis-web-dataentry/src/main/java/org/hisp/dhis/de/action/HistoryAction.java	2009-10-18 22:44:41 +0000
+++ dhis-2/dhis-web/dhis-web-dataentry/src/main/java/org/hisp/dhis/de/action/HistoryAction.java	2010-04-02 02:43:38 +0000
@@ -27,6 +27,7 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+import java.util.Collection;
 import java.util.List;
 
 import org.hisp.dhis.dataelement.DataElement;
@@ -34,6 +35,8 @@
 import org.hisp.dhis.dataelement.DataElementCategoryService;
 import org.hisp.dhis.dataelement.DataElementService;
 import org.hisp.dhis.datavalue.DataValue;
+import org.hisp.dhis.datavalue.DataValueAudit;
+import org.hisp.dhis.datavalue.DataValueAuditService;
 import org.hisp.dhis.datavalue.DataValueService;
 import org.hisp.dhis.de.comments.StandardCommentsManager;
 import org.hisp.dhis.de.history.DataElementHistory;
@@ -99,6 +102,13 @@
         this.standardCommentsManager = standardCommentsManager;
     }
 
+    private DataValueAuditService dataValueAuditService;
+
+    public void setDataValueAuditService( DataValueAuditService dataValueAuditService )
+    {
+        this.dataValueAuditService = dataValueAuditService;
+    }
+    
     // -------------------------------------------------------------------------
     // Input
     // -------------------------------------------------------------------------
@@ -161,6 +171,13 @@
         return standardComments;
     }
 
+    private Collection<DataValueAudit> dataValueAudits;
+    
+    public Collection<DataValueAudit> getDataValueAudits()
+    {
+        return dataValueAudits;
+    }
+   
     // -------------------------------------------------------------------------
     // Action implementation
     // -------------------------------------------------------------------------
@@ -201,6 +218,12 @@
             isHistoryValid = false;
         }
 
+        /*
+         * Data Value Audit
+         */
+        
+        dataValueAudits = dataValueAuditService.getDataValueAuditByDataValue( dataValue );
+
         return SUCCESS;
     }
 }

=== modified file 'dhis-2/dhis-web/dhis-web-dataentry/src/main/java/org/hisp/dhis/de/action/SaveValueAction.java'
--- dhis-2/dhis-web/dhis-web-dataentry/src/main/java/org/hisp/dhis/de/action/SaveValueAction.java	2010-03-31 16:21:57 +0000
+++ dhis-2/dhis-web/dhis-web-dataentry/src/main/java/org/hisp/dhis/de/action/SaveValueAction.java	2010-04-02 02:43:38 +0000
@@ -198,7 +198,9 @@
         else
         {
             LOG.debug( "Updating DataValue, value added/changed" );
-
+            
+            DataValueAudit audit = new DataValueAudit(dataValue, dataValue.getValue(), storedBy, new Date(), value);
+            
             dataValue.setValue( value );
             dataValue.setTimestamp( new Date() );
             dataValue.setStoredBy( storedBy );
@@ -208,8 +210,10 @@
             /*
              * Add DataValueAudit
              */
-            DataValueAudit audit = new DataValueAudit(dataValue, "", storedBy, new Date(), "");
-            dataValueAuditService.addDataValueAudit( audit );
+            if ( value != null )
+            {
+                dataValueAuditService.addDataValueAudit( audit );
+            }
         }
 
         if ( dataValue != null )

=== modified file 'dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/META-INF/dhis/beans.xml	2010-03-31 16:21:57 +0000
+++ dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/META-INF/dhis/beans.xml	2010-04-02 02:43:38 +0000
@@ -259,6 +259,7 @@
 		<property name="dataValueService" ref="org.hisp.dhis.datavalue.DataValueService" />
 		<property name="standardCommentsManager"
 			ref="org.hisp.dhis.de.comments.StandardCommentsManager" />
+		<property name="dataValueAuditService" ref="org.hisp.dhis.datavalue.DataValueAuditService" />
 	</bean>
 
 	<bean id="org.hisp.dhis.de.action.MinMaxGeneratingAction" class="org.hisp.dhis.de.action.MinMaxGeneratingAction"

=== modified file 'dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/org/hisp/dhis/de/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/org/hisp/dhis/de/i18n_module.properties	2010-03-17 10:19:14 +0000
+++ dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/org/hisp/dhis/de/i18n_module.properties	2010-04-02 02:43:38 +0000
@@ -120,4 +120,8 @@
 no_outlier_values_found				= No outlier values found.
 specify_input_date					= Please specify an input date
 specify_valid_input_date			= Please enter a valid input date
-no_outlier_values_found				= No outlier values found.
\ No newline at end of file
+no_outlier_values_found				= No outlier values found.
+datavalue_history					= Data Value History
+change_from							= change from
+to									= to
+on									= On
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/org/hisp/dhis/de/i18n_module_vi_VN.properties'
--- dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/org/hisp/dhis/de/i18n_module_vi_VN.properties	2010-03-26 08:53:58 +0000
+++ dhis-2/dhis-web/dhis-web-dataentry/src/main/resources/org/hisp/dhis/de/i18n_module_vi_VN.properties	2010-04-02 02:43:38 +0000
@@ -217,3 +217,138 @@
 audit=Ki\u1EC3m tra gi\u00E1 tr\u1ECB d\u1EEF li\u1EC7u
 multidimensional_data_entry=Nh\u1EADp d\u1EEF li\u1EC7u \u0111a chi\u1EC1u
 run_validation=Ki\u1EC3m tra d\u1EEF li\u1EC7u
+#Resource generated by I18n Resource Editor
+#Fri Apr 02 09:38:23 ICT 2010
+validate=Ki\u1EC3m tra t\u00EDnh h\u1EE3p l\u1EC7
+import_from_excel=Nh\u1EADp t\u1EEB file Excel (M\u1EABu \u0111\u00E3 \u0111\u01B0\u1EE3c xu\u1EA5t ra)
+saving_comment_failed_status_code=L\u01B0u ch\u00FA th\u00EDch kh\u00F4ng th\u00E0nh c\u00F4ng v\u1EDBi m\u00E3 tr\u1EA1ng th\u00E1i
+description=M\u00F4 t\u1EA3
+use_short_names=S\u1EED d\u1EE5ng t\u00EAn vi\u1EBFt t\u1EAFt
+saving_value_failed_error_code=L\u01B0u gi\u00E1 tr\u1ECB kh\u00F4ng th\u00E0nh c\u00F4ng v\u1EDBi m\u00E3 l\u1ED7i
+entry=Gi\u00E1 tr\u1ECB
+datavalue_history=L\u1ECBch s\u1EED gi\u00E1 tr\u1ECB d\u1EEF li\u1EC7u
+data_set=T\u1EADp h\u1EE3p d\u1EEF li\u1EC7u
+dataelement_comment=Ch\u00FA th\u00EDch
+confirm_undo=B\u1EA1n c\u00F3 ch\u1EAFc ch\u1EAFn b\u1EA1n s\u1EBD x\u00F3a b\u1ECF vi\u1EC7c \u0111\u0103ng k\u00ED n\u00E0y?
+successful_validation=Gi\u00E1 tr\u1ECB h\u1EE3p l\u1EC7
+data_entry=Nh\u1EADp d\u1EEF li\u1EC7u
+stored_by=Ng\u01B0\u1EDDi nh\u1EADp li\u1EC7u
+order_by_entry=Th\u1EE9 t\u1EF1 theo \u0111\u0103ng k\u00FD
+saving_value_failed_status_code=L\u01B0u gi\u00E1 tr\u1ECB kh\u00F4ng th\u00E0nh c\u00F4ng v\u1EDBi m\u00E3 tr\u1EA1ng th\u00E1i
+max_limit=Gi\u1EDBi h\u1EA1n cao nh\u1EA5t
+dv_deleted=\u0110\u00E3 x\u00F3a
+delete_min_max_values=X\u00F3a gi\u00E1 tr\u1ECB nh\u1ECF nh\u1EA5t / l\u1EDBn nh\u1EA5t
+saving_comment_failed_error_code=L\u01B0u ch\u00FA th\u00EDch kh\u00F4ng th\u00E0nh c\u00F4ng v\u1EDBi m\u00E3 l\u1ED7i
+organisation_unit=\u0110\u01A1n v\u1ECB
+value_of_data_element_greater=Gi\u00E1 tr\u1ECB c\u1EE7a th\u00E0nh ph\u1EA7n d\u1EEF li\u1EC7u sau l\u1EDBn h\u01A1n gi\u00E1 tr\u1ECB l\u1EDBn nh\u1EA5t cho ph\u00E9p
+yes=C\u00F3
+max=L\u1EDBn nh\u1EA5t
+generate_min_max=T\u1EA1o gi\u1EDBi b\u1EA1n min/max
+date=Ng\u00E0y
+audit_operation=Lo\u1EA1i thao t\u00E1c
+validation_result=K\u1EBFt qu\u1EA3 ki\u1EC3m tra t\u00EDnh h\u1EE3p l\u1EC7
+down=Xu\u1ED1ng
+dv_updated=\u0110\u00E3 c\u1EADp nh\u1EADt
+value_of_data_element_less=Gi\u00E1 tr\u1ECB c\u1EE7a th\u00E0nh ph\u1EA7n d\u1EEF li\u1EC7u th\u1EA5p h\u01A1n gi\u00E1 tr\u1ECB nh\u1ECF nh\u1EA5t cho ph\u00E9p
+save=L\u01B0u
+saving_minmax_failed_error_code=L\u01B0u gi\u00E1 tr\u1ECB l\u1EDBn nh\u1EA5t/nh\u1ECF nh\u1EA5t kh\u00F4ng th\u00E0nh c\u00F4ng v\u1EDBi m\u00E3 l\u1ED7i
+min_max_limits=Gi\u1EDBi h\u1EA1n l\u1EDBn nh\u1EA5t - nh\u1ECF nh\u1EA5t
+left_description=M\u00F4 t\u1EA3 v\u1EBF tr\u00E1i
+comment=Ch\u00FA th\u00EDch
+dataelement_history=L\u1ECBch s\u1EED ph\u1EA7n t\u1EED d\u1EEF li\u1EC7u
+minimum_must_less_than_maximum=Gi\u00E1 tr\u1ECB nh\u1ECF nh\u1EA5t ph\u1EA3i nh\u1ECF h\u01A1n gi\u00E1 tr\u1ECB l\u1EDBn nh\u1EA5t
+unsuccessful_validation=Gi\u00E1 tr\u1ECB kh\u00F4ng h\u1EE3p l\u1EC7. C\u1EE5 th\u1EC3 nh\u01B0 sau\:
+specify_minimum_value=Vui l\u00F2ng ch\u1EC9 \u0111\u1ECBnh gi\u00E1 tr\u1ECB nh\u1ECF nh\u1EA5t
+equal_to=
+code=M\u00E3 ph\u1EA7n t\u1EED d\u1EEF li\u1EC7u
+use_section_form=Nh\u1EADp theo t\u1EEB ph\u1EA7n
+change_order=\u0110\u1ED5i th\u1EE9 t\u1EF1
+specify_valid_input_date=Vui l\u00F2ng ch\u1EC9 \u0111\u1ECBnh m\u1ED9t ng\u00E0y nh\u1EADp h\u1EE3p l\u1EC7
+not_equal_to=
+audit_stored_by=Th\u1EF1c hi\u1EC7n b\u1EDFi
+value=Gi\u00E1 tr\u1ECB
+specify_maximum_value=Vui l\u00F2ng ch\u1EC9 \u0111\u1ECBnh gi\u00E1 tr\u1ECB l\u1EDBn nh\u1EA5t
+operator=To\u00E1n t\u1EED
+on=V\u00E0o l\u00FAc
+no_dataelement_selected=Kh\u00F4ng th\u00E0nh ph\u1EA7n d\u1EEF li\u1EC7u n\u00E0o \u0111\u01B0\u1EE3c ch\u1ECDn
+min_max_values=Gi\u00E1 tr\u1ECB l\u1EDBn nh\u1EA5t/nh\u1ECF nh\u1EA5t
+data_element=Ph\u1EA7n t\u1EED d\u1EEF li\u1EC7u
+please_design_a_custom_form=Vui l\u00F2ng thi\u1EBFt k\u1EBF m\u1ED9t giao di\u1EC7n cho t\u1EADp h\u1EE3p d\u1EEF li\u1EC7u n\u00E0y\!
+data_element_order=Th\u1EE9 t\u1EF1 th\u00E0nh ph\u1EA7n d\u1EEF li\u1EC7u
+up=L\u00EAn
+minimum_value_must_integer=Gi\u00E1 tr\u1ECB nh\u1ECF nh\u1EA5t ph\u1EA3i l\u00E0 m\u1ED9t s\u1ED1 nguy\u00EAn
+yes_no=Kh\u00F4ng/c\u00F3
+close=\u0110\u00F3ng
+history_not_valid=L\u1ECBch s\u1EEF d\u1EEF li\u1EC7u kh\u00F4ng \u0111\u01B0\u1EE3c \u00E1p d\u1EE5ng cho ph\u1EA7n t\u1EED d\u1EEF li\u1EC7u n\u00E0y\!
+save_calculated=L\u01B0u c\u00E1c gi\u00E1 tr\u1ECB \u0111\u00E3 \u0111\u01B0\u1EE3c t\u00EDnh to\u00E1n
+value_date=Gi\u00E1 tr\u1ECB ng\u00E0y th\u00E1ng
+generate_values=Ph\u00E1t sinh gi\u00E1 tr\u1ECB
+type=Ki\u1EC3u d\u1EEF li\u1EC7u
+interpolation=Ph\u00E9p n\u1ED9i suy
+no_organisationunit_selected=Kh\u00F4ng \u0111\u01A1n v\u1ECB n\u00E0o \u0111\u01B0\u1EE3c ch\u1ECDn
+nr=S\u1ED1
+audit_value=Ki\u1EC3m tra gi\u00E1 tr\u1ECB
+use_default_form=D\u00F9ng giao di\u1EC7n m\u1EB7c \u0111\u1ECBnh
+no=Kh\u00F4ng
+edit_min_max_for=Ch\u1EC9nh s\u1EEDa gi\u00E1 tr\u1ECB nh\u1ECF nh\u1EA5t / l\u1EDBn nh\u1EA5t cho
+later_periods=Th\u1EDDi k\u1EF3 sau
+min_limit=Gi\u1EDBi h\u1EA1n th\u1EA5p nh\u1EA5t
+custom_comment=Ch\u00FA th\u00EDch ng\u1EABu nhi\u00EAn
+period=Th\u1EDDi \u0111i\u1EC3m
+to=th\u00E0nh
+no_outlier_values_found=Kh\u00F4ng t\u00ECm th\u1EA5y gi\u00E1 tr\u1ECB b\u00EAn ngo\u00E0i n\u00E0o.
+calculated_data_elements=C\u00E1c th\u00E0nh ph\u1EA7n d\u1EEF li\u1EC7u \u0111\u00E3 \u0111\u01B0\u1EE3c t\u00EDnh to\u00E1n
+complete=Ho\u00E0n Ch\u1EC9nh
+order_by_code=Th\u1EE9 t\u1EF1 theo m\u00E3
+name=T\u00EAn
+generate_missing_values=Ph\u00E1t sinh nh\u1EEFng gi\u00E1 tr\u1ECB ch\u01B0a c\u00F3
+timestamp=Th\u1EDDi \u0111i\u1EC3m
+use_standard_form=Nh\u1EADp theo m\u1EABu chu\u1EA9n
+change=Thay \u0111\u1ED5i
+less_than=
+dv_added=\u0110\u00E3 th\u00EAm
+data_entry_is_not_possible=Kh\u00F4ng th\u1EC3 nh\u1EADp d\u1EEF li\u1EC7u v\u00EC t\u1EADp h\u1EE3p d\u1EEF li\u1EC7u ch\u01B0a c\u00F3 ph\u1EA7n t\u1EED.
+move=Chuy\u1EC3n
+no_option_selected=Kh\u00F4ng t\u00F9y ch\u1ECDn n\u00E0o \u0111\u01B0\u1EE3c ch\u1ECDn
+right_description=M\u00F4 t\u1EA3 v\u1EBF ph\u1EA3i
+move_up=Di chuy\u1EC3n l\u00EAn tr\u00EAn
+reset_order_inherit=Thi\u1EBFt l\u1EADp th\u1EE9 t\u1EF1/th\u1EEBa k\u1EBF t\u1EEB cha
+generate_missing_value=Ph\u00E1t sinh gi\u00E1 tr\u1ECB ch\u01B0a c\u00F3
+no_value=Kh\u00F4ng c\u00F3 gi\u00E1 tr\u1ECB
+expression=Bi\u1EC3u th\u1EE9c
+not_set=Ch\u01B0a thi\u1EBFt l\u1EADp
+specify_input_date=Vui l\u00F2ng ch\u1EC9 \u0111\u1ECBnh ng\u00E0y nh\u1EADp
+earlier_periods=Th\u1EDDi k\u1EF3 tr\u01B0\u1EDBc
+average=Trung b\u00ECnh
+saving_zero_values_unnecessary=L\u01B0u tr\u1EEF gi\u00E1 tr\u1ECB 0 th\u00EC kh\u00F4ng c\u1EA7n thi\u1EBFt theo nh\u01B0 h\u1EC7 th\u1ED1ng c\u1EE7a b\u1EA1n \u0111\u00E3 c\u00E0i \u0111\u1EB7t\!
+validation_rule=Quy lu\u1EADt ki\u1EC3m tra t\u00EDnh h\u1EE3p l\u1EC7
+text=Chu\u1ED7i
+edit_min_max=Ch\u1EC9nh s\u1EEDa gi\u00E1 tr\u1ECB nh\u1ECF nh\u1EA5t / l\u1EDBn nh\u1EA5t
+confirm_complete=B\u1EA1n c\u00F3 ch\u1EAFc ch\u1EAFn t\u1EADp h\u1EE3p d\u1EEF li\u1EC7u n\u00E0y \u0111\u00E3 ho\u00E0n ch\u1EC9nh?
+audit_from=T\u1EEB
+maximum_value_must_integer=Gi\u00E1 tr\u1ECB l\u1EDBn nh\u1EA5t ph\u1EA3i l\u00E0 m\u1ED9t s\u1ED1 nguy\u00EAn
+undo=S\u1EEDa l\u1EA1i b\u00E1o c\u00E1o
+audit_time=Th\u1EDDi gian ki\u1EC3m tra
+no_comment=Kh\u00F4ng c\u00F3 ch\u00FA th\u00EDch
+maximum=L\u1EDBn nh\u1EA5t
+value_type=Lo\u1EA1i gi\u00E1 tr\u1ECB
+change_from=thay \u0111\u1ED5i
+followup=Ti\u1EBFp theo
+the_following_values_are_outliers=C\u00E1c gi\u00E1 tr\u1ECB sau \u0111\u00E2y \u0111\u01B0\u1EE3c xem nh\u01B0 kh\u00F4ng c\u00F3 trong h\u1EC7 th\u1ED1ng.
+audit_to=\u0110\u1EBFn
+value_must_integer=Gi\u00E1 tr\u1ECB ph\u1EA3i l\u00E0 m\u1ED9t s\u1ED1 nguy\u00EAn
+order_by_name=Th\u1EE9 t\u1EF1 theo t\u00EAn
+select=Ch\u1ECDn
+number=S\u1ED1
+greater_than_or_equal_to=
+move_down=Di chuy\u1EC3n xu\u1ED1ng d\u01B0\u1EDBi
+export_entry_template=Xu\u1EA5t m\u00E0n h\u00ECnh nh\u1EADp li\u1EC7u ra file Excel
+greater_than=
+min=Nh\u1ECF nh\u1EA5t
+minimum=Nh\u1ECF nh\u1EA5t
+the_following_values_violates_rules=C\u00E1c gi\u00E1 tr\u1ECB sau \u0111\u00E2y kh\u00F4ng h\u1EE3p l\u1EC7
+cancel=H\u1EE7y b\u1ECF
+no_period_selected=Kh\u00F4ng th\u1EDDi \u0111i\u1EC3m n\u00E0o \u0111\u01B0\u1EE3c ch\u1ECDn
+audit=Ki\u1EC3m tra gi\u00E1 tr\u1ECB d\u1EEF li\u1EC7u
+multidimensional_data_entry=Nh\u1EADp d\u1EEF li\u1EC7u \u0111a chi\u1EC1u
+run_validation=Ki\u1EC3m tra d\u1EEF li\u1EC7u

=== modified file 'dhis-2/dhis-web/dhis-web-dataentry/src/main/webapp/dhis-web-dataentry/history.vm'
--- dhis-2/dhis-web/dhis-web-dataentry/src/main/webapp/dhis-web-dataentry/history.vm	2010-01-29 09:05:27 +0000
+++ dhis-2/dhis-web/dhis-web-dataentry/src/main/webapp/dhis-web-dataentry/history.vm	2010-04-02 02:43:38 +0000
@@ -93,6 +93,21 @@
 			    categoryOptionComboId=${dataElementHistory.optionCombo.id}">			
         </td>
     </tr>
+	<tr>
+		<!-- Data Value History -->
+		<td colspan="2">
+			<h4>$encoder.htmlEncode( $i18n.getString( "datavalue_history" ) )</h4>
+			#foreach( $eachDataValueAudit in $dataValueAudits )
+				<p>
+					$encoder.htmlEncode( $i18n.getString( "on" ) ) $eachDataValueAudit.timeStamp, 
+					$eachDataValueAudit.storedBy 
+					$encoder.htmlEncode( $i18n.getString( "change_from" ) ) $eachDataValueAudit.value 
+					$encoder.htmlEncode( $i18n.getString( "to" ) ) $eachDataValueAudit.comment.
+				</p>
+			#end					
+        </td>
+    </tr>
+
 </table>
 
 <p><input type="button" value="$encoder.htmlEncode( $i18n.getString( "close" ) )" onclick="window.opener.location.reload();window.close()"></p>