That becomes a matrix if you are using location-based routing.
For example
NSW---VIC---QLD------User Class
-2------3------7---------Unrestricted
12-----13-----17--------Local, national, mobile
22-----23-----27--------local, national
32-----33-----37--------local only
You then have your route lists as per the digits dialled, eg
call type------Digits--------list:------Routes-----CoR----digmod----absorb----insert----User CoR permitted
emergency----0000+0-----1:--------1,31---------1---------1----------1-------------------all
international--00011+v----11:-----11,21--------11--------11---------1-------------------2-9
mobile--------004+8-------4:--------4,14---------4----------4---------1-------------------2-19
national------002+8-------10:------10,20--------10--------10---------1-------------------2-29
(repeat for 03,07)
local----------02+7---------2:-------2,12----------2---------2----------1--------02--------2,12,22,32
---------------------------------------3,13-----------3---------3----------1--------03-------3,13,23,33
---------------------------------------7,17-----------7---------7----------1--------07-------7,17,27,37
and then add 03+7, 04+7, etc... for all the other 8-digit local numbers to the same "local" routelist.
and then a list for the freecall type numbers, 013+4,01300+6,01800+6. Plus some weird security numbers and so forth that exist out there.
You then add another dimension to this entirely if your trunks aren't just redundant, but are located in places where call charges are variable, because then you have to add in least-cost routes depending on the specific national route or the user's CoR (which is linked to their zone), but when this is the case, you may not need location-based routing as well.
If you don't write this up as a table, trying to implement it using the controller forms makes your brain explode.