Giter Site home page Giter Site logo

firefly-iii / firefly-iii Goto Github PK

View Code? Open in Web Editor NEW
14.3K 157.0 1.3K 290.51 MB

Firefly III: a personal finances manager

Home Page: https://firefly-iii.org/

License: GNU Affero General Public License v3.0

PHP 81.53% Vue 1.06% Shell 0.02% Twig 3.87% Blade 0.82% Procfile 0.01% JavaScript 11.78% SCSS 0.03% CSS 0.89% Standard ML 0.01%
php money cash-flow budget php7 finance financial budgeting credit-card docker

firefly-iii's Introduction

Packagist License Stargazers Donate


Firefly III

Firefly III

A free and open source personal finance manager
Explore the documentation

View the demo · Report a bug · Request a feature · Ask questions

About Firefly III

Firefly III on iMac

"Firefly III" is a (self-hosted) manager for your personal finances. It can help you keep track of your expenses and income, so you can spend less and save more. Firefly III supports the use of budgets, categories and tags. Using a bunch of external tools, you can import data. It also has many neat financial reports available.

Firefly III should give you insight into and control over your finances. Money should be useful, not scary. You should be able to see where it is going, to feel your expenses and to... wow, I'm going overboard with this aren't I?

But you get the idea: this is your money. These are your expenses. Stop them from controlling you. I built this tool because I started to dislike money. Having money, not having money, paying bills with money, you get the idea. But no more. I want to feel "safe", whatever my balance is. And I hope this tool can help you. I know it helps me.

Purpose

Firefly III on iPad

Personal financial management is pretty difficult, and everybody has their own approach to it. Some people make budgets, other people limit their cashflow by throwing away their credit cards, others try to increase their current cashflow. There are tons of ways to save and earn money. Firefly III works on the principle that if you know where your money is going, you can stop it from going there.

By keeping track of your expenses and your income you can budget accordingly and save money. Stop living from paycheck to paycheck but give yourself the financial wiggle room you need.

You can read more about the purpose of Firefly III in the documentation.

Features

Firefly III is pretty feature packed. Some important stuff first:

  • It is completely self-hosted and isolated, and will never contact external servers until you explicitly tell it to.
  • It features a REST JSON API that covers almost every part of Firefly III.

The most exciting features are:

Then the things that make you go "yeah OK, makes sense".

And the things you would hope for but not expect:

And to organise everything:

  • Clear views that should show you how you're doing.
  • Easy navigation through your records.
  • Lots of charts because we all love them.

Many more features are listed in the documentation.

Who's it for?

Firefly III on iPhone

This application is for people who want to track their finances, keep an eye on their money without having to upload their financial records to the cloud. You're a bit tech-savvy, you like open source software and you don't mind tinkering with (self-hosted) servers.


The Firefly III eco-system

Several users have built pretty awesome stuff around the Firefly III API. Check out these tools in the documentation.

Getting Started

There are many ways to run Firefly III

  1. There is a demo site with an example financial administration already present.
  2. You can install it on your server.
  3. You can run it using Docker.
  4. You can deploy via Kubernetes.
  5. You can install it using Softaculous.
  6. You can install it using AMPPS.
  7. You can install it on Cloudron.
  8. You can install it on Lando.
  9. You can install it on Yunohost.

Contributing

You can contact me at [email protected], you may open an issue in the main repository or contact me through gitter and Mastodon.

Of course, there are some contributing guidelines and a code of conduct, which I invite you to check out.

I can always use your help squashing bugs, thinking about new features or translating Firefly III into other languages.

Sonarcloud scans the code of Firefly III. If you want to help improve Firefly III, check out the latest reports and take your pick!

Quality Gate Status Bugs Code Smells Vulnerabilities

There is also a security policy.

CII Best Practices

Support the development of Firefly III

If you like Firefly III and if it helps you save lots of money, why not send me a dime for every dollar saved! 🥳

OK that was a joke. If you feel Firefly III made your life better, please consider contributing as a sponsor. Please check out my Patreon and GitHub Sponsors page for more information. You can also buy me a ☕️ coffee at ko-fi.com. Thank you for your consideration.

License

This work is licensed under the GNU Affero General Public License v3.

Do you need help, or do you want to get in touch?

Do you want to contact me? You can email me at [email protected] or get in touch through one of the following support channels:

Acknowledgements

Over time, many people have contributed to Firefly III. I'm grateful for their support and code contributions.

The Firefly III logo is made by the excellent Cherie Woo.

firefly-iii's People

Contributors

achembarpu avatar bnw avatar bpatath avatar canoine avatar dependabot[bot] avatar devlearner avatar ebbz avatar geoffreyfrogeye avatar github-actions[bot] avatar hamuz avatar jc5 avatar lbreda avatar lguima avatar maxco10 avatar mergify[bot] avatar michaelhthomas avatar niekvanderkooy avatar ogkevin avatar patrickkostjens avatar pkoziol avatar roberthorlings avatar rubenverhoef avatar sdx3 avatar sephrat avatar tomershvueli avatar tonicospinelli avatar vbali avatar webenhanced avatar zjean avatar zsub avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

firefly-iii's Issues

Expand category view.

The current category view contains text akin to "todo" which of course is a bit weird

Cache account balances.

With each new transaction, balances all over the place get updated. At the moment, everything is done live. It might be worth my time to see if we can cache this somehow. So far, this has been more trouble than it's been worth. Getting an account balance is a simple sum and not that expensive.

Think again about CRUDv

Alright the CRUDv thing I thought of might not work, because even though CUDv is OK, the R for read isn't. The problem is that every model has different read-actions. All accounts, all accounts by a certain account_type, all budgets by a date limit which is inside a repetition.. bla bla bla.

So, I was thinking about multiple interfaces for sure, where a class might implement CUDv (not a good name but OK), and specialized Account / Budget interfaces that provide the methods required. Or maybe even something with traits and functions and so on; it's just that I don't know exactly how that works. Yet.

Reset / verification do the same thing

Namely:

-make code, save

  • Mail user.
  • Ask to click link
  • reset code
  • send password

This feature could be fixed with using different mail templates and/or routes.

Remove magic number

There's a magic number in a complex query in FireflyIII\Database\Account\Account::destroy

Some thoughts

Alright so here's the problem.

Sooner or later everything touches everything. Ew! There's transactions and journals and budgets and accounts and just about every single view has a different set of requirements. Some only need transactions, others only need budgets but sooner or later there's a search for the related journal or the transactions in a budget and then it's all back to square one: a single method is "including" a billion tables methods and resources.

Firefly can go about this two ways. Either it keeps everything ready just in case the current method requires it, or it does everything on the fly. Another, the current solution is to include stuff when we need it through helpers, which keeps the code fairly clean but passes of the problem to various helpers, builders, implementers and factories.

It's pretty difficult to find out what's needed because the application is growing and changing all the time. A 'service'-kind of a situation could catch some problems but in the end it's all down to App::make a billion things and just run with it. Services that "do exactly x" quickly overflow because every method needs a tiny thing done differently which ends with twenty thousand methods all doing things slightly differently.

So then. Maybe some rules and regulations to get this thing going? Throwing around the core ideas behind Firefly III all the time isn't working either. And the tests! The tests!

Grouping stuff within their respective controllers isn't working because give me five seconds before I come up with some kind of combined view that messes everything up.

Same with helpers. It's nice, moving code around, pushing it towards these helpers but sooner or later the same problem arises; it becomes a mess.

Oh and then there's the problem of combining views with JSON which often means I'm picking up the same things twice, writing code twice. It sucks.

And if I decide to make objects as inclusive as possible I'm also back to square one where showing a budget generates 50 billion queries "just in case".

It all starts so simple but it becomes a giant mess. I think I need to draw something.

Form submit and methods

Always through post.

Use object binding for edit and delete! Aka fix everything. Also make sure to catch all errors.

Account meta data

With the idea of giving accounts more information than just a name, there's a new table and dito coupling for account 'roles', ie. roles for shared accounts, roles for expense accounts, etc. These roles should be expanded in the future to keep track of debet / credit cards, debts and other things.

Since both the name and format of account meta information is completely free-form there should be some kind of documentation / information and maybe some kind of check to see if meta information is valid.

On the other hand, since the account meta fields are currently used for nothing more than 'shared accounts' vs. 'normal accounts', it may be easier to simply drop the whole thing and say shared=1 / shared=0 in one of the account table fields.

Calculated costs

When having (large) costs, for example paying car taxes once a year, it would be nice to see how much of the monthly budget this will take. And thus how mush money we would need to set aside each month to cover the complete cost.

Another example could be: I want to buy a new smartphone every 3 years, how much money do I need to set aside each month to cover this cost.

This way you also have a "general" usage that should be the same every month and should allow you to pay for every (big) costs.

Notes for tests

View

  • Is the right view being called.
  • Are the arguments for the view present and correct?
    -- Check at least the name of the view

Redirect

  • Redirect route matches expected?
  • Redirect status / OK status matches?

General

  • All cases covered?
  • Different test cases to see those differences (aka not just watching for the same redirect event, check where the redirect goes to).

Budget report

I've removed the budget report for now because the code sucks. Here's the general idea:

Every month I set budgets, totalling 1000,-. My balance for that month on my checking account is 1000,- as well.

While spending money, moving money etc., the amount left in the checking account should match what I've spend that month. Ie. spent 400, balance must be 600.

If this is not the case, one of a few things may have happened:

  • Other accounts have joined the spending frenzy. Credit card expenses are part of the budgets as well, but my main account moves away from the balance it should have. If I spend 400 on my main, and 100 on my CC, the "total balance left" is 500, but the main says it's 600.
  • Transfers that are not accounted for.

So a budget-report should show:

  • The total amount budgeted for that month.
  • The amount of money spent within budgets.
  • Whether or not this matches the amount of money spent on all of my accounts
  • Whether or not there is money "missing".

Switch to Google charts

Highcharts is pretty slow and misses some diagrams I need.

On the backend, this means changing a lot of JSON to be compatible with Google. We'll concentrate this code effort into /Firefly/Charts/SimpleCharts(Interface) and maybe more classes + a controller called ChartController so we may switch back easier.

On the front end each page with a chart should be able to point to the source URI (defined using Laravel's route()) and the target-container so only one function needs to be called & implemented.

This also calls for a new asset manager but we'll see.

Recurring transactions monthly overview

It would be nice to have an overview of all recurring transactions, grouped by month.
This way we know what the total expected cost will be for that month.

Based on the total amount for a month we could divide the months into groups, or add labels to them, like "easy month", "normal month", "hard month". (based on the largest amount and smallest amount)

This way it will be easy to see that (for example) next month will be hard (electricity, water, paying taxes, insurance,...) but the month after that will be easy (only electricity). So if we want to do something extra, we better wait until the easy month.

Migration issue

I've just migrated from the last tag and I get the following error when I browse to the dashboard:

production.ERROR: exception 'InvalidArgumentException' with message 'View [transactions.journals-small-index] not found

I've run the migrate command, flushed the cache and dump-autoloader.
But nothing helps.

Remember controllers

Controllers should only re-format data, not get extra data, update fields, whatever.

Unify datatables.

Each datatable so far is a mix of options, calls to Firefly, and the backend is quite messy as well. It's all unified into the Json helpers which is not that good. To properly fix these, I should build:

  • A backend datatables controller that can generate the proper lists of data (accounts, transactions, etcetera)
  • Frontend thing that can properly call the proper URL and format data.

Two bugs

  1. Edit recurring transaction does not work when you remove active/automatch.
  2. Budget select list is broken in edit transaction.

Opening balance

The relation between an account and its opening balance is a bit weird. The system creates a super special transaction with a super special opposing account to "fill" (positive or negative) the user's account with its initial balance. Neither the account nor the transaction are directly editable but rather when you edit or create a new account a whole range of code gets set in motion to create a new (super special) transaction and a new (super special) account just to get the initial balance right.

Even though this initial balance thing is technically correct, the code is sloppy and confusing.

  • Make a "normal" expense and "normal" revenue account called "Unknown / existing source" from which the money will be drawn (or into which the money will be put).
  • Make a normal transaction for the opening balance, no weird stuff with "opening balance transaction types". This makes the opening balance editable.
  • Make sure the system has some sort of fallback for the user to explain how this works. Aka. more help and wizard-pages.

Piggy bank reminders and information

There's a lot to be done for piggy banks, which (when reminders are set) doesn't accurately show how much money is due, when it's due, etc etc.

Dropdowns should have a button "create new X"

Some fields are freeform, which makes it possible to create new expense accounts on the fly. Some fields are dropdowns and this makes it impossible to do the same. Instead, a small button (+) should be provided so users can create a new thing (whatever it might be).

Configurable budget max limit

There is a max limit to the budget amount, its 900 (euro). Its too few some currency especiel HUF. It should be useful if this value will be configurable.

Note to self: form layout

  • Mandatory fields on the left, optional on the right (col-lg-6)
  • Title contains "Firefly", and a short string describing the action "edit account"
  • Title contains only the basics. Edit. Remove. Delete. Etc.
  • Lead paragraph contains details, explanation (help).
  • Then extra text, class "text-info"
  • Fields have "help-block" text if need be.
  • Failed submits always give back feedback.

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.