Ejemplo n.º 1
0
        public async Task <IActionResult> UseServiceA([FromBody] UseServiceModel useServiceRequest)
        {
            try
            {
                await _contractService.AddUseServiceEvent(useServiceRequest);

                return(Ok());
            }
            catch (DataException e)
            {
                return(NotFound(e.Message));
            }
        }
Ejemplo n.º 2
0
        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();
        }