Search in sources :

Example 1 with CustomerDocument

use of eu.ggnet.dwoss.redtapext.ee.state.CustomerDocument in project dwoss by gg-net.

the class RedTapeGeneratorOperation method makeSalesDossiers.

/**
 * Generates a random amount of dossiers in a random valid state using already persisted elements like available units and product batches.
 * <p/>
 * @param amount
 * @return the list of generated dossiers.
 */
// TODO: Some usefull repayments would be nice.
public List<Dossier> makeSalesDossiers(int amount) {
    SubMonitor m = monitorFactory.newSubMonitor("Erzeuge " + amount + " Dossiers", amount);
    m.start();
    if (amount < 1)
        return Collections.EMPTY_LIST;
    List<CustomerMetaData> customers = customerService.allAsCustomerMetaData().stream().filter(c -> !c.getFlags().contains(SYSTEM_CUSTOMER)).collect(toList());
    if (customers.isEmpty())
        throw new RuntimeException("No Customers found, obviously there are non in the database");
    List<UniqueUnit> freeUniqueUnits = uniqueUnitAgent.findAllEager(UniqueUnit.class);
    List<Product> products = uniqueUnitAgent.findAllEager(Product.class);
    List<Dossier> dossiers = new ArrayList<>();
    for (int i = 0; i <= amount; i++) {
        CustomerMetaData customer = customers.get(R.nextInt(customers.size()));
        // Create a dossier on a random customer.
        Dossier dos = redTapeWorker.create(customer.getId(), R.nextBoolean(), "Generated by RedTapeGeneratorOperation.makeSalesDossiers()");
        Document doc = dos.getActiveDocuments(DocumentType.ORDER).get(0);
        // At least two positions.
        int noOfPositions = R.nextInt(10) + 2;
        Set<Long> productIds = new HashSet<>();
        for (int j = 0; j < noOfPositions; j++) {
            // Add Some units, but make sure, not only units are added.
            if (j < (noOfPositions - 2) && !freeUniqueUnits.isEmpty()) {
                UniqueUnit uu = null;
                while (uu == null && !freeUniqueUnits.isEmpty()) {
                    uu = freeUniqueUnits.remove(0);
                    StockUnit su = stockAgent.findStockUnitByUniqueUnitIdEager(uu.getId());
                    // Saftynet, so no unit is set double.
                    if (su == null || su.getLogicTransaction() != null)
                        uu = null;
                }
                if (uu == null)
                    continue;
                double price = uu.getPrice(PriceType.CUSTOMER);
                if (price < 0.001)
                    price = uu.getPrice(PriceType.RETAILER);
                if (price < 0.001)
                    price = 1111.11;
                Position pos = Position.builder().amount(1).type(PositionType.UNIT).uniqueUnitId(uu.getId()).uniqueUnitProductId(uu.getProduct().getId()).price(price).tax(doc.getSingleTax()).description(UniqueUnitFormater.toDetailedDiscriptionLine(uu)).name(UniqueUnitFormater.toPositionName(uu)).refurbishedId(uu.getIdentifier(REFURBISHED_ID)).build();
                doc.append(pos);
                continue;
            }
            double price = (R.nextInt(100000) + 100) / 100;
            switch(// Add a random position
            R.nextInt(3)) {
                case // Add a Product Batch
                0:
                    Product p;
                    int k = 0;
                    do {
                        p = products.get(R.nextInt(products.size()));
                        k++;
                        if (k > 10)
                            throw new RuntimeException("Could find a alternative product : p.size=" + products.size() + ", pids.size=" + productIds.size());
                    } while (productIds.contains(p.getId()));
                    productIds.add(p.getId());
                    doc.append(Position.builder().amount(R.nextInt(10) + 1).type(PositionType.PRODUCT_BATCH).uniqueUnitProductId(p.getId()).price(price).tax(doc.getSingleTax()).name(p.getName()).description(p.getDescription()).bookingAccount(postLedger.get(PositionType.PRODUCT_BATCH, doc.getTaxType()).orElse(null)).build());
                    break;
                case // Add a Service
                1:
                    doc.append(Position.builder().amount((R.nextInt(100) + 1) / 4.0).type(PositionType.SERVICE).price(price).tax(doc.getSingleTax()).name("Service").description("Service").bookingAccount(postLedger.get(PositionType.SERVICE, doc.getTaxType()).orElse(null)).build());
                    break;
                case // Add a comment
                2:
                    doc.append(Position.builder().amount(1).type(PositionType.COMMENT).name("Comment").description("Comment").bookingAccount(postLedger.get(PositionType.COMMENT, doc.getTaxType()).orElse(null)).build());
                    break;
            }
        }
        if (dos.isDispatch()) {
            // add the shipping costs.
            double price = (R.nextInt(10) + 1) * 10;
            doc.append(Position.builder().amount(1).type(PositionType.SHIPPING_COST).price(price).tax(doc.getSingleTax()).name("Versandkosten").description("Versandkosten").bookingAccount(postLedger.get(PositionType.SHIPPING_COST, doc.getTaxType()).orElse(null)).build());
        }
        // Break, if what we build is wrong.
        ValidationUtil.validate(doc);
        LOG.info("Preupdate document.id={}", doc.getId());
        doc = redTapeWorker.update(doc, null, "JUnit");
        for (int j = 0; j <= R.nextInt(4); j++) {
            CustomerDocument cd = new CustomerDocument(customer.getFlags(), doc, customer.getShippingCondition(), customer.getPaymentMethod());
            List<StateTransition<CustomerDocument>> transitions = redTapeWorker.getPossibleTransitions(cd);
            if (transitions.isEmpty())
                break;
            RedTapeStateTransition transition = (RedTapeStateTransition) transitions.get(R.nextInt(transitions.size()));
            if (transition.getHints().contains(RedTapeStateTransition.Hint.CREATES_ANNULATION_INVOICE) || transition.getHints().contains(RedTapeStateTransition.Hint.CREATES_CREDIT_MEMO))
                break;
            // Never fails.
            Reply<Document> reply = redTapeWorker.stateChange(cd, transition, "JUnit");
            if (reply.hasSucceded())
                doc = reply.getPayload();
            else {
                LOG.error("Fail on startChange {}", reply.getSummary());
                break;
            }
        }
        dossiers.add(doc.getDossier());
        m.worked(1, doc.getDossier().getIdentifier());
    }
    m.finish();
    return dossiers;
}
Also used : java.util(java.util) CustomerServiceBean(eu.ggnet.dwoss.customer.ee.CustomerServiceBean) PostLedger(eu.ggnet.dwoss.mandator.api.value.PostLedger) SubMonitor(eu.ggnet.dwoss.progress.SubMonitor) LoggerFactory(org.slf4j.LoggerFactory) RedTapeWorker(eu.ggnet.dwoss.redtapext.ee.RedTapeWorker) UniqueUnit(eu.ggnet.dwoss.uniqueunit.ee.entity.UniqueUnit) StateTransition(eu.ggnet.statemachine.StateTransition) SYSTEM_CUSTOMER(eu.ggnet.dwoss.rules.CustomerFlag.SYSTEM_CUSTOMER) Inject(javax.inject.Inject) StockAgent(eu.ggnet.dwoss.stock.ee.StockAgent) REQUIRES_NEW(javax.ejb.TransactionAttributeType.REQUIRES_NEW) DocumentType(eu.ggnet.dwoss.rules.DocumentType) ValidationUtil(eu.ggnet.dwoss.util.validation.ValidationUtil) UniqueUnitFormater(eu.ggnet.dwoss.uniqueunit.ee.format.UniqueUnitFormater) UniqueUnitAgent(eu.ggnet.dwoss.uniqueunit.ee.UniqueUnitAgent) Logger(org.slf4j.Logger) PriceType(eu.ggnet.dwoss.uniqueunit.ee.entity.PriceType) CustomerMetaData(eu.ggnet.dwoss.customer.opi.CustomerMetaData) StockUnit(eu.ggnet.dwoss.stock.ee.entity.StockUnit) PositionType(eu.ggnet.dwoss.rules.PositionType) REFURBISHED_ID(eu.ggnet.dwoss.uniqueunit.ee.entity.UniqueUnit.Identifier.REFURBISHED_ID) Collectors.toList(java.util.stream.Collectors.toList) RedTapeStateTransition(eu.ggnet.dwoss.redtapext.ee.state.RedTapeStateTransition) eu.ggnet.dwoss.redtape.ee.entity(eu.ggnet.dwoss.redtape.ee.entity) MonitorFactory(eu.ggnet.dwoss.progress.MonitorFactory) Reply(eu.ggnet.saft.api.Reply) Product(eu.ggnet.dwoss.uniqueunit.ee.entity.Product) CustomerDocument(eu.ggnet.dwoss.redtapext.ee.state.CustomerDocument) javax.ejb(javax.ejb) Product(eu.ggnet.dwoss.uniqueunit.ee.entity.Product) CustomerDocument(eu.ggnet.dwoss.redtapext.ee.state.CustomerDocument) RedTapeStateTransition(eu.ggnet.dwoss.redtapext.ee.state.RedTapeStateTransition) StockUnit(eu.ggnet.dwoss.stock.ee.entity.StockUnit) CustomerMetaData(eu.ggnet.dwoss.customer.opi.CustomerMetaData) SubMonitor(eu.ggnet.dwoss.progress.SubMonitor) StateTransition(eu.ggnet.statemachine.StateTransition) RedTapeStateTransition(eu.ggnet.dwoss.redtapext.ee.state.RedTapeStateTransition) UniqueUnit(eu.ggnet.dwoss.uniqueunit.ee.entity.UniqueUnit) CustomerDocument(eu.ggnet.dwoss.redtapext.ee.state.CustomerDocument)

Example 2 with CustomerDocument

use of eu.ggnet.dwoss.redtapext.ee.state.CustomerDocument in project dwoss by gg-net.

the class RedTapeStateOperationIT method testStateError.

/**
 * Test of create method, of class RedTapeWorkerOperation.
 * <p>
 * @throws java.lang.InterruptedException
 */
@Test
// Fails, but ... is this test even relevant anymore.
@Ignore
public void testStateError() throws InterruptedException {
    long customerId = customerGenerator.makeCustomer();
    // Generate Dossier
    Dossier dos1 = redTapeWorker.create(customerId, false, "Test");
    Document doc1 = dos1.getActiveDocuments(DocumentType.ORDER).get(0);
    assertThat(doc1).overridingErrorMessage("Expected active document Order, got null. Dossier: " + dos1.toMultiLine()).isNotNull();
    // Create Positions
    Position p1 = Position.builder().type(PositionType.COMMENT).name("OHO").description("Muh").build();
    Position p2 = Position.builder().type(PositionType.PRODUCT_BATCH).name("Muuuuh").description("Muhhhhh").uniqueUnitProductId(1).price(100).tax(0.19).amount(1).build();
    doc1.append(p1);
    doc1.append(p2);
    // update document
    doc1 = redTapeWorker.update(doc1, null, "Me");
    doc1 = redTapeWorker.stateChange(new CustomerDocument(new HashSet<>(), doc1, DEFAULT, ADVANCE_PAYMENT), RedTapeStateTransitions.I_PAY_AND_INVOICE, "Test").getPayload();
    assertTrue("Set " + doc1.getConditions() + " should contain " + Document.Condition.PAID, doc1.getConditions().contains(Document.Condition.PAID));
    assertEquals("Type should be Invoice", DocumentType.INVOICE, doc1.getType());
    doc1 = redTapeWorker.stateChange(new CustomerDocument(new HashSet<>(), doc1, DEFAULT, ADVANCE_PAYMENT), RedTapeStateTransitions.I_PICK_UP, "Test").getPayload();
    assertTrue("Set " + doc1.getConditions() + " should contain " + Document.Condition.PICKED_UP, doc1.getConditions().contains(Document.Condition.PICKED_UP));
    // Generate Dossier -- Now Sent
    dos1 = redTapeWorker.create(customerId, true, "Test");
    doc1 = dos1.getActiveDocuments(DocumentType.ORDER).get(0);
    assertThat(doc1).overridingErrorMessage("Expected active document Order, got null. Dossier: " + dos1.toMultiLine()).isNotNull();
    doc1.append(p1.partialClone());
    doc1.append(p2.partialClone());
    // update document
    doc1 = redTapeWorker.update(doc1, null, "Me");
    doc1 = redTapeWorker.stateChange(new CustomerDocument(new HashSet<>(), doc1, DEFAULT, ADVANCE_PAYMENT), RedTapeStateTransitions.II_PAY, "Test").getPayload();
    assertTrue("Set " + doc1.getConditions() + " should contain " + Document.Condition.PAID, doc1.getConditions().contains(Document.Condition.PAID));
    doc1 = redTapeWorker.stateChange(new CustomerDocument(new HashSet<>(), doc1, DEFAULT, ADVANCE_PAYMENT), RedTapeStateTransitions.II_SEND_AND_INVOICE, "Test").getPayload();
    assertTrue("Set " + doc1.getConditions() + " should contain " + Document.Condition.SENT, doc1.getConditions().contains(Document.Condition.SENT));
    assertEquals("Type should be Invoice", DocumentType.INVOICE, doc1.getType());
}
Also used : CustomerDocument(eu.ggnet.dwoss.redtapext.ee.state.CustomerDocument) CustomerDocument(eu.ggnet.dwoss.redtapext.ee.state.CustomerDocument) HashSet(java.util.HashSet) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 3 with CustomerDocument

use of eu.ggnet.dwoss.redtapext.ee.state.CustomerDocument in project dwoss by gg-net.

the class DocumentPrintAction method actionPerformed.

@Override
public void actionPerformed(ActionEvent e) {
    Ui.exec(() -> {
        // TODO: This is a very special case, there the Ui needs the result on construction. So the consumer pattern cannot be used.
        // This meeans, for now no progress display.
        JasperPrint print = Dl.remote().lookup(DocumentSupporter.class).render(document, type);
        CustomerMetaData customer = Dl.remote().lookup(CustomerService.class).asCustomerMetaData(customerId);
        boolean mailAvailable = customer.getEmail() != null && !customer.getEmail().trim().isEmpty();
        Ui.exec(() -> {
            Ui.build().parent(controller.getView()).swing().eval(() -> new JRViewerCask(print, document, type, mailAvailable)).opt().filter(c -> c.isCorrectlyBriefed()).ifPresent(c -> Ui.progress().call(() -> {
                CustomerDocument customerDocument = new CustomerDocument(customer.getFlags(), document, customer.getShippingCondition(), customer.getPaymentMethod());
                for (StateTransition<CustomerDocument> stateTransition : Dl.remote().lookup(RedTapeWorker.class).getPossibleTransitions(customerDocument)) {
                    RedTapeStateTransition redTapeStateTransition = (RedTapeStateTransition) stateTransition;
                    for (RedTapeStateTransition.Hint hint : redTapeStateTransition.getHints()) {
                        if (hint == RedTapeStateTransition.Hint.SENDED_INFORMATION) {
                            this.document = Optional.of(Dl.remote().lookup(RedTapeWorker.class).stateChange(customerDocument, redTapeStateTransition, Lookup.getDefault().lookup(Guardian.class).getUsername())).filter(Ui.failure()::handle).map(Reply::getPayload).orElse(document);
                        }
                    }
                }
                controller.reloadSelectionOnStateChange(Dl.remote().lookup(DocumentSupporter.class).briefed(document, Dl.local().lookup(Guardian.class).getUsername()));
                return null;
            }));
        });
    });
}
Also used : Lookup(org.openide.util.Lookup) JasperPrint(net.sf.jasperreports.engine.JasperPrint) CustomerService(eu.ggnet.dwoss.customer.opi.CustomerService) CustomerMetaData(eu.ggnet.dwoss.customer.opi.CustomerMetaData) DocumentViewType(eu.ggnet.dwoss.mandator.api.DocumentViewType) RedTapeWorker(eu.ggnet.dwoss.redtapext.ee.RedTapeWorker) RedTapeController(eu.ggnet.dwoss.redtapext.ui.cao.RedTapeController) Ui(eu.ggnet.saft.Ui) ActionEvent(java.awt.event.ActionEvent) StateTransition(eu.ggnet.statemachine.StateTransition) Dl(eu.ggnet.saft.Dl) Guardian(eu.ggnet.saft.core.auth.Guardian) AbstractAction(javax.swing.AbstractAction) RedTapeStateTransition(eu.ggnet.dwoss.redtapext.ee.state.RedTapeStateTransition) Document(eu.ggnet.dwoss.redtape.ee.entity.Document) DocumentSupporter(eu.ggnet.dwoss.redtapext.ee.DocumentSupporter) Reply(eu.ggnet.saft.api.Reply) Optional(java.util.Optional) CustomerDocument(eu.ggnet.dwoss.redtapext.ee.state.CustomerDocument) CustomerService(eu.ggnet.dwoss.customer.opi.CustomerService) RedTapeStateTransition(eu.ggnet.dwoss.redtapext.ee.state.RedTapeStateTransition) DocumentSupporter(eu.ggnet.dwoss.redtapext.ee.DocumentSupporter) CustomerMetaData(eu.ggnet.dwoss.customer.opi.CustomerMetaData) JasperPrint(net.sf.jasperreports.engine.JasperPrint) StateTransition(eu.ggnet.statemachine.StateTransition) RedTapeStateTransition(eu.ggnet.dwoss.redtapext.ee.state.RedTapeStateTransition) RedTapeWorker(eu.ggnet.dwoss.redtapext.ee.RedTapeWorker) CustomerDocument(eu.ggnet.dwoss.redtapext.ee.state.CustomerDocument)

Aggregations

CustomerDocument (eu.ggnet.dwoss.redtapext.ee.state.CustomerDocument)3 CustomerMetaData (eu.ggnet.dwoss.customer.opi.CustomerMetaData)2 RedTapeWorker (eu.ggnet.dwoss.redtapext.ee.RedTapeWorker)2 RedTapeStateTransition (eu.ggnet.dwoss.redtapext.ee.state.RedTapeStateTransition)2 Reply (eu.ggnet.saft.api.Reply)2 StateTransition (eu.ggnet.statemachine.StateTransition)2 CustomerServiceBean (eu.ggnet.dwoss.customer.ee.CustomerServiceBean)1 CustomerService (eu.ggnet.dwoss.customer.opi.CustomerService)1 DocumentViewType (eu.ggnet.dwoss.mandator.api.DocumentViewType)1 PostLedger (eu.ggnet.dwoss.mandator.api.value.PostLedger)1 MonitorFactory (eu.ggnet.dwoss.progress.MonitorFactory)1 SubMonitor (eu.ggnet.dwoss.progress.SubMonitor)1 eu.ggnet.dwoss.redtape.ee.entity (eu.ggnet.dwoss.redtape.ee.entity)1 Document (eu.ggnet.dwoss.redtape.ee.entity.Document)1 DocumentSupporter (eu.ggnet.dwoss.redtapext.ee.DocumentSupporter)1 RedTapeController (eu.ggnet.dwoss.redtapext.ui.cao.RedTapeController)1 SYSTEM_CUSTOMER (eu.ggnet.dwoss.rules.CustomerFlag.SYSTEM_CUSTOMER)1 DocumentType (eu.ggnet.dwoss.rules.DocumentType)1 PositionType (eu.ggnet.dwoss.rules.PositionType)1 StockAgent (eu.ggnet.dwoss.stock.ee.StockAgent)1