diff --git a/src/Mindee/Parsing/Fr/IdCard/IdCardV1Prediction.cs b/src/Mindee/Parsing/Fr/IdCard/IdCardV1Prediction.cs
new file mode 100644
index 00000000..88dc0b7c
--- /dev/null
+++ b/src/Mindee/Parsing/Fr/IdCard/IdCardV1Prediction.cs
@@ -0,0 +1,97 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.Json.Serialization;
+using Mindee.Parsing.Common;
+
+namespace Mindee.Parsing.Fr.IdCard
+{
+ ///
+ /// The french id card model for the v1.
+ ///
+ [Endpoint("idcard_fr", "1")]
+ public sealed class IdCardV1Prediction
+ {
+ ///
+ /// The authority which has issued the card.
+ ///
+ [JsonPropertyName("authority")]
+ public StringField Authority { get; set; }
+
+ ///
+ /// The birth date of the person.
+ ///
+ [JsonPropertyName("birth_date")]
+ public StringField BirthDate { get; set; }
+
+ ///
+ /// The birth place of the person.
+ ///
+ [JsonPropertyName("birth_place")]
+ public StringField BirthPlace { get; set; }
+
+ ///
+ /// The expiry date of the card.
+ ///
+ [JsonPropertyName("expiry_date")]
+ public StringField ExpiryDate { get; set; }
+
+ ///
+ /// The gender of the person.
+ ///
+ [JsonPropertyName("gender")]
+ public StringField Gender { get; set; }
+
+ ///
+ /// The list of the names of the person.
+ ///
+ [JsonPropertyName("given_names")]
+ public List GivenNames { get; set; }
+
+ ///
+ /// The id number of the card.
+ ///
+ [JsonPropertyName("id_number")]
+ public StringField IdNumber { get; set; }
+
+ ///
+ /// The first mrz value.
+ ///
+ [JsonPropertyName("mrz1")]
+ public StringField Mrz1 { get; set; }
+
+ ///
+ /// The second mrz value.
+ ///
+ [JsonPropertyName("mrz2")]
+ public StringField Mrz2 { get; set; }
+
+ ///
+ /// The surname of the person.
+ ///
+ [JsonPropertyName("surname")]
+ public StringField Surname { get; set; }
+
+ ///
+ /// A prettier reprensentation of the current model values.
+ ///
+ public override string ToString()
+ {
+ StringBuilder result = new StringBuilder("----- FR ID Card V1 -----\n");
+ result.Append($"Authority: {Authority.Value}\n");
+ result.Append($"Given names: {string.Join(" ", GivenNames.Select(gn => gn.Value))}\n");
+ result.Append($"Surname: {Surname.Value}\n");
+ result.Append($"Gender: {Gender.Value}\n");
+ result.Append($"ID Number: {IdNumber.Value}\n");
+ result.Append($"Birth date: {BirthDate.Value}\n");
+ result.Append($"Birth place: {BirthPlace.Value}\n");
+ result.Append($"Expiry date: {ExpiryDate.Value}\n");
+ result.Append($"MRZ 1: {Mrz1.Value}\n");
+ result.Append($"MRZ 2: {Mrz2.Value}\n");
+
+ result.Append("----------------------\n");
+
+ return SummaryHelper.Clean(result.ToString());
+ }
+ }
+}
diff --git a/tests/Mindee.UnitTests/Parsing/Fr/IdCard/IdCardV1Test.cs b/tests/Mindee.UnitTests/Parsing/Fr/IdCard/IdCardV1Test.cs
new file mode 100644
index 00000000..9d388788
--- /dev/null
+++ b/tests/Mindee.UnitTests/Parsing/Fr/IdCard/IdCardV1Test.cs
@@ -0,0 +1,54 @@
+using Mindee.Parsing;
+using Mindee.Parsing.Fr.IdCard;
+
+namespace Mindee.UnitTests.Parsing.Fr.IdCard
+{
+ [Trait("Category", "FR Id Card V1")]
+ public class IdCardV1Test
+ {
+ [Fact]
+ public async Task Predict_CheckSummary()
+ {
+ var mindeeAPi = GetMindeeApiForFrIdCard();
+ var prediction = await mindeeAPi.PredictAsync(ParsingTestBase.GetFakePredictParameter());
+
+ var expected = File.ReadAllText("Resources/fr/id_card/response_v1/doc_to_string.txt");
+
+ Assert.Equal(
+ CleaningResult(expected),
+ prediction.Inference.Prediction.ToString());
+ }
+
+ [Fact]
+ public async Task Predict_CheckSummary_WithMultiplePages()
+ {
+ var mindeeAPi = GetMindeeApiForFrIdCard();
+ var prediction = await mindeeAPi.PredictAsync(ParsingTestBase.GetFakePredictParameter());
+
+ var expected = File.ReadAllText("Resources/fr/id_card/response_v1/page0_to_string.txt");
+
+ Assert.Equal(
+ CleaningResult(expected),
+ prediction.Inference.Prediction.ToString());
+ }
+
+ private string CleaningResult(string expectedSummary)
+ {
+ var indexFilename = expectedSummary.IndexOf("Filename");
+ var indexFilenameEOL = expectedSummary.IndexOf("\n", indexFilename);
+ string cleanedSummary = expectedSummary.Remove(indexFilename, indexFilenameEOL - indexFilename + 1);
+
+ // must be deleted when generic wil be place on the inference node
+ var indexDocumentSide = cleanedSummary.IndexOf("Document side");
+ var indexDocumentSideEOL = cleanedSummary.IndexOf("\n", indexDocumentSide);
+ cleanedSummary = cleanedSummary.Remove(indexDocumentSide, indexDocumentSideEOL - indexDocumentSide + 1);
+
+ return cleanedSummary;
+ }
+
+ private MindeeApi GetMindeeApiForFrIdCard(string fileName = "Resources/fr/id_card/response_v1/complete.json")
+ {
+ return ParsingTestBase.GetMindeeApi(fileName);
+ }
+ }
+}