سلیب که تلاشهای فراوانی برای رفتن به تیم فنی کوئرا کرده بود، در نهایت با مخالفت شدید مصطفی روبهرو شد.
او که از دار دنیا فقط دوستی با مازیار را داشت؛ به او متوسل شد تا به عضویت تیم مالی درآید ولی مازیار که در کار، آدم جدیای است؛ به او ۱۰ تسک و مهلت ۱ ساعته (مشخصه نمیخواد استخدامش کنه!) داد تا در صورتی که این تسکها را با موفقیت انجام داد، رزومه او را بررسی کند.
حال سلیب که هیچگونه استعدادی در این کار ندارد، دست به دامان شما شده است تا در این فرصت کم، با استفاده از ۱۰ کوئری، پاسخ تسکها را برای او بفرستید و او را در کسب شغل جدید همراهی کنید.
پروژه اولیه
پروژه اولیه را از این لینک دانلود کنید. ساختار این پروژه به شرح زیر است:
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
جزئیات
در فایل models.py
هشت مدل به شرح زیر وجود دارد.
مدل Department
(بخشهای مختلف شرکت)
Department
(بخشهای مختلف شرکت)name
: نام بخشphone
: شماره تلفن بخش
مدل Employee
(کارمند)
Employee
(کارمند)account
: اکانت کارمند که اطلاعات کاربری او را نگه میدارد.department
: بخشی که کارمند در آن کار میکند.phone
: شماره تلفن کارمند
مدل Project
(پروژه)
Project
(پروژه)title
: عنوان پروژهdepartment
: بخش مربوطه پروژهemployees
: کارمندان حاضر در پروژهestimated_end_time
: زمان تخمینزده شده اتمام پروژهend_time
: زمان اتمام پروژه
مدل EmployeeProjectRelation
(ذخیره اطلاعات اضافی برای حضور کارمندان در پروژههای مختلف)
EmployeeProjectRelation
(ذخیره اطلاعات اضافی برای حضور کارمندان در پروژههای مختلف)employee
: کارمند مربوطهproject
: پروژه مربوطهhours
: ساعتهای کاری در پروژهrole
: نقش کارمند در پروژه
مدل Attendance
(حضور و غیاب)
Attendance
(حضور و غیاب)employee
: کارمند مربوطهdate
: تاریخin_time
: زمان ورود به شرکتout_time
: زمان خروج از شرکتlate_cause
: دلیل تأخیر (در صورت تاخیر)
مدل Salary
(حقوق)
Salary
(حقوق)employee
: کارمند مربوطهbase
: حقوق پایهtax
: مالیات (درصد)insurance
: بیمه (درصد)overtime
: اضافه کار (ساعت)
مدل Payment
(پرداخت)
Payment
(پرداخت)amount
: مقدار پرداختشدهaccount_number
: شماره حساب مقصدpayment_type
: نوع پرداختdescription
: توضیحات پرداختdate
: تاریخ پرداخت
مدل Payslip
(فیش حقوقی)
Payslip
(فیش حقوقی)base
: پایه حقوقtax
: مالیات (تومان)insurance
: بیمه (تومان)overtime
: اضافه کار (تومان)salary
: حقوق مربوطهpayment
: پرداخت مربوطه
حال از شما میخواهیم پرس و جو (query) های زیر را روی مدلهای بالا بنویسید.
حتما قبل شروع نوشتن کد، تذکرات انتهای سوال را بخوانید!
۱. مجموع بدهیهای شرکت برای حقوق کارمندان
- حقوقهای بدون پرداخت (base + tax + insurance + overtime) را در قالب یک
dict
به صورت زیر برگردانید.
{"total_dept": value }
۲. مجموع حقوقِ اضافه کار کارمندانی که بیشتر مساوی hours=x
** ساعت روی پروژههایشان اضافه کار کردهاند.**
hours=x
** ساعت روی پروژههایشان اضافه کار کردهاند.**- مجموع حقوق پرداختی اضافه کار (به تومان) به افرادی از شرکت که بیشتر مساوی
x
ساعت اضافه کاری داشتهاند را در قالب یکdict
به صورت زیر برگردانید.
{"total_overtime": value }
۳. مجموع پرداختهای شرکت
- مجموع پرداختهای شرکت را در قالب یک
dict
به صورت زیر برگردانید.
{"total": value }
۴. مجموع ساعاتی که یک کارمند با id=x
روی پروژههایش کار کردهاست.
id=x
روی پروژههایش کار کردهاست.- مجموع ساعاتی که یک کارمند با
id=x
روی پروژههایش کار کردهاست را در قالب یکdict
به صورت زیر برگردانید. - در صورتی که کارمند در پروژهای شرکت نداشت، مقدار
total_hours
برابرNone
باشد.
{"total_hours": value }
۵. لیست کارمندانی که مجموع حقوق دریافتی آنها (پرداختشده) بیش از یک مقدار x
باشد.
x
باشد.- ترتیب این لیست اهمیت ندارد.
۶. کارمندی که بیشترین ساعت پروژه انجام شده را دارد.
- شئ کارمند را به همراه یک ستون اضافه به نام
total_hours
برگردانید. - اگر چند کارمند با مجموع ساعات برابر موجود بود، کارمندی را که نام کاربری آن از لحاظ الفبایی کوچکتر است برگردانید.
۷. بخشی که بیشترین حقوق پرداختشده تا کنون را دارد.
- شئ بخش را همراه با یک ستون اضافه به نام
total
برگردانید. - اگر چند بخش با مجموع حقوقهای پرداختشده برابر موجود بود، بخشی را که نام آن از لحاظ الفبایی کوچکتر است برگردانید.
۸. بخشی که بیشترین تعداد پروژه را زودتر یا برابر موعد پیشبینی شده تحویل داده است.
- اگر چند بخش موجود بود، بخشی را که نام آن از لحاظ الفبایی کوچکتر است برگردانید.
۹. کارمندی که کمترین تعداد روزهای ورود با تاخیر را داشته باشد.
- زمان ورود مجاز به عنوان آرگومان
x
داده می شود. - اگر چند کارمند موجود بود، کارمندی را که نام کاربری آن از لحاظ الفبایی کوچکتر است برگردانید.
۱۰. تعداد کارمندانی که تا به حال در هیچ پروژهای شرکت نکردهاند.
- تعداد کارمندانی که تا به حال در هیچ پروژهای شرکت نکردهاند را در قالب یک
dict
به صورت زیر برگردانید.
{"total": value }
زیرمسئلهها
امتیاز | بخش |
---|---|
۲۰ | 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
۲. وارد کردن دادههای از پیش آماده شده (fixture)
python manage.py loaddata Finance/fixtures/auth_sample.json
python manage.py loaddata Finance/fixtures/data_sample.json
در صورتی که علاقمند به تست نیستید، نیازی به ایجاد پایگاهداده و وارد کردن دادههای آزمایشی نیست، و تنها کافیست که در فایل queries.py
کوئریهای خود را بنویسید و از کوئرا جهت امتحان کردن درستی کوئریهایتان استفاده کنید.
تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
python manage.py test
نکات
- یک فایل به نام
queries.py
وجود دارد که برای هر سوال یک تابع در نظر گرفته شده است. شما کدهای خود را باید در این فایل بنویسید و QuerySet مربوطه را بازگردانید. - برای نمونه تابع
query_0
در پاسخ به پرس و جویِ «لیست همه ی کارمندان» کامل شده است که شما نیز باید مشابه همین تابع، بقیه توابع را تکمیل کنید.
def query_0():
q = Employee.objects.all()
return q
-
در سوالاتی که در صورت سوال، مقداری به صورت متغیر ذکر شده است؛ متغیر مورد نظر در آرگومانهای ورودی تابع در نظر گرفته شده است. شما نباید آرگومانهای ورودی تابع را تغییر دهید.
-
در تمام سوالات به جز سوالاتی که خروجی نمونه برای آنها مشخص شده است، همانطور که ذکر شد، خروجی شما یک شئ از نوع QuerySet با اِلِمانهایی از جنس گفتهشده در اول سوال باید باشد. یعنی در واقع خود query را return کنید.
-
شما تنها مجوز ایجاد تغییرات در فایل
Finance/queries.py
را دارید و تمامی تغییرات دیگر شما در فایلهای پروژه نادیده گرفته خواهند شد. -
فراموش نکنید که میتوانید با مطالعهی
testsample.py
با روش تست کردن کوئریها آشنا شوید.
نحوه ارسال
یک فایل ZIP حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.
ارسال پاسخ برای این سؤال