> ## Documentation Index
> Fetch the complete documentation index at: https://learn.cleeksy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Kết nối ứng dụng (Connected app)

> Kết nối giữa các app bằng Data source loại Connected app.

Connected app (kết nối ứng dụng) là **một loại Data source** dùng để kết nối dữ liệu giữa các app trong Cleeksy DOP.

Connected app giải quyết hai nhu cầu chính:

* **Submit/push**: app A gửi dữ liệu sang app B (ví dụ: bàn giao yêu cầu đã duyệt sang app Procurement)
* **Pull/read**: app A đọc dữ liệu từ app B để hiển thị hoặc tổng hợp (tuỳ cấu hình cho phép)

***

## Khi nào cần Connected app?

* Có 2 app với trách nhiệm khác nhau và cần bàn giao dữ liệu qua lại
* Cần tách ownership (source of truth / nguồn dữ liệu chuẩn) theo từng app
* Cần kiểm soát quyền chia sẻ: app nào được gửi/đọc dữ liệu, phạm vi record nào được phép

***

## Cách hoạt động (mô hình publish/consume)

Connected app thường có 2 phần:

### 1) Provider app (app cung cấp)

* Chọn Entity và phạm vi dữ liệu cần chia sẻ
* Chọn hình thức chia sẻ:
* Cho phép **submit** (nhận dữ liệu từ app khác)
* Cho phép **pull** (cho app khác đọc dữ liệu)
* Thiết lập field được phép và điều kiện lọc (nếu có)

### 2) Consumer app (app sử dụng)

Khi cấu hình các field cần dùng dữ liệu từ app khác, hệ thống sẽ yêu cầu chọn một **Data source** (loại *Connected app*) đã được chia sẻ từ provider.

Điểm quan trọng:

* Không cần “tạo consumption riêng” trước rồi mới tạo field.
  **Việc consume xảy ra trong lúc cấu hình** Data Connection / Lookup / Rollup (chọn Connected app và xác nhận quyền truy cập).

***

## Connected app dùng được ở đâu?

### A) Data Connection (một chiều): gửi hoặc liên kết

* Nếu mục tiêu là **submit/bàn giao** dữ liệu: dùng Data Connection (một chiều) để map field và đẩy record sang provider app (tuỳ cấu hình cho phép).

Liên quan: [Kết nối dữ liệu một chiều (Data Connection one-way)](/build-apps/data-modeling/data-connection-one-way)

### B) Lookup: tham chiếu để hiển thị

Khi provider cho phép pull, Lookup có thể tham chiếu các field cần hiển thị từ record liên quan.

Liên quan: [Tra cứu (Lookup)](/build-apps/data-modeling/lookup)

### C) Rollup: tổng hợp

Tổng hợp số liệu từ dữ liệu đã liên kết/tham chiếu (khi provider cho phép pull).

Liên quan: [Tổng hợp (Rollup)](/build-apps/data-modeling/rollup)

***

## Ví dụ: Purchase Request → Procurement (bàn giao để thực hiện mua sắm)

Mục tiêu: sau khi Purchase Request được duyệt, thông tin cần được **bàn giao** sang app Procurement để thực hiện mua sắm.

### Thiết lập đúng (đơn giản và thực dụng)

1. **Procurement (provider)** tạo Data source loại **Connected app** để **nhận submission**

* Chọn Entity đích (ví dụ: Procurement Task/PO Request)
* Chọn các field được phép nhận (item, số lượng, ngân sách, requester, deadline…)

2. **Purchase Request (consumer)** dùng **Data Connection (một chiều)** để submit

* Tạo field Data Connection (one-way) trỏ tới Connected app của Procurement
* Map các field cần gửi
* Kích hoạt theo workflow (ví dụ: khi Approved thì tạo/đẩy sang Procurement)

3. (Tuỳ chọn) Procurement publish trạng thái xử lý để Purchase Request pull hiển thị tiến độ

* Khi cần theo dõi, provider có thể cho phép pull để consumer dùng Lookup/Rollup hiển thị trạng thái.

***

## Guardrails (để không lệch dữ liệu)

* Chốt source of truth: Procurement là nơi quản lý dữ liệu mua sắm; Purchase Request không “nhập lại” các trường đã thuộc Procurement.
* Chỉ chia sẻ đủ dùng: giới hạn field và phạm vi record.
* Tránh coupling quá chặt: ưu tiên liên kết theo ID/record thay vì sao chép dữ liệu.

Liên quan: [Ownership & chia sẻ dữ liệu (Data ownership & sharing)](/foundations/data-ownership-sharing)
