Skip to content

College stock and asset records

Inventory Management System

A college buys equipment and supplies, hands them out to departments, and eventually writes some of them off. This desktop application records each of those steps, so current stock is always calculated from the records rather than typed in and left to drift. It was my first project, built in 2024 in C# WinForms with SQL Server; in 2026 a team of six rewrote it in Python, and the college's staff now use that version.

At a glance

  • Built by a team of six and handed over to the college, where staff use it.
  • I worked on the backend and database: models, services and the local API.
  • Stock is derived from purchases, distributions and disposals, never typed in.
Who it's for
College staff who manage stock and assets
Role
Backend and database developer in a six-person team
Team
Team of 6
When
2024 (rewrite: August – September 2026)
Status
Status: Completed

Handed over to Sri JCBM College and in use by its staff. Packaged as a Windows installer.

Built with
  • Python
  • CustomTkinter
  • Flask
  • SQLAlchemy
  • SQLite
  • ReportLab
  • openpyxl
The Inventory Management System home screen in a dark theme: a sidebar menu, quick-action cards for import, products, vendors, purchases, distribution, stock, reports and settings with live counts and a stock value of ₹13,84,560, and a Low Stock Alerts table flagging a projector, a network switch, a beaker set, a printer and a steel almirah.
The home screen: quick actions with live counts, and items running low. Captured from the real application; products and prices are realistic, vendors are fictional.

Context and problem

Stock records kept by hand drift from reality. Items are bought, handed out to departments, returned and written off, and each step needs a record that someone can check later.

Objectives

  • Record vendors, purchases, distribution to departments and disposal.
  • Calculate stock as purchased minus distributed minus disposed.
  • Warn staff when items run low, and export reports to PDF, Excel and HTML.
  • Keep the data safe on a single office PC, with backups that can be restored.

My role

Backend and database developer in a six-person team

  • Worked on the backend and database: the SQLAlchemy data model, the service layer that holds the business rules, and the local Flask API.
  • Fixed the Windows build and installer (PyInstaller and Inno Setup) for the packaged release.

Approach

The first version, in 2024, was a C# WinForms application with a SQL Server database. The 2026 rewrite moved it to Python and SQLite, so it runs on any office PC without a database server to install.

The desktop interface is written in CustomTkinter. Behind it, a service layer holds the business rules, SQLAlchemy models store the data in SQLite, and an embedded Flask API runs on the same machine.

Every purchase, distribution and disposal is stored as its own record, and stock is recalculated from them. Stock is also kept separately for each purchase price, so an item bought at two different prices is valued correctly.

Architecture

Interface
CustomTkinter, with Matplotlib charts on the dashboard.
Backend
A service layer for products, vendors, purchases, stock, distribution and disposal, and an embedded Flask API with one module per area.
Data
SQLite through SQLAlchemy, with schema migrations and an audit log.
Security
Hashed passwords (PBKDF2) and a temporary lockout after repeated failed sign-ins.
Backups
Backup archives with SHA-256 checksums, and an automatic safety snapshot before any restore.
Distribution
PyInstaller and an Inno Setup installer for Windows.

Challenges and decisions

  1. Calculated stock

    Stock is derived from purchases, distributions and disposals rather than stored as a number someone edits. A mistake is corrected by fixing the record that caused it, and the stock figure follows.

  2. Stock kept per purchase price

    The same item is often bought at different prices over time. Keeping stock separately for each price means distributed and disposed items are valued at what they actually cost.

  3. A safety snapshot before every restore

    Restoring a backup replaces the live data. The application saves a snapshot of the current database first, so a restore from the wrong file can be undone.

The home screen scrolled down: a Monthly Purchase Trend line chart in rupees from May to October, and a Products Distributed by Department bar chart.
Purchase spending by month, and items handed out to each department.
The Stock screen: date filters, buttons for core and grouped views, and a Stock Inventory table listing each item's vendor, category, purchased, distributed and disposed quantities, current stock and price.
Stock is calculated, never typed in: 45 Dell OptiPlex desktops purchased and 30 distributed leaves 15 in stock.
The Vendors screen: a form for a vendor's ID, name, address, contact number, type, GST or PAN number and date, and a Vendor Records table of five suppliers.
Vendors are registered with a GST number or, if unregistered, a PAN, both checked against their official formats.

Outcome and status

Implemented: vendors with GST or PAN validation, products, multi-item purchases, distribution to departments with returns, disposal, low-stock alerts, dashboard charts, Excel import with a preview, reports in PDF, Excel and HTML, and backup and restore.

Packaged with a Windows installer, handed over to Sri JCBM College, and in use by its staff. I have not measured usage, so I don't quote any numbers here.

Built for internal use, so there is no public demo or repository.

Lessons

What I learned

Storing what happened, and calculating stock from it, is easier to trust than storing the stock itself: when a figure looks wrong, the records show why.

Got something that needs building?

Tell me what's slowing your team down. I'll tell you honestly what it would take, and whether I'm the right person for it.

adithyamdgowda@gmail.com

Hiring a developer? I'm also open to full-time roles. View my resume.