package eu.ggnet.dwoss.report.eao; import java.text.ParseException; import java.util.*; import java.util.Map.Entry; import javax.persistence.*; import org.apache.commons.lang3.time.DateUtils; import org.junit.*; import eu.ggnet.dwoss.report.assist.ReportPu; import eu.ggnet.dwoss.report.assist.gen.ReportLineGenerator; import eu.ggnet.dwoss.report.entity.Report; import eu.ggnet.dwoss.report.entity.ReportLine; import eu.ggnet.dwoss.report.entity.partial.SimpleReportLine; import eu.ggnet.dwoss.rules.*; import eu.ggnet.dwoss.util.DateFormats; import static eu.ggnet.dwoss.rules.DocumentType.ANNULATION_INVOICE; import static eu.ggnet.dwoss.rules.DocumentType.INVOICE; import static eu.ggnet.dwoss.rules.PositionType.UNIT; import static eu.ggnet.dwoss.rules.SalesChannel.RETAILER; import static eu.ggnet.dwoss.rules.Step.DAY; import static eu.ggnet.dwoss.rules.TradeName.*; import static org.apache.commons.lang3.time.DateUtils.*; import static org.apache.commons.lang3.time.DateUtils.addDays; import static org.apache.commons.lang3.time.DateUtils.parseDate; import static org.junit.Assert.*; /** * * @author oliver.guenther */ public class ReportLineEaoIT { private EntityManagerFactory emf; private EntityManager em; private final ReportLineGenerator generator = new ReportLineGenerator(); private static Date startEarly; private static Date startMid; private static Date startFuture; static { try { startEarly = DateFormats.ISO.parse("2012-01-01"); startMid = DateFormats.ISO.parse("2012-01-14"); startFuture = DateFormats.ISO.parse("20-01-28"); } catch (ParseException ex) { throw new RuntimeException(ex); } } @Before public void setUp() { Map<String, Object> c = new HashMap<>(); c.putAll(ReportPu.JPA_IN_MEMORY); emf = Persistence.createEntityManagerFactory(ReportPu.NAME, c); em = emf.createEntityManager(); } @After public void after() { if ( em != null && em.isOpen() ) em.close(); if ( emf != null && emf.isOpen() ) emf.close(); } @Test public void testFindAllSimple() throws ParseException { em.getTransaction().begin(); for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startEarly, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } em.getTransaction().commit(); em.getTransaction().begin(); List<ReportLine> findAll = new ReportLineEao(em).findAll(); assertEquals(300, findAll.size()); List<SimpleReportLine> findAll2 = new ReportLineEao(em).findAllSimple(); assertEquals(300, findAll2.size()); em.getTransaction().commit(); } @Test public void testFindProductIdMissingContractorPartNo() throws ParseException { em.getTransaction().begin(); final Random R = new Random(); final long PRODUCT_ID = 10; final TradeName CONTRACTOR = HP; em.persist(make(DELL, PRODUCT_ID + 5, null)); // Different contarctor and productId em.persist(make(DELL, PRODUCT_ID, null)); // Different contarctor em.persist(make(CONTRACTOR, PRODUCT_ID + 5, null)); // Different productId em.persist(make(CONTRACTOR, PRODUCT_ID, "123556")); // has already a contracotrPartNo // Two matching Lines ReportLine l1 = make(CONTRACTOR, PRODUCT_ID, null); ReportLine l2 = make(CONTRACTOR, PRODUCT_ID, null); em.persist(l1); em.persist(l2); em.getTransaction().commit(); em.getTransaction().begin(); List<ReportLine> missing = new ReportLineEao(em).findByProductIdMissingContractorPartNo(PRODUCT_ID, CONTRACTOR); assertEquals(2, missing.size()); assertTrue(missing.contains(l1)); assertTrue(missing.contains(l2)); em.getTransaction().commit(); } @Test public void testFindLastReported() throws ParseException { em.getTransaction().begin(); for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startEarly, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startMid, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startMid, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startFuture, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 50; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.HP), startMid, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startMid, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); Report r = new Report("Report Test " + l.getId(), DELL, addDays(l.getReportingDate(), -1), addDays(l.getReportingDate(), 1)); r.add(l); em.persist(r); } em.getTransaction().commit(); Date max = DateFormats.ISO.parse("2012-01-20"); em.getTransaction().begin(); Date d2 = new ReportLineEao(em).findLastReported(); assertTrue("Date " + d2 + " is not the expected " + max, DateUtils.isSameDay(max, d2)); em.getTransaction().commit(); } @Test public void testFindByUniqueUnitId() throws ParseException { String ISO = "yyyy-MM-dd"; Date d1 = DateUtils.parseDate("2010-01-01", ISO); ReportLine line1 = new ReportLine("PersName1", "This is a TestDescription1", 137, "DW0037", 3, "RE0008", PositionType.UNIT, DocumentType.INVOICE, 2, 1, 0.19, 100, 119, 37, "This is the Invoice Address", "123", 2, "SERIALNUMBER", new Date(), 3, "PArtNo", "test@gg-net.de"); line1.setReportingDate(DateUtils.parseDate("2009-01-01", ISO)); line1.setUniqueUnitId(10); ReportLine line2 = new ReportLine("PersName2", "This is a TestDescription2", 1337, "DW0013", 3, "RE001", PositionType.UNIT, DocumentType.INVOICE, 2, 1, 0.19, 100, 119, 37, "This is the Invoice Address", "123", 2, "SERIALNUMBER", new Date(), 3, "PArtNo", "test@gg-net.de"); line2.setReportingDate(DateUtils.parseDate("2009-07-10", ISO)); line2.setUniqueUnitId(10); ReportLine line3 = new ReportLine("PersName3", "This is a TestDescription3", 13, "DW1337", 3, "RE0003", PositionType.UNIT, DocumentType.INVOICE, 2, 1, 0.19, 100, 119, 37, "This is the Invoice Address", "123", 2, "SERIALNUMBER", new Date(), 3, "PArtNo", "test@gg-net.de"); line3.setReportingDate(d1); em.getTransaction().begin(); em.persist(line1); em.persist(line2); em.persist(line3); em.getTransaction().commit(); em.getTransaction().begin(); List<ReportLine> rls = new ReportLineEao(em).findByUniqueUnitId(10); assertEquals(2, rls.size()); rls = new ReportLineEao(em).findByUniqueUnitId(1); assertTrue(rls.isEmpty()); em.getTransaction().commit(); } @Test public void testFindUnreported() throws ParseException { em.getTransaction().begin(); for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startEarly, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startMid, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startMid, 7, Arrays.asList(PositionType.COMMENT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startFuture, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 50; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.HP), startMid, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startMid, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); Report r = new Report("Report Test " + l.getId(), DELL, DateUtils.addDays(l.getReportingDate(), -1), DateUtils.addDays(l.getReportingDate(), 1)); r.add(l); em.persist(r); } em.getTransaction().commit(); em.getTransaction().begin(); List<ReportLine> rls = new ReportLineEao(em).findUnreported(DELL, DateFormats.ISO.parse("2012-01-14"), DateFormats.ISO.parse("2012-01-27")); assertEquals(600, rls.size());// Units, Comments, ShipmentCost rls = new ReportLineEao(em).findUnreported(DELL, DateFormats.ISO.parse("2012-01-14"), DateFormats.ISO.parse("2012-01-27"), PositionType.UNIT, PositionType.UNIT_ANNEX); assertEquals(300, rls.size()); em.getTransaction().commit(); } @Test public void testFindUnreportedUnit() throws ParseException { em.getTransaction().begin(); for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startEarly, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startMid, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startMid, 7, Arrays.asList(PositionType.COMMENT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startFuture, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 50; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.HP), startMid, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); } for (int i = 0; i < 300; i++) { ReportLine l = generator.makeReportLine(Arrays.asList(TradeName.DELL), startMid, 7, Arrays.asList(PositionType.UNIT), Arrays.asList(DocumentType.INVOICE)); em.persist(l); Report r = new Report("Report Test " + l.getId(), DELL, DateUtils.addDays(l.getReportingDate(), -1), DateUtils.addDays(l.getReportingDate(), 1)); r.add(l); em.persist(r); } em.getTransaction().commit(); ReportLineEao reportLineEao = new ReportLineEao(em); em.getTransaction().begin(); List<ReportLine> rls = reportLineEao.findUnreportedUnits(DELL, DateFormats.ISO.parse("2012-01-14"), DateFormats.ISO.parse("2012-01-27")); assertEquals(300, rls.size()); em.getTransaction().commit(); } @Test public void testFindFromTillUnreportedUnit() throws ParseException { String ISO = "yyyy-MM-dd"; ReportLine line1 = new ReportLine("PersName1", "This is a TestDescription1", 137, "DW0037", 3, "RE0008", PositionType.UNIT, DocumentType.INVOICE, 2, 1, 0.19, 100, 119, 37, "This is the Invoice Address", "123", 2, "SERIALNUMBER", new Date(), 3, "PArtNo", "test@gg-net.de"); line1.setReportingDate(DateUtils.parseDate("2009-01-01", ISO)); line1.setUniqueUnitId(10); line1.setContractor(TradeName.DELL); ReportLine line2 = new ReportLine("PersName2", "This is a TestDescription2", 1337, "DW0013", 3, "RE001", PositionType.UNIT, DocumentType.INVOICE, 2, 1, 0.19, 100, 119, 37, "This is the Invoice Address", "123", 2, "SERIALNUMBER", new Date(), 3, "PArtNo", "test@gg-net.de"); line2.setReportingDate(DateUtils.parseDate("2010-01-01", ISO)); line2.setUniqueUnitId(10); line2.setContractor(TradeName.DELL); ReportLine line3 = new ReportLine("PersName3", "This is a TestDescription3", 13, "DW1337", 3, "RE0003", PositionType.UNIT, DocumentType.INVOICE, 2, 1, 0.19, 100, 119, 37, "This is the Invoice Address", "123", 2, "SERIALNUMBER", new Date(), 3, "PArtNo", "test@gg-net.de"); line3.setReportingDate(DateUtils.parseDate("2011-01-01", ISO)); line3.setContractor(TradeName.DELL); ReportLine line4 = new ReportLine("PersName3", "This is a TestDescription3", 13, "DW1337", 3, "RE0003", PositionType.UNIT, DocumentType.INVOICE, 2, 1, 0.19, 100, 119, 37, "This is the Invoice Address", "123", 2, "SERIALNUMBER", new Date(), 3, "PArtNo", "test@gg-net.de"); line4.setReportingDate(DateUtils.parseDate("2012-01-01", ISO)); line4.setContractor(TradeName.OTTO); Report r = new Report("KW201301", DELL, DateUtils.parseDate("2009-01-01", ISO), DateUtils.parseDate("2009-01-07", ISO)); r.add(line3); em.getTransaction().begin(); em.persist(line1); em.persist(line2); em.persist(line3); em.persist(line4); em.persist(r); em.getTransaction().commit(); ReportLineEao reportLineEao = new ReportLineEao(em); em.getTransaction().begin(); List<ReportLine> rls = reportLineEao.findUnreportedUnits(DELL, DateUtils.parseDate("2008-12-31", ISO), DateUtils.parseDate("2010-12-31", ISO)); assertEquals(2, rls.size()); rls = reportLineEao.findUnreportedUnits(OTTO, DateUtils.parseDate("2009-12-31", ISO), DateUtils.parseDate("2013-12-31", ISO)); assertEquals(1, rls.size()); em.getTransaction().commit(); } @Test public void testRevenue() throws ParseException { ReportLineEao reportLineEao = new ReportLineEao(em); em.getTransaction().begin(); em.persist(make("2010-06-01", INVOICE, UNIT, 100)); em.persist(make("2010-06-02", INVOICE, UNIT, 100)); em.persist(make("2010-06-03", INVOICE, UNIT, 100)); em.persist(make("2010-06-04", INVOICE, UNIT, 100)); em.persist(make("2010-06-04", ANNULATION_INVOICE, UNIT, -50)); em.persist(make("2010-06-05", INVOICE, UNIT, 100)); em.persist(make("2010-07-05", INVOICE, UNIT, 100)); em.getTransaction().commit(); // Month and count em.getTransaction().begin(); NavigableMap<Date, Revenue> result = reportLineEao.revenueByPositionTypesAndDate(Arrays.asList(UNIT), parseDate("2010-06-01", "yyyy-MM-dd"), parseDate("2010-06-05", "yyyy-MM-dd"), DAY, true); for (Entry<Date, Revenue> e : result.entrySet()) { assertEquals(100.0, e.getValue().sumBy(INVOICE), 0.0001); // System.out.println(DateFormats.ISO.format(e.getKey()) + " - I:" + e.getValue().sum(INVOICE) + " A:" + e.getValue().sum(ANNULATION_INVOICE) + " S:" + e.getValue().sum()); } result = reportLineEao.revenueByPositionTypesAndDate(Arrays.asList(UNIT), parseDate("2010-06-01", "yyyy-MM-dd"), parseDate("2010-06-05", "yyyy-MM-dd"), Step.MONTH, true); assertEquals(1, result.size()); assertEquals(500.0, result.firstEntry().getValue().sumBy(INVOICE), 0.0001); assertEquals(-50.0, result.firstEntry().getValue().sumBy(ANNULATION_INVOICE), 0.0001); assertEquals(450.0, result.firstEntry().getValue().sum(), 0.0001); // result = reportLineEao.revenueByPositionTypesAndDate(Arrays.asList(UNIT), parseDate("2010-06-01", "yyyy-MM-dd"), parseDate("2010-07-30", "yyyy-MM-dd"), DAY); // for (Entry<Date, Revenue> e : result.entrySet()) { // System.out.println(DateFormats.ISO.format(e.getKey()) + " - I:" + e.getValue().sum(INVOICE) + " A:" + e.getValue().sum(ANNULATION_INVOICE) + " S:" + e.getValue().sum()); // } System.out.println(" -- "); result = reportLineEao.revenueByPositionTypesAndDate(Arrays.asList(UNIT), parseDate("2010-06-01", "yyyy-MM-dd"), parseDate("2010-07-30", "yyyy-MM-dd"), Step.MONTH, true); assertEquals(2, result.size()); assertEquals(500.0, result.firstEntry().getValue().sumBy(INVOICE), 0.0001); assertEquals(-50.0, result.firstEntry().getValue().sumBy(ANNULATION_INVOICE), 0.0001); assertEquals(450.0, result.firstEntry().getValue().sum(), 0.0001); assertEquals(100.0, result.lastEntry().getValue().sumBy(INVOICE), 0.0001); assertEquals(0.0, result.lastEntry().getValue().sumBy(ANNULATION_INVOICE), 0.0001); assertEquals(100.0, result.lastEntry().getValue().sum(), 0.0001); for (Step step : Step.values()) { // Shortcut to test all steps. // System.out.println("-----"); // System.out.println(step); // System.out.println("-----"); result = reportLineEao.revenueByPositionTypesAndDate(Arrays.asList(UNIT), parseDate("2010-01-01", "yyyy-MM-dd"), parseDate("2010-12-31", "yyyy-MM-dd"), step, true); // for (Entry<Date, Revenue> e : result.entrySet()) { // System.out.println(step.format(e.getKey()) + "|" + DateFormats.ISO.format(e.getKey()) + " - " + e.getValue()); // } } em.getTransaction().commit(); } private ReportLine make(String isoDate, DocumentType docType, PositionType posType, double price) throws ParseException { Date date = DateUtils.parseDate(isoDate, "yyyy-MM-dd"); ReportLine line = ReportLine.builder() .name("PositionName") .description("PositionDescription") .dossierId(1) .dossierIdentifier("DW1") .documentType(docType) .documentId(1) .documentIdentifier("RE1") .positionType(posType) .customerId(1) .amount(1) .tax(0.19) .price(price) .afterTaxPrice(price * 0.19) .uniqueUnitId(1).build(); line.setActual(date); line.setReportingDate(date); line.setContractor(DELL); line.setSalesChannel(RETAILER); return line; } private ReportLine make(TradeName contractor, long productId, String contractorPartNo) { ReportLine line = generator.makeReportLine(); line.setPositionType(PositionType.UNIT); line.setContractor(contractor); line.setProductId(productId); line.setContractorPartNo(contractorPartNo); return line; } }