/* * Copyright (C) 2014 GG-Net GmbH - Oliver Günther * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package eu.ggnet.dwoss.redtape.state; import eu.ggnet.statemachine.StateMachine; import eu.ggnet.statemachine.State; import static eu.ggnet.dwoss.redtape.state.RedTapeStateTransitions.*; import static eu.ggnet.dwoss.redtape.state.RedTapeStates.*; /** * The RedTape State Machine. * Run this class to see a graph of all possible States and Transitions for RedTape. * <p/> * @author oliver.guenther */ public class RedTapeStateMachine extends StateMachine<CustomerDocument> { public State<CustomerDocument>[] I; public State<CustomerDocument>[] II; public State<CustomerDocument>[] III; public State<CustomerDocument>[] IV; public State<CustomerDocument>[] V; { I = new State[]{ I_CREATED_F000, I_CREATED_F001, I_CREATED_F010, I_CREATED_F011, I_CREATE_INVOICE, I_HAND_OVER_GOODS, SALE_COMPLETED }; I_Workflow(); I_DispatchChange(); I_PaymentMethodChange(); I_Cancel(); II = new State[]{ II_CREATED_F000, II_CREATED_F010, II_CREATED_F001, II_CREATED_F011, II_WAIT_FOR_MONEY_F000, II_WAIT_FOR_MONEY_F010, II_WAIT_FOR_MONEY_F001, II_WAIT_FOR_MONEY_F011, II_PREPARE_SHIPPING, II_CREATE_INVOICE, II_PREPARE_SHIPPING_INVOICED, SALE_COMPLETED }; II_Workflow(); II_DispatchChange(); II_PaymentMethodChange(); II_Cancel(); III = new State[]{ III_CREATED_F000, III_CREATED_F001, III_CREATED_F011, III_PAYMENT_CONTRACT_SENT_F000, III_PAYMENT_CONTRACT_SENT_F001, III_CREATED_PREPARE_SHIPPING_F010, III_PREPARE_SHIPPING_F011, III_WAIT_FOR_MONEY, III_WAIT_FOR_ORDER_CONFIRMATION_F011, SALE_COMPLETED }; III_Workflow(); III_PaymentMethodChange(); III_Cancel(); IV = new State[]{ IV_CREATED_F001, IV_CREATED_F011, IV_CREATED_PREPARE_SHIPPING_F000, IV_CREATED_PREPARE_SHIPPING_F010, IV_V_WAIT_FOR_MONEY_OR_EXECUTE_DIRECT_DEBIT, IV_PREPARE_SHIPPING_F0X1, IV_WAIT_FOR_ORDER_CONFIRMATION_F001, IV_WAIT_FOR_ORDER_CONFIRMATION_F011, SALE_COMPLETED }; V = new State[]{ V_CREATED_WAIT_FOR_PICKUP_F000, V_CREATED_WAIT_FOR_PICKUP_F001, V_CREATED_WAIT_FOR_PICKUP_F010, V_CREATED_WAIT_FOR_PICKUP_F011, IV_V_WAIT_FOR_MONEY_OR_EXECUTE_DIRECT_DEBIT, SALE_COMPLETED }; IV_V_Workflow(); IV_V_Cancel(); IV_DispatchChange(); IV_PaymentMethodChange(); V_DispatchChange(); V_PaymentMethodChange(); // --- After Sale add(SALE_COMPLETED, CREATE_COMPLAINT, COMPLAINT_CREATED); add(SALE_COMPLETED, CREATE_CREDIT_MEMO, CREDIT_MEMO_CREATED); add(SALE_COMPLETED, CREATE_ANNULATION_INVOICE, ANNULATION_INVOICE_CREATED); add(COMPLAINT_CREATED, REJECT_COMPLAINT, COMPLAINT_ABORTED); add(COMPLAINT_CREATED, WITHDRAW_COMPLAINT, COMPLAINT_ABORTED); add(COMPLAINT_CREATED, ACCEPT_COMPLAINT, COMPLAINT_ACCEPTED); add(COMPLAINT_ACCEPTED, CREATE_CREDIT_MEMO, CREDIT_MEMO_CREATED); add(COMPLAINT_ACCEPTED, CREATE_ANNULATION_INVOICE, ANNULATION_INVOICE_CREATED); add(ANNULATION_INVOICE_CREATED, BALANCED_REPAYMENT, REPAYMENT_BALLANCED); add(CREDIT_MEMO_CREATED, BALANCED_REPAYMENT, REPAYMENT_BALLANCED); // --- Returns and Capital Assets add(CREATED_CAPITAL_ASSET, COMPLETE_RETURN_CAPITAL_ASSET, COMPLETED_RETURNS_CAPITAL_ASSETS); add(CREATED_CAPITAL_ASSET, CANCEL, CANCELED); add(CREATED_RETURNS, COMPLETE_RETURN_CAPITAL_ASSET, COMPLETED_RETURNS_CAPITAL_ASSETS); add(CREATED_RETURNS, CANCEL, CANCELED); } private void I_Workflow() { add(I_CREATED_F000, I_PAY, I_CREATE_INVOICE); add(I_CREATED_F000, I_PAY_AND_INVOICE, I_HAND_OVER_GOODS); add(I_CREATED_F000, I_PAY_AND_INVOICE_PICK_UP, SALE_COMPLETED); add(I_CREATED_F001, I_PAY, I_CREATE_INVOICE); add(I_CREATED_F001, I_PAY_AND_INVOICE, I_HAND_OVER_GOODS); add(I_CREATED_F001, I_PAY_AND_INVOICE_PICK_UP, SALE_COMPLETED); add(I_CREATED_F010, I_PAY, I_CREATE_INVOICE); add(I_CREATED_F010, I_PAY_AND_INVOICE, I_HAND_OVER_GOODS); add(I_CREATED_F010, I_PAY_AND_INVOICE_PICK_UP, SALE_COMPLETED); add(I_CREATED_F011, I_PAY, I_CREATE_INVOICE); add(I_CREATED_F011, I_PAY_AND_INVOICE, I_HAND_OVER_GOODS); add(I_CREATED_F011, I_PAY_AND_INVOICE_PICK_UP, SALE_COMPLETED); add(I_CREATE_INVOICE, I_INVOICE, I_HAND_OVER_GOODS); add(I_HAND_OVER_GOODS, I_PICK_UP, SALE_COMPLETED); } private void I_DispatchChange() { add(I_CREATED_F000, I_SET_DISPATCH, II_CREATED_F000); add(I_CREATED_F001, I_SET_DISPATCH, II_CREATED_F001); add(I_CREATED_F010, I_SET_DISPATCH, II_CREATED_F010); add(I_CREATED_F011, I_SET_DISPATCH, II_CREATED_F011); } private void I_PaymentMethodChange() { add(I_CREATED_F000, I_SET_DIRECT_DEBIT, V_CREATED_WAIT_FOR_PICKUP_F000); add(I_CREATED_F001, I_SET_DIRECT_DEBIT, V_CREATED_WAIT_FOR_PICKUP_F001); add(I_CREATED_F010, I_SET_DIRECT_DEBIT, V_CREATED_WAIT_FOR_PICKUP_F010); add(I_CREATED_F011, I_SET_DIRECT_DEBIT, V_CREATED_WAIT_FOR_PICKUP_F011); add(I_CREATED_F000, I_SET_INVOICE, V_CREATED_WAIT_FOR_PICKUP_F000); add(I_CREATED_F001, I_SET_INVOICE, V_CREATED_WAIT_FOR_PICKUP_F001); add(I_CREATED_F010, I_SET_INVOICE, V_CREATED_WAIT_FOR_PICKUP_F010); add(I_CREATED_F011, I_SET_INVOICE, V_CREATED_WAIT_FOR_PICKUP_F011); } private void I_Cancel() { add(I_CREATED_F000, CANCEL, CANCELED); add(I_CREATED_F001, CANCEL, CANCELED); add(I_CREATED_F010, CANCEL, CANCELED); add(I_CREATED_F011, CANCEL, CANCELED); } private void II_Workflow() { add(II_CREATED_F000, II_BRIEF, II_WAIT_FOR_MONEY_F000); add(II_CREATED_F001, II_BRIEF, II_WAIT_FOR_MONEY_F001); add(II_CREATED_F010, II_BRIEF, II_WAIT_FOR_MONEY_F010); add(II_CREATED_F011, II_BRIEF, II_WAIT_FOR_MONEY_F011); add(II_WAIT_FOR_MONEY_F000, II_PAY, II_PREPARE_SHIPPING); add(II_WAIT_FOR_MONEY_F001, II_PAY, II_PREPARE_SHIPPING); add(II_WAIT_FOR_MONEY_F010, II_PAY, II_PREPARE_SHIPPING); add(II_WAIT_FOR_MONEY_F011, II_PAY, II_PREPARE_SHIPPING); add(II_PREPARE_SHIPPING, II_SEND_AND_INVOICE, SALE_COMPLETED); add(II_PREPARE_SHIPPING, II_SEND_WITHOUT_INVOICE, II_CREATE_INVOICE); add(II_PREPARE_SHIPPING, II_INVOICE_UNSHIPPED, II_PREPARE_SHIPPING_INVOICED); add(II_CREATE_INVOICE, II_INVOICE, SALE_COMPLETED); add(II_PREPARE_SHIPPING_INVOICED, II_SEND, SALE_COMPLETED); } private void II_DispatchChange() { add(II_CREATED_F000, II_SET_PICK_UP, I_CREATED_F000); add(II_CREATED_F001, II_SET_PICK_UP, I_CREATED_F001); add(II_CREATED_F010, II_SET_PICK_UP, I_CREATED_F010); add(II_CREATED_F011, II_SET_PICK_UP, I_CREATED_F011); add(II_WAIT_FOR_MONEY_F000, II_SET_PICK_UP, I_CREATED_F000); add(II_WAIT_FOR_MONEY_F001, II_SET_PICK_UP, I_CREATED_F001); add(II_WAIT_FOR_MONEY_F010, II_SET_PICK_UP, I_CREATED_F010); add(II_WAIT_FOR_MONEY_F011, II_SET_PICK_UP, I_CREATED_F011); } private void II_PaymentMethodChange() { add(II_CREATED_F000, II_SET_CASH_ON_DELIVERY_F01X, III_CREATED_F000); add(II_CREATED_F001, II_SET_CASH_ON_DELIVERY_F01X, III_CREATED_F001); add(II_CREATED_F010, II_SET_CASH_ON_DELIVERY_F010, III_CREATED_PREPARE_SHIPPING_F010); add(II_CREATED_F011, II_SET_CASH_ON_DELIVERY_F011, III_CREATED_F011); add(II_WAIT_FOR_MONEY_F000, II_SET_CASH_ON_DELIVERY_F01X, III_CREATED_F000); add(II_WAIT_FOR_MONEY_F001, II_SET_CASH_ON_DELIVERY_F01X, III_CREATED_F001); add(II_WAIT_FOR_MONEY_F010, II_SET_CASH_ON_DELIVERY_F010, III_CREATED_PREPARE_SHIPPING_F010); add(II_WAIT_FOR_MONEY_F011, II_SET_CASH_ON_DELIVERY_F011, III_CREATED_F011); add(II_CREATED_F000, II_SET_DIRECT_DEBIT_F0X0, IV_CREATED_PREPARE_SHIPPING_F000); add(II_CREATED_F001, II_SET_DIRECT_DEBIT_F0X1, IV_CREATED_F001); add(II_CREATED_F010, II_SET_DIRECT_DEBIT_F0X0, IV_CREATED_PREPARE_SHIPPING_F010); add(II_CREATED_F011, II_SET_DIRECT_DEBIT_F0X1, IV_CREATED_F011); add(II_WAIT_FOR_MONEY_F000, II_SET_DIRECT_DEBIT_F0X0, IV_CREATED_PREPARE_SHIPPING_F000); add(II_WAIT_FOR_MONEY_F001, II_SET_DIRECT_DEBIT_F0X1, IV_CREATED_F001); add(II_WAIT_FOR_MONEY_F010, II_SET_DIRECT_DEBIT_F0X0, IV_CREATED_PREPARE_SHIPPING_F010); add(II_WAIT_FOR_MONEY_F011, II_SET_DIRECT_DEBIT_F0X1, IV_CREATED_F011); add(II_CREATED_F000, II_SET_INVOICE_F0X0, IV_CREATED_PREPARE_SHIPPING_F000); add(II_CREATED_F001, II_SET_INVOICE_F0X1, IV_CREATED_F001); add(II_CREATED_F010, II_SET_INVOICE_F0X0, IV_CREATED_PREPARE_SHIPPING_F010); add(II_CREATED_F011, II_SET_INVOICE_F0X1, IV_CREATED_F011); add(II_WAIT_FOR_MONEY_F000, II_SET_INVOICE_F0X0, IV_CREATED_PREPARE_SHIPPING_F000); add(II_WAIT_FOR_MONEY_F001, II_SET_INVOICE_F0X1, IV_CREATED_F001); add(II_WAIT_FOR_MONEY_F010, II_SET_INVOICE_F0X0, IV_CREATED_PREPARE_SHIPPING_F010); add(II_WAIT_FOR_MONEY_F011, II_SET_INVOICE_F0X1, IV_CREATED_F011); } private void II_Cancel() { add(II_CREATED_F000, CANCEL, CANCELED); add(II_CREATED_F001, CANCEL, CANCELED); add(II_CREATED_F010, CANCEL, CANCELED); add(II_CREATED_F011, CANCEL, CANCELED); add(II_WAIT_FOR_MONEY_F000, CANCEL, CANCELED); add(II_WAIT_FOR_MONEY_F001, CANCEL, CANCELED); add(II_WAIT_FOR_MONEY_F010, CANCEL, CANCELED); add(II_WAIT_FOR_MONEY_F011, CANCEL, CANCELED); } private void III_Workflow() { add(III_CREATED_F000, SEND_PAYMENT_CONTRACT, III_PAYMENT_CONTRACT_SENT_F000); add(III_CREATED_F001, SEND_PAYMENT_CONTRACT, III_PAYMENT_CONTRACT_SENT_F001); add(III_CREATED_F011, III_IV_SEND_ORDER, III_WAIT_FOR_ORDER_CONFIRMATION_F011); add(III_CREATED_PREPARE_SHIPPING_F010, III_IV_SEND_AND_INVOICE, III_WAIT_FOR_MONEY); add(III_PAYMENT_CONTRACT_SENT_F000, III_CONFIRM_PAYMENT_CONTRACT_F000, III_CREATED_PREPARE_SHIPPING_F010); add(III_PAYMENT_CONTRACT_SENT_F001, III_CONFIRM_PAYMENT_CONTRACT_F001, III_CREATED_F011); add(III_WAIT_FOR_ORDER_CONFIRMATION_F011, III_IV_ORDER_CONFIRMED, III_PREPARE_SHIPPING_F011); add(III_PREPARE_SHIPPING_F011, III_IV_SEND_AND_INVOICE, III_WAIT_FOR_MONEY); add(III_WAIT_FOR_MONEY, III_IV_V_PAY, SALE_COMPLETED); } private void III_PaymentMethodChange() { add(III_CREATED_F000, III_SET_ADVANCE_PAYMENT, II_CREATED_F000); add(III_CREATED_F001, III_SET_ADVANCE_PAYMENT, II_CREATED_F001); add(III_CREATED_F011, III_SET_ADVANCE_PAYMENT, II_CREATED_F011); add(III_CREATED_PREPARE_SHIPPING_F010, III_SET_ADVANCE_PAYMENT, II_CREATED_F010); add(III_PAYMENT_CONTRACT_SENT_F000, III_SET_ADVANCE_PAYMENT, II_CREATED_F000); add(III_PAYMENT_CONTRACT_SENT_F001, III_SET_ADVANCE_PAYMENT, II_CREATED_F001); add(III_WAIT_FOR_ORDER_CONFIRMATION_F011, III_SET_ADVANCE_PAYMENT, II_CREATED_F011); add(III_CREATED_F000, III_SET_DIRECT_DEBIT_F0X0, IV_CREATED_PREPARE_SHIPPING_F000); add(III_CREATED_PREPARE_SHIPPING_F010, III_SET_DIRECT_DEBIT_F0X0, IV_CREATED_PREPARE_SHIPPING_F010); add(III_CREATED_F001, III_SET_DIRECT_DEBIT_F0X1, IV_CREATED_F001); add(III_CREATED_F011, III_SET_DIRECT_DEBIT_F0X1, IV_CREATED_F011); add(III_PAYMENT_CONTRACT_SENT_F000, III_SET_DIRECT_DEBIT_F0X0, IV_CREATED_PREPARE_SHIPPING_F000); add(III_PAYMENT_CONTRACT_SENT_F001, III_SET_DIRECT_DEBIT_F0X1, IV_CREATED_F001); add(III_WAIT_FOR_ORDER_CONFIRMATION_F011, III_SET_DIRECT_DEBIT_F0X1, IV_CREATED_F011); add(III_CREATED_F000, III_SET_INVOICE_F0X0, IV_CREATED_PREPARE_SHIPPING_F000); add(III_CREATED_PREPARE_SHIPPING_F010, III_SET_INVOICE_F0X0, IV_CREATED_PREPARE_SHIPPING_F010); add(III_CREATED_F001, III_SET_INVOICE_F0X1, IV_CREATED_F001); add(III_CREATED_F011, III_SET_INVOICE_F0X1, IV_CREATED_F011); add(III_PAYMENT_CONTRACT_SENT_F000, III_SET_INVOICE_F0X0, IV_CREATED_PREPARE_SHIPPING_F000); add(III_PAYMENT_CONTRACT_SENT_F001, III_SET_INVOICE_F0X1, IV_CREATED_F001); add(III_WAIT_FOR_ORDER_CONFIRMATION_F011, III_SET_INVOICE_F0X1, IV_CREATED_F011); } private void III_Cancel() { add(III_CREATED_F000, CANCEL, CANCELED); add(III_CREATED_F001, CANCEL, CANCELED); add(III_CREATED_F011, CANCEL, CANCELED); add(III_CREATED_PREPARE_SHIPPING_F010, CANCEL, CANCELED); add(III_PAYMENT_CONTRACT_SENT_F000, CANCEL, CANCELED); add(III_PAYMENT_CONTRACT_SENT_F001, CANCEL, CANCELED); add(III_WAIT_FOR_ORDER_CONFIRMATION_F011, CANCEL, CANCELED); } private void IV_V_Workflow() { add(IV_CREATED_F001, III_IV_SEND_ORDER, IV_WAIT_FOR_ORDER_CONFIRMATION_F001); add(IV_CREATED_F011, III_IV_SEND_ORDER, IV_WAIT_FOR_ORDER_CONFIRMATION_F011); add(IV_CREATED_PREPARE_SHIPPING_F000, III_IV_SEND_AND_INVOICE, IV_V_WAIT_FOR_MONEY_OR_EXECUTE_DIRECT_DEBIT); add(IV_CREATED_PREPARE_SHIPPING_F010, III_IV_SEND_AND_INVOICE, IV_V_WAIT_FOR_MONEY_OR_EXECUTE_DIRECT_DEBIT); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F001, III_IV_ORDER_CONFIRMED, IV_PREPARE_SHIPPING_F0X1); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F011, III_IV_ORDER_CONFIRMED, IV_PREPARE_SHIPPING_F0X1); add(IV_PREPARE_SHIPPING_F0X1, III_IV_SEND_AND_INVOICE, IV_V_WAIT_FOR_MONEY_OR_EXECUTE_DIRECT_DEBIT); add(V_CREATED_WAIT_FOR_PICKUP_F000, V_HAND_OVER_AND_INVOICE, IV_V_WAIT_FOR_MONEY_OR_EXECUTE_DIRECT_DEBIT); add(V_CREATED_WAIT_FOR_PICKUP_F001, V_HAND_OVER_AND_INVOICE, IV_V_WAIT_FOR_MONEY_OR_EXECUTE_DIRECT_DEBIT); add(V_CREATED_WAIT_FOR_PICKUP_F010, V_HAND_OVER_AND_INVOICE, IV_V_WAIT_FOR_MONEY_OR_EXECUTE_DIRECT_DEBIT); add(V_CREATED_WAIT_FOR_PICKUP_F011, V_HAND_OVER_AND_INVOICE, IV_V_WAIT_FOR_MONEY_OR_EXECUTE_DIRECT_DEBIT); add(IV_V_WAIT_FOR_MONEY_OR_EXECUTE_DIRECT_DEBIT, III_IV_V_PAY, SALE_COMPLETED); } private void IV_V_Cancel() { add(IV_CREATED_F001, CANCEL, CANCELED); add(IV_CREATED_F011, CANCEL, CANCELED); add(IV_CREATED_PREPARE_SHIPPING_F000, CANCEL, CANCELED); add(IV_CREATED_PREPARE_SHIPPING_F010, CANCEL, CANCELED); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F001, CANCEL, CANCELED); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F011, CANCEL, CANCELED); add(V_CREATED_WAIT_FOR_PICKUP_F000, CANCEL, CANCELED); add(V_CREATED_WAIT_FOR_PICKUP_F001, CANCEL, CANCELED); add(V_CREATED_WAIT_FOR_PICKUP_F010, CANCEL, CANCELED); add(V_CREATED_WAIT_FOR_PICKUP_F011, CANCEL, CANCELED); } private void IV_DispatchChange() { add(IV_CREATED_F001, IV_SET_PICK_UP, V_CREATED_WAIT_FOR_PICKUP_F001); add(IV_CREATED_F011, IV_SET_PICK_UP, V_CREATED_WAIT_FOR_PICKUP_F011); add(IV_CREATED_PREPARE_SHIPPING_F000, IV_SET_PICK_UP, V_CREATED_WAIT_FOR_PICKUP_F000); add(IV_CREATED_PREPARE_SHIPPING_F010, IV_SET_PICK_UP, V_CREATED_WAIT_FOR_PICKUP_F010); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F001, IV_SET_PICK_UP, V_CREATED_WAIT_FOR_PICKUP_F001); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F011, IV_SET_PICK_UP, V_CREATED_WAIT_FOR_PICKUP_F011); } private void V_DispatchChange() { add(V_CREATED_WAIT_FOR_PICKUP_F000, V_SET_DISPATCH_F0X0, IV_CREATED_PREPARE_SHIPPING_F000); add(V_CREATED_WAIT_FOR_PICKUP_F001, V_SET_DISPATCH_F0X1, IV_CREATED_F001); add(V_CREATED_WAIT_FOR_PICKUP_F010, V_SET_DISPATCH_F0X0, IV_CREATED_PREPARE_SHIPPING_F010); add(V_CREATED_WAIT_FOR_PICKUP_F011, V_SET_DISPATCH_F0X1, IV_CREATED_F011); } private void IV_PaymentMethodChange() { add(IV_CREATED_F001, IV_SET_ADVANCE_PAYMENT, II_CREATED_F001); add(IV_CREATED_F011, IV_SET_ADVANCE_PAYMENT, II_CREATED_F011); add(IV_CREATED_PREPARE_SHIPPING_F000, IV_SET_ADVANCE_PAYMENT, II_CREATED_F000); add(IV_CREATED_PREPARE_SHIPPING_F010, IV_SET_ADVANCE_PAYMENT, II_CREATED_F010); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F001, IV_SET_ADVANCE_PAYMENT, II_CREATED_F001); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F011, IV_SET_ADVANCE_PAYMENT, II_CREATED_F011); add(IV_CREATED_F001, IV_SET_CASH_ON_DELIVERY_F00X, III_CREATED_F001); add(IV_CREATED_F011, IV_SET_CASH_ON_DELIVERY_F011, III_CREATED_F011); add(IV_CREATED_PREPARE_SHIPPING_F000, IV_SET_CASH_ON_DELIVERY_F00X, III_CREATED_F001); add(IV_CREATED_PREPARE_SHIPPING_F010, IV_SET_CASH_ON_DELIVERY_F010, III_CREATED_PREPARE_SHIPPING_F010); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F001, IV_SET_CASH_ON_DELIVERY_F00X, III_CREATED_F001); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F011, IV_SET_CASH_ON_DELIVERY_F011, III_CREATED_F001); add(IV_CREATED_F001, IV_SET_INVOICE_F0X1, IV_CREATED_F001); add(IV_CREATED_F011, IV_SET_INVOICE_F0X1, IV_CREATED_F011); add(IV_CREATED_PREPARE_SHIPPING_F000, IV_SET_INVOICE_F0X0, IV_CREATED_PREPARE_SHIPPING_F000); add(IV_CREATED_PREPARE_SHIPPING_F010, IV_SET_INVOICE_F0X0, IV_CREATED_PREPARE_SHIPPING_F010); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F001, IV_SET_INVOICE_F0X1, IV_WAIT_FOR_ORDER_CONFIRMATION_F001); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F011, IV_SET_INVOICE_F0X1, IV_WAIT_FOR_ORDER_CONFIRMATION_F011); add(IV_CREATED_F001, IV_SET_DIRECT_DEBIT_F0X1, IV_CREATED_F001); add(IV_CREATED_F011, IV_SET_DIRECT_DEBIT_F0X1, IV_CREATED_F011); add(IV_CREATED_PREPARE_SHIPPING_F000, IV_SET_DIRECT_DEBIT_F0X0, IV_CREATED_PREPARE_SHIPPING_F000); add(IV_CREATED_PREPARE_SHIPPING_F010, IV_SET_DIRECT_DEBIT_F0X0, IV_CREATED_PREPARE_SHIPPING_F010); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F001, IV_SET_DIRECT_DEBIT_F0X1, IV_WAIT_FOR_ORDER_CONFIRMATION_F001); add(IV_WAIT_FOR_ORDER_CONFIRMATION_F011, IV_SET_DIRECT_DEBIT_F0X1, IV_WAIT_FOR_ORDER_CONFIRMATION_F011); } private void V_PaymentMethodChange() { add(V_CREATED_WAIT_FOR_PICKUP_F000, V_SET_ADVANCE_PAYMENT, I_CREATED_F000); add(V_CREATED_WAIT_FOR_PICKUP_F001, V_SET_ADVANCE_PAYMENT, I_CREATED_F001); add(V_CREATED_WAIT_FOR_PICKUP_F010, V_SET_ADVANCE_PAYMENT, I_CREATED_F010); add(V_CREATED_WAIT_FOR_PICKUP_F011, V_SET_ADVANCE_PAYMENT, I_CREATED_F011); add(V_CREATED_WAIT_FOR_PICKUP_F000, V_SET_INVOICE, V_CREATED_WAIT_FOR_PICKUP_F000); add(V_CREATED_WAIT_FOR_PICKUP_F001, V_SET_INVOICE, V_CREATED_WAIT_FOR_PICKUP_F001); add(V_CREATED_WAIT_FOR_PICKUP_F010, V_SET_INVOICE, V_CREATED_WAIT_FOR_PICKUP_F010); add(V_CREATED_WAIT_FOR_PICKUP_F011, V_SET_INVOICE, V_CREATED_WAIT_FOR_PICKUP_F011); add(V_CREATED_WAIT_FOR_PICKUP_F000, V_SET_DIRECT_DEBIT, V_CREATED_WAIT_FOR_PICKUP_F000); add(V_CREATED_WAIT_FOR_PICKUP_F001, V_SET_DIRECT_DEBIT, V_CREATED_WAIT_FOR_PICKUP_F001); add(V_CREATED_WAIT_FOR_PICKUP_F010, V_SET_DIRECT_DEBIT, V_CREATED_WAIT_FOR_PICKUP_F010); add(V_CREATED_WAIT_FOR_PICKUP_F011, V_SET_DIRECT_DEBIT, V_CREATED_WAIT_FOR_PICKUP_F011); } public RedTapeStateMachine() { super(new RedTapeStateCharacteristicFactory()); } public static void main(String[] args) { // Dossier dos = new Dossier(); // dos.setDispatch(false); // Document doc = new Document(); // doc.setType(Document.Type.ORDER); // dos.setPaymentMethod(PaymentMethod.ADVANCE_PAYMENT); // doc.setDirective(Document.Directive.WAIT_FOR_MONEY); // doc.add(Document.Condition.CREATED); // doc.setDossier(dos); // // CustomerDocument cd = new CustomerDocument(new HashSet<>(), doc, ShippingCondition.DEFAULT, PaymentMethod.DIRECT_DEBIT); RedTapeStateMachine om = new RedTapeStateMachine(); // Grapher.showExact(om,new RedTapeStateFormater() ,om.IV); // System.out.println(om.getState(cd)); } }