wiki:Documentatie/Ontwikkelaar/Procedures/Rapportages

TOC(heading=Rapportages)? TOC(heading=Procedures, sectionindex, compact, depth=3, allactive, Documentatie/Ontwikkelaar/Procedures/)? TOC(heading=Ontwikkelaar, sectionindex, compact, depth=2, allactive, Documentatie/Ontwikkelaar/)? TOC(heading=Documentatie, sectionindex, compact, depth=1, allactive, Documentatie/)?

Rapportages

OpenAC heeft een rapportage-framework dat het maken van rapportages vereenvoudigt. De ontwikkelaar implementeert enkele backend interfaces die het framework gebruikt om een gebruikersinterface te genereren en de rapportage exporteerbaar te maken.

Een rapportage is een speciale module die behalve interface IModule ook interface IRapportage implementeert. Rapportages bevinden zich in de namespace OpenACLogica.Rapportages

Naamgevingsconventie

Voorbeeld: Schadelastrapportage. Maak een map OpenAC Schadelast onder OpenACLogica/Rapportages. De rapportageklasse krijgt de postfix "Rapportage" en wordt dus SchadelastRapportage in de namespace OpenACLogica.Rapportages.Schadelast

Interface IModule

Interface IModule definieert 2 methods: RegistreerModule en ConfigureerModule.

RegistreerModule

ModuleInfo RegistreerModule();

RegistreerModule meldt een module aan bij het systeem en geeft een ModuleInfo-instantie terug.

public ModuleInfo RegistreerModule()
{
    var info = new ModuleInfo
    {
        Id = "schadelast",
        Naam = "Schadelast",
        Type = ModuleType.Rapportage,
        Helpcontext = "Manager/Rapportages/Productie/Schadelast"
    };
    return info;
}

ConfigureerModule

ModuleInfo ConfigureerModule();

Gebruik ConfigureerModule om rapportageparameters te definiëren. ConfigureerModule geeft een ModuleInfo-instantie terug.

public ModuleInfo ConfigureerModule()
{
    var info = RegistreerModule();

    info.Parameters.Registreer(new ConfiguratieParameter
    {
        Naam = "begin",
        Label = "Startdatum op of na",
        Default = "",
        Tooltip = "Subtrjajecten met startdatum op of na deze datum",
        Type = OpenACType.datum
    })
    .Registreer(new ConfiguratieParameter
    {
        Naam = "eind",
        Label = "t/m",
        Default = "",
        Tooltip = "Subtrajecten met startdatum op of voor deze datum",
        Type = OpenACType.datum
    });

    return info;
}

Het is mogelijk om parameters in te delen in één of meerdere groepen/layouts als volgt:

info.Parameters.Registreer(
    new ConfiguratieLayout { Naam = "inclusie", Label = "Inclusie" },
    new List<ConfiguratieParameter> 
    {
        new ConfiguratieParameter
        {
            Naam = "agb",
            Default = "",
            Tooltip = "AGB-locatie",
            Type = OpenACType.tekst,
            Waarden = agbLocaties
        },
        new ConfiguratieParameter
        {
            Naam = "maand_vanaf",
            Label = "Periode",
            Default = "",
            Tooltip = "Beginmaand",
            Type = OpenACType.tekst,
            Waarden = maanden
        },
        new ConfiguratieParameter
        {
            Naam = "jaar_vanaf",
            Labelpositie = Labelpositie.GEEN,
            Default = $"{ditJaar}",
            Tooltip = "Beginjaar",
            Type = OpenACType.tekst,
            Waarden = jaren
        }
    }
)
.Registreer(
    new ConfiguratieLayout { Naam = "exclusie", Label = "Exclusie"},
    new List<ConfiguratieParameter>
    {
        new ConfiguratieParameter
        {
            Naam = "aantekeningen",
            Labelpositie = Labelpositie.GEEN,
            Default = "",
            Tooltip = "Aantekeningen",
            Type = OpenACType.tekst,
            Lookup = "opmerking",
            IsMeerwaardig = true
        },
        new ConfiguratieParameter
        {
            Naam = "activiteiten",
            Labelpositie = Labelpositie.GEEN,
            Tooltip = "Activiteiten",
            Type = OpenACType.tekst,
            Lookup = "activiteit",
            IsMeerwaardig = true
        }
    }
);

return info;

Interface IRapportage

Interface IRapportage definieert 1 method: Execute.

Execute

public Task<RapportageData> Execute(ConfiguratieParameters parameters, string formaat);

Execute geeft een RapportageData-instantie terug.

namespace OpenACLogica.Rapportages.ViewModels
{
    /// <summary>
    /// RapportageData wordt teruggegeven door de Execute method van IRapportage implementaties
    /// </summary>
    public class RapportageData
    {
        /// <summary>
        /// De base filename van exportbestanden. Bijvoorbeeld: decursus-20220401-20220430-hoensbroek-notitie
        /// </summary>
        public string BaseFilename { get; set; } = "";
        /// <summary>
        /// Lijst met datasheets waaruit de rapportage is opgebouwd
        /// </summary>
        public List<Datasheet.Datasheet> Sheets { get; set; } = new List<Datasheet.Datasheet>();
    }
}

Datasheets

Elke rapportage is opgebouwd uit één of meerdere datasheets. De Execute-method van rapportages geeft RapportageData terug die een lijst met datasheets bevat.

Datasheets kunnen op verschillende manieren worden aangemaakt, afhankelijk van de presentatie:

  • Lijstvorm;
  • Vrije vorm.

Lijstvorm datasheets

Dit is het simpelste type datasheet. De sheet bestaat uit een rij kolomnamen en een x-aantal rijen met data. De simpelste manier om een datasheet in lijstvorm te maken is met de klassen Lijst, Kolom en Lijst:

  1. Instantieer een Lijst
var lijst = new Lijst { Naam = "Mijn sheet" };
  1. Definieer kolommen
lijst.Kolommen.Add(new Kolom { Naam = "Naam"});
lijst.Kolommen.Add(new Kolom { Naam = "Geboortedatum" });
  1. Instantieer een Lijstrij voor elk record, vul de rij met gegevens en voeg de rij toe aan de lijst
foreach (var record in data)
{
    var rij = new Modules.Lijsten.ViewModels.Lijstrij();
    rij.Add(record.Naam);
    rij.Add(record.Geboortedatum);
    lijst.Rijen.Add(rij);
}
  1. Converteer de Lijst naar een Datasheet
var sheet = new LijstDatasheetAdapter(lijst).Datasheet(verbergYAs: false);

Vrije vorm datasheets

Als de indeling van een datasheet ingewikkelder is dan een simpele lijst dan werken we rechtstreeks met de Datasheet klasse. Dat vereist iets meer typwerk maar biedt meer vrijheid.

  1. Instantieer een Datasheet
var d = new Datasheet.Datasheet("Toegangstijden retrospectief")
{
    VerbergAssen = true
};
  1. [optioneel] Voeg headers toe aan de rapportage
d.SetHeaders($"Toegangstijden retrospectief voor locatie {locatie}", parameters);

Deze functie maakt een header voor elke parameter. Als je meer controle wilt over de opmaak dan kun je de headers afzonderlijk opnemen

d.SetHeader("Overzicht", $"Toegangstijden retrospectief voor locatie {locatie}");
d.SetHeader("Opmaakdatum", new Datum().ToString(formaat: Datumformaat.NL));
d.SetHeader("Periode begin", new Datum(begin).ToString(formaat: Datumformaat.NL));
d.SetHeader("Periode eind", new Datum(eind).ToString(formaat: Datumformaat.NL));
  1. Definieer kolommen
d.MaakKolom("Groep", 60);
d.MaakKolom("Naam", 40);
d.MaakKolom("Geboortedatum", 15);
  1. Schrijf data naar de sheet
var headeropmaak = new CellAttr { Bold = true };
var row = 1

foreach (var record in data)
{
    row = d.Schrijf(row, "Groep", "Sectietitel", attr: new CellAttr { Achtergrondkleur = "#E6E6F0", Bold = true, Colspan = 5 });
    d.Schrijf(row, "Naam", "Naam", attr: headeropmaak);
    d.Schrijf(row, "Datum", "Datum", attr: headeropmaak);
    d.Schrijf(row, "Groep", record.Groep);
    d.Schrijf(row, "Naam", record.Naam);
    row = d.Schrijf(row, "Datum", record.Datum);
}

Datasheet.Schrijf neemt als eerste argument een rijnummer, als tweede een kolomnaam, als derde een waarde (dynamic) en optioneel als vierde argument een CellAttr. Schrijf retourneert het nummer van de volgende rij.

Hyperlinks in cellen

Het is mogelijk om een cel in de datasheet te vullen met een hyperlink, bijvoorbeeld naar een entry/box in het dossier. Dit kan met property CellAttr.Link. Onderstaande code definieert een link naar een specifiek zorgtraject in het dossier:

var patientlink = $"/patienten/{contact.Patient.Key}/dossier";
var zorgtrajectlink = $"{patientlink}?box=patient({contact.Patient.Key})/behandelingen({contact.Verwijzing.ZorgtrajectKey})";

Hierbij is patientlink de url van een dossier. Aan deze url kan optioneel het get-argument "box" worden meegegeven. zorgtrajectlink is de volledige url naar het zorgtraject. Als een gebruiker op de link klikt dan opent OpenAC het dossier en opent de box van het zorgtraject.

  1. Hyperlink in combinatie met Lijstrij.Add
rij.Add(new Cell { Waarde = contact.Patient.Key, Attr = new CellAttr { Link = patientlink } });

Merk op dat Lijstrij een overridden Add-method heeft die een Cell neemt in plaats van een string.

  1. Hyperlink in combinatie met Datasheet.Schrijf
d.Schrijf(row, "Naam", record.Naam, attr: new CellAttr { Link = patientlink })

Rapportage toevoegen aan het menu

Voor nu moet elke rapportage handmatig aan het menu worden toegevoegd. Dat kan door in OpenACWeb/clientapp/src/routes.js een element toe te voegen aan het menu met path '/rapportages':

Error: Failed to load processor javascript
No macro or processor named 'javascript' found

Hierbij is path '/rapportages/<id van de rapportage>' en Component altijd Rapportage.

In de toekomst willen we de rapportage menu-items automatisch genereren.

Last modified 3 years ago Last modified on 12/15/22 11:24:35