/**
* TNTConcept Easy Enterprise Management by Autentia Real Bussiness Solution S.L.
* Copyright (C) 2007 Autentia Real Bussiness Solution S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.autentia.tnt.manager.offer;
import static org.junit.Assert.fail;
import java.math.BigDecimal;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.Set;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.autentia.tnt.businessobject.Contact;
import com.autentia.tnt.businessobject.Department;
import com.autentia.tnt.businessobject.Interaction;
import com.autentia.tnt.businessobject.InteractionInterest;
import com.autentia.tnt.businessobject.InteractionType;
import com.autentia.tnt.businessobject.Offer;
import com.autentia.tnt.businessobject.OfferCost;
import com.autentia.tnt.businessobject.OfferPotential;
import com.autentia.tnt.businessobject.OfferRole;
import com.autentia.tnt.businessobject.OfferState;
import com.autentia.tnt.businessobject.Organization;
import com.autentia.tnt.businessobject.Project;
import com.autentia.tnt.businessobject.Role;
import com.autentia.tnt.businessobject.User;
import com.autentia.tnt.businessobject.UserCategory;
import com.autentia.tnt.businessobject.WorkingAgreement;
import com.autentia.tnt.dao.SortCriteria;
import com.autentia.tnt.dao.hibernate.ContactDAO;
import com.autentia.tnt.dao.hibernate.DepartmentDAO;
import com.autentia.tnt.dao.hibernate.InteractionTypeDAO;
import com.autentia.tnt.dao.hibernate.OfferDAO;
import com.autentia.tnt.dao.hibernate.OrganizationDAO;
import com.autentia.tnt.dao.hibernate.ProjectDAO;
import com.autentia.tnt.dao.hibernate.RoleDAO;
import com.autentia.tnt.dao.hibernate.UserCategoryDAO;
import com.autentia.tnt.dao.hibernate.UserDAO;
import com.autentia.tnt.dao.hibernate.WorkingAgreementDAO;
import com.autentia.tnt.dao.search.OfferSearch;
import com.autentia.tnt.manager.contacts.OfferManager;
import com.autentia.tnt.util.HibernateUtil;
import com.autentia.tnt.util.testing.SpringUtilsForTesting;
public class DuplicateOfferTest {
private static SessionFactory sessionFactory;
private static final String OFFER_NUMBER = "1122";
private static final String OFFER_TITLE = "oferta genérica por prestación de servicios";
private static final String OFFER_DESCRIPTION = "descripción genérica";
private Offer offer = new Offer();
private Contact contact = new Contact();
private Project project = new Project();
private Organization organization = new Organization();
private User user = new User();
@BeforeClass
public static void init() throws Exception {
SpringUtilsForTesting.configure(new ClassPathXmlApplicationContext("applicationContext-test.xml"));
sessionFactory = HibernateUtil.getSessionFactory();
sessionFactory.openSession();
}
@Before
public void beginTransaction() throws Exception {
sessionFactory.getCurrentSession().beginTransaction();
}
@After
public void rollbackTransaction() throws Exception {
if (sessionFactory.getCurrentSession().getTransaction().isActive()) {
sessionFactory.getCurrentSession().getTransaction().rollback();
}
sessionFactory.getCurrentSession().close();
}
/**
* Comprobacion de que se duplique la oferta sin relaciones 1:N
*/
@Test
public void testDuplicateOfferWithSimpleDataOnly() {
final OfferManager offerManager = (OfferManager) SpringUtilsForTesting.getSpringBean("managerOffer");
final OfferDAO offerDAO = (OfferDAO) SpringUtilsForTesting.getSpringBean("daoOffer");
insertInitialData();
final Offer duplicated = offerManager.duplicateOffer(offer);
if (duplicated.getId() != null) {
fail("el id debe ser 'null' en vez de '" + duplicated.getId() + "'");
}
if (duplicated.getNumber() != null) {
fail("el numero debe ser '" + offer.getNumber() + "' en vez de '" + duplicated.getNumber() + "'");
}
if (!duplicated.getContact().equals(offer.getContact())) {
fail("el contacto debe ser '" + offer.getContact().getName() + "' en vez de '" + duplicated.getContact().getName() + "'");
}
if (!duplicated.getMaturityDate().equals(offer.getMaturityDate())) {
fail("la fecha de madurez debe ser '" + offer.getMaturityDate() + "' en vez de '" + duplicated.getMaturityDate() + "'");
}
duplicated.setNumber("123456");
offerDAO.insert(duplicated);
if (offerManager.getAllEntities(new OfferSearch(), new SortCriteria()).size() != 2) {
fail("deberia haber 2 ofertas en vez de '" + offerManager.getAllEntities(new OfferSearch(), new SortCriteria()).size() + "'");
}
}
/**
* Comprobacion de que se duplique la oferta con relaciones con costes, personal e interacciones
*/
@Test
public void testDuplicateOfferWithRolesAndCosts() {
final OfferManager offerManager = (OfferManager) SpringUtilsForTesting.getSpringBean("managerOffer");
final OfferDAO offerDAO = (OfferDAO) SpringUtilsForTesting.getSpringBean("daoOffer");
insertInitialData();
insertOfferCosts();
insertOfferRoles();
insertOfferInteraction();
final Offer duplicated = offerManager.duplicateOffer(offer);
duplicated.setNumber("123456");
offerDAO.insert(duplicated);
if (duplicated.getCosts().size() != 2) {
fail("deberia haber 2 costes por materiales en el duplicado en vez de '" + duplicated.getCosts().size() + "'");
}
if (duplicated.getRoles().size() != 2) {
fail("deberia haber 2 costes por roles en el duplicado en vez de '" + duplicated.getRoles().size() + "'");
}
if (duplicated.getInteractions().size() != 1) {
fail("deberia haber 1 interacciones en el duplicado en vez de '" + duplicated.getInteractions().size() + "'");
}
}
/**
* Metodo encargado de insertar datos muy generales pero que son necesarios
* para generar facturas en base a ofertas
*/
private void insertInitialData() {
final OfferDAO offerDAO = (OfferDAO) SpringUtilsForTesting.getSpringBean("daoOffer");
final ProjectDAO projectDAO = (ProjectDAO) SpringUtilsForTesting.getSpringBean("daoProject");
final OrganizationDAO organizationDAO = (OrganizationDAO) SpringUtilsForTesting.getSpringBean("daoOrganization");
final ContactDAO contactDAO = (ContactDAO) SpringUtilsForTesting.getSpringBean("daoContact");
final UserDAO userDAO = (UserDAO) SpringUtilsForTesting.getSpringBean("daoUser");
final RoleDAO roleDAO = (RoleDAO) SpringUtilsForTesting.getSpringBean("daoRole");
final UserCategoryDAO categoryDAO = (UserCategoryDAO) SpringUtilsForTesting.getSpringBean("daoUserCategory");
final DepartmentDAO departmentDAO = (DepartmentDAO) SpringUtilsForTesting.getSpringBean("daoDepartment");
final WorkingAgreementDAO workingAgreementDAO = (WorkingAgreementDAO) SpringUtilsForTesting.getSpringBean("daoWorkingAgreement");
final Role role = new Role();
roleDAO.insert(role);
final Department department = new Department();
department.setName("departamento");
departmentDAO.insert(department);
final UserCategory category = new UserCategory();
categoryDAO.insert(category);
final WorkingAgreement workingAgreement = new WorkingAgreement();
workingAgreementDAO.insert(workingAgreement);
contact.setName("Sergio Hermida");
contactDAO.insert(contact);
projectDAO.insert(project);
organizationDAO.insert(organization);
user.setRole(role);
user.setCategory(category);
user.setDepartment(department);
user.setAgreement(workingAgreement);
userDAO.insert(user);
offer.setNumber(OFFER_NUMBER);
offer.setOrganization(organization);
offer.setContact(contact);
offer.setTitle(OFFER_TITLE);
offer.setDescription(OFFER_DESCRIPTION);
offer.setOfferPotential(OfferPotential.MEDIUM);
offer.setOfferState(OfferState.OPEN);
offer.setCreationDate(new Date());
offer.setMaturityDate(new Date());
offerDAO.insert(offer);
}
/**
* Inserta costes materiales en la ofertas
*/
private void insertOfferCosts() {
final Set<OfferCost> offerCosts = new LinkedHashSet<OfferCost>(2);
final OfferCost paneles = new OfferCost();
paneles.setBillable(true);
paneles.setCost(new BigDecimal(1000));
paneles.setIva(new BigDecimal(16));
paneles.setName("paneles");
paneles.setUnits(new BigDecimal(5));
paneles.setOffer(offer);
final OfferCost cristales = new OfferCost();
cristales.setBillable(false);
cristales.setCost(new BigDecimal(10));
cristales.setIva(new BigDecimal(16));
cristales.setName("paneles");
cristales.setUnits(new BigDecimal(1));
cristales.setOffer(offer);
offerCosts.add(paneles);
offerCosts.add(cristales);
offer.setCosts(offerCosts);
}
/**
* Inserta costes imputables a personal en la ofertas
*/
private void insertOfferRoles() {
final Set<OfferRole> offerRoles = new LinkedHashSet<OfferRole>(2);
final OfferRole chapista = new OfferRole();
chapista.setCostPerHour(new BigDecimal(30));
chapista.setExpectedHours(10);
chapista.setIva(new BigDecimal(16));
chapista.setName("chapista");
chapista.setOffer(offer);
final OfferRole pintor = new OfferRole();
pintor.setCostPerHour(new BigDecimal(25));
pintor.setExpectedHours(30);
pintor.setIva(new BigDecimal(16));
pintor.setName("pintor");
pintor.setOffer(offer);
offerRoles.add(chapista);
offerRoles.add(pintor);
offer.setRoles(offerRoles);
}
/**
* Inserta una interaccion en la oferta
*/
private void insertOfferInteraction() {
final Set<Interaction> interactions = new LinkedHashSet<Interaction>(1);
final InteractionTypeDAO interactionTypeDAO = (InteractionTypeDAO) SpringUtilsForTesting.getSpringBean("daoInteractionType");
final InteractionType interactionType = new InteractionType();
interactionType.setName("interaccion");
interactionTypeDAO.insert(interactionType);
final Interaction interaction = new Interaction();
interaction.setProject(project);
interaction.setUser(user);
interaction.setType(interactionType);
interaction.setOffer(offer);
interaction.setCreationDate(new Date());
interaction.setInterest(InteractionInterest.MEDIUM);
interaction.setDescription("descripcion de la interaccion");
interactions.add(interaction);
offer.setInteractions(interactions);
}
}