Intranet Module
part of the ArsDigita Community System
by Tracy Adams,
Philip Greenspun,
David Rodriguez,
and Michael Bryzek
The Big Picture
The faster the pace of change in an industry or business, the more time
and effort workers have to spend on coordination. Consider Adam Smith's
pin factory. The boss has to stand up in front of the workers once per
year and say "Thank you for your fine work last year. This year, I want
you to make lots of pins. They should be really straight, blunt on one
end, and pointy on the other. See you next year." In a university
literature department, you need to have a meeting once per semester.
Perhaps some of the curriculum should be revised? In a business facing
innovative competitors, you need to have a meeting once every month to
think about required responses. In a complex organization that is
try to change and adapt, meetings and other forms of coordination may
consume 20-30 hours per week.
Why is this a problem? People still have to work 40 hours per week to
get anything done. The result is that people will have to spend 60-70
hours per week at the office in order to coordinate and work.
What's the solution to this social problem? A computer program of
course! (You didn't expect anything better from three MIT graduates did
you?)
A modern organization exhibits the classical problem at which Web-based
applications excel: people separated in time and space. We can thus use
the same toolkit that we developed for helping people work together and
teach each other over the Internet to work together within an
organization.
For What Kinds of Organizations Is This Best?
What kinds of organizations can get the most out of this toolkit? Ones
just like ArsDigita, of course! We built this for ourselves. ArsDigita
has three offices (Boston, San Francisco, Los Angeles), 30 busy
highly-paid people (July 1999), and rapid growth (revenue doubling every
six months). Coincidentally, it also works great for groups within
larger companies. Consider Jane Manager at Hewlett-Packard who is
forming a team to build a new product. Within a couple of weeks, she
might be managing 100 people spread out among four physical locations in
Japan, California, the Pacific Northwest, and Spain. That's much faster
organizational growth and change than any startup company will ever
experience. It would be awfully nice if Jane could go up to a Web
browser and ask "Who works for me today? What are their names? What do
they look like? How do I get in touch with them?"
The Medium-Size Picture
We assume that all the employees are users in a standard ArsDigita
Community System. We keep track of employees, customers, project,
salaries, and deadlines. This enables us to ask questions like
- How many people work in this organization and how much money are we
spending each month on salaries?
- Who works for whom? (fun with Oracle tree extensions)
- What are our upcoming deadlines?
- What is John Smith working on?
- Which people are on the CNN project?
- How much time did that project take?
- What current issues and problems we are facing?
- What has this project involved so far?
For companies that operate an Internet service based on our toolkit, a
side benefit of using our intranet module is that employees who develop
skills in maintaining the intranet can then apply those skills to the
public Web services. Novices have to start out somewhere and they might
as well start in a place where an error isn't observed by customers.
One of the key components to any intranet is keeping members of the company up-to-date.
The intranet makes it easy to spam the entire company, a specific office, or employees
working on a given project.
Daily Status Report
The intranet supports a daily status report that is sent to every employee
in the company, on a nightly basis. Any module in the acs can add something
to this status report by:
- Creating a procedure that generates the content to include in the
status report. This procedure takes 4 arguments: database handle (db),
number of days the report covers (coverage, defaults to 1),
the date of the report (report_date, defaults to sysdate), and
the purpose of the report (purpose, generally defaults to email,
but can be either web_display or email_display.
Example:
proc im_news_status {db {coverage ""} {report_date ""} {purpose ""} } {
if { [empty_string_p $coverage] } {
set coverage 1
}
if { [empty_string_p $report_date] } {
set report_date sysdate
} else {
set report_date "'$report_date'"
}
set since_when [database_to_tcl_string $db "select to_date($report_date, 'YYYY-MM-DD') - $coverage from dual"]
return [news_new_stuff $db $since_when "f" $purpose]
}
- Adding the name of the procedure to a shared global:
Example:
ns_share im_status_report_section_list
if { ![info exists im_status_report_section_list] || [lsearch -glob "$im_status_report_section_list" "im_news_status" ] == -1 } {
lappend im_status_report_section_list [list "News" im_news_status]
}
Under the Hood
The parameters/ad.ini file
[ns/server/yourservername/acs/intranet]
IntranetName=yourdomain Network
IntranetEnabledP=0
DisplayVacationsOnCalendar=1
; the unit of measurement for entering salaries (month or year)
SalaryPeriodInput=year
; used to display salary
SalaryPeriodDisplay=year
; list of fee types
FeeTypes="setup" "monthly development" "monthly hosting" "hourly" "stock"
; Do we want to track hours?
TrackHours=1
; what's the url stub? i.e. http://yourdomain.com
IntranetUrlStub=/intranet
; Group Types
IntranetGroupType=intranet
ProjectGroupShortName=project
OfficeGroupShortName=office
CustomerGroupShortName=customer
PartnerGroupShortName=partner
ProcedureGroupShortName=procedure
EmployeeGroupShortName=employee
AuthorizedUsersGroupShortName=authorized_users
; What color do we put in the header row of tables?
TableColorHeader=#e6e6e6
; What color do we put in the odd numbered rows of tables?
TableColorOdd=#f4f4f4
; What color do we put in the even numbered rows of tables?
TableColorEven=#ffffff
Groups
The intranet is a group_type, and each category of users is its own user_group
of type intranet. Within each group, you can have subgroups if there is a need.
One example is offices. There is a user group named Offices, and each office is
a subgroup of the Office group. In this way, we can keep the large number of
objects organized in a hierarchical way.
Employees
Employees or key members of the company are users of the
ArsDigita Community System. Every employee is a member of the
employees user_groups. Detailed contact information is
stored for users to provide a company directory.
The im_employee_info table holds information
like the employee's salary and Social Security number.
Note that Authorized Users are similar to employees, but are granted fewer
permissions.
Offices
There is a user group named Offices, and each office is a subgroup. Employees
of a particular belong to one of the subgroups. Additional office information
is stored in the im_offices table.
Projects
Typical projects are
- A client project (iMedix.com)
- A module (Project Tracker Module)
- An initiative (convert company structure from LLC to SCorp)
The im_projects
table stores the main project information.
Each project is itself a user group, and people who are working on the project
belong to the project user group. Additionally, projects can have multiple states,
e.g. open/closed, which are stored in the im_project_status
table, as
well as types, e.g. client/toolkit, which are stored in the im_project_types
table.
The projects are integrated with the ticket tracker. The idea here is to use
projects in the intranet as a way of managing information about the projects -
employee allocations, payments, people involved, etc. - and use the ticket
tracker to actually manage work on the project.
Users can record time spent on each project or deadline. All these hours
are recorded in the im_hours table.
Customers
All customers are user groups, and the im_customers
table store
additional information about each customer. Like projects, customers have
multiple states, stored in the im_customer_status
table.
Partners
All partners are user groups, and the im_partners
table store
additional information about each partner. Like projects, partners have
multiple states, stored in the im_partner_status
table, and multiple
types, stored in the im_partner_types table.
mbryzek@arsdigita.com