GithubHelp home page GithubHelp logo

htmfilho / minimily Goto Github PK

View Code? Open in Web Editor NEW
8.0 8.0 0.0 4.05 MB

Use Minimily to organize your minimalist life.

Home Page: https://www.hildeberto.com/minimily/

License: GNU General Public License v3.0

Clojure 95.79% HTML 0.55% CSS 0.30% JavaScript 3.31% Procfile 0.05%
clojure document family finance inventory minimalism

minimily's People

Contributors

htmfilho avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

minimily's Issues

Implement Sub-Accounts

Sub-account is the possibility of subdividing an account in several smaller accounts for better budget planning.

When an account has sub-accounts:

  • credits are registered in an account and the amount is proportionally distributed in the sub-accounts
  • debits are registered in the sub-accounts, not in the account anymore, though the account may have old debit transactions still appearing
  • every credit and debit transaction impacts the account and sub-accounts balance

Edit user profile

Allow the user, after authenticated, to change her personal data.

Define an optional limit of credit or debit of a transaction category

The limit of credit of a category is the minimal amount of money its transactions can register in a given period of time. The limit of debit is the maximum amount of money its transactions can register in a given period of time. They are stored in the same field, but the meaning changes according to the type of category (debit or credit).

The limit of the category is compared with the sum of its registered transactions:

  • Daily
  • Weekly
  • Monthly
  • Quarterly
  • Annually

Changes of the limit amount are conserved historically according to its period of time. For example, if the limit is annual and it was defined for 2018 then any change for 2019 are saved as a separated record and it doesn't replace the value defined for 2018, preserving it indefinitely. If the limit didn't change from a period to another, then the most recent limit is considered.

A different limit can be defined per currency in use. For example, if all accounts are configured in Canadian dollars only, then the limits can only be defined in Canadian dollars. If at least one account is configured in a different currency, like American dollars, then the limits can be defined for Canadian dollars and American dollars separately.

Allow defining the date of the transaction or transfer

Allow defining the date of the transaction or transfer for a day in the past. The user may want to create the transaction afterwards if they don't have time. The user may want to save all the receipts and type it into the system once a week.

Support the refund of transactions

Transactions are registered but sometimes the entire amount or part of it is returned to the other party. Support this event in the application gives more meaning to the transactions, improving traceability.

To solve this problem, we need to change the transaction table adapting existing columns and adding extra ones, but being careful to keep the data consistent. The current table structure solves a similar problem, the transfer of money between accounts, but the existing column is very specific to transfer. It can be redesigned to be more generic.

Create columns:

  • linked_transaction (foreign key to transaction)
  • link_type [TRANSFER, REFUND]

Migrate existing data:

  • Given the list of transactions with account_transfer not null, order by amount and date_transaction. Related transfer transactions will be grouped in pairs.
  • For every iteration, get two records at the same time and exchange their ids using the new column linked_transaction.
  • Change the link_type of these transactions to TRANSFER
  • Remove column account_transfer from the table transaction

Import file produced by the bank

My bank only shows me a bunch of log data about the transactions in my account. It doesn't help me to make decisions about my expenses, savings and investments. I need some sort of analysis of these data to see what is hidden behind the numbers.

Fortunately, my bank offers an online service to export my transactions in a csv format. This issue intends to develop the algorithm to read and import this specific file and the user interface to upload the file.

Control selling of goods

Add a button in the good's page to sell the good for a given price and register the amount as a credit transaction in an account.

Organize transactions into categories

The categories are hierarchically organized to qualify and organize transactions into meaningful topics. New and existing transactions can be optionally classified under one category per transaction. The transaction record shows its category and the category record shows all related transactions organized by accounts.

Calculate the Total income in a Period of Time

The Total Income is the sum of all credit transactions in all accounts of the user, or the family, during a period of time.

To calculate the total income, the function requires the family and the period of time. For each member of the family, get the list of accounts. For each account, get the list of credit transactions that are not originated from a transfer. return the sum of the amounts.

When registering a new good inform when the warranty will finish

  • Add fields to register when a good was acquired and how long is its warranty
  • calculate the last day the good is covered by the warranty
  • upload the document used to enforce the warranty and make it available in the "Documents" module. Inform where it is stored so you can find it easily when needed.

Change password

Allow the user to change her password.

  • The form requests the user's email address
  • The system checks if the email address corresponds to an address known by the application. If it doesn't correspond, inform the user the address is unknown and suggest her to create a new account.
  • If it corresponds, send an email to the user, with an automatic generated code to be informed in a page where the user will gain the right to change his password.
  • The form to change the password, requests the new password and to confirm it by typing it twice. Then, redirect the user to the login page, so she can try to login with the new password.
  • Send an email to the user to confirm the password was changed.

Manage a family

Allow the user to create a family and make her data available for all or part of the family.

Create standing instructions for payments and receivables

Standing instructions are rules to automatically generate transactions according to recurring payments and receivables. This ways, most of the work of recording transactions is actually automatically done by the application, reducing the effort of the user.

Depends on #23

Frequency

  • Annually: Once a year in a specific date of the year.
  • Semi-Annually: Twice a year.
  • Three-Annually: Three times a year.
  • Quarterly: Four times a year.
  • Bi-Monthly: Every two months.
  • Monthly: Every month.
  • Semi-Monthly (12 * 2): Event falls on the same two days of each month. For instance, make payments on the 1st and 15th of each month, or on the 15th and 30th of the month; therefore, there will be a total of 24 payments during the year (twice per month times 12 months).
  • Bi-Weekly (52 / 2): Event happen every two weeks. For instance, choose a set day, such as Thursday or Friday, and issue payment every other week on that day. With a bi-weekly payment schedule, 26 payments are issued during a standard year (52 weeks divided by two). In this case, two months out of the year produce three paychecks.
  • Weekly: Every week.

Calculate the Next Payment Date

Given:

  • start date
  • stop date
  • frequency
  • list of holidays
  • optional previous payment date

we can calculate the next payment date. When the previous payment date is not informed then the next payment day is the same as the start date. The next payment date is between the start date or the previous payment date and the stop date. If the calculated next payment date falls in the weekend or in a holiday then it is recalculated to the next working day.

The following table shows how the frequency is used in the calculation of the next payment date.

Frequency Block Day Example
Annually 1 to 12 (month) 1 to 31 (day) 04 / 15 (Every year on April 15th)
Semi-Annually 1 to 6 (month) 1 to 31 (day) 3 / 20 (March 20th and September 20th)
Three-Annually 1 to 4 (month) 1 to 31 (day) 2 / 12 (February 12th, June 12th, and October 12th)
Quarterly 1 to 3 (month) 1 to 31 (day) 1 / 31 (January 31th, April 30th, July 31th, and October 31th)
Bi-Monthly 1 to 2 (month) 1 to 31 (day) 2 / 30 (February 28th, April 30th, June 30th, August 30th, October 30th, and December 30th)
Monthly 1 (month) 1 to 31 (day) 1 / 5 (January 5th, and so on)
Semi-Monthly 1 to 15 (day) 16 to 31 (day) 1 / 16 (January 1st, January 16th, February 1st, February 16th, etc)
Bi-Weekly 1 to 2 (week) 1 to 7 (day of the week) 2 / 3 (January 1st, January 15th, January 29th, etc)
Weekly 1 (week) 1 to 7 (day of the week) 1 / 5 (Every Thursday)

We already mentioned the case when the next payment date falls in a weekend or in a holiday. An extra special case is when the day of the month is not valid for some of the months, like February 30th or June 31th.

Predict for how long the money available right now can support the user/family

Based on the history of transactions, which represents the spending habits of a user/family, predict for how long the money available can support the consumption pattern. The output should be the number of days left until running out of money.

The algorithm should ignore user's income transactions in all predictions, so it always considers the worse case scenario, which is when all incomes stop suddenly.

It is also important to consider seasonality because we spend more in some months and less in others. For example: we may spend more in August with school supplies and less in September when the routine gets back to normal. More in December because of Christmas and less in January. Etc.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.