package eu.ggnet.dwoss.redtape; import eu.ggnet.dwoss.rules.DocumentType; import eu.ggnet.dwoss.rules.PaymentMethod; import eu.ggnet.dwoss.rules.PositionType; import eu.ggnet.dwoss.rules.AddressType; import eu.ggnet.dwoss.customer.assist.CustomerPu; import eu.ggnet.dwoss.redtape.entity.PositionBuilder; import eu.ggnet.dwoss.redtape.entity.Position; import eu.ggnet.dwoss.redtape.entity.Address; import eu.ggnet.dwoss.redtape.assist.RedTapePu; import eu.ggnet.dwoss.redtape.assist.RedTapes; import eu.ggnet.dwoss.redtape.entity.Dossier; import eu.ggnet.dwoss.redtape.entity.Document; import eu.ggnet.dwoss.stock.entity.LogicTransaction; import eu.ggnet.dwoss.stock.StockAgent; import eu.ggnet.dwoss.stock.assist.Stocks; import eu.ggnet.dwoss.stock.entity.StockUnit; import eu.ggnet.dwoss.stock.assist.StockPu; import eu.ggnet.dwoss.uniqueunit.entity.UniqueUnit; import eu.ggnet.dwoss.uniqueunit.entity.Product; import java.text.SimpleDateFormat; import java.util.*; import javax.ejb.*; import javax.ejb.embeddable.EJBContainer; import javax.inject.Inject; import javax.naming.NamingException; import javax.persistence.EntityManager; import org.junit.*; import eu.ggnet.dwoss.configuration.SystemConfig; import eu.ggnet.dwoss.customer.assist.gen.CustomerGeneratorOperation; import eu.ggnet.dwoss.receipt.gen.ReceiptGeneratorOperation; import eu.ggnet.dwoss.redtape.RedTapeAgent; import eu.ggnet.dwoss.redtape.eao.DocumentEao; import eu.ggnet.dwoss.spec.assist.SpecPu; import eu.ggnet.dwoss.stock.eao.LogicTransactionEao; import eu.ggnet.dwoss.uniqueunit.assist.UniqueUnitPu; import eu.ggnet.dwoss.util.UserInfoException; import static org.fest.assertions.api.Assertions.assertThat; import static org.junit.Assert.*; /** * * @author bastian.venz */ public class RedTapeOperationOrderInvoiceIT { @Stateless public static class DocumentManipulator { @Inject @RedTapes private EntityManager redTapeEm; public Document changeActual(Document doc, Date date) { doc = new DocumentEao(redTapeEm).findById(doc.getId()); doc.setActual(date); return doc; } } @Stateless public static class LogicTransactionEaoWrapper { @Inject @Stocks private EntityManager stockEm; public List<LogicTransaction> findAll() { return new LogicTransactionEao(stockEm).findAll(); } public LogicTransaction findByDossierId(long dossierId) { return new LogicTransactionEao(stockEm).findByDossierId(dossierId); } } private EJBContainer container; @EJB private UnitOverseer unitOverseer; @EJB private RedTapeWorker redTapeWorker; @Inject private CustomerGeneratorOperation customerGenerator; @Inject private LogicTransactionEaoWrapper logicTransactionEao; @EJB private RedTapeAgent redTapeAgent; @EJB private StockAgent stockAgent; @Inject private DocumentManipulator manipulator; @Inject private ReceiptGeneratorOperation receiptGenerator; @Before public void setUp() throws NamingException { Map<String, Object> c = new HashMap<>(); c.putAll(SpecPu.CMP_IN_MEMORY); c.putAll(UniqueUnitPu.CMP_IN_MEMORY); c.putAll(CustomerPu.CMP_IN_MEMORY); c.putAll(StockPu.CMP_IN_MEMORY); c.putAll(RedTapePu.CMP_IN_MEMORY); c.putAll(SystemConfig.OPENEJB_EJB_XML_DISCOVER); c.putAll(SystemConfig.OPENEJB_LOG_WARN); container = EJBContainer.createEJBContainer(c); container.getContext().bind("inject", this); } @After public void tearDown() { container.close(); } /** * Test of create method, of class RedTapeWorkerOperation. * <p> * @throws java.lang.InterruptedException */ @Test public void testCreateDossier() throws InterruptedException { long customerId = customerGenerator.makeCustomer(); Dossier dos1 = redTapeWorker.create(customerId, true, "Me"); // Dossier value tests assertEquals(dos1.getCustomerId(), customerId); assertEquals(dos1.getPaymentMethod(), PaymentMethod.ADVANCE_PAYMENT); assertTrue(dos1.isDispatch()); assertTrue(dos1.getId() > 0); // Document value tests assertNotNull(dos1.getDocuments()); assertTrue(!dos1.getDocuments().isEmpty()); assertTrue(dos1.getDocuments().iterator().next().isActive()); assertTrue(dos1.getActiveDocuments(DocumentType.ORDER).get(0).getId() > 0); List<Address> all = redTapeAgent.findAll(Address.class); assertThat(all) .overridingErrorMessage("Unexspected Addesses in Database:" + all) .isNotEmpty(); assertThat(all.size()) .overridingErrorMessage("Should be one or two Addresses, but size()=" + all.size() + ", elements=" + all) .isLessThan(3); } @Test public void testUpdateDocument() throws UserInfoException { long customerId = customerGenerator.makeCustomer(); List<UniqueUnit> uus = receiptGenerator.makeUniqueUnits(4, true, true); UniqueUnit uu1 = uus.get(0); UniqueUnit uu2 = uus.get(1); UniqueUnit uu3 = uus.get(2); UniqueUnit uu4 = uus.get(3); Product uuProduct1 = uu1.getProduct(); customerGenerator.scrambleAddress(customerId, AddressType.SHIPPING); //Generate Dossier Dossier dos1 = redTapeWorker.create(customerId, false, "Me"); Document doc1 = dos1.getActiveDocuments(DocumentType.ORDER).get(0); assertTrue(doc1.equalsContent(dos1.getActiveDocuments(DocumentType.ORDER).get(0))); //Commit explicit date to document for assertion doc1 = manipulator.changeActual(doc1, new GregorianCalendar(2012, 3, 15).getTime()); //Create Positions Position p1 = NaivBuilderUtil.unit(uu1); Position p2 = NaivBuilderUtil.unit(uu2); Position p3 = NaivBuilderUtil.unit(uu3); Position p4 = NaivBuilderUtil.comment(); Position p5 = NaivBuilderUtil.service(); Position p6 = NaivBuilderUtil.batch(uuProduct1); Position p7 = NaivBuilderUtil.shippingcost(); doc1.append(p1); doc1.append(p2); doc1.append(p3); doc1.append(p4); doc1.append(p5); doc1.append(p6); doc1.append(p7); //add units to LogicTransaction unitOverseer.lockStockUnit(dos1.getId(), uu1.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); unitOverseer.lockStockUnit(dos1.getId(), uu2.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); unitOverseer.lockStockUnit(dos1.getId(), uu3.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); unitOverseer.lockStockUnit(dos1.getId(), uu4.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); //check if LogicTransaction is created correctly assertEquals("Amount of LogicTransactions", 1, logicTransactionEao.findAll().size()); assertEquals("The LogicTransaction should have only 4 units", 4, logicTransactionEao.findAll().get(0).getUnits().size()); //update document Date date = doc1.getActual(); doc1 = redTapeWorker.update(doc1, null, "Me"); assertEquals("Same actual dates expected", date, doc1.getActual()); assertEquals("Only one Active Document expected", 1, doc1.getDossier().getActiveDocuments().size()); assertTrue(logicTransactionEao.findAll().get(0).getUnits().size() == 3); assertEquals("Ammount of Documents", 2, redTapeAgent.findAll(Document.class).size()); dos1 = redTapeAgent.findByIdEager(Dossier.class, dos1.getId()); assertEquals("Ammount of Posistions", 7, doc1.getPositions().size()); //address setting test assertFalse(doc1.getInvoiceAddress().equals(doc1.getShippingAddress())); //Test update with document changes Position p8 = new PositionBuilder().setType(PositionType.SERVICE).setPrice(50.). setTax(1.).setAfterTaxPrice(1.).setName("Position 8").setDescription("Position from update2").createPosition(); doc1.append(p8); doc1.removeAt(6); Document doc2 = redTapeWorker.update(doc1, null, "Me"); assertEquals("Only one Active Document expected", 1, doc2.getDossier().getActiveDocuments().size()); assertEquals("Ammount of Documents", 3, redTapeAgent.findAll(Document.class).size()); dos1 = redTapeAgent.findByIdEager(Dossier.class, dos1.getId()); assertEquals("Id of Predecessor Document", doc1.getId(), dos1.getActiveDocuments(DocumentType.ORDER).get(0).getPredecessor().getId()); assertEquals("Ammount of Posistions", 7, dos1.getActiveDocuments(DocumentType.ORDER).get(0).getPositions().size()); //Test date changes when updating document type doc2.setType(DocumentType.INVOICE); Document doc3 = redTapeWorker.update(doc2, null, "JUnit"); assertFalse(doc3.getActual().equals(doc2.getActual())); } @Test public void testRevertCreate() throws UserInfoException { long customerId = customerGenerator.makeCustomer(); List<UniqueUnit> uus = receiptGenerator.makeUniqueUnits(4, true, true); UniqueUnit uu1 = uus.get(0); UniqueUnit uu2 = uus.get(1); UniqueUnit uu3 = uus.get(2); UniqueUnit uu4 = uus.get(3); Product uuProduct1 = uu1.getProduct(); //Generate Dossier Dossier dos1 = redTapeWorker.create(customerId, true, "Me"); Document doc1 = dos1.getActiveDocuments(DocumentType.ORDER).get(0); //Create Positions Position p1 = NaivBuilderUtil.unit(uu1); Position p2 = NaivBuilderUtil.unit(uu2); Position p4 = NaivBuilderUtil.comment(); Position p5 = NaivBuilderUtil.service(); Position p6 = NaivBuilderUtil.batch(uuProduct1); doc1.append(p1); doc1.append(p2); doc1.append(p4); doc1.append(p5); doc1.append(p6); //add units to LogicTransaction unitOverseer.lockStockUnit(dos1.getId(), uu1.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); unitOverseer.lockStockUnit(dos1.getId(), uu2.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); //update document doc1 = redTapeWorker.update(doc1, null, "Me"); //add units to LogicTransaction without update unitOverseer.lockStockUnit(dos1.getId(), uu3.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); unitOverseer.lockStockUnit(dos1.getId(), uu4.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); assertEquals("LogicTransaction size", 4, logicTransactionEao.findByDossierId(dos1.getId()).getUnits().size()); //test revertCreate operation redTapeWorker.revertCreate(doc1); assertEquals("LogicTransaction cleanup", 2, logicTransactionEao.findByDossierId(dos1.getId()).getUnits().size()); assertNull(stockAgent.findStockUnitByUniqueUnitIdEager(uu3.getId()).getLogicTransaction()); assertNull(stockAgent.findStockUnitByUniqueUnitIdEager(uu3.getId()).getLogicTransaction()); long customerId2 = customerGenerator.makeCustomer(); Dossier dos2 = redTapeWorker.create(customerId2, true, "Me"); assertEquals("Dossiers in database", 2, redTapeAgent.findAll(Dossier.class).size()); redTapeWorker.revertCreate(dos2.getActiveDocuments(DocumentType.ORDER).get(0)); assertEquals("Dossiers in database", 1, redTapeAgent.findAll(Dossier.class).size()); } @Test public void testInvoiceDocument() throws UserInfoException { long customerId = customerGenerator.makeCustomer(); List<UniqueUnit> uus = receiptGenerator.makeUniqueUnits(4, true, true); UniqueUnit uu1 = uus.get(0); UniqueUnit uu2 = uus.get(1); UniqueUnit uu3 = uus.get(2); UniqueUnit uu4 = uus.get(3); Product uuProduct1 = uu1.getProduct(); //Generate Dossier Dossier dos = redTapeWorker.create(customerId, true, "Me"); Document doc1 = dos.getActiveDocuments(DocumentType.ORDER).get(0); assertTrue(doc1.equalsContent(dos.getActiveDocuments(DocumentType.ORDER).get(0))); doc1.add(Document.Flag.CUSTOMER_BRIEFED); doc1.add(Document.Flag.CUSTOMER_EXACTLY_BRIEFED); //Create Positions Position p1 = NaivBuilderUtil.unit(uu1); Position p2 = NaivBuilderUtil.unit(uu2); Position p4 = NaivBuilderUtil.comment(); Position p5 = NaivBuilderUtil.service(); Position p6 = NaivBuilderUtil.batch(uuProduct1); Position p7 = NaivBuilderUtil.shippingcost(); doc1.append(p1); doc1.append(p2); doc1.append(p4); doc1.append(p5); doc1.append(p6); doc1.append(p7); Position p3 = NaivBuilderUtil.unit(uu3); Position p8 = NaivBuilderUtil.unit(uu4); Dossier dos2 = redTapeWorker.create(customerId, false, "Me2"); Document doc2 = dos2.getActiveDocuments(DocumentType.ORDER).get(0); doc2.append(p3); doc2.append(p8); //add units to LogicTransaction unitOverseer.lockStockUnit(dos.getId(), uu1.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); unitOverseer.lockStockUnit(dos.getId(), uu2.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); unitOverseer.lockStockUnit(dos.getId(), uu3.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); unitOverseer.lockStockUnit(dos.getId(), uu4.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); doc1 = redTapeWorker.update(doc1, null, "Junit Test"); doc1.add(Document.Condition.PAID); doc1.add(Document.Condition.PICKED_UP); doc1.setType(DocumentType.INVOICE); doc1 = redTapeWorker.update(doc1, null, "tester"); String format = new SimpleDateFormat("YY").format(new Date()); assertEquals("The Identifier of Invoice", "RS" + format + "_00001", doc1.getIdentifier()); assertFalse("Document must not contain " + Document.Flag.CUSTOMER_BRIEFED, doc1.getFlags().contains(Document.Flag.CUSTOMER_BRIEFED)); assertFalse("Document must not contain " + Document.Flag.CUSTOMER_EXACTLY_BRIEFED, doc1.getFlags().contains(Document.Flag.CUSTOMER_EXACTLY_BRIEFED)); LogicTransaction lt = logicTransactionEao.findByDossierId(doc1.getDossier().getId()); assertNotNull("A LogicTrasaction must exists", lt); assertEquals("The Size of the LogicTransaction", 2, lt.getUnits().size()); doc2.setType(DocumentType.INVOICE); Document update2 = redTapeWorker.update(doc2, null, "Junit"); assertEquals("RS" + format + "_00002", update2.getIdentifier()); } @Test public void testCancelDocument() throws UserInfoException { long customerId = customerGenerator.makeCustomer(); List<UniqueUnit> uus = receiptGenerator.makeUniqueUnits(4, true, true); UniqueUnit uu1 = uus.get(0); UniqueUnit uu2 = uus.get(1); UniqueUnit uu3 = uus.get(2); UniqueUnit uu4 = uus.get(3); Product uuProduct1 = uu1.getProduct(); //Generate Dossier Dossier dos = redTapeWorker.create(customerId, true, "Me"); Document doc1 = dos.getActiveDocuments(DocumentType.ORDER).get(0); assertTrue(doc1.equalsContent(dos.getActiveDocuments(DocumentType.ORDER).get(0))); //Create Positions Position p1 = NaivBuilderUtil.unit(uu1); Position p2 = NaivBuilderUtil.unit(uu2); Position p4 = NaivBuilderUtil.comment(); Position p5 = NaivBuilderUtil.service(); Position p6 = NaivBuilderUtil.batch(uuProduct1); Position p7 = NaivBuilderUtil.shippingcost(); doc1.append(p1); doc1.append(p2); doc1.append(p4); doc1.append(p5); doc1.append(p6); doc1.append(p7); Position p3 = NaivBuilderUtil.unit(uu3); Position p8 = NaivBuilderUtil.unit(uu4); Dossier dos2 = redTapeWorker.create(customerId, false, "Me2"); Document doc2 = dos2.getActiveDocuments(DocumentType.ORDER).get(0); doc2.add(Document.Condition.CONFIRMED); doc2.add(Document.Condition.PAID); doc2.append(p3); doc2.append(p8); //add units to LogicTransaction unitOverseer.lockStockUnit(dos.getId(), uu1.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); unitOverseer.lockStockUnit(dos.getId(), uu2.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); unitOverseer.lockStockUnit(dos.getId(), uu3.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); unitOverseer.lockStockUnit(dos.getId(), uu4.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID)); doc1.add(Document.Condition.CONFIRMED); doc1.setType(DocumentType.ORDER); doc1 = redTapeWorker.update(doc1, null, "Junit Test"); doc1.add(Document.Condition.CANCELED); doc1 = redTapeWorker.update(doc1, null, "tester"); assertTrue("Document doesent contain the Condition Canceled", doc1.getConditions().contains(Document.Condition.CANCELED)); for (Position position : doc1.getPositions(PositionType.UNIT).values()) { StockUnit su = stockAgent.findStockUnitByUniqueUnitIdEager(position.getUniqueUnitId()); assertNull(su + " should not have LogicTransaction", su.getLogicTransaction()); } } }