%align_right_start%
#### تعریف اولیه
شما مسئول توسعه یک سیستم بانکی ساده **تحت وب** هستید که شامل چندین قابلیت (Functionality) است. هدف اصلی شما ایجاد و پیادهسازی این قابلیت هاست که در ادامه توضیح داده خواهند شد. همچنین یک پروژه اولیه به شما داده شد است که باید تغییرات خود را بر روی آن اعمال نمایید. پروژه اولیه را از [این لینک](/contest/assignments/73612/download_problem_initial_project/253327/) دانلود کنید.
#### مدل دامنه
در این سیستم، شما چندین مدل مختلف دارید که برای مدیریت و نمایش اطلاعات بانکی استفاده میشوند. مدلهای اصلی شامل موارد زیر هستند:
+ **حساب (Account):** نمایانگر یک حساب بانکی است که شامل اطلاعاتی مانند شماره حساب، موجودی، شماره شبا و ... است.
+ **تراکنش (Transaction):** این مدل نمایانگر تراکنشهای انجام شده برای هر حساب است. اطلاعاتی مانند مبلغ تراکنش، نوع تراکنش (واریز یا برداشت)، تاریخ و ... مرتبط با تراکنش را شامل میشود.
> اطلاعات مربوط به مدل ها را می توانید در بخش **توضیحات ساختار دیتابیس** مطالعه بفرمایید
----------
#### قابلیت های سیستم
این سیستم بانکی شامل چندین قابلیت اصلی است که به کاربران امکان میدهد تا به اطلاعات حساب خود دسترسی پیدا کرده و تراکنشهای مختلفی را انجام دهند. هر یک از این قابلیتها **از طریق APIهای** مخصوص خود باید انجام شوند.
> واحد پولی این سیستم **تومان** است
#### **قابلیت ۱: مشاهده اطلاعات حساب**
سیستم شما باید قادر باشد اطلاعات یک حساب بانکی را نمایش دهد. کاربر با ارائه **کد حساب**، انتظار دارد اطلاعات مربوط به حساب مورد نظر را دریافت کند.
##### **قالب درخواست**
```bash
GET https://localhost:7229/api/account/12345
// 12345 --> Account Number
```
##### **در صورت موفقیت، پاسخ API به صورت زیر خواهد بود**
```json
{
"number": "12345",
"sheba": "IR300560611828005221576101",
"firstName": "علی",
"lastName": "محمدی",
"balance": 4880000,
"creationDate": "2024-10-13"
}
```
#### **قابلیت ۲: انجام تراکنش واریز**
با استفاده از این قابلیت، امکان انتقال پول از یک حساب مبدا به یک حساب مقصد فراهم می شود. این انتقال باید دارای شرایط زیر باشد:
+ ورودیها شامل شماره شبای مقصد، مبلغ واریز و شماره حساب مبدا است
+ مبلغ واریز نباید بزرگتر از موجودی حساب و همچنین سقف روزانه انتقال به مبلغ 200 میلیون تومان باشد در غیر این صورت باید خطایی با متن **"عدم رعایت سقف انتقال"** دریافت شود.
+ مبلغ تراکنش نمی تواند منفی باشد.
+ قالب داده ای شماره شبا مقصد باید صحیح باشد.
+ حساب مبدا و مقصد نمی تواند برابر باشد، یعنی کاربر نمی تواند از یک حساب، به شبای همان حساب پول واریز کند و در صورت چنین ورودیی باید خطای با متن **"حساب مبدا و مقصد نمی تواند یکی باشد"** دریافت شود.
+ به ازای هر درخواست واریز، دو تراکنش با **کد یکسان (Code)** در دیتابیس ذخیره میشود، یک تراکنش با تایپ واریز (_Deposit_) برای حساب مقصد که مبلغ به آن واریز میشود و دیگری یک تراکنش با تایپ برداشت (_Withdrawal_) برای حساب مبدا که مبلغ از آن کسر میشود.
+ بعد از ثبت تراکنش، باید اطلاعات موجودی حساب های مبدا و مقصد نیز بروزرسانی شود
<details class="green">
<summary>
**فرمت استاندارد شماره شبا**
</summary>
شماره شبا در ایران شامل پیشوند **IR** و سپس 24 رقم است (مانند: IR300564661822065022536289).
</details>
##### **قالب درخواست**
```bash
POST https://localhost:7229/api/account/12345/deposit
{
"targetSheba": "IR300560611828005221576101",
"amount": 120000
}
// 12345 --> Account Number
```
##### **در صورت موفقیت، پاسخ API به صورت زیر خواهد بود**
```json
{
"status": "success",
"newBalance": 10360000,
"code": "42a74b17-36c4-497a-913e-e675cd13d5e1"
}
```
#### **قابلیت ۳: مشاهده لیست تراکنشها**
این قابلیت لیستی از تراکنشهای انجام شده هر حساب را بصورت مرتب شده نزولی بر اساس زمان تراکنش نمایش می دهد. اطلاعات شامل کد تراکنش، مبلغ تراکنش، تاریخ، موجودی بعد از تراکنش، شماره شبای بر روی تراکنش، و نوع تراکنش (واریز یا برداشت) میباشد.
##### **قالب درخواست**
```bash
GET https://localhost:7229/api/account/12345/transactions
// 12345 --> Account Number
```
##### **در صورت موفقیت، پاسخ API به صورت زیر خواهد بود**
```json
[
{
"code": "42a74b17-36c4-497a-913e-e675cd13d5e1",
"amount": 120000,
"date": "2024-10-13 12:53",
"relatedSheba": "IR300564661822065022536289",
"postBalance": 4880000,
"type": "Withdrawal"
}
]
```
### نکات
+ در توسعه API های سیستم اصول REST را رعایت بفرمایید
+ ورودی ها را ارزیابی کرده و در صورت نامعتبر بودن داده ها خطای مناسب را برگردانید.
+ وضعیت های مشخصی برای هر خطا وجود دارد که توقع می رود در پاسخ درخواست در نظر بگیرید.
+ بررسی داده های ورودی و مسائل بیزینسی *400 (Bad Request)*
+ عدم وجود منابع مربوط به داده های ارائه شده *404 (Not Found)*
<details class="purple">
<summary>
**توضیحات ساختار دیتابیس**
</summary>
جدول `Accounts`:
| عنوان | نوع | توضیحات |
| ------------ | ---------------- | ------------------------------------------- |
| Number | `TEXT` (string) | شماره حساب منحصر به فرد هر کاربر |
| Sheba | `TEXT` (string) | شماره شبا مرتبط با حساب که منحصر به فرد است |
| FirstName | `TEXT` (string) | نام صاحب حساب |
| LastName | `TEXT` (string) | نام خانوادگی صاحب حساب |
| Balance | `REAL` (decimal) | موجودی حساب |
| CreationDate | `TEXT` (DateTime) | تاریخ ایجاد حساب |
جدول `Transactions`:
| عنوان | نوع | توضیحات |
| ------------------ | ---------------- | ------------------------------- |
| Id | `INTEGER` (int) | شناسه منحصر به فرد هر تراکنش |
| Amount | `REAL` (decimal) | مبلغ تراکنش |
| Code | `TEXT` (string) | کد منحصر به فرد تراکنش های مرتبط |
| Date | `TEXT` (string) | تاریخ انجام تراکنش |
| PostBalance | `REAL` (decimal) | موجودی حساب بعد از انجام تراکنش |
| BaseAccountNumber | `TEXT` (string) | شماره حساب مبدا تراکنش |
| SubAccountNumber | `TEXT` (string) | شماره حساب مقصد تراکنش |
| Type | `TEXT` (TransactionType) | نوع تراکنش (واریز یا برداشت) |
</details>
<details class="yellow">
<summary>
**اطلاعات اولیه دیتابیس**
</summary>
به صورت پیشفرض کاربران زیر در دیتابیس تعریف کنید؛ تا برای تست عملکرد برنامه از آنها استفاده کنید.
**فرد اول:**
- **نام**: علی محمدی
- **شماره حساب**: 12345
- **شماره شبا**: IR300560611828005221576101
- **موجودی اولیه**: 5,000,000 ریال
**فرد دوم:**
- **نام**: محمد سلطانی
- **شماره حساب**: 32312
- **شماره شبا**: IR300564661822065022536289
- **موجودی اولیه**: 10,000,000 ریال
</details>
<details class="red">
<summary>
**آنچه باید آپلود کنید**
</summary>
پاسخ ارسالی شما باید یک فایل _zip_ به همان فرمت پروژه اولیه باشد.
در نظر بگیرید که فایل _zip_ شما باید این ساختار فایل را داشته باشد.
```
├── Banking
│ ├── Banking.csproj
│ ├── Controllers
│ │ └── AccountController.cs
│ ├── Data
│ │ ├── BankingDbContext.cs
│ │ ├── Entities
│ │ │ ├── Account.cs
│ │ │ └── Transaction.cs
│ │ ├── Enums
│ │ │ └── TransactionType.cs
│ │ └── Migrations
│ │ ├── YOUR-MIGRATION-CLASS-HERE
│ │ └── BankingDbContextModelSnapshot.cs
│ ├── Program.cs
│ ├── ViewModels
│ │ ├── AccountResponseVm.cs
│ │ ├── DepositRequestVm.cs
│ │ ├── DepositResponseVm.cs
│ │ └── TransactionResponseVm.cs
│ └── banking.db
└── dotnet-tests.sln
```
در نظر داشته باشید که حتما برای دیتابیس بعد از کانفیگ کردن مدل های خود یک Migration اضافه کنید.
- مایگریشن ها باید در آدرس : `/Data/Migrations` قرار گیرد.
</details>
%align_end%