package eu.ggnet.dwoss.redtape.entity;
import eu.ggnet.dwoss.rules.PaymentMethod;
import eu.ggnet.dwoss.rules.PositionType;
import eu.ggnet.dwoss.rules.DocumentType;
import eu.ggnet.dwoss.redtape.entity.Dossier;
import eu.ggnet.dwoss.redtape.entity.Position;
import eu.ggnet.dwoss.redtape.entity.Document;
import eu.ggnet.dwoss.redtape.entity.Reminder;
import java.util.Arrays;
import java.util.Objects;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author pascal.perau
*/
public class DossierTest {
@Test
public void testGetActive() {
Dossier dos = new Dossier();
Document doc1 = new Document();
doc1.setType(DocumentType.ORDER);
doc1.setActive(true);
dos.add(doc1);
Document doc2 = new Document();
doc2.setType(DocumentType.ORDER);
doc2.setActive(false);
dos.add(doc2);
Document doc3 = new Document();
doc3.setType(DocumentType.INVOICE);
doc3.setActive(true);
dos.add(doc3);
Document doc4 = new Document();
doc4.setType(DocumentType.CREDIT_MEMO);
doc4.setActive(true);
dos.add(doc4);
assertEquals("ActiveDocument(Type=Order)", doc1, dos.getActiveDocuments(DocumentType.ORDER).get(0));
assertEquals("ActiveDocument(Type=Invoice)", doc3, dos.getActiveDocuments(DocumentType.INVOICE).get(0));
assertEquals("ActiveDocuments", 3, dos.getActiveDocuments().size());
}
@Test
public void testChangesAllowedOpenDossier() {
Dossier dos1 = sampleOpenDossier();
Dossier dos2 = sampleOpenDossier();
assertTrue(dos1.changesAllowed(dos2));
dos2.setPaymentMethod(PaymentMethod.DIRECT_DEBIT);
dos2.setDispatch(!dos2.isDispatch());
assertTrue(dos1.changesAllowed(dos2));
}
@Test
public void testChangesAllowedClosedDossier() {
Dossier dos1 = sampleClosedDossier();
Dossier dos2 = sampleClosedDossier();
assertTrue(dos1.changesAllowed(dos2));
dos2.setReminder(new Reminder());
dos2.setComment("Ein Kommentar");
assertTrue(dos1.changesAllowed(dos2));
}
@Test
public void testChangesAllowedClosedDossierPaymentMethod() {
Dossier dos1 = sampleClosedDossier();
Dossier dos2 = sampleClosedDossier();
dos2.setPaymentMethod(PaymentMethod.DIRECT_DEBIT);
assertFalse(dos1.getPaymentMethod() == dos2.getPaymentMethod());
assertFalse("Changes should not be allowed", dos1.changesAllowed(dos2));
}
@Test
public void testChangesAllowedClosedDossierCustomerId() {
Dossier dos1 = sampleClosedDossier();
Dossier dos2 = sampleClosedDossier();
dos2.setCustomerId(999);
assertFalse(dos1.getCustomerId() == dos2.getCustomerId());
assertFalse("Changes should not be allowed", dos1.changesAllowed(dos2));
}
@Test
public void testChangesAllowedClosedDossierDispatch() {
Dossier dos1 = sampleClosedDossier();
Dossier dos2 = sampleClosedDossier();
dos2.setDispatch(!dos1.isDispatch());
assertFalse("Changes should not be allowed", dos1.changesAllowed(dos2));
}
@Test
public void testChangesAllowedClosedDossierIdentifier() {
Dossier dos1 = sampleClosedDossier();
Dossier dos2 = sampleClosedDossier();
dos2.setIdentifier("Blubbla");
assertFalse(Objects.equals(dos1.getIdentifier(), dos2.getIdentifier()));
assertFalse("Changes should not be allowed", dos1.changesAllowed(dos2));
}
private Dossier sampleOpenDossier() {
Dossier dos = new Dossier(PaymentMethod.ADVANCE_PAYMENT, true, 1);
Document d1 = new Document(DocumentType.ORDER, Document.Directive.NONE, null);
dos.add(d1);
return dos;
}
private Dossier sampleClosedDossier() {
Dossier dos = new Dossier(PaymentMethod.ADVANCE_PAYMENT, true, 1);
Document d1 = new Document(DocumentType.ORDER, Document.Directive.NONE, null);
d1.setClosed(true);
dos.add(d1);
dos.setClosed(true);
return dos;
}
@Test
public void testChangesAllowedOpenDossierWithClosedInvoice() {
Dossier dos1 = sampleOpenDossierWithClosedInvoice();
Dossier dos2 = sampleOpenDossierWithClosedInvoice();
dos2.setPaymentMethod(PaymentMethod.DIRECT_DEBIT);
assertFalse(dos1.getPaymentMethod() == dos2.getPaymentMethod());
assertFalse(dos1.isClosed());
assertFalse(dos2.isClosed());
assertFalse("Changes should not be allowed", dos1.changesAllowed(dos2));
}
@Test
public void testGetRelevantPositionsCapitalAsset() {
final int UNIQUE_UNIT_ID = 1;
Dossier dos1 = new Dossier();
Document dos1CapitalAsset = new Document(DocumentType.CAPITAL_ASSET, Document.Directive.HAND_OVER_GOODS, null);
dos1CapitalAsset.setActive(true);
Position p1 = new Position();
p1.setUniqueUnitId(UNIQUE_UNIT_ID);
p1.setType(PositionType.UNIT);
Position p2 = new Position();
p2.setType(PositionType.COMMENT);
dos1CapitalAsset.appendAll(p1, p2);
dos1.add(dos1CapitalAsset);
assertEquals(1, dos1.getRelevantUniqueUnitIds().size());
assertEquals(UNIQUE_UNIT_ID, (int)dos1.getRelevantUniqueUnitIds().iterator().next());
dos1CapitalAsset.add(Document.Condition.CANCELED);
assertTrue("Should have no relevant UniqueUnit ids, but there are: " + dos1.getRelevantUniqueUnitIds(), dos1.getRelevantUniqueUnitIds().isEmpty());
}
@Test
public void testGetRelevantPositionsCapitalReturns() {
final int UNIQUE_UNIT_ID = 1;
Dossier dos1 = new Dossier();
Document dos1CapitalAsset = new Document(DocumentType.RETURNS, Document.Directive.HAND_OVER_GOODS, null);
dos1CapitalAsset.setActive(true);
Position p1 = new Position();
p1.setUniqueUnitId(UNIQUE_UNIT_ID);
p1.setType(PositionType.UNIT);
Position p2 = new Position();
p2.setType(PositionType.COMMENT);
dos1CapitalAsset.appendAll(p1, p2);
dos1.add(dos1CapitalAsset);
assertEquals(1, dos1.getRelevantUniqueUnitIds().size());
assertEquals(UNIQUE_UNIT_ID, (int)dos1.getRelevantUniqueUnitIds().iterator().next());
dos1CapitalAsset.add(Document.Condition.CANCELED);
assertTrue("Should have no relevant UniqueUnit ids, but there are: " + dos1.getRelevantUniqueUnitIds(), dos1.getRelevantUniqueUnitIds().isEmpty());
}
@Test
public void testGetRelevantPositions() {
Dossier dos1 = new Dossier();
Document dos1Order = new Document(DocumentType.ORDER, Document.Directive.CREATE_INVOICE, null);
dos1Order.setActive(true);
Position p1 = new Position();
p1.setUniqueUnitId(1);
p1.setType(PositionType.UNIT);
Position p2 = new Position();
p2.setType(PositionType.COMMENT);
dos1Order.appendAll(p1, p2);
dos1.add(dos1Order);
assertEquals(1, dos1.getRelevantUniqueUnitIds().size());
Position p3 = new Position();
p3.setUniqueUnitId(2);
p3.setType(PositionType.UNIT);
dos1Order.append(p3);
Document dos1Invoice = dos1Order.partialClone();
dos1Invoice.setActive(true);
dos1Invoice.setType(DocumentType.INVOICE);
dos1.add(dos1Invoice);
assertTrue(dos1.getRelevantUniqueUnitIds().containsAll(Arrays.asList(new Integer[]{1, 2})));
Document dos1CreditMemo = new Document(DocumentType.CREDIT_MEMO, Document.Directive.BALANCE_REPAYMENT, null);
dos1CreditMemo.setActive(true);
dos1CreditMemo.append(p3.partialClone());
dos1.add(dos1CreditMemo);
assertEquals("Size should be 1", 1, dos1.getRelevantUniqueUnitIds().size());
assertTrue("UniqueUnitId 1 should be in the list", dos1.getRelevantUniqueUnitIds().contains(1));
Dossier dos2 = new Dossier();
Document blocker = new Document(DocumentType.BLOCK, Document.Directive.NONE, null);
blocker.setActive(true);
Position pb1 = new Position();
pb1.setUniqueUnitId(1);
pb1.setType(PositionType.UNIT);
Position pb2 = new Position();
pb2.setUniqueUnitId(2);
pb2.setType(PositionType.UNIT);
Position pb3 = new Position();
pb3.setUniqueUnitId(3);
pb3.setType(PositionType.UNIT);
Position pb4 = new Position();
pb4.setUniqueUnitId(4);
pb4.setType(PositionType.UNIT);
Position pb5 = new Position();
pb5.setUniqueUnitId(5);
pb5.setType(PositionType.UNIT);
blocker.appendAll(pb1, pb2, pb3, pb4, pb5);
dos2.add(blocker);
assertTrue("UnitId 1,2,3,4,5 should be in the list", dos2.getRelevantUniqueUnitIds().containsAll(Arrays.asList(new Integer[]{1, 2, 3, 4, 5})));
pb5.setType(PositionType.SERVICE);
assertTrue("UnitId 1,2,3,4 should be in the list", dos2.getRelevantUniqueUnitIds().containsAll(Arrays.asList(new Integer[]{1, 2, 3, 4})));
}
private Dossier sampleOpenDossierWithClosedInvoice() {
Dossier dos = new Dossier(PaymentMethod.ADVANCE_PAYMENT, true, 1);
Document d1 = new Document(DocumentType.INVOICE, Document.Directive.NONE, null);
d1.setActive(true);
d1.setClosed(true);
dos.add(d1);
return dos;
}
}