PSOVCC0 ;ORLFO/FJF/WC - PSO Activity Logs ; Mar 20, 2023@12:57:56
;;7.0;OUTPATIENT PHARMACY;**707,776**;DEC 1997;Build 56
;
; External calls:
;
; Description ICR Notes
; ----------- ------ -------
; Reference to ENCODE^XLFJSON in #6682
; Reference to GET^DDE in #7008
; Reference to FMTHL7^XLFDT, HTFM^XLFDT in #10103
; Reference to FIND1^DIC in #2051
; Reference to UPD^DGENDBS in #7350
; Reference to GETDFN^MPIFAPI,GETADFN^MPIFAPI in #2702
; Reference to UPDATE^MPIFAPI in #2706
; Reference to UP^XLFSTR in #10103
; Reference to ^%DT in #10003
;
;
PSOVPADDR(PSOVRTN,PSOVICN,PSOVADDR,PSOVATYP) ;
; Update addresses in Patient file
;
; This RPC updates an address in the patient file #2.
; The address to be updated is identified by PSOVATYP parameter
; documented below.
;
; Input: PSOVICN (required) - Patient ICN
; PSOVADDR (required) - Address
; - format ARRAY(fieldname)=field_value
; - e.g. addr("City")="Alexandria"
; addr("Country")="Canada"
; addr("County")="Yorkshire"
; addr("EndDate")="10/31/2022"
; addr("PhoneNumber")="987-654-3219"
; addr("PostCode")="SK37 4ED9"
; addr("Province")="Saskatchewan"
; addr("StartDate")="09/01/2022"
; addr("State")="TX"
; addr("StreetL1")="Flat 9"
; addr("StreetL2")="The Orchards"
; addr("StreetL3")="Sharp Avenue"
; addr("Zip")=95739
; addr("Zip+4")="95739-0001"
; PSOVATYP (required) - Indicator of which address is to be updated
; T - temporary address
; M - mailing address
; O - Other, yet to be determined
;
; Output: PSOVRTN - Return Value
; 1 for success
; or
; -1 - error message for failure
;
; check for required input parameters
;
I $G(PSOVICN)="" S PSOVRTN="-1 - ICN is required" Q
I '$D(PSOVADDR) S PSOVRTN="-1 - Address is required" Q
I '$D(PSOVATYP) S PSOVRTN="-1 - Address type is required" Q
;
; check ICN is valid
S PSOVRTN=1
N DFN
S DFN=$$GETADFN^MPIFAPI($P(PSOVICN,"V"))
;
I +DFN=-1 S PSOVRTN="-1 - ICN not recognised" Q
;
I PSOVATYP'="T",PSOVATYP'="M" S PSOVRTN="-1 - address type not recognised" Q
;
; convert input json to M array PSOVM
D J2MAR(.PSOVADDR,.PSOVM)
;
; Check start date and end date
I PSOVATYP="T",$G(PSOVM("StartDate"))'="",$G(PSOVM("EndDate"))'="" D
.N STRT,END
.S STRT=$$EX2FM(PSOVM("StartDate")),END=$$EX2FM(PSOVM("EndDate"))
.I END'>STRT S PSOVRTN="-1 - EndDate must be after than StartDate"
I +$G(PSOVRTN)=-1 Q
;
;
; build FDA array for address type
N FDA
I PSOVATYP="T" D TEMPFDA
I PSOVATYP="M" D MAILFDA
;
; update patient file
N PSOVERR
S PSOVRTN=$$UPD^DGENDBS(2,DFN,.FDA,.PSOVERR)
I +PSOVRTN'=1 S PSOVRTN=-1_" - "_PSOVERR Q
S PSOVRTN="1 - Address Updated"
Q
;
TEMPFDA ; create FDA array for temporary address
;
I $D(PSOVM("StreetL1")) S FDA(.1211)=PSOVM("StreetL1")
I $D(PSOVM("StreetL2")) S FDA(.1212)=PSOVM("StreetL2")
I $D(PSOVM("StreetL3")) S FDA(.1213)=PSOVM("StreetL3")
I $D(PSOVM("City")) S FDA(.1214)=PSOVM("City")
I $G(PSOVM("State"))'="" D
.N PSOVSTATE
.S PSOVSTATE=$$UP^XLFSTR(PSOVM("State"))
.S FDA(.1215)=$O(^DIC(5,"B",PSOVSTATE,""))
I $G(PSOVM("State"))="" S FDA(.1215)=""
I $D(PSOVM("Zip")) S FDA(.1216)=PSOVM("Zip")
I $D(PSOVM("StartDate")) S FDA(.1217)=$$EX2FM(PSOVM("StartDate"))
I $D(PSOVM("EndDate")) S FDA(.1218)=$$EX2FM(PSOVM("EndDate"))
I $D(PSOVM("PhoneNumber")) S FDA(.1219)=PSOVM("PhoneNumber")
I $D(PSOVM("Province")) S FDA(.1221)=PSOVM("Province")
I $D(PSOVM("PostCode")) S FDA(.1222)=PSOVM("PostCode")
N CNTRY
I $D(PSOVM("Country")) D
.S CNTRY=$$CNTCHK^PSOVCC0(PSOVM("Country"))
.I CNTRY=0 S CNTRY=""
.S FDA(.1223)=CNTRY
I $D(PSOVM("County")) D
.N PSOVCOUNTY
.S PSOVCOUNTY=$$UP^XLFSTR(PSOVM("County"))
.S FDA(.12111)=PSOVCOUNTY
I $D(PSOVM("Zip+4")) S FDA(.12112)=$TR($G(PSOVM("Zip+4")),"-")
Q
;
MAILFDA ; create FDA array for mailing address
;
I $D(PSOVM("StreetL1")) S FDA(.111)=PSOVM("StreetL1")
I $D(PSOVM("StreetL2")) S FDA(.112)=PSOVM("StreetL2")
I $D(PSOVM("StreetL3")) S FDA(.113)=PSOVM("StreetL3")
I $D(PSOVM("City")) S FDA(.114)=PSOVM("City")
I $G(PSOVM("State"))'="" D
.N PSOVSTATE
.S PSOVSTATE=$$UP^XLFSTR(PSOVM("State"))
.S FDA(.115)=$O(^DIC(5,"B",PSOVSTATE,""))
I $G(PSOVM("State"))="" S FDA(.115)=""
I $D(PSOVM("Zip")) S FDA(.1216)=PSOVM("Zip")
I $D(PSOVM("PhoneNumber")) S FDA(.1219)=PSOVM("PhoneNumber")
I $D(PSOVM("Province")) S FDA(.1171)=PSOVM("Province")
I $D(PSOVM("PostCode")) S FDA(.1172)=PSOVM("PostCode")
N CNTRY
I $D(PSOVM("Country")) D
.S CNTRY=$$CNTCHK^PSOVCC0(PSOVM("Country"))
.I CNTRY=0 S CNTRY=""
.S FDA(.1173)=CNTRY
I $D(PSOVM("County")) D
.N PSOVCOUNTY
.S PSOVCOUNTY=$$UP^XLFSTR(PSOVM("County"))
.S FDA(.117)=PSOVCOUNTY
I $D(PSOVM("Zip+4")) S FDA(.1112)=$TR($G(PSOVM("Zip+4")),"-")
Q
;
;
J2MAR(JARR,PSOVM) ; convert passed json into M array
; Input:
; JARR - json
; PSOVM - M array
N LSUB,I
S LSUB=$O(PSOVADDR(""),-1)
F I=2:2:LSUB-2 S PSOVM(PSOVADDR(I))=PSOVADDR(I+1)
Q 1
;
; Convert external date to FileMan date
EX2FM(X) ; Conversion
;
; Input:
; X - external date or FileMan Date
;
; Output:
; Y - FileMan Date or null
;
N Y
S X=$G(X)
D ^%DT
K X,%DT
S:Y=-1 Y=""
Q Y
;
;
PSOVDELAD(PSOVRTN,PSOVICN) ; delete temporary address
;
; Delete temporary address from patient file
;
; Input: PSOVICN (required) - Patient ICN
;
; Output: PSOVRTN - Return Value
; 1 - Temporary Address Deleted
; or
; -1 - error message for failure
;
I $G(PSOVICN)="" S PSOVRTN="-1 - ICN is required" Q
; check ICN is valid
S PSOVRTN=1
N DFN
S DFN=$$GETADFN^MPIFAPI($P(PSOVICN,"V"))
;
I +DFN=-1 S PSOVRTN="-1 - ICN not recognised" Q
;
; check that address that is about to be deleted exists
N PSOVTMP
D GET^DDE("PSO TEMPORARY ADDRESS",DFN,,0,,"PSOVTMP")
S PSOVRTN=$G(PSOVTMP(1))
I PSOVRTN="" D Q
.S PSOVRTN="0 - there is no temporary address to delete for ICN "_PSOVICN
;
K FDA
F I=.1211:.0001:.1219 S FDA(I)="@"
F I=.1221:.0001:.1223 S FDA(I)="@"
F I=.12111,.12112,.12105 S FDA(I)="@"
; update patient file
N PSOVERR
S PSOVRTN=$$UPD^DGENDBS(2,DFN,.FDA,.PSOVERR)
I +PSOVRTN'=1 S PSOVRTN=-1_" - "_PSOVERR Q
S PSOVRTN="1 - Temporary Address Deleted"
;
Q
;
PSOVRETADDR(PSOVRTN,PSOVICN,PSOVATYP) ; Retrieve address from Patient file (#2)
;
; Input: PSOVICN (required) - Patient ICN
; PSOVATYP (required) - Indicator of which address is to be retrieved
; T - temporary address
; M - mailing address
; O - Other, yet to be determined
;
; Output: PSOVRTN - Return Value
; address in json format
; or
; -1 - error message for failure
;
;
; check for required input parameters
I $G(PSOVICN)="" S PSOVRTN="-1 - ICN is required" Q
I '$D(PSOVATYP) S PSOVRTN="-1 - Address type is required" Q
I PSOVATYP'="T",PSOVATYP'="M" S PSOVRTN="-1 - address type not recognised" Q
;
; check ICN is valid
N DFN
S DFN=$$GETDFN^MPIF001(PSOVICN)
;
I +DFN=-1 S PSOVRTN="-1 - ICN not recognised" Q
;
N QUERY
S QUERY("PATIENT")=DFN
N PSOVTMP
I PSOVATYP="T" D GET^DDE("PSO TEMPORARY ADDRESS",DFN,,0,,"PSOVTMP")
I PSOVATYP="M" D GET^DDE("PSO MAILING ADDRESS",DFN,,0,,"PSOVTMP")
S PSOVRTN=$G(PSOVTMP(1))
I PSOVRTN="" S PSOVRTN="0 - No data - there is no relevant address data for ICN "_PSOVICN
Q
;
CNTCHK(CNTRY) ;
;
N COUNTRY
S COUNTRY=$$FIND1^DIC(779.004,"","MX",CNTRY,"D","","ERROR")
I COUNTRY=0 D
.S COUNTRY=$$FIND1^DIC(779.004,"","MX",CNTRY,"B","","ERROR")
Q COUNTRY
;
;
PSOVTAAF(PSOVRTN,PSOVICN,PSOVSTA,PSOVSTRT,PSOVEND) ; Activation Flag
;
; Update Temporary Address Activation Flag
;
; Input: PSOVICN (required) - Patient ICN
; PSOVXSTA (required) - Temporary address activation flag
; Y or N
; PSOVSTRT (optional) - Temporary address start date
; PSOVEND (optional) - Temporary address end date
;
; Output: PSOVRTN - Return Value
; 1 for success
; or
; -1 - error message for failure
;
S PSOVRTN=1
I $G(PSOVICN)="" S PSOVRTN="-1 - ICN is required" Q
I $G(PSOVSTA)="" S PSOVRTN="-1 - Temporary address activation flag is required" Q
;
N DFN
S DFN=$$GETADFN^MPIFAPI($P(PSOVICN,"V"))
;
I +DFN=-1 S PSOVRTN="-1 - ICN not recognised" Q
;
I $G(PSOVSTA)'="Y",$G(PSOVSTA)'="N" D Q
.S PSOVRTN="-1 - temporary address active flag must be 'Y' or 'N'"
;
; Check start date and end date
I $G(PSOVSTRT)'="",$$EX2FM(PSOVSTRT)="" S PSOVRTN="-1 - Invalid StartDate" Q
I $G(PSOVEND)'="",$$EX2FM(PSOVEND)="" S PSOVRTN="-1 - Invalid EndDate" Q
I $G(PSOVSTRT)'="",$G(PSOVEND)'="" D
.N STRT,END
.S STRT=$$EX2FM(PSOVSTRT),END=$$EX2FM(PSOVEND)
.I END'>STRT S PSOVRTN="-1 - EndDate must be after the StartDate"
I +$G(PSOVRTN)=-1 Q
;
S FDA(.12105)=PSOVSTA
I $D(PSOVSTRT) S FDA(.1217)=$$EX2FM(PSOVSTRT)
I $D(PSOVEND) S FDA(.1218)=$$EX2FM(PSOVEND)
;
; update patient file
N PSOVERR
S PSOVRTN=$$UPD^DGENDBS(2,DFN,.FDA,.PSOVERR)
I +PSOVRTN'=1 S PSOVRTN=-1_" - "_PSOVERR Q
S PSOVRTN="1 - Active Flag Updated"
Q
;
;
; --------
;
ECME(PSOVO,PSOVRXN) ; ECME Log
;
; Input: PSOVRXN (required) - Prescription number
;
; Output: PSOVRTN - Return Value
; ECME log in json format
; -1 - error message for failure
;
; check for required input parameters
I $G(PSOVRXN)="" D NORXNER("-1 - Prescription number is required") Q
;
I '$$RXVAL^PSOUTCRM(PSOVRXN) D NORXNER("-2^ Prescription Number is not recognized") Q
N ERR,PSOVIEN
S PSOVIEN=$O(^TMP($J,"PSOV",-1))
D GET^DDE("PSO ECME M",PSOVIEN,,0,,"PSOVO","ERR")
I $D(ERR) D NORXNER("-1^Error in Retrieval") Q
I $L(PSOVO(1),"}")<3 D NORXNER("0^No data - there are no ECME entries for this prescription") Q
D TIDY()
Q
;
; ---------
;
ERX(PSOVO,PSOVRXN) ; eRx Log
;
; Input: PSOVRXN (required) - Prescription number
;
; Output: PSOVRTN - Return Value
; ERX log in json format
; -1 - error message for failure
;
; check for required input parameters
I $G(PSOVRXN)="" D NORXNER("-1 - Prescription number is required") Q
;
I '$$RXVAL^PSOUTCRM(PSOVRXN) D NORXNER("-2^ Prescription Number is not recognized") Q
N ERR,PSOVIEN
S PSOVIEN=$O(^TMP($J,"PSOV",-1))
;
D GET^DDE("PSO ERX M",PSOVIEN,,0,,"PSOVO","ERR")
I $D(ERR) D NORXNER("-1^Error in Retrieval") Q
I $L(PSOVO(1),"}")<3 D NORXNER("0^No data - there are no ERX entries for this prescription") Q
D TIDY()
Q
;
; --------
;
LELF(PSOVO,PSOVRXN) ; Lot/Expiration Log File
;
; Input: PSOVRXN (required) - Prescription number
;
; Output: PSOVRTN - Return Value
; Lot/Expiration log in json format
; -1 - error message for failure
;
; check for required input parameters
I $G(PSOVRXN)="" D NORXNER("-1 - Prescription number is required") Q
;
I '$$RXVAL^PSOUTCRM(PSOVRXN) D NORXNER("-2^ Prescription Number is not recognized") Q
N ERR,PSOVIEN
S PSOVIEN=$O(^TMP($J,"PSOV",-1))
;
D GET^DDE("PSO LOT EXP M",PSOVIEN,,0,,"PSOVO","ERR")
I $D(ERR) D NORXNER("-1^Error in Retrieval") Q
I $L(PSOVO(1),"}")<3 D NORXNER("0^No data - there are no Lot_Expiration entries for this prescription") Q
D TIDY()
Q
;
; --------
NORXNER(ERROR) ; handle messages for input parameter issue or no data
;
N ZXC,PSOVRT
S PSOVRT="PSOVO"
S ECMER=ERROR
D MERGE(0)
K PSOVO(0)
K PSOVO(1)
D ENCODE^XLFJSON("ECM",.PSOVRT)
S ZXC=@(PSOVRT_"(1)")
S ZXC=$$SWAP^PSOUTCRM(ZXC,"\/","/")
S @PSOVRT=ZXC
K ECM,ECMER
Q
;
;
TRNSFRM(X,SEP,BRC) ; remove extra quotes from string
;
; X - string processed
; SEP - delimiter on which string is parsed
; BRC - opening or closing curly brace
;
Q $P(X,SEP)_SEP_""":"_BRC_$P(X,BRC,4,$L(X,BRC))
;
TIDY() ; tidy up output string
;
S PSOVO(1)="{"_$P(PSOVO(1),"{",2,$L(PSOVO(1),"{"))
N PSOVA1,PSOVA2,CT
S CT=$L(PSOVO(1),"}, {")
M PSOVA1=PSOVO(1)
M PSOVA2("data","items")=PSOVA1
S PSOVA2("data","updated")=$$FMTHL7^XLFDT($$HTFM^XLFDT($H))
S PSOVA2("data","total items")=CT
D ENCODE^XLFJSON("PSOVA2","PSOVO")
S PSOVO(1)=$TR(PSOVO(1),"\\\")
S PSOVO=$$CHOP(PSOVO(1))
K PSOVO(0)
;
S PSOVO=$$TRNSFRM(PSOVO,"items","{")
S PSOVO=$RE($$TRNSFRM($RE(PSOVO),"smeti latot","}"))
S PSOVO=$RE($P($RE(PSOVO),":",1,3)_","_$P($RE(PSOVO),":",4,$L($RE(PSOVO),":")))
;
Q
;
MERGE(CT) ; merge into output array as json
;
M ECM("data","items")=ECMER
S ECM("data","updated")=$$FMTHL7^XLFDT($$HTFM^XLFDT($H))
S ECM("data","total items")=CT
Q
;
;
NTOS(X) ; convert numbers to strings
;
N W,Y,L,M,I
S L=$P(X,":",1),M=$TR($P(X,":",2,$L(X,":")),"][")
S W=$P($P(X,"[",2),"]",1)
F I=1:1:$L(W,", ") I $P(W,", ",I)=+$P(W,", ",I) D
.S $P(M,", ",I)=""""_$P(M,", ",I)_""""
S $P(L,":",2)="["_M_"]"
Q L
;
CHOP(S) ; remove "\ and \" from input S
N P,B,C,I
S P="""\"
S B="" F I=1:1:$L(S,P) S B=B_$P(S,P,I)
S P="\"""
S C="" F I=1:1:$L(B,P) S C=C_$P(B,P,I)
Q C
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSOVCC0 13811 printed Aug 26, 2025@22:52:17 Page 2
PSOVCC0 ;ORLFO/FJF/WC - PSO Activity Logs ; Mar 20, 2023@12:57:56
+1 ;;7.0;OUTPATIENT PHARMACY;**707,776**;DEC 1997;Build 56
+2 ;
+3 ; External calls:
+4 ;
+5 ; Description ICR Notes
+6 ; ----------- ------ -------
+7 ; Reference to ENCODE^XLFJSON in #6682
+8 ; Reference to GET^DDE in #7008
+9 ; Reference to FMTHL7^XLFDT, HTFM^XLFDT in #10103
+10 ; Reference to FIND1^DIC in #2051
+11 ; Reference to UPD^DGENDBS in #7350
+12 ; Reference to GETDFN^MPIFAPI,GETADFN^MPIFAPI in #2702
+13 ; Reference to UPDATE^MPIFAPI in #2706
+14 ; Reference to UP^XLFSTR in #10103
+15 ; Reference to ^%DT in #10003
+16 ;
+17 ;
PSOVPADDR(PSOVRTN,PSOVICN,PSOVADDR,PSOVATYP) ;
+1 ; Update addresses in Patient file
+2 ;
+3 ; This RPC updates an address in the patient file #2.
+4 ; The address to be updated is identified by PSOVATYP parameter
+5 ; documented below.
+6 ;
+7 ; Input: PSOVICN (required) - Patient ICN
+8 ; PSOVADDR (required) - Address
+9 ; - format ARRAY(fieldname)=field_value
+10 ; - e.g. addr("City")="Alexandria"
+11 ; addr("Country")="Canada"
+12 ; addr("County")="Yorkshire"
+13 ; addr("EndDate")="10/31/2022"
+14 ; addr("PhoneNumber")="987-654-3219"
+15 ; addr("PostCode")="SK37 4ED9"
+16 ; addr("Province")="Saskatchewan"
+17 ; addr("StartDate")="09/01/2022"
+18 ; addr("State")="TX"
+19 ; addr("StreetL1")="Flat 9"
+20 ; addr("StreetL2")="The Orchards"
+21 ; addr("StreetL3")="Sharp Avenue"
+22 ; addr("Zip")=95739
+23 ; addr("Zip+4")="95739-0001"
+24 ; PSOVATYP (required) - Indicator of which address is to be updated
+25 ; T - temporary address
+26 ; M - mailing address
+27 ; O - Other, yet to be determined
+28 ;
+29 ; Output: PSOVRTN - Return Value
+30 ; 1 for success
+31 ; or
+32 ; -1 - error message for failure
+33 ;
+34 ; check for required input parameters
+35 ;
+36 IF $GET(PSOVICN)=""
SET PSOVRTN="-1 - ICN is required"
QUIT
+37 IF '$DATA(PSOVADDR)
SET PSOVRTN="-1 - Address is required"
QUIT
+38 IF '$DATA(PSOVATYP)
SET PSOVRTN="-1 - Address type is required"
QUIT
+39 ;
+40 ; check ICN is valid
+41 SET PSOVRTN=1
+42 NEW DFN
+43 SET DFN=$$GETADFN^MPIFAPI($PIECE(PSOVICN,"V"))
+44 ;
+45 IF +DFN=-1
SET PSOVRTN="-1 - ICN not recognised"
QUIT
+46 ;
+47 IF PSOVATYP'="T"
IF PSOVATYP'="M"
SET PSOVRTN="-1 - address type not recognised"
QUIT
+48 ;
+49 ; convert input json to M array PSOVM
+50 DO J2MAR(.PSOVADDR,.PSOVM)
+51 ;
+52 ; Check start date and end date
+53 IF PSOVATYP="T"
IF $GET(PSOVM("StartDate"))'=""
IF $GET(PSOVM("EndDate"))'=""
Begin DoDot:1
+54 NEW STRT,END
+55 SET STRT=$$EX2FM(PSOVM("StartDate"))
SET END=$$EX2FM(PSOVM("EndDate"))
+56 IF END'>STRT
SET PSOVRTN="-1 - EndDate must be after than StartDate"
End DoDot:1
+57 IF +$GET(PSOVRTN)=-1
QUIT
+58 ;
+59 ;
+60 ; build FDA array for address type
+61 NEW FDA
+62 IF PSOVATYP="T"
DO TEMPFDA
+63 IF PSOVATYP="M"
DO MAILFDA
+64 ;
+65 ; update patient file
+66 NEW PSOVERR
+67 SET PSOVRTN=$$UPD^DGENDBS(2,DFN,.FDA,.PSOVERR)
+68 IF +PSOVRTN'=1
SET PSOVRTN=-1_" - "_PSOVERR
QUIT
+69 SET PSOVRTN="1 - Address Updated"
+70 QUIT
+71 ;
TEMPFDA ; create FDA array for temporary address
+1 ;
+2 IF $DATA(PSOVM("StreetL1"))
SET FDA(.1211)=PSOVM("StreetL1")
+3 IF $DATA(PSOVM("StreetL2"))
SET FDA(.1212)=PSOVM("StreetL2")
+4 IF $DATA(PSOVM("StreetL3"))
SET FDA(.1213)=PSOVM("StreetL3")
+5 IF $DATA(PSOVM("City"))
SET FDA(.1214)=PSOVM("City")
+6 IF $GET(PSOVM("State"))'=""
Begin DoDot:1
+7 NEW PSOVSTATE
+8 SET PSOVSTATE=$$UP^XLFSTR(PSOVM("State"))
+9 SET FDA(.1215)=$ORDER(^DIC(5,"B",PSOVSTATE,""))
End DoDot:1
+10 IF $GET(PSOVM("State"))=""
SET FDA(.1215)=""
+11 IF $DATA(PSOVM("Zip"))
SET FDA(.1216)=PSOVM("Zip")
+12 IF $DATA(PSOVM("StartDate"))
SET FDA(.1217)=$$EX2FM(PSOVM("StartDate"))
+13 IF $DATA(PSOVM("EndDate"))
SET FDA(.1218)=$$EX2FM(PSOVM("EndDate"))
+14 IF $DATA(PSOVM("PhoneNumber"))
SET FDA(.1219)=PSOVM("PhoneNumber")
+15 IF $DATA(PSOVM("Province"))
SET FDA(.1221)=PSOVM("Province")
+16 IF $DATA(PSOVM("PostCode"))
SET FDA(.1222)=PSOVM("PostCode")
+17 NEW CNTRY
+18 IF $DATA(PSOVM("Country"))
Begin DoDot:1
+19 SET CNTRY=$$CNTCHK^PSOVCC0(PSOVM("Country"))
+20 IF CNTRY=0
SET CNTRY=""
+21 SET FDA(.1223)=CNTRY
End DoDot:1
+22 IF $DATA(PSOVM("County"))
Begin DoDot:1
+23 NEW PSOVCOUNTY
+24 SET PSOVCOUNTY=$$UP^XLFSTR(PSOVM("County"))
+25 SET FDA(.12111)=PSOVCOUNTY
End DoDot:1
+26 IF $DATA(PSOVM("Zip+4"))
SET FDA(.12112)=$TRANSLATE($GET(PSOVM("Zip+4")),"-")
+27 QUIT
+28 ;
MAILFDA ; create FDA array for mailing address
+1 ;
+2 IF $DATA(PSOVM("StreetL1"))
SET FDA(.111)=PSOVM("StreetL1")
+3 IF $DATA(PSOVM("StreetL2"))
SET FDA(.112)=PSOVM("StreetL2")
+4 IF $DATA(PSOVM("StreetL3"))
SET FDA(.113)=PSOVM("StreetL3")
+5 IF $DATA(PSOVM("City"))
SET FDA(.114)=PSOVM("City")
+6 IF $GET(PSOVM("State"))'=""
Begin DoDot:1
+7 NEW PSOVSTATE
+8 SET PSOVSTATE=$$UP^XLFSTR(PSOVM("State"))
+9 SET FDA(.115)=$ORDER(^DIC(5,"B",PSOVSTATE,""))
End DoDot:1
+10 IF $GET(PSOVM("State"))=""
SET FDA(.115)=""
+11 IF $DATA(PSOVM("Zip"))
SET FDA(.1216)=PSOVM("Zip")
+12 IF $DATA(PSOVM("PhoneNumber"))
SET FDA(.1219)=PSOVM("PhoneNumber")
+13 IF $DATA(PSOVM("Province"))
SET FDA(.1171)=PSOVM("Province")
+14 IF $DATA(PSOVM("PostCode"))
SET FDA(.1172)=PSOVM("PostCode")
+15 NEW CNTRY
+16 IF $DATA(PSOVM("Country"))
Begin DoDot:1
+17 SET CNTRY=$$CNTCHK^PSOVCC0(PSOVM("Country"))
+18 IF CNTRY=0
SET CNTRY=""
+19 SET FDA(.1173)=CNTRY
End DoDot:1
+20 IF $DATA(PSOVM("County"))
Begin DoDot:1
+21 NEW PSOVCOUNTY
+22 SET PSOVCOUNTY=$$UP^XLFSTR(PSOVM("County"))
+23 SET FDA(.117)=PSOVCOUNTY
End DoDot:1
+24 IF $DATA(PSOVM("Zip+4"))
SET FDA(.1112)=$TRANSLATE($GET(PSOVM("Zip+4")),"-")
+25 QUIT
+26 ;
+27 ;
J2MAR(JARR,PSOVM) ; convert passed json into M array
+1 ; Input:
+2 ; JARR - json
+3 ; PSOVM - M array
+4 NEW LSUB,I
+5 SET LSUB=$ORDER(PSOVADDR(""),-1)
+6 FOR I=2:2:LSUB-2
SET PSOVM(PSOVADDR(I))=PSOVADDR(I+1)
+7 QUIT 1
+8 ;
+9 ; Convert external date to FileMan date
EX2FM(X) ; Conversion
+1 ;
+2 ; Input:
+3 ; X - external date or FileMan Date
+4 ;
+5 ; Output:
+6 ; Y - FileMan Date or null
+7 ;
+8 NEW Y
+9 SET X=$GET(X)
+10 DO ^%DT
+11 KILL X,%DT
+12 if Y=-1
SET Y=""
+13 QUIT Y
+14 ;
+15 ;
PSOVDELAD(PSOVRTN,PSOVICN) ; delete temporary address
+1 ;
+2 ; Delete temporary address from patient file
+3 ;
+4 ; Input: PSOVICN (required) - Patient ICN
+5 ;
+6 ; Output: PSOVRTN - Return Value
+7 ; 1 - Temporary Address Deleted
+8 ; or
+9 ; -1 - error message for failure
+10 ;
+11 IF $GET(PSOVICN)=""
SET PSOVRTN="-1 - ICN is required"
QUIT
+12 ; check ICN is valid
+13 SET PSOVRTN=1
+14 NEW DFN
+15 SET DFN=$$GETADFN^MPIFAPI($PIECE(PSOVICN,"V"))
+16 ;
+17 IF +DFN=-1
SET PSOVRTN="-1 - ICN not recognised"
QUIT
+18 ;
+19 ; check that address that is about to be deleted exists
+20 NEW PSOVTMP
+21 DO GET^DDE("PSO TEMPORARY ADDRESS",DFN,,0,,"PSOVTMP")
+22 SET PSOVRTN=$GET(PSOVTMP(1))
+23 IF PSOVRTN=""
Begin DoDot:1
+24 SET PSOVRTN="0 - there is no temporary address to delete for ICN "_PSOVICN
End DoDot:1
QUIT
+25 ;
+26 KILL FDA
+27 FOR I=.1211:.0001:.1219
SET FDA(I)="@"
+28 FOR I=.1221:.0001:.1223
SET FDA(I)="@"
+29 FOR I=.12111,.12112,.12105
SET FDA(I)="@"
+30 ; update patient file
+31 NEW PSOVERR
+32 SET PSOVRTN=$$UPD^DGENDBS(2,DFN,.FDA,.PSOVERR)
+33 IF +PSOVRTN'=1
SET PSOVRTN=-1_" - "_PSOVERR
QUIT
+34 SET PSOVRTN="1 - Temporary Address Deleted"
+35 ;
+36 QUIT
+37 ;
PSOVRETADDR(PSOVRTN,PSOVICN,PSOVATYP) ; Retrieve address from Patient file (#2)
+1 ;
+2 ; Input: PSOVICN (required) - Patient ICN
+3 ; PSOVATYP (required) - Indicator of which address is to be retrieved
+4 ; T - temporary address
+5 ; M - mailing address
+6 ; O - Other, yet to be determined
+7 ;
+8 ; Output: PSOVRTN - Return Value
+9 ; address in json format
+10 ; or
+11 ; -1 - error message for failure
+12 ;
+13 ;
+14 ; check for required input parameters
+15 IF $GET(PSOVICN)=""
SET PSOVRTN="-1 - ICN is required"
QUIT
+16 IF '$DATA(PSOVATYP)
SET PSOVRTN="-1 - Address type is required"
QUIT
+17 IF PSOVATYP'="T"
IF PSOVATYP'="M"
SET PSOVRTN="-1 - address type not recognised"
QUIT
+18 ;
+19 ; check ICN is valid
+20 NEW DFN
+21 SET DFN=$$GETDFN^MPIF001(PSOVICN)
+22 ;
+23 IF +DFN=-1
SET PSOVRTN="-1 - ICN not recognised"
QUIT
+24 ;
+25 NEW QUERY
+26 SET QUERY("PATIENT")=DFN
+27 NEW PSOVTMP
+28 IF PSOVATYP="T"
DO GET^DDE("PSO TEMPORARY ADDRESS",DFN,,0,,"PSOVTMP")
+29 IF PSOVATYP="M"
DO GET^DDE("PSO MAILING ADDRESS",DFN,,0,,"PSOVTMP")
+30 SET PSOVRTN=$GET(PSOVTMP(1))
+31 IF PSOVRTN=""
SET PSOVRTN="0 - No data - there is no relevant address data for ICN "_PSOVICN
+32 QUIT
+33 ;
CNTCHK(CNTRY) ;
+1 ;
+2 NEW COUNTRY
+3 SET COUNTRY=$$FIND1^DIC(779.004,"","MX",CNTRY,"D","","ERROR")
+4 IF COUNTRY=0
Begin DoDot:1
+5 SET COUNTRY=$$FIND1^DIC(779.004,"","MX",CNTRY,"B","","ERROR")
End DoDot:1
+6 QUIT COUNTRY
+7 ;
+8 ;
PSOVTAAF(PSOVRTN,PSOVICN,PSOVSTA,PSOVSTRT,PSOVEND) ; Activation Flag
+1 ;
+2 ; Update Temporary Address Activation Flag
+3 ;
+4 ; Input: PSOVICN (required) - Patient ICN
+5 ; PSOVXSTA (required) - Temporary address activation flag
+6 ; Y or N
+7 ; PSOVSTRT (optional) - Temporary address start date
+8 ; PSOVEND (optional) - Temporary address end date
+9 ;
+10 ; Output: PSOVRTN - Return Value
+11 ; 1 for success
+12 ; or
+13 ; -1 - error message for failure
+14 ;
+15 SET PSOVRTN=1
+16 IF $GET(PSOVICN)=""
SET PSOVRTN="-1 - ICN is required"
QUIT
+17 IF $GET(PSOVSTA)=""
SET PSOVRTN="-1 - Temporary address activation flag is required"
QUIT
+18 ;
+19 NEW DFN
+20 SET DFN=$$GETADFN^MPIFAPI($PIECE(PSOVICN,"V"))
+21 ;
+22 IF +DFN=-1
SET PSOVRTN="-1 - ICN not recognised"
QUIT
+23 ;
+24 IF $GET(PSOVSTA)'="Y"
IF $GET(PSOVSTA)'="N"
Begin DoDot:1
+25 SET PSOVRTN="-1 - temporary address active flag must be 'Y' or 'N'"
End DoDot:1
QUIT
+26 ;
+27 ; Check start date and end date
+28 IF $GET(PSOVSTRT)'=""
IF $$EX2FM(PSOVSTRT)=""
SET PSOVRTN="-1 - Invalid StartDate"
QUIT
+29 IF $GET(PSOVEND)'=""
IF $$EX2FM(PSOVEND)=""
SET PSOVRTN="-1 - Invalid EndDate"
QUIT
+30 IF $GET(PSOVSTRT)'=""
IF $GET(PSOVEND)'=""
Begin DoDot:1
+31 NEW STRT,END
+32 SET STRT=$$EX2FM(PSOVSTRT)
SET END=$$EX2FM(PSOVEND)
+33 IF END'>STRT
SET PSOVRTN="-1 - EndDate must be after the StartDate"
End DoDot:1
+34 IF +$GET(PSOVRTN)=-1
QUIT
+35 ;
+36 SET FDA(.12105)=PSOVSTA
+37 IF $DATA(PSOVSTRT)
SET FDA(.1217)=$$EX2FM(PSOVSTRT)
+38 IF $DATA(PSOVEND)
SET FDA(.1218)=$$EX2FM(PSOVEND)
+39 ;
+40 ; update patient file
+41 NEW PSOVERR
+42 SET PSOVRTN=$$UPD^DGENDBS(2,DFN,.FDA,.PSOVERR)
+43 IF +PSOVRTN'=1
SET PSOVRTN=-1_" - "_PSOVERR
QUIT
+44 SET PSOVRTN="1 - Active Flag Updated"
+45 QUIT
+46 ;
+47 ;
+48 ; --------
+49 ;
ECME(PSOVO,PSOVRXN) ; ECME Log
+1 ;
+2 ; Input: PSOVRXN (required) - Prescription number
+3 ;
+4 ; Output: PSOVRTN - Return Value
+5 ; ECME log in json format
+6 ; -1 - error message for failure
+7 ;
+8 ; check for required input parameters
+9 IF $GET(PSOVRXN)=""
DO NORXNER("-1 - Prescription number is required")
QUIT
+10 ;
+11 IF '$$RXVAL^PSOUTCRM(PSOVRXN)
DO NORXNER("-2^ Prescription Number is not recognized")
QUIT
+12 NEW ERR,PSOVIEN
+13 SET PSOVIEN=$ORDER(^TMP($JOB,"PSOV",-1))
+14 DO GET^DDE("PSO ECME M",PSOVIEN,,0,,"PSOVO","ERR")
+15 IF $DATA(ERR)
DO NORXNER("-1^Error in Retrieval")
QUIT
+16 IF $LENGTH(PSOVO(1),"}")<3
DO NORXNER("0^No data - there are no ECME entries for this prescription")
QUIT
+17 DO TIDY()
+18 QUIT
+19 ;
+20 ; ---------
+21 ;
ERX(PSOVO,PSOVRXN) ; eRx Log
+1 ;
+2 ; Input: PSOVRXN (required) - Prescription number
+3 ;
+4 ; Output: PSOVRTN - Return Value
+5 ; ERX log in json format
+6 ; -1 - error message for failure
+7 ;
+8 ; check for required input parameters
+9 IF $GET(PSOVRXN)=""
DO NORXNER("-1 - Prescription number is required")
QUIT
+10 ;
+11 IF '$$RXVAL^PSOUTCRM(PSOVRXN)
DO NORXNER("-2^ Prescription Number is not recognized")
QUIT
+12 NEW ERR,PSOVIEN
+13 SET PSOVIEN=$ORDER(^TMP($JOB,"PSOV",-1))
+14 ;
+15 DO GET^DDE("PSO ERX M",PSOVIEN,,0,,"PSOVO","ERR")
+16 IF $DATA(ERR)
DO NORXNER("-1^Error in Retrieval")
QUIT
+17 IF $LENGTH(PSOVO(1),"}")<3
DO NORXNER("0^No data - there are no ERX entries for this prescription")
QUIT
+18 DO TIDY()
+19 QUIT
+20 ;
+21 ; --------
+22 ;
LELF(PSOVO,PSOVRXN) ; Lot/Expiration Log File
+1 ;
+2 ; Input: PSOVRXN (required) - Prescription number
+3 ;
+4 ; Output: PSOVRTN - Return Value
+5 ; Lot/Expiration log in json format
+6 ; -1 - error message for failure
+7 ;
+8 ; check for required input parameters
+9 IF $GET(PSOVRXN)=""
DO NORXNER("-1 - Prescription number is required")
QUIT
+10 ;
+11 IF '$$RXVAL^PSOUTCRM(PSOVRXN)
DO NORXNER("-2^ Prescription Number is not recognized")
QUIT
+12 NEW ERR,PSOVIEN
+13 SET PSOVIEN=$ORDER(^TMP($JOB,"PSOV",-1))
+14 ;
+15 DO GET^DDE("PSO LOT EXP M",PSOVIEN,,0,,"PSOVO","ERR")
+16 IF $DATA(ERR)
DO NORXNER("-1^Error in Retrieval")
QUIT
+17 IF $LENGTH(PSOVO(1),"}")<3
DO NORXNER("0^No data - there are no Lot_Expiration entries for this prescription")
QUIT
+18 DO TIDY()
+19 QUIT
+20 ;
+21 ; --------
NORXNER(ERROR) ; handle messages for input parameter issue or no data
+1 ;
+2 NEW ZXC,PSOVRT
+3 SET PSOVRT="PSOVO"
+4 SET ECMER=ERROR
+5 DO MERGE(0)
+6 KILL PSOVO(0)
+7 KILL PSOVO(1)
+8 DO ENCODE^XLFJSON("ECM",.PSOVRT)
+9 SET ZXC=@(PSOVRT_"(1)")
+10 SET ZXC=$$SWAP^PSOUTCRM(ZXC,"\/","/")
+11 SET @PSOVRT=ZXC
+12 KILL ECM,ECMER
+13 QUIT
+14 ;
+15 ;
TRNSFRM(X,SEP,BRC) ; remove extra quotes from string
+1 ;
+2 ; X - string processed
+3 ; SEP - delimiter on which string is parsed
+4 ; BRC - opening or closing curly brace
+5 ;
+6 QUIT $PIECE(X,SEP)_SEP_""":"_BRC_$PIECE(X,BRC,4,$LENGTH(X,BRC))
+7 ;
TIDY() ; tidy up output string
+1 ;
+2 SET PSOVO(1)="{"_$PIECE(PSOVO(1),"{",2,$LENGTH(PSOVO(1),"{"))
+3 NEW PSOVA1,PSOVA2,CT
+4 SET CT=$LENGTH(PSOVO(1),"}, {")
+5 MERGE PSOVA1=PSOVO(1)
+6 MERGE PSOVA2("data","items")=PSOVA1
+7 SET PSOVA2("data","updated")=$$FMTHL7^XLFDT($$HTFM^XLFDT($HOROLOG))
+8 SET PSOVA2("data","total items")=CT
+9 DO ENCODE^XLFJSON("PSOVA2","PSOVO")
+10 SET PSOVO(1)=$TRANSLATE(PSOVO(1),"\\\")
+11 SET PSOVO=$$CHOP(PSOVO(1))
+12 KILL PSOVO(0)
+13 ;
+14 SET PSOVO=$$TRNSFRM(PSOVO,"items","{")
+15 SET PSOVO=$REVERSE($$TRNSFRM($REVERSE(PSOVO),"smeti latot","}"))
+16 SET PSOVO=$REVERSE($PIECE($REVERSE(PSOVO),":",1,3)_","_$PIECE($REVERSE(PSOVO),":",4,$LENGTH($REVERSE(PSOVO),":")))
+17 ;
+18 QUIT
+19 ;
MERGE(CT) ; merge into output array as json
+1 ;
+2 MERGE ECM("data","items")=ECMER
+3 SET ECM("data","updated")=$$FMTHL7^XLFDT($$HTFM^XLFDT($HOROLOG))
+4 SET ECM("data","total items")=CT
+5 QUIT
+6 ;
+7 ;
NTOS(X) ; convert numbers to strings
+1 ;
+2 NEW W,Y,L,M,I
+3 SET L=$PIECE(X,":",1)
SET M=$TRANSLATE($PIECE(X,":",2,$LENGTH(X,":")),"][")
+4 SET W=$PIECE($PIECE(X,"[",2),"]",1)
+5 FOR I=1:1:$LENGTH(W,", ")
IF $PIECE(W,", ",I)=+$PIECE(W,", ",I)
Begin DoDot:1
+6 SET $PIECE(M,", ",I)=""""_$PIECE(M,", ",I)_""""
End DoDot:1
+7 SET $PIECE(L,":",2)="["_M_"]"
+8 QUIT L
+9 ;
CHOP(S) ; remove "\ and \" from input S
+1 NEW P,B,C,I
+2 SET P="""\"
+3 SET B=""
FOR I=1:1:$LENGTH(S,P)
SET B=B_$PIECE(S,P,I)
+4 SET P="\"""
+5 SET C=""
FOR I=1:1:$LENGTH(B,P)
SET C=C_$PIECE(B,P,I)
+6 QUIT C
+7 ;