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
This commit is contained in:
Manuel Rego Casasnovas 2012-11-19 10:23:06 +01:00
parent f9a9ef6d02
commit babe242b52
3 changed files with 49 additions and 17 deletions

View file

@ -203,6 +203,10 @@ public class WorkReportLineDAO extends IntegrationEntityDAO<WorkReportLine>
@Override @Override
public List<WorkReportLine> findByOrderElementAndWorkReports( public List<WorkReportLine> findByOrderElementAndWorkReports(
OrderElement orderElement, List<WorkReport> workReports) { OrderElement orderElement, List<WorkReport> workReports) {
if (workReports.isEmpty()) {
return Collections.emptyList();
}
Criteria criteria = getSession().createCriteria(WorkReportLine.class); Criteria criteria = getSession().createCriteria(WorkReportLine.class);
criteria.add(Restrictions.eq("orderElement", orderElement)); criteria.add(Restrictions.eq("orderElement", orderElement));

View file

@ -212,10 +212,18 @@ public class PersonalTimesheetModel implements IPersonalTimesheetModel {
.getNextEntityCodeWithoutTransaction(EntityNameEnum.WORK_REPORT)); .getNextEntityCodeWithoutTransaction(EntityNameEnum.WORK_REPORT));
workReport.setCodeAutogenerated(true); workReport.setCodeAutogenerated(true);
workReport.setResource(user.getWorker()); workReport.setResource(user.getWorker());
} else {
forceLoad(workReport.getWorkReportLines());
} }
forceLoad(workReport.getWorkReportType()); forceLoad(workReport.getWorkReportType());
} }
private void forceLoad(Set<WorkReportLine> workReportLines) {
for (WorkReportLine line : workReportLines) {
line.getOrderElement().getName();
}
}
private WorkReportType getPersonalTimesheetsWorkReportType() { private WorkReportType getPersonalTimesheetsWorkReportType() {
try { try {
WorkReportType workReportType = workReportTypeDAO WorkReportType workReportType = workReportTypeDAO
@ -375,7 +383,7 @@ public class PersonalTimesheetModel implements IPersonalTimesheetModel {
private WorkReportLine getWorkReportLine(OrderElement orderElement, private WorkReportLine getWorkReportLine(OrderElement orderElement,
LocalDate date) { LocalDate date) {
for (WorkReportLine line : workReport.getWorkReportLines()) { for (WorkReportLine line : workReport.getWorkReportLines()) {
if (line.getOrderElement().equals(orderElement) if (line.getOrderElement().getId().equals(orderElement.getId())
&& LocalDate.fromDateFields(line.getDate()).equals(date)) { && LocalDate.fromDateFields(line.getDate()).equals(date)) {
return line; return line;
} }
@ -446,6 +454,14 @@ public class PersonalTimesheetModel implements IPersonalTimesheetModel {
.getNumberOfDigitsCode(EntityNameEnum.WORK_REPORT)); .getNumberOfDigitsCode(EntityNameEnum.WORK_REPORT));
workReportDAO.save(workReport); workReportDAO.save(workReport);
sumChargedEffortDAO.recalculateTimesheetData(orderElements); sumChargedEffortDAO.recalculateTimesheetData(orderElements);
if (workReport.getWorkReportLines().isEmpty()) {
try {
workReportDAO.remove(workReport.getId());
} catch (InstanceNotFoundException e) {
throw new RuntimeException(e);
}
}
} }
resetModifiedFields(); resetModifiedFields();

View file

@ -31,6 +31,8 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.Response.Status;
import org.joda.time.LocalDate; 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.common.exceptions.InstanceNotFoundException;
import org.libreplan.business.orders.daos.IOrderElementDAO; import org.libreplan.business.orders.daos.IOrderElementDAO;
import org.libreplan.business.orders.entities.OrderElement; import org.libreplan.business.orders.entities.OrderElement;
@ -76,6 +78,9 @@ public class BoundUserServiceREST implements IBoundUserService {
@Autowired @Autowired
private IPersonalTimesheetModel personalTimesheetModel; private IPersonalTimesheetModel personalTimesheetModel;
@Autowired
private IAdHocTransactionService transactionService;
@Override @Override
@GET @GET
@Transactional(readOnly = true) @Transactional(readOnly = true)
@ -110,27 +115,34 @@ public class BoundUserServiceREST implements IBoundUserService {
@Override @Override
@POST @POST
@Transactional
@Path("/timesheets/") @Path("/timesheets/")
public Response importTimesheetEntries(PersonalTimesheetEntryListDTO dto) { public Response importTimesheetEntries(PersonalTimesheetEntryListDTO dto) {
try { for (final PersonalTimesheetEntryDTO each : dto.entries) {
for (PersonalTimesheetEntryDTO each : dto.entries) { LocalDate date = DateConverter.toLocalDate(each.date);
LocalDate date = DateConverter.toLocalDate(each.date); OrderElement orderElement = transactionService
OrderElement orderElement = orderElementDAO .runOnReadOnlyTransaction(new IOnTransaction<OrderElement>() {
.findByCode(each.task); @Override
EffortDuration effortDuration = EffortDuration public OrderElement execute() {
.parseFromFormattedString(each.effort); try {
return orderElementDAO.findByCode(each.task);
personalTimesheetModel.initCreateOrEdit(date); } catch (InstanceNotFoundException e) {
personalTimesheetModel.setEffortDuration(orderElement, date, return null;
effortDuration); }
personalTimesheetModel.save(); }
});
if (orderElement == null) {
return Response.status(Status.NOT_FOUND).build();
} }
EffortDuration effortDuration = EffortDuration
.parseFromFormattedString(each.effort);
return Response.ok().build(); personalTimesheetModel.initCreateOrEdit(date);
} catch (InstanceNotFoundException e) { personalTimesheetModel.setEffortDuration(orderElement, date,
return Response.status(Status.NOT_FOUND).build(); effortDuration);
personalTimesheetModel.save();
} }
return Response.ok().build();
} }
} }