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)); }
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); }
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); }
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)); }