Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: ORPDMPWS

ORPDMPWS.m

Go to the documentation of this file.
  1. ORPDMPWS ;ISP/LMT - PDMP Web Service APIs ;Nov 04, 2020@14:19:06
  1. ;;3.0;ORDER ENTRY/RESULTS REPORTING;**519,498**;Dec 17, 1997;Build 38
  1. ;
  1. ; SAC EXEMPTION 20200131-02 : non-ANSI standard M code
  1. ;
  1. ; This routine uses the following ICRs:
  1. ; #4984 - File 8932.1, Field 90002 (private)
  1. ;
  1. Q
  1. ;
  1. ; Make PDMP Web Service call
  1. EN(ORRETURN,DFN,ORUSER,ORDELEGATEOF,ORINST) ;
  1. ;
  1. ; Returns:
  1. ; @ORRETURN@(0) = Status ^ Flag if data shared (1/0) ^ VDIF Session ID
  1. ; Note: Status can be one of the following values:
  1. ; 1 - success
  1. ; -1 - PDMP down, or other reason that didn't even attempt to connect
  1. ; -2 - error connecting
  1. ; -3 - connected - but error returned by PDMP
  1. ; @ORRETURN@(1) = If success: Report URL; If error: error message
  1. ;
  1. ; If error: error message to display to the user
  1. ; @ORRETURN@("ERR") = If errors, more details about the error
  1. ;
  1. N $ES,$ET,ORDATASHARED
  1. ;
  1. S ORRETURN=$NA(^TMP("ORPDMP",$J))
  1. K ^TMP("ORPDMP",$J)
  1. ;
  1. S $ET="D ERRHNDL^ORPDMPWS"
  1. ;
  1. ; Patient Request
  1. D REQUEST(DFN,ORUSER,ORDELEGATEOF,ORINST)
  1. ;
  1. Q
  1. ;
  1. ;
  1. ERRHNDL ;
  1. ;
  1. ; ZEXCEPT: XOBERR,ORDATASHARED
  1. N %ZT
  1. ;
  1. K ^TMP("ORPDMP",$J)
  1. S ^TMP("ORPDMP",$J,0)="-3^"_+$G(ORDATASHARED)
  1. S ^TMP("ORPDMP",$J,1)="VistA (M) error encountered. Log a ticket, so support can check the error trap for more info."
  1. S ^TMP("ORPDMP",$J,"ERR",1)=$G(^TMP("ORPDMP",$J,1))
  1. ;
  1. I $G(XOBERR)="" S XOBERR=$$EOFAC^XOBWLIB()
  1. S %ZT("^TMP(""ORPDMPIN"",$J)")=""
  1. S %ZT("^TMP(""ORPDMP"",$J)")=""
  1. D ZTER^XOBWLIB(XOBERR)
  1. D UNWIND^%ZTER
  1. ;
  1. Q
  1. ;
  1. ; Initiate PDMP REST request
  1. REQUEST(DFN,ORUSER,ORDELEGATEOF,ORINST) ;
  1. ;
  1. ; ZEXCEPT: ORDATASHARED
  1. N ORERR,ORI,OROPENTIMEOUT,ORRESOURCE,ORRESTREQ,ORRET,ORSERVER,ORXML
  1. ;
  1. S ORSERVER="PDMP SERVER"
  1. I '$$PROD^XUPROD S ORSERVER="PDMP TEST SERVER"
  1. S ORRESTREQ=$$GETREST^XOBWLIB("PDMP WEB SERVICE",ORSERVER)
  1. ;
  1. S ORRESTREQ.ContentType="application/xml"
  1. D REQUESTXML(.ORXML,DFN,ORUSER,ORDELEGATEOF,ORINST)
  1. S ORI=0
  1. F S ORI=$O(ORXML(ORI)) Q:'ORI D
  1. . D ORRESTREQ.EntityBody.Write($G(ORXML(ORI)))
  1. ;
  1. S ORRESOURCE="/PDMP/patient"
  1. S OROPENTIMEOUT=+$$GET^XPAR("ALL","OR PDMP OPEN TIMEOUT",1,"I")
  1. I OROPENTIMEOUT'>0 S OROPENTIMEOUT=10
  1. S ORRESTREQ.OpenTimeout=OROPENTIMEOUT
  1. S ORRET=$$POST^XOBWLIB(ORRESTREQ,ORRESOURCE,.ORERR,0)
  1. S ORDATASHARED=1 ; Flag so that we know we might have shared patient's data. Used by ERRHNDL in case M error encountered.
  1. ;
  1. K ^TMP("ORPDMPIN",$J)
  1. D PROCRESPONSE(ORRET,ORRESTREQ,.ORERR)
  1. K ^TMP("ORPDMPIN",$J)
  1. ;
  1. Q
  1. ;
  1. ; Process response from server
  1. PROCRESPONSE(ORRET,ORRESTREQ,ORERR) ;
  1. ;
  1. N ORERRARR,ORERRCODE,ORERRDETAILS,ORERRMSG,ORERRORIGIN,ORHTTPSTAT,ORI,ORJ,ORLENGTH,ORLN
  1. N ORREPORT,ORRESPONSE,ORRESULTS,ORSHARED,ORSESSION,ORTXT
  1. ;
  1. S ORRESPONSE=ORRESTREQ.HttpResponse
  1. S ORHTTPSTAT=""
  1. I $G(ORRESPONSE)'="" S ORHTTPSTAT=ORRESPONSE.StatusCode
  1. ;
  1. ; Error occurred making web service call
  1. I 'ORRET!(ORHTTPSTAT'=200) D Q
  1. . D ERR2ARR^XOBWLIB(.ORERR,.ORERRARR)
  1. . S ORERRMSG=""
  1. . S ORSHARED=0
  1. . S ORERRCODE=-2
  1. . ;
  1. . ;code: 6059 - Unable to open TCP/IP socket to server
  1. . I $G(ORERRARR("code"))=6059 D
  1. . . S ORERRMSG="Error connecting to PDMP server."
  1. . ;code: 6085 - Unable to write to socket with SSL/TLS configuration (when conf doesn't exist or is not supported by server)
  1. . I $G(ORERRARR("code"))=6085 D
  1. . . S ORERRMSG="Error connecting to PDMP server. Problem with SSL/TLS configuration."
  1. . ;code: 5922 - Timed out waiting for response
  1. . I $G(ORERRARR("code"))=5922 D
  1. . . S ORSHARED=1
  1. . . S ORERRMSG="Timed out waiting for response from PDMP server."
  1. . ;HTTP Status Code = 404 - if couldn't authenticate (Normally 401 is used for this; but this is what they return)
  1. . I ORHTTPSTAT=404 D
  1. . . S ORERRMSG="Error connecting to PDMP server. Problem authenticating."
  1. . ;HTTP Status Code = 500 - or other errors
  1. . I ORERRMSG="" D
  1. . . S ORERRCODE=-3
  1. . . S ORERRMSG="Unexpected error returned by PDMP middleware when processing the PDMP request."
  1. . ;
  1. . S ^TMP("ORPDMP",$J,0)=ORERRCODE_U_ORSHARED
  1. . S ^TMP("ORPDMP",$J,1)=ORERRMSG
  1. . ; Return more error info in ERR node
  1. . S ^TMP("ORPDMP",$J,"ERR",1)=$G(^TMP("ORPDMP",$J,1))
  1. . S ORLN=1
  1. . S ORI=""
  1. . F S ORI=$O(ORERRARR(ORI)) Q:ORI="" D
  1. . . S ORTXT=$G(ORERRARR(ORI))
  1. . . I ORTXT'="" D
  1. . . . S ORLN=ORLN+1
  1. . . . S ^TMP("ORPDMP",$J,"ERR",ORLN)=ORI_": "_ORTXT
  1. . . S ORJ=""
  1. . . F S ORJ=$O(ORERRARR(ORI,ORJ)) Q:ORJ="" D
  1. . . . S ORTXT=$G(ORERRARR(ORI,ORJ))
  1. . . . I ORTXT'="" D
  1. . . . . S ORLN=ORLN+1
  1. . . . . S ^TMP("ORPDMP",$J,"ERR",ORLN)=ORI_": "_ORTXT
  1. . S ORLN=ORLN+1
  1. . S ^TMP("ORPDMP",$J,"ERR",ORLN)="HTTP Status Code: "_ORHTTPSTAT
  1. ;
  1. ; Success (200) - read in response
  1. S ORI=0
  1. S ORLENGTH=245
  1. F Q:ORRESPONSE.Data.AtEnd D
  1. . S ORI=ORI+1
  1. . S ^TMP("ORPDMPIN",$J,ORI)=ORRESPONSE.Data.Read(ORLENGTH)
  1. ;
  1. D PARSEXML(.ORRESULTS,$NA(^TMP("ORPDMPIN",$J)))
  1. S ORSHARED=$G(ORRESULTS("DataDisclosed"))
  1. S ORSHARED=$S(ORSHARED="yes":1,1:0)
  1. S ORREPORT=$G(ORRESULTS("ReportLink"))
  1. S ORERRCODE=$G(ORRESULTS("Code"))
  1. S ORERRMSG=$G(ORRESULTS("Message"))
  1. S ORERRDETAILS=$G(ORRESULTS("Details"))
  1. S ORERRORIGIN=$G(ORRESULTS("Origin"))
  1. S ORSESSION=$G(ORRESULTS("Session"))
  1. ;
  1. ; Report URL returned - Success
  1. I ORREPORT'="" D Q
  1. . S ^TMP("ORPDMP",$J,0)=1_U_ORSHARED_U_ORSESSION
  1. . S ^TMP("ORPDMP",$J,1)=ORREPORT
  1. ;
  1. ; Error returned by server in response XML message
  1. I ORERRMSG'="" D Q
  1. . S ^TMP("ORPDMP",$J,0)=-3_U_ORSHARED_U_ORSESSION
  1. . S ^TMP("ORPDMP",$J,1)=ORERRMSG
  1. . S ^TMP("ORPDMP",$J,"ERR",1)="Code: "_ORERRCODE
  1. . S ^TMP("ORPDMP",$J,"ERR",2)="Message: "_ORERRMSG
  1. . S ^TMP("ORPDMP",$J,"ERR",3)="Origin: "_ORERRORIGIN
  1. . S ^TMP("ORPDMP",$J,"ERR",4)="Details: "_ORERRDETAILS
  1. ;
  1. ; If Report URL is null and ErrorMsg is null, then something is wrong. Perhaps error parsing xml
  1. I $G(ORRESULTS("DataDisclosed"))="" S ORSHARED=1
  1. S ^TMP("ORPDMP",$J,0)=-3_U_ORSHARED_U_ORSESSION
  1. S ^TMP("ORPDMP",$J,1)="Error processing PDMP results."
  1. S ^TMP("ORPDMP",$J,"ERR",1)=$G(^TMP("ORPDMP",$J,1))
  1. S ^TMP("ORPDMP",$J,"ERR",2)="XML:"
  1. S ORI=2
  1. S ORJ=0
  1. F S ORJ=$O(^TMP("ORPDMPIN",$J,ORJ)) Q:'ORJ D
  1. . S ORI=ORI+1
  1. . S ^TMP("ORPDMP",$J,"ERR",ORI)=$G(^TMP("ORPDMPIN",$J,ORJ))
  1. ;
  1. Q
  1. ;
  1. ; Return XML to send in REST query
  1. REQUESTXML(ORXML,DFN,ORUSER,ORDELEGATEOF,ORINST) ;
  1. ;
  1. N ORADDRESS,ORCELL,OREMAIL,ORICN,ORINSTINFO,ORLINE,ORNAME,ORPERSCLASS,ORPROV,ORTEMPADD,ORTEMPPHONE
  1. N VADM,VAPA,VAPTYP,VAROOT,VATEST,VAHOW
  1. ;
  1. S ORUSER=$G(ORUSER,DUZ)
  1. S ORDELEGATEOF=$G(ORDELEGATEOF)
  1. S ORINST=$G(ORINST,DUZ(2))
  1. I ORINST="" S ORINST=$$KSP^XUPARAM("INST")
  1. ;
  1. S ORLINE=0
  1. ;
  1. S ORXML($$INCLINE)="<PatientReportRequest>"
  1. ;
  1. S ORXML($$INCLINE)="<Provider>"
  1. S ORPROV=ORUSER
  1. I $G(ORDELEGATEOF) S ORPROV=ORDELEGATEOF
  1. S ORPERSCLASS=$$PERSCLASS(ORPROV)
  1. S ORXML($$INCLINE)="<X12Code>"_$$SYMENC^MXMLUTL($P(ORPERSCLASS,U,2))_"</X12Code>"
  1. S ORXML($$INCLINE)="<VACode>"_$$SYMENC^MXMLUTL($P(ORPERSCLASS,U,1))_"</VACode>"
  1. S ORNAME=$$GET1^DIQ(200,ORPROV_",",.01) ; ICR 10060 (supported)
  1. D NAMECOMP^XLFNAME(.ORNAME)
  1. S ORXML($$INCLINE)="<FirstName>"_$$SYMENC^MXMLUTL(ORNAME("GIVEN"))_"</FirstName>"
  1. S ORXML($$INCLINE)="<LastName>"_$$SYMENC^MXMLUTL(ORNAME("FAMILY"))_"</LastName>"
  1. S ORXML($$INCLINE)="<DEANumber>"_$$SYMENC^MXMLUTL($$USERDEA^ORPDMP(ORPROV))_"</DEANumber>"
  1. S ORXML($$INCLINE)="<NPINumber>"_$$SYMENC^MXMLUTL($$USERNPI^ORPDMP(ORPROV))_"</NPINumber>"
  1. S ORXML($$INCLINE)="</Provider>"
  1. ;
  1. I ORDELEGATEOF D
  1. . S ORPERSCLASS=$$PERSCLASS(ORUSER)
  1. . S ORXML($$INCLINE)="<Delegate>"
  1. . S ORXML($$INCLINE)="<X12Code>"_$$SYMENC^MXMLUTL($P(ORPERSCLASS,U,2))_"</X12Code>"
  1. . S ORXML($$INCLINE)="<VACode>"_$$SYMENC^MXMLUTL($P(ORPERSCLASS,U,1))_"</VACode>"
  1. . K ORNAME
  1. . S ORNAME=$$GET1^DIQ(200,ORUSER_",",.01) ; ICR 10060 (supported)
  1. . D NAMECOMP^XLFNAME(.ORNAME)
  1. . S ORXML($$INCLINE)="<FirstName>"_$$SYMENC^MXMLUTL(ORNAME("GIVEN"))_"</FirstName>"
  1. . S ORXML($$INCLINE)="<LastName>"_$$SYMENC^MXMLUTL(ORNAME("FAMILY"))_"</LastName>"
  1. . D GETEMAIL^ORPDMP(.OREMAIL,ORUSER)
  1. . S ORXML($$INCLINE)="<SystemID>"_$$SYMENC^MXMLUTL(OREMAIL)_"</SystemID>"
  1. . S ORXML($$INCLINE)="</Delegate>"
  1. ;
  1. S ORXML($$INCLINE)="<UserLocation>"
  1. S ORXML($$INCLINE)="<Name>"_$$SYMENC^MXMLUTL($$NAME^XUAF4(ORINST))_"</Name>"
  1. S ORINSTINFO=$$INSTINFO(ORINST)
  1. S ORXML($$INCLINE)="<DEANumber>"_$$SYMENC^MXMLUTL($P(ORINSTINFO,U,1))_"</DEANumber>"
  1. S ORXML($$INCLINE)="<NPINumber>"_$$SYMENC^MXMLUTL($P(ORINSTINFO,U,2))_"</NPINumber>"
  1. S ORXML($$INCLINE)="<StateCode>"_$$SYMENC^MXMLUTL($P($$PADD^XUAF4(ORINST),U,3))_"</StateCode>"
  1. S ORXML($$INCLINE)="</UserLocation>"
  1. ;
  1. S ORXML($$INCLINE)="<Patient>"
  1. D DEM^VADPT
  1. K ORNAME
  1. S ORNAME=$G(VADM(1))
  1. D NAMECOMP^XLFNAME(.ORNAME)
  1. S ORXML($$INCLINE)="<FirstName>"_$$SYMENC^MXMLUTL(ORNAME("GIVEN"))_"</FirstName>"
  1. S ORXML($$INCLINE)="<LastName>"_$$SYMENC^MXMLUTL(ORNAME("FAMILY"))_"</LastName>"
  1. S ORXML($$INCLINE)="<MiddleName>"_$$SYMENC^MXMLUTL(ORNAME("MIDDLE"))_"</MiddleName>"
  1. S ORXML($$INCLINE)="<DOB>"_$$SYMENC^MXMLUTL($TR($$FMTE^XLFDT(+$G(VADM(3)),"7DZ"),"/","-"))_"</DOB>"
  1. S ORXML($$INCLINE)="<GenderCode>"_$$SYMENC^MXMLUTL($P($G(VADM(5)),U,1))_"</GenderCode>"
  1. S ORXML($$INCLINE)="<DFN>"_DFN_"</DFN>"
  1. S ORXML($$INCLINE)="<StationCode>"_$$SYMENC^MXMLUTL($$STA^XUAF4($$KSP^XUPARAM("INST")))_"</StationCode>"
  1. S ORICN=$$GETICN^MPIF001(DFN)
  1. I ORICN<0 S ORICN=""
  1. S ORXML($$INCLINE)="<ICN>"_$$SYMENC^MXMLUTL(ORICN)_"</ICN>"
  1. ;
  1. S ORXML($$INCLINE)="<Addresses>"
  1. ;
  1. D ADD^VADPT
  1. S ORTEMPADD=$S($G(VAPA(9))'="":1,1:0)
  1. ;
  1. S ORXML($$INCLINE)="<Address>"
  1. S ORXML($$INCLINE)="<Street>"_$$SYMENC^MXMLUTL($G(VAPA(1)))_"</Street>"
  1. S ORXML($$INCLINE)="<City>"_$$SYMENC^MXMLUTL($G(VAPA(4)))_"</City>"
  1. S ORXML($$INCLINE)="<StateCode>"_$$SYMENC^MXMLUTL($$GET1^DIQ(5,+$G(VAPA(5))_",",1,"I"))_"</StateCode>"
  1. S ORXML($$INCLINE)="<ZipCode>"_$$SYMENC^MXMLUTL($G(VAPA(6)))_"</ZipCode>"
  1. S ORXML($$INCLINE)="<TypeCode>"_$S(ORTEMPADD:"Temporary",1:"Permanent")_"</TypeCode>"
  1. S ORXML($$INCLINE)="</Address>"
  1. ;
  1. ; Residential
  1. I $G(VAPA(30))'=""!($G(VAPA(33))'="")!($G(VAPA(34))'="")!($G(VAPA(35))'="") D
  1. . S ORXML($$INCLINE)="<Address>"
  1. . S ORXML($$INCLINE)="<Street>"_$$SYMENC^MXMLUTL($G(VAPA(30)))_"</Street>"
  1. . S ORXML($$INCLINE)="<City>"_$$SYMENC^MXMLUTL($G(VAPA(33)))_"</City>"
  1. . S ORXML($$INCLINE)="<StateCode>"_$$SYMENC^MXMLUTL($$GET1^DIQ(5,+$G(VAPA(34))_",",1,"I"))_"</StateCode>"
  1. . S ORXML($$INCLINE)="<ZipCode>"_$$SYMENC^MXMLUTL($G(VAPA(35)))_"</ZipCode>"
  1. . S ORXML($$INCLINE)="<TypeCode>Residential</TypeCode>"
  1. . S ORXML($$INCLINE)="</Address>"
  1. ;
  1. ; when temp is active, also return permanent address
  1. I ORTEMPADD D
  1. . S ORTEMPPHONE=$G(VAPA(8))
  1. . K VAPA
  1. . S VAPA("P")=1
  1. . D ADD^VADPT
  1. . S ORXML($$INCLINE)="<Address>"
  1. . S ORXML($$INCLINE)="<Street>"_$$SYMENC^MXMLUTL($G(VAPA(1)))_"</Street>"
  1. . S ORXML($$INCLINE)="<City>"_$$SYMENC^MXMLUTL($G(VAPA(4)))_"</City>"
  1. . S ORXML($$INCLINE)="<StateCode>"_$$SYMENC^MXMLUTL($$GET1^DIQ(5,+$G(VAPA(5))_",",1,"I"))_"</StateCode>"
  1. . S ORXML($$INCLINE)="<ZipCode>"_$$SYMENC^MXMLUTL($G(VAPA(6)))_"</ZipCode>"
  1. . S ORXML($$INCLINE)="<TypeCode>Permanent</TypeCode>"
  1. . S ORXML($$INCLINE)="</Address>"
  1. ;
  1. S ORXML($$INCLINE)="</Addresses>"
  1. ;
  1. S ORXML($$INCLINE)="<Phones>"
  1. ;
  1. S ORXML($$INCLINE)="<Phone>"
  1. S ORXML($$INCLINE)="<Number>"_$$SYMENC^MXMLUTL($G(VAPA(8)))_"</Number>"
  1. S ORXML($$INCLINE)="<TypeCode>Residence</TypeCode>"
  1. S ORXML($$INCLINE)="</Phone>"
  1. ;
  1. I $G(ORTEMPPHONE)'="" D
  1. . S ORXML($$INCLINE)="<Phone>"
  1. . S ORXML($$INCLINE)="<Number>"_$$SYMENC^MXMLUTL(ORTEMPPHONE)_"</Number>"
  1. . S ORXML($$INCLINE)="<TypeCode>Temporary</TypeCode>"
  1. . S ORXML($$INCLINE)="</Phone>"
  1. ;
  1. S ORCELL=$$GET1^DIQ(2,DFN_",",.134)
  1. I ORCELL'="" D
  1. . S ORXML($$INCLINE)="<Phone>"
  1. . S ORXML($$INCLINE)="<Number>"_$$SYMENC^MXMLUTL(ORCELL)_"</Number>"
  1. . S ORXML($$INCLINE)="<TypeCode>Cellular</TypeCode>"
  1. . S ORXML($$INCLINE)="</Phone>"
  1. ;
  1. S ORXML($$INCLINE)="</Phones>"
  1. S ORXML($$INCLINE)="</Patient>"
  1. S ORXML($$INCLINE)="</PatientReportRequest>"
  1. ;
  1. Q
  1. ;
  1. ;
  1. INCLINE() ;
  1. ; ZEXCEPT: ORLINE
  1. S ORLINE=ORLINE+1
  1. Q ORLINE
  1. ;
  1. ; Get user's Person Class Info
  1. PERSCLASS(ORUSER) ;
  1. ;
  1. N ORPERSCLASS,ORPERSCLASS0,ORRET
  1. ;
  1. S ORRET=""
  1. S ORPERSCLASS=$$GET^XUA4A72(ORUSER)
  1. S ORPERSCLASS0=""
  1. I ORPERSCLASS>0 D
  1. . S ORPERSCLASS0=$$IEN2DATA^XUA4A72(ORPERSCLASS)
  1. . I $P(ORPERSCLASS0,U,4)="i" S ORPERSCLASS0="" Q ; Inactive
  1. . I $$GET1^DIQ(8932.1,+ORPERSCLASS_",",90002,"I")="N" S ORPERSCLASS0="" ; Non-Individual - ICR 4984
  1. Q $P(ORPERSCLASS0,U,6,7)
  1. ;
  1. ; Return Intitution DEA # and NPI #
  1. INSTINFO(ORINST) ;
  1. ;
  1. N ORARR,ORDEA,ORNPI
  1. ;
  1. S ORDEA=$$INSTDEA^ORPDMP(ORINST)
  1. I ORDEA'="" Q ORDEA
  1. S ORNPI=$$NPI^XUSNPI("Organization_ID",ORINST)
  1. I $P(ORNPI,U,1)=""!($P(ORNPI,U,3)'="Active") S ORNPI=""
  1. ;
  1. I ORDEA'=""!(ORNPI'="") Q ORDEA_U_$P(ORNPI,U,1)
  1. ;
  1. ; if child does not have DEA and NPI set, look at parent
  1. D PARENT^XUAF4("ORARR","`"_ORINST,"PARENT FACILITY")
  1. S ORINST=$O(ORARR("P",""))
  1. I 'ORINST Q ""
  1. ;
  1. S ORDEA=$$INSTDEA^ORPDMP(ORINST)
  1. I ORDEA'="" Q ORDEA
  1. S ORNPI=$$NPI^XUSNPI("Organization_ID",ORINST)
  1. I $P(ORNPI,U,1)=""!($P(ORNPI,U,3)'="Active") S ORNPI=""
  1. ;
  1. Q ORDEA_U_$P(ORNPI,U,1)
  1. ;
  1. ; Parse XML to array
  1. PARSEXML(ORRESULT,ORXML) ;
  1. N ORCALLBACK,ORELEMENT
  1. S ORCALLBACK("STARTELEMENT")="STARTEL^ORPDMPWS"
  1. S ORCALLBACK("CHARACTERS")="CHARS^ORPDMPWS"
  1. D EN^MXMLPRSE(ORXML,.ORCALLBACK,"W")
  1. Q
  1. ;
  1. ;
  1. STARTEL(ORNAME,ORATTRLIST) ;
  1. ; ZEXCEPT: ORELEMENT
  1. S ORELEMENT=ORNAME
  1. Q
  1. ;
  1. ;
  1. CHARS(ORTEXT) ;
  1. ; ZEXCEPT: ORRESULT,ORELEMENT
  1. I ORTEXT?.C Q
  1. I ORTEXT?." " Q
  1. I $G(ORELEMENT)="" Q
  1. S ORRESULT(ORELEMENT)=$G(ORRESULT(ORELEMENT))_ORTEXT
  1. Q
  1. ;