package eu.ggnet.dwoss.redtape;
import eu.ggnet.dwoss.rules.DocumentType;
import eu.ggnet.dwoss.redtape.entity.Position;
import eu.ggnet.dwoss.redtape.entity.Document;
import eu.ggnet.dwoss.redtape.entity.Dossier;
import eu.ggnet.dwoss.stock.entity.LogicTransaction;
import java.util.*;
import java.util.stream.Collectors;
import javax.ejb.EJB;
import javax.ejb.embeddable.EJBContainer;
import javax.inject.Inject;
import javax.naming.NamingException;
import org.junit.*;
import eu.ggnet.dwoss.configuration.SystemConfig;
import eu.ggnet.dwoss.customer.assist.CustomerPu;
import eu.ggnet.dwoss.customer.assist.gen.CustomerGeneratorOperation;
import eu.ggnet.dwoss.receipt.gen.ReceiptGeneratorOperation;
import eu.ggnet.dwoss.redtape.assist.RedTapePu;
import eu.ggnet.dwoss.spec.assist.SpecPu;
import eu.ggnet.dwoss.stock.assist.StockPu;
import eu.ggnet.dwoss.uniqueunit.assist.UniqueUnitPu;
import eu.ggnet.dwoss.uniqueunit.entity.UniqueUnit;
import eu.ggnet.dwoss.util.UserInfoException;
import static org.junit.Assert.*;
/**
*
* @author bastian.venz, oliver.guenther
*/
public class RedTapeOperationComplaintIT {
private EJBContainer container;
@Inject
private CustomerGeneratorOperation customerGenerator;
@EJB
private RedTapeWorker redTapeOperation;
@EJB
private UnitOverseer unitOverseer;
@Inject
private SupportBean supportBean;
@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
public void testCreditMemo() throws UserInfoException {
long customerId = customerGenerator.makeCustomer();
List<UniqueUnit> units = receiptGenerator.makeUniqueUnits(2, true, true);
UniqueUnit uu1 = units.get(0);
UniqueUnit uu2 = units.get(1);
Dossier dos = redTapeOperation.create(customerId, true, "Me");
Document doc = dos.getActiveDocuments(DocumentType.ORDER).get(0);
assertTrue(doc.equalsContent(dos.getActiveDocuments(DocumentType.ORDER).get(0)));
//Create Positions
Position p1 = NaivBuilderUtil.unit(uu1);
Position p2 = NaivBuilderUtil.unit(uu2);
doc.append(p1);
doc.append(p2);
//add units to LogicTransaction
unitOverseer.lockStockUnit(dos.getId(), uu1.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID));
unitOverseer.lockStockUnit(dos.getId(), uu2.getIdentifier(UniqueUnit.Identifier.REFURBISHED_ID));
doc = redTapeOperation.update(doc, null, "JUnit");
doc.add(Document.Condition.PAID);
doc.add(Document.Condition.PICKED_UP);
doc.setType(DocumentType.INVOICE);
doc = redTapeOperation.update(doc, null, "JUnit");
LogicTransaction lt = supportBean.findByDossierId(doc.getDossier().getId());
assertNotNull("A LogicTrasaction must exists", lt);
assertEquals("The Size of the LogicTransaction", 2, lt.getUnits().size());
assertEquals("Document should have exactly two possitions", 2, doc.getPositions().size());
doc.setType(DocumentType.COMPLAINT);
doc.setDirective(Document.Directive.WAIT_FOR_COMPLAINT_COMPLETION);
doc.removeAt(p2.getId());
assertEquals("Document should have exactly one possitions", 1, doc.getPositions().size());
doc = redTapeOperation.update(doc, null, "JUnit Test");
lt = supportBean.findByDossierId(doc.getDossier().getId());
assertNotNull("A LogicTrasaction must still exists", lt);
assertEquals("The Size of the LogicTransaction", 2, lt.getUnits().size());
Arrays.asList(uu1.getId(), uu2.getId());
assertTrue("Should contain the same UniqueUnitIds", lt.getUnits().stream().map(su -> su.getUniqueUnitId())
.collect(Collectors.toSet()).containsAll(Arrays.asList(uu1.getId(), uu2.getId())));
doc.add(Document.Condition.REJECTED);
redTapeOperation.update(doc, null, "JUnit Test");
}
}