{"id":23657555,"url":"https://github.com/theoliverlear/paycheck-to-paycheck","last_synced_at":"2026-04-12T10:44:40.682Z","repository":{"id":266185181,"uuid":"875412603","full_name":"theoliverlear/Paycheck-To-Paycheck","owner":"theoliverlear","description":"An application to help those living paycheck-to-paycheck better understand what they can afford and when they can afford it.","archived":false,"fork":false,"pushed_at":"2025-06-27T15:31:55.000Z","size":5901,"stargazers_count":0,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-27T15:55:18.970Z","etag":null,"topics":["angular","dependency-injection","django","django-api","django-orm","django-rest-framework","finance","oop","python","scss","typescript","website"],"latest_commit_sha":null,"homepage":"https://ss-paycheck-to-paycheck.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/theoliverlear.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-10-19T22:48:25.000Z","updated_at":"2025-06-27T15:31:56.000Z","dependencies_parsed_at":"2025-02-19T00:20:54.072Z","dependency_job_id":"bacdcf8f-9b15-4142-9583-4e477a6ae2a9","html_url":"https://github.com/theoliverlear/Paycheck-To-Paycheck","commit_stats":null,"previous_names":["theoliverlear/paycheck-to-paycheck"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/theoliverlear/Paycheck-To-Paycheck","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theoliverlear%2FPaycheck-To-Paycheck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theoliverlear%2FPaycheck-To-Paycheck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theoliverlear%2FPaycheck-To-Paycheck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theoliverlear%2FPaycheck-To-Paycheck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/theoliverlear","download_url":"https://codeload.github.com/theoliverlear/Paycheck-To-Paycheck/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theoliverlear%2FPaycheck-To-Paycheck/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28133797,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-30T02:00:05.476Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","dependency-injection","django","django-api","django-orm","django-rest-framework","finance","oop","python","scss","typescript","website"],"created_at":"2024-12-28T21:55:05.872Z","updated_at":"2025-12-30T23:04:46.535Z","avatar_url":"https://github.com/theoliverlear.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Paycheck to Paycheck\n### _An app for those to make each paycheck a little less stressful._\n#### By Oliver Lear Sigwarth\n\n[![Paycheck to Paycheck Logo](./angular/assets/images/logo/logo_cropped_small.png)]()\n\n---\n\nPaycheck to Paycheck is a budgeting app to help you with your finances in a\nwindow most people are familiar with: the time between paychecks. Knowing how\nmuch you can spend, and when, is crutial to many people with tight budgets. At\nPaycheck to Paycheck, we hope to automate this process for you so you never\nhave to stand in a the grocery store wondering if your card will be declined.\nOur simple-to-use app will help you track your spending, when your are \nspending it, and when you are getting paid next. We hope to make your life a\nlittle less stressful by helping you keep track of your finances.\n\n---\n\n## Features\n- 💵 **Budgeting**: See what your income allows you to spend.\n- ⌛️ **Timing**: Know when you are getting paid next, and when you can spend the\n              money you have.\n- 🏦 **Understand Your Holdings**: See how you can save, or pay off debt, with\n                                the money you have.\n- 📱 **Simple Interface**: Easy to use, easy to understand, and easy to navigate.\n\n## Get Started\n\n1. 🌐 Head over to the [Paycheck to Paycheck](https://ss-paycheck-to-paycheck.com/) website.\n2. 🤝 Create an account.\n3. 💵 Start tracking your finances!\n\n#### It's as easy as that!\n\n---\n\n## Progress\n\n### Milestone 1 - 2/14/25\n\nFor the first milestone, I have created the structure for the project. The\nstack for the project includes:\n\n- **Frontend**: Angular\n- **Backend**: Django\n- **Database**: PostgreSQL with Django ORM\n\nThe project will employ an Agile methodology. Implementing this methodology \ntook much of the first milestone's efforts. Below you will see how the \nSoftware Development Life Cycle (SDLC) will be implemented in the project.\n\n![Paycheck to Paycheck Roadmap](./assets/p2p_roadmap.png)\n\nThis roadmap will be continuously updated and you can go to the projects tab\nto see the latests developments.\n\nThe major developments in software can be broken down between the front-end \nand the back-end.\n\n#### Front-end\n\nThe modular structure of Angular has been put in place. There are the \ndependencies required to make a fully-fledged web app. The beginning\ncomponents are starting to be developed. The most important components like \nthe nav bar and footer have taken precedence.\n\nThe personality of website must be shown in the front-end. Knowing this, there\nhave been various design choices made about the look and feel of the website.\nThe website should have:\n\n- Credibility\n- Consistency\n- Clarity\n\nI am implementing this personality by have a soft color scheme. I am using a\ncolor palette of soft greens and white to convey a pure and clean intention.\nYou can see the personality of the site with the beginnings of the web \ninterface shown below.\n\n![Milestone One Homepage](./assets/p2p_milestone_one_home_page.png)\n\n#### Back-end\n\nA whole lot of work is needed for the back-end. The beginning of making models\nhas been paramount in the first milestone. They are the backbone of our data.\nGiven the program is using ORM, the models are especially important in serving\na dual purpose of a back-end object and a database object. The major models \nhave been started. These would include:\n\n- User\n  - Holding foreign keys and basic data\n- Dates\n  - Due dates\n  - Recurring dates\n- Income\n  - One-time income\n  - Recurring income\n- Bills\n  - One-time bills\n  - Recurring bills\n- Holdings\n  - Debts\n  - Savings\n- Paychecks\n  - Incorporating all the above\n\nGiven the tightly interconnected nature of the models, none can be said to be\nfully complete at this time. The models are going to be continuously developed\nin the beginning stages of the project.\n\n#### Watch the Progress\n\nBelow is a video about the progress made in the first milestone.\n\n[![Milestone One Progress](./assets/youtube_video_icon.png)](https://youtu.be/vJyiV0lwHPQ)\n\n_Or go to this [this link](https://youtu.be/vJyiV0lwHPQ) (https://youtu.be/vJyiV0lwHPQ)_\n\n---\n\n### Milestone 2 - 3/14/25\n\nThe second milestone was a big step forward. Between that time, about 600 \ncommits were added. The progress was made in both the front-end and back-end.\nLook below to see the progress made in each area.\n\n#### Both Front-end and Back-end\n\nA massive boilerplate issue was encountered with pure HTTP requests. The \nceasing of listening and then immediately calling for an update made it clear\nthat WebSockets were needed. For both the front-end and back-end, models and \ncontrollers were made to handle the WebSocket connections. The front-end\nusing Angular services and the back-end using **Django Channels**. This type \nof communication was seamlessly integrated into the app.\n\n#### Front-end\n\nThere has been major strides in multiple components in the front-end. The \nfirst is the input for income and bills. Using Reactive Programming, the tree\nof components takes input from the lowest level component and passes and \nrefines it to the top level component. The top level component validates the\ninputs and then passes them to the back-end.\n\nAuthentication, a beating heart feature for the app, was added this milestone.\nThough not fully implemented, this functionality, in conjunction with session\ndata binding, will allow inputs like bills and income to be saved to a given \nuser. As a core feature, this completion sets us up for a strong next \nmilestone.\n\nFeatures added:\n- **Input for Income**: The user can input their income.\n  - One-time income\n  - Recurring income\n  - Wage income\n- **Input for Bills**: The user can input their bills.\n  - One-time bills\n  - Recurring bills\n- **Authorization**: Getting user credentials and validating them.\n  - Input validation\n    - Filled fields\n    - Valid emails\n    - Matching passwords\n    - Terms of service agreement\n  - Signing up\n    - Signup console\n    - Signup WebSockets connection\n  - Logging in\n    - Login console\n    - Login WebSockets connection\n  - Authentication response\n    - WebSockets return user's authentication status\n\n##### New Components\n\nBelow you can see the UI for the newly integrated components.\n\n##### Bill and Income Inputs\n\n![Milestone Two Bill and Income Inputs](./assets/p2p_milestone_two_inputs.png)\n\n##### Authentication Consoles\n\n![Milestone Two Authentication Consoles](./assets/p2p_milestone_two_auth_page.png)\n\n#### Back-end\n\nThe back-end kept pace with the front-end during this sprint. The models for\nthe back-end grew more complex with new refined models. The relationships \nbetween users and their bills and income are now held in a single object each.\n\n- **Bill history**: The history of bills is now held in a single object.\n  - One-time bills\n  - Recurring bills\n- **Income history**: The history of income is now held in a single object.\n  - One-time income\n  - Recurring income\n  - Wage income\n\nUsing Django Channels, the back-end was able to seamlessly implement two-way\ncommunication. Controllers, or views in Django, are replaced with consumers in\nDjango Channels. Each entity is associated with its own consumer.\n\n##### New Consumers\n\n- Generic WebSocket consumer\n- Auth consumers\n  - Login consumer\n  - Signup consumer\n- Bill consumers\n  - One-time bill consumer\n- Income consumers\n  - One-time income consumer\n  - Recurring income consumer\n\n##### Dictionary Parsing\n\nSending payloads from the front-end may include fields that are not \napplicable to the back-end models. To handle this, specialized dictionary\nparsers were created. These parsers take the attributes of a normalize \nfront-end JSON payloads, finds appropriate class fields, and creates an object\nusing the dictionary data.\n\n#### Watch the Progress\n\nBelow is a video about the progress made in the second milestone.\n\n[![Milestone Two Progress](./assets/youtube_video_icon.png)](https://youtu.be/n5RN0N9qiiM)\n\n_Or go to this [this link](https://youtu.be/n5RN0N9qiiM) (https://youtu.be/n5RN0N9qiiM)_\n\n---\n\n### Milestone 3 - 4/18/25\n\nThe third milestone was a massive. It took everything previous and finally \ntied it into a bow. The app now tracks, manages, and displays the web of user\ndata. It can dynamically determine paychecks, bills, and income. It also can \nassemble and save them using the microservice pattern. While not all UI\ncomponents are made, the app is functional. An effort still needs to be made\nin terms of efficiency. Using eager fetching, in the current codebase, is\nnecessary, and will be replaced with lazy fetching in the future.\n\n#### Both Front-end and Back-end\n\nThe back-end and front-end were able to work together to create a seamless\nexperience. With a mixed protocol of WebSockets and HTTP, the user gets the \nbest of both. They get the initial session communication with HTTP and the\nthe dynamic updates with WebSockets. The back-end does important calculations\nand slicing of data that the front-end renders. This allows for the server to\nmaintain context and a user to navigate the app without losing their place.\n\n#### Front-end\n\nThis milestone, the front-end was important, but less so than the back-end. \nThe front-end finally implemented the UI of paychecks. More is yet to come \nwith these components, but currently, the components show:\n\n- **Incomes**: See how much you are making.\n  - One-time income\n  - Recurring income\n  - Wage income\n- **Bills**: See where your money is going.\n  - One-time bills\n  - Recurring bills\n- **Date**: See when you are getting paid.\n  - Pay period\n  - Income and bill dates\n- **Time Type**: Know whether it an item affects just this paycheck or all future\npaychecks.\n  - One-time\n  - Recurring\n- **Income and Bill Totals**: See the balance in your paycheck.\n- **Leftover Money**: See where your bank acount is left after the paycheck.\n\nThe interface for a user is shown like a check or paycheck stub to give a \nretro look to a modern app. You can see the line items and the totals clearly\ndisplayed. The app is responsive and works on mobile devices no matter how \nmany line items are on a given paycheck. You can see the UI below.\n\n![Milestone Three Paycheck UI](./assets/p2p_milestone_three_paychecks_page.png)\n\n#### Back-end\n\nThe work done in the back-end was complex. The growing web of \nintercommunication caused dependencies to explode. Much of the time was \nmanaging and implementing the microservice pattern. The back-end is now \noperates is an orderly fashion. \n\nThe tightrope of synchronous versus asynchronous communication was carefully\nwalked. Given how interconnected the app is and how making a method \nasynchronous affects an entire dependency tree, the care for asynchronous \noperations was needed. Asynchronous operations were implemented **only where\nexplicitly needed.** Since optimization is not currently a priority, and \nvelocity of features is, the app selectively uses asynchronous operations.\nThe general fields for asynchronous operations include:\n\n- **Database Operations**\n  - Access through ORM models\n  - Access through repositories\n  - Access through services\n- **Consumers**\n  - WebSockets of all varieties\n- **Views**\n  - Any view that accesses any asynchronous operation\n\n##### To Create an Entity\n\nThe pattern starts with the web app, moves to the back-end. The back-end\nconsumes the request. The back-end parses the request and creates an entity.\nThe entity is saved to the database. The saved entity is returned to the \nconsumer. The consumer serializes the entity and sends it back to the \nfront-end ready for display.\n\n##### To Update an Entity\n\nThe pattern gets a request from the web app. The back-end consumes the \nrequests parameters and determines which microservice to use. Once determined,\nthe appropriate service is called from a consumer or view. The service \naccesses the database to get the specified entity. The ORM model is parsed \ninto a back-end model. The back-end model is updated with the new data. The\nmodel is saved to the database. The success of the update is tracked and \nreturned to the view or consumer. The consumer or view serializes the status\nfor the front-end.\n\nBelow is a graph of just some of the dependencies in the back-end. There are \nso many that text cannot fit in the diagram. Instead, you can see how the app,\nand the microservice pattern, is complex and interdependent.\n\n![Codebase Dependencies Web](./assets/codebase_dependencies_map.png)\n[Click Here to See the File Zoomed In](./assets/codebase_dependencies_map.png)\n\n#### Microservice Justification\n\nThe microservice pattern was chosen because it matched a paradigm I was used\nto as well as an optimal solution pattern. The problem is that there is a lot\nof logic that is similar, but some, very important logic, that is different.\nCreating services allow for the broad brush functionality of the app. The\nproperties of each class have specific logic, and so the repositories used for\naccess carefully select these entities based on their unique nature.\n\n\n#### Watch the Progress\n\nBelow is a video about the progress made in the third milestone.\n\n[![Milestone Three Progress](./assets/youtube_video_icon.png)](https://youtu.be/wLZAdLEIYDA)\n\n_Or go to [this link](https://youtu.be/wLZAdLEIYDA)_ (https://youtu.be/wLZAdLEIYDA)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheoliverlear%2Fpaycheck-to-paycheck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftheoliverlear%2Fpaycheck-to-paycheck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheoliverlear%2Fpaycheck-to-paycheck/lists"}