/*******************************************************************************
* Copyright 2012 Christian Ternes and Thorsten Volland
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package org.businessmanager.service;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.Validate;
import org.businessmanager.dao.InvoiceDao;
import org.businessmanager.domain.Activity;
import org.businessmanager.domain.Activity.ActivityType;
import org.businessmanager.domain.Invoice;
import org.businessmanager.domain.ModificationType;
import org.businessmanager.domain.security.User;
import org.businessmanager.service.security.SpringSecurityService;
import org.businessmanager.web.bean.InvoiceActivityBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class InvoiceServiceImpl implements InvoiceService {
@Autowired
private InvoiceDao invoiceDao;
@Autowired
private SpringSecurityService securityService;
@Autowired
private ActivityService activityService;
@Autowired
private InvoiceNumberGenerator invoiceNumberGenerator;
@Override
public List<Invoice> getInvoices() {
return invoiceDao.findAll();
}
@Override
public Invoice saveInvoice(Invoice invoice) {
Validate.notNull(invoice, "Parameter invoice must not be null!");
if (invoice.getId() == null) {
invoice.setInvoiceNumber(invoiceNumberGenerator.getNextInvoiceNumber());
invoice = invoiceDao.save(invoice);
saveActivity(invoice.getId(), ModificationType.CREATE, invoice.getInvoiceNumber());
return invoice;
} else {
invoice = invoiceDao.update(invoice);
saveActivity(invoice.getId(), ModificationType.UPDATE, invoice.getInvoiceNumber());
return invoice;
}
}
private void saveActivity(Long sourceId, ModificationType modType, Long invoiceNumber) {
User currentUser = securityService.getLoggedInUser();
if(currentUser != null) {
InvoiceActivityBean activityData = new InvoiceActivityBean(currentUser.getUsername(), modType, invoiceNumber);
Activity activity = new Activity(currentUser.getId(), ActivityType.INVOICE);
activity.setSourceId(sourceId);
activity.setData(activityData.toJson());
activityService.saveActivity(activity);
}
}
@Override
public Invoice getInvoiceById(Long id) {
return invoiceDao.findById(id);
}
private Map<String, Object> createReplacementsForDocGen(Invoice invoice) {
// TODO: Validate invoice (required fields)
Map<String, Object> invoiceData = new HashMap<String, Object>();
invoiceData.put("is_company", "BM");
invoiceData.put("is_name", "Doe");
invoiceData.put("is_fname", "John");
invoiceData.put("is_street", "Frankfurter Straße 9");
invoiceData.put("is_zip", "62147");
invoiceData.put("is_city", "Frankfurt");
invoiceData.put("is_phone", "01234567890");
invoiceData.put("is_fax", "01478523698");
invoiceData.put("is_email", "bm@bm.org");
invoiceData.put("is_url", "www.bm.org");
invoiceData.put("ie_company", invoice.getContact().getCompany());
invoiceData.put("ie_name", invoice.getContact().getLastname());
invoiceData.put("ie_fname", invoice.getContact().getFirstname());
// TODO: allow different representations of street/house number (e.g. Frankfurter Allee 5 und 302 Smith Ave.)
invoiceData.put("ie_street", invoice.getContact().getDefaultBillingAddress().getStreet() + " " + invoice.getContact().getDefaultBillingAddress().getHousenumber());
invoiceData.put("ie_zip", invoice.getContact().getDefaultBillingAddress().getZipCode());
invoiceData.put("ie_city", invoice.getContact().getDefaultBillingAddress().getCity());
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
// TODO: invoice vat value
invoiceData.put("i_date", sdf.format(invoice.getInvoiceDate()));
invoiceData.put("i_number", invoice.getInvoiceNumber().toString());
invoiceData.put("i_net_amount", invoice.getInvoiceAmountNet().toPlainString());
invoiceData.put("i_vat_amount_1", "0000");
invoiceData.put("i_gross_amount", invoice.getInvoiceAmountGross().toPlainString());
// TODO: invoice positions
return invoiceData;
}
}