public async Task <List <ClientBilling> > GetBillingForClientsAsync(List <Client> clients, DateTime startDate, DateTime endDate) { try { string sessionId = ""; AdescomCTMSoapWrapper atmanCTMWithoutProxyClassesClient = new AdescomCTMSoapWrapper(_configuration); BillingQueryOptions billingQueryOptions = new BillingQueryOptions() { incoming = false, outgoing = true, includeZeroDuration = false }; ConcurrentBag <ClientBilling> clientsBillings = new ConcurrentBag <ClientBilling>(); sessionId = await atmanCTMWithoutProxyClassesClient.LoginAsync( _configuration.GetValue <string>("WebServiceConnectionSettings:ResellerLogin"), _configuration.GetValue <string>("WebServiceConnectionSettings:ResellerPassword"), _configuration.GetValue <int>("WebServiceConnectionSettings:SessionTimeout")); Parallel.ForEach(clients, new ParallelOptions { MaxDegreeOfParallelism = 20 }, (client) => { GetBillingForClient(startDate, endDate, client, atmanCTMWithoutProxyClassesClient, billingQueryOptions, clientsBillings); }); await atmanCTMWithoutProxyClassesClient.LogoutAsync(sessionId); return(clientsBillings.ToList()); } catch (AggregateException ex) { throw new Exception(ex.InnerException.Message); } }
private async void GetBillingForClient(DateTime fromDate, DateTime toDate, Client client, AdescomCTMSoapWrapper atmanCTMWithoutProxyClassesClient, BillingQueryOptions billingQueryOptions, ConcurrentBag <ClientBilling> clientsBillings) { try { List <BillingRecord> billingRecords = new List <BillingRecord>(); BillingRecordsArrayEx billingRecordsArrayEx = atmanCTMWithoutProxyClassesClient.GetBillingForClientAsync(client.Id, fromDate, toDate).Result; if (billingRecordsArrayEx != null && billingRecordsArrayEx.totalCount > 0) { foreach (BillingRecordEx billingRecordEx in billingRecordsArrayEx.items) { double price = 0; double priceInclTaxes = 0; if (billingRecordEx.price.HasValue) { price = billingRecordEx.price.Value; } if (billingRecordEx.priceInclTaxes.HasValue) { priceInclTaxes = billingRecordEx.priceInclTaxes.Value; } billingRecords.Add(new BillingRecord(billingRecordEx.startDate, billingRecordEx.source, Utils.RemoveCountryCodeFromTelephoneNumber( _configuration.GetValue <string>("ApplicationSettings:CountryCode"), _configuration.GetValue <int>("ApplicationSettings:NumberOfDigitsForAreaAndShortCLID"), billingRecordEx.destination), billingRecordEx.duration, price)); } } // Billing records filtering by destination clientsBillings.Add(new ClientBilling(client, fromDate, toDate, billingRecords. Where(r => ((r.Price != 0) && !(r.Destination.Any(n => char.IsLetter(n))))) .ToList())); } catch (Exception ex) { throw new Exception(ex.Message); } }