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:
@@ -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 "$@"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user