From babe242b523f3a6793155a02c7e0806e3f8432e3 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Mon, 19 Nov 2012 10:23:06 +0100 Subject: [PATCH] Fix problems in service to import personal timesheets The comparison with the OrderElemen was wrong and it causes that the data stored was wrong. Moreover, it was not needed to open the transaction in the bound service method as it's already opened in PersonalTimesheetModel. FEA: ItEr77S14BoundUsersWebServices --- .../workreports/daos/WorkReportLineDAO.java | 4 ++ .../dashboard/PersonalTimesheetModel.java | 18 +++++++- .../boundusers/impl/BoundUserServiceREST.java | 44 ++++++++++++------- 3 files changed, 49 insertions(+), 17 deletions(-) diff --git a/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java b/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java index f5c9770bc..9375eb105 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/workreports/daos/WorkReportLineDAO.java @@ -203,6 +203,10 @@ public class WorkReportLineDAO extends IntegrationEntityDAO @Override public List findByOrderElementAndWorkReports( OrderElement orderElement, List workReports) { + if (workReports.isEmpty()) { + return Collections.emptyList(); + } + Criteria criteria = getSession().createCriteria(WorkReportLine.class); criteria.add(Restrictions.eq("orderElement", orderElement)); diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetModel.java index 16c2a0dcf..6f5b9a097 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/dashboard/PersonalTimesheetModel.java @@ -212,10 +212,18 @@ public class PersonalTimesheetModel implements IPersonalTimesheetModel { .getNextEntityCodeWithoutTransaction(EntityNameEnum.WORK_REPORT)); workReport.setCodeAutogenerated(true); workReport.setResource(user.getWorker()); + } else { + forceLoad(workReport.getWorkReportLines()); } forceLoad(workReport.getWorkReportType()); } + private void forceLoad(Set workReportLines) { + for (WorkReportLine line : workReportLines) { + line.getOrderElement().getName(); + } + } + private WorkReportType getPersonalTimesheetsWorkReportType() { try { WorkReportType workReportType = workReportTypeDAO @@ -375,7 +383,7 @@ public class PersonalTimesheetModel implements IPersonalTimesheetModel { private WorkReportLine getWorkReportLine(OrderElement orderElement, LocalDate date) { for (WorkReportLine line : workReport.getWorkReportLines()) { - if (line.getOrderElement().equals(orderElement) + if (line.getOrderElement().getId().equals(orderElement.getId()) && LocalDate.fromDateFields(line.getDate()).equals(date)) { return line; } @@ -446,6 +454,14 @@ public class PersonalTimesheetModel implements IPersonalTimesheetModel { .getNumberOfDigitsCode(EntityNameEnum.WORK_REPORT)); workReportDAO.save(workReport); sumChargedEffortDAO.recalculateTimesheetData(orderElements); + + if (workReport.getWorkReportLines().isEmpty()) { + try { + workReportDAO.remove(workReport.getId()); + } catch (InstanceNotFoundException e) { + throw new RuntimeException(e); + } + } } resetModifiedFields(); diff --git a/libreplan-webapp/src/main/java/org/libreplan/ws/boundusers/impl/BoundUserServiceREST.java b/libreplan-webapp/src/main/java/org/libreplan/ws/boundusers/impl/BoundUserServiceREST.java index 9f978ced9..80ed30ffe 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/ws/boundusers/impl/BoundUserServiceREST.java +++ b/libreplan-webapp/src/main/java/org/libreplan/ws/boundusers/impl/BoundUserServiceREST.java @@ -31,6 +31,8 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.joda.time.LocalDate; +import org.libreplan.business.common.IAdHocTransactionService; +import org.libreplan.business.common.IOnTransaction; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.orders.daos.IOrderElementDAO; import org.libreplan.business.orders.entities.OrderElement; @@ -76,6 +78,9 @@ public class BoundUserServiceREST implements IBoundUserService { @Autowired private IPersonalTimesheetModel personalTimesheetModel; + @Autowired + private IAdHocTransactionService transactionService; + @Override @GET @Transactional(readOnly = true) @@ -110,27 +115,34 @@ public class BoundUserServiceREST implements IBoundUserService { @Override @POST - @Transactional @Path("/timesheets/") public Response importTimesheetEntries(PersonalTimesheetEntryListDTO dto) { - try { - for (PersonalTimesheetEntryDTO each : dto.entries) { - LocalDate date = DateConverter.toLocalDate(each.date); - OrderElement orderElement = orderElementDAO - .findByCode(each.task); - EffortDuration effortDuration = EffortDuration - .parseFromFormattedString(each.effort); - - personalTimesheetModel.initCreateOrEdit(date); - personalTimesheetModel.setEffortDuration(orderElement, date, - effortDuration); - personalTimesheetModel.save(); + for (final PersonalTimesheetEntryDTO each : dto.entries) { + LocalDate date = DateConverter.toLocalDate(each.date); + OrderElement orderElement = transactionService + .runOnReadOnlyTransaction(new IOnTransaction() { + @Override + public OrderElement execute() { + try { + return orderElementDAO.findByCode(each.task); + } catch (InstanceNotFoundException e) { + return null; + } + } + }); + if (orderElement == null) { + return Response.status(Status.NOT_FOUND).build(); } + EffortDuration effortDuration = EffortDuration + .parseFromFormattedString(each.effort); - return Response.ok().build(); - } catch (InstanceNotFoundException e) { - return Response.status(Status.NOT_FOUND).build(); + personalTimesheetModel.initCreateOrEdit(date); + personalTimesheetModel.setEffortDuration(orderElement, date, + effortDuration); + personalTimesheetModel.save(); } + + return Response.ok().build(); } }