Partial answer.

First, know that Asterisk configuration is more like a programming language than, say, Apache configuration. There are numerous ways to create "nonsense" configurations. On the other hand, you can create very nifty services.

There are three aspects to setting up an Asterisk installation:


call quality
what manner of phones will you be using?
which services do the users expect?


Quality

In my experience, your company suffers in reputation from bad phone lines, so make sure you get get decent quality from your installation. Quality is among other things: 


low upstream latency and high link uptime
Asterisk server uptime; use separate UPS. People tend to get cranky if they can't call the janitor and tell that there is a power failure in the house.
decent end-user equipment


Don't do a big bang implementation. Start with some users and work from there.

End user equipment

How are your users going to talk on the phone and how do you connect that equipment to Asterisk. Some users appreciate a headset connected to their PC, while others need a grey handset with analog dial pad or they will just be confused. Which will you provide and how will they connect to Asterisk?

For so called softphones (i.e. a SIP client installed on your PC) not much need to be done. You need a mechanism to handle accounts for these users (e.g. LDAP) and they need decent headsets. For connecting traditional analog phones, there are various sorts of equipment. For small installation, you may be able to get your hands on Zyxel Prestige 2002s (2 ports each), but for larger installations you need rack-mountable equipment of some sort.

Services

In my experience it is very difficult to get users to actually tell what they expect from a phone system, but once you give them something, they start having all sorts of opinions. So you need to be very clear about what services you provide and require a somewhat anal change management process (more so than is normally required in a small company).

Conclusion

This sounds dangerous and ominous, but know that the reward is equally great. The advantage of being able to create dedicated phone services, with the same sort of detailed control that you have with other IT services can be very rewarding. It will take some time for your users to get used to the thought that they can actually request fancy features from their phones, but once they get started, you can make their work a lot easier. Some features my users found very useful:


voice mail that sends mail with audio files
queues and fallback for all users
softphone and multiple phones for all users
phone conferences
redirection to mobile phones, and
routing calls through company phone system from private phones so that company picks up tab for international/expensive calls.


Also, traditionally, most phone extensions are personal, but in a modern company, most incoming calls are actually to a company function. You should probably consider not having personal extensions at all, and simply have an extension per function that rings all phones in that department/function.

Asterisk for Small Business - Where to Start?
In my viewForAnnotation method I am adding a detail disclosure button to the right of the pin, however it changes the showsUserLocation to be a red pin, with a disclosure button to the right of the "Current Location" text.

How can I stop the current location symbol from being a pin? Without the method it is fine.

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id &lt;MKAnnotation&gt;)annotation {

    static NSString *identifier = @"MyLocation";

        MKPinAnnotationView *annotationView =
        (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

        if (annotationView == nil) {
            annotationView = [[MKPinAnnotationView alloc]
                              initWithAnnotation:annotation
                              reuseIdentifier:identifier];
        } else {
            annotationView.annotation = annotation;
        }

        annotationView.enabled = YES;
        annotationView.canShowCallout = YES;

        // Create a UIButton object to add on the
        UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [rightButton setTitle:annotation.title forState:UIControlStateHighlighted];
        [annotationView setRightCalloutAccessoryView:rightButton];

    return annotationView;
}

