Personal Finance Management Software

Recently (August, 2010), I’ve been developing a Personal Finance Manager package for managing our household budget, checkbook, credit cards, etc.

This has actually evolved into a nice little package. It uses JQuery, DataTables, AJAX, Data Access Objects, PHP and MySQL. It runs under the Apache web server, which is nice because you can run it on a web server and both you and your wife or husband can post transactions, reconcile bank statements and run reports.

Since it is a web-based application, you do need a web server to run it. So it’s not for the faint of heart.

I’ve actually been able to re-use this package as a generic web application development framework as well.

The project uses phpdaogen to generate the Data Access Objects from the MySQL schema. Phpdaogen is a project I developed specifically for use in my Personal Finance Manager application, because I didn’t like the licenses for any of the other DAO packages I found. Phpdaogen also includes a PreparedStatement implementation for MySQL under PHP without using mysqli (which is buggy and tends to crash).

The package requires the json PECL module to be installed. Under Red Hat/Fedora/CentOS, this requires that you install the php-json package.

One really cool thing about the package is that all form submissions and page updates are done through AJAX, so there is no need for page reloads. This makes the application very snappy and responsive.

The Personal Finance Manager package is licensed under the BSD license, so you can basically use or adapt it for free, even for commercial use.

You can download it here: Personal Finance Manager

I’m available for consultation, customization and training at a reasonable rate. Use the “Contact Us” form to send me an inquiry.

34 thoughts on “Personal Finance Management Software

    1. ron Post author

      Feel free! I released the whole thing under BSD license, so you can do pretty much anything you want with it that the license allows, as long as you give attribution and don’t claim that you wrote it.

  1. Evgeny Manahov

    Hello, can you please send me the latest version of your package by email because for some reason I cannot download it.

    Could you, please tell me what would be your rate for support issues?
    Please, write to me to the above mentioned mail.


    1. ron Post author

      Yes, it does. With the latest version from the SourceForge project page you can import your bank statement in CSV format, for reconciliation purposes. Currently it supports the CSV format provided by Wells Fargo. It will automatically match up the transactions in the CSV statement, highlighting any mismatches or multiple matches. You can then correct the problems, click the Reconcile button, and it will reconcile your bank statement.

  2. Gary

    Looks really great. Can you assign categories to transactions? I don’t see it in the screenshots. I’ll have to download it and give it a whirl.

    1. ron Post author

      Yes. The categories are called “Income/Expense”. So you can get reports of your incomes and expenses by categorizing your transactions using the Income/Expense categories.

  3. Scorch


    I create new user in myPHP Admin
    User: pfm
    Password: 123pFm321

    And now, I got the login page! But after type “admin” on all username and password, I got below massage. Please help…

    Fatal error: Uncaught exception ‘Exception’ with message ‘MySQL Error 1146 Table ‘pfm.pfmUser’ doesn’t exist page: /pfmgr/html/index.php’ in /mnt/disk1/HTTPX/htdocs/pfmgr/html/classes/dao/MySQLConnection.class.php:105 Stack trace: #0 /mnt/disk1/HTTPX/htdocs/pfmgr/html/classes/dao/abstract/PfmUserDAOAbstract.class.php(294): MySQLConnection->executeQuery(Object(PreparedStatement)) #1 /mnt/disk1/HTTPX/htdocs/pfmgr/html/classes/dao/abstract/PfmUserDAOAbstract.class.php(132): PfmUserDAOAbstract->findWithPreparedStatement(Object(PreparedStatement)) #2 /mnt/disk1/HTTPX/htdocs/pfmgr/html/include/requireLogin.include.php(78): PfmUserDAOAbstract->findByUserName(‘admin’) #3 /mnt/disk1/HTTPX/htdocs/pfmgr/html/index.php(7): include(‘/mnt/disk1/HTTP…’) #4 {main} thrown in /mnt/disk1/HTTPX/htdocs/pfmgr/html/classes/dao/MySQLConnection.class.php on line 105

    1. ron Post author

      You’ll have to follow the instructions in INSTALL.txt in order to get it running. There really are no shortcuts.

      If you read my previous post, there’s a database schema management system built into the JAX Framework on which pfmgr is built.

  4. Richard

    Is it possible to get an exported empty mysql database (.sql) so that I can setup and try this software. I am a windows user running a wamp server. Thanks

    1. ron Post author

      First, you’d need to run the “create database” and “grant” commands found in ddl/initdb under the mysql case.

      After that, you’d have to run this command to get the initial SQL required to get the database built out: php phpdaogen/ddltosql.php ddl/*.ddl.yaml

      However, be aware that you would be DEFEATING the automatic schema update mechanism of the JAX Framework (pfmgr is written on top of an old version of JAX Framework) [ ]. So when you update pfmgr in the future, your database schema will be out of date and incompatible with the new version. The ddl/updateSchema script is provided in order to bring the database schema into line with the schema files in the current version of pfmgr.

      Honestly, I don’t recommend going this route. With freely available desktop virtualization solutions like VirtualBox and VMWare, plus freely available Linux server distros like CentOS and Ubuntu Server, there’s no excuse for using WAMP, XAMPP or other substandard LAMP environments which don’t have proper Linux shell and PHP command-line functionality. Just download VirtualBox and CentOS and set up a CentOS virtual server that runs in a window on your desktop. Then install pfmgr into the CentOS virtual server using the instructions in INSTALL.txt. Done.

  5. Zack

    I just installed the software on my web server. and I used the phpadmin to create database and user. I’m getting the same error what scorch was getting. I really dont know where and how to run the initdb command to run the database commands. I’m hosting my website on a server that allows php and sql extensions. Please help. I can’t use the default schema as my webserver will put a prefix on every database name i create.

    1. ron Post author

      If you don’t have shell access to your server, there’s not much you can do. Nor would you want to, because it would defeat the automatic schema updates when you upgrade to a newer release of the PFMgr project.

      The JAX framework on which the PFMgr was built, was designed to manage the database schema for you, including automatic updates to the database schema as new releases of the project come out. But in order to do this, it requires that you have Linux command-line access in order to run the initdb script at the initial installation, and the updateSchema script when upgrading to a newer version of the PFMgr project.

      Some future version of the JAX framework may provide a web-based way to do the schema creation and updates (I’m also the author and maintainer of the JAX framework). Maybe something along the lines of how WordPress and other CMS systems do it. But for now, it’s strictly Linux command line.

      One thing you can do, which works quite well actually, is to set up a CentOS Linux instance running inside VirtualBox on your desktop. Then just run the PFMgr package inside that.

  6. zack

    Can you design a web based finance software that is multi user with role base access?? I need something that is web based? I’m willing to pay for the effort and time.

    1. ron Post author

      The pfmgr project is already web-based and multi-user with role-based access. Feel free to try it out. It only runs on Linux though, so if you’re a Windows fan, I’d recommend installing a Linux VM under VirtualBox or VMWare.

  7. Natural Honey

    can you add simple inventory tracking ?
    also can you add simple invoice so we can sell goods and services
    the script has muli user access so it is ready to be simple smart accounting software

    best regards
    Natural Honey

    1. ron Post author

      Thanks for your question.

      Actually, the Personal Finance Manager project is only intended to be a checkbook reconciliation and spending tracking package. Inventory Control, Purchasing, Sales and Invoicing, Accounts Receivable, Accounts Payable, General Ledger would be part of a larger Enterprise Resource Management (ERP) package.

      I’ve been developing ERP software professionally since 1987. I do have a new ERP package which is built on the same framework, but it is proprietary and requires a monthly support contract. If you’re interested, contact me at hostmaster at roncemer dot com, and I’ll show you a demo. If you would like to become a customer, the package should be available for new customers within about three months. We are beta testing it at some sites now.

  8. Max

    Hi Ron,
    I’m not able to make your app working!
    I’m using a virtualbox debian installation. Followed instruction in INSTALL.txt, but I get following error when I try to create new users:

    [Fri Jun 06 17:06:41 2014] [error] [client] PHP Notice: Undefined property: stdClass::$keepMeLoggedInUniqueId in /home/pfmgr/html/classes/dao/abstract/PfmUserDAOAbstract.class.php on line 35, referer:
    [Fri Jun 06 17:06:41 2014] [error] [client] PHP Notice: Undefined property: stdClass::$keepMeLoggedInExpires in /home/pfmgr/html/classes/dao/abstract/PfmUserDAOAbstract.class.php on line 36, referer:
    [Fri Jun 06 17:06:41 2014] [error] [client] PHP Fatal error: Uncaught exception ‘Exception’ with message ‘MySQL Error 1048 Column ‘keepMeLoggedInUniqueId’ cannot be null page: /pfmgr/user.php’ in /home/pfmgr/html/classes/dao/MySQLConnection.class.php:60\nStack trace:\n#0 /home/pfmgr/html/classes/dao/abstract/PfmUserDAOAbstract.class.php(39): MySQLConnection->executeUpdate(Object(PreparedStatement))\n#1 /home/pfmgr/html/user.php(261): PfmUserDAOAbstract->insert(Object(stdClass))\n#2 {main}\n thrown in /home/pfmgr/html/classes/dao/MySQLConnection.class.php on line 60, referer:

    Can you help me with this?

  9. Tim

    Hi Ron

    I have installed PFM and all seems to be working fine except for adding a new user. It seems to be crashing in user.php. Is there an easy way to debug?

    Many thanks

    1. ron Post author

      Tail Apache’s error log, and send me the error message. This project was written on top of an old version of JAX Framework, and there have been a lot of changes to JAX Framework since it was developed. If I get some free time in the future, I may go ahead and re-write the pfmgr project on top of the latest JAX Framework. But I don’t have a lot of free time on my hands at present.

    1. ron Post author

      This is a Linux application. I’d recommend running it on a Linux box, or if needed, you can create a Linux VM instance under VirtualBox.

  10. pancho

    Looking at config/database.ini.sample, it looks like it is possible to use Postgresql database instead of Mysql. But when I run ddl/regenDAO, I get the following error message :
    “PHP Fatal error: Class ‘mysqli’ not found in /opt/pfmgr/phpdaogen/MySQLiConnection.class.php on line 34″
    Do you have any idea what to do ?

    Thanks for your help

    1. ron Post author

      PostgreSQL support is completely untested. The probability of it working flawlessly is near zero.

      Sounds as if you’re configured to use the mysqli PHP extension. In that case, you need to make sure that either the mysqli or mysqlnd PHP extension is installed. Once you have that, you should be in good shape.

  11. Mixy

    I have a problem. I installed and configured (I hope) already, but when I would like to access in a browser it has a blank white screen. A page source is empty.
    What do you think? thanks for your answer!

    1. ron Post author

      I recommend checking the apache error log. Something like /var/log/httpd/error_log (RHEL) or /var/log/apache2/error.log (Debian/Ubuntu). Usually when that happens, it’s due to one of the required PEAR or PECL modules not being installed.

  12. Ben Thomson

    Hey! Like the application, however I’m having some trouble getting it to function on my server, I have followed all instructions included but I’m getting the following errors:

    Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] PHP Warning: mysqli::mysqli(): (28000/1045): Access denied for user ‘pfm’@’localhost’ (using password: YES) in /home/********/public_html/finance/html/classes/dao/MySQLiConnection.class.php on line 34
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] PHP Fatal error: Uncaught exception ‘Exception’ with message ‘Database connection failed; errno 1045 – Access denied for user ‘pfm’@’localhost’ (using password: YES)’ in /home/********/public_html/finance/html/classes/dao/MySQLiConnection.class.php:38
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] Stack trace:
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] #0 /home/********/public_html/finance/html/classes/ConnectionFactory.class.php(15): MySQLiConnection->MySQLiConnection(‘localhost’, ‘pfm’, ‘123pFm321′, ‘pfm’)
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] #1 /home/********/public_html/finance/html/include/requireLogin.include.php(47): ConnectionFactory::getConnection()
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] #2 /home/********/public_html/finance/html/index.php(7): include(‘/home/fluffyfil…’)
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] #3 {main}
    [Sun Jan 25 20:21:52 2015] [error] [client ***.***.***.***] thrown in /home/********/public_html/finance/html/classes/dao/MySQLiConnection.class.php on line 38

    It appears to be seeing the default database login details, even though I’ve updated the .ini file & run the initdb & regenDAO commands.

    Any tips?

    Thanks :)

    1. ron Post author

      Make sure you copy database.ini.sample to database.ini, and edit database.ini, not database.ini.sample. Also, if you’re on a hosted MySQL instance, you may not have all of the permissions you need. If that’s the case, I’d recommend checking with the hosting company.

  13. pancho

    Finally, I found the error : I changed the password for user pfm in file /config/database.ini after running the ddl/initdb, thus the password in file /html/classes/ConnectionFactory.class.php was wrongly set.
    Now I will start to use the application.


Leave a Reply

Your email address will not be published. Required fields are marked *

seven + 5 =

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>