Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- using System.ComponentModel.DataAnnotations;
- namespace Web_S10189876.Models
- {
- public class Fine
- {
- [Display(Name = "Due Date")]
- [DataType(DataType.Date)]
- [DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}")]
- public DateTime DueDate { get; set; }
- [Display(Name = "Number of Books Overdue")]
- [Range(1, 10, ErrorMessage =
- "Invalid value! Please enter a value from 1 to 10")]
- public int NumBooksOverdue { get; set; }
- [Display(Name = "Number of Days Overdue")]
- public int NumDaysOverdue { get; set; }
- [Display(Name = "Fine Rate (SGD)")]
- [DisplayFormat(DataFormatString = "{0:#,##0.00}",
- ApplyFormatInEditMode = true)]
- public double FineRate { get; set; }
- [Display(Name = "Fine (SGD)")]
- [DisplayFormat(DataFormatString = "{0:#,##0.00}")]
- public double FineAmt { get; set; }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.AspNetCore.Mvc.Rendering;
- using Web_S10189876.Models;
- namespace Web_S10189876.Controllers
- {
- public class FineController : Controller
- {
- public ActionResult Calculate()
- {
- //Prepare the ViewData to be use in Calculate.cshtml view
- ViewData["ShowResult"] = false;
- Fine fine = new Fine();
- fine.DueDate = DateTime.Today;
- fine.FineRate = 0.50;
- return View(fine);
- }
- [HttpPost]
- public ActionResult Calculate(Fine fine)
- {
- // The fine object contains user inputs from view
- if (!ModelState.IsValid) // validation fails
- {
- return View(fine); // returns the view with errors
- }
- // Calculate the cumulative fine and its breakdown
- double fineTotal = 0.0;
- string fineBreakdown = "";
- for (int count = 1; count <= fine.NumBooksOverdue; count++)
- {
- double fineForEachBook = count * fine.FineRate *
- fine.NumDaysOverdue;
- fineTotal += fineForEachBook;
- fineBreakdown += "Overdue cost for Book " + count + " = $" +
- fineForEachBook.ToString("#,##0.00") +
- "<br />";
- }
- fine.FineAmt = fineTotal;
- // Prepare the ViewData to be used in Calculate.cshtml view
- ViewData["ShowResult"] = true;
- ViewData["FineBreakdown"] = fineBreakdown;
- // Route to Calculate.cshtml view to display result
- return View(fine);
- }
- }
- }
- @model Web_S10189876.Models.Fine
- @{
- ViewData["Title"] = "Calculate";
- Layout = "~/Views/Shared/_Layout.cshtml";
- }
- <h4 class="PageTitle">Fine Calculator</h4>
- <hr />
- <form asp-controller="Fine" asp-action="Calculate" method="post">
- <fieldset class="FormContent">
- <legend>Input Data:</legend>
- <div asp-validation-summary="ModelOnly"
- class="text-danger"></div>
- <div class="form-group row">
- <label asp-for="DueDate"
- class="col-sm-4 col-form-label"></label>
- <div class="col-sm-8 col-md-4">
- <input asp-for="DueDate" class="form-control"
- max="@DateTime.Today.ToString("yyyy-MM-dd")" />
- </div>
- </div>
- <div class="form-group row">
- <label asp-for="NumDaysOverdue"
- class="col-sm-4 col-form-label"></label>
- <div class="col-sm-8">
- <input asp-for="NumDaysOverdue" readonly
- class="form-control-plaintext" />
- </div>
- </div>
- <div class="form-group row">
- <label asp-for="FineRate"
- class="col-sm-4 col-form-label"></label>
- <div class="col-sm-8">
- <input asp-for="FineRate" readonly
- class="form-control-plaintext" />
- <span style="font-style:italic;">
- (rate per day for the 1st book,
- double for the 2nd, triple for the 3rd ...)
- </span>
- </div>
- </div>
- <div class="form-group row">
- <label asp-for="NumBooksOverdue"
- class="col-sm-4 col-form-label"></label>
- <div class="col-sm-8 col-md-4">
- <input asp-for="NumBooksOverdue" class="form-control"
- required />
- <span asp-validation-for="NumBooksOverdue"
- class="text-danger"></span>
- </div>
- </div>
- <div class="form-group row">
- <div class="col-sm-8 offset-sm-4">
- <input type="submit" value="Compute"
- class="btn btn-primary" />
- </div>
- </div>
- </fieldset>
- </form>
- @if (Convert.ToBoolean(ViewData["ShowResult"]))
- {
- <fieldset class="FormContent">
- <legend>Result:</legend>
- <div class="form-group row">
- <label asp-for="FineAmt"
- class="col-sm-4 col-form-label"></label>
- <div class="col-sm-8 form-control-plaintext">
- @Html.Display("FineAmt")
- </div>
- </div>
- <div class="form-group row">
- <label class="col-sm-4 col-form-label">
- Breakdown of the Fine
- </label>
- <div class="col-sm-8 form-control-plaintext">
- @Html.Raw(ViewData["FineBreakdown"])
- </div>
- </div>
- </fieldset>
- }
- <script>
- // Calculate and display the days overdue when the due date is set
- document.getElementById("DueDate").onchange = function () {
- // The number of milliseconds in one day
- var oneday = 24 * 60 * 60 * 1000;
- var today = new Date();
- var dueDate = new Date(
- document.getElementById("DueDate").value);
- // Convert both dates to milliseconds
- var today_ms = today.getTime();
- var dueDate_ms = dueDate.getTime();
- // Calculate the difference in milliseconds
- var difference_ms = today_ms - dueDate_ms;
- // Convert back to days
- var numDayOverdue = Math.floor(difference_ms / oneday);
- // Assign the value to input field
- document.getElementById("NumDaysOverdue").value
- = numDayOverdue;
- };
- </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement