public IActionResult CreateCommercial([FromBody][Required] PostBOCommercialRequestDto data) { StatusResponseDto responseDto; try { /// <summary> /// Metodo para guardar request en logs /// </summary> _securityService.RequestLog("api/bo/commercials/CreateCommercial: " + JsonConvert.SerializeObject(data)); PostBOCommercialsRequestModel request = _mapper.Map <PostBOCommercialsRequestModel>(data); PostBOCommercialsResponseModel businessResponse = _boCommercialService.CreateCommercial(request); switch (businessResponse.Status) { case ResultStatus.SUCCESS: businessResponse.LinkAppAndroid = _config.GetValue <string>("AppAndroid:DownloadLink"); _notifier.Notify(new EmailData(EmailType.CommercialNew, businessResponse)); return(Ok()); case ResultStatus.BAD_REQUEST: return(BadRequest()); case ResultStatus.ACCESS_DENIED: return(StatusCode(StatusCodes.Status401Unauthorized)); case ResultStatus.NOT_AUTHORIZED: return(StatusCode(StatusCodes.Status403Forbidden)); case ResultStatus.NOT_NULL: case ResultStatus.COMMERCIAL_ROW_DUPLICATE: case ResultStatus.COMMERCIAL_ROW_DUPLICATE_EMAIL: case ResultStatus.COMMERCIAL_ROW_DUPLICATE_PEER: case ResultStatus.COMMERCIAL_ROW_DUPLICATE_PBX: case ResultStatus.COMMERCIAL_ROW_DUPLICATE_MOBILE: case ResultStatus.COMMERCIAL_ROW_DUPLICATE_SIEBELID: case ResultStatus.PEER_ALREADY_EXIST_IN_PBX: responseDto = _mapper.Map <StatusResponseDto>(businessResponse); return(StatusCode(StatusCodes.Status409Conflict, responseDto)); case ResultStatus.NOT_FOUND: return(NotFound()); case ResultStatus.CANNOT_CONNECT_TO_PBX: case ResultStatus.EXTERNAL_SERVICE_ERROR: responseDto = _mapper.Map <StatusResponseDto>(businessResponse); return(StatusCode(StatusCodes.Status503ServiceUnavailable, responseDto)); default: return(StatusCode(StatusCodes.Status500InternalServerError, businessResponse.Message)); } } catch (Exception e) { return(StatusCode(StatusCodes.Status500InternalServerError, e)); } }
/// <summary> /// <para> /// Da de alta el comercial pasado por parámetro <paramref name="commercialRequestModel"/>. /// </para> /// </summary> /// <param name="commercialRequestModel">Datos del comercial que debe ser dado de alta.</param> /// <returns> /// Modelo <see cref="PostBOCommercialsResponseModel"/> con los datos de la respuesta. /// </returns> public PostBOCommercialsResponseModel CreateCommercial(PostBOCommercialsRequestModel commercialRequestModel) { PostBOCommercialsResponseModel result = new PostBOCommercialsResponseModel { Status = ResultStatus.ERROR }; IDbContextTransaction dbTransaction = null; try { var context = _commercialRepository.GetContext(); using (dbTransaction = context.Database.BeginTransaction()) { // Generate random pass commercialRequestModel.CommercialPassword = (new Random().Next(10000000, 100000000)).ToString(); var toInsert = new Commercials() { Name = commercialRequestModel.CommercialName, Email = commercialRequestModel.CommercialEmail, PBXPhoneNumber = commercialRequestModel.PBXPhoneNumber, MobilePhoneNumber = commercialRequestModel.MobilePhoneNumber, Active = commercialRequestModel.Active, Password = _securityService.HashData(commercialRequestModel.CommercialPassword), Peer = GetPeer(), SiebelId = commercialRequestModel.SiebelId, PasswordChangeRequired = true, AlternativeCommercials = new List <AlternativeCommercials>() }; // Se da de alta en BD al nuevo comercial _commercialRepository.Insert(toInsert); _commercialRepository.Save(); foreach (AlternativeCommercialModel c in commercialRequestModel.Alternatives) { var alter = _commercialRepository.GetById(c.Commercial.CommercialId); toInsert.AlternativeCommercials.Add(new AlternativeCommercials() { CommercialId = toInsert.Id, AlternativeCommercialId = c.Commercial.CommercialId, Order = c.Order }); } // Se agregan los comerciales alternativos al nuevo comercial _commercialRepository.Save(); // Conexión a PBX PbxConnection pbxConnection = null; if (_pbxConnect) { pbxConnection = new PbxConnection(_pbxServer, _pbxUser, _pbxPwd, out string pbxMsg); // validacion instancia PBX if (pbxConnection == null) { dbTransaction.Rollback(); result.Status = ResultStatus.EXTERNAL_SERVICE_ERROR; result.Message = "[BOCommercialsService-CreateCommercial] Could not instantiate PBX"; return(result); } // validacion PBX inicializada if (!pbxConnection.IsInitialized()) { dbTransaction.Rollback(); result.Status = ResultStatus.CANNOT_CONNECT_TO_PBX; result.Message = "[BOCommercialsService-CreateCommercial] " + pbxMsg; return(result); } // petición a la PBX try { pbxConnection.New(toInsert.Peer, toInsert.Name, toInsert.Password, () => { }); } catch (AmiException ex) { dbTransaction.Rollback(); // Marchelo // No estoy de acuerdo con retonar este error (lo correcto es utilizar el "catch (AmiException amiEx)" mas abajo) // Simplemente lo dejo por consistencia con la capa HTTP. result.Status = ResultStatus.PEER_ALREADY_EXIST_IN_PBX; result.Message = "[BOCommercialsService-CreateCommercial] " + ex.Message; return(result); } } result.Status = ResultStatus.SUCCESS; result.Name = commercialRequestModel.CommercialName; result.Email = commercialRequestModel.CommercialEmail; result.Password = commercialRequestModel.CommercialPassword; result.Peer = toInsert.Peer; dbTransaction.Commit(); return(result); } } catch (DbUpdateException updEx) { if (dbTransaction != null) { dbTransaction.Rollback(); } SqlException sqlEx = updEx.GetBaseException() as SqlException; if (sqlEx != null) { switch (sqlEx.Number) { case 515: // NOT NULL values // Determino nombre de la columna que no acepta valor NULL // EJ: "Cannot insert the value NULL into column 'SiebelId', table 'InConcert.dbo.Commercials'." int indexStart = sqlEx.Message.IndexOf("'", 0) + 1; int indexEnd = sqlEx.Message.IndexOf("'", indexStart); string columName = sqlEx.Message[indexStart..indexEnd];
/// <summary> /// Consrtructor de EmailData. /// </summary> /// <param name="inEmailType">Enumerado indicando tipo de mail a crear.</param> /// <param name="inData">Objeto (segun el tipo de email) con los datos a usar en el asunto/cuerpo del mail.</param> public EmailData(EmailType inEmailType, object inData) { #region ImageHeaderAttachment string pathImageHeader = Path.Combine(Path.GetTempPath(), "BestBankEmailHeader.png"); if (!File.Exists(pathImageHeader)) { File.WriteAllBytes(pathImageHeader, Resources.BestBank_EmailHeader); } Guid imageHeaderId = Guid.NewGuid(); EmailAttachment attachmentHeader = new EmailAttachment { ContentId = imageHeaderId.ToString(), Inline = true, MediaType = new System.Net.Mime.ContentType("image/png"), Path = pathImageHeader, }; #endregion switch (inEmailType) { case EmailType.CommercialNew: // Image AppLogin Attachment string pathImageAppLogin = Path.Combine(Path.GetTempPath(), "BestBankAppLogin.jpg"); if (!File.Exists(pathImageAppLogin)) { File.WriteAllBytes(pathImageAppLogin, Resources.BestBank_AppLogin); } Guid imageAppLoginId = Guid.NewGuid(); EmailAttachment attachmentAppLogin = new EmailAttachment { ContentId = imageAppLoginId.ToString(), Inline = true, MediaType = new System.Net.Mime.ContentType("image/jpg"), Path = pathImageAppLogin, }; PostBOCommercialsResponseModel objCommercial = ((PostBOCommercialsResponseModel)inData); this.To = objCommercial.Email; this.Subject = "Registo na Contact APP do Best Bank"; this.Attachments = new List <EmailAttachment> { attachmentHeader, attachmentAppLogin }; this.Body = Resources.BestBank_EmailTemplate_CommercialNew .Replace("{USER_EMAIL}", objCommercial.Email) .Replace("{USER_NAME}", objCommercial.Name) .Replace("{USER_PASSWORD}", objCommercial.Password) .Replace("{USER_PEER}", objCommercial.Peer.ToString()) .Replace("{LINK_DOWNLOAD_APP}", objCommercial.LinkAppAndroid) .Replace("{IMAGE_APPLOGIN_SRC}", $"cid:{imageAppLoginId.ToString()}") .Replace("{IMAGE_SRC}", $"cid:{imageHeaderId.ToString()}"); break; case EmailType.CommercialPasswordNew: ForgotPasswordResponseModel objForgotPass = ((ForgotPasswordResponseModel)inData); this.To = objForgotPass.CommercialEmail; this.Subject = "Alteração de Password da Contact App do Banco Best."; this.Attachments = new List <EmailAttachment> { attachmentHeader }; this.Body = Resources.BestBank_EmailTemplate_CommercialNewPassword .Replace("{USER_NAME}", objForgotPass.CommercialName) .Replace("{USER_PASSWORD}", objForgotPass.CommercialPassword) .Replace("{IMAGE_SRC}", $"cid:{imageHeaderId.ToString()}"); break; case EmailType.SupervisorState: PatchBOSupervisorsRequestModel objSupervisor = ((PatchBOSupervisorsRequestModel)inData); this.To = objSupervisor.Email; this.Subject = "Supervisor de Aplicação"; this.Attachments = new List <EmailAttachment> { attachmentHeader }; this.Body = Resources.BestBank_EmailTemplate_SupervisorState .Replace("{SUPERVISOR_STATE}", objSupervisor.Approve ? "aprovado" : "rejeitado") .Replace("{IMAGE_SRC}", $"cid:{imageHeaderId.ToString()}"); break; } }