Merge origin/development: resolved conflicts in scripts/init_first_time.sh, backend/api/v1/modules/a76/invoices/services.py, .gitignore and others

This commit is contained in:
hreyes
2026-02-27 11:46:16 -07:00
169 changed files with 20436 additions and 2257 deletions

View File

@@ -40,5 +40,12 @@ echo "=========================================="
echo "Iniciando aplicación SvelteKit..."
echo "=========================================="
# Instalar dependencias nuevas si package.json ha cambiado
if [ "$NODE_ENV" = "development" ]; then
echo "Instalando dependencias (development mode)..."
# CI=true evita el error ERR_PNPM_ABORTED_REMOVE_MODULES_DIR_NO_TTY
CI=true pnpm install
fi
# Ejecutar el comando que se pasó al contenedor
exec "$@"

View File

@@ -14,7 +14,9 @@
# 8. Licencia Enterprise para el tenant (ilimitada, 1 año de vigencia)
#
# Requisitos:
# - Keycloak y PostgreSQL corriendo (p. ej. docker compose up -d)
# - Keycloak y PostgreSQL corriendo (por ejemplo: docker compose up -d)
# - Keycloak corriendo en http://localhost:8080
# - PostgreSQL corriendo en localhost:5432 o 5939
# - Base de datos anexo76_core creada
# - jq instalado (para procesamiento JSON)
#
@@ -66,6 +68,17 @@ exec_pg_sql() {
-t -c "${sql}" 2>&1
}
# Ejecutar SQL en el PostgreSQL del Cliente (Simulación)
exec_pg_sql_client() {
local sql="$1"
# Solo ejecutar si el contenedor existe y está corriendo
if docker ps --format '{{.Names}}' | grep -q "^anexo76-postgres-client$"; then
docker exec -e PGPASSWORD="${POSTGRES_PASSWORD}" anexo76-postgres-client \
psql -h localhost -p 5432 -U "${POSTGRES_USER}" -d "anexo76_client" \
-t -c "${sql}" 2>/dev/null || true
fi
}
# Crear mapper de tenant_id para un cliente
create_tenant_mapper() {
local client_id="$1"
@@ -118,7 +131,11 @@ KEYCLOAK_URL="http://localhost:18080/kcauth"
KEYCLOAK_ADMIN="${KEYCLOAK_ADMIN:-admin}"
KEYCLOAK_ADMIN_PASSWORD="${KEYCLOAK_ADMIN_PASSWORD:-admin}"
KEYCLOAK_REALM="${KEYCLOAK_REALM:-master}"
<<<<<<< HEAD
KEYCLOACK_ADMIN_URL="http://localhost:19000/kcauth"
=======
KEYCLOAK_ADMIN_URL="${KEYCLOAK_ADMIN_URL:-http://localhost:9000/kcauth}"
>>>>>>> origin/development
POSTGRES_HOST="${POSTGRES_HOST:-localhost}"
POSTGRES_PORT="${POSTGRES_PORT:-5432}"
@@ -149,7 +166,7 @@ MAX_RETRIES=30
RETRY_COUNT=0
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
if curl -s -f "${KEYCLOACK_ADMIN_URL}/health/ready" > /dev/null 2>&1; then
if curl -s -f "${KEYCLOAK_ADMIN_URL}/health/ready" > /dev/null 2>&1; then
echo -e "${GREEN}✓ Keycloak está listo${NC}"
break
fi
@@ -338,12 +355,52 @@ FRONTEND_CLIENT_EXISTS=$(curl -s -X GET "${KEYCLOAK_URL}/admin/realms/${KEYCLOAK
-H "Content-Type: application/json")
if echo "$FRONTEND_CLIENT_EXISTS" | jq -e '.[] | select(.clientId == "anexo76-frontend")' >/dev/null 2>&1; then
echo -e "${YELLOW}⚠ Cliente Frontend ya existe${NC}"
echo -e "${YELLOW}⚠ Cliente Frontend ya existe, actualizando configuración...${NC}"
FRONTEND_CLIENT_ID=$(echo "$FRONTEND_CLIENT_EXISTS" | jq -r '.[0].id')
# Actualizar configuración del cliente existente para incluir puertos nuevos
UPDATE_FRONTEND=$(curl -s -w "\n%{http_code}" -X PUT "${KEYCLOAK_URL}/admin/realms/${KEYCLOAK_REALM}/clients/${FRONTEND_CLIENT_ID}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"clientId": "anexo76-frontend",
"name": "Anexo76 Frontend",
"description": "Aplicación web frontend para el sistema Anexo76",
"enabled": true,
"protocol": "openid-connect",
"publicClient": true,
"directAccessGrantsEnabled": false,
"standardFlowEnabled": true,
"implicitFlowEnabled": false,
"rootUrl": "http://localhost:5173",
"baseUrl": "http://localhost:5173",
"redirectUris": [
"http://localhost:5173/*",
"http://localhost:5174/*",
"http://localhost:3000/*"
],
"webOrigins": [
"http://localhost:5173",
"http://localhost:5174",
"http://localhost:3000"
],
"attributes": {
"pkce.code.challenge.method": "S256"
}
}')
HTTP_CODE=$(echo "$UPDATE_FRONTEND" | tail -n1)
if [ "$HTTP_CODE" = "204" ] || [ "$HTTP_CODE" = "200" ]; then
echo -e "${GREEN}✓ Cliente Frontend actualizado (Puertos actualizados)${NC}"
else
echo -e "${RED}✗ Error al actualizar cliente Frontend (HTTP ${HTTP_CODE})${NC}"
fi
else
CREATE_FRONTEND=$(curl -s -w "\n%{http_code}" -X POST "${KEYCLOAK_URL}/admin/realms/${KEYCLOAK_REALM}/clients" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
<<<<<<< HEAD
-d "{
\"clientId\": \"anexo76-frontend\",
\"name\": \"Anexo76 Frontend\",
@@ -363,6 +420,29 @@ else
\"webOrigins\": [
\"http://localhost:15173\",
\"http://localhost:13000\"
=======
-d '{
"clientId": "anexo76-frontend",
"name": "Anexo76 Frontend",
"description": "Aplicación web frontend para el sistema Anexo76",
"enabled": true,
"protocol": "openid-connect",
"publicClient": true,
"directAccessGrantsEnabled": false,
"standardFlowEnabled": true,
"implicitFlowEnabled": false,
"rootUrl": "http://localhost:5173",
"baseUrl": "http://localhost:5173",
"redirectUris": [
"http://localhost:5173/*",
"http://localhost:5174/*",
"http://localhost:3000/*"
],
"webOrigins": [
"http://localhost:5173",
"http://localhost:5174",
"http://localhost:3000"
>>>>>>> origin/development
],
\"attributes\": {
\"pkce.code.challenge.method\": \"S256\"
@@ -517,8 +597,9 @@ if [ $PG_RETRY_COUNT -eq $MAX_PG_RETRIES ]; then
fi
# Insertar o actualizar tenant
echo "Insertando tenant en PostgreSQL..."
echo "Insertando tenant en PostgreSQL (Hub y Cliente)..."
exec_pg_sql "INSERT INTO core.tenants (name, slug, type, keycloak_realm, contact_email, is_active, created_at, updated_at) VALUES ('${TENANT_NAME}', '${TENANT_SLUG}', 'SHARED'::tenanttype, '${KEYCLOAK_REALM}', '${DEMO_EMAIL}', true, now(), now()) ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, contact_email = EXCLUDED.contact_email, updated_at = CURRENT_TIMESTAMP;" >/dev/null
exec_pg_sql_client "INSERT INTO core.tenants (name, slug, type, keycloak_realm, contact_email, is_active, created_at, updated_at) VALUES ('${TENANT_NAME}', '${TENANT_SLUG}', 'SHARED'::tenanttype, '${KEYCLOAK_REALM}', '${DEMO_EMAIL}', true, now(), now()) ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, contact_email = EXCLUDED.contact_email, updated_at = CURRENT_TIMESTAMP;" >/dev/null
# Obtener el ID del tenant con mejor manejo de errores
echo "Obteniendo ID del tenant..."
@@ -553,7 +634,8 @@ COMPANY_EXISTS=$(echo "$COMPANY_EXISTS" | xargs)
if [ "$COMPANY_EXISTS" = "0" ]; then
exec_pg_sql "INSERT INTO a76.company (tenant_id, name, rfc, is_service_company, created_at, updated_at) VALUES (${TENANT_ID}, '${COMPANY_NAME}', '${COMPANY_RFC}', false, now(), now());" >/dev/null
echo -e "${GREEN}✓ Company creada${NC}"
exec_pg_sql_client "INSERT INTO a76.company (tenant_id, name, rfc, is_service_company, created_at, updated_at) VALUES (${TENANT_ID}, '${COMPANY_NAME}', '${COMPANY_RFC}', false, now(), now());" >/dev/null
echo -e "${GREEN}✓ Company creada (Hub y Cliente)${NC}"
else
echo -e "${YELLOW}⚠ Company ya existe para este tenant${NC}"
fi
@@ -584,9 +666,14 @@ echo -e "${GREEN}✓ Atributo tenant_id asignado al usuario${NC}"
# Agregar relación usuario-tenant en la base de datos (usar company_id real)
echo -e "\n${YELLOW}Creando relación usuario-tenant en la base de datos...${NC}"
<<<<<<< HEAD
exec_pg_sql "INSERT INTO core.user_tenants (keycloak_user_id, tenant_id, company_id, role, is_active, created_at, updated_at) VALUES ('${USER_ID}', ${TENANT_ID}, ${COMPANY_ID}, 'admin', true, now(), now()) ON CONFLICT (keycloak_user_id, tenant_id, company_id) DO UPDATE SET is_active = true, updated_at = CURRENT_TIMESTAMP;" >/dev/null
=======
exec_pg_sql "INSERT INTO core.user_tenants (keycloak_user_id, tenant_id, company_id, role, is_active, created_at, updated_at) VALUES ('${USER_ID}', ${TENANT_ID}, 1, 'admin', true, now(), now()) ON CONFLICT (keycloak_user_id, tenant_id, company_id) DO UPDATE SET is_active = true, updated_at = CURRENT_TIMESTAMP;" >/dev/null
exec_pg_sql_client "INSERT INTO core.user_tenants (keycloak_user_id, tenant_id, company_id, role, is_active, created_at, updated_at) VALUES ('${USER_ID}', ${TENANT_ID}, 1, 'admin', true, now(), now()) ON CONFLICT (keycloak_user_id, tenant_id, company_id) DO UPDATE SET is_active = true, updated_at = CURRENT_TIMESTAMP;" >/dev/null
>>>>>>> origin/development
echo -e "${GREEN}✓ Relación usuario-tenant creada en la base de datos${NC}"
echo -e "${GREEN}✓ Relación usuario-tenant creada en la base de datos (Hub y Cliente)${NC}"
###############################################################################
# 9. Crear licencia Enterprise para el tenant
@@ -609,7 +696,8 @@ if [ "$LICENSE_EXISTS" = "0" ]; then
set -e # Reactivar exit on error
if [ $LICENSE_CREATE_STATUS -eq 0 ]; then
echo -e "${GREEN}✓ Licencia Enterprise creada exitosamente${NC}"
exec_pg_sql_client "INSERT INTO core.licenses (tenant_id, plan, status, max_users, max_storage_gb, max_monthly_operations, feature_api_access, feature_advanced_reports, feature_integrations, feature_dedicated_support, starts_at, expires_at, created_at, updated_at) VALUES (${TENANT_ID}, 'ENTERPRISE', 'ACTIVE', 999999, 999999, 999999, true, true, true, true, '${LICENSE_START_DATE}'::timestamp, '${LICENSE_EXPIRE_DATE}'::timestamp, now(), now());" >/dev/null 2>&1 || true
echo -e "${GREEN}✓ Licencia Enterprise creada exitosamente (Hub y Cliente)${NC}"
echo -e "${GREEN} Plan: Enterprise${NC}"
echo -e "${GREEN} Usuarios: Ilimitados${NC}"
echo -e "${GREEN} Almacenamiento: Ilimitado${NC}"
@@ -629,11 +717,12 @@ else
# Actualizar licencia existente a Enterprise
set +e # Desactivar exit on error temporalmente
exec_pg_sql "UPDATE core.licenses SET plan = 'ENTERPRISE', status = 'ACTIVE', max_users = 999999, max_storage_gb = 999999, max_monthly_operations = 999999, feature_api_access = true, feature_advanced_reports = true, feature_integrations = true, feature_dedicated_support = true, starts_at = '${LICENSE_START_DATE}'::timestamp, expires_at = '${LICENSE_EXPIRE_DATE}'::timestamp, updated_at = now() WHERE tenant_id = ${TENANT_ID};" >/dev/null 2>&1
exec_pg_sql_client "UPDATE core.licenses SET plan = 'ENTERPRISE', status = 'ACTIVE', max_users = 999999, max_storage_gb = 999999, max_monthly_operations = 999999, feature_api_access = true, feature_advanced_reports = true, feature_integrations = true, feature_dedicated_support = true, starts_at = '${LICENSE_START_DATE}'::timestamp, expires_at = '${LICENSE_EXPIRE_DATE}'::timestamp, updated_at = now() WHERE tenant_id = ${TENANT_ID};" >/dev/null 2>&1 || true
LICENSE_UPDATE_STATUS=$?
set -e # Reactivar exit on error
if [ $LICENSE_UPDATE_STATUS -eq 0 ]; then
echo -e "${GREEN}✓ Licencia actualizada a Enterprise${NC}"
echo -e "${GREEN}✓ Licencia actualizada a Enterprise (Hub y Cliente)${NC}"
else
echo -e "${RED}✗ Error al actualizar la licencia${NC}"
exit 1