In a previous entry, I wrote about using Bamboo Invoice to create and mange the invoicing for my small software company. Now I want to walk through customizing the invoice to include some extra things.
The Problem
The base invoice is nice, but I really want to have the invoice due date printed on the invoice. Sure the default invoice has the payment terms and the invoice date but I did not want my customers to have to guess when their payment was due. What would be great is if there was a line on the invoice that said “Due” and had a date based off of the payment terms I already set.
Getting the Date
Luckily, all of the data needed to display the due date is already included with Bamboo Invoice. All I need to do is to display it. Bamboo Invoice uses two files to display the invoice, view.php
and pdf.php
. Both of these files are pretty similar, one shows an HTML version of the invoice and the other shows a PDF version.
First I need to get the date the invoice was created and then add in the number of days from the payment terms. Since the views each have an invoice object called $row
I can just access the attribute dateIssued
to get when the invoice was created.
$row->dateIssued
This data is stored as a MYSQL DATE field so I needed to convert it back into a unix date and time in order to display it. Bamboo Invoice provides a useful function mysql_to_unix
that does this exact thing.
mysql_to_unix($row->dateIssued)
The next step I had to do was to format the Due Date in a human readable format, such as August 16, 2007 and not as the unix time of ‘1187308680’. To do this I hacked some date conversions using the PHP date
and mktime
functions.
<?php echo date("F d, Y", mktime(0,0,0,
date("m",mysql_to_unix($row->dateIssued)),
date("d",mysql_to_unix($row->dateIssued)),
date("Y",mysql_to_unix($row->dateIssued))));
?>
Basically this is taking the Month (date “m”), Day (date “d”), and Year (date “Y”) of the invoice and creating a new date in unix time but formatted as “Month day, four digit year”. Now some PHP hacker might ask why am I converting the date from unix to a number and back to unix again instead of just using the date from mysql_to_unix
like so:
echo date("F d, Y", mysql_to_unix($row->dateIssued));
The reason is we need to now add in the number of days that a payment is due in. By converting the unix time to an integer we can easily add in our days, which are stored as an integer in Bamboo Invoice.
<?php echo date("F d, Y", mktime(0,0,0,
date("m",mysql_to_unix($row->dateIssued)),
date("d",mysql_to_unix($row->dateIssued)) + $this->settings_model->getSetting('daysPaymentDue'),
date("Y",mysql_to_unix($row->dateIssued))));
?>
Now we just need to add some pretty HTML and we have a nice snippet to show the due date.
<p><strong>Due:
<?php echo date("F d, Y", mktime(0,0,0,
date("m",mysql_to_unix($row->dateIssued)),
date("d",mysql_to_unix($row->dateIssued)) + $this->settings_model->getSetting('daysPaymentDue'),
date("Y",mysql_to_unix($row->dateIssued))));?>
</strong></p>
Since we want this to be included in both the HTML and PDF versions, it would be best to extract this snippet into a separate file to include into the view files. This will also make upgrade easier because we are not putting as much logic in the source files distributed by the Bamboo Invoice team. If you save this snippet into a file in the bamboo_system_files/application/views/includes/
directory you will have an easy way to add this to each view. I named mine eric-add-due-date.inc.php
.
HTML View
The HTML view file is called bamboo_system_files/application/views/invoices/view.php
. Open this file and look for a good place that you want to display your due date, I chose to put mine right under the Payment Terms. Since we setup the code in an include file all we have to add to this is the line:
<?php $this->load->view('includes/eric-add-due-date.inc.php'); ?>
Now we should have a Due Date on our invoices in the web browser.
PDF View
The last step is to modify the PDF view. This process is exactly like the HTML view but using the file bamboo_system_files/application/views/invoices/pdf.php
.
Conclusion
We have now added a simple Due Date calculation to our invoices for Bamboo Invoices. Although it was simple, there are a lot of other things we can now do this these simple concepts.
Another customization I added to my invoices is a link to an online form that will display the amount and invoice number for my customers to pay.
If you have any questions, feel free to ask me and I can help.
Eric Davis
This looks like a great addition to the generated invoices, thanks for sharing it.
I wonder if the code could indeed be simplified a little though – how about something like this?
echo date(“F d, Y”
, intval(mysql_to_unix($row->dateIssued))
+ ($this->settings_model->getSetting(‘daysPaymentDue’) * 86400)
);
I didn’t test this, so I really have no idea if it works as desired, but perhaps it will. :)
Ok, fine – I’ll put it all on one line.
echo date(“F d, Y”, intval(mysql_to_unix($row->dateIssued)) + ($this->settings_model->getSetting(‘daysPaymentDue’) * 86400));
the software is just gr8.
you should think of expanding the application more to add features list payment gateway and things like that!
@sawan: Actually [Derek Allard](http://www.derekallard.com) is the author of Bamboo Invoices. I will tell him you mentioned it.
Hello Sawan, I’m the developer of BambooInvoice, and I’m thrilled to hear your kind words. Thanks. The features list is always growing, but there aren’t currently any plans to integrate payment options into Bamboo. That said, I’ll keep it in mind.
You can follow the development of Bamboo on my blog if you’re interested. Eric has linked to it above.
@Eric: let me publicly thank you for your BambooInvoice articles! They are well presented, informative, and I consider them a big help to the community. Thank you sir!
Great stuff! thanks.
One thing with my version of Bamboo Invoice you need to change the settings from ‘daysPaymentDue’ to ‘days_payment_due’
Otherwise you get an error on the invoice view.
My code will be…
Due Date:
dateIssued)),
date(“d”,mysql_to_unix($row->dateIssued)) + $this->settings_model->getSetting(‘days_payment_due’),
date(“Y”,mysql_to_unix($row->dateIssued))));?>
Regards,
Gadi.
Thanks for this. Is it possible to change the design of the invoice, in terms of layout and colour?
No idea, I don’t use Bamboo Invoice anymore and it looks like the project has really slowed down.