mejor diseño y validacion en fecha

main
FranciscoBorja12 10 months ago
parent 2a87fe9898
commit 22cc7a5e37
  1. BIN
      tasks/__pycache__/forms.cpython-313.pyc
  2. BIN
      tasks/__pycache__/views.cpython-313.pyc
  3. 15
      tasks/forms.py
  4. 130
      tasks/templates/base.html
  5. 52
      tasks/templates/cuentas.html
  6. 115
      tasks/templates/index.html
  7. 102
      tasks/templates/lista_cuentas.html
  8. 94
      tasks/templates/lista_movimientos.html
  9. 164
      tasks/templates/movimiento.html
  10. 159
      tasks/templates/singup.html
  11. 11
      tasks/views.py

@ -1,5 +1,7 @@
from django import forms from django import forms
from .models import Cuenta, Movimientos, TipoMovimiento from .models import Cuenta, Movimientos, TipoMovimiento
from django.core.exceptions import ValidationError
from datetime import datetime
class RegistroCuentaForm(forms.ModelForm): class RegistroCuentaForm(forms.ModelForm):
class Meta: class Meta:
@ -18,11 +20,13 @@ class RegistroMovimientosForm(forms.ModelForm):
) )
fecha_factura = forms.DateField( fecha_factura = forms.DateField(
widget=forms.DateInput( widget=forms.DateInput(
attrs={'type': 'date', 'class': 'form-control'} attrs={'type': 'date', 'class': 'form-control',
'max': datetime.now().strftime('%Y-%m-%dT%H:%M')}
), ),
label="Fecha de factura", label="Fecha de factura",
) )
class Meta: class Meta:
model = Movimientos model = Movimientos
fields = ['tipo_movimiento','fecha_factura', 'saldo','n_factura', 'observacion','proveedor','responsable_cuenta'] fields = ['tipo_movimiento','fecha_factura', 'saldo','n_factura', 'observacion','proveedor','responsable_cuenta']
@ -33,4 +37,9 @@ class RegistroMovimientosForm(forms.ModelForm):
'proveedor': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Nombre del proveedor'}), 'proveedor': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Nombre del proveedor'}),
'responsable_cuenta': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Nombre del responsable'}), 'responsable_cuenta': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Nombre del responsable'}),
} }
def clean_fecha_factura(self):
fecha_factura = self.cleaned_data.get('fecha_factura')
if fecha_factura > datetime.now().date():
raise ValidationError("La fecha no puede ser en el futuro.")
return fecha_factura

@ -3,75 +3,105 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Registro{% endblock %}</title> <title>{% block title %}Registro de presupuestos{% endblock %}</title>
<!-- Bootstrap y FontAwesome -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" rel="stylesheet">
<style>
/* Estilos personalizados */
.navbar {
background-color: #5bc0de; /* Azul más claro */
}
.navbar-brand {
font-size: 1.5rem;
font-weight: bold;
}
.nav-link {
font-size: 1.1rem;
font-weight: 500;
}
.nav-link:hover {
color: #fff !important;
}
.container {
min-height: 80vh;
display: flex;
flex-direction: column;
}
.content {
flex: 1;
}
.footer {
background-color: #5bc0de;
color: white;
padding: 1rem;
text-align: center;
font-weight: 500;
margin-top: auto;
}
.btn-primary {
background-color: #007bff;
border-color: #007bff;
}
.btn-secondary {
background-color: #6c757d;
border-color: #6c757d;
}
.btn-outline-light {
border-color: #fff;
color: #fff;
}
.btn-outline-light:hover {
background-color: rgba(255, 255, 255, 0.2);
}
</style>
</head> </head>
<style>
.badge-success {
background-color: #28a745;
}
.badge-warning {
background-color: #ffc107;
}
.badge-danger {
background-color: #dc3545;
}
.table-striped tbody tr:nth-of-type(odd) {
background-color: #f9f9f9;
}
.btn-primary {
background-color: #007bff;
border-color: #007bff;
}
.btn-secondary {
background-color: #6c757d;
border-color: #6c757d;
}
.btn-sm {
font-size: 0.875rem;
}
html, body {
height: 100%;
margin: 0;
}
.container {
min-height: 80%;
display: flex;
flex-direction: column;
}
.footer {
margin-top: auto;
}
</style>
<body> <body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <!-- Navbar -->
<nav class="navbar navbar-expand-lg navbar-dark">
<div class="container-fluid"> <div class="container-fluid">
<a class="navbar-brand">Registro</a> <a class="navbar-brand">Registro de presupuestos</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="navbarNav"> <div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto"> <ul class="navbar-nav ms-auto">
{% if user.is_authenticated %} {% if user.is_authenticated %}
<li class="nav-item"><a class="nav-link" href="{% url 'lista_cuentas' %}">Nuevo registro de cuenta</a></li> <li class="nav-item">
<li class="nav-item"><a class="nav-link" href="{% url 'signout' %}">Cerrar Sesión</a></li> <a class="nav-link" href="{% url 'lista_cuentas' %}">
<i class="fas fa-user-plus"></i> Nueva Cuenta
</a>
</li>
<li class="nav-item">
<a class="nav-link btn btn-outline-light px-3 py-1 rounded-pill" href="{% url 'signout' %}">
<i class="fas fa-sign-out-alt"></i> Cerrar Sesión
</a>
</li>
{% else %} {% else %}
<li class="nav-item"><a class="nav-link" href="{% url 'signin' %}">Inicio de Sesión</a></li> <li class="nav-item">
<a class="nav-link btn btn-outline-light px-3 py-1 rounded-pill" href="{% url 'signin' %}">
<i class="fas fa-sign-in-alt"></i> Iniciar Sesión
</a>
</li>
{% endif %} {% endif %}
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<div class="container mt-4">
{% block content %} <!-- Contenido principal -->
{% endblock %} <div class="container mt-4 content">
{% block content %}{% endblock %}
</div> </div>
<footer class="bg-dark text-white text-center py-3 mt-4">
<p>© 2025 registro</p> <!-- Footer -->
<footer class="footer">
<p>© 2025 Registro de presupuestos | Todos los derechos reservados</p>
</footer> </footer>
<!-- Scripts Bootstrap -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body> </body>
</html> </html>

@ -1,21 +1,47 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% block content %} {% block content %}
<style>
.bg-custom-lightblue {
background-color: #5bc0de; /* Color azul claro personalizado */
}
</style>
<div class="container mt-5"> <div class="container mt-5">
<div class="card shadow-lg"> <div class="row justify-content-center">
<div class="card-header bg-primary text-white"> <div class="col-md-6">
<h3>Registrar Nueva Cuenta</h3> <div class="card shadow-lg rounded-4">
</div> <div class="card-header bg-custom-lightblue text-white text-center">
<div class="card-body"> <h3 class="mb-0">Registrar Nueva Cuenta</h3>
<form method="POST"> </div>
{% csrf_token %} <div class="card-body p-4">
{{ form.as_p }} <form method="POST" class="needs-validation" novalidate>
{% csrf_token %}
<button type="submit" class="btn btn-success">Guardar</button>
<a href="{% url 'lista_cuentas' %}" class="btn btn-secondary">Cancelar</a> <!-- Estilización de los campos -->
</form> {% for field in form %}
<div class="mb-3">
<label for="{{ field.id_for_label }}" class="form-label fw-semibold">
{{ field.label }}
</label>
{{ field }}
{% if field.help_text %}
<small class="text-muted">{{ field.help_text }}</small>
{% endif %}
{% for error in field.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
</div>
{% endfor %}
<!-- Botones -->
<div class="d-flex justify-content-end mt-4 gap-2">
<a href="{% url 'lista_cuentas' %}" class="btn btn-secondary">Cancelar</a>
<button type="submit" class="btn btn-success">Guardar</button>
</div>
</form>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

@ -1,80 +1,93 @@
{% extends "Base.html" %} {% extends "base.html" %}
{% block content %} {% block content %}
{% if user.is_authenticated %} {% if not user.is_authenticated %}
{% else %}
<style> <style>
/* Fondo con degradado */
body { body {
background: #2c2f36; /* Color de fondo oscuro */ background: linear-gradient(to right, #2c3e50, #34495e);
color: #fff; /* Texto en blanco para contraste */ color: #fff;
} }
/* Tarjeta de login */
.card { .card {
background-color: #ffffff; /* Fondo blanco para el formulario */ background-color: #ffffff;
border-radius: 12px; border-radius: 15px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.2);
} }
.card-body { .card-body {
padding: 30px; padding: 35px;
} }
/* Etiquetas del formulario */
.form-label { .form-label {
color: #333; /* Color de las etiquetas */ color: #333;
font-weight: bold;
} }
/* Inputs con bordes redondeados */
.form-control {
border-radius: 10px;
box-shadow: none;
transition: 0.3s ease;
}
.form-control:focus {
border-color: #5bc0de;
box-shadow: 0px 0px 8px rgba(91, 192, 222, 0.8);
}
/* Botón de inicio de sesión */
.btn-primary { .btn-primary {
background-color: #007bff; /* Botón azul */ background-color: #5bc0de;
border-color: #007bff; border-color: #5bc0de;
border-radius: 10px;
font-size: 16px;
letter-spacing: 1px;
font-weight: bold;
} }
.btn-primary:hover { .btn-primary:hover {
background-color: #0056b3; /* Color al pasar el ratón */ background-color: #39b3d7;
border-color: #0056b3; border-color: #39b3d7;
}
.alert {
background-color: #f8d7da; /* Fondo rojo suave para los errores */
border-color: #f5c6cb;
} }
.alert p { /* Enlace de registro */
margin-bottom: 0; .text-muted:hover {
color: #5bc0de !important;
} }
</style> </style>
<div class="container-fluid p-0" style="height: 100vh; background-color: #2c2f36;">
<div class="d-flex justify-content-center align-items-center" style="height: 100vh;">
<div class="card shadow-lg p-4" style="max-width: 400px; border-radius: 12px; background-color: #ffffff;">
<div class="card-body">
<h3 class="text-center mb-4" style="color: #333;">Iniciar Sesión</h3>
<form method="post"> <!-- Contenedor principal -->
{% csrf_token %} <div class="container-fluid d-flex justify-content-center align-items-center" style="height: 100vh;">
<div class="mb-3"> <div class="card shadow-lg p-4" style="max-width: 400px;">
<label for="username" class="form-label" style="color: #333;">Nombre de Usuario</label> <div class="card-body">
<input type="text" class="form-control" id="username" name="username" required <h3 class="text-center mb-4" style="color: #333;">Iniciar Sesión</h3>
style="border-radius: 10px; box-shadow: none; transition: all 0.3s ease;">
</div>
<div class="mb-3"> <form method="post">
<label for="password" class="form-label" style="color: #333;">Contraseña</label> {% csrf_token %}
<input type="password" class="form-control" id="password" name="password" required <div class="mb-3">
style="border-radius: 10px; box-shadow: none; transition: all 0.3s ease;"> <label for="username" class="form-label">Nombre de Usuario</label>
</div> <input type="text" class="form-control" id="username" name="username" required>
</div>
<button type="submit" class="btn btn-dark w-100" style="border-radius: 10px; font-size: 16px; letter-spacing: 1px;"> <div class="mb-3">
Iniciar Sesión <label for="password" class="form-label">Contraseña</label>
</button> <input type="password" class="form-control" id="password" name="password" required>
</form>
<div class="text-center mt-3">
<a href="{% url 'signup' %}" class="text-muted" style="font-size: 14px;">Registrar</a>
</div> </div>
<button type="submit" class="btn btn-primary w-100">
<i class="fas fa-sign-in-alt"></i> Iniciar Sesión
</button>
</form>
<div class="text-center mt-3">
<a href="{% url 'signup' %}" class="text-muted">Registrarse</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% endblock %}
{% endblock %}
{% block footer %} {% block footer %}
<footer class="footer mt-auto py-3 bg-dark text-white"> <footer class="footer mt-auto py-3 bg-dark text-white text-center">
<div class="container"> <div class="container">
<span class="text-muted">© 2024 Mi Aplicación. Todos los derechos reservados.</span> <span>© 2025 Registro | Todos los derechos reservados</span>
</div> </div>
</footer> </footer>
{% endblock %} {% endblock %}

@ -1,54 +1,64 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% block content %} {% block content %}
<div class="container mt-5"> <div class="container mt-4">
<h2>Lista de Cuentas</h2> <div class="d-flex justify-content-between align-items-center mb-4">
<div class="d-flex gap-2 mb-3"> <h2 class="text-primary fw-bold">Lista de Cuentas</h2>
{% if es_superusuario %} {% if es_superusuario %}
<a href="{% url 'lista_cuentas' %}?todas=1" class="btn btn-secondary"> <div class="btn-group">
Ver Todas las Cuentas <a href="{% url 'lista_cuentas' %}?todas=1" class="btn btn-outline-primary">Ver Todas</a>
</a> <a href="{% url 'lista_cuentas' %}" class="btn btn-outline-secondary">Mis Cuentas</a>
<a href="{% url 'lista_cuentas' %}" class="btn btn-secondary"> </div>
Ver Mis Cuentas
</a>
{% endif %} {% endif %}
</div> </div>
<div class="table-responsive">
<table class="table table-striped"> <div class="card shadow-sm">
<thead> <div class="card-body">
<tr> <div class="table-responsive">
<th>Nombre</th> <table class="table table-hover align-middle">
<th>Saldo</th> <thead class="table-primary">
<th>Responsable</th> <tr>
<th>Fecha Creación</th> <th>Nombre</th>
<th>Observaciones</th> <th>Saldo</th>
<th>Acciones</th> <th>Responsable</th>
</tr> <th>Fecha Creación</th>
</thead> <th>Observaciones</th>
<tbody> <th class="text-center">Acciones</th>
{% for cuenta in cuentas %} </tr>
<tr> </thead>
<td>{{ cuenta.cuenta }}</td> <tbody>
<td>{{ cuenta.saldo }}</td> {% for cuenta in cuentas %}
<td>{{ cuenta.responsable.username }}</td> <tr>
<td>{{ cuenta.fecha_creacion }}</td> <td class="fw-bold">{{ cuenta.cuenta }}</td>
<td>{{ cuenta.observacion }}</td> <td class="{% if cuenta.saldo < 0 %}text-danger{% else %}text-success{% endif %} fw-semibold">
<td> ${{ cuenta.saldo }}
<a href="{% url 'lista_movimientos' cuenta.id %}" class="btn btn-info btn-sm"> </td>
Ver Movimientos <td>{{ cuenta.responsable.username }}</td>
</a> <td>{{ cuenta.fecha_creacion|date:"d/m/Y" }}</td>
<a href="{% url 'exportar_movimientos_excel' cuenta.id %}" class="btn btn-success btn-sm"> <td>{{ cuenta.observacion|default:"-" }}</td>
Exportar a Excel <td class="text-center">
</a> <a href="{% url 'lista_movimientos' cuenta.id %}" class="btn btn-sm btn-info">
</td> <i class="fas fa-list"></i> Movimientos
</tr> </a>
{% endfor %} <a href="{% url 'exportar_movimientos_excel' cuenta.id %}" class="btn btn-sm btn-success">
</tbody> <i class="fas fa-file-excel"></i> Exportar
</table> </a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="6" class="text-center text-muted">No hay cuentas disponibles.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div> </div>
</div>
<a href="{% url 'registrar_cuenta' %}" class="btn btn-success btn-lg rounded-circle position-fixed bottom-0 end-0 m-3 shadow-lg"> <a href="{% url 'registrar_cuenta' %}" class="btn btn-success btn-lg rounded-circle position-fixed bottom-0 end-0 m-4 shadow-lg d-flex align-items-center justify-content-center" style="width: 60px; height: 60px;">
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
</a> </a>
{% endblock %}
{% endblock %}

@ -1,49 +1,59 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% block content %} {% block content %}
<div class="container mt-5"> <div class="container mt-4">
<h2>Movimientos de la cuenta: {{ cuenta.cuenta }}</h2> <div class="d-flex justify-content-between align-items-center mb-4">
<div class="table-responsive"> <h2 class="text-primary fw-bold">Movimientos de la cuenta: {{ cuenta.cuenta }}</h2>
<table class="table table-striped"> </div>
<thead>
<tr> <div class="card shadow-sm">
<th>Tipo</th> <div class="card-body">
<th>Monto</th> <div class="table-responsive">
<th>Fecha</th> <table class="table table-hover align-middle">
<th>Observación</th> <thead class="table-primary">
<th># de factura</th> <tr>
<th>fecha de factura</th> <th>Tipo</th>
<th>responsable</th> <th>Monto</th>
<th>Acciones</th> <th>Fecha</th>
</tr> <th>Observación</th>
</thead> <th># de Factura</th>
<tbody> <th>Fecha de Factura</th>
{% for movimiento in movimientos %} <th>Responsable</th>
<tr> <th class="text-center">Acciones</th>
<td>{{ movimiento.tipo_movimiento }}</td> </tr>
<td>{{ movimiento.saldo }}</td> </thead>
<td>{{ movimiento.fecha_insersion }}</td> <tbody>
<td>{{ movimiento.observacion }}</td> {% for movimiento in movimientos %}
<td>{{ movimiento.n_factura }}</td> <tr>
<td>{{ movimiento.fecha_factura }}</td> <td class="fw-bold">{{ movimiento.tipo_movimiento }}</td>
<td>{{ movimiento.responsable_cuenta }}</td> <td class="{% if movimiento.tipo_movimiento.id == 2 %}text-danger{% else %}text-success{% endif %} fw-semibold">
<td> ${{ movimiento.saldo }}
<a href="{% url 'actualizar_movimiento' movimiento.id %}" class="btn btn-warning btn-sm"> </td>
Editar <td>{{ movimiento.fecha_insersion|date:"d/m/Y" }}</td>
</a> <td>{{ movimiento.observacion|default:"-" }}</td>
</td> <td>{{ movimiento.n_factura|default:"-" }}</td>
</tr> <td>{{ movimiento.fecha_factura|date:"d/m/Y"|default:"-" }}</td>
{% empty %} <td>{{ movimiento.responsable_cuenta }}</td>
<tr> <td class="text-center">
<td colspan="4" class="text-center">No hay movimientos registrados.</td> <a href="{% url 'actualizar_movimiento' movimiento.id %}" class="btn btn-sm btn-warning">
</tr> <i class="fas fa-edit"></i> Editar
{% endfor %} </a>
</tbody> </td>
</table> </tr>
</div> {% empty %}
<tr>
<td colspan="8" class="text-center text-muted">No hay movimientos registrados.</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div> </div>
<a href="{% url 'registrar_movimiento' cuenta.id %}" class="btn btn-success btn-lg rounded-circle position-fixed bottom-0 end-0 m-3 shadow-lg"> <a href="{% url 'registrar_movimiento' cuenta.id %}" class="btn btn-success btn-lg rounded-circle position-fixed bottom-0 end-0 m-4 shadow-lg d-flex align-items-center justify-content-center" style="width: 60px; height: 60px;">
<i class="fas fa-plus"></i> <i class="fas fa-plus"></i>
</a> </a>
{% endblock %}
{% endblock %}

@ -2,48 +2,134 @@
{% block content %} {% block content %}
<div class="container mt-5"> <div class="container mt-5">
<div class="card shadow-lg"> <div class="row justify-content-center">
<div class="card-header bg-info text-white"> <div class="col-md-8">
<h3>Registrar Nuevo Movimiento</h3> <div class="card shadow-lg rounded-4">
</div> <div class="card-header bg-info text-white text-center">
<div class="card-body"> <h3 class="mb-0">Registrar Nuevo Movimiento</h3>
<form method="POST">
{% csrf_token %}
<input type="hidden" name="cuentas" value="{{ cuenta.id }}"> <!-- Captura automática -->
<div class="mb-3">
<label class="form-label">Cuenta</label>
<input type="text" class="form-control" value="{{ cuenta.cuenta }} (Saldo: {{ cuenta.saldo }})" disabled>
</div>
<div class="mb-3">
<label for="id_tipo_movimiento" class="form-label">Tipo de Movimiento</label>
{{ form.tipo_movimiento }}
</div>
<div class="mb-3">
<label for="id_saldo" class="form-label">Monto</label>
{{ form.saldo }}
</div> </div>
<div class="mb-3"> <div class="card-body p-4">
<label for="id_observacion" class="form-label">Observación</label> <form method="POST">
{{ form.observacion }} {% csrf_token %}
</div> <input type="hidden" name="cuentas" value="{{ cuenta.id }}"> <!-- Captura automática -->
<div class="mb-3">
<label for="id_n_factura" class="form-label"># de factura</label> <!-- Errores globales -->
{{ form.n_factura }} {% if form.errors %}
</div> <div class="mb-3"> <div class="alert alert-danger">
<label for="id_fecha_factura" class="form-label">fecha de factura</label> <ul>
{{ form.fecha_factura }} {% for field in form %}
</div> <div class="mb-3"> {% for error in field.errors %}
<label for="proveedor" class="form-label">proveedor</label> <li>{{ error }}</li>
{{ form.proveedor }} {% endfor %}
</div> <div class="mb-3"> {% endfor %}
<label for="id_responsable_cuenta" class="form-label">responsable</label> </ul>
{{ form.responsable_cuenta }} </div>
{% endif %}
<!-- Cuenta (solo lectura) -->
<div class="mb-3">
<label class="form-label fw-semibold">Cuenta</label>
<input type="text" class="form-control" value="{{ cuenta.cuenta }} (Saldo: {{ cuenta.saldo }})" disabled>
</div>
<!-- Campos del formulario -->
<div class="row">
<div class="col-md-6 mb-3">
<label for="id_tipo_movimiento" class="form-label fw-semibold">Tipo de Movimiento</label>
{{ form.tipo_movimiento }}
{% if form.tipo_movimiento.errors %}
<div class="alert alert-danger mt-2">
{% for error in form.tipo_movimiento.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
</div>
<div class="col-md-6 mb-3">
<label for="id_saldo" class="form-label fw-semibold">Monto</label>
{{ form.saldo }}
{% if form.saldo.errors %}
<div class="alert alert-danger mt-2">
{% for error in form.saldo.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
</div>
</div>
<div class="mb-3">
<label for="id_observacion" class="form-label fw-semibold">Observación</label>
{{ form.observacion }}
{% if form.observacion.errors %}
<div class="alert alert-danger mt-2">
{% for error in form.observacion.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="id_n_factura" class="form-label fw-semibold"># de Factura</label>
{{ form.n_factura }}
{% if form.n_factura.errors %}
<div class="alert alert-danger mt-2">
{% for error in form.n_factura.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
</div>
<div class="col-md-6 mb-3">
<label for="id_fecha_factura" class="form-label fw-semibold">Fecha de Factura</label>
{{ form.fecha_factura }}
{% if form.fecha_factura.errors %}
<div class="alert alert-danger mt-2">
{% for error in form.fecha_factura.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
</div>
</div>
<div class="row">
<div class="col-md-6 mb-3">
<label for="proveedor" class="form-label fw-semibold">Proveedor</label>
{{ form.proveedor }}
{% if form.proveedor.errors %}
<div class="alert alert-danger mt-2">
{% for error in form.proveedor.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
</div>
<div class="col-md-6 mb-3">
<label for="id_responsable_cuenta" class="form-label fw-semibold">Responsable</label>
{{ form.responsable_cuenta }}
{% if form.responsable_cuenta.errors %}
<div class="alert alert-danger mt-2">
{% for error in form.responsable_cuenta.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
</div>
</div>
<!-- Botones -->
<div class="d-flex justify-content-end mt-4 gap-2">
<a href="{% url 'lista_movimientos' cuenta.id %}" class="btn btn-secondary">Cancelar</a>
<button type="submit" class="btn btn-success">Guardar</button>
</div>
</form>
</div> </div>
<button type="submit" class="btn btn-success">Guardar</button> </div>
<a href="{% url 'lista_movimientos' cuenta.id %}" class="btn btn-secondary">Cancelar</a>
</form>
</div> </div>
</div> </div>
</div> </div>
<br>
{% endblock %} {% endblock %}

@ -1,108 +1,121 @@
{% extends "Base.html" %} {% extends "Base.html" %}
{% block content %} {% block content %}
<style> <style>
body { body {
background: #2c2f36; /* Color de fondo oscuro */ background: #f0f4f8; /* Fondo azul claro */
color: #fff; /* Texto en blanco para contraste */ color: #333; /* Texto oscuro */
} }
.card { .card {
background-color: #ffffff; /* Fondo blanco para el formulario */ background-color: #ffffff; /* Tarjeta con fondo blanco */
border-radius: 12px; border-radius: 12px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
} max-width: 600px; /* Aumenté el ancho */
.card-body { width: 100%;
padding: 30px; padding: 30px;
} }
.form-label { .form-label {
color: #333; /* Color de las etiquetas */ color: #444; /* Color de etiquetas */
font-weight: 600;
} }
.btn-primary { .form-control {
background-color: #007bff; /* Botón azul */ border-radius: 8px;
border: 1px solid #ced4da;
padding: 12px;
transition: 0.3s;
font-size: 16px;
}
.form-control:focus {
border-color: #007bff; border-color: #007bff;
box-shadow: 0 0 5px rgba(0, 123, 255, 0.3);
}
.btn-primary {
background-color: #3b82f6; /* Azul claro */
border-color: #3b82f6;
font-size: 18px;
font-weight: 600;
border-radius: 8px;
padding: 12px;
transition: 0.3s;
} }
.btn-primary:hover { .btn-primary:hover {
background-color: #0056b3; /* Color al pasar el ratón */ background-color: #2563eb; /* Azul más oscuro al pasar el cursor */
border-color: #0056b3; border-color: #2563eb;
} }
.alert { .alert {
background-color: #f8d7da; /* Fondo rojo suave para los errores */ background-color: #f8d7da; /* Fondo rojo suave para errores */
border-color: #f5c6cb; border-color: #f5c6cb;
} font-size: 14px;
.alert p { padding: 10px;
margin-bottom: 0;
} }
</style> </style>
<div class="container"> <div class="container d-flex justify-content-center align-items-center" style="min-height: 90vh;">
<div class="row justify-content-center mt-5"> <div class="card shadow-lg">
<div class="col-md-6"> <div class="card-body">
<div class="card shadow-lg"> <h2 class="text-center mb-4" style="color: #222;">Registrar Nueva Cuenta</h2>
<div class="card-body">
<h2 class="text-center mb-4" style="color: #333;">Registrar Nueva Cuenta</h2>
<form method="POST"> <form method="POST">
{% csrf_token %} {% csrf_token %}
<div class="form-group mb-3">
<label for="username" class="form-label">Nombre de Usuario</label>
<input type="text" class="form-control" id="username" name="username" value="{{ form.username.value }}">
{% if form.username.errors %}
<div class="alert alert-danger mt-2">
{% for error in form.username.errors %}
<p>{{ error }}</p>
{% endfor %}
</div>
{% endif %}
</div>
<div class="form-group mb-3"> <div class="form-group mb-3">
<label for="email" class="form-label">Correo Electrónico</label> <label for="username" class="form-label">Nombre de Usuario</label>
<input type="email" class="form-control" id="email" name="email" value="{{ form.email.value }}"> <input type="text" class="form-control" id="username" name="username" value="{{ form.username.value|default:'' }}">
{% if form.email.errors %} {% if form.username.errors %}
<div class="alert alert-danger mt-2"> <div class="alert alert-danger mt-2">
{% for error in form.email.errors %} {% for error in form.username.errors %}
<p>{{ error }}</p> <p>{{ error }}</p>
{% endfor %} {% endfor %}
</div>
{% endif %}
</div> </div>
{% endif %}
</div>
<div class="form-group mb-3"> <div class="form-group mb-3">
<label for="password1" class="form-label">Contraseña</label> <label for="email" class="form-label">Correo Electrónico</label>
<input type="password" class="form-control" id="password1" name="password1" value="{{ form.password1.value }}"> <input type="email" class="form-control" id="email" name="email" value="{{ form.email.value|default:'' }}">
{% if form.password1.errors %} {% if form.email.errors %}
<div class="alert alert-danger mt-2"> <div class="alert alert-danger mt-2">
{% for error in form.password1.errors %} {% for error in form.email.errors %}
<p>{{ error }}</p> <p>{{ error }}</p>
{% endfor %} {% endfor %}
</div>
{% endif %}
</div> </div>
{% endif %}
</div>
<div class="form-group mb-3"> <div class="form-group mb-3">
<label for="password2" class="form-label">Confirmar Contraseña</label> <label for="password1" class="form-label">Contraseña</label>
<input type="password" class="form-control" id="password2" name="password2" value="{{ form.password2.value }}"> <input type="password" class="form-control" id="password1" name="password1">
{% if form.password2.errors %} {% if form.password1.errors %}
<div class="alert alert-danger mt-2"> <div class="alert alert-danger mt-2">
{% for error in form.password2.errors %} {% for error in form.password1.errors %}
<p>{{ error }}</p> <p>{{ error }}</p>
{% endfor %} {% endfor %}
</div>
{% endif %}
</div> </div>
{% endif %}
</div>
<div class="text-center"> <div class="form-group mb-3">
<button type="submit" class="btn btn-primary w-100">Registrar</button> <label for="password2" class="form-label">Confirmar Contraseña</label>
<input type="password" class="form-control" id="password2" name="password2">
{% if form.password2.errors %}
<div class="alert alert-danger mt-2">
{% for error in form.password2.errors %}
<p>{{ error }}</p>
{% endfor %}
</div> </div>
</form> {% endif %}
<div class="text-center mt-3">
<a href="{% url 'signin' %}" class="text-muted" style="font-size: 14px;">¿Ya tienes cuenta? Inicia sesión</a>
</div>
</div> </div>
<div class="text-center">
<button type="submit" class="btn btn-primary w-100">Registrar</button>
</div>
</form>
<div class="text-center mt-3">
<a href="{% url 'signin' %}" class="text-muted" style="font-size: 15px;">¿Ya tienes cuenta? Inicia sesión</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} <br>
{% endblock %}

@ -112,7 +112,10 @@ def registrar_movimiento(request, cuenta_id):
cuenta.save() cuenta.save()
movimiento.save() movimiento.save()
return redirect('lista_movimientos', cuenta_id=cuenta.id) return redirect('lista_movimientos', cuenta_id=cuenta.id) # Redirige si todo está bien
else:
# Si el formulario no es válido, muestra el formulario con los errores
return render(request, 'movimiento.html', {'form': form, 'cuenta': cuenta})
else: else:
form = RegistroMovimientosForm() form = RegistroMovimientosForm()
@ -145,12 +148,16 @@ def actualizar_movimiento(request, movimiento_id):
cuenta.save() # Guardar la cuenta con el saldo actualizado cuenta.save() # Guardar la cuenta con el saldo actualizado
nuevo_movimiento.save() # Guardar el movimiento nuevo_movimiento.save() # Guardar el movimiento
return redirect('lista_movimientos', cuenta_id=cuenta.id) return redirect('lista_movimientos', cuenta_id=cuenta.id) # Redirigir después de guardar
else:
# Si el formulario no es válido, muestra el formulario con los errores
return render(request, 'movimiento.html', {'form': form, 'cuenta': cuenta, 'movimiento': movimiento})
else: else:
form = RegistroMovimientosForm(instance=movimiento) form = RegistroMovimientosForm(instance=movimiento)
return render(request, 'movimiento.html', {'form': form, 'cuenta': cuenta, 'movimiento': movimiento}) return render(request, 'movimiento.html', {'form': form, 'cuenta': cuenta, 'movimiento': movimiento})
@login_required @login_required
def lista_cuentas(request): def lista_cuentas(request):
if request.user.is_superuser: if request.user.is_superuser:

Loading…
Cancel
Save