| 1 | ECXAPRO ;ALB/JAP - PRO Extract Audit Report ; Nov 16, 1998 | 
|---|
| 2 | ;;3.0;DSS EXTRACTS;**9,21,33,36**;Dec 22, 1997 | 
|---|
| 3 | ; | 
|---|
| 4 | EN ;entry point for PRO extract audit report | 
|---|
| 5 | N %X,%Y,DIV,X,Y,DIC,DA,DR,DIQ,DIR,DIRUT,DTOUT,DUOUT | 
|---|
| 6 | S ECXERR=0 | 
|---|
| 7 | ;ecxaud=0 for 'extract' audit | 
|---|
| 8 | S ECXHEAD="PRO",ECXAUD=0 | 
|---|
| 9 | W !!,"Setup for ",ECXHEAD," Extract Audit Report --",!! | 
|---|
| 10 | ;determine primary division | 
|---|
| 11 | S ECXPRIME=$$PDIV^ECXPUTL | 
|---|
| 12 | I ECXPRIME=0 D ^ECXKILL Q | 
|---|
| 13 | S DA=ECXPRIME,DIC="^DIC(4,",DIQ(0)="I",DIQ="ECXDIC",DR=".01;99" D EN^DIQ1 | 
|---|
| 14 | S ECXPRIME=ECXPRIME_U_$G(ECXDIC(4,DA,99,"I"))_U_$G(ECXDIC(4,DA,.01,"I")) | 
|---|
| 15 | ;select 1 or more prosthetics divisions for report | 
|---|
| 16 | D PRO^ECXDVSN2(DUZ,ECXPRIME,.ECXDIV,.ECXALL,.ECXERR) | 
|---|
| 17 | I ECXERR D  Q | 
|---|
| 18 | .D ^ECXKILL W !!,?5,"Try again later... exiting.",! | 
|---|
| 19 | ;select extract | 
|---|
| 20 | D AUDIT^ECXUTLA(ECXHEAD,.ECXERR,.ECXARRAY,ECXAUD) | 
|---|
| 21 | I ECXERR=1 D  Q | 
|---|
| 22 | .W !!,?5,"Try again later... exiting.",! | 
|---|
| 23 | .D AUDIT^ECXKILL | 
|---|
| 24 | ;if user's selected division doesn't match extract's division, then quit | 
|---|
| 25 | I +ECXPRIME'=ECXARRAY("DIV") D  Q | 
|---|
| 26 | .S DIV=+ECXARRAY("DIV") S:$D(^DIC(4,DIV,0)) DIV=$P(^(0),U,1) | 
|---|
| 27 | .W !!,?5,"Your primary division ("_$P(ECXPRIME,U,3)_") does not match the" | 
|---|
| 28 | .W !,?5,"division ("_DIV_") associated with Extract #"_ECXARRAY("EXTRACT")_"." | 
|---|
| 29 | .W !!,?5,"Try again... exiting.",! | 
|---|
| 30 | .I $E(IOST)="C" D | 
|---|
| 31 | ..S SS=20-$Y F JJ=1:1:SS W ! | 
|---|
| 32 | ..S DIR(0)="E" W ! D ^DIR K DIR | 
|---|
| 33 | ..W @IOF | 
|---|
| 34 | ;select summary or detail | 
|---|
| 35 | K DIR S DIR(0)="S^D:DETAIL;S:SUMMARY",DIR("A")="Type of Report",DIR("B")="SUMMARY" | 
|---|
| 36 | D ^DIR K DIR | 
|---|
| 37 | I $D(DIRUT)!($D(DTOUT)) D  Q | 
|---|
| 38 | .W !!,?5,"Try again later... exiting.",! | 
|---|
| 39 | .D AUDIT^ECXKILL | 
|---|
| 40 | S ECXREPT=Y | 
|---|
| 41 | ;continue with detail report | 
|---|
| 42 | I ECXREPT="D" D | 
|---|
| 43 | .F  D ASK2^ECXAPRO2 Q:$D(DIRUT)!($D(DTOUT)) | 
|---|
| 44 | ;continue with summary report | 
|---|
| 45 | I ECXREPT="S" D | 
|---|
| 46 | .S ECXPGM="TASK^ECXAPRO",ECXDESC="PRO Extract Audit Report" | 
|---|
| 47 | .S ECXSAVE("ECXHEAD")="",ECXSAVE("ECXDIV(")="",ECXSAVE("ECXARRAY(")="",ECXSAVE("ECXREPT")="",ECXSAVE("ECXPRIME")="",ECXSAVE("ECXALL")="" | 
|---|
| 48 | .W ! | 
|---|
| 49 | .;determine output device and queue if requested | 
|---|
| 50 | .D DEVICE^ECXUTLA(ECXPGM,ECXDESC,.ECXSAVE) I ECXSAVE("POP")=1 D  Q | 
|---|
| 51 | ..W !!,?5,"Try again later... exiting.",! | 
|---|
| 52 | ..D AUDIT^ECXKILL | 
|---|
| 53 | .I ECXSAVE("ZTSK")=0 D | 
|---|
| 54 | ..K ECXSAVE,ECXPGM,ECXDESC | 
|---|
| 55 | ..D PROCESS,DISP^ECXAPRO1 | 
|---|
| 56 | ..;allow user to get details | 
|---|
| 57 | ..D ASK^ECXAPRO2 | 
|---|
| 58 | ;clean-up and close | 
|---|
| 59 | I IO'=IO(0) D ^%ZISC | 
|---|
| 60 | D HOME^%ZIS | 
|---|
| 61 | D AUDIT^ECXKILL | 
|---|
| 62 | Q | 
|---|
| 63 | ; | 
|---|
| 64 | TASK ;entry point from taskmanager | 
|---|
| 65 | D PROCESS | 
|---|
| 66 | I ECXREPT="S" D DISP^ECXAPRO1 | 
|---|
| 67 | I ECXREPT="D" D DISP^ECXAPRO2 | 
|---|
| 68 | D AUDIT^ECXKILL | 
|---|
| 69 | Q | 
|---|
| 70 | ; | 
|---|
| 71 | PROCESS ;process the data in file #727.826 | 
|---|
| 72 | N J,CNT,CODE,COST,CPTNM,DATE,DESC,FLG,GN,IEN,KEY,LOC,LABLC,LABMC,NODE,PTNAM,PSASNM,QTY,QFLG,QQFLG,RD,SSN,STN,SRCE,TYPE | 
|---|
| 73 | K ^TMP($J) | 
|---|
| 74 | S (CNT,QQFLG)=0 | 
|---|
| 75 | S ECXEXT=ECXARRAY("EXTRACT"),ECXDEF=ECXARRAY("DEF") | 
|---|
| 76 | S X=ECXARRAY("START") D ^%DT S ECXSTART=Y S X=ECXARRAY("END") D ^%DT S ECXEND=Y | 
|---|
| 77 | D NOW^%DTC S Y=$E(%,1,12) D DD^%DT S ECXRUN=Y | 
|---|
| 78 | I ECXALL=0 S J=$O(ECXDIV(99),-1),ECXDIV=ECXDIV(J) | 
|---|
| 79 | I ECXALL=1 S ECXDIV=ECXPRIME | 
|---|
| 80 | S STN=$P(ECXDIV,U,2) | 
|---|
| 81 | ;initialize the prosthetics tmp global for cumulative data | 
|---|
| 82 | D CODE^ECXAPRO1 | 
|---|
| 83 | ;gather extract data and sort by grouper number, calc flag, and nppd code | 
|---|
| 84 | S IEN="" F  S IEN=$O(^ECX(727.826,"AC",ECXEXT,IEN)) Q:IEN=""  D  Q:QQFLG | 
|---|
| 85 | .S ECXPRO=^ECX(727.826,IEN,0) | 
|---|
| 86 | .; | 
|---|
| 87 | .;- Remove trailing "^" from ECXPRO if there | 
|---|
| 88 | .I $E(ECXPRO,$L(ECXPRO))="^" S ECXPRO=$E(ECXPRO,1,$L(ECXPRO)-1) | 
|---|
| 89 | .S ECXPRO=ECXPRO_U_$P(^ECX(727.826,IEN,1),U,4) | 
|---|
| 90 | .S DATE=$P(ECXPRO,U,9) | 
|---|
| 91 | .S $E(DATE,1,2)=$E(DATE,1,2)-17 | 
|---|
| 92 | .Q:$L(DATE)<7  Q:(DATE<ECXSTART)  Q:(DATE>ECXEND) | 
|---|
| 93 | .S DATE=$E(DATE,4,5)_"/"_$E(DATE,6,7) | 
|---|
| 94 | .S PTNAM=$P(ECXPRO,U,7),SSN=$E($P(ECXPRO,U,6),6,9) | 
|---|
| 95 | .S LOC=$P(ECXPRO,U,10),KEY=$P(ECXPRO,U,11),QTY=$P(ECXPRO,U,12) | 
|---|
| 96 | .S COST=$P(ECXPRO,U,25),LABLC=$P(ECXPRO,U,26),LABMC=$P(ECXPRO,U,27) | 
|---|
| 97 | .S GN=$P(ECXPRO,U,34),GN=$S(GN="":" ",1:GN) | 
|---|
| 98 | .;don't double count lab items | 
|---|
| 99 | .Q:LOC["LAB" | 
|---|
| 100 | .;duplicate the logic in sort^rmprn6 that sets cost=0 if form=4 | 
|---|
| 101 | .I LOC["ORD" S COST=0 | 
|---|
| 102 | .S LOC=$S(LOC["ORD":$P(LOC,"ORD",1),1:$P(LOC,"NONL",1)) | 
|---|
| 103 | .;quit if feeder location isn't for division selected for report | 
|---|
| 104 | .I ECXALL=1,LOC'[STN Q | 
|---|
| 105 | .I ECXALL=0,LOC'=STN Q | 
|---|
| 106 | .S TYPE=$E(KEY,6),SRCE=$E(KEY,7) | 
|---|
| 107 | .S CPTNM=$P(ECXPRO,U,15),PSASNM=$P(ECXPRO,U,33) | 
|---|
| 108 | .D GETCODE(PSASNM,.NODE) | 
|---|
| 109 | .Q:NODE="" | 
|---|
| 110 | .S CODE=$S(TYPE="X":$P(NODE,U,3),1:$P(NODE,U,4)) | 
|---|
| 111 | .S FLG=$P(NODE,U,2),DESC=$P(NODE,U,5) | 
|---|
| 112 | .S ^TMP($J,"RMPRGN",STN,GN,FLG,CODE,IEN)=TYPE_U_SRCE_U_QTY_U_COST_U_LABLC_U_LABMC_U_PSASNM_U_DESC_U_PTNAM_U_SSN_U_DATE_U_LOC | 
|---|
| 113 | ;accumulate summary & detail data | 
|---|
| 114 | S GN="" | 
|---|
| 115 | F  S GN=$O(^TMP($J,"RMPRGN",STN,GN)) Q:GN=""  D | 
|---|
| 116 | .S FLG=0 | 
|---|
| 117 | .F  S FLG=$O(^TMP($J,"RMPRGN",STN,GN,FLG)) Q:FLG'>0  D | 
|---|
| 118 | ..I FLG=1 D GROUP S FLG=2 Q | 
|---|
| 119 | ..S CODE=0 | 
|---|
| 120 | ..F  S CODE=$O(^TMP($J,"RMPRGN",STN,GN,FLG,CODE)) Q:CODE=""  D | 
|---|
| 121 | ...S RD=0 | 
|---|
| 122 | ...F  S RD=$O(^TMP($J,"RMPRGN",STN,GN,FLG,CODE,RD)) Q:RD'>0  D | 
|---|
| 123 | ....S TYPE=$P(^TMP($J,"RMPRGN",STN,GN,FLG,CODE,RD),U,1),SRCE=$P(^(RD),U,2),QTY=$P(^(RD),U,3),COST=$P(^(RD),U,4) | 
|---|
| 124 | ....S ^TMP($J,CODE,RD)=^TMP($J,"RMPRGN",STN,GN,FLG,CODE,RD) | 
|---|
| 125 | ....I TYPE="X" D REP(CODE) | 
|---|
| 126 | ....I TYPE="N" D NEW(CODE) | 
|---|
| 127 | Q | 
|---|
| 128 | ; | 
|---|
| 129 | GETCODE(PSAS,NODE) ;find the appropriate nppd code using psas hcpcs | 
|---|
| 130 | N DIC,X,Y,DESC,FLG,NU,REP | 
|---|
| 131 | S NODE="" | 
|---|
| 132 | S DIC="^RMPR(661.1,",DIC(0)="XZ",X=PSAS D ^DIC | 
|---|
| 133 | I Y=-1 S NODE=U_"2"_U_"R99 Z"_U_"999 Z"_U_"NO HCPCS" Q | 
|---|
| 134 | S DESC=$E($P(Y(0),U,2),1,20) | 
|---|
| 135 | S FLG=$P(Y(0),U,8) S:FLG="" FLG=2 | 
|---|
| 136 | ;make sure each code at least 4 characters; group codes are 3 characters in tmp($j,rmprcode) | 
|---|
| 137 | S REP=$P(Y(0),U,6) S:$L(REP)=3 REP=REP_" " S:REP="" REP="R99 X" | 
|---|
| 138 | S NU=$P(Y(0),U,7) S:$L(NU)=3 NU=NU_" " S:NU="" NU="999 X" | 
|---|
| 139 | S NODE=U_FLG_U_REP_U_NU_U_DESC | 
|---|
| 140 | Q | 
|---|
| 141 | ; | 
|---|
| 142 | GROUP ;total grouper to main key | 
|---|
| 143 | N BF,BL,BR,BCOST,BTCOST,COST,QTY,TYPE,SRCE | 
|---|
| 144 | S BF=0,BTCOST=0 | 
|---|
| 145 | F  S BF=$O(^TMP($J,"RMPRGN",STN,GN,BF)) Q:BF'>0  D | 
|---|
| 146 | .S BL=0 | 
|---|
| 147 | .F  S BL=$O(^TMP($J,"RMPRGN",STN,GN,BF,BL)) Q:BL=""  D | 
|---|
| 148 | ..S BR=0 | 
|---|
| 149 | ..F  S BR=$O(^TMP($J,"RMPRGN",STN,GN,BF,BL,BR)) Q:BR'>0  D | 
|---|
| 150 | ...S BCOST=$P(^TMP($J,"RMPRGN",STN,GN,BF,BL,BR),U,4) | 
|---|
| 151 | ...S BTCOST=BTCOST+BCOST | 
|---|
| 152 | S BL=$O(^TMP($J,"RMPRGN",STN,GN,1,"")),BR=$O(^TMP($J,"RMPRGN",STN,GN,1,BL,"")) | 
|---|
| 153 | ;calculate based on primary | 
|---|
| 154 | S TYPE=$P(^TMP($J,"RMPRGN",STN,GN,1,BL,BR),U,1),SRCE=$P(^(BR),U,2),QTY=$P(^(BR),U,3) | 
|---|
| 155 | S COST=BTCOST | 
|---|
| 156 | S ^TMP($J,BL,BR)=^TMP($J,"RMPRGN",STN,GN,1,BL,BR),$P(^TMP($J,BL,BR),U,4)=COST | 
|---|
| 157 | I TYPE="X" D REP(BL) | 
|---|
| 158 | I TYPE="N" D NEW(BL) | 
|---|
| 159 | Q | 
|---|
| 160 | ; | 
|---|
| 161 | REP(C) ;calculate repair cost | 
|---|
| 162 | N LINE | 
|---|
| 163 | S LINE=C | 
|---|
| 164 | I LINE="R90 A" S SRCE="C",QTY=1 | 
|---|
| 165 | I $G(^TMP($J,"R",STN,LINE))="" S ^TMP($J,"R",STN,LINE)="" | 
|---|
| 166 | I SRCE["V" S $P(^TMP($J,"R",STN,LINE),U,1)=$P(^TMP($J,"R",STN,LINE),U,1)+QTY | 
|---|
| 167 | I SRCE["C" S $P(^TMP($J,"R",STN,LINE),U,2)=$P(^TMP($J,"R",STN,LINE),U,2)+QTY | 
|---|
| 168 | S $P(^TMP($J,"R",STN,LINE),U,3)=$P(^TMP($J,"R",STN,LINE),U,3)+COST | 
|---|
| 169 | Q | 
|---|
| 170 | ; | 
|---|
| 171 | NEW(C) ;calculate new costs | 
|---|
| 172 | N LINE | 
|---|
| 173 | S LINE=C | 
|---|
| 174 | I $G(^TMP($J,"N",STN,LINE))="" S ^TMP($J,"N",STN,LINE)="" | 
|---|
| 175 | I SRCE["V" S $P(^TMP($J,"N",STN,LINE),U,1)=$P(^TMP($J,"N",STN,LINE),U,1)+QTY | 
|---|
| 176 | I SRCE["C" S $P(^TMP($J,"N",STN,LINE),U,2)=$P(^TMP($J,"N",STN,LINE),U,2)+QTY | 
|---|
| 177 | S $P(^TMP($J,"N",STN,LINE),U,3)=$P(^TMP($J,"N",STN,LINE),U,3)+COST | 
|---|
| 178 | Q | 
|---|