Monday, October 26, 2009

New Landing Page and Less Downtime

I spent part of today redesigning the landing page for cmd.quickpm.net and the other *.quickpm.net websites.

I'd like to thank Thomas Kuo for his feedback on the confusing nature of the old landing page. The problem with the old landing page is that the login button for registered users was a tiny link in the upper right hand side of the page. What was happening is that a user would go to cmd.quickpm.net and they would see the links to display property information but they wouldn't notice the login link. Thus as a registered user they wouldn't login to view all of the private information such as leases, rent rolls, cash journals, etc.

The new landing page prominently displays two buttons (links) one for viewing the public information and one to login in. See below for what it looks like.



In other news I've finally updated the webserver configuration to display a downtime message when website is down. The website is down when I'm upgrading it to a new version.

Wednesday, October 21, 2009

Newer and Shinier Backups

Our old backup system consisted of me manually copying our data over to a usb hard drive. Needless to say this is not the best backup method.

As of today I've implemented the backup system described in Michael Greb's article on rdiff-backup. Thanks Michael for writing such a clear article. So far the system seems to be working great. I've set it to do daily backups of the databases, websites, and source-code.

In other news I finally took a look at the Service Request module and fixed a couple outstanding bugs. So service requests should be working properly now. I also finished the scripts for rolling out website updates with a click of a button, so new bug fixes and feature enhancements should show up when I finish them instead of waiting for me to get around to deploying them manually.

Tuesday, October 20, 2009

Benefits Not Features

When creating our website quickpm.net to advertise our software it's most natural for me as the developer to write about the features our software provides. But from the customer's point of view this isn't very useful. They don't want to read about features, they want to read about the benefits the software provides to them.

As an example, take the verbiage I wrote about our software to keep track of contacts

"Use our contact information software to keep track of the contact information for each property and tenant."

The above sentence is okay, but it doesn't tell the customer why they want to use the contact software. The sentence should be reworded to something like the below.

"Never lose a tenant or owner's contact information again with our contact management software. With it you can quickly and easily locate the key contacts for tenants and property owners."

For more reading on this topic try Kathy Gyimesy's excellent post here

Saturday, October 17, 2009

New Hosting

I've recently purchased some hosting from linode.com and decided to switch from hosting our websites in-house to the hosting provided by linode.com I switched this evening and overall I've been completely satisfied with the services provided by linode.com. They make it very easy to setup a VPS
. The VPS I decided to go with is a 64bit Ubuntu image with 20gigs of disk space and 360MB of memory. If I decide that we need more disk space or memory it's very easy to upgrade.

I've also switched the database backend for quickpm.net from SQLite to PostgreSQL. I switched because sqlite only allows one user at a time to be writing to the database and this was causing some errors when multiple people were editing properties at the same time.

Thursday, August 20, 2009

Adding Properties to quickpm

Adding new properties is fairly simple, simply click on the link on the home page of your quickpm website. See the below figure
















Once you've clicked the "Add Property" link you're taken to the page to fill in the basic information for the property.


The basic information includes the types of rent. You are free to change these to anything you want. Also the chart of accounts is purely optional and does not need to be filled in. If it is filled in please use the chart of account number and not the name.

The remittance information is the location and name of the address that will be printed on the bills sent to the tenants. This is location that you want the tenants to send their checks to.

Once you're finished you simply click the "Add" button and you'll be taken to your newly created property. From there you can do lots of things such as add tenants, create deposits in the cash journal, and upload documents.

I hope this article has been of some use to you and if you have any suggestions, questions, or feedback feel free to email me at bryan.w.bell@gmail.com

Contact Information

Within any organization it's important to keep current contact information. In our property management program for each person we keep their name, title, office#, home#, cell#, fax#, email, and address. For example you can look at the demo.quickpm.net site for some example contact information. We allow you, the user, to add contact information for properties and tenants.

One area that I need to work on improving is searching our contact information. As of right now there is no way to search the contact information for names, telephone numbers, or addresses.

Wednesday, June 11, 2008

Database Wrapper Objects

It's common to use small wrapper objects around database tables. One object represents one row in the database table. For the sake of clarity the following is a simple example:

Database: Documents table, with columns (Id, FileName, Data). Where Id is an identifier for the object, I use a Guid.

A simple wrapper object for the Documents table would have the following pseudo code

class Document {
property Id
prpoerty FileName
property Data
}

The only issues are how to create new Document objects, how to save Document objects, and how to retrieve Document objects.

Since I'm young and stupid I had the wrong solution for all three problems.
First I created a separate Database class with static methods for Retrieving, Adding, & Updating Document objects. This becomes unmanageable when the number of wrapper objects for the database gets above 10.

The correct solution is to
1. Create a Save() method for the Document class that intelligently either adds the document to the database or updates the existing document in the database. Thus the user of the document class doesn't need to remember if they're updating an existing document or creating a new document.

2. Have a single constructor for the Document class that accepts an Id. This constructor then creates a new Document object if that Id does not exist in the database or retrieves the existing Document object from the database if that Id is in the database.

By doing the above the creation and saving of Document objects is entirely consistent. This reduces the cognitively load on users of the Document class so they don't have to think about the details of how Document objects are created and stored, instead they can concentrate their effort on other things.