# Versiyonlama ve Referans
Amorphie uzerindeki bulunan verilerin versiyonlama ve kayitlar arasi iliski stratejisi amaciyla olusturulmustur.
## Tanimlar
* **Akis:** Veri tutan bir is akisinin tanim bilgisidir. Genel hatlari ile akisin statu ve gecis bilgilerinin tutar.
* **Kayit:** Bir akis kullanilarak olusturulan her bir akis ornegi kayit olarak adlandirilir.
* **Version:** Bir kaydin uzerinde bulunan her bir semantik versiyon bilgisidir. Minor, Major ve levelden olusur.
* **Patch:** Bir kaydin uzerinde yapilan her bir islem sonucunda olusan tekil(ULID) bir degerdir. Kaydin ayni zamanda ETag bilgisidir.
## Temel Kurallar
* Kaydin Minor ve Major versiyonlari akis tarafindan ve servis tuketen tarafindan yonetilir.
* Bir akis baslatildiginda, eger servis tuketen tarafindan verilmemisse ilk kaydin olusmasi ile Major her zaman bir(1) Minor ise Sifir(0) kabul edilir.
* Gecisler kaydin minor ve major versiyon numarasini arttirabilir. Bu tanimlama Gecis kaydinda yapilir.
* Patch degeri her bir transitionda otomatik olarak olusur.
* Kayitlar birbirleri arasinda referans iliskisi kurabilirler.
## Ornek
### Hesaplar
#### Hesap Tanimi
Hesap tanimi incelediginde;
Hesabin IBAN bilgisi **Key** olarak atanmis. **Key** servis tuketan tarafindan tekil bir anahtar olarak bir kayda eklebilir.
Hesabin uzerinde **holder** bilgisi referans olarak farkli bir domain icerisindeki **retail-customer** akisinda bir kayda referans olarak eklenmistir.
Hesabin uzerinde **branch** bilgisi referans olarak farkli bir domain icerisindeki **branch** akisinda bir kayda referans olarak eklenmistir.
> Her iki refansin eklendigi versiyon bilgileri (self) ve referansin son degerini iceren (latest) linkleri dinamik olarak olusturulup eklenecektir.
Kayit uzerinde **balances** bilgilerini ekleyen bir extension calismistir. Extension bilgileri kayit uzerinde tutulmaz kayit donerken calisan kod parcaciklari olup response modeli genisletirler. Burada *legder-balance*, blokelerden arinmis **available-balance** ve kredi limitlerininde eklendigi **comprehensive-balance** bilgisi verilmistir.
Kayit ustunde **state** extensionu kaydin statusunu vermekte olup varsayilan amorphie extensionidir.
```json
{
"id": "01JKQ8C63HECAGQGKCXKEC31CX",
"version": "1.0",
"key": "TR740006282973364859697859",
"eTag": "40194d183-430c-73af-bcd2-19f0740899d7",
"attributes": {
"title": "Vadesiz Hesabim",
"currency": "TRL",
"holder": {
"$type": "reference",
"key": 38552069008,
"id": "edecf2c3-86e2-4579-8cc7-25a3bd13358d",
"domain": "cif",
"flow": "retail-customer",
"version": "1.0"
},
"branch": {
"$type": "reference",
"key": 9530,
"id": "9388a4bf-3a17-4fc1-9858-1114276c6e75",
"domain": "organization",
"flow": "branch",
"version": "1.0"
}
},
"extensions": {
"state": {
"title": "active",
"status": "active"
},
"balances": {
"ledger-balance": {
"amount": 200000
},
"available-balance": {
"amount": 200000
},
"comprehensive-balance": {
"amount": 400000
}
}
}
}
```
##### Hesap Is Akisi
```mermaid
stateDiagram-v2
direction LR
[*] --> started : start
started --> draft : open
draft --> active : approve
active --> closed : close
```
#### Hesap Bakiyesi
Hesap ile 1-1 olarak iliskilidir. Hesap bakiyesinin (ledger-balance) guncel durumunu tutar.
Akislarda versiyon olmasi nedeniyle hesap bilgisinden ayri yonetmek veri coklamalarini azaltacagi icin bakiyeyi ayri takip etmek performas saglayacaktir.
:::warning
Muhasebe bacaginin yonetimi ayrica degelendirilmeli
:::
```json
{
"id": "b1af9921-072a-47a2-b0f6-84dd44d1db86",
"version": "1.0",
"key": "TR740006282973364859697859",
"eTag": "67767d183-430c-73af-bcd2-19f0740899d7",
"attributes": {
"currency": "TRL",
"ledger-balance": 200000,
"account": {
"key": "TR740006282973364859697859",
"id": "01JKQ8C63HECAGQGKCXKEC31CX",
"domain": "account",
"flow": "account",
"version": "1.0"
}
},
"extensions": {
"state": {
"title": "active",
"status": "active"
},
"balances": {
"available-balance": {
"amount": 200000
},
"comprehensive-balance": {
"amount": 400000
}
}
}
}
```
##### Hesap Bakiyesi Is Akisi
```mermaid
stateDiagram-v2
direction LR
[*] --> started : start
started --> active : open
active --> active : para-cek
active --> active : para-yatir
active --> active : execute-eod
active --> active : execute-sod
active --> active : reconcilation
active --> closed : close
```
##### Para-Cek Transition Cagrisi
Bu transition sadece hesap hareketinden cagrilip kayit altina alinacaktir
:::warning
Tum transaction datalari ana instace data icine yansimamali. Buradaki ornekteki gibi, defalarca ust uste bu transaction cagriliyor olacak.
:::
```json
{
"currency": "TRL",
"amount": 5000,
"transaction": {
"key": "87636",
"id": "09957cc6-57d9-4cbb-acd8-13fdc31be3c3",
"domain": "money-transfer",
"flow": "fast",
"version": "1.0"
}
}
```
#### Para Cekis Hesap Haraketi
Bir hesap uzerindeki her bir para cekme hareketini tutar. Her bir hareket ayri bir instance olarak yonetilir. Basit bir semaya ve akisa sahiptir. Hesap degisimlerini yapan akislar bu akisi kullanarak hareket girdisi saglar.
> Instance Data
```json
{
"id": "01JKQCRVASJN1MVPJXHHFZ9DZN",
"version": "1.0",
"eTag": "01JKQCSEA2XT6PVFEEB87PTT17",
"attributes": {
"amount": 5000,
"account": {
"key": "TR740006282973364859697859",
"id": "01JKQ8C63HECAGQGKCXKEC31CX",
"domain": "account",
"flow": "account",
"version": "1.0"
},
"transaction": {
"key": "87636",
"id": "09957cc6-57d9-4cbb-acd8-13fdc31be3c3",
"domain": "money-transfer",
"flow": "fast",
"version": "1.0"
}
},
"extensions": {
"state": {
"title": "done",
"status": "completed"
}
}
}
```
##### Hesap Hareketi Is Akisi
```mermaid
stateDiagram-v2
direction LR
[*] --> started : start
started --> closed : para-cek
```
#### Hesaptan Para Transferi
FAST Para transferi akisinda ornekteki hesabi kullanarak para transferi yapan kayit ornegi.
> Instace Data
```json
{
"id": "09957cc6-57d9-4cbb-acd8-13fdc31be3c3",
"version": "2.0",
"key": "87636",
"eTag": "0194d1af-429d-7a74-9df6-7021d9664833",
"attributes": {
"source": {
"key": "TR740006282973364859697859",
"id": "9f28a4ca-a875-4d94-b650-4dfadc0bc136",
"domain": "account",
"flow": "account",
"version": "1.0"
},
"target": {
"iban": "TR640006282663364859655844",
"holder": "John Doo"
},
"amount": 500000,
"transaction": {
"id": "01JKQCRVASJN1MVPJXHHFZ9DZN",
"domain": "account",
"flow": "account-transaction",
"version": "1.0"
}
},
"extensions": {
"state": {
"title": "done",
"status": "completed"
}
}
}
```