I've built a time off tracking "application" in SharePoint that's composed of the following elements:
- Two site content types:
- Team Member Hour Balance - A user field, then two fields for each time off category: available and total allowed (i.e. VacationAvailable and VacationTotal).
- Time Off Request - The actual request: date/time fields for start and end, a choice field for category, a user field, and an hours requested field.
- Four lists
- Hour Register (using the Team Member Hour Balance content type)
- Time Off Requests (using the other content type, natch)
- Out of Office Calendar
- Two workflows, both associated with the Time Off Requests list
- Request Time Off
- Retract Request
Here's a brief rundown of my workflows:
Request Time Off
- Go to the Hour Register, make sure the hours requested for the category of time off (i.e., vacation, floating holiday, PTO, etc.) is available in the Hour Register for that team member. If it is, proceed.
- Start an approval process on the team member's manager, wait for approval.
- On approval, decrement the Hour Register the number of hours requested for that category, send some emails, add an event to the Out of Office Calendar.
Basically the reverse of the above, but without an approval process. Remove the Out of Office Calendar event, add back to the appropriate bucket however many hours were requested, send some emails to everyone.
So, my question: How in the heck do I package all of this stuff up into a thing I can port from site collection to site collection, without having to just rewrite all of the things (particularly the workflows, which are stupidly complicated) over and over again?
But the workflow and provisioning the list with its form customization? No way.