diff --git a/Vpassbackend/Controllers/FuelEfficiencyController.cs b/Vpassbackend/Controllers/FuelEfficiencyController.cs new file mode 100644 index 0000000..3886b1a --- /dev/null +++ b/Vpassbackend/Controllers/FuelEfficiencyController.cs @@ -0,0 +1,175 @@ +using Microsoft.AspNetCore.Mvc; +using Vpassbackend.DTOs; +using Vpassbackend.Services; +using System.Globalization; + +namespace Vpassbackend.Controllers +{ + [ApiController] + [Route("api/[controller]")] + public class FuelEfficiencyController : ControllerBase + { + private readonly IFuelEfficiencyService _fuelEfficiencyService; + + public FuelEfficiencyController(IFuelEfficiencyService fuelEfficiencyService) + { + _fuelEfficiencyService = fuelEfficiencyService; + } + + // GET: api/FuelEfficiency/vehicle/{vehicleId} + [HttpGet("vehicle/{vehicleId}")] + public async Task>> GetFuelEfficienciesByVehicle(int vehicleId) + { + try + { + var fuelEfficiencies = await _fuelEfficiencyService.GetFuelRecordsByVehicleAsync(vehicleId); + return Ok(fuelEfficiencies); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + + // GET: api/FuelEfficiency/vehicle/{vehicleId}/summary + [HttpGet("vehicle/{vehicleId}/summary")] + public async Task> GetFuelEfficiencySummary(int vehicleId, [FromQuery] int? year = null) + { + try + { + var summary = await _fuelEfficiencyService.GetFuelSummaryAsync(vehicleId, year); + return Ok(summary); + } + catch (ArgumentException ex) + { + return NotFound(ex.Message); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + + // GET: api/FuelEfficiency/vehicle/{vehicleId}/chart/{year} + [HttpGet("vehicle/{vehicleId}/chart/{year}")] + public async Task>> GetMonthlyChartData(int vehicleId, int year) + { + try + { + var chartData = await _fuelEfficiencyService.GetMonthlyChartDataAsync(vehicleId, year); + return Ok(chartData); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + + // POST: api/FuelEfficiency + [HttpPost] + public async Task> AddFuelEfficiency(AddFuelEfficiencyDTO addFuelDto) + { + try + { + var result = await _fuelEfficiencyService.AddFuelRecordAsync(addFuelDto); + return CreatedAtAction(nameof(GetFuelEfficienciesByVehicle), + new { vehicleId = result.VehicleId }, result); + } + catch (ArgumentException ex) + { + return BadRequest(ex.Message); + } + catch (Exception) + { + return BadRequest("An error occurred while adding fuel record"); + } + } + + // PUT: api/FuelEfficiency/{id} + [HttpPut("{id}")] + public async Task UpdateFuelEfficiency(int id, AddFuelEfficiencyDTO updateFuelDto) + { + try + { + var success = await _fuelEfficiencyService.UpdateFuelRecordAsync(id, updateFuelDto); + if (!success) + { + return NotFound("Fuel efficiency record not found"); + } + return NoContent(); + } + catch (ArgumentException ex) + { + return BadRequest(ex.Message); + } + catch (Exception) + { + return BadRequest("An error occurred while updating fuel record"); + } + } + + // DELETE: api/FuelEfficiency/{id} + [HttpDelete("{id}")] + public async Task DeleteFuelEfficiency(int id) + { + try + { + var success = await _fuelEfficiencyService.DeleteFuelRecordAsync(id); + if (!success) + { + return NotFound("Fuel efficiency record not found"); + } + return NoContent(); + } + catch (Exception) + { + return BadRequest("An error occurred while deleting fuel record"); + } + } + + // GET: api/FuelEfficiency/vehicle/{vehicleId}/monthly/{year}/{month} + [HttpGet("vehicle/{vehicleId}/monthly/{year}/{month}")] + public async Task>> GetMonthlyFuelRecords(int vehicleId, int year, int month) + { + try + { + var fuelRecords = await _fuelEfficiencyService.GetFuelRecordsByMonthAsync(vehicleId, year, month); + return Ok(fuelRecords); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + + // GET: api/FuelEfficiency/vehicle/{vehicleId}/period + [HttpGet("vehicle/{vehicleId}/period")] + public async Task> GetFuelForPeriod(int vehicleId, [FromQuery] DateTime startDate, [FromQuery] DateTime endDate) + { + try + { + var totalFuel = await _fuelEfficiencyService.GetTotalFuelForPeriodAsync(vehicleId, startDate, endDate); + return Ok(new { TotalFuel = totalFuel, StartDate = startDate, EndDate = endDate }); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + + // GET: api/FuelEfficiency/vehicle/{vehicleId}/average/{year} + [HttpGet("vehicle/{vehicleId}/average/{year}")] + public async Task> GetAverageFuelPerMonth(int vehicleId, int year) + { + try + { + var averageFuel = await _fuelEfficiencyService.GetAverageFuelPerMonthAsync(vehicleId, year); + return Ok(new { AverageMonthlyFuel = averageFuel, Year = year }); + } + catch (Exception ex) + { + return BadRequest(ex.Message); + } + } + } +} diff --git a/Vpassbackend/DTOs/FuelEfficiencyDTO.cs b/Vpassbackend/DTOs/FuelEfficiencyDTO.cs new file mode 100644 index 0000000..0dfe5c2 --- /dev/null +++ b/Vpassbackend/DTOs/FuelEfficiencyDTO.cs @@ -0,0 +1,44 @@ +using System.ComponentModel.DataAnnotations; + +namespace Vpassbackend.DTOs +{ + public class AddFuelEfficiencyDTO + { + [Required] + public int VehicleId { get; set; } + + [Required] + [Range(0.01, 1000, ErrorMessage = "Fuel amount must be between 0.01 and 1000 liters")] + public decimal FuelAmount { get; set; } + + [Required] + public DateTime Date { get; set; } + } + + public class FuelEfficiencyDTO + { + public int FuelEfficiencyId { get; set; } + public int VehicleId { get; set; } + public decimal FuelAmount { get; set; } + public DateTime Date { get; set; } + public DateTime CreatedAt { get; set; } + } + + public class MonthlyFuelSummaryDTO + { + public int Year { get; set; } + public int Month { get; set; } + public string MonthName { get; set; } = string.Empty; + public decimal TotalFuelAmount { get; set; } + public int RecordCount { get; set; } + } + + public class FuelEfficiencySummaryDTO + { + public int VehicleId { get; set; } + public string VehicleRegistrationNumber { get; set; } = string.Empty; + public List MonthlySummary { get; set; } = new List(); + public decimal TotalFuelThisYear { get; set; } + public decimal AverageMonthlyFuel { get; set; } + } +} diff --git a/Vpassbackend/Data/ApplicationDbContext.cs b/Vpassbackend/Data/ApplicationDbContext.cs index a745430..d2a2bb7 100644 --- a/Vpassbackend/Data/ApplicationDbContext.cs +++ b/Vpassbackend/Data/ApplicationDbContext.cs @@ -24,6 +24,7 @@ public ApplicationDbContext(DbContextOptions options) public DbSet Vehicles { get; set; } public DbSet VehicleServiceHistories { get; set; } public DbSet EmergencyCallCenters { get; set; } + public DbSet FuelEfficiencies { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) @@ -104,6 +105,13 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .WithMany(s => s.ServiceReminders) .HasForeignKey(sr => sr.ServiceId) .OnDelete(DeleteBehavior.Cascade); + + // Configure FuelEfficiency relationships + modelBuilder.Entity() + .HasOne(fe => fe.Vehicle) + .WithMany(v => v.FuelEfficiencies) + .HasForeignKey(fe => fe.VehicleId) + .OnDelete(DeleteBehavior.Cascade); } } } diff --git a/Vpassbackend/Examples/FuelEfficiency_API_Guide.md b/Vpassbackend/Examples/FuelEfficiency_API_Guide.md new file mode 100644 index 0000000..c671bf9 --- /dev/null +++ b/Vpassbackend/Examples/FuelEfficiency_API_Guide.md @@ -0,0 +1,256 @@ +# Fuel Efficiency API Documentation + +## Overview +The Fuel Efficiency API provides comprehensive functionality for tracking vehicle fuel consumption, generating monthly summaries, and displaying chart data for fuel usage patterns. + +## Base URL +``` +/api/FuelEfficiency +``` + +## Endpoints + +### 1. Add Fuel Record +**POST** `/api/FuelEfficiency` + +Add a new fuel record for a vehicle. + +**Request Body:** +```json +{ + "vehicleId": 1, + "fuelAmount": 50.5, + "date": "2025-04-15", + "notes": "Gas station near home" +} +``` + +**Response:** +```json +{ + "fuelEfficiencyId": 123, + "vehicleId": 1, + "fuelAmount": 50.5, + "date": "2025-04-15T00:00:00", + "notes": "Gas station near home", + "createdAt": "2025-04-15T10:30:00Z" +} +``` + +### 2. Get Vehicle Fuel Records +**GET** `/api/FuelEfficiency/vehicle/{vehicleId}` + +Get all fuel records for a specific vehicle, ordered by date (newest first). + +**Response:** +```json +[ + { + "fuelEfficiencyId": 123, + "vehicleId": 1, + "fuelAmount": 50.5, + "date": "2025-04-15T00:00:00", + "notes": "Gas station near home", + "createdAt": "2025-04-15T10:30:00Z" + }, + { + "fuelEfficiencyId": 122, + "vehicleId": 1, + "fuelAmount": 45.0, + "date": "2025-04-01T00:00:00", + "notes": "Monthly refill", + "createdAt": "2025-04-01T09:15:00Z" + } +] +``` + +### 3. Get Fuel Summary with Chart Data +**GET** `/api/FuelEfficiency/vehicle/{vehicleId}/summary?year=2025` + +Get comprehensive fuel summary including monthly chart data for the specified year. + +**Response:** +```json +{ + "vehicleId": 1, + "vehicleRegistrationNumber": "ABC-1234", + "monthlySummary": [ + { + "year": 2025, + "month": 1, + "monthName": "January", + "totalFuelAmount": 120.5, + "recordCount": 3 + }, + { + "year": 2025, + "month": 2, + "monthName": "February", + "totalFuelAmount": 95.0, + "recordCount": 2 + }, + ... + ], + "totalFuelThisYear": 1250.5, + "averageMonthlyFuel": 104.2 +} +``` + +### 4. Get Monthly Chart Data +**GET** `/api/FuelEfficiency/vehicle/{vehicleId}/chart/{year}` + +Get chart data for all 12 months of the specified year (includes months with zero fuel). + +**Response:** +```json +[ + { + "year": 2025, + "month": 1, + "monthName": "January", + "totalFuelAmount": 120.5, + "recordCount": 3 + }, + { + "year": 2025, + "month": 2, + "monthName": "February", + "totalFuelAmount": 0, + "recordCount": 0 + }, + ... +] +``` + +### 5. Get Monthly Detail Records +**GET** `/api/FuelEfficiency/vehicle/{vehicleId}/monthly/{year}/{month}` + +Get all individual fuel records for a specific month. + +**Response:** +```json +[ + { + "fuelEfficiencyId": 123, + "vehicleId": 1, + "fuelAmount": 50.5, + "date": "2025-04-15T00:00:00", + "notes": "First fill of the month", + "createdAt": "2025-04-15T10:30:00Z" + }, + { + "fuelEfficiencyId": 124, + "vehicleId": 1, + "fuelAmount": 45.0, + "date": "2025-04-25T00:00:00", + "notes": "Second fill of the month", + "createdAt": "2025-04-25T11:45:00Z" + } +] +``` + +### 6. Get Fuel for Date Range +**GET** `/api/FuelEfficiency/vehicle/{vehicleId}/period?startDate=2025-01-01&endDate=2025-03-31` + +Get total fuel consumption for a specific date range. + +**Response:** +```json +{ + "totalFuel": 315.5, + "startDate": "2025-01-01T00:00:00", + "endDate": "2025-03-31T00:00:00" +} +``` + +### 7. Get Average Monthly Fuel +**GET** `/api/FuelEfficiency/vehicle/{vehicleId}/average/{year}` + +Get the average fuel consumption per month for the specified year. + +**Response:** +```json +{ + "averageMonthlyFuel": 104.2, + "year": 2025 +} +``` + +### 8. Update Fuel Record +**PUT** `/api/FuelEfficiency/{id}` + +Update an existing fuel record. + +**Request Body:** +```json +{ + "vehicleId": 1, + "fuelAmount": 55.0, + "date": "2025-04-15", + "notes": "Updated amount - premium fuel" +} +``` + +**Response:** 204 No Content + +### 9. Delete Fuel Record +**DELETE** `/api/FuelEfficiency/{id}` + +Delete a fuel record. + +**Response:** 204 No Content + +## Business Logic + +### Monthly Aggregation +- Each month's bar in the chart represents the **total** fuel added during that month +- If you add 5 liters on week 1, then 10 liters on week 3, the month shows 15 liters +- If you add 2 more liters in week 4, the month total becomes 17 liters +- This cumulative approach gives you the complete fuel consumption per month + +### Chart Data Structure +- Always returns 12 months of data (January to December) +- Months with no fuel records show 0 amount +- Perfect for creating consistent bar charts +- Each bar height represents the total fuel for that month + +### Validation Rules +- Fuel amount must be greater than 0 +- Date cannot be in the future +- Vehicle must exist in the database +- Fuel amount is stored with 2 decimal precision + +### Frontend Integration Example +```javascript +// Fetch chart data for current year +fetch('/api/FuelEfficiency/vehicle/1/chart/2025') + .then(response => response.json()) + .then(data => { + // data contains 12 months with totalFuelAmount for each + const chartLabels = data.map(month => month.monthName); + const chartValues = data.map(month => month.totalFuelAmount); + + // Use chartLabels and chartValues to create your bar chart + createBarChart(chartLabels, chartValues); + }); + +// Add new fuel record +const newFuelRecord = { + vehicleId: 1, + fuelAmount: 50.5, + date: '2025-04-15', + notes: 'Regular refill' +}; + +fetch('/api/FuelEfficiency', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(newFuelRecord) +}) +.then(response => response.json()) +.then(result => { + console.log('Fuel record added:', result); + // Refresh chart data + refreshChart(); +}); +``` diff --git a/Vpassbackend/Examples/fuel-efficiency-frontend.js b/Vpassbackend/Examples/fuel-efficiency-frontend.js new file mode 100644 index 0000000..fea5f26 --- /dev/null +++ b/Vpassbackend/Examples/fuel-efficiency-frontend.js @@ -0,0 +1,292 @@ +// Fuel Efficiency Frontend Integration Example +// This shows how to integrate the fuel efficiency API with your frontend + +class FuelEfficiencyManager { + constructor(baseUrl, vehicleId) { + this.baseUrl = baseUrl; + this.vehicleId = vehicleId; + } + + // Add new fuel record + async addFuel(fuelAmount, date, notes = '') { + try { + const response = await fetch(`${this.baseUrl}/api/FuelEfficiency`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + vehicleId: this.vehicleId, + fuelAmount: parseFloat(fuelAmount), + date: date, + notes: notes + }) + }); + + if (!response.ok) { + const error = await response.text(); + throw new Error(error); + } + + const result = await response.json(); + console.log('Fuel added successfully:', result); + return result; + } catch (error) { + console.error('Error adding fuel:', error); + throw error; + } + } + + // Get chart data for the current year + async getChartData(year = new Date().getFullYear()) { + try { + const response = await fetch(`${this.baseUrl}/api/FuelEfficiency/vehicle/${this.vehicleId}/chart/${year}`); + + if (!response.ok) { + throw new Error('Failed to fetch chart data'); + } + + const data = await response.json(); + + // Transform data for chart libraries (like Chart.js) + return { + labels: data.map(month => month.monthName), + datasets: [{ + label: 'Monthly Fuel Usage (Liters)', + data: data.map(month => month.totalFuelAmount), + backgroundColor: 'rgba(54, 162, 235, 0.6)', + borderColor: 'rgba(54, 162, 235, 1)', + borderWidth: 1 + }] + }; + } catch (error) { + console.error('Error fetching chart data:', error); + throw error; + } + } + + // Get fuel summary with statistics + async getFuelSummary(year = new Date().getFullYear()) { + try { + const response = await fetch(`${this.baseUrl}/api/FuelEfficiency/vehicle/${this.vehicleId}/summary?year=${year}`); + + if (!response.ok) { + throw new Error('Failed to fetch fuel summary'); + } + + return await response.json(); + } catch (error) { + console.error('Error fetching fuel summary:', error); + throw error; + } + } + + // Get all fuel records for a vehicle + async getAllFuelRecords() { + try { + const response = await fetch(`${this.baseUrl}/api/FuelEfficiency/vehicle/${this.vehicleId}`); + + if (!response.ok) { + throw new Error('Failed to fetch fuel records'); + } + + return await response.json(); + } catch (error) { + console.error('Error fetching fuel records:', error); + throw error; + } + } + + // Delete a fuel record + async deleteFuelRecord(fuelRecordId) { + try { + const response = await fetch(`${this.baseUrl}/api/FuelEfficiency/${fuelRecordId}`, { + method: 'DELETE' + }); + + if (!response.ok) { + throw new Error('Failed to delete fuel record'); + } + + console.log('Fuel record deleted successfully'); + return true; + } catch (error) { + console.error('Error deleting fuel record:', error); + throw error; + } + } +} + +// Example usage +const fuelManager = new FuelEfficiencyManager('https://localhost:5001', 1); + +// Function to handle fuel addition form +async function handleAddFuel() { + const fuelAmount = document.getElementById('fuelAmount').value; + const date = document.getElementById('fuelDate').value; + const notes = document.getElementById('fuelNotes').value; + + try { + await fuelManager.addFuel(fuelAmount, date, notes); + + // Clear form + document.getElementById('fuelAmount').value = ''; + document.getElementById('fuelDate').value = ''; + document.getElementById('fuelNotes').value = ''; + + // Refresh chart + await refreshChart(); + + // Show success message + showMessage('Fuel record added successfully!', 'success'); + } catch (error) { + showMessage('Error adding fuel record: ' + error.message, 'error'); + } +} + +// Function to create/update the chart +async function refreshChart() { + try { + const chartData = await fuelManager.getChartData(); + + // Assuming you're using Chart.js + if (window.fuelChart) { + window.fuelChart.destroy(); + } + + const ctx = document.getElementById('fuelChart').getContext('2d'); + window.fuelChart = new Chart(ctx, { + type: 'bar', + data: chartData, + options: { + responsive: true, + scales: { + y: { + beginAtZero: true, + title: { + display: true, + text: 'Fuel Amount (Liters)' + } + }, + x: { + title: { + display: true, + text: 'Month' + } + } + }, + plugins: { + title: { + display: true, + text: 'Monthly Fuel Usage' + } + } + } + }); + } catch (error) { + console.error('Error refreshing chart:', error); + showMessage('Error loading chart data', 'error'); + } +} + +// Function to display fuel summary +async function displayFuelSummary() { + try { + const summary = await fuelManager.getFuelSummary(); + + document.getElementById('totalFuelYear').textContent = summary.totalFuelThisYear + ' L'; + document.getElementById('averageMonthly').textContent = summary.averageMonthlyFuel.toFixed(1) + ' L'; + document.getElementById('vehicleReg').textContent = summary.vehicleRegistrationNumber; + + } catch (error) { + console.error('Error displaying summary:', error); + } +} + +// Utility function to show messages +function showMessage(message, type) { + const messageDiv = document.getElementById('message'); + messageDiv.textContent = message; + messageDiv.className = `message ${type}`; + messageDiv.style.display = 'block'; + + setTimeout(() => { + messageDiv.style.display = 'none'; + }, 3000); +} + +// Initialize the page +document.addEventListener('DOMContentLoaded', async function() { + // Set today's date as default + document.getElementById('fuelDate').value = new Date().toISOString().split('T')[0]; + + // Load initial data + await refreshChart(); + await displayFuelSummary(); +}); + +// HTML structure example: +/* + + + + Fuel Efficiency Tracker + + + + +

Fuel Efficiency Tracker

+ + + +
+
+

Vehicle: -

+
+
+

Total This Year

+

0 L

+
+
+

Average Monthly

+

0 L

+
+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +
+ +
+ + + + +*/ diff --git a/Vpassbackend/Examples/fuel-efficiency.http b/Vpassbackend/Examples/fuel-efficiency.http new file mode 100644 index 0000000..e69de29 diff --git a/Vpassbackend/Migrations/20250713123317_InitialCreate.Designer.cs b/Vpassbackend/Migrations/20250713123317_InitialCreate.Designer.cs new file mode 100644 index 0000000..a6aa452 --- /dev/null +++ b/Vpassbackend/Migrations/20250713123317_InitialCreate.Designer.cs @@ -0,0 +1,874 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Vpassbackend.Data; + +#nullable disable + +namespace Vpassbackend.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250713123317_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.18") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Vpassbackend.Models.Appointment", b => + { + b.Property("AppointmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("AppointmentId")); + + b.Property("AppointmentDate") + .HasColumnType("datetime2"); + + b.Property("AppointmentPrice") + .HasColumnType("decimal(10, 2)"); + + b.Property("CustomerId") + .HasColumnType("int"); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ServiceId") + .HasColumnType("int"); + + b.Property("Station_id") + .HasColumnType("int"); + + b.Property("Status") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("Type") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("AppointmentId"); + + b.HasIndex("CustomerId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("Station_id"); + + b.HasIndex("VehicleId"); + + b.ToTable("Appointments"); + }); + + modelBuilder.Entity("Vpassbackend.Models.BorderPoint", b => + { + b.Property("PointId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("PointId")); + + b.Property("CheckDate") + .HasColumnType("datetime2"); + + b.Property("CheckPoint") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("EntryPoint") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("PointId"); + + b.HasIndex("VehicleId"); + + b.ToTable("BorderPoints"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Customer", b => + { + b.Property("CustomerId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("CustomerId")); + + b.Property("Address") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("IsEmailVerified") + .HasColumnType("bit"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("LoyaltyPoints") + .HasColumnType("int"); + + b.Property("NIC") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("OtpCode") + .HasColumnType("nvarchar(max)"); + + b.Property("OtpExpiry") + .HasColumnType("datetime2"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("CustomerId"); + + b.ToTable("Customers"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Document", b => + { + b.Property("DocumentId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("DocumentId")); + + b.Property("DocumentType") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ExpiryDate") + .HasColumnType("datetime2"); + + b.Property("FilePath") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("UploadDate") + .HasColumnType("datetime2"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("DocumentId"); + + b.HasIndex("VehicleId"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Vpassbackend.Models.EmergencyCallCenter", b => + { + b.Property("CenterId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("CenterId")); + + b.Property("Address") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("nvarchar(300)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("PhoneNumber") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("RegistrationNumber") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.HasKey("CenterId"); + + b.ToTable("EmergencyCallCenters"); + }); + + modelBuilder.Entity("Vpassbackend.Models.FuelEfficiency", b => + { + b.Property("FuelEfficiencyId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("FuelEfficiencyId")); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Date") + .HasColumnType("datetime2"); + + b.Property("FuelAmount") + .HasColumnType("decimal(10,2)"); + + b.Property("Notes") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("FuelEfficiencyId"); + + b.HasIndex("VehicleId"); + + b.ToTable("FuelEfficiencies"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Invoice", b => + { + b.Property("InvoiceId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("InvoiceId")); + + b.Property("InvoiceDate") + .HasColumnType("datetime2"); + + b.Property("TotalCost") + .HasColumnType("decimal(10, 2)"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("InvoiceId"); + + b.HasIndex("VehicleId"); + + b.ToTable("Invoices"); + }); + + modelBuilder.Entity("Vpassbackend.Models.PaymentLog", b => + { + b.Property("LogId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("LogId")); + + b.Property("InvoiceId") + .HasColumnType("int"); + + b.Property("PaymentDate") + .HasColumnType("datetime2"); + + b.Property("Status") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("LogId"); + + b.HasIndex("InvoiceId"); + + b.ToTable("PaymentLogs"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Service", b => + { + b.Property("ServiceId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ServiceId")); + + b.Property("BasePrice") + .HasColumnType("decimal(10, 2)"); + + b.Property("Category") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("LoyaltyPoints") + .HasColumnType("int"); + + b.Property("ServiceName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.HasKey("ServiceId"); + + b.ToTable("Services"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenter", b => + { + b.Property("Station_id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Station_id")); + + b.Property("Address") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Email") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("OwnerName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("RegisterationNumber") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Station_name") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("Station_status") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("Telephone") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("VATNumber") + .HasMaxLength(15) + .HasColumnType("nvarchar(15)"); + + b.HasKey("Station_id"); + + b.ToTable("ServiceCenters"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenterCheckInPoint", b => + { + b.Property("StationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("StationId")); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Station_id") + .HasColumnType("int"); + + b.HasKey("StationId"); + + b.HasIndex("Station_id"); + + b.ToTable("ServiceCenterCheckInPoints"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenterService", b => + { + b.Property("ServiceCenterServiceId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ServiceCenterServiceId")); + + b.Property("CustomPrice") + .HasColumnType("decimal(10, 2)"); + + b.Property("IsAvailable") + .HasColumnType("bit"); + + b.Property("Notes") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ServiceId") + .HasColumnType("int"); + + b.Property("Station_id") + .HasColumnType("int"); + + b.HasKey("ServiceCenterServiceId"); + + b.HasIndex("Station_id"); + + b.HasIndex("ServiceId", "Station_id") + .IsUnique(); + + b.ToTable("ServiceCenterServices"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceReminder", b => + { + b.Property("ServiceReminderId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ServiceReminderId")); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IntervalMonths") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("Notes") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("NotifyBeforeDays") + .HasColumnType("int"); + + b.Property("ReminderDate") + .HasColumnType("datetime2"); + + b.Property("ServiceId") + .HasColumnType("int"); + + b.Property("UpdatedAt") + .HasColumnType("datetime2"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("ServiceReminderId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("VehicleId"); + + b.ToTable("ServiceReminders"); + }); + + modelBuilder.Entity("Vpassbackend.Models.User", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserId")); + + b.Property("Email") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("UserRoleId") + .HasColumnType("int"); + + b.HasKey("UserId"); + + b.HasIndex("UserRoleId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Vpassbackend.Models.UserRole", b => + { + b.Property("UserRoleId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserRoleId")); + + b.Property("UserRoleName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("UserRoleId"); + + b.ToTable("UserRoles"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Vehicle", b => + { + b.Property("VehicleId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("VehicleId")); + + b.Property("Brand") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ChassisNumber") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("CustomerId") + .HasColumnType("int"); + + b.Property("Fuel") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Mileage") + .HasColumnType("int"); + + b.Property("Model") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("RegistrationNumber") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Year") + .HasColumnType("int"); + + b.HasKey("VehicleId"); + + b.HasIndex("CustomerId"); + + b.ToTable("Vehicles"); + }); + + modelBuilder.Entity("Vpassbackend.Models.VehicleServiceHistory", b => + { + b.Property("ServiceHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ServiceHistoryId")); + + b.Property("Cost") + .HasColumnType("decimal(10, 2)"); + + b.Property("Description") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ExternalServiceCenterName") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("IsVerified") + .HasColumnType("bit"); + + b.Property("Mileage") + .HasColumnType("int"); + + b.Property("ReceiptDocumentPath") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ServiceCenterId") + .HasColumnType("int"); + + b.Property("ServiceDate") + .HasColumnType("datetime2"); + + b.Property("ServiceType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ServicedByUserId") + .HasColumnType("int"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("ServiceHistoryId"); + + b.HasIndex("ServiceCenterId"); + + b.HasIndex("ServicedByUserId"); + + b.HasIndex("VehicleId"); + + b.ToTable("VehicleServiceHistories"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Appointment", b => + { + b.HasOne("Vpassbackend.Models.Customer", "Customer") + .WithMany() + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Vpassbackend.Models.Service", "Service") + .WithMany("Appointments") + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Vpassbackend.Models.ServiceCenter", "ServiceCenter") + .WithMany() + .HasForeignKey("Station_id") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("Appointments") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Customer"); + + b.Navigation("Service"); + + b.Navigation("ServiceCenter"); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.BorderPoint", b => + { + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("BorderPoints") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Document", b => + { + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("Documents") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.FuelEfficiency", b => + { + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("FuelEfficiencies") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Invoice", b => + { + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("Invoices") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.PaymentLog", b => + { + b.HasOne("Vpassbackend.Models.Invoice", "Invoice") + .WithMany("PaymentLogs") + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Invoice"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenterCheckInPoint", b => + { + b.HasOne("Vpassbackend.Models.ServiceCenter", "ServiceCenter") + .WithMany("CheckInPoints") + .HasForeignKey("Station_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ServiceCenter"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenterService", b => + { + b.HasOne("Vpassbackend.Models.Service", "Service") + .WithMany("ServiceCenterServices") + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Vpassbackend.Models.ServiceCenter", "ServiceCenter") + .WithMany("ServiceCenterServices") + .HasForeignKey("Station_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + + b.Navigation("ServiceCenter"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceReminder", b => + { + b.HasOne("Vpassbackend.Models.Service", "Service") + .WithMany("ServiceReminders") + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("ServiceReminders") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.User", b => + { + b.HasOne("Vpassbackend.Models.UserRole", "UserRole") + .WithMany() + .HasForeignKey("UserRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Vehicle", b => + { + b.HasOne("Vpassbackend.Models.Customer", "Customer") + .WithMany() + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Customer"); + }); + + modelBuilder.Entity("Vpassbackend.Models.VehicleServiceHistory", b => + { + b.HasOne("Vpassbackend.Models.ServiceCenter", "ServiceCenter") + .WithMany() + .HasForeignKey("ServiceCenterId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("Vpassbackend.Models.User", "ServicedByUser") + .WithMany() + .HasForeignKey("ServicedByUserId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("ServiceHistory") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ServiceCenter"); + + b.Navigation("ServicedByUser"); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Invoice", b => + { + b.Navigation("PaymentLogs"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Service", b => + { + b.Navigation("Appointments"); + + b.Navigation("ServiceCenterServices"); + + b.Navigation("ServiceReminders"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenter", b => + { + b.Navigation("CheckInPoints"); + + b.Navigation("ServiceCenterServices"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Vehicle", b => + { + b.Navigation("Appointments"); + + b.Navigation("BorderPoints"); + + b.Navigation("Documents"); + + b.Navigation("FuelEfficiencies"); + + b.Navigation("Invoices"); + + b.Navigation("ServiceHistory"); + + b.Navigation("ServiceReminders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Vpassbackend/Migrations/20250711055136_InitialCreate.cs b/Vpassbackend/Migrations/20250713123317_InitialCreate.cs similarity index 94% rename from Vpassbackend/Migrations/20250711055136_InitialCreate.cs rename to Vpassbackend/Migrations/20250713123317_InitialCreate.cs index 606a694..f47d983 100644 --- a/Vpassbackend/Migrations/20250711055136_InitialCreate.cs +++ b/Vpassbackend/Migrations/20250713123317_InitialCreate.cs @@ -285,6 +285,29 @@ protected override void Up(MigrationBuilder migrationBuilder) onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "FuelEfficiencies", + columns: table => new + { + FuelEfficiencyId = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + VehicleId = table.Column(type: "int", nullable: false), + FuelAmount = table.Column(type: "decimal(10,2)", nullable: false), + Date = table.Column(type: "datetime2", nullable: false), + Notes = table.Column(type: "nvarchar(200)", maxLength: 200, nullable: true), + CreatedAt = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_FuelEfficiencies", x => x.FuelEfficiencyId); + table.ForeignKey( + name: "FK_FuelEfficiencies_Vehicles_VehicleId", + column: x => x.VehicleId, + principalTable: "Vehicles", + principalColumn: "VehicleId", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "Invoices", columns: table => new @@ -429,6 +452,11 @@ protected override void Up(MigrationBuilder migrationBuilder) table: "Documents", column: "VehicleId"); + migrationBuilder.CreateIndex( + name: "IX_FuelEfficiencies_VehicleId", + table: "FuelEfficiencies", + column: "VehicleId"); + migrationBuilder.CreateIndex( name: "IX_Invoices_VehicleId", table: "Invoices", @@ -506,6 +534,9 @@ protected override void Down(MigrationBuilder migrationBuilder) migrationBuilder.DropTable( name: "EmergencyCallCenters"); + migrationBuilder.DropTable( + name: "FuelEfficiencies"); + migrationBuilder.DropTable( name: "PaymentLogs"); diff --git a/Vpassbackend/Migrations/20250711055136_InitialCreate.Designer.cs b/Vpassbackend/Migrations/20250713135707_RemoveNotesFromFuelEfficiency.Designer.cs similarity index 95% rename from Vpassbackend/Migrations/20250711055136_InitialCreate.Designer.cs rename to Vpassbackend/Migrations/20250713135707_RemoveNotesFromFuelEfficiency.Designer.cs index ae46059..37a62f5 100644 --- a/Vpassbackend/Migrations/20250711055136_InitialCreate.Designer.cs +++ b/Vpassbackend/Migrations/20250713135707_RemoveNotesFromFuelEfficiency.Designer.cs @@ -12,8 +12,8 @@ namespace Vpassbackend.Migrations { [DbContext(typeof(ApplicationDbContext))] - [Migration("20250711055136_InitialCreate")] - partial class InitialCreate + [Migration("20250713135707_RemoveNotesFromFuelEfficiency")] + partial class RemoveNotesFromFuelEfficiency { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -229,6 +229,33 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("EmergencyCallCenters"); }); + modelBuilder.Entity("Vpassbackend.Models.FuelEfficiency", b => + { + b.Property("FuelEfficiencyId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("FuelEfficiencyId")); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Date") + .HasColumnType("datetime2"); + + b.Property("FuelAmount") + .HasColumnType("decimal(10,2)"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("FuelEfficiencyId"); + + b.HasIndex("VehicleId"); + + b.ToTable("FuelEfficiencies"); + }); + modelBuilder.Entity("Vpassbackend.Models.Invoice", b => { b.Property("InvoiceId") @@ -671,6 +698,17 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Navigation("Vehicle"); }); + modelBuilder.Entity("Vpassbackend.Models.FuelEfficiency", b => + { + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("FuelEfficiencies") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Vehicle"); + }); + modelBuilder.Entity("Vpassbackend.Models.Invoice", b => { b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") @@ -818,6 +856,8 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Navigation("Documents"); + b.Navigation("FuelEfficiencies"); + b.Navigation("Invoices"); b.Navigation("ServiceHistory"); diff --git a/Vpassbackend/Migrations/20250713135707_RemoveNotesFromFuelEfficiency.cs b/Vpassbackend/Migrations/20250713135707_RemoveNotesFromFuelEfficiency.cs new file mode 100644 index 0000000..15ecf5e --- /dev/null +++ b/Vpassbackend/Migrations/20250713135707_RemoveNotesFromFuelEfficiency.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Vpassbackend.Migrations +{ + /// + public partial class RemoveNotesFromFuelEfficiency : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Notes", + table: "FuelEfficiencies"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Notes", + table: "FuelEfficiencies", + type: "nvarchar(200)", + maxLength: 200, + nullable: true); + } + } +} diff --git a/Vpassbackend/Migrations/20250713164936_AddCostToFuelEfficiency.Designer.cs b/Vpassbackend/Migrations/20250713164936_AddCostToFuelEfficiency.Designer.cs new file mode 100644 index 0000000..85c44c8 --- /dev/null +++ b/Vpassbackend/Migrations/20250713164936_AddCostToFuelEfficiency.Designer.cs @@ -0,0 +1,873 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Vpassbackend.Data; + +#nullable disable + +namespace Vpassbackend.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250713164936_AddCostToFuelEfficiency")] + partial class AddCostToFuelEfficiency + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.18") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Vpassbackend.Models.Appointment", b => + { + b.Property("AppointmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("AppointmentId")); + + b.Property("AppointmentDate") + .HasColumnType("datetime2"); + + b.Property("AppointmentPrice") + .HasColumnType("decimal(10, 2)"); + + b.Property("CustomerId") + .HasColumnType("int"); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ServiceId") + .HasColumnType("int"); + + b.Property("Station_id") + .HasColumnType("int"); + + b.Property("Status") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("Type") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("AppointmentId"); + + b.HasIndex("CustomerId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("Station_id"); + + b.HasIndex("VehicleId"); + + b.ToTable("Appointments"); + }); + + modelBuilder.Entity("Vpassbackend.Models.BorderPoint", b => + { + b.Property("PointId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("PointId")); + + b.Property("CheckDate") + .HasColumnType("datetime2"); + + b.Property("CheckPoint") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("EntryPoint") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("PointId"); + + b.HasIndex("VehicleId"); + + b.ToTable("BorderPoints"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Customer", b => + { + b.Property("CustomerId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("CustomerId")); + + b.Property("Address") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("IsEmailVerified") + .HasColumnType("bit"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("LoyaltyPoints") + .HasColumnType("int"); + + b.Property("NIC") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("OtpCode") + .HasColumnType("nvarchar(max)"); + + b.Property("OtpExpiry") + .HasColumnType("datetime2"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("CustomerId"); + + b.ToTable("Customers"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Document", b => + { + b.Property("DocumentId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("DocumentId")); + + b.Property("DocumentType") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ExpiryDate") + .HasColumnType("datetime2"); + + b.Property("FilePath") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("UploadDate") + .HasColumnType("datetime2"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("DocumentId"); + + b.HasIndex("VehicleId"); + + b.ToTable("Documents"); + }); + + modelBuilder.Entity("Vpassbackend.Models.EmergencyCallCenter", b => + { + b.Property("CenterId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("CenterId")); + + b.Property("Address") + .IsRequired() + .HasMaxLength(300) + .HasColumnType("nvarchar(300)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("PhoneNumber") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("RegistrationNumber") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.HasKey("CenterId"); + + b.ToTable("EmergencyCallCenters"); + }); + + modelBuilder.Entity("Vpassbackend.Models.FuelEfficiency", b => + { + b.Property("FuelEfficiencyId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("FuelEfficiencyId")); + + b.Property("Cost") + .HasColumnType("decimal(10,2)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Date") + .HasColumnType("datetime2"); + + b.Property("FuelAmount") + .HasColumnType("decimal(10,2)"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("FuelEfficiencyId"); + + b.HasIndex("VehicleId"); + + b.ToTable("FuelEfficiencies"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Invoice", b => + { + b.Property("InvoiceId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("InvoiceId")); + + b.Property("InvoiceDate") + .HasColumnType("datetime2"); + + b.Property("TotalCost") + .HasColumnType("decimal(10, 2)"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("InvoiceId"); + + b.HasIndex("VehicleId"); + + b.ToTable("Invoices"); + }); + + modelBuilder.Entity("Vpassbackend.Models.PaymentLog", b => + { + b.Property("LogId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("LogId")); + + b.Property("InvoiceId") + .HasColumnType("int"); + + b.Property("PaymentDate") + .HasColumnType("datetime2"); + + b.Property("Status") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("LogId"); + + b.HasIndex("InvoiceId"); + + b.ToTable("PaymentLogs"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Service", b => + { + b.Property("ServiceId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ServiceId")); + + b.Property("BasePrice") + .HasColumnType("decimal(10, 2)"); + + b.Property("Category") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Description") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("LoyaltyPoints") + .HasColumnType("int"); + + b.Property("ServiceName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.HasKey("ServiceId"); + + b.ToTable("Services"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenter", b => + { + b.Property("Station_id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Station_id")); + + b.Property("Address") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Email") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("OwnerName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("RegisterationNumber") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Station_name") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("Station_status") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("Telephone") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("VATNumber") + .HasMaxLength(15) + .HasColumnType("nvarchar(15)"); + + b.HasKey("Station_id"); + + b.ToTable("ServiceCenters"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenterCheckInPoint", b => + { + b.Property("StationId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("StationId")); + + b.Property("Name") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Station_id") + .HasColumnType("int"); + + b.HasKey("StationId"); + + b.HasIndex("Station_id"); + + b.ToTable("ServiceCenterCheckInPoints"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenterService", b => + { + b.Property("ServiceCenterServiceId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ServiceCenterServiceId")); + + b.Property("CustomPrice") + .HasColumnType("decimal(10, 2)"); + + b.Property("IsAvailable") + .HasColumnType("bit"); + + b.Property("Notes") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ServiceId") + .HasColumnType("int"); + + b.Property("Station_id") + .HasColumnType("int"); + + b.HasKey("ServiceCenterServiceId"); + + b.HasIndex("Station_id"); + + b.HasIndex("ServiceId", "Station_id") + .IsUnique(); + + b.ToTable("ServiceCenterServices"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceReminder", b => + { + b.Property("ServiceReminderId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ServiceReminderId")); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IntervalMonths") + .HasColumnType("int"); + + b.Property("IsActive") + .HasColumnType("bit"); + + b.Property("Notes") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("NotifyBeforeDays") + .HasColumnType("int"); + + b.Property("ReminderDate") + .HasColumnType("datetime2"); + + b.Property("ServiceId") + .HasColumnType("int"); + + b.Property("UpdatedAt") + .HasColumnType("datetime2"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("ServiceReminderId"); + + b.HasIndex("ServiceId"); + + b.HasIndex("VehicleId"); + + b.ToTable("ServiceReminders"); + }); + + modelBuilder.Entity("Vpassbackend.Models.User", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserId")); + + b.Property("Email") + .IsRequired() + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("UserRoleId") + .HasColumnType("int"); + + b.HasKey("UserId"); + + b.HasIndex("UserRoleId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Vpassbackend.Models.UserRole", b => + { + b.Property("UserRoleId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("UserRoleId")); + + b.Property("UserRoleName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("UserRoleId"); + + b.ToTable("UserRoles"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Vehicle", b => + { + b.Property("VehicleId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("VehicleId")); + + b.Property("Brand") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ChassisNumber") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("CustomerId") + .HasColumnType("int"); + + b.Property("Fuel") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Mileage") + .HasColumnType("int"); + + b.Property("Model") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("RegistrationNumber") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Year") + .HasColumnType("int"); + + b.HasKey("VehicleId"); + + b.HasIndex("CustomerId"); + + b.ToTable("Vehicles"); + }); + + modelBuilder.Entity("Vpassbackend.Models.VehicleServiceHistory", b => + { + b.Property("ServiceHistoryId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("ServiceHistoryId")); + + b.Property("Cost") + .HasColumnType("decimal(10, 2)"); + + b.Property("Description") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ExternalServiceCenterName") + .HasMaxLength(150) + .HasColumnType("nvarchar(150)"); + + b.Property("IsVerified") + .HasColumnType("bit"); + + b.Property("Mileage") + .HasColumnType("int"); + + b.Property("ReceiptDocumentPath") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("ServiceCenterId") + .HasColumnType("int"); + + b.Property("ServiceDate") + .HasColumnType("datetime2"); + + b.Property("ServiceType") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ServicedByUserId") + .HasColumnType("int"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("ServiceHistoryId"); + + b.HasIndex("ServiceCenterId"); + + b.HasIndex("ServicedByUserId"); + + b.HasIndex("VehicleId"); + + b.ToTable("VehicleServiceHistories"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Appointment", b => + { + b.HasOne("Vpassbackend.Models.Customer", "Customer") + .WithMany() + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Vpassbackend.Models.Service", "Service") + .WithMany("Appointments") + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Vpassbackend.Models.ServiceCenter", "ServiceCenter") + .WithMany() + .HasForeignKey("Station_id") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("Appointments") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("Customer"); + + b.Navigation("Service"); + + b.Navigation("ServiceCenter"); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.BorderPoint", b => + { + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("BorderPoints") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Document", b => + { + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("Documents") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.FuelEfficiency", b => + { + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("FuelEfficiencies") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Invoice", b => + { + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("Invoices") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.PaymentLog", b => + { + b.HasOne("Vpassbackend.Models.Invoice", "Invoice") + .WithMany("PaymentLogs") + .HasForeignKey("InvoiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Invoice"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenterCheckInPoint", b => + { + b.HasOne("Vpassbackend.Models.ServiceCenter", "ServiceCenter") + .WithMany("CheckInPoints") + .HasForeignKey("Station_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ServiceCenter"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenterService", b => + { + b.HasOne("Vpassbackend.Models.Service", "Service") + .WithMany("ServiceCenterServices") + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Vpassbackend.Models.ServiceCenter", "ServiceCenter") + .WithMany("ServiceCenterServices") + .HasForeignKey("Station_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + + b.Navigation("ServiceCenter"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceReminder", b => + { + b.HasOne("Vpassbackend.Models.Service", "Service") + .WithMany("ServiceReminders") + .HasForeignKey("ServiceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("ServiceReminders") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Service"); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.User", b => + { + b.HasOne("Vpassbackend.Models.UserRole", "UserRole") + .WithMany() + .HasForeignKey("UserRoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("UserRole"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Vehicle", b => + { + b.HasOne("Vpassbackend.Models.Customer", "Customer") + .WithMany() + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Customer"); + }); + + modelBuilder.Entity("Vpassbackend.Models.VehicleServiceHistory", b => + { + b.HasOne("Vpassbackend.Models.ServiceCenter", "ServiceCenter") + .WithMany() + .HasForeignKey("ServiceCenterId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("Vpassbackend.Models.User", "ServicedByUser") + .WithMany() + .HasForeignKey("ServicedByUserId") + .OnDelete(DeleteBehavior.NoAction); + + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("ServiceHistory") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ServiceCenter"); + + b.Navigation("ServicedByUser"); + + b.Navigation("Vehicle"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Invoice", b => + { + b.Navigation("PaymentLogs"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Service", b => + { + b.Navigation("Appointments"); + + b.Navigation("ServiceCenterServices"); + + b.Navigation("ServiceReminders"); + }); + + modelBuilder.Entity("Vpassbackend.Models.ServiceCenter", b => + { + b.Navigation("CheckInPoints"); + + b.Navigation("ServiceCenterServices"); + }); + + modelBuilder.Entity("Vpassbackend.Models.Vehicle", b => + { + b.Navigation("Appointments"); + + b.Navigation("BorderPoints"); + + b.Navigation("Documents"); + + b.Navigation("FuelEfficiencies"); + + b.Navigation("Invoices"); + + b.Navigation("ServiceHistory"); + + b.Navigation("ServiceReminders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Vpassbackend/Migrations/20250713164936_AddCostToFuelEfficiency.cs b/Vpassbackend/Migrations/20250713164936_AddCostToFuelEfficiency.cs new file mode 100644 index 0000000..b9b9551 --- /dev/null +++ b/Vpassbackend/Migrations/20250713164936_AddCostToFuelEfficiency.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Vpassbackend.Migrations +{ + /// + public partial class AddCostToFuelEfficiency : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Cost", + table: "FuelEfficiencies", + type: "decimal(10,2)", + nullable: false, + defaultValue: 0m); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Cost", + table: "FuelEfficiencies"); + } + } +} diff --git a/Vpassbackend/Migrations/ApplicationDbContextModelSnapshot.cs b/Vpassbackend/Migrations/ApplicationDbContextModelSnapshot.cs index 1e9e455..c001c00 100644 --- a/Vpassbackend/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Vpassbackend/Migrations/ApplicationDbContextModelSnapshot.cs @@ -226,6 +226,36 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("EmergencyCallCenters"); }); + modelBuilder.Entity("Vpassbackend.Models.FuelEfficiency", b => + { + b.Property("FuelEfficiencyId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("FuelEfficiencyId")); + + b.Property("Cost") + .HasColumnType("decimal(10,2)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Date") + .HasColumnType("datetime2"); + + b.Property("FuelAmount") + .HasColumnType("decimal(10,2)"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("FuelEfficiencyId"); + + b.HasIndex("VehicleId"); + + b.ToTable("FuelEfficiencies"); + }); + modelBuilder.Entity("Vpassbackend.Models.Invoice", b => { b.Property("InvoiceId") @@ -668,6 +698,17 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Vehicle"); }); + modelBuilder.Entity("Vpassbackend.Models.FuelEfficiency", b => + { + b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") + .WithMany("FuelEfficiencies") + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Vehicle"); + }); + modelBuilder.Entity("Vpassbackend.Models.Invoice", b => { b.HasOne("Vpassbackend.Models.Vehicle", "Vehicle") @@ -815,6 +856,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Documents"); + b.Navigation("FuelEfficiencies"); + b.Navigation("Invoices"); b.Navigation("ServiceHistory"); diff --git a/Vpassbackend/Models/FuelEfficiency.cs b/Vpassbackend/Models/FuelEfficiency.cs new file mode 100644 index 0000000..da9da81 --- /dev/null +++ b/Vpassbackend/Models/FuelEfficiency.cs @@ -0,0 +1,26 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Vpassbackend.Models +{ + public class FuelEfficiency + { + [Key] + public int FuelEfficiencyId { get; set; } + + [ForeignKey("Vehicle")] + public int VehicleId { get; set; } + + [Required] + [Column(TypeName = "decimal(10,2)")] + public decimal FuelAmount { get; set; } // Amount of fuel in liters + + [Required] + public DateTime Date { get; set; } + + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + + // Navigation property + public Vehicle? Vehicle { get; set; } + } +} diff --git a/Vpassbackend/Models/Vehicle.cs b/Vpassbackend/Models/Vehicle.cs index 374d417..5fc9e24 100644 --- a/Vpassbackend/Models/Vehicle.cs +++ b/Vpassbackend/Models/Vehicle.cs @@ -39,5 +39,6 @@ public class Vehicle public ICollection Invoices { get; set; } = new List(); public ICollection ServiceHistory { get; set; } = new List(); public ICollection ServiceReminders { get; set; } = new List(); + public ICollection FuelEfficiencies { get; set; } = new List(); } } diff --git a/Vpassbackend/Program.cs b/Vpassbackend/Program.cs index 7f7936b..b1683dc 100644 --- a/Vpassbackend/Program.cs +++ b/Vpassbackend/Program.cs @@ -45,6 +45,7 @@ // Add services builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); // Configure JWT Authentication builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) diff --git a/Vpassbackend/Services/FuelEfficiencyService.cs b/Vpassbackend/Services/FuelEfficiencyService.cs new file mode 100644 index 0000000..51b9284 --- /dev/null +++ b/Vpassbackend/Services/FuelEfficiencyService.cs @@ -0,0 +1,261 @@ +using Vpassbackend.Data; +using Vpassbackend.DTOs; +using Vpassbackend.Models; +using Microsoft.EntityFrameworkCore; +using System.Globalization; + +namespace Vpassbackend.Services +{ + public interface IFuelEfficiencyService + { + Task> GetFuelRecordsByVehicleAsync(int vehicleId); + Task GetFuelSummaryAsync(int vehicleId, int? year = null); + Task AddFuelRecordAsync(AddFuelEfficiencyDTO addFuelDto); + Task UpdateFuelRecordAsync(int fuelRecordId, AddFuelEfficiencyDTO updateFuelDto); + Task DeleteFuelRecordAsync(int fuelRecordId); + Task> GetMonthlyChartDataAsync(int vehicleId, int year); + Task> GetFuelRecordsByMonthAsync(int vehicleId, int year, int month); + Task GetTotalFuelForPeriodAsync(int vehicleId, DateTime startDate, DateTime endDate); + Task GetAverageFuelPerMonthAsync(int vehicleId, int year); + } + + public class FuelEfficiencyService : IFuelEfficiencyService + { + private readonly ApplicationDbContext _context; + + public FuelEfficiencyService(ApplicationDbContext context) + { + _context = context; + } + + public async Task> GetFuelRecordsByVehicleAsync(int vehicleId) + { + return await _context.FuelEfficiencies + .Where(fe => fe.VehicleId == vehicleId) + .OrderByDescending(fe => fe.Date) + .Select(fe => new FuelEfficiencyDTO + { + FuelEfficiencyId = fe.FuelEfficiencyId, + VehicleId = fe.VehicleId, + FuelAmount = fe.FuelAmount, + Date = fe.Date, + CreatedAt = fe.CreatedAt + }) + .ToListAsync(); + } + + public async Task GetFuelSummaryAsync(int vehicleId, int? year = null) + { + var currentYear = year ?? DateTime.Now.Year; + + // Get vehicle information + var vehicle = await _context.Vehicles + .FirstOrDefaultAsync(v => v.VehicleId == vehicleId); + + if (vehicle == null) + { + throw new ArgumentException("Vehicle not found"); + } + + // Get monthly chart data + var monthlySummary = await GetMonthlyChartDataAsync(vehicleId, currentYear); + + var totalFuelThisYear = monthlySummary.Sum(m => m.TotalFuelAmount); + var averageMonthlyFuel = await GetAverageFuelPerMonthAsync(vehicleId, currentYear); + + return new FuelEfficiencySummaryDTO + { + VehicleId = vehicleId, + VehicleRegistrationNumber = vehicle.RegistrationNumber, + MonthlySummary = monthlySummary, + TotalFuelThisYear = totalFuelThisYear, + AverageMonthlyFuel = averageMonthlyFuel + }; + } + + public async Task AddFuelRecordAsync(AddFuelEfficiencyDTO addFuelDto) + { + // Validate vehicle exists + var vehicleExists = await _context.Vehicles + .AnyAsync(v => v.VehicleId == addFuelDto.VehicleId); + + if (!vehicleExists) + { + throw new ArgumentException("Vehicle not found"); + } + + // Validate date is not in the future + if (addFuelDto.Date > DateTime.Now.Date) + { + throw new ArgumentException("Date cannot be in the future"); + } + + // Validate fuel amount + if (addFuelDto.FuelAmount <= 0) + { + throw new ArgumentException("Fuel amount must be greater than zero"); + } + + var fuelEfficiency = new FuelEfficiency + { + VehicleId = addFuelDto.VehicleId, + FuelAmount = addFuelDto.FuelAmount, + Date = addFuelDto.Date, + CreatedAt = DateTime.UtcNow + }; + + _context.FuelEfficiencies.Add(fuelEfficiency); + await _context.SaveChangesAsync(); + + return new FuelEfficiencyDTO + { + FuelEfficiencyId = fuelEfficiency.FuelEfficiencyId, + VehicleId = fuelEfficiency.VehicleId, + FuelAmount = fuelEfficiency.FuelAmount, + Date = fuelEfficiency.Date, + CreatedAt = fuelEfficiency.CreatedAt + }; + } + + public async Task UpdateFuelRecordAsync(int fuelRecordId, AddFuelEfficiencyDTO updateFuelDto) + { + var fuelEfficiency = await _context.FuelEfficiencies + .FirstOrDefaultAsync(fe => fe.FuelEfficiencyId == fuelRecordId); + + if (fuelEfficiency == null) + { + return false; + } + + // Validate vehicle exists + var vehicleExists = await _context.Vehicles + .AnyAsync(v => v.VehicleId == updateFuelDto.VehicleId); + + if (!vehicleExists) + { + throw new ArgumentException("Vehicle not found"); + } + + // Validate date is not in the future + if (updateFuelDto.Date > DateTime.Now.Date) + { + throw new ArgumentException("Date cannot be in the future"); + } + + // Validate fuel amount + if (updateFuelDto.FuelAmount <= 0) + { + throw new ArgumentException("Fuel amount must be greater than zero"); + } + + fuelEfficiency.VehicleId = updateFuelDto.VehicleId; + fuelEfficiency.FuelAmount = updateFuelDto.FuelAmount; + fuelEfficiency.Date = updateFuelDto.Date; + + await _context.SaveChangesAsync(); + return true; + } + + public async Task DeleteFuelRecordAsync(int fuelRecordId) + { + var fuelEfficiency = await _context.FuelEfficiencies + .FirstOrDefaultAsync(fe => fe.FuelEfficiencyId == fuelRecordId); + + if (fuelEfficiency == null) + { + return false; + } + + _context.FuelEfficiencies.Remove(fuelEfficiency); + await _context.SaveChangesAsync(); + return true; + } + + public async Task> GetMonthlyChartDataAsync(int vehicleId, int year) + { + // Get fuel efficiency records for the specified year + var fuelRecords = await _context.FuelEfficiencies + .Where(fe => fe.VehicleId == vehicleId && fe.Date.Year == year) + .ToListAsync(); + + // Group by month and calculate totals (accumulative within each month) + var monthlySummary = fuelRecords + .GroupBy(fe => new { fe.Date.Year, fe.Date.Month }) + .Select(g => new MonthlyFuelSummaryDTO + { + Year = g.Key.Year, + Month = g.Key.Month, + MonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(g.Key.Month), + TotalFuelAmount = g.Sum(fe => fe.FuelAmount), // Sum all fuel added in this month + RecordCount = g.Count() + }) + .OrderBy(m => m.Month) + .ToList(); + + // Fill in missing months with zero values for complete chart data + var allMonths = new List(); + for (int month = 1; month <= 12; month++) + { + var existingMonth = monthlySummary.FirstOrDefault(m => m.Month == month); + if (existingMonth != null) + { + allMonths.Add(existingMonth); + } + else + { + allMonths.Add(new MonthlyFuelSummaryDTO + { + Year = year, + Month = month, + MonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(month), + TotalFuelAmount = 0, + RecordCount = 0 + }); + } + } + + return allMonths; + } + + public async Task> GetFuelRecordsByMonthAsync(int vehicleId, int year, int month) + { + return await _context.FuelEfficiencies + .Where(fe => fe.VehicleId == vehicleId + && fe.Date.Year == year + && fe.Date.Month == month) + .OrderBy(fe => fe.Date) + .Select(fe => new FuelEfficiencyDTO + { + FuelEfficiencyId = fe.FuelEfficiencyId, + VehicleId = fe.VehicleId, + FuelAmount = fe.FuelAmount, + Date = fe.Date, + CreatedAt = fe.CreatedAt + }) + .ToListAsync(); + } + + public async Task GetTotalFuelForPeriodAsync(int vehicleId, DateTime startDate, DateTime endDate) + { + return await _context.FuelEfficiencies + .Where(fe => fe.VehicleId == vehicleId + && fe.Date >= startDate + && fe.Date <= endDate) + .SumAsync(fe => fe.FuelAmount); + } + + public async Task GetAverageFuelPerMonthAsync(int vehicleId, int year) + { + var monthlyTotals = await _context.FuelEfficiencies + .Where(fe => fe.VehicleId == vehicleId && fe.Date.Year == year) + .GroupBy(fe => fe.Date.Month) + .Select(g => g.Sum(fe => fe.FuelAmount)) + .ToListAsync(); + + if (!monthlyTotals.Any()) + return 0; + + return monthlyTotals.Average(); + } + } +} diff --git a/Vpassbackend/appsettings.json b/Vpassbackend/appsettings.json index 009bc56..0d0bd78 100644 --- a/Vpassbackend/appsettings.json +++ b/Vpassbackend/appsettings.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "DefaultConnection": "Server=DESKTOP-F8C2NUA\\SQLEXPRESS;Connect Timeout=30;Database=VehiclePassportAppNew2;Trusted_Connection=True;TrustServerCertificate=True;" + "DefaultConnection": "Server=DESKTOP-F8C2NUA\\SQLEXPRESS;Connect Timeout=30;Database=VehiclePassportAppNew123;Trusted_Connection=True;TrustServerCertificate=True;" }, "Jwt": { diff --git a/Vpassbackend/bin/Debug/net8.0/Vpassbackend.dll b/Vpassbackend/bin/Debug/net8.0/Vpassbackend.dll index 41ab911..4534bef 100644 Binary files a/Vpassbackend/bin/Debug/net8.0/Vpassbackend.dll and b/Vpassbackend/bin/Debug/net8.0/Vpassbackend.dll differ diff --git a/Vpassbackend/bin/Debug/net8.0/Vpassbackend.exe b/Vpassbackend/bin/Debug/net8.0/Vpassbackend.exe index 2e4d36c..5f04e69 100644 Binary files a/Vpassbackend/bin/Debug/net8.0/Vpassbackend.exe and b/Vpassbackend/bin/Debug/net8.0/Vpassbackend.exe differ diff --git a/Vpassbackend/bin/Debug/net8.0/Vpassbackend.pdb b/Vpassbackend/bin/Debug/net8.0/Vpassbackend.pdb index 8e9caa4..e73581c 100644 Binary files a/Vpassbackend/bin/Debug/net8.0/Vpassbackend.pdb and b/Vpassbackend/bin/Debug/net8.0/Vpassbackend.pdb differ diff --git a/Vpassbackend/bin/Debug/net8.0/appsettings.json b/Vpassbackend/bin/Debug/net8.0/appsettings.json index 009bc56..0d0bd78 100644 --- a/Vpassbackend/bin/Debug/net8.0/appsettings.json +++ b/Vpassbackend/bin/Debug/net8.0/appsettings.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "DefaultConnection": "Server=DESKTOP-F8C2NUA\\SQLEXPRESS;Connect Timeout=30;Database=VehiclePassportAppNew2;Trusted_Connection=True;TrustServerCertificate=True;" + "DefaultConnection": "Server=DESKTOP-F8C2NUA\\SQLEXPRESS;Connect Timeout=30;Database=VehiclePassportAppNew123;Trusted_Connection=True;TrustServerCertificate=True;" }, "Jwt": { diff --git a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.AssemblyInfo.cs b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.AssemblyInfo.cs index c47e456..a597b42 100644 --- a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.AssemblyInfo.cs +++ b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("Vpassbackend")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+9c6c061b38bb9ec8b170e872e36e360d60a970c1")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+7ab40abb2ceda682667c25673d28c1e08f0d1ce0")] [assembly: System.Reflection.AssemblyProductAttribute("Vpassbackend")] [assembly: System.Reflection.AssemblyTitleAttribute("Vpassbackend")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.AssemblyInfoInputs.cache b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.AssemblyInfoInputs.cache index f30105b..4e12844 100644 --- a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.AssemblyInfoInputs.cache +++ b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.AssemblyInfoInputs.cache @@ -1 +1 @@ -2f7e583ca45a02a95edfdfb4fcc7d09d02ff31ad990d2bd497dc130841e71c79 +ca36f1c686853909791a660d365e219834d371534fa2c86f868576805334532a diff --git a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.csproj.CoreCompileInputs.cache b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.csproj.CoreCompileInputs.cache index 9e740e8..5b24a4c 100644 --- a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.csproj.CoreCompileInputs.cache +++ b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -e53de26089f394dfe6bb9c1d3679176f6c14d41451be2bd975b0b5b9c8a2babd +cf9ae9581df9c3c5244f99f30b0de1f17d3191e62f6c04050d8d2d12729d5478 diff --git a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.csproj.FileListAbsolute.txt b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.csproj.FileListAbsolute.txt index bf3b4f1..8282580 100644 --- a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.csproj.FileListAbsolute.txt +++ b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.csproj.FileListAbsolute.txt @@ -296,3 +296,154 @@ D:\NeonCoders\VehicleAppBackend\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\ D:\NeonCoders\VehicleAppBackend\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.pdb D:\NeonCoders\VehicleAppBackend\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.genruntimeconfig.cache D:\NeonCoders\VehicleAppBackend\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\ref\Vpassbackend.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\appsettings.Development.json +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\appsettings.json +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Examples\add-service-history.json +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Examples\add-unverified-service-history.json +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Examples\add-verified-service-history.json +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Vpassbackend.exe +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Vpassbackend.deps.json +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Vpassbackend.runtimeconfig.json +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Vpassbackend.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Vpassbackend.pdb +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Azure.Core.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Azure.Identity.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\BCrypt.Net-Next.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Humanizer.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.AspNetCore.Authentication.JwtBearer.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.AspNetCore.OpenApi.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Bcl.AsyncInterfaces.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.CodeAnalysis.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.CodeAnalysis.CSharp.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.CodeAnalysis.CSharp.Workspaces.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.CodeAnalysis.Workspaces.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Data.SqlClient.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.EntityFrameworkCore.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.EntityFrameworkCore.Abstractions.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.EntityFrameworkCore.Design.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.EntityFrameworkCore.Relational.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.EntityFrameworkCore.SqlServer.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Extensions.Caching.Memory.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Extensions.DependencyInjection.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Extensions.DependencyModel.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Extensions.Logging.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Extensions.Logging.Abstractions.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Extensions.Options.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Identity.Client.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Identity.Client.Extensions.Msal.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.IdentityModel.Abstractions.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.IdentityModel.JsonWebTokens.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.IdentityModel.Logging.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.IdentityModel.Protocols.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.IdentityModel.Tokens.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.OpenApi.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.SqlServer.Server.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Microsoft.Win32.SystemEvents.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Mono.TextTemplating.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Swashbuckle.AspNetCore.Swagger.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Swashbuckle.AspNetCore.SwaggerGen.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\Swashbuckle.AspNetCore.SwaggerUI.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.ClientModel.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.CodeDom.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Composition.AttributedModel.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Composition.Convention.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Composition.Hosting.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Composition.Runtime.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Composition.TypedParts.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Configuration.ConfigurationManager.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Drawing.Common.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Formats.Asn1.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.IdentityModel.Tokens.Jwt.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Memory.Data.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Runtime.Caching.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Security.Cryptography.ProtectedData.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Security.Permissions.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\System.Windows.Extensions.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\cs\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\de\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\es\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\fr\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\it\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ja\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ko\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\pl\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\pt-BR\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ru\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\tr\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\zh-Hans\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\zh-Hant\Microsoft.CodeAnalysis.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\cs\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\de\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\es\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\fr\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\it\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ja\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ko\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\pl\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ru\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\tr\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\cs\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\de\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\es\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\fr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\it\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ja\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ko\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\pl\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\pt-BR\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ru\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\tr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\cs\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\de\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\es\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\fr\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\it\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ja\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ko\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\pl\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\ru\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\tr\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.resources.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\unix\lib\net6.0\Microsoft.Data.SqlClient.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\win\lib\net6.0\Microsoft.Data.SqlClient.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\win-arm\native\Microsoft.Data.SqlClient.SNI.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\win-arm64\native\Microsoft.Data.SqlClient.SNI.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\win-x64\native\Microsoft.Data.SqlClient.SNI.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\win-x86\native\Microsoft.Data.SqlClient.SNI.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\win\lib\net6.0\Microsoft.Win32.SystemEvents.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\unix\lib\net6.0\System.Drawing.Common.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\win\lib\net6.0\System.Drawing.Common.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\win\lib\net6.0\System.Runtime.Caching.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\win\lib\net6.0\System.Security.Cryptography.ProtectedData.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\bin\Debug\net8.0\runtimes\win\lib\net6.0\System.Windows.Extensions.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.csproj.AssemblyReference.cache +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.GeneratedMSBuildEditorConfig.editorconfig +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.AssemblyInfoInputs.cache +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.AssemblyInfo.cs +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.csproj.CoreCompileInputs.cache +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.MvcApplicationPartsAssemblyInfo.cs +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.MvcApplicationPartsAssemblyInfo.cache +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.sourcelink.json +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\staticwebassets.build.json +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\staticwebassets.development.json +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\staticwebassets\msbuild.Vpassbackend.Microsoft.AspNetCore.StaticWebAssets.props +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\staticwebassets\msbuild.build.Vpassbackend.props +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\staticwebassets\msbuild.buildMultiTargeting.Vpassbackend.props +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\staticwebassets\msbuild.buildTransitive.Vpassbackend.props +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\staticwebassets.pack.json +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\scopedcss\bundle\Vpassbackend.styles.css +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbac.3B05EFF0.Up2Date +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\refint\Vpassbackend.dll +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.pdb +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\Vpassbackend.genruntimeconfig.cache +D:\L2S2\Digital400_VPass\VehicleAppBackend\Vpassbackend\obj\Debug\net8.0\ref\Vpassbackend.dll diff --git a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.dll b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.dll index 41ab911..4534bef 100644 Binary files a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.dll and b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.dll differ diff --git a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.pdb b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.pdb index 8e9caa4..e73581c 100644 Binary files a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.pdb and b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.pdb differ diff --git a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.sourcelink.json b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.sourcelink.json index 60bf474..88e94fa 100644 --- a/Vpassbackend/obj/Debug/net8.0/Vpassbackend.sourcelink.json +++ b/Vpassbackend/obj/Debug/net8.0/Vpassbackend.sourcelink.json @@ -1 +1 @@ -{"documents":{"D:\\NeonCoders\\VehicleAppBackend\\VehicleAppBackend\\*":"https://raw.githubusercontent.com/NeonCoders-UoM/VehicleAppBackend/9c6c061b38bb9ec8b170e872e36e360d60a970c1/*"}} \ No newline at end of file +{"documents":{"D:\\NeonCoders\\VehicleAppBackend\\VehicleAppBackend\\*":"https://raw.githubusercontent.com/NeonCoders-UoM/VehicleAppBackend/7ab40abb2ceda682667c25673d28c1e08f0d1ce0/*"}} \ No newline at end of file diff --git a/Vpassbackend/obj/Debug/net8.0/apphost.exe b/Vpassbackend/obj/Debug/net8.0/apphost.exe index 2e4d36c..5f04e69 100644 Binary files a/Vpassbackend/obj/Debug/net8.0/apphost.exe and b/Vpassbackend/obj/Debug/net8.0/apphost.exe differ diff --git a/Vpassbackend/obj/Debug/net8.0/ref/Vpassbackend.dll b/Vpassbackend/obj/Debug/net8.0/ref/Vpassbackend.dll index 58a2f5d..5e709f5 100644 Binary files a/Vpassbackend/obj/Debug/net8.0/ref/Vpassbackend.dll and b/Vpassbackend/obj/Debug/net8.0/ref/Vpassbackend.dll differ diff --git a/Vpassbackend/obj/Debug/net8.0/refint/Vpassbackend.dll b/Vpassbackend/obj/Debug/net8.0/refint/Vpassbackend.dll index 58a2f5d..5e709f5 100644 Binary files a/Vpassbackend/obj/Debug/net8.0/refint/Vpassbackend.dll and b/Vpassbackend/obj/Debug/net8.0/refint/Vpassbackend.dll differ