IBOCNC1 ;ALB/ARH - CPT USAGE IN CLINICS (SEARCH); 1/23/92
 ;;2.0;INTEGRATED BILLING;**91,133**;21-MAR-94
 ;
 ;entry pt. for tasked jobs
FIND ;find, save, and print the data that satisfies the search parameters, save clinic/division names
 ;I $D(XRT0) S:'$D(XRTN) XRTN="IBOCNC" D T1^%ZOSV ;stop rt clock
 ;S XRTL=$ZU(0),XRTN="IBOCNC-2" D T0^%ZOSV ;start rt clock
 I VAUTC,VAUTD S ^TMP("IBCU",$J,"D","ALL")="",IBPRC(1)="ALL DIVISIONS AND CLINICS"
 S X=0
 I VAUTC,'VAUTD S X=X+1,IBC="",IBPRC(X)="DIVISIONS: ",IBDIV="" F IBI=1:1 S IBDIV=$O(VAUTD(IBDIV)) Q:IBDIV=""  D
 . S ^TMP("IBCU",$J,"D",IBDIV)=""
 . I ($L(IBPRC(X))+$L(VAUTD(IBDIV))+2)>IOM S X=X+1,IBPRC(X)="           ",IBC=""
 . S IBPRC(X)=IBPRC(X)_IBC_VAUTD(IBDIV),IBC=", "
 I 'VAUTC S X=X+1,IBC="",IBPRC(X)="CLINICS: ",IBCLN="" F IBI=1:1 S IBCLN=$O(VAUTC(IBCLN)) Q:IBCLN=""  D
 . S ^TMP("IBCU",$J,"C",IBCLN)=""
 . I ($L(IBPRC(X))+$L(VAUTC(IBCLN))+2)>IOM S X=X+1,IBPRC(X)="         ",IBC=""
 . S IBPRC(X)=IBPRC(X)_IBC_VAUTC(IBCLN),IBC=", "
 K VAUTD,VAUTC,IBC,X
 ;entire divisions were chosen, find all clinics
 I $D(^TMP("IBCU",$J,"D","ALL")) S IBDIV="" F  S IBDIV=$O(^DG(40.8,IBDIV)) Q:IBDIV'?1N.N  S ^TMP("IBCU",$J,"D",IBDIV)=""
 I $D(^TMP("IBCU",$J,"D")) S IBCLN="" F IBI=1:1 S IBCLN=$O(^SC(IBCLN)) Q:IBCLN'?1N.N  D
 . S IBLN=$G(^SC(IBCLN,0))  Q:$P(IBLN,"^",3)'="C"!('$D(^TMP("IBCU",$J,"D",+$P(IBLN,"^",15))))
 . S ^TMP("IBCU",$J,"C",IBCLN)=""
 K IBLN,IBCLN,IBDIV,IBI,^TMP("IBCU",$J,"D")
 ;I $D(XRT0),'$D(^TMP("IBCU",$J,"C")) S:'$D(XRTN) XRTN="IBOCNC" D T1^%ZOSV ;stop rt clock
 Q:'$D(^TMP("IBCU",$J,"C"))
 ;
SAVE ;for each clinic chosen collect counts on CPTs used and save in sorted tmp file
 N IBVAL,IBCBK,IBFILTER
 S IBVAL("BDT")=IBBDT,IBVAL("EDT")=IBEDT+.3
 ; Must be an encounter for one of the clinics chosen,
 ;   only count each visit (in v-file) once
 S IBFILTER=""
 S IBCBK="I '$P(Y0,U,6),$D(^TMP(""IBCU"",$J,""C"",+$P(Y0,U,4))),'$D(^TMP(""VIS"",$J,+$P(Y0,U,5))) S ^TMP(""VIS"",$J,+$P(Y0,U,5))="""" D CKENC^IBOCNC1(Y,Y0,.SDSTOP) S:$G(SDSTOP) IBQ=1"
 S IBQ=0
 K ^TMP("VIS",$J)
 D SCAN^IBSDU("DATE/TIME",.IBVAL,IBFILTER,IBCBK)
 ;
 K IBB,IBE,IBX,IBCLN,IBCLNN,IBCPT,IBLN,IBI,^TMP("IBCU",$J,"C"),^TMP("VIS",$J)
 D:IBSRT BILL
PRINT I 'IBQ D ^IBOCNC2
 K IBPRC,IBSRT,IBQ,^TMP("IBCU",$J)
 I $D(ZTQUEUED) S ZTREQ="@"
 ;I $D(XRT0) S:'$D(XRTN) XRTN="IBOCNC" D T1^%ZOSV ;stop rt clock
 Q
 ;
BILL ;when sorting by CPT, get count on CPT's entered in billing for the date range
 ;count number of CPTs in old format, using event date as procedure date
 Q:IBQ  S IBEVDT=IBBDT-.001,IBE=IBEDT+.3
 F  S IBEVDT=$O(^DGCR(399,"D",IBEVDT)) Q:IBEVDT=""!(IBEVDT>IBE)!IBQ  D  S IBQ=$$STOP
 . S IBN="" F  S IBN=$O(^DGCR(399,"D",IBEVDT,IBN)) Q:IBN=""  D
 .. Q:$P($G(^DGCR(399,IBN,0)),"^",9)'=4!('$D(^DGCR(399,IBN,"C")))!($P($G(^DGCR(399,IBN,0)),"^",13)=7)  S IBX=$G(^DGCR(399,IBN,"C"))
 .. F IBI=1,2,3,7,8,9 S IBCPT=$P(IBX,"^",IBI) I $$CPT^ICPTCOD(+IBCPT)>0 S ^TMP("IBCU",$J,+IBCPT,"B")=$G(^TMP("IBCU",$J,+IBCPT,"B"))+1,^TMP("IBCU",$J,"B")=$G(^TMP("IBCU",$J,"B"))+1
 ;count number of CPTs in "CP" multiple using the cross-reference and the correct procedure date
 Q:IBQ  S IBPDT=-(IBEDT+.3)
 F  S IBPDT=$O(^DGCR(399,"ASD",IBPDT)) Q:IBPDT=""!(-IBPDT<IBBDT)!IBQ  D  S IBQ=$$STOP
 . S IBCPT="" F  S IBCPT=$O(^DGCR(399,"ASD",IBPDT,IBCPT)) Q:IBCPT=""  D
 .. S IBN="" F  S IBN=$O(^DGCR(399,"ASD",IBPDT,IBCPT,IBN)) Q:IBN=""  D
 ... Q:$P($G(^DGCR(399,IBN,0)),U,13)=7
 ... S IBX="" F  S IBX=$O(^DGCR(399,"ASD",IBPDT,IBCPT,IBN,IBX)) Q:IBX=""  D
 .... S ^TMP("IBCU",$J,+IBCPT,"B")=$G(^TMP("IBCU",$J,+IBCPT,"B"))+1,^TMP("IBCU",$J,"B")=$G(^TMP("IBCU",$J,"B"))+1
 K IBEVDT,IBPDT,IBN,IBE,IBI,IBCPT,IBX
 Q
 ;
CKENC(IBOE,IBOE0,SDSTOP) ;
 N PARRAY,P,IBZERR,IBQUANTY
 I $$STOP S SDSTOP=1 Q
 D GETCPT^SDOE(IBOE,"PARRAY","IBZERR")
 Q:'$O(PARRAY(0))
 S IBCLN=$P(IBOE0,U,4)
 S P=0 F  S P=$O(PARRAY(P)) Q:'P  S IBCPT=+PARRAY(P) D
 . S IBQUANTY=$P($G(PARRAY(P)),U,16)
 . I IBSRT S ^TMP("IBCU",$J,IBCPT)=$G(^TMP("IBCU",$J,IBCPT))+IBQUANTY,^TMP("IBCU",$J)=$G(^TMP("IBCU",$J))+IBQUANTY Q
 . S IBCLNN=$P($G(^SC(IBCLN,0)),U),^TMP("IBCU",$J,IBCLNN,"N")=IBCLN
 . S ^TMP("IBCU",$J,IBCLNN)=$G(^TMP("IBCU",$J,IBCLNN))+IBQUANTY
 . S ^TMP("IBCU",$J,IBCLNN,IBCPT)=$G(^TMP("IBCU",$J,IBCLNN,IBCPT))+IBQUANTY
 Q
 ;
STOP() ;check for user requested stop when queued
 I $D(ZTQUEUED),$$S^%ZTLOAD S ZTSTOP=1 K ZTREQ I +$G(IBPGN) W !!,"TASK STOPPED BY USER",!!
 Q +$G(ZTSTOP)
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIBOCNC1   4449     printed  Sep 23, 2025@20:01:40                                                                                                                                                                                                     Page 2
IBOCNC1   ;ALB/ARH - CPT USAGE IN CLINICS (SEARCH); 1/23/92
 +1       ;;2.0;INTEGRATED BILLING;**91,133**;21-MAR-94
 +2       ;
 +3       ;entry pt. for tasked jobs
FIND      ;find, save, and print the data that satisfies the search parameters, save clinic/division names
 +1       ;I $D(XRT0) S:'$D(XRTN) XRTN="IBOCNC" D T1^%ZOSV ;stop rt clock
 +2       ;S XRTL=$ZU(0),XRTN="IBOCNC-2" D T0^%ZOSV ;start rt clock
 +3        IF VAUTC
               IF VAUTD
                   SET ^TMP("IBCU",$JOB,"D","ALL")=""
                   SET IBPRC(1)="ALL DIVISIONS AND CLINICS"
 +4        SET X=0
 +5        IF VAUTC
               IF 'VAUTD
                   SET X=X+1
                   SET IBC=""
                   SET IBPRC(X)="DIVISIONS: "
                   SET IBDIV=""
                   FOR IBI=1:1
                       SET IBDIV=$ORDER(VAUTD(IBDIV))
                       if IBDIV=""
                           QUIT 
                       Begin DoDot:1
 +6                        SET ^TMP("IBCU",$JOB,"D",IBDIV)=""
 +7                        IF ($LENGTH(IBPRC(X))+$LENGTH(VAUTD(IBDIV))+2)>IOM
                               SET X=X+1
                               SET IBPRC(X)="           "
                               SET IBC=""
 +8                        SET IBPRC(X)=IBPRC(X)_IBC_VAUTD(IBDIV)
                           SET IBC=", "
                       End DoDot:1
 +9        IF 'VAUTC
               SET X=X+1
               SET IBC=""
               SET IBPRC(X)="CLINICS: "
               SET IBCLN=""
               FOR IBI=1:1
                   SET IBCLN=$ORDER(VAUTC(IBCLN))
                   if IBCLN=""
                       QUIT 
                   Begin DoDot:1
 +10                   SET ^TMP("IBCU",$JOB,"C",IBCLN)=""
 +11                   IF ($LENGTH(IBPRC(X))+$LENGTH(VAUTC(IBCLN))+2)>IOM
                           SET X=X+1
                           SET IBPRC(X)="         "
                           SET IBC=""
 +12                   SET IBPRC(X)=IBPRC(X)_IBC_VAUTC(IBCLN)
                       SET IBC=", "
                   End DoDot:1
 +13       KILL VAUTD,VAUTC,IBC,X
 +14      ;entire divisions were chosen, find all clinics
 +15       IF $DATA(^TMP("IBCU",$JOB,"D","ALL"))
               SET IBDIV=""
               FOR 
                   SET IBDIV=$ORDER(^DG(40.8,IBDIV))
                   if IBDIV'?1N.N
                       QUIT 
                   SET ^TMP("IBCU",$JOB,"D",IBDIV)=""
 +16       IF $DATA(^TMP("IBCU",$JOB,"D"))
               SET IBCLN=""
               FOR IBI=1:1
                   SET IBCLN=$ORDER(^SC(IBCLN))
                   if IBCLN'?1N.N
                       QUIT 
                   Begin DoDot:1
 +17                   SET IBLN=$GET(^SC(IBCLN,0))
                       if $PIECE(IBLN,"^",3)'="C"!('$DATA(^TMP("IBCU",$JOB,"D",+$PIECE(IBLN,"^",15))))
                           QUIT 
 +18                   SET ^TMP("IBCU",$JOB,"C",IBCLN)=""
                   End DoDot:1
 +19       KILL IBLN,IBCLN,IBDIV,IBI,^TMP("IBCU",$JOB,"D")
 +20      ;I $D(XRT0),'$D(^TMP("IBCU",$J,"C")) S:'$D(XRTN) XRTN="IBOCNC" D T1^%ZOSV ;stop rt clock
 +21       if '$DATA(^TMP("IBCU",$JOB,"C"))
               QUIT 
 +22      ;
SAVE      ;for each clinic chosen collect counts on CPTs used and save in sorted tmp file
 +1        NEW IBVAL,IBCBK,IBFILTER
 +2        SET IBVAL("BDT")=IBBDT
           SET IBVAL("EDT")=IBEDT+.3
 +3       ; Must be an encounter for one of the clinics chosen,
 +4       ;   only count each visit (in v-file) once
 +5        SET IBFILTER=""
 +6        SET IBCBK="I '$P(Y0,U,6),$D(^TMP(""IBCU"",$J,""C"",+$P(Y0,U,4))),'$D(^TMP(""VIS"",$J,+$P(Y0,U,5))) S ^TMP(""VIS"",$J,+$P(Y0,U,5))="""" D CKENC^IBOCNC1(Y,Y0,.SDSTOP) S:$G(SDSTOP) IBQ=1"
 +7        SET IBQ=0
 +8        KILL ^TMP("VIS",$JOB)
 +9        DO SCAN^IBSDU("DATE/TIME",.IBVAL,IBFILTER,IBCBK)
 +10      ;
 +11       KILL IBB,IBE,IBX,IBCLN,IBCLNN,IBCPT,IBLN,IBI,^TMP("IBCU",$JOB,"C"),^TMP("VIS",$JOB)
 +12       if IBSRT
               DO BILL
PRINT      IF 'IBQ
               DO ^IBOCNC2
 +1        KILL IBPRC,IBSRT,IBQ,^TMP("IBCU",$JOB)
 +2        IF $DATA(ZTQUEUED)
               SET ZTREQ="@"
 +3       ;I $D(XRT0) S:'$D(XRTN) XRTN="IBOCNC" D T1^%ZOSV ;stop rt clock
 +4        QUIT 
 +5       ;
BILL      ;when sorting by CPT, get count on CPT's entered in billing for the date range
 +1       ;count number of CPTs in old format, using event date as procedure date
 +2        if IBQ
               QUIT 
           SET IBEVDT=IBBDT-.001
           SET IBE=IBEDT+.3
 +3        FOR 
               SET IBEVDT=$ORDER(^DGCR(399,"D",IBEVDT))
               if IBEVDT=""!(IBEVDT>IBE)!IBQ
                   QUIT 
               Begin DoDot:1
 +4                SET IBN=""
                   FOR 
                       SET IBN=$ORDER(^DGCR(399,"D",IBEVDT,IBN))
                       if IBN=""
                           QUIT 
                       Begin DoDot:2
 +5                        if $PIECE($GET(^DGCR(399,IBN,0)),"^",9)'=4!('$DATA(^DGCR(399,IBN,"C")))!($PIECE($GET(^DGCR(399,IBN,0)),"^",13)=7)
                               QUIT 
                           SET IBX=$GET(^DGCR(399,IBN,"C"))
 +6                        FOR IBI=1,2,3,7,8,9
                               SET IBCPT=$PIECE(IBX,"^",IBI)
                               IF $$CPT^ICPTCOD(+IBCPT)>0
                                   SET ^TMP("IBCU",$JOB,+IBCPT,"B")=$GET(^TMP("IBCU",$JOB,+IBCPT,"B"))+1
                                   SET ^TMP("IBCU",$JOB,"B")=$GET(^TMP("IBCU",$JOB,"B"))+1
                       End DoDot:2
               End DoDot:1
               SET IBQ=$$STOP
 +7       ;count number of CPTs in "CP" multiple using the cross-reference and the correct procedure date
 +8        if IBQ
               QUIT 
           SET IBPDT=-(IBEDT+.3)
 +9        FOR 
               SET IBPDT=$ORDER(^DGCR(399,"ASD",IBPDT))
               if IBPDT=""!(-IBPDT<IBBDT)!IBQ
                   QUIT 
               Begin DoDot:1
 +10               SET IBCPT=""
                   FOR 
                       SET IBCPT=$ORDER(^DGCR(399,"ASD",IBPDT,IBCPT))
                       if IBCPT=""
                           QUIT 
                       Begin DoDot:2
 +11                       SET IBN=""
                           FOR 
                               SET IBN=$ORDER(^DGCR(399,"ASD",IBPDT,IBCPT,IBN))
                               if IBN=""
                                   QUIT 
                               Begin DoDot:3
 +12                               if $PIECE($GET(^DGCR(399,IBN,0)),U,13)=7
                                       QUIT 
 +13                               SET IBX=""
                                   FOR 
                                       SET IBX=$ORDER(^DGCR(399,"ASD",IBPDT,IBCPT,IBN,IBX))
                                       if IBX=""
                                           QUIT 
                                       Begin DoDot:4
 +14                                       SET ^TMP("IBCU",$JOB,+IBCPT,"B")=$GET(^TMP("IBCU",$JOB,+IBCPT,"B"))+1
                                           SET ^TMP("IBCU",$JOB,"B")=$GET(^TMP("IBCU",$JOB,"B"))+1
                                       End DoDot:4
                               End DoDot:3
                       End DoDot:2
               End DoDot:1
               SET IBQ=$$STOP
 +15       KILL IBEVDT,IBPDT,IBN,IBE,IBI,IBCPT,IBX
 +16       QUIT 
 +17      ;
CKENC(IBOE,IBOE0,SDSTOP) ;
 +1        NEW PARRAY,P,IBZERR,IBQUANTY
 +2        IF $$STOP
               SET SDSTOP=1
               QUIT 
 +3        DO GETCPT^SDOE(IBOE,"PARRAY","IBZERR")
 +4        if '$ORDER(PARRAY(0))
               QUIT 
 +5        SET IBCLN=$PIECE(IBOE0,U,4)
 +6        SET P=0
           FOR 
               SET P=$ORDER(PARRAY(P))
               if 'P
                   QUIT 
               SET IBCPT=+PARRAY(P)
               Begin DoDot:1
 +7                SET IBQUANTY=$PIECE($GET(PARRAY(P)),U,16)
 +8                IF IBSRT
                       SET ^TMP("IBCU",$JOB,IBCPT)=$GET(^TMP("IBCU",$JOB,IBCPT))+IBQUANTY
                       SET ^TMP("IBCU",$JOB)=$GET(^TMP("IBCU",$JOB))+IBQUANTY
                       QUIT 
 +9                SET IBCLNN=$PIECE($GET(^SC(IBCLN,0)),U)
                   SET ^TMP("IBCU",$JOB,IBCLNN,"N")=IBCLN
 +10               SET ^TMP("IBCU",$JOB,IBCLNN)=$GET(^TMP("IBCU",$JOB,IBCLNN))+IBQUANTY
 +11               SET ^TMP("IBCU",$JOB,IBCLNN,IBCPT)=$GET(^TMP("IBCU",$JOB,IBCLNN,IBCPT))+IBQUANTY
               End DoDot:1
 +12       QUIT 
 +13      ;
STOP()    ;check for user requested stop when queued
 +1        IF $DATA(ZTQUEUED)
               IF $$S^%ZTLOAD
                   SET ZTSTOP=1
                   KILL ZTREQ
                   IF +$GET(IBPGN)
                       WRITE !!,"TASK STOPPED BY USER",!!
 +2        QUIT +$GET(ZTSTOP)