60 lines
2.6 KiB
Python
60 lines
2.6 KiB
Python
from django import forms
|
|
|
|
from .models import PaymentConfirmation
|
|
|
|
|
|
class PaymentConfirmationForm(forms.ModelForm):
|
|
class Meta:
|
|
model = PaymentConfirmation
|
|
fields = [
|
|
"product",
|
|
"customer_name",
|
|
"customer_phone",
|
|
"customer_email",
|
|
"amount",
|
|
"method",
|
|
"reference",
|
|
"note",
|
|
"receipt",
|
|
]
|
|
widgets = {
|
|
"product": forms.Select(attrs={"class": "form-select"}),
|
|
"customer_name": forms.TextInput(attrs={"class": "form-control", "placeholder": "Tu nombre o negocio"}),
|
|
"customer_phone": forms.TextInput(attrs={"class": "form-control", "placeholder": "+53..."}),
|
|
"customer_email": forms.EmailInput(attrs={"class": "form-control", "placeholder": "correo@ejemplo.com"}),
|
|
"amount": forms.NumberInput(attrs={"class": "form-control", "min": "1", "step": "0.01", "placeholder": "Monto pagado"}),
|
|
"method": forms.Select(attrs={"class": "form-select"}),
|
|
"reference": forms.TextInput(attrs={"class": "form-control", "placeholder": "No. operación / referencia"}),
|
|
"note": forms.Textarea(attrs={"class": "form-control", "rows": 4, "placeholder": "Detalles útiles: fecha, banco, servicio solicitado..."}),
|
|
"receipt": forms.ClearableFileInput(attrs={"class": "form-control"}),
|
|
}
|
|
labels = {
|
|
"product": "Producto o servicio",
|
|
"customer_name": "Nombre",
|
|
"customer_phone": "Teléfono / WhatsApp",
|
|
"customer_email": "Correo (opcional)",
|
|
"amount": "Monto pagado",
|
|
"method": "Método de pago",
|
|
"reference": "Referencia de pago",
|
|
"note": "Nota para el equipo",
|
|
"receipt": "Comprobante (opcional)",
|
|
}
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.fields["product"].queryset = self.fields["product"].queryset.filter(is_active=True).select_related("category")
|
|
self.fields["product"].empty_label = "Selecciona un servicio"
|
|
|
|
def clean_customer_phone(self):
|
|
phone = self.cleaned_data["customer_phone"].strip()
|
|
digits = [char for char in phone if char.isdigit()]
|
|
if len(digits) < 8:
|
|
raise forms.ValidationError("Escribe un teléfono válido para poder contactarte.")
|
|
return phone
|
|
|
|
def clean_reference(self):
|
|
reference = self.cleaned_data["reference"].strip()
|
|
if len(reference) < 4:
|
|
raise forms.ValidationError("La referencia debe tener al menos 4 caracteres.")
|
|
return reference
|