import os file_path = 'core/views.py' # The missing code to append missing_code = r""" # Deduct stock product.stock_quantity -= int(item['quantity']) product.save() return JsonResponse({'success': True, 'sale_id': sale.id}) except Exception as e: return JsonResponse({'success': False, 'error': str(e)}, status=400) return JsonResponse({'success': False, 'error': 'Invalid request'}, status=405) @login_required def search_customers_api(request): query = request.GET.get('q', '') customers = Customer.objects.filter( Q(name__icontains=query) | Q(phone__icontains=query) ).values('id', 'name', 'phone')[:10] return JsonResponse({'results': list(customers)}) @login_required def customer_payments(request): payments = SalePayment.objects.select_related('sale', 'sale__customer').order_by('-payment_date', '-created_at') paginator = Paginator(payments, 25) page_number = request.GET.get('page') payments = paginator.get_page(page_number) return render(request, 'core/customer_payments.html', {'payments': payments}) @login_required def customer_payment_receipt(request, pk): payment = get_object_or_404(SalePayment, pk=pk) settings = SystemSetting.objects.first() return render(request, 'core/payment_receipt.html', { 'payment': payment, 'settings': settings, 'amount_in_words': number_to_words_en(payment.amount) }) @login_required def sale_receipt(request, pk): sale = get_object_or_404(Sale, pk=pk) settings = SystemSetting.objects.first() return render(request, 'core/sale_receipt.html', { 'sale': sale, 'settings': settings }) @csrf_exempt def pos_sync_update(request): # Placeholder for POS sync logic return JsonResponse({'status': 'ok'}) @csrf_exempt def pos_sync_state(request): # Placeholder for POS sync state return JsonResponse({'state': {}}) @login_required def test_whatsapp_connection(request): settings = SystemSetting.objects.first() if not settings or not settings.wablas_enabled: return JsonResponse({'success': False, 'message': 'WhatsApp not enabled'}) return JsonResponse({'success': True, 'message': 'Connection simulation successful'}) @login_required def add_device(request): if request.method == 'POST': name = request.POST.get('name') device_type = request.POST.get('device_type') connection_type = request.POST.get('connection_type') ip_address = request.POST.get('ip_address') port = request.POST.get('port') is_active = request.POST.get('is_active') == 'on' Device.objects.create( name=name, device_type=device_type, connection_type=connection_type, ip_address=ip_address if ip_address else None, port=port if port else None, is_active=is_active ) messages.success(request, _("Device added successfully!")) return redirect(reverse('settings') + '#devices') @login_required def edit_device(request, pk): device = get_object_or_404(Device, pk=pk) if request.method == 'POST': device.name = request.POST.get('name') device.device_type = request.POST.get('device_type') device.connection_type = request.POST.get('connection_type') device.ip_address = request.POST.get('ip_address') device.port = request.POST.get('port') device.is_active = request.POST.get('is_active') == 'on' if not device.ip_address: device.ip_address = None if not device.port: device.port = None device.save() messages.success(request, _("Device updated successfully!")) return redirect(reverse('settings') + '#devices') @login_required def delete_device(request, pk): device = get_object_or_404(Device, pk=pk) device.delete() messages.success(request, _("Device deleted successfully!")) return redirect(reverse('settings') + '#devices') # LPO Views (Placeholders/Basic Implementation) @login_required def lpo_list(request): lpos = PurchaseOrder.objects.all().order_by('-created_at') return render(request, 'core/lpo_list.html', {'lpos': lpos}) @login_required def lpo_create(request): suppliers = Supplier.objects.all() products = Product.objects.filter(is_active=True) return render(request, 'core/lpo_create.html', {'suppliers': suppliers, 'products': products}) @login_required def lpo_detail(request, pk): lpo = get_object_or_404(PurchaseOrder, pk=pk) settings = SystemSetting.objects.first() return render(request, 'core/lpo_detail.html', {'lpo': lpo, 'settings': settings}) @login_required def convert_lpo_to_purchase(request, pk): lpo = get_object_or_404(PurchaseOrder, pk=pk) # Conversion logic here (simplified) # ... return redirect('purchases') @login_required def lpo_delete(request, pk): lpo = get_object_or_404(PurchaseOrder, pk=pk) lpo.delete() return redirect('lpo_list') @csrf_exempt @login_required def create_lpo_api(request): # API logic for LPO creation return JsonResponse({'success': True, 'lpo_id': 1}) # Dummy @login_required def cashier_registry(request): registries = CashierCounterRegistry.objects.all() return render(request, 'core/cashier_registry.html', {'registries': registries}) # Session Views @login_required def cashier_session_list(request): sessions = CashierSession.objects.all().order_by('-start_time') return render(request, 'core/session_list.html', {'sessions': sessions}) @login_required def start_session(request): if request.method == 'POST': opening_balance = request.POST.get('opening_balance', 0) # Find assigned counter registry = CashierCounterRegistry.objects.filter(cashier=request.user).first() counter = registry.counter if registry else None CashierSession.objects.create( user=request.user, counter=counter, opening_balance=opening_balance, status='active' ) return redirect('pos') return render(request, 'core/start_session.html') @login_required def close_session(request): session = CashierSession.objects.filter(user=request.user, status='active').first() if request.method == 'POST' and session: closing_balance = request.POST.get('closing_balance', 0) notes = request.POST.get('notes', '') session.closing_balance = closing_balance session.notes = notes session.end_time = timezone.now() session.status = 'closed' session.save() return redirect('index') return render(request, 'core/close_session.html', {'session': session}) @login_required def session_detail(request, pk): session = get_object_or_404(CashierSession, pk=pk) return render(request, 'core/session_detail.html', {'session': session}) @login_required def customer_display(request): return render(request, 'core/customer_display.html') """ with open(file_path, 'r') as f: content = f.read() # Check if the file ends with the broken function if content.strip().endswith("line_total=item['line_total']\n )"): print("Found broken file end. Appending missing code.") with open(file_path, 'a') as f: f.write(missing_code) print("Successfully restored core/views.py") else: print("File does not end as expected. Please check manually.") # Force append if it looks like it's missing the new functions if "def start_session" not in content: print("Appending missing functions anyway...") with open(file_path, 'a') as f: f.write(missing_code)