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

PSOSPML0.m

Go to the documentation of this file.
  1. PSOSPML0 ;BIRM/MFR - Scheduled Batch Export ;1/6/21 12:58
  1. ;;7.0;OUTPATIENT PHARMACY;**408,451,625,630,696,724**;DEC 1997;Build 3
  1. ;
  1. AUTO ; SPMP Scheduled Background Job Edit
  1. N DIC,Y S DIC(0)="XZM",DIC="^DIC(19.2,",X="PSO SPMP SCHEDULED EXPORT" D ^DIC
  1. I +Y>0 S DA=Y D EDIT^XUTMOPT("PSO SPMP SCHEDULED EXPORT") Q
  1. D RESCH^XUTMOPT("PSO SPMP SCHEDULED EXPORT",$$FMADD^XLFDT(DT,1)+.0001,"","24H","L")
  1. D EDIT^XUTMOPT("PSO SPMP SCHEDULED EXPORT")
  1. Q
  1. ;
  1. EXPORT ; SPMP Nightly Scheduled Export
  1. N STATE,NODE0,EXPNODE,BEGEXPDT,FREQCY,YESTERDY,BATIEN,RXCNT,RTSBGDT,RTSENDT
  1. ;
  1. D CHK5841
  1. K ^TMP("PSOSPMBM",$J) ;P696
  1. S STATE=0
  1. F S STATE=$O(^PS(58.41,STATE)) Q:'STATE D
  1. . K ^TMP("PSOSPMRX",$J)
  1. . I $P($$SPOK^PSOSPMUT(STATE),"^")=-1 D Q
  1. . . D LOGERROR^PSOSPMUT(0,STATE,$P($$SPOK^PSOSPMUT(STATE),"^",2),1)
  1. . S ^TMP("PSOSPMBM",$J,STATE)=0 ;P696
  1. . S NODE0=$G(^PS(58.41,STATE,0)),EXPNODE=$G(^PS(58.41,STATE,"EXPORT"))
  1. . S FREQCY=$P(NODE0,"^",4),YESTERDY=$$FMADD^XLFDT(DT,-1)
  1. . S BEGEXPDT=$$FMADD^XLFDT(DT,-FREQCY)
  1. . I $P(EXPNODE,"^") S BEGEXPDT=$$FMADD^XLFDT($P(EXPNODE,"^"),+1)
  1. . ; Cannot run for current day because it will skip Rx's w/ RELEASE DATE/TIME w/out time
  1. . I BEGEXPDT>YESTERDY Q
  1. . ; Checking if it is time to transmit based on the TRANSMISSION FREQUENCY value
  1. . I $$FMADD^XLFDT(BEGEXPDT,FREQCY)>DT Q
  1. . ; Preventing a Scheduled Transmission Date Range of more than 30 days - Reset to Frequency
  1. . I $$FMDIFF^XLFDT(YESTERDY,BEGEXPDT)>30 S BEGEXPDT=$$FMADD^XLFDT(YESTERDY,-FREQCY)
  1. . ; The legislation allowing VA to report was published on 02/11/2013
  1. . I BEGEXPDT<3130211 S BEGEXPDT=3130211
  1. . ; Gathering the prescriptions to be transmitted in the ^TMP("PSOSPMRX",$J) global
  1. . S RXCNT=$$GATHER^PSOSPMU1(STATE,BEGEXPDT-.1,YESTERDY+.24,"N")
  1. . ; The ^TMP("PSOSPMRX",$J) returned will be used to build the batch
  1. . I RXCNT>0 D
  1. . . S ^TMP("PSOSPMBM",$J,STATE)=1 ;P696
  1. . . S BATIEN=$$BLDBAT^PSOSPMU1("SC",BEGEXPDT,YESTERDY)
  1. . . I $P(BATIEN,"^")=-1 D LOGERROR^PSOSPMUT(0,STATE,$P(BATIEN,"^",2),1) Q
  1. . . ; Automatic sFTP Transmission to the state
  1. . . I $$GET1^DIQ(58.41,STATE,13,"I")="A" D
  1. . . . D EXPORT^PSOSPMUT(BATIEN,"EXPORT",1)
  1. . . ; Manual sFTP Transmission to the state
  1. . . I $$GET1^DIQ(58.41,STATE,13,"I")="M" D
  1. . . . D SENDMAIL(BATIEN,"S")
  1. . ;Zero Report - Daily Separate File
  1. . N SITEIEN S SITEIEN=0
  1. . N DEANO S DEANO=""
  1. . K ^TMP("PSOSPZRP",$J),DEARX,DEANRX,SITES,ZDEA
  1. . I $$GET1^DIQ(58.41,STATE,21,"I")'=2 D ;P696
  1. . . F S SITEIEN=$O(^PS(59,SITEIEN)) Q:'SITEIEN D
  1. . . . Q:$$GET1^DIQ(59,SITEIEN,.08,"I")'=STATE
  1. . . . I $$GET1^DIQ(59,SITEIEN,2004,"I")'="",$$GET1^DIQ(59,SITEIEN,2004,"I")<DT Q
  1. . . . S DEANO=$$PHA03^PSOASAP0() I DEANO="" Q
  1. . . . S SITES(SITEIEN)=DEANO
  1. . . . I $D(^TMP("PSOSPMST",$J,SITEIEN)),'$G(DEARX(DEANO)) S DEARX(DEANO)=SITEIEN
  1. . . . E S DEANRX(DEANO)=SITEIEN
  1. . . N DEA,SITE
  1. . . S (DEA,SITE)=""
  1. . . F S DEA=$O(DEANRX(DEA)) Q:DEA="" D
  1. . . . I '$G(DEARX(DEA)) S SITE=DEANRX(DEA) S ZDEA(DEA)=SITE S ^TMP("PSOSPZRP",$J,SITE)=DEA
  1. . . I $D(^TMP("PSOSPZRP",$J)) D
  1. . . . I $$GET1^DIQ(58.41,STATE,20)'="" D ;Sites with no RX and Yes to send Zero Report
  1. . . . . N %,DIC,DR,DA,X,Y,DINUM,DLAYGO,DD,DO,EXPTYPE
  1. . . . . S EXPTYPE="ZR"
  1. . . . . F L +^PS(58.42,0):$S(+$G(^DD("DILOCKTM"))>0:+^DD("DILOCKTM"),1:3) Q:$T H 3
  1. . . . . S (DINUM,BATIEN)=$O(^PS(58.42,999999999999),-1)+1
  1. . . . . W !!,"Creating Batch #",DINUM," for ",$$GET1^DIQ(58.41,STATE,.01),"..."
  1. . . . . S DIC="^PS(58.42,",X=DINUM,DIC(0)="",DIC("DR")="1////"_STATE_";2///"_EXPTYPE_";8///"_$$NOW^XLFDT()
  1. . . . . S DIC("DR")=DIC("DR")_";4///"_$G(BEGEXPDT)_";5///"_$G(YESTERDY)
  1. . . . . S DLAYGO=58.42 K DD,DO D FILE^DICN K DD,DO
  1. . . . . L -^PS(58.42,0)
  1. . . . . I Y=-1 S BATIEN="-1^Export Batch could not be created" Q
  1. . . . . N SITE,DEAZ S SITE=""
  1. . . . . F S SITE=$O(SITES(SITE)) Q:SITE="" D
  1. . . . . . S DEAZ=$G(SITES(SITE)) I '$G(ZDEA(DEAZ)) Q
  1. . . . . . K DIC,DINUM,DA S DIC="^PS(58.42,"_BATIEN_",""ZRS"",",DIC(0)="",DA(1)=BATIEN
  1. . . . . . S X=SITE,DIC("DR")="1///"_DEAZ
  1. . . . . . S DLAYGO=58.42201 K DD,DO D FILE^DICN K DD,DO
  1. . . . . ; Automatic sFTP Transmission to the state
  1. . . . . D EXPORT^PSOSPMUT(BATIEN,"EXPORT",1)
  1. . . . . N SITE S SITE=0
  1. . . . . N DEA S DEA=""
  1. . . . . F S SITE=$O(^TMP("PSOSPZRP",$J,SITE)) Q:'SITE D
  1. . . . . . S DEA=$G(^TMP("PSOSPZRP",$J,SITE))
  1. . . . . . D SENDMAIL(BATIEN,"ZY",DEA)
  1. . . . E D SENDMAIL("","ZN")
  1. . K DIE,DR,DA S DR="11///"_YESTERDY S DIE="^PS(58.41,",DA=STATE D ^DIE
  1. . ;RX Not Transmitted Report - Daily Separate File
  1. . N BEGEXPDT,YESTERDY,BATIEN,RXCNT,LIST
  1. . K ^TMP("PSOSPMRX",$J)
  1. . S BEGEXPDT=$$FMADD^XLFDT(DT,-30)
  1. . S YESTERDY=$$FMADD^XLFDT(DT,-1)
  1. . S LIST="ARX"
  1. . S LIST("STATE")=STATE
  1. . ; Gathering the prescriptions to be transmitted in the ^TMP("PSOSPMRX",$J) global
  1. . S RXCNT=$$GATHER^PSOSPMU1(STATE,BEGEXPDT-.1,YESTERDY+.24,"N",0,.LIST)
  1. . I RXCNT>0 D
  1. . . S BATIEN=$$BLDBAT^PSOSPMU1("SC",BEGEXPDT,YESTERDY)
  1. . . I $P(BATIEN,"^")=-1 D LOGERROR^PSOSPMUT(0,STATE,$P(BATIEN,"^",2),1) Q
  1. . .; Automatic sFTP Transmission to the state
  1. . . I $$GET1^DIQ(58.41,STATE,13,"I")="A" D
  1. . . . D EXPORT^PSOSPMUT(BATIEN,"EXPORT",1)
  1. . .; Manual sFTP Transmission to the state
  1. . . I $$GET1^DIQ(58.41,STATE,13,"I")="M" D
  1. . . . D SENDMAIL^PSOSPML0(BATIEN,"S")
  1. ;P696 Loop thru temp global for MbM states that need a Zero Report
  1. S STATE=0
  1. F S STATE=$O(^TMP("PSOSPMBM",$J,STATE)) Q:'STATE D
  1. . N MBMST
  1. . S MBMST=$$GET1^DIQ(58.41,STATE,21,"I")
  1. . I (+MBMST=2),($G(^TMP("PSOSPMBM",$J,STATE))'=1) D
  1. . . I $$GET1^DIQ(58.41,STATE,20)'="" D ;State wants a zero report, and there were no RXs
  1. . . . ;get default outpat site and DEA#
  1. . . . N SITEIEN,DEANO S (SITEIEN,DEANO)=""
  1. . . . S SITEIEN=$$GET1^DIQ(58.41,STATE,22,"I")
  1. . . . S DEANO=$$PHA03^PSOASAP0() I DEANO="" Q
  1. . . . ;logic from BLDBAT
  1. . . . N %,DIC,DR,DA,X,Y,DINUM,DLAYGO,DD,DO,EXPTYPE
  1. . . . S EXPTYPE="ZR"
  1. . . . F L +^PS(58.42,0):$S(+$G(^DD("DILOCKTM"))>0:+^DD("DILOCKTM"),1:3) Q:$T H 3
  1. . . . S (DINUM,BATIEN)=$O(^PS(58.42,999999999999),-1)+1
  1. . . . W !!,"Creating Batch #",DINUM," for ",$$GET1^DIQ(58.41,STATE,.01),"..."
  1. . . . S DIC="^PS(58.42,",X=DINUM,DIC(0)="",DIC("DR")="1////"_STATE_";2///"_EXPTYPE_";8///"_$$NOW^XLFDT()
  1. . . . S DIC("DR")=DIC("DR")_";4///"_$G(BEGEXPDT)_";5///"_$G(YESTERDY)
  1. . . . S DLAYGO=58.42 K DD,DO D FILE^DICN K DD,DO
  1. . . . L -^PS(58.42,0)
  1. . . . I Y=-1 S BATIEN="-1^Export Batch could not be created" Q
  1. . . . K DIC,DINUM,DA S DIC="^PS(58.42,"_BATIEN_",""ZRS"",",DIC(0)="",DA(1)=BATIEN
  1. . . . S X=SITEIEN,DIC("DR")="1///"_DEANO
  1. . . . S DLAYGO=58.42201 K DD,DO D FILE^DICN K DD,DO
  1. . . . ; Automatic sFTP Transmission to the state
  1. . . . D EXPORT^PSOSPMUT(BATIEN,"EXPORT",1)
  1. . . . D SENDMAIL(BATIEN,"ZY",DEANO)
  1. . . E D SENDMAIL("","ZN")
  1. ; Return To Stock Batch for ASAP 1995 states only (Weekly) - Separate file
  1. I $$UP^XLFSTR($$DOW^XLFDT(DT))'="SUNDAY" Q
  1. S STATE=0 F S STATE=$O(^PS(58.41,STATE)) Q:'STATE D
  1. . ; State not using ASAP 1995
  1. . I $$GET1^DIQ(58.41,STATE,1,"I")'="1995" Q
  1. . ; State accepts Return to Stock transmissions
  1. . S RTSBGDT=$$FMADD^XLFDT(DT,-7),RTSENDT=$$FMADD^XLFDT(DT,-1)
  1. . S RXCNT=$$GATHER^PSOSPMU1(STATE,RTSBGDT-.1,RTSENDT+.24,"N",1) I RXCNT'>0 Q
  1. . S BATIEN=$$BLDBAT^PSOSPMU1("VD",RTSBGDT,RTSENDT)
  1. . I $$GET1^DIQ(58.41,STATE,12,"I") D
  1. . . D EXPORT^PSOSPMUT(BATIEN,"EXPORT",1)
  1. . E D SENDMAIL(BATIEN,"R")
  1. Q
  1. ;
  1. SENDMAIL(BATCHIEN,BATTYPE,DEA) ; ASAP 1995 Only - Mailman message about Return To Stock Records
  1. ;Input: BATCHIEN - Pointer to BATCH file (#58.42)
  1. ; BATTYPE - Batch Type: S: Scheduled / R: Return to Stock (ASAP 1995 only)
  1. ; ZN: No Zero Report email only / ZY: Yes Zero Report and email
  1. ; (O) DEA - DEA Numbers passed in for Zero Report
  1. N XMDUZ,XMMG,XMSUB,XMTEXT,XMY,XMZ,PSOMSG,USR,STANAME
  1. N RUNDT ;Zero Reporting
  1. ;
  1. S STANAME=$$GET1^DIQ(58.42,BATCHIEN,1)
  1. I $G(STANAME)="" S STANAME=$$GET1^DIQ(58.41,STATE,.01) ;Zero Report
  1. ; - Scheduled Batch Notification
  1. I (BATTYPE="S") D
  1. . S XMSUB=STANAME_" CS PMP Batch Ready"
  1. . S XMSUB=XMSUB_" ("_$$FMTE^XLFDT($$GET1^DIQ(58.42,BATCHIEN,4,"I")\1,"2Z")
  1. . S XMSUB=XMSUB_"-"_$$FMTE^XLFDT($$GET1^DIQ(58.42,BATCHIEN,5,"I")\1,"2Z")_")"
  1. . S PSOMSG(1)="Batch #: "_BATCHIEN_" Period : "_$$FMTE^XLFDT($$GET1^DIQ(58.42,BATCHIEN,4,"I")\1,"2Z")_" thru "_$$FMTE^XLFDT($$GET1^DIQ(58.42,BATCHIEN,5,"I")\1,"2Z")
  1. . S PSOMSG(2)=""
  1. . S PSOMSG(3)="The scheduled batch #"_BATCHIEN_" containing Controlled Substance Prescription data"
  1. . S PSOMSG(4)="to be submitted to the Prescription Monitoring Program (PMP) for the state of "
  1. . S PSOMSG(5)=STANAME_" is ready."
  1. . S PSOMSG(6)=""
  1. . S PSOMSG(7)="Please use the option ""View/Export Batch"" [PSO SPMP BATCH VIEW/EXPORT], then"
  1. . S PSOMSG(8)="enter the batch #"_BATCHIEN_", choose the action 'EXP' and follow the instructions"
  1. . S PSOMSG(9)="to send the file to the state."
  1. ;
  1. ; - Return To Stock Batch Notification (ASAP 1995 only)
  1. I (BATTYPE="R") D
  1. . S XMSUB=STANAME_" - CS Rx Fills Returned To Stock"
  1. . S XMDUZ="SPMP Scheduled Transmission"
  1. . S PSOMSG(1)="There were Controlled Substance Rx fills that had been reported to the State"
  1. . S PSOMSG(2)="Prescription Monitoring Program (SPMP) and were later returned to stock:"
  1. . S PSOMSG(3)=""
  1. . S PSOMSG(4)="Batch #: "_BATCHIEN_" Period : "_$$FMTE^XLFDT($$GET1^DIQ(58.42,BATCHIEN,4,"I")\1,"2Z")_" thru "_$$FMTE^XLFDT($$GET1^DIQ(58.42,BATCHIEN,5,"I")\1,"2Z")
  1. . S PSOMSG(6)=""
  1. . S PSOMSG(7)="Please, retrieve the batch above via the View/Export Batch [PSO SPMP BATCH"
  1. . S PSOMSG(8)="VIEW/EXPORT] option and manually capture/upload the data to the State"
  1. . S PSOMSG(9)="Prescription Monitoring Program (SPMP) website for "_STANAME_"."
  1. . S PSOMSG(10)=""
  1. . S PSOMSG(11)="***************************** IMPORTANT **********************************"
  1. . S PSOMSG(12)="When you upload this file to the state website, make sure to select the"
  1. . S PSOMSG(13)="correct import option, usually called ""Back Records Out of the System"", to"
  1. . S PSOMSG(14)="avoid reporting duplicate records for the patients."
  1. . S PSOMSG(15)="**************************************************************************"
  1. ;
  1. ;Zero Report Sent
  1. I (BATTYPE="ZY") D
  1. . S XMSUB=STANAME_" SPMP Controlled Substance Zero Report: "_$$FMTE^XLFDT($$GET1^DIQ(58.42,BATCHIEN,4,"I")\1,"5Z")
  1. . S PSOMSG(1)="No prescriptions met the submission criteria for Pharmacies using DEA#"_DEA
  1. . S PSOMSG(2)="A Zero Report has been created for transmission to the state."
  1. ;
  1. ;Zero Report NOT Sent
  1. I (BATTYPE="ZN") D
  1. . N XDT S XDT=$$FMADD^XLFDT((DT\1),-1)
  1. . S XMSUB=STANAME_" SPMP Controlled Substance Zero Report: "_$$FMTE^XLFDT((XDT\1),"5Z")
  1. . S PSOMSG(1)="No prescriptions met the submission criteria. "
  1. . S PSOMSG(2)="Follow your state's guidance for manual upload of a Zero Report, if required."
  1. ;
  1. GROUP ;
  1. S XMTEXT="PSOMSG("
  1. ; If there are no active members in the mailgroup sends message to PSDMGR key holders
  1. I $$GOTLOCAL^XMXAPIG("PSO SPMP NOTIFICATIONS") D
  1. . S XMY("G.PSO SPMP NOTIFICATIONS")=""
  1. E D
  1. . S USR=0 F S USR=$O(^XUSEC("PSDMGR",USR)) Q:'USR S XMY(USR)=""
  1. ;
  1. D ^XMD
  1. Q
  1. CHK5841 ; Check the SPMP STATE PARAMETERS file (#58.41) for presence of state transmission info
  1. N SITEIEN,SITE,STATEIEN,STATE,FOUND,XREF,RXDT,ENDDT,RXIEN,RXFILL,FILL
  1. K ^TMP("PSO5841",$J)
  1. S SITEIEN=0
  1. F S SITEIEN=$O(^PS(59,SITEIEN)) Q:'SITEIEN D
  1. . S STATEIEN=$$GET1^DIQ(59,SITEIEN,.08,"I")
  1. . I 'STATEIEN Q
  1. . I $P($$SPOK^PSOSPMUT(STATEIEN),"^")=-1 D
  1. .. S FOUND=0
  1. .. F XREF="AL","AM" D
  1. ... S RXDT=$$FMADD^XLFDT(DT,-365),RXDT=RXDT+.01,ENDDT=$$FMADD^XLFDT(DT,-1),ENDDT=ENDDT+.2359
  1. ... F S RXDT=$O(^PSRX(XREF,RXDT)) Q:'RXDT!(RXDT>ENDDT) D
  1. .... S RXIEN=0 F S RXIEN=$O(^PSRX(XREF,RXDT,RXIEN)) Q:'RXIEN Q:FOUND D
  1. ..... S RXFILL="" F S RXFILL=$O(^PSRX(XREF,RXDT,RXIEN,RXFILL)) Q:RXFILL="" D
  1. ...... S FILL=$S(XREF="AL":RXFILL,1:"P"_RXFILL)
  1. ...... I $$RXSTATE^PSOBPSUT(RXIEN,0)'=STATEIEN Q
  1. ...... I $$SCREEN^PSOSPMUT(RXIEN,FILL) Q
  1. ...... S ^TMP("PSO5841",$J,SITEIEN)="Controlled Substance Rx found, but transmission info is missing for "_$$GET1^DIQ(59,SITEIEN,.08)_" in the SPMP STATE PARAMETERS file (#58.41)."
  1. ...... S FOUND=1
  1. I $D(^TMP("PSO5841",$J)) D
  1. . S SITEIEN=0
  1. . F S SITEIEN=$O(^TMP("PSO5841",$J,SITEIEN)) Q:'SITEIEN D
  1. .. S SITE=$$GET1^DIQ(59,SITEIEN,.01)
  1. .. S STATE=$$GET1^DIQ(59,SITEIEN,.08)
  1. .. S XMSUB=SITE_" Controlled Substances PMP State Parameters Missing"
  1. .. S PSOMSG(1)=SITE_" doesn't currently transmit controlled substance records"
  1. .. S PSOMSG(2)="because it is in a state ("_STATE_") that doesn't have SPMP"
  1. .. S PSOMSG(3)="state parameters defined in your VistA system. Please enter a helpdesk"
  1. .. S PSOMSG(4)="ticket if you need assistance setting up SPMP state parameters for"
  1. .. S PSOMSG(5)=STATE_"."
  1. .. D GROUP
  1. . K ^TMP("PSO5841",$J)
  1. Q