public async Task <IActionResult> UseServiceA([FromBody] UseServiceModel useServiceRequest) { try { await _contractService.AddUseServiceEvent(useServiceRequest); return(Ok()); } catch (DataException e) { return(NotFound(e.Message)); } }
public async Task AddUseServiceEvent(UseServiceModel useServiceRequest) { useServiceRequest.StartDate = DateInDays(useServiceRequest.StartDate); useServiceRequest.EndDate = DateInDays(useServiceRequest.EndDate); var customer = await _context.Customers.FindAsync(useServiceRequest.CustomerId); var service = await _context.Services.FindAsync(useServiceRequest.ServiceId); var contracts = await _context.Contracts.Where(c => c.Service == service && c.Customer == customer).OrderBy(c => c.StartDate).ToListAsync(); //var currentContracts = new List<Contract>(); var usageCovered = false; foreach (Contract contract in contracts) { if (contract.EndDate >= useServiceRequest.EndDate && contract.StartDate <= useServiceRequest.StartDate) { // Case 1 CSSC // We have a contract that covers the whole service usage await AddServiceUse(customer, contract, useServiceRequest.StartDate, useServiceRequest.EndDate); usageCovered = true; break; } if (contract.StartDate <= useServiceRequest.StartDate && contract.EndDate >= useServiceRequest.StartDate && contract.EndDate <= useServiceRequest.EndDate) { // Case 2 CSCS await AddServiceUse(customer, contract, useServiceRequest.StartDate, contract.EndDate); useServiceRequest.StartDate = contract.EndDate; continue; } if (contract.EndDate <= useServiceRequest.EndDate && contract.StartDate > useServiceRequest.StartDate) { // Case 3 SCCS var newContract = await AddDefaultContract(customer, service, useServiceRequest.StartDate, contract.StartDate); // add first contract await AddServiceUse(customer, newContract, newContract.StartDate, newContract.EndDate); // use current contract await AddServiceUse(customer, contract, contract.StartDate, contract.EndDate); useServiceRequest.StartDate = contract.EndDate; continue; } if (contract.EndDate >= useServiceRequest.EndDate && contract.StartDate > useServiceRequest.StartDate && contract.StartDate < useServiceRequest.EndDate) { // Case 4 SCSC var newContract = await AddDefaultContract(customer, service, useServiceRequest.StartDate, contract.StartDate); // add new contract await AddServiceUse(customer, newContract, useServiceRequest.StartDate, newContract.EndDate); // use current contract await AddServiceUse(customer, contract, contract.StartDate, useServiceRequest.EndDate); usageCovered = true; break; } else if (contract.StartDate >= useServiceRequest.EndDate) { // Case 5 SSCC Contract newContract = await AddDefaultContract(customer, service, useServiceRequest.StartDate, useServiceRequest.EndDate); await AddServiceUse(customer, newContract, useServiceRequest.StartDate, newContract.EndDate); usageCovered = true; break; } } if (!usageCovered) { // Case 6 CCSS var newContract = await AddDefaultContract(customer, service, useServiceRequest.StartDate, useServiceRequest.EndDate); await _context.Contracts.AddAsync(newContract); await AddServiceUse(customer, newContract, newContract.StartDate, newContract.EndDate); } await _context.SaveChangesAsync(); }