We have been using Asterisk for about 9 months. We came from an Altigen system. Our configuration was:
Digium 4 port T1 card and ADIT Channel bank with 8 FXO & 16 FXS ports
Cisco 7960 SIP Phone
Generic selection of SIP/IAX phones
Intel Server Class hardware (ECC Memory, RAID, etc.)
The Altigen system was a 8x16 system, and had a really good call queue system. We just needed more extensions. My goal was to duplicate the capabilities of that system. I started using AMP, the asterisk management portal as my configuration "GUI". In our office, I have 2 Linux/Unix people, and 20 windows techs, so my goal was a user friendly management system that I didn't have to baby sit. Unfortunately, when we started, AMP didn't support call queues. I hand-coded in the queues, and had a problem with queue calls dropping directly to voicemail. I'm in the process of transferring all of my extensions into the latest version of AMP, but I still have a few issues.
We have a number of issues that I believe will be fixed when we switch out the config files, but as it is right now, Asterisk is very unforgiving of errors in the dial-plan configuration files. If I had the option to do it over again, I probably wouldn't have gone with Asterisk. I still have problems where a "ZAP" or analog extension will simply "lock up." I have an issue where SIP calls will unpredictably fail until the extension re-registers. We have set up a connection with voicepulse to do outbound long distance, and it's OK as long as traffic isn't too heavy.
My advice is to consider Asterisk under the following conditions:
You need a VERY simple phone system. An Asterisk server with 4 FXO lines, 8 VoIP extension, and simple IVR menues to get to the extensions.
You are looking for a complex phone system, and can dedicate the time to hand-create the dial-plan files to be exactly what you need.
You can pay Digium or a consultant to customize the phone system exactly for your needs.
Asterisk has so many capabilities, but (not to knock the developers) it is too easy to crash the engine with a misplaced dial-plan entry. I created a "time-and-temp" application just for fun. It's absolutely amazing what you can do with it. Unfortunately, it isn't coded with five-9's of uptime in mind. Changes to analog trunks require a complete restart, which may not be possible in a busy phone system.
I like Asterisk. I think that in the right circumstances, it's a great tool, but you have to go into it with your eyes open. If you're time is valuable, go for a packaged solution.
As far as VoIP, you need to consider two cases:
1: VoIP Handsets on the same network as the phone system. (At least 10Mb/s of bandwidth available)
2: VoIP for inbound & outbound Telco.
My experience has been that VoIP on the local network has worked fine. My phone is on the same VLAN as our production network, and it has all the standard services running over it for ~30 PC's. I have NEVER had an audible artifact related to network traffic, including when I was trying to saturate the link with 80Mb/s of traffic. We're running G.729 for all of our SIP phones.
My experience with VoIP over the Internet has been hit and miss. As long as you have enough bandwidth between you and the VoIP provider, you can expect at least cell phone quality. The problem is if you have any bandwidth constraints or packet loss, you will degrade rapidly. Someone else mentioned the difference between GSM, G.711, & G.729. G.729 does seem to be the best option for us.