diff --git a/src/Somnia.GuestLog/Services/Entity/StayEntryEntityService.cs b/src/Somnia.GuestLog/Services/Entity/StayEntryEntityService.cs index 000acae..4611e55 100644 --- a/src/Somnia.GuestLog/Services/Entity/StayEntryEntityService.cs +++ b/src/Somnia.GuestLog/Services/Entity/StayEntryEntityService.cs @@ -155,7 +155,8 @@ public class StayEntryEntityService( query = query.WhereIf(!string.IsNullOrEmpty(filter.PaymentMethod), e => e.PaymentMethod == filter.PaymentMethod); - query = query.OrderByDescending(e => e.DateIn); + query = query.OrderByDescending(e => e.DateIn) + .ThenByDescending(e => e.UpdateTime); if (limit > 0) { diff --git a/src/Somnia.GuestLog/Services/SpainCodigoMunicipio/SpainCodigoMunicipioCatastroService.cs b/src/Somnia.GuestLog/Services/SpainCodigoMunicipio/SpainCodigoMunicipioCatastroService.cs index c7109ee..003ba3f 100644 --- a/src/Somnia.GuestLog/Services/SpainCodigoMunicipio/SpainCodigoMunicipioCatastroService.cs +++ b/src/Somnia.GuestLog/Services/SpainCodigoMunicipio/SpainCodigoMunicipioCatastroService.cs @@ -63,7 +63,7 @@ public class SpainCodigoMunicipioCatastroService( return null; } - string finalCode = $"{codIne.codigoProvincia}{codIne.codigoMunicipio}"; + string finalCode = $"{codIne.codigoProvincia.PadLeft(2, '0')}{codIne.codigoMunicipio.PadLeft(3, '0')}"; codigoMunicipioCache.Add(cacheKey, finalCode); return finalCode; diff --git a/src/Somnia.GuestLog/Services/StayExport/StayExportProviderSpainParteViajeros.cs b/src/Somnia.GuestLog/Services/StayExport/StayExportProviderSpainParteViajeros.cs index 6b47947..f79e915 100644 --- a/src/Somnia.GuestLog/Services/StayExport/StayExportProviderSpainParteViajeros.cs +++ b/src/Somnia.GuestLog/Services/StayExport/StayExportProviderSpainParteViajeros.cs @@ -32,6 +32,7 @@ public class StayExportProviderSpainParteViajeros( private const string PersonDireccionPais_ESP = "ESP"; private const string XmlNamespace_Peticion = "http://www.neg.hospedajes.mir.es/altaParteHospedaje"; + private const string XmlNamespace_Peticion_Prefix = "ns2"; private readonly StayExportSpainParteViajerosConfig config = configOptions.Value; @@ -89,8 +90,12 @@ public class StayExportProviderSpainParteViajeros( } }; + //Create XmlSerializerNamespaces to add prefix-namespace pairs. + var docNamespaces = new XmlSerializerNamespaces(); + docNamespaces.Add(XmlNamespace_Peticion_Prefix, XmlNamespace_Peticion); + XmlSerializer serializer = new(typeof(Peticion)); - serializer.Serialize(dataStream, peticion); + serializer.Serialize(stream: dataStream, o: peticion, namespaces: docNamespaces); string details = JsonSerializer.Serialize(stayExportDetails); return (fileResult: StayExportFileResult.OK, exportDetails: details); @@ -146,7 +151,7 @@ public class StayExportProviderSpainParteViajeros( { return ( comunicacion: null, - errorMsg: "Can't get codigo municio" + errorMsg: $"Can't get codigo municipio for {doc.AddressProvince}-{doc.AddressCity} in doc {doc.FullDocument}" ); } } @@ -197,7 +202,7 @@ public class StayExportProviderSpainParteViajeros( return doc.Gender switch { GuestConsts.GenderOptions_MALE => "H", - GuestConsts.GenderOptions_FEMALE => "F", + GuestConsts.GenderOptions_FEMALE => "M", null => null, _ => "O" }; @@ -212,6 +217,7 @@ public class StayExportProviderSpainParteViajeros( { if (string.IsNullOrEmpty(doc.AddressCity) || string.IsNullOrEmpty(doc.AddressProvince)) { + logger.LogWarning("Found doc ({docNum}) without full address", doc.FullDocument); return null; } @@ -324,6 +330,7 @@ public class StayExportProviderSpainParteViajeros( [XmlRoot(ElementName = "peticion", Namespace = XmlNamespace_Peticion)] public class Peticion { + [XmlElement(Namespace = "")] public required Solicitud solicitud; } @@ -331,17 +338,20 @@ public class StayExportProviderSpainParteViajeros( public class Solicitud { public required string codigoEstablecimiento; + + [XmlElement(ElementName = "comunicacion")] public required List comunicacion; } - [XmlRoot(ElementName = "comunicacion")] public class Comunicacion { + [XmlElement(ElementName = "contrato")] public required Contrato contrato; + + [XmlElement(ElementName = "persona")] public required List persona; } - [XmlRoot(ElementName = "contrato")] public class Contrato { public required string referencia; @@ -363,7 +373,6 @@ public class StayExportProviderSpainParteViajeros( public required Pago pago; } - [XmlRoot(ElementName = "persona")] public class Persona { public required string rol; @@ -379,12 +388,13 @@ public class StayExportProviderSpainParteViajeros( public required string nacionalidad; public required string sexo; + // BLOQUE DIRECCION + public required Direccion direccion; + public string? telefono; public string? correo; public required string parentesco; - // BLOQUE DIRECCION - public required Direccion direccion; } public class Pago