Skip to main content
Version: MyBestDealNow

Dealer Vehicle Inventory Management (manual)

Author(s)

  • Abhishak Kumar Roy

Last Updated Date

2025-11-14


SRS References


Version History

VersionDateChangesAuthor
1.02025-07-14Initial DraftAbhishak Kumar Roy
1.12025-11-14Update Model & DTOsAmarnath 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

  1. Inventory must support manual entry and Excel-based bulk upload
  2. Images/documents are uploaded in bulk and linked by filename
  3. Buyers can browse and search inventory
  4. Dealers can bid using vehicles from their own inventory
  5. Vehicles must support status labels (Available, Sold, etc.)
  6. Audit history must capture who added/edited vehicles and when
  7. Upload logs must capture errors and upload summaries

Design Specifications

UI/UX

(Described in earlier section)


Workflow

Invenory Bulk Uplaod Flow


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:

VINMakeModelYearMileagePriceColorLocationCodeImageFile1ImageFile2Status

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