# OBSOLUTE Contract Approval (Sözleşme Onay)
###### tags: `Dijital`
Müşterilerin oanylaması gereken sözleşmeler için onaylatma altyapısı sunar.
## Hedefler
* Müşteriden onay alınacak sözleşme ve içerikler için onay alım işi için talep yapılabilmesi.
* Belge onayının mobil uygulama veya web üzerinden yapılabilmesi.
* Hem anlık talep (*SMS veya Push*) hem de uygulamalara girişte (*on-logon*) alınacak şekilde iş emri oluşturabilmesi.
## Belge Tanımları
Kulanıcılar tarafından onaylanacak tüm belge tiplerinin sistem üzerinde tanımlıdır.
* **name** Belge tipidir. Version ile birlikte tekil anahtardır. Sorgulamalar ve ilişkiler name ve version üzerinden yapılır.
* **title** belgenin kullanıcı arabirimlerinde gösterilecek adıdır.
* **version** belgenin versiyonu [semantic versioning](https://semver.org) olarak kayıt edilir. Sorgulamalarda tilde ve range desteği sağlar.
* **min-version** belgenin minimum versiyonunu belirler. Kişi özelinde müşterinin var olan sözleşmeleri incelenerek var olan sözleşmeler için yeniden sözleşme almamak için uygulanan kontrol verisidir.
* **temlate** belge dönüşümü yapılacak içeriği taşır. Template engine tarafından tanımlı belge adı kullanılır.
* **allow-to-sign** Belgenin fiziksel olarak imzalanıp imzalanamacağı bilgisidir.
```json
{
"id": "2c66921c-02f4-42fc-9b19-378ee0f4decd",
"status": "A",
"name": "retail-digital-bhs",
"title": "Bireysel Hizmet Sözleşmesi",
"version": "8.0.0",
"min-version": ">=6.x.x",
"template": "retail-digital-bhs-8-0-0",
"allow-to-sign": false
}
```
### GET : /contract-approval/document-type
Servisi ile sorgulanan tüm belge kayıtlarına erişilir.
#### Query Parameter
```json
"page-index": 1
"page-size": 10
"name": "retail-digital%"
"version": "latest"
"page-index": 1
"page-size": 10
"id":"15802b18-cc2f-4b79-808f-e35b6023782c"
"reference.name":"loan-account"
"reference.id":"TR330006100519786457841326"
"status":"A"
"active-process.id":""
"active-process.name":""
```
**name** parametresinde SQL Like benzeri parçalı arama yapılabilir.
**version** parametresi ile range, comparison (*>5.0.0 gibi*) verilerek arama yapilabilir.
### POST : /contract-approval/document-type
> **Zeebe Init Message** : content_approval_new_document_type
Servisi ile yeni bir belge tipi kaydı oluşturulur.
#### Body
```json
{
"name": "retail-digital-bhs",
"title": "Bireysel Hizmet Sözleşmesi 8.0",
"version": "8.1.0",
"min-version":">=6.x.x",
"template": "retail-digital-bhs-8-1-0"
}
```
### PATCH : /contract-approval/document-type/{name}/{version}
> **Zeebe Init Message** : content_approval_update_document_type
Servisi ile var olan belge tipi güncelenir.
#### Body
```json
{
"min-version":">=6.x.x",
"template": "retail-digital-bhs-8-1-0"
}
```
## Sözleşme Onay Emirleri
Uygulamalar ve süreçler müşteriden onay alınması beklenen belge tipleri için onaylama emri oluşturur. Bu onaylama emirleri bu altyapı içerisinde içerisinde işlenir.
* **reference-id** uygulamanın callback linkine geri dönerken beslenen anahtar veridir.
* **customer** müşteri TCKN veya VKN bilgisini içerir. Kullanıcı kendi adına veya temsil ettiği organizasyon adına sözleşme onayı veriyor olabilir. Bu ihtiyaç ile tüm emirlerde müşteri ve kullanıcı bilgileri ayrı ayrı gönderilir.
* **user** belgelere onay verecek kullanıcı TCKN numarası.
* **process** ve **process-state** belge onayı hangi akıştan hangi aşamada talep edildiği bilgisini içeirir. Raporlama amacıyla kullanılan verilerdir.
* **max-retry-count** kullanıcıya kaç defa hatırlatma yapılacağı bilgisini içerir. Boş geçilmesi veya 0 değeri verilmesi durumunda sözleşmeler onaylanana kadar sonsuz hatırlatma yapılacak demektir.
* **retry-frequence** hatırlatma frekansını belirlemek için kullanılır. CRON formatında frekans belirlenir. Ayrıca Internet Bankacılığı login anında sözleşme güncelleme uyarısı sunmak için *@logon* keywordu kullanılır.
* **timeout** ile emrin geçerlilik süresi dakika olarak tanımlanır. boş geçilmesi veya sıfır verilmesi durumunda emir sonsuz kabul edilir.
* Müşteriden onay istemek için ilk seferinde **notify-message-template** ile sonraki denemelerde **re-notify-message-template** ile bilgilendirme metni üretilir. Onay isteme metni mobil kullanmayan müşteriler için SMS üzerinden, mobil uygulama kullanan müşteriler için Mobile Push ile iletilir.
* **callback-url** ile işlem tamamlandığında veya işlem içerisinde emri verene sisteme bilgi döner. Eğer sadece işlem tamamlandığında bilgi isteniyorsa **callback-mode** *completed* olarak ayarlanır. Her bir aksiyon için bilgi isteniyorsa **callback-mode** *verbose* olarak ayarlanır. Eğer callback url PUT, POST veya PATCH tipinde ise sabit olarak emir durum paket bilgisi geçilir.
* **render-data** tüm belgelerin ve mesajların oluşturulması için gereken veri paketini içeririr. **render-data-for-log** ise iz kayıtlarının tutulduğu sistemlerde kritik bilgilerin ifşasını önlemek amacıyla gönderilen verilerdir. Opsiyoneldir, gönderilmemesi durumunda iz kayıtları içinde render-data kullanılır.
* **documents** onaylatma emri kapsamında onay istenen belge tanımları verilir. Her bir belge kaydında belge adı **name** ve onay istenen **version** bilgisi geçilir. Specific versiyon için onay istenebilecei gibi *latest* diyerek veya veri göndermeyerek son kayıtlı versiyon için onay istenebilir.
### Örnek Emir Emri
```json
{
"id": "15802b18-cc2f-4b79-808f-e35b6023782c",
"creation-process": "document-approval-save",
"active-process": {
"id": "15802b18-cc2f-4b79-808f-e35b6023782c",
"name": "document-approval-save",
"available-transitions": [
{
"name": "document-approval-approve-document",
"title": "Onayla",
"form": "process-approve-document-approve"
}
]
},
"reference": {
"name": "retail-loan-vehicle",
"id": "e39d7d85-22a3-4f35-a5ac-01fffc229635"
},
"customer": 38552069000,
"max-retry-count": 3,
"retry-frequence": "*/5 * * * *",
"timeout": "60",
"notify-message-template": "retail-digital-vehicle-loan-inform",
"re-notify-message-template": "retail-digital-vehicle-loan-inform-retry",
"callback-mode": "verbose | completed",
"callback-url": "POST api.burgan.com.tr/retail-loan-vehicle/approve-state/756a06e1-c808-41da-9dbb-b4ac9ed7fd00",
"render-data": {
"name": {
"first": "Ugur",
"last": "Karatas"
}
},
"render-data-for-log": {
"name": {
"first": "U*****",
"last": "K******"
}
},
"documents": [
{
"name": "retail-digital-bhs",
"target-version": "latest"
},
{
"name": "retail-digital-gdpr",
"target-version": "latest"
},
{
"name": "retail-digital-vehicle-loan-payment-plan",
"target-version": "latest"
}
]
}
```
### Callback Body
Eğer callback mode *completed* ayarlanmış ise;
* Belge imzaları tamamlandığında (*state=completed*),
* Zaman aşımına uğradığında (*state=timeout*)
* Operatör veya sistem tarafında emir iptal edildiğinde (*state=canceled*)
Callback url çağrılır.
Eğer callback mode *verbose* ayarlanmış ise yukarıda durumlara ek olarak;
* Kullanıcıya ilk onay metni gönderildiğinde,
* Kullanıcıya her hatırlatma metni gönderildiğinde
* Kullanıcının her hangi bir belgeye onay vermesi durumunda
Callback url çağrılır.
```json
{
"reference-id": "756a06e1-c808-41da-9dbb-b4ac9ed7fd00",
"customer": 38552069000,
"user": 38552069000,
"state":"completed | in-progress | timeout | canceled",
"retry-count": 2,
"max-retry-count": 3,
"channel":"mobile | sms",
"remaing-timeout": "12",
"documents": [
{
"name": "retail-digital-bhs",
"version": "6.0.2",
"state":"has-approved"
},
{
"name": "retail-digital-gdpr",
"version": "latest",
"state":"approved"
},
{
"name": "retail-digital-vehicle-loan-payment-plan",
"version": "latest",
"state":"in-progress"
}
]
}
```
### POST : /contract-approval/contract
Yeni bir emir kaydı için kullanmılır. Emirler güncellenemez sadece iptal edilebilir.
### DELETE : /contract-approval/contract/{reference-id}
Var olan bir emri iptale çekmek için kullanılır. Emir normalde iptal edilmez *canceled* statüsüne alınır. İptal anına kadar onayladığı belgeler sistemde onaylı kalır.
### GET : /contract-approval/contract/{page-index}/{page-size}
Servisi emirler sorgulanır. Sonuçlar callback body formatında array olarak döner.
#### Query Parameters
```json
"reference-id": "756a06e1-c808-41da-9dbb-b4ac9ed7fd00"
"customer": 38552069000
"user": 38552069000
"process": "retail-vehicle-loan-application"
"process-state": "document-approval"
"state":"in-progress"
```
:::warning
Query parametreler birden fazla aynı isimde parametre geçişini destekler. Örneğin "...state=timeout&state=completed..." gibi
:::
## Müşteri Sözleşme İzleme
### GET : /contract-approval/customer/{customer}/{page-index}/{page-size}
Müşteri ve kullanıcı bazında sözleşme durumlarını izlemek için ayrı bir servis sunulmaktadır.
#### Query Parameters
```
"user": 38552069000
```
#### Response
```json
{
"customer": 38552069000,
"user": 38552069000,
"documents": [
{
"name": "retail-digital-bhs",
"version": "6.0.2",
"process": "retail-vehicle-loan-application",
"process-state": "document-approval",
"approved-at": "2017-09-08T19:01"
},
{
"name": "retail-digital-gdpr",
"version": "4.0.2",
"process": "retail-vehicle-loan-application",
"process-state": "document-approval",
"approved-at": "2017-09-08T19:01"
},
{
"name": "retail-digital-vehicle-loan-payment-plan",
"version": "2.2.0",
"process": "retail-vehicle-loan-application",
"process-state": "document-approval",
"approved-at": "2017-09-08T19:01"
}
]
}
```
:::danger
History servisleri ayrıca değerlendirip servis kümesine eklemek gerekmektedir.
:::