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

BDGAPI.m

Go to the documentation of this file.
  1. BDGAPI ; IHS/ANMC/LJF - PATIENT MOVEMENT API'S ; [ 09/26/2002 12:59 PM ]
  1. ;;5.3;PIMS;**1010,1016**;APR 26, 2002;Build 20
  1. ;
  1. ;cmi/flag/maw 08/31/2009 PATCH 1010 changed references of UB92 to UB04
  1. ;
  1. ; Calls to be made: S ERR=$$ADD^BDGAPI(.ARRAY)
  1. ; S ERR=$$CANCEL^BDGAPI(.ARRAY)
  1. ; S ERR=$$EDIT^BDGAPI(.ARRAY)
  1. ;
  1. ; Input: BDGR array that can be changed but is not killed
  1. ; passed by reference
  1. ;
  1. ; Output: returns error status
  1. ; ="" means all went well
  1. ; =1^MESSAGE means event stored but one or more required
  1. ; fields were not filed; original value of those fields
  1. ; in error message
  1. ; =2^MESSAGE means event was NOT stored; one or more required
  1. ; fields could not be filed
  1. ;
  1. ;Incoming Array BDGR has the following definition:
  1. ; ALWAYS REQUIRED:
  1. ; BDGR("PAT") = patient ien
  1. ; BDGR("TRAN") = transaction type (1=admit, 2=ward transfer,
  1. ; 3=discharge, 4=check-in lodger, 5=check-out lodger,
  1. ; 6=service transfer)
  1. ; BDGR("DATE") = date/time for movement, in FM or external format
  1. ; BDGR("USER") = user who entered movement
  1. ;
  1. ; CONDITIONALLY REQUIRED:
  1. ; if editing or canceling -
  1. ; BDGR("ACCT") = outside account number for linking to visit
  1. ;
  1. ; if admission -
  1. ; BDGR("UBAS") = 1-digit UB92 admit source code, valid 1-9 & A
  1. ; BDGR("ADMT") = 1-digit IHS admission code, created from UBAS
  1. ; BDGR("ADX") = admitting dx, free text to 30 characters, no ";"
  1. ; BDGR("ACCT") = external account # - to be passed to PCC on add
  1. ;
  1. ; if ADMT=2 or 3 on admission or DSCT=2 on discharge
  1. ; BDGR("TFAC") = transfer facility (in or out), name or ien
  1. ;
  1. ; if admission or ward transfer
  1. ; BDGR("WARD") = ward location, name or ien
  1. ;
  1. ; if admission or service transfer
  1. ; BDGR("SRV") = treating specialty, 2-digit IHS code (file 45.7)
  1. ; BDGR("ADMD") = admitting physician, IHS ADC code or name
  1. ; BDGR("PRMD") = primary provider, IHS ADC code or name
  1. ; if not sent, will be stuffed with attending
  1. ; BDGR("ATMD") = attending provider, IHS ADC or code
  1. ;
  1. ; if discharge
  1. ; BDGR("DSCT") = internal entry number in file 405.1
  1. ;
  1. ; OPTIONAL:
  1. ; if admission
  1. ; BDGR("UBAT") = 1-digit UB92 admission code, valid values 1-4
  1. ; BDGR("REFP") = referring provider, free text, up to 30 characters
  1. ;
  1. ; if admission or ward transfer
  1. ; BDGR("ROOM") = room/bed, formatted free text (room-bed)
  1. ;
  1. ; if discharge
  1. ; BDGR("UBDS") = 1-2 digit UB92 disch status code, valid 1-7,10,20,30
  1. ;
  1. ; New variable set and passed back
  1. ; BDGR("VIEN") = visit ien
  1. ;
  1. ADD(BDGR) ;PEP; silent API to add patient movement entries to file 405
  1. NEW DGQUIET,BDGAPI,ERR
  1. S DGQUIET=1 ;must be in quiet mode
  1. S BDGAPI=1 ;let DGPMV rtns know using API
  1. I $G(DUZ("AG"))="" Q 2_U_"Agency not set" ;must have agency set to IHS
  1. ;
  1. S ERR=$$CHECK(.BDGR) I ERR Q ERR ;check common req fields
  1. ;
  1. D @BDGR("TRAN")
  1. Q $G(ERR)
  1. ;
  1. ;
  1. 1 ; add admission
  1. NEW DGPMT,DFN,I,DGPMY,DGPMCA,DGPMSA,DGPMUC,DGPMN,HRCN,VA
  1. S DGPMT=BDGR("TRAN"),DGPMP="",DFN=BDGR("PAT"),ERR=""
  1. D PID^VADPT6 ;to set HRCN
  1. S DGPMN=1 ;prevents date from being asked
  1. ;
  1. L +^DGPM(0):300
  1. ;6/19/2002 LJF9 (per Linda) change errors to warnings.
  1. ;I $G(^DPT(DFN,.1))]"" S ERR=2_U_"Patient already admitted; cannot add new one" L -^DGPM(0) Q
  1. I $G(^DPT(DFN,.1))]"" S ERR=1_U_"Patient already admitted; cannot add new one" L -^DGPM(0) Q
  1. ; check admission fields for validity
  1. F I="DATE","WARD","SRV","ADMT","ADX","ADMD","ATMD" D @I I +ERR=2 L -^DGPM(0) Q
  1. I +ERR=2 L -^DGPM(0) Q ;at least one required field failed check
  1. ;
  1. ;
  1. ; if enough fields are okay, create event
  1. S BDGR("DATE")=BDGR("ADMIT DATE") ;reset date for service entry
  1. S DGPMY=BDGR("ADMIT DATE"),DGPMCA="",DGPMSA=0
  1. D UC^DGPMV ; sets DGPMUC = transaction type external format
  1. D ^DGPMV3
  1. L -^DGPM(0)
  1. I '$D(^DGPM("APTT1",DFN,BDGR("ADMIT DATE"))) S ERR=2_U_"Admission NOT added for date: "_BDGR("ADMIT DATE") Q
  1. ;
  1. ; add account number if sent to PCC visit
  1. NEW DA,DIE,DR
  1. S DA=$$GET1^DIQ(405,+$O(^DGPM("APTT1",DFN,BDGR("ADMIT DATE"),0)),.27,"I")
  1. I DA S DIE="^AUPNVSIT(",DR="1211///"_BDGR("ACCT") D ^DIE
  1. S BDGR("VIEN")=+$G(DA) ;pass back visit to calling routine
  1. Q
  1. ;
  1. 2 ; add transfer
  1. NEW DGPMT,DFN,I,DGPMY,DGPMCA,DGPMSA,DGPMUC,DGPMN,DGPMAN,BDGCA,BDGV
  1. S DGPMT=BDGR("TRAN"),DGPMP="",DFN=BDGR("PAT"),ERR=""
  1. NEW HRCN,VA D PID^VADPT
  1. S DGPMN=1 ;prevents date from being asked
  1. ;
  1. ; find corresponding admission
  1. D FINDADM^BDGAPI2
  1. I 'BDGCA S ERR=2_U_"No corresponding admission found for transfer date: "_BDGR("DATE") Q
  1. S DGPMCA=BDGCA
  1. S X=$$GET1^DIQ(405,DGPMCA,.17,"I")
  1. S Y=$S(X="":"",1:$$GET1^DIQ(405,X,.01,"I"))
  1. I Y]"",(Y<BDGR("DATE")) S ERR=2_U_"Cannot add transfer for "_BDGR("DATE")_"; patient discharged at "_Y_" IEN ="_X Q
  1. I +$G(^DGPM(DGPMCA,0))>BDGR("DATE") S ERR=2_U_"Cannot add transfer for "_BDGR("DATE")_"; patient admitted at "_$P(^DGPM(DGPMCA,0),U)_" IEN ="_X Q
  1. ;
  1. ; check transfer fields for validity
  1. NEW BDGRM S BDGRM=BDGR("ROOM") ;save orignal room value
  1. F I="DATE","WARD" D @I I +ERR=2 Q
  1. I +ERR=2 Q ;at least one required field failed check
  1. ;
  1. ; if ward did not change, assume switch bed
  1. I $G(^DPT(DFN,.1))=BDGR("WARD") D BED Q
  1. ;
  1. ; if enough fields are okay, create event
  1. S DGPMY=BDGR("DATE"),DGPMAN=$G(^DGPM(DGPMCA,0))
  1. D UC^DGPMV ; sets DGPMUC = transaction type external format
  1. D ^DGPMV3
  1. I '$D(^DGPM("APTT2",DFN,BDGR("DATE"))) S ERR=2_U_"Transfer NOT added for date: "_BDGR("DATE")
  1. Q
  1. ;
  1. 3 ; add discharge
  1. NEW DGPMT,DFN,I,DGPMY,DGPMCA,DGPMSA,DGPMUC,DGPMN,DGPMAN,RVDT,X
  1. S DGPMT=BDGR("TRAN"),DGPMP="",DFN=BDGR("PAT"),ERR=""
  1. NEW HRCN,VA D PID^VADPT
  1. S DGPMN=1 ;prevents date from being asked
  1. ;
  1. ; find corresponding admission
  1. S X=$O(^DGPM("APTT1",DFN,BDGR("DISCHARGE DATE")),-1)
  1. I X S DGPMCA=$O(^DGPM("APTT1",DFN,X,0))
  1. I ('X)!('$G(DGPMCA)) S ERR=2_U_"No corresponding admission found for discharge date: "_BDGR("DISCHARGE DATE") Q
  1. ;
  1. ; check if admission has discharge already
  1. ;6/19/2002 LJF9 (per Linda) change errors to warnings
  1. ;S X=$P($G(^DGPM(DGPMCA,0)),U,17) I X,$G(^DGPM(X,0)) S ERR=2_U_"Admission already discharged; cannot add another." Q
  1. S X=$P($G(^DGPM(DGPMCA,0)),U,17) I X,$G(^DGPM(X,0)) S ERR=1_U_"Admission already discharged: cannot add another." Q
  1. ;
  1. S RVDT=9999999.9999999-BDGR("DISCHARGE DATE")
  1. S X=$O(^DGPM("APMV",DFN,DGPMCA,0)) I X<RVDT S ERR=2_U_"Discharge earlier than last ward transfer" Q
  1. S X=$O(^DGPM("ATS",DFN,DGPMCA,0)) I X<RVDT S ERR=2_U_"Discharge earlier than last service transfer" Q
  1. ;
  1. ; check discharge fields for validity
  1. F I="DATE","DSCT" D @I I +ERR=2 Q
  1. I +ERR=2 Q ;at least one required field failed check
  1. ;
  1. ; if enough fields are okay, create event
  1. S DGPMY=BDGR("DISCHARGE DATE"),DGPMAN=$G(^DGPM(DGPMCA,0))
  1. D UC^DGPMV ; sets DGPMUC = transaction type external format
  1. D ^DGPMV3
  1. I '$D(^DGPM("APTT3",DFN,BDGR("DISCHARGE DATE"))) S ERR=2_U_"Discharge NOT added for date: "_BDGR("DISCHARGE DATE")
  1. Q
  1. ;
  1. 6 ; add treating specialty transfer
  1. NEW DGPMT,DFN,I,DGPMY,DGPMCA,DGPMSA,DGPMUC,DGPMN,DGPMAN,BDGCA,BDGV
  1. S DGPMT=BDGR("TRAN"),DGPMP="",DFN=BDGR("PAT"),ERR=""
  1. NEW HRCN,VA D PID^VADPT
  1. S DGPMN=1 ;prevents date from being asked
  1. ;
  1. ; find corresponding admission
  1. D FINDADM^BDGAPI2
  1. I 'BDGCA S ERR=2_U_"No corresponding admission found for service transfer date: "_BDGR("DATE") Q
  1. S DGPMCA=BDGCA
  1. ;
  1. S X=$$GET1^DIQ(405,DGPMCA,.17,"I")
  1. I X S X=$$GET1^DIQ(405,X,.01,"I")
  1. I X]"",(X<BDGR("DATE")) S ERR=2_U_"Cannot add service transfer for "_BDGR("DATE")_"; patient discharged at "_X Q
  1. I +$G(^DGPM(DGPMCA,0))>BDGR("DATE") S ERR=2_U_"Cannot add service transfer for "_BDGR("DATE")_"; patient admitted at "_$P(^DGPM(DGPMCA,0),U) Q
  1. ;
  1. ; check service transfer fields for validity
  1. F I="DATE","SRV","ATMD" D @I I +ERR=2 Q
  1. I +ERR=2 Q ;at least one required field failed check
  1. ;
  1. ;
  1. ; if enough fields are okay, create event
  1. S DGPMY=BDGR("DATE"),DGPMAN=$G(^DGPM(DGPMCA,0))
  1. D UC^DGPMV ; sets DGPMUC = transaction type external format
  1. D ^DGPMV3
  1. I '$D(^DGPM("APTT6",DFN,BDGR("DATE"))) S ERR=2_U_"Service transfer NOT added for date: "_BDGR("DATE")
  1. Q
  1. ;
  1. EDIT(BDGR) ;PEP; silent API to edit patient movement entry in file 405
  1. Q $$EDIT^BDGAPI2(.BDGR)
  1. ;
  1. CANCEL(BDGR) ;PEP; silent API to cancel patient movement entry in file 405
  1. Q $$CANCEL^BDGAPI1(.BDGR)
  1. ;
  1. ;
  1. DATE ; check event date field
  1. NEW DATE S DATE=$S(BDGR("TRAN")=1:BDGR("ADMIT DATE"),BDGR("TRAN")=3:BDGR("DISCHARGE DATE"),1:BDGR("DATE"))
  1. I $D(^DGPM("APTT"_BDGR("TRAN"),DFN,DATE)) S ERR=2_U_"Cannot add event; already there"
  1. Q
  1. ;
  1. WARD ; -- check ward and room-bed
  1. NEW X,DIC,Y
  1. ; check required ward
  1. S X=$G(BDGR("WARD")),DIC=42,DIC(0)="M"
  1. S DIC("S")="I $P($G(^BDGWD(+Y,0)),U,3)=""A""" D ^DIC
  1. I Y=-1 S ERR=2_U_"Ward error: "_BDGR("WARD") Q
  1. ;
  1. ; check optional room-bed
  1. S X=$G(BDGR("ROOM")) I X]"" D
  1. . K DIC S DIC=405.4,DIC(0)="M" D ^DIC
  1. . I Y<1 S ERR=ERR_1_U_"Invalid room-"_BDGR("ROOM")_U,BDGR("ROOM")="" Q
  1. . I $D(^DPT("RM",BDGR("ROOM"))),'$D(^DPT("RM",BDGR("ROOM"),DFN)) S ERR=ERR_1_U_"Room-bed already occupied: "_BDGR("ROOM")_U,BDGR("ROOM")=""
  1. Q
  1. ;
  1. SRV ; -- check service (screen for active admitting services)
  1. NEW X,DIC,Y
  1. ; check if observation event has observation type service
  1. I $G(BDGR("MINOR TYPE"))="V",BDGR("SRV")'["O" S BDGR("SRV")=BDGR("SRV")_"O"
  1. ;
  1. S X=$G(BDGR("SRV")),DIC=45.7,DIC(0)="M"
  1. S DIC("S")="I $$ACTIVE^DGACT(45.7,+Y,BDGR(""DATE""))" D ^DIC
  1. I Y<1 S ERR=2_U_"Invalid Service: "_BDGR("SRV")
  1. Q
  1. ;
  1. ADMT ; -- check admit types/source
  1. NEW X,DIC,Y
  1. ; check required ub92 admission source
  1. S X=$G(BDGR("UBAS")) I X="" S ERR=2_U_"Admission Source Missing" Q
  1. K DIC S DIC=9999999.53,DIC(0)="M" D ^DIC
  1. I Y<1 S ERR=2_U_"Invalid Admission Source: "_BDGR("UBAS") Q
  1. ;
  1. ; IHS admit type derived from admission source
  1. I '$G(BDGR("ADMT")) D ;ihs/cmi/maw 12/6/2012 for BMW GUI ADT
  1. . S X=$$GET1^DIQ(9999999.53,+Y,.03,"I") ;crosswalk to IHS admit type
  1. . I $$GET1^DIQ(405.1,+X,.02,"I")=1 S BDGR("ADMT")=$$GET1^DIQ(405.1,+X,9999999.1)
  1. I '$G(BDGR("ADMT")) S ERR=2_U_"IHS Admit Type INVALID: BDGR(UBAS)="_BDGR("UBAS") Q
  1. ;
  1. I (BDGR("ADMT")=2)!(BDGR("ADMT")=3)!(BDGR("UBAS")=7) D Q:+ERR=2
  1. . ;
  1. . S X=$G(BDGR("TFAC")) I X="" D Q
  1. .. Q:BDGR("UBAS")=7 ;not required if source is ER
  1. .. S ERR=2_U_"Transfer Facility Missing" Q
  1. . ;
  1. . K DIC S DIC=9999999.91,DIC(0)="M"
  1. . S DIC("S")="I $P(^AUTTTFAC(+Y,0),U,2)=""""" D ^DIC
  1. . I Y<1 S ERR=2_U_"Invalid Transfer Facility: "_BDGR("TFAC")
  1. . ;
  1. . I BDGR("UBAS")=7 S BDGR("ADMT")=2 ;reset transfer via ER
  1. ;
  1. ; check optional ub04 admit type
  1. S X=$G(BDGR("UBAT")) I X]"" D
  1. . I X=9 S BDGR("UBAT")="" Q
  1. . I (X<1)!(X>4) S ERR=ERR_1_U_"Invalid UB04 Admit Type: "_$G(BDGR("UBAT"))_U,BDGR("UBAT")="" ;cmi/maw 08/31/2009 PATCH 1010
  1. Q
  1. ;
  1. DSCT ; -- check discharge types
  1. NEW X,DIC,Y
  1. S BDGR("DSCT")=+BDGR("DSCT")
  1. ; check required IHS discharge type
  1. S X=$G(BDGR("DSCT")),DIC=405.1,DIC(0)="M"
  1. S DIC("S")="I $P(^DG(405.1,+Y,0),U,2)=3" D ^DIC
  1. I Y<1 S ERR=2_U_"IHS Discharge Type Invalid: "_BDGR("DSCT") Q
  1. ;
  1. I (BDGR("DSCT")=13) D Q:+ERR=2
  1. . S X=$G(BDGR("TFAC")) I X="" S ERR=2_U_"Transfer Facility Missing" Q
  1. . K DIC S DIC=9999999.91,DIC(0)="M"
  1. . S DIC("S")="I $P(^AUTTTFAC(+Y,0),U,2)=""""" D ^DIC
  1. . I Y<1 S ERR=2_U_"Invalid Transfer Facility: "_BDGR("TFAC")
  1. ;
  1. ; check optional ub04 discharge status
  1. S X=$G(BDGR("UBDS")) I X]"" D
  1. . I "^1^2^3^4^5^6^7^10^20^30"'[X S ERR=ERR_1_U_"Invalid UB04 Discharge Status: "_$G(BDGR("UBDS"))_U,BDGR("UBDS")="" ;cmi/maw 08/31/2009 PATCH 1010
  1. Q
  1. ;
  1. ADX ; check admitting dx
  1. NEW X
  1. S X=$G(BDGR("ADX")) I X="" S ERR=2_U_"Admitting Dx Missing" Q
  1. I $L(X)<3 S ERR=2_U_"Admitting dx too short: "_X Q
  1. I $L(X)>30 S ERR=2_U_"Admitting dx too long: "_X Q
  1. Q
  1. ;
  1. ADMD ; check admitting and referring provider fields
  1. NEW X,DIC,Y
  1. ; check required admitting physician
  1. I $G(BDGR("ADMD"))="" S BDGR("ADMD")=$G(BDGR("ATMD"))
  1. S X=$G(BDGR("ADMD")) I X="" S ERR=2_U_"Admitting Provider Missing" Q
  1. S DIC=200,DIC(0)="M"
  1. S DIC("S")="I $D(^XUSEC(""PROVIDER"",+Y)),$P($G(^VA(200,+Y,""PS"")),U,4)="""""
  1. D ^DIC I Y<1 S ERR=2_U_"Invalid Admitting Provider: "_BDGR("ADMD") Q
  1. ;
  1. ; check optional referring provider
  1. S X=$G(BDGR("REFP")) Q:X=""
  1. I $L(X)<3 W ERR=ERR_1_U_"Referring Provider too short: "_X,BDGR("REFP")="" Q
  1. I $L(X)>30 W ERR=ERR_1_U_"Referring Provider too long: "_X,BDGR("REFP")=""
  1. Q
  1. ;
  1. ATMD ; check attending and primary provider fields
  1. NEW X,DIC,Y
  1. ; check required attending physician
  1. S X=$G(BDGR("ATMD")) I X="" S ERR=2_U_"Attending Provider Missing" Q
  1. S DIC=200,DIC(0)="M"
  1. S DIC("S")="I $D(^XUSEC(""PROVIDER"",+Y)),$P($G(^VA(200,+Y,""PS"")),U,4)="""""
  1. D ^DIC I Y<1 S ERR=2_U_"Invalid Attending Provider: "_BDGR("ATMD") Q
  1. ;
  1. ; check primary provider (use attending if missing)
  1. S X=$G(BDGR("PRMD")) I X="" S BDGR("PRMD")=BDGR("ATMD") Q
  1. S DIC=200,DIC(0)="M"
  1. S DIC("S")="I $D(^XUSEC(""PROVIDER"",+Y)),$P($G(^VA(200,+Y,""PS"")),U,4)="""""
  1. D ^DIC I Y<1 S ERR=2_U_"Invalid Primary Provider: "_BDGR("PRMD") Q
  1. Q
  1. ;
  1. CHECK(ARRAY) ; check common required fields
  1. NEW X,Y,%DT
  1. I '$G(BDGR("PAT")) Q 2_U_"Patient ID error"
  1. I ($G(BDGR("TRAN"))<1)!($G(BDGR("TRAN"))>6) Q 2_U_"Trans Code Error"
  1. S X=$G(BDGR("DATE")) I X'?7N1".".N D I Y=-1 Q 2_U_"Date Error"
  1. . S %DT="RX" D ^%DT Q:Y=-1
  1. . S BDGR("DATE")=Y ;reset date to FM format
  1. I $$GET1^DIQ(200,+$G(BDGR("USER")),.01)="" Q 2_U_"User Error"
  1. Q 0
  1. ;
  1. BED ; switch bed
  1. I BDGRM'=BDGR("ROOM") Q ;don't edit if lookup failed
  1. I BDGR("ROOM")="",BDGR("PROOM")="" Q ;no change
  1. I $G(^DPT(DFN,.101))=BDGR("ROOM") Q ;already in that bed
  1. I BDGR("ROOM")]"",$D(^DPT("RM",BDGR("ROOM"))) S ERR=ERR_1_U_"Room-bed already occupied: "_BDGR("ROOM")_U,BDGR("ROOM")="" Q
  1. ;
  1. ; rest of this code taken from ^DGSWITCH
  1. NEW DIE,DA,DR
  1. K ^UTILITY("DGPM",$J) S (DGSWITCH,DGOERR)=0,XQORQUIT=1 K ORACTION
  1. S DIE="^DGPM(",DR=".07///"_BDGR("ROOM")
  1. S:BDGR("ROOM")="" DR=".07///@"
  1. S DA=$$PRIORMVT^BDGF1(BDGR("DATE"),DGPMCA,DFN) Q:'DA
  1. S DGPMT=$$GET1^DIQ(405,DA,.02,"I") ;equals 1 (admit) or 2 (transfer)
  1. D DIE^DGSWITCH,Q^DGSWITCH
  1. Q