from django.shortcuts import render from django.http import JsonResponse from django.db.models import Q from decimal import Decimal, InvalidOperation from django.apps import apps from datetime import date, datetime from django.utils import timezone from .models import Client, SecondTableEntry from django.db.models import Sum # Clients Page (Main) def clients_list(request): # Annual summary data current_year = int(request.GET.get('year', datetime.now().year)) clients = Client.objects.all() monthly_data = [] for client in clients: monthly_totals = [] for month in range(1, 13): total = SecondTableEntry.objects.filter( client=client, date__year=current_year, date__month=month ).aggregate(total=Sum('lhe_output'))['total'] or 0 monthly_totals.append(total) monthly_data.append({ 'client': client, 'monthly_totals': monthly_totals, 'year_total': sum(monthly_totals) }) available_years = SecondTableEntry.objects.dates('date', 'year').distinct() return render(request, 'clients_table.html', { 'monthly_data': monthly_data, 'current_year': current_year, 'available_years': [y.year for y in available_years], 'months': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] }) # Table One View (ExcelEntry) def table_one_view(request): ExcelEntry = apps.get_model('sheets', 'ExcelEntry') entries_table1 = ExcelEntry.objects.all().select_related('client') clients = Client.objects.all() return render(request, 'table_one.html', { 'entries_table1': entries_table1, 'clients': clients, }) # Table Two View (SecondTableEntry) def table_two_view(request): try: SecondTableEntry = apps.get_model('sheets', 'SecondTableEntry') entries = SecondTableEntry.objects.all().order_by('-date') clients = Client.objects.all() return render(request, 'table_two.html', { 'entries_table2': entries, 'clients': clients, }) except Exception as e: return render(request, 'table_two.html', { 'error_message': f"Failed to load data: {str(e)}", 'entries_table2': [], 'clients': Client.objects.all() }) # Add Entry (Generic) def add_entry(request, model_name): if request.method == 'POST': try: model = apps.get_model('sheets', model_name) common_data = { 'client': Client.objects.get(id=request.POST.get('client_id')), 'date': request.POST.get('date'), 'notes': request.POST.get('notes', '') } if model_name == 'SecondTableEntry': # Handle Helium Output (Table Two) lhe_output = request.POST.get('lhe_output') entry = model.objects.create( **common_data, is_warm=request.POST.get('is_warm') == 'true', lhe_delivery=request.POST.get('lhe_delivery', ''), lhe_output=Decimal(lhe_output) if lhe_output else None ) return JsonResponse({ 'status': 'success', 'id': entry.id, 'client_name': entry.client.name, 'date': entry.date.strftime('%Y-%m-%d') if entry.date else '', 'is_warm': entry.is_warm, 'lhe_delivery': entry.lhe_delivery, 'lhe_output': str(entry.lhe_output) if entry.lhe_output else '', 'notes': entry.notes }) elif model_name == 'ExcelEntry': # Parse the date string into a date object date_str = request.POST.get('date') try: date_obj = datetime.strptime(date_str, '%Y-%m-%d').date() if date_str else None except (ValueError, TypeError): date_obj = None # Create the entry entry = model.objects.create( client=Client.objects.get(id=request.POST.get('client_id')), date=date_obj, pressure=Decimal(request.POST.get('pressure', 0)), purity=Decimal(request.POST.get('purity', 0)), notes=request.POST.get('notes', '') ) # Prepare the response response_data = { 'status': 'success', 'id': entry.id, 'client_name': entry.client.name, 'pressure': str(entry.pressure), 'purity': str(entry.purity), 'notes': entry.notes } # Only add date if it exists if entry.date: response_data['date'] = entry.date.strftime('%Y-%m-%d') else: response_data['date'] = None return JsonResponse(response_data) # Keep your existing SecondTableEntry code here... except Exception as e: return JsonResponse({'status': 'error', 'message': str(e)}, status=400) return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400) # Update Entry (Generic) def update_entry(request, model_name): if request.method == 'POST': try: model = apps.get_model('sheets', model_name) entry_id = int(request.POST.get('id')) entry = model.objects.get(id=entry_id) # Common updates for both models entry.client = Client.objects.get(id=request.POST.get('client_id')) entry.date = request.POST.get('date') entry.notes = request.POST.get('notes', '') if model_name == 'SecondTableEntry': # Handle Helium Output (Table Two) lhe_output = request.POST.get('lhe_output') entry.is_warm = request.POST.get('is_warm') == 'true' entry.lhe_delivery = request.POST.get('lhe_delivery', '') entry.lhe_output = Decimal(lhe_output) if lhe_output else None entry.save() return JsonResponse({ 'status': 'success', 'id': entry.id, 'client_name': entry.client.name, 'date': entry.date.strftime('%Y-%m-%d') if entry.date else '', 'is_warm': entry.is_warm, 'lhe_delivery': entry.lhe_delivery, 'lhe_output': str(entry.lhe_output) if entry.lhe_output else '', 'notes': entry.notes }) elif model_name == 'ExcelEntry': # Handle Helium Input (Table One) date_str = request.POST.get('date') try: date_obj = datetime.strptime(date_str, '%Y-%m-%d').date() if date_str else None except (ValueError, TypeError): date_obj = None entry.client = Client.objects.get(id=request.POST.get('client_id')) entry.date = date_obj entry.pressure = Decimal(request.POST.get('pressure', 0)) entry.purity = Decimal(request.POST.get('purity', 0)) entry.notes = request.POST.get('notes', '') entry.save() return JsonResponse({ 'status': 'success', 'id': entry.id, 'client_name': entry.client.name, 'pressure': str(entry.pressure), 'purity': str(entry.purity), 'date': entry.date.strftime('%Y-%m-%d') if entry.date else '', 'notes': entry.notes }) except model.DoesNotExist: return JsonResponse({'status': 'error', 'message': 'Entry not found'}, status=404) except Exception as e: return JsonResponse({'status': 'error', 'message': str(e)}, status=400) return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400) # Delete Entry (Generic) def delete_entry(request, model_name): if request.method == 'POST': try: model = apps.get_model('sheets', model_name) entry_id = request.POST.get('id') entry = model.objects.get(id=entry_id) entry.delete() return JsonResponse({'status': 'success', 'message': 'Entry deleted'}) except model.DoesNotExist: return JsonResponse({'status': 'error', 'message': 'Entry not found'}, status=404) except Exception as e: return JsonResponse({'status': 'error', 'message': str(e)}, status=400) return JsonResponse({'status': 'error', 'message': 'Invalid request'}, status=400)