Ejemplo n.º 1
0
        public void Run(APIGatewayProxyRequest request, APIGatewayProxyResponse response, FinanceUser user)
        {
            var receipt                 = JsonConvert.DeserializeObject <Receipt>(request.Body);
            var dbClient                = new AmazonDynamoDBClient();
            var logger                  = new ConsoleLogger();
            var receiptDbClient         = new DatabaseClient <ReceiptSaveResult>(dbClient, logger);
            var spotReservationDbClient = new DatabaseClient <SpotReservation>(dbClient, logger);
            var vendorDbClient          = new DatabaseClient <Vendor>(dbClient, logger);
            var qboClient               = new QuickBooksOnlineClient(PrivateAccounting.Constants.LakelandMiPuebloRealmId, new DatabaseClient <QuickBooksOnlineConnection>(dbClient, logger), logger);

            var allActiveCustomers = qboClient
                                     .QueryAll <Customer>("select * from customer")
                                     .ToDictionary(x => x.Id);
            var activeVendors = new ActiveVendorSearch()
                                .GetActiveVendors(allActiveCustomers, vendorDbClient)
                                .ToList();
            var spotClient           = new DatabaseClient <Spot>(dbClient, logger);
            var spotReservationCheck = new SpotReservationCheck(spotClient, spotReservationDbClient, activeVendors, allActiveCustomers);
            var validation           = new ReceiptValidation(spotReservationCheck).Validate(receipt).Result;

            if (validation.Any())
            {
                response.StatusCode = 400;
                response.Body       = new JObject {
                    { "error", JArray.FromObject(validation) }
                }.ToString();
                return;
            }
            var    taxRate        = new Tax().GetTaxRate(qboClient, PropertyRentalManagement.Constants.QUICKBOOKS_RENTAL_TAX_RATE);
            var    cardPayment    = new CardPayment(logger, Configuration.CLOVER_MI_PUEBLO_PRIVATE_TOKEN);
            var    receiptService = new ReceiptSave(receiptDbClient, qboClient, taxRate, spotReservationDbClient, logger, cardPayment);
            string customerId     = receipt.Customer.Id;

            if (string.IsNullOrWhiteSpace(customerId))
            {
                var customer = new Customer {
                    DisplayName = receipt.Customer.Name
                };
                customer   = qboClient.Create(customer);
                customerId = customer.Id.ToString();
            }
            var vendor = activeVendors.FirstOrDefault(x => x.QuickBooksOnlineId.GetValueOrDefault().ToString() == customerId)
                         ?? vendorDbClient.Create(VendorService.CreateModel(int.Parse(customerId), null, null, null));

            receipt.Id = string.IsNullOrWhiteSpace(receipt.Id) ? Guid.NewGuid().ToString() : receipt.Id; // Needed until UI is deployed.
            var receiptResult = receiptService.SaveReceipt(receipt, customerId, user.FirstName, user.LastName, user.Email, vendor, IpLookup.GetIp(request));

            response.Body = JsonConvert.SerializeObject(receiptResult);
        }
Ejemplo n.º 2
0
        public void Run(APIGatewayProxyRequest request, APIGatewayProxyResponse response, FinanceUser user)
        {
            List <string> errors           = new List <string>();
            var           dbClient         = new AmazonDynamoDBClient();
            var           logger           = new ConsoleLogger();
            var           spotClient       = new DatabaseClient <Spot>(dbClient, logger);
            var           vendorDataClient = new DatabaseClient <Vendor>(dbClient, logger);
            var           databaseClient   = new DatabaseClient <QuickBooksOnlineConnection>(dbClient, logger);
            var           qboClient        = new QuickBooksOnlineClient(PrivateAccounting.Constants.LakelandMiPuebloRealmId, databaseClient, logger);
            var           vendorUpdates    = JsonConvert.DeserializeObject <Vendor>(request.Body);

            if (vendorUpdates.Memo != null && vendorUpdates.Memo.Length > 4000)
            {
                errors.Add("Memo can't exceed 4,000 characters");
            }
            var spotReservationDbClient = new DatabaseClient <SpotReservation>(dbClient, logger);
            var allActiveCustomers      = qboClient
                                          .QueryAll <Customer>("select * from customer")
                                          .ToDictionary(x => x.Id);
            var allActiveVendors = new ActiveVendorSearch()
                                   .GetActiveVendors(allActiveCustomers, vendorDataClient)
                                   .ToList();
            var        spotReservationCheck = new SpotReservationCheck(spotClient, spotReservationDbClient, allActiveVendors, allActiveCustomers);
            ZonedClock easternClock         = SystemClock.Instance.InZone(Configuration.LakeLandMiPuebloTimeZone);
            LocalDate  easternToday         = easternClock.GetCurrentDate();

            while (easternToday.DayOfWeek != IsoDayOfWeek.Sunday)
            {
                easternToday = easternToday.PlusDays(1);
            }
            string easternRentalDate = easternToday.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);

            errors.AddRange(spotReservationCheck.GetSpotConflicts(vendorUpdates.Spots, easternRentalDate, vendorUpdates.Id).Result);

            if (errors.Any())
            {
                response.StatusCode = 400;
                response.Body       = new JObject {
                    { "error", JArray.FromObject(errors) }
                }.ToString();
                return;
            }

            var updated = vendorDataClient.Update(vendorUpdates);

            response.Body = JsonConvert.SerializeObject(updated);
        }
        public void Run(APIGatewayProxyRequest request, APIGatewayProxyResponse response, FinanceUser user)
        {
            var dbClientCore = new AmazonDynamoDBClient();
            var logger       = new ConsoleLogger();
            var spotClient   = new DatabaseClient <Spot>(dbClientCore, logger);
            var spots        = spotClient.ScanAll(new ScanRequest(new Spot().GetTable()))
                               .OrderBy(x => x.Section?.Name)
                               .ThenBy(x => x.Name)
                               .ToList();
            var qboClient          = new QuickBooksOnlineClient(PrivateAccounting.Constants.LakelandMiPuebloRealmId, new DatabaseClient <QuickBooksOnlineConnection>(dbClientCore, logger), logger);
            var allActiveCustomers = qboClient
                                     .QueryAll <Customer>("select * from customer")
                                     .ToDictionary(x => x.Id);
            var allActiveVendors = new ActiveVendorSearch()
                                   .GetActiveVendors(allActiveCustomers, new DatabaseClient <Vendor>(dbClientCore, logger))
                                   .ToList();
            var spotReservationCheck = new SpotReservationCheck(
                spotClient,
                new DatabaseClient <SpotReservation>(dbClientCore, logger),
                allActiveVendors,
                allActiveCustomers
                );
            var rentalDate = request.QueryStringParameters.ContainsKey("rentalDate")
                ? request.QueryStringParameters["rentalDate"]
                : string.Empty;
            var validation = ReceiptValidation.GetRentalDateValidation(rentalDate);

            if (validation.Any())
            {
                response.StatusCode = 400;
                response.Body       = new JObject {
                    { "error", JArray.FromObject(validation) }
                }.ToString();
                return;
            }
            validation = new List <string>();
            DateTime.TryParseExact(rentalDate, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsedRentalDate);
            if (parsedRentalDate - DateTime.UtcNow > TimeSpan.FromDays(91)) // Endpoint is cached. The date constraint prevents denial of service causing the cache to be hit and database hits to plateau quickly.
            {
                validation.Add("rentalDate can't be greater than 90 days in the future");
            }
            if (parsedRentalDate - DateTime.UtcNow < TimeSpan.FromDays(-1))
            {
                validation.Add("rentalDate can't be in the past");
            }
            if (validation.Any())
            {
                response.StatusCode = 400;
                response.Body       = new JObject {
                    { "error", JArray.FromObject(validation) }
                }.ToString();
                return;
            }
            var jsonResponse = new List <PublicSpot>();

            foreach (var spot in spots)
            {
                var reservation = spotReservationCheck.GetReservation(spot.Id, rentalDate);
                int?reservedByQuickBooksOnlineId = 0;
                if (reservation?.Item1 != null)
                {
                    reservedByQuickBooksOnlineId = reservation.Item1.QuickBooksOnlineId;
                }
                if (reservation?.Item2 != null)
                {
                    reservedByQuickBooksOnlineId = reservation.Item2.QuickBooksOnlineId;
                }
                var publicSpot = new PublicSpot
                {
                    Id      = spot.Id,
                    Name    = spot.Name,
                    Section = spot.Section,
                    Right   = spot.Right,
                    Bottom  = spot.Bottom
                };
                if (reservedByQuickBooksOnlineId.HasValue &&
                    allActiveCustomers.TryGetValue(reservedByQuickBooksOnlineId, out var customer))
                {
                    publicSpot.ReservedBy = customer.DisplayName;
                }
                jsonResponse.Add(publicSpot);
            }
            response.Body = JsonConvert.SerializeObject(jsonResponse);
        }