How to use BPM for Idempiere: create a template

  • first of all we have to create the states of this process: request, sendpurchase order

1_createStates

  • create a new template for the business process
  • open the “process configurator” window and create new one like in the picture
  • insert some metadata

 

2_createTemplate

  • now pass in the “transaction” tab and create new lines fro each transaction: 1. contact -> request
  • insert an error message in case of transaction is blocked. In our example the transaction will blocked if the customer info is not inserted to theprocess window

3_transactionContactRequest

  • then open the condition tab and create the condition about the customer info. The knowledge of the database is recommended

4_conditionContactRequest

  • go back to the transaction tab and insert the others transaction: 2. request -> send

5_transactionSend

  • this transaction will be done only if the product requested by the customer has quantity > 16 items in the storage. Otherwise the transaction goes to “purchase order”
  • this transaction is a fork and in the process configurator is represented by two transaction from the same to different states.
  • in the condition on this transaction the product qty in the storage has to be > than 16

6_conditionSend

 

  • so we have to insert another condition line where we specified that the qtyOnHand must to be > than 16

 

6a_conditionSend

 

  • the next transaction: 3. request->purchase order

7_transactionPurchaseOrder

  • the transaction is verified only if the product qty in the storage is minor of 16

15_conditionRequestPurchase

BPM Idempiere: try the template and create the first instance of the process

In this demonstration we want to start some instance process using the purchase process template created before.

Try to start a process without inserting customer info. If we press on the “next step” button the system show us the error “no customer info” configurated on the template .

9_newInstanceProcess

10_error

Now we start other instance of the same template for seeing the next step of the process.

Try to insert inside the process window a product with a qty<15 in the storage. If we press the “next step” button the system automatically bring the process on the “purchase order” state (as we have configured in the process configurator)

13_POTransactionProductQty

If we try to insert inside the process window a product with a qty>15 in the storage and press the “next step” button the system automatically bring the process on the “send” state (as we have configured in the process configurator)

 

12_sendTransactionProductrQty

 

at the finish we can check all the process state history inside the process window

14_history

Adempiere BPM – Caso d’uso: gestione processo per un’azienda di logistica

Con questo tutorial mostreremo come configurare un processo per un’azienda di logistica con Adempiere process Configurator. Il motore BPM creato sul gestionale Adempiere 380.

processo logistics company

Il processo prevede 5 stati. Dal “pick up” presso il cliente alla spedizione verso “big warehouse” nel caso in cui il prodotto pesi più di 100 kg, o verso “small warehouse” nel caso in cui il prodotto pesi meno di 100 kg.

Primo step

Customizzazione della finestra per la gestione del processo a partire dal processo templateBusiness Process Configurator”.

Secondo step

Creazione del flusso operativo ed utilizzo da parte di un operatore.

per informazioni contattate: info @ informaticagestionale.it

Adempiere Process Configurator (BPM) su Adempiere 380

Informaticagestionale.it con il suo team di lavoro ha appena rilasciato Adempiere Process Configurator per la versione 380.

Il configuratore di processo di Adempiere può essere utilizzato anche stand-alone, quindi, senza l’integrazione con gli altri moduli ERP.

Punti chiave del configuratore di processo:

  1. disegno dei processi aziendali
  2. implementazione dei workflow operativi con stati e transazioni
  3. implementazione delle condizioni per il passaggio da uno stato all’altro completamente integrate nel sistema ERP. (in ogni condizione è possibile selezionare qualsiasi tabella e colonna dell’ERP. In questo modo è possibile creare condizioni sulle tabelle delle anagrafiche clienti)
  4. storico per ogni avanzamento di processo
  5. gestione delle ramificazioni dei processi in base alle condizioni verificate
  6. facilmente customizzabile per qualsiasi tipo di processo: possibilità di personalizzare le maschere ed adattarle al proprio processo.
  7. gestione delle eccezioni di processo
  8. semplice e veloce implementazione dei processi disponibili in tempo reale su tutta l’azienda

Obiettivi del configuratore di processo:

  1. ottimizzazione dei processi aziendali
  2. standardizzazione dei processi
  3. riduzione dei tempi e dei costi di processo
  4. controllo puntuale su tutti i processi operativi
  5. gli operatori dovranno soltanto eseguire il proprio lavoro e poi cliccare sulla maschera “avanza processo“. Al resto ci pensa il sistema. Oltre ad avere tutte le informazioni sulla maschera (il sistema avvisa l’operatore nel caso in cui manchino i dati) l’applicativo gestisce l’avanzamento degli stati senza creare spiacevoli eccezioni.
  6. Ottimizzzione dei flussi informativi aziendali

per informazioni contattateci: info @ informaticagestionale.it

Sviluppo nuove customizzazioni su Adempiere, massima flessibilità e semplicità

Adempiere mette a disposizione degli sviluppatori alcuni tool che semplificano il processo di implementazione.

Se si vuole sviluppare una nuova feature la prima cosa da fare è modellizzare il database e creare lo strato di persistenza model all’interno del codice sorgente.

Come possiamo vedere dall’implementazione del configuratore di processo sono state create le classi model con i metodi modifiers getter e setter per la gestione dei dati. Queste classi rispecchiano il modello dati esistente sul database.

Ad esempio CP_ConfProc.java corrisponde alla tabella cp_confproc sul database, CP_ProcessFlow.java corrisponde alla tabella CP_ProcessFlow e così via.

Adempiere mette a disposizione degli sviluppatori alcuni strumenti che rendono più semplice e controllato lo sviluppo della parte model dell’applicazione. Basta quindi “costruire” il database della customizzazione (ricordarsi lo standard di implementazione delle tabelle: inserire il prefisso che ricoda il tipo di customizzazione e le colonne che devono essere obbligatoriamente presenti in ogni tabella).

Dal database è possibile “costruire” il “modello” dell’applicazione grazie ad una classe utility: /src/org/adempoiere/util/GenerateModel.java

Questa funzione permette la costruzione di tutte le classi che hanno come prefisso X_ e le interfaccie con prefisso I_ con i relativi getter e setter associati rispettivamente alla tabella ed alle colonne della customizzazione.

Le classi X_CP_ConfProc.java e I_CP_ConfProc.java sono autogenerate dal GenerateModel.

sezione del GenerateModel.java

    String tableLike = null;
    tableLike = "'%'";  //  All tables
    // tableLike = "'AD_OrgInfo', 'AD_Role', 'C_CashLine', 'C_Currency', 'C_Invoice', 'C_Order', 'C_Payment', 'M_InventoryLine', 'M_PriceList', 'M_Product', 'U_POSTerminal'";  //  Only specific tables
    if (args.length > 3)
      tableLike = args[3];
    log.info("Table Like: " + tableLike);

    //  complete sql
    sql.insert(0, "SELECT AD_Table_ID "
      + "FROM AD_Table "
      + "WHERE (TableName IN ('RV_WarehousePrice','RV_BPartner')"  //  special views
      + " OR IsView='N')"
      + " AND IsActive = 'Y' AND TableName NOT LIKE '%_Trl' AND ");
    // Autodetect if we need to use IN or LIKE clause - teo_sarca [ 3020640 ]
    if (tableLike.indexOf(",") == -1)
      sql.append(" AND TableName LIKE ").append(tableLike);
    else
      sql.append(" AND TableName IN (").append(tableLike).append(")"); // only specific tables

    sql.append(" ORDER BY TableName");
    
    //
    int count = 0;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    try
    {
      pstmt = DB.prepareStatement(sql.toString(), null);
      rs = pstmt.executeQuery();
      while (rs.next())
      {
        new ModelInterfaceGenerator(rs.getInt(1), directory, packageName);
        new ModelClassGenerator(rs.getInt(1), directory, packageName);
        count++;
      }
     }
    catch (Exception e)
    {
      log.log(Level.SEVERE, sql.toString(), e);
    }
    finally
    {
      DB.close(rs, pstmt);
      rs = null; pstmt = null;
    }
    log.info("Generated = " + count);
  }