1) Project Overview
1.1 Goal
Build a menu-driven C# Console Application that manages a small library:
- Register students
- Register books
- Issue books to students
- Return books
- Calculate fine for late returns
1.2 Target Platform
- .NET 9 Console App
- EF Core 8
- SQL Server (LocalDB / Express / Full)
2) Modules & Features (Functional Scope)
Main Menu (Top Level)
- Student Registration
- Book Registration
- Book Issue Details
- Book Return Details
- Fine Calculation
- Exit
3) Detailed Module Scope
Module 1: Student Registration
Features
- List Students (ListView)
- Add Student
- Edit Student
- Delete Student
- Navigation:
- Return to Previous Menu (Module Menu)
- Return to Main Menu
Student Fields
- StudentId (unique, e.g.,
S1001) - FullName
- Department / Class
- Phone
- IsActive (true/false)
- CreatedOn
Rules
- StudentId must be unique
- Phone numeric + length validation
- Email basic validation
- Cannot delete a student if they have active issued books (not returned)
Module 2: Book Registration
Features
- List Books
- Add Book
- Edit Book
- Delete Book
- Navigation options
Book Fields
- BookId (unique, e.g.,
B2001) - Title
- Author
- Category
- Publisher
- Year (optional)
- TotalCopies
- AvailableCopies
- IsActive
- CreatedOn
Rules
- BookId unique
- TotalCopies >= 1
- AvailableCopies <= TotalCopies
- Cannot delete a book if it is currently issued (AvailableCopies < TotalCopies)
Module 3: Book Issue Details
Features
- List Issued Books (active + history filters optional)
- Issue Book (Add Issue)
- Edit Issue (allow updating DueDate only OR fixing mistakes)
- Delete Issue (cancel issue record)
- Navigation options
Issue Fields
- IssueId (unique,
I3001) - StudentId (must exist)
- BookId (must exist)
- IssueDate
- DueDate
- IssuedBy (optional)
- Status:
Issued/Returned
Rules
- A book can be issued only if AvailableCopies > 0
- Student must be active
- Default DueDate rule:
DueDate = IssueDate + 14 days(configurable)
- Optional: MaxBooksPerStudent (e.g., 3)
Module 4: Book Return Details
Features
- List Returns
- Add Return (Return a book against an IssueId)
- Edit Return (fix return date)
- Delete Return Record (only if admin scenario)
- Navigation options
Return Fields
- ReturnId (unique,
R4001) - IssueId (must exist and must be currently
Issued) - ReturnDate
- FineAmount (calculated)
- Remarks (optional)
Rules
- When a return happens:
- Issue.Status becomes
Returned - Book.AvailableCopies increases by 1
- Issue.Status becomes
- ReturnDate cannot be earlier than IssueDate
Module 5: Fine Calculation
Features
- Calculate Fine for a given IssueId
- List Overdue Items (active issues with due date passed)
- List Fine Report (returns with fine)
- Optional: configure fine rate
Fine Rules (Core Requirement)
- Fine depends on DueDate and ReturnDate
- Fine Per Day (default): ₹5/day (configurable)
- Formula:
If returned late:
LateDays = (ReturnDate - DueDate).DaysFine = LateDays * FinePerDay
If returned on/before due date:
- Fine = 0
Note: If user wants fine calculation “today” for not-yet-returned books:
- use
EffectiveReturnDate = Today
4) Console Navigation Design (Menus)
Global Navigation Standard (Best Practice)
Every “screen” shows:
B= Back (Previous Menu)M= Main Menu0= Exit (optional everywhere)
Example Menu Tree
- Main Menu
- Student Module Menu
- List
- Add
- Edit
- Delete
- Back to Main
- Book Module Menu
- Issue Module Menu
- Return Module Menu
- Fine Module Menu
- Student Module Menu
5) Data Model (Entities)
Student
public class Student {
public string StudentId { get; set; } = "";
public string FullName { get; set; } = "";
public string Department { get; set; } = "";
public string Phone { get; set; } = "";
public string Email { get; set; } = "";
public bool IsActive { get; set; } = true;
public DateTime CreatedOn { get; set; } = DateTime.Now;
}
Book
public class Book {
public string BookId { get; set; } = "";
public string Title { get; set; } = "";
public string Author { get; set; } = "";
public string Category { get; set; } = "";
public int TotalCopies { get; set; }
public int AvailableCopies { get; set; }
public bool IsActive { get; set; } = true;
public DateTime CreatedOn { get; set; } = DateTime.Now;
}
IssueRecord
public class IssueRecord {
public string IssueId { get; set; } = "";
public string StudentId { get; set; } = "";
public string BookId { get; set; } = "";
public DateTime IssueDate { get; set; }
public DateTime DueDate { get; set; }
public string Status { get; set; } = "Issued"; // Issued/Returned
}
ReturnRecord
public class ReturnRecord {
public string ReturnId { get; set; } = "";
public string IssueId { get; set; } = "";
public DateTime ReturnDate { get; set; }
public decimal FineAmount { get; set; }
public string Remarks { get; set; } = "";
}
AppSettings (Fine & Due Days)
public class AppSettings {
public int DefaultDueDays { get; set; } = 14;
public decimal FinePerDay { get; set; } = 5m;
public int MaxBooksPerStudent { get; set; } = 3;
}
6) Core Workflows (Step-by-step)
6.1 Issue Book Workflow
- Select StudentId → validate exists & active
- Select BookId → validate exists, active, AvailableCopies > 0
- Check student active issues count < MaxBooksPerStudent
- Create IssueRecord:
- IssueDate = input (default Today)
- DueDate = IssueDate + DefaultDueDays
- Update Book.AvailableCopies -= 1
- Save changes
6.2 Return Book Workflow
- Input IssueId
- Validate Issue exists and Status == “Issued”
- Input ReturnDate (default Today)
- Calculate Fine:
- if ReturnDate > DueDate → LateDays * FinePerDay
- Create ReturnRecord
- Mark Issue.Status = “Returned”
- Update Book.AvailableCopies += 1
- Save
7) Fine Calculation Algorithm
public static decimal CalculateFine(DateTime dueDate, DateTime returnDate, decimal finePerDay)
{
if (returnDate.Date <= dueDate.Date) return 0m;
var lateDays = (returnDate.Date - dueDate.Date).Days;
return lateDays * finePerDay;
}
8) Implementation Architecture
Layers
- Models: Student, Book, IssueRecord, ReturnRecord, AppSettings
- Repositories (file operations): load/save JSON
- Services (business rules):
- StudentService
- BookService
- IssueService
- ReturnService
- FineService
- UI Menus (Console screens):
- MainMenu
- StudentMenu
- BookMenu
- IssueMenu
- ReturnMenu
- FineMenu
9) Project Folder Structure
LibraryManagementSystem/
Program.cs
Models/
Student.cs
Book.cs
IssueRecord.cs
ReturnRecord.cs
AppSettings.cs
Data/
JsonStore.cs
DataContext.cs
Services/
StudentService.cs
BookService.cs
IssueService.cs
ReturnService.cs
FineService.cs
UI/
MenuNavigator.cs
MainMenu.cs
StudentMenu.cs
BookMenu.cs
IssueMenu.cs
ReturnMenu.cs
FineMenu.cs
Helpers/
ConsoleInput.cs
Validators.cs
Why Services?
UI should not contain SQL/EF logic. UI calls services; services use DbContext.
11) Validations Checklist
- IDs must exist before editing/deleting
- Dates must parse correctly
- Cannot issue if book has zero available copies
- Cannot return if issue already returned
- Cannot delete active issued student/book
- DueDate must be >= IssueDate
- ReturnDate must be >= IssueDate
12) Test Scenarios (Minimum)
- Add student → list → edit → delete
- Add book with 2 copies → issue twice → third issue must fail
- Issue book → return before due date → fine 0
- Issue book → return after due date → fine correct
- Delete student with active issue → should block
- Delete book currently issued → should block
- Return same issue twice → should block
13) Deliverables (What you will produce)
SQL Server DB created via EF migrations
EF Core entities + DbContext + configurations
CRUD for Students/Books/Issues/Returns using EF Core
Transaction-safe Issue/Return workflows
Fine calculation + overdue/fine reports
Console UI menus with navigation (Back/Main)
Recent Comments