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 |