Expertise · Telephony and contact centre
The telephony layer between your carrier and whoever answers — a person or an agent.
We build the exchange itself: SIP trunks, routing rules by opening hours, IVR menus read from the database, queues, transfer to a person, call recording and call analysis. The call becomes a record with a transcript and a summary, not a memory.
Construit dejaTrei implementări proprii, citate mai jos. (1) Stratul Asterisk din platforma Kallina: 5.522 de linii de configurație de dialplan, scripturi AGI și punți audio în `asterisk/`, plus șabloane de trunk generate automat per număr. (2) `asterisk-manager` — un serviciu separat care administrează cozile, trunkurile și fluxul RTP prin interfața de management a centralei. (3) Middleware-ul pentru centrala virtuală a unui operator, care a rulat în producție: commitul de reconciliere din 14 iulie 2026 aduce în depozit cod care rulase pe server și era cu circa 40 de zile înaintea git-ului. Rezerva, spusă înainte să întrebi: gazda SIP prin care trec liniile noastre de test nu răspunde — verificat azi, 06.09.2026, fără răspuns la ping și fără răspuns pe HTTP. Nu prezentăm un număr de demonstrație pe care să suni acum, pentru că nu l-am putea ridica în fața ta.
Între operatorul tău de telefonie și cine răspunde efectiv — un om sau un agent vocal — trebuie să existe un strat care ia decizii. Cine primește apelul la ora 23:40. Ce se întâmplă dacă nu răspunde nimeni. Unde se duce apelul când clientul cere „un om”. Ce rămâne din convorbire după ce s-a închis. Stratul acesta e o centrală, iar noi îl construim ca să fie al afacerii, nu al furnizorului de voce: dacă mâine schimbi motorul agentului, regulile de rutare, cozile și istoricul rămân la tine.
Concret, ce am construit: douăsprezece fișiere de dialplan — producție, IVR, coadă, transfer, voicemail, redirecționare, apeluri ieșite cu agent — patru scripturi AGI în Python și două punți audio, în total 5.522 de linii. Motorul de IVR nu are meniurile scrise în fișier: le citește din bază printr-un script AGI și întoarce una din șase decizii — către un agent, către alt meniu, către o coadă, transfer la un număr extern, mesaj final, sau închidere. Cozile se numesc după identificatorul lor și nu au membri scriși în configurație: se adaugă și se scot din exterior, prin interfața de management, ceea ce înseamnă că un operator poate intra sau ieși din coadă fără repornirea centralei.
Rutarea are reguli reale, nu un singur „sună aici”: ore de program și fus orar, program peste noapte de tipul 22:00 → 06:00, și potrivire pe prioritate — antetul SIP `Diversion`, care poartă numărul original de pe care s-a redirecționat apelul, apoi numărul propriu, apoi regula de rezervă. Trunkurile sunt generate per număr, cu nume construit din furnizor și număr, de o funcție de configurare — nu scrise de mână la fiecare linie nouă.
Ce iese din apel e la fel de important ca apelul. Pentru linia legată de centrala virtuală a unui operator am construit un middleware în Python care interoghează lista de înregistrări la fiecare minut, cu o reconciliere largă la fiecare șase ore ca o pană de rețea să nu piardă nimic, și un scan la trei minute al apelurilor pierdute — acelea nu au înregistrare și altfel ar fi complet invizibile. Fiecare înregistrare se descarcă, se transcrie, se analizează și se oglindește în analiza de apeluri, iar apelul pierdut devine o alertă. Idempotența stă într-un set Redis, ca aceeași înregistrare să nu fie procesată de două ori.