def maintenance_view(request):

    data = get_abstract_data()

    maintenance_devices = MaintenanceDevice.objects.filter(deleted=False)

    data['maintenance_devices'] = (device.as_dict()
                                   for device in maintenance_devices)

    data['inventory_serials'] = [
        device.serial_number for device in InventoryDevice.objects.filter(
            delivered=False, deleted=False, maintenance_device__isnull=True)
    ]

    data['devices_and_spareparts'] = {
        device.pk:
        [sparepart.as_dict() for sparepart in device.spareparts.all()]
        for device in maintenance_devices
    }

    data['spareparts'] = [
        sparepart.name for sparepart in Sparepart.objects.filter(deleted=False)
    ]

    return render(request, 'devices/maintenance.html', context=data)
def device_detail(request, serial_number):

    data = get_abstract_data()

    inventory_devices = InventoryDevice.objects.filter(
        serial_number=serial_number, deleted=False)
    inventory_device = inventory_devices.first()

    if not inventory_device:
        inventory_device = InventoryDevice.objects.filter(
            serial_number=serial_number).first()

    company_name = inventory_device.reception_receipt.company_name
    device_type = inventory_device.device_type

    all_devices = [
        device.as_dict(for_detail=True) for device in inventory_devices
    ]

    new_data = {
        'serial_number': serial_number,
        'company_name': company_name,
        'device_type': device_type,
        'devices': all_devices
    }

    data.update(**new_data)

    return render(request, 'devices/device-detail.html', context=data)
def daily_attendance_view(request):
    
    data = get_abstract_data()
    
    data['attendances'] = Attendance.objects.filter(date=timezone.now().date())
    
    return render(request, 'attendance/daily-attendance.html', context=data)
def expense_archive_list(request):

    data = get_abstract_data()

    data['daily_expenses'] = DailyExpense.objects.exclude(
        date=timezone.now().date())

    return render(request, 'expenses/expense-archive-list.html', context=data)
def device_inventory_view(request):

    data = get_abstract_data()

    devices = InventoryDevice.objects.filter(delivered=False, deleted=False)

    data['inventory_devices'] = devices

    return render(request, 'devices/device-inventory.html', context=data)
def delivery_receipt_archive_view(request):

    data = get_abstract_data()

    data['delivery_receipts'] = DeliveryReceipt.objects.all()

    return render(request,
                  'receipts/delivery-receipt-archive.html',
                  context=data)
def reception_receipt_archive_view(request):

    data = get_abstract_data()

    data['reception_receipts'] = ReceptionReceipt.objects.all()

    return render(request,
                  'receipts/reception-receipt-archive.html',
                  context=data)
def sparepart_inventory_list(request):

    data = get_abstract_data()

    data['spareparts'] = Sparepart.objects.filter(deleted=False)

    return render(request,
                  'devices/sparepart-inventory-list.html',
                  context=data)
def delivery_receipt_detail(request, pk):
    
    data = get_abstract_data()
    
    receipt = DeliveryReceipt.objects.get(pk=pk)
    
    data['receipt'] = receipt.as_dict(for_receipt=True)
    data['receipt_json'] = json.dumps(receipt.as_dict(for_receipt=True))
    
    return render(request, 'receipts/delivery-receipt-detail.html', context=data)
def totals_view(request):

    data = get_abstract_data()

    year = datetime.datetime.now().year

    totals_data = utils.get_totals(year, 'EX')

    data.update(months=range(1, 13), **totals_data)

    return render(request, 'expenses/totals.html', context=data)
def sparepart_inventory_detail(request, pk):

    data = get_abstract_data()

    sparepart = Sparepart.objects.get(pk=pk)

    data['devices'] = (device.as_dict()
                       for device in MaintenanceDevice.objects.filter(
                           spareparts__sparepart__name=sparepart.name))

    return render(request,
                  'devices/sparepart-inventory-detail.html',
                  context=data)
def total_filter_view(request):

    data = get_abstract_data()

    data.update(
        revenue_categories=[
            category.name
            for category in ExpenseCategory.objects.filter(category_type='RV')
        ],
        expense_categories=[
            category.name
            for category in ExpenseCategory.objects.filter(category_type='EX')
        ])

    return render(request, 'expenses/total-filter.html', context=data)
def daily_expenses_view(request):

    data = get_abstract_data(view='daily-expenses')

    utils.close_old_days()

    data['expenses'] = Expense.objects.filter(date=timezone.now().date())
    data['revenue_categories'] = [
        category.as_dict()
        for category in ExpenseCategory.objects.filter(category_type='RV')
    ]
    data['expense_categories'] = [
        category.as_dict()
        for category in ExpenseCategory.objects.filter(category_type='EX')
    ]

    return render(request, 'expenses/daily-expenses.html', context=data)
def new_delivery_receipt_view(request):
        
    data = get_abstract_data()
    
    data['current_delivery_id'] = DeliveryReceipt.objects.last().id + 1 if DeliveryReceipt.objects.exists() else 1
    
    receipt_getter = ReceiptGetter()
    
    data['new_delivery_receipt_serials'] = get_receipts_data('delivery', 'serial')
    data['new_delivery_receipt_companies'] = receipt_getter.get_companies('delivery')
    data['new_delivery_receipt_types'] = receipt_getter.get_types('delivery')
    data['inner_reprs'] = receipt_getter.get_representatives('inner')
    data['outer_reprs'] = receipt_getter.get_representatives('outer')
    data['data'] = dict(request.GET)
    data['company'] = request.GET.get('company', '')
    
    return render(request, 'receipts/new-delivery-receipt.html', context=data)
def loans_view(request):

    data = get_abstract_data()

    loans = utils.get_formatted_loans_or_custodies(Loan)

    total_loans = sum([loan.amount for loan in Loan.objects.all()])

    if total_loans > 0:
        label = 'اجمالى المستحقات: {} جم'.format(total_loans)

    else:
        label = 'اجمالى السلف: {} جم'.format(total_loans)

    data.update(loans=loans, total_loans_label=label)

    return render(request, 'expenses/loans.html', context=data)
def custody_view(request):

    data = get_abstract_data()

    custs = utils.get_formatted_loans_or_custodies(Custody)

    total_custody = sum([cust.amount for cust in Custody.objects.all()])

    if total_custody > 0:
        label = 'اجمالى المستحقات: {} جم'.format(total_custody)

    else:
        label = 'اجمالى العهدة: {} جم'.format(total_custody)

    data.update(custs=custs, total_custs_label=label)

    return render(request, 'expenses/custody.html', context=data)
def total_filter_view(request):

    data = get_abstract_data()

    inventory_devices = InventoryDevice.objects.filter(delivered=False,
                                                       deleted=False)
    archive_devices = ArchiveDevice.objects.filter(deleted=False)

    serials = list(
        set([device.serial_number for device in inventory_devices] + [
            device.inventory_device.serial_number for device in archive_devices
        ]))

    receipt_getter = ReceiptGetter()

    companies = receipt_getter.get_companies('reception')
    types = receipt_getter.get_types('reception')

    data.update(**{'serials': serials, 'companies': companies, 'types': types})

    return render(request, 'devices/total-filter-view.html', context=data)
def expense_archive_detail(request, pk):

    data = get_abstract_data()

    expense = DailyExpense.objects.get(pk=pk)

    data['daily_expense'] = expense.as_dict(include_closing_data=True,
                                            include_expenses=True)
    data['revenue_categories'] = [
        category.as_dict()
        for category in ExpenseCategory.objects.filter(category_type='RV')
    ]
    data['expense_categories'] = [
        category.as_dict()
        for category in ExpenseCategory.objects.filter(category_type='EX')
    ]

    data.update(next_id=getattr(expense.get_next(), 'id', expense.id),
                prev_id=getattr(expense.get_prev(), 'id', expense.id))

    return render(request,
                  'expenses/expense-archive-detail.html',
                  context=data)
def device_archive_view(request):

    data = get_abstract_data()

    return render(request, 'devices/device-archive.html', context=data)