# Танилцуулга

Цахим баримтыг блокчэйнээр баталгаажуулах, шалгах нь

[Certify](https://certify.mn) үйлчилгээ нь инновацилаг технологийн шийдлийг ашиглан цахим баримтын үнэн зөв эсэхийг баталгаажуулах, шалгах боломжийг төр, хувийн хэвшлийн байгууллагууд болон тэдгээрээр үйлчлүүлэгч иргэдэд олгох зорилготой юм.

Уг үйлчилгээ нь [блокчэйн технологийн](https://docs.teo.mn/general/blockchain) давуу талыг ашигласан бөгөөд цахим баримтын үнэн зөв эсэхийг монгол улсад мөрдөгдөж буй хууль тогтоомжийн дагуу баталгаажуулж өгнө.&#x20;

Аливаа байгууллага цахим баримт (гэрчилгээ, тодорхойлолт г.м. PDF) иргэнд олгох бөгөөд тухайн баримтыг иргэн өөр нэг үйлчилгээ үзүүлэгч байгууллага эсвэл хувь хүнд аваачиж өгдөг. Хүлээн авсан байгууллага, хувь хүн уг цахим баримт өөрчлөгдөөгүй, эх сурвалж нь үнэн зөв эсэхт үргэлж эргэлзэж байдаг. Тэгвэл [блокчэйн технологийн](https://docs.teo.mn/general/blockchain) давуу талыг ашиглан цахим баримт хүлээн авагч тал маш хялбараар цахим баримтын үнэн зөв, өөрчлөгдөөгүй эсэхийг нотлох боломжийг [Notly](https://docs.certify.mn/notly/www.notly.mn) үйлчилгээ олгоно.

### Нотлох боломжтой цахим баримт үүсгэх нь

Цахим баримт олгогч байгууллага, хувь хүн нь [notly.mn](https://docs.certify.mn/notly/www.notly.mn) веб сайтад бүртгүүлж өөрийгөө баталгаажуулсны дараа цахим файлыг [notly.mn](https://docs.certify.mn/notly/www.notly.mn) удирдлагын хэсэгт (admin panel) оруулж өгнө. Эсвэл тухайн байгууллага өөрийн ашигладаг программ хангамжийн системтэй API холболт хийн цахим файлаа оруулж болно:

* [Notly.mn веб](/notly/issue-document/certify.mn-web) сайтын админ эрхээр нотлох боломжтой цахим баримт үүсгэх;
* [REST Api ](/notly/issue-document/certify.mn-api)ашиглан байгууллагын дотоодын системээс нотлох боломжтой цахим баримт үүсгэх;
* [Бидний хөгжүүлсэн санг (library)](/notly/issue-document/library) ашиглан байгууллагын дотоодын системээс нотлох боломжтой цахим баримт үүсгэх.

### Цахим баримтыг шалгах буюу баталгаажуулах нь

Блокчэйнд Hash утгыг нь бичсэн баримтыг шалгах буюу баталгаажуулахдаа мөн дараах гурван аргын аль нэгийг ашиглаж болно:

* [Notly.mn веб](/notly/verify-document/notly.mn-web) сайтаар (нэвтрэх шаардлагагүй);
* [REST Api](/notly/verify-document/deploy-on-premise) ашиглан байгууллагын дотоодын системээс шалгах;
* [Бидний хөгжүүлсэн санг (library)](/notly/verify-document/library) ашиглан байгууллагын дотоодын системээс шалгах.


# Хэрхэн ажилладаг вэ?

Цахим баримтыг нотлох боломжтой үүсгэх, үүсгэсэн файлаа үнэн зөв эсэхийг шалгахад гурван оролцогч тал байна:

1. Цахим баримт олгогч байгууллага: Жишээ нь Банк. Банк дансны хуулгыг цахим хэлбэрээр олгоно.
2. Иргэн эсвэл үйлчилгээ авагч байгууллага: Жишээ нь Дорж. Дорж Банкнаас өөрийн дансны хуулгаа цахим хэлбэрээр (PDF) авна.
3. Шалгагч байгууллага эсвэл хувь хүн: Жишээ нь гадаадын виз мэдүүлгийн газар буюу элчин сайдын яам. Доржийн дансны цахим хуулгыг авч үнэн эсэхийг шалгана.

Доорх зурагт цахим баримт блокчэйнд үүсгэх болон шалгах процессыг харуулав:

<figure><img src="/files/tP2GpmA9lYQQpBdaUB0g" alt=""><figcaption><p>Цахим баримт блокчэйнд баталгаажуулах болон үнэн зөв эсэхийг шалгах процесс</p></figcaption></figure>

1. Иргэн цахим баримт олгогч байгууллагаас цахимаар баримт авах хүсэлт өгнө.
2. Цахим баримт олгогч байгууллага цахим баримт үүсгээд түүнийхээ [Hash](https://en.wikipedia.org/wiki/Hash_function) утгыг тооцоолон олж түүнийгээ блокчэйнд бичнэ. Блокчэйнд тухайн **файлын агуулга бичигдэхгүй** зөвхөн **Hash утга** буюу файлыг төлөөлсөн дахин давхардахгүй дугаар бичигдэнэ. Уг дугаараас файлын эх хувийг буцаан сэргээх боломжгүй.
3. Байгууллага иргэнд цахим файлаа өгнө. Иргэн цахим файлыг өөрөө эзэмшиж, өөрөө захиран зарцуулах боломжтой болно.
4. Иргэн өөрийн эзэмшиж буй цахим баримтаа аль нэг үйлчилгээ үзүүлэгч байгууллагад аваачиж өгнө (и-мэйлээр, үйлчилгээ үзүүлэгч системээр, флашаар г.м.).
5. Үйлчилгээ үзүүлэгч байгууллага тухайн хүлээн авсан файлын [Hash](https://en.wikipedia.org/wiki/Hash_function) утгыг дахин тооцоолно. Уг тооцоолсон утгаа 2-р алхамд блокчэйн дээр бичигдсэн Hash утгатай харьцуулан үзнэ. Хэрэв уг хоёр утга ижил байвал тухайн цахим баримт үнэн зөв буюу өөрчлөгдөөгүй гэдгийг гэрчилнэ. Хэрэв иргэн уг файлыг өөрчилсөн, хуурамчаар үйлдэх оролдлого хийсэн бол файлын Hash утга өөрчлөгдөж блокчэйн дээрх Hash утгатай таарахгүй болно. Энэ дохиолдолд тухайн цахим баримт үнэн биш буюу хүчингүйд тооцогдоно.

### Голомт банкны жишээ

Жишээбэл та Голомт банкны интернет банкнаас дансны хуулгаа авахдаа "***Blockchain-ээр баталгаажсан"*** сонголтыг хийн цахим хуулгаа татаж авч болно. Энэ үед Голомт банкны систем таны цахим дансны хуулгын **Hash** утгыг блокчэйнд автоматаар бичнэ.

<figure><img src="/files/nftkQx1ikwskWxra6JRf" alt=""><figcaption><p>Банкны дансны хуулгаа нотлох боломжтой цахим хэлбэрээр татаж авах нь</p></figcaption></figure>

Та дансны цахим хуулгаа өөр нэг байгууллагад аваачиж өгөх, эсвэл та өөрөө уг файл үнэн зөв, өөрчлөгдөөгүй эсэхийг шалгах, баталгаажуулах бол [www.notly.mn](https://docs.certify.mn/notly/www.notly.mn) веб сайт руу орж цахим файлаа сонгоно. Уг веб сайт нь ямар нэг **сервер лүү таны файлыг илгээхгүй, зөвхөн таны веб хөтөч (browser)** дээр файлын Hash утгыг тооцоолон зөвхөн Hash утгыг блокчэйнээс шалгана. Шалгахдаа ямар нэг эрхээр **нэвтрэх**, **төлбөр төлөх шаардлагагүй**.

<figure><img src="/files/0ralvtwv0zTv429wlwNo" alt=""><figcaption><p>Цахим баримтаа үнэн эсэхийг шалгах жишээ</p></figcaption></figure>

Хэрэв таны цахим дансны хуулга хүчинтэй, үнэн зөв бол дараах дэлгэц гарч ирнэ. Та дэлгэцийн зүүн дээд талд байгаа ногоон дэвсгэр дээрх **"Хүчинтэй"** гэсэн тэмдэглэгээг сайтар анзаарах хэрэгтэй. Мөн тухайн цахим баримтыг **хэн хэзээ үүсгэсэн,** блокчэйнд бичсэн дугаар зэргийг сайтар шалгаж баталгаажуулах хэрэгтэй.

<figure><img src="/files/216oBia6UFBQR27aQAzF" alt=""><figcaption><p>Цахим баримт шалгаж буй байдал</p></figcaption></figure>


# Блокчэйнд цахим баримт оруулах

Баримт бичгийг блокчэйнд оруулахдаа бид [ухаалаг гэрээ](https://github.com/teo-mn/certify-sc) ашиглан хаш утгыг хадгалдаг. Техник талаасаа та баримт бичиг оруулахдаа энэ ухаалаг гэрээний [addCertification](https://github.com/teo-mn/certify-sc/blob/8d1229efbcdc8356c09afceedfae4463d2f6bb7b/contracts/Certification.sol#LL59C14-L59C30) функцийг, баримт бичгийг хүчингүй болгохдоо [revoke](https://github.com/teo-mn/certify-sc/blob/8d1229efbcdc8356c09afceedfae4463d2f6bb7b/contracts/Certification.sol#L120) функцийг тус тус дуудахад болох юм. Блокчэйнтэй харьцах, гүйлгээ хийх хөгжүүлэлтийн ажлыг хөнгөвчлөх зорилгоор дараах боломжуудыг санал болгож байна. Үүнд:

* [Notly.mn веб](/notly/issue-document/certify.mn-web) сайтын админ эрхээр нотлох боломжтой цахим баримт үүсгэх;
* [REST Api ](/notly/issue-document/certify.mn-api)ашиглан байгууллагын дотоодын системээс нотлох боломжтой цахим баримт үүсгэх;
* [Бидний хөгжүүлсэн санг (library)](/notly/issue-document/library) ашиглан байгууллагын дотоодын системээс нотлох боломжтой цахим баримт үүсгэх.

Дээрх сонголтуудаас алийг нь сонгох талаар эргэлзэж байгаа бол дараах хүснэгт туслана гэж найдаж байна.

| Сервис                                                            | Нөхцөл                                                                                                                                                             |
| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [Notly.mn веб](/notly/issue-document/certify.mn-web)              | Танай байгууллага нэмэлт хөгжүүлэлт хийхийг хүсэхгүй, боломжгүй байгаа бол зохимжтой.                                                                              |
| [REST Api](/notly/issue-document/certify.mn-api)                  | Олон тооны баримт бичгийг автоматаар оруулах эсвэл оруулсан баримт бичгүүдийг байгууллагын дотоодын системээр дамжуулж татаж авах зэрэг хэрэгцээтэй бол зохимжтой. |
| [Бидний хөгжүүлсэн санг (library)](/notly/issue-document/library) | Цахим болгох гэж буй баримт бичиг нууцлал өндөртэй буюу гуравдагч байгууллагын системээр дамжуулахыг хүсэхгүй байх үед нэмэлт хөгжүүлэлт хийн ашиглахад зохимжтой. |


# Certify.mn Web

Нотлох боломжтой цахим баримт үүсгэх нь

## Бүртгүүлэх

Цахим баримт үүсгэхдээ certify.mn веб сайтад бүртгүүлнэ. Та байгууллагынхаа регистрийн дугаарыг оруулснаар бүртгэх боломжтой болох ба манай ажилтан холбоо барих мэдээллийн дагуу эргэн тантай холбогдож бүртгэлийг баталгаажуулна.

<figure><img src="/files/Sqd4x5YrYyoSqvRiAbFz" alt=""><figcaption><p>Notly.mn бүртгүүлэх хуудас</p></figcaption></figure>

Бүртгэлийг баталгаажуулсны дараа системд нэвтрэх нэг удаагийн нууц үгийг илгээх ба эхний удаа нэвтэрч ормогцоо нууц үгээ солих шаардлагатай.

<figure><img src="/files/ZJRzob46gjwuhRuUyHZl" alt=""><figcaption><p>Notly.mn нууц үг солих</p></figcaption></figure>

## Тохиргоо

Нэвтэрч орсны дараа өөрийн профайл хэсэгт даран тохиргоо цэсийг сонгоно. Зүүн талын цэсэнд Хэрэглэгчийн бүртгэл, Бүртгэлийн мэдээлэл, Салбар нэгж, Api key гэсэн тохиргооны цэсүүд харагдана.

<figure><img src="/files/zkzhNrgDqro8IhRKu9SA" alt=""><figcaption><p>Тохиргоо хийх хуудас</p></figcaption></figure>

### Бүртгэлийн мэдээлэл буюу хавтас

Системд нэвтэрч ормогцоо цахим баримтуудыг зохион байгуулалттай үүсгэхийн тулд тодорхой **шинж** бүхий хавтас үүсгэнэ. Шинж буюу хавтасны мэдээллийг та өөрийн хүссэнээрээ үүсгэх боломжтой ба уг хавтас нь цахим файлын ангилал болно.

<figure><img src="/files/A8UYDkkiX5vG9pquOxKG" alt=""><figcaption><p>Хавтасны мэдээлэл бүртгэх</p></figcaption></figure>

Мөн уг шинжүүдийн утга нь сонголттой байж болох ба та мөн сонголтын утгуудыг оруулж өгч болно. Жишээлбэл дээрх зурагт үзүүлснээр Он, Улирал, Салбар сургууль, Зэрэг гэсэн 4 мэдээллийг админ үүсгэсэн байна. Харин **Он** гэдэг мэдээлэлд гарч ирэх сонголтуудыг доорх зурагт үзүүлсэн шиг бүртгэж болно.

![](/files/djcQBF9koHSf1B0Ui4XY)

Сонголтыг шинээр бүртгэхдээ баруун дээр байгаа нэмэх тэмдэг дээр дарж дараах цонх гарч ирэх ба сонголтын утгыг бичин хадгална.

<figure><img src="/files/QfKD3QlgrGuErj1SFM9u" alt="" width="322"><figcaption></figcaption></figure>

### Салбар нэгж

Хэрэв танай байгууллага салбар нэгжтэй ба уг салбар нэгж тус бүр зөвхөн өөрийн оруулсан цахим баримтыг л харах, удирдах шаардлагатай бол **Салбар нэгж** цэс дээр даран салбар нэгжүүдээ бүртгэж болно.

<figure><img src="/files/IanGS5rRGqyzNr5JiIQ0" alt=""><figcaption></figcaption></figure>

### Хэрэглэгч

Хэрэв танай байгууллага цахим баримт үүсгэх олон ажилтантай бол админ хэрэглэгч нь Тохиргоо цэс рүү орон өөр хэрэглэгч бүртгэж болно.

Хэрэглэгч бүртгэхдээ **Салбар нэгж** тохируулж өгч болох ба ингэснээр тухайн хэрэглэгч зөвхөн тухайн салбар нэгжийн цахим файлыг удирдана.

<figure><img src="/files/RyqclQKKT4AaDutkjwTO" alt=""><figcaption><p>Шинэ хэрэглэгч бүртгэх нь</p></figcaption></figure>

## Цахим баримт блокчэйнд оруулах

Цахим баримтыг нотлох боломжтой болгохын тулд файлаа notly.mn системд оруулах шаардлагатай ба систем нь уг баримтын Hash утгыг тооцоолж ухаалаг гэрээнд буюу блокчэйнд бичнэ.

Файл блокчэйнд оруулахдаа программын дээд хэсэгт байрлах "ШИНЭЭР БАТАЛГААЖУУЛАХ" цэс дээр дарна.

Шинээр файл оруулах нь 3 алхамтай ба олон файл оруулах бол багцлаад zip файл үүсгэн оруулж болно. Харин нэг удаагийн оруулалтаар дээд тал нь 20mb файл байх шаардлагатайг анхаарна уу.

### **Алхам 1: хавтас** сонгох

Оруулах файлын ангилал буюу хавтасыг сонгоно. Хавтас сонгомогц өмнө Тохиргоо хэсэгт бүртгэсэн хавтасын **шинж** буюу мэдээллүүд гарч ирэх ба уг мэдээллийн утгыг сонгоно.

<figure><img src="/files/GmSmcVPNlRXFHEX7mrov" alt=""><figcaption><p>Бүртгэлийн мэдээлэл бөглөх</p></figcaption></figure>

Хэрэв тухайн баримт хүчинтэй хугацаатай бол уг хугацааг мөн сонгож өгнө. Энэ тохиолдолд хүчинтэй хугацаа дууссан үед тухайн цахим файлыг блокчэйнээс шалгахад *ХУГАЦАА ДУУССАН* гэж харуулна. Энэ нь ямар нэг хугацаатай олгогддог тусгай зөвшөөрөл эсвэл тодорхойлолтод маш хэрэгтэй юм.

### **Алхам 2: файл оруулах**&#x20;

Цахим файлуудаа оруулах ба анхаарах зүйлийг доор бичсэн байна. Файлыг оруулахдаа *"Бичиг баримт оруулах"* талбарт өөрийн компьютер дээрээс хулганаар чирч болно. Мөн уг талбар дээр хулганаар товшиж файлаа сонгож болно.

<figure><img src="/files/MBQYk5ziFk78yXz27RTm" alt=""><figcaption><p>Файл сонгох цонх</p></figcaption></figure>

Файл сонгосны дараа дараах хэлбэртэй харагдах ба үргэлжлүүлэх товч дарснаар Блокчэйн сүлжээнд уг файлын Hash утгыг бичих алхам руу шилжинэ.&#x20;

<figure><img src="/files/sdyJYXWLLrh3713dXf1S" alt=""><figcaption><p>Файл сонгосон байдал</p></figcaption></figure>

### **Алхам 3: блокчэйнд бичих**

Блокчэйнд оруулах боломжтой файлуудыг жагсаан харуулах ба та мэдээллээ сайтар нягталсны дараа "БЛОКЧЭЙН СҮЛЖЭЭНД БАТАЛГААЖУУЛАХ" товчийг дарснаар файлуудын Hash утгыг блокчэйнд бичнэ.

<figure><img src="/files/CUx23QsHg1J4FJOdfnyb" alt=""><figcaption><p>Мэдээлэл нягтлах цонх</p></figcaption></figure>

Товч дарсны дараа дээрх мэдээллийг уншаад "Тийм" товч дарна.

<figure><img src="/files/d5OZttqhDBq5Df4J0JTh" alt="" width="374"><figcaption></figcaption></figure>

Блокчэйнд мэдээллийг бичих нь бага зэрэг хугацаа авдаг ба систем бичсэний дараа таны оруулсан файлыг татаж авах боломжтой болгоно. Доорх зургийг харна уу!

<figure><img src="/files/CJIFKhewDwwTVzWJeyWg" alt="" width="374"><figcaption></figcaption></figure>

"ДУУСГАХ" товч дарснаар оруулсан файлуудын төлвийг доорх цонхонд харуулах ба олон файл оруулсан бол Амжилттай болсон, Хүлээгдэж буй, Хүчингүй болсон, Алдаатай болсон файлуудыг тус тусад нь ялган харуулна. Уг файлуудыг тус тусад нь сонгон татаж авах боломжтой ба татаж авсан файлаа харилцагчдаа өгнө гэдгийг мартаж болохгүй.

<figure><img src="/files/mtcFSVGLWLwx3GOa4Thj" alt=""><figcaption><p>Блокчэйнд оруулсан файлуудын дэлгэрэнгүй мэдээлэл</p></figcaption></figure>

## Хянах самбар

Уг цэсэнд танай компанийн нийт блокчэйнд оруулсан түүх харагдах ба баруун хэсэгт дэлгэрэнгүй хайлт хийх боломжтой талбар байна.

<figure><img src="/files/Ce6SNEuGI3JTu1opFg9b" alt=""><figcaption><p>Хянах самбар</p></figcaption></figure>

Жагсаалтын нэг элемент дээр дарж дэлгэрэнгүй харагдах ба хэрэв тухайн оруулсан мэдээлэлтэй яг ижил дахин цахим файл оруулах бол мөрийн ард байгаа "Нэмэх" товчийг дарна.


# Certify.mn API

certify.mn api ашиглан нотлох боломжтой цахим баримт үүсгэх нь

{% hint style="info" %}
Юун түрүүнд та certify.mn системд бүртгүүлээд API Key авсан байх ёстойг санаарай. \
API Key үүсгэх заавар [эндээс](/notly/issue-document/certify.mn-api/create-api-key) үзээрэй.
{% endhint %}

Certify систем нь датагаа эмх цэгцтэй хадгалж, эргээд хайлт хийхэд хялбар болгох үүднээс дараах байдлаар хадгалдаг.

**Хавтас /graduation/:** Хэд хэдэн баримт бичгийн олонлог. Ихэвчлэн нэг ангийн төгсөлт, нэг тэнхимийн төгсөлт зэргийг хадгалвал зохистой. Шинээр хавтас/graduation/ үүсгэх зааврыг [эндээс](/notly/issue-document/certify.mn-api/graduation) үзээрэй.

**Ноорог /draft/:** Нэг удаагийн оролдлогоор баталгаажуулж буй файлууд. zip файл үүсгээд upload хийж байгаа бол zip доторх файлууд нэг draft болно. 1 pdf файл дангаараа оруулж байгаа бол уг файл дангаараа нэг draft дотор агуулагдана. Draft доторх бүх файл баталгаажсан бол draft дахиж хэрэглэгчид харагдахгүй.

**Баримт бичиг /document/:** Нэг ширхэг баримт бичиг. Жишээ нь диплом, гэрчилгээ ...

### Орчны мэдээлэл:

| Орчин                | URL                          |
| -------------------- | ---------------------------- |
| Production /notly/   | <https://notly.mn/service>   |
| Production /certify/ | <https://certify.mn/service> |

## Хэрэглэгчийн хувийн мэдээллийн дэлгэрэнгүй

<mark style="color:blue;">`GET`</mark> `https://certify.mn/service/api/user/user`

#### Headers

| Name                                        | Type   | Description |
| ------------------------------------------- | ------ | ----------- |
| x-api-key<mark style="color:red;">\*</mark> | String | API Key     |

{% tabs %}
{% tab title="200: OK Амжилттай үед" %}
{% tabs %}
{% tab title="Жишээ  Response" %}

```json
{
    "id": "03c480cd-fb0d-4c9a-ba60-86b508a31652",
    "username": "admin@test",
    "first_name": "admin",
    "last_name": "admin",
    "is_staff": false,
    "is_active": true,
    "is_admin": true,
    "is_oauth": false,
    "sub_company_id": "",
    "address": "BLOCK_CHAIN_ADDRESS",
    "credit": 10,
    "company": "Test company",
    "is_university": true,
    "logo_url": "https://storage.googleapis.com/test.png",
    "hemis_username": "test"
}
```

{% endtab %}
{% endtabs %}
{% endtab %}

{% tab title="401: Unauthorized API Key буруу үед" %}
{% tabs %}
{% tab title="Жишээ Response" %}

```json
{
    "detail": "API key-д тохирох хэрэглэгч олдсонгүй"
}
```

{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

## Хавтсын жагсаалт авах

<mark style="color:blue;">`GET`</mark> `https://certify.mn/service/api/v2/certification/graduation`

#### Query Parameters

| Name   | Type | Description |
| ------ | ---- | ----------- |
| limit  | Int  | хуудаслалт  |
| offset | Int  | offset      |

#### Headers

| Name                                        | Type   | Description |
| ------------------------------------------- | ------ | ----------- |
| x-api-key<mark style="color:red;">\*</mark> | String | API Key     |

{% tabs %}
{% tab title="200: OK Амжилттай үед" %}
{% tabs %}
{% tab title="Жишээ Response" %}

<pre class="language-json"><code class="lang-json">{
    "count": 2,
    "next": null,
    "previous": null,
<strong>    "results": [
</strong>        {
            "id": "d1099df6-dff8-4d13-8a0c-06cde35ca798",
            "created_by": {//үүсгэсэн харилцагч
                "username": "admin@test",
                "first_name": "admin",
                "last_name": "admin"
            },
            "revoked_count": 0,//хүчнгүй болсон баримтын тоо
            "failed_count": 1,//амжилтгүй болсон баримтын тоо
            "pending_count": 1,//блокчэйнрүү орох нь хүлээгдэж буй баримтын тоо
            "issued_count": 1,//блокчэйнрүү амжилттай орсон баримтын тоо
            "total_count": 3,//нийт баримтын тоо
            "created_at": "2023-05-29T11:28:01.572502Z", //үүсгэсэн огноо
            "updated_at": "2023-05-29T11:34:58.391081Z", //өөрчлөлт орсон огноо
            "expire_date": 0,//хүчинтэй хугацаатай бол хүчинтэй хугацааны timestamp
            "name": "2022-2023, Намар, ХШУИС, Бакалавр, Мэдээллийн Технологи, (F.IT231)",//хавтсын нэр
            "is_diploma": false,//их сургуулийн диплом эсэх мэдээлэл
            "type": "CERTIFICATION",//төрөл CERTIFICATION/DIPLOMA/DUAL_DIPLOMA
            "organization": "3ae23a96-3439-45c8-885d-fd0ce4338756"
        },
        {
            "id": "788346d2-9bef-4dbd-a8da-153eb85b90f2",
            "created_by": {
                "username": "admin@test",
                "first_name": "admin",
                "last_name": "admin"
            },
            "revoked_count": 0,
            "failed_count": 4,
            "pending_count": 0,
            "issued_count": 0,
            "total_count": 4,
            "created_at": "2023-03-26T07:52:47.133241Z",
            "updated_at": "2023-05-29T11:33:59.904393Z",
            "expire_date": 0,
            "name": "2022-2023, Хавар, ХШУИС, Магистр, Мэдээллийн Технологи, (F.IT231)",
            "is_diploma": true,
            "type": "DIPLOMA",
            "organization": "3ae23a96-3439-45c8-885d-fd0ce4338756"
        }
    ]
}
</code></pre>

{% endtab %}
{% endtabs %}

```json
```

{% endtab %}
{% endtabs %}

## Хавтсын дэлгэрэнгүй авах

<mark style="color:blue;">`GET`</mark> `https://certify.mn/service/api/v2/certification/graduation/<graduation_id>`

#### Path Parameters

| Name                                                | Type   | Description |
| --------------------------------------------------- | ------ | ----------- |
| \<graduation\_id><mark style="color:red;">\*</mark> | String | Хавтсын ID  |

#### Headers

| Name                                        | Type   | Description |
| ------------------------------------------- | ------ | ----------- |
| x-api-key<mark style="color:red;">\*</mark> | String | API Key     |

{% tabs %}
{% tab title="200: OK Амжилттай үед" %}
{% tabs %}
{% tab title="Жишээ Response" %}

```json
{
    "id": "d1099df6-dff8-4d13-8a0c-06cde35ca798",
    "revoked_count": 0,
    "failed_count": 1,
    "pending_count": 1,
    "issued_count": 1,
    "total_count": 3,
    "created_by": {
        "username": "admin@test",
        "first_name": "admin",
        "last_name": "admin"
    },
    "created_at": "2023-05-29T11:28:01.572502Z",
    "updated_at": "2023-05-29T11:34:58.391081Z",
    "expire_date": 0,
    "name": "2022-2023, Намар, ХШУИС, Бакалавр, Мэдээллийн Технологи, (F.IT231)",
    "is_diploma": false,
    "type": "CERTIFICATION",
    "organization": "3ae23a96-3439-45c8-885d-fd0ce4338756",
    "documents": [//баримт бичгүүдийн ID
        "1f0967f1-b602-4516-86ab-a7ff41aa753b",
        "1fb0b731-679c-426e-b908-4e33241e9051",
        "5aa33277-2cb3-4e3a-a889-4c17906ca9a7"
    ],
    "field_choices": [
        {
            "id": 20,
            "field": {
                "field_label": "Он",
                "id": "b48f6617-7393-4207-9cf5-0fa545053c99",
                "has_code": false,
                "order": 1
            },
            "value": {
                "id": "f8af3554-6e54-43b9-a77e-dbaa61b01f2e",
                "value": "2022-2023",
                "code": "2022-2023"
            }
        },
        {
            "id": 22,
            "field": {
                "field_label": "Салбар Сургууль",
                "id": "eb24427b-575c-48a5-81b6-cb0805389ecf",
                "has_code": false,
                "order": 3
            },
            "value": {
                "id": "092b8049-c6fd-411f-9d51-367d51bf5b95",
                "value": "ХШУИС",
                "code": "ХШУИС"
            }
        },
        {
            "id": 24,
            "field": {
                "field_label": "Хөтөлбөрийн Нэр",
                "id": "fd75261e-2370-464a-af6f-bc2664e56863",
                "has_code": true,
                "order": 5
            },
            "value": {
                "id": "99f1551e-a7f6-463a-8b54-7f876243cc11",
                "value": "Мэдээллийн Технологи",
                "code": "F.IT231"
            }
        },
        {
            "id": 152,
            "field": {
                "field_label": "Улирал",
                "id": "11d1fd85-1a11-4e1e-b63c-eb288524374d",
                "has_code": false,
                "order": 2
            },
            "value": {
                "id": "df07419d-636c-4a6b-985b-0c0da10b173d",
                "value": "Намар",
                "code": "Намар"
            }
        },
        {
            "id": 153,
            "field": {
                "field_label": "Түвшин",
                "id": "1d0b7dbe-bf39-47e3-80c1-1341202506ea",
                "has_code": false,
                "order": 4
            },
            "value": {
                "id": "67291421-5d96-414f-b773-6e0a2ec589ec",
                "value": "Бакалавр",
                "code": "Бакалавр"
            }
        }
    ]
}
```

{% endtab %}
{% endtabs %}

```json
```

{% endtab %}
{% endtabs %}

## Хавтас доторх баримт бичгүүдийн жагсаалт авах

<mark style="color:blue;">`GET`</mark> `https://certify.mn/service/api/v2/certification/graduation/<graduation_id>/document`

#### Path Parameters

| Name                                                | Type   | Description                                                                                     |
| --------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------- |
| \<graduation\_id><mark style="color:red;">\*</mark> | String | Хавтсын ID                                                                                      |
| state                                               | String | баримт бичиг блокчэйн дээрх бичигдсэн эсэхийг илэрхийлэх төлөв ISSUED, REVOKED, PENDING, FAILED |

#### Query Parameters

| Name   | Type | Description |
| ------ | ---- | ----------- |
| limit  | Int  | хуудаслалт  |
| offset | Int  | offset      |

#### Headers

| Name                                        | Type   | Description |
| ------------------------------------------- | ------ | ----------- |
| x-api-key<mark style="color:red;">\*</mark> | String | API Key     |

{% tabs %}
{% tab title="200: OK Амжилттай үед" %}
{% tabs %}
{% tab title="Жишээ Response" %}

```json
{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": "5aa33277-2cb3-4e3a-a889-4c17906ca9a7",
            "state": "ISSUED",
            "created_by": {
                "username": "admin@test",
                "first_name": "admin",
                "last_name": "admin"
            },
            "revoked_by": null,
            "created_at": "2023-05-29T11:34:58.383667Z",
            "updated_at": "2023-05-29T11:35:00.484473Z",
            "name": "pdf-test",
            "file_hash": "354f65e6c4e2c3b994d13ae831a8c8576ff7754ee79caf904e8e1d48923c8025",
            "transaction_id": "0x61ebfd8ffbf5786549d3fa5db4e3845ffa67bd589ae2cfac78a341ba1da03726",
            "error_msg": null,
            "revoked_at": null,
            "revoke_txid": "",
            "revoke_note": "",
            "approved_at": null,
            "approve_txid": "",
            "sub_company_id": "",
            "draft": "b58e048a-9195-4ea3-8b16-fc96bd42df04",
            "graduation": "d1099df6-dff8-4d13-8a0c-06cde35ca798",
            "meta_data": null
        }
    ]
}
```

{% endtab %}

{% tab title="?state=ISSUED" %}

```json
{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": "5aa33277-2cb3-4e3a-a889-4c17906ca9a7",
            "state": "ISSUED",
            "created_by": {
                "username": "admin@test",
                "first_name": "admin",
                "last_name": "admin"
            },
            "revoked_by": null,
            "created_at": "2023-05-29T11:34:58.383667Z",
            "updated_at": "2023-05-29T11:35:00.484473Z",
            "name": "pdf-test",
            "file_hash": "354f65e6c4e2c3b994d13ae831a8c8576ff7754ee79caf904e8e1d48923c8025",
            "transaction_id": "0x61ebfd8ffbf5786549d3fa5db4e3845ffa67bd589ae2cfac78a341ba1da03726",
            "error_msg": null,
            "revoked_at": null,
            "revoke_txid": "",
            "revoke_note": "",
            "approved_at": null,
            "approve_txid": "",
            "sub_company_id": "",
            "draft": "b58e048a-9195-4ea3-8b16-fc96bd42df04",
            "graduation": "d1099df6-dff8-4d13-8a0c-06cde35ca798",
            "meta_data": null
        }
    ]
}
```

{% endtab %}

{% tab title="?state=REVOKED" %}

```json
{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": "fe781d28-b3f5-44ef-96b4-1d7d9a5abbcf",
            "state": "REVOKED",
            "created_by": {
                "username": "admin@test",
                "first_name": "admin",
                "last_name": "admin"
            },
            "revoked_by": {
                "username": "admin@test",
                "first_name": "admin",
                "last_name": "admin"
            },
            "created_at": "2023-03-26T11:28:45.041532Z",
            "updated_at": "2023-04-21T03:24:30.597528Z",
            "name": "test.pdf",
            "file_hash": "8b4b5ecdbe722f964b684a3333044ef2389c9df902c01107e781d70ee5b18b8f",
            "transaction_id": "0x9c388e5f30fcda10a014cafb410a166f3fb4b02cda88947d05aedfc0d733e89a",
            "error_msg": null,
            "revoked_at": "2023-04-21T03:24:30.594998Z",
            "revoke_txid": "0x2c88148b9ff0acead220054ff3b5c5d5fe49990474e01b2be52eb9d6f455aaa0",
            "revoke_note": "vnusssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss",
            "approved_at": null,
            "approve_txid": "",
            "sub_company_id": "",
            "draft": "2480439b-2477-4b99-9693-fd41e5bcab30",
            "graduation": "18ccd9d7-39a1-42ab-b9ed-2e77734981ce",
            "meta_data": null
        }
    ]
}
```

{% endtab %}

{% tab title="?state=FAILED" %}

```json
{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": "1f0967f1-b602-4516-86ab-a7ff41aa753b",
            "state": "FAILED",
            "created_by": {
                "username": "admin@test",
                "first_name": "admin",
                "last_name": "admin"
            },
            "revoked_by": null,
            "created_at": "2023-05-29T11:28:06.402372Z",
            "updated_at": "2023-05-29T11:28:11.013589Z",
            "name": "test",
            "file_hash": "5b9657f1fb18fdc9810931083b4f9755423a77cb47c7e0df507d8ad5d63cc18d",
            "transaction_id": null,
            "error_msg": "Блокчэйн дээр гүйлгээ хийхэд алдаа гарлаа.",
            "revoked_at": null,
            "revoke_txid": "",
            "revoke_note": "",
            "approved_at": null,
            "approve_txid": "",
            "sub_company_id": "",
            "draft": "4567c10e-ffcb-45cd-9749-6ec319607710",
            "graduation": "d1099df6-dff8-4d13-8a0c-06cde35ca798",
            "meta_data": null
        }
    ]
}
```

{% endtab %}
{% endtabs %}

```json
```

{% endtab %}
{% endtabs %}

## Баримт бичгийн дэлгэрэнгүй авах

<mark style="color:blue;">`GET`</mark> `https://certify.mn/service/api/v2/certification/graduation/<graduation_id>/document/<document_id>`

#### Path Parameters

| Name                                                | Type   | Description       |
| --------------------------------------------------- | ------ | ----------------- |
| \<graduation\_id><mark style="color:red;">\*</mark> | String | Хавтсын ID        |
| \<document\_id><mark style="color:red;">\*</mark>   | String | Баримт бичгийн ID |

#### Headers

| Name                                        | Type   | Description |
| ------------------------------------------- | ------ | ----------- |
| x-api-key<mark style="color:red;">\*</mark> | String | API Key     |

{% tabs %}
{% tab title="200: OK Амжилттай үед" %}
{% tabs %}
{% tab title="Жишээ Response" %}

```json
{
    "id": "5aa33277-2cb3-4e3a-a889-4c17906ca9a7",
    "state": "ISSUED",
    "created_by": {
        "username": "admin@test",
        "first_name": "admin",
        "last_name": "admin"
    },
    "revoked_by": null,
    "created_at": "2023-05-29T11:34:58.383667Z",
    "updated_at": "2023-05-29T11:35:00.484473Z",
    "name": "pdf-test",
    "file_hash": "354f65e6c4e2c3b994d13ae831a8c8576ff7754ee79caf904e8e1d48923c8025",
    "transaction_id": null,
    "error_msg": null,
    "revoked_at": null,
    "revoke_txid": "",
    "revoke_note": "",
    "approved_at": null,
    "approve_txid": "",
    "sub_company_id": "",
    "draft": "b58e048a-9195-4ea3-8b16-fc96bd42df04",
    "graduation": "d1099df6-dff8-4d13-8a0c-06cde35ca798",
    "meta_data": null
}
```

{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

## Хавтас доторх баримт бичгүүдээс татаж авах

<mark style="color:green;">`POST`</mark> `https://certify.mn/service/api/v2/certification/graduation/<graduation_id>/document/download`

нэг баримт бичиг бол .pdf хэлбэрээр олон баримт бичиг бол .zip хэлбэрээр татагдана.

#### Path Parameters

| Name                                                | Type   | Description |
| --------------------------------------------------- | ------ | ----------- |
| \<graduation\_id><mark style="color:red;">\*</mark> | String | Хавтсын ID  |

#### Headers

| Name                                           | Type   | Description      |
| ---------------------------------------------- | ------ | ---------------- |
| Content-Type<mark style="color:red;">\*</mark> | String | application/json |
| x-api-key<mark style="color:red;">\*</mark>    | String | API Key          |

#### Request Body

| Name                                            | Type           | Description                                                  |
| ----------------------------------------------- | -------------- | ------------------------------------------------------------ |
| document\_ids<mark style="color:red;">\*</mark> | Array\<String> | Татаж авах баримт бичгүүдийн ID уудыг хүснэгтэд хийн илгээнэ |

{% tabs %}
{% tab title="200: OK Амжилттай үед" %}
{% tabs %}
{% tab title="Жишээ Request" %}

```json
{
    "document_ids": ["doc_id"]
}
```

{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

## Хавтас дотор баримт бичиг нэмж блокчэйнд баталгаажуулах

<mark style="color:green;">`POST`</mark> `https://certify.mn/service/api/v2/certification/graduation/<graduation_id>/document/issue_single_document`

Хавтас үүсгэх зааврыг [эндээс](/notly/issue-document/certify.mn-api/graduation) хараарай.\
Нэг баримт бичиг бол .pdf хэлбэрээр олон баримт бичиг бол .zip хэлбэрээр илгээж болно. Энэ хүсэлтээр нэмсэн файл нь блокчэйнд баталгаажих хүртэл хэсэг хугацаа зарцуулагдана. Та [дэлгэрэнгүй](#barimt-bichgiin-delgereng-i-avakh) хүсэлтээр state төлөв нь ISSUED болсон эсэхийг шалгаж  болно. ISSUED бол баталгаажсан, FAILED бол ямар нэг алдаа гарсан, PENDING бол баталгаажихыг хүлээж байгаа.&#x20;

#### Path Parameters

| Name                                                | Type   | Description |
| --------------------------------------------------- | ------ | ----------- |
| \<graduation\_id><mark style="color:red;">\*</mark> | String | Хавтсын ID  |

#### Headers

| Name                                           | Type   | Description |
| ---------------------------------------------- | ------ | ----------- |
| Content-Type<mark style="color:red;">\*</mark> | String | form        |
| x-api-key<mark style="color:red;">\*</mark>    | String | API Key     |

#### Request Body

| Name                                   | Type | Description                             |
| -------------------------------------- | ---- | --------------------------------------- |
| file<mark style="color:red;">\*</mark> | File | .pdf эсвэл олон .pdf агуулсан .zip файл |

{% tabs %}
{% tab title="201: Created Амжилттай үед  /нээж жишээ харна уу/" %}
{% tabs %}
{% tab title="Жишээ Request" %}

```json
{
    "draft_id": "29e4e890-e3dc-4f45-aa43-a40cf62ca17e",
    "document_ids": [//баримт бичгүүдийн ID
        "e9a41e86-9477-463f-b0ac-81c103a18cdb"
    ]
}
```

{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

## Баталгаажсан баримтыг хүчингүй болгох

<mark style="color:green;">`POST`</mark> `https://certify.mn/service/api/v2/certification/graduation/<graduation_id>/document/revoke`

#### Path Parameters

| Name                                                | Type   | Description |
| --------------------------------------------------- | ------ | ----------- |
| \<graduation\_id><mark style="color:red;">\*</mark> | String | Хавтсын ID  |

#### Headers

| Name                                           | Type   | Description      |
| ---------------------------------------------- | ------ | ---------------- |
| Content-Type<mark style="color:red;">\*</mark> | String | application/json |
| x-api-key<mark style="color:red;">\*</mark>    | String | API Key          |

#### Request Body

| Name                                            | Type           | Description                                                       |
| ----------------------------------------------- | -------------- | ----------------------------------------------------------------- |
| document\_ids<mark style="color:red;">\*</mark> | Array\<String> | Хүчингүй болгох баримт бичгүүдийн ID уудыг хүснэгтэд хийн илгээнэ |
| revoke\_note<mark style="color:red;">\*</mark>  | String         | Хүчингүй болгож буй тайлбар                                       |

{% tabs %}
{% tab title="200: OK Амжилттай үед /нээж жишээ харна уу/" %}
{% tabs %}
{% tab title="Жишээ Request" %}

```json
{
    "document_ids": ["doc_id"],
    "revoke_note": "Алдаатай баримт"
}
```

{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

## Баталгаажуулах үед алдаа гарсан баримтыг дахин баталгаажуулах оролдлого хийх

<mark style="color:green;">`POST`</mark> `https://certify.mn/service/api/v2/certification/graduation/<graduation_id>/document/retry`

#### Path Parameters

| Name                                                | Type   | Description |
| --------------------------------------------------- | ------ | ----------- |
| \<graduation\_id><mark style="color:red;">\*</mark> | String | Хавтсын ID  |

#### Headers

| Name                                           | Type   | Description      |
| ---------------------------------------------- | ------ | ---------------- |
| Content-Type<mark style="color:red;">\*</mark> | String | application/json |
| x-api-key<mark style="color:red;">\*</mark>    | String | API Key          |

#### Request Body

| Name                                            | Type           | Description                                                            |
| ----------------------------------------------- | -------------- | ---------------------------------------------------------------------- |
| document\_ids<mark style="color:red;">\*</mark> | Array\<String> | Дахин баталгаажууалх баримт бичгүүдийн ID уудыг хүснэгтэд хийн илгээнэ |

{% tabs %}
{% tab title="200: OK Амжилттай үед" %}
{% tabs %}
{% tab title="Жишээ Request" %}

```json
{
    "document_ids": ["doc_id"]
}
```

{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}


# Хэрхэн API Key үүсгэх вэ?

Админ хэрэглэгч certify.mn рүү нэвтэрч орсны дараа Тохиргоо --> Api key цэс рүү орж шинээр үүсгэнэ.

<figure><img src="/files/4dLUZ5PuqyX8gfXEADKy" alt=""><figcaption><p>Api key жагсаалт</p></figcaption></figure>

Api key үүдийг идэвхгүй болгож болох ба эх хувь нь харагдахгүй. "API key үүсгэх" товч дээр дарж шинэ key үүсгэнэ.

<figure><img src="/files/eY76ptRXD7JoSNTYn2fN" alt="" width="281"><figcaption><p>Шинэ api key</p></figcaption></figure>

"Үүсгэх" товч дарснаар доорх зурагт харагдах Key үүсэх ба хуулж аван хадгалаарай. Уг key нь дахин харагдахгүй учир найдвартай хадгалаарай.

<figure><img src="/files/fi0t2uNqAGHhCzcKl58q" alt="" width="281"><figcaption></figcaption></figure>


# Хавтас /graduation/ үүсгэх

Хавтсын үндсэн зорилго нь системд баримт бичгээ эмх цэгцтэй хадгалах эргээд хайхад хялбар болгох юм.

Хавтсыг үүсгэхээс өмнө та  certify.mn ий админ эрхээрээ нэвтэрч Тохиргоо -> Бүртгэлийн мэдээлэл цэсийг сонгон хавтас үүсгэх дүрмээ тохируулах ёстой. Дүрэм нь дотроо нэг хавтас ямар ямар талбараас бүрдэх эдгээр талбаруудын сонгож болох утгуудыг оруулах юм.

<figure><img src="/files/SPYiHX2Xx3KyBLrXfVOj" alt=""><figcaption><p>Жишээ дүрэм</p></figcaption></figure>

Дээрх жишээ дээр нэг хавтас үүсгэхдээ он, улирал, салбар сургууль, түвшин, хөтөлбөрийн нэр гэсэн мэдээллүүдийг сонгох ёстой болно гэсэн үг.&#x20;

{% hint style="info" %}
Хэрэв байгууллагын дотоод систем дээр хялбараар хайх, эмх цэгцтэй хадгалах ажлыг хийнэ notly.mn дээр тийм байх шаардлагагүй гэж үзэж буй бол та зөвхөн нэг талбар нэг сонголт үүсгээд тэдгээрийг бүх баримт бичиг дээр ашиглаад явж болно.
{% endhint %}

**Нэгэнт хавтас үүсгэх дүрмээ оруулсан бол одоо хавтас үүсгэх боломжтой болсон тул дараах хүсэлтээр шинэ хавтас үүсгэнэ.**

## Өөрийн байгууллагын хавтас үүсгэх дүрэмд орсон талбаруудын мэдээлэл авах

<mark style="color:blue;">`GET`</mark> `https://certify.mn/service/api/organization/admin/fields`

#### Headers

| Name                                        | Type   | Description |
| ------------------------------------------- | ------ | ----------- |
| x-api-key<mark style="color:red;">\*</mark> | String | API Key     |

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "count": 5,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": "a99b3fcc-46f2-47f4-84da-13fd70f9d902",
            "values": [
                {
                    "id": "5199fa53-0b6c-4b17-bd6a-53f6fd28dbea",
                    "code": "",
                    "value": "2022-2023",
                    "order": 1,
                    "created_at": "2023-04-27T04:25:59.356200Z"
                },
                {
                    "id": "69bddf52-fcbf-4fa4-b281-053b0b28cffb",
                    "code": "",
                    "value": "2021-2022",
                    "order": 2,
                    "created_at": "2023-04-27T04:25:59.364539Z"
                }
            ],
            "created_at": "2023-04-27T04:25:59.351849Z",
            "updated_at": "2023-04-27T04:25:59.351894Z",
            "field_label": "Он",
            "field_code": "Он",
            "has_code": false,
            "order": 1,
            "has_custom_value": false,
            "is_active": true,
            "organization": "2"
        },
        {
            "id": "5cf0aa7e-cf74-4cd4-8117-e2f61089f663",
            "values": [
                {
                    "id": "2a6a0e24-0430-4ccd-9863-fbae90ae8ff6",
                    "code": "",
                    "value": "Намар",
                    "order": 1,
                    "created_at": "2023-04-27T04:25:59.380968Z"
                },
                {
                    "id": "afa3e1ad-9bc8-40d3-b394-fd5b599e1ceb",
                    "code": "",
                    "value": "Хавар",
                    "order": 2,
                    "created_at": "2023-04-27T04:25:59.386620Z"
                }
            ],
            "created_at": "2023-04-27T04:25:59.375470Z",
            "updated_at": "2023-04-27T04:25:59.375526Z",
            "field_label": "Улирал",
            "field_code": "Улирал",
            "has_code": false,
            "order": 2,
            "has_custom_value": false,
            "is_active": true,
            "organization": "2"
        },
        {
            "id": "66cddfd8-62b6-4015-946f-833ded0d8121",
            "values": [
                {
                    "id": "f376e329-4465-4b6d-b7be-cc98b2f9d4f2",
                    "code": "",
                    "value": "ХШУИС",
                    "order": 1,
                    "created_at": "2023-04-27T04:25:59.396766Z"
                },
                {
                    "id": "ce4d3e42-2f4e-41f3-a40e-896b64eb2fef",
                    "code": "",
                    "value": "ХЗС",
                    "order": 2,
                    "created_at": "2023-04-27T04:25:59.402039Z"
                }
            ],
            "created_at": "2023-04-27T04:25:59.393436Z",
            "updated_at": "2023-04-27T04:25:59.393481Z",
            "field_label": "Салбар Сургууль",
            "field_code": "Салбар Сургууль",
            "has_code": false,
            "order": 3,
            "has_custom_value": false,
            "is_active": true,
            "organization": "2"
        },
        {
            "id": "467d64c8-e34f-47a3-9856-73036538ee71",
            "values": [
                {
                    "id": "ea3f37b7-3c48-49d2-a724-f682a6df39ad",
                    "code": "",
                    "value": "Бакалавр",
                    "order": 1,
                    "created_at": "2023-04-27T04:25:59.410280Z"
                },
                {
                    "id": "5256f9ec-7a5b-4eef-bf37-7cd3c0cdbefc",
                    "code": "",
                    "value": "Магистр",
                    "order": 2,
                    "created_at": "2023-04-27T04:25:59.413894Z"
                },
                {
                    "id": "08dbda07-325b-4f15-a0c4-95a75537bd39",
                    "code": "",
                    "value": "Доктор",
                    "order": 3,
                    "created_at": "2023-04-27T04:25:59.419106Z"
                }
            ],
            "created_at": "2023-04-27T04:25:59.407259Z",
            "updated_at": "2023-04-27T04:25:59.407298Z",
            "field_label": "Түвшин",
            "field_code": "Түвшин",
            "has_code": false,
            "order": 4,
            "has_custom_value": false,
            "is_active": true,
            "organization": "2"
        },
        {
            "id": "1b5cd665-911b-4a7f-8c27-74e449532653",
            "values": [
                {
                    "id": "10ae71f9-a799-4a7f-9ed0-b4101141f8fe",
                    "code": "F.IT231",
                    "value": "Мэдээллийн Технологи",
                    "order": 1,
                    "created_at": "2023-04-27T04:25:59.426020Z"
                },
                {
                    "id": "12a94495-ed3e-4611-8305-3d7f33bbda34",
                    "code": "F.NS350",
                    "value": "Утасгүй Холбоо",
                    "order": 2,
                    "created_at": "2023-04-27T04:25:59.431454Z"
                }
            ],
            "created_at": "2023-04-27T04:25:59.424508Z",
            "updated_at": "2023-04-27T04:25:59.424551Z",
            "field_label": "Хөтөлбөрийн Нэр",
            "field_code": "Хөтөлбөрийн Нэр",
            "has_code": true,
            "order": 5,
            "has_custom_value": false,
            "is_active": true,
            "organization
```

{% endtab %}
{% endtabs %}

## Хавтас үүсгэх

<mark style="color:green;">`POST`</mark> `https://certify.mn/service/api/v2/certification/graduation`

#### Headers

| Name                                        | Type   | Description |
| ------------------------------------------- | ------ | ----------- |
| x-api-key<mark style="color:red;">\*</mark> | String | API Key     |

#### Request Body

| Name                                     | Type      | Description                                                                                                                                                                                                                                                              |
| ---------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| fields<mark style="color:red;">\*</mark> | Object\[] | <p>талбар бүрийн сонгосон утгууд байна.  Ингэхдээ дараах форматаар илгээнэ. \[{</p><p>"field\_id": "383208c7-a6a4-4a02-b548-6cf75327c0c4",</p><p>"chosen\_id": "91d7a9b7-f780-4728-a193-230694ca5f4f"</p><p>}] Хэрэв 5 талбар үүсгэсэн бол 5 ширхэг элемэнт илгээнэ.</p> |
| expire\_date                             | Timestamp | Хэрэв баримт бичгүүд хүчинтэй хугацаатай бол дуусах хугацааг timestamp хэрбэрээр илгээнэ. Энэ хавтас доторх бүх баримт бичиг энэ хугацаанд хүчингүй болно гэдгийг анхаараарай. 0 бол хүчинтэй хугацаагүй гэж үзнэ.                                                       |

{% tabs %}
{% tab title="201: Created Амжилттай үед" %}

```
Жишээ оролт:
{
    "fields": [
        {
            "field_id": "b1945d5d-d796-44b3-8082-ebc19cf26ff2",
            "chosen_id": "550d959a-4d40-47a2-b661-2469720cd75a"
        },
        {
            "field_id": "9046af68-21ee-49e2-bcd3-81a417ff8a41",
            "chosen_id": "825a3ffd-e84b-4072-b501-d7129971c163"
        },
        {
            "field_id": "922da795-4005-46b6-90f1-d6913e20e978",
            "chosen_id": "e1bf66e0-c1b8-430b-b9ca-f66d4372df01"
        },
        {
            "field_id": "cadb8523-4bd1-46bc-9d48-cb389e5d7b46",
            "chosen_id": "b032bf92-1022-406a-a253-c1f46ffb28b9"
        },
        {
            "field_id": "383208c7-a6a4-4a02-b548-6cf75327c0c4",
            "chosen_id": "91d7a9b7-f780-4728-a193-230694ca5f4f"
        },
        {
            "field_id": "3c19df98-d0d5-412d-bc77-5be0dd04b0e4",
            "chosen_id": "933392bf-71eb-4b7c-b75a-b1f2880d7b07"
        }
    ],
    "expire_date": 0
}

Жишээ гаралт:
{
    "id": "graduation_id",
    ...
}
```

{% endtab %}
{% endtabs %}


# Library

{% hint style="info" %}
Блокчэйнрүү баримт бичиг бичих, хүчингүй болгоход танд гүйлгээний шимтгэл төлөх  CRX болон notly ухаалаг гэрээний шимтгэл **нэгж** хэрэгтэй.  Хөгжүүлэлтийн орчинд та [faucet.teo.mn](https://faucet.teo.mn) сайтаас тест CRX болон нэгж аваарай.
{% endhint %}

<figure><img src="/files/wTtDJs1bFFvs3PXUWCXv" alt="" width="563"><figcaption><p>тест орчины нэгж</p></figcaption></figure>

Дотоод системээс блокчэйнд бичихдээ дараах сангуудыг ашиглах боломжтой.

**Сангийн мэдээлэл**

* [Javascript](/notly/issue-document/library/javascript)
* [Java](/notly/issue-document/library/java)
* [Python](/notly/issue-document/library/python)

**Жишээ код**

{% tabs %}
{% tab title="Java" %}

```java
PdfIssuer pdfIssuer = new PdfIssuer(
                "smartContractAddress",
                "issuerAddress",
                "issuerName",
                "nodeHost",
                3305
      );
   
try {
    VerifyResult result = pdfIssuer.verifyPdf("filePath");

    System.out.printf("State: %s\n", result.getState());
    System.out.printf("Issuer: %s\n", result.getIssuer());
    System.out.printf("Meta-data: %s\n", result.getMetadata());
    System.out.printf("Cert: %s", result.getCert());

} catch (Exception e) {
    System.out.printf("Error: %s", e);
}
```

{% endtab %}

{% tab title="Python" %}

```python
from verify4py.PdfIssuer import PdfIssuer

issuer = PdfIssuer(certify_contract_address,
                  corexchain_node_url,
                  issuer_address,
                  issuer_name,
                  chain_id=3305)

try:
   txid, error = issuer.issue_pdf(
            id,
            source_file_path,
            destination_file_path,
            expire_date,
            desc,
            additional_info,
            private_key,
            key_store,
            passphrase) 
    if error is not None:
        print("Error: {}", error)
    else
        print("Success: {}", txid)
except Exception as e:
    print("Error: {}", e)
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
import {PdfIssuer} from "verify4js-issuer";

const issuer = new PdfIssuer(
    '0xCc546a88Db1aF7d250a2F20Dee42eC436F99e075', 
    'https://node-testnet.teo.mn',
    '0x89995e30DAB8E3F9113e216EEB2f44f6B8eb5730',
    'test', 3305);

issuer.issuePdf('test',
    '/home/user/sample.pdf',
    '/home/user/sample_res.pdf',
    0, 
    'test', '',
    'private_key'
).then(console.log).catch(e => {
        console.error(e.message);
})
```

{% endtab %}
{% endtabs %}


# Javascript

## Verify4js-issuer

Эх код: <https://github.com/teo-mn/verify4js-issuer>

Verify4js-issuer нь сертификат, диплом, дансны хуулга зэрэг бичиг баримтыг блокчэйн дээр баталгаажуулж өгөх <https://github.com/corex-mn/certify-sc> ухаалаг гэрээтэй харьцдаг javascript хэлний сан юм.

* Тестнэт -тэй холбогдох нөүд: `https://node-testnet.teo.mn`
* Тестнэт дээрх ухаалаг гэрээний хаяг: `0xcc546a88db1af7d250a2f20dee42ec436f99e075`
* Тестнэт chainId: 3305
* Майннэт -тэй холбогдох нөүд: `https://node.teo.mn`
* Майннэт дээрх ухаалаг гэрээний хаяг: `0x5d305D8423c0f07bEaf15ba6a5264e0c88fC41B4`
* Майннэт chainId: 1104

### Суулгах заавар

```shell
npm install verify4js-issuer
```

```shell
yarn add verify4js-issuer
```

### Функцүүд

#### `issuePdf`

PDF файлын хаш утгыг тооцож ухаалаг гэрээнд бичээд, гүйлгээний мэдээлэл болон нэмэлт мэдээллүүдийг файлын мэтадата дээр нэмэн шинэ файлд хадгална.

Байгуулагчийн параметр:

| Параметр               | Тайлбар                              | Заавал эсэх |
| ---------------------- | ------------------------------------ | ----------- |
| `smartContractAddress` | Ухаалаг гэрээний хаяг                | тийм        |
| `nodeHost`             | Гүйлгээ хийх блокчэйний нөүдний хаяг | тийм        |
| `issuerAddress`        | Баталгаажуулагчийн хаяг              | тийм        |
| `issuerName`           | Баталгаажуулагчийн нэр               | тийм        |
| `chainId`              | Баталгаажуулагчийн нэр               | үгүй        |
| `hashType`             | Хашийн төрөл                         | үгүй        |

`issuePdf` функцийн параметр:

| Параметр              | Тайлбар                              | Заавал эсэх                                      |
| --------------------- | ------------------------------------ | ------------------------------------------------ |
| `id`                  | Файлын ID                            | тийм                                             |
| `sourceFilePath`      | PDF эх файлын зам                    | тийм                                             |
| `destinationFilePath` | Мэтадата бичсэн PDF-ийг хадгалах зам | тийм                                             |
| `expireDate`          | Дуусах хугацаа                       | үгүй                                             |
| `desc`                | Тайлбар, нэмэлт мэдээлэл             | үгүй                                             |
| `additionalInfo`      | Мэтадата дээр орох нэмэлт мэдээлэл   | үгүй                                             |
| `privateKey`          | Баталгаажуулагчийн хувийн түлхүүр    | үгүй /key\_store, passphrase өгөөгүй бол заавал/ |
| `keyStore`            | Хувийн түлхүүрийн keystore файл      | үгүй /private\_key өгөөгүй бол заавал/           |
| `passphrase`          | Хувийн түлхүүрийн passphrase файл    | үгүй /private\_key өгөөгүй бол заавал/           |

**Жишээ**

```js
import {PdfIssuer} from "verify4js-issuer";

const issuer = new PdfIssuer(
    '0xCc546a88Db1aF7d250a2F20Dee42eC436F99e075', 
    'https://node-testnet.teo.mn',
    '0x89995e30DAB8E3F9113e216EEB2f44f6B8eb5730',
    'test', 3305);

issuer.issuePdf('test',
    '/home/user/sample.pdf',
    '/home/user/sample_res.pdf',
    0, 
    'test', '',
    'private_key'
).then(console.log).catch(e => {
        console.error(e.message);
})
```

#### `RevokePDF`

Нэгэнт ухаалаг гэрээнд баталгаажсан PDF файлыг буцаан хүчингүй болгох функц

Байгуулагчийн параметр:

| Параметр               | Тайлбар                              | Заавал эсэх |
| ---------------------- | ------------------------------------ | ----------- |
| `smartContractAddress` | Ухаалаг гэрээний хаяг                | тийм        |
| `nodeHost`             | Гүйлгээ хийх блокчэйний нөүдний хаяг | тийм        |
| `issuerAddress`        | Баталгаажуулагчийн хаяг              | тийм        |
| `issuerName`           | Баталгаажуулагчийн нэр               | тийм        |
| `chainId`              | Баталгаажуулагчийн нэр               | үгүй        |
| `hashType`             | Хашийн төрөл                         | үгүй        |

`revokePdf` функцийн параметр:

| Параметр      | Тайлбар                           | Заавал эсэх                                      |
| ------------- | --------------------------------- | ------------------------------------------------ |
| `filePath`    | Мэтадата бичигдсэн PDF файлын зам | тийм                                             |
| `revokerName` | Хүчингүй болгож буй хүний нэр     | тийм                                             |
| `privateKey`  | Баталгаажуулагчийн хувийн түлхүүр | үгүй /key\_store, passphrase өгөөгүй бол заавал/ |
| `keyStore`    | Хувийн түлхүүрийн key\_store файл | үгүй /private\_key өгөөгүй бол заавал/           |
| `passphrase`  | Хувийн түлхүүрийн passphrase файл | үгүй /private\_key өгөөгүй бол заавал/           |

**Жишээ**

```js
import {PdfIssuer} from "verify4js-issuer";

const issuer = new PdfIssuer(
    '0xCc546a88Db1aF7d250a2F20Dee42eC436F99e075',
    'https://node-testnet.teo.mn',
    '0x89995e30DAB8E3F9113e216EEB2f44f6B8eb5730',
    'test', 3305);

issuer.revokePdf(
    '/home/user/sample_res.pdf',
    'test_user',
    'private key'
).then(console.log).catch(e => {
  console.error(e.message);
})

```


# Java

## Verify4j

Эх код: <https://github.com/teo-mn/verify4j>

Verify Issuer нь сертификат, диплом, дансны хуулга зэрэг бичиг баримтыг блокчэйн дээр баталгаажуулж өгөх <https://github.com/corex-mn/certify-sc> ухаалаг гэрээний java хэл дээрх сан юм.

* Тестнэт-тэй холбогдох нөүд: `https://node-testnet.teo.mn`
* Тестнэт дээрх ухаалаг гэрээний хаяг: `0xcc546a88db1af7d250a2f20dee42ec436f99e075`
* Тестнэт chainId: 3305
* Майннэт-тэй холбогдох нөүд: `https://node.teo.mn`
* Майннэт дээрх ухаалаг гэрээний хаяг: `0x5d305D8423c0f07bEaf15ba6a5264e0c88fC41B4`
* Майннэт chainId: 1104

### Суулгах заавар:

Доорх dependency -ийг pom.xml дотор оруулах.

```xml
<dependency>
    <groupId>io.corexchain</groupId>
    <artifactId>verify4j</artifactId>
    <version>1.6-SNAPSHOT</version>
</dependency>
```

Доорх repository -ийг /m2/settings.xml дотор оруулах.

```xml
<repository>
    <id>central-sona</id>
    <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
    <releases>
      <enabled>true</enabled>
    </releases>
</repository>
```

### Классууд

### `PdfIssuer`

PDF файлын хаш утгыг тооцож ухаалаг гэрээнд бичээд, гүйлгээний мэдээлэл болон нэмэлт мэдээллүүдийг файлын мэтадата дээр нэмж шинэ файлд хадгална.

Байгуулагчийн параметр:

| Параметр               | Тайлбар                              | Заавал эсэх |
| ---------------------- | ------------------------------------ | ----------- |
| `smartContractAddress` | ухаалаг гэрээний хаяг                | тийм        |
| `issuerAddress`        | илгээгч байгууллагын блокчэйний хаяг | тийм        |
| `issuerName`           | илгээгч байгууллагын нэр             | тийм        |
| `nodeHost`             | блокчэйн нөүдний URL                 | тийм        |
| `chainId`              | блокчэйн ID                          | үгүй        |

`issue` функцийн параметр:

| Параметр              | Тайлбар                                        | Заавал эсэх          |
| --------------------- | ---------------------------------------------- | -------------------- |
| `id`                  | файлын ID /хоосон байж болно ''/               | үгүй                 |
| `sourceFilePath`      | эх файлын зам                                  | тийм                 |
| `destinationFilePath` | бүртгэсний дараа мета дата бичээд хадгалах зам | тийм                 |
| `expireDate`          | дуусах огноо /null байж болно/                 | үгүй                 |
| `desc`                | тайлбар                                        | тийм                 |
| `additionalInfo`      | мэтадата дээр орох нэмэлт мэдээлэл             | хоосон байж болно '' |
| `privateKey`          | хувийн түлхүүр                                 | тийм                 |

Метадата дээр бичигдэх өгөгдлийн хэлбэр:

```
verifymn: {
    issuer: {
        name: "",
        address: ""
    },
    info: {
        name: "",
        desc: "",
        cerNum: "",
        additionalInfo: ""
    },
    version: "",
    blockchain: {
         network: "",
         smartContractAddress: ""
    }
}
```

**Жишээ**

```java
PdfIssuer pdfIssuer = new PdfIssuer(
                "smartContractAddress",
                "issuerAddress",
                "issuerName",
                "nodeHost",
                3305
      );

String transactionID;
try {
    transactionID = pdfIssuer.issue(
            "id",
            "sourceFilePath",
            "destinationFilePath",
            "expireDate",
            "desc",
            "additionalInfo",
            "privateKey"
    );
    System.out.printf("Success: %s", transactionID);

} catch (Exception e) {
    System.out.printf("Error: %s", e);
}
```

### `verifyPdf`

Блокчэйн дээр баталгаажсан PDF файлыг шалгах

Байгуулагчийн параметр:

| Параметр               | Тайлбар                              | Заавал эсэх          |
| ---------------------- | ------------------------------------ | -------------------- |
| `smartContractAddress` | ухаалаг гэрээний хаяг                | тийм                 |
| `issuerAddress`        | илгээгч байгууллагын блокчэйний хаяг | хоосон байж болно '' |
| `issuerName`           | илгээгч байгууллагын нэр             | хоосон байж болно '' |
| `nodeHost`             | блокчэйн нөүдний URL                 | тийм                 |
| `chainId`              | блокчэйн ID                          | үгүй                 |

`verifyPdf` функцийн параметр:

| Параметр   | Тайлбар                 | Заавал эсэх |
| ---------- | ----------------------- | ----------- |
| `filePath` | мета дататай файлын зам | тийм        |

**Жишээ**

```java
PdfIssuer pdfIssuer = new PdfIssuer(
                "smartContractAddress",
                "issuerAddress",
                "issuerName",
                "nodeHost",
                3305
      );

try {
    VerifyResult result = pdfIssuer.verifyPdf("filePath");

    System.out.printf("State: %s\n", result.getState());
    System.out.printf("Issuer: %s\n", result.getIssuer());
    System.out.printf("Meta-data: %s\n", result.getMetadata());
    System.out.printf("Cert: %s", result.getCert());

} catch (Exception e) {
    System.out.printf("Error: %s", e);
}
```

**Гаралтын формат**

```java
public class VerifyResult {

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public CertificationRegistration.Certification getCert() {
        return cert;
    }

    public void setCert(CertificationRegistration.Certification cert) {
        this.cert = cert;
    }

    public CertificationRegistration.Issuer getIssuer() {
        return issuer;
    }

    public void setIssuer(CertificationRegistration.Issuer issuer) {
        this.issuer = issuer;
    }

    public String getMetadata() {
        return metadata;
    }

    public void setMetadata(String metadata) {
        this.metadata = metadata;
    }

    private String state;
    private String metadata;
    private CertificationRegistration.Certification cert;
    private CertificationRegistration.Issuer issuer;

    public VerifyResult(CertificationRegistration.Certification cert, String state) {
        this.state = state;
        this.cert = cert;
        this.metadata = "";
    }

    public VerifyResult(CertificationRegistration.Certification cert,
                        CertificationRegistration.Issuer issuer, String state) {
        this.state = state;
        this.cert = cert;
        this.issuer = issuer;
        this.metadata = "";
    }
}

```

state нь "ISSUED", "REVOKED", "EXPIRED" төлвүүдийн аль нэгийг авна. "ISSUED" нь хүчинтэй, "EXPIRED" нь хугацаа нь дууссан, "REVOKED" нь хүчингүй болгсон байна. cert утга нь сертификатын блокчэйн дээр бүртгэгдсэн мэдээлэл. issuer нь оруулсан байгууллагын мэдээлэл.

### `JsonIssuer`

JSON файлын хаш утгыг тооцож ухаалаг гэрээнд бичээд, гүйлгээний мэдээлэл болон нэмэлт мэдээллүүдийг файлын мэтадата дээр нэмж шинэ файлд хадгална.

Байгуулагчийн параметр:

| Параметр               | Тайлбар                              | Заавал эсэх |
| ---------------------- | ------------------------------------ | ----------- |
| `smartContractAddress` | ухаалаг гэрээний хаяг                | тийм        |
| `issuerAddress`        | илгээгч байгууллагын блокчэйний хаяг | тийм        |
| `issuerName`           | илгээгч байгууллагын нэр             | тийм        |
| `nodeHost`             | блокчэйн нөүдний URL                 | тийм        |
| `chainId`              | блокчэйн ID                          | үгүй        |

`issue` функцийн параметр:

| Параметр              | Тайлбар                                        | Заавал эсэх |
| --------------------- | ---------------------------------------------- | ----------- |
| `id`                  | файлын ID /хоосон байж болно ''/ \\            | үгүй        |
| `sourceFilePath`      | эх файлын зам                                  | тийм        |
| `destinationFilePath` | бүртгэсний дараа мета дата бичээд хадгалах зам | тийм        |
| `expireDate`          | дуусах огноо /null байж болно/                 | үгүй        |
| `desc`                | тайлбар                                        | тийм        |
| `additionalInfo`      | мэтадата дээр орох нэмэлт мэдээлэл             | тийм        |
| `privateKey`          | хувийн түлхүүр                                 | тийм        |

Метадата дээр бичигдэх өгөгдлийн хэлбэр:

```
verifymn: {
    issuer: {
        name: "",
        address: ""
    },
    info: {
        name: "",
        desc: "",
        cerNum: "",
        additionalInfo: ""
    },
    version: "",
    blockchain: {
         network: "",
         smartContractAddress: ""
    }
}
```

**Жишээ**

```java
JsonIssuer issuer = new JsonIssuer(
        "smartContractAddress",
        "issuerAddress",
        "issuerName",
        "nodeHost",
        3305
    );

String transactionID;
try {
    transactionID =  issuer.issue(
            "id",
            "sourceFilePath",
            "destinationFilePath",
            "expireDate",
            "desc",
            "additionalInfo",
            "privateKey"
    );
    System.out.printf("Success: %s", transactionID);
} catch (Exception e) {
    System.out.printf("Error: %s", e);
}
```

### `verifyJson`

Блокчэйнд баталгаажуулсан JSON файлыг шалгах

Байгуулагчийн параметр:

| Параметр               | Тайлбар                              | Заавал эсэх          |
| ---------------------- | ------------------------------------ | -------------------- |
| `smartContractAddress` | ухаалаг гэрээний хаяг                | тийм                 |
| `issuerAddress`        | илгээгч байгууллагын блокчэйний хаяг | хоосон байж болно '' |
| `issuerName`           | илгээгч байгууллагын нэр             | хоосон байж болно '' |
| `nodeHost`             | блокчэйн нөүдний URL                 | тийм                 |
| `chainId`              | блокчэйн ID                          | хоосон байж болно '' |

`verifyJson` функцийн параметр:

| Параметр   | Тайлбар                 | Заавал эсэх |
| ---------- | ----------------------- | ----------- |
| `filePath` | мета дататай файлын зам | тийм        |

**Жишээ**

```java
JsonIssuer issuer = new JsonIssuer(
        "smartContractAdress",
        "issuerAddress",
        "issuerName",
        "nodeHost",
        3305
    );

try {
    VerifyResult result = issuer.verifyJson("filePath");
    System.out.printf("Result: %s", result.getState());

} catch (Exception e) {
    System.out.printf("Error: %s", e);
}
```


# Python

## Verify4py

Эх код: <https://github.com/teo-mn/verify4py>

Verify4py нь сертификат, диплом, дансны хуулга зэрэг бичиг баримтыг блокчэйн дээр баталгаажуулж өгөх <https://github.com/corex-mn/certify-sc> ухаалаг гэрээтэй харьцдаг python хэлний сан юм.

* Тестнэт -тэй холбогдох нөүд: `https://node-testnet.teo.mn`
* Тестнэт дээрх ухаалаг гэрээний хаяг: `0xcc546a88db1af7d250a2f20dee42ec436f99e075`
* Тестнэт chainId: 3305
* Майннэт -тэй холбогдох нөүд: `https://node.teo.mn`
* Майннэт дээрх ухаалаг гэрээний хаяг: `0x5d305D8423c0f07bEaf15ba6a5264e0c88fC41B4`
* Майннэт chainId: 1104

### Суулгах заавар

`pip install verify4py`

### Функцүүд

#### `Issue_pdf`

PDF файлын хаш утгыг тооцож ухаалаг гэрээнд бичээд, гүйлгээний мэдээлэл болон нэмэлт мэдээллүүдийг файлын мэтадата дээр нэмэн шинэ файлд хадгална.

Байгуулагчийн параметр:

| Параметр                   | Тайлбар                              | Заавал эсэх |
| -------------------------- | ------------------------------------ | ----------- |
| `certify_contract_address` | Ухаалаг гэрээний хаяг                | тийм        |
| `corexchain_node_url`      | Гүйлгээ хийх блокчэйний нөүдний хаяг | тийм        |
| `issuer_address`           | Баталгаажуулагчийн хаяг              | тийм        |
| `issuer_name`              | Баталгаажуулагчийн нэр               | тийм        |
| `chain_id`                 | Блокчэйний ID                        | үгүй        |
| `hash_type`                | Хашийн төрөл                         | үгүй        |

`Issue_pdf` функцийн параметр:

| Параметр                | Тайлбар                              | Заавал эсэх                                      |
| ----------------------- | ------------------------------------ | ------------------------------------------------ |
| `id`                    | Файлын ID                            | тийм                                             |
| `source_file_path`      | PDF эх файлын зам                    | тийм                                             |
| `destination_file_path` | Мэтадата бичсэн PDF-ийг хадгалах зам | тийм                                             |
| `expire_date`           | Дуусах хугацаа                       | үгүй                                             |
| `desc`                  | Тайлбар, нэмэлт мэдээлэл             | үгүй                                             |
| `additional_info`       | Мэтадата дээр орох нэмэлт мэдээлэл   | үгүй                                             |
| `private_key`           | Баталгаажуулагчийн хувийн түлхүүр    | үгүй /key\_store, passphrase өгөөгүй бол заавал/ |
| `key_store`             | Хувийн түлхүүрийн keystore файл      | үгүй /private\_key өгөөгүй бол заавал/           |
| `passphrase`            | Хувийн түлхүүрийн passphrase файл    | үгүй /private\_key өгөөгүй бол заавал/           |

**Жишээ**

```python
from verify4py.PdfIssuer import PdfIssuer

issuer = PdfIssuer(certify_contract_address,
                  corexchain_node_url,
                  issuer_address,
                  issuer_name,
                  chain_id=3305)

try:
   txid, error = issuer.issue_pdf(
            id,
            source_file_path,
            destination_file_path,
            expire_date,
            desc,
            additional_info,
            private_key,
            key_store,
            passphrase) 
    if error is not None:
        print("Error: {}", error)
    else
        print("Success: {}", txid)
except Exception as e:
    print("Error: {}", e)
```

#### `Verify_pdf`

Блочкэйн дээр хадгалагдсан PDF файлийг шалгах.

Байгуулагчийн параметр:

| Параметр                   | Тайлбар                              | Заавал эсэх |
| -------------------------- | ------------------------------------ | ----------- |
| `certify_contract_address` | Ухаалаг гэрээний хаяг                | тийм        |
| `corexchain_node_url`      | Гүйлгээ хийх блокчэйний нөүдний хаяг | тийм        |
| `issuer_address`           | Баталгаажуулагчийн хаяг              | үгүй        |
| `issuer_name`              | Баталгаажуулагчийн нэр               | үгүй        |
| `chain_id`                 | Баталгаажуулагчийн нэр               | үгүй        |
| `hash_type`                | Хашийн төрөл                         | үгүй        |

`verify_pdf` функцийн параметр:

| Параметр    | Тайлбар                  | Заавал эсэх |
| ----------- | ------------------------ | ----------- |
| `file_path` | Метадата -тай файлын зам | тийм        |

**Жишээ**

```python
from verify4py.PdfIssuer import PdfIssuer

issuer = PdfIssuer(certify_contract_address,
                  corexchain_node_url,
                  chain_id=3305)

try:
    result = issuer.verify_pdf(file_path) 
    print("Result: {}", result)
except Exception as e:
    print("Error: {}", e)
```

#### `Revoke`

Нэгэнт ухаалаг гэрээнд баталгаажсан PDF файлыг буцаан хүчингүй болгох функц

Байгуулагчийн параметр:

| Параметр                   | Тайлбар                              | Заавал эсэх |
| -------------------------- | ------------------------------------ | ----------- |
| `certify_contract_address` | Ухаалаг гэрээний хаяг                | тийм        |
| `corexchain_node_url`      | Гүйлгээ хийх блокчэйний нөүдний хаяг | тийм        |
| `issuer_address`           | Баталгаажуулагчийн хаяг              | тийм        |
| `issuer_name`              | Баталгаажуулагчийн нэр               | үгүй        |
| `chain_id`                 | Блокчэйний ID                        | үгүй        |
| `hash_type`                | Хашийн төрөл                         | үгүй        |

`revoke` функцийн параметр:

| Параметр       | Тайлбар                           | Заавал эсэх                                      |
| -------------- | --------------------------------- | ------------------------------------------------ |
| `file_path`    | Мэтадата бичигдсэн PDF файлын зам | тийм                                             |
| `revoker_name` | Хүчингүй болгож буй хүний нэр     | тийм                                             |
| `private_key`  | Баталгаажуулагчийн хувийн түлхүүр | үгүй /key\_store, passphrase өгөөгүй бол заавал/ |
| `key_store`    | Хувийн түлхүүрийн key\_store файл | үгүй /private\_key өгөөгүй бол заавал/           |
| `passphrase`   | Хувийн түлхүүрийн passphrase файл | үгүй /private\_key өгөөгүй бол заавал/           |

**Жишээ**

```python
from verify4py.PdfIssuer import PdfIssuer

issuer = PdfIssuer(certify_contract_address,
                  corexchain_node_url,
                  issuer_address,
                  issuer_name,
                  chain_id=3305)
try:
    txid, error = issuer.revoke_pdf(file_path,
                              revoker_name,
                              key_store,
                              passphrase)
    print("Txid: {}", txid)
except Exception as e:
    print("Error: {}", e)  
```


# Шалгах буюу баталгаажуулах

Баримт бичгийг блокчэйн дээр бичигдсэн эсэхийг шалгахдаа дараах 3 аргыг ашиглаж болно.

<table><thead><tr><th width="314">Сервис</th><th>Нөхцөл</th></tr></thead><tbody><tr><td><a href="/pages/VATNaKbAtW4nl7VVW4xr">Notly.mn веб</a></td><td>Та болон танай байгууллага баримт бичгийг шууд хараад өөрийн нүдээр шалгаж буй бол</td></tr><tr><td><a href="/pages/lAbUQyjPqclhByE0mNaB">REST Api</a> </td><td>Байгууллагын ERP системээс автоматаар шалгахыг хүсэж байгаа ба Node.js-ээс өөр фрэймворк ашиглаж буй бол.</td></tr><tr><td><a href="/pages/Ac0J3wigy6u4sjShVBAg">Бидний хөгжүүлсэн санг (library)</a></td><td>Автоматаар шалгахыг хүсэж байгаа эсвэл <a href="https://notly.mn">Notly.mn веб</a>-тэй ижил сайт өөрсдийн домайн дээр байршуулахыг хүсэж байгаа бол. </td></tr></tbody></table>

#### Шалгах үеийн процессийг доорх зурагт үзүүлэв

<figure><img src="/files/jlnvTXunX5aeIRRV5hoO" alt=""><figcaption><p>Шалгах үеийн процесс диаграм</p></figcaption></figure>


# Notly.mn Web

Цахим баримтыг үнэн зөв эсэхийг шалгах

Цахим баримтыг блокчэйн дээр баталгаажсан эсэхийг notly.mn вэб хуудас ашиглан шалгахдаа та notly.mn-ий нүүр хуудаст байх "Файл оруулах хэсэг"-т дарж цахим файлаа сонгох эсвэл үйлдлийн системийн файлын цэснээс чирж оруулж шалгаж болно.

<figure><img src="/files/8SaPCxovsbOp03JkqAVQ" alt=""><figcaption><p>notly.mn Нүүр хуудас</p></figcaption></figure>

#### Хэрэв таны файл **хүчинтэй** файл бол дараах байдалтай байна.

<figure><img src="/files/NlAuYHRaqqGTpoaF5xkc" alt=""><figcaption><p>Хүчинтэй цахим файлын жишээ</p></figcaption></figure>

Дээрх зургийн зүүн хэсэгт блокчэйнд бичсэн мэдээллийг харж болно. Товч тайлбарлавал

* **Баталгаажуулагчийн нэр** гэдэг нь уг цахим файлыг үүсгэсэн байгууллагын /хувь хүн/ нэр
* **Баталгаажуулагч ID** гэдэг нь тухайн байгууллагын блокчэйн дээрх хаяг
* **Гүйлгээний ID** гэдэг нь блокчэйн дээр бичих үед үүссэн гүйлгээний хаяг

#### **Хугацаа дууссан файлын жишээ**

<figure><img src="/files/eordXQIlazpV7fxY757Y" alt=""><figcaption><p>Хугацаа нь дууссан файлын жишээ</p></figcaption></figure>

#### Оруулсан байгууллага буцаан хүчингүй болгосон бол дараах байдлаар харагдана.

<figure><img src="/files/prEdP8NvE0hHqTfY2I2m" alt=""><figcaption><p>Хүчингүй болгосон файл</p></figcaption></figure>

#### Огт блокчэйнд бичигдээгүй эсвэл блокчэйнд бичсэн файлыг ямар нэг байдлаар өөрчилсөн файл дараах байдлаар харагдана.

<figure><img src="/files/cXnrxT2zlkjMhyoKUcaE" alt=""><figcaption><p>Блокчэйнд бичээгүй эсвэл утгыг нь өөрчилсөн файл</p></figcaption></figure>


# Өөрийн сервэр дээр service асаах

Прожект: <https://github.com/teo-mn/Verify4js-microservice>\
\
**Node JS прожект асаах:**

```sh
export NODE_URL=https://node.teo.mn && node index.js
```

**Docker-оор асаах:**

```sh
# image татах
docker pull corexchain/verify4js-microservice
# image ажиллуулах
docker run -it -p 3000:3000 -e NODE_URL=https://node.teo.mn {{CONTAINER_ID}}
```

**Ашиглахдаа:**

```powershell
curl --location --request POST 'localhost:3000/upload' --form 'file=@"/home/user/Documents/test.pdf"'
```

**Үр дүн**

Дараах хэлбэртэй байна.

```typescript
interface VerifyResultInterface { 
  state: 'REVOKED' | 'EXPIRED' | 'ISSUED' | 'APPROVE_PENDING' | 'INVALID',
  metadata: MetaDataInterface, 
  cert: {}, 
  issuer: {isActive?: boolean}, 
  isTestnet: boolean, 
  isUniversity?: boolean 
}
```

**state нь**

* ISSUED бол баталгаажсан файл.
* REVOKED бол хүчингүй болгосон файл
* EXPIRED бол хугацаа нь дууссан файл,
* APPROVE\_PENDING бол их сургуулийн диплом БЕГ баталгаажуулахыг хүлээж буй
* INVALID бол баталгаажаагүй файл.

**metadata нь**

файлд нэмэлтээр бичсэн утгууд.

**cert нь**

блокчэйн дээр бичигдсэн мэдээлэл.

**issuer нь**

баталгаажуулагчийн мэдээлэл.

**isTestnet нь**

тест сүлжээнд баталгаажуулсан бол true байна.

**isUniversity нь**

их сургуулийн диплом үед true байна.


# Library

Эх код <https://github.com/teo-mn/verify4js>

**Суулгахдаа**:

```sh
npm install verify4js
```

**Ашиглахдаа**:

```javascript
import * as Verify from "verify4js";

Verify.verify(pdfArrayBuffer, nodeUrl)
.then(res => { // console.log(res); })
.catch(err => { console.error(err.message); })
```

**Жишээ**

[React Example](https://github.com/Ochirsukh0819/React-Example-Verify4js) [Node Example](https://github.com/Adembe/Node-Example_Verify4js)

**Илүү дэлгэрэнгүйг** [README](https://github.com/teo-mn/verify4js#readme)-ээс уншаарай.


