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
public List<WorkReportLine> findByOrderElementAndWorkReports(
OrderElement orderElement, List<WorkReport> workReports) {
if (workReports.isEmpty()) {
return Collections.emptyList();
}
Criteria criteria = getSession().createCriteria(WorkReportLine.class);
criteria.add(Restrictions.eq("orderElement", orderElement));

View file

@ -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<WorkReportLine> 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();

View file

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