Post date: May 29, 2014 1:6:11 PM
Background
Quandis has a prospective client that wishes to replace their home-grown time tracking software, and eventually grow it into a CRM system. The basic requirements include:
Create and maintain a "Project", which is a consulting engagement with a client
Within a "Project", pick from a standard set of "Tasks" which tasks will be involved in the project
each task may be assigned to a consultant, and should track both budgeted and actual hours spent on the task
Within each task, allow consultants to enter the time they've spent working on the task, including a description of what they did
Show a rollup of all time spent on a project
Show dashboard pivot tables breaking down time by task, project, or consultant
Data Analysis
The first step in implementing these requirements were to translate the client's terminology into QBO terminology, and determine if we needed any new data structures.
Client => Organization: since a client is a company, with contacts and and address, an obvious fit
Consultant => Person: consultants are the users in the system
Project => Process: since a project is a consulting engagement, it should have a start and end date, and may be assigned to a manager. Process is a great fit.
"Client" => Organization: because a project is a consulting engagement for a client, we'll make the Process and child of the Organization table (Process.Object/ID = Organization)
"Manager" => Process.AssignedOrganizationID
"Budget" => Process.CostLedgerID, since the CostLedger is used to track financial data related to a Process
Task => ImportForm: because ImportForm are tasks that can have custom fields added to them
"Consultant" => ImportForm.AssignedPersonID
"Budgeted Hours" => ImportForm.ProjectedWork
"Actual Hours" => ImportForm.ActualWork
Task Template => ImportFormTemplate: the 'standard' set of tasks available are ImportFormTemplates
Time => LedgerItem: we're going to bill somebody for this time, so LedgerItem was a good fit
"Hours" => LedgerItem.UnitCount
"Amount" => LedgerItem.AmountMoney
"Consultant" => LedgerItem.PayorID
"Task" => LedgerItem.Object/ID
"Project" = > LedgerItem.LedgerID == Process.CostLedgerID
User Interface
Single page apps are a bit of a rage these day, and QBO configuration can be pretty daunting. This project was implement as a single page app to simplify configuration / training, and to help determine how difficult it is to build a one-page app in QBO3.
To that end, the following patterns were established:
The URL for the 'home page' would be /Process/Process.ashx/Projects
Clicking on a project from the home page opens a new tab for that project, rather than navigating away from the home page
The Project Summary page would include:
a Project panel
a Tasks and All Timesheet Entries panel
a standard Messages/Documents/Contacts panel
All power-user configuration would be handled in 1 page, appearing as a configuration ('gear') icon from the home page
The customization of QBO3 to completed this project entailed no new code, but several XSLTs and custom statements. Thus, a theme (Empty C# ASP.NET Web Project in Visual Studio) was created, with the following structure:
Config (folder)
Setup.ProjectManagement.xml: contains the seed data required for this project, including custom statements as ConfigurationEntry nodes
Templates
Accounting
Project.Timesheet.xslt: customized LedgerItem.Search.xslt that show timesheet entries in the Project Summary view
Project.Timesheet.Edit.xslt: customized LedgerItem.Edit.xslt to focus on entering time spent on a task
Decision
ImportForm.TaskList.xslt: customized ImportForm.Search.xslt that includes hours
ImportForm.TaskSetup.xslt: customized ImportForm.Search.xslt that enables quick data entry of standard tasks in a project
FormTemplates:
Timesheet.Edit.xslt: customized layout for ImportForms that includes custom fields on the left, and timesheet info on the right
Process
Project.Home.xslt: application home page
Project.Config.xslt: application configuration page
Project.Search.xslt: customized Process.Search.xslt to display budgeted hours and such
Project.Summary.xslt: customized Process.Summary.xslt to render in a tab instead of a full page, with the desired panels described above
Project.Select.xslt: customized Process.Select.xslt to render budgeted hours as well as basic Process fcolumns.