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));
            }
        }
Example #2
0
        /// <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];