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 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:
  1. 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]
    }
    

  2. 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

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