a few things…
first off, an FXO port connects to a phone line. An FXS port connects to a phone, and provides said phone with dialtone etc.
I remember this by thinking s = serves.
For each phone line, you will need one FXO port.
For each separately addressable phone, you will need one FXS port.
you can wire more than one phone per FXS port. However this is the same way a normal house is wired- all phones on the same loop (the one line being the same as one fxs port). In such a setup, if you pick up any phone you will hear the people talking on every other phone, and you can only dial one person at a time.
However to be able to usefully transfer calls between phones, each phone will need its own FXS port. If each phone has its own FXS, then you can have as many conversations as you have phones. phone 1 can talk to phone 2 while phone 3 talks to someone on your outside line.
To transfer a call you usually flash the hookswitch, then dial the destination, then hangup or something like that. That can be customized.
One way to add ports relatively cheaply is with an ATA (analog telephony adapter). It is basically a box that has ethernet on one end and 1-2 FXS ports on the other. It talks to * via SIP.
I recommend adding ports using telephony cards (not ATAs), if you can do this. This makes for the easiest setup IMHO. However the one issue is that all the phone wiring runs must end at the same place, which is where your * server will go. If this does not work for some/all of your extensions, you can have some/all of your extensions on ATAs.
Another option to consider is VoIP phones. They are more expensive, and require ethernet runs to each phone (many have passthrough ports so you can wire them in line with your computer). However they are IMHO easier to use because you get real buttons for xfer, conference, etc instead of having to do flash and star codes.
The absolute cheapest is the Grandstream BT100 series, which are around $50. If you have more than 4 or 5 try something like the AAstra 9112/9133 which are very easy to remote configure using tftp.
You might want to buy a Grandstream 100 just to play with, many of the VoIP guys here (including myself) learned about SIP on those. They aren’t great phones for business use but they are excellent for playing aroudn with and learning how to integrate.
When you setup zaptel, I suggest putting all the lines in one group and all the phones in another. You could further separate the extensions by user (user is usually near extens 101 102 103 or 104, so those are group 2) or by section of your building. This way, you can for outgoing calls just dial(zap/g0/${EXTEN}) which will choose a free port from group 0 and dial.
Also another note- I suggest stay away from softphones as your primary phones. Sure, they have their place (I use one when I want to make calls from my PC) but I wouldn’t use them in a primary role. There’s just something about having a physical PHONE that you can pick up and dial that a softphone can’t really match.
Hope that helps!