| 1 | IBDF17 ;ALB/CJM - ENCOUNTER FORM - COPY A CPT CHECK-OFF SHEET INTO A FORM ;24SEP93
 | 
|---|
| 2 |  ;;3.0;AUTOMATED INFO COLLECTION SYS;**38**;APR 24, 1997
 | 
|---|
| 3 |  ;DHH
 | 
|---|
| 4 |  ;Allows the user to choose a form to copy to, and a CPT check-off sheet
 | 
|---|
| 5 |  ;to copy from, then creates a new block and copies the CPT codes to it
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 |  N FORM,LIST,BLOCK,SHEET
 | 
|---|
| 8 |  W !!,"Select the encounter form you want to copy CPT codes to!",!
 | 
|---|
| 9 |  S FORM=$$SLCTFORM^IBDFU4(0)
 | 
|---|
| 10 |  Q:'FORM
 | 
|---|
| 11 |  D FIND(FORM,.BLOCK,.LIST)
 | 
|---|
| 12 |  I 'BLOCK W !,"There is no selection list for CPT codes to copy to!" D PAUSE^IBDFU5 Q
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 |  S SHEET=$$SLCTSHT
 | 
|---|
| 15 |  Q:'SHEET
 | 
|---|
| 16 |  ;
 | 
|---|
| 17 |  ;must delete the compiled version of the block, since it will be changed
 | 
|---|
| 18 |  K ^IBE(357.1,BLOCK,"S"),^("V"),^("B"),^("H")
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 |  D COPY(SHEET,LIST)
 | 
|---|
| 21 |  Q
 | 
|---|
| 22 |  ;
 | 
|---|
| 23 | COPY(SHEET,LIST) ;copies the CPT codes/headers from the sheet to the list
 | 
|---|
| 24 |  ;
 | 
|---|
| 25 |  N HDR,TYPE,NODE
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  ;find the subcolumns in LIST to write to
 | 
|---|
| 28 |  D SUBCOLS(.LIST) I 'LIST("CODESC")!'LIST("TEXTSC") W !,"The CPT selection list does not contain a subcolumn for the CPT code or text!" D PAUSE^IBDFU5 Q
 | 
|---|
| 29 |  ;
 | 
|---|
| 30 |  S HDR="" F  S HDR=$O(^IBE(350.71,"G",SHEET,HDR)) Q:'HDR  S NODE=$G(^IBE(350.71,HDR,0)),TYPE=$P(NODE,"^",3)  D:TYPE="S" COPYGRP(HDR,.NODE,.LIST)
 | 
|---|
| 31 |  Q
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 | COPYGRP(HDR,NODE,LIST) ;copies the header contained in NODE to the selection list (LIST)
 | 
|---|
| 34 |  ;
 | 
|---|
| 35 |  N HEADER,ORDER,GROUP,PROC
 | 
|---|
| 36 |  S HEADER=$P(NODE,"^") Q:HEADER=""  S ORDER=$P(NODE,"^",2) Q:'ORDER
 | 
|---|
| 37 |  ;
 | 
|---|
| 38 |  ;copy the group
 | 
|---|
| 39 |  K DIC,DD,D0,DINUM S DIC="^IBE(357.4,",X=HEADER,DIC(0)=""
 | 
|---|
| 40 |  D FILE^DICN K DIC,DIE,DA
 | 
|---|
| 41 |  S GROUP=$S(+Y<0:"",1:+Y)
 | 
|---|
| 42 |  Q:'GROUP
 | 
|---|
| 43 |  S ^IBE(357.4,GROUP,0)=HEADER_"^"_ORDER_"^"_LIST
 | 
|---|
| 44 |  K DIK,DA S DIK="^IBE(357.4,",DA=GROUP
 | 
|---|
| 45 |  D IX1^DIK K DIK,DA
 | 
|---|
| 46 |  ;
 | 
|---|
| 47 |  ;now find all the group's procedures and copy them
 | 
|---|
| 48 |  S PROC=0 F  S PROC=$O(^IBE(350.71,"S",HDR,PROC)) Q:'PROC  D:PROC'=HDR COPYPROC(PROC,.LIST,GROUP)
 | 
|---|
| 49 |  ;
 | 
|---|
| 50 |  W "." ;just to let the use know it's doing something
 | 
|---|
| 51 |  Q
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 | COPYPROC(PROC,LIST,GROUP) ;copies the procedure contained to the selection list and group
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  N NODE,TEXT,ORDER,CODE,SLCTN
 | 
|---|
| 56 |  S NODE=$G(^IBE(350.71,PROC,0))
 | 
|---|
| 57 |  ;
 | 
|---|
| 58 |  ;find the CPT code
 | 
|---|
| 59 |  S CODE=$P(NODE,"^",6)
 | 
|---|
| 60 |  Q:'CODE
 | 
|---|
| 61 |  S CODE=$P($G(^SD(409.71,CODE,0)),"^")
 | 
|---|
| 62 |  Q:'CODE
 | 
|---|
| 63 |  ;; --change to api cpt ; dhh
 | 
|---|
| 64 |  S CODE=$$CPT^ICPTCOD(CODE)
 | 
|---|
| 65 |  Q:+CODE=-1
 | 
|---|
| 66 |  S CODE=$P(CODE,"^",2)
 | 
|---|
| 67 |  Q:'CODE
 | 
|---|
| 68 |  ;
 | 
|---|
| 69 |  ;find the text and order for the proc on the sheet
 | 
|---|
| 70 |  S TEXT=$P(NODE,"^") Q:TEXT=""  S ORDER=$P(NODE,"^",2) Q:'ORDER
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 |  ;create the selection
 | 
|---|
| 73 |  K DIC,DD,D0,DINUM S DIC="^IBE(357.3,",X=CODE,DIC(0)=""
 | 
|---|
| 74 |  D FILE^DICN K DIC,DIE,DA
 | 
|---|
| 75 |  S SLCTN=$S(+Y<0:"",1:+Y)
 | 
|---|
| 76 |  Q:'SLCTN
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  ;fill in the 0 node
 | 
|---|
| 79 |  S ^IBE(357.3,SLCTN,0)=CODE_"^^"_LIST_"^"_GROUP_"^"_ORDER_"^"
 | 
|---|
| 80 |  ;
 | 
|---|
| 81 |  ;fill in the SUBCOLUM VALUE multiple with the subcolumn values
 | 
|---|
| 82 |  S ^IBE(357.3,SLCTN,1,0)="^357.31IA^2^2"
 | 
|---|
| 83 |  S ^IBE(357.3,SLCTN,1,2,0)=LIST("TEXTSC")_"^"_TEXT
 | 
|---|
| 84 |  S ^IBE(357.3,SLCTN,1,1,0)=LIST("CODESC")_"^"_CODE
 | 
|---|
| 85 |  K DIK,DA S DIK="^IBE(357.3,",DA=SLCTN
 | 
|---|
| 86 |  D IX1^DIK K DIK,DA
 | 
|---|
| 87 |  Q
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 | SUBCOLS(LIST) ;finds the column containing the CPT code and the text description
 | 
|---|
| 90 |  ;LIST is passed by reference
 | 
|---|
| 91 |  S (LIST("CODESC"),LIST("TEXTSC"))=""
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 |  N SC,PIECE,NODE S SC=0
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 |  ;piece 1 of the data returned by the package interface is the code,piece 2 is the description
 | 
|---|
| 96 |  F  S SC=$O(^IBE(357.2,LIST,2,SC)) Q:'SC  S NODE=$G(^IBE(357.2,LIST,2,SC,0)),PIECE=$P(NODE,"^",5) S:PIECE=1 LIST("CODESC")=$P(NODE,"^") S:PIECE=2 LIST("TEXTSC")=$P(NODE,"^") Q:LIST("CODESC")&LIST("TEXTSC")
 | 
|---|
| 97 |  Q
 | 
|---|
| 98 |  ;
 | 
|---|
| 99 | SLCTSHT() ;allows the user to select a CPT check-off sheet
 | 
|---|
| 100 |  K DIC S DIC=350.7,DIC(0)="AEMQ" D ^DIC K DIC
 | 
|---|
| 101 |  I $D(DINUM)!$D(DUOUT)!(Y<0) Q ""
 | 
|---|
| 102 |  Q +Y
 | 
|---|
| 103 | FIND(FORM,BLK,LIST) ;finds the block & list for CPT codes
 | 
|---|
| 104 |  N INTRFACE,BLOCKS,I
 | 
|---|
| 105 |  S (BLK,LIST,BLOCKS,I)=0
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 |  ;find the package interface for selecting CPT codes
 | 
|---|
| 108 |  S INTRFACE=$O(^IBE(357.6,"B","DG SELECT CPT PROCEDURE CODES",0))
 | 
|---|
| 109 |  Q:'INTRFACE
 | 
|---|
| 110 |  ;
 | 
|---|
| 111 |  ;find all of the blocks with CPT lists
 | 
|---|
| 112 |  S BLK="" F  S BLK=$O(^IBE(357.1,"C",FORM,BLK)) Q:'BLK  D
 | 
|---|
| 113 |  .S LIST="" F  S LIST=$O(^IBE(357.2,"C",BLK,LIST)) Q:'LIST  I $P($G(^IBE(357.2,LIST,0)),"^",11)=INTRFACE S BLOCKS=BLOCKS+1,I=I+1,BLOCKS(I)=BLK_"^"_LIST
 | 
|---|
| 114 |  ;
 | 
|---|
| 115 |  ;if count of blocks <2 there is no need to ask the user to choose
 | 
|---|
| 116 |  I BLOCKS<2 S BLK=+$P($G(BLOCKS(1)),"^"),LIST=$P($G(BLOCKS(1)),"^",2) Q
 | 
|---|
| 117 |  ;
 | 
|---|
| 118 |  ;if count>1 the user must choose the block from the array BLOCKS
 | 
|---|
| 119 |  S (BLK,LIST)=0
 | 
|---|
| 120 |  S I=$$CHOOSE(.BLOCKS)
 | 
|---|
| 121 |  S BLK=+$G(BLOCKS(+I)),LIST=+$P($G(BLOCKS(+I)),"^",2)
 | 
|---|
| 122 |  Q
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 | CHOOSE(BLOCKS) ;ask the user to choose
 | 
|---|
| 125 |  ;BLOCKS is an array passed by reference
 | 
|---|
| 126 |  ;
 | 
|---|
| 127 |  N I
 | 
|---|
| 128 | ASK W ! S I=0 F  S I=$O(BLOCKS(I)) Q:'I  W !,I,"  ",$P($G(^IBE(357.1,+BLOCKS(I),0)),"^")
 | 
|---|
| 129 |  W !!,"Select a block to put the CPT codes: (1-",BLOCKS,"): "
 | 
|---|
| 130 |  R I:DTIME
 | 
|---|
| 131 |  Q:'$T 0
 | 
|---|
| 132 |  Q:'$G(I) 0
 | 
|---|
| 133 |  I '$D(BLOCKS(I)) G ASK
 | 
|---|
| 134 |  Q I
 | 
|---|