Files
2026-10-17 15:11:26 +08:00

6.5 KiB
Raw Permalink Blame History

Business Case

Metadata

Key Value
ID BC-001
CrossReference SA-001
Language en
Domain it

Version History

Date Status Author Reviewer Change Commit
2026-10-17 Accepted Jens Tirsvad Nielsen S01 Initial version; reviewed in RC-001 (Go) 052008f

Executive Summary

Day 32 of the Udemy course "100 Days of Code: The Complete Python Pro Bootcamp" asks for an automated birthday wisher. The program reads a CSV of friends and family, checks whether today is somebody's birthday, picks one of three letter templates at random, inserts the person's name and sends the letter by e-mail through SMTP. This project builds the "normal" difficulty level as a small, readable, runnable Python 3.13+ project with tests, documentation and a tri-lingual wiki, so that course participants and repository viewers can learn from it.

Methodological and Standards Foundation

The work follows the SQA and QC framework mounted at framework/: Business Case, Stakeholder Analysis, Project Plan, milestones, tasks as issues, then code, each step reviewed before the next. Quality characteristics follow ISO/IEC 25010:2023. Source code follows the coding-conventions skill (Python) and the clean-architecture skill; the code is documented with Doxygen comments.

Problem Statement

The course assignment ships only a stub (main.py with hints, three letter templates and a one-row birthdays.csv). A learner who finishes it has working but ad-hoc code. Without a reference solution that is structured, tested and documented, other course participants cannot compare solutions, and a viewer of the repository learns little.

Business Opportunity

A clean reference solution lets participants compare approaches, and gives GitHub viewers a small example of a tested, documented Python project with no runtime dependencies beyond the standard library.

Objectives

  1. Deliver a Python program that sends a random birthday letter, with the person's name inserted, to every person in birthdays.csv whose month and day match today.
  2. Keep the assignment's function and file names recognisable (birthdays.csv, letter_templates/letter_1.txt to letter_3.txt, [NAME] placeholder).
  3. Deliver automated tests (pytest) that run without network access or real credentials.
  4. Deliver a README, a Doxygen configuration and a wiki in English, Danish and Bahasa Malaysia, with screenshots.
  5. Publish the repository with a description and topics.

Scope

In Scope

  • Reading birthdays.csv, matching today's month and day, choosing a random template, replacing [NAME], sending by SMTP with STARTTLS (Gmail by default).
  • Standard-library implementation (csv, datetime, random, smtplib); pandas is not used, to keep runtime dependencies at zero.
  • src/ and tests/ layout, constants.py, pyproject.toml, Python .gitignore, .env.example, Doxyfile, local .venv instructions.
  • README from the framework template and a wiki in en, da and ms, with screenshots.

Out of Scope

  • A scheduler or hosting (the program is run by hand or by the learner's own scheduler).
  • A graphical user interface.
  • The "hard" and "extra hard" course levels.
  • Storing or testing real credentials: .env holds a personal token and is only for personal use; it is git-ignored, never imported by tests and never committed.

Expected Benefits

Tangible Benefits

  • A runnable, tested reference solution with instructions.
  • Tests that give a repeatable result without sending mail.

Intangible Benefits

  • Learning value for the author and for other course participants.
  • A tidy example for repository viewers.

Strategic Alignment

The project is a learning portfolio piece within the repository group Tirsvad-Udemy-100_days_of_code, and a practice run of the SQA and QC framework on a small project.

Success Criteria

# Criterion Target Measure
1 Tests pass 100 % of pytest tests pass offline python -m pytest exit code 0
2 Runtime dependencies 0 third-party packages pyproject.toml dependencies is empty
3 Documentation README plus wiki in 3 languages, each with at least one screenshot files exist in the repository and wiki
4 Repository metadata description and topics set visible on the git host
5 Secrets no secret in git history search for the token value finds nothing

Risks

Risk Impact Mitigation
The Gmail token leaks into git or logs High: account abuse .env is git-ignored, only .env.example is tracked, tests never read .env, the token is never printed
Tests accidentally send mail Medium SMTP is injected and replaced by a fake in tests
Screenshots show an address or token Medium Screenshots use the dummy data and the dry-run output only
Git host token missing for topics or the wiki Medium Stop and report; the user supplies the token
Birthday on 29 February Low Documented behaviour: sent on 28 February in non-leap years, or a documented limitation

Assumptions

  • The Product Owner is S01, who is also developer and reviewer; the AI authors the documents and acts as S01's stand-in in autonomous mode, recorded in each review.
  • The people the project is for (S02, S03) are reached only by the user.
  • The PO language is English and the domain is IT.
  • Python 3.13 or newer is installed; the learner has a Gmail app password.

Constraints

  • Python 3.13 or newer, a local .venv, pytest for tests, constants in constants.py.
  • Folder structure src/, tests/, docs/.
  • One pull request per milestone, from a branch.
  • framework/ is not edited from this project.

Cost–Benefit Assessment

Costs Benefits
A few hours of the author's time; no licence or hosting cost A reference solution, learning value and a portfolio entry; qualitative, as the project has no revenue

Stakeholders

Stakeholder ID (SA) Interest in this project
S01 Product Owner, developer and reviewer; wants a working, tested solution
S02 Udemy coursists; want readable, runnable code with the assignment's names
S03 GitHub viewers; want a clear description, topics and README, and no runtime dependencies

Recommendation

Proceed. The scope is small, the risk is manageable and the result has learning value.