Skip to main content

Tích hợp AntBuddy

1. Tổng quan

INFO: Toàn bộ API từ phía Rạng Đông CRM sử dụng method POST

1.1. Thông tin chung

Base URL:

1.2. Authentication

Phía Rạng Đông sẽ cung cấp Service Account. Service Account bao gồm code và password.

  • Dev: code / password
  • Prod: code / password

TODO: Rạng Đông cung cấp code/password

  • Dev: code / password
  • Prod: code / password

AntBuddyAnt gọi vào API /rpc/portal/service-profile/login để lấy JWT.

{
    "code": "string",
    "password": "string"
}

Response trả về sẽ có dạng:Response:

{
    "token": "string",
    "expiredTime": "0000-00-00T00:00:00"
}

Thời hạn của JWT là 12 tiếng (43200 giây)

2. Customer

2.1. Luồng xử lý

  • Khi Agent tạo/sửa thông tin khách hàng trên Ant, Ant sẽ gọi webhook để đồng bộ dữ liệu về CRM
  • Khi Agent sửa thông tin khách hàng trên CRM, CRM gọi api cập nhật khách hàng trên Ant

2.2. API

2.2.0. Map thông tin Ant <-> CRM

  1. Địa chỉ: Ant (addresses) <-> CRM (Customer)
  • city = provinceId
  • state = districtId
  • wards = wardId
  • street = address
  1. SĐT: Ant (phones) <-> CRM (CustomerPhone)
  • type = phoneTypeId + phoneType.name (map theo PhoneType)
  • value = phone
[
    {
        "phoneTypeId": 0,
        "phoneType": {
            "name": "string"
        },
        "phone": "0123456789"
    }
]

Bảng enum PhoneType

IDCodeName
1MOBILEDi động
2TELEPHONECố định
  1. Email: Ant (emails) <-> CRM (customerEmails)
  • type = emailTypeId + emailType.name (map theo EmailType)
  • value = email
[
    {
        "emailTypeId": 0,
        "emailType": {
            "name": "string"
        },
        "email": "customer@example.com"
    }
]

Bảng enum EmailType

IDCodeName
1PERSONALCá nhân
2COMPANYCông ty
3OTHERKhác

2.2.1. Webhook đồng bộ khách hàng Ant -> CRM

API: /rpc/crm/ant/customer/webhook

FieldTypeDescriptionNote
idlongID khách hàng (CRM)Nếu create, id = 0
codeDraftstringID khách hàng (Ant)
namestringTên khách hàng
sexIdstringGiới tính khách hàngMap theo Gender
birthdaydatetimeSinh nhật khách hàngISO string
addressstringĐịa chỉ khách hàngXem mục 2.2.0.
customerPhonesCustomerPhone[]SDT khách hàngXem mục 2.2.0.
customerEmailsCustomerEmail[]Email khách hàngXem mục 2.2.0.
customerTypeIdlongID Loại khách hàngMap theo CustomerType
appUserIdlongID người phụ trách
taxCodestringMST khách hàng

Bảng enum CustomerType

IDCodeName
1RETAILKhách hàng lẻ
2COMPANYHệ thống đối tác CTDA
3STOREKhách hàng đại lý
4MODELKhách hàng mô hình
5WORKERKhách hàng thầu thợ

2.2.2. Đồng bộ khách hàng CRM -> Ant

API: https://apiring.antbuddy.com/contacts (PUT)

FieldTypeDescriptionNoteCRM Note
customerIdstringID khách hàng (Ant)Map vào CodeDraft
genderstringGiới tính khách hàngMap theo Gender= sexId
dateOfBirthstringSinh nhật khách hàng= birthday
namestringTên khách hàng= name
addressesobject[]Địa chỉ khách hàngXem mục 2.2.0.
phonesobject[]SDT khách hàngXem mục 2.2.0.
emailsobject[]Email khách hàngXem mục 2.2.0.
crmCustomerIdlongID khách hàng (CRM)
crmCustomerTypeIdlongID Loại khách hàng (CRM)Map theo CustomerType
crmAppUserIdlongID người phụ trách (CRM)
crmTaxCodestringMST khách hàng (CRM)

Bảng enum Gender

IDAnt IDCodeDescription
10MALENam
21FEMALENữ
32OTHERKhác

3. Ticket

3.1. Khái niệm

  • Ant Ticket tương ứng với CRM Issue
  • CRM Ticket là luồng nội bộ, không liên quan đến Ant Ticket

3.2. Luồng xử lý

sequenceDiagram
    ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}#mermaidDiagramAgent->>Ant: .error-icon{fill:#552222;}#mermaidDiagramTạo .error-text{fill:#552222;stroke:#552222;}#mermaidDiagramticket
    .edge-thickness-normal{stroke-width:2px;}#mermaidDiagramAnt->>CRM: .edge-thickness-thick{stroke-width:3.5px;}#mermaidDiagramTạo .edge-pattern-solid{stroke-dasharray:0;}#mermaidDiagram .edge-pattern-dashed{stroke-dasharray:3;}#mermaidDiagram .edge-pattern-dotted{stroke-dasharray:2;}#mermaidDiagram .marker{fill:#666;stroke:#666;}#mermaidDiagram .marker.cross{stroke:#666;}#mermaidDiagram svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaidDiagram .actor{stroke:hsl(0, 0%, 83%);fill:#eee;}#mermaidDiagram text.actor>tspan{fill:#333;stroke:none;}#mermaidDiagram .actor-line{stroke:#666;}#mermaidDiagram .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaidDiagram .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaidDiagram #arrowhead path{fill:#333;stroke:#333;}#mermaidDiagram .sequenceNumber{fill:white;}#mermaidDiagram #sequencenumber{fill:#333;}#mermaidDiagram #crosshead path{fill:#333;stroke:#333;}#mermaidDiagram .messageText{fill:#333;stroke:none;}#mermaidDiagram .labelBox{stroke:hsl(0, 0%, 83%);fill:#eee;}#mermaidDiagram .labelText,#mermaidDiagram .labelText>tspan{fill:#333;stroke:none;}#mermaidDiagram .loopText,#mermaidDiagram .loopText>tspan{fill:#333;stroke:none;}#mermaidDiagram .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(0, 0%, 83%);fill:hsl(0, 0%, 83%);}#mermaidDiagram .note{stroke:#999;fill:#666;}#mermaidDiagram .noteText,#mermaidDiagram .noteText>tspan{fill:#fff;stroke:none;}#mermaidDiagram .activation0{fill:#f4f4f4;stroke:#666;}#mermaidDiagram .activation1{fill:#f4f4f4;stroke:#666;}#mermaidDiagram .activation2{fill:#f4f4f4;stroke:#666;}#mermaidDiagram .actorPopupMenu{position:absolute;}#mermaidDiagram .actorPopupMenuPanel{position:absolute;fill:#eee;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaidDiagram .actor-man line{stroke:hsl(0, 0%, 83%);fill:#eee;}#mermaidDiagram .actor-man circle,#mermaidDiagram line{stroke:hsl(0, 0%, 83%);fill:#eee;stroke-width:2px;}#mermaidDiagram :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}AgentAntCRMticketId = nullalt[CRM xửIssue
    lý][Antalt xử lý]ticketId != nullalt[Không tạo CRM Ticket][TạoTicket
      alt CRM Ticket]Tạoxử ticketTạolý
        CRMCRM->>CRM: IssueXử lý/Đóng vấn đề
        CRM->>Ant: Đồng bộ
        Note left of CRM: ticketId = null
      else Ant xử lý
        Ant->>Ant: Xử lý/Đóng vấn đề
        Ant->>CRM: Đồng bộ
      end
    else Tạo CRM Ticket
      CRM->>CRM: Tạo CRM Ticket
      CRM->>Ant: Đồng bộ
      Note left of CRM: ticketId != null
      Ant->>Ant: Chặn xử lý/đóng trên Ant
      CRM->>CRM: Xử lý/Đóng ticket
      CRM->>Ant: Đồng bộAgentAntCRM
    

end

3.3. API

3.3.1. Webhook đồng bộ Ant -> CRM

API: /rpc/crm/ant/issue/webhook

Field Type Description Note
id long ID vấn đề Nếu create, id = 0
title string Tiêu đề
description string Mô tả vấn đề
issueStatusId long ID trạng thái
Map bảng IssueStatus
issueTypeId long? ID loại vấn đề
Map bảng IssueType
customerId long? ID khách hàng
Map bảng Customer
customerDraft string Tên KH nháp
phoneNumberDraft string SĐT nháp
antIdlongID vấn đề (Ant)

INFO: Nếu có customerId thì không cần customerDraft và phoneNumberDraft

INFO: Bảng IssueType, IssueStatus, TicketPriority phía Rạng Đông sẽ cung cấp qua file excel/csv

3.3.2. Đồng bộ CRM -> Ant

API: https://apiring.antbuddy.com/tickets (POST)PUT)

Field Type DescriptionNote CRM Note
ticketId string ID vấn đề
title string Tiêu đề
summary string Mô tả = description
priority string Mức độ ưu tiên Map bảng TicketPriority= ticket.ticketPriority.name
status string Trạng thái = issueStatus.name
issueTypeIdlong?ID loại vấn đề
customerId long? ID khách hàng
Map bảng Customer
customerDraftcrmIssueIdlongID vấn đề (CRM)
crmTicketIdlongID ticket (CRM)
crmAppUserIdlongID GDV xử lý (CRM)Map bảng AppUser
crmIssueTypeIdlong?ID loại vấn đề (CRM)Map bảng IssueType
crmCustomerDraft string Tên KH nháp (CRM)
phoneNumberDraftcrmPhoneNumberDraft string SĐT nháp (CRM)
crmCompletedAtdatetimeThời điểm xử lý (CRM)

4. Call Log

4.1. Webhook đồng bộ lịch sử cuộc gọi Ant -> CRM

API: /rpc/crm/ant/call-log/webhook

FieldTypeDescriptionNote
callIdstringMã định danh cuộc gọi
phonestringSố điện thoại khách hàng
emailstringEmail khách hàng
callFromstringSố gọi đi
callTostringSố nhận cuộc gọi
customerIdlong?ID khách hàng
callTimedatetimeThời điểm thực hiện cuộc gọi
startAtdatetime?Thời điểm bắt đầu cuộc gọi
endAtdatetime?Thời điểm kết thúc cuộc gọi
durationstringThời lượng cuộc gọi
callTypeIdlong?ID loại cuộc gọiMap bảng CallType
callStatusIdlong?ID trạng thái cuộc gọiMap bảng CallStatus
appUserIdlongID nhân viên phụ tráchMap bảng AppUser
notestringGhi chú cuộc gọi
recordUrlstringĐường dẫn file ghi âm

Bảng enum CallType

IDCodeDescription
1CALL AWAYCuộc gọi đi
2CALL INCOMINGCuộc gọi đến

INFO: Rạng Đông không sử dụng cuộc gọi nội bộ

Bảng enum CallStatus

IDCodeDescription
1ANSWEREDĐã trả lời
2NO ANSWERKhông trả lời
3MISSED CALLCuộc gọi nhỡ
4REJECTED CALLTừ chối cuộc gọi

4.2. Lấy file ghi âm

URL: Lấy từ recordUrl trong payload của webhook

TODO: Cần Ant làm rõ

  • Thời hạn của URL
  • Authentication như nào?