Bani

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

წელი: 2026 · კატეგორია: ხმოვანი ოპერაციები

ჩვენი როლი

Full-stack. ზარების ჩანაწერების გაერთიანებისა და გადამისამართებების ლოგიკა, არქივისა და შემოწმების ამოცანები, უფლებების სისტემა, კონტაქტ-ცენტრის რედაქტორები და ფრონტენდი.

პრობლემა

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

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

მიდგომა

კონსოლი ორივე პლატფორმას ერთ ინტერფეისს უკეთებს და წესებს იმ კოდში ინახავს, რომლის წაკითხვაც შესაძლებელია.

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

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

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

  • ორი სატელეფონო პლატფორმა, ერთი ძიება: მონაკვეთები ლოგიკურ ზარებად იკრიბება და ყოველი გადამისამართების მონაწილეთა ჯაჭვი თავიდან იგება — უბრალო TypeScript-ით, რომელსაც დემო უცვლელად ასრულებს.
  • სარეზერვო ასლები, რომლებიც საკუთარ სისრულეს თავად ამტკიცებენ: შემოწმება წყაროსა და არქივს დღეების მიხედვით ადარებს და ავსებს მხოლოდ იმას, რაც აკლია — იმ შემოწმებასთან დაკავშირებულ გაშვებად, რომელმაც ხარვეზი აღმოაჩინა.
  • რვა როლი თერთმეტ ფუნქციაზე, რომლებიც უფლებების მატრიცაში მუშაობის დროს რედაქტირდება; ნავიგაცია, მარშრუტების დაცვა და API ერთსა და იმავე ფუნქციას ეყრდნობიან.
  • ჯერ დაჯავშნეთ, მერე შექმენით: შიდა ნომრები 10-წუთიანი დაბლოკვით და ცოცხალი უკუთვლით, ვადის გასვლისას გათავისუფლებით და აუდიტის ჟურნალში ყოველი ნაბიჯით.
  • ათეულობით აგენტის მასობრივი დაკომპლექტება დადასტურების ეტაპითა და აგენტების მიხედვით შეცდომების ანგარიშით, რადგან API ერთდროულად ერთ აგენტს წერს.
  • რეალური ჩამოტვირთვები ბიბლიოთეკის გარეშე: ხელით დაწერილი ZIP-ის ჩამწერი აშენებს როგორც აუდიოჩანაწერების არქივს, ისე `.xlsx` ექსპორტს.
  • ორენოვანი ბოლომდე: დაახლოებით 1 360 ინგლისური და 1 390 ქართული სტრიქონი, ქართული ტიპოგრაფიით, რომელიც თავიდანვე გათვალისწინებულია და არა ნაგულისხმევი შრიფტით ჩანაცვლებული.

არქიტექტურა

  • კონსოლი: Next.js App Router. სერვერული კომპონენტები გვერდის გამოჩენამდე ამოწმებენ ფუნქციის ხელმისაწვდომობას და მომხმარებელს გადაამისამართებენ იმ გვერდიდან, რომლის გახსნის უფლებაც მის როლს არ აქვს; კლიენტის გვერდები უფლებების ენდფოინთით კიდევ ერთხელ ამოწმებენ, ამიტომ პირდაპირი ბმულით ნავიგაციის გვერდის ავლა შეუძლებელია. ზარებზე წვდომა დამატებით პლატფორმის მიხედვითაც იზღუდება: კონტაქტ-ცენტრის როლი მეორე პლატფორმის ჩანაწერებს არასოდეს ხედავს.
  • ზარების ჩანაწერები: ორი წყარო, რომელიც ერთად იკითხება. საწარმოო პლატფორმის ზარის დეტალების ფაილები SFTP-ით მოდის და cron-ამოცანით PostgreSQL-ში იმპორტდება (შეჯერებისა და სრული ისტორიის რეჟიმებით); ღია კოდის PBX-ის საკუთარი ბაზა ინტერვალით სარკისებურად კოპირდება და დიაპაზონების მიხედვით მოწმდება. მონაკვეთების ზარებად გაერთიანება და გადამისამართებების აღდგენა უბრალო TypeScript-ია.
  • აუდიოჩანაწერები და არქივი: ძიება, სტრიმინგი და ZIP-ით ჩამოტვირთვა ხმოვანი არქივის სერვერიდან. ყოველდღიური cron ბოლო შვიდი დღის განმეორებითი ცდით ჩანაწერებს SMB ფაილურ არქივში აკოპირებს; შემოწმება ორივე მხარეს დღეების მიხედვით ადარებს და ავსებს იმას, რაც აკლია; მოვლენათა ჟურნალი ყოველ კოპირებას, გამოტოვებასა და ვადის გასვლას აფიქსირებს.
  • კონტაქტ-ცენტრი: კონტაქტ-ცენტრის პლატფორმის XML ადმინისტრირების API, რომელიც Next API-მარშრუტებით პროქსირდება, ხოლო XML-ის დამუშავება კლიენტში ხდება. API ერთდროულად ერთ აგენტს ცვლის, ამიტომ ჩაწერა თითო აგენტზე წაკითხვა-შეცვლა-ჩაწერაა, ხოლო მასობრივი ცვლილება შეცდომებს აგენტების მიხედვით აცნობებს. კვანძების მონიტორი პროცესორის დატვირთვას, მეხსიერებასა და მუშაობის დროს SNMP-ით კითხულობს.
  • შიდა ნომრები: დაბლოკვის ცხრილი 10-წუთიანი ვადით, რომელიც წაკითხვისას იწმინდება და PBX-ის საკუთარ ნომრების სიასთან ერწყმის. ჯერ დაჯავშნა, მერე შექმნა, გვერდზე უკუთვლით და აუდიტის ჟურნალით, წმენდის შესაძლებლობით.
  • პლატფორმის მდგომარეობა: პროცესში მომუშავე კოლექტორი ყოველ ხუთ წამში იღებს ჰოსტის ნიმუშს, წერს 60-წამიან ინტერვალებს (საშუალო, მინიმუმი, მაქსიმუმი), ინახავს 30 დღეს და ყოველ გაწერილ ბექენდს პინგით ამოწმებს. საათობრივი cron თვითშემოწმების ნაკრებს უშვებს და ყოველ გაშვებას PostgreSQL-ში ინახავს.
  • იდენტობა და უფლებები: Auth.js Credentials პროვაიდერითა და JWT სესიით, რომელიც როლსა და მომხმარებლის სახელს ატარებს. დირექტორიის მომხმარებლები LDAP-ით შემოდიან ჯგუფებისა და როლების შესაბამისობებით; ლოკალური და API ანგარიშები მათ გვერდით არსებობს. ფუნქციების ერთი ცხრილი ადმინისტრატორის გადაფარვებით მოქმედებს ლეიაუტში, გვერდებსა და API-ში.
  • ეს დემო: სერვერი, ბაზები, დირექტორია, ფაილური საცავები და SNMP ჩანაცვლებულია ბრაუზერში მომუშავე სიმულირებული API-თი, წინასწარ შევსებულ მონაცემებზე, Vite SPA-ში. გაერთიანებისა და გადამისამართების კოდი იგივეა; ამოცანები კი ტაიმერებია.

ციფრებში

როლი: 8 · ეკრანი: 12 · სიმულირებული მარშრუტი: 67 · ზარის მონაკვეთი საწყის მონაცემებში: 425 · ფრონტენდის კოდის ხაზი: 22k · ენა: 2

შედეგები

  • ნომრის ძიება ორივე პლატფორმაზე ერთდროულად პასუხობს, ხოლო გადამისამართებული ზარი ფრაგმენტების გროვის ნაცვლად ერთი სტრიქონია მონაწილეთა ჯაჭვით.
  • აუდიოჩანაწერი ძიებაცაა, ფლეერიც და ჩამოტვირთვაც — ხოლო კითხვას „უსაფრთხოდ არის დაარქივებული?“ პასუხი დღეების მიხედვით შემოწმებით ეძლევა და არა ვარაუდით.
  • რიგის დაკომპლექტება, კამპანიის შეცვლა და შიდა ნომრის გაცემა ახლა ერთ კონსოლშია, აუდიტის ჟურნალით, და არა ცალ-ცალკე, ერთმომხმარებლიან მომწოდებლის ხელსაწყოებში.
  • ვის რაზე აქვს წვდომა, ცხრილია, რომელსაც ადმინისტრატორი ცვლის და ერთი ფუნქცია ახორციელებს, და არა ვიღაცის თავში შენახული შეთანხმება.
  • მთელი ხმოვანი სისტემის მდგომარეობა — ჰოსტები, არხები, თვითშემოწმება — ერთი გვერდია ისტორიით, ამიტომ კითხვას „გუშინაც ასე იყო?“ პასუხი აქვს.

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

  • აპლიკაცია: Next.js 16 (App Router), React 19, TypeScript, Tailwind CSS 4, Auth.js (კრედენციალები + JWT)
  • მონაცემები: PostgreSQL (ზარების ჩანაწერების იმპორტი, თვითშემოწმების გაშვებები, დაბლოკვები, აქტივობის ჟურნალები, პარამეტრები), Prisma, MySQL (წაკითხვის წვდომა PBX-ის მონაცემთა ბაზაზე, სარკისებურად კოპირებული)
  • ინტეგრაციები: LDAP დირექტორიასთან bind და ჯგუფების შესაბამისობა, SNMP (კონტაქტ-ცენტრის კვანძების მეტრიკები), SFTP (ზარის დეტალების ფაილების მიწოდება), SMB ფაილური არქივი, სატელეფონო პლატფორმისა და კონტაქტ-ცენტრის ადმინისტრირების API-ები (REST, XML), fast-xml-parser
  • დაგეგმილი ამოცანები: cron: ჩანაწერების იმპორტი, სარკისებური კოპირების ინტერვალი, ჩანაწერების ყოველდღიური სარეზერვო ასლი ბოლო 7 დღის განმეორებითი ცდით, საათობრივი თვითშემოწმება, პროცესში მომუშავე ჰოსტის კოლექტორი (ნიმუში ყოველ 5 წმ-ში, 60 წმ-იანი ინტერვალები, შენახვა 30 დღით)
  • დემოს აწყობა: Vite 6, React 18, React Router 6, TanStack Query 5, i18next (KA / EN), Tailwind CSS 4, Radix UI, Recharts 2, Framer Motion, cmdk, React Hook Form + Zod, sonner, @portfolio/demo-kit

დემო

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