/**
* Axelor Business Solutions
*
* Copyright (C) 2016 Axelor (<http://axelor.com>).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.axelor.apps.businessproject.service;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.joda.time.LocalDate;
import com.axelor.apps.account.db.Invoice;
import com.axelor.apps.account.db.InvoiceLine;
import com.axelor.apps.base.db.Product;
import com.axelor.apps.hr.db.Timesheet;
import com.axelor.apps.hr.db.TimesheetLine;
import com.axelor.apps.hr.service.timesheet.TimesheetServiceImpl;
import com.axelor.apps.project.db.ProjectTask;
import com.axelor.apps.project.db.repo.ProjectTaskRepository;
import com.axelor.auth.db.User;
import com.axelor.exception.AxelorException;
public class TimesheetProjectServiceImpl extends TimesheetServiceImpl{
@Override
public List<InvoiceLine> createInvoiceLines(Invoice invoice, List<TimesheetLine> timesheetLineList, int priority) throws AxelorException {
List<InvoiceLine> invoiceLineList = new ArrayList<InvoiceLine>();
int count = 0;
DateFormat ddmmFormat = new SimpleDateFormat("dd/MM");
HashMap<String, Object[]> timeSheetInformationsMap = new HashMap<String, Object[]>();
//Check if a consolidation by product and user must be done
boolean consolidate = generalService.getGeneral().getConsolidateTSLine();
for (TimesheetLine timesheetLine : timesheetLineList) {
Object[] tabInformations = new Object[6];
tabInformations[0] = timesheetLine.getProduct();
tabInformations[1] = timesheetLine.getUser();
//Start date
tabInformations[2] = timesheetLine.getDate();
//End date, useful only for consolidation
tabInformations[3] = timesheetLine.getDate();
tabInformations[4] = timesheetLine.getVisibleDuration();
tabInformations[5] = timesheetLine.getProjectTask();
String key = null;
if(consolidate){
key = timesheetLine.getProduct().getId() + "|" + timesheetLine.getUser().getId() + "|" + timesheetLine.getProjectTask().getId();
if (timeSheetInformationsMap.containsKey(key)){
tabInformations = timeSheetInformationsMap.get(key);
//Update date
if (timesheetLine.getDate().compareTo((LocalDate)tabInformations[2]) < 0){
//If date is lower than start date then replace start date by this one
tabInformations[2] = timesheetLine.getDate();
}else if (timesheetLine.getDate().compareTo((LocalDate)tabInformations[3]) > 0){
//If date is upper than end date then replace end date by this one
tabInformations[3] = timesheetLine.getDate();
}
tabInformations[4] = ((BigDecimal)tabInformations[4]).add(timesheetLine.getVisibleDuration());
}else{
timeSheetInformationsMap.put(key, tabInformations);
}
}else{
key = String.valueOf(timesheetLine.getId());
timeSheetInformationsMap.put(key, tabInformations);
}
timesheetLine.setInvoiced(true);
}
for(Object[] timesheetInformations : timeSheetInformationsMap.values()) {
String strDate = null;
Product product = (Product)timesheetInformations[0];
User user = (User)timesheetInformations[1];
LocalDate startDate = (LocalDate)timesheetInformations[2];
LocalDate endDate = (LocalDate)timesheetInformations[3];
BigDecimal visibleDuration = (BigDecimal) timesheetInformations[4];
ProjectTask projectTask = (ProjectTask) timesheetInformations[5];
if (consolidate){
strDate = ddmmFormat.format(startDate.toDate()) + " - " + ddmmFormat.format(endDate.toDate());
}else{
strDate = ddmmFormat.format(startDate.toDate());
}
invoiceLineList.addAll(this.createInvoiceLine(invoice, product, user, strDate, visibleDuration, priority*100+count));
invoiceLineList.get(0).setProject(projectTask);
count++;
}
return invoiceLineList;
}
@Override
public TimesheetLine createTimesheetLine(ProjectTask project, Product product, User user, LocalDate date, Timesheet timesheet, BigDecimal hours, String comments){
TimesheetLine timesheetLine = super.createTimesheetLine(project, product, user, date, timesheet, hours, comments);
if(project != null && (project.getProjTaskInvTypeSelect() == ProjectTaskRepository.INVOICING_TYPE_TIME_BASED || (project.getProject() != null && project.getProject().getProjTaskInvTypeSelect() == ProjectTaskRepository.INVOICING_TYPE_TIME_BASED)))
timesheetLine.setToInvoice(true);
return timesheetLine;
}
}