diff --git a/src/Somnia.GuestLog/Components/Pages/StayExport/StayExportList.razor b/src/Somnia.GuestLog/Components/Pages/StayExport/StayExportList.razor
index 840e5e7..43f620c 100644
--- a/src/Somnia.GuestLog/Components/Pages/StayExport/StayExportList.razor
+++ b/src/Somnia.GuestLog/Components/Pages/StayExport/StayExportList.razor
@@ -52,8 +52,13 @@
-
+
+
+
+
+
@@ -118,7 +123,21 @@
{
string jsonParams = JsonSerializer.Serialize(dto.ExportParams, options: new() { WriteIndented = true });
- await DialogService.ShowMessageBoxAsync("Details", jsonParams);
+ await DialogService.ShowMessageBoxAsync("Details", (MarkupString)$"{jsonParams}");
+ }
+
+ private async Task ShowExportDetails(StayExportFileDTO dto)
+ {
+ if (string.IsNullOrEmpty(dto.ExportDetails))
+ {
+ userMessage.ShowMessage("This ExportFile doesn't have any export details", MessageKind.Info);
+ return;
+ }
+
+ using var jDoc = JsonDocument.Parse(dto.ExportDetails);
+ string jsonDetails = JsonSerializer.Serialize(jDoc, new JsonSerializerOptions { WriteIndented = true });
+
+ await DialogService.ShowMessageBoxAsync("Details", (MarkupString)$"{jsonDetails}");
}
private async Task BtnDownloadFile(StayExportFileDTO item)
diff --git a/src/Somnia.GuestLog/Infrastructure/DbConsts.cs b/src/Somnia.GuestLog/Infrastructure/DbConsts.cs
index 605bd6e..7ed1c53 100644
--- a/src/Somnia.GuestLog/Infrastructure/DbConsts.cs
+++ b/src/Somnia.GuestLog/Infrastructure/DbConsts.cs
@@ -6,5 +6,7 @@ public static class DbConsts
public const string DbType_Timestamptz_0 = "timestamp(0) with time zone";
public const string DbType_Timestamptz_3 = "timestamp(3) with time zone";
+ public const string DbType_jsonb = "jsonb";
+
public const string PK_NotApply = "N/A";
}
diff --git a/src/Somnia.GuestLog/Infrastructure/EntityConfigs/StayExportFileEntityConfig.cs b/src/Somnia.GuestLog/Infrastructure/EntityConfigs/StayExportFileEntityConfig.cs
index a76653f..38df0f1 100644
--- a/src/Somnia.GuestLog/Infrastructure/EntityConfigs/StayExportFileEntityConfig.cs
+++ b/src/Somnia.GuestLog/Infrastructure/EntityConfigs/StayExportFileEntityConfig.cs
@@ -25,6 +25,9 @@ public class StayExportFileEntityConfig : IEntityTypeConfiguration e.ExportedPath)
.HasMaxLength(256);
+ builder.Property(e => e.ExportDetails)
+ .HasColumnType(DbConsts.DbType_jsonb);
+
builder.Property(e => e.ExportTime)
.IsRequired()
diff --git a/src/Somnia.GuestLog/Infrastructure/Migrations/20260908172441_StayExportFile_AddColumn_ExportDetails.Designer.cs b/src/Somnia.GuestLog/Infrastructure/Migrations/20260908172441_StayExportFile_AddColumn_ExportDetails.Designer.cs
new file mode 100644
index 0000000..084e0f2
--- /dev/null
+++ b/src/Somnia.GuestLog/Infrastructure/Migrations/20260908172441_StayExportFile_AddColumn_ExportDetails.Designer.cs
@@ -0,0 +1,252 @@
+//
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using Somnia.GuestLog.Infrastructure;
+
+#nullable disable
+
+namespace Somnia.GuestLog.Infrastructure.Migrations
+{
+ [DbContext(typeof(GuestLogContext))]
+ [Migration("20260908172441_StayExportFile_AddColumn_ExportDetails")]
+ partial class StayExportFile_AddColumn_ExportDetails
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "10.0.7")
+ .HasAnnotation("Proxies:ChangeTracking", false)
+ .HasAnnotation("Proxies:CheckEquality", false)
+ .HasAnnotation("Proxies:LazyLoading", true)
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("GuestDocumentStayEntry", b =>
+ {
+ b.Property("StayEntryId")
+ .HasColumnType("bigint");
+
+ b.Property("GuestDocumentsId")
+ .HasColumnType("bigint");
+
+ b.Property("GuestDocumentsVersion")
+ .HasColumnType("integer");
+
+ b.HasKey("StayEntryId", "GuestDocumentsId", "GuestDocumentsVersion");
+
+ b.HasIndex("GuestDocumentsId", "GuestDocumentsVersion");
+
+ b.ToTable("GuestDocumentStayEntry");
+ });
+
+ modelBuilder.Entity("Somnia.GuestLog.Models.Entities.GuestDocument", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Version")
+ .HasColumnType("integer");
+
+ b.Property("BirthDate")
+ .HasColumnType("date");
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamp(3) with time zone");
+
+ b.Property("DocumentNum")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)");
+
+ b.Property("DocumentType")
+ .IsRequired()
+ .HasMaxLength(8)
+ .HasColumnType("character varying(8)");
+
+ b.Property("EmailAddress")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property("Gender")
+ .HasMaxLength(1)
+ .HasColumnType("character varying(1)");
+
+ b.Property("IsLastVersion")
+ .HasColumnType("boolean");
+
+ b.Property("IssueDate")
+ .HasColumnType("date");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)");
+
+ b.Property("Nationality")
+ .IsRequired()
+ .HasMaxLength(3)
+ .HasColumnType("character varying(3)");
+
+ b.Property("PhoneNumber")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)");
+
+ b.Property("SupportNum")
+ .HasMaxLength(10)
+ .HasColumnType("character varying(10)");
+
+ b.Property("Surname")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)");
+
+ b.Property("Surname2")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamp(3) with time zone");
+
+ b.ComplexProperty(typeof(Dictionary), "AddressDetails", "Somnia.GuestLog.Models.Entities.GuestDocument.AddressDetails#GuestAddress", b1 =>
+ {
+ b1.Property("Address")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)");
+
+ b1.Property("AddressCity")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)");
+
+ b1.Property("AddressCountry")
+ .IsRequired()
+ .HasMaxLength(3)
+ .HasColumnType("character varying(3)");
+
+ b1.Property("AddressProvince")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)");
+
+ b1.Property("AddressState")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)");
+
+ b1.Property("ZipCode")
+ .HasMaxLength(12)
+ .HasColumnType("character varying(12)");
+ });
+
+ b.HasKey("Id", "Version");
+
+ b.ToTable("GuestDocument", (string)null);
+ });
+
+ modelBuilder.Entity("Somnia.GuestLog.Models.Entities.StayEntry", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("CreateTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DateIn")
+ .HasColumnType("timestamp(0) with time zone");
+
+ b.Property("DateOut")
+ .HasColumnType("timestamp(0) with time zone");
+
+ b.Property("PaymentMethod")
+ .IsRequired()
+ .HasMaxLength(5)
+ .HasColumnType("character varying(5)");
+
+ b.Property("RoomCount")
+ .HasColumnType("integer");
+
+ b.Property("RoomNumber")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)");
+
+ b.Property("UpdateTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.ToTable("StayEntry", (string)null);
+ });
+
+ modelBuilder.Entity("Somnia.GuestLog.Models.Entities.StayExportFile", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ExportDetails")
+ .HasColumnType("jsonb");
+
+ b.Property("ExportFormat")
+ .HasColumnType("integer");
+
+ b.Property("ExportResult")
+ .HasColumnType("integer");
+
+ b.Property("ExportTime")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("ExportedPath")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.ComplexProperty(typeof(Dictionary), "ExportParams", "Somnia.GuestLog.Models.Entities.StayExportFile.ExportParams#StayExportParams", b1 =>
+ {
+ b1.IsRequired();
+
+ b1.Property("ExportPeriodEnd");
+
+ b1.Property("ExportPeriodStart");
+
+ b1.Property("ExportType");
+
+ b1
+ .ToJson("ExportParams")
+ .HasColumnType("jsonb");
+ });
+
+ b.HasKey("Id");
+
+ b.ToTable("StayExportFile", (string)null);
+ });
+
+ modelBuilder.Entity("GuestDocumentStayEntry", b =>
+ {
+ b.HasOne("Somnia.GuestLog.Models.Entities.StayEntry", null)
+ .WithMany()
+ .HasForeignKey("StayEntryId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Somnia.GuestLog.Models.Entities.GuestDocument", null)
+ .WithMany()
+ .HasForeignKey("GuestDocumentsId", "GuestDocumentsVersion")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/Somnia.GuestLog/Infrastructure/Migrations/20260908172441_StayExportFile_AddColumn_ExportDetails.cs b/src/Somnia.GuestLog/Infrastructure/Migrations/20260908172441_StayExportFile_AddColumn_ExportDetails.cs
new file mode 100644
index 0000000..7f1a00b
--- /dev/null
+++ b/src/Somnia.GuestLog/Infrastructure/Migrations/20260908172441_StayExportFile_AddColumn_ExportDetails.cs
@@ -0,0 +1,28 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Somnia.GuestLog.Infrastructure.Migrations
+{
+ ///
+ public partial class StayExportFile_AddColumn_ExportDetails : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AddColumn(
+ name: "ExportDetails",
+ table: "StayExportFile",
+ type: "jsonb",
+ nullable: true);
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "ExportDetails",
+ table: "StayExportFile");
+ }
+ }
+}
diff --git a/src/Somnia.GuestLog/Infrastructure/Migrations/GuestLogContextModelSnapshot.cs b/src/Somnia.GuestLog/Infrastructure/Migrations/GuestLogContextModelSnapshot.cs
index a16ff5b..f4b45a2 100644
--- a/src/Somnia.GuestLog/Infrastructure/Migrations/GuestLogContextModelSnapshot.cs
+++ b/src/Somnia.GuestLog/Infrastructure/Migrations/GuestLogContextModelSnapshot.cs
@@ -193,6 +193,9 @@ namespace Somnia.GuestLog.Infrastructure.Migrations
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+ b.Property("ExportDetails")
+ .HasColumnType("jsonb");
+
b.Property("ExportFormat")
.HasColumnType("integer");
diff --git a/src/Somnia.GuestLog/Models/DTOs/StayExportFileDTO.cs b/src/Somnia.GuestLog/Models/DTOs/StayExportFileDTO.cs
index eed1c97..d8b94d3 100644
--- a/src/Somnia.GuestLog/Models/DTOs/StayExportFileDTO.cs
+++ b/src/Somnia.GuestLog/Models/DTOs/StayExportFileDTO.cs
@@ -13,6 +13,8 @@ public class StayExportFileDTO
public StayExportFileResult? ExportResult { get; set; }
public string? ExportedPath { get; set; }
+
+ public string? ExportDetails { get; set; }
public DateTime? ExportTime { get; set; }
diff --git a/src/Somnia.GuestLog/Models/Entities/StayExportFile.cs b/src/Somnia.GuestLog/Models/Entities/StayExportFile.cs
index 724049e..60eb53e 100644
--- a/src/Somnia.GuestLog/Models/Entities/StayExportFile.cs
+++ b/src/Somnia.GuestLog/Models/Entities/StayExportFile.cs
@@ -17,6 +17,11 @@ public class StayExportFile : BaseEntity
///
public string? ExportedPath { get; set; }
+ ///
+ /// A JSON column to store details about the exported file.
+ /// This details can contain information about errors, which stays where included, etc.
+ ///
+ public string? ExportDetails { get; set; }
///
/// Date/Time when export file was generated.
diff --git a/src/Somnia.GuestLog/Models/EntityMapping.cs b/src/Somnia.GuestLog/Models/EntityMapping.cs
index 019a902..4af4e7b 100644
--- a/src/Somnia.GuestLog/Models/EntityMapping.cs
+++ b/src/Somnia.GuestLog/Models/EntityMapping.cs
@@ -67,6 +67,7 @@ internal static class EntityMapping
ExportParams = exportParamsDto,
ExportResult = entity.ExportResult,
ExportedPath = entity.ExportedPath,
+ ExportDetails = entity.ExportDetails,
ExportTime = entity.ExportTime,
};
}
diff --git a/src/Somnia.GuestLog/Program.cs b/src/Somnia.GuestLog/Program.cs
index 44b56c4..a146770 100644
--- a/src/Somnia.GuestLog/Program.cs
+++ b/src/Somnia.GuestLog/Program.cs
@@ -1,3 +1,4 @@
+using FluentStorage;
using FluentValidation;
using Microsoft.AspNetCore.Localization;
using Microsoft.EntityFrameworkCore;
@@ -115,4 +116,7 @@ app.MapStaticAssets();
app.MapRazorComponents()
.AddInteractiveServerRenderMode();
+//Activate S3 storage.
+AwsS3Storage.Use();
+
app.Run();
diff --git a/src/Somnia.GuestLog/Resources/LanguageLocale.resx b/src/Somnia.GuestLog/Resources/LanguageLocale.resx
index 0b9252b..73211ec 100644
--- a/src/Somnia.GuestLog/Resources/LanguageLocale.resx
+++ b/src/Somnia.GuestLog/Resources/LanguageLocale.resx
@@ -154,6 +154,7 @@
Export Params
Export Result
Export Path
+ Export Details
Export Time
Export Type
diff --git a/src/Somnia.GuestLog/Services/Entity/StayExportFileEntityService.cs b/src/Somnia.GuestLog/Services/Entity/StayExportFileEntityService.cs
index fe97fe2..f22609f 100644
--- a/src/Somnia.GuestLog/Services/Entity/StayExportFileEntityService.cs
+++ b/src/Somnia.GuestLog/Services/Entity/StayExportFileEntityService.cs
@@ -36,6 +36,7 @@ public class StayExportFileEntityService(
ExportParams = exportParams,
ExportResult = dto.ExportResult.Value,
ExportedPath = dto.ExportedPath,
+ ExportDetails = dto.ExportDetails,
ExportTime = dto.ExportTime?.ToUniversalTime() ?? DateTime.UtcNow,
};
diff --git a/src/Somnia.GuestLog/Services/StayExport/IStayExportFormatProvider.cs b/src/Somnia.GuestLog/Services/StayExport/IStayExportFormatProvider.cs
index 60de696..3ef03f6 100644
--- a/src/Somnia.GuestLog/Services/StayExport/IStayExportFormatProvider.cs
+++ b/src/Somnia.GuestLog/Services/StayExport/IStayExportFormatProvider.cs
@@ -14,6 +14,6 @@ public interface IStayExportFormatProvider
///
/// List of Stays to export
/// Stream to copy exported data.
- public Task ExportDataAsync(IEnumerable stayList, Stream dataStream);
+ public Task<(StayExportFileResult fileResult, string? exportDetails)> ExportDataAsync(IEnumerable stayList, Stream dataStream);
}
\ No newline at end of file
diff --git a/src/Somnia.GuestLog/Services/StayExport/StayExportProviderJson.cs b/src/Somnia.GuestLog/Services/StayExport/StayExportProviderJson.cs
index 02ccf19..2f80d72 100644
--- a/src/Somnia.GuestLog/Services/StayExport/StayExportProviderJson.cs
+++ b/src/Somnia.GuestLog/Services/StayExport/StayExportProviderJson.cs
@@ -13,15 +13,18 @@ public class StayExportProviderJson : IStayExportFormatProvider
=> $"{Enum.GetName(GetFormat())}_{exportTime.ToFileTimeUtc()}.{fileExtension}";
- public async Task ExportDataAsync(IEnumerable stayList, Stream dataStream)
+ public async Task<(StayExportFileResult fileResult, string? exportDetails)> ExportDataAsync(IEnumerable stayList, Stream dataStream)
{
if (!stayList.Any())
{
- return StayExportFileResult.NoData;
+ return (fileResult: StayExportFileResult.NoData, exportDetails: null);
}
// Convert to JSON.
await JsonSerializer.SerializeAsync(dataStream, stayList);
- return StayExportFileResult.OK;
+
+ List exportDetails = [.. stayList.Where(s => s.Id != null).Select(s => s.Id?.ToString() ?? "")];
+ string details = JsonSerializer.Serialize(exportDetails);
+ return (fileResult: StayExportFileResult.OK, exportDetails: details);
}
}
\ No newline at end of file
diff --git a/src/Somnia.GuestLog/Services/StayExport/StayExportProviderSpainParteViajeros.cs b/src/Somnia.GuestLog/Services/StayExport/StayExportProviderSpainParteViajeros.cs
index 68fc1be..6b47947 100644
--- a/src/Somnia.GuestLog/Services/StayExport/StayExportProviderSpainParteViajeros.cs
+++ b/src/Somnia.GuestLog/Services/StayExport/StayExportProviderSpainParteViajeros.cs
@@ -1,4 +1,5 @@
using System.Diagnostics;
+using System.Text.Json;
using System.Xml.Serialization;
using FluentValidation;
using Microsoft.Extensions.Options;
@@ -17,6 +18,9 @@ public class StayExportProviderSpainParteViajeros(
{
private const string fileExtension = "xml";
+ private const string ExportDetailsResult_Error = "Error";
+ private const string ExportDetailsResult_Ok = "Ok";
+
private const string PersonRole = "VI";
private const string PersonRelation = "OT";
@@ -31,32 +35,35 @@ public class StayExportProviderSpainParteViajeros(
private readonly StayExportSpainParteViajerosConfig config = configOptions.Value;
+
public StayExportFormat GetFormat() => StayExportFormat.SpainParteViajeros;
public string GetFilename(DateTime exportTime)
=> $"{Enum.GetName(GetFormat())}_{exportTime.ToFileTimeUtc()}.{fileExtension}";
- public async Task ExportDataAsync(IEnumerable stayList, Stream dataStream)
+ public async Task<(StayExportFileResult fileResult, string? exportDetails)> ExportDataAsync(IEnumerable stayList, Stream dataStream)
{
if (string.IsNullOrEmpty(config.CodigoEstablecimiento))
{
logger.LogError("StayExportProviderSpainParteViajeros - Config error: CodigoEstablecimiento is not configured!");
- return StayExportFileResult.ExportError;
+ return (fileResult: StayExportFileResult.ExportError, exportDetails: null);
}
if (!stayList.Any())
{
- return StayExportFileResult.NoData;
+ return (fileResult: StayExportFileResult.NoData, exportDetails: null);
}
+ List stayExportDetails = [];
ComunicacionValidator comunicacionValidator = new();
List comunicacionsList = [];
foreach (StayEntryDTO stay in stayList)
{
- (Comunicacion? comunicacion, string code) = await GetComunicacionFromStay(stay);
+ (Comunicacion? comunicacion, string errorMsg) = await GetComunicacionFromStay(stay);
if (comunicacion == null)
{
- logger.LogWarning("StayExportProviderSpainParteViajeros - Stay (ID: {id}) can't be exported: Code: {code}", stay.Id, code);
+ logger.LogWarning("StayExportProviderSpainParteViajeros - Stay (ID: {id}) can't be exported: Error: {code}", stay.Id, errorMsg);
+ stayExportDetails.Add(new(StayId: stay.Id ?? -1, ExportResult: ExportDetailsResult_Error, Details: errorMsg));
continue;
}
@@ -64,11 +71,13 @@ public class StayExportProviderSpainParteViajeros(
if (!errors.IsValid)
{
logger.LogWarning("StayExportProviderSpainParteViajeros - Stay (ID: {id}) is invalid: Errors: {errors}", stay.Id, errors.Errors);
+ stayExportDetails.Add(new(StayId: stay.Id ?? -1, ExportResult: ExportDetailsResult_Error, Details: errors.ToString()));
continue;
}
comunicacionsList.Add(comunicacion);
logger.LogInformation("StayExportProviderSpainParteViajeros - Stay (ID: {id}) Exported OK", stay.Id);
+ stayExportDetails.Add(new(StayId: stay.Id ?? -1, ExportResult: ExportDetailsResult_Ok, Details: null));
}
Peticion peticion = new()
@@ -83,12 +92,13 @@ public class StayExportProviderSpainParteViajeros(
XmlSerializer serializer = new(typeof(Peticion));
serializer.Serialize(dataStream, peticion);
- return StayExportFileResult.OK;
+ string details = JsonSerializer.Serialize(stayExportDetails);
+ return (fileResult: StayExportFileResult.OK, exportDetails: details);
}
#region Internal Methods
- private async Task<(Comunicacion? comunicacion, string code)> GetComunicacionFromStay(StayEntryDTO stay)
+ private async Task<(Comunicacion? comunicacion, string errorMsg)> GetComunicacionFromStay(StayEntryDTO stay)
{
Debug.Assert(stay.Id != null
&& stay.DateIn != null
@@ -136,7 +146,7 @@ public class StayExportProviderSpainParteViajeros(
{
return (
comunicacion: null,
- code: "NoCodigoMunicipio"
+ errorMsg: "Can't get codigo municio"
);
}
}
@@ -167,7 +177,7 @@ public class StayExportProviderSpainParteViajeros(
contrato = contrato,
persona = personasList
},
- code: "OK");
+ errorMsg: "OK");
}
private static string? GetTipoDocumentoFromGuest(GuestDocumentDTO doc)
@@ -309,6 +319,8 @@ public class StayExportProviderSpainParteViajeros(
#region Export Data Classes
+ private record StayExportDetails(long StayId, string ExportResult, string? Details);
+
[XmlRoot(ElementName = "peticion", Namespace = XmlNamespace_Peticion)]
public class Peticion
{
diff --git a/src/Somnia.GuestLog/Services/StayExport/StayExportService.cs b/src/Somnia.GuestLog/Services/StayExport/StayExportService.cs
index bdf2894..557760e 100644
--- a/src/Somnia.GuestLog/Services/StayExport/StayExportService.cs
+++ b/src/Somnia.GuestLog/Services/StayExport/StayExportService.cs
@@ -58,7 +58,7 @@ public class StayExportService(
{
//Create Format provider and export data to stream.
var provider = providerFactory.GetProvider(format);
- exportResult = await provider.ExportDataAsync(stayList, exportedDataStream);
+ (exportResult, stayExport.ExportDetails) = await provider.ExportDataAsync(stayList, exportedDataStream);
// "Rewind" stream so it can be read from the begining when uploading.
exportedDataStream.Seek(0, SeekOrigin.Begin);