{            INVENTORY PROGRAM FOR
               TURBO PASCAL
               WRITTEN BY CHARLES STEWART
                                              }

PROGRAM INVENT;
TYPE
  ITEM=(A,E,T,F,J,M,X); { X IS FOR DELETED FILE FLAG}
  INVRECORD=RECORD
            ID:STRING[6];
            INVTYPE:ITEM;
            DESCRIPTION:STRING[20];
            COST:STRING[6];
  END;

  RINV= ARRAY[1..100] OF INVRECORD;

VAR
  FNAME:STRING[12];
  SELECTION:CHAR;
  RIDNUMBER:STRING[6];
  RTYPE:ITEM;
  RDESCRIPTION:STRING[20];
  RCOST:STRING[6];
  RINVRECORD:INVRECORD;
  INFILE, OUTFILE : FILE OF INVRECORD;
  RESPONSE:STRING[30];
  ALLDONE:BOOLEAN;
  TEMP:INVRECORD;
  TOTAL:REAL;
  AMT:REAL;
  CODE:INTEGER;
  INVENTORY:RINV;

PROCEDURE STALL;
BEGIN
 WRITELN;
 WRITELN('PRESS RETURN TO CONTINUE ');
 WRITELN;
 READLN;
END; {STALL}

PROCEDURE DELETE(VAR R:RINV);
VAR CODE, I:INTEGER;
   ALLDONE:BOOLEAN;
   RE:INTEGER;
   CLASS:CHAR;
   PP,PG:INTEGER;
   RCLASS:ITEM;
BEGIN
  ALLDONE := FALSE;
  CLRSCR;
  PP := 0;
  PG := 20;
  ASSIGN(OUTFILE,FNAME);
  RESET(OUTFILE);
  I:=0;
  CLRSCR;
     REPEAT
     IF PP < PG THEN
      BEGIN
       READ (OUTFILE,RINVRECORD);
       WITH RINVRECORD DO
       BEGIN
          WRITE(I:3,' ');
          WRITE(ID:8);
          WRITE(DESCRIPTION:22);
          WRITE(COST:8);
          IF INVTYPE = X THEN WRITE('----DELETED---');
          WRITELN;
          PP := PP + 1;
          I:=I+1;

        END;
      END
     ELSE
      BEGIN
        WRITE(' PRESS RETURN FOR NEXT PAGE');
        PP := 0;
        READLN;
        CLRSCR;
      END;
  UNTIL EOF(OUTFILE);
  WRITELN;
  I:= I - 1;
  WRITELN('DELETE WHICH ITEM ');
  READLN(RE);
    IF RE > I THEN
       BEGIN
          WRITELN('ERROR',^G,' THAT ITEM DOES NOT EXIST');
          STALL;
       END
    ELSE
       BEGIN
          SEEK(OUTFILE,0); {REWIND THE POINTER TO 0 POS IN FILE}
          SEEK(OUTFILE,RE);
          RINVRECORD.INVTYPE := X; {DELETE FILE CODE}
          WRITE(OUTFILE,RINVRECORD);
       END;
CLOSE(OUTFILE);
END;{DELETE}

PROCEDURE CHANGE(VAR R:RINV);
VAR CODE, I:INTEGER;
   ALLDONE:BOOLEAN;
   PP,PG:INTEGER;
   CLASS:CHAR;
   RE:INTEGER;
   RCLASS:ITEM;
BEGIN
  ALLDONE := FALSE;
  CLRSCR;
  ASSIGN(OUTFILE,FNAME);
  RESET(OUTFILE);
  I:=0;
  CLRSCR;
     PP:= 0; PG := 20;
     REPEAT
     IF PP < PG THEN
      BEGIN
       READ (OUTFILE,RINVRECORD);
       WITH RINVRECORD DO
        BEGIN
          WRITE(I:3,' ');
          WRITE(ID:8);
          WRITE(DESCRIPTION:22);
          WRITE(COST:8);
          IF INVTYPE = X THEN WRITE ('------DELETED-------');
          WRITELN;
          I:=I+1;
          PP := PP +1;
        END;
      END
     ELSE
       BEGIN
          WRITE('PRESS RETURN FOR NEXT PAGE');
          PP :=0;
          READLN;
          CLRSCR;
       END;
  UNTIL EOF(OUTFILE);
  WRITELN;
  I:= I - 1;
  WRITELN('CHANGE WHICH ITEM ');
  READLN(RE);
  IF RE > I THEN
       BEGIN
                WRITELN('ERROR NO SUCH RECORD',^G);
                STALL;
       END
  ELSE
       BEGIN
              SEEK(OUTFILE,0); {REWIND THE POINTER TO 0 POS IN FILE}
              SEEK(OUTFILE,RE);
                  WRITELN('PURCHASE DATE AS YYMMDD');
                      READLN(RIDNUMBER);
                      R[I].ID := RIDNUMBER;
                      WRITELN('INVENTORY TYPE  A,E,T,F,J,M,? ');
                      READLN(CLASS);
                      IF CLASS <> '?' THEN
                         BEGIN
                              IF CLASS = 'A' THEN RCLASS := A
                                 ELSE
                                     IF CLASS = 'E' THEN RCLASS := E
                                     ELSE
                                     IF CLASS = 'T' THEN RCLASS := T
                                     ELSE
                                     IF CLASS = 'F' THEN RCLASS := F
                                     ELSE
                                     IF CLASS = 'J' THEN RCLASS := J
                                     ELSE
                                     RCLASS := M;
                         END
                     ELSE
                         BEGIN
                            CLRSCR;
                            WRITELN('A- > APPLIANCE');
                            WRITELN('E- > ELECTRONIC');
                            WRITELN('T- > TOY');
                            WRITELN('F- > FURNITURE');
                            WRITELN('J- > JEWERY');
                            WRITELN('M- > MISC. ');
                            WRITELN('INVENTORY TYPE  A,E,T,F,J,M');
                            READLN(CLASS);
                         END;

    WRITELN('DESCRIPTION OF ITEM 20 CHARACTER MAXIMUM ');
    WRITELN('-------------------* AS INDICATED BY THE ASTERISK');
    READLN(RDESCRIPTION);
    R[I].DESCRIPTION := RDESCRIPTION;
    WRITELN(' ITEM COST TO NEAREST DOLLAR (NO DECIMALS)');
    READLN(RCOST);
    R[I].COST := RCOST;
    WRITE(OUTFILE,R[I]);
    CLOSE(OUTFILE);
END;
END;{CHANGE}

PROCEDURE SORT(VAR R:RINV);
VAR J,I,INDEX:INTEGER;
BEGIN
  CLRSCR;
  WRITELN('SORT ROUTINE OF THE INPUT DATA');
  ASSIGN(INFILE,FNAME);
  RESET(INFILE);
  INDEX := 0;
  WHILE NOT EOF(INFILE) DO
     BEGIN
       INDEX := INDEX + 1;
       READ (INFILE,R[INDEX]);
     END;
  CLOSE(INFILE);
  ASSIGN(OUTFILE,FNAME);
  REWRITE(OUTFILE);
  FOR I := 1 TO INDEX-1 DO
      FOR J := I+1 TO INDEX DO
          IF R[I].ID > R[J].ID
                   THEN
                        BEGIN  {SWAP EM}
                          TEMP := R[I];
                          R[I] := R[J];
                          R[J] := TEMP;
                        END;
  FOR I:= 1 TO INDEX DO
      WRITE(OUTFILE,R[I]);
  WRITELN(' SORTED FILE WRITTEN TO DISK FILE ',FNAME);
  CLOSE(OUTFILE);
  STALL;
END; {SORT ROUTINE}
PROCEDURE TYPESORT(VAR R:RINV);
VAR J,I,INDEX:INTEGER;
BEGIN
  CLRSCR;
  WRITELN('SORT ROUTINE OF THE INPUT DATA');
  RESET(INFILE);
  INDEX := 0;
  WHILE NOT EOF(INFILE) DO
     BEGIN
       INDEX := INDEX + 1;
       READ (INFILE,R[INDEX]);
     END;
  CLOSE(INFILE);
  ASSIGN(OUTFILE,FNAME);
  REWRITE(OUTFILE);
  FOR I := 1 TO INDEX-1 DO
      FOR J := I+1 TO INDEX DO
          IF R[I].INVTYPE > R[J].INVTYPE
                   THEN
                        BEGIN  {SWAP EM}
                          TEMP := R[I];
                          R[I] := R[J];
                          R[J] := TEMP;
                        END;
  FOR I:= 1 TO INDEX DO
      WRITE(OUTFILE,R[I]);
  CLOSE(OUTFILE);
END; {SORT ROUTINE}

PROCEDURE CREATE(VAR R:RINV);
VAR CLASS:CHAR;
  RCLASS:ITEM;
BEGIN
  ALLDONE:=FALSE;
  ASSIGN(OUTFILE,FNAME);
  REWRITE(OUTFILE);
  WHILE NOT ALLDONE DO
     BEGIN
    WRITELN('PURCHASE DATE AS YYMMDD');
    READLN(RIDNUMBER);
    RINVRECORD.ID := RIDNUMBER;
    WRITELN('INVENTORY TYPE  A,E,T,F,J,M,? ');
    READLN(CLASS);
    IF CLASS <> '?' THEN
    BEGIN
        IF CLASS = 'A' THEN RCLASS := A
    ELSE
       IF CLASS = 'E' THEN RCLASS := E
       ELSE
          IF CLASS = 'T' THEN RCLASS := T
          ELSE
             IF CLASS = 'F' THEN RCLASS := F
             ELSE
                IF CLASS = 'J' THEN RCLASS := J
                ELSE
                   RCLASS := M;
   END
   ELSE
      BEGIN
        CLRSCR;
        WRITELN('A- > APPLIANCE');
        WRITELN('E- > ELECTRONIC');
        WRITELN('T- > TOY');
        WRITELN('F- > FURNITURE');
        WRITELN('J- > JEWERY');
        WRITELN('M- > MISC. ');
        WRITELN('INVENTORY TYPE  A,E,T,F,J,M,? ');
        READLN(CLASS);
      END;

    RINVRECORD.INVTYPE := RCLASS;
    WRITELN('DESCRIPTION OF ITEM 20 CHARACTER MAXIMUM ');
    WRITELN('-------------------* AS INDICATED BY THE ASTERISK');
    READLN(RDESCRIPTION);
    RINVRECORD.DESCRIPTION := RDESCRIPTION;
    WRITELN(' ITEM COST TO NEAREST DOLLAR (NO DECIMALS)');
    READLN(RCOST);
    RINVRECORD.COST := RCOST;
    WRITE(OUTFILE,RINVRECORD);
    WRITELN(' IF YOU ARE DONE TYPE AN ASTERISK (*), OTHERWISE JUST HIT ENTER');
    READLN (RESPONSE);
    IF RESPONSE = '*' THEN ALLDONE := TRUE;
  END; {WHILE ALLDONE LOOP}
  CLOSE(OUTFILE);
  SORT(INVENTORY);
END; {CREATE}


PROCEDURE MENU(VAR SELECTION:CHAR);
  BEGIN
      CLRSCR;
      WRITELN('Inventory Management System':53);
      WRITELN('by Charles A. Stewart':50);
      WRITELN;
      WRITELN('Copyright 1986 all rights reserved':56);
      WRITELN;
      WRITELN('Work file name ',fname);
      WRITELN;
      WRITELN(' A--> Create new inventory file');
      WRITELN(' B--> Add items to inventory  ');
      WRITELN(' C--> Change items in inventory');
      WRITELN(' D--> Delete item in inventory');
      WRITELN(' E--> Print the inventory to printer');
      WRITELN(' F--> Assign file name ');
      WRITELN(' G--> END PROGRAM');
      WRITELN;
      READLN (SELECTION);
      IF SELECTION = 'F' THEN
         BEGIN
           WRITE('File name please ');
           readln(fname);
         END;
  END;{MENU}

PROCEDURE ADD(VAR R:RINV);
VAR I:INTEGER;
   ALLDONE:BOOLEAN;
    CLASS:CHAR;
    RCLASS:ITEM;
BEGIN
  ALLDONE := FALSE;
  CLRSCR;
  ASSIGN(OUTFILE,FNAME);
  RESET(OUTFILE);
  SEEK(OUTFILE,FILESIZE(OUTFILE));
  WHILE NOT ALLDONE DO
     BEGIN
    WRITELN('PURCHASE DATE AS YYMMDD');
    READLN(RIDNUMBER);
    RINVRECORD.ID := RIDNUMBER;
    WRITELN('INVENTORY TYPE  A,E,T,F,J,M,? ');
    READLN(CLASS);
    IF CLASS <> '?' THEN
    BEGIN
        IF CLASS = 'A' THEN RCLASS := A
    ELSE
       IF CLASS = 'E' THEN RCLASS := E
       ELSE
          IF CLASS = 'T' THEN RCLASS := T
          ELSE
             IF CLASS = 'F' THEN RCLASS := F
             ELSE
                IF CLASS = 'J' THEN RCLASS := J
                ELSE
                   RCLASS := M;
   END
   ELSE
      BEGIN
        CLRSCR;
        WRITELN('A- > APPLIANCE');
        WRITELN('E- > ELECTRONIC');
        WRITELN('T- > TOY');
        WRITELN('F- > FURNITURE');
        WRITELN('J- > JEWERY');
        WRITELN('M- > MISC. ');
        WRITELN('INVENTORY TYPE  A,E,T,F,J,M,? ');
        READLN(CLASS);
      END;

    RINVRECORD.INVTYPE := RCLASS;
    WRITELN('DESCRIPTION OF ITEM 20 CHARACTER MAXIMUM ');
    WRITELN('-------------------* AS INDICATED BY THE ASTERISK');
    READLN(RDESCRIPTION);
    RINVRECORD.DESCRIPTION := RDESCRIPTION;
    WRITELN(' ITEM COST TO NEAREST DOLLAR (NO DECIMALS)');
    READLN(RCOST);
    RINVRECORD.COST := RCOST;
    WRITE(OUTFILE,RINVRECORD);
    WRITELN(' IF YOU ARE DONE TYPE AN ASTERISK (*), OTHERWISE JUST HIT ENTER');
    READLN (RESPONSE);
    IF RESPONSE = '*' THEN ALLDONE := TRUE;
  END; {WHILE ALLDONE LOOP}
  FLUSH(OUTFILE);
  CLOSE(OUTFILE);
  SORT(INVENTORY);
END; {ADD}

PROCEDURE PRINT(VAR R:RINV);
CONST PP=56;
VAR PG:INTEGER;
BEGIN
  CLRSCR;
  ASSIGN (INFILE,FNAME);
  RESET(INFILE);
  TYPESORT(INVENTORY);
  WRITELN(LST,'Household Inventory');
  WRITELN;
  WRITELN(LST,'Copyright 1986 by Charles Stewart');
  WRITELN(LST,'All Rights Reserved.');
  WRITELN(LST);
  ASSIGN(INFILE,FNAME);
  RESET(INFILE);
  TOTAL := 0;
  WRITELN(LST,'DATE':8,'DESCRIPTION':22,'       COST':6,'        CLASS');
  WRITELN(LST,'===============================================================');
  Pg := 7;
  REPEAT
       READ (INFILE,RINVRECORD);
       WITH RINVRECORD DO
       BEGIN
        IF Pg > PP THEN
           BEGIN
               WRITELN(LST,^l); { FORM FEED }
               WRITELN(LST,'Household Inventory');
               WRITELN;
               WRITELN(LST,'Copyright 1986 by Charles Stewart');
               WRITELN(LST,'All Rights Reserved.');
               WRITELN(LST);
               WRITELN(LST,'DATE':8,'DESCRIPTION':22,'       COST':6,'        CLASS');
               WRITELN(LST,'===============================================================');
               Pg := 7;
           END; {IF PP}
        IF INVTYPE <> X THEN
         BEGIN
          VAL (COST,AMT,CODE);
          TOTAL := TOTAL + AMT;
          Pg := Pg + 1;
          WRITE(LST,ID:8);
          WRITE(LST,DESCRIPTION:22);
          WRITE(LST,'  $');
          WRITE(LST,COST:6);
          WRITE(LST,'    ');
          CASE INVTYPE OF
          A: WRITE(LST,'APPLANCE');
          E: WRITE(LST,'ELECTRONIC');
          T: WRITE(LST,'TOY');
          J: WRITE(LST,'JEWELRY');
          F: WRITE(LST,'FURNITURE');
          M: WRITE(LST,'MISC. ');
          END; {CASE}
         WRITELN(LST);
         END;{WHILE}
       END;
  UNTIL EOF(INFILE);
  CLOSE(INFILE);
  WRITELN(LST);
  WRITELN(LST,'===============================================================');
  WRITELN(LST,'TOTAL ----------------> $',TOTAL:5:2);
END;{PRINT}

BEGIN {MAIN PROGRAM}
FNAME :=('INVENT.DAT'); {DEFAULT FILE NAME}
REPEAT
 MENU(SELECTION);
 CASE SELECTION OF
  'A': CREATE(INVENTORY);
  'B': ADD(INVENTORY);
  'D': DELETE(INVENTORY);
  'C': CHANGE(INVENTORY);
  'E': PRINT(INVENTORY);
 END;{CASE}
UNTIL SELECTION > 'F';
END. {PROGRAM}