| 1 | GECSSTTM ;WISC/RFJ-stacker file transmission (multi docs in a msg)  ;08 Dec 93
 | 
|---|
| 2 |  ;;2.0;GCS;**4,5**;MAR 14, 1995
 | 
|---|
| 3 |  Q
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 | TRANSALL ;  transmit code sheets waiting for clock in stack file
 | 
|---|
| 7 |  ;  check for another job transmitting stack code sheets
 | 
|---|
| 8 |  N DA,GECSFQUE
 | 
|---|
| 9 |  L +^GECS(2100.1,"ATRANSMIT"):10 I '$T Q
 | 
|---|
| 10 |  S GECSFQUE=1
 | 
|---|
| 11 |  K ^TMP($J,"GECSSTTR")
 | 
|---|
| 12 |  S DA=0 F  S DA=$O(^GECS(2100.1,"AS","Q",DA)) Q:'DA  D BUILD(DA)
 | 
|---|
| 13 |  D TRANSMIT^GECSSTTT
 | 
|---|
| 14 |  K ^TMP($J,"GECSSTTR")
 | 
|---|
| 15 |  L -^GECS(2100.1,"ATRANSMIT")
 | 
|---|
| 16 |  S ZTREQ="@"
 | 
|---|
| 17 |  Q
 | 
|---|
| 18 |  ;
 | 
|---|
| 19 |  ;
 | 
|---|
| 20 | BUILD(DA) ;  build tmp global for stack entry da
 | 
|---|
| 21 |  ;  $g(gecsfaut)=1 for immediate transmissions
 | 
|---|
| 22 |  I '$D(^GECS(2100.1,DA,0)) Q
 | 
|---|
| 23 |  L +^GECS(2100.1,DA):10 I '$T Q
 | 
|---|
| 24 |  ;
 | 
|---|
| 25 |  N %,BATCHDA,CHECKSUM,DA1,DATA,ENDOFCS,ENDOFMSG,FINDHOLD,GECSFLAG,GECSLPC,HOLDDATE,LINE,SEGMENT,SEQSIZE,SEQUENCE,STACSIZE,X,Y
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  I $E($G(^GECS(2100.1,DA,10,1,0)),1,3)'="CTL" D SETSTAT^GECSSTAA(DA,"E"),ERROR^GECSSTTR(DA,"Control segment/first line of code sheet missing") L -^GECS(2100.1,DA) Q
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 |  S SEGMENT=$P(^GECS(2100.1,DA,0),"^",5)
 | 
|---|
| 30 |  I SEGMENT="" D SETSTAT^GECSSTAA(DA,"E"),ERROR^GECSSTTR(DA,"Segment not defined for entry") L -^GECS(2100.1,DA) Q
 | 
|---|
| 31 |  S (ENDOFCS,ENDOFMSG)=""
 | 
|---|
| 32 |  I $P(SEGMENT,":",2)="FMS" S ENDOFCS="{",ENDOFMSG="}"
 | 
|---|
| 33 |  ;
 | 
|---|
| 34 |  S BATCHDA=+$P($G(^GECS(2101.2,+$O(^GECS(2101.2,"B",SEGMENT,0)),0)),"^",4)
 | 
|---|
| 35 |  I 'BATCHDA D SETSTAT^GECSSTAA(DA,"E"),ERROR^GECSSTTR(DA,"Batch type in file 2101.2 is incorrect") L -^GECS(2100.1,DA) Q
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 |  S GECSLPC=$G(^%ZOSF("LPC")) I GECSLPC="" S GECSLPC="S Y="""""
 | 
|---|
| 38 |  ;  for automatically created docs, check checksum and hold date
 | 
|---|
| 39 |  I $P($G(^GECS(2100.1,DA,0)),"^",6)="A" D  I $G(GECSFLAG) L -^GECS(2100.1,DA) Q
 | 
|---|
| 40 |  .   ;  check hold date greater than today
 | 
|---|
| 41 |  .   S HOLDDATE=$P($G(^GECS(2100.1,DA,11)),"^",3)
 | 
|---|
| 42 |  .   ;  for immediate transmissions, queue code sheet
 | 
|---|
| 43 |  .   I HOLDDATE>DT D:$G(GECSFAUT) SETSTAT^GECSSTAA(DA,"Q") S GECSFLAG=1 Q
 | 
|---|
| 44 |  .   ;  compute checksum and find hold date if not defined
 | 
|---|
| 45 |  .   S CHECKSUM=""
 | 
|---|
| 46 |  .   S DA1=0 F  S DA1=$O(^GECS(2100.1,DA,10,DA1)) Q:'DA1  S DATA=$G(^(DA1,0)) D  Q:$G(GECSFLAG)
 | 
|---|
| 47 |  .   .   I 'HOLDDATE I $E($P(DATA,"^"),3)=2!($P(DATA,"^")="AT1") S FINDHOLD=$$HOLDDATE^GECSSTTR(DATA) I FINDHOLD S $P(^GECS(2100.1,DA,11),"^",3)=FINDHOLD,GECSFLAG=1 Q
 | 
|---|
| 48 |  .   .   S X=CHECKSUM_DATA X GECSLPC S CHECKSUM=Y
 | 
|---|
| 49 |  .   ;  for immediate transmissions, queue code sheet
 | 
|---|
| 50 |  .   I $G(GECSFLAG) D:$G(GECSFAUT) SETSTAT^GECSSTAA(DA,"Q") Q
 | 
|---|
| 51 |  .   ;  compare checksums
 | 
|---|
| 52 |  .   S X=$P($G(^GECS(2100.1,DA,11)),"^",2) I X="" Q
 | 
|---|
| 53 |  .   I X'=CHECKSUM D SETSTAT^GECSSTAA(DA,"E"),ERROR^GECSSTTR(DA,"Code sheet has been altered since creation") S GECSFLAG=1
 | 
|---|
| 54 |  ;
 | 
|---|
| 55 |  ;  change transmission date on ctl segment
 | 
|---|
| 56 |  S ^GECS(2100.1,DA,10,1,0)=$$CTLDATE^GECSSTTR(^GECS(2100.1,DA,10,1,0))
 | 
|---|
| 57 |  ;
 | 
|---|
| 58 |  ;  fit code sheet in a sequence number if possible
 | 
|---|
| 59 |  S STACSIZE=$P($G(^GECS(2100.1,DA,11)),"^")
 | 
|---|
| 60 |  I STACSIZE>30000 D MULTIPLE L -^GECS(2100.1,DA) Q
 | 
|---|
| 61 |  S SEQUENCE=0 F  S SEQUENCE=$O(^TMP($J,"GECSSTTR","SIZE",SEQUENCE)) Q:'SEQUENCE  S SEQSIZE=^(SEQUENCE) I ($P(SEQSIZE,"^")+STACSIZE)<30000,^TMP($J,"GECSSTTR","BATCH",SEQUENCE)=BATCHDA Q
 | 
|---|
| 62 |  ;  create a new sequence
 | 
|---|
| 63 |  I 'SEQUENCE D SEQUENCE S SEQSIZE="0^0"
 | 
|---|
| 64 |  ;
 | 
|---|
| 65 |  ;  recompute checksum with new transmission date and time on ctl segment
 | 
|---|
| 66 |  S LINE=$P(SEQSIZE,"^",2),CHECKSUM=""
 | 
|---|
| 67 |  S DA1=0 F  S DA1=$O(^GECS(2100.1,DA,10,DA1)) Q:'DA1  S DATA=$G(^(DA1,0)) I DATA'="" D
 | 
|---|
| 68 |  .   S LINE=LINE+1,^TMP($J,"GECSSTTR","CS",SEQUENCE,LINE,0)=DATA
 | 
|---|
| 69 |  .   S X=CHECKSUM_DATA X GECSLPC S CHECKSUM=Y
 | 
|---|
| 70 |  .   ;  check for last code sheet in stack entry
 | 
|---|
| 71 |  .   I '$O(^GECS(2100.1,DA,10,DA1)),$L($G(ENDOFCS)) D  Q
 | 
|---|
| 72 |  .   .   I DATA'[ENDOFCS S DATA=DATA_ENDOFCS
 | 
|---|
| 73 |  .   .   S ^TMP($J,"GECSSTTR","CS",SEQUENCE,LINE,0)=DATA
 | 
|---|
| 74 |  ;
 | 
|---|
| 75 |  ;  store new checksum
 | 
|---|
| 76 |  S $P(^GECS(2100.1,DA,11),"^",2)=CHECKSUM
 | 
|---|
| 77 |  ;
 | 
|---|
| 78 |  D ENDSEQ($P(SEQSIZE,"^")+STACSIZE,LINE)
 | 
|---|
| 79 |  L -^GECS(2100.1,DA)
 | 
|---|
| 80 |  Q
 | 
|---|
| 81 |  ;
 | 
|---|
| 82 |  ;
 | 
|---|
| 83 | MULTIPLE ;  code sheet is larger than 30k, create multiple msgs
 | 
|---|
| 84 |  D SEQUENCE
 | 
|---|
| 85 |  N %,COUNT,SIZE,STRTSEQ,MAILMSGS
 | 
|---|
| 86 |  S STRTSEQ=SEQUENCE
 | 
|---|
| 87 |  S MAILMSGS=1,(LINE,SIZE)=0,CHECKSUM=""
 | 
|---|
| 88 |  S DA1=0 F  S DA1=$O(^GECS(2100.1,DA,10,DA1)) Q:'DA1  S DATA=$G(^(DA1,0)) I DATA'="" D
 | 
|---|
| 89 |  .   S LINE=LINE+1,^TMP($J,"GECSSTTR","CS",SEQUENCE,LINE,0)=DATA
 | 
|---|
| 90 |  .   S X=CHECKSUM_DATA X GECSLPC S CHECKSUM=Y
 | 
|---|
| 91 |  .   ;  check for last code sheet in stack entry
 | 
|---|
| 92 |  .   I '$O(^GECS(2100.1,DA,10,DA1)),$L($G(ENDOFCS)) D  Q
 | 
|---|
| 93 |  .   .   I DATA'[ENDOFCS S DATA=DATA_ENDOFCS
 | 
|---|
| 94 |  .   .   S ^TMP($J,"GECSSTTR","CS",SEQUENCE,LINE,0)=DATA
 | 
|---|
| 95 |  .   S SIZE=SIZE+$L(DATA)
 | 
|---|
| 96 |  .   I SIZE>30000 D
 | 
|---|
| 97 |  .   .   I $L($G(ENDOFMSG)),DATA'[ENDOFMSG S ^TMP($J,"GECSSTTR","CS",SEQUENCE,LINE,0)=DATA_ENDOFMSG
 | 
|---|
| 98 |  .   .   D ENDSEQ(SIZE,LINE),SEQUENCE S MAILMSGS=MAILMSGS+1,LINE=2,SIZE=0
 | 
|---|
| 99 |  ;
 | 
|---|
| 100 |  ;  store new checksum
 | 
|---|
| 101 |  S $P(^GECS(2100.1,DA,11),"^",2)=CHECKSUM
 | 
|---|
| 102 |  ;
 | 
|---|
| 103 |  ;  modify sequence count
 | 
|---|
| 104 |  S DATA=^GECS(2100.1,DA,10,1,0),$P(DATA,"^",13)=$E("000",$L(MAILMSGS)+1,3)_MAILMSGS
 | 
|---|
| 105 |  S COUNT=1 F %=STRTSEQ:1 Q:'$D(^TMP($J,"GECSSTTR","CS",%))  S $P(DATA,"^",12)=$E("000",$L(COUNT)+1,3)_COUNT,^TMP($J,"GECSSTTR","CS",%,1,0)=DATA,COUNT=COUNT+1
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 |  ;  send size=30001 to prevent other code sheets from being added
 | 
|---|
| 108 |  D ENDSEQ(30001,LINE)
 | 
|---|
| 109 |  Q
 | 
|---|
| 110 |  ;
 | 
|---|
| 111 |  ;
 | 
|---|
| 112 | ENDSEQ(SIZE,LINE) ;  set end sequence control in tmp  
 | 
|---|
| 113 |  ;  size=size of code sheet; line=last line of sequence
 | 
|---|
| 114 |  N %
 | 
|---|
| 115 |  S ^TMP($J,"GECSSTTR","SIZE",SEQUENCE)=SIZE_"^"_LINE
 | 
|---|
| 116 |  S ^TMP($J,"GECSSTTR","LIST",SEQUENCE,DA)=""
 | 
|---|
| 117 |  S ^TMP($J,"GECSSTTR","BATCH",SEQUENCE)=BATCHDA
 | 
|---|
| 118 |  S %=$G(^TMP($J,"GECSSTTR","SEGS",SEQUENCE)) I %[$P(SEGMENT,":") Q
 | 
|---|
| 119 |  S ^TMP($J,"GECSSTTR","SEGS",SEQUENCE)=%_$S(%="":"",1:",")_$P(SEGMENT,":")
 | 
|---|
| 120 |  Q
 | 
|---|
| 121 |  ;
 | 
|---|
| 122 |  ;
 | 
|---|
| 123 | SEQUENCE ;  return next sequence number
 | 
|---|
| 124 |  S SEQUENCE=$G(^TMP($J,"GECSSTTR","SEQ"))+1,^TMP($J,"GECSSTTR","SEQ")=SEQUENCE
 | 
|---|
| 125 |  Q
 | 
|---|