SCAPMC8C ;BP/DJB - Convert Practitioners List to PCP/AP ; 8/4/00 2:28pm
 ;;5.3;Scheduling;**177,224**;AUG 13, 1993
 ;;1.0
 ;
PRTPC(SCTP,SCDATES,SCLIST,SCERR,SCALLHIS,ADJUSTDT) ;Convert list of providers
 ;for a position, to a list of PROV-U/PROV-P/PRECs.
 ;       PROV-U - Unprecepted provider  (PCP)
 ;       PROV-P - Precepted provider    (AP)
 ;       PREC   - Preceptor             (PCP)
 ;
 ; Input:
 ;  SCTP    - IEN of TEAM POSITION [required]
 ;  SCDATES - See PRTP^SCAPMC8
 ;  SCLIST  - Array NAME for output
 ;  SCERR   - Array NAME to store error messages.
 ;            Example: ^TMP("ORXX",$J).
 ; SCALLHIS - 1: Return unfiltered sub-array in SCLIST
 ; ADJUSTDT - 1:Adjust Start/End dates if provider if is both
 ;              precepted & unprecepted for different times periods.
 ;
 ;Output:
 ;  SCLIST(scn,"PROV-U"/"PROV-P"/"PREC",n) = array of practitioners
 ;            Format: See PRTP^SCAPMC8
 ;  SCERR() - See PRTP^SCAPMC8
 ;
 ;Returned: 1 if ok, 0 if error
 ;
 NEW RESULT,PRTPC
 ;
 S ADJUSTDT=$G(ADJUSTDT)
 ;
 ;Get list of practioners for a team position.
 S RESULT=$$PRTP^SCAPMC(.SCTP,.SCDATES,"PRTPC",.SCERR,1,.SCALLHIS)
 I 'RESULT G QUIT
 I '$D(PRTPC(0)) G QUIT
 ;
 D ADJUST ;Process returned array
QUIT Q RESULT
 ;
ADJUST ;Convert returned array to PROV-P/PROV-U/PREC array.
 ;Adjust Start/End dates if provider is both precepted & unprecepted.
 ;
 NEW DATA,DATA1,ID,NUM,NUM1
 NEW ADJEDATE,ADJSDATE,EDATE,SDATE,SDATE1
 ;
 ;Loop thru array
 S NUM=0
 F  S NUM=$O(PRTPC(NUM)) Q:'NUM  D  ;
 . KILL SDATE ;Initialize SDATE array
 . S DATA=$G(PRTPC(NUM))
 . ;If no preceptor nodes set PCP node.
 . ;Place a zero in "404.53 IEN" subscript.
 . S ID=$P(DATA,U,11)_"-0-PCP"
 . I '$D(PRTPC(NUM,"PR")) S @SCLIST@(NUM,"PROV-U",ID)=DATA Q
 . S SDATE=$P(DATA,U,9) ;...Position History Start Date
 . S EDATE=$P(DATA,U,10) ;..Position History End Date
 . ;
 . ;Loop thru "PR" nodes to find preceptor
 . S NUM1=0
 . F  S NUM1=$O(PRTPC(NUM,"PR",NUM1)) Q:'NUM1  D  ;
 . . S DATA1=$G(PRTPC(NUM,"PR",NUM1))
 . . ;Compare piece 9 & piece 14. Use later date.
 . . ;   Piece 9  - Date provider assigned
 . . ;   Piece 14 - Date position assigned.
 . . S SDATE1=$P(DATA1,U,9)
 . . I $P(DATA1,U,14)>SDATE1 S SDATE1=$P(DATA1,U,14)
 . . ;Set temp array to later find earliest preceptor Start Date.
 . . ;
 . . ;alb/rpm;Patch 224;Filter preceptors outside requested date range
 . . Q:'$$DTCHK^SCAPU1(@SCDATES@("BEGIN"),@SCDATES@("END"),0,SDATE1,$P(DATA1,U,10))
 . . ;
 . . I SDATE1 S SDATE(SDATE1)=""
 . . ;
 . . ;Set preceptor as PCP.
 . . S ID=$P(DATA1,U,11)_"-"_$P(DATA1,U,16)_"-PCP"
 . . S @SCLIST@(NUM,"PREC",ID)=DATA1
 . . Q
 . ;Get earliest preceptor Start Date
 . S SDATE1=$O(SDATE(0))
 . ;
 . ;If position date is not earlier than preceptor date, it's all AP.
 . S ID=$P(DATA,U,11)_"-0-AP"
 . I SDATE'<SDATE1 S @SCLIST@(NUM,"PROV-P",ID)=DATA Q
 . ;
 . ;If postion Start/End Dates are both earlier than preceptor date,
 . ;then it's all PCP.
 . S ID=$P(DATA,U,11)_"-0-PCP"
 . I EDATE,EDATE<SDATE1 S @SCLIST@(NUM,"PROV-U",ID)=DATA Q
 . ;
 . ;Set PCP and AP portions
 . ;
 . ;Set PCP portion
 . S ID=$P(DATA,U,11)_"-0-PCP"
 . S ADJSDATE=SDATE ;.....................Adjusted Start Date
 . S ADJEDATE=$$FMADD^XLFDT(SDATE1,-1) ;..Adjusted End Date
 . I ADJUSTDT S $P(DATA,U,10)=ADJEDATE ;..Adjust End Date
 . D  ;After AP/PCP split, recheck Start/End Dates.
 . . I ADJSDATE,ADJSDATE>@SCDATES@("END") Q  ;
 . . I ADJEDATE,ADJEDATE<@SCDATES@("BEGIN") Q  ;
 . . S @SCLIST@(NUM,"PROV-U",ID)=DATA
 . ;
 . ;Set AP portion
 . S ID=$P(DATA,U,11)_"-0-AP"
 . S ADJSDATE=SDATE1 ;..Adjusted Start Date
 . I $P(DATA,U,15),$P(DATA,U,15)<EDATE S EDATE=$P(DATA,U,15)
 . S ADJEDATE=EDATE ;...Adjusted End Date
 . I ADJUSTDT D  ;......Adjust Start/End dates
 . . S $P(DATA,U,9)=ADJSDATE
 . . S $P(DATA,U,10)=ADJEDATE
 . D  ;After AP/PCP split, recheck Start/End Dates.
 . . I ADJSDATE,ADJSDATE>@SCDATES@("END") Q  ;
 . . I ADJEDATE,ADJEDATE<@SCDATES@("BEGIN") Q  ;
 . . S @SCLIST@(NUM,"PROV-P",ID)=DATA
 ;
 Q
 
--- Routine Detail   --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HSCAPMC8C   4106     printed  Sep 23, 2025@20:14:34                                                                                                                                                                                                    Page 2
SCAPMC8C  ;BP/DJB - Convert Practitioners List to PCP/AP ; 8/4/00 2:28pm
 +1       ;;5.3;Scheduling;**177,224**;AUG 13, 1993
 +2       ;;1.0
 +3       ;
PRTPC(SCTP,SCDATES,SCLIST,SCERR,SCALLHIS,ADJUSTDT) ;Convert list of providers
 +1       ;for a position, to a list of PROV-U/PROV-P/PRECs.
 +2       ;       PROV-U - Unprecepted provider  (PCP)
 +3       ;       PROV-P - Precepted provider    (AP)
 +4       ;       PREC   - Preceptor             (PCP)
 +5       ;
 +6       ; Input:
 +7       ;  SCTP    - IEN of TEAM POSITION [required]
 +8       ;  SCDATES - See PRTP^SCAPMC8
 +9       ;  SCLIST  - Array NAME for output
 +10      ;  SCERR   - Array NAME to store error messages.
 +11      ;            Example: ^TMP("ORXX",$J).
 +12      ; SCALLHIS - 1: Return unfiltered sub-array in SCLIST
 +13      ; ADJUSTDT - 1:Adjust Start/End dates if provider if is both
 +14      ;              precepted & unprecepted for different times periods.
 +15      ;
 +16      ;Output:
 +17      ;  SCLIST(scn,"PROV-U"/"PROV-P"/"PREC",n) = array of practitioners
 +18      ;            Format: See PRTP^SCAPMC8
 +19      ;  SCERR() - See PRTP^SCAPMC8
 +20      ;
 +21      ;Returned: 1 if ok, 0 if error
 +22      ;
 +23       NEW RESULT,PRTPC
 +24      ;
 +25       SET ADJUSTDT=$GET(ADJUSTDT)
 +26      ;
 +27      ;Get list of practioners for a team position.
 +28       SET RESULT=$$PRTP^SCAPMC(.SCTP,.SCDATES,"PRTPC",.SCERR,1,.SCALLHIS)
 +29       IF 'RESULT
               GOTO QUIT
 +30       IF '$DATA(PRTPC(0))
               GOTO QUIT
 +31      ;
 +32      ;Process returned array
           DO ADJUST
QUIT       QUIT RESULT
 +1       ;
ADJUST    ;Convert returned array to PROV-P/PROV-U/PREC array.
 +1       ;Adjust Start/End dates if provider is both precepted & unprecepted.
 +2       ;
 +3        NEW DATA,DATA1,ID,NUM,NUM1
 +4        NEW ADJEDATE,ADJSDATE,EDATE,SDATE,SDATE1
 +5       ;
 +6       ;Loop thru array
 +7        SET NUM=0
 +8       ;
           FOR 
               SET NUM=$ORDER(PRTPC(NUM))
               if 'NUM
                   QUIT 
               Begin DoDot:1
 +9       ;Initialize SDATE array
                   KILL SDATE
 +10               SET DATA=$GET(PRTPC(NUM))
 +11      ;If no preceptor nodes set PCP node.
 +12      ;Place a zero in "404.53 IEN" subscript.
 +13               SET ID=$PIECE(DATA,U,11)_"-0-PCP"
 +14               IF '$DATA(PRTPC(NUM,"PR"))
                       SET @SCLIST@(NUM,"PROV-U",ID)=DATA
                       QUIT 
 +15      ;...Position History Start Date
                   SET SDATE=$PIECE(DATA,U,9)
 +16      ;..Position History End Date
                   SET EDATE=$PIECE(DATA,U,10)
 +17      ;
 +18      ;Loop thru "PR" nodes to find preceptor
 +19               SET NUM1=0
 +20      ;
                   FOR 
                       SET NUM1=$ORDER(PRTPC(NUM,"PR",NUM1))
                       if 'NUM1
                           QUIT 
                       Begin DoDot:2
 +21                       SET DATA1=$GET(PRTPC(NUM,"PR",NUM1))
 +22      ;Compare piece 9 & piece 14. Use later date.
 +23      ;   Piece 9  - Date provider assigned
 +24      ;   Piece 14 - Date position assigned.
 +25                       SET SDATE1=$PIECE(DATA1,U,9)
 +26                       IF $PIECE(DATA1,U,14)>SDATE1
                               SET SDATE1=$PIECE(DATA1,U,14)
 +27      ;Set temp array to later find earliest preceptor Start Date.
 +28      ;
 +29      ;alb/rpm;Patch 224;Filter preceptors outside requested date range
 +30                       if '$$DTCHK^SCAPU1(@SCDATES@("BEGIN"),@SCDATES@("END"),0,SDATE1,$PIECE(DATA1,U,10))
                               QUIT 
 +31      ;
 +32                       IF SDATE1
                               SET SDATE(SDATE1)=""
 +33      ;
 +34      ;Set preceptor as PCP.
 +35                       SET ID=$PIECE(DATA1,U,11)_"-"_$PIECE(DATA1,U,16)_"-PCP"
 +36                       SET @SCLIST@(NUM,"PREC",ID)=DATA1
 +37                       QUIT 
                       End DoDot:2
 +38      ;Get earliest preceptor Start Date
 +39               SET SDATE1=$ORDER(SDATE(0))
 +40      ;
 +41      ;If position date is not earlier than preceptor date, it's all AP.
 +42               SET ID=$PIECE(DATA,U,11)_"-0-AP"
 +43               IF SDATE'<SDATE1
                       SET @SCLIST@(NUM,"PROV-P",ID)=DATA
                       QUIT 
 +44      ;
 +45      ;If postion Start/End Dates are both earlier than preceptor date,
 +46      ;then it's all PCP.
 +47               SET ID=$PIECE(DATA,U,11)_"-0-PCP"
 +48               IF EDATE
                       IF EDATE<SDATE1
                           SET @SCLIST@(NUM,"PROV-U",ID)=DATA
                           QUIT 
 +49      ;
 +50      ;Set PCP and AP portions
 +51      ;
 +52      ;Set PCP portion
 +53               SET ID=$PIECE(DATA,U,11)_"-0-PCP"
 +54      ;.....................Adjusted Start Date
                   SET ADJSDATE=SDATE
 +55      ;..Adjusted End Date
                   SET ADJEDATE=$$FMADD^XLFDT(SDATE1,-1)
 +56      ;..Adjust End Date
                   IF ADJUSTDT
                       SET $PIECE(DATA,U,10)=ADJEDATE
 +57      ;After AP/PCP split, recheck Start/End Dates.
                   Begin DoDot:2
 +58      ;
                       IF ADJSDATE
                           IF ADJSDATE>@SCDATES@("END")
                               QUIT 
 +59      ;
                       IF ADJEDATE
                           IF ADJEDATE<@SCDATES@("BEGIN")
                               QUIT 
 +60                   SET @SCLIST@(NUM,"PROV-U",ID)=DATA
                   End DoDot:2
 +61      ;
 +62      ;Set AP portion
 +63               SET ID=$PIECE(DATA,U,11)_"-0-AP"
 +64      ;..Adjusted Start Date
                   SET ADJSDATE=SDATE1
 +65               IF $PIECE(DATA,U,15)
                       IF $PIECE(DATA,U,15)<EDATE
                           SET EDATE=$PIECE(DATA,U,15)
 +66      ;...Adjusted End Date
                   SET ADJEDATE=EDATE
 +67      ;......Adjust Start/End dates
                   IF ADJUSTDT
                       Begin DoDot:2
 +68                       SET $PIECE(DATA,U,9)=ADJSDATE
 +69                       SET $PIECE(DATA,U,10)=ADJEDATE
                       End DoDot:2
 +70      ;After AP/PCP split, recheck Start/End Dates.
                   Begin DoDot:2
 +71      ;
                       IF ADJSDATE
                           IF ADJSDATE>@SCDATES@("END")
                               QUIT 
 +72      ;
                       IF ADJEDATE
                           IF ADJEDATE<@SCDATES@("BEGIN")
                               QUIT 
 +73                   SET @SCLIST@(NUM,"PROV-P",ID)=DATA
                   End DoDot:2
               End DoDot:1
 +74      ;
 +75       QUIT