سلیب که تلاش‌های فراوانی برای رفتن به تیم فنی کوئرا کرده بود، در نهایت با مخالفت شدید مصطفی روبه‌رو شد.

او که از دار دنیا فقط دوستی با مازیار را داشت؛ به او متوسل شد تا به عضویت تیم مالی درآید ولی مازیار که در کار، آدم جدی‌ای است؛ به او ۱۰ تسک و مهلت ۱ ساعته (مشخصه نمی‌خواد استخدامش کنه!) داد تا در صورتی که این تسک‌ها را با موفقیت انجام داد، رزومه او را بررسی کند.

حال سلیب که هیچ‌گونه استعدادی در این کار ندارد،‌ دست به دامان شما شده است تا در این فرصت کم، با استفاده از ۱۰ کوئری، پاسخ‌ تسک‌ها را برای او بفرستید و او را در کسب شغل جدید همراهی کنید.

پروژه اولیه

پروژه اولیه را از این لینک دانلود کنید. ساختار این پروژه به شرح زیر است:

Quera_Finance
├── Finance
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── fixtures
│   │   ├── auth_sample.json
│   │   └── data_sample.json
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── models.py
│   ├──  > queries.py < 
│   ├── tests.py
│   └── views.py
├── Quera
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── requirements.txt
└── tests
    ├── __init__.py
    └── testsample.py
Plain text

جزئیات

در فایل models.py هشت مدل به شرح زیر وجود دارد.

مدل Department (بخش‌های مختلف شرکت)

  • name: نام بخش
  • phone: شماره تلفن بخش

مدل Employee (کارمند)

  • account: اکانت کارمند که اطلاعات کاربری او را نگه می‌دارد.
  • department: بخشی که کارمند در آن کار می‌کند.
  • phone: شماره تلفن کارمند

مدل Project (پروژه)

  • title: عنوان پروژه
  • department: بخش مربوطه پروژه
  • employees: کارمندان حاضر در پروژه
  • estimated_end_time: زمان تخمین‌زده شده اتمام پروژه
  • end_time: زمان اتمام پروژه

مدل EmployeeProjectRelation (ذخیره اطلاعات اضافی برای حضور کارمندان در پروژه‌های مختلف)

  • employee: کارمند مربوطه
  • project: پروژه مربوطه
  • hours: ساعت‌های کاری در پروژه
  • role: نقش کارمند در پروژه

مدل Attendance (حضور و غیاب)

  • employee: کارمند مربوطه
  • date: تاریخ
  • in_time: زمان ورود به شرکت
  • out_time: زمان خروج از شرکت
  • late_cause: دلیل تأخیر (در صورت تاخیر)

مدل Salary (حقوق)

  • employee: کارمند مربوطه
  • base: حقوق پایه
  • tax: مالیات (درصد)
  • insurance: بیمه (درصد)
  • overtime: اضافه کار (ساعت)

مدل Payment (پرداخت)

  • amount: مقدار پرداخت‌شده
  • account_number: شماره حساب مقصد
  • payment_type: نوع پرداخت
  • description: توضیحات پرداخت
  • date: تاریخ پرداخت

مدل Payslip (فیش حقوقی)

  • base: پایه حقوق
  • tax: مالیات (تومان)
  • insurance: بیمه (تومان)
  • overtime: اضافه کار (تومان)
  • salary: حقوق مربوطه
  • payment: پرداخت مربوطه

حال از شما می‌خواهیم پرس‌‌ و‌ جو (query) های زیر را روی مدل‌های بالا بنویسید.

حتما قبل شروع نوشتن کد، تذکرات انتهای سوال را بخوانید!

۱. مجموع بدهی‌های شرکت برای حقوق کارمندان

  • حقوق‌های بدون پرداخت (base + tax + insurance + overtime) را در قالب یک dict به صورت زیر برگردانید.
{"total_dept": value }
Plain text

۲. مجموع حقوقِ اضافه کار کارمندانی که بیش‌تر مساوی hours=x ** ساعت روی پروژه‌هایشان اضافه کار کرده‌اند.**

  • مجموع حقوق پرداختی اضافه کار (به تومان) به افرادی از شرکت که بیش‌تر مساوی x ساعت اضافه کاری داشته‌اند را در قالب یک dict به صورت زیر برگردانید.
{"total_overtime": value }
Plain text

۳. مجموع پرداخت‌های شرکت

  • مجموع پرداخت‌های شرکت را در قالب یک dict به صورت زیر برگردانید.
{"total": value }
Plain text

۴. مجموع ساعاتی که یک کارمند با id=x روی پروژه‌هایش کار کرده‌است.

  • مجموع ساعاتی که یک کارمند با id=x روی پروژه‌هایش کار کرده‌است را در قالب یک dict به صورت زیر برگردانید.
  • در صورتی که کارمند در پروژه‌ای شرکت نداشت، مقدار total_hours برابر None باشد.
{"total_hours": value }
Plain text

۵. لیست کارمندانی که مجموع حقوق دریافتی آن‌ها (پرداخت‌شده) بیش از یک مقدار x باشد.

  • ترتیب این لیست اهمیت ندارد.

۶. کارمندی که بیشترین ساعت پروژه انجام شده را دارد.

  • شئ کارمند را به همراه یک ستون اضافه به نام total_hours برگردانید.
  • اگر چند کارمند با مجموع ساعات برابر موجود بود، کارمندی را که نام کاربری آن از لحاظ الفبایی کوچکتر است برگردانید.

۷. بخشی که بیشترین حقوق پرداخت‌شده تا کنون را دارد.

  • شئ بخش را همراه با یک ستون اضافه به نام total برگردانید.
  • اگر چند بخش با مجموع حقوق‌های پرداخت‌شده برابر موجود بود، بخشی را که نام آن از لحاظ الفبایی کوچکتر است برگردانید.

۸. بخشی که بیشترین تعداد پروژه را زودتر یا برابر موعد پیش‌بینی‌ شده تحویل داده است.

  • اگر چند بخش موجود بود، بخشی را که نام آن از لحاظ الفبایی کوچکتر است برگردانید.

۹. کارمندی که کمترین تعداد روزهای ورود با تاخیر را داشته باشد.

  • زمان ورود مجاز به عنوان آرگومان x داده می شود.
  • اگر چند کارمند موجود بود، کارمندی را که نام کاربری آن از لحاظ الفبایی کوچکتر است برگردانید.

۱۰. تعداد کارمندانی که تا به حال در هیچ پروژه‌ای شرکت نکرده‌اند.

  • تعداد کارمندانی که تا به‌ حال در هیچ پروژه‌ای شرکت نکرده‌اند را در قالب یک dict به صورت زیر برگردانید.
{"total": value }
Plain text

زیرمسئله‌ها

امتیاز بخش
۲۰ query_1
۲۰ query_2
۳۵ query_3
۳۵ query_4
۳۵ query_5
۴۵ query_6
۴۵ query_7
۴۵ query_8
۶۰ query_9
۶۰ query_10

امکانات اضافه

در صورتی که علاقمندید که خودتان به صورت دستی کوئری‌های خود را امتحان کنید و از درستی آن‌ها اطمینان حاصل کنید، یا اینکه به بررسی بیشتر از این تمرین بپردازید، برای راحتی بیشتر شما، فایل‌های مایگریشن‌ها ساخته شده‌اند و شما کافیست جهت ایجاد پایگاه‌داده، یک بار دستور migrate را اجرا کنید.

علاوه‌بر این، یک سری داده‌ی از پیش آماده شده، فراهم شده که بعد از اجرای دستور migrate، می‌توانید آن‌ها را وارد پایگاه‌داده‌ی پروژه‌ی خود کنید. به این منظور، دستور زیر را اجرا کنید. می‌توانید از این داده‌ها به جهت تست کردن کوئری‌های خود استفاده کنید.

۱. ایجاد پایگاه‌داده

python manage.py migrate
Shell
terminal

۲. وارد کردن داده‌های از پیش آماده شده (fixture)

python manage.py loaddata Finance/fixtures/auth_sample.json
python manage.py loaddata Finance/fixtures/data_sample.json
Shell
terminal

در صورتی که علاقمند به تست نیستید، نیازی به ایجاد پایگاه‌داده و وارد کردن داده‌های آزمایشی نیست، و تنها کافیست که در فایل queries.py کوئری‌های خود را بنویسید و از کوئرا جهت امتحان کردن درستی کوئری‌هایتان استفاده کنید.

تست نمونه

در فایل‌های اولیه‌ای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. می‌توانید قبل از فرستادن سوال در سایت، این تست‌ها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.

تست‌ها را می‌توانید با دستور زیر اجرا کنید:

python manage.py test
Shell
terminal

نکات

  • یک فایل به نام queries.py وجود دارد که برای هر سوال یک تابع در نظر گرفته شده است. شما کد‌های خود را باید در این فایل بنویسید و QuerySet مربوطه را بازگردانید.
  • برای نمونه تابع query_0 در پاسخ به پرس و جویِ «لیست همه ی کارمندان» کامل شده است که شما نیز باید مشابه همین تابع، بقیه توابع را تکمیل کنید.
def query_0():
    q = Employee.objects.all()
    return q
Python
queries.py
  • در سوالاتی که در صورت سوال، مقداری به صورت متغیر ذکر شده است؛ متغیر مورد نظر در آرگومان‌های ورودی تابع در نظر گرفته شده است. شما نباید آرگومان‌های ورودی تابع را تغییر دهید.

  • در تمام سوالات به جز سوالاتی که خروجی نمونه برای آنها مشخص شده است، همان‌طور که ذکر شد، خروجی شما یک شئ از نوع QuerySet با اِلِمان‌هایی از جنس گفته‌شده در اول سوال باید باشد. یعنی در واقع خود query را return کنید.

  • شما تنها مجوز ایجاد تغییرات در فایل‌ Finance/queries.py را دارید و تمامی تغییرات دیگر شما در فایل‌های پروژه نادیده گرفته خواهند شد.

  • فراموش نکنید که می‌توانید با مطالعه‌ی testsample.py با روش تست کردن کوئری‌ها آشنا شوید.

نحوه ارسال

یک فایل ZIP حاوی همه‌ی فایل‌های پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.


ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.