public async Task CreateCase_ShouldCallVerintGatewayWithCustomer()
        {
            Case crmCaseParameter = null;

            _mockVerintServiceGateway
            .Setup(_ => _.CreateCase(It.IsAny <Case>()))
            .Callback <Case>(_ => crmCaseParameter = _)
            .ReturnsAsync(new HttpResponse <string>
            {
                IsSuccessStatusCode = true,
                ResponseContent     = "test"
            });

            var model = new ParkingDispensationRequest
            {
                FirstName = "first name",
                LastName  = "last name",
                Email     = "*****@*****.**",
                Phone     = "+447777777777"
            };

            _ = await _service.CreateCase(model);

            _mockVerintServiceGateway.Verify(_ => _.CreateCase(It.IsAny <Case>()), Times.Once);

            Assert.NotNull(crmCaseParameter);
            Assert.NotNull(crmCaseParameter.Customer);
            Assert.Equal(model.Email, crmCaseParameter.Customer.Email);
            Assert.Equal(model.Phone, crmCaseParameter.Customer.Telephone);
            Assert.Equal(model.LastName, crmCaseParameter.Customer.Surname);
            Assert.Equal(model.FirstName, crmCaseParameter.Customer.Forename);
        }
        public async Task CreateCase_ShouldCallVerintGatewayWithSelectedAddress()
        {
            Case crmCaseParameter = null;

            _mockVerintServiceGateway
            .Setup(_ => _.CreateCase(It.IsAny <Case>()))
            .Callback <Case>(_ => crmCaseParameter = _)
            .ReturnsAsync(new HttpResponse <string>
            {
                IsSuccessStatusCode = true,
                ResponseContent     = "test"
            });

            var model = new ParkingDispensationRequest {
                CustomersAddress = new Address
                {
                    SelectedAddress = "selected address"
                }
            };

            _ = await _service.CreateCase(model);

            _mockVerintServiceGateway.Verify(_ => _.CreateCase(It.IsAny <Case>()), Times.Once);

            Assert.NotNull(crmCaseParameter);
        }
        public async Task <IActionResult> Post([FromBody] ParkingDispensationRequest parkingDispensationRequest)
        {
            // log data thats recieved from fb   ---(investigating submission issues)
            _logger.LogInformation(JsonConvert.SerializeObject(parkingDispensationRequest));

            string result = await _parkingDispensationRequest.CreateCase(parkingDispensationRequest);

            return(Ok(result));
        }
        public async Task CreateCase_ShouldCallVerintGatewayWithCustomerManualAddress()
        {
            Case crmCaseParameter = null;

            _mockVerintServiceGateway
            .Setup(_ => _.CreateCase(It.IsAny <Case>()))
            .Callback <Case>(_ => crmCaseParameter = _)
            .ReturnsAsync(new HttpResponse <string>
            {
                IsSuccessStatusCode = true,
                ResponseContent     = "test"
            });

            var model = new ParkingDispensationRequest
            {
                FirstName        = "first name",
                LastName         = "last name",
                CustomersAddress = new Address
                {
                    AddressLine1 = "address line 1",
                    AddressLine2 = "address line 2",
                    Town         = "town",
                    Postcode     = "post code",
                }
            };

            _ = await _service.CreateCase(model);

            _mockVerintServiceGateway.Verify(_ => _.CreateCase(It.IsAny <Case>()), Times.Once);

            Assert.NotNull(crmCaseParameter);
            Assert.NotNull(crmCaseParameter.Customer);
            Assert.NotNull(crmCaseParameter.Customer.Address);
            Assert.Equal(model.CustomersAddress.AddressLine1, crmCaseParameter.Customer.Address.AddressLine1);
            Assert.Equal(model.CustomersAddress.AddressLine2, crmCaseParameter.Customer.Address.AddressLine2);
            Assert.Equal(model.CustomersAddress.Town, crmCaseParameter.Customer.Address.AddressLine3);
            Assert.Equal(model.CustomersAddress.Postcode, crmCaseParameter.Customer.Address.Postcode);
            Assert.Null(crmCaseParameter.Customer.Address.UPRN);
            Assert.Null(crmCaseParameter.Customer.Address.Reference);
        }
        public async Task <string> CreateCase(ParkingDispensationRequest parkingDispensationRequest)
        {
            var description = $@"Reason: {parkingDispensationRequest.PurposeOfDispensation}
                                Start date: {parkingDispensationRequest.DispensationDateStart.ToString("dd/MM/yyyy")}
                                End date: {parkingDispensationRequest.DispensationDateEnd.ToString("dd/MM/yyyy")}
                                Start time: {parkingDispensationRequest.DispensationTimeStart.ToString("HH:mm")}
                                End time: {parkingDispensationRequest.DispensationTimeEnd.ToString("HH:mm")}
                                Vehicle information: {parkingDispensationRequest.VehicleDetails}
                                Further location information: {parkingDispensationRequest.LocationDetails}
                                ";


            var crmCase = new Case
            {
                EventCode   = 2002798,
                EventTitle  = "Request for NON enforcement",
                Description = description,
                Street      = new Street
                {
                    Reference = parkingDispensationRequest.StreetAddress?.PlaceRef
                }
            };

            if (!string.IsNullOrEmpty(parkingDispensationRequest.FirstName) && !string.IsNullOrEmpty(parkingDispensationRequest.LastName))
            {
                crmCase.Customer = new Customer
                {
                    Forename = parkingDispensationRequest.FirstName,
                    Surname  = parkingDispensationRequest.LastName,
                };

                if (!string.IsNullOrEmpty(parkingDispensationRequest.Email))
                {
                    crmCase.Customer.Email = parkingDispensationRequest.Email;
                }

                if (!string.IsNullOrEmpty(parkingDispensationRequest.Phone))
                {
                    crmCase.Customer.Telephone = parkingDispensationRequest.Phone;
                }

                if (string.IsNullOrEmpty(parkingDispensationRequest.CustomersAddress?.PlaceRef))
                {
                    crmCase.Customer.Address = new Address
                    {
                        AddressLine1 = parkingDispensationRequest.CustomersAddress?.AddressLine1,
                        AddressLine2 = parkingDispensationRequest.CustomersAddress?.AddressLine2,
                        AddressLine3 = parkingDispensationRequest.CustomersAddress?.Town,
                        Postcode     = parkingDispensationRequest.CustomersAddress?.Postcode,
                    };
                }
                else
                {
                    crmCase.Customer.Address = new Address
                    {
                        Reference = parkingDispensationRequest.CustomersAddress?.PlaceRef,
                        UPRN      = parkingDispensationRequest.CustomersAddress?.PlaceRef
                    };
                }
            }
            try
            {
                var response = await _VerintServiceGateway.CreateCase(crmCase);

                if (!response.IsSuccessStatusCode)
                {
                    throw new Exception("Status code not successful");
                }

                Person person = new Person
                {
                    FirstName = parkingDispensationRequest.FirstName,
                    Email     = parkingDispensationRequest.Email,
                };

                _mailHelper.SendEmail(person, EMailTemplate.ParkingDispensationRequest, response.ResponseContent);
                return(response.ResponseContent);
            }
            catch (Exception ex)
            {
                throw new Exception($"CRMService CreateCase an exception has occured while creating the case in verint service", ex);
            }
        }