- DGOIL2 ;ALB/AAS - CALCULATE LOS BY TRANSFER ; 28-SEPT-90
- ;;5.3;Registration;**93,498,1015**;Aug 13, 1993;Build 21
- ;
- ;INPUT - Admission ifn in DGPMIFN - call EN^
- ;
- ;OUTPUT - x(t)=net los^auth absence days^pass days^unauth days^asih days^gross los^trf date^ward
- ; x3=sum of x(t's)
- ;
- EN N T,I S (LOP,LOA,LOUA,LOAS)=0
- S (X,X3)="0^0^0^0^0^0^0"
- I $S('$D(DGPMIFN):1,'$D(^DGPM(+DGPMIFN,0)):1,$P(^(0),"^",2)'=1:1,1:0) G END
- S B=^DGPM(DGPMIFN,0),DFN=$P(B,"^",3),A=+B
- I $P(B,"^",22) S:$L(A)=7 A=A_"." S A=A_"000000",A=$E(A,1,14)_$P(B,"^",22)
- ASIH S DGASIH="" I $P(B,"^",18)=40,$P(B,"^",21),$P(^DGPM($P(B,"^",21),0),"^",14) S ADM=^DGPM($P(^DGPM($P(B,"^",21),0),"^",14),0),DIS=$P(ADM,"^",17) I DIS]"",$D(^DGPM(DIS,0)),+^(0)>DT S DGASIH="+" ;currently asih flag
- D MAX
- ;
- S (I,DGT)=1
- ADM F DGT=DGT:1 S A1=A,DGPMIFN1=$O(^DGPM("APCA",DFN,DGPMIFN,A,0)) Q:'DGPMIFN1!('A)!('I) D TRANS
- Q:$D(DGPMIFN(1))
- S $P(X3,"^",9)=DGASIH
- S $P(X3,"^",10)=$S($P($G(^DGPM(DGPMIFN,"DIR")),"^",1)'=0:"!",1:"")
- G END
- ;
- EN1 ; - entry to find los for one transfer
- ; - input DGPMIFN1 = transfer
- ; - output in X(t) if '$d(DGT) t=1
- ;
- I $S('$D(DGPMIFN1):1,'$D(^DGPM(DGPMIFN1,0)):1,$P(^(0),"^",2)>2:1,1:0) S DGOUT=1 G EN1Q
- S DGPMIFN=$P(^DGPM(DGPMIFN1,0),"^",14) I $S('DGPMIFN:1,'$D(^DGPM(DGPMIFN,0)):1,1:0) S DGOUT=1 G EN1Q
- S B=^DGPM(DGPMIFN,0)
- S DGT=1 D MAX
- TRANS S (DGOUT,LOP,LOA,LOUA,LOAS)=0
- S X(DGT)="0^0^0^0^0^0^0^0^"
- S B(DGT)=^DGPM(DGPMIFN1,0)
- S DGWRD=+$P(B(DGT),"^",6) I +DGWRD,$D(^DIC(42,+DGWRD,0)) S DGWRD=$P(^(0),"^")
- E S DGWRD=""
- ;
- S DGDONE=0
- F I=A:0 S I=$O(^DGPM("APCA",DFN,DGPMIFN,I)) Q:'I S:$E(I,1,$L(D))'=D A=I S DGS=$O(^(I,0)) I $D(^DGPM(+DGS,0)) S Z=DGS,DGS=^(0) I "^1^2^3^4^25^26^13^14^43^44^45^"[("^"_$P(DGS,"^",18)_"^") S X2=+DGS,DGS=("^"_$P(DGS,"^",18)_"^") D ABS Q:'I!DGOUT
- I 'DGDONE,'I S A1=A,A=D ;end of movements, a1=start of last trf, a=dschrg or now
- D TRFTOT
- I $D(DGS),"^13^"[DGS D ^DGOIL3
- EN1Q K DGWRD
- Q
- ;
- ABS ; - if patient was on absence, find return.
- ; - DGS = mvt type at start of absence
- ; - DGE = mvt type at end of absence
- ;
- I "^43^"[DGS S DGOF=$S($P(^DGPM(Z,0),"^",5):$S($D(^DIC(4,$P(^DGPM(Z,0),"^",5),0)):$P(^(0),"^"),1:"UNK"),1:"UNK")
- I "^4^13^43^"[DGS S DGOUT=1 Q ;start new transfers
- ;
- I "^14^"[DGS S:$D(DGOF) DGOFF=1 S X1=A,X2=A1 D ^%DTC S LOAS=LOAS+X,DGOUT=1 Q
- ;
- TF S X1=0 F I=I:0 S I=$O(^DGPM("APCA",DFN,DGPMIFN,I)) Q:'I S DGE=$O(^(I,0)) I $D(^DGPM(+DGE,0)) S DGE=^(0) I "^4^13^14^22^23^24^25^26^43^"[("^"_$P(DGE,"^",18)_"^") S (X1,DGET)=+DGE,DGE="^"_$P(DGE,"^",18)_"^" Q
- ;
- I 'X1 S (A,X1)=D D ^%DTC S DGOUT=1 D NORET Q ;if no return from absence use discharge or now
- D ^%DTC
- ;
- ;if 22 or 26 add time in unauth
- I "^22^26^"[DGE S LOUA=LOUA+X,A=A1
- ;
- ;if 23 add time in pass
- I "^23^"[DGE S LOP=LOP+X,A=A1
- ;
- ;if 24 or 25 add time in auth
- I "^24^25^"[DGE S LOA=LOA+X,A=A1
- ;
- I "^14^"[DGE S LOAS=LOAS+X,DGOUT=1
- ;
- ;if 25 or 26 sets tranf to and looks for next return
- I "^25^26"[DGE S DGS=DGE,X2=DGET G TF
- ;
- I "^14^44^"[DGE S DGOUT=1 Q ;I wonder if this is really necessary?
- Q
- ;
- TOT ; -- total los from transfer x(t) into x3
- F JJ=1:1:6 S $P(X3,"^",JJ)=$P(X3,"^",JJ)+($P(X(DGT),"^",JJ))
- F JJ=7:1:8 S $P(X3,"^",JJ)=$P(X(DGT),"^",JJ)
- Q
- ;
- TRFTOT ; los for transfer, set x(t)
- S X1=A,X2=A1 D ^%DTC
- S X(DGT)=(X-(LOA+LOUA))_"^"_LOA_"^"_LOP_"^"_LOUA_"^"_$S($D(DGPMIFN(1)):X,1:LOAS)_"^"_X_"^"_A1_"^"_$S($D(DGOFF):DGOF,1:DGWRD),DGOUT=1 K:$D(DGOFF) DGOFF,DGOF
- D TOT
- Q
- ;
- NORET ; -- If discharge while absent find absence up to discharge
- S DGDONE=1
- I "^1^"[DGS S LOP=LOP+X
- I "^2^26^"[DGS S LOA=LOA+X
- I "^3^25^"[DGS S LOUA=LOUA+X
- I "^14^43^44^45^"[DGS S LOAS=LOAS+X
- Q
- END K A,A1,B,D,DGDONE,DGE,DGET,DGMAX,DGOUT,DGPMIFN,DGPMIFN1,DGS,DGT,DGWRD,I,JJ,LOA,LOAS,LOP,LOUA,T,X1,X2
- Q
- MAX D NOW^%DTC S D=$S($D(^DGPM(+$P(B,"^",17),0)):+^(0),1:0) S D=$S('D:%,D>%:%,1:D) S X1=D,X2=A D ^%DTC S DGMAX=$S(X:X,1:1)
- Q
- DGOIL2 ;ALB/AAS - CALCULATE LOS BY TRANSFER ; 28-SEPT-90
- +1 ;;5.3;Registration;**93,498,1015**;Aug 13, 1993;Build 21
- +2 ;
- +3 ;INPUT - Admission ifn in DGPMIFN - call EN^
- +4 ;
- +5 ;OUTPUT - x(t)=net los^auth absence days^pass days^unauth days^asih days^gross los^trf date^ward
- +6 ; x3=sum of x(t's)
- +7 ;
- EN NEW T,I
- SET (LOP,LOA,LOUA,LOAS)=0
- +1 SET (X,X3)="0^0^0^0^0^0^0"
- +2 IF $SELECT('$DATA(DGPMIFN):1,'$DATA(^DGPM(+DGPMIFN,0)):1,$PIECE(^(0),"^",2)'=1:1,1:0)
- GOTO END
- +3 SET B=^DGPM(DGPMIFN,0)
- SET DFN=$PIECE(B,"^",3)
- SET A=+B
- +4 IF $PIECE(B,"^",22)
- IF $LENGTH(A)=7
- SET A=A_"."
- SET A=A_"000000"
- SET A=$EXTRACT(A,1,14)_$PIECE(B,"^",22)
- ASIH ;currently asih flag
- SET DGASIH=""
- IF $PIECE(B,"^",18)=40
- IF $PIECE(B,"^",21)
- IF $PIECE(^DGPM($PIECE(B,"^",21),0),"^",14)
- SET ADM=^DGPM($PIECE(^DGPM($PIECE(B,"^",21),0),"^",14),0)
- SET DIS=$PIECE(ADM,"^",17)
- IF DIS]""
- IF $DATA(^DGPM(DIS,0))
- IF +^(0)>DT
- SET DGASIH="+"
- +1 DO MAX
- +2 ;
- +3 SET (I,DGT)=1
- ADM FOR DGT=DGT:1
- SET A1=A
- SET DGPMIFN1=$ORDER(^DGPM("APCA",DFN,DGPMIFN,A,0))
- IF 'DGPMIFN1!('A)!('I)
- QUIT
- DO TRANS
- +1 IF $DATA(DGPMIFN(1))
- QUIT
- +2 SET $PIECE(X3,"^",9)=DGASIH
- +3 SET $PIECE(X3,"^",10)=$SELECT($PIECE($GET(^DGPM(DGPMIFN,"DIR")),"^",1)'=0:"!",1:"")
- +4 GOTO END
- +5 ;
- EN1 ; - entry to find los for one transfer
- +1 ; - input DGPMIFN1 = transfer
- +2 ; - output in X(t) if '$d(DGT) t=1
- +3 ;
- +4 IF $SELECT('$DATA(DGPMIFN1):1,'$DATA(^DGPM(DGPMIFN1,0)):1,$PIECE(^(0),"^",2)>2:1,1:0)
- SET DGOUT=1
- GOTO EN1Q
- +5 SET DGPMIFN=$PIECE(^DGPM(DGPMIFN1,0),"^",14)
- IF $SELECT('DGPMIFN:1,'$DATA(^DGPM(DGPMIFN,0)):1,1:0)
- SET DGOUT=1
- GOTO EN1Q
- +6 SET B=^DGPM(DGPMIFN,0)
- +7 SET DGT=1
- DO MAX
- TRANS SET (DGOUT,LOP,LOA,LOUA,LOAS)=0
- +1 SET X(DGT)="0^0^0^0^0^0^0^0^"
- +2 SET B(DGT)=^DGPM(DGPMIFN1,0)
- +3 SET DGWRD=+$PIECE(B(DGT),"^",6)
- IF +DGWRD
- IF $DATA(^DIC(42,+DGWRD,0))
- SET DGWRD=$PIECE(^(0),"^")
- +4 IF '$TEST
- SET DGWRD=""
- +5 ;
- +6 SET DGDONE=0
- +7 FOR I=A:0
- SET I=$ORDER(^DGPM("APCA",DFN,DGPMIFN,I))
- IF 'I
- QUIT
- IF $EXTRACT(I,1,$LENGTH(D))'=D
- SET A=I
- SET DGS=$ORDER(^(I,0))
- IF $DATA(^DGPM(+DGS,0))
- SET Z=DGS
- SET DGS=^(0)
- IF "^1^2^3^4^25^26^13^14^43^44^45^"[("^"_$PIECE(DGS,"^",18)_"^")
- SET X2=+DGS
- SET DGS=("^"_$PIECE(DGS,"^",18)_"^")
- DO ABS
- IF 'I!DGOUT
- QUIT
- +8 ;end of movements, a1=start of last trf, a=dschrg or now
- IF 'DGDONE
- IF 'I
- SET A1=A
- SET A=D
- +9 DO TRFTOT
- +10 IF $DATA(DGS)
- IF "^13^"[DGS
- DO ^DGOIL3
- EN1Q KILL DGWRD
- +1 QUIT
- +2 ;
- ABS ; - if patient was on absence, find return.
- +1 ; - DGS = mvt type at start of absence
- +2 ; - DGE = mvt type at end of absence
- +3 ;
- +4 IF "^43^"[DGS
- SET DGOF=$SELECT($PIECE(^DGPM(Z,0),"^",5):$SELECT($DATA(^DIC(4,$PIECE(^DGPM(Z,0),"^",5),0)):$PIECE(^(0),"^"),1:"UNK"),1:"UNK")
- +5 ;start new transfers
- IF "^4^13^43^"[DGS
- SET DGOUT=1
- QUIT
- +6 ;
- +7 IF "^14^"[DGS
- IF $DATA(DGOF)
- SET DGOFF=1
- SET X1=A
- SET X2=A1
- DO ^%DTC
- SET LOAS=LOAS+X
- SET DGOUT=1
- QUIT
- +8 ;
- TF SET X1=0
- FOR I=I:0
- SET I=$ORDER(^DGPM("APCA",DFN,DGPMIFN,I))
- IF 'I
- QUIT
- SET DGE=$ORDER(^(I,0))
- IF $DATA(^DGPM(+DGE,0))
- SET DGE=^(0)
- IF "^4^13^14^22^23^24^25^26^43^"[("^"_$PIECE(DGE,"^",18)_"^")
- SET (X1,DGET)=+DGE
- SET DGE="^"_$PIECE(DGE,"^",18)_"^"
- QUIT
- +1 ;
- +2 ;if no return from absence use discharge or now
- IF 'X1
- SET (A,X1)=D
- DO ^%DTC
- SET DGOUT=1
- DO NORET
- QUIT
- +3 DO ^%DTC
- +4 ;
- +5 ;if 22 or 26 add time in unauth
- +6 IF "^22^26^"[DGE
- SET LOUA=LOUA+X
- SET A=A1
- +7 ;
- +8 ;if 23 add time in pass
- +9 IF "^23^"[DGE
- SET LOP=LOP+X
- SET A=A1
- +10 ;
- +11 ;if 24 or 25 add time in auth
- +12 IF "^24^25^"[DGE
- SET LOA=LOA+X
- SET A=A1
- +13 ;
- +14 IF "^14^"[DGE
- SET LOAS=LOAS+X
- SET DGOUT=1
- +15 ;
- +16 ;if 25 or 26 sets tranf to and looks for next return
- +17 IF "^25^26"[DGE
- SET DGS=DGE
- SET X2=DGET
- GOTO TF
- +18 ;
- +19 ;I wonder if this is really necessary?
- IF "^14^44^"[DGE
- SET DGOUT=1
- QUIT
- +20 QUIT
- +21 ;
- TOT ; -- total los from transfer x(t) into x3
- +1 FOR JJ=1:1:6
- SET $PIECE(X3,"^",JJ)=$PIECE(X3,"^",JJ)+($PIECE(X(DGT),"^",JJ))
- +2 FOR JJ=7:1:8
- SET $PIECE(X3,"^",JJ)=$PIECE(X(DGT),"^",JJ)
- +3 QUIT
- +4 ;
- TRFTOT ; los for transfer, set x(t)
- +1 SET X1=A
- SET X2=A1
- DO ^%DTC
- +2 SET X(DGT)=(X-(LOA+LOUA))_"^"_LOA_"^"_LOP_"^"_LOUA_"^"_$SELECT($DATA(DGPMIFN(1)):X,1:LOAS)_"^"_X_"^"_A1_"^"_$SELECT($DATA(DGOFF):DGOF,1:DGWRD)
- SET DGOUT=1
- IF $DATA(DGOFF)
- KILL DGOFF,DGOF
- +3 DO TOT
- +4 QUIT
- +5 ;
- NORET ; -- If discharge while absent find absence up to discharge
- +1 SET DGDONE=1
- +2 IF "^1^"[DGS
- SET LOP=LOP+X
- +3 IF "^2^26^"[DGS
- SET LOA=LOA+X
- +4 IF "^3^25^"[DGS
- SET LOUA=LOUA+X
- +5 IF "^14^43^44^45^"[DGS
- SET LOAS=LOAS+X
- +6 QUIT
- END KILL A,A1,B,D,DGDONE,DGE,DGET,DGMAX,DGOUT,DGPMIFN,DGPMIFN1,DGS,DGT,DGWRD,I,JJ,LOA,LOAS,LOP,LOUA,T,X1,X2
- +1 QUIT
- MAX DO NOW^%DTC
- SET D=$SELECT($DATA(^DGPM(+$PIECE(B,"^",17),0)):+^(0),1:0)
- SET D=$SELECT('D:%,D>%:%,1:D)
- SET X1=D
- SET X2=A
- DO ^%DTC
- SET DGMAX=$SELECT(X:X,1:1)
- +1 QUIT