← Back to Projects
internship project

Sales Invoice Management System

A full-stack ASP.NET Core MVC application for managing product inventory, sales invoicing, and business reporting, built end-to-end during my internship.

ASP.NET Core MVC EF Core SQL Server ASP.NET Core Identity AdminLTE 4
01 overview

Built during my internship to manage product inventory, sales invoicing, and reporting for a small business workflow. The system covers the full operational cycle: stock tracking, invoice creation, role-based staff access, and printable reports, replacing what would otherwise be a manual, spreadsheet-driven process with a structured, auditable web application.

02 screenshots
03 key features
04 technical highlights

Role-based access with global authorization. Rather than decorating individual controllers, the entire application requires authentication by default via a global AuthorizeFilter policy, with explicit [AllowAnonymous] exceptions carved out only where needed. New controllers are secure by default, removing the risk of an endpoint being accidentally left unprotected.

Admin-gated user provisioning. Self-registration is disabled entirely; new accounts can only be created by an authenticated Admin through a protected Register endpoint. A seeded Admin account and role set are provisioned automatically on first startup, so the system is never left in a state with no way to log in.

Self-deletion guard. The user management module blocks an Admin from deleting their own account, preventing an accidental lockout scenario where the only authenticated administrator removes their own access.

Admin-driven password resets. Passwords are never stored or exposed in readable form. Instead of a token-based email reset flow (unnecessary for an internal tool with a trusted Admin), password resets use Identity's RemovePasswordAsync/AddPasswordAsync pair, letting an Admin directly issue a new password for any account without needing the old one.

Purchase-driven inventory growth. Stock isn't manually edited; it only increases through recorded Purchase transactions. Each purchase line item directly increments the linked product's stock inside the same transaction that persists the purchase record, keeping stock movement and its originating record consistent.

Multi-mode sales reporting. The Sales Report supports four independent filter modes, custom date range, calendar month, calendar year, and per-product history, all resolving to a shared date-boundary calculation internally, so a single query pipeline serves every reporting view without duplicating aggregation logic per mode.

Derived inventory valuation. The Product Report distinguishes between Stock Value (unsold inventory still on hand) and Sold Value (revenue already realized from that product), both calculated live from invoice history rather than stored as static fields, so the figures never drift out of sync with actual transactions.

Separation of cost and price. Purchase line items record vendor unit cost independently from the product's selling price, keeping acquisition cost and sale price as distinct values, laying the groundwork for margin and profitability reporting without conflating what was paid with what's charged.

Barcode scanning for point-of-sale style entry. Products carry an optional Barcode field matched against manufacturer UPC/EAN codes already printed on packaged goods. A dedicated input on the invoice screen listens for scanner input (which behaves as rapid keyboard entry terminated by an Enter keystroke), resolves the code against the product catalog via a lookup endpoint, and populates a new invoice line automatically, reusing the same stock validation and pricing logic as manual entry. This lets a cashier build an entire invoice without touching a dropdown.

05 tech stack
ASP.NET Core MVC Entity Framework Core SQL Server ASP.NET Core Identity AdminLTE 4 Bootstrap JavaScript (AJAX) C#