1 | PRSDSERV ;WOIFO/MGD,PLT - PAID DOWNLOAD MESSAGE SERVER ;12/3/07
|
---|
2 | ;;4.0;PAID;**6,78,82,116**;Sep 21, 1995;Build 23
|
---|
3 | ;;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
4 | D NOW^%DTC S TIME=% S XMPOS=1 D REC^XMS3 G:XMER'=0 EXIT
|
---|
5 | S LPE=$E(XMRG,1,7) I LPE'?1"**"2N1"PDH",LPE'="****PDH" G EXIT
|
---|
6 | ; EMPCNT = # emp in this mail message
|
---|
7 | ; SEQNUM = Mail message sequence number if more than one message
|
---|
8 | S EMPCNT=+$E(XMRG,9,12),SEQNUM=$E(XMRG,13,16),TYPE=$E(XMRG,23)
|
---|
9 | S DATE=$E(XMRG,24,31),STA="",SUB="TMP"
|
---|
10 | I "IEPTD"'[TYPE G EXIT
|
---|
11 | ; Check to see if the message was previously loaded
|
---|
12 | I $D(^PRSD(450.12,"B",XMZ)) G EXIT
|
---|
13 | S MTYPE=$S(TYPE="I":"Initial",TYPE="E":"Edit & Update",TYPE="P":"Payrun",TYPE="T":"Transfer",1:"")
|
---|
14 | ; Set Lines Per Employee (LPE) for the correct interface
|
---|
15 | S LPE=$E(LPE,3,4),LPE=$S(LPE?2N:+LPE,TYPE="I":20,(TYPE="E")!(TYPE="T"):15,TYPE="P":9,1:0)
|
---|
16 | D REC^XMS3 G:XMER'=0 EXIT S STA=$E(XMRG,1,3) I STA'?3N G EXIT
|
---|
17 | I TYPE="D" D ^PRSDDL G EXIT ; Process Separation download
|
---|
18 | ; Mark message as received. This info is for the reports sent to the
|
---|
19 | ; PAD mail group.
|
---|
20 | I $D(^XTMP("PRS","MNR",TYPE,DATE,STA,SEQNUM)) D G EXIT
|
---|
21 | .S ^TMP($J,"PRSD",999)=MTYPE_" message "_SEQNUM_" received."
|
---|
22 | .D SETPRS S MNR="" D PROC^PRSDPROC
|
---|
23 | I $D(^PRSD(450.12,"C",TYPE_"-"_DATE_"-"_STA_"-"_SEQNUM)) G EXIT
|
---|
24 | K DD,DO S DIC="^PRSD(450.12,",DIC(0)="L",X=XMZ D FILE^DICN
|
---|
25 | S PRSDIEN=+Y,$P(^PRSD(450.12,+Y,0),U,2)=TYPE_"-"_DATE_"-"_STA_"-"_SEQNUM
|
---|
26 | S $P(^PRSD(450.12,+Y,0),U,3)="R",$P(^PRSD(450.12,+Y,0),U,4)=TIME
|
---|
27 | S ^PRSD(450.12,"C",TYPE_"-"_DATE_"-"_STA_"-"_SEQNUM,+Y)=""
|
---|
28 | SETPRS ;start employee record
|
---|
29 | S XMPOS=2 F A=1:1:EMPCNT D SSNLOOP Q:SSN=999999999
|
---|
30 | I $D(^XTMP("PRS","MNR",TYPE,DATE,STA,SEQNUM)) K ^XTMP("PRS","MNR",TYPE,DATE,STA,SEQNUM) Q
|
---|
31 | S:SSN'=999999999 $P(^PRSD(450.12,PRSDIEN,0),U,3)="S"
|
---|
32 | EXIT K %,%H,%I,A,AA,AAA,ADDFLG,B,BB,CC,DA,DATA,DATE,DBNAME,DIC,DIK,DINUM
|
---|
33 | K DLAYGO,DLID,E1,E2,EE,ECNT,ECOUNT,EMPCNT,ERRCNT,ERRFLG,ERRID,ERRIEN,SUB
|
---|
34 | K ERRMSG,FLD,FLDNUM,GNUM,GRP,GRPVAL,IEN,II,LPE,LTH,MO,MFLD,MTYPE,MULT
|
---|
35 | K NAME,NODE,NODE459,PIC,PIECE,PIECE459,PP,PP455,PPIEN,PRSD,PRSDIEN,RCD
|
---|
36 | K RTN,RTNNUM,RTYPE,SEQNUM,SSN,SSNLINE,STA,STA450,SUM,TMPIEN,TMPLINE
|
---|
37 | K TIME,TYPE,X,XCNP,XMDUZ,XMSUB,XMTEXT,XMY,Y,YR,XMPOS,XMRG,XMER,XMLOC
|
---|
38 | K XMMG,MNR,PDATE,CDATE,X1,X2
|
---|
39 | REMSB I $D(XMZ) S XMSER="S.PRSD" D REMSBMSG^XMA1C K XMSER
|
---|
40 | Q
|
---|
41 | SSNLOOP D REC^XMS3
|
---|
42 | S SSN=$S(TYPE="I":$P(XMRG,":",2),1:$E(XMRG,4,12))
|
---|
43 | S SSN=$E("000000000",$L(SSN)+1,9)_SSN
|
---|
44 | ; The last employee in the last MailMan message has a SSN=999999999
|
---|
45 | ; This triggers the software to begin processing the download.
|
---|
46 | I SSN=999999999 D Q
|
---|
47 | .I TYPE="I" K ^XTMP("PRS","ERR")
|
---|
48 | .S ^XTMP("PRS","LSN",TYPE,DATE,STA)=SEQNUM
|
---|
49 | .S:$D(PRSDIEN) $P(^PRSD(450.12,PRSDIEN,0),U,3)="S" H 600
|
---|
50 | .D REMSB S ECNT=0 D START,START,^PRSDERR,^PRSDSTAT S SSN=999999999
|
---|
51 | S (PDATE,CDATE)=$P(TIME,".",1),X1=PDATE,X2=90 D C^%DTC S PDATE=X
|
---|
52 | S ^XTMP("PRS",0)=PDATE_"^"_CDATE
|
---|
53 | K KFLG S XMPOS=XMPOS-1
|
---|
54 | F B=1:1:LPE D REC^XMS3 I (($L(XMRG,":")-1)'=$L(XMRG))!(TYPE="I") S TMPLINE=$E("000",$L(XMPOS)+1,3)_XMPOS,^XTMP("PRS",SUB,DATE,TYPE,STA,SSN,XMZ_"-"_TMPLINE_"-"_B)=XMRG I TYPE="T",B=6 D TRANSCK^PRSDERR
|
---|
55 | I $D(KFLG) K ^XTMP("PRS",SUB,DATE,TYPE,STA,SSN),KFLG
|
---|
56 | Q
|
---|
57 | START ; Process download
|
---|
58 | ; RTYPE is used to determine which series of routines to call to
|
---|
59 | ; process the download
|
---|
60 | S SSN="",RTYPE=$S(TYPE="I":"LD",(TYPE="E")!(TYPE="T"):"EU",TYPE="P":"PR",1:"")
|
---|
61 | F S SSN=$O(^XTMP("PRS",SUB,DATE,TYPE,STA,SSN)) Q:SSN="" D
|
---|
62 | . L +^XTMP("PRS",SUB,DATE,TYPE,STA,SSN):0
|
---|
63 | . I $T D
|
---|
64 | . . S TMPIEN=$O(^XTMP("PRS",SUB,DATE,TYPE,STA,SSN,""))
|
---|
65 | . . I TMPIEN'="" D
|
---|
66 | . . . S RCD=^(TMPIEN),ERRFLG=""
|
---|
67 | . . . D SSN
|
---|
68 | . . . D:ERRFLG'="Y" LDINIT,PROC,PROC2,LDFNL,LDCMP
|
---|
69 | . . . D:ERRFLG="Y" TMPERR D UNL
|
---|
70 | Q
|
---|
71 | ; Piece together the routine name and call the routine
|
---|
72 | PROC S TMPIEN="" F S TMPIEN=$O(^XTMP("PRS",SUB,DATE,TYPE,STA,SSN,TMPIEN)) Q:TMPIEN="" S RCD=^XTMP("PRS",SUB,DATE,TYPE,STA,SSN,TMPIEN),RTNNUM=$P(TMPIEN,"-",3) S:$L(RTNNUM)=1 RTNNUM=0_RTNNUM S RTN="^PRSD"_RTYPE_RTNNUM D:$T(@RTN)]"" @RTN
|
---|
73 | Q
|
---|
74 | PROC2 I TYPE="P",PP'="" D ^PRSDCOMP ;Compute calculated fields
|
---|
75 | S NODE=0 F EE=1:1 S NODE=$O(^PRSPC(IEN,NODE)) Q:NODE="" I $D(^PRSPC(IEN,NODE))#2 S DATA=^PRSPC(IEN,NODE) I $L(DATA,U)-1=$L(DATA) K ^PRSPC(IEN,NODE)
|
---|
76 | K ^XTMP("PRS",SUB,DATE,TYPE,STA,SSN) Q
|
---|
77 | TMPERR I TYPE="P",PP="" G TMPERR1
|
---|
78 | S TMPIEN="" F S TMPIEN=$O(^XTMP("PRS",SUB,DATE,TYPE,STA,SSN,TMPIEN)) Q:TMPIEN="" S RCD=^XTMP("PRS",SUB,DATE,TYPE,STA,SSN,TMPIEN),^XTMP("PRS","ERR",DATE,TYPE,STA,SSN,TMPIEN)=RCD
|
---|
79 | TMPERR1 K ^XTMP("PRS",SUB,DATE,TYPE,STA,SSN) Q
|
---|
80 | UNL L -^XTMP("PRS",SUB,DATE,TYPE,STA,SSN) Q
|
---|
81 | SSN I TYPE="P",'$D(^PRSPC("SSN",SSN)) S ERRMSG="SSN "_$E(SSN,1,3)_"-"_$E(SSN,4,5)_"-"_$E(SSN,6,9)_" not found" D ERR Q
|
---|
82 | I TYPE="I" S NAME=$P(RCD,":",4)
|
---|
83 | I (TYPE="E")!(TYPE="T") S NAME=$P(RCD,":",2),DATA=$E(NAME,1,27) I DATA'="" D RTS^PRSDUTIL S NAME=DATA S:TYPE="T" ^TMP($J,"PRS",NAME,SSN)=""
|
---|
84 | I '$D(^PRSPC("SSN",SSN)) D ^PRSDADD K DA,DIE,DR,OLDSSN,VAIEN,VANAME Q:ERRFLG="Y" G SSNOUT
|
---|
85 | S IEN=0,IEN=$O(^PRSPC("SSN",SSN,IEN))
|
---|
86 | SSNOUT I TYPE="P" D ^PRSDPTYP I PP="" S ERRFLG="Y" Q
|
---|
87 | S ECNT=ECNT+1
|
---|
88 | Q
|
---|
89 | ERR K DD,DO S DIC="^PRSD(450.11,",DIC(0)="L",X=TYPE_"-"_DATE_"-"_STA D FILE^DICN I Y>0 S $P(^PRSD(450.11,+Y,0),U,3)=ERRMSG
|
---|
90 | S ERRFLG="Y"
|
---|
91 | Q
|
---|
92 | LDINIT ; Load Initial Labor Distribution Values
|
---|
93 | S LDINIT=$$LDLOAD()
|
---|
94 | Q
|
---|
95 | LDFNL ; Load Final Labor Distribution Values
|
---|
96 | S LDFNL=$$LDLOAD()
|
---|
97 | Q
|
---|
98 | LDLOAD() ; Retrieve current Labor Distribution Values from #450
|
---|
99 | ;
|
---|
100 | N LD,LDCC,LDCODE,LDFCP,LDPCT,PRSLD
|
---|
101 | S LD=""
|
---|
102 | F PRSLD=1:1:4 D
|
---|
103 | . S LDCODE=$$GET1^DIQ(450.0757,PRSLD_","_IEN,1)
|
---|
104 | . S LDPCT=$$GET1^DIQ(450.0757,PRSLD_","_IEN,2)
|
---|
105 | . S LDCC=$$GET1^DIQ(450.0757,PRSLD_","_IEN,3)
|
---|
106 | . S LDFCP=$$GET1^DIQ(450.0757,PRSLD_","_IEN,4)
|
---|
107 | . S LD=LD_LDCODE_U_LDPCT_U_LDCC_U_LDFCP_U
|
---|
108 | Q LD
|
---|
109 | ;
|
---|
110 | LDCMP ; Compare Initial and Final Labor Distribution for changes
|
---|
111 | ; and update audit trail in #458 if necessary.
|
---|
112 | Q:LDINIT=LDFNL
|
---|
113 | N PPA,I,IENS,IENS1,INDX,J,LDA,PRSFDA,TLDPER
|
---|
114 | ; Get IEN for current Pay Period
|
---|
115 | S PPA=$P($G(^PRST(458,"AD",$P(TIME,".",1))),U,1)
|
---|
116 | Q:PPA=""
|
---|
117 | ;
|
---|
118 | ; Get next multiple number
|
---|
119 | S LDA="A",LDA=$O(^PRST(458,PPA,"E",IEN,"LDAUD",LDA),-1)
|
---|
120 | S LDA=$S(LDA>0:LDA+1,1:1)
|
---|
121 | ;
|
---|
122 | ; Set Audit information into #450
|
---|
123 | S DA=IEN,DIE="^PRSPC("
|
---|
124 | S DR="755///^S X=$O(^VA(200,""B"",""CENTRAL,PAID"",0))"
|
---|
125 | D ^DIE
|
---|
126 | S DR="755.1///^S X=TYPE"
|
---|
127 | D ^DIE
|
---|
128 | S DR="756///^S X=TIME"
|
---|
129 | D ^DIE
|
---|
130 | ;
|
---|
131 | ; If there is no entry for this employee in the Pay Period, create
|
---|
132 | ; a record for them
|
---|
133 | I '$D(^PRSPC(458,PPA,"E",IEN)) D
|
---|
134 | . S IENS=","_PPA_","
|
---|
135 | . S PRSFDA(458.01,"?+1"_IENS,.01)=IEN
|
---|
136 | . D UPDATE^DIE("","PRSFDA")
|
---|
137 | ;
|
---|
138 | ; Set LD AUDIT record into #458.1105
|
---|
139 | S IENS=","_IEN_IENS
|
---|
140 | K PRSFDA
|
---|
141 | S PRSFDA(458.1105,"?+1"_IENS,.01)=LDA
|
---|
142 | S PRSFDA(458.1105,"?+1"_IENS,1)=TIME
|
---|
143 | S PRSFDA(458.1105,"?+1"_IENS,2)=$O(^VA(200,"B","CENTRAL PAID",0))
|
---|
144 | S PRSFDA(458.1105,"?+1"_IENS,3)=TYPE
|
---|
145 | D UPDATE^DIE("","PRSFDA")
|
---|
146 | ;
|
---|
147 | ; Central PAID only sends LD fields that have changed. Run check on
|
---|
148 | ; percentages and delete all LD fields in #450 after 99% has been reached
|
---|
149 | S TLDPER=0
|
---|
150 | F I=0:1:3 S TLDPER=TLDPER+$P(LDFNL,U,I*4+2) Q:TLDPER'<.99
|
---|
151 | S J=(I+1)*4+1 ; Set counter for LDINIT
|
---|
152 | F J=J:1:16 S $P(LDINIT,U,J)=""
|
---|
153 | S I=I+2 ; Adjust counter for deletion of multiples
|
---|
154 | K PRSFDA
|
---|
155 | S DA(1)=IEN
|
---|
156 | F I=I:1:4 D
|
---|
157 | . S DA=I,DIK="^PRSPC("_DA(1)_",""LD"","
|
---|
158 | . D ^DIK
|
---|
159 | ;
|
---|
160 | ; Set LABOR DISTRIBUTION (Multiple-458.11054)
|
---|
161 | S LD=$O(^PRST(458,PPA,"E",IEN,"LDAUD",0))
|
---|
162 | F PRSLD=0:1:3 D
|
---|
163 | . S J=PRSLD+1
|
---|
164 | . S IENS1="+"_J_","_LD_IENS
|
---|
165 | . ; Don't record empty multiples
|
---|
166 | . Q:$P(LDINIT,U,PRSLD*4+2)="" ; PERCENT
|
---|
167 | . K PRSFDA
|
---|
168 | . S PRSFDA(458.11054,IENS1,.01)=PRSLD+1
|
---|
169 | . S PRSFDA(458.11054,IENS1,1)=$P(LDINIT,U,PRSLD*4+1) ; CODE
|
---|
170 | . S PRSFDA(458.11054,IENS1,2)=$P(LDINIT,U,PRSLD*4+2) ; PERCENT
|
---|
171 | . S PRSFDA(458.11054,IENS1,3)=$P(LDINIT,U,PRSLD*4+3) ; COST CENTER
|
---|
172 | . S PRSFDA(458.11054,IENS1,4)=$P(LDINIT,U,PRSLD*4+4) ; FUND CTRL PT
|
---|
173 | . D UPDATE^DIE("","PRSFDA")
|
---|
174 | K LDINIT,LDFNL
|
---|
175 | Q
|
---|