(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "15-Jun-90 11:39:57" {DSK}<usr>local>lde>lispcore>internal>library>ARSREPORT.;2 19524  

      changes to%:  (VARS ARSREPORTCOMS)

      previous date%: "23-Mar-87 13:47:08" {DSK}<usr>local>lde>lispcore>internal>library>ARSREPORT.;1
)


(* ; "
Copyright (c) 1986, 1987, 1990 by Venue & Xerox Corporation.  All rights reserved.
")

(PRETTYCOMPRINT ARSREPORTCOMS)

(RPAQQ ARSREPORTCOMS ((FNS AR.REPORT ARS.GET.NUM.LIST ARS.REPORT.DRIVER ARS.REPORT.GEN.AR.LIST 
                               ARS.REPORT.GEN.NEW ARS.REPORT.GET.NUM.LIST ARS.REPORT.GET.TDSINFO 
                               ARS.REPORT.PROCESS.TDSINFO)
                          (VARS ARS.BUG.LASTMONTH.RELEASED.BACKLOG 
                                ARS.BUG.LASTMONTH.UNRELEASED.BACKLOG ARS.FEATURE.LASTMONTH.BACKLOG 
                                ARS.HACKERS ARS.TESTERS)))
(DEFINEQ

(AR.REPORT
  [LAMBDA (START# END# TDS-VERSION-LIST STARTDATE ENDDATE FORMWINDOW SCRATCHDIR)
                                                             (* ; "Edited 23-Mar-87 11:20 by shw:")
          
          (* ;; "Main driver for the monthly AR report.  ")
          
          (* ;; "START# is the starting AR number to report on")
          
          (* ;; "END# is the ending AR# to report on")
          
          (* ;; "TDS-VERSION-LIST is a list of versions of the TDS-PROCESSED file")
          
          (* ;; "STARTDATE is the starting date as a string, e.g. %"16-FEB-87%" or %"12 JAN 96%"")
          
          (* ;; "ENDDATE  is the starting date as a string, e.g. %"16-FEB-87%" or %"12 JAN 96%"")
          
          (* ;; "FORMWINDOW is the MAIN window of an AR (we suggest using WHICHW)")
          
          (* ;; "SCRATCHDIR is a directory/host to use for scratch files.  Defaults to {DSK}.")

    (ARS.REPORT.DRIVER START# END# (for VERSION inside TDS-VERSION-LIST
                                      collect (if (EQ VERSION 'LISPARS.TDS)
                                                  then '{ERIS}<LISPARS>LISPARS.TDS
                                                else (PACKFILENAME 'VERSION VERSION 'BODY 
                                                            "{ERIS}<LISPARS>LISPARS.TDS-PROCESSED")))
           (IDATE (CONCAT STARTDATE " 00:00:00"))
           (IDATE (CONCAT ENDDATE " 00:00:00"))
           FORMWINDOW SCRATCHDIR])

(ARS.GET.NUM.LIST
  [LAMBDA (QFORM)                                            (* ckj " 4-Jun-86 18:25")
    (PROG (NUMS)
          [AR.INDEX.DATA.CONTEXT QFORM (SETQ NUMS (for ALIST in (WINDOWPROP QFORM 'AR.ENTRY.ALIST)
                                                     collect (AR.GET.ENTRY.NUM (CAR ALIST]
          (RETURN NUMS])

(ARS.REPORT.DRIVER
  [LAMBDA (STARTING.NUM ENDING.NUM TDS.LIST STARTDATE ENDDATE FORMWINDOW SCRATCHDIR)
                                                             (* ; "Edited 24-Feb-87 17:23 by jds")
    (SETQ ARS.NEW (ARS.REPORT.GEN.AR.LIST STARTING.NUM ENDING.NUM))
    (SETQ TDS.FEATURES.SERVICED (for X in TDS.LIST collect (ARS.REPORT.PROCESS.TDSINFO (
                                                                               ARS.REPORT.GET.TDSINFO
                                                                                        X)
                                                                  STARTDATE ENDDATE)))
    (SETQ ARS.FEATURES.SERVICED NIL)
    (for X in TDS.FEATURES.SERVICED do (SETQ ARS.FEATURES.SERVICED (APPEND ARS.FEATURES.SERVICED X)))
    (ARS.REPORT.GEN.NEW STARTING.NUM ENDING.NUM ARS.FEATURES.SERVICED FORMWINDOW SCRATCHDIR])

(ARS.REPORT.GEN.AR.LIST
  [LAMBDA (START.NUM END.NUM)                                (* ckj "30-May-86 16:38")
    (SETQ AR.LIST (for X from START.NUM to END.NUM collect X))
    (PROG ((NEXT.NUM START.NUM)
           ARDONEFLG)
          (do (COND
                 ((EQP NEXT.NUM END.NUM)
                  (SETQ ARDONEFLG T)))
              [COND
                 ([NLSETQ (SETQ ARSTREAM (OPENSTREAM (AR.FILENAME NEXT.NUM)
                                                'INPUT
                                                'OLD]
                  (CLOSEF ARSTREAM)
                  (SETQ NEXT.NUM (ADD1 NEXT.NUM)))
                 (T (DREMOVE NEXT.NUM AR.LIST)
                    (SETQ NEXT.NUM (ADD1 NEXT.NUM] until (OR ARDONEFLG))
          (RETURN AR.LIST])

(ARS.REPORT.GEN.NEW
  [LAMBDA (START.NUM END.NUM FORMWINDOW FIXED.LIST)          (* ; "Edited 13-Mar-87 13:26 by shw:")
    (PROG ((REPORT.INDEX '{DSK}REPORT-AR.INDEX)
           TXT REPORTWINDOW AR.QWINDOW ARS.NEW.OPEN ARS.NEW.UNSCREENED ARS.NEW.DECLINED ARS.NEW.FIXED 
           ARS.NEW.SUPERSEDED ARS.NEW.INCOMPLETE ARS.NEW.OBSOLETE ARS.NEW.FEATURE 
           ARS.NEW.UNRELEASED.FEATURE ARS.NEW.UNASSIGNED ARS.NEW.WISH ARS.SERVICED.FEATURES 
           ARS.NEW.TOTAL ARS.OPEN.TOTAL ARS.ABSOLUTELY.TOTAL ARS.SUBMITTED.BETA ARS.SUBMITTED.HACKERS 
           ARS.SUBMITTED.TESTERS)
          (AR.INDEX.CREATE REPORT.INDEX)
          [SETQ AR.QWINDOW (CREATEW '(0 0 200 100]
          (AR.QFORM.GROUP.CREATE REPORT.INDEX AR.QWINDOW)
          (DISMISS 10000)
          (AR.INDEX.UPDATE AR.QWINDOW ARS.NEW)
          (CLOSEW AR.QWINDOW)
          [SETQ AR.QWINDOW (CREATEW '(0 0 200 100]
          (AR.QFORM.CREATE REPORT.INDEX AR.QWINDOW)
          (DISMISS 10000)
          (AR.QUERY AR.QWINDOW '(Status%: IS Open))
          (SETQ ARS.NEW.OPEN (ARS.GET.NUM.LIST AR.QWINDOW))
          (AR.QUERY AR.QWINDOW '(Status%: IS New))
          (SETQ ARS.NEW.UNSCREENED (ARS.GET.NUM.LIST AR.QWINDOW))
          (AR.QUERY AR.QWINDOW '(Status%: IS Declined))
          (SETQ ARS.NEW.DECLINED (ARS.GET.NUM.LIST AR.QWINDOW))
          (AR.QUERY AR.QWINDOW '(Status%: IS Fixed))
          (SETQ ARS.NEW.FIXED (ARS.GET.NUM.LIST AR.QWINDOW))
          (AR.QUERY AR.QWINDOW '(Status%: IS Superseded))
          (SETQ ARS.NEW.SUPERSEDED (ARS.GET.NUM.LIST AR.QWINDOW))
          (AR.QUERY AR.QWINDOW '(Status%: IS Incomplete))
          (SETQ ARS.NEW.INCOMPLETE (ARS.GET.NUM.LIST AR.QWINDOW))
          (AR.QUERY AR.QWINDOW '(Status%: IS Obsolete))
          (SETQ ARS.NEW.OBSOLETE (ARS.GET.NUM.LIST AR.QWINDOW))
          (AR.QUERY AR.QWINDOW '(Status%: IS Wish))
          (SETQ ARS.NEW.WISH (ARS.GET.NUM.LIST AR.QWINDOW))
          (AR.QUERY AR.QWINDOW '(In/By%: HAS BETA))
          (SETQ ARS.SUBMITTED.BETA (ARS.GET.NUM.LIST AR.QWINDOW))
          [AR.QUERY AR.QWINDOW (APPEND '(OR) (for HACKER in ARS.HACKERS
                                                collect (APPEND '(Submitter%: HAS) (LIST HACKER]
          (SETQ ARS.SUBMITTED.HACKERS (ARS.GET.NUM.LIST AR.QWINDOW))
          [AR.QUERY AR.QWINDOW (APPEND '(OR) (for TESTER in ARS.TESTERS
                                                collect (APPEND '(Submitter%: HAS) (LIST TESTER]
          (SETQ ARS.SUBMITTED.TESTERS (ARS.GET.NUM.LIST AR.QWINDOW))
          [AR.QUERY AR.QWINDOW '(AND (OR (Subject%: HAS want)
                                         (|Problem Type:| IS Feature))
                                     (Status%: IS Open]
          (SETQ ARS.NEW.FEATURE (APPEND ARS.NEW.FEATURE (ARS.GET.NUM.LIST AR.QWINDOW)))
          (AR.QUERY AR.QWINDOW '(AND (OR (Subject%: HAS want)
                                         (|Problem Type:| IS Feature))
                                     (Status%: IS New)) (SETQ ARS.NEW.UNRELEASED.FEATURE (
                                                                                     ARS.GET.NUM.LIST
                                                                                          AR.QWINDOW)
                                                         ))
          [AR.QUERY AR.QWINDOW '(AND (Status%: IS Open)
                                     (Attn%: HAS lisp]
          (SETQ ARS.NEW.UNASSIGNED (ARS.GET.NUM.LIST AR.QWINDOW))
          [AR.QUERY AR.QWINDOW '(AND (Status%: IS Open)
                                     (Attn%: IS NIL]
          (SETQ ARS.NEW.UNASSIGNED (APPEND ARS.NEW.UNASSIGNED (ARS.GET.NUM.LIST AR.QWINDOW)))
          (CLOSEW AR.QWINDOW)
          (DELFILE REPORT.INDEX)
          [SETQ AR.QWINDOW (CREATEW '(0 0 200 100]
          (AR.QFORM.GROUP.CREATE REPORT.INDEX AR.QWINDOW)
          (DISMISS 10000)
          (AR.INDEX.UPDATE AR.QWINDOW FIXED.LIST)
          (CLOSEW AR.QWINDOW)
          [SETQ AR.QWINDOW (CREATEW '(0 0 200 100]
          (AR.QFORM.CREATE REPORT.INDEX AR.QWINDOW)
          (DISMISS 10000)
          [AR.QUERY AR.QWINDOW '(OR (Subject%: HAS want)
                                    (|Problem Type:| IS Feature]
          (SETQ ARS.SERVICED.FEATURES (APPEND ARS.SERVICED.FEATURES (ARS.GET.NUM.LIST AR.QWINDOW)))
          [SETQ REPORTWINDOW (CREATEW '(400 0 400 200]
          (CLOSEW AR.QWINDOW)
          (SETQ TXT (OPENTEXTSTREAM "" REPORTWINDOW NIL NIL (LIST 'FONT LAFITEEDITORFONT)))
          (PRINTOUT TXT "FIRST AR OF MONTH:" START.NUM " LAST AR OF MONTH:" END.NUM 
                 " NUMBER OF NEW ARS:" (FLENGTH ARS.NEW)
                 " NUMBER OF ARS ACCEPTED:"
                 (PLUS (FLENGTH ARS.NEW.FIXED)
                       (DIFFERENCE (FLENGTH ARS.NEW.OPEN)
                              (FLENGTH ARS.NEW.FEATURE)))
                 " NUMBER OF ARS REJECTED:"
                 (PLUS (FLENGTH ARS.NEW.DECLINED)
                       (FLENGTH ARS.NEW.SUPERSEDED)
                       (FLENGTH ARS.NEW.INCOMPLETE)
                       (FLENGTH ARS.NEW.OBSOLETE))
                 " NUMBER OF UNSCREENED ARS:"
                 (FLENGTH ARS.NEW.UNSCREENED)
                 " NUMBER OF FEATURE REQUESTS SUBMITTED:"
                 (PLUS (FLENGTH ARS.NEW.FEATURE)
                       (FLENGTH ARS.NEW.WISH))
                 " NUMBER OF UNASSIGNED ARS:"
                 (FLENGTH ARS.NEW.UNASSIGNED)
                 " NUMBER OF FIXED ARS:"
                 (FLENGTH ARS.NEW.FIXED)
                 " NUMBER OF SERVICED FEATURE REQUESTS:"
                 (FLENGTH ARS.SERVICED.FEATURES)
                 T)
          [SETQ AR.QWINDOW (CREATEW '(0 0 200 100]
          (AR.QFORM.CREATE '{ERIS}<LISPARS>AR.INDEX AR.QWINDOW)
          (DISMISS 10000)
          [AR.QUERY AR.QWINDOW '(AND (Status%: IS New)
                                     (NOT (|Problem Type:| IS Feature]
          (SETQ ARS.NEW.TOTAL (ARS.GET.NUM.LIST AR.QWINDOW))
          [AR.QUERY AR.QWINDOW '(AND (Status%: IS Open)
                                     (NOT (|Problem Type:| IS Feature]
          (SETQ ARS.OPEN.TOTAL (ARS.GET.NUM.LIST AR.QWINDOW))
          [AR.QUERY AR.QWINDOW '(AND (Priority%: IS Absolutely)
                                     (OR (Status%: IS New)
                                         (Status%: IS Open]
          (SETQ ARS.ABSOLUTELY.TOTAL (ARS.GET.NUM.LIST AR.QWINDOW))
          (CLOSEW AR.QWINDOW)
          [SETQ FINALREPORTWINDOW (CREATEW '(450 0 400 200]
          (SETQ TXT (OPENTEXTSTREAM "" FINALREPORTWINDOW NIL NIL (LIST 'FONT LAFITEEDITORFONT)))
          [PRINTOUT TXT T T .TAB 30 ">>month<< Action Request Data Base Report" T T 
                 ">>lastmonth<< Unreleased Backlog:" .TAB 40 ARS.BUG.LASTMONTH.UNRELEASED.BACKLOG T 
                 ">>lastmonth<< Released Backlog:" .TAB 40 ARS.BUG.LASTMONTH.RELEASED.BACKLOG T 
                 ">>month<< Submissions:" .TAB 40 (IDIFFERENCE END.NUM START.NUM)
                 T "Rejected:" .TAB 40 (PLUS (FLENGTH ARS.NEW.DECLINED)
                                             (FLENGTH ARS.NEW.SUPERSEDED)
                                             (FLENGTH ARS.NEW.INCOMPLETE)
                                             (FLENGTH ARS.NEW.OBSOLETE))
                 T "Feature Requests:" .TAB 40 (PLUS (FLENGTH ARS.NEW.UNRELEASED.FEATURE)
                                                     (FLENGTH ARS.NEW.FEATURE))
                 T "Fixed:" .TAB 40 (FLENGTH ARS.NEW.FIXED)
                 T "Submitted by Beta Test sites:" .TAB 40 (FLENGTH ARS.SUBMITTED.BETA)
                 T "Submitted by Development:" .TAB 40 (FLENGTH ARS.SUBMITTED.HACKERS)
                 T "Submitted by Testing:" .TAB 40 (FLENGTH ARS.SUBMITTED.TESTERS)
                 T "Total (Open/New) ARs marked Absolutely:" .TAB 40 (FLENGTH ARS.ABSOLUTELY.TOTAL)
                 T "Total Open (Released) ARs:" .TAB 40 (FLENGTH ARS.OPEN.TOTAL)
                 T "Total New (Unreleased) ARs" .TAB 40 (FLENGTH ARS.NEW.TOTAL)
                 T T T T .TAB 30 ">>month<< Feature Request Report" T T 
                 ">>lastmonth<< Features Backlog:" .TAB 40 ARS.FEATURE.LASTMONTH.BACKLOG T 
                 "Feature Requests Submitted:" .TAB 40 (PLUS (FLENGTH ARS.NEW.UNRELEASED.FEATURE)
                                                             (FLENGTH ARS.NEW.FEATURE))
                 T "Feature Requests Serviced:" .TAB 40 (FLENGTH ARS.SERVICED.FEATURES)
                 T ">>month<< Features Backlog:" .TAB 40 (PLUS ARS.FEATURE.LASTMONTH.BACKLOG
                                                               (IDIFFERENCE (PLUS (FLENGTH 
                                                                           ARS.NEW.UNRELEASED.FEATURE
                                                                                         )
                                                                                  (FLENGTH 
                                                                                      ARS.NEW.FEATURE
                                                                                         ))
                                                                      (FLENGTH ARS.SERVICED.FEATURES]
          [SETQ ARS.BUG.LASTMONTH.RELEASED.BACKLOG (PLUS ARS.BUG.LASTMONTH.RELEASED.BACKLOG
                                                         (IDIFFERENCE (FLENGTH ARS.NEW.OPEN)
                                                                (FLENGTH ARS.NEW.FEATURE]
          (SETQ ARS.FEATURE.LASTMONTH.BACKLOG (PLUS ARS.FEATURE.LASTMONTH.BACKLOG
                                                    (IDIFFERENCE (PLUS (FLENGTH ARS.NEW.FEATURE)
                                                                       (FLENGTH ARS.NEW.WISH))
                                                           (FLENGTH ARS.SERVICED.FEATURES])

(ARS.REPORT.GET.NUM.LIST
  [LAMBDA (QFORM)                                            (* ckj "30-May-86 16:33")
    (PROG (NUMS)
          [AR.INDEX.DATA.CONTEXT QFORM (SETQ NUMS (for ALIST in (WINDOWPROP QFORM 'AR.ENTRY.ALIST)
                                                     collect (AR.GET.ENTRY.NUM (CAR ALIST]
          (RETURN NUMS])

(ARS.REPORT.GET.TDSINFO
  [LAMBDA (FILENAME)                                         (* ; "Edited  3-Feb-87 16:14 by shw:")
    (PROG ((FILE (OPENSTREAM FILENAME 'INPUT 'OLD))
           TDSLIST)
          (SETQ TDSLIST (while (FILEPOS "  --  " FILE NIL NIL NIL T) bind ARLIST
                           when [LISTP (SETQ ARLIST (PROGN (READ FILE FILERDTBL] collect ARLIST))
          (CLOSEF FILE)
          (RETURN TDSLIST])

(ARS.REPORT.PROCESS.TDSINFO
  [LAMBDA (TDSLIST TDS.STARTDATE TDS.ENDDATE)                (* edited%: "24-Jul-86 17:13")
    (PROG (TDSTEMP TXT ARS.OLD.FEATURE ARS.OLD.FIXED ARS.OLD.SERVICED ARS.OLD.SUPERSEDED 
                 ARS.OLD.OBSOLETE ARS.OLD.DECLINED ARS.OLD.INCOMPLETE)
          (SETQ TDSTEMP (for X in TDSLIST when (NOT (FMEMB 'SUBMIT X)) collect (CDR X)))
          (SETQ TDSTEMP (for X in TDSTEMP when [AND (LEQ TDS.STARTDATE (IDATE (CONCAT (CADADR X)
                                                                                     " 00:00:00")))
                                                    (GREATERP TDS.ENDDATE (IDATE (CONCAT (CADADR
                                                                                          X)
                                                                                        " 00:00:00"]
                           collect X))
          (SETQ TDSTEMP (for X in TDSTEMP when (NOT (MEMB (CAR X)
                                                          ARS.NEW)) collect X))
          (SORT TDSTEMP T)
          (for X in TDSTEMP do (COND
                                  [(STRPOS "->Feature" X)
                                   (SETQ ARS.OLD.FEATURE (APPEND ARS.OLD.FEATURE (LIST (CAR X]
                                  [(STRPOS "Wish->Fixed" X)
                                   (SETQ ARS.OLD.SERVICED (APPEND ARS.OLD.SERVICED
                                                                 (LIST (CAR X]
                                  [(STRPOS "->Fixed" X)
                                   (SETQ ARS.OLD.FIXED (APPEND ARS.OLD.FIXED (LIST (CAR X]
                                  [(STRPOS "->Superseded" X)
                                   (SETQ ARS.OLD.SUPERSEDED (APPEND ARS.OLD.SUPERSEDED
                                                                   (LIST (CAR X]
                                  [(STRPOS "->Obsolete" X)
                                   (SETQ ARS.OLD.OBSOLETE (APPEND ARS.OLD.OBSOLETE
                                                                 (LIST (CAR X]
                                  [(STRPOS "->Declined" X)
                                   (SETQ ARS.OLD.DECLINED (APPEND ARS.OLD.DECLINED
                                                                 (LIST (CAR X]
                                  [(STRPOS "->Incomplete" X)
                                   (SETQ ARS.OLD.INCOMPLETE (APPEND ARS.OLD.INCOMPLETE
                                                                   (LIST (CAR X]
                                  (T)))
          [SETQ REPORTWINDOW (CREATEW '(200 0 400 200]
          (SETQ TXT (OPENTEXTSTREAM "" REPORTWINDOW NIL NIL (LIST 'FONT LAFITEEDITORFONT)))
          (PRINTOUT TXT "STARTING DATE:" TDS.STARTDATE " ENDING DATE:" TDS.ENDDATE 
                 " NUMBER OF FEATURE OLD ARS:" (FLENGTH ARS.OLD.FEATURE)
                 " " ARS.OLD.FEATURE " NUMBER OF FEATURE REQUESTS SERVICED:" (FLENGTH 
                                                                                    ARS.OLD.SERVICED)
                 " " ARS.OLD.SERVICED " NUMBER OF FIXED OLD ARS:" (FLENGTH ARS.OLD.FIXED)
                 " " ARS.OLD.FIXED " NUMBER OF SUPERSEDED OLD ARS:" (FLENGTH ARS.OLD.SUPERSEDED)
                 " " ARS.OLD.SUPERSEDED " NUMBER OF OBSOLETE OLD ARS:" (FLENGTH ARS.OLD.OBSOLETE)
                 " " ARS.OLD.OBSOLETE " NUMBER OF DECLINED OLD ARS:" (FLENGTH ARS.OLD.DECLINED)
                 " " ARS.OLD.DECLINED " NUMBER OF INCOMPLETE OLD ARS:" (FLENGTH ARS.OLD.INCOMPLETE)
                 " " ARS.OLD.INCOMPLETE)
          (RETURN ARS.OLD.FIXED])
)

(RPAQQ ARS.BUG.LASTMONTH.RELEASED.BACKLOG 0)

(RPAQQ ARS.BUG.LASTMONTH.UNRELEASED.BACKLOG 0)

(RPAQQ ARS.FEATURE.LASTMONTH.BACKLOG -4)

(RPAQQ ARS.HACKERS (Bane Burton Charnley Daniels Fischer Jellinek Lanning Masinter Murage Pavel 
                             Pedersen Santosa Shih Sybalsky vanMelle Woz))

(RPAQQ ARS.TESTERS (Blum Cate3 Kelley Lew Rhoades Wilkie))
(PUTPROPS ARSREPORT COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990))
(DECLARE%: DONTCOPY
  (FILEMAP (NIL (938 19036 (AR.REPORT 948 . 2498) (ARS.GET.NUM.LIST 2500 . 2860) (ARS.REPORT.DRIVER 2862
 . 3790) (ARS.REPORT.GEN.AR.LIST 3792 . 4595) (ARS.REPORT.GEN.NEW 4597 . 14518) (
ARS.REPORT.GET.NUM.LIST 14520 . 14887) (ARS.REPORT.GET.TDSINFO 14889 . 15343) (
ARS.REPORT.PROCESS.TDSINFO 15345 . 19034)))))
STOP
