from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
from django.utils import timezone

from otentifikasi.models import Biodata, MenuItem
from pelayanan.models import CaraBayar, Kelas, InvoiceLayanan, InvoiceBed, InvoiceLab
from pembayaran.models import Pembayaran, Pengeluaran, SubKategori_Pengeluaran, Kategori_Pengeluaran, Pengeluaran_Satuan
from pemeriksaan.models import Pendaftaran, CaraKeluar, PendaftaranViews
from penjualan.models import InvoiceBarang, HargaList, HargaListHistory
from faskes.models import InformasiDasarFaskes
from django.db.models import Q, Sum
from django.http import JsonResponse, FileResponse, HttpResponse
from openpyxl import Workbook
from openpyxl.styles import Alignment, Font, PatternFill, Border, Side
from openpyxl.utils import get_column_letter, column_index_from_string
import calendar
from django.core.exceptions import ObjectDoesNotExist
from django_serverside_datatable.views import ServerSideDatatableView

# Voucher
from promotion.models import PromotionVoucher, PromotionVoucherHistory
from datetime import datetime
import locale
from promotion.models import PromotionDiskonHistory
locale.setlocale(locale.LC_ALL, 'id_ID.UTF-8')

# Create your views here.
@login_required
def daftarpembayaranpasien(request):
    is_dp = request.GET.get('is_dp')
    is_dibayar = request.GET.get('is_dibayar')
    if request.user.username != "superuser":
        if is_dp == "1":
            semuapendaftaran = PendaftaranViews.objects.filter(Q(is_dp=1) & Q(is_dibayar=0))
        else:  
            semuapendaftaran = PendaftaranViews.objects.filter(Q(is_dibayar=0) | Q(status="arrived") | Q(status="progress"))
    else:
        semuapendaftaran = PendaftaranViews.objects.filter(Q(is_dibayar=0) | Q(status="arrived") | Q(status="progress"))
        
    semuapendaftaranhistory = PendaftaranViews.objects.filter(Q(is_dibayar=1),Q(status="selesai"))
    user_groups = request.user.groups.all()
    # GET MENU BY GROUPS #RYDEV
    menu_items = MenuItem.objects.filter(auth_menu_access__group__in=user_groups).order_by('order').distinct()
    context = {
        'semuapendaftaran': semuapendaftaran,
        'semuapendaftaranhistory': semuapendaftaranhistory,
        'menu_items': menu_items,
    }
    return render(request, 'pembayaran/daftar_pasien_kasir.html', context)

#rydev
def formatNum(number):
    try:
        # Convert the input to a float (assuming it's a valid number format)
        number = float(number)
        # Format the number with commas
        formatted_number = "{:,.0f}".format(number)
        return formatted_number
    except ValueError:
        return "Invalid number format"

# Create your views here.
@login_required
def siapkankasir(request, id):
    semuapendaftaran = Pendaftaran.objects.get(id=id)
    carabayar = CaraBayar.objects.get(id=semuapendaftaran.cara_bayar)
    invoicelab = InvoiceLab.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
    summaryinvoicelab = 0
    for x in invoicelab:
        x.total_harga = (x.tarif_lab.harga * x.kuantitas)
        summaryinvoicelab += x.total_harga
        # check diskon greater than or equal to
        check_diskon = PromotionDiskonHistory.objects.filter(layanan_diskon_id=x.tarif_lab.id, jenis_diskon="tindakan_lab", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas).exists()
        if check_diskon:
            if x.diskon_pembelian == 0:
                get_data = PromotionDiskonHistory.objects.get(layanan_diskon_id=x.tarif_lab.id, jenis_diskon="tindakan_lab", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas)
                x.diskon_layanan = get_data.diskon.diskon
                x.tipe_diskon = get_data.diskon.tipe_diskon
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelab -= potongan
                else: 
                    x.total_harga = x.total_harga - int(x.diskon_layanan)
                    summaryinvoicelab -= int(x.diskon_layanan)
            else:
                x.tipe_diskon = x.tipe_diskon
                x.diskon_layanan = x.diskon_pembelian
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelab -= potongan
                else: 
                    x.total_harga = x.total_harga - int(x.diskon_layanan)
                    summaryinvoicelab -= int(x.diskon_layanan)
        else:
            if x.diskon_pembelian == None:
                x.diskon_pembelian = 0
            if x.diskon_pembelian != 0:
                x.tipe_diskon = x.tipe_diskon
                x.diskon_layanan = x.diskon_pembelian
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelab -= potongan
                else: 
                    x.total_harga = x.total_harga - int(x.diskon_layanan)
                    summaryinvoicelab -= int(x.diskon_layanan)
            else:
                x.diskon_layanan = 0
                x.tipe_diskon = '%'

    kelas = Kelas.objects.get(id=semuapendaftaran.kelas)
    if Pembayaran.objects.filter(pendaftaran=semuapendaftaran).exists():
        pembayaranselesai = Pembayaran.objects.filter(pendaftaran=semuapendaftaran).last()
    else:
        pembayaranselesai = 0
    invoicebed = InvoiceBed.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
    summaryinvoicebed = 0
    for x in invoicebed:
        summaryinvoicebed += x.kamar.harga
    invoicebarang = InvoiceBarang.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
    summaryinvoicebarang = 0
    faskes_info = InformasiDasarFaskes.objects.first()
    is_paket = faskes_info.is_paket
    if is_paket == 1:
        try:
            get_harga = HargaListHistory.objects.filter(pendaftaran_id=id).first()
            if get_harga and hasattr(get_harga.harga_list, 'price'):
                price = get_harga.harga_list.price
                info_paket = get_harga.harga_list.title
                harga_paket = price
            else:
                info_paket = ''
                harga_paket = 0
                
        except ObjectDoesNotExist:
            info_paket = ''
            harga_paket = 0
        summaryinvoicebarang += harga_paket
    else:
        info_paket = ''
        harga_paket = 0
        for x in invoicebarang:
            x.total_harga =  (x.barang.harga_jual * x.kuantitas)
            summaryinvoicebarang += x.total_harga
            # check diskon greater than or equal to

            check_diskon = PromotionDiskonHistory.objects.filter(layanan_diskon_id=x.barang.id, jenis_diskon="barang", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas).exists()
            if check_diskon:
                if x.diskon_pembelian == 0:
                    get_data = PromotionDiskonHistory.objects.get(layanan_diskon_id=x.barang.id, jenis_diskon="barang", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas)
                    x.diskon_layanan = get_data.diskon.diskon
                    x.tipe_diskon = get_data.diskon.tipe_diskon
                    if x.tipe_diskon == '%':
                        potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                        x.total_harga = x.total_harga - potongan
                        summaryinvoicebarang -= potongan
                    else: 
                        x.total_harga = x.total_harga - int(x.diskon_layanan)
                        summaryinvoicebarang -= int(x.diskon_layanan)

                else:
                    x.tipe_diskon = x.tipe_diskon
                    x.diskon_layanan = x.diskon_pembelian
                    if x.tipe_diskon == '%':
                        potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                        x.total_harga = x.total_harga - potongan
                        summaryinvoicebarang -= potongan
                    else: 
                        x.total_harga = x.total_harga - int(x.diskon_layanan)
                        summaryinvoicebarang -= int(x.diskon_layanan)
            else:
                if x.diskon_pembelian == None:
                    x.diskon_pembelian = 0
                if x.diskon_pembelian != 0:
                    x.tipe_diskon = x.tipe_diskon
                    x.diskon_layanan = x.diskon_pembelian
                    if x.tipe_diskon == '%':
                        potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                        x.total_harga = x.total_harga - potongan
                        summaryinvoicebarang -= potongan
                    else: 
                        x.total_harga = x.total_harga - int(x.diskon_layanan)
                        summaryinvoicebarang -= int(x.diskon_layanan)
                else:
                    x.diskon_layanan = 0
                    x.tipe_diskon = '%'

    invoicelayanan = InvoiceLayanan.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
    summaryinvoicelayanan = 0
    for x in invoicelayanan:
        x.total_harga = (x.tarif_layanan.harga * x.kuantitas)
        summaryinvoicelayanan += x.total_harga
        # check diskon greater than or equal to
        check_diskon = PromotionDiskonHistory.objects.filter(layanan_diskon_id=x.tarif_layanan.id, jenis_diskon="tindakan", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas).exists()
        if check_diskon:
            if x.diskon_pembelian == 0:
                get_data = PromotionDiskonHistory.objects.get(layanan_diskon_id=x.tarif_layanan.id, jenis_diskon="tindakan", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas)
                x.diskon_layanan = get_data.diskon.diskon
                x.tipe_diskon = get_data.diskon.tipe_diskon
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (float(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelayanan -= potongan
                else: 
                    x.total_harga = x.total_harga - float(x.diskon_layanan)
                    summaryinvoicelayanan -= float(x.diskon_layanan)

            else:
                x.tipe_diskon = x.tipe_diskon
                x.diskon_layanan = x.diskon_pembelian
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (float(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelayanan -= potongan
                else: 
                    x.total_harga = x.total_harga - float(x.diskon_layanan)
                    summaryinvoicelayanan -= float(x.diskon_layanan)
        else:
            if x.diskon_pembelian == None:
                x.diskon_pembelian = 0
            if x.diskon_pembelian != 0:
                x.tipe_diskon = x.tipe_diskon
                x.diskon_layanan = x.diskon_pembelian
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (float(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelayanan -= potongan
                else: 
                    x.total_harga = x.total_harga - float(x.diskon_layanan)
                    summaryinvoicelayanan -= float(x.diskon_layanan)
            else:
                x.diskon_layanan = 0
                x.tipe_diskon = '%'
    
    if semuapendaftaran.is_new_pasien == True:
        admin_pelayanan = faskes_info.fee_new_pasien
    else:
        admin_pelayanan = faskes_info.fee_old_pasien
    allsummary = summaryinvoicelayanan + summaryinvoicebarang + summaryinvoicebed + admin_pelayanan + summaryinvoicelab

    if not Pembayaran.objects.filter(pendaftaran_id=id).exists():
        current_datetime = timezone.now()
        anyformatted_datetime = current_datetime.strftime("%Y%m%d%H%M%S")
        pembayarantemp = Pembayaran(
            kode=anyformatted_datetime,
            pendaftaran_id=id,
            total_pembayaran=allsummary,
            uang_pasien=0,
            kembalian=0,
            is_dibayar=0,
            petugas=Biodata.objects.get(username=request.user.username),
        )
        pembayarantemp.save()
    else:
        update = Pembayaran.objects.get(pendaftaran_id=id)
        update.total_pembayaran = allsummary
        update.save()

    # IF USING VOUCHER
    check_voucher = PromotionVoucherHistory.objects.filter(pendaftaran_id=id).exists()
    if check_voucher:
        vouc = PromotionVoucherHistory.objects.get(pendaftaran_id=id)
        if vouc.voucher.tipe_diskon == '%':
            diskon = vouc.voucher.diskon + ' %'
            potongan = allsummary * (int(vouc.voucher.diskon) / 100)
            total_bayar = allsummary - potongan
        else:
            potongan = int(vouc.voucher.diskon)
            total_bayar = allsummary - potongan
        
        is_voucher = True
        voucher_code = vouc.voucher.kode
    else:
        is_voucher = False
        potongan = 0
        total_bayar = allsummary
        voucher_code = ''
    
    user_groups = request.user.groups.all()

    # GET MENU BY GROUPS #RYDEV
    menu_items = MenuItem.objects.filter(auth_menu_access__group__in=user_groups).order_by('order').distinct()
    
    context = {
        'semuapendaftaran': semuapendaftaran,
        'carabayar': carabayar,
        'kelas': kelas, 
        'invoicebed': invoicebed,
        'invoicebarang': invoicebarang,
        'invoicelab': invoicelab,
        'invoicelayanan': invoicelayanan,
        'summaryinvoicebed': summaryinvoicebed,
        'summaryinvoicelab': summaryinvoicelab,
        'summaryinvoicebarang': summaryinvoicebarang,
        'summaryinvoicelayanan': summaryinvoicelayanan,
        'info_paket': info_paket,
        'harga_paket': harga_paket,
        'allsummary': allsummary,
        'total_bayar': total_bayar,
        'voucher_code': voucher_code,
        'is_voucher': is_voucher,
        'potongan': potongan,
        'pembayaranselesai': pembayaranselesai,
        'menu_items': menu_items,
    }
    return render(request, 'pembayaran/siapkankasir/form-siapkan-kasir.html', context)


@login_required
def pasienbayarselesai(request, id):
    semuapendaftaran = Pendaftaran.objects.get(id=id)
    if request.POST:
        current_datetime = timezone.now()
        formatted_datetime = current_datetime.strftime('%Y-%m-%d %H:%M:%S')
        is_dp_value = request.POST.get('is_dp')
        if Pembayaran.objects.filter(pendaftaran=semuapendaftaran).exists():
            pembayaranupdate = Pembayaran.objects.get(pendaftaran=semuapendaftaran)
            pembayaranupdate.is_dp = is_dp_value
            pembayaranupdate.uang_pasien = request.POST.get('uang_pasien')
            pembayaranupdate.kembalian = float(pembayaranupdate.uang_pasien) - float(pembayaranupdate.total_pembayaran)
            pembayaranupdate.save()
            # perubahan status PAID
            invoicebed = InvoiceBed.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
            invoicelayanan = InvoiceLayanan.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
            invoicelab = InvoiceLab.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
            invoicebarang = InvoiceBarang.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
            # IF USING VOUCHER
            count_voucher = 0
            check_voucher = PromotionVoucherHistory.objects.filter(pendaftaran_id=id).exists()
            if check_voucher:
                vouc = PromotionVoucherHistory.objects.get(pendaftaran_id=id)
                if vouc.voucher.tipe_diskon == '%':
                    diskon = vouc.voucher.diskon + ' %'
                    potongan = pembayaranupdate.total_pembayaran * (float(vouc.voucher.diskon) / 100)
                    count_voucher += potongan
                else:
                    count_voucher += float(vouc.voucher.diskon)

                voucher_history = PromotionVoucherHistory.objects.get(pendaftaran=semuapendaftaran)
                voucher_history.status = 1
                voucher_history.updated_at = formatted_datetime
                voucher_history.save()

            uangpasiennya = float(pembayaranupdate.uang_pasien) + count_voucher
            # summaryinvoicebarangpaid = 0
            paket_obat = 0
            faskes_info = InformasiDasarFaskes.objects.first()
            is_paket = faskes_info.is_paket
            if is_paket == 1:
                try:
                    get_harga = HargaListHistory.objects.filter(pendaftaran_id=id).first()
                    if get_harga and hasattr(get_harga.harga_list, 'price'):
                        price = get_harga.harga_list.price
                    else:
                        price = 0
                        
                except ObjectDoesNotExist:
                    price = 0
                paket_obat += price
                uangpasiennya -= paket_obat
                for x in invoicebarang:
                    if uangpasiennya < 0:
                        pembayaranupdate.is_dibayar = False
                        x.is_dibayar = False
                        x.save()
                        messages.info(request, 'uang pasien terbayarkan sebagian /  tidak cukup')
                        return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
                    else:
                        pembayaranupdate.is_dibayar = True
                        x.is_dibayar = True
                        x.save()
            else:
                for x in invoicebarang:
                    if uangpasiennya < 0:
                        pembayaranupdate.is_dibayar = False
                        x.is_dibayar = False
                        x.save()
                        pembayaranupdate.save()
                        messages.info(request, 'uang pasien terbayarkan sebagian /  tidak cukup')
                        return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
                    else:
                        pembayaranupdate.is_dibayar = True
                        x.is_dibayar = True
                        x.save()
                        pembayaranupdate.save()

                    x.total_harga = (x.barang.harga_jual * x.kuantitas)
                    if x.tipe_diskon == '%':
                        potongan = x.total_harga * (float(x.diskon_pembelian) / 100)
                        x.total_harga = x.total_harga - potongan
                    else: 
                        if x.diskon_pembelian is None:
                            x.diskon_pembelian = 0
                        x.total_harga = x.total_harga - float(x.diskon_pembelian)

                    uangpasiennya -= x.total_harga
            if semuapendaftaran.is_new_pasien == True:
                uangpasiennya -= faskes_info.fee_new_pasien
            else:
                uangpasiennya -= faskes_info.fee_old_pasien

            summaryinvoicelayananpaid = 0
            for x in invoicelayanan:
                x.total_harga = (x.tarif_layanan.harga * x.kuantitas)
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (float(x.diskon_pembelian) / 100)
                    x.total_harga = x.total_harga - potongan
                else: 
                    if x.diskon_pembelian is None:
                        x.diskon_pembelian = 0
                    x.total_harga = x.total_harga - float(x.diskon_pembelian)

                uangpasiennya -= x.total_harga

                if uangpasiennya < 0:
                    pembayaranupdate.is_dibayar = False
                    x.is_dibayar = False
                    x.save()
                    pembayaranupdate.save()
                    messages.info(request, 'uang pasien terbayarkan sebagian /  tidak cukup')
                    return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
                else:
                    pembayaranupdate.is_dibayar = True
                    x.is_dibayar = True
                    x.save()
                    pembayaranupdate.save()
                summaryinvoicelayananpaid += x.total_harga

            summaryinvoicelabpaid = 0
            for x in invoicelab:
                x.total_harga = (x.tarif_lab.harga * x.kuantitas)
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (float(x.diskon_pembelian) / 100)
                    x.total_harga = x.total_harga - potongan
                else: 
                    if x.diskon_pembelian is None:
                        x.diskon_pembelian = 0
                    x.total_harga = x.total_harga - float(x.diskon_pembelian)

                uangpasiennya -= x.total_harga
                if uangpasiennya < 0:
                    pembayaranupdate.is_dibayar = False
                    x.is_dibayar = False
                    x.save()
                    pembayaranupdate.save()
                    messages.info(request, 'uang pasien terbayarkan sebagian /  tidak cukup')
                    return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
                else:
                    pembayaranupdate.is_dibayar = True
                    x.is_dibayar = True
                    x.save()
                    pembayaranupdate.save()
                summaryinvoicelabpaid += x.total_harga

            if uangpasiennya < 0:
                pembayaranupdate.is_dibayar = False
                pembayaranupdate.save()
                messages.info(request, 'uang pasien terbayarkan sebagian /  tidak cukup')
                return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
            else:
                messages.info(request, 'pasien sudah bayar')
                pembayaranupdate.is_dibayar = True
                pembayaranupdate.save()
                return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
        else:
            anyformatted_datetime = current_datetime.strftime("%Y%m%d%H%M%S")
            invoicebarang = InvoiceBarang.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
            summaryinvoicebarang = 0
            faskes_info = InformasiDasarFaskes.objects.first()
            is_paket = faskes_info.is_paket
            if is_paket == 1:
                try:
                    get_harga = HargaListHistory.objects.filter(pendaftaran_id=id).first()
                    if get_harga and hasattr(get_harga.harga_list, 'price'):
                        price = get_harga.harga_list.price
                    else:
                        price = 0
                except ObjectDoesNotExist:
                    price = 0
                summaryinvoicebarang += price
            else:
                for x in invoicebarang:
                    summaryinvoicebarang += (x.barang.harga_jual * x.kuantitas)
            invoicelayanan = InvoiceLayanan.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
            summaryinvoicelayanan = 0
            for x in invoicelayanan:
                summaryinvoicelayanan += (x.tarif_layanan.harga * x.kuantitas)
            invoicelab = InvoiceLab.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
            summaryinvoicelab = 0
            for x in invoicelab:
                summaryinvoicelab += (x.tarif_lab.harga * x.kuantitas)
            invoicebed = InvoiceBed.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
            summaryinvoicebed = 0
            for x in invoicebed:
                summaryinvoicebed += x.kamar.harga
            allsummary = summaryinvoicebarang + summaryinvoicelayanan + summaryinvoicebed
            uangpasiennya = request.POST.get('uang_pasien')
            pembayaransekarang = Pembayaran(
                kode=anyformatted_datetime,
                pendaftaran=semuapendaftaran,
                total_pembayaran=allsummary,
                uang_pasien=uangpasiennya,
                petugas=Biodata.objects.get(username=request.user.username),
                is_dp=is_dp_value
            )
                
            pembayaransekarang.save()
            pembayaransekarang.kembalian = float(pembayaransekarang.uang_pasien) - float(pembayaransekarang.total_pembayaran)
            pembayaransekarang.save()
            # perubahan status PAID
            # IF USING VOUCHER
            count_voucher = 0
            check_voucher = PromotionVoucherHistory.objects.filter(pendaftaran_id=id).exists()
            if check_voucher:
                vouc = PromotionVoucherHistory.objects.get(pendaftaran_id=id)
                if vouc.voucher.tipe_diskon == '%':
                    diskon = vouc.voucher.diskon + ' %'
                    potongan = pembayaransekarang.total_pembayaran * (float(vouc.voucher.diskon) / 100)
                    count_voucher += potongan
                else:
                    count_voucher += float(vouc.voucher.diskon)

                voucher_history = PromotionVoucherHistory.objects.get(pendaftaran=semuapendaftaran)
                voucher_history.status = 1
                voucher_history.updated_at = formatted_datetime
                voucher_history.save()

            uangpasiennya = float(pembayaransekarang.uang_pasien) + count_voucher

            paket_obat = 0
            if is_paket == 1:
                try:
                    get_harga = HargaListHistory.objects.filter(pendaftaran_id=id).first()
                    if get_harga and hasattr(get_harga.harga_list, 'price'):
                        price = get_harga.harga_list.price
                    else:
                        price = 0
                except ObjectDoesNotExist:
                    price = 0
                paket_obat += price
                    
                for x in invoicebarang:
                    if uangpasiennya < 0:
                        pembayaranupdate.is_dibayar = False
                        x.is_dibayar = False
                        x.save()
                        messages.info(request, 'uang pasien terbayarkan sebagian /  tidak cukup')
                        return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
                    else:
                        pembayaranupdate.is_dibayar = True
                        x.is_dibayar = True
                        x.save()
            else:
                for x in invoicebarang:
                    x.total_harga = (x.barang.harga_jual * x.kuantitas)
                    if x.tipe_diskon == '%':
                        potongan = x.total_harga * (float(x.diskon_pembelian) / 100)
                        x.total_harga = x.total_harga - potongan
                    else: 
                        if x.diskon_pembelian is None:
                            x.diskon_pembelian = 0
                        x.total_harga = x.total_harga - float(x.diskon_pembelian)
                    paket_obat += x.total_harga
                    
            uangpasiennya -= paket_obat

            if semuapendaftaran.is_new_pasien == True:
                uangpasiennya -= faskes_info.fee_new_pasien
            else:
                uangpasiennya -= faskes_info.fee_old_pasien

            summaryinvoicebarangpaid = 0
            for x in invoicebarang:
                if uangpasiennya < 0:
                    pembayaransekarang.is_dibayar = False
                    x.is_dibayar = False
                    x.save()
                    pembayaransekarang.save()
                    messages.info(request, 'uang pasien terbayarkan sebagian /  tidak cukup')
                    return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
                else:
                    pembayaransekarang.is_dibayar = True
                    x.is_dibayar = True
                    x.save()
                    pembayaransekarang.save()
                summaryinvoicebarangpaid += (x.barang.harga_jual * x.kuantitas)
            summaryinvoicelayananpaid = 0
            for x in invoicelayanan:
                x.total_harga = (x.tarif_layanan.harga * x.kuantitas)
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (float(x.diskon_pembelian) / 100)
                    x.total_harga = x.total_harga - potongan
                else: 
                    if x.diskon_pembelian is None:
                        x.diskon_pembelian = 0
                    x.total_harga = x.total_harga - float(x.diskon_pembelian)
                uangpasiennya -= x.total_harga
                if uangpasiennya < 0:
                    pembayaransekarang.is_dibayar = False
                    x.is_dibayar = False
                    x.save()
                    pembayaransekarang.save()
                    messages.info(request, 'uang pasien terbayarkan sebagian /  tidak cukup')
                    return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
                else:
                    pembayaransekarang.is_dibayar = True
                    x.is_dibayar = True
                    x.save()
                    pembayaransekarang.save()
                summaryinvoicelayananpaid += (x.tarif_layanan.harga * x.kuantitas)

            summaryinvoicelabpaid = 0
            for x in invoicelab:
                x.total_harga = (x.tarif_lab.harga * x.kuantitas)
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (float(x.diskon_pembelian) / 100)
                    x.total_harga = x.total_harga - potongan
                else: 
                    if x.diskon_pembelian is None:
                        x.diskon_pembelian = 0
                    x.total_harga = x.total_harga - float(x.diskon_pembelian)

                uangpasiennya -= x.total_harga
                if uangpasiennya < 0:
                    pembayaransekarang.is_dibayar = False
                    x.is_dibayar = False
                    x.save()
                    pembayaransekarang.save()
                    messages.info(request, 'uang pasien terbayarkan sebagian /  tidak cukup')
                    return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
                else:
                    pembayaransekarang.is_dibayar = True
                    x.is_dibayar = True
                    x.save()
                    pembayaransekarang.save()
                summaryinvoicelabpaid += (x.tarif_lab.harga * x.kuantitas)
            if uangpasiennya < 0:
                pembayaransekarang.is_dibayar = False
                pembayaransekarang.save()
                messages.info(request, 'uang pasien terbayarkan sebagian /  tidak cukup')
                return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
            else:
                messages.info(request, 'pasien sudah bayar')
                return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))
    else:
        return redirect('/pembayaran/siapkankasir/{0}/'.format(semuapendaftaran.id))



@login_required
def cetakpembayaran(request, id):
    pendaftaran = Pendaftaran.objects.get(id=id)
    semuapendaftaran = Pendaftaran.objects.get(id=id)
    carabayar = CaraBayar.objects.get(id=semuapendaftaran.cara_bayar)
    kelas = Kelas.objects.get(id=semuapendaftaran.kelas)

    invoicelab = InvoiceLab.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
    summaryinvoicelab = 0
    for x in invoicelab:
        x.total_harga = (x.tarif_lab.harga * x.kuantitas)
        summaryinvoicelab += x.total_harga
        # check diskon greater than or equal to
        check_diskon = PromotionDiskonHistory.objects.filter(layanan_diskon_id=x.tarif_lab.id, jenis_diskon="tindakan_lab", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas).exists()
        if check_diskon:
            if x.diskon_pembelian == 0:
                get_data = PromotionDiskonHistory.objects.get(layanan_diskon_id=x.tarif_lab.id, jenis_diskon="tindakan_lab", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas)
                x.diskon_layanan = get_data.diskon.diskon
                x.tipe_diskon = get_data.diskon.tipe_diskon
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelab -= potongan
                else: 
                    x.total_harga = x.total_harga - int(x.diskon_layanan)
                    summaryinvoicelab -= int(x.diskon_layanan)
            else:
                x.tipe_diskon = x.tipe_diskon
                x.diskon_layanan = x.diskon_pembelian
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelab -= potongan
                else: 
                    x.total_harga = x.total_harga - int(x.diskon_layanan)
                    summaryinvoicelab -= int(x.diskon_layanan)
        else:
            if x.diskon_pembelian == None:
                x.diskon_pembelian = 0
            if x.diskon_pembelian != 0:
                x.tipe_diskon = x.tipe_diskon
                x.diskon_layanan = x.diskon_pembelian
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelab -= potongan
                else: 
                    x.total_harga = x.total_harga - int(x.diskon_layanan)
                    summaryinvoicelab -= int(x.diskon_layanan)
            else:
                x.diskon_layanan = 0
                x.tipe_diskon = '%'


    if Pembayaran.objects.filter(pendaftaran=semuapendaftaran).exists():
        pembayaranselesai = Pembayaran.objects.filter(pendaftaran=semuapendaftaran).last()
    else:
        pembayaranselesai = 0
    invoicebed = InvoiceBed.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
    summaryinvoicebed = 0
    for x in invoicebed:
        summaryinvoicebed += x.kamar.harga
    invoicebarang = InvoiceBarang.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
    summaryinvoicebarang = 0
    faskes_info = InformasiDasarFaskes.objects.first()
    is_paket = faskes_info.is_paket
    if is_paket == 1:
        try:
            get_harga = HargaListHistory.objects.filter(pendaftaran_id=id).first()
            if get_harga and hasattr(get_harga.harga_list, 'price'):
                price = get_harga.harga_list.price
                info_paket = get_harga.harga_list.title
                harga_paket = price
            else:
                info_paket = ''
                harga_paket = 0
        except ObjectDoesNotExist:
            price = 0
            info_paket = ''
            harga_paket = 0
        summaryinvoicebarang += price
    else:
        info_paket = ''
        harga_paket = 0
        for x in invoicebarang:
            x.total_harga =  (x.barang.harga_jual * x.kuantitas)
            summaryinvoicebarang += x.total_harga
            # check diskon greater than or equal to

            check_diskon = PromotionDiskonHistory.objects.filter(layanan_diskon_id=x.barang.id, jenis_diskon="obat", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas).exists()
            if check_diskon:
                get_data = PromotionDiskonHistory.objects.get(layanan_diskon_id=x.barang.id, jenis_diskon="obat", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas)
                x.diskon_layanan = get_data.diskon.diskon
                x.tipe_diskon = get_data.diskon.tipe_diskon
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                else:
                    potongan = int(x.diskon_layanan)
                    x.total_harga = x.total_harga - potongan

                summaryinvoicebarang -= potongan
            else:
                x.diskon_layanan = 0
                x.tipe_diskon = '%'

    if semuapendaftaran.is_new_pasien == True:
        fee_pendaftaran = faskes_info.fee_new_pasien
    else:
        fee_pendaftaran = faskes_info.fee_old_pasien

    invoicelayanan = InvoiceLayanan.objects.filter(pendaftaran=semuapendaftaran, progress='progress')
    summaryinvoicelayanan = 0
    for x in invoicelayanan:
        x.total_harga = (x.tarif_layanan.harga * x.kuantitas)
        summaryinvoicelayanan += x.total_harga
        # check diskon greater than or equal to
        check_diskon = PromotionDiskonHistory.objects.filter(layanan_diskon_id=x.tarif_layanan.id, jenis_diskon="tindakan", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas).exists()
        if check_diskon:
            if x.diskon_pembelian == 0:
                get_data = PromotionDiskonHistory.objects.get(layanan_diskon_id=x.tarif_layanan.id, jenis_diskon="tindakan", diskon__is_active=1, diskon__min_qty__lte=x.kuantitas)
                x.diskon_layanan = get_data.diskon.diskon
                x.tipe_diskon = get_data.diskon.tipe_diskon
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelayanan -= potongan
                else: 
                    x.total_harga = x.total_harga - int(x.diskon_layanan)
                    summaryinvoicelayanan -= int(x.diskon_layanan)

            else:
                x.tipe_diskon = x.tipe_diskon
                x.diskon_layanan = x.diskon_pembelian
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelayanan -= potongan
                else: 
                    x.total_harga = x.total_harga - int(x.diskon_layanan)
                    summaryinvoicelayanan -= int(x.diskon_layanan)
        else:
            if x.diskon_pembelian == None:
                x.diskon_pembelian = 0
            if x.diskon_pembelian != 0:
                x.tipe_diskon = x.tipe_diskon
                x.diskon_layanan = x.diskon_pembelian
                if x.tipe_diskon == '%':
                    potongan = x.total_harga * (int(x.diskon_layanan) / 100)
                    x.total_harga = x.total_harga - potongan
                    summaryinvoicelayanan -= potongan
                else: 
                    x.total_harga = x.total_harga - int(x.diskon_layanan)
                    summaryinvoicelayanan -= int(x.diskon_layanan)
            else:
                x.diskon_layanan = 0
                x.tipe_diskon = '%'
                
    allsummary = summaryinvoicelayanan + summaryinvoicebarang + summaryinvoicebed + summaryinvoicelab + fee_pendaftaran
    
    # IF USING VOUCHER
    check_voucher = PromotionVoucherHistory.objects.filter(pendaftaran_id=id).exists()
    if check_voucher:
        vouc = PromotionVoucherHistory.objects.get(pendaftaran_id=id)
        if vouc.voucher.tipe_diskon == '%':
            diskon = vouc.voucher.diskon + ' %'
            potongan = allsummary * (int(vouc.voucher.diskon) / 100)
            total_bayar = allsummary - potongan
        else:
            potongan = int(vouc.voucher.diskon)
            total_bayar = allsummary - potongan
        
        is_voucher = True
        voucher_code = vouc.voucher.kode
    else:
        is_voucher = False
        potongan = 0
        total_bayar = allsummary
        voucher_code = ''
    
    context = {
        'semuapendaftaran': semuapendaftaran,
        'carabayar': carabayar,
        'kelas': kelas,
        'invoicebed': invoicebed,
        'invoicebarang': invoicebarang,
        'invoicelayanan': invoicelayanan,
        'fee_pendaftaran': fee_pendaftaran,
        'invoicelab': invoicelab,
        'summaryinvoicebed': summaryinvoicebed,
        'summaryinvoicebarang': summaryinvoicebarang,
        'summaryinvoicelayanan': summaryinvoicelayanan,
        'summaryinvoicelab': summaryinvoicelab,
        'allsummary': total_bayar,
        'pembayaranselesai': pembayaranselesai,
        'pendaftaran': pendaftaran,
        'is_voucher': is_voucher,
        'info_paket': info_paket,
        'harga_paket': harga_paket,
        'potongan': potongan,
    }
    return render(request, 'pembayaran/hasilprint/pembayaran.html', context)

@login_required
def get_pemasukan(request, date):

    if date == 'today':
        today_start = timezone.localtime(timezone.now()).replace(hour=0, minute=0, second=0, microsecond=0)
        today_end = timezone.localtime(timezone.now()).replace(hour=23, minute=59, second=59, microsecond=999999)
        pendaftaran_ids = PendaftaranViews.objects.filter(created_at__range=(today_start, today_end)).values_list('id', flat=True)

    elif date == 'week':
        week_start = timezone.localtime(timezone.now()).replace(hour=0, minute=0, second=0, microsecond=0) - timezone.timedelta(days=timezone.localtime(timezone.now()).weekday())
        week_end = week_start + timezone.timedelta(days=6)
        pendaftaran_ids = PendaftaranViews.objects.filter(created_at__range=(week_start, week_end)).values_list('id', flat=True)

    elif date == 'currentmonth':
        month_start = timezone.localtime(timezone.localtime(timezone.now())).replace(day=1, hour=0, minute=0, second=0, microsecond=0)
        print(month_start)
        _, last_day_of_month = calendar.monthrange(month_start.year, month_start.month)
        month_end = timezone.localtime(timezone.now()).replace(day=last_day_of_month, hour=23, minute=59, second=59, microsecond=999999)
        print(month_end)
        pendaftaran_ids = PendaftaranViews.objects.filter(created_at__range=(month_start, month_end)).values_list('id', flat=True)

    elif date == 'lastmonth':
        last_month_end = timezone.localtime(timezone.now()).replace(day=1, hour=0, minute=0, second=0, microsecond=0) - timezone.timedelta(days=1)
        last_month_start = last_month_end.replace(day=1)
        pendaftaran_ids = PendaftaranViews.objects.filter(created_at__range=(last_month_start, last_month_end)).values_list('id', flat=True)

    else:
        month_start = timezone.localtime(timezone.now()).replace(day=1, hour=0, minute=0, second=0, microsecond=0)
        _, last_day_of_month = calendar.monthrange(month_start.year, month_start.month)
        month_end = timezone.localtime(timezone.now()).replace(day=last_day_of_month, hour=23, minute=59, second=59, microsecond=999999)
        pendaftaran_ids = PendaftaranViews.objects.filter(created_at__range=(month_start, month_end)).values_list('id', flat=True)

    totalPembayaran = 0
    faskes_info = InformasiDasarFaskes.objects.first()
    is_paket = faskes_info.is_paket
    laporan_keuangan = PendaftaranViews.objects.filter(id__in=pendaftaran_ids, status='selesai', cara_bayar=2)

    for x in laporan_keuangan:
        summaryinvoicebarang = 0
        invoicebarang = InvoiceBarang.objects.filter(is_dibayar=1, pendaftaran_id=x.id)
        if is_paket == 1:
            try:
                get_harga = HargaListHistory.objects.filter(pendaftaran_id=x.id).first()
                if get_harga and hasattr(get_harga.harga_list, 'price'):
                    price = get_harga.harga_list.price
                else:
                    price = 0
            except ObjectDoesNotExist:
                price = 0
            summaryinvoicebarang += price
        else:
            for xbarang in invoicebarang:
                xbarang.total_harga =  (xbarang.barang.harga_jual * xbarang.kuantitas)
                summaryinvoicebarang += xbarang.total_harga
                check_diskon = PromotionDiskonHistory.objects.filter(layanan_diskon_id=xbarang.barang.id, jenis_diskon="barang", diskon__is_active=1, diskon__min_qty__lte=xbarang.kuantitas).exists()
                if check_diskon:
                    if xbarang.diskon_pembelian == 0:
                        get_data = PromotionDiskonHistory.objects.get(layanan_diskon_id=xbarang.barang.id, jenis_diskon="barang", diskon__is_active=1, diskon__min_qty__lte=xbarang.kuantitas)
                        xbarang.diskon_layanan = get_data.diskon.diskon
                        xbarang.tipe_diskon = get_data.diskon.tipe_diskon
                        if xbarang.tipe_diskon == '%':
                            potongan = xbarang.total_harga * (int(xbarang.diskon_layanan) / 100)
                            xbarang.total_harga = xbarang.total_harga - potongan
                            summaryinvoicebarang -= potongan
                        else: 
                            xbarang.total_harga = xbarang.total_harga - int(xbarang.diskon_layanan)
                            summaryinvoicebarang -= int(xbarang.diskon_layanan)

                    else:
                        xbarang.tipe_diskon = xbarang.tipe_diskon
                        xbarang.diskon_layanan = xbarang.diskon_pembelian
                        if xbarang.tipe_diskon == '%':
                            potongan = xbarang.total_harga * (int(xbarang.diskon_layanan) / 100)
                            xbarang.total_harga = xbarang.total_harga - potongan
                            summaryinvoicebarang -= potongan
                        else: 
                            xbarang.total_harga = xbarang.total_harga - int(xbarang.diskon_layanan)
                            summaryinvoicebarang -= int(xbarang.diskon_layanan)
                else:
                    if xbarang.diskon_pembelian == None:
                        xbarang.diskon_pembelian = 0
                    if xbarang.diskon_pembelian != 0:
                        xbarang.tipe_diskon = xbarang.tipe_diskon
                        xbarang.diskon_layanan = xbarang.diskon_pembelian
                        if xbarang.tipe_diskon == '%':
                            potongan = xbarang.total_harga * (int(xbarang.diskon_layanan) / 100)
                            xbarang.total_harga = xbarang.total_harga - potongan
                            summaryinvoicebarang -= potongan
                        else: 
                            xbarang.total_harga = xbarang.total_harga - int(xbarang.diskon_layanan)
                            summaryinvoicebarang -= int(xbarang.diskon_layanan)
                    else:
                        xbarang.diskon_layanan = 0
                        xbarang.tipe_diskon = '%'

        if x.is_new_pasien == True:
            fee_pendaftaran = faskes_info.fee_new_pasien
        else:
            fee_pendaftaran = faskes_info.fee_old_pasien 

        summaryinvoicelayanan = 0
        invoicelayanan = InvoiceLayanan.objects.filter(is_dibayar=1, pendaftaran_id=x.id)
        for xlayanan in invoicelayanan:
            xlayanan.total_harga = (xlayanan.tarif_layanan.harga * xlayanan.kuantitas)
            summaryinvoicelayanan += xlayanan.total_harga
            # check diskon greater than or equal to
            check_diskon = PromotionDiskonHistory.objects.filter(layanan_diskon_id=xlayanan.tarif_layanan.id, jenis_diskon="tindakan", diskon__is_active=1, diskon__min_qty__lte=xlayanan.kuantitas).exists()
            if check_diskon:
                if xlayanan.diskon_pembelian == 0:
                    get_data = PromotionDiskonHistory.objects.get(layanan_diskon_id=xlayanan.tarif_layanan.id, jenis_diskon="tindakan", diskon__is_active=1, diskon__min_qty__lte=xlayanan.kuantitas)
                    xlayanan.diskon_layanan = get_data.diskon.diskon
                    xlayanan.tipe_diskon = get_data.diskon.tipe_diskon
                    if xlayanan.tipe_diskon == '%':
                        potongan = xlayanan.total_harga * (float(xlayanan.diskon_layanan) / 100)
                        xlayanan.total_harga = xlayanan.total_harga - potongan
                        summaryinvoicelayanan -= potongan
                    else: 
                        xlayanan.total_harga = xlayanan.total_harga - float(xlayanan.diskon_layanan)
                        summaryinvoicelayanan -= float(xlayanan.diskon_layanan)

                else:
                    xlayanan.tipe_diskon = xlayanan.tipe_diskon
                    xlayanan.diskon_layanan = xlayanan.diskon_pembelian
                    if xlayanan.tipe_diskon == '%':
                        potongan = xlayanan.total_harga * (float(xlayanan.diskon_layanan) / 100)
                        xlayanan.total_harga = xlayanan.total_harga - potongan
                        summaryinvoicelayanan -= potongan
                    else: 
                        xlayanan.total_harga = xlayanan.total_harga - float(xlayanan.diskon_layanan)
                        summaryinvoicelayanan -= float(xlayanan.diskon_layanan)
            else:
                if xlayanan.diskon_pembelian == None:
                    xlayanan.diskon_pembelian = 0
                if xlayanan.diskon_pembelian != 0:
                    xlayanan.tipe_diskon = xlayanan.tipe_diskon
                    xlayanan.diskon_layanan = xlayanan.diskon_pembelian
                    if xlayanan.tipe_diskon == '%':
                        potongan = xlayanan.total_harga * (float(xlayanan.diskon_layanan) / 100)
                        xlayanan.total_harga = xlayanan.total_harga - potongan
                        summaryinvoicelayanan -= potongan
                    else: 
                        xlayanan.total_harga = xlayanan.total_harga - float(xlayanan.diskon_layanan)
                        summaryinvoicelayanan -= float(xlayanan.diskon_layanan)
                else:
                    xlayanan.diskon_layanan = 0
                    xlayanan.tipe_diskon = '%'

        summaryinvoicelab = 0
        invoicelab = InvoiceLab.objects.filter(is_dibayar=1, pendaftaran_id=x.id)
        for xlab in invoicelab:
            summaryinvoicelab += (xlab.tarif_lab.harga * xlab.kuantitas)       

        x.harga_obat = summaryinvoicebarang
        x.administrasi_pendaftaran = fee_pendaftaran
        x.total_layanan_harga = summaryinvoicelayanan
        x.total_lab_harga = summaryinvoicelab
        x.apd = 0
        x.total = summaryinvoicebarang + summaryinvoicelayanan + fee_pendaftaran + summaryinvoicelab
        totalPembayaran += int(x.total)

    return totalPembayaran

@login_required
def pengeluaran(request):
    kategori_pengeluaran = SubKategori_Pengeluaran.objects.all()
    satuan = Pengeluaran_Satuan.objects.all()

    user_groups = request.user.groups.all()
    now = timezone.now()
    formatted_date = now.strftime('%Y-%m-%d')
    month = int(now.strftime('%m'))
    year = int(now.strftime('%Y'))
    month_names = ["Januari","Februari", "Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"]
    monthyear = month_names[month-1] + " " + str(year)
    lastmonthyear = month_names[month-2] + " " + str(year)
    lastmonth = month - 1
    pengeluaranlist = Pengeluaran.objects.filter(activity_date__month=month, activity_date__year=year)
    pengeluaranlisthistory = Pengeluaran.objects.filter(activity_date__month=lastmonth, activity_date__year=year)
    currentMonthTotal = Pengeluaran.objects.filter(activity_date__month=month, activity_date__year=year).aggregate(Sum('total'))['total__sum']
    lastMonthTotal = Pengeluaran.objects.filter(activity_date__month=lastmonth, activity_date__year=year).aggregate(Sum('total'))['total__sum']
    if currentMonthTotal is None:
        currentMonthTotal = 0
    if lastMonthTotal is None:
        lastMonthTotal = 0
    currentPemasukan = get_pemasukan(request, "currentmonth")
    lastPemasukan = get_pemasukan(request, "lastmonth")
    # GET MENU BY GROUPS #RYDEV
    menu_items = MenuItem.objects.filter(auth_menu_access__group__in=user_groups).order_by('order').distinct()
    context = {
        'pengeluaranlist': pengeluaranlist,
        'pengeluaranlisthistory': pengeluaranlisthistory,
        'kategori_pengeluaran': kategori_pengeluaran,
        'satuan': satuan,
        'formatted_date': formatted_date,
        'month': month,
        'lastmonth': f"0{lastmonth}" if len(str(lastmonth)) < 2 else lastmonth,
        'year': year,
        'monthyear': monthyear,
        'lastmonthyear': lastmonthyear,
        'currentMonthTotal': currentMonthTotal,
        'lastMonthTotal': lastMonthTotal,
        'currentPemasukan': currentPemasukan,
        'lastPemasukan': lastPemasukan,
        'menu_items': menu_items,
    }
    return render(request, 'pembayaran/pengeluaran/daftar_pengeluaran.html', context)

@login_required
def tambah_pengeluaran(request):
    data = request.POST
    title = data.get('title')
    activity_date = data.get('activity_date')
    category_id = data.get('category_id')
    satuan = data.get('satuan')
    qty = data.get('qty')
    price = data.get('price')
    payment_method = data.get('payment_method')

    # return JsonResponse(category_id, safe=False)
    if data.get('pengeluaran_id') != None:
        pengeluaran_id = data.get('pengeluaran_id')
        update = Pengeluaran.objects.get(id=pengeluaran_id)
        update.title = title
        update.activity_date = activity_date
        update.category_id = category_id
        update.satuan = satuan
        update.qty = qty
        update.price = price
        update.payment_method = payment_method
        update.total = float(price) * float(qty)
        update.save()
    else:
        try:
            total = float(price) * float(qty)
            pengeluaran = Pengeluaran(
                title=title,
                activity_date=activity_date,
                subcategory=SubKategori_Pengeluaran.objects.get(id=category_id),
                satuan=satuan,
                qty=qty,
                price=price,
                payment_method=payment_method,
                total=total,
            )
            pengeluaran.save()
        except Exception as e:
            print(f"Error creating data: {e}")

    return redirect('pengeluaran')

@login_required
def get_pengeluaran(request, id):
    p = Pengeluaran.objects.get(id=id)
    objects = {
        'title': p.title,
        'activity_date': p.activity_date,
        'subcategory_id': p.subcategory_id,
        'category_id': p.subcategory.category_id,
        'satuan': p.satuan,
        'qty': p.qty,
        'price': p.price,
        'payment_method': p.payment_method,
        'total': p.total,
        'created_at': p.created_at,
    }
    return JsonResponse(objects, safe=False)

@login_required
def del_pengeluaran(request, id):
    p = Pengeluaran.objects.get(id=id)
    p.delete()
    return JsonResponse({"msg": "Data berhasil dihapus."}, safe=False)

def export_pengeluaran(request):
    wb = Workbook()
    ws = wb.active

    # Define the title
    ws.merge_cells("A1:P1")
    title = "DATA LIST PENGELUARAN KLINIK"

    # Set the title in cell A1 with bold font
    title_cell = ws.cell(row=1, column=1, value=title)
    title_cell.alignment = Alignment(horizontal='center', vertical='center')
    title_cell.font = Font(bold=True)

    # Define the subtitle
    ws.merge_cells("A2:P2")
    info_dasar_faskes = InformasiDasarFaskes.objects.first()
    subtitle = info_dasar_faskes.nama

    # Set the subtitle in cell A1 with bold font
    subtitle_cell = ws.cell(row=2, column=1, value=subtitle)
    subtitle_cell.alignment = Alignment(horizontal='center', vertical='center')
    subtitle_cell.font = Font(bold=True)

    # Define the title
    ws.merge_cells("A3:P3")
    alamat = info_dasar_faskes.alamat

    # Set the alamat in cell A1 with bold font
    alamat_cell = ws.cell(row=3, column=1, value=alamat)
    alamat_cell.alignment = Alignment(horizontal='center', vertical='center')

    # Define the email
    ws.merge_cells("A4:P4")
    email = "email: -"

    # Set the email in cell A1 with bold font
    email_cell = ws.cell(row=4, column=1, value=email)
    email_cell.alignment = Alignment(horizontal='center', vertical='center')
    email_font = Font(bold=True, color="0000FF")  # "0000FF" is the code for blue
    email_cell.font = email_font

    # Define the column headers
    column_headers = ["No", "Tanggal", "Keterangan"]
    first_length = len(column_headers)
    get_kategori = SubKategori_Pengeluaran.objects.all()
    for item in get_kategori:
        column_headers.append(item.name)
        column_headers.append("")

    # return JsonResponse(list(column_headers), safe=False)
    # Set the column headers in the worksheet
    for col_num, column_title in enumerate(column_headers, 1):
        cell = ws.cell(row=7, column=col_num, value=column_title)
        cell.alignment = Alignment(horizontal='center')
        cell.font = Font(bold=True)
        
        col_letter = get_column_letter(col_num)
        max_width = max(len(str(column_title)), 15)  # Minimum width of 10 characters
        ws.column_dimensions[col_letter].width = max_width
        
    # Merge cells for "JML Pembayaran" and add sub-columns
    start_column = 'D'
    array_kategori = []
    for i, item in enumerate(get_kategori):
        # Convert the starting column letter to its corresponding index
        start_col_index = column_index_from_string(start_column)

        # Calculate the ending column index for merging
        end_col_index = start_col_index + 1

        # Convert the starting and ending column indices back to letters
        start_col_letter = get_column_letter(start_col_index)
        end_col_letter = get_column_letter(end_col_index)

        # Merge cells from start column to end column for the category header
        ws.merge_cells(f"{start_col_letter}7:{end_col_letter}7")

        # Set values and fonts for the "Cash" and "Transfer" cells
        tindakan = ws.cell(row=8, column=start_col_index, value="CASH")
        tindakan.font = Font(bold=True)
        obat = ws.cell(row=8, column=end_col_index, value="TRANSFER")
        obat.font = Font(bold=True)
        kategori_dict = {
            item.name: {
                "CASH": start_col_index,
                "TRANSFER": end_col_index
            }
        }
        array_kategori.append(kategori_dict)

        # Update the starting column letter for the next iteration
        start_column = get_column_letter(end_col_index + 1)

    month = request.GET.get('month')
    year = request.GET.get('year')

    get_data = Pengeluaran.objects.filter(activity_date__month=month, activity_date__year=year)
    category_dict = {list(item.keys())[0]: item[list(item.keys())[0]] for item in array_kategori}
    index = 0
    for item in get_data:
        index += 1
        row_template = [""] * len(column_headers) #Duplikat string sampai total column
        total_item = item.total
        find_kategori = item.subcategory.name
        offset = category_dict.get(find_kategori).get(item.payment_method)
        row_template[0] = index
        row_template[1] = item.activity_date
        row_template[2] = item.title
        row_template[offset-1] = item.total
        ws.append(row_template)
    
    border = Border(left=Side(style='thin'), 
                    right=Side(style='thin'),
                    top=Side(style='thin'),
                    bottom=Side(style='thin'))

    for row in ws.iter_rows(min_row=7, max_row=ws.max_row, min_col=1, max_col=ws.max_column):
        for cell in row:
            cell.border = border

    # Set response headers for Excel file download
    response = HttpResponse(content_type='application/ms-excel')
    current_date = datetime.now().strftime('%d_%b_%Y')

    filename = f"PENGELUARAN_KLINIK_BULAN_{month}_{year}.xlsx"

    response['Content-Disposition'] = f'attachment; filename="{filename}"'

    # Save the workbook to the response
    wb.save(response)

    return response

@login_required
def filter_pengeluaran_month(request):
    month = request.POST.get('month')
    year = request.POST.get('year')
    pengeluaranlist = Pengeluaran.objects.filter(activity_date__month=month, activity_date__year=year).values()
    return JsonResponse(list(pengeluaranlist), safe=False)

class PembayaranPasienListView(ServerSideDatatableView):
	queryset = PendaftaranViews.objects.filter(Q(is_dibayar=1),Q(status="selesai"))
	columns = ['id', 'kode_booking', 'created_at', 'nomor_rekam_medis', 'nama_pasien', 'ruang_rawat_pasien', 'status', 'nama_dokter']
