static async Task ComposeLabBlock(TextWriter writer, Func<int> lineNumberGetter, Action<int> lineNumberSetter, Lab lab)
        {
            var lineNumber = lineNumberGetter();

            //Lijn 1: “Medidoc” identificatienummer van het laboratorium. 
            //formaat: 4 karakters en wordt als volgt gevormd: de eerste letter van de provincie (W,O,A,B,L) gevolgd door de eerste twee cijfers van de postkode, gevolgd door een volgnummer binnen de stad of gemeente. (vb. W841 voor een labo te Oostende)
            lineNumber++;
            await writer.WriteLineAsync(lab.Id);

            //Lijn 2 6: Identificatiegegevens van het labo (naam, adres, tel ...)
            //formaat: vrije tekst met maximaal 50 karakters per lijn .
            lineNumber++;
            await writer.WriteLineAsync(lab.Name?.TrimToMaxSize(50));
            lineNumber++;
            await writer.WriteLineAsync(lab.Address1?.TrimToMaxSize(50));
            lineNumber++;
            await writer.WriteLineAsync(lab.Address2?.TrimToMaxSize(50));
            lineNumber++;
            await writer.WriteLineAsync(lab.IdentificationData1?.TrimToMaxSize(50));
            lineNumber++;
            await writer.WriteLineAsync(lab.IdentificationData2?.TrimToMaxSize(50));

            //Lijn 7: datum (+ eventueel tijdstip) aanmaak
            //formaat: JJJJMMDD(+evtHHMM)
            lineNumber++;
            await writer.WriteLineAsync(lab.Date?.IsMidnight() ?? false ?
                lab.Date?.ToString("yyyyMMdd") :
                lab.Date?.ToString("yyyyMMddHHmm"));

            //Lijn 8: RIZIV nummer aanvragende arts
            //formaat: C/CCCCC/CC/CCC
            lineNumber++;
            await writer.WriteLineAsync(Regex.Replace(lab.RequestingDoctor?.RizivNr ?? string.Empty, @"(\w{1})(\w{5})(\w{2})(\w{3})", @"$1/$2/$3/$4"));

            //lijn 9: Naam (positie 1-24) + Voornaam (positie 25-40) aanvragende arts
            lineNumber++;
            await writer.WriteLineAsync(string.Concat(lab.RequestingDoctor?.LastName?.TrimToMaxSize(24).PadRight(24) ?? string.Empty, lab.RequestingDoctor?.FirstName).TrimToMaxSize(40));

            foreach (var patient in lab.Patients)
                await ComposePatientBlock(writer, () => lineNumber, (ln) => lineNumber = ln, patient, true);

            lineNumber++;
            await writer.WriteLineAsync($"#/{lineNumber}");

            lineNumberSetter(lineNumber);
        }
Exemple #2
0
        static async Task<Lab> ParseLabBlock(TextReader reader, Func<int> lineNumberGetter, Action<int> lineNumberSetter, string line)
        {
            var lab = new Lab();
            var lineNumber = lineNumberGetter();

            //Lijn 1: “Medidoc” identificatienummer van het laboratorium. 
            //formaat: 4 karakters en wordt als volgt gevormd: de eerste letter van de provincie (W,O,A,B,L) gevolgd door de eerste twee cijfers van de postkode, gevolgd door een volgnummer binnen de stad of gemeente. (vb. W841 voor een labo te Oostende)
            if (line == null || !Regex.Match(line.Trim(), @"[WOABL]\d{3}", RegexOptions.IgnoreCase).Success)
                lab.ParserErrors.AddItem(lineNumber, $"Not valid start of lab block expected W,O,A,B,L followed by three digits but got '{line}'");
            lab.Id = line?.Trim();

            //Lijn 2 6: Identificatiegegevens van het labo (naam, adres, tel ...)
            //formaat: vrije tekst met maximaal 50 karakters per lijn .
            lineNumber++;
            lab.Name = (await reader.ReadLineAsync())?.CheckMaxSize(50, lab.ParserErrors, lineNumber).Trim();
            lineNumber++;
            lab.Address1 = (await reader.ReadLineAsync())?.CheckMaxSize(50, lab.ParserErrors, lineNumber).Trim();
            lineNumber++;
            lab.Address2 = (await reader.ReadLineAsync())?.CheckMaxSize(50, lab.ParserErrors, lineNumber).Trim();
            lineNumber++;
            lab.IdentificationData1 = (await reader.ReadLineAsync())?.CheckMaxSize(50, lab.ParserErrors, lineNumber).Trim();
            lineNumber++;
            lab.IdentificationData2 = (await reader.ReadLineAsync())?.CheckMaxSize(50, lab.ParserErrors, lineNumber).Trim();

            //Lijn 7: datum (+ eventueel tijdstip) aanmaak
            //formaat: JJJJMMDD(+evtHHMM)
            lineNumber++;
            lab.Date = (await reader.ReadLineAsync())?.ToNullableDatetime("yyyyMMddHHmm", "yyyyMMdd", "yyMMdd");

            lab.RequestingDoctor = new Doctor();
            //Lijn 8: RIZIV nummer aanvragende arts
            //formaat: C/CCCCC/CC/CCC
            lineNumber++;
            line = await reader.ReadLineAsync();
            if (line == null || !Regex.Match(line.Trim(), @"\d/\d{5}/\d{2}/\d{3}", RegexOptions.IgnoreCase).Success)
                lab.ParserErrors.AddItem(lineNumber, $"Not a valid rizivnumber: '{line}' of format C/CCCCC/CC/CCC");
            lab.RequestingDoctor.RizivNr = line?.Replace("/", string.Empty).Trim();

            //lijn 9: Naam (positie 1-24) + Voornaam (positie 25-40) aanvragende arts
            lineNumber++;
            var name = (await reader.ReadLineAsync())?.CheckMaxSize(40, lab.ParserErrors, lineNumber);
            lab.RequestingDoctor.LastName = name?.Substring(0, name.Length > 24 ? 24 : name.Length).Trim();
            if (name?.Length > 24)
                lab.RequestingDoctor.FirstName = name?.Substring(24).Trim();

            lineNumber++;
            line = await reader.ReadLineAsync();
            do
            {
                if (line == null || !line.StartsWith("#A"))
                {
                    lab.ParserErrors.AddItem(lineNumber, $"Not valid start of patient block expected '#A' but got '{line}'");
                    break;
                }

                if (line != null)
                    lab.Patients.Add(await ParsePatientBlock(reader, () => lineNumber, (ln) => lineNumber = ln, lab.ParserErrors, line, true));

                lineNumber++;
            }
            while ((line = (await reader.ReadLineAsync())) != null && !line.StartsWith(@"#/"));

            if (line == null || !line.StartsWith(@"#/"))
                lab.ParserErrors.AddItem(lineNumber, $"Expected end of lab blok '#/' but got '{line}'");

            lineNumberSetter(lineNumber);
            return lab;
        }