public string Add(Model.JobDetails payload) { MySqlCommand mySqlCmd = null; MySqlDataReader reader = null; try { DateTime date = DateTime.Parse(payload.deliveryDate); Dictionary <string, string> insertParam = new Dictionary <string, string>(); insertParam.Add("owner_id", payload.ownerUserId); insertParam.Add("job_type_id", payload.jobTypeId); insertParam.Add("amount", payload.amount.ToString()); insertParam.Add("partner_amount", payload.amountPartner.ToString()); insertParam.Add("cash_on_delivery", payload.cashOnDelivery ? "1" : "0"); insertParam.Add("worker_assistance", payload.workerAssistant.ToString()); insertParam.Add("assemble_bed", payload.assembleBed.ToString()); insertParam.Add("assemble_dining_table", payload.assembleDiningTable.ToString()); insertParam.Add("assemble_wardrobe", payload.assembleWardrobe.ToString()); insertParam.Add("assemble_office_table", payload.assembleOfficeTable.ToString()); insertParam.Add("bubble_wrapping", payload.bubbleWrapping.ToString()); insertParam.Add("shrink_wrapping", payload.shrinkWrapping.ToString()); insertParam.Add("fleet_type_id", payload.fleetTypeId); insertParam.Add("delivery_date", date.ToString("yyyy-MM-dd HH:mm:ss")); insertParam.Add("remarks", payload.remarks.ToString()); insertParam.Add("created_by", payload.createdBy); insertParam.Add("modify_by", payload.createdBy); mySqlCmd = GenerateAddCmd(TABLE_NAME_JOB, insertParam); PerformSqlNonQuery(mySqlCmd); return(mySqlCmd.LastInsertedId.ToString()); } catch (Exception e) { DBLogger.GetInstance().Log(DBLogger.ESeverity.Info, e.Message); DBLogger.GetInstance().Log(DBLogger.ESeverity.Info, e.StackTrace); } finally { CleanUp(reader, mySqlCmd); } return(null); }
public static void SendOrderReceived(string jobId, Model.User user, Model.JobDetails jobDetails, string fleetType, string jobType) { Task.Run(async() => { // send email String apiKey = ConfigurationManager.AppSettings.Get("SendGridApiKey"); dynamic sg = new SendGrid.SendGridAPIClient(apiKey); Email from = new Email("*****@*****.**", "JustLorry"); String subject = ConfigurationManager.AppSettings.Get("InvoiceSubject") + string.Format("(Payment received. Order ID: {0})", jobId); Email to = new Email("*****@*****.**", "JustLorry"); Content content = new Content("text/html", subject); Mail mail = new Mail(from, subject, to, content); mail.TemplateId = ConfigurationManager.AppSettings.Get("InvoiceTemplateId"); mail.Personalization[0].AddSubstitution("{{orderId}}", jobId); mail.Personalization[0].AddSubstitution("{{name}}", user.displayName); mail.Personalization[0].AddSubstitution("{{contact}}", user.contactNumber); mail.Personalization[0].AddSubstitution("{{email}}", user.email); mail.Personalization[0].AddSubstitution("{{date}}", jobDetails.deliveryDate); mail.Personalization[0].AddSubstitution("{{jobType}}", jobType); mail.Personalization[0].AddSubstitution("{{fleetType}}", fleetType); mail.Personalization[0].AddSubstitution("{{amount}}", jobDetails.amount.ToString()); mail.Personalization[0].AddSubstitution("{{paymentLink}}", ""); var addressFrom = jobDetails.addressFrom[0]; mail.Personalization[0].AddSubstitution("{{from}}", addressFrom.address1 + ", " + addressFrom.address2 + ", " + addressFrom.address3); try { var addressTo = jobDetails.addressTo[0]; if (addressTo != null) { mail.Personalization[0].AddSubstitution("{{to}}", addressTo.address1 + ", " + addressTo.address2 + ", " + addressTo.address3); } } catch (Exception) { mail.Personalization[0].AddSubstitution("{{to}}", ""); } dynamic response = await sg.client.mail.send.post(requestBody: mail.Get()); }); }
public static void SendOrderConfirmed(string jobUniqueId, Model.User user, Model.JobDetails jobDetails, Model.User driver, Model.Fleet fleet, Model.JobType jobType, Model.FleetType fleetType) { Task.Run(async() => { String apiKey = ConfigurationManager.AppSettings.Get("SendGridApiKey"); dynamic sg = new SendGrid.SendGridAPIClient(apiKey); Email from = new Email("*****@*****.**"); String subject = ConfigurationManager.AppSettings.Get("ConfirmSubject") + string.Format("(Order ID: {0})", jobUniqueId); Email to = new Email(user.email); Content content = new Content("text/html", subject); Mail mail = new Mail(from, subject, to, content); mail.TemplateId = ConfigurationManager.AppSettings.Get("ConfirmTemplateId"); mail.Personalization[0].AddSubstitution("{{orderId}}", jobUniqueId); mail.Personalization[0].AddSubstitution("{{date}}", jobDetails.deliveryDate); mail.Personalization[0].AddSubstitution("{{jobType}}", jobType.name); mail.Personalization[0].AddSubstitution("{{fleetType}}", fleetType.name); mail.Personalization[0].AddSubstitution("{{amount}}", jobDetails.amount.ToString()); mail.Personalization[0].AddSubstitution("{{driver}}", driver.displayName); mail.Personalization[0].AddSubstitution("{{driverContact}}", driver.contactNumber); mail.Personalization[0].AddSubstitution("{{driverIdentification}}", driver.identityCard); mail.Personalization[0].AddSubstitution("{{fleetRegistration}}", fleet.registrationNumber); var addressFrom = jobDetails.addressFrom[0]; mail.Personalization[0].AddSubstitution("{{from}}", addressFrom.address1 + ", " + addressFrom.address2 + ", " + addressFrom.address3); try { var addressTo = jobDetails.addressTo[0]; if (addressTo != null) { mail.Personalization[0].AddSubstitution("{{to}}", addressTo.address1 + ", " + addressTo.address2 + ", " + addressTo.address3); } } catch (Exception) { mail.Personalization[0].AddSubstitution("{{to}}", ""); } dynamic response = await sg.client.mail.send.post(requestBody: mail.Get()); }); }
public bool Update(Model.JobDetails payload) { MySqlCommand mySqlCmd = null; MySqlDataReader reader = null; try { DateTime date = DateTime.Parse(payload.deliveryDate); Dictionary <string, string> updateParam = new Dictionary <string, string>(); updateParam.Add("owner_id", payload.ownerUserId); updateParam.Add("job_type_id", payload.jobTypeId); updateParam.Add("amount", payload.amount.ToString()); updateParam.Add("cash_on_delivery", payload.cashOnDelivery ? "1" : "0"); updateParam.Add("fleet_type_id", payload.fleetTypeId); updateParam.Add("worker_assistance", payload.workerAssistant.ToString()); updateParam.Add("delivery_date", date.ToString("yyyy-MM-dd HH:mm:ss")); updateParam.Add("remarks", payload.remarks); updateParam.Add("modify_by", payload.modifiedBy); Dictionary <string, string> destinationParam = new Dictionary <string, string>(); destinationParam.Add("id", payload.jobId); mySqlCmd = GenerateEditCmd(TABLE_NAME_JOB, updateParam, destinationParam); return(PerformSqlNonQuery(mySqlCmd) != 0); } catch (Exception e) { DBLogger.GetInstance().Log(DBLogger.ESeverity.Info, e.Message); DBLogger.GetInstance().Log(DBLogger.ESeverity.Info, e.StackTrace); } finally { CleanUp(reader, mySqlCmd); } return(false); }
private Model.JobDetails getDetails(MySqlDataReader reader) { Model.JobDetails result = null; List <Model.Address> fromAddList = new List <Model.Address>(); List <Model.Address> toAddList = new List <Model.Address>(); while (reader.Read()) { if (result == null) { result = new Model.JobDetails() { jobId = reader["id"].ToString(), ownerUserId = reader["owner_id"].ToString(), jobTypeId = reader["job_type_id"].ToString(), fleetTypeId = reader["fleet_type_id"].ToString(), amount = (float)reader["amount"], amountPaid = (float)reader["amount_paid"], cashOnDelivery = (int)reader["cash_on_delivery"] == 0 ? false : true, workerAssistant = (int)reader["worker_assistance"], deliveryDate = reader.GetDateTime("delivery_date").ToString("yyyy-MM-dd HH:mm:ss"), remarks = (string)reader["remarks"], enabled = (int)reader["enabled"] == 0 ? false : true, deleted = (int)reader["deleted"] == 0 ? false : true, createdBy = reader["created_by"].ToString(), creationDate = reader.GetDateTime("creation_date").ToString("yyyy-MM-dd HH:mm:ss"), modifiedBy = reader["modify_by"].ToString(), lastModifiedDate = reader.GetDateTime("last_modified_date").ToString("yyyy-MM-dd HH:mm:ss"), jobStatusId = reader["job_status_id"] == null ? null : reader["job_status_id"].ToString(), amountPartner = reader.GetFloat("partner_amount"), assembleBed = (int)reader["assemble_bed"], assembleDiningTable = (int)reader["assemble_dining_table"], assembleWardrobe = (int)reader["assemble_wardrobe"], assembleOfficeTable = (int)reader["assemble_office_table"], bubbleWrapping = (int)reader["bubble_wrapping"], shrinkWrapping = (int)reader["shrink_wrapping"], addressFrom = new List <Model.Address>(), addressTo = new List <Model.Address>() }; } try { result.addressFrom.Add(new Model.Address() { addressId = reader["addFromId"].ToString(), address1 = (string)reader["add_from_1"], address2 = (string)reader["add_from_2"], address3 = (string)reader["add_from_3"], stateId = reader["state_from"].ToString(), countryId = reader["country_from"].ToString(), postcode = (string)reader["postcode_from"], gpsLongitude = (float)reader["longitude_from"], gpsLatitude = (float)reader["latitude_from"], contactPerson = (string)reader["customerFrom"], contact = (string)reader["contactFrom"] }); } catch (Exception) { // possible do not have from } try { result.addressTo.Add(new Model.Address() { addressId = reader["addToId"].ToString(), address1 = (string)reader["add_to_1"], address2 = (string)reader["add_to_2"], address3 = (string)reader["add_to_3"], stateId = reader["state_to"].ToString(), countryId = reader["country_to"].ToString(), postcode = (string)reader["postcode_to"], gpsLongitude = (float)reader["longitude_to"], gpsLatitude = (float)reader["latitude_to"], contactPerson = (string)reader["customerTo"], contact = (string)reader["contactTo"] }); } catch (Exception) { // possible do not have to } } return(result); }
public Response Post([FromBody] Model.JobDetails jobDetails, string promoCode = null) { try { // first add the user if not existed var userId = jobDetails.ownerUserId; var userObj = userDao.GetUserById(userId); if (userObj == null) { response = Utility.Utils.SetResponse(response, false, Constant.ErrorCode.EParameterError); return(response); } // validate the voucher if (promoCode != null) { var voucherResult = new Vouchers(); // TODO: bug here: as the amount pass in was discounted amount, so it might below the expected use amount // best way is not taking the amount required, and recalculate here to avoid injection attack var responseCode = validateVoucher(promoCode, jobDetails.amount, out voucherResult); if (responseCode != Constant.ErrorCode.ESuccess) { response = Utility.Utils.SetResponse(response, false, responseCode); return(response); } if (voucherDao.IncreaseUsedCount(promoCode) == false) { DBLogger.GetInstance().Log(DBLogger.ESeverity.Warning, "voucherDao.IncreaseUsedCount(promoCode) in Common controller: " + promoCode); response = Utility.Utils.SetResponse(response, false, Constant.ErrorCode.EVoucherNotValid); return(response); } } // get the gps coordinate if not passed in // get the state id and country id if not passed in foreach (Model.Address address in jobDetails.addressFrom) { if (address.gpsLongitude == 0 || address.gpsLatitude == 0 || address.stateId == null || address.countryId == null) { // request gps cordinate AddressComponents mapsObj = Utils.GetGpsCoordinate(address.address1, address.address2, address.address3, address.postcode); if (mapsObj == null) { // find from local database Postcode postcodeClass = new Postcode(); string nameLocal; var result = postcodeClass.PostcodeNameList.TryGetValue(address.postcode, out nameLocal); if (result == false) { response = Utility.Utils.SetResponse(response, false, Constant.ErrorCode.EGeneralError); return(response); } mapsObj = Utils.GetGpsCoordinate(nameLocal); } if (address.gpsLongitude == 0) { address.gpsLongitude = mapsObj.geometry.location.lng; } if (address.gpsLatitude == 0) { address.gpsLatitude = mapsObj.geometry.location.lat; } if (address.countryId == null) { var countryObj = countryDao.GetCountries().Find(t => t.name.Contains(mapsObj.address_components.Find(c => c.types.Contains("country")).long_name)); address.countryId = countryObj.countryId; } if (address.stateId == null) { var stateList = stateDao.GetByCountryId(address.countryId); try { var stateObj = stateList.Find(t => t.name.Contains(mapsObj.address_components.Find(a => a.types.Contains("administrative_area_level_1")).long_name)); if (stateObj == null) { // cannot find from google api, use local database Postcode postcodeClass = new Postcode(); string stateLocal; var localDic = postcodeClass.PostcodeList.TryGetValue(address.postcode, out stateLocal); address.stateId = stateList.Find(t => t.name.Contains(stateLocal)).stateId; } else { address.stateId = stateObj.stateId; } } catch (Exception) { // cannot find from google api, use local database Postcode postcodeClass = new Postcode(); string stateLocal; var localDic = postcodeClass.PostcodeList.TryGetValue(address.postcode, out stateLocal); address.stateId = stateList.Find(t => t.name.Contains(stateLocal)).stateId; } } } } if (jobDetails.addressTo == null) { jobDetails.addressTo = new List <Model.Address>(); } foreach (Model.Address address in jobDetails.addressTo) { if (address.gpsLongitude == 0 || address.gpsLatitude == 0 || address.stateId == null || address.countryId == null) { // request gps cordinate AddressComponents mapsObj = Utils.GetGpsCoordinate(address.address1, address.address2, address.address3, address.postcode); if (mapsObj == null) { // find from local database Postcode postcodeClass = new Postcode(); string nameLocal; var result = postcodeClass.PostcodeNameList.TryGetValue(address.postcode, out nameLocal); if (result == false) { response = Utility.Utils.SetResponse(response, false, Constant.ErrorCode.EGeneralError); return(response); } mapsObj = Utils.GetGpsCoordinate(nameLocal); } if (address.gpsLongitude == 0) { address.gpsLongitude = mapsObj.geometry.location.lng; } if (address.gpsLatitude == 0) { address.gpsLatitude = mapsObj.geometry.location.lat; } if (address.countryId == null) { var countryObj = countryDao.GetCountries().Find(t => t.name.Contains(mapsObj.address_components.Find(c => c.types.Contains("country")).long_name)); address.countryId = countryObj.countryId; } if (address.stateId == null) { var stateList = stateDao.GetByCountryId(address.countryId); try { var stateObj = stateList.Find(t => t.name.Contains(mapsObj.address_components.Find(a => a.types.Contains("administrative_area_level_1")).long_name)); if (stateObj == null) { // cannot find from google api, use local database Postcode postcodeClass = new Postcode(); string stateLocal; postcodeClass.PostcodeList.TryGetValue(address.postcode, out stateLocal); address.stateId = stateList.Find(t => t.name.Contains(stateLocal)).stateId; } else { address.stateId = stateObj.stateId; } } catch (Exception) { // cannot find from google api, use local database Postcode postcodeClass = new Postcode(); string stateLocal; postcodeClass.PostcodeList.TryGetValue(address.postcode, out stateLocal); address.stateId = stateList.Find(t => t.name.Contains(stateLocal)).stateId; } } } } // handle if partner amount is not present bool notifyPartners = false; if (jobDetails.amountPartner == 0) { if (jobDetails.jobTypeId == ((int)JustApi.Constants.Configuration.DeliveryJobType.Standard).ToString()) { // standard delivery // find the partner price for distance in this distance StandardDeliveryController tempController = new StandardDeliveryController(); var priceDetails = tempController.GetPrice(jobDetails.distance.ToString(), jobDetails.fleetTypeId, jobDetails.addressFrom[0].buildingType, jobDetails.addressTo[0].buildingType, jobDetails.workerAssistant.ToString(), jobDetails.assembleBed.ToString(), jobDetails.assembleDiningTable.ToString(), jobDetails.assembleWardrobe.ToString(), jobDetails.assembleOfficeTable.ToString(), jobDetails.bubbleWrapping.ToString(), jobDetails.shrinkWrapping.ToString()); jobDetails.amountPartner = priceDetails.partnerTotal; } else if (jobDetails.jobTypeId == ((int)JustApi.Constants.Configuration.DeliveryJobType.Disposal).ToString()) { // disposal DisposalDeliveryController tempController = new DisposalDeliveryController(); var priceDetails = tempController.GetPrice(jobDetails.fleetTypeId, jobDetails.addressFrom[0].buildingType, promoCode); jobDetails.amountPartner = priceDetails.partnerTotal; } } else { // only when admin add job then push notification // else notification push when user pay using payment gateway notifyPartners = true; } // add the job details jobDetails.createdBy = userId; jobDetails.modifiedBy = userId; var jobId = jobDetailsDao.Add(jobDetails); if (jobId == null) { response = Utility.Utils.SetResponse(response, false, Constant.ErrorCode.EGeneralError); return(response); } // add the job status if (null == jobDetailsDao.AddOrder(jobId, userId)) { response = Utility.Utils.SetResponse(response, false, Constant.ErrorCode.EGeneralError); return(response); } // add the address from, to foreach (Model.Address add in jobDetails.addressFrom) { add.createdBy = userId; var result = addressDao.Add(add, jobId, userObj.displayName, userObj.contactNumber, Dao.AddressDao.EType.From); if (result == null) { response = Utility.Utils.SetResponse(response, false, Constant.ErrorCode.EGeneralError); return(response); } } foreach (Model.Address add in jobDetails.addressTo) { add.createdBy = userId; var result = addressDao.Add(add, jobId, userObj.displayName, userObj.contactNumber, Dao.AddressDao.EType.To); if (result == null) { response = Utility.Utils.SetResponse(response, false, Constant.ErrorCode.EGeneralError); return(response); } } // generate the unique job id var uniqueId = Utils.EncodeUniqueId(jobId); // request the job payment PaymentController controller = new PaymentController(); var paymentReq = controller.Post(uniqueId); // send notification to creator var clientIdentifiers = userDao.GetDeviceIdentifier(userId); var msg = NotificationMsg.NewJob_Desc + uniqueId; if (clientIdentifiers != null && clientIdentifiers.Count != 0) { // user have app installed and identifier found, send push notification var extraData = Helper.PushNotification.ConstructExtraData(Helper.PushNotification.ECategories.OrderCreated, uniqueId); Utility.UtilNotification.BroadCastMessage(clientIdentifiers.ToArray(), extraData, NotificationMsg.NewJob_Title, msg); } if (ConfigurationManager.AppSettings.Get("Debug") != "0") { // send sms together because no history of push notification UtilSms.SendSms(userObj.contactNumber, msg); } // send email to user var fleetType = fleetTypeDao.Get(jobDetails.fleetTypeId); var jobType = jobTypeDao.Get().Find(t => t.jobTypeId == jobDetails.jobTypeId); UtilEmail.SendInvoice(uniqueId, (string)paymentReq.payload, userObj, jobDetails, fleetType.name, jobType.name); if (notifyPartners) { // update the job order status if (false == jobDeliveryDao.UpdateJobStatus(jobId, ((int)Constants.Configuration.JobStatus.PaymentVerifying).ToString())) { DBLogger.GetInstance().Log(DBLogger.ESeverity.Critical, string.Format("Unable to update job status. Job id: {0}", jobId)); } // send notification to partners var extraDataPartner = Helper.PushNotification.ConstructExtraData(Helper.PushNotification.ECategories.NewOpenJob, jobId); var partnerListIdentifiers = userDao.GetUserIdentifiersByRoleId(((int)Constants.Configuration.Role.CompanyAdmin).ToString()); if (int.Parse(jobDetails.jobTypeId) == (int)Constants.Configuration.DeliveryJobType.Standard) { Utility.UtilNotification.BroadCastMessage( partnerListIdentifiers.ToArray(), extraDataPartner, NotificationMsg.NewOpenJob_Title, NotificationMsg.NewOpenJob_Desc + string.Format("From: {0}\nTo: {1}\nAmount:{2}", jobDetails.addressFrom[0].address3, jobDetails.addressTo[0].address3, jobDetails.amountPartner) ); } else if (int.Parse(jobDetails.jobTypeId) == (int)Constants.Configuration.DeliveryJobType.Disposal) { Utility.UtilNotification.BroadCastMessage( partnerListIdentifiers.ToArray(), extraDataPartner, NotificationMsg.NewOpenJob_Title, NotificationMsg.NewOpenJob_Desc + string.Format("Dispose items from: {0}\nAmount:{1}", jobDetails.addressFrom[0].address3, jobDetails.amountPartner) ); } } response.payload = uniqueId; response = Utility.Utils.SetResponse(response, true, Constant.ErrorCode.ESuccess); return(response); } catch (Exception e) { DBLogger.GetInstance().Log(DBLogger.ESeverity.Error, e.Message); DBLogger.GetInstance().Log(DBLogger.ESeverity.Warning, e.StackTrace); response = Utility.Utils.SetResponse(response, false, Constant.ErrorCode.EUnknownError); return(response); } }
public static void SendInvoice(string jobUniqueId, string paymentUrl, Model.User user, Model.JobDetails jobDetails, string fleetType, string jobType) { Task.Run(async() => { try { // send email String apiKey = ConfigurationManager.AppSettings.Get("SendGridApiKey"); dynamic sg = new SendGrid.SendGridAPIClient(apiKey); Email from = new Email("*****@*****.**", "JustLorry"); String subject = ConfigurationManager.AppSettings.Get("InvoiceSubject") + string.Format("(Order ID: {0})", jobUniqueId); Email to = new Email(user.email, user.displayName); Content content = new Content("text/html", subject); Mail mail = new Mail(from, subject, to, content); mail.TemplateId = ConfigurationManager.AppSettings.Get("InvoiceTemplateId"); mail.Personalization[0].AddSubstitution("{{orderId}}", jobUniqueId); mail.Personalization[0].AddSubstitution("{{name}}", user.displayName); mail.Personalization[0].AddSubstitution("{{contact}}", user.contactNumber); mail.Personalization[0].AddSubstitution("{{email}}", user.email); mail.Personalization[0].AddSubstitution("{{date}}", jobDetails.deliveryDate); mail.Personalization[0].AddSubstitution("{{jobType}}", jobType); mail.Personalization[0].AddSubstitution("{{fleetType}}", fleetType); mail.Personalization[0].AddSubstitution("{{amount}}", jobDetails.amount.ToString()); mail.Personalization[0].AddSubstitution("{{paymentLink}}", paymentUrl); var addressFrom = jobDetails.addressFrom[0]; mail.Personalization[0].AddSubstitution("{{from}}", addressFrom.address1 + ", " + addressFrom.address2 + ", " + addressFrom.address3); try { var addressTo = jobDetails.addressTo[0]; if (addressTo != null) { mail.Personalization[0].AddSubstitution("{{to}}", addressTo.address1 + ", " + addressTo.address2 + ", " + addressTo.address3); } } catch (Exception) { mail.Personalization[0].AddSubstitution("{{to}}", ""); } dynamic response = await sg.client.mail.send.post(requestBody: mail.Get()); // send to self as multiple email not supported if (System.Configuration.ConfigurationManager.AppSettings["Debug"] == "0") { to = new Email("*****@*****.**"); } else { to = new Email("*****@*****.**"); } mail = new Mail(from, subject, to, content); mail.TemplateId = ConfigurationManager.AppSettings.Get("InvoiceTemplateId"); mail.Personalization[0].AddSubstitution("{{orderId}}", jobUniqueId); mail.Personalization[0].AddSubstitution("{{name}}", user.displayName); mail.Personalization[0].AddSubstitution("{{contact}}", user.contactNumber); mail.Personalization[0].AddSubstitution("{{email}}", user.email); mail.Personalization[0].AddSubstitution("{{date}}", jobDetails.deliveryDate); mail.Personalization[0].AddSubstitution("{{jobType}}", jobType); mail.Personalization[0].AddSubstitution("{{fleetType}}", fleetType); mail.Personalization[0].AddSubstitution("{{amount}}", jobDetails.amount.ToString()); mail.Personalization[0].AddSubstitution("{{paymentLink}}", paymentUrl); addressFrom = jobDetails.addressFrom[0]; mail.Personalization[0].AddSubstitution("{{from}}", addressFrom.address1 + ", " + addressFrom.address2 + ", " + addressFrom.address3); try { var addressTo = jobDetails.addressTo[0]; if (addressTo != null) { mail.Personalization[0].AddSubstitution("{{to}}", addressTo.address1 + ", " + addressTo.address2 + ", " + addressTo.address3); } } catch (Exception) { mail.Personalization[0].AddSubstitution("{{to}}", ""); } response = await sg.client.mail.send.post(requestBody: mail.Get()); } catch (Exception ex) { Console.WriteLine(ex); } }); }