IBCE277S ;ALB/JRA - Create MailMan message from 277STAT data array
;;2.0;INTEGRATED BILLING;**650,665**;17-Jul-18;Build 28
;;Per VA Directive 6402, this routine should not be modified.
Q
;
POST(RESULT,ARG) ;Entry point to create MailMan message from ARG array
; Input: ARG
N FLDNAM,FLDVAL,GLBO,MSGARY,BADCLM,BADLN,OCC
S GLBO="^TMP(""IBCE277J"",$J,""OUT"")" K @GLBO
;;WCJ;IB*2.0*665;KILL THE KILL SWITCH
;;JWS;IB*2.0*650;STOP 277STAT FHIR PROCESSING (I.E. KILL SWITCH)
;;G QUIT
;S SUBJ="MCT"
I $D(ARG)'>1 D Q
. S @GLBO@("Status")="0^ARG parameter is missing or has bad format"
. D ENCODE^XLFJSONE(GLBO,"RESULT") S RESULT(1)="["_RESULT(1)_"]"
S FLDNAM="" F S FLDNAM=$O(ARG(FLDNAM)) Q:FLDNAM="" D
. S OCC=+$P(FLDNAM,".",2)
. D GETVAL(FLDNAM,OCC)
I $D(MSGARY)'>1 D Q
. S @GLBO@("Status")="0^ARG parameter has no usable data"
. D ENCODE^XLFJSONE(GLBO,"RESULT") S RESULT(1)="["_RESULT(1)_"]"
S BADCLM="",BADLN=0 D MAIL
I BADCLM]"" D Q
. S @GLBO@("Status")="0^"_$S(BADCLM="XX":"Missing",1:"Bad")_" claim number"_$S(BADCLM="XX":"",1:" '"_BADCLM_"'")
. D ENCODE^XLFJSONE(GLBO,"RESULT") S RESULT(1)="["_RESULT(1)_"]"
I BADLN D Q
. S @GLBO@("Status")="0^Bad Line Type received in ARG parameter"
. D ENCODE^XLFJSONE(GLBO,"RESULT") S RESULT(1)="["_RESULT(1)_"]"
S @GLBO@("Status")="1^277STAT MailMan message created"
D ENCODE^XLFJSONE(GLBO,"RESULT") S RESULT(1)="["_RESULT(1)_"]"
K @GLBO
Q
;
GETVAL(FLDNAM,OCC) ;;Get the value associated with the field name
Q:($G(FLDNAM)=""!(OCC=""))
S FLDVAL=$G(ARG(FLDNAM))
;Translate any '^' to '~' since the lines of the mailman message contain pieces delimited by '^'
F Q:FLDVAL'[U S FLDVAL=$P(FLDVAL,U)_"~"_$P(FLDVAL,U,2,999)
;I $$UP^XLFSTR(FLDNAM)["TESTLIVE" S SUBJ=$S($$UP^XLFSTR(FLDVAL)="LIVE":"MCH",1:"MCT") Q
D MSGLINE($P(FLDNAM,"."),FLDVAL,OCC)
Q
;
MSGLINE(FLDNAM,FLDVAL,OCC) ;Add data to specified node in message array
;Each array node corresponds to a unique line in the MailMan message
Q:$G(FLDNAM)=""
N FLDDAT,FLDNUM,I,NODE
F I=1:1 S FLDDAT=$P($T(MAPFLD+I),";;",2) Q:FLDDAT="" D
. Q:$$UP^XLFSTR(FLDNAM)'=$$UP^XLFSTR($P(FLDDAT,U))
. S FLDNUM=$P(FLDDAT,"_",2),NODE=$P(FLDDAT,U,2),NODE=OCC_NODE Q:(NODE=""!('FLDNUM))
. S $P(MSGARY(NODE),U,FLDNUM)=FLDVAL
Q
;
CHKCLM(FLDVAL) ;;
Q:$G(FLDVAL)="" 0
N IBD,IBIFN
S $P(IBD,U,2)=FLDVAL
D STRTREC^IBCE277
Q:'IBIFN 0
Q 1
;
MAIL ;Assemble 277STAT MailMan message and create/send
N BILL,GOTLN,LN,MSG,NODE,XMTO,SUBJ
S GOTLN=0
;S XMTO("G."_SUBJ)=""
S XMTO("G.MCH")=""
S LN=$$SETMSG("RACUBOTH RUCH") ;'RACUBOTH RUCH' text needed for conditional in ^IBCESRV
S NODE="" F S NODE=$O(MSGARY(NODE)) Q:(NODE=""!(BADCLM]""!(BADLN))) D
. I NODE["LN" D Q:BADLN!(BADCLM]"")
. . I $P(MSGARY(NODE),U)'=$P(NODE,"LN",2) S BADLN=1 Q
. . S BILL=$P(MSGARY(NODE),U,2) I '$$CHKCLM(BILL) S BADCLM=$S(BILL="":"XX",1:$$GETCLM^IBCE277(BILL))
. I NODE["LN10" D PARSE(NODE,.LN) Q
. S LN=$$SETMSG(MSGARY(NODE),LN)
Q:BADCLM]""!(BADLN)
S SUBJ="MCH 277STAT "_$S(BILL["-":$P(BILL,"-",2),1:BILL)
S LN=$$SETMSG("99^$",LN),LN=$$SETMSG("NNNN",LN)
D SENDMSG^XMXAPI(DUZ,SUBJ,"MSG",.XMTO)
Q
;
SETMSG(DATA,LN) ;Set a line of the MailMan Message and return next line number
S:'$G(LN) LN=1
S MSG(LN)=$G(DATA),LN=LN+1
Q LN
;
PARSE(NODE,LN) ;
Q:($G(NODE)=""!('$G(LN)))
N I,STATARY,STATMSG,STATLIM,TXT
S STATLIM=200 ;Max characters for "Status Message" field on "10" line
S STATMSG=$P(MSGARY(NODE),U,6)
S TXT=MSGARY(NODE)
I $L(STATMSG)'>STATLIM S LN=$$SETMSG(TXT,LN) Q
D FSTRNG^IBJU1(STATMSG,STATLIM,.STATARY)
F I=1:1:STATARY S $P(TXT,U,6)=STATARY(I),LN=$$SETMSG(TXT,LN)
Q
;
QUIT ; kill switch
S @GLBO@("Status")="0^277STAT FHIR process turned off...i.e. Kill Switch"
D ENCODE^XLFJSONE(GLBO,"RESULT") S RESULT(1)="["_RESULT(1)_"]"
Q
;
MAPFLD ;RPC_field_name (limit 45 char)^Array_node
;;HeaderData_1_ReturnMessageId^HDR
;;HeaderData_2_X12ProprietaryFlag^HDR
;;HeaderData_3_StatusDate^HDR
;;HeaderData_4_StatusTime^HDR
;;HeaderData_5_MRAStatus^HDR
;;HeaderData_6_TotalNumberClaimsSubmitted^HDR
;;HeaderData_7_TotalNumberClaimsRejected^HDR
;;HeaderData_8_TotalChargesSubmitted^HDR
;;HeaderData_9_TotalChargesRejected^HDR
;;HeaderData_10_PayerName^HDR
;;HeaderData_11_PayerId^HDR
;;HeaderData_12_PayerGenerated^HDR
;;HeaderData_13_Source^HDR
;;HeaderData_14_BatchReferenceNumber^HDR
;;MessageHeader_1_LineType^LN09
;;MessageHeader_2_BillNumber^LN09
;;MessageHeader_3_MessageNumber^LN09
;;MessageHeader_4_ErrorData^LN09
;;MessageHeader_5_ErrorField^LN09
;;MessageData_1_LineType^LN10
;;MessageData_2_BillNumber^LN10
;;MessageData_3_AcceptRejectCode^LN10
;;MessageData_4_WarnErrorInfoCode^LN10
;;MessageData_5_StatusCode^LN10
;;MessageData_6_StatusMessage^LN10
;;ClaimData_1_LineType^LN13
;;ClaimData_2_BillNumber^LN13
;;ClaimData_3_ClearinghouseTraceNumber^LN13
;;ClaimData_4_PayerStatusDate^LN13
;;ClaimData_5_PayerClaimNumber^LN13
;;ClaimData_6_SplitClaimIndicator^LN13
;;ClaimData_7_ClaimType^LN13
;;ClmSvcDtSubscrPatData_1_LineType^LN15
;;ClmSvcDtSubscrPatData_2_BillNumber^LN15
;;ClmSvcDtSubscrPatData_3_PatientLastName^LN15
;;ClmSvcDtSubscrPatData_4_PatientFirstName^LN15
;;ClmSvcDtSubscrPatData_5_PatientMiddleName^LN15
;;ClmSvcDtSubscrPatData_6_PatientIdNumber^LN15
;;ClmSvcDtSubscrPatData_7_SubscriberLastName^LN15
;;ClmSvcDtSubscrPatData_8_SubscriberFirstName^LN15
;;ClmSvcDtSubscrPatData_9_SubscriberMiddleName^LN15
;;ClmSvcDtSubscrPatData_10_SubscriberIdNumber^LN15
;;ClmSvcDtSubscrPatData_11_FirstServiceDate^LN15
;;ClmSvcDtSubscrPatData_12_LastServiceDate^LN15
;
;277STAT processing will error out if there is a line 20 and/or
; line 21 in the mailman message (see IBCESRV routine).
;;ServiceLineStatusData_1_LineType^LN20
;;ServiceLineStatusData_2_BillNumber^LN20
;;ServiceLineStatusData_3_AcceptRejectCode^LN20
;;ServiceLineStatusData_4_WarnErrorInfoCode^LN20
;;ServiceLineStatusData_5_StatusCode^LN20
;;ServiceLineStatusData_6_StatusMessage^LN20
;;ServiceLineStatusData_7_FreeTextMessage^LN20
;;ServiceLineStatusData_8_ServiceLineNumber^LN20
;;ServiceLineIdData_1_LineType^LN21
;;ServiceLineIdData_2_BillNumber^LN21
;;ServiceLineIdData_3_ServiceLineNumber^LN21
;;ServiceLineIdData_4_ServiceType^LN21
;;ServiceLineIdData_5_ServiceCode^LN21
;;ServiceLineIdData_6_Modifiers^LN21
;;ServiceLineIdData_7_UnitsOfService^LN21
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIBCE277S 6489 printed Oct 16, 2024@18:10:03 Page 2
IBCE277S ;ALB/JRA - Create MailMan message from 277STAT data array
+1 ;;2.0;INTEGRATED BILLING;**650,665**;17-Jul-18;Build 28
+2 ;;Per VA Directive 6402, this routine should not be modified.
+3 QUIT
+4 ;
POST(RESULT,ARG) ;Entry point to create MailMan message from ARG array
+1 ; Input: ARG
+2 NEW FLDNAM,FLDVAL,GLBO,MSGARY,BADCLM,BADLN,OCC
+3 SET GLBO="^TMP(""IBCE277J"",$J,""OUT"")"
KILL @GLBO
+4 ;;WCJ;IB*2.0*665;KILL THE KILL SWITCH
+5 ;;JWS;IB*2.0*650;STOP 277STAT FHIR PROCESSING (I.E. KILL SWITCH)
+6 ;;G QUIT
+7 ;S SUBJ="MCT"
+8 IF $DATA(ARG)'>1
Begin DoDot:1
+9 SET @GLBO@("Status")="0^ARG parameter is missing or has bad format"
+10 DO ENCODE^XLFJSONE(GLBO,"RESULT")
SET RESULT(1)="["_RESULT(1)_"]"
End DoDot:1
QUIT
+11 SET FLDNAM=""
FOR
SET FLDNAM=$ORDER(ARG(FLDNAM))
if FLDNAM=""
QUIT
Begin DoDot:1
+12 SET OCC=+$PIECE(FLDNAM,".",2)
+13 DO GETVAL(FLDNAM,OCC)
End DoDot:1
+14 IF $DATA(MSGARY)'>1
Begin DoDot:1
+15 SET @GLBO@("Status")="0^ARG parameter has no usable data"
+16 DO ENCODE^XLFJSONE(GLBO,"RESULT")
SET RESULT(1)="["_RESULT(1)_"]"
End DoDot:1
QUIT
+17 SET BADCLM=""
SET BADLN=0
DO MAIL
+18 IF BADCLM]""
Begin DoDot:1
+19 SET @GLBO@("Status")="0^"_$SELECT(BADCLM="XX":"Missing",1:"Bad")_" claim number"_$SELECT(BADCLM="XX":"",1:" '"_BADCLM_"'")
+20 DO ENCODE^XLFJSONE(GLBO,"RESULT")
SET RESULT(1)="["_RESULT(1)_"]"
End DoDot:1
QUIT
+21 IF BADLN
Begin DoDot:1
+22 SET @GLBO@("Status")="0^Bad Line Type received in ARG parameter"
+23 DO ENCODE^XLFJSONE(GLBO,"RESULT")
SET RESULT(1)="["_RESULT(1)_"]"
End DoDot:1
QUIT
+24 SET @GLBO@("Status")="1^277STAT MailMan message created"
+25 DO ENCODE^XLFJSONE(GLBO,"RESULT")
SET RESULT(1)="["_RESULT(1)_"]"
+26 KILL @GLBO
+27 QUIT
+28 ;
GETVAL(FLDNAM,OCC) ;;Get the value associated with the field name
+1 if ($GET(FLDNAM)=""!(OCC=""))
QUIT
+2 SET FLDVAL=$GET(ARG(FLDNAM))
+3 ;Translate any '^' to '~' since the lines of the mailman message contain pieces delimited by '^'
+4 FOR
if FLDVAL'[U
QUIT
SET FLDVAL=$PIECE(FLDVAL,U)_"~"_$PIECE(FLDVAL,U,2,999)
+5 ;I $$UP^XLFSTR(FLDNAM)["TESTLIVE" S SUBJ=$S($$UP^XLFSTR(FLDVAL)="LIVE":"MCH",1:"MCT") Q
+6 DO MSGLINE($PIECE(FLDNAM,"."),FLDVAL,OCC)
+7 QUIT
+8 ;
MSGLINE(FLDNAM,FLDVAL,OCC) ;Add data to specified node in message array
+1 ;Each array node corresponds to a unique line in the MailMan message
+2 if $GET(FLDNAM)=""
QUIT
+3 NEW FLDDAT,FLDNUM,I,NODE
+4 FOR I=1:1
SET FLDDAT=$PIECE($TEXT(MAPFLD+I),";;",2)
if FLDDAT=""
QUIT
Begin DoDot:1
+5 if $$UP^XLFSTR(FLDNAM)'=$$UP^XLFSTR($PIECE(FLDDAT,U))
QUIT
+6 SET FLDNUM=$PIECE(FLDDAT,"_",2)
SET NODE=$PIECE(FLDDAT,U,2)
SET NODE=OCC_NODE
if (NODE=""!('FLDNUM))
QUIT
+7 SET $PIECE(MSGARY(NODE),U,FLDNUM)=FLDVAL
End DoDot:1
+8 QUIT
+9 ;
CHKCLM(FLDVAL) ;;
+1 if $GET(FLDVAL)=""
QUIT 0
+2 NEW IBD,IBIFN
+3 SET $PIECE(IBD,U,2)=FLDVAL
+4 DO STRTREC^IBCE277
+5 if 'IBIFN
QUIT 0
+6 QUIT 1
+7 ;
MAIL ;Assemble 277STAT MailMan message and create/send
+1 NEW BILL,GOTLN,LN,MSG,NODE,XMTO,SUBJ
+2 SET GOTLN=0
+3 ;S XMTO("G."_SUBJ)=""
+4 SET XMTO("G.MCH")=""
+5 ;'RACUBOTH RUCH' text needed for conditional in ^IBCESRV
SET LN=$$SETMSG("RACUBOTH RUCH")
+6 SET NODE=""
FOR
SET NODE=$ORDER(MSGARY(NODE))
if (NODE=""!(BADCLM]""!(BADLN)))
QUIT
Begin DoDot:1
+7 IF NODE["LN"
Begin DoDot:2
+8 IF $PIECE(MSGARY(NODE),U)'=$PIECE(NODE,"LN",2)
SET BADLN=1
QUIT
+9 SET BILL=$PIECE(MSGARY(NODE),U,2)
IF '$$CHKCLM(BILL)
SET BADCLM=$SELECT(BILL="":"XX",1:$$GETCLM^IBCE277(BILL))
End DoDot:2
if BADLN!(BADCLM]"")
QUIT
+10 IF NODE["LN10"
DO PARSE(NODE,.LN)
QUIT
+11 SET LN=$$SETMSG(MSGARY(NODE),LN)
End DoDot:1
+12 if BADCLM]""!(BADLN)
QUIT
+13 SET SUBJ="MCH 277STAT "_$SELECT(BILL["-":$PIECE(BILL,"-",2),1:BILL)
+14 SET LN=$$SETMSG("99^$",LN)
SET LN=$$SETMSG("NNNN",LN)
+15 DO SENDMSG^XMXAPI(DUZ,SUBJ,"MSG",.XMTO)
+16 QUIT
+17 ;
SETMSG(DATA,LN) ;Set a line of the MailMan Message and return next line number
+1 if '$GET(LN)
SET LN=1
+2 SET MSG(LN)=$GET(DATA)
SET LN=LN+1
+3 QUIT LN
+4 ;
PARSE(NODE,LN) ;
+1 if ($GET(NODE)=""!('$GET(LN)))
QUIT
+2 NEW I,STATARY,STATMSG,STATLIM,TXT
+3 ;Max characters for "Status Message" field on "10" line
SET STATLIM=200
+4 SET STATMSG=$PIECE(MSGARY(NODE),U,6)
+5 SET TXT=MSGARY(NODE)
+6 IF $LENGTH(STATMSG)'>STATLIM
SET LN=$$SETMSG(TXT,LN)
QUIT
+7 DO FSTRNG^IBJU1(STATMSG,STATLIM,.STATARY)
+8 FOR I=1:1:STATARY
SET $PIECE(TXT,U,6)=STATARY(I)
SET LN=$$SETMSG(TXT,LN)
+9 QUIT
+10 ;
QUIT ; kill switch
+1 SET @GLBO@("Status")="0^277STAT FHIR process turned off...i.e. Kill Switch"
+2 DO ENCODE^XLFJSONE(GLBO,"RESULT")
SET RESULT(1)="["_RESULT(1)_"]"
+3 QUIT
+4 ;
MAPFLD ;RPC_field_name (limit 45 char)^Array_node
+1 ;;HeaderData_1_ReturnMessageId^HDR
+2 ;;HeaderData_2_X12ProprietaryFlag^HDR
+3 ;;HeaderData_3_StatusDate^HDR
+4 ;;HeaderData_4_StatusTime^HDR
+5 ;;HeaderData_5_MRAStatus^HDR
+6 ;;HeaderData_6_TotalNumberClaimsSubmitted^HDR
+7 ;;HeaderData_7_TotalNumberClaimsRejected^HDR
+8 ;;HeaderData_8_TotalChargesSubmitted^HDR
+9 ;;HeaderData_9_TotalChargesRejected^HDR
+10 ;;HeaderData_10_PayerName^HDR
+11 ;;HeaderData_11_PayerId^HDR
+12 ;;HeaderData_12_PayerGenerated^HDR
+13 ;;HeaderData_13_Source^HDR
+14 ;;HeaderData_14_BatchReferenceNumber^HDR
+15 ;;MessageHeader_1_LineType^LN09
+16 ;;MessageHeader_2_BillNumber^LN09
+17 ;;MessageHeader_3_MessageNumber^LN09
+18 ;;MessageHeader_4_ErrorData^LN09
+19 ;;MessageHeader_5_ErrorField^LN09
+20 ;;MessageData_1_LineType^LN10
+21 ;;MessageData_2_BillNumber^LN10
+22 ;;MessageData_3_AcceptRejectCode^LN10
+23 ;;MessageData_4_WarnErrorInfoCode^LN10
+24 ;;MessageData_5_StatusCode^LN10
+25 ;;MessageData_6_StatusMessage^LN10
+26 ;;ClaimData_1_LineType^LN13
+27 ;;ClaimData_2_BillNumber^LN13
+28 ;;ClaimData_3_ClearinghouseTraceNumber^LN13
+29 ;;ClaimData_4_PayerStatusDate^LN13
+30 ;;ClaimData_5_PayerClaimNumber^LN13
+31 ;;ClaimData_6_SplitClaimIndicator^LN13
+32 ;;ClaimData_7_ClaimType^LN13
+33 ;;ClmSvcDtSubscrPatData_1_LineType^LN15
+34 ;;ClmSvcDtSubscrPatData_2_BillNumber^LN15
+35 ;;ClmSvcDtSubscrPatData_3_PatientLastName^LN15
+36 ;;ClmSvcDtSubscrPatData_4_PatientFirstName^LN15
+37 ;;ClmSvcDtSubscrPatData_5_PatientMiddleName^LN15
+38 ;;ClmSvcDtSubscrPatData_6_PatientIdNumber^LN15
+39 ;;ClmSvcDtSubscrPatData_7_SubscriberLastName^LN15
+40 ;;ClmSvcDtSubscrPatData_8_SubscriberFirstName^LN15
+41 ;;ClmSvcDtSubscrPatData_9_SubscriberMiddleName^LN15
+42 ;;ClmSvcDtSubscrPatData_10_SubscriberIdNumber^LN15
+43 ;;ClmSvcDtSubscrPatData_11_FirstServiceDate^LN15
+44 ;;ClmSvcDtSubscrPatData_12_LastServiceDate^LN15
+45 ;
+46 ;277STAT processing will error out if there is a line 20 and/or
+47 ; line 21 in the mailman message (see IBCESRV routine).
+48 ;;ServiceLineStatusData_1_LineType^LN20
+49 ;;ServiceLineStatusData_2_BillNumber^LN20
+50 ;;ServiceLineStatusData_3_AcceptRejectCode^LN20
+51 ;;ServiceLineStatusData_4_WarnErrorInfoCode^LN20
+52 ;;ServiceLineStatusData_5_StatusCode^LN20
+53 ;;ServiceLineStatusData_6_StatusMessage^LN20
+54 ;;ServiceLineStatusData_7_FreeTextMessage^LN20
+55 ;;ServiceLineStatusData_8_ServiceLineNumber^LN20
+56 ;;ServiceLineIdData_1_LineType^LN21
+57 ;;ServiceLineIdData_2_BillNumber^LN21
+58 ;;ServiceLineIdData_3_ServiceLineNumber^LN21
+59 ;;ServiceLineIdData_4_ServiceType^LN21
+60 ;;ServiceLineIdData_5_ServiceCode^LN21
+61 ;;ServiceLineIdData_6_Modifiers^LN21
+62 ;;ServiceLineIdData_7_UnitsOfService^LN21
+63 ;