Dealer Vehicle Inventory Management (manual)
Author(s)
- Abhishak Kumar Roy
Last Updated Date
2025-11-14
SRS References
Version History
| Version | Date | Changes | Author |
|---|---|---|---|
| 1.0 | 2025-07-14 | Initial Draft | Abhishak Kumar Roy |
| 1.1 | 2025-11-14 | Update Model & DTOs | Amarnath Garai , Sanket Mal |
Feature Overview
Objective: To manage and maintain the dealer's vehicle inventory so that:
- Dealer users can bid using their own stock
- Buyers can browse and search dealer inventory directly
Scope:
- Inventory management (manual & bulk upload)
- Image/document attachment and linking via Excel
- Integration with auctions and buyer search
- Support for versioning and audit logging
- Role-based dealer access
- Multi-location support
Dependencies:
- IAM (User/Dealer/Location)
- File storage (S3, Cloudinary)
- Search indexing (Elasticsearch)
- Dealer Management Service
Requirements
- Inventory must support manual entry and Excel-based bulk upload
- Images/documents are uploaded in bulk and linked by filename
- Buyers can browse and search inventory
- Dealers can bid using vehicles from their own inventory
- Vehicles must support status labels (Available, Sold, etc.)
- Audit history must capture who added/edited vehicles and when
- Upload logs must capture errors and upload summaries
Design Specifications
UI/UX
(Described in earlier section)
Workflow
Data Models (C#)
public enum SortDirection
{
ASC,
DESC
}
public record InventoryFilter
{
// Multi-value filters
public List<string>? Makes { get; set; }
public List<string>? Models { get; set; }
public List<int>? Years { get; set; }
public List<BodyStyle>? BodyStyles { get; set; }
public List<string>? Trims { get; set; }
public List<VehicleType>? VehicleTypes { get; set; } // changed to enum
public List<string>? ColorExteriors { get; set; }
public List<string>? ColorInteriors { get; set; }
public List<TransmissionType>? Transmissions { get; set; } // changed to enum
public List<FuelType>? FuelTypes { get; set; }
public List<Drivetrain>? Drivetrains { get; set; }
public List<int>? Doors { get; set; }
public List<VehicleStatus>? Status { get; set; } // changed to enum
public List<VehicleCondition>? VehicleConditions { get; set; } // changed to enum
public bool? IsCertifiedPreOwned { get; set; }
// Range filters
public decimal? MinActualPrice { get; set; }
public decimal? MaxActualPrice { get; set; }
public decimal? MinDiscountedPrice { get; set; }
public decimal? MaxDiscountedPrice { get; set; }
public decimal? MinPrice { get; set; }
public decimal? MaxPrice { get; set; }
public int? MinMileage { get; set; }
public int? MaxMileage { get; set; }
public DateTime? MinPurchaseDate { get; set; }
public DateTime? MaxPurchaseDate { get; set; }
public DateTime? MinRegistrationDate { get; set; }
public DateTime? MaxRegistrationDate { get; set; }
public DateTime? MinWarrantyExpiryDate { get; set; }
public DateTime? MaxWarrantyExpiryDate { get; set; }
public DateTime? MinCreatedAt { get; set; }
public DateTime? MaxCreatedAt { get; set; }
public DateTime? MinUpdatedAt { get; set; }
public DateTime? MaxUpdatedAt { get; set; }
// Dealer identification
public Guid? DealerId { get; set; }
// Search
public string? SearchKeyword { get; set; }
// Sorting
public InventorySortBy SortBy { get; set; } = InventorySortBy.NewestAdded;
// Pagination
[Range(1, int.MaxValue, ErrorMessage = "Page number must be greater than 0")]
public int PageNumber { get; set; } = 1;
[Range(1, 100, ErrorMessage = "Page size must be between 1 and 100")]
public int RowsPerPage { get; set; } = 10;
}
public enum VehicleType
{
New,
PreOwned,
Both
}
public enum BodyStyle
{
SUV,
Sedan,
Hatchback,
Coupe,
Convertible,
Truck,
Van,
Wagon,
Crossover,
Minivan,
Pickup
}
public enum VehicleStatus
{
Available,
Sold,
Reserved,
OnHold,
InTransit,
UnderRepair,
Pending
}
public enum Drivetrain
{
FWD, // Front-Wheel Drive
RWD, // Rear-Wheel Drive
AWD, // All-Wheel Drive
FourWD // 4-Wheel Drive
}
public enum VehicleCondition
{
New,
Excellent,
Good,
Fair,
Poor,
Salvage
}
public enum FuelType
{
Gasoline,
Diesel,
Electric,
Hybrid,
PlugInHybrid,
Ethanol,
CNG, // Compressed Natural Gas
LPG // Liquefied Petroleum Gas
}
public enum TransmissionType
{
Manual,
Automatic,
CVT, // Continuously Variable Transmission
SemiAutomatic
}
public record InventoryMaster
{
public Guid? InventoryId { get; set; }
public Guid DealerId { get; set; }
[Required]
public string Vin { get; set; } = string.Empty;
public string? StockNumber { get; set; }
public int? Year { get; set; }
public VehicleType? VehicleType { get; set; }
public DateTime? PurchaseDate { get; set; }
public string? Make { get; set; }
[Required]
public string Model { get; set; } = string.Empty;
public string? Trim { get; set; }
public string? BodyStyle { get; set; }
public string? ColorExterior { get; set; }
public string? ColorInterior { get; set; }
public int? Mileage { get; set; }
public string? MileageUnit { get; set; }
public string? Engine { get; set; }
public string? Transmission { get; set; }
public string? FuelType { get; set; }
public string? Drivetrain { get; set; }
public int? Doors { get; set; }
public decimal? ActualPrice { get; set; }
public decimal? DiscountedPrice { get; set; }
public decimal? ReservePrice {get; set;}
public Currency Currency { get; set; } = Currency.USD;
public bool? TaxIncluded { get; set; } = false;
public VehicleCondition? VehicleCondition { get; set; }
public bool? IsCertifiedPreOwned { get; set; } = false;
public DateTime? RegistrationDate { get; set; }
public DateTime? WarrantyExpiryDate { get; set; }
public VehicleStatus Status { get; set; } = VehicleStatus.Available;
public Guid? AddressId { get; set; }
public List<string>? Images { get; set; }
public string? ThumbnailImage { get; set; }
public List<string>? KeyFeatures { get; set; }
public string? AdditionalNote { get; set; }
public Guid? CreatedBy { get; set; }
public DateTimeOffset? CreatedAt { get; set; } = DateTimeOffset.UtcNow;
public Guid? UpdatedBy { get; set; }
public DateTimeOffset? UpdatedAt { get; set; }
public bool IsDeleted { get; set; } = false;
public bool IsWishListed { get; set; } = false;
}
public record UpdateInventoryRequest
{
[StringLength(50)]
public string? StockNumber { get; set; }
[Range(1900, 2030, ErrorMessage = "Year must be between 1900 and 2030")]
public int? Year { get; set; }
public VehicleType? VehicleType { get; set; }
[DataType(DataType.Date)]
public DateTime? PurchaseDate { get; set; }
public string? Make { get; set; }
[StringLength(100)]
public string? Model { get; set; }
[StringLength(100)]
public string? Trim { get; set; }
public string? BodyStyle { get; set; }
[StringLength(50)]
public string? ColorExterior { get; set; }
[StringLength(50)]
public string? ColorInterior { get; set; }
[Range(0, int.MaxValue, ErrorMessage = "Mileage must be a positive number")]
public int? Mileage { get; set; }
[StringLength(20)]
public string? MileageUnit { get; set; }
[StringLength(100)]
public string? Engine { get; set; }
public string? Transmission { get; set; }
public string? FuelType { get; set; }
public string? Drivetrain { get; set; }
[Range(1, 10, ErrorMessage = "Number of doors must be between 1 and 10")]
public int? Doors { get; set; }
[Range(0, double.MaxValue, ErrorMessage = "Actual price must be a positive number")]
public decimal? ActualPrice { get; set; }
[Range(0, double.MaxValue, ErrorMessage = "Discounted price must be a positive number")]
public decimal? DiscountedPrice { get; set; }
public decimal? ReservePrice {get; set;}
public Currency? Currency { get; set; }
public bool? TaxIncluded { get; set; }
public VehicleCondition? VehicleCondition { get; set; }
public bool? IsCertifiedPreOwned { get; set; }
[DataType(DataType.Date)]
public DateTime? RegistrationDate { get; set; }
[DataType(DataType.Date)]
public DateTime? WarrantyExpiryDate { get; set; }
public VehicleStatus? Status { get; set; }
public Guid? AddressId { get; set; }
public List<string>? Images { get; set; }
public string? ThumbnailImage { get; set; }
public List<string>? KeyFeatures { get; set; }
[StringLength(1000)]
public string? AdditionalNote { get; set; }
}
Bulk Upload Instructions
Excel Template Columns:
| VIN | Make | Model | Year | Mileage | Price | Color | LocationCode | ImageFile1 | ImageFile2 | Status |
|---|
Image Upload Instructions:
- Upload all images in a zip folder or as a multi-select batch
- Use the image file names in the Excel (e.g.
IMG_1234.jpg) - System will link based on VIN and filename match