Dareke

გამავალი ზარების კონტაქტ-ცენტრი ქართულ და ინგლისურ ენებზე, სამი ტიპის მომხმარებლისთვის. ოპერატორი კამპანიაზე ერთი ეკრანიდან მუშაობს: ირჩევს სტატუსს, აჭერს „შემდეგი ლიდი“ ღილაკს ან იღებს ავტომატურად დარეკილ ზარს, საუბრობს და შემდეგ ზარამდე უნდა მიუთითოს ზარის შედეგი. ზედამხედველი ხედავს ცოცხალ დაფას — აგენტების ბარათებს მოძრავი ტაიმერებით, კამპანიების პროგრესს, ზარების ლენტას და ავტოდამრეკის ტემპს, ასევე ანგარიშებს CSV ექსპორტით. ადმინისტრატორი მართავს კამპანიებს და ლიდების სიებს, მომხმარებლებსა და როლებს, აგენტის სტატუსებს, ზარის შედეგებს, „არ დაურეკოთ“ სიას და დამრეკის პარამეტრებს, სუპერ-ადმინი კი PBX-ისა და დირექტორიის ინტეგრაციებსაც ხედავს. ჩვენ ის თავიდან ბოლომდე ავაგეთ: Fastify API PostgreSQL-სა და Redis-ზე, Asterisk/FreePBX სატელეფონო ხიდი და React ფრონტენდი SIP სოფტფონით.

წელი: 2026 · კატეგორია: კონტაქტ-ცენტრი

ჩვენი როლი

Full-stack. API და მისი მონაცემთა მოდელი, დამრეკი და მისი ტემპის მართვა, PBX ინტეგრაცია, რეალური დროის არხი, ბრაუზერის სოფტფონი და სამივე სამუშაო სივრცე.

პრობლემა

გამავალი კამპანია რაოდენობაზე აგებული თამაშია, რომელსაც ადამიანები თამაშობენ. მომხმარებელთა სია თანმიმდევრულად უნდა დამუშავდეს, ვინც არ უპასუხა, მას თავიდან უნდა დაურეკო და ის, ვინც ზარების მიღებაზე უარი თქვა, სიიდან გამორიცხო. დამრეკის გარეშე ოპერატორი ციფრებს ხელით კრეფს და ზარებს შორის წუთებს კარგავს; მარტივი დამრეკი კი ან არავის რეკავს, ან მომხმარებელს აკავშირებს მაშინ, როცა ყველა ოპერატორი დაკავებულია.

ოპერატორის გარშემო დარბაზსაც იგივე პრობლემა აქვს. ზედამხედველს სჭირდება იმის დანახვა, ვინ საუბრობს, ვინ არის ზარის შემდგომი დამუშავების რეჟიმში და რომელი კამპანია ჩამორჩება — ამ ყველაფერის მიმდინარეობისას, ხოლო ადმინისტრატორს — კამპანიების, სიებისა და უფლებების შეცვლა იმ სატელეფონო სისტემის შეხების გარეშე, რომელზეც ზარები გადის.

მიდგომა

დამრეკს პროდუქტად ვთვლიდით, დანარჩენს კი — მისთვის განკუთვნილ ზედაპირად. ზარი PBX-ზე ინიცირდება, მომხმარებელი პასუხის შემდეგ კამპანიის რიგში ექცევა, PBX კი ოპერატორის ექსტენშენს რეკავს, რომელსაც ოპერატორი ბრაუზერში SIP-ით პასუხობს — ამიტომ მაგიდის ტელეფონი და დასაყენებელი არაფერია. რიგის წევრობა აგენტის სტატუსს მიჰყვება: სამუშაო სტატუსი პაუზას ხსნის, შესვენება მიზეზის მითითებით პაუზაზე აყენებს, ოფლაინ სტატუსი კი რიგიდან გამორიცხავს.

დამრეკი ერთი პროცესშიდა ციკლია: ტემპის კოეფიციენტით კამპანიების მიხედვით, რიგრიგობითი განაწილებით, უპასუხობისა და დაკავებული ლიდების გადავადებული განმეორებით, სამუშაო საათებისა და DNC შემოწმებით და შეცდომისას პაუზით. რეალური დროის მდგომარეობა Redis-ითა და ერთი WebSocket-ით მოძრაობს, ამიტომ ზედამხედველის დაფა დარბაზთან ერთად იცვლება.

მის გარშემო კონტაქტ-ცენტრის დანარჩენი ნაწილია: კამპანიები დაწყების, პაუზისა და გაჩერების ციკლით, ლიდების სიები CSV იმპორტით, ზარის შედეგები, რომლებიც განსაზღვრავენ, რა ემართება ლიდს მერე, გლობალური „არ დაურეკოთ“ სია და ადმინისტრატორის კონსოლი, სადაც PBX-ისა და დირექტორიის პარამეტრები დაშიფრულად ინახება და უშუალოდ ეკრანიდან მოწმდება.

მთავარი მომენტები

  • ოთხი როლი — ოპერატორი, ზედამხედველი, ადმინისტრატორი და სუპერ-ადმინი — თითოეულს საკუთარი საწყისი ეკრანით; არასწორი როლის მომხმარებელი შეცდომას კი არა, გადამისამართებას იღებს, ადმინისტრატორები სუპერ-ადმინებს ვერ ხედავენ, ხოლო ინტეგრაციების გვერდი და „სუპერ-ადმინის უფლების მინიჭება“ მხოლოდ სუპერ-ადმინს ეკუთვნის.
  • მარშრუტის ყოველი დამცავი მექანიზმი დუბლირებულია დამმუშავებლის შიგნით როლის შემოწმებით, ამიტომ ის არასოდეს არის ერთადერთი კარიბჭე.
  • ზარის შედეგის იძულებითი მითითება: შემდეგი ზარი არ შეიძლება, სანამ წინას შედეგი არ აქვს, გადარეკვისა და „არ დაურეკოთ“ წესებით, რომლებიც ლიდის სტატუსს ცვლიან.
  • ხელით და ავტომატური დარეკვა, ტემპის კოეფიციენტით, თავისუფალ ოპერატორებზე რიგრიგობით გადაცემით, მიტოვებული ზარების დამუშავებითა და შეცდომის შემთხვევაში პაუზით.
  • ზედამხედველის დაფა, რომელიც ტაიმერით კი არა, ცვლილების მოვლენებით ახლდება: აგენტების ბარათები, კამპანიების პროგრესი, ცოცხალი ლენტა, საათობრივი ზარები და ავტოდამრეკის პანელი.
  • კამპანიის სასიცოცხლო ციკლი ვალიდაციით (დრაფტი აგენტების ან მოლოდინში მყოფი ლიდების გარეშე ვერ დაიწყება), რეალური CSV იმპორტი ლიდებისთვის და გლობალური DNC სია.
  • სრულად ორენოვანი: 1,383 თარგმანის გასაღები თითო ენაზე, ნაგულისხმევად ინგლისური და ქართულისთვის `?lang=ka`.

არქიტექტურა

  • ფრონტენდი: React 18 და Vite SPA TypeScript-ზე, Tailwind-ითა და Radix-ზე დაფუძნებული shadcn/ui-ით, TanStack Query-ით, React Router-ით, Recharts-ითა და react-i18next-ით. გამოსახვამდე ბექენდიდან საჯარო გაშვების კონფიგურაციას იღებს (API URL, WebSocket URL, WebRTC გადამრთველი, SIP WSS URL და დომენი, ICE სერვერები), ბრაუზერის სოფტფონისთვის კი SIP.js-ს იყენებს.
  • API: Node 20 და Fastify Zod ვალიდაციით, `@fastify/jwt`-ითა და `@fastify/websocket`-ით, pino ლოგირებით. თორმეტი მოდული — auth, users, campaigns, agents, calls, dialer, dispositions, DNC, recordings, dashboard, settings და system config — ასზე მეტ მარშრუტს უკან დგას.
  • ავტორიზაცია და როლები: JWT სესიები ადგილობრივი bcrypt პაროლებით, ან LDAP / Active Directory bind, რომელიც მომხმარებელს პირველივე შესვლისას ავტომატურად ქმნის. ოთხი როლი: ოპერატორი, ზედამხედველი, ადმინისტრატორი და სუპერ-ადმინი.
  • მონაცემები: PostgreSQL 16 Prisma-ს გავლით: 14 მოდელი, რომლებიც მოიცავს მომხმარებლებს, აგენტის სტატუსებსა და სესიებს, აგენტის მდგომარეობის ლოგებს, კამპანიებს მათი აგენტებითა და ნომრებით, ზარის შედეგის კოდებს, ზარების ჩანაწერებს, DNC სიას, სისტემურ პარამეტრებს, დაშიფრულ სისტემურ კონფიგურაციასა და აუდიტის ლოგებს. ლიდის ჩანაწერები უნიკალურია კამპანიის, ტელეფონისა და ინსტანციის ნომრის მიხედვით, რითაც დუბლიკატები განზრახ ინახება.
  • რეალური დრო: Redis 7 pub/sub არხები აგენტის მდგომარეობის ცვლილებებისთვის, PBX-ის hangup, bridge და hold მოვლენებისთვის და კამპანიისა და ზარის განახლებებისთვის, რომლებიც ერთ ავტორიზებულ `/ws` WebSocket-ზე ნაწილდება. კლიენტები დაკავშირებისას აგენტის მდგომარეობების სნეპშოტს იღებენ, როლის მიხედვით ხდებიან გამოწერილები და ყოველ 30 წამში ping-ს აგზავნიან.
  • ტელეფონია: Asterisk / FreePBX, AMI-ით მართული ავტომატური ხელახალი დაკავშირებით: Originate, Hangup, Redirect ზარის გადართვისთვის და Queue ქმედებები. ჯერ მომხმარებელს ურეკავენ და პასუხის შემდეგ ოპერატორის PJSIP ექსტენშენს უკავშირებენ, ოპერატორი კი ბრაუზერში SIP-ით WSS-ზე პასუხობს. ჩაშენებული სიმულაციის რეჟიმი PBX-ის არარსებობისას ზარების სიმულაციას ახდენს.
  • დამრეკი: პროცესშიდა ერთწამიანი ციკლი კამპანიების მიხედვით ტემპის კოეფიციენტით, აგენტების რიგრიგობითი განაწილებით, უპასუხობისა და დაკავებული ლიდების გადავადებული განმეორებით, სამუშაო საათებისა და DNC შემოწმებით და შეცდომისას პაუზით.
  • ინტეგრაციების კონფიგურაცია: PBX-ისა და დირექტორიის პარამეტრები ბაზაში დაშიფრულად ინახება სუპერ-ადმინის მიერ, გარემოს ცვლადებს გადაფარავს და თითოეულს კავშირის შემოწმება აქვს. გაშვება Docker Compose-ით.

ციფრებში

როლი: 4 · ეკრანი მარშრუტით: 14 · სიმულირებული API დამმუშავებელი: 81 · ენა: 2 · თარგმანის გასაღები თითო ენაზე: 1,383 · კოდის სტრიქონი: 21k

შედეგები

  • ერთი სამუშაო სივრცე მთელი ზარისთვის: ლიდი, ისტორია, სტატუსი, დარეკვის მართვა და ზარის შედეგი, ხშირი ქმედებებისთვის კლავიატურის მალსახმობებით.
  • ზედამხედველები დარბაზს ისეთად ხედავენ, როგორიც ის არის — ვინ საუბრობს, რამდენ ხანს და რომელი კამპანია ჩამორჩება — ვინმესთვის შეკითხვის დასმის გარეშე.
  • კამპანიები, ლიდების სიები, მომხმარებლები, სტატუსები, ზარის შედეგები, DNC სია და დამრეკის ტემპი ბაზის რედაქტირების ნაცვლად ადმინისტრატორის ქმედებებად იქცა.
  • PBX-ისა და დირექტორიის კავშირები კონსოლიდან კონფიგურირდება და მოწმდება, საიდუმლოები კი დაშიფრულად ინახება და მხოლოდ „დაყენებულად“ ჩანს.
  • ერთი ინტერფეისი ქართულად და ინგლისურად სამივე სამუშაო სივრცეში.

რა გამოვიყენეთ

  • API: Node 20, Fastify, Zod ვალიდაცია, @fastify/jwt, @fastify/websocket, pino ლოგირება, bcrypt პაროლების ჰეშირება, LDAP / Active Directory bind
  • მონაცემები და რეალური დრო: PostgreSQL 16, Prisma (14 მოდელი, 3 მიგრაცია), Redis 7 pub/sub, ერთი ავტორიზებული WebSocket
  • ტელეფონია: Asterisk / FreePBX, AMI (Originate, Hangup, Redirect, Queue*), PJSIP შიდა ნომრები, SIP.js სოფტფონი WSS-ზე, WebRTC
  • ფრონტენდი: React 18, TypeScript, Vite, Tailwind CSS, Radix-ზე აგებული shadcn/ui, TanStack Query, React Router, framer-motion, Recharts, react-i18next, sonner, date-fns
  • მიწოდება: Docker Compose (PostgreSQL, Redis, API, ფრონტენდი), PBX-ის, WebRTC-ის გზისა და დამრეკის გაშვების სახელმძღვანელოები
  • დემოს აწყობა: @portfolio/demo-kit: სიმულირებული API, საცავი და სესია, საწყისი მონაცემები, რომლებიც ჩატვირთვისას დეტერმინისტული გენერატორით აიგება, BroadcastChannel ჩანართებს შორის სინქრონიზაციისთვის, i18next, ინგლისური და ქართული, @fontsource, ბანდლში ჩაშენებული შრიფტები

დემო

Boulder-ის მიერ აგებული რეალური პროდუქტის გამოგონილი ბრენდით გადაკეთებული ვერსია, რომლის ბექენდიც მოხსნილია. სატელეფონო ქსელი, PBX და სოფტფონის ხმა სიმულირებულია; ბრაუზერში მომუშავე სიმულაცია 81 API მარშრუტს პასუხობს, სიმულატორები კი ქსელსა და კოლეგებით სავსე დარბაზს თამაშობენ. ყველა მონაცემი მეხსიერებაში ინახება და გადატვირთვა ხელუხლებელ საწყის მონაცემებს აბრუნებს; გახსენით ორ ჩანართში, რომ ოპერატორის ზარები ზედამხედველის დაფაზე ნახოთ. სცენარის პანელი ლიდის ბარათის გვერდით დემოს საკუთარი დამატებაა. სახელები, კომპანიები და ტელეფონის ნომრები გამოგონილია, თქვენი ბრაუზერიდან კი არაფერი გადის.