Modela tu empresa con la libertad de una hoja de cálculo, sobre una base de datos real: validaciones, auditoría, automatizaciones y millones de registros. Sin escribir código.
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Nombre | Tfno | Tipo | |
| 2 | María G. | maria@emp | 612345678 | premium |
| 3 | carlos lopez | #REF! | sin tfno | PREMIUM |
| 4 | ??? | email malo | +34612 | basico |
Campo creado por ti · Se genera automáticamente
Dinaup convierte la flexibilidad caótica de Excel en aplicaciones estructuradas, validadas y listas para crecer con tu negocio.
Arrancas con una base sólida: ventas, tareas, personas, clientes. Todo conectado desde el primer día.
Cobros, productos, cierres y tickets funcionando desde el primer día.
Organiza el trabajo real de tu equipo, no una teoría.
Fichajes, horarios y control de equipo desde una única base.
Oportunidades, estados y seguimiento comercial sin rigidez.
Ready to Go trae secciones listas para usar. Y cuando tu empresa necesita algo más, creas secciones personalizadas sin romper nada de lo que ya funciona.
Son módulos ya diseñados y optimizados para lo que cualquier empresa necesita: clientes, productos, ventas, facturación y más. Se activan con un clic y funcionan sin configuración previa. Usas Dinaup desde el primer minuto.
Cuando tu negocio no encaja en lo estándar, Dinaup no se queda corto. Creas secciones propias que reflejan exactamente tus procesos: cómo trabajas, qué controlas y qué necesitas medir. Sin límites, sin código, sobre la misma base que ya funciona.
Cada sección incluye campos Ready to Go para empezar rápido. Y si te falta algo, añades campos personalizados que capturan justo la información que tu empresa necesita.
Cada campo valida los datos de forma inteligente: formatos correctos, rangos permitidos, obligatoriedad y reglas propias. Menos errores y datos siempre consistentes.
Crea campos con fórmulas automáticas, relaciones entre secciones, validaciones avanzadas, valores calculados y KPIs. Todo desde la interfaz, sin escribir código ni depender de desarrollos a medida.
Recibe notificaciones en tiempo real, consulta informes y automatiza procesos con n8n, Make, Zapier o tu propio código.
Recibe una notificación HTTP cada vez que se cree, modifique o elimine un registro de cualquier sección.
Cualquier informe que crees queda disponible al instante como endpoint de API.
curl -X POST "https://webhook.dinaup.com/api/reports?id=35461251..." \ -H "Authorization: Bearer tu_token"
Controla el volumen de resultados
Por cualquier campo del informe
{
"data": [
{
"Estado": "En curso",
"Paciente": "Javi C.",
"Medico": "Juan Rodríguez"
}
],
"totalResults": 59
}
Conecta Dinaup con cientos de aplicaciones y monta flujos de trabajo automáticos sin programar.
Los webhooks se disparan al instante cuando cambian tus datos en Dinaup.
Arrastra y conecta nodos visuales para crear flujos complejos sin código.
Conecta con Gmail, Slack, Sheets, Notion, Airtable y cientos de aplicaciones más.
Tu estructura de datos, convertida en modelos C# tipados. Autocompletado real, errores en compilación y cero strings mágicos.
var client = await DinaupClientC.ConnectAsync( endPoint: "https://api.dinaup.com/v2/tu-codigo", publicKey: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", secretKey: "tu-secret-key-aqui" ); // ✓ Conectado. Ya puedes operar.
using Dinaup; // Las únicas credenciales en variables de entorno var vault = new VaultData( Environment.GetEnvironmentVariable("VAULT_URL"), Environment.GetEnvironmentVariable("VAULT_PASSWORD") ); vault.Initialize(); // Todo lo demás viene del Vault var client = await DinaupClientC.ConnectAsync( endPoint: vault.Read("dinaup.endpoint"), publicKey: vault.Read("dinaup.publickey"), secretKey: vault.Read("dinaup.secretkey") ); // ✓ Credenciales seguras desde Vault
using Dinaup; var builder = WebApplication.CreateBuilder(args); // Cargar Vault var vault = new VaultData( Environment.GetEnvironmentVariable("VAULT_URL"), Environment.GetEnvironmentVariable("VAULT_PASSWORD") ); vault.Initialize(); // Conectar a Dinaup var client = await DinaupClientC.ConnectAsync( endPoint: vault.Read("dinaup.endpoint"), publicKey: vault.Read("dinaup.publickey"), secretKey: vault.Read("dinaup.secretkey") ); // Registrar como Singleton builder.Services.AddSingleton(client); var app = builder.Build();
var report = new APIVentasC(); await report.ExecuteQueryAsync(client); foreach (var row in report.Rows) { Console.WriteLine($"{row.Factura}: {row.Total}"); }
// Filtros y ordenación avanzada var report = new APIVentasC(); report.AddFilterBetween(VentasES.Fecha, inicioMes, finMes); report.AddFilter(VentasES.Estado, "=", EstadoE.Completada.INT()); report.AddOrder(VentasES.Total, descending: true); await report.ExecuteQueryAsync(client); foreach (var row in report.Rows) { Console.WriteLine($"{row.Numero}: {row.Total}€"); } // Página {report.CurrentPage} de {report.TotalPages}
// Recorrer todas las páginas de resultados var report = new APIProductosC(); await report.ExecuteQueryAsync(client); if (report.Rows.IsNotEmpty()) { do { foreach (var row in report.Rows) { // Procesar cada registro } } while (await report.ExecuteQuery_NextPageAsync()); } // ✓ Todos los registros procesados
var producto = new WriteOperation(Guid.Empty, new() { { ProductosES.Nombre, "iPhone 16 Pro" }, { ProductosES.Precio, 1199.00m.STR() } }); client.RunWriteOperation(ProductosES._SectionID, producto); // ✓ Producto creado
// Importar productos en bloques var externos = await http.GetFromJsonAsync<List<ProductoDTO>>(url); var chunks = externos.Chunk(DinaupClientC.MaxItemsPerWriteOperation); foreach (var chunk in chunks) { var lote = chunk.Select(e => new WriteOperation(Guid.Empty, new() { { ProductosES.CodigoExterno, e.SKU }, { ProductosES.Nombre, e.Nombre }, { ProductosES.Precio, e.Precio.STR() } })).ToList(); client.RunWriteOperation(ProductosES._SectionID, lote, false); } // ✓ Productos sincronizados por bloques
var cambios = new WriteOperation(productoId, new() { { ProductosES.Precio, 999.00m.STR() } }); client.RunWriteOperation(ProductosES._SectionID, cambios); // ✓ Producto actualizado
// Actualizar precios masivamente var cambios = productosIds.Select(id => new WriteOperation(id, new() { { ProductosES.Precio, nuevoPrecio.STR() }, { ProductosES.FechaActualizacion, DateTime.Now.STR() } })).ToList(); client.RunWriteOperation(ProductosES._SectionID, cambios, false); // ✓ 150 productos actualizados
// Factura con líneas en una llamada var factura = new WriteOperation(Guid.Empty, new() { { FacturasES.Numero, "F-2024-0042" }, { FacturasES.ClienteID, clienteId.STR() }, { FacturasES.Fecha, DateTime.Now.STR() } }); var lineas = new List<WriteOperation> { new(Guid.Empty, new() { { LineasES.Descripcion, "Consultoría" }, { LineasES.Cantidad, 10.STR() }, { LineasES.Precio, 80m.STR() } }), new(Guid.Empty, new() { { LineasES.Descripcion, "Desarrollo" }, { LineasES.Cantidad, 25.STR() }, { LineasES.Precio, 60m.STR() } }) }; client.RunWriteOperation(FacturasES._SectionID, factura, lineas); // ✓ Factura + 2 líneas creadas
// Subir desde un array de bytes var bytes = System.Text.Encoding.UTF8.GetBytes("contenido del archivo"); var upload = await client.File_UploadBytesAsync(bytes, "documento.txt"); Guid fileId = upload.FileId; // ✓ Archivo subido
// Subir desde una URL externa var upload = await client.File_UploadURLAsync( "https://ejemplo.com/imagen.png", "imagen.png" ); Guid fileId = upload.FileId; // ✓ Archivo importado desde URL
// Obtener URL firmada para lectura var signed = await client.File_SignURLGetAsync(fileId); var url = signed?.url_original; // ✓ URL lista para usar
// Agregar un comentario (solo texto) var params = new AnotationParameters(sectionId, rowId, AnnotationTypeE.Comments) .WithText("¡Hola! Este es mi comentario."); await client.Annotation_PutAsync(params); // ✓ Comentario agregado
// Subir archivo primero var upload = await client.File_UploadBytesAsync(bytes, "documento.pdf"); // Agregar comentario con archivo var params = new AnotationParameters(sectionId, rowId, AnnotationTypeE.Comments) .WithText("Adjunto el contrato firmado") .WithFile(upload.FileId); await client.Annotation_PutAsync(params); // ✓ Comentario con archivo adjunto
// Leer anotaciones de un registro var resultado = await client.Annotations_GetAsync( sectionId, rowId, AnnotationTypeE.Comments ); foreach (var anotacion in resultado.Annotations) { var texto = anotacion.Text; var adjuntos = anotacion.AttachedFiles; }
// Generar HTML de factura var doc = new DynamicDocuments.PaginasInformesD.FacturaModernaC(ventaId); var response = await doc.ExecuteAsync(client); var html = response.Content; // ✓ HTML de la factura generado
// Servicio con inyección de dependencias public class ProductosService(DinaupClientC client) { public async Task<List<ProductoRow>> GetProductosAsync() { var report = new APIProductosC(); await report.ExecuteQueryAsync(client); return report.Rows; } public void AddProducto(string nombre, decimal precio) { var op = new WriteOperation(Guid.Empty, new() { { ProductosES.Nombre, nombre }, { ProductosES.Precio, precio.STR() } }); client.RunWriteOperation(ProductosES._SectionID, op); } }
// Sincronizar productos desde API externa public async Task SyncProductosAsync(List<ProductoExterno> externos) { var operaciones = externos.Select(e => new WriteOperation( e.DinaupId ?? Guid.Empty, new() { { ProductosES.CodigoExterno, e.SKU }, { ProductosES.Nombre, e.Nombre }, { ProductosES.Precio, e.Precio.STR() } })).ToList(); client.RunWriteOperation(ProductosES._SectionID, operaciones, false); } // ✓ Crea nuevos o actualiza existentes
// Worker para procesar tareas pendientes public class TareasWorker : BackgroundService { protected override async Task ExecuteAsync(CancellationToken ct) { while (ct.IsCancellationRequested == false) { var pendientes = await GetPendientesAsync(); foreach (var tarea in pendientes) await ProcesarAsync(tarea); await Task.Delay(TimeSpan.FromMinutes(5), ct); } } }
// Búsqueda de texto libre report.QuerySearch = "iPhone Pro Max"; // Filtro IN (múltiples valores) report.AddFilter(ProductosES.CategoriaId, new[] { categoria1Id, categoria2Id }); // OR implícito (mismo campo, múltiples llamadas) report.AddFilter(PaisesES.Codigo, "=", "ES"); report.AddFilter(PaisesES.Codigo, "=", "IT"); // Devuelve ES e IT // Filtro por relaciones encadenadas var keyPath = $"{PedidosES._SectionID}.{PedidosES.ClienteId}.{ClientesD._SectionID}.{ClientesES.VIP}"; report.AddFilter(keyPath, "=", 1); // Solapamiento de fechas report.AddFilterDateRangeOverlapFilter( EventosES.FechaInicio, EventosES.FechaFin, rangeStart: new DateOnly(2024, 1, 1), rangeEnd: new DateOnly(2024, 12, 31) ); // Incluir eliminados report.AddFilter(ProductosES.Eliminado, "<>", -1); // Todos
// DynamicSelector - Buscar relación automáticamente var op = new WriteOperation(Guid.Empty, new() { { ProductosES.Nombre, "Mi producto" }, { ProductosES.UnidadMedidaID, $"[{UnidadesMedidaES.TextoPrincipal}=Litros]" } }); // Editar por campo alternativo (ej: SKU) client.RunWriteOperation( ProductosD._SectionIDGUID, op, runScripts: false, identifierFieldKey: ProductosES.CodigoExterno ); // Actualizar un solo campo (más legible) await client.RunInlineWriteOperationAsync( ProductosD._SectionIDGUID, productoId, ProductosES.Precio, 1299.00m.STR() ); // Limpiar relación (string vacío) valores.Add(ProductosES.ClienteID, ""); // Verificar resultado op.WriteOperationResult.RowID // Guid del registro op.WriteOperationResult.Confirmed // bool op.WriteOperationResult.AError // string (si hay error)
// Obtener cabecera + líneas en una llamada var factura = await FacturasD.GetRowByIdWithListAsync(client, facturaId); Console.WriteLine($"Factura: {factura.MainRow.Numero}"); foreach (var linea in factura.ListRows) { } // GetRowsAsync con labels de relaciones var productos = await ProductosD.GetRowsAsync(client, params); foreach (var p in productos) { Console.WriteLine($"{p.TextoPrincipal}: {p.ReferenciaCliente.Label}"); } // Variables de informe var report = new VentasPorClienteC(); report.AddVariable("ClienteId", clienteId.ToString()); report.AddVariable("FechaDesde", "2024-01-01"); // Propiedades del informe report.Rows // List<RowC> report.RowsDic // Dictionary<Guid, RowC> report.TotalResults // int report.ExistNextPage // bool
// Verificar conexión if (client.IsConnected) { /* OK */ } // Connect síncrono (alternativa a ConnectAsync) var client = DinaupClientC.Connect(endpoint, publicKey, secretKey); // Conversión de enums { FacturasES.Estado, EstadoFacturaE.Borrador.INT().STR() } // Deduplicación con SHA1 string sha1 = Dinaup.extensions.ToSHA1(contenido); // URL firmada con parámetros var url = await client.File_SignURLGetAsync(fileId, cachear: false); // Propiedades de archivo subido upload.FileData.Id // Guid upload.FileData.CRC // SHA1 upload.FileData.IsImage // bool upload.FileData.url_1080 // Redimensionado
// Ejecutar como usuario específico // Afecta a: autor de alta, histórico, anotaciones, filtros de sesión // Solo userId using (DinaupContext.WithUser(userId)) { client.RunWriteOperation(...); } // Con IP using (DinaupContext.WithUser(userId, "192.168.1.1")) { client.RunWriteOperation(...); } // Con IP y UserAgent using (DinaupContext.WithUser(userId, "192.168.1.1", "Mozilla/5.0...")) { client.RunWriteOperation(...); }
Tu equipo lleva años construyendo lógica crítica en hojas de cálculo: precios, comisiones, stock, impuestos, reporting…
No soporta millones de filas ni varios usuarios a la vez sin bloquearse.
No hay control de cambios real ni auditoría de quién modificó qué.
Una fórmula rota puede pasar desapercibida durante semanas.
Conectarlo con CRMs, ERPs o tiendas online es un parche constante.
Dinaup nace para conservar esa libertad de modelar, pero dentro de un sistema robusto, auditable e integrable.
Dinaup invierte el enfoque: no te obliga a encajar en su modelo, te da un modelo abierto.
Dinaup te da el framework ya resuelto: motor de datos, informes, documentos y API listos.
Para empresas y equipos técnicos que necesitan flexibilidad sin renunciar a la robustez.
Si tu gestión vive en Excels, ERPs parcheados y aplicaciones sueltas:
Si desarrollas aplicaciones de negocio:
Tú te centras en la experiencia de usuario y la lógica avanzada.
Dinaup pone la base de datos, los informes, los documentos y la API.
"No adaptas tu empresa a un software: adaptas el software a tu empresa"
"Lo que antes eran 20 Excels sueltos ahora es un sistema único y auditado"
Empieza hoy a construir tu ERP a medida. Sin código, sin límites y sin compromiso.
Únete a nuestra red de partners y ofrece a tus clientes soluciones de gestión de datos de primer nivel.
Ofrece mantenimiento, formación, soporte técnico, desarrollo de integraciones y mucho más.
Acelera tus desarrollos con aplicaciones ya creadas y herramientas internas de Dinaup.
Soporte prioritario y formaciones internas para dominar la plataforma.