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 .models import Cuenta, Movimientos, TipoMovimiento
from django.core.exceptions import ValidationError
from datetime import datetime
class RegistroCuentaForm(forms.ModelForm):
class Meta:
@ -18,11 +20,13 @@ class RegistroMovimientosForm(forms.ModelForm):
)
fecha_factura = forms.DateField(
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",
)
class Meta:
model = Movimientos
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'}),
'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>
<meta charset="UTF-8">
<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://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>
<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>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<!-- Navbar -->
<nav class="navbar navbar-expand-lg navbar-dark">
<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">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ms-auto">
{% 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"><a class="nav-link" href="{% url 'signout' %}">Cerrar Sesión</a></li>
<li class="nav-item">
<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 %}
<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 %}
</ul>
</div>
</div>
</nav>
<div class="container mt-4">
{% block content %}
{% endblock %}
<!-- Contenido principal -->
<div class="container mt-4 content">
{% block content %}{% endblock %}
</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>
<!-- Scripts Bootstrap -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

@ -1,21 +1,47 @@
{% extends 'base.html' %}
{% block content %}
<style>
.bg-custom-lightblue {
background-color: #5bc0de; /* Color azul claro personalizado */
}
</style>
<div class="container mt-5">
<div class="card shadow-lg">
<div class="card-header bg-primary text-white">
<h3>Registrar Nueva Cuenta</h3>
</div>
<div class="card-body">
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-success">Guardar</button>
<a href="{% url 'lista_cuentas' %}" class="btn btn-secondary">Cancelar</a>
</form>
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card shadow-lg rounded-4">
<div class="card-header bg-custom-lightblue text-white text-center">
<h3 class="mb-0">Registrar Nueva Cuenta</h3>
</div>
<div class="card-body p-4">
<form method="POST" class="needs-validation" novalidate>
{% csrf_token %}
<!-- Estilización de los campos -->
{% 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>
{% endblock %}

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

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

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

@ -2,48 +2,134 @@
{% block content %}
<div class="container mt-5">
<div class="card shadow-lg">
<div class="card-header bg-info text-white">
<h3>Registrar Nuevo Movimiento</h3>
</div>
<div class="card-body">
<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 class="row justify-content-center">
<div class="col-md-8">
<div class="card shadow-lg rounded-4">
<div class="card-header bg-info text-white text-center">
<h3 class="mb-0">Registrar Nuevo Movimiento</h3>
</div>
<div class="mb-3">
<label for="id_observacion" class="form-label">Observación</label>
{{ form.observacion }}
</div>
<div class="mb-3">
<label for="id_n_factura" class="form-label"># de factura</label>
{{ form.n_factura }}
</div> <div class="mb-3">
<label for="id_fecha_factura" class="form-label">fecha de factura</label>
{{ form.fecha_factura }}
</div> <div class="mb-3">
<label for="proveedor" class="form-label">proveedor</label>
{{ form.proveedor }}
</div> <div class="mb-3">
<label for="id_responsable_cuenta" class="form-label">responsable</label>
{{ form.responsable_cuenta }}
<div class="card-body p-4">
<form method="POST">
{% csrf_token %}
<input type="hidden" name="cuentas" value="{{ cuenta.id }}"> <!-- Captura automática -->
<!-- Errores globales -->
{% if form.errors %}
<div class="alert alert-danger">
<ul>
{% for field in form %}
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
{% endfor %}
</ul>
</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>
<button type="submit" class="btn btn-success">Guardar</button>
<a href="{% url 'lista_movimientos' cuenta.id %}" class="btn btn-secondary">Cancelar</a>
</form>
</div>
</div>
</div>
</div>
<br>
{% endblock %}

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

@ -112,7 +112,10 @@ def registrar_movimiento(request, cuenta_id):
cuenta.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:
form = RegistroMovimientosForm()
@ -145,12 +148,16 @@ def actualizar_movimiento(request, movimiento_id):
cuenta.save() # Guardar la cuenta con el saldo actualizado
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:
form = RegistroMovimientosForm(instance=movimiento)
return render(request, 'movimiento.html', {'form': form, 'cuenta': cuenta, 'movimiento': movimiento})
@login_required
def lista_cuentas(request):
if request.user.is_superuser:

Loading…
Cancel
Save