From efd0dfb5742457d0c2a44e7fedef1283a1bf61fc Mon Sep 17 00:00:00 2001 From: dmolinari Date: Thu, 24 Jul 2025 10:17:33 -0300 Subject: [PATCH] Fix: RawData Number Format --- .env | 33 ++++++++++++++++++ Widgets-ELDIA-1.1.pdf | Bin 0 -> 36900 bytes docker-compose.yml | 4 +-- .../raw-data/RawBolsaLocalTable.tsx | 25 +++++++------ .../components/raw-data/RawBolsaUsaTable.tsx | 27 +++++++------- 5 files changed, 64 insertions(+), 25 deletions(-) create mode 100644 .env create mode 100644 Widgets-ELDIA-1.1.pdf diff --git a/.env b/.env new file mode 100644 index 0000000..29caaf7 --- /dev/null +++ b/.env @@ -0,0 +1,33 @@ +# ======================================================= +# == Fichero de Entorno para la Aplicación de Mercados == +# ======================================================= +# Este fichero debe estar en /opt/mercados-app/.env en el servidor. +# Contiene todos los secretos y configuraciones específicas del entorno. + +# --- Conexión a la Base de Datos --- +# Cadena de conexión para SQL Server. +# IMPORTANTE: El 'Server' debe ser el nombre del servicio de la base de datos en la red Docker compartida. +ConnectionStrings__DefaultConnection="Server=;Database=;User ID=;Password=;TrustServerCertificate=True;Encrypt=False;" + +# --- Horarios de Ejecución del Worker (formato Cron) --- +Schedules__MercadoAgroganadero="0 10,12,15,18 * * 1-5" +Schedules__BCR="30 11 * * 1-5" +Schedules__Bolsas="10 11-17 * * 1-5" + +# --- Claves de APIs Externas --- +ApiKeys__Finnhub="" +ApiKeys__Bcr__Key="" +ApiKeys__Bcr__Secret="" + +# --- Configuración de Email para Alertas (SMTP) --- +SmtpSettings__Host="" +SmtpSettings__Port="" +SmtpSettings__User="" +SmtpSettings__Pass="" +SmtpSettings__SenderName="Servicio de Mercados" +SmtpSettings__Recipient="" + +# --- Configuración del Entorno de ASP.NET Core --- +# Esto asegura que la aplicación se ejecute en modo Producción, +# desactivando páginas de error detalladas, etc. +ASPNETCORE_ENVIRONMENT="Production" diff --git a/Widgets-ELDIA-1.1.pdf b/Widgets-ELDIA-1.1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..53d3ec57c5ce900bdc50d7db70cd1232c7422130 GIT binary patch literal 36900 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 literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml index d103aa4..5bc0f3a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ services: # Servicio del Backend API mercados-api: build: - context: ./Mercados-Web # Asumiendo que clonaste el repo en esta carpeta + context: ./Mercados-Web dockerfile: src/Mercados.Api/Dockerfile container_name: mercados-api restart: always @@ -60,4 +60,4 @@ networks: driver: bridge shared-net: - external: true \ No newline at end of file + external: true diff --git a/frontend/src/components/raw-data/RawBolsaLocalTable.tsx b/frontend/src/components/raw-data/RawBolsaLocalTable.tsx index 05c236f..7779bd6 100644 --- a/frontend/src/components/raw-data/RawBolsaLocalTable.tsx +++ b/frontend/src/components/raw-data/RawBolsaLocalTable.tsx @@ -14,12 +14,12 @@ const toTSV = (data: CotizacionBolsa[]) => { // Formateamos el nombre para que quede como "GGAL.BA (GRUPO FINANCIERO GALICIA)" const nombreCompleto = `${row.ticker} (${row.nombreEmpresa || ''})`; const precio = `$${formatCurrency(row.precioActual)}` - const cambio = `${row.porcentajeCambio.toFixed(2)}%` + const cambio = `${formatCurrency(row.porcentajeCambio)}%` //`${row.porcentajeCambio.toFixed(2)}%` // Unimos los campos con un carácter de tabulación '\t' return [nombreCompleto, precio, cambio].join('\t'); }); - + // Unimos todas las filas con un salto de línea return dataRows.join('\n'); }; @@ -32,14 +32,14 @@ export const RawBolsaLocalTable = () => { // Separamos los datos en prioritarios y el resto const priorityData = data?.filter(d => TICKERS_PRIORITARIOS_LOCAL.includes(d.ticker)) - .sort((a, b) => TICKERS_PRIORITARIOS_LOCAL.indexOf(a.ticker) - TICKERS_PRIORITARIOS_LOCAL.indexOf(b.ticker)); // Mantenemos el orden - + .sort((a, b) => TICKERS_PRIORITARIOS_LOCAL.indexOf(a.ticker) - TICKERS_PRIORITARIOS_LOCAL.indexOf(b.ticker)); // Mantenemos el orden + const otherData = data?.filter(d => !TICKERS_PRIORITARIOS_LOCAL.includes(d.ticker)); const handleCopy = () => { if (!priorityData) return; const tsvData = toTSV(priorityData); - + copyToClipboard(tsvData) .then(() => alert('Datos prioritarios copiados al portapapeles.')) .catch(err => { @@ -81,7 +81,7 @@ export const RawBolsaLocalTable = () => { ({row.nombreEmpresa}) ${formatCurrency(row.precioActual)} - {row.porcentajeCambio.toFixed(2)}% + {formatCurrency(row.porcentajeCambio)}% ))} @@ -98,17 +98,20 @@ export const RawBolsaLocalTable = () => { - Ticker - Nombre - Precio + Símbolo (Nombre) + Precio Actual + % Cambio {otherData.map(row => ( - {row.ticker} - {row.nombreEmpresa} + + {row.ticker} + ({row.nombreEmpresa}) + ${formatCurrency(row.precioActual)} + {formatCurrency(row.porcentajeCambio)}% ))} diff --git a/frontend/src/components/raw-data/RawBolsaUsaTable.tsx b/frontend/src/components/raw-data/RawBolsaUsaTable.tsx index 4553184..4e70d41 100644 --- a/frontend/src/components/raw-data/RawBolsaUsaTable.tsx +++ b/frontend/src/components/raw-data/RawBolsaUsaTable.tsx @@ -18,7 +18,7 @@ const toTSV = (data: CotizacionBolsa[]) => { // Formateamos los datos según los requisitos de redacción const nombreCompleto = `${row.ticker} (${row.nombreEmpresa || ''})`; const precio = `$${formatCurrency(row.precioActual)}`; - const cambio = `${row.porcentajeCambio.toFixed(2)}%`; + const cambio = `${formatCurrency(row.porcentajeCambio)}%`; return [nombreCompleto, precio, cambio].join('\t'); }); @@ -35,14 +35,14 @@ export const RawBolsaUsaTable = () => { // Separamos los datos en prioritarios y el resto, manteniendo el orden de la lista const priorityData = data?.filter(d => TICKERS_PRIORITARIOS_USA.includes(d.ticker)) - .sort((a, b) => TICKERS_PRIORITARIOS_USA.indexOf(a.ticker) - TICKERS_PRIORITARIOS_USA.indexOf(b.ticker)); - + .sort((a, b) => TICKERS_PRIORITARIOS_USA.indexOf(a.ticker) - TICKERS_PRIORITARIOS_USA.indexOf(b.ticker)); + const otherData = data?.filter(d => !TICKERS_PRIORITARIOS_USA.includes(d.ticker)); const handleCopy = () => { if (!priorityData) return; const tsvData = toTSV(priorityData); - + copyToClipboard(tsvData) .then(() => alert('Datos prioritarios copiados al portapapeles!')) .catch(err => { @@ -91,8 +91,8 @@ export const RawBolsaUsaTable = () => { {row.ticker}({row.nombreEmpresa}) - {formatCurrency(row.precioActual, 'USD')} - {row.porcentajeCambio.toFixed(2)}% + ${formatCurrency(row.precioActual)} + {formatCurrency(row.porcentajeCambio)}% ))} @@ -109,17 +109,20 @@ export const RawBolsaUsaTable = () => {
- Ticker - Nombre - Precio + Símbolo (Nombre) + Precio Actual + % Cambio {otherData.map(row => ( - {row.ticker} - {row.nombreEmpresa} - {formatCurrency(row.precioActual, 'USD')} + + {row.ticker} + ({row.nombreEmpresa}) + + ${formatCurrency(row.precioActual)} + {formatCurrency(row.porcentajeCambio)}% ))}