def api_employees_salaries_list(request, emp_no):
    try:
        emp = Employee.objects.get(pk=emp_no)

        if request.method == 'POST':
            form = SalaryForm(request.POST)
            if form.is_valid():
                data = form.cleaned_data
                try:
                    salary = Salary.objects.create(
                        employee=emp,
                        salary=data.get('salary'),
                        from_date=data.get('from_date'),
                        to_date=data.get('to_date'),
                    )
                    return JsonResponse(serialize_model(salary), status=200)
                except IntegrityError:
                    return JsonResponse(errors.IntegrityError, status=400)
            else:
                return JsonResponse(errors.ValidateError, status=400)
        elif request.method == 'GET':
            form = SalaryListPramsForm(request.GET)
            if form.is_valid():
                data = form.cleaned_data
                qs = Salary.objects.filter(employee=emp)\

                _sort = data.get('_sort')
                _order = data.get('_order')

                if _sort and _order:
                    if _order == 'asc':
                        qs = qs.order_by(f'{_sort}')
                    else:
                        qs = qs.order_by(f'-{_sort}')

                return JsonResponse(serialize_queryset(qs.all()),
                                    status=200,
                                    safe=False)
            else:
                return JsonResponse(errors.ValidateError, status=400)

    except Employee.DoesNotExist:
        return JsonResponse(errors.NotFoundError, status=404)
def api_department_list(request):
    if request.method == 'GET':
        _page = request.GET.get('_page', 0)
        _limit = request.GET.get('_limit', 10)
        _sort = request.GET.get('_sort')
        _order = request.GET.get('_order')
        dept_no__contains = request.GET.get('dept_no__contains')
        dept_name__contains = request.GET.get('dept_name__contains')
        form = DepartmentListParamsForm(
            dict(_page=_page,
                 _limit=_limit,
                 _order=_order,
                 _sort=_sort,
                 dept_no__contains=dept_no__contains,
                 dept_name__contains=dept_name__contains))
        if form.is_valid():
            params = form.cleaned_data
            _page = params.get('_page')
            _limit = params.get('_limit')
            _sort = params.get('_sort')
            _order = params.get('_order')
            dept_no__contains = params.get('dept_no__contains')
            dept_name__contains = params.get('dept_name__contains')
            offset = _page * _limit
            end = offset + _limit
            qs = QuerySet(Department)

            if dept_no__contains:
                qs = qs.filter(dept_no__contains=dept_no__contains)

            if dept_name__contains:
                qs = qs.filter(dept_name__contains=dept_name__contains)

            count = qs.all().count()
            if _sort and _order:
                if _order == 'asc':
                    qs = qs.order_by(f'{_sort}')
                else:
                    qs = qs.order_by(f'-{_sort}')

            departments = qs.all()[offset:end]

            return JsonResponse(serialize_queryset(departments,
                                                   exclude=['employees']),
                                safe=False,
                                headers={'X-TOTAL-COUNT': count})
        else:
            return JsonResponse({'error': 'validate error'}, status=400)

    elif request.method == 'POST':
        dept_no = request.POST.get('dept_no')
        dept_name = request.POST.get('dept_name')
        dept = dict(dept_no=dept_no, dept_name=dept_name)
        form = DepartmentForm(dept)
        if form.is_valid():
            try:
                dept = Department.objects.create(dept_no=dept_no,
                                                 dept_name=dept_name)
                return JsonResponse(
                    serialize_model(dept, exclude=['employees']))
            except IntegrityError:
                return JsonResponse({'error': 'integrity error'}, status=400)
        else:
            return JsonResponse({'error': 'validate error'}, status=400)
def api_departments_managers_list(request, dept_no):
    try:
        dept = Department.objects.get(pk=dept_no)
        _page = request.GET.get('_page', 0)
        _limit = request.GET.get('_limit', 10)
        from_date__before = request.GET.get('from_date__before')
        from_date__after = request.GET.get('from_date__after')
        to_date__before = request.GET.get('to_date__before')
        to_date__after = request.GET.get('to_date__after')
        emp_no = request.GET.get('emp_no')
        emp_name = request.GET.get('emp_name')
        form = DepartmentManagersListParams(
            dict(_page=_page,
                 _limit=_limit,
                 from_date__before=from_date__before,
                 from_date__after=from_date__after,
                 to_date__before=to_date__before,
                 to_date__after=to_date__after,
                 emp_no=emp_no,
                 emp_name=emp_name))
        if form.is_valid():
            data = form.cleaned_data
            _page = data.get('_page')
            _limit = data.get('_limit')
            from_date__before = data.get('from_date__before')
            from_date__after = data.get('from_date__after')
            to_date__before = data.get('to_date__before')
            to_date__after = data.get('to_date__after')
            emp_no = data.get('emp_no')
            emp_name = data.get('emp_name')

            qs = DeptManager.objects.filter(department=dept)

            if emp_no:
                qs = qs.filter(employee__emp_no__icontains=emp_no)

            if emp_name:
                qs = qs.filter(
                    Q(employee__first_name__icontains=emp_name)
                    | Q(employee__last_name__icontains=emp_name))

            if from_date__before:
                qs = qs.filter(from_date__lte=from_date__before)

            if from_date__after:
                qs = qs.filter(from_date__gte=from_date__after)

            if to_date__before:
                qs = qs.filter(to_date__lte=to_date__before)

            if to_date__after:
                qs = qs.filter(to_date__gte=to_date__after)

            count = qs.all().count()
            start = _page * _limit
            end = start + _limit
            emp_list = qs.all()[start:end]

            return JsonResponse(serialize_queryset(emp_list),
                                safe=False,
                                headers={'X-TOTAL-COUNT': count})
        else:
            return JsonResponse(errors.ValidateError, status=400)
    except DeptManager.DoesNotExist:
        return JsonResponse(errors.NotFoundError, status=404)
def api_employee_list(requset):
    if requset.method == 'POST':
        form = EmployeeForm(requset.POST)
        if form.is_valid():
            data = form.cleaned_data
            try:
                res = Employee.objects.aggregate(max_emp_no=Max('emp_no'))
                emp = Employee()
                if not res['max_emp_no']:
                    emp.emp_no = 10001
                else:
                    emp.emp_no = res['max_emp_no'] + 1
                emp.birth_date = data.get('birth_date')
                emp.first_name = data.get('first_name')
                emp.last_name = data.get('last_name')
                emp.hire_date = data.get('hire_date')
                emp.gender = data.get('gender')
                emp.save(force_insert=True)
                return JsonResponse(serialize_model(emp,
                                                    exclude=['departments']),
                                    status=200)
            except IntegrityError:
                return JsonResponse(errors.IntegrityError, status=400)
        else:
            return JsonResponse(errors.ValidateError, status=400)
    elif requset.method == 'GET':
        _page = requset.GET.get('_page', 0)
        _limit = requset.GET.get('_limit', 10)
        _sort = requset.GET.get('_sort')
        _order = requset.GET.get('_order')
        first_name__contains = requset.GET.get('first_name__contains')
        last_name__contains = requset.GET.get('last_name__contains')
        birth_date__before = requset.GET.get('birth_date__before')
        birth_date__after = requset.GET.get('birth_date__after')
        emp_no__contains = requset.GET.get('emp_no__contains')
        hire_date__before = requset.GET.get('hire_date__before')
        hire_date__after = requset.GET.get('hire_date__after')
        form = EmployeeListParamsForm(
            dict(
                _page=_page,
                _limit=_limit,
                _sort=_sort,
                _order=_order,
                first_name__contains=first_name__contains,
                last_name__contains=last_name__contains,
                birth_date__before=birth_date__before,
                birth_date__after=birth_date__after,
                emp_no__contains=emp_no__contains,
                hire_date__before=hire_date__before,
                hire_date__after=hire_date__after,
            ))
        if form.is_valid():
            data = form.cleaned_data
            _page = data.get('_page', 0)
            _limit = data.get('_limit', 10)
            _sort = data.get('_sort')
            _order = data.get('_order')
            first_name__contains = data.get('first_name__contains')
            last_name__contains = data.get('last_name__contains')
            birth_date__before = data.get('birth_date__before')
            birth_date__after = data.get('birth_date__after')
            emp_no__contains = data.get('emp_no__contains')

            hire_date__before = data.get('hire_date__before')
            hire_date__after = data.get('hire_date__after')

            offset = _page * _limit
            end = offset + _limit
            qs = Employee.objects

            if emp_no__contains:
                qs = qs.filter(emp_no__contains=emp_no__contains)

            if first_name__contains:
                qs = qs.filter(first_name__icontains=first_name__contains)

            if last_name__contains:
                qs = qs.filter(last_name__icontains=last_name__contains)

            if birth_date__before:
                qs = qs.filter(birth_date__lte=birth_date__before)

            if birth_date__after:
                qs = qs.filter(birth_date__gte=birth_date__after)

            if hire_date__before:
                qs = qs.filter(hire_date__lte=hire_date__before)

            if hire_date__after:
                qs = qs.filter(hire_date__gte=hire_date__after)

            count = qs.all().count()

            if _sort and _order:
                if _order == 'asc':
                    direction = '+'
                else:
                    direction = '-'
                qs = qs.order_by(f'{direction}{_sort}')
            emp_list = qs.all()[offset:end]
            return JsonResponse(serialize_queryset(emp_list,
                                                   exclude=['departments']),
                                headers={'X-TOTAL-COUNT': count},
                                safe=False)
        else:
            return JsonResponse(errors.ValidateError, status=400)