Lead Manager

Da Webmobili Wiki.

Progetto che prevede API e Frontend,
il primo sviluppato in MVC e il secondo in Web Forms.

Configurazioni

Scadenze dei lead

Non ce ne ricordiamo mai.

  • Lead Pubblico : 5 giorni (120hours)
  • Lead Privato : 30 giorni (720hour)

Sono definiti nel file Web.config del progetto LeadManager.API

Password per Publish

Quando si esegue il deploy su Azure vengono richieste le seguenti password:

produzione
Progetto username password
LeadManager $leadman lWsBF5bqAQm0t3pjTk3onlphKFKadeeu4MXZGaKfCtDtilAJrbYtFfjlofmo
LeadManager API $leadmanapi HrE4xwlPSnpZh3BT9y1t13gNjlvt9v3kJ2XWbKCTNj5T8Jl0eNYjZmG3gzpj
LeadManager Admin $leadmanadmin mQg6JRZaP6Bajsskr9tRyMtqWNBqgZQ73f0vPRM2e5tb9kL5lkFdnkwxe1h6
staging
Progetto username password
LeadManager $leadmantest tYcDYbkhilS34g8oNz9sK2taK9fuzfsfAFuDf1X5jaLM5hMh1Zci7uwP26Eb
LeadManager API $leadmanapitest C3JiWBtxkvKGSc7t5k0ccYfvRmgmK2ZbtNotyvYyoY7HwoblfXyb1dnc0eMP

DevExpress

Il progetto utilizza l'estensione di Visual Studio DevExpress.

Per aggiornare i progetti della soluzione:

  • Farsi scaricare l'ultima versione da Mengoli (hanno loro l'account)
  • Runnare l'installer
  • Chiedere a Mengoli di inserire le credenziali (via TeamViewer)
  • Aprire Visual Studio
  • Extensions => DevExpress => Project Converter
  • Selezionare la versione nuova e seguire il wizard

https://docs.devexpress.com/GeneralInformation/2221/updates/upgrade-notes

Struttura

Il Frontend utilizza due livelli di astrazione: biz e dal.

  • biz : La logica applicativa, mette a disposizione i modelli e quando deve recuperare informazioni dal database si affida al livello inferiore dal
  • dal : Il livello basso, nel quale vengono chiamate le vere e proprie stored procedure.
  • entity: Definizione delle entità tabelle usato da dal

biz e dal sono veri e propri progetti nella soluzione.

Esempio di implementazione

Dovendo implementare la nuova configurazione che permette ai negozi di filtrare le richieste in base al budget,
vogliamo costruire da zero i livelli dal e biz seguendo la struttura del progetto.

Livello Entity

Nel progetto LeadManager.Entities creare un file NomeClasse.cs nel quale

  • creare una nuova classe NomeClasse : BaseEntity che definisca esattamente i campi della tabella come property
  • creare una nuova classe NomeClasse_List : BaseEntityList<NomeClasse>
  • creare una nuova classe NomeClasse_SearchParameters : BaseEntitySearchParameters con i filtri necessari per avere una get delle opzioni budget di una company
  • creare una nuova classe NomeClasse_ActionParameters : BaseEntityActionParameters
  • aggiungere la definizione delle enum che definiscono il tipo di filtro

Avendo NomeClasse come ConfigCompanyBudget:

public class ConfigCompanyBudget : BaseEntity {
	public int config_company_budgetID { get; set; }
	public int companyID { get; set; }
	public int? budgetID { get; set; }
}

public class ConfigCompanyBudget_List : BaseEntityList<ConfigCompanyBudget> {}

public class ConfigCompanyBudget_SearchParameters : BaseEntitySearchParameters {
	public int companyID { get; set; }
}

public class ConfigCompanyBudget_ActionParameters : BaseEntityActionParameters {}

public enum ConfigCompanyBudget_SearchType {
  CompleteSearch = 0,
  ListSelected_by_CompanyId = 1
}

public enum ConfigCompanyBudget_ActionType {}

È possibile definire delle enum

  • SearchType per specificare le tipologie di filtri di ricerca che verranno applicate prima di restituire la lista
  • ActionType per definire eventuali azioni custom che non sono tra quelle base (CRUD).

Livello DAL

Nel progetto LeadManager.Dal.sql
creare una classe che estenda tutte quelle appena definite nel livello entity.

public class ConfigCompanyBudgetDal : BaseDal<ConfigCompanyBudget>, IDataLayer<ConfigCompanyBudget, ConfigCompanyBudget_List,int,ConfigCompanyBudget_SearchParameters, ConfigCompanyBudget_ActionParameters>

col compilatore di VS implementare tutti i metodi astratti e di interfaccia con il default throw new NotImplementedException().
In generale ci sono i classici metodi CRUD: CREATE, READ, UPDATE, DELETE da implementare a seconda dell'occorrenza.

Il primo metodo da implementare è RecordToEntity(),
che definisce il modello base di ritorno.

protected override ConfigCompanyBudget RecordToEntity(SqlDataReader result, Hashtable MyOrdinals) {
	try {
		ConfigCompanyBudget MyEntity = new ConfigCompanyBudget {
			config_company_budgetID = ReadField_Integer(ref result, (int?)MyOrdinals["config_company_budgetID"]),
			companyID = ReadField_Integer(ref result, (int?)MyOrdinals["companyID"]),
			budgetID = ReadField_Integer(ref result, (int?)MyOrdinals["budgetID"])					
		};

		return MyEntity;
	}
	catch (Exception ex) {
		throw new Exceptions.LeadManager_DAL_Exception("Errore in " + global::System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
	}
}

Il secondo è List()
che fa la classica select.

public ConfigCompanyBudget_List List(ConfigCompanyBudget_SearchParameters MySearchCriteria, int PageIndex = 0, int PageSize = 100000) {
	string StoredProcedureName = "";
	SqlParameter[] MyParameters = null;

	switch (MySearchCriteria.SearchType) {
		case (int)ConfigCompanyBudget_SearchType.ListSelected_by_CompanyId:
			MyParameters = new SqlParameter[] {
				new SqlParameter("@companyid", SqlDbType.Int,4)  {Value = MySearchCriteria.companyID}
			};
			StoredProcedureName = "ConfigCompanyBudget_GetSelected_byCompany";
			break;
	}

	try {
		using (SqlDataReader result = SqlHelper.ExecSPForReader(ConnectionString, StoredProcedureName, MyParameters)) {
			ConfigCompanyBudget_List arrayoggetti = new ConfigCompanyBudget_List();
			Hashtable MyOrdinals = ReadOrdinals(result);
			while (result.Read()) {
				arrayoggetti.Add(RecordToEntity(result, MyOrdinals));
			}
			return arrayoggetti;
		}
	}
	catch (Exception ex) {
		throw new Exceptions.LeadManager_DAL_Exception("Errore in " + global::System.Reflection.MethodBase.GetCurrentMethod().Name + "- Stored Procedure: " + StoredProcedureName, ex);
	}
}

che sta utilizzando una stored procedure ConfigCompanyBudget_GetSelected_byCompany che andremo a definire sul database.

Il terzo è Add()
che fa la classica insert.

public ConfigCompanyBudget Add(ConfigCompanyBudget record) {
	string StoredProcedureName = "";
	SqlParameter[] MyParameters = null;
	
	MyParameters = new SqlParameter[] {
								new SqlParameter("@companyid", SqlDbType.Int,4)  {Value = record.companyID},
								new SqlParameter("@budgetid", SqlDbType.Int,4)  {Value = record.budgetID}
						};
	StoredProcedureName = "ConfigCompanyBudget_Add_byCompany";

	return record;
}

utilizzando una stored procedure ConfigCompanyBudget_Add_byCompany che andremo a definire sul database.

Metodo Action()

Si utilizza quando si devono implementare azioni diverse dalle standard CRUD.
Ognuna di queste azioni vengono identificate dalla enum con _ActionType definita nel livello entity.

public bool Action(LeadRequest record, LeadRequest_ActionParameters MyActionParameters) {
	string StoredProcedureName = "";
	SqlParameter[] MyParameters = null;

	switch (MyActionParameters.ActionType) {
	case (int)LeadRequest_ActionType.New_DBAdvice:
		// ... Gestione prima custom action
		break;
	case (int)LeadRequest_ActionType.Restore_Lead:
		// ... Gestione seconda custom action
		break;
	}

	try {
		if (SqlHelper.ExecSPNonQuery(ConnectionString, StoredProcedureName, MyParameters) > 0)
			return true;
		return false;
	}
	catch (Exception ex) {                
		throw new Exceptions.LeadManager_DAL_Exception("Errore in " + global::System.Reflection.MethodBase.GetCurrentMethod().Name + "- Stored Procedure: " + StoredProcedureName, ex);
	}
}

Database

Creare la nuova store procedure ConfigCompanyBudget_GetSelected_byCompany
che prenda come parametro @companyID
anche definito in ConfigCompanyBudget_SearchParameters
che restituisca tutte le configurazioni budget della company selezionata
nel formato della classe ConfigCompanyBudget_List.

Creare la nuova store procedure ConfigCompanyBudget_Add_byCompany allo stesso modo.

Livello Biz

Progetto LeadManager.BIZ
Questo livello fa da tramite tra l'applicazione e il dal.

Creare una classe ConfigCompanyBudgetBiz che estenda BaseBiz come questa:

public class ConfigCompanyBudgetBiz : BaseBiz<ConfigCompanyBudget,ConfigCompanyBudget_List,int,ConfigCompanyBudget_SearchParameters,ConfigCompanyBudget_ActionParameters>

la quale può implementare qualsiasi metodo andando ad attingere al livello dal per quanto riguarda le query.