*سلیب* که تلاشهای فراوانی برای رفتن به تیم فنی کوئرا کرده بود، در نهایت با مخالفت شدید *مصطفی* روبهرو شد.
او که از دار دنیا فقط دوستی با *مازیار* را داشت؛ به او متوسل شد تا به عضویت تیم مالی درآید ولی مازیار که در کار، آدم جدیای است؛ به او ۱۰ تسک و مهلت ۱ ساعته (مشخصه نمیخواد استخدامش کنه!) داد تا در صورتی که این تسکها را با موفقیت انجام داد، رزومه او را بررسی کند.
حال *سلیب* که هیچگونه استعدادی در این کار ندارد، دست به دامان شما شده است تا در این فرصت کم، با استفاده از ۱۰ کوئری، پاسخ تسکها را برای او بفرستید و او را در کسب شغل جدید همراهی کنید.
## پروژه اولیه
پروژه اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/129724/) دانلود کنید. ساختار این پروژه به شرح زیر است:
```
Quera_Finance
├── Finance
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── fixtures
│ │ ├── auth_sample.json
│ │ └── data_sample.json
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── <mark class="yellow" title="شما تنها مجاز به تغییر این فایل هستید."> > queries.py < </mark>
│ ├── tests.py
│ └── views.py
├── Quera
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── requirements.txt
└── tests
├── __init__.py
└── testsample.py
```
## جزئیات
در فایل `models.py` هشت مدل به شرح زیر وجود دارد.
<details class="blue">
<summary> **مدل** `Department` (**بخشهای مختلف شرکت**) </summary>
+ `name`: نام بخش
+ `phone`: شماره تلفن بخش
</details>
<details class="blue">
<summary> **مدل** `Employee` (**کارمند**) </summary>
+ `account`: اکانت کارمند که اطلاعات کاربری او را نگه میدارد.
+ `department`: بخشی که کارمند در آن کار میکند.
+ `phone`: شماره تلفن کارمند
</details>
<details class="blue">
<summary> **مدل** `Project` (**پروژه**) </summary>
+ `title`: عنوان پروژه
+ `department`: بخش مربوطه پروژه
+ `employees`: کارمندان حاضر در پروژه
+ `estimated_end_time`: زمان تخمینزده شده اتمام پروژه
+ `end_time`: زمان اتمام پروژه
</details>
<details class="blue">
<summary> **مدل** `EmployeeProjectRelation` (**ذخیره اطلاعات اضافی برای حضور کارمندان در پروژههای مختلف**) </summary>
+ `employee`: کارمند مربوطه
+ `project`: پروژه مربوطه
+ `hours`: ساعتهای کاری در پروژه
+ `role`: نقش کارمند در پروژه
</details>
<details class="blue">
<summary> **مدل** `Attendance` (**حضور و غیاب**) </summary>
+ `employee`: کارمند مربوطه
+ `date`: تاریخ
+ `in_time`: زمان ورود به شرکت
+ `out_time`: زمان خروج از شرکت
+ `late_cause`: دلیل تأخیر (در صورت تاخیر)
</details>
<details class="blue">
<summary> **مدل** `Salary` (**حقوق**) </summary>
+ `employee`: کارمند مربوطه
+ `base`: حقوق پایه
+ `tax`: مالیات (درصد)
+ `insurance`: بیمه (درصد)
+ `overtime`: اضافه کار (ساعت)
</details>
<details class="blue">
<summary> **مدل** `Payment` (**پرداخت**) </summary>
+ `amount`: مقدار پرداختشده
+ `account_number`: شماره حساب مقصد
+ `payment_type`: نوع پرداخت
+ `description`: توضیحات پرداخت
+ `date`: تاریخ پرداخت
</details>
<details class="blue">
<summary> **مدل** `Payslip` (**فیش حقوقی**) </summary>
+ `base`: پایه حقوق
+ `tax`: مالیات (تومان)
+ `insurance`: بیمه (تومان)
+ `overtime`: اضافه کار (تومان)
+ `salary`: حقوق مربوطه
+ `payment`: پرداخت مربوطه
</details>
حال از شما میخواهیم پرس و جو (*query*) های زیر را روی مدلهای بالا بنویسید.
**حتما قبل شروع نوشتن کد، تذکرات انتهای سوال را بخوانید!**
<details class="green">
<summary> **۱. مجموع بدهیهای شرکت برای حقوق کارمندان** </summary>
+ حقوقهای بدون پرداخت (base + tax + insurance + overtime) را در قالب یک `dict` به صورت زیر برگردانید.
```
{"total_dept": value }
```
</details>
<details class="green">
<summary> **۲. مجموع حقوقِ اضافه کار کارمندانی که بیشتر مساوی** `hours=x` ** ساعت روی پروژههایشان اضافه کار کردهاند.** </summary>
+ مجموع حقوق پرداختی اضافه کار (به تومان) به افرادی از شرکت که بیشتر مساوی `x` ساعت اضافه کاری داشتهاند را در قالب یک `dict` به صورت زیر برگردانید.
```
{"total_overtime": value }
```
</details>
<details class="green">
<summary> **۳. مجموع پرداختهای شرکت** </summary>
+ مجموع پرداختهای شرکت را در قالب یک `dict` به صورت زیر برگردانید.
```
{"total": value }
```
</details>
<details class="green">
<summary> **۴. مجموع ساعاتی که یک کارمند با** `id=x` **روی پروژههایش کار کردهاست.** </summary>
+ مجموع ساعاتی که یک کارمند با `id=x` روی پروژههایش کار کردهاست را در قالب یک `dict` به صورت زیر برگردانید.
+ در صورتی که کارمند در پروژهای شرکت نداشت، مقدار `total_hours` برابر `None` باشد.
```
{"total_hours": value }
```
</details>
<details class="green">
<summary> **۵. لیست کارمندانی که مجموع حقوق دریافتی آنها (پرداختشده) بیش از یک مقدار** `x` **باشد.** </summary>
+ ترتیب این لیست اهمیت ندارد.
</details>
<details class="green">
<summary> **۶. کارمندی که بیشترین ساعت پروژه انجام شده را دارد.** </summary>
+ شئ کارمند را به همراه یک ستون اضافه به نام `total_hours` برگردانید.
+ اگر چند کارمند با مجموع ساعات برابر موجود بود، کارمندی را که نام کاربری آن از لحاظ الفبایی کوچکتر است برگردانید.
</details>
<details class="green">
<summary> **۷. بخشی که بیشترین حقوق پرداختشده تا کنون را دارد.** </summary>
+ شئ بخش را همراه با یک ستون اضافه به نام `total` برگردانید.
+ اگر چند بخش با مجموع حقوقهای پرداختشده برابر موجود بود، بخشی را که نام آن از لحاظ الفبایی کوچکتر است برگردانید.
</details>
<details class="green">
<summary> **۸. بخشی که بیشترین تعداد پروژه را زودتر یا برابر موعد پیشبینی شده تحویل داده است.** </summary>
+ اگر چند بخش موجود بود، بخشی را که نام آن از لحاظ الفبایی کوچکتر است برگردانید.
</details>
<details class="green">
<summary> **۹. کارمندی که کمترین تعداد روزهای ورود با تاخیر را داشته باشد.** </summary>
+ زمان ورود مجاز به عنوان آرگومان `x` داده می شود.
+ اگر چند کارمند موجود بود، کارمندی را که نام کاربری آن از لحاظ الفبایی کوچکتر است برگردانید.
</details>
<details class="green">
<summary> **۱۰. تعداد کارمندانی که تا به حال در هیچ پروژهای شرکت نکردهاند.** </summary>
+ تعداد کارمندانی که تا به حال در هیچ پروژهای شرکت نکردهاند را در قالب یک `dict` به صورت زیر برگردانید.
```
{"total": value }
```
</details>
## زیرمسئلهها
| امتیاز | بخش |
|:------------------:|:------------------:|
| ۲۰ | query_1 |
| ۲۰ | query_2 |
| ۳۵ | query_3 |
| ۳۵ | query_4 |
| ۳۵ | query_5 |
| ۴۵ | query_6 |
| ۴۵ | query_7 |
| ۴۵ | query_8 |
| ۶۰ | query_9 |
| ۶۰ | query_10 |
## امکانات اضافه
در صورتی که علاقمندید که خودتان به صورت دستی کوئریهای خود را امتحان کنید و از درستی آنها اطمینان حاصل کنید، یا اینکه به بررسی بیشتر از این تمرین بپردازید، برای راحتی بیشتر شما، فایلهای مایگریشنها ساخته شدهاند و شما کافیست جهت ایجاد پایگاهداده، یک بار دستور `migrate` را اجرا کنید.
علاوهبر این، یک سری دادهی از پیش آماده شده، فراهم شده که بعد از اجرای دستور `migrate`، میتوانید آنها را وارد پایگاهدادهی پروژهی خود کنید. به این منظور، دستور زیر را اجرا کنید. میتوانید از این دادهها به جهت تست کردن کوئریهای خود استفاده کنید.
**۱. ایجاد پایگاهداده**
```shell terminal terminal
python manage.py migrate
```
**۲. وارد کردن دادههای از پیش آماده شده (fixture)**
```shell terminal terminal
python manage.py loaddata Finance/fixtures/auth_sample.json
python manage.py loaddata Finance/fixtures/data_sample.json
```
در صورتی که علاقمند به تست نیستید، نیازی به ایجاد پایگاهداده و وارد کردن دادههای آزمایشی نیست، و تنها کافیست که در فایل `queries.py` کوئریهای خود را بنویسید و از کوئرا جهت امتحان کردن درستی کوئریهایتان استفاده کنید.
## تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
```shell terminal terminal
python manage.py test
```
## **نکات**
+ یک فایل به نام `queries.py` وجود دارد که برای هر سوال یک تابع در نظر گرفته شده است. شما کدهای خود را باید در این فایل بنویسید و *QuerySet* مربوطه را بازگردانید.
+ برای نمونه تابع `query_0` در پاسخ به پرس و جویِ «لیست همه ی کارمندان» کامل شده است که شما نیز باید مشابه همین تابع، بقیه توابع را تکمیل کنید.
```python queries.py django
def query_0():
q = Employee.objects.all()
return q
```
+ در سوالاتی که در صورت سوال، مقداری به صورت متغیر ذکر شده است؛ متغیر مورد نظر در آرگومانهای ورودی تابع در نظر گرفته شده است. شما نباید آرگومانهای ورودی تابع را تغییر دهید.
+ در تمام سوالات به جز سوالاتی که خروجی نمونه برای آنها مشخص شده است، همانطور که ذکر شد، خروجی شما یک شئ از نوع QuerySet با اِلِمانهایی از جنس گفتهشده در اول سوال باید باشد. یعنی در واقع خود query را return کنید.
+ شما تنها مجوز ایجاد تغییرات در فایل `Finance/queries.py` را دارید و **تمامی تغییرات دیگر شما** در فایلهای پروژه **نادیده گرفته خواهند شد.**
+ فراموش نکنید که میتوانید با مطالعهی `testsample.py` با روش تست کردن کوئریها آشنا شوید.
## نحوه ارسال
یک فایل _ZIP_ حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل _ZIP_ اهمیتی ندارد.