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(); } }