Merge pull request #143 from hargata/Hargata/supply.store

Add Functionality to Requisition Supplies when adding record.
This commit is contained in:
Hargata Softworks
2024-01-22 13:52:52 -07:00
committed by GitHub
23 changed files with 342 additions and 17 deletions

View File

@@ -615,6 +615,10 @@ namespace CarCareTracker.Controllers
//move files from temp. //move files from temp.
serviceRecord.Files = serviceRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); serviceRecord.Files = serviceRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
var result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(serviceRecord.ToServiceRecord()); var result = _serviceRecordDataAccess.SaveServiceRecordToVehicle(serviceRecord.ToServiceRecord());
if (result && serviceRecord.Supplies.Any())
{
RequisitionSupplyRecordsByUsage(serviceRecord.Supplies);
}
return Json(result); return Json(result);
} }
[HttpGet] [HttpGet]
@@ -670,6 +674,10 @@ namespace CarCareTracker.Controllers
//move files from temp. //move files from temp.
collisionRecord.Files = collisionRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); collisionRecord.Files = collisionRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
var result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(collisionRecord.ToCollisionRecord()); var result = _collisionRecordDataAccess.SaveCollisionRecordToVehicle(collisionRecord.ToCollisionRecord());
if (result && collisionRecord.Supplies.Any())
{
RequisitionSupplyRecordsByUsage(collisionRecord.Supplies);
}
return Json(result); return Json(result);
} }
[HttpGet] [HttpGet]
@@ -1172,6 +1180,10 @@ namespace CarCareTracker.Controllers
//move files from temp. //move files from temp.
upgradeRecord.Files = upgradeRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); upgradeRecord.Files = upgradeRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
var result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(upgradeRecord.ToUpgradeRecord()); var result = _upgradeRecordDataAccess.SaveUpgradeRecordToVehicle(upgradeRecord.ToUpgradeRecord());
if (result && upgradeRecord.Supplies.Any())
{
RequisitionSupplyRecordsByUsage(upgradeRecord.Supplies);
}
return Json(result); return Json(result);
} }
[HttpGet] [HttpGet]
@@ -1237,6 +1249,21 @@ namespace CarCareTracker.Controllers
} }
#endregion #endregion
#region "Supply Records" #region "Supply Records"
private void RequisitionSupplyRecordsByUsage(List<SupplyUsage> supplyUsage)
{
foreach(SupplyUsage supply in supplyUsage)
{
//get supply record.
var result = _supplyRecordDataAccess.GetSupplyRecordById(supply.SupplyId);
var unitCost = (result.Quantity != 0 ) ? result.Cost / result.Quantity : 0;
//deduct quantity used.
result.Quantity -= supply.Quantity;
//deduct cost.
result.Cost -= (supply.Quantity * unitCost);
//save
_supplyRecordDataAccess.SaveSupplyRecordToVehicle(result);
}
}
[TypeFilter(typeof(CollaboratorFilter))] [TypeFilter(typeof(CollaboratorFilter))]
[HttpGet] [HttpGet]
public IActionResult GetSupplyRecordsByVehicleId(int vehicleId) public IActionResult GetSupplyRecordsByVehicleId(int vehicleId)
@@ -1253,6 +1280,23 @@ namespace CarCareTracker.Controllers
} }
return PartialView("_SupplyRecords", result); return PartialView("_SupplyRecords", result);
} }
[TypeFilter(typeof(CollaboratorFilter))]
[HttpGet]
public IActionResult GetSupplyRecordsForRecordsByVehicleId(int vehicleId)
{
var result = _supplyRecordDataAccess.GetSupplyRecordsByVehicleId(vehicleId);
result.RemoveAll(x => x.Quantity <= 0);
bool _useDescending = _config.GetUserConfig(User).UseDescending;
if (_useDescending)
{
result = result.OrderByDescending(x => x.Date).ToList();
}
else
{
result = result.OrderBy(x => x.Date).ToList();
}
return PartialView("_SupplyUsage", result);
}
[HttpPost] [HttpPost]
public IActionResult SaveSupplyRecordToVehicleId(SupplyRecordInput supplyRecord) public IActionResult SaveSupplyRecordToVehicleId(SupplyRecordInput supplyRecord)
{ {
@@ -1313,6 +1357,10 @@ namespace CarCareTracker.Controllers
//move files from temp. //move files from temp.
planRecord.Files = planRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList(); planRecord.Files = planRecord.Files.Select(x => { return new UploadedFiles { Name = x.Name, Location = _fileHelper.MoveFileFromTemp(x.Location, "documents/") }; }).ToList();
var result = _planRecordDataAccess.SavePlanRecordToVehicle(planRecord.ToPlanRecord()); var result = _planRecordDataAccess.SavePlanRecordToVehicle(planRecord.ToPlanRecord());
if (result && planRecord.Supplies.Any())
{
RequisitionSupplyRecordsByUsage(planRecord.Supplies);
}
return Json(result); return Json(result);
} }
[HttpGet] [HttpGet]

View File

@@ -10,6 +10,7 @@
public decimal Cost { get; set; } public decimal Cost { get; set; }
public string Notes { get; set; } public string Notes { get; set; }
public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>(); public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>();
public List<SupplyUsage> Supplies { get; set; } = new List<SupplyUsage>();
public CollisionRecord ToCollisionRecord() { return new CollisionRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files }; } public CollisionRecord ToCollisionRecord() { return new CollisionRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files }; }
} }
} }

View File

@@ -9,6 +9,7 @@
public string Description { get; set; } public string Description { get; set; }
public string Notes { get; set; } public string Notes { get; set; }
public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>(); public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>();
public List<SupplyUsage> Supplies { get; set; } = new List<SupplyUsage>();
public ImportMode ImportMode { get; set; } public ImportMode ImportMode { get; set; }
public PlanPriority Priority { get; set; } public PlanPriority Priority { get; set; }
public PlanProgress Progress { get; set; } public PlanProgress Progress { get; set; }

View File

@@ -10,6 +10,7 @@
public decimal Cost { get; set; } public decimal Cost { get; set; }
public string Notes { get; set; } public string Notes { get; set; }
public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>(); public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>();
public List<SupplyUsage> Supplies { get; set; } = new List<SupplyUsage>();
public ServiceRecord ToServiceRecord() { return new ServiceRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files }; } public ServiceRecord ToServiceRecord() { return new ServiceRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files }; }
} }
} }

View File

@@ -0,0 +1,7 @@
namespace CarCareTracker.Models
{
public class SupplyUsage {
public int SupplyId { get; set; }
public decimal Quantity { get; set; }
}
}

View File

@@ -10,6 +10,7 @@
public decimal Cost { get; set; } public decimal Cost { get; set; }
public string Notes { get; set; } public string Notes { get; set; }
public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>(); public List<UploadedFiles> Files { get; set; } = new List<UploadedFiles>();
public List<SupplyUsage> Supplies { get; set; } = new List<SupplyUsage>();
public UpgradeRecord ToUpgradeRecord() { return new UpgradeRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files }; } public UpgradeRecord ToUpgradeRecord() { return new UpgradeRecord { Id = Id, VehicleId = VehicleId, Date = DateTime.Parse(Date), Cost = Cost, Mileage = Mileage, Description = Description, Notes = Notes, Files = Files }; }
} }
} }

View File

@@ -6,6 +6,7 @@
var useDarkMode = userConfig.UseDarkMode; var useDarkMode = userConfig.UseDarkMode;
var enableCsvImports = userConfig.EnableCsvImports; var enableCsvImports = userConfig.EnableCsvImports;
var shortDatePattern = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern; var shortDatePattern = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
var numberFormat = System.Globalization.CultureInfo.CurrentCulture.NumberFormat;
shortDatePattern = shortDatePattern.ToLower(); shortDatePattern = shortDatePattern.ToLower();
if (!shortDatePattern.Contains("dd")) if (!shortDatePattern.Contains("dd"))
{ {
@@ -54,6 +55,21 @@
pattern: "@shortDatePattern" pattern: "@shortDatePattern"
} }
} }
function globalParseFloat(input){
//remove thousands separator.
var thousandSeparator = "@numberFormat.NumberGroupSeparator";
var decimalSeparator = "@numberFormat.NumberDecimalSeparator";
//strip thousands from input.
input = input.replace(thousandSeparator, "");
//convert to JS format where decimal is only separated by .
input = input.replace(decimalSeparator, ".");
return parseFloat(input);
}
function globalFloatToString(input) {
var decimalSeparator = "@numberFormat.NumberDecimalSeparator";
input = input.replace(".", decimalSeparator);
return input;
}
</script> </script>
@await RenderSectionAsync("Scripts", required: false) @await RenderSectionAsync("Scripts", required: false)
</head> </head>

View File

@@ -153,6 +153,11 @@
</div> </div>
</div> </div>
</div> </div>
<div class="modal fade" data-bs-focus="false" id="inputSuppliesModal" tabindex="-1" role="dialog" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content" id="inputSuppliesModalContent"></div>
</div>
</div>
<script> <script>
function GetVehicleId() { function GetVehicleId() {
return { vehicleId: @Model.Id}; return { vehicleId: @Model.Id};

View File

@@ -23,6 +23,10 @@
<input type="text" id="collisionRecordDescription" class="form-control" placeholder="Description of item(s) repaired(i.e. Alternator)" value="@Model.Description"> <input type="text" id="collisionRecordDescription" class="form-control" placeholder="Description of item(s) repaired(i.e. Alternator)" value="@Model.Description">
<label for="collisionRecordCost">Cost</label> <label for="collisionRecordCost">Cost</label>
<input type="text" id="collisionRecordCost" class="form-control" placeholder="Cost of the repair" value="@(isNew ? "" : Model.Cost)"> <input type="text" id="collisionRecordCost" class="form-control" placeholder="Cost of the repair" value="@(isNew ? "" : Model.Cost)">
@if (isNew)
{
@await Html.PartialAsync("_SupplyStore", "RepairRecord")
}
</div> </div>
<div class="col-md-6 col-12"> <div class="col-md-6 col-12">
<label for="collisionRecordNotes">Notes(optional)</label> <label for="collisionRecordNotes">Notes(optional)</label>
@@ -71,6 +75,7 @@
</div> </div>
<script> <script>
var uploadedFiles = []; var uploadedFiles = [];
var selectedSupplies = [];
getUploadedFilesFromModel(); getUploadedFilesFromModel();
function getUploadedFilesFromModel() { function getUploadedFilesFromModel() {
@foreach (UploadedFiles filesUploaded in Model.Files) @foreach (UploadedFiles filesUploaded in Model.Files)

View File

@@ -16,6 +16,10 @@
<input type="text" id="planRecordDescription" class="form-control" placeholder="Describe the Plan" value="@Model.Description"> <input type="text" id="planRecordDescription" class="form-control" placeholder="Describe the Plan" value="@Model.Description">
<label for="planRecordCost">Cost</label> <label for="planRecordCost">Cost</label>
<input type="text" id="planRecordCost" class="form-control" placeholder="Cost of the Plan" value="@Model.Cost"> <input type="text" id="planRecordCost" class="form-control" placeholder="Cost of the Plan" value="@Model.Cost">
@if (isNew)
{
@await Html.PartialAsync("_SupplyStore", "PlanRecord")
}
<label for="planRecordType">Type</label> <label for="planRecordType">Type</label>
<select class="form-select" id="planRecordType"> <select class="form-select" id="planRecordType">
<!option value="ServiceRecord" @(Model.ImportMode == ImportMode.ServiceRecord || isNew ? "selected" : "")>Service</!option> <!option value="ServiceRecord" @(Model.ImportMode == ImportMode.ServiceRecord || isNew ? "selected" : "")>Service</!option>
@@ -78,6 +82,7 @@
</div> </div>
<script> <script>
var uploadedFiles = []; var uploadedFiles = [];
var selectedSupplies = [];
getUploadedFilesFromModel(); getUploadedFilesFromModel();
function getUploadedFilesFromModel() { function getUploadedFilesFromModel() {
@foreach (UploadedFiles filesUploaded in Model.Files) @foreach (UploadedFiles filesUploaded in Model.Files)

View File

@@ -24,23 +24,23 @@
<div class="col-md-1 d-sm-none d-md-block"></div> <div class="col-md-1 d-sm-none d-md-block"></div>
<div class="col-12 col-md-10 reportsCheckBoxContainer"> <div class="col-12 col-md-10 reportsCheckBoxContainer">
<div class="form-check form-check-inline"> <div class="form-check form-check-inline">
<input class="form-check-input" onChange="updateCheck(this)" type="checkbox" id="serviceExpenseCheck" value="1" checked> <input class="form-check-input" onChange="updateCheck()" type="checkbox" id="serviceExpenseCheck" value="1" checked>
<label class="form-check-label" for="serviceExpenseCheck">Service</label> <label class="form-check-label" for="serviceExpenseCheck">Service</label>
</div> </div>
<div class="form-check form-check-inline"> <div class="form-check form-check-inline">
<input class="form-check-input" onChange="updateCheck(this)" type="checkbox" id="repairExpenseCheck" value="2" checked> <input class="form-check-input" onChange="updateCheck()" type="checkbox" id="repairExpenseCheck" value="2" checked>
<label class="form-check-label" for="repairExpenseCheck">Repairs</label> <label class="form-check-label" for="repairExpenseCheck">Repairs</label>
</div> </div>
<div class="form-check form-check-inline"> <div class="form-check form-check-inline">
<input class="form-check-input" onChange="updateCheck(this)" type="checkbox" id="upgradeExpenseCheck" value="3" checked> <input class="form-check-input" onChange="updateCheck()" type="checkbox" id="upgradeExpenseCheck" value="3" checked>
<label class="form-check-label" for="upgradeExpenseCheck">Upgrades</label> <label class="form-check-label" for="upgradeExpenseCheck">Upgrades</label>
</div> </div>
<div class="form-check form-check-inline"> <div class="form-check form-check-inline">
<input class="form-check-input" onChange="updateCheck(this)" type="checkbox" id="gasExpenseCheck" value="4" checked> <input class="form-check-input" onChange="updateCheck()" type="checkbox" id="gasExpenseCheck" value="4" checked>
<label class="form-check-label" for="gasExpenseCheck">Gas</label> <label class="form-check-label" for="gasExpenseCheck">Gas</label>
</div> </div>
<div class="form-check form-check-inline"> <div class="form-check form-check-inline">
<input class="form-check-input" onChange="updateCheck(this)" type="checkbox" id="taxExpenseCheck" value="5" checked> <input class="form-check-input" onChange="updateCheck()" type="checkbox" id="taxExpenseCheck" value="5" checked>
<label class="form-check-label" for="taxExpenseCheck">Tax</label> <label class="form-check-label" for="taxExpenseCheck">Tax</label>
</div> </div>
</div> </div>

View File

@@ -23,6 +23,10 @@
<input type="text" id="serviceRecordDescription" class="form-control" placeholder="Description of item(s) serviced(i.e. Oil Change)" value="@Model.Description"> <input type="text" id="serviceRecordDescription" class="form-control" placeholder="Description of item(s) serviced(i.e. Oil Change)" value="@Model.Description">
<label for="serviceRecordCost">Cost</label> <label for="serviceRecordCost">Cost</label>
<input type="text" id="serviceRecordCost" class="form-control" placeholder="Cost of the service" value="@(isNew ? "" : Model.Cost)"> <input type="text" id="serviceRecordCost" class="form-control" placeholder="Cost of the service" value="@(isNew ? "" : Model.Cost)">
@if (isNew)
{
@await Html.PartialAsync("_SupplyStore", "ServiceRecord")
}
</div> </div>
<div class="col-md-6 col-12"> <div class="col-md-6 col-12">
<label for="serviceRecordNotes">Notes(optional)</label> <label for="serviceRecordNotes">Notes(optional)</label>
@@ -71,6 +75,7 @@
</div> </div>
<script> <script>
var uploadedFiles = []; var uploadedFiles = [];
var selectedSupplies = [];
getUploadedFilesFromModel(); getUploadedFilesFromModel();
function getUploadedFilesFromModel() { function getUploadedFilesFromModel() {
@foreach (UploadedFiles filesUploaded in Model.Files) @foreach (UploadedFiles filesUploaded in Model.Files)

View File

@@ -0,0 +1,91 @@
@model string
<div class="row">
<div class="col-12">
<a onclick="showSuppliesModal()" class="btn btn-link">Choose Supplies</a>
</div>
</div>
<script>
resetSuppliesModal();
function GetCaller() {
return { tab: '@Model' };
}
function resetSuppliesModal() {
$("#inputSuppliesModalContent").html("");
}
function selectSupplies() {
var selectedSupplyResult = getSuppliesAndQuantity();
var caller = GetCaller().tab;
switch (caller) {
case "ServiceRecord":
$('#serviceRecordCost').val(selectedSupplyResult.totalSum);
break;
case "RepairRecord":
$('#collisionRecordCost').val(selectedSupplyResult.totalSum);
break;
case "UpgradeRecord":
$('#upgradeRecordCost').val(selectedSupplyResult.totalSum);
break;
case "PlanRecord":
$('#planRecordCost').val(selectedSupplyResult.totalSum);
break;
}
selectedSupplies = getSuppliesAndQuantity().selectedSupplies;
hideSuppliesModal();
}
function hideParentModal(){
var caller = GetCaller().tab;
switch (caller) {
case "ServiceRecord":
$('#serviceRecordModal').modal('hide');
break;
case "RepairRecord":
$('#collisionRecordModal').modal('hide');
break;
case "UpgradeRecord":
$('#upgradeRecordModal').modal('hide');
break;
case "PlanRecord":
$('#planRecordModal').modal('hide');
break;
}
}
function showParentModal() {
var caller = GetCaller().tab;
switch (caller) {
case "ServiceRecord":
$('#serviceRecordModal').modal('show');
break;
case "RepairRecord":
$('#collisionRecordModal').modal('show');
break;
case "UpgradeRecord":
$('#upgradeRecordModal').modal('show');
break;
case "PlanRecord":
$('#planRecordModal').modal('show');
break;
}
}
function showSuppliesModal() {
if ($("#inputSuppliesModalContent").html() == "") {
getSupplies();
} else {
hideParentModal();
$('#inputSuppliesModal').modal('show');
}
}
function getSupplies() {
var vehicleId = GetVehicleId().vehicleId;
$.get(`/Vehicle/GetSupplyRecordsForRecordsByVehicleId?vehicleId=${vehicleId}`, function (data) {
if (data) {
hideParentModal();
$("#inputSuppliesModalContent").html(data);
$('#inputSuppliesModal').modal('show');
}
})
}
function hideSuppliesModal() {
$('#inputSuppliesModal').modal('hide');
showParentModal();
}
</script>

View File

@@ -0,0 +1,127 @@
@model List<SupplyRecord>
<div class="modal-header">
<h5 class="modal-title">Select Supplies</h5>
<button type="button" class="btn-close" onclick="hideSuppliesModal()" aria-label="Close"></button>
</div>
<div class="modal-body">
@if (Model.Any())
{
<div class="row">
<div class="col-12" style="max-height:50vh; overflow-y:auto;">
<div class="alert alert-warning" role="alert">
Supplies are requisitioned immediately after the record is created and cannot be modified.
If you have incorrectly entered the amount you needed you will need to correct it in the Supplies tab.
</div>
<table class="table table-hover">
<thead class="sticky-top">
<tr class="d-flex">
<th scope="col" class="col-1"></th>
<th scope="col" class="col-2">Quantity.</th>
<th scope="col" class="col-2">In Stock</th>
<th scope="col" class="col-5">Description</th>
<th scope="col" class="col-2">Unit Cost</th>
</tr>
</thead>
<tbody>
@foreach (SupplyRecord supplyRecord in Model)
{
<tr class="d-flex" id="supplyRows">
<td class="col-1"><input class="form-check-input" type="checkbox" onchange="toggleQuantityFieldDisabled(this)" value="@supplyRecord.Id"></td>
<td class="col-2"><input type="text" disabled onchange="recalculateTotal()" class="form-control"></td>
<td class="col-2 supplyquantity">@supplyRecord.Quantity</td>
<td class="col-5">@supplyRecord.Description</td>
<td class="col-2 supplyprice">@((supplyRecord.Quantity > 0 ? supplyRecord.Cost / supplyRecord.Quantity : 0).ToString("F"))</td>
</tr>
}
</tbody>
</table>
</div>
</div>
}
else
{
<div class="row">
<div class="col-12">
<div class="text-center">
<h4>No supplies with quantities greater than 0 is found.</h4>
</div>
</div>
</div>
}
</div>
<div class="modal-footer">
<span id="supplySumLabel" style="margin-right:auto;">Total: 0.00</span>
<button type="button" class="btn btn-secondary" onclick="hideSuppliesModal()">Cancel</button>
<button type="button" class="btn btn-primary" disabled id="selectSuppliesButton" onclick="selectSupplies()">Select</button>
</div>
<script>
function recalculateTotal() {
setDebounce(getSuppliesAndQuantity);
}
function toggleQuantityFieldDisabled(e) {
var textField = getTextFieldFromCheckBox(e);
var isChecked = $(e).is(":checked");
textField.attr('disabled', !isChecked);
if (!isChecked) {
textField.removeClass("is-invalid");
}
recalculateTotal();
}
function getTextFieldFromCheckBox(elem) {
var textField = $(elem.parentElement.parentElement).find('.col-2 > input[type=text]')[0];
return $(textField);
}
function getInStockFieldFromCheckBox(elem) {
var textField = $(elem.parentElement.parentElement).find('.col-2.supplyquantity')[0];
return $(textField);
}
function getPriceFieldFromCheckBox(elem) {
var textField = $(elem.parentElement.parentElement).find('.col-2.supplyprice')[0];
return $(textField);
}
function getSuppliesAndQuantity() {
var totalSum = 0;
var hasError = false;
var selectedSupplies = $("#supplyRows :checked").map(function () {
var textField = getTextFieldFromCheckBox(this);
var inStock = getInStockFieldFromCheckBox(this);
var priceField = getPriceFieldFromCheckBox(this);
var requestedQuantity = globalParseFloat(textField.val());
var inStockQuantity = globalParseFloat(inStock.text());
var unitPrice = globalParseFloat(priceField.text());
//validation
if (isNaN(requestedQuantity) || requestedQuantity > inStockQuantity) {
textField.addClass("is-invalid");
hasError = true;
} else {
textField.removeClass("is-invalid");
}
//calculate sum.
var sum = requestedQuantity * unitPrice;
totalSum += sum;
return {
supplyId: this.value,
quantity: textField.val()
};
});
if (isNaN(totalSum) || hasError) {
$("#supplySumLabel").text(`Total: 0.00`);
} else {
totalSum = totalSum.toFixed(2);
var parsedFloat = globalFloatToString(totalSum);
$("#supplySumLabel").text(`Total: ${parsedFloat}`);
}
$("#selectSuppliesButton").attr('disabled', (hasError || totalSum == 0));
if (!hasError) {
return {
totalSum: totalSum,
selectedSupplies: selectedSupplies.toArray()
};
} else {
return {
totalSum: 0,
selectedSupplies: []
}
}
}
</script>

View File

@@ -23,6 +23,10 @@
<input type="text" id="upgradeRecordDescription" class="form-control" placeholder="Description of item(s) upgraded/modded" value="@Model.Description"> <input type="text" id="upgradeRecordDescription" class="form-control" placeholder="Description of item(s) upgraded/modded" value="@Model.Description">
<label for="upgradeRecordCost">Cost</label> <label for="upgradeRecordCost">Cost</label>
<input type="text" id="upgradeRecordCost" class="form-control" placeholder="Cost of the upgrade/mods" value="@(isNew ? "" : Model.Cost)"> <input type="text" id="upgradeRecordCost" class="form-control" placeholder="Cost of the upgrade/mods" value="@(isNew ? "" : Model.Cost)">
@if (isNew)
{
@await Html.PartialAsync("_SupplyStore", "UpgradeRecord")
}
</div> </div>
<div class="col-md-6 col-12"> <div class="col-md-6 col-12">
<label for="upgradeRecordNotes">Notes(optional)</label> <label for="upgradeRecordNotes">Notes(optional)</label>
@@ -71,6 +75,7 @@
</div> </div>
<script> <script>
var uploadedFiles = []; var uploadedFiles = [];
var selectedSupplies = [];
getUploadedFilesFromModel(); getUploadedFilesFromModel();
function getUploadedFilesFromModel() { function getUploadedFilesFromModel() {
@foreach (UploadedFiles filesUploaded in Model.Files) @foreach (UploadedFiles filesUploaded in Model.Files)

View File

@@ -114,6 +114,7 @@ function getAndValidateCollisionRecordValues() {
cost: collisionCost, cost: collisionCost,
notes: collisionNotes, notes: collisionNotes,
files: uploadedFiles, files: uploadedFiles,
supplies: selectedSupplies,
addReminderRecord: addReminderRecord addReminderRecord: addReminderRecord
} }
} }

View File

@@ -91,20 +91,20 @@ function getAndValidateGasRecordValues() {
} else { } else {
$("#gasRecordMileage").removeClass("is-invalid"); $("#gasRecordMileage").removeClass("is-invalid");
} }
if (gasGallons.trim() == '' || parseFloat(gasGallons) <= 0) { if (gasGallons.trim() == '' || globalParseFloat(gasGallons) <= 0) {
hasError = true; hasError = true;
$("#gasRecordGallons").addClass("is-invalid"); $("#gasRecordGallons").addClass("is-invalid");
} else { } else {
$("#gasRecordGallons").removeClass("is-invalid"); $("#gasRecordGallons").removeClass("is-invalid");
} }
if (gasCostType != undefined && gasCostType == 'unit') { if (gasCostType != undefined && gasCostType == 'unit') {
var convertedGasCost = parseFloat(gasCost) * parseFloat(gasGallons); var convertedGasCost = globalParseFloat(gasCost) * globalParseFloat(gasGallons);
gasCost = convertedGasCost.toFixed(2).toString(); if (isNaN(convertedGasCost))
if (isNaN(gasCost))
{ {
hasError = true; hasError = true;
$("#gasRecordCost").addClass("is-invalid"); $("#gasRecordCost").addClass("is-invalid");
} else { } else {
gasCost = globalFloatToString(convertedGasCost.toFixed(2).toString());
$("#gasRecordCost").removeClass("is-invalid"); $("#gasRecordCost").removeClass("is-invalid");
} }
} }

View File

@@ -102,6 +102,7 @@ function getAndValidatePlanRecordValues() {
cost: planCost, cost: planCost,
notes: planNotes, notes: planNotes,
files: uploadedFiles, files: uploadedFiles,
supplies: selectedSupplies,
priority: planPriority, priority: planPriority,
progress: planProgress, progress: planProgress,
importMode: planType importMode: planType

View File

@@ -12,12 +12,8 @@ function generateVehicleHistoryReport() {
} }
}) })
} }
var debounce = null; function updateCheck() {
function updateCheck(sender) { setDebounce(refreshBarChart);
clearTimeout(debounce);
debounce = setTimeout(function () {
refreshBarChart();
}, 1000);
} }
function refreshMPGChart() { function refreshMPGChart() {
var vehicleId = GetVehicleId().vehicleId; var vehicleId = GetVehicleId().vehicleId;
@@ -26,7 +22,7 @@ function refreshMPGChart() {
$("#monthFuelMileageReportContent").html(data); $("#monthFuelMileageReportContent").html(data);
}) })
} }
function refreshBarChart(callBack) { function refreshBarChart() {
var selectedMetrics = []; var selectedMetrics = [];
var vehicleId = GetVehicleId().vehicleId; var vehicleId = GetVehicleId().vehicleId;
var year = getYear(); var year = getYear();

View File

@@ -114,6 +114,7 @@ function getAndValidateServiceRecordValues() {
cost: serviceCost, cost: serviceCost,
notes: serviceNotes, notes: serviceNotes,
files: uploadedFiles, files: uploadedFiles,
supplies: selectedSupplies,
addReminderRecord: addReminderRecord addReminderRecord: addReminderRecord
} }
} }

View File

@@ -148,3 +148,10 @@ function decodeHTMLEntities(text) {
.html(text) .html(text)
.text(); .text();
} }
var debounce = null;
function setDebounce(callBack) {
clearTimeout(debounce);
debounce = setTimeout(function () {
callBack();
}, 1000);
}

View File

@@ -93,7 +93,7 @@ function getAndValidateSupplyRecordValues() {
} else { } else {
$("#supplyRecordDescription").removeClass("is-invalid"); $("#supplyRecordDescription").removeClass("is-invalid");
} }
if (supplyQuantity.trim() == '' || !isValidMoney(supplyQuantity) || parseFloat(supplyQuantity) < 0) { if (supplyQuantity.trim() == '' || !isValidMoney(supplyQuantity) || globalParseFloat(supplyQuantity) < 0) {
hasError = true; hasError = true;
$("#supplyRecordQuantity").addClass("is-invalid"); $("#supplyRecordQuantity").addClass("is-invalid");
} else { } else {

View File

@@ -114,6 +114,7 @@ function getAndValidateUpgradeRecordValues() {
cost: upgradeCost, cost: upgradeCost,
notes: upgradeNotes, notes: upgradeNotes,
files: uploadedFiles, files: uploadedFiles,
supplies: selectedSupplies,
addReminderRecord: addReminderRecord addReminderRecord: addReminderRecord
} }
} }