This was a rather involved project and I won't waste your time going into every detail so what you'll see here is somewhat of an overview.
When it started the company used a completely manual system and had very incomplete customer info which continuously caused problems and was eventually converted temporarily over to MS Access to gain some logical control. I then decided that to continue on it should be completely self contained on unix and started building a system database using MySQL. Created some modules to handle the transactions with a Credit Card Clearing House, adding of new customers, and adding and quering of invoices. Also made a email checking program to handle the transactions that didn't get a response back from the clearing house.
After creating the database tables I then created some programs to initiate the billing of monthly fees that used the transaction module to charge against a credit card or a checking account and then record what the responses were. Then for those that failed to approve another program then initiated a rebilling proceedure that would eventually stop and produce a report that would be emailed to Customer Support where the customer could be contacted.
Created a menu of reports that handled everything from sales info to how the nights billing process went, to creating a monitoring page that showed billing system vitals. Then converted mid-stream to using HTML::Mason to create more dynamic web reports.
The next Billing System had to be a complete redesign as the customer was using an internally developed program that queried the entire system four separate times and then produced a web page where a user could review the billing for that day and choose who got billed and who didn't. Unfortunately, it was too much of a system hog and if you selected too many it broke completely.
What I did was to completely redesign it so that one program produced the web page and another processed those that were selected as to be processed as the customer was unsure of who should and shouldn't be billed and it did it in a single query to the database. Then less than a month later they changed their mind and eliminated the entire review process forcing me to pretty much redesign it completely again, although that was pretty much the way I had desired to do it in the first place so it wasn't really that difficult and it worked very, very well.