Beispiel #1
0
        public async Task CreateBillingRequest(List <BillingRequest> billingRequests)
        {
            foreach (var billing in billingRequests)
            {
                try
                {
                    var sapSystem = SapSystemHelper.GetSapSystemByBillingSystem(billing.BillingSystemId);
                    var validator = GetValidator(sapSystem);
                    validator.ValidateRequest(billing);
                    var billingRequest = GetMapper(sapSystem).MapDopplerBillingRequestToSapSaleOrder(billing);

                    _queuingService.AddToTaskQueue(
                        new SapTask
                    {
                        BillingRequest = billingRequest,
                        TaskType       = SapTaskEnum.BillingRequest
                    }
                        );
                }
                catch (Exception e)
                {
                    _logger.LogError($"Failed at generating billing request for user: {billing.Id}. Error: {e.Message}");
                    await _slackService.SendNotification($"Failed at generating billing request for user: {billing.Id}. Error: {e.Message}");
                }
            }
        }
Beispiel #2
0
        public async Task <InvoiceResponse> GetInvoiceByDopplerInvoiceIdAndOrigin(int billingSystemId, int dopplerInvoiceId, string origin)
        {
            var sapSystem = SapSystemHelper.GetSapSystemByBillingSystem(billingSystemId);
            var response  = await _sapServiceSettingsFactory.CreateHandler(sapSystem).TryGetInvoiceByInvoiceIdAndOrigin(dopplerInvoiceId, origin);

            return((response != null) ? GetMapper(sapSystem).MapToInvoice(response) : null);
        }
        public async Task <SapTaskResult> Handle(SapTask dequeuedTask)
        {
            try
            {
                var sapSystem = SapSystemHelper.GetSapSystemByBillingSystem(dequeuedTask.DopplerUser.BillingSystemId);

                var sapTaskHandler = _sapServiceSettingsFactory.CreateHandler(sapSystem);
                dequeuedTask = await sapTaskHandler.CreateBusinessPartnerFromDopplerUser(dequeuedTask);

                return(!dequeuedTask.ExistentBusinessPartner.CreateDate.HasValue ?
                       await CreateBusinessPartner(dequeuedTask, sapSystem) :
                       await UpdateBusinessPartner(dequeuedTask, sapSystem));
            }
            catch (Exception ex)
            {
                var exceptionMessage = $"Failed to create or update the Business Partner for the user: {(dequeuedTask.BusinessPartner?.CardCode ?? string.Empty)}. Error: {ex.Message}";

                _logger.LogError(ex, exceptionMessage);
                return(new SapTaskResult
                {
                    IsSuccessful = false,
                    IdUser = dequeuedTask.DopplerUser?.Id.ToString(),
                    SapResponseContent = exceptionMessage,
                    TaskName = "Create Or Update Business Partner"
                });
            }
        }
Beispiel #4
0
        public async Task <SapTaskResult> Handle(SapTask dequeuedTask)
        {
            var sapSystem = SapSystemHelper.GetSapSystemByBillingSystem(dequeuedTask.DopplerUser.BillingSystemId);

            var sapTaskHandler = _sapServiceSettingsFactory.CreateHandler(sapSystem);

            dequeuedTask = await sapTaskHandler.CreateBusinessPartnerFromDopplerUser(dequeuedTask);

            return(!dequeuedTask.ExistentBusinessPartner.CreateDate.HasValue ?
                   await CreateBusinessPartner(dequeuedTask, sapSystem) :
                   await UpdateBusinessPartner(dequeuedTask, sapSystem));
        }
Beispiel #5
0
        public async Task <SapTaskResult> Handle(SapTask dequeuedTask)
        {
            try
            {
                var sapSystem       = SapSystemHelper.GetSapSystemByBillingSystem(dequeuedTask.CreditNoteRequest.BillingSystemId);
                var sapTaskHandler  = _sapServiceSettingsFactory.CreateHandler(sapSystem);
                var existentInvoice = await sapTaskHandler.TryGetInvoiceByInvoiceIdAndOrigin(dequeuedTask.CreditNoteRequest.InvoiceId, "doppler");

                if (existentInvoice != null)
                {
                    var sapResponse = await CreateCreditNote(existentInvoice, dequeuedTask, sapSystem);

                    if (sapResponse.IsSuccessful)
                    {
                        if (dequeuedTask.CreditNoteRequest.Type == (int)CreditNoteEnum.Refund &&
                            dequeuedTask.CreditNoteRequest.TransactionApproved)
                        {
                            var response = JsonConvert.DeserializeObject <SapCreditNoteResponse>(sapResponse.SapResponseContent);
                            return(await SendOutgoingPaymentToSap(sapSystem, response, dequeuedTask.CreditNoteRequest.TransferReference));
                        }
                    }
                    else
                    {
                        _logger.LogError($"Credit Note could'n create to SAP because exists an error: '{sapResponse.SapResponseContent}'.");
                    }

                    return(sapResponse);
                }
                else
                {
                    return(new SapTaskResult
                    {
                        IsSuccessful = false,
                        IdUser = dequeuedTask.CreditNoteRequest?.ClientId.ToString(),
                        SapResponseContent = $"Credit Note could'n create to SAP because the invoice does not exist: '{dequeuedTask.CreditNoteRequest?.InvoiceId}'.",
                        TaskName = "Creating Credit Note Request"
                    });
                }
            }
            catch (Exception ex)
            {
                return(new SapTaskResult
                {
                    IsSuccessful = false,
                    IdUser = dequeuedTask.CreditNoteRequest?.ClientId.ToString(),
                    SapResponseContent = $"Error creating Credit Note for Invoice Id: '{ dequeuedTask.CreditNoteRequest.InvoiceId }'. Message: '{ ex.Message}'",
                    TaskName = "Creating Credit Note Request"
                });
            }
        }
        public async Task <SapTaskResult> Handle(SapTask dequeuedTask)
        {
            try
            {
                var origin          = dequeuedTask.BillingRequest.PlanType == 5 ? "relay" : "doppler";
                var sapSystem       = SapSystemHelper.GetSapSystemByBillingSystem(dequeuedTask.BillingRequest.BillingSystemId);
                var sapTaskHandler  = _sapServiceSettingsFactory.CreateHandler(sapSystem);
                var existentInvoice = dequeuedTask.BillingRequest.InvoiceId != 0 ? await sapTaskHandler.TryGetInvoiceByInvoiceIdAndOrigin(dequeuedTask.BillingRequest.InvoiceId, origin) : null;

                var sapResponse = (dequeuedTask.TaskType == Enums.SapTaskEnum.BillingRequest) ? await CreateInvoice(dequeuedTask, sapSystem) : await UpdateInvoice(dequeuedTask, sapSystem, existentInvoice);

                if (sapResponse.IsSuccessful)
                {
                    var serviceSetting = SapServiceSettings.GetSettings(_sapConfig, sapSystem);
                    if (serviceSetting.BillingConfig.NeedCreateIncomingPayments &&
                        dequeuedTask.BillingRequest.TransactionApproved)
                    {
                        var response = JsonConvert.DeserializeObject <SapSaleOrderInvoiceResponse>(sapResponse.SapResponseContent);
                        return(await SendIncomingPaymentToSap(serviceSetting, sapSystem, existentInvoice ?? response, dequeuedTask.BillingRequest.TransferReference, dequeuedTask.BillingRequest.PaymentDate));
                    }
                }
                else
                {
                    _logger.LogError($"Invoice/Sales Order could'n create to SAP because exists an error: '{sapResponse.SapResponseContent}'.");
                    var ss = dequeuedTask.TaskType;
                    return(new SapTaskResult
                    {
                        IsSuccessful = false,
                        SapResponseContent = $"Invoice/Sales Order could'n create to SAP because exists an error: '{sapResponse.SapResponseContent}'.",
                        TaskName = dequeuedTask.TaskType == Enums.SapTaskEnum.BillingRequest ? "Creating Billing Request" : "Updating Billing Request",
                        IdUser = dequeuedTask.BillingRequest?.UserId.ToString()
                    });
                }

                return(sapResponse);
            }
            catch (Exception ex)
            {
                return(new SapTaskResult
                {
                    IsSuccessful = false,
                    SapResponseContent = ex.Message,
                    TaskName = "Creating Billing Request",
                    IdUser = dequeuedTask.BillingRequest?.UserId.ToString()
                });
            }
        }
Beispiel #7
0
        public async Task <SapTaskResult> UpdatePaymentStatusHandle(SapTask dequeuedTask)
        {
            try
            {
                var sapSystem          = SapSystemHelper.GetSapSystemByBillingSystem(dequeuedTask.CreditNoteRequest.BillingSystemId);
                var sapTaskHandler     = _sapServiceSettingsFactory.CreateHandler(sapSystem);
                var existentCreditNote = await sapTaskHandler.TryGetCreditNoteByCreditNoteId(dequeuedTask.CreditNoteRequest.CreditNoteId);

                if (existentCreditNote == null)
                {
                    return(new SapTaskResult
                    {
                        IsSuccessful = false,
                        IdUser = dequeuedTask.CreditNoteRequest?.ClientId.ToString(),
                        SapResponseContent = $"Credit Note could'n update to SAP because the credit note does not exist: '{dequeuedTask.CreditNoteRequest.CreditNoteId}'.",
                        TaskName = "Updating Credit Note Request"
                    });
                }

                var sapResponse = await UpdateCreditNote(existentCreditNote, dequeuedTask, sapSystem);

                if (!sapResponse.IsSuccessful)
                {
                    _logger.LogError($"Credit Note could'n update to SAP because exists an error: '{sapResponse.SapResponseContent}'.");
                    return(sapResponse);
                }

                if (dequeuedTask.CreditNoteRequest.Type != (int)CreditNoteEnum.Refund || !dequeuedTask.CreditNoteRequest.TransactionApproved)
                {
                    _logger.LogError("The outgoing payment couldn't create in SAP because the type of the credit note  must be 'Refund' and the transaction approved: '{SapResponseContent}'", sapResponse.SapResponseContent);
                    return(sapResponse);
                }

                return(await SendOutgoingPaymentToSap(sapSystem, existentCreditNote, dequeuedTask.CreditNoteRequest.TransferReference));
            }
            catch (Exception ex)
            {
                return(new SapTaskResult
                {
                    IsSuccessful = false,
                    IdUser = dequeuedTask.CreditNoteRequest?.ClientId.ToString(),
                    SapResponseContent = $"Error updating Credit Note: '{ dequeuedTask.CreditNoteRequest.CreditNoteId }'. Message: '{ ex.Message }'",
                    TaskName = "Updating Credit Note Request"
                });
            }
        }
        public Task CreateOrUpdateBusinessPartner(DopplerUserDto dopplerUser)
        {
            var sapSystem = SapSystemHelper.GetSapSystemByBillingSystem(dopplerUser.BillingSystemId);

            if (!GetValidator(sapSystem).IsValid(dopplerUser, sapSystem, _sapConfig, out var userVerificationError))
            {
                throw new ValidationException(userVerificationError);
            }

            _logger.LogInformation($"Add to Task in Queue: {SapTaskEnum.CreateOrUpdateBusinessPartner}");
            _queuingService.AddToTaskQueue(
                new SapTask()
            {
                TaskType    = SapTaskEnum.CreateOrUpdateBusinessPartner,
                DopplerUser = dopplerUser
            }
                );

            return(Task.CompletedTask);
        }
Beispiel #9
0
        public async Task CancelCreditNote(CancelCreditNoteRequest cancelCreditNoteRequest)
        {
            try
            {
                var sapSystem = SapSystemHelper.GetSapSystemByBillingSystem(cancelCreditNoteRequest.BillingSystemId);
                var validator = GetValidator(sapSystem);
                validator.ValidateCancelCreditNote(cancelCreditNoteRequest);

                _queuingService.AddToTaskQueue(
                    new SapTask
                {
                    CancelCreditNoteRequest = cancelCreditNoteRequest,
                    TaskType = SapTaskEnum.CancelCreditNote
                }
                    );
            }
            catch (Exception e)
            {
                _logger.LogError($"Failed at cancel credit note request for invoice: {cancelCreditNoteRequest.CreditNoteId}.", e);
                await _slackService.SendNotification($"Failed at cancel credit note request for invoice: {cancelCreditNoteRequest.CreditNoteId}. Error: {e.Message}");
            }
        }
Beispiel #10
0
        public async Task UpdateCreditNotePaymentStatus(UpdateCreditNotePaymentStatusRequest updateCreditNotePaymentStatusRequest)
        {
            try
            {
                var sapSystem = SapSystemHelper.GetSapSystemByBillingSystem(updateCreditNotePaymentStatusRequest.BillingSystemId);
                var validator = GetValidator(sapSystem);
                validator.ValidateUpdateCreditNotePaymentStatusRequest(updateCreditNotePaymentStatusRequest);
                var creditNoteRequest = GetMapper(sapSystem).MapUpdateCreditNotePaymentStatusRequestToCreditNoteRequest(updateCreditNotePaymentStatusRequest);

                _queuingService.AddToTaskQueue(
                    new SapTask
                {
                    CreditNoteRequest = creditNoteRequest,
                    TaskType          = SapTaskEnum.UpdateCreditNote
                }
                    );
            }
            catch (Exception e)
            {
                _logger.LogError($"Failed at update credit note request for invoice: {updateCreditNotePaymentStatusRequest.CreditNoteId}.", e);
                await _slackService.SendNotification($"Failed at update credit note request for invoice: {updateCreditNotePaymentStatusRequest.CreditNoteId}. Error: {e.Message}");
            }
        }
Beispiel #11
0
        public async Task <SapTaskResult> CancelCreditNoteHandle(SapTask dequeuedTask)
        {
            try
            {
                var sapSystem          = SapSystemHelper.GetSapSystemByBillingSystem(dequeuedTask.CancelCreditNoteRequest.BillingSystemId);
                var sapTaskHandler     = _sapServiceSettingsFactory.CreateHandler(sapSystem);
                var existentCreditNote = await sapTaskHandler.TryGetCreditNoteByCreditNoteId(dequeuedTask.CancelCreditNoteRequest.CreditNoteId);

                if (existentCreditNote == null)
                {
                    return(new SapTaskResult
                    {
                        IsSuccessful = false,
                        SapResponseContent = $"Credit Note could'n cancel to SAP because the credit note does not exist: '{dequeuedTask.CancelCreditNoteRequest.CreditNoteId}'.",
                        TaskName = "Canceling Credit Note Request"
                    });
                }

                var sapResponse = await CancelCreditNote(existentCreditNote, dequeuedTask, sapSystem);

                if (!sapResponse.IsSuccessful)
                {
                    _logger.LogError($"Credit Note could'n cancel to SAP because exists an error: '{sapResponse.SapResponseContent}'.");
                }

                return(sapResponse);
            }
            catch (Exception ex)
            {
                return(new SapTaskResult
                {
                    IsSuccessful = false,
                    SapResponseContent = $"Error canceling Credit Note: '{ dequeuedTask.CancelCreditNoteRequest.CreditNoteId }'. Message: '{ ex.Message}'",
                    TaskName = "Canceling Credit Note Request"
                });
            }
        }
Beispiel #12
0
        public async Task <SapTaskResult> Handle(SapTask dequeuedTask)
        {
            try
            {
                var sapSystem       = SapSystemHelper.GetSapSystemByBillingSystem(dequeuedTask.BillingRequest.BillingSystemId);
                var sapTaskHandler  = _sapServiceSettingsFactory.CreateHandler(sapSystem);
                var businessPartner = await sapTaskHandler.TryGetBusinessPartner(dequeuedTask.BillingRequest.UserId, dequeuedTask.BillingRequest.FiscalID, dequeuedTask.BillingRequest.PlanType);

                var billingValidator = GetValidator(sapSystem);
                if (!billingValidator.CanCreate(businessPartner, dequeuedTask.BillingRequest))
                {
                    return(new SapTaskResult
                    {
                        IsSuccessful = false,
                        SapResponseContent = $"Failed at generating billing request for the user: {dequeuedTask.BillingRequest.UserId}.",
                        TaskName = "Creating Billing Request"
                    });
                }

                dequeuedTask.BillingRequest.CardCode = businessPartner.CardCode;

                var serviceSetting = SapServiceSettings.GetSettings(_sapConfig, sapSystem);
                var message        = new HttpRequestMessage
                {
                    RequestUri = new Uri($"{serviceSetting.BaseServerUrl}{serviceSetting.BillingConfig.Endpoint}"),
                    Content    = new StringContent(JsonConvert.SerializeObject(dequeuedTask.BillingRequest),
                                                   Encoding.UTF8,
                                                   "application/json"),
                    Method = HttpMethod.Post
                };

                var cookies = await sapTaskHandler.StartSession();

                message.Headers.Add("Cookie", cookies.B1Session);
                message.Headers.Add("Cookie", cookies.RouteId);

                var client      = _httpClientFactory.CreateClient();
                var sapResponse = await client.SendAsync(message);

                var responseContent = await sapResponse.Content.ReadAsStringAsync();

                if (sapResponse.IsSuccessStatusCode)
                {
                    if (serviceSetting.BillingConfig.NeedCreateIncomingPayments &&
                        dequeuedTask.BillingRequest.TransactionApproved)
                    {
                        responseContent = await sapResponse.Content.ReadAsStringAsync();

                        var response = JsonConvert.DeserializeObject <SapSaleOrderInvoiceResponse>(responseContent);
                        return(await SendIncomingPaymentToSap(serviceSetting, sapSystem, response, dequeuedTask.BillingRequest.TransferReference, cookies));
                    }
                }
                else
                {
                    _logger.LogError($"Invoice/Sales Order could'n create to SAP because exists an error: '{responseContent}'.");
                }

                return(new SapTaskResult
                {
                    IsSuccessful = sapResponse.IsSuccessStatusCode,
                    SapResponseContent = responseContent,
                    TaskName = "Creating Billing Request"
                });
            }
            catch (Exception ex)
            {
                return(new SapTaskResult
                {
                    IsSuccessful = false,
                    SapResponseContent = ex.Message,
                    TaskName = "Creating Billing Request"
                });
            }
        }