Browse Source

钉钉考勤同步调整

fancy 5 years ago
parent
commit
8797620d83

+ 64 - 20
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/DingdingAttendanceQueue.java

@@ -2,6 +2,7 @@ package com.x.attendance.assemble.control;
 
 
 import com.x.attendance.assemble.control.exception.DingDingRequestException;
 import com.x.attendance.assemble.control.exception.DingDingRequestException;
 import com.x.attendance.entity.AttendanceDingtalkDetail;
 import com.x.attendance.entity.AttendanceDingtalkDetail;
+import com.x.attendance.entity.AttendanceDingtalkDetail_;
 import com.x.attendance.entity.DingdingQywxSyncRecord;
 import com.x.attendance.entity.DingdingQywxSyncRecord;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
@@ -19,6 +20,11 @@ import com.x.base.core.project.queue.AbstractQueue;
 import com.x.base.core.project.tools.DateTools;
 import com.x.base.core.project.tools.DateTools;
 import com.x.base.core.project.x_organization_assemble_control;
 import com.x.base.core.project.x_organization_assemble_control;
 
 
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -29,33 +35,41 @@ public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecor
 
 
     @Override
     @Override
     protected void execute(DingdingQywxSyncRecord record) throws Exception {
     protected void execute(DingdingQywxSyncRecord record) throws Exception {
-        logger.info("开始执行钉钉打卡数据同步," + record.getWay());
+        logger.info("开始执行钉钉打卡数据同步,from:" + record.getDateFrom() + ", to:"+record.getDateTo());
         if (DingdingQywxSyncRecord.syncType_dingding.equals(record.getType())) {
         if (DingdingQywxSyncRecord.syncType_dingding.equals(record.getType())) {
-            dingdingSync(record);
+            try {
+                dingdingSync(record);
+            }catch (Exception e) {
+                logger.error(e);
+                updateSyncRecord(record, e.getMessage());
+            }
         } else {
         } else {
-            logger.info("其它类型:");
+            logger.info("不是钉钉同步任务。。。。。。。。。。。。。");
         }
         }
     }
     }
 
 
     private void dingdingSync(DingdingQywxSyncRecord record) throws Exception {
     private void dingdingSync(DingdingQywxSyncRecord record) throws Exception {
-        logger.debug(record.toString());
         Application app = ThisApplication.context().applications().randomWithWeight(x_organization_assemble_control.class.getName());
         Application app = ThisApplication.context().applications().randomWithWeight(x_organization_assemble_control.class.getName());
         //开始分页查询人员
         //开始分页查询人员
         boolean hasNextPerson = true;
         boolean hasNextPerson = true;
         int personPageSize = 50;
         int personPageSize = 50;
+        //开始时间和结束时间
+        Date fromDate = new Date();
+        fromDate.setTime(record.getDateFrom());
+        Date toDate =new Date();
+        toDate.setTime(record.getDateTo());
+        //先删除
+        deleteDingdingAttendance(fromDate, toDate);
+        //人员查询地址
         String uri = "person/list/(0)/next/50";
         String uri = "person/list/(0)/next/50";
+        //钉钉考勤同步接口地址
         String dingdingUrl = "https://oapi.dingtalk.com/attendance/list?access_token=" + Config.dingding().corpAccessToken();
         String dingdingUrl = "https://oapi.dingtalk.com/attendance/list?access_token=" + Config.dingding().corpAccessToken();
-        logger.debug("dingding url :"+dingdingUrl);
+        int saveNumber = 0;
         while (hasNextPerson) {
         while (hasNextPerson) {
-            logger.info("查询人员 uri:" + uri);
             List<Person> list = ThisApplication.context().applications().getQuery(false, app, uri).getDataAsList(Person.class);
             List<Person> list = ThisApplication.context().applications().getQuery(false, app, uri).getDataAsList(Person.class);
             if (list != null && list.size() > 0) {
             if (list != null && list.size() > 0) {
                 //钉钉用户id
                 //钉钉用户id
                 List<String> ddUsers = list.stream().map(Person::getDingdingId).collect(Collectors.toList());
                 List<String> ddUsers = list.stream().map(Person::getDingdingId).collect(Collectors.toList());
-                //week
-                Date today = new Date();
-                today = DateTools.floorDate(today, null);
-                Date sevenDayBefore = DateTools.addDay(today, -7);
                 //分页查询
                 //分页查询
                 int page = 0;
                 int page = 0;
                 boolean hasMoreResult = true;
                 boolean hasMoreResult = true;
@@ -64,14 +78,17 @@ public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecor
                     //post传入 时间(时间间隔不能超过7天) 人员(人员数量不能超过50个)
                     //post传入 时间(时间间隔不能超过7天) 人员(人员数量不能超过50个)
                     post.setLimit(50L);
                     post.setLimit(50L);
                     post.setOffset(page * 50L);//从0开始翻页
                     post.setOffset(page * 50L);//从0开始翻页
-                    post.setWorkDateFrom(DateTools.format(sevenDayBefore, DateTools.format_yyyyMMddHHmmss));
-                    post.setWorkDateTo(DateTools.format(today, DateTools.format_yyyyMMddHHmmss));
+                    //这里的开始时间和结束时间 查询的是钉钉返回结果中的workDate
+                    //查询考勤打卡记录的起始工作日
+                    post.setWorkDateFrom(DateTools.format(fromDate));
+                    //查询考勤打卡记录的结束工作日
+                    post.setWorkDateTo(DateTools.format(toDate));
                     post.setUserIdList(ddUsers);
                     post.setUserIdList(ddUsers);
-                    String body = post.toString();
-                    logger.info("查询钉钉打卡结果:" + body);
                     DingdingAttendanceResult result = HttpConnection.postAsObject(dingdingUrl, null, post.toString(), DingdingAttendanceResult.class);
                     DingdingAttendanceResult result = HttpConnection.postAsObject(dingdingUrl, null, post.toString(), DingdingAttendanceResult.class);
                     if (result.errcode != null && result.errcode == 0) {
                     if (result.errcode != null && result.errcode == 0) {
-                        saveDingdingRecord(result.getRecordresult());
+                        List<DingdingAttendanceResultItem> resultList = result.getRecordresult();
+                        saveDingdingAttendance(resultList);
+                        saveNumber += resultList.size();
                         if (result.hasMore) {
                         if (result.hasMore) {
                             page++;
                             page++;
                         } else {
                         } else {
@@ -100,10 +117,36 @@ public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecor
                 updateSyncRecord(record, null);
                 updateSyncRecord(record, null);
             }
             }
         }
         }
+        logger.info("结束 插入:"+saveNumber+" 条");
 
 
     }
     }
+    private void deleteDingdingAttendance(Date fromDate, Date toDate) throws Exception{
+        try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+            //先删除 再同步
+            EntityManager em = emc.get(AttendanceDingtalkDetail.class);
+            CriteriaBuilder cb = em.getCriteriaBuilder();
+            CriteriaQuery<AttendanceDingtalkDetail> query = cb.createQuery(AttendanceDingtalkDetail.class);
+            Root<AttendanceDingtalkDetail> root = query.from(AttendanceDingtalkDetail.class);
+            long start = fromDate.getTime();
+            long end = toDate.getTime();
+            Predicate p = cb.between(root.get(AttendanceDingtalkDetail_.workDate), start, end);
+            query.select(root).where(p);
+            List<AttendanceDingtalkDetail> detailList = em.createQuery(query).getResultList();
+            //先删除
+            logger.info("删除");
+            if (detailList != null) {
+                logger.info("删除 list:"+detailList.size());
+                emc.beginTransaction(AttendanceDingtalkDetail.class);
+                for (int i = 0; i < detailList.size(); i++) {
+                    emc.remove(detailList.get(i));
+                }
+                emc.commit();
+            }
+            logger.info("删除结束");
+        }
+    }
 
 
-    private void saveDingdingRecord(List<DingdingAttendanceResultItem> list) throws Exception {
+    private void saveDingdingAttendance(List<DingdingAttendanceResultItem> list) throws Exception {
         if (list != null && !list.isEmpty()) {
         if (list != null && !list.isEmpty()) {
             try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
             try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
                 emc.beginTransaction(AttendanceDingtalkDetail.class);
                 emc.beginTransaction(AttendanceDingtalkDetail.class);
@@ -121,12 +164,13 @@ public class DingdingAttendanceQueue extends AbstractQueue<DingdingQywxSyncRecor
     private void updateSyncRecord(DingdingQywxSyncRecord record, String errMsg) throws Exception {
     private void updateSyncRecord(DingdingQywxSyncRecord record, String errMsg) throws Exception {
         try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
         try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
             emc.beginTransaction(DingdingQywxSyncRecord.class);
             emc.beginTransaction(DingdingQywxSyncRecord.class);
-            record.setEndTime(new Date());
+            DingdingQywxSyncRecord entity = emc.find(record.getId(), DingdingQywxSyncRecord.class);
+            entity.setEndTime(new Date());
             if (errMsg == null || errMsg.isEmpty()) {
             if (errMsg == null || errMsg.isEmpty()) {
-                record.setExceptionMessage(errMsg);
-                record.setStatus(DingdingQywxSyncRecord.status_error);
+                entity.setStatus(DingdingQywxSyncRecord.status_end);
             } else {
             } else {
-                record.setStatus(DingdingQywxSyncRecord.status_end);
+                entity.setStatus(DingdingQywxSyncRecord.status_error);
+                entity.setExceptionMessage(errMsg);
             }
             }
             emc.commit();
             emc.commit();
         }
         }

+ 20 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/DingdingAttendanceFactory.java

@@ -38,6 +38,25 @@ public class DingdingAttendanceFactory extends AbstractFactory {
         return em.createQuery(query).getResultList();
         return em.createQuery(query).getResultList();
     }
     }
 
 
+    /**
+     * 查询冲突的钉钉同步记录
+     * @param fromTime
+     * @param toTime
+     * @return
+     * @throws Exception
+     */
+    public  List<DingdingQywxSyncRecord> findConflictSyncRecord(long fromTime, long toTime) throws Exception {
+        EntityManager em = this.entityManagerContainer().get(DingdingQywxSyncRecord.class);
+        CriteriaBuilder cb = em.getCriteriaBuilder();
+        CriteriaQuery<DingdingQywxSyncRecord> query = cb.createQuery(DingdingQywxSyncRecord.class);
+        Root<DingdingQywxSyncRecord> root = query.from(DingdingQywxSyncRecord.class);
+        Predicate p = cb.equal(root.get(DingdingQywxSyncRecord_.type), DingdingQywxSyncRecord.syncType_dingding);
+        Predicate p1  = cb.or(cb.between(root.get(DingdingQywxSyncRecord_.dateFrom), fromTime, toTime), cb.between(root.get(DingdingQywxSyncRecord_.dateTo), fromTime, toTime));
+        p = cb.and(p, p1);
+        query.select(root).where(p);
+        return em.createQuery(query).getResultList();
+    }
+
     /**
     /**
      * 根据用户查询一段时间内的打开数据
      * 根据用户查询一段时间内的打开数据
      * @param startTime
      * @param startTime
@@ -60,7 +79,7 @@ public class DingdingAttendanceFactory extends AbstractFactory {
             long end = endTime.getTime();
             long end = endTime.getTime();
             p = cb.between(root.get(AttendanceDingtalkDetail_.userCheckTime), start, end);
             p = cb.between(root.get(AttendanceDingtalkDetail_.userCheckTime), start, end);
         }
         }
-        if (userId != null) {
+        if (userId != null && !userId.isEmpty()) {
             if (p != null) {
             if (p != null) {
                 p = cb.and(p, cb.equal(root.get(AttendanceDingtalkDetail_.userId), userId));
                 p = cb.and(p, cb.equal(root.get(AttendanceDingtalkDetail_.userId), userId));
             }else {
             }else {

+ 2 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/ActionDeleteAllData.java

@@ -22,14 +22,14 @@ public class ActionDeleteAllData extends BaseAction {
         ActionResult<WrapBoolean> result = new ActionResult<>();
         ActionResult<WrapBoolean> result = new ActionResult<>();
 
 
         try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
         try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-            List<AttendanceDingtalkDetail> details  = emc.fetchAll(AttendanceDingtalkDetail.class);
+            List<AttendanceDingtalkDetail> details  = emc.listAll(AttendanceDingtalkDetail.class);
             if ( null == details ) {
             if ( null == details ) {
                 result.error( new FindEmptyException() );
                 result.error( new FindEmptyException() );
             }else{
             }else{
                 //进行数据库持久化操作
                 //进行数据库持久化操作
                 emc.beginTransaction( AttendanceDingtalkDetail.class );
                 emc.beginTransaction( AttendanceDingtalkDetail.class );
                 for (AttendanceDingtalkDetail d : details) {
                 for (AttendanceDingtalkDetail d : details) {
-                    emc.remove(d, CheckRemoveType.all);
+                    emc.remove(d);
                 }
                 }
                 emc.commit();
                 emc.commit();
                 result.setData(new WrapBoolean(true));
                 result.setData(new WrapBoolean(true));

+ 1 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/ActionListDDAttendanceDetail.java

@@ -33,7 +33,7 @@ public class ActionListDDAttendanceDetail extends BaseAction {
             Date end = DateTools.parseDateTime(wi.getEndTime());
             Date end = DateTools.parseDateTime(wi.getEndTime());
             String dingdingUser = null;
             String dingdingUser = null;
             //转化dingding的id
             //转化dingding的id
-            if (wi.getPerson() != null) {
+            if (wi.getPerson() != null && !wi.getPerson().isEmpty()) {
                 Person person = business.organization().person().getObject(wi.getPerson());
                 Person person = business.organization().person().getObject(wi.getPerson());
                 dingdingUser = person.getDingdingId();
                 dingdingUser = person.getDingdingId();
             }
             }

+ 21 - 4
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/ActionSyncData.java

@@ -1,5 +1,6 @@
 package com.x.attendance.assemble.control.jaxrs.dingding;
 package com.x.attendance.assemble.control.jaxrs.dingding;
 
 
+import com.x.attendance.assemble.control.Business;
 import com.x.attendance.assemble.control.ThisApplication;
 import com.x.attendance.assemble.control.ThisApplication;
 import com.x.attendance.entity.DingdingQywxSyncRecord;
 import com.x.attendance.entity.DingdingQywxSyncRecord;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.EntityManagerContainer;
@@ -9,23 +10,39 @@ import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WrapBoolean;
 import com.x.base.core.project.jaxrs.WrapBoolean;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.DateTools;
 
 
 import java.util.Date;
 import java.util.Date;
+import java.util.List;
 
 
 
 
 public class ActionSyncData extends BaseAction {
 public class ActionSyncData extends BaseAction {
 
 
     private static final Logger logger = LoggerFactory.getLogger(ActionSyncData.class);
     private static final Logger logger = LoggerFactory.getLogger(ActionSyncData.class);
 
 
-    public ActionResult<WrapBoolean> execute(EffectivePerson effectivePerson, String way) throws Exception {
+    public ActionResult<WrapBoolean> execute(EffectivePerson effectivePerson, String dateFrom, String dateTo) throws Exception {
         ActionResult<WrapBoolean> result = new ActionResult<>();
         ActionResult<WrapBoolean> result = new ActionResult<>();
         try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
         try ( EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-            if (null == way ||
-                    (!DingdingQywxSyncRecord.syncWay_week.equals(way) && !DingdingQywxSyncRecord.syncWay_year.equals(way))) {
+            if (null == dateFrom || null == dateTo) {
                 throw new SyncWayException();
                 throw new SyncWayException();
             }
             }
+            Date from = DateTools.parse(dateFrom);
+            Date to = DateTools.parse(dateTo);
+            long gap = to.getTime() - from.getTime();
+            if (gap < 0) {
+                throw new SyncWayException();
+            }
+            if ((gap / (1000 * 60 * 60 * 24)) > 6 ) {
+                throw new MoreThanSevenDayException();
+            }
+//            Business business = new Business(emc);
+//            List<DingdingQywxSyncRecord> conflictList = business.dingdingAttendanceFactory().findConflictSyncRecord(from.getTime(), to.getTime());
+//            if (conflictList != null && !conflictList.isEmpty()) {
+//                throw new ConflictSyncRecordException();
+//            }
             DingdingQywxSyncRecord record = new DingdingQywxSyncRecord();
             DingdingQywxSyncRecord record = new DingdingQywxSyncRecord();
-            record.setWay(way);
+            record.setDateFrom(from.getTime());
+            record.setDateTo(to.getTime());
             record.setStartTime(new Date());
             record.setStartTime(new Date());
             record.setType(DingdingQywxSyncRecord.syncType_dingding);
             record.setType(DingdingQywxSyncRecord.syncType_dingding);
             record.setStatus(DingdingQywxSyncRecord.status_loading);
             record.setStatus(DingdingQywxSyncRecord.status_loading);

+ 13 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/ConflictSyncRecordException.java

@@ -0,0 +1,13 @@
+package com.x.attendance.assemble.control.jaxrs.dingding;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class ConflictSyncRecordException extends PromptException {
+
+
+    private static final long serialVersionUID = 7077761236199564642L;
+
+    public ConflictSyncRecordException() {
+        super("同步时间和历史有冲突!");
+    }
+}

+ 5 - 6
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/DingdingAttendanceAction.java

@@ -49,20 +49,19 @@ public class DingdingAttendanceAction extends StandardJaxrsAction {
     }
     }
 
 
 
 
-    //获取一年的数据 ???不知道是否能成 接口限制
-
-    //获取7天数据   可以做定时每天晚上更新
+    //
     @JaxrsMethodDescribe(value = "同步钉钉考勤结果", action = ActionSyncData.class)
     @JaxrsMethodDescribe(value = "同步钉钉考勤结果", action = ActionSyncData.class)
     @GET
     @GET
-    @Path("sync/{way}/start")
+    @Path("sync/from/{dateFrom}/to/{dateTo}/start")
     @Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
     @Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
     @Consumes(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
     public void syncData(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
     public void syncData(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-                         @JaxrsParameterDescribe("同步方式") @PathParam("way") String way) {
+                         @JaxrsParameterDescribe("开始时间: yyyy-MM-dd") @PathParam("dateFrom") String dateFrom,
+                         @JaxrsParameterDescribe("结束时间: yyyy-MM-dd") @PathParam("dateTo") String dateTo) {
         ActionResult<WrapBoolean> result = new ActionResult<>();
         ActionResult<WrapBoolean> result = new ActionResult<>();
         EffectivePerson effectivePerson = this.effectivePerson(request);
         EffectivePerson effectivePerson = this.effectivePerson(request);
         try {
         try {
-            result = new ActionSyncData().execute(effectivePerson, way);
+            result = new ActionSyncData().execute(effectivePerson, dateFrom, dateTo);
         }catch (Exception e) {
         }catch (Exception e) {
             logger.error(e, effectivePerson, request, null);
             logger.error(e, effectivePerson, request, null);
             result.error(e);
             result.error(e);

+ 13 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/MoreThanSevenDayException.java

@@ -0,0 +1,13 @@
+package com.x.attendance.assemble.control.jaxrs.dingding;
+
+import com.x.base.core.project.exception.PromptException;
+
+public class MoreThanSevenDayException extends PromptException {
+
+
+    private static final long serialVersionUID = 7077761236199564642L;
+
+    public MoreThanSevenDayException() {
+        super("同步时间间隔大于7天!");
+    }
+}

+ 1 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/dingding/SyncWayException.java

@@ -6,6 +6,6 @@ public class SyncWayException extends PromptException {
 
 
     private static final long serialVersionUID = -6072567404702590349L;
     private static final long serialVersionUID = -6072567404702590349L;
     public SyncWayException() {
     public SyncWayException() {
-        super("同步方式不正确!");
+        super("传入的同步时间不正确!");
     }
     }
 }
 }

+ 19 - 9
o2server/x_attendance_core_entity/src/main/java/com/x/attendance/entity/DingdingQywxSyncRecord.java

@@ -61,11 +61,13 @@ public class DingdingQywxSyncRecord extends SliceJpaObject  {
     @Column(name = ColumnNamePrefix + "type", length = length_32B)
     @Column(name = ColumnNamePrefix + "type", length = length_32B)
     private String type;
     private String type;
 
 
-    public static final String syncWay_year = "year";
-    public static final String syncWay_week = "week";
-    @FieldDescribe("同步方式,year(同步一年数据) , week(同步一周数据)")
-    @Column(name = ColumnNamePrefix + "way", length = length_32B)
-    private String way;
+    @FieldDescribe("同步打卡记录的开始时间")
+    @Column(name = ColumnNamePrefix + "dateFrom")
+    private long dateFrom;
+
+    @FieldDescribe("同步打卡记录的结束时间, 起始与结束工作日最多相隔7天")
+    @Column(name = ColumnNamePrefix + "dateTo")
+    private long dateTo;
 
 
     public static final String status_loading = "loading";
     public static final String status_loading = "loading";
     public static final String status_end = "end";
     public static final String status_end = "end";
@@ -104,12 +106,20 @@ public class DingdingQywxSyncRecord extends SliceJpaObject  {
         this.type = type;
         this.type = type;
     }
     }
 
 
-    public String getWay() {
-        return way;
+    public long getDateFrom() {
+        return dateFrom;
+    }
+
+    public void setDateFrom(long dateFrom) {
+        this.dateFrom = dateFrom;
+    }
+
+    public long getDateTo() {
+        return dateTo;
     }
     }
 
 
-    public void setWay(String way) {
-        this.way = way;
+    public void setDateTo(long dateTo) {
+        this.dateTo = dateTo;
     }
     }
 
 
     public String getStatus() {
     public String getStatus() {