coati-payroll 0.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of coati-payroll might be problematic. Click here for more details.
- coati_payroll/__init__.py +415 -0
- coati_payroll/app.py +95 -0
- coati_payroll/audit_helpers.py +904 -0
- coati_payroll/auth.py +123 -0
- coati_payroll/cli.py +1318 -0
- coati_payroll/config.py +219 -0
- coati_payroll/demo_data.py +813 -0
- coati_payroll/enums.py +278 -0
- coati_payroll/forms.py +1769 -0
- coati_payroll/formula_engine/__init__.py +81 -0
- coati_payroll/formula_engine/ast/__init__.py +110 -0
- coati_payroll/formula_engine/ast/ast_visitor.py +259 -0
- coati_payroll/formula_engine/ast/expression_evaluator.py +228 -0
- coati_payroll/formula_engine/ast/safe_operators.py +131 -0
- coati_payroll/formula_engine/ast/type_converter.py +172 -0
- coati_payroll/formula_engine/data_sources.py +752 -0
- coati_payroll/formula_engine/engine.py +247 -0
- coati_payroll/formula_engine/exceptions.py +52 -0
- coati_payroll/formula_engine/execution/__init__.py +24 -0
- coati_payroll/formula_engine/execution/execution_context.py +52 -0
- coati_payroll/formula_engine/execution/step_executor.py +62 -0
- coati_payroll/formula_engine/execution/variable_store.py +59 -0
- coati_payroll/formula_engine/novelty_codes.py +206 -0
- coati_payroll/formula_engine/results/__init__.py +20 -0
- coati_payroll/formula_engine/results/execution_result.py +59 -0
- coati_payroll/formula_engine/steps/__init__.py +30 -0
- coati_payroll/formula_engine/steps/assignment_step.py +71 -0
- coati_payroll/formula_engine/steps/base_step.py +48 -0
- coati_payroll/formula_engine/steps/calculation_step.py +42 -0
- coati_payroll/formula_engine/steps/conditional_step.py +122 -0
- coati_payroll/formula_engine/steps/step_factory.py +58 -0
- coati_payroll/formula_engine/steps/tax_lookup_step.py +45 -0
- coati_payroll/formula_engine/tables/__init__.py +24 -0
- coati_payroll/formula_engine/tables/bracket_calculator.py +51 -0
- coati_payroll/formula_engine/tables/table_lookup.py +161 -0
- coati_payroll/formula_engine/tables/tax_table.py +32 -0
- coati_payroll/formula_engine/validation/__init__.py +24 -0
- coati_payroll/formula_engine/validation/schema_validator.py +37 -0
- coati_payroll/formula_engine/validation/security_validator.py +52 -0
- coati_payroll/formula_engine/validation/tax_table_validator.py +205 -0
- coati_payroll/formula_engine_examples.py +153 -0
- coati_payroll/i18n.py +54 -0
- coati_payroll/initial_data.py +613 -0
- coati_payroll/interes_engine.py +450 -0
- coati_payroll/liquidacion_engine/__init__.py +25 -0
- coati_payroll/liquidacion_engine/engine.py +267 -0
- coati_payroll/locale_config.py +165 -0
- coati_payroll/log.py +138 -0
- coati_payroll/model.py +2410 -0
- coati_payroll/nomina_engine/__init__.py +87 -0
- coati_payroll/nomina_engine/calculators/__init__.py +30 -0
- coati_payroll/nomina_engine/calculators/benefit_calculator.py +79 -0
- coati_payroll/nomina_engine/calculators/concept_calculator.py +254 -0
- coati_payroll/nomina_engine/calculators/deduction_calculator.py +105 -0
- coati_payroll/nomina_engine/calculators/exchange_rate_calculator.py +51 -0
- coati_payroll/nomina_engine/calculators/perception_calculator.py +75 -0
- coati_payroll/nomina_engine/calculators/salary_calculator.py +86 -0
- coati_payroll/nomina_engine/domain/__init__.py +27 -0
- coati_payroll/nomina_engine/domain/calculation_items.py +52 -0
- coati_payroll/nomina_engine/domain/employee_calculation.py +53 -0
- coati_payroll/nomina_engine/domain/payroll_context.py +44 -0
- coati_payroll/nomina_engine/engine.py +188 -0
- coati_payroll/nomina_engine/processors/__init__.py +28 -0
- coati_payroll/nomina_engine/processors/accounting_processor.py +171 -0
- coati_payroll/nomina_engine/processors/accumulation_processor.py +90 -0
- coati_payroll/nomina_engine/processors/loan_processor.py +227 -0
- coati_payroll/nomina_engine/processors/novelty_processor.py +42 -0
- coati_payroll/nomina_engine/processors/vacation_processor.py +67 -0
- coati_payroll/nomina_engine/repositories/__init__.py +32 -0
- coati_payroll/nomina_engine/repositories/acumulado_repository.py +83 -0
- coati_payroll/nomina_engine/repositories/base_repository.py +40 -0
- coati_payroll/nomina_engine/repositories/config_repository.py +102 -0
- coati_payroll/nomina_engine/repositories/employee_repository.py +34 -0
- coati_payroll/nomina_engine/repositories/exchange_rate_repository.py +58 -0
- coati_payroll/nomina_engine/repositories/novelty_repository.py +54 -0
- coati_payroll/nomina_engine/repositories/planilla_repository.py +52 -0
- coati_payroll/nomina_engine/results/__init__.py +24 -0
- coati_payroll/nomina_engine/results/error_result.py +28 -0
- coati_payroll/nomina_engine/results/payroll_result.py +53 -0
- coati_payroll/nomina_engine/results/validation_result.py +39 -0
- coati_payroll/nomina_engine/services/__init__.py +22 -0
- coati_payroll/nomina_engine/services/accounting_voucher_service.py +708 -0
- coati_payroll/nomina_engine/services/employee_processing_service.py +173 -0
- coati_payroll/nomina_engine/services/payroll_execution_service.py +374 -0
- coati_payroll/nomina_engine/services/snapshot_service.py +295 -0
- coati_payroll/nomina_engine/validators/__init__.py +31 -0
- coati_payroll/nomina_engine/validators/base_validator.py +48 -0
- coati_payroll/nomina_engine/validators/currency_validator.py +50 -0
- coati_payroll/nomina_engine/validators/employee_validator.py +87 -0
- coati_payroll/nomina_engine/validators/period_validator.py +44 -0
- coati_payroll/nomina_engine/validators/planilla_validator.py +136 -0
- coati_payroll/plugin_manager.py +176 -0
- coati_payroll/queue/__init__.py +33 -0
- coati_payroll/queue/driver.py +127 -0
- coati_payroll/queue/drivers/__init__.py +22 -0
- coati_payroll/queue/drivers/dramatiq_driver.py +268 -0
- coati_payroll/queue/drivers/huey_driver.py +390 -0
- coati_payroll/queue/drivers/noop_driver.py +54 -0
- coati_payroll/queue/selector.py +121 -0
- coati_payroll/queue/tasks.py +764 -0
- coati_payroll/rate_limiting.py +83 -0
- coati_payroll/rbac.py +183 -0
- coati_payroll/report_engine.py +512 -0
- coati_payroll/report_export.py +208 -0
- coati_payroll/schema_validator.py +167 -0
- coati_payroll/security.py +77 -0
- coati_payroll/static/styles.css +1044 -0
- coati_payroll/system_reports.py +573 -0
- coati_payroll/templates/auth/login.html +189 -0
- coati_payroll/templates/base.html +283 -0
- coati_payroll/templates/index.html +227 -0
- coati_payroll/templates/macros.html +146 -0
- coati_payroll/templates/modules/calculation_rule/form.html +78 -0
- coati_payroll/templates/modules/calculation_rule/index.html +102 -0
- coati_payroll/templates/modules/calculation_rule/schema_editor.html +1159 -0
- coati_payroll/templates/modules/carga_inicial_prestacion/form.html +170 -0
- coati_payroll/templates/modules/carga_inicial_prestacion/index.html +170 -0
- coati_payroll/templates/modules/carga_inicial_prestacion/reporte.html +193 -0
- coati_payroll/templates/modules/config_calculos/index.html +44 -0
- coati_payroll/templates/modules/configuracion/index.html +90 -0
- coati_payroll/templates/modules/currency/form.html +47 -0
- coati_payroll/templates/modules/currency/index.html +64 -0
- coati_payroll/templates/modules/custom_field/form.html +62 -0
- coati_payroll/templates/modules/custom_field/index.html +78 -0
- coati_payroll/templates/modules/deduccion/form.html +1 -0
- coati_payroll/templates/modules/deduccion/index.html +1 -0
- coati_payroll/templates/modules/employee/form.html +254 -0
- coati_payroll/templates/modules/employee/index.html +76 -0
- coati_payroll/templates/modules/empresa/form.html +74 -0
- coati_payroll/templates/modules/empresa/index.html +71 -0
- coati_payroll/templates/modules/exchange_rate/form.html +47 -0
- coati_payroll/templates/modules/exchange_rate/import.html +93 -0
- coati_payroll/templates/modules/exchange_rate/index.html +114 -0
- coati_payroll/templates/modules/liquidacion/index.html +58 -0
- coati_payroll/templates/modules/liquidacion/nueva.html +51 -0
- coati_payroll/templates/modules/liquidacion/ver.html +91 -0
- coati_payroll/templates/modules/payroll_concepts/audit_log.html +146 -0
- coati_payroll/templates/modules/percepcion/form.html +1 -0
- coati_payroll/templates/modules/percepcion/index.html +1 -0
- coati_payroll/templates/modules/planilla/config.html +190 -0
- coati_payroll/templates/modules/planilla/config_deducciones.html +129 -0
- coati_payroll/templates/modules/planilla/config_empleados.html +116 -0
- coati_payroll/templates/modules/planilla/config_percepciones.html +113 -0
- coati_payroll/templates/modules/planilla/config_prestaciones.html +118 -0
- coati_payroll/templates/modules/planilla/config_reglas.html +120 -0
- coati_payroll/templates/modules/planilla/ejecutar_nomina.html +106 -0
- coati_payroll/templates/modules/planilla/form.html +197 -0
- coati_payroll/templates/modules/planilla/index.html +144 -0
- coati_payroll/templates/modules/planilla/listar_nominas.html +91 -0
- coati_payroll/templates/modules/planilla/log_nomina.html +135 -0
- coati_payroll/templates/modules/planilla/novedades/form.html +177 -0
- coati_payroll/templates/modules/planilla/novedades/index.html +170 -0
- coati_payroll/templates/modules/planilla/ver_nomina.html +477 -0
- coati_payroll/templates/modules/planilla/ver_nomina_empleado.html +231 -0
- coati_payroll/templates/modules/plugins/index.html +71 -0
- coati_payroll/templates/modules/prestacion/form.html +1 -0
- coati_payroll/templates/modules/prestacion/index.html +1 -0
- coati_payroll/templates/modules/prestacion_management/dashboard.html +150 -0
- coati_payroll/templates/modules/prestacion_management/initial_balance_bulk.html +195 -0
- coati_payroll/templates/modules/prestamo/approve.html +156 -0
- coati_payroll/templates/modules/prestamo/condonacion.html +249 -0
- coati_payroll/templates/modules/prestamo/detail.html +443 -0
- coati_payroll/templates/modules/prestamo/form.html +203 -0
- coati_payroll/templates/modules/prestamo/index.html +150 -0
- coati_payroll/templates/modules/prestamo/pago_extraordinario.html +211 -0
- coati_payroll/templates/modules/prestamo/tabla_pago_pdf.html +181 -0
- coati_payroll/templates/modules/report/admin_index.html +125 -0
- coati_payroll/templates/modules/report/detail.html +129 -0
- coati_payroll/templates/modules/report/execute.html +266 -0
- coati_payroll/templates/modules/report/index.html +95 -0
- coati_payroll/templates/modules/report/permissions.html +64 -0
- coati_payroll/templates/modules/settings/index.html +274 -0
- coati_payroll/templates/modules/shared/concept_form.html +201 -0
- coati_payroll/templates/modules/shared/concept_index.html +145 -0
- coati_payroll/templates/modules/tipo_planilla/form.html +70 -0
- coati_payroll/templates/modules/tipo_planilla/index.html +68 -0
- coati_payroll/templates/modules/user/form.html +65 -0
- coati_payroll/templates/modules/user/index.html +76 -0
- coati_payroll/templates/modules/user/profile.html +81 -0
- coati_payroll/templates/modules/vacation/account_detail.html +149 -0
- coati_payroll/templates/modules/vacation/account_form.html +52 -0
- coati_payroll/templates/modules/vacation/account_index.html +68 -0
- coati_payroll/templates/modules/vacation/dashboard.html +156 -0
- coati_payroll/templates/modules/vacation/initial_balance_bulk.html +149 -0
- coati_payroll/templates/modules/vacation/initial_balance_form.html +93 -0
- coati_payroll/templates/modules/vacation/leave_request_detail.html +158 -0
- coati_payroll/templates/modules/vacation/leave_request_form.html +61 -0
- coati_payroll/templates/modules/vacation/leave_request_index.html +98 -0
- coati_payroll/templates/modules/vacation/policy_detail.html +176 -0
- coati_payroll/templates/modules/vacation/policy_form.html +152 -0
- coati_payroll/templates/modules/vacation/policy_index.html +79 -0
- coati_payroll/templates/modules/vacation/register_taken_form.html +178 -0
- coati_payroll/translations/en/LC_MESSAGES/messages.mo +0 -0
- coati_payroll/translations/en/LC_MESSAGES/messages.po +7283 -0
- coati_payroll/translations/es/LC_MESSAGES/messages.mo +0 -0
- coati_payroll/translations/es/LC_MESSAGES/messages.po +7374 -0
- coati_payroll/vacation_service.py +451 -0
- coati_payroll/version.py +18 -0
- coati_payroll/vistas/__init__.py +64 -0
- coati_payroll/vistas/calculation_rule.py +307 -0
- coati_payroll/vistas/carga_inicial_prestacion.py +423 -0
- coati_payroll/vistas/config_calculos.py +72 -0
- coati_payroll/vistas/configuracion.py +87 -0
- coati_payroll/vistas/constants.py +17 -0
- coati_payroll/vistas/currency.py +112 -0
- coati_payroll/vistas/custom_field.py +120 -0
- coati_payroll/vistas/employee.py +305 -0
- coati_payroll/vistas/empresa.py +153 -0
- coati_payroll/vistas/exchange_rate.py +341 -0
- coati_payroll/vistas/liquidacion.py +205 -0
- coati_payroll/vistas/payroll_concepts.py +580 -0
- coati_payroll/vistas/planilla/__init__.py +38 -0
- coati_payroll/vistas/planilla/association_routes.py +238 -0
- coati_payroll/vistas/planilla/config_routes.py +158 -0
- coati_payroll/vistas/planilla/export_routes.py +175 -0
- coati_payroll/vistas/planilla/helpers/__init__.py +34 -0
- coati_payroll/vistas/planilla/helpers/association_helpers.py +161 -0
- coati_payroll/vistas/planilla/helpers/excel_helpers.py +29 -0
- coati_payroll/vistas/planilla/helpers/form_helpers.py +97 -0
- coati_payroll/vistas/planilla/nomina_routes.py +488 -0
- coati_payroll/vistas/planilla/novedad_routes.py +227 -0
- coati_payroll/vistas/planilla/routes.py +145 -0
- coati_payroll/vistas/planilla/services/__init__.py +26 -0
- coati_payroll/vistas/planilla/services/export_service.py +687 -0
- coati_payroll/vistas/planilla/services/nomina_service.py +233 -0
- coati_payroll/vistas/planilla/services/novedad_service.py +126 -0
- coati_payroll/vistas/planilla/services/planilla_service.py +34 -0
- coati_payroll/vistas/planilla/validators/__init__.py +18 -0
- coati_payroll/vistas/planilla/validators/planilla_validators.py +40 -0
- coati_payroll/vistas/plugins.py +45 -0
- coati_payroll/vistas/prestacion.py +272 -0
- coati_payroll/vistas/prestamo.py +808 -0
- coati_payroll/vistas/report.py +432 -0
- coati_payroll/vistas/settings.py +29 -0
- coati_payroll/vistas/tipo_planilla.py +134 -0
- coati_payroll/vistas/user.py +172 -0
- coati_payroll/vistas/vacation.py +1045 -0
- coati_payroll-0.0.2.dist-info/LICENSE +201 -0
- coati_payroll-0.0.2.dist-info/METADATA +581 -0
- coati_payroll-0.0.2.dist-info/RECORD +243 -0
- coati_payroll-0.0.2.dist-info/WHEEL +5 -0
- coati_payroll-0.0.2.dist-info/entry_points.txt +2 -0
- coati_payroll-0.0.2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Copyright 2025 BMO Soluciones, S.A.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
"""User CRUD routes."""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from flask import Blueprint, flash, redirect, render_template, request, url_for
|
|
19
|
+
from flask_login import current_user, login_required
|
|
20
|
+
|
|
21
|
+
from coati_payroll.auth import proteger_passwd, validar_acceso
|
|
22
|
+
from coati_payroll.enums import TipoUsuario
|
|
23
|
+
from coati_payroll.forms import UserForm, ProfileForm
|
|
24
|
+
from coati_payroll.i18n import _
|
|
25
|
+
from coati_payroll.model import Usuario, db
|
|
26
|
+
from coati_payroll.rbac import require_role
|
|
27
|
+
from coati_payroll.vistas.constants import PER_PAGE
|
|
28
|
+
|
|
29
|
+
user_bp = Blueprint("user", __name__, url_prefix="/user")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@user_bp.route("/")
|
|
33
|
+
@require_role(TipoUsuario.ADMIN)
|
|
34
|
+
def index():
|
|
35
|
+
"""List all users with pagination. Only administrators can manage users."""
|
|
36
|
+
page = request.args.get("page", 1, type=int)
|
|
37
|
+
pagination = db.paginate(
|
|
38
|
+
db.select(Usuario).order_by(Usuario.usuario),
|
|
39
|
+
page=page,
|
|
40
|
+
per_page=PER_PAGE,
|
|
41
|
+
error_out=False,
|
|
42
|
+
)
|
|
43
|
+
return render_template("modules/user/index.html", users=pagination.items, pagination=pagination)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@user_bp.route("/new", methods=["GET", "POST"])
|
|
47
|
+
@require_role(TipoUsuario.ADMIN)
|
|
48
|
+
def new():
|
|
49
|
+
"""Create a new user. Only administrators can create users."""
|
|
50
|
+
form = UserForm()
|
|
51
|
+
|
|
52
|
+
if form.validate_on_submit():
|
|
53
|
+
user = Usuario()
|
|
54
|
+
user.usuario = form.usuario.data
|
|
55
|
+
if form.password.data:
|
|
56
|
+
user.acceso = proteger_passwd(form.password.data)
|
|
57
|
+
else:
|
|
58
|
+
flash(_("La contraseña es requerida para nuevos usuarios."), "error")
|
|
59
|
+
return render_template("modules/user/form.html", form=form, title=_("Nuevo Usuario"))
|
|
60
|
+
|
|
61
|
+
user.nombre = form.nombre.data
|
|
62
|
+
user.apellido = form.apellido.data
|
|
63
|
+
user.correo_electronico = form.correo_electronico.data
|
|
64
|
+
user.tipo = form.tipo.data
|
|
65
|
+
user.activo = form.activo.data
|
|
66
|
+
user.creado_por = current_user.usuario
|
|
67
|
+
|
|
68
|
+
db.session.add(user)
|
|
69
|
+
db.session.commit()
|
|
70
|
+
flash(_("Usuario creado exitosamente."), "success")
|
|
71
|
+
return redirect(url_for("user.index"))
|
|
72
|
+
|
|
73
|
+
return render_template("modules/user/form.html", form=form, title=_("Nuevo Usuario"))
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@user_bp.route("/edit/<string:id>", methods=["GET", "POST"])
|
|
77
|
+
@require_role(TipoUsuario.ADMIN)
|
|
78
|
+
def edit(id: str):
|
|
79
|
+
"""Edit an existing user. Only administrators can edit users."""
|
|
80
|
+
user = db.session.get(Usuario, id)
|
|
81
|
+
if not user:
|
|
82
|
+
flash(_("Usuario no encontrado."), "error")
|
|
83
|
+
return redirect(url_for("user.index"))
|
|
84
|
+
|
|
85
|
+
form = UserForm(obj=user)
|
|
86
|
+
|
|
87
|
+
if form.validate_on_submit():
|
|
88
|
+
user.usuario = form.usuario.data
|
|
89
|
+
if form.password.data:
|
|
90
|
+
user.acceso = proteger_passwd(form.password.data)
|
|
91
|
+
user.nombre = form.nombre.data
|
|
92
|
+
user.apellido = form.apellido.data
|
|
93
|
+
user.correo_electronico = form.correo_electronico.data
|
|
94
|
+
user.tipo = form.tipo.data
|
|
95
|
+
user.activo = form.activo.data
|
|
96
|
+
user.modificado_por = current_user.usuario
|
|
97
|
+
|
|
98
|
+
db.session.commit()
|
|
99
|
+
flash(_("Usuario actualizado exitosamente."), "success")
|
|
100
|
+
return redirect(url_for("user.index"))
|
|
101
|
+
|
|
102
|
+
# Don't show password in form
|
|
103
|
+
form.password.data = ""
|
|
104
|
+
return render_template("modules/user/form.html", form=form, title=_("Editar Usuario"), user=user)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@user_bp.route("/delete/<string:id>", methods=["POST"])
|
|
108
|
+
@require_role(TipoUsuario.ADMIN)
|
|
109
|
+
def delete(id: str):
|
|
110
|
+
"""Delete a user. Only administrators can delete users."""
|
|
111
|
+
user = db.session.get(Usuario, id)
|
|
112
|
+
if not user:
|
|
113
|
+
flash(_("Usuario no encontrado."), "error")
|
|
114
|
+
return redirect(url_for("user.index"))
|
|
115
|
+
|
|
116
|
+
if user.id == current_user.id:
|
|
117
|
+
flash(_("No puedes eliminar tu propio usuario."), "error")
|
|
118
|
+
return redirect(url_for("user.index"))
|
|
119
|
+
|
|
120
|
+
db.session.delete(user)
|
|
121
|
+
db.session.commit()
|
|
122
|
+
flash(_("Usuario eliminado exitosamente."), "success")
|
|
123
|
+
return redirect(url_for("user.index"))
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
@user_bp.route("/profile", methods=["GET", "POST"])
|
|
127
|
+
@login_required
|
|
128
|
+
def profile():
|
|
129
|
+
"""Edit current user's profile and password."""
|
|
130
|
+
form = ProfileForm(obj=current_user)
|
|
131
|
+
|
|
132
|
+
if form.validate_on_submit():
|
|
133
|
+
# Update basic profile information
|
|
134
|
+
current_user.nombre = form.nombre.data
|
|
135
|
+
current_user.apellido = form.apellido.data
|
|
136
|
+
current_user.correo_electronico = form.correo_electronico.data
|
|
137
|
+
|
|
138
|
+
# Handle password change if any password field has data
|
|
139
|
+
password_change_attempted = form.current_password.data or form.new_password.data or form.confirm_password.data
|
|
140
|
+
|
|
141
|
+
if password_change_attempted:
|
|
142
|
+
# Validate password change
|
|
143
|
+
error_message = None
|
|
144
|
+
|
|
145
|
+
if not form.current_password.data:
|
|
146
|
+
error_message = _("Debe ingresar la contraseña actual.")
|
|
147
|
+
elif not validar_acceso(current_user.usuario, form.current_password.data):
|
|
148
|
+
error_message = _("La contraseña actual es incorrecta.")
|
|
149
|
+
elif not form.new_password.data:
|
|
150
|
+
error_message = _("Debe ingresar una nueva contraseña.")
|
|
151
|
+
elif form.new_password.data != form.confirm_password.data:
|
|
152
|
+
error_message = _("Las contraseñas no coinciden.")
|
|
153
|
+
|
|
154
|
+
if error_message:
|
|
155
|
+
flash(error_message, "error")
|
|
156
|
+
return render_template("modules/user/profile.html", form=form)
|
|
157
|
+
|
|
158
|
+
# Update password
|
|
159
|
+
current_user.acceso = proteger_passwd(form.new_password.data)
|
|
160
|
+
flash(_("Contraseña actualizada exitosamente."), "success")
|
|
161
|
+
|
|
162
|
+
current_user.modificado_por = current_user.usuario
|
|
163
|
+
db.session.commit()
|
|
164
|
+
flash(_("Perfil actualizado exitosamente."), "success")
|
|
165
|
+
return redirect(url_for("user.profile"))
|
|
166
|
+
|
|
167
|
+
# Clear password fields
|
|
168
|
+
form.current_password.data = ""
|
|
169
|
+
form.new_password.data = ""
|
|
170
|
+
form.confirm_password.data = ""
|
|
171
|
+
|
|
172
|
+
return render_template("modules/user/profile.html", form=form)
|