- PSAVER7 ;BIR/JMB-Verify Invoices - CONT'D ;7/23/97
- ;;3.0;DRUG ACCOUNTABILITY/INVENTORY INTERFACE;**12,21,42,56,64,66,76**; 10/24/97;Build 1
- ;Background Job
- ;This routine increments pharmacy location and master vault balances
- ;in 58.8 after invoices have been verified. This routine is called
- ;by PSAVER6.
- ;
- ;References to ^PSDRUG( are covered by IA #2095
- TR ;File transaction data in 58.81
- I $D(PSADUREC),'PSADUREC Q ;*56 block '0' quantity edits
- I $D(PSAQTY),'PSAQTY Q ;*56 block '0' quantity edits
- F L +^PSD(58.81,0):$S($G(DILOCKTM)>0:DILOCKTM,1:3) I Q
- FIND S PSAT=$P(^PSD(58.81,0),"^",3)+1 I $D(^PSD(58.81,PSAT)) S $P(^PSD(58.81,0),"^",3)=$P(^PSD(58.81,0),"^",3)+1 G FIND
- S DIC="^PSD(58.81,",DIC(0)="L",DLAYGO=58.81,(DINUM,X)=PSAT D ^DIC K DIC,DINUM,DLAYGO L -^PSD(58.81,0)
- S DIE="^PSD(58.81,",DA=PSAT,DR="1////1;2////^S X=PSALOC;3////^S X=PSADT;4////^S X=PSADRG;5////^S X=PSADUREC;6////^S X=PSAVDUZ;9////^S X=PSABAL;71////^S X=PSAINV;106////^S X=PSAORD"
- I $G(PSACS) S DR=DR_";100////^S X=PSACS"
- F L +^PSD(58.81,DA,0):$S($G(DILOCKTM)>0:DILOCKTM,1:3) I Q
- D ^DIE L -^PSD(58.81,DA,0) K DIE
- S:'$D(^PSD(58.8,PSALOC,1,PSADRG,4,0)) DIC("P")=$P(^DD(58.8001,19,0),"^",2)
- S DA(2)=PSALOC,DA(1)=PSADRG,(X,DINUM)=PSAT,DIC="^PSD(58.8,"_DA(2)_",1,"_DA(1)_",4,",DIC(0)="L",DLAYGO=58.8
- F L +^PSD(58.8,PSALOC,1,PSADRG,0):$S($G(DILOCKTM)>0:DILOCKTM,1:3) I Q
- D ^DIC L -^PSD(58.8,PSALOC,1,PSADRG,0) K DIC,DINUM,DLAYGO
- ;
- 50 S PSAODASH=$P($G(^PSDRUG(PSADRG,2)),"^",4)
- S PSAONDC=$P(PSAODASH,"-")_$P(PSAODASH,"-",2)_$P(PSAODASH,"-",3)
- ;(PSA*3*21) NDC & PRICING UPDATES (DAVE BLOCKER 10NOV99)
- S PSADUOU=$S($G(PSADUOU)'>0:1,1:PSADUOU)
- S PSADUREC=(PSAQTY*PSADUOU)
- S DIE="^PSDRUG(",DA=PSADRG,DR="50////^S X="_(PSADUREC+$G(^PSDRUG(PSADRG,660.1)))
- F L +^PSDRUG(DA,0):$S($G(DILOCKTM)>0:DILOCKTM,1:3) I Q
- D ^DIE L -^PSDRUG(DA,0) K DIE,DA,DR
- ;This section replaces most of the routine
- ;PSAOU = order unit from invoice
- ;PSAPOU & PSANPOU = Price of Order Unit from invoice
- ;PSADUOU=Dispense Units per OU form invoice data
- ;PSANPDU= Price of Dispense Units per Order Unit
- ;
- ;Drug file Information
- K DRUG
- S PSANODE=$G(^PSDRUG(PSADRG,660))
- F X=2,3,5,6 S DRUG(X)=$P($G(PSANODE),"^",X)
- ;
- S PSANPDU=$J(($G(PSAPOU)/$G(PSADUOU)),0,4) ;Price of Order Unit divide by Disp. Units per Order Unit
- ;PSA*3*42 |> (let changes happen and file, put changes into mail message)
- S DIE="^PSDRUG(",(DA,OLDDA)=PSADRG,DR="12////^S X=PSAOU;15////^S X=PSADUOU;16///^S X=PSANPDU;13////^S X=PSAPOU" ;*42;*56;*76
- F L +^PSDRUG(DA,0):$S($G(DILOCKTM)>0:DILOCKTM,1:3) I Q
- D ^DIE K DIE,DA,DR
- ; <| PSA*42
- PTCH21 ;PSA*3*21 (Vendor's VSN changing to 8 digits, check also)
- ;If NDC or VSN changes should it create to synonym entry ?
- I $G(^PSDRUG(PSADRG,1,PSASUB,0))="" G NDC
- I $G(^PSDRUG(PSADRG,1,PSASUB,0)) S PSAEDTT=0,DATA=^PSDRUG(PSADRG,1,PSASUB,0) D
- .I PSAVSN'=$P(DATA,"^",4) S PSAEDTT=1 ;VSN
- .I PSAPOU'=$P(DATA,"^",6) S PSAEDTT=1 ;Price per order unit
- .I PSADUOU'=$P(DATA,"^",7) S PSAEDTT=1 ;Dispense Units per Order Unit
- .I PSANPDU'=$P(DATA,"^",8) S PSAEDTT=1 ;New Price per dispense unit
- .I $G(PSAEDTT)>0 D
- ..S DA=PSASUB,DA(1)=PSADRG,DIE="^PSDRUG("_DA(1)_",1,"
- ..S DR="2////^S X=PSADASH"_$S(PSACS:";1////C",1:";1////D")_";400////^S X=PSAVSN;401////^S X=PSAOU"_$S(+PSAPOU:";402////^S X=PSAPOU",1:"")_";403////^S X=PSADUOU"_";404///^S X=PSANPDU"_";405///^S X=PSAVEND"
- ..D ^DIE K DIE,DR,DA
- NDC ;NDC UPDATE
- I PSANDC'="",PSANDC'=PSAONDC D ;*42
- .S DIE="^PSDRUG(",DA=PSADRG,DR="31////^S X=PSADASH"
- .F L +^PSDRUG(DA,0):$S($G(DILOCKTM)>0:DILOCKTM,1:3) I Q
- .D ^DIE L -^PSDRUG(DA,0) K DIE,DA,DR
- SYNONYM ;Adds/edits the SYNONYM multiple in DRUG file >>*66 RJS
- G:PSANDC="" END
- S DA(1)=PSADRG ;; << *66 RJS
- ;
- S PSANPDU=$J(($G(PSAPOU)/$G(PSADUOU)),0,4) ;Price of Order Unit divide by Disp. Units per Order Unit ;*76
- S:'$D(^PSDRUG(PSADRG,1,0)) DIC("P")="50.1A"
- ; *56 Search for earliest best match of synonyms, start at bottom go up
- ; if VSN use it, if several VSNs use the first, IF VSN match NDCs must match also.
- ; if no VSN, make a new synonym
- ; no "B" synonym index exists
- T0 N PSYNDA,PSYN0,PSTNDC,PSTVSN,PSMNDC,PSMBTH S (PSMNDC,PSMBTH)=0
- S PSYNDA="" F S PSYNDA=$O(^PSDRUG(PSADRG,1,PSYNDA),-1) Q:PSYNDA'>0 D
- . S PSYN0=^PSDRUG(PSADRG,1,PSYNDA,0),PSTNDC=$P(PSYN0,U),PSTVSN=$P(PSYN0,U,4) ;zero node, test values of NDC VSN
- . I PSTNDC'=PSANDC Q
- . I PSTVSN=PSAVSN S PSMBTH=PSYNDA Q ;both VSN & NDC matches
- T1 S PSASUB=$S(PSMBTH:PSMBTH,1:0) ;PSAMBTH Match both vsn,ndc
- ;end *56
- I 'PSASUB!(PSASUB&('$D(^PSDRUG(PSADRG,1,PSASUB,0)))) D
- .S DIC="^PSDRUG("_DA(1)_",1,",DIC(0)="Z",X=PSANDC,DLAYGO=50
- .F L +^PSDRUG(PSADRG,0):$S($G(DILOCKTM)>0:DILOCKTM,1:3) I Q
- .D FILE^DICN L -^PSDRUG(PSADRG,0) K DIC,DLAYGO S PSASUB=+Y
- .K DIC,DA,DR,DIE
- I PSASUB,$D(^PSDRUG(PSADRG,1,PSASUB,0)) S DA=PSASUB
- S DA(1)=PSADRG,DIE="^PSDRUG("_DA(1)_",1,"
- S DR="2////^S X=PSADASH"_$S($G(PSACS)>0:";1////C",1:";1////D")_";400////^S X=PSAVSN;401////^S X=PSAOU"_$S(+PSAPOU:";402////^S X=PSAPOU",1:"")_";403////^S X=PSADUOU"_";404///^S X=PSANPDU;405///^S X=PSAVEND"
- F L +^PSDRUG(PSADRG,0):$S($G(DILOCKTM)>0:DILOCKTM,1:3) I Q
- D ^DIE L -^PSDRUG(PSADRG,0)
- K DIE,DR,X1,X2,DATA
- END ; FINAL CLEANUP << *66 RJS
- L -^PSDRUG(OLDDA,0) K OLDDA ;; >> *66 RJS
- Q
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HPSAVER7 5338 printed Mar 13, 2025@20:55:46 Page 2
- PSAVER7 ;BIR/JMB-Verify Invoices - CONT'D ;7/23/97
- +1 ;;3.0;DRUG ACCOUNTABILITY/INVENTORY INTERFACE;**12,21,42,56,64,66,76**; 10/24/97;Build 1
- +2 ;Background Job
- +3 ;This routine increments pharmacy location and master vault balances
- +4 ;in 58.8 after invoices have been verified. This routine is called
- +5 ;by PSAVER6.
- +6 ;
- +7 ;References to ^PSDRUG( are covered by IA #2095
- TR ;File transaction data in 58.81
- +1 ;*56 block '0' quantity edits
- IF $DATA(PSADUREC)
- IF 'PSADUREC
- QUIT
- +2 ;*56 block '0' quantity edits
- IF $DATA(PSAQTY)
- IF 'PSAQTY
- QUIT
- +3 FOR
- LOCK +^PSD(58.81,0):$SELECT($GET(DILOCKTM)>0:DILOCKTM,1:3)
- IF $TEST
- QUIT
- FIND SET PSAT=$PIECE(^PSD(58.81,0),"^",3)+1
- IF $DATA(^PSD(58.81,PSAT))
- SET $PIECE(^PSD(58.81,0),"^",3)=$PIECE(^PSD(58.81,0),"^",3)+1
- GOTO FIND
- +1 SET DIC="^PSD(58.81,"
- SET DIC(0)="L"
- SET DLAYGO=58.81
- SET (DINUM,X)=PSAT
- DO ^DIC
- KILL DIC,DINUM,DLAYGO
- LOCK -^PSD(58.81,0)
- +2 SET DIE="^PSD(58.81,"
- SET DA=PSAT
- SET DR="1////1;2////^S X=PSALOC;3////^S X=PSADT;4////^S X=PSADRG;5////^S X=PSADUREC;6////^S X=PSAVDUZ;9////^S X=PSABAL;71////^S X=PSAINV;106////^S X=PSAORD"
- +3 IF $GET(PSACS)
- SET DR=DR_";100////^S X=PSACS"
- +4 FOR
- LOCK +^PSD(58.81,DA,0):$SELECT($GET(DILOCKTM)>0:DILOCKTM,1:3)
- IF $TEST
- QUIT
- +5 DO ^DIE
- LOCK -^PSD(58.81,DA,0)
- KILL DIE
- +6 if '$DATA(^PSD(58.8,PSALOC,1,PSADRG,4,0))
- SET DIC("P")=$PIECE(^DD(58.8001,19,0),"^",2)
- +7 SET DA(2)=PSALOC
- SET DA(1)=PSADRG
- SET (X,DINUM)=PSAT
- SET DIC="^PSD(58.8,"_DA(2)_",1,"_DA(1)_",4,"
- SET DIC(0)="L"
- SET DLAYGO=58.8
- +8 FOR
- LOCK +^PSD(58.8,PSALOC,1,PSADRG,0):$SELECT($GET(DILOCKTM)>0:DILOCKTM,1:3)
- IF $TEST
- QUIT
- +9 DO ^DIC
- LOCK -^PSD(58.8,PSALOC,1,PSADRG,0)
- KILL DIC,DINUM,DLAYGO
- +10 ;
- 50 SET PSAODASH=$PIECE($GET(^PSDRUG(PSADRG,2)),"^",4)
- +1 SET PSAONDC=$PIECE(PSAODASH,"-")_$PIECE(PSAODASH,"-",2)_$PIECE(PSAODASH,"-",3)
- +2 ;(PSA*3*21) NDC & PRICING UPDATES (DAVE BLOCKER 10NOV99)
- +3 SET PSADUOU=$SELECT($GET(PSADUOU)'>0:1,1:PSADUOU)
- +4 SET PSADUREC=(PSAQTY*PSADUOU)
- +5 SET DIE="^PSDRUG("
- SET DA=PSADRG
- SET DR="50////^S X="_(PSADUREC+$GET(^PSDRUG(PSADRG,660.1)))
- +6 FOR
- LOCK +^PSDRUG(DA,0):$SELECT($GET(DILOCKTM)>0:DILOCKTM,1:3)
- IF $TEST
- QUIT
- +7 DO ^DIE
- LOCK -^PSDRUG(DA,0)
- KILL DIE,DA,DR
- +8 ;This section replaces most of the routine
- +9 ;PSAOU = order unit from invoice
- +10 ;PSAPOU & PSANPOU = Price of Order Unit from invoice
- +11 ;PSADUOU=Dispense Units per OU form invoice data
- +12 ;PSANPDU= Price of Dispense Units per Order Unit
- +13 ;
- +14 ;Drug file Information
- +15 KILL DRUG
- +16 SET PSANODE=$GET(^PSDRUG(PSADRG,660))
- +17 FOR X=2,3,5,6
- SET DRUG(X)=$PIECE($GET(PSANODE),"^",X)
- +18 ;
- +19 ;Price of Order Unit divide by Disp. Units per Order Unit
- SET PSANPDU=$JUSTIFY(($GET(PSAPOU)/$GET(PSADUOU)),0,4)
- +20 ;PSA*3*42 |> (let changes happen and file, put changes into mail message)
- +21 ;*42;*56;*76
- SET DIE="^PSDRUG("
- SET (DA,OLDDA)=PSADRG
- SET DR="12////^S X=PSAOU;15////^S X=PSADUOU;16///^S X=PSANPDU;13////^S X=PSAPOU"
- +22 FOR
- LOCK +^PSDRUG(DA,0):$SELECT($GET(DILOCKTM)>0:DILOCKTM,1:3)
- IF $TEST
- QUIT
- +23 DO ^DIE
- KILL DIE,DA,DR
- +24 ; <| PSA*42
- PTCH21 ;PSA*3*21 (Vendor's VSN changing to 8 digits, check also)
- +1 ;If NDC or VSN changes should it create to synonym entry ?
- +2 IF $GET(^PSDRUG(PSADRG,1,PSASUB,0))=""
- GOTO NDC
- +3 IF $GET(^PSDRUG(PSADRG,1,PSASUB,0))
- SET PSAEDTT=0
- SET DATA=^PSDRUG(PSADRG,1,PSASUB,0)
- Begin DoDot:1
- +4 ;VSN
- IF PSAVSN'=$PIECE(DATA,"^",4)
- SET PSAEDTT=1
- +5 ;Price per order unit
- IF PSAPOU'=$PIECE(DATA,"^",6)
- SET PSAEDTT=1
- +6 ;Dispense Units per Order Unit
- IF PSADUOU'=$PIECE(DATA,"^",7)
- SET PSAEDTT=1
- +7 ;New Price per dispense unit
- IF PSANPDU'=$PIECE(DATA,"^",8)
- SET PSAEDTT=1
- +8 IF $GET(PSAEDTT)>0
- Begin DoDot:2
- +9 SET DA=PSASUB
- SET DA(1)=PSADRG
- SET DIE="^PSDRUG("_DA(1)_",1,"
- +10 SET DR="2////^S X=PSADASH"_$SELECT(PSACS:";1////C",1:";1////D")_";400////^S X=PSAVSN;401////^S X=PSAOU"_$SELECT(+PSAPOU:";402////^S X=PSAPOU",1:"")_";403////^S X=PSADUOU"_";404///^S X=PSANPDU"_";405///^S X=PSAVEND"
- +11 DO ^DIE
- KILL DIE,DR,DA
- End DoDot:2
- End DoDot:1
- NDC ;NDC UPDATE
- +1 ;*42
- IF PSANDC'=""
- IF PSANDC'=PSAONDC
- Begin DoDot:1
- +2 SET DIE="^PSDRUG("
- SET DA=PSADRG
- SET DR="31////^S X=PSADASH"
- +3 FOR
- LOCK +^PSDRUG(DA,0):$SELECT($GET(DILOCKTM)>0:DILOCKTM,1:3)
- IF $TEST
- QUIT
- +4 DO ^DIE
- LOCK -^PSDRUG(DA,0)
- KILL DIE,DA,DR
- End DoDot:1
- SYNONYM ;Adds/edits the SYNONYM multiple in DRUG file >>*66 RJS
- +1 if PSANDC=""
- GOTO END
- +2 ;; << *66 RJS
- SET DA(1)=PSADRG
- +3 ;
- +4 ;Price of Order Unit divide by Disp. Units per Order Unit ;*76
- SET PSANPDU=$JUSTIFY(($GET(PSAPOU)/$GET(PSADUOU)),0,4)
- +5 if '$DATA(^PSDRUG(PSADRG,1,0))
- SET DIC("P")="50.1A"
- +6 ; *56 Search for earliest best match of synonyms, start at bottom go up
- +7 ; if VSN use it, if several VSNs use the first, IF VSN match NDCs must match also.
- +8 ; if no VSN, make a new synonym
- +9 ; no "B" synonym index exists
- T0 NEW PSYNDA,PSYN0,PSTNDC,PSTVSN,PSMNDC,PSMBTH
- SET (PSMNDC,PSMBTH)=0
- +1 SET PSYNDA=""
- FOR
- SET PSYNDA=$ORDER(^PSDRUG(PSADRG,1,PSYNDA),-1)
- if PSYNDA'>0
- QUIT
- Begin DoDot:1
- +2 ;zero node, test values of NDC VSN
- SET PSYN0=^PSDRUG(PSADRG,1,PSYNDA,0)
- SET PSTNDC=$PIECE(PSYN0,U)
- SET PSTVSN=$PIECE(PSYN0,U,4)
- +3 IF PSTNDC'=PSANDC
- QUIT
- +4 ;both VSN & NDC matches
- IF PSTVSN=PSAVSN
- SET PSMBTH=PSYNDA
- QUIT
- End DoDot:1
- T1 ;PSAMBTH Match both vsn,ndc
- SET PSASUB=$SELECT(PSMBTH:PSMBTH,1:0)
- +1 ;end *56
- +2 IF 'PSASUB!(PSASUB&('$DATA(^PSDRUG(PSADRG,1,PSASUB,0))))
- Begin DoDot:1
- +3 SET DIC="^PSDRUG("_DA(1)_",1,"
- SET DIC(0)="Z"
- SET X=PSANDC
- SET DLAYGO=50
- +4 FOR
- LOCK +^PSDRUG(PSADRG,0):$SELECT($GET(DILOCKTM)>0:DILOCKTM,1:3)
- IF $TEST
- QUIT
- +5 DO FILE^DICN
- LOCK -^PSDRUG(PSADRG,0)
- KILL DIC,DLAYGO
- SET PSASUB=+Y
- +6 KILL DIC,DA,DR,DIE
- End DoDot:1
- +7 IF PSASUB
- IF $DATA(^PSDRUG(PSADRG,1,PSASUB,0))
- SET DA=PSASUB
- +8 SET DA(1)=PSADRG
- SET DIE="^PSDRUG("_DA(1)_",1,"
- +9 SET DR="2////^S X=PSADASH"_$SELECT($GET(PSACS)>0:";1////C",1:";1////D")_";400////^S X=PSAVSN;401////^S X=PSAOU"_$SELECT(+PSAPOU:";402////^S X=PSAPOU",1:"")_";403////^S X=PSADUOU"_";404///^S X=PSANPDU;405///^S X=PSAVEND"
- +10 FOR
- LOCK +^PSDRUG(PSADRG,0):$SELECT($GET(DILOCKTM)>0:DILOCKTM,1:3)
- IF $TEST
- QUIT
- +11 DO ^DIE
- LOCK -^PSDRUG(PSADRG,0)
- +12 KILL DIE,DR,X1,X2,DATA
- END ; FINAL CLEANUP << *66 RJS
- +1 ;; >> *66 RJS
- LOCK -^PSDRUG(OLDDA,0)
- KILL OLDDA
- +2 QUIT