public static async Task <IActionResult> updateBillPaid(
            [HttpTrigger(AuthorizationLevel.Anonymous, "patch", Route = "bills/{bill_id}")] HttpRequest request, string bill_id,
            ILogger log)
        {
            string   req_body          = await new StreamReader(request.Body).ReadToEndAsync();
            BillItem current_bill_data = JsonConvert.DeserializeObject <BillItem>(req_body);
            string   user_id           = current_bill_data.user_id;

            Container bills_container = Resources.bill_container;

            var option = new FeedOptions {
                EnableCrossPartitionQuery = true
            };

            BillItem bill_to_pay = Resources.docClient.CreateDocumentQuery <BillItem>(
                UriFactory.CreateDocumentCollectionUri("waterly_db", "bills_table"), option)
                                   .Where(bill_to_pay => bill_to_pay.id.Equals(bill_id))
                                   .AsEnumerable()
                                   .First();

            bill_to_pay.status = true; //true = paid

            ResourceResponse <Document> response = await Resources.docClient.ReplaceDocumentAsync(
                UriFactory.CreateDocumentUri("waterly_db", "bills_table", bill_to_pay.id),
                bill_to_pay);

            var updated = response.Resource;

            //send mail
            EmailSender.sendMailBillPaymentConfirmation(bill_to_pay, user_id);

            return(new OkObjectResult(bill_to_pay));
        }
예제 #2
0
        public static async Task generateNewBill(UserItem user, long consumption, DateTime today, double avarage)
        {
            DateTime billPeriod = today.AddMonths(-1);

            BillItem bill = new BillItem
            {
                id             = $"{user.id}-{billPeriod.Month}-{billPeriod.Year}",
                user_id        = user.id,
                avg            = 10 * (float)Math.Floor(avarage / 1000000),
                status         = false,
                month          = billPeriod.Month,
                year           = billPeriod.Year,
                total_flow     = consumption,
                fixed_expenses = 20,
                water_expenses = 10 * (float)Math.Floor((double)consumption / 1000000)
            };

            // Create an item in the container representing the bill.
            ItemResponse <BillItem> billResponse = await Resources.bill_container.UpsertItemAsync <BillItem>(bill);

            // Note that after creating the item, we can access the body of the item with the Resource property off the ItemResponse.
            Console.WriteLine("Created item in database with id: {0}\n", billResponse.Resource.id);

            EmailSender.sendMailMontlyBill(bill, user);
        }
예제 #3
0
        public static void sendMailBillPaymentConfirmation(BillItem billItem, string userId)
        {
            string subject  = $"Confirmation Mail for Bill Payment - {getMonth(billItem.month)} {billItem.year}";
            string mailBody = $"Thanks!\n\n" +
                              $"You just paid your {getMonth(billItem.month)} {billItem.year} water bill.\n" +
                              $"Your payment was proccessed successfully.\n\n" +
                              $"Thanks!\n" +
                              $"WATERLY team.";
            string reciever = getEmailAddresByUserId(userId).Result;

            Console.WriteLine($"Sending mail - payment confirmation to {reciever}");
            sendMail(subject, mailBody, reciever);
        }
예제 #4
0
        public static void sendMailMontlyBill(BillItem billItem, UserItem userItem)
        {
            string subject  = $"Your monthly water bill has arrived - {getMonth(billItem.month)} {billItem.year}";
            string mailBody = $"Hey {userItem.full_name}, \n" +
                              $"Your monthly bill for {getMonth(billItem.month)} {billItem.year} has just arrived! \n\n" +
                              $"Total consumption this month: {billItem.total_flow/1000000} cubic meters \n" +
                              $"Water Expenses: {billItem.water_expenses}ILS \n" +
                              $"Fixed Expenses: {billItem.fixed_expenses}ILS \n" +
                              $"Total: {billItem.water_expenses + billItem.fixed_expenses}ILS \n\n" +
                              $"Please go over to {siteUrl} to pay it. \n\n" +
                              $"Thanks for using WATERLY!\n" +
                              $"WATERLY team.";
            string reciever = userItem.email;

            Console.WriteLine($"Sending mail - monthly bill to {reciever}");
            sendMail(subject, mailBody, reciever);
        }
        public static async Task <IActionResult> getUserConsumption(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "consumption_per_month/userId={userId}&year={year}")] HttpRequest request,
            [CosmosDB(
                 databaseName: "waterly_db",
                 collectionName: "waterly_devices",
                 ConnectionStringSetting = "CosmosDBConnection",
                 SqlQuery = "SELECT * FROM c WHERE c.userId = {userId}")]
            IEnumerable <DeviceItem> devices,
            string year,
            ILogger log)

        {
            Container BillsContainer       = Resources.bill_container;
            Container ConsumptionContainer = Resources.monthly_consumption_container;
            int       cur_year             = Int32.Parse(year);

            //for all year, dict for month number and dict userConsumptionPerMonthDict
            List <Dictionary <string, long> > consumptions_months_list = new List <Dictionary <string, long> >();

            for (int month_num = 1; month_num < 13; month_num++)
            {
                //for each month, dict for device id and consumption sum
                Dictionary <string, long> userConsumptionPerMonthDict = new Dictionary <string, long>();

                userConsumptionPerMonthDict.Add("Month", month_num);

                //Add avg per month
                var                     sqlQueryText  = $"SELECT TOP 1 * FROM c WHERE c.month = {month_num} AND c.year = {cur_year}";
                QueryDefinition         bills_query   = new QueryDefinition(sqlQueryText);
                FeedIterator <BillItem> bill_iterator = BillsContainer.GetItemQueryIterator <BillItem>(bills_query);


                Microsoft.Azure.Cosmos.FeedResponse <BillItem> currentResultSet;

                long avg = 0;

                while (bill_iterator.HasMoreResults)
                {
                    currentResultSet = await bill_iterator.ReadNextAsync();

                    if (currentResultSet.Count == 0)
                    {
                        break;
                    }
                    else
                    {
                        BillItem first_bill = currentResultSet.First();
                        avg  = (long)first_bill.avg;
                        avg /= 10;
                        break;
                    }
                }

                userConsumptionPerMonthDict.Add("Average", avg);

                foreach (DeviceItem device_item in devices)
                {
                    //calculate sum for month_num for device_item
                    string device_id = device_item.id;
                    sqlQueryText = $"SELECT * FROM c WHERE c.month = {month_num} AND c.year = {cur_year} AND c.device_id = '{device_id}'";
                    QueryDefinition consumption_query = new QueryDefinition(sqlQueryText);
                    FeedIterator <MonthlyDeviceConsumptionItem> consumption_iterator = ConsumptionContainer.GetItemQueryIterator <MonthlyDeviceConsumptionItem>(consumption_query);
                    long consumption_per_device_month = 0;
                    Microsoft.Azure.Cosmos.FeedResponse <MonthlyDeviceConsumptionItem> ConsumptionCurrentResultSet;


                    while (consumption_iterator.HasMoreResults)
                    {
                        ConsumptionCurrentResultSet = await consumption_iterator.ReadNextAsync();

                        if (ConsumptionCurrentResultSet.Count == 0)
                        {
                            break;
                        }
                        else
                        {
                            MonthlyDeviceConsumptionItem first_sum_item = ConsumptionCurrentResultSet.First();
                            consumption_per_device_month = first_sum_item.consumption_sum / 1000000;
                            break;
                        }
                    }


                    //add to dict
                    userConsumptionPerMonthDict.Add(device_item.name, consumption_per_device_month);
                }

                consumptions_months_list.Add(userConsumptionPerMonthDict);
            }

            return(new OkObjectResult(consumptions_months_list));
        }