Skip to content
OnlyProjects
BCA · GeneralFor educational purposes only
Code included

Water-Can Delivery & Subscription Manager for a Local RO Water Supplier (Python/Flask + MySQL)

Daily can deliveries, deposits and monthly bills for a 300-household water business — no paper diary

Mapped to your syllabusIGNOU BCA (revised) — BCSP-064 guidelines · BCSP-064 Project · Semester 6

Overview

1 min read

Water-Can Delivery & Subscription Manager (WCDM) is a web application for the 20-litre RO water-can businesses found on almost every Indian street: one small plant, a few delivery staff, and 200–400 households that take one, two or three cans a day on standing subscription. The owner currently runs this on a pocket diary and a stack of carbon receipt books — and every month ends with disputed bills and lost deposits.

The application keeps a customer and subscription registry (address, area, plan frequency, per-can rate, refundable can deposit), generates a daily route sheet per delivery person and area, and lets the delivery person mark each house as delivered or skipped for that day. At month end the system computes each customer's bill from the delivery log — deliveries × rate, plus deposit collected or refunded — records cash and UPI payments with reference numbers, and maintains a running dues ledger and a can balance (cans at the plant versus cans sitting in customers' homes).

Two roles cover the whole business: Owner/Admin (customers, plans, rates, bills, reports) and Delivery (route sheet and delivery marking, restricted to what that person delivers). The stack is deliberately beginner-sized — Python/Flask with server-rendered Jinja2 templates and MySQL — with a normalised schema, hashed passwords, parameterised SQL and a documented test-case set, which gives the project exactly what the IGNOU BCSP-064 evaluation looks for: a level-2 DFD, an ER diagram, a security section and a system you can fully demo from your own laptop.

Branch
General
Relevant for
All India
Level
Beginner · 16 weeks · solo
Common at
Indira Gandhi National Open University, Bengaluru City University, University of Kerala
Updated
Oct 2026

Syllabus alignment

IGNOU · BCA (revised) — BCSP-064 guidelines

BCSP-064 · Project · Semester 6 · 8 credits · 200 = report 150 + viva 50 (≥40% each)

Subjects this project applies
  • BCS-032 Internet Concepts and Web Design
  • Server-side web programming (Python / Flask)
  • Database Management Systems with MySQL
  • Software engineering: SDLC, testing and documentation practice
How it is evaluated

Team: individual only

synopsis with DFD (≥ level 2), ER/class diagrams; 50–80-page hardbound report (±10%); test cases; security section. Prohibited: C/C++ for DB projects, VB + MS-Access, dBase/FoxPro. Plagiarism → Exam Discipline Committee

Also fits: BCU SEP 2024, Kerala University FYUGP 2024.

What's in the box

11 parts · 5 free · 2 previewed · 4 unlock for ₹2,000

Problem & synopsis

5 min read

Problem statement

Water-can suppliers bill 200–400 households a month from hand-tallied delivery marks kept in a diary and on chalkboards. Because the delivery log, the subscription terms and the can deposits live in three different places (diary, chalkboard, deposit notebook), monthly bills are slow to prepare and frequently wrong at plan changes; customers dispute can counts; deposits are lost track of when cans are returned; and there is no dues list, so collection depends entirely on the owner's memory. If the diary is lost, the entire business record disappears with it.

The supplier needs a single, secure, phone-friendly web application that holds customers, subscriptions and deposits in one database, generates the daily delivery round automatically, captures delivered/skipped status at the doorstep, computes monthly bills from that log instead of by hand, tracks payments and outstanding dues, and keeps a running can balance between the plant and the customers' homes.

Synopsis

Abstract

Packaged 20-litre drinking-water delivery is a large, informal micro-business in Indian cities. The supplier's records live in a pocket diary: who takes how many cans, whose deposit is pending, who has not paid since March. Monthly billing means adding up tick marks by hand, and deposits are remembered, not recorded. This project builds a small Flask + MySQL web application that digitises the subscription, the daily delivery round, the can-deposit ledger and the monthly bill, demonstrating the complete design-and-build cycle an IGNOU BCA project demands.

Introduction

The fictional organisation, Jal-Sudha Aqua Suppliers, serves about 300 households across five areas of a tier-2 city with two delivery persons. Most customers hold standing subscriptions — one can daily, or two on alternate days — at a per-can rate fixed per plan, and every new customer pays a refundable deposit per can. The owner knows roughly what is owed, not exactly; the staff know today's round, but it is chalked on a board each morning.

Existing System

  • Subscriptions and rates are noted in a diary; a plan change means a struck-out line.
  • The morning round is chalked on a board: areas, houses, expected cans.
  • Deliveries are tallied from the delivery person's memory, and the monthly bill is summed by hand.
  • Deposits live in a separate notebook that is frequently out of date; refunds cause arguments.
  • Limitations: no single source of truth, no dues visibility, wrong bills at plan changes, no can-level inventory, and nothing survives the loss of the diary.

Proposed System

  • A customer registry with area, plan (daily / alternate / twice-weekly / on-call), per-can rate, deposit record and phone number — no government ID numbers are stored.
  • A daily delivery log: the system generates the expected round from each subscription, the delivery person marks Delivered / Skipped per house, and skips need a reason (nobody home, can not returned).
  • Monthly billing computed from the delivery log: cans delivered × rate, adjusted for deposit collected or refunded, with bills kept as immutable rows and payments recorded against them (cash or UPI reference).
  • A can inventory that tracks cans issued to customers and returned to the plant, so the owner knows where every can is.
  • Reports: route sheets per area and day, dues list, monthly statements and can-balance summary.

Feasibility Study

  • Technical: Flask and MySQL are taught in the curriculum and run on any laptop; the interface is ordinary forms and tables usable on a phone from the plant's Android handset. Nothing requires internet hosting — the demo runs on localhost.
  • Economic: only free, open-source software is used, so the study reports a zero-licence deployment.
  • Operational: the owner already uses a phone and WhatsApp; a two-hour walkthrough covers all screens. Delivery staff only need the route-sheet screen, which is four taps per house. Data entry is reduced compared with the diary, not added: marking the round replaces the tally, and the bill builds itself.

Objectives

  1. 01Design a normalised (3NF) MySQL schema for users, customers, plans, subscriptions, deliveries, can transactions, bills and payments.
  2. 02Implement role-based access for Owner/Admin and Delivery staff with hashed passwords and session management.
  3. 03Auto-generate each day's expected delivery round from active subscriptions and let staff mark delivered/skipped with reasons.
  4. 04Compute monthly bills from the delivery log (cans × rate) with deposit collection and refund adjustments, stored immutably.
  5. 05Record part and full payments with mode and reference number, and maintain a per-customer dues ledger.
  6. 06Track can inventory between plant and customers through recorded issue and return transactions.
  7. 07Produce route sheets, dues lists and printable monthly statements from the same data.
  8. 08Document a security section (authentication, parameterised SQL, input validation) and a tested set of black-box test cases.

Scope

In scope

  • One supplier, up to ~500 customers, five areas, two delivery staff; roles Owner/Admin and Delivery.
  • Plans: daily, alternate days, twice weekly, on-call; plan changes take effect from a chosen date with history retained.
  • Daily delivery marking (delivered, skipped with reason); monthly billing from the log; deposits on issue and refund on return.
  • Can inventory: issued to customers vs at plant; simple SMS-free notices printed on statements.
  • Reports: daily route sheet, dues list, monthly statement, can balance; all printable.

Out of scope (v1)

  • Online payment gateway integration (payments are recorded with a UPI/cash reference).
  • GPS tracking of delivery staff or a customer-facing mobile app.
  • Multi-branch or franchise support; automatic SMS/WhatsApp billing messages.
  • Water-quality testing records and BIS compliance paperwork.

Methodology

The project follows the waterfall SDLC model with a tightly frozen requirement set, chosen deliberately for an individual, beginner-level project: the business process at Jal-Sudha is small, stable and fully observable, so the usual risk of late-discovered requirements is low, and a disciplined stage-by-stage plan fits a 16-week solo schedule best. Each stage was signed off against a checklist before the next began.

PhaseWeeksActivitiesDeliverable
Requirement analysis1–3Two visits to the supplier, observe a full billing day, note every register used, SRS with use casesSRS document
System design4–6ER diagram, DFD level 0/1/2, schema to 3NF, screen wireframes, security checklistDesign document
Construction 17–9Schema, authentication and roles, customer/plan registryRegistry working
Construction 210–11Delivery log and route sheets; can issue/return transactionsDelivery module
Construction 312–13Monthly billing, payments, dues ledger, statementsBilling module
Testing14–15pytest unit tests (bill arithmetic, plan expansion), black-box cases for all screens, correctionsTest report
Documentation & viva prep16Final report (50–80 pages as per BCSP-064), PPT, demo rehearsal on seeded dataSubmission package

Testing approach: unit tests for the pieces that touch money — plan-to-expected-deliveries expansion, bill computation with deposit adjustments, dues after partial payment — using pytest; black-box test cases for every screen recorded as ID, input, expected, actual, status; and a seeded-dataset acceptance run where a manually calculated month from the real diary is compared with the system's bill for the same data.

Architecture & tech stack

5 diagrams · 6 technologies · 3 min read

  • Python
  • Flask
  • MySQL
  • Jinja2
  • Bootstrap
  • pytest

WCDM is a three-tier web application. The presentation tier is server-rendered Jinja2 templates styled with Bootstrap, usable on a phone. The application tier is Flask: blueprints per module (registry, delivery, billing, reports), a service layer holding the business rules (subscription expansion, bill arithmetic, can balance), and a before_request role guard on every route. The data tier is MySQL 8 accessed through a thin data-access module that uses parameterised queries exclusively.

flowchart TD
  O([Owner / Admin]) -->|forms and reports| F[Flask app]
  D([Delivery staff]) -->|route sheet marking| F
  F --> RG[Role guard and sessions]
  RG --> BL[Blueprints: registry, delivery, billing, reports]
  BL --> SL[Service layer: bill and can logic]
  SL --> DAO[Data access with parameterised SQL]
  DAO --> DB[(MySQL 8)]
  DB --- BK[Nightly mysqldump to backup folder]

ER diagram

erDiagram
  USER ||--o{ DELIVERY : "is assigned"
  AREA ||--o{ CUSTOMER : contains
  PLAN ||--o{ SUBSCRIPTION : "is taken as"
  CUSTOMER ||--o{ SUBSCRIPTION : holds
  CUSTOMER ||--o{ DELIVERY : receives
  CUSTOMER ||--o{ CAN_TXN : "deposits with"
  CUSTOMER ||--o{ BILL : "is billed"
  BILL ||--o{ PAYMENT : "is settled by"
  USER ||--o{ BILL : issues

  USER {
    int id PK
    string username UK
    string passwordHash
    string role
  }
  AREA {
    int id PK
    string name
  }
  PLAN {
    int id PK
    string name
    int cansPerWeek
    decimal ratePerCan
  }
  CUSTOMER {
    int id PK
    int areaId FK
    string name
    string phone
    string address
    string status
  }
  SUBSCRIPTION {
    int id PK
    int customerId FK
    int planId FK
    date startDate
    date endDate
  }
  DELIVERY {
    bigint id PK
    int customerId FK
    int userId FK
    date deliveryDate
    int cans
    string status
    string reason
  }
  CAN_TXN {
    int id PK
    int customerId FK
    string kind
    int cans
    decimal depositAmount
    date txnDate
  }
  BILL {
    int id PK
    int customerId FK
    string month
    int cansDelivered
    decimal amount
    string status
  }
  PAYMENT {
    int id PK
    int billId FK
    decimal amount
    string mode
    string reference
  }

DFD — Level 0 (context diagram)

flowchart LR
  O([Owner]) -- customers, plans, payments --> SYS((Water-Can Delivery<br/>and Subscription Manager))
  SYS -- bills, dues, can balance --> O
  DS([Delivery staff]) -- delivered or skipped --> SYS
  SYS -- daily route sheet --> DS
  CAL([Calendar date]) -- new day trigger --> SYS

DFD — Level 1

flowchart TD
  O([Owner]) --> P1[1.0 Authenticate]
  DS([Delivery staff]) --> P1
  P1 <--> D1[(D1 Users)]
  O --> P2[2.0 Manage customers and plans]
  P2 <--> D2[(D2 Customers, Plans, Areas)]
  CAL([Calendar]) --> P3[3.0 Build daily round]
  P3 <--> D3[(D3 Subscriptions)]
  P3 -- route sheet --> DS
  DS --> P4[4.0 Record deliveries]
  P4 <--> D4[(D4 Delivery log)]
  O --> P5[5.0 Generate monthly bills]
  P5 <--> D4
  P5 <--> D5[(D5 Bills and Payments)]
  O --> P6[6.0 Record payments and can moves]
  P6 <--> D5
  P6 <--> D6[(D6 Can transactions)]

DFD — Level 2 (process 5.0 exploded — the level the BCSP-064 synopsis must reach)

flowchart TD
  CAL([Month end]) --> P51[5.1 Fetch month delivery log]
  P51 --> D4[(D4 Delivery log)]
  P51 --> P52[5.2 Sum cans per customer]
  P52 --> P53{Plan changed<br/>mid month?}
  P53 -->|yes| P54[5.4 Split bill by plan periods]
  P53 -->|no| P55[5.3 Compute amount at plan rate]
  P54 --> P55
  P55 --> P56[5.5 Apply deposit adjustments]
  P56 <--> D6[(D6 Can transactions)]
  P56 --> P57[5.7 Write immutable bill row]
  P57 --> D5[(D5 Bills)]
  P57 -- statement --> O([Owner])

Each flow on these diagrams corresponds to one implemented route or table, so the examiner can walk from diagram to schema to screen without gaps.

Modules

6 modules

  1. Module 01

    Authentication & Roles

    Login with Werkzeug-hashed passwords and signed Flask sessions. A before_request guard checks the role on every route: delivery staff reach only the route-sheet and marking screens, while the owner gets the full menu. Failed logins are rate-limited with a simple attempt counter.

  2. Module 02

    Customer, Area & Plan Registry

    Owner manages areas, plans (cans per week and rate) and customers with phone, address and status. A new subscription takes a start date and supersedes the old one with an end date, so plan history is preserved and mid-month changes can be billed correctly. No government ID numbers are collected anywhere.

  3. Module 03

    Daily Round & Delivery Log

    Each morning the system expands active subscriptions into the expected round and renders a route sheet per area and delivery person. The staff member marks each house Delivered with can count, or Skipped with a reason (nobody home, can not returned), and the owner can correct an entry with an audit note the same day.

  4. Module 04

    Can & Deposit Inventory

    Every can issue to a new customer records a deposit amount, and returns record the refund; the can balance view shows cans at the plant versus cans outstanding per customer. This replaces the deposit notebook and is the data source for the deposit adjustments inside billing.

  5. Module 05

    Monthly Billing & Payments

    At month end the billing process reads the delivery log, sums cans per customer, handles mid-month plan changes by splitting the month into plan periods, applies deposit adjustments and writes an immutable bill row. Payments (cash or UPI reference) are recorded against the bill, part payments update status to Paid or Partial, and the dues ledger is a filtered view of unpaid and partially paid bills.

  6. Module 06

    Reports & Statements

    Printable route sheets for the morning round, a dues list sorted by amount and age, a per-customer monthly statement with deliveries itemised, and a can-balance summary. All reports render from the same normalised tables with no duplicate data entry.

Slides

13 slides · titles free · bullets, notes and the .pptx unlock

  1. Slide 1

    Water-Can Delivery & Subscription Manager

  2. Slide 2

    The Business & Its Records

  3. Slide 3

    Problem Statement

  4. Slide 4

    Objectives

  5. Slide 5

    Technology Stack

  6. Slide 6

    System Architecture

  7. Slide 7

    Database Design

  8. Slide 8

    DFD Level 0 → 1 → 2

  9. Slide 9

    Application Modules

  10. Slide 10

    Live Demo

  11. Slide 11

    Testing

  12. Slide 12

    Security Section

  13. Slide 13

    Conclusion & Future Scope

Bullets, speaker notes and the .pptx · ₹2,000

The titles above are the real outline. The rest is what you present from.

Unlock for ₹2,000

Viva questions & answers

3 of 16 answered free · 13 unlock

Read each answer, close it, and say it in your own words. Your viva will ask. Now you'll know.

  1. 01Concept

    Why did you choose Flask with server-rendered templates instead of a JavaScript framework?

    The users are an owner and two delivery staff who need a handful of form screens, not a dynamic single-page experience, so a JavaScript framework would add a build step, a second language and API plumbing without user benefit. Server-rendered Jinja2 keeps one language, one codebase and fast pages on cheap phones, which matches both the business need and a beginner-level individual project.

  2. 02Concept

    Explain normalisation and justify that your schema is in 3NF.

    Normalisation removes redundancy and the update anomalies it causes: 1NF requires atomic values, 2NF removes partial dependency on composite keys and 3NF removes transitive dependencies. My schema is in 3NF because rate and cans-per-week live only in Plan and are referenced by Subscription, so changing a rate updates one row; area names live once in Area; and nothing except keys is derived from another non-key column.

  3. 03Concept

    What is a foreign key and where does your design depend on one?

    A foreign key is a column constrained to match a key in another table, so the database itself rejects impossible references. My billing correctness depends on it: every Delivery row references its customer, and every Payment references its Bill, so a payment can never exist for a non-existent bill and a delivery can never be recorded for a deleted customer, because MySQL would reject the insert.

+13 more questions, with answers

Try the free ones out loud first. Your examiner will not accept “it's in the PPT”.

Source code & how to run

6 steps · complete source code · unlocks with the project

Unlocks with the project · ₹2,000

6 steps · source code zip

Prerequisites, install, seed data and tests, written for demo day. Plus the complete source.

Unlock for ₹2,000

READMEFIRST

274 words · unlocks with the project

What to change before it goes anywhere near a submission. Skipping it is how the demo fails live.

Unlocks with the project · ₹2,000

274 words · ~1 min read

The checklist of things to rename, re-seed and re-think so the project reads as yours.

Unlock for ₹2,000

Instructions

380 words · unlocks with the project

How to study it, adapt it and walk your examiner through it, step by step.

Unlocks with the project · ₹2,000

380 words · ~2 min read

Report structure, formatting rules and the submission checklist your department will grade.

Unlock for ₹2,000

References

8 sources

  1. IGNOU BCSP-064 Project Guidelines (official PDF, July 2023–Jan 2024 session)
  2. Flask Documentation — Quickstart
  3. MySQL 8.0 Reference Manual
  4. OWASP Top 10 — Web Application Security Risks
  5. OWASP SQL Injection Prevention Cheat Sheet
  6. OWASP Password Storage Cheat Sheet
  7. Ramez Elmasri & Shamkant B. Navathe, Fundamentals of Database Systems, 7th ed., Pearson
  8. Ian Sommerville, Software Engineering, 10th ed., Pearson

Cite this bundle

OnlyProjects. (2026). Water-Can Delivery & Subscription Manager for a Local RO Water Supplier (Python/Flask + MySQL): BCA General project bundle [Educational resource]. https://onlyprojects.online/projects/bca-general-water-can-delivery-subscription-manager

Future scope

1 min read

  • WhatsApp bill delivery through the WhatsApp Business API so statements reach customers the evening they are generated.
  • Online payments via UPI deep links with automatic reconciliation against the dues ledger.
  • Delivery-person mobile view optimised further with geolocation ordering of the route sheet.
  • Dynamic route sequencing — ordering houses per area to minimise backtracking, a small travelling-salesman twist.
  • Consumption analytics — seasonal demand curves per area to plan can inventory and plant capacity.
  • Multi-supplier SaaS version with per-supplier branding, logins and rates.

Keep browsing

Same degree, same syllabus slot, different idea. Pick the one your guide will actually approve.

BCACode included

Web Development

Smart Hostel Management System

Room allocation, complaints and mess billing without the register

  • Next.js
  • TypeScript
  • Node.js
  • +3

intermediate8 wk2 students