npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

fmk-dosis-til-tekst-ts

v1.2.24

Published

Calculate short- and long dosage translations texts for use by FMK and FMK-clients

Downloads

211

Readme

Dosis-til-tekst-ts

Dosis-til-tekst-ts er en javascript komponent, der kan

  • generere hhv. korte og lange doseringstekster, givet en struktureret repræsentation af en FMK dosering
  • generere doserings-xml givet en LMS-doseringsforslag lignende repræsentation af doseringen, til brug ved FMK kald. Denne del af komponenten er beskrevet i et selvstændigt afsnit herunder.

Dosis-til-tekst-ts er en typescript-omskrivning af den eksisterende java-udgave til brug for Fælles Medicinkort klienter. Vha. omskrivningen, er det nu muligt at anvende dosis-til-tekst vha. javascript og typescript, d.v.s. også fra eksempelvis webbaserede FMK-klienter. API'et er stort set opbygget som den gamle java udgave af dosis-til-tekst, specielt vedr. wrapper-klasserne, der anvendes til at definere doseringsstrukturerne.

Anvendelse fra javascript

Komponenten er tilgængelig via npmjs.org vha. npm (Node Package Manager, kan hentes fra https://www.npmjs.com/package/npm). Den hentes vha. npm i fmk-dosis-til-tekst-ts. Selve js-filen kan herefter findes under node_modules/fmk-dosis-til-tekst-ts/target/dosistiltekst.js. Ved eksempelvis at inkludere dosistiltekst.js filen på en html-side, kan man tilgå komponentens funktionalitet.

I eksemplet herunder, oprettes 3 doseringer, og den korte og den lange doseringstekst vises for hver af de 3 doseringer:

  • en lokaladministreret dosering, med doseringsstart 05.01.2017, og uden slutdato.
  • en fritekstdosering , ligeledes med doseringsstart 05.01.2017, og uden slutdato.
  • en struktureret dosering med en enkelt periode, doseringsstart 05.01.2017 og -slut den 10.01.2017. Doseringen gentages hver 2. dag, 1. dag tages 2 tabletter om morgenen, 2. dag tages mellem 1 og 3 tabletter om middagen efter behov.

Efter det fulde eksempel, gennemgås de enkelte dele mere detaljeret.

Eksempel

<!DOCTYPE html>
<html>

<script src="./node_modules/fmk-dosis-til-tekst-ts/target/dosistiltekst.js"></script>

<body>
    <h1>Dosis-til-tekst testpage</h1>

    AdministrationAccordingToSchema:
    <p id="schema"></p>

    Freetext:
    <p id="freetext"></p>
    
    Structured:
    <p id="structured"></p>


    <script>
	    var shortTextConverter = dosistiltekst.Factory.getShortTextConverter();
	    var longTextConverter = dosistiltekst.Factory.getLongTextConverter();
	    var startdate = new dosistiltekst.DateOrDateTimeWrapper(
		    new Date(2017, 1, 5, 0, 0, 0, 0));
	    var enddate = new dosistiltekst.DateOrDateTimeWrapper(
		    new Date(2017, 1, 10, 0, 0, 0, 0));

	    // Example: administration according to schema
	    var localadmin = dosistiltekst.DosageWrapper.makeAccordingToSchemaDosage(
		    new dosistiltekst.AdministrationAccordingToSchemaWrapper(startdate));
	    var shorttext = shortTextConverter.convertWrapper(localadmin, 100);
	    var longtext = longTextConverter.convertWrapper(localadmin, 100);
	    document.getElementById("schema").innerHTML = "Short text: " + shorttext + "<br/>Long text: " + longtext;

    // Example: freetext dosage
    var freetext = dosistiltekst.DosageWrapper.makeFreeTextDosage(
	    new dosistiltekst.FreeTextWrapper(startdate, undefined, 
		    "Indtages dagligt med rigeligt væske"));
    shorttext = shortTextConverter.convertWrapper(freetext, 100);
    longtext = longTextConverter.convertWrapper(freetext, 100);
    document.getElementById("freetext").innerHTML = "Short text: " + shorttext + "<br/>Long text: " + longtext;

    // Example: structured dosage
    var unit = new dosistiltekst.UnitOrUnitsWrapper(undefined, 'tablet','tabletter');
    var days = [
        new dosistiltekst.DayWrapper(1, [
	        new dosistiltekst.MorningDoseWrapper(2, undefined, undefined, "2", undefined, undefined, false)
	        ]
	    ),
        new dosistiltekst.DayWrapper(2, [
	        new dosistiltekst.NoonDoseWrapper(undefined, 1, 3, undefined, "1", "3", false)
	        ])
    ];

    var structures = [
	    new dosistiltekst.StructureWrapper(2, 'tages med rigeligt væske', startdate, enddate, days)
	];
    var dosagestructures = dosistiltekst.DosageWrapper.makeStructuredDosage(
	    new dosistiltekst.StructuresWrapper(unit, structures));
    shorttext = shortTextConverter.convertWrapper(dosagestructures, 100);
    longtext = longTextConverter.convertWrapper(dosagestructures, 500);
    document.getElementById("structured").innerHTML = "Short text: " + shorttext + "<br/>Long text: " + longtext;

    // Combined
	var combined = dosistiltekst.CombinedTextConverter.convertWrapper(dosagestructures);
	document.getElementById("structuredCombined").innerHTML = "<ul><li>" + combined.getCombinedShortText() + "</li><li>" + combined.getCombinedLongText() + "</li><li>" + combined.getCombinedDailyDosis().getInterval().minimum + "-" +  combined.getCombinedDailyDosis().getInterval().maximum + "</li></ul>";
		
	// Iterate each period - in this case, only onemptied
	for(i = 0; i < combined.getPeriodTexts().length; i++) {
		var periodText = combined.getPeriodTexts()[i];
		// Each periodText is a tuple of three elements
		document.getElementById("structuredCombined").innerHTML += "<ul><li>" + periodText[0] + "</li><li>" + periodText[1] + "</li><li>" + periodText[2].getInterval().minimum + "-" +  periodText[2].getInterval().maximum + "</li></ul>";
	}

    </script>
</body>

</html>

Endelig er der også mulighed for, vha. CombinedTextConverter, at få både kort og lang doseringstekst såvel samlet for alle strukturerede perioder samt enkeltvist per periode, samt daglig dosis beregnet på en gang.

Generel anvendelse

Konverteringsklasserne tilgås vha. flg. linjer:

var shortTextConverter = dosistiltekst.Factory.getShortTextConverter();
var longTextConverter = dosistiltekst.Factory.getLongTextConverter();

Datoer

Datoer oprettes enten som en dato eller en dato/tid. I nedenstående eksempel oprettes først datoen 5. januar 2017, dernæst tidspunktet 12:20:25 den 5. januar 2017:

var startdate = new dosistiltekst.DateOrDateTimeWrapper(new Date(2017, 1, 5, 0, 0, 0, 0));
var startdatetime = new dosistiltekst.DateOrDateTimeWrapper(undefined, new Date(2017, 1, 5, 12, 20, 25, 0));

Doseringer

Doseringer oprettes vha. DosageWrapper klassen, der opretter javascript objekter af de respektive typer, hhv. vha. metoderne dosistiltekst.DosageWrapper.makeAccordingToSchemaDosage(), dosistiltekst.DosageWrapper.makeFreeTextDosage(), samt dosistiltekst.DosageWrapper.makeStructuredDosage().

###Lokal administrerede doseringer Lokaladministrerede doseringer kan oprettes med start- og evt. slutdato. Hvis slutdato ikke findes, udelades dette argument blot:

var localadminWithoutEnddate = 
	dosistiltekst.DosageWrapper.makeAccordingToSchemaDosage(
		new dosistiltekst.AdministrationAccordingToSchemaWrapper(startdate));
var localadminWithEnddate = 
	dosistiltekst.DosageWrapper.makeAccordingToSchemaDosage(
		new dosistiltekst.AdministrationAccordingToSchemaWrapper(startdate, enddate));

Fritekstdoseringer

Fritekstdoseringer kan ligeledes oprettes med start- og evt. slutdato. Hvis slutdato ikke findes, anvendes undefined:

var freetextWithoutEnddate = dosistiltekst.DosageWrapper.makeFreeTextDosage(
	    new dosistiltekst.FreeTextWrapper(startdate, undefined, "Indtages med rigeligt væske"));
var freetextWithEnddate = dosistiltekst.DosageWrapper.makeFreeTextDosage(
	    new dosistiltekst.FreeTextWrapper(startdate, enddate, "Indtages med rigeligt væske"));

Strukturerede doseringer

For strukturerede doseringer angives hhv. en doseringsenhed (unit) samt et antal doseringsperioder. Doseringsenheden kan enten oprettes med en fælles entals-/flertalsangivelse (første argument), eller separat entals- og flertalsangivelse, her et eksempel på separat angivelse:

var unit = new dosistiltekst.UnitOrUnitsWrapper(undefined, 'tablet','tabletter');

Herefter oprettes doseringsperioderne som et array af StructureWrapper's, med én structure per doseringsperiode, her f.eks. en itereret dosering, der gentages hver 2. dag, 'tages med rigeligt væske' som supplerende tekst, samt en start- og slutdato og et array af "doseringsdage":

 var structures = [
	    new dosistiltekst.StructureWrapper(2, 'tages med rigeligt væske', startdate, enddate, days)
	];

Hvis doseringen ikke er gentaget, angives 0 som iterationInterval (iterationInterval = 1. parameter til StructureWrapper constructor).

En "doseringsdag" angiver hvordan lægemidlet skal tages på den enkelte dag. En "doseringsdag", repræsenteret ved DayWrapper objekter, angiver et dagsnummer samt et array af enkelt-doseringer, som kan være enten en morgen, middag, aften, nat-dosering (MorningDoseWrapper, NoonDoseWrapper, EveningDoseWrapper, NightDoseWrapper), dosering med tidspunkt (DateOrDateTimeWrapper) eller en daglig dosering (PlainDoseWrapper). Parametrene til eksempelvis MorningDoseWrapper er hhv. fast værdi, minimumværdi, maximumvære, 3 parametre der p.t. ikke anvendes (er medtaget af hensyn til bagudkompatibilitet med java-udgaven), samt angivelse af om enkeltdoseringen er efter behov. Herunder et eksempel på 2 doseringsdage, hver dag med et doseringselement, hhv. en morgen-dosering med 2 tabletter og en middagsdosering mellem 1 og 3 tabletter efter behov:

 var days = [
        new dosistiltekst.DayWrapper(1, [
	        new dosistiltekst.MorningDoseWrapper(2, undefined, undefined, undefined, undefined, undefined, false)
	        ]
	    ),
        new dosistiltekst.DayWrapper(2, [
	        new dosistiltekst.NoonDoseWrapper(undefined, 1, 3, undefined, undefined, undefined, true)
	        ])
    ];

Afslutningsvis kædes enheder og doseringsperioder sammen vha. en StructuresWrapper (bemærk flertalsformen, ikke at forveksle med StructureWrapper), hvorefter converterne kaldes:

var dosagestructures = dosistiltekst.DosageWrapper.makeStructuredDosage(
	new dosistiltekst.StructuresWrapper(unit, structures));
shorttext = shortTextConverter.convertWrapper(dosagestructures, 100);
longtext = longTextConverter.convertWrapper(dosagestructures, 500);

Det sidste argument i kaldene til convertWrapper metoderne angiver max-længden af de genererede strenge. Alternativt kan den kombinerede converter kaldes, jvf. ovenstående eksempel.

Doserings-XML generering ud fra doseringsforslag

Dosis-til-tekst-ts komponenten har udover doseringstekst funktionalitet, også en funktion til at generere doserings-xml til brug i et FMK request, givet en doserings-repræsentation identisk med den der anvendes i NSP'ens KRS importer af doseringsforslag (se: TODO - link til NSP-doc). Funktionen kaldes således i javascript:

var snippet = dosistiltekst.DosageProposalXMLGenerator.generateXMLSnippet(type, iteration, mapping, unitTextSingular, unitTextPlural, supplementaryText, dosageStartDates, dosageEndDates, fmkVersion, dosageProposalVersion);

Typescript definition:

generateXMLSnippet(type: string, iteration: string, mapping: string, unitTextSingular: string, unitTextPlural: string, supplementaryText: string, beginDates: Date[], endDates: Date[], fmkversion: string, dosageProposalVersion: number, shortTextMaxLength: number = 70): DosageProposalXML 

Argumenterne til kaldet er:

  • type: enten "M+M+A+N" (ved morgen+middag+aften+nat), "N daglig" eller "PN". Ved flere perioder, indsættes hver periode-værdi i {}, eks. '{M+M+A+N}{PN}'
  • iteration: iterationer i doseringen. Ved flere perioder, indsættes hver periode-værdi i {}, eks. '{2}{1}'
  • mapping: en såkaldt "simpel streng", se ovenståede NSP-dokument for definition.
  • unitTextSingular: entals-form af doseringsenhed
  • unitTextPlural: flertals-form af doseringsenhed
  • supplementaryText: supplerende doseringstekst
  • dosageStartDate: array af doseringsstartdatoer, en pr. periode.
  • dosageEndDate: array af doseringsslutdatoer, en pr. periode.
  • fmkversion: p.t. enten "FMK140", "FMK142", "FMK144" eller "FMK146"
  • dosageProposalVersion: for fremtidig versioneringsbrug af såvel komponent som doseringsforslag, SKAL p.t. sættes til 1.
  • shortTextMaxLength (optionel): hvis der ønskes en længere kort doseringstekst end FMK-snitfladernes sædvanlige 70 karakterer, kan denne parameter sættes til et højere tal. Hvis den korte tekst overstiger shortTextMaxLength returneres null i getShortDosageTranslation().

Efter kaldet indeholder snippet variablen hhv. doserings-xml samt den korte og den lange doseringstekst, som kan hentes hhv. vha. getXml(), getShortDosageTranslation() og getLongDosageTranslation().

Eksempel på anvendelse:

var snippet = dosistiltekst.DosageProposalXMLGenerator.generateXMLSnippet("PN", 1, "1", "tablet", "tabletter", ", tages med rigeligt vand", [new Date(2017,04,17)], [new Date(2017,05,01)], "FMK146", 1);

snippet.getXml() vil returnere

<m16:Dosage xsi:schemaLocation="http://www.dkma.dk/medicinecard/xml.schema/2015/06/01 ../../../2015/06/01/DosageForRequest.xsd" xmlns:m16="http://www.dkma.dk/medicinecard/xml.schema/2015/06/01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <m16:UnitTexts source="Doseringsforslag">
        <m16:Singular>tablet</m16:Singular>
        <m16:Plural>tabletter</m16:Plural>
    </m16:UnitTexts>
    <m16:StructuresAccordingToNeed>
        <m16:Structure>
            <m16:IterationInterval>1</m16:IterationInterval>
            <m16:StartDate>2017-04-17</m16:StartDate>
            <m16:EndDate>2017-05-01</m16:EndDate>
            <m16:SupplementaryText>, tages med rigeligt vand</m16:SupplementaryText>
            <m16:Day>
                <m16:Number>1</m16:Number>
                <m16:Dose>
                    <m16:Quantity>1</m16:Quantity>
                </m16:Dose>
            </m16:Day>
        </m16:Structure>
    </m16:StructuresAccordingToNeed>
</m16:Dosage>