diff --git a/src/OutlookAddin.Core/Json/FlexibleStringConverter.cs b/src/OutlookAddin.Core/Json/FlexibleStringConverter.cs
new file mode 100644
index 0000000..9428007
--- /dev/null
+++ b/src/OutlookAddin.Core/Json/FlexibleStringConverter.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Globalization;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace MarcusLaw.OutlookAddin.Core.Json
+{
+ ///
+ /// Reads a JSON value as when the source might be
+ /// either a string OR a number (or null). EspoCRM exposes fields such
+ /// as Case.number sometimes as JSON numbers (auto-increment) and
+ /// sometimes as JSON strings (custom case codes) depending on field
+ /// configuration; with a plain string? property the deserializer
+ /// would throw on the numeric form.
+ ///
+ public sealed class FlexibleStringConverter : JsonConverter
+ {
+ public override string? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ switch (reader.TokenType)
+ {
+ case JsonTokenType.Null:
+ return null;
+ case JsonTokenType.String:
+ return reader.GetString();
+ case JsonTokenType.Number:
+ if (reader.TryGetInt64(out var l)) return l.ToString(CultureInfo.InvariantCulture);
+ if (reader.TryGetDouble(out var d)) return d.ToString("R", CultureInfo.InvariantCulture);
+ return reader.GetDecimal().ToString(CultureInfo.InvariantCulture);
+ case JsonTokenType.True:
+ return "true";
+ case JsonTokenType.False:
+ return "false";
+ default:
+ reader.Skip();
+ return null;
+ }
+ }
+
+ public override void Write(Utf8JsonWriter writer, string? value, JsonSerializerOptions options)
+ {
+ if (value == null) writer.WriteNullValue();
+ else writer.WriteStringValue(value);
+ }
+ }
+}
diff --git a/src/OutlookAddin.Core/Models/CaseEntity.cs b/src/OutlookAddin.Core/Models/CaseEntity.cs
index 220f1f2..80f014c 100644
--- a/src/OutlookAddin.Core/Models/CaseEntity.cs
+++ b/src/OutlookAddin.Core/Models/CaseEntity.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
+using MarcusLaw.OutlookAddin.Core.Json;
namespace MarcusLaw.OutlookAddin.Core.Models
{
@@ -12,7 +13,11 @@ namespace MarcusLaw.OutlookAddin.Core.Models
[JsonPropertyName("name")]
public string? Name { get; set; }
+ // EspoCRM serializes the case number as a JSON number on some
+ // installs (auto-increment column) and as a string on others
+ // (custom case-code formatter). Accept both.
[JsonPropertyName("number")]
+ [JsonConverter(typeof(FlexibleStringConverter))]
public string? Number { get; set; }
[JsonPropertyName("status")]
diff --git a/src/OutlookAddin/OutlookAddin.csproj b/src/OutlookAddin/OutlookAddin.csproj
index 4567767..a287928 100644
--- a/src/OutlookAddin/OutlookAddin.csproj
+++ b/src/OutlookAddin/OutlookAddin.csproj
@@ -36,7 +36,7 @@
C:\Users\Chaim\source\repos\OutlookAddin\Publish\
\\192.168.10.97\Projects\LegalCRM\Add-in\
en
- 1.0.0.2
+ 1.0.0.4
true
true
7
@@ -258,6 +258,18 @@
OutlookAddin.Ribbon.InspectorRibbon.xml
+
+ OutlookAddin.Images.klear-file.png
+
+
+ OutlookAddin.Images.klear-sidebar.png
+
+
+ OutlookAddin.Images.klear-settings.png
+
+
+ OutlookAddin.Images.klear-compose.png
+
Code
@@ -347,7 +359,7 @@
-
+