Sheet: AutoCustomerRelationship

Obiettivo di questo modello è fornire una base per lo sviluppo di un plugin da inserire in una applicazione CPQ, area configurazione, che aiuti l' utente (di massima il commerciale o la segreteria commerciale) a gestire il rapporto con il Cliente sopratutto per quanto concerne l' interscambio di info che solitamente accompagnano un processo di Configurazione. Una applicazione CPQ solitamente vede operare insieme il CRM con il Configuratore: il CRM è l' archivio di appoggio per le informazioni anagrafiche dei Clienti, dei Prodotti, dei Listini, delle Offerte e dei Documenti mentre il configuratore è l' archivio di appoggio delle configurazioni commerciali e tecniche.

Durante il processo di configurazione possono nascere esigenze di acquisire informazioni sia da parte di chi configura sia da parte del Cliente: queste informazioni vengono solitamente scambiate via Email. Vediamo come si può impostare un modello di minima che consenta di automatizzare per quanto possibile questo interscambio di Email e, che comunque, ne faciliti la compilazione.

Funzionalità per predisporre richieste al Cliente da inviare via E-mail

Questa funzionalità prevede che chi compila la Configurazione possa memorizzare eventuali richieste di info che saranno poi inviate via Mail al Cliente per il quale si sta operando. Vengono rese disponibile le seguenti funzioni (queste funzioni non verranno documentate in quanto già ampiamente documentate nei Tutorials):

  • Add Request: inserimento di una nuova richiesta;
  • Update Request: aggiornamento di una richiesta già definita. Utile nel caso in cui si debbano fare più richieste allo stesso Cliente per la stessa Configurazione in momenti diversi;
  • Remove Request: cancellazione di una richiesta definita;

Cominciamo col definire la struttura che ci consente di memorizzare le richieste.

La struttura è rappresentata sul Box come elemento di tipo List e su DB-SQL da una tabella esattamente simmetrica (stesso nome, stesso nome e stessa tipologia per le colonne):

Elemento: ACR_EmailRequests

Colonne:

  • Key: chiave univoca dell' elemento. Di fatto una GUID;
  • ACR_Memo: identificativo della richiesta che viene proposto in automatico ma può essere modificato da chi configura. Questo dato sarà un riferimento che viene riportato nell' oggetto della Mail;
  • ACR_IdClient: identificativo CRM del Cliente per il quale si sta creando la Configurazione;
  • ACR_IdQuote: identificativo CRM dell' offerta a cui è associata la Configurazione;
  • ACR_RequestText: testo della richiesta;
  • ACR_Status: stato della richiesta. Vale not send se non ancora inviata via mail, send se già inviata;

 

Script SQL:

drop table ACR_EmailRequests;

create table ACR_EmailRequests(

[Key] varchar(60) not null,

ACR_Memo varchar(128),

ACR_IdClient varchar(60),

ACR_IdQuote varchar(60),

ACR_RequestText varchar(MAX),

ACR_Status varchar(12),

constraint [PK_Key] primary key clustered ([Key] ASC))

 

La creazione delle richieste avviene utilizzando un frame attivabile dall' applicazione di Configurazione tramite Command Button.

Segue il frame:

 

 

Tutti gli oggetti riportati sul frame sono definiti all' interno del Box AutoCustomerRelationship.

Questo frame può essere attivato da un qualunque punto dell' applicazione utilizzando la DR che segue:

 

ACR_ActivateAddRequestFrame

Attiva il Frame che consente di aggiungere nuove richieste.

 

 

GU_ContainerPageName
Node type: Assign
Assign value to / type: GU_ContainerPageName / String
Description (GU_ContainerPageName) : Contiene il nome del Frame da visualizzare
Value assigned: ACR_AddRequestFrame

 

GU_ContainerTitle
Node type: Assign
Assign value to / type: GU_ContainerTitle / String
Description (GU_ContainerTitle) : Contiene il titolo da riportare sulla testata del Frame
Value assigned: Requests for Client

 

GU_ContainerIcon
Node type: Assign
Assign value to / type: GU_ContainerIcon / String
Description (GU_ContainerIcon) : Contiene l' icona che viene riportata sulla testata del Frame
Value assigned: fas fa-grimace

 

GU_ContainerCloseMethod
Node type: Assign
Assign value to / type: GU_ContainerCloseMethod / String
Description (GU_ContainerCloseMethod) : Contiene il nome del Metodo che deve essere attivato alla chiusura del Frame
Value assigned:

 

GU_ContainerWidth
Node type: Assign
Assign value to / type: GU_ContainerWidth / String
Description (GU_ContainerWidth) : Definisce la dimensione in % del Frame rispetto alla pagina che lo attiva
Value assigned: 70%

 

GU_CreateFrame
Node type: Method
Procedure name: BBP_CreateFrame
Description: Crea il Frame indicato dai parametri
Param name / type / value: containerPageName / String / GU_ContainerPageName
Param name / type / value: containerIcon / String / GU_ContainerIcon
Param name / type / value: containerTitle / String / GU_ContainerTitle
Param name / type / value: containerCloseMethod / String / GU_ContainerCloseMethod
Param name / type / value: containerWidth / String / GU_ContainerWidth

 

 

 

Quando il frame viene visualizzato scatta l' evento When Init che attiva la regola:

 

ACR_InitAddRequestFrame

Inizializza il frame utilizzato per l' inserimento di nuove richieste. Il metodo ACR_InheritClientAndQuote dovrà essere definito in base al CRM a cui si aggancia l' applicazione di configurazione. Per poter testare la DR è stato inserito l' elemento Gu_ToBeDefined (di fatto una costante = false) che inibisce l' attivazione del metodo e attiva l' inizializzazione manuale dei parametri. Quando il metodo sarà scritto e disponibile, basterà eliminare questo booleano e il ramo di inizializzazione manuale;

 

 

GU_ToBeDefined
Node type: Element
Element name / type: GU_ToBeDefined / Boolean
Description: Utilizzato nelle DR per skippare rami di regole che contengono Metodi o Regole non definite. Settato per default a TRUE: di fatto è una costante;

 

ACR_InheritClientAndQuote
Node type: Method
Procedure name: To Define
Description: Eredita l' ID del Cliente e l' ID della Quote relativi alla Configurazione su cui si sta lavorando e inizializza le variabili ACR_IdClient e ACR_IdQUote

 

ACR_InitAutoMemo
Node type: Method
Procedure name: BBP_ElaborateString
Description: Costruisce il Memo come IdClient-IdQuote: l' utente potrà modificarlo manualmente
Param name / type / value: templateStringName / String / ACR_MemoTemplate
Param name / type / value: stringElementName / String / ACR_Memo

 

ACR_ReadRequestsOfQuote
Node type: Rule
Description: Legge le richieste dell' offerta in corso

 

ACR_IdClient
Node type: Assign
Assign value to / type: ACR_IdClient / String
Description (ACR_IdClient) : Identificativo CRM del Cliente per il quale si sta creando la Configurazione
Value assigned: CLI-00100

 

ACR_IdQuote
Node type: Assign
Assign value to / type: ACR_IdQuote / String
Description (ACR_IdQuote) : Identificativo CRM dell' offerta a cui è associata la Configurazione
Value assigned: QUO-00024

 

 

Invio delle Richieste via posta elettronica

Una volta preparate le richieste, possiamo ipotizzare che le stesse siano inoltrate ai Clienti vie Email in modalità automatica, senza richiesta di intervento da parte del Commerciale.

Questa attività può essere svolta da un motore che opera ad intervalli regolari di tempo in modalità background.

Di fatto deve:

  • Selezionare tutte le richieste non ancora inviate;
  • Comporre la testata della Mail;
  • Comporre il corpo della Mail;
  • inviare la Mail;

Possiamo iniziare ad impostare questo motore aiutandoci con un flusso che poi evolveremo.

 

ACR_SendMailFlow

Flusso invio richieste via e-mail

 

 

ACR_ReadRequestsNotSend
Node type: Rule
Description: Viene inizializzata la grid che definisce tutte le richieste non ancora inviate

 

ACR_ClearRequestsGrid
Node type: Method
Procedure name: ClearElement
Description: Esegue la Clear() sulla Grid delle richieste
Param name / type / value: elementName / String / ACR_EmailRequests

 

ACR_ReadNexSingleRequest
Node type: Method
Procedure name: BBP_IterateGrid
Description: Legge la prima richiesta disponibile: di fatto consente di iterare la Grid delle richieste;
Param name / type / value: gridElement / String / ACR_EmailRequests

 

StatusOfCall
Node type: Element
Element name / type: StatusOfCall / Boolean
Description: Stato di ritorno dalle chiamate SQL

 

ACR_DetailRequest
Node type: Rule
Description: Esplode la riga della richiesta sui singoli campi di dettaglio

 

ACR_SendRequestViaMail
Node type: Rule
Description: Predispone e invia la richiesta via Mail

 

 

ACR_ReadRequestsNotSend

Viene inizializzata la grid che definisce tutte le richieste non ancora inviate

 

 

GU_SqlWhereTmpl
Node type: Assign
Assign value to / type: GU_SqlWhereTmpl / String
Description (GU_SqlWhereTmpl) : Stringa contenente il template utile per costruire la Where Sql utilizzata per leggere da DB-SQL
Value assigned: ACR_Status = 'not send'

 

GU_CompileWhereSql
Node type: Method
Procedure name: BBP_ElaborateString
Description: Compila l where sql da utilizzare in lettura su DB-SQL
Param name / type / value: whereSqlTempl / String / GU_SqlWhereTmpl
Param name / type / value: whereSql / String / GU_SqlWhere

 

ACR_ResetRequestsGrid
Node type: Method
Procedure name: BBP_ResetElement
Description: Resetta il contenuto della grid ACR_EmailRequests
Param name / type / value: elementName / String / ACR_EmailRequests

 

ACR_ReadRequestsDefinedForQuote
Node type: Method
Procedure name: BBP_FillGridFromSqlTable
Description: Legge le richieste già definite per la configurazione/quote e non ancora inviate
Param name / type / value: containerSqlWhere / String / GU_SqlWhere
Param name / type / value: gridName / String / ACR_EmailRequests

 

 

ACR_DetailRequest

Esplode la riga della richiesta sui singoli campi di dettaglio

 

 

ACR_SelectedRequestDetail
Node type: Method
Procedure name: BBP_ReadSelectedRowFromGrid
Description: Riporta sul dettaglio i dati della richiesta selezionata sulla Grid
Param name / type / value: gridElement / String / ACR_EmailRequests

 

GU_ToBeDefined
Node type: Element
Element name / type: GU_ToBeDefined / Boolean
Description: Utilizzato nelle DR per skippare rami di regole che contengono Metodi o Regole non definite. Settato per default a FALSE: di fatto è una costante;

 

ACR_InheritDataMailOfClient
Node type: Method
Procedure name: To Define
Description: Eredita l' indirizzo e-mail del Cliente a cui va inviata la richiesta

 

GU_EmailTo
Node type: Assign
Assign value to / type: GU_EmailTo / String
Description (GU_EmailTo) : Elenco dei destinatari della mail. Ogni destinatario è separato da ';'
Value assigned: alberto.bonfiglioli@eleven-ks.it

 

 

ACR_SendRequestViaMail

Predispone e invia la richiesta via Mail

 

 

GU_Subject
Node type: Assign
Assign value to / type: GU_Subject / String
Description (GU_Subject) : Soggetto della Mail
Value assigned: ACR_Memo

 

GU_Body
Node type: Assign
Assign value to / type: GU_Body / String
Description (GU_Body) : Corpo della Mail
Value assigned: ACR_RequestText

 

ACR_SendRequestMailToClient
Node type: Method
Procedure name: BBP_SendMailMessageFromServer
Description: Invio richiesta con e-mail
Param name / type / value: subject / String / GU_Subject
Param name / type / value: message / String / GU_Body
Param name / type / value: emailTo / String / GU_EmailTo

 

StatusOfCall
Node type: Element
Element name / type: StatusOfCall / Boolean
Description: Stato di ritorno dalle chiamate SQL

 

ACR_Status
Node type: Assign
Assign value to / type: ACR_Status / List
Description (ACR_Status) : Stato della richiesta. Vale se non ancora inviata via mail, se già inviata
Value assigned: send

 

ACR_UpdateSelectedRequest
Node type: Method
Procedure name: BBP_UpdateRowInGridAndInSql
Description: Aggiorna la richiesta selezionata
Param name / type / value: gridName / String / ACR_EmailRequests

 

GU_MessageText
Node type: Assign
Assign value to / type: GU_MessageText / String
Description (GU_MessageText) : Testo del messaggio
Value assigned: Problemi in invio Mail

 

GU_ViewWarningMessage
Node type: Method
Procedure name: ViewMessage
Description: Visualizza un messaggio di avvertimento/errore
Param name / type / value: messageName / String / GU_WarningMessage
Param name / type / value: messageText / String / GU_MessageText