berhotel dengan pascal ...

program si_hotel;

uses crt,dateutils,sysutils;

type
    ETipeKaMar = (Single, Twin, Suite);
    EStatus     = (Kosong, Isi);
    ENomorKamar = (No101, No102, No103, No104, No105, No201, No202, No203, No204,
    No205, No301, No302, No303, No304, No305, No306, No307, No308,No309, No310);

 Tamu = record
    Nama          : string;
    NoId          : string;
    WaktuIn          : TDateTime;
    WaktuOut      : TDateTime;
    NumKamar      : ENomorKamar;
    TipeKaMar     : ETipeKaMar;
    Status        : EStatus;
    TotalBiaya    : longint;
 end;

 TDataTamu = array [ENomorKamar] of Tamu;

const
 Tanggal     = 'DD-MM-YYYY';
 CHargaKamar : array [ETipeKaMar] of Longint = (400000, 800000, 1350000);

var
 DataTamu : TDatatamu;
 pil : char;
 NomorKamar : word;

function CekStatus(DataTamu: TDataTamu; NoKamar: ENomorKamar): Boolean;
begin
    if (DataTamu[NoKamar].Status = Kosong) then
        CekStatus := true
    else
        CekStatus := false;
end;

function AmbilKamar(NomorKamar: Word): ENomorKamar;
begin
  case (NomorKamar) of
    101: AmbilKamar := No101;
    102: AmbilKamar := No102;
    103: AmbilKamar := No103;
    104: AmbilKamar := No104;
    105: AmbilKamar := No105;
    201: AmbilKamar := No201;
    202: AmbilKamar := No202;
    203: AmbilKamar := No203;
    204: AmbilKamar := No204;
    205: AmbilKamar := No205;
    301: AmbilKamar := No301;
    302: AmbilKamar := No302;
    303: AmbilKamar := No303;
    304: AmbilKamar := No304;
    305: AmbilKamar := No305;
    306: AmbilKamar := No306;
    307: AmbilKamar := No307;
    308: AmbilKamar := No308;
    309: AmbilKamar := No309;
    310: AmbilKamar := No310;
 end;
end;

function tampilNoKamar(EnoKamar:EnomorKamar): word;
begin
  case (EnoKamar) of
    No101 : tampilNoKamar := 101;
    No102 : tampilNoKamar := 102;
    No103 : tampilNoKamar := 103;
    No104 : tampilNoKamar := 104;
    No105 : tampilNoKamar := 105;
    No201 : tampilNoKamar := 201;
    No202 : tampilNoKamar := 202;
    No203 : tampilNoKamar := 203;
    No204 : tampilNoKamar := 204;
    No205 : tampilNoKamar := 205;
    No301 : tampilNoKamar := 301;
    No302 : tampilNoKamar := 302;
    No303 : tampilNoKamar := 303;
    No304 : tampilNoKamar := 304;
    No305 : tampilNoKamar := 305;
    No306 : tampilNoKamar := 306;
    No307 : tampilNoKamar := 307;
    No308 : tampilNoKamar := 308;
    No309 : tampilNoKamar := 309;
    No310 : tampilNoKamar := 310;
  end;
end;

Procedure PelangganMasuk (var DataTamu : TDataTamu);
    var
      NoKamar : Enomorkamar;
      TKamar,tanya : char;
      InfoTamu : Tamu;
      jawab,benar : boolean;
    begin
    repeat
        Clrscr;
         gotoxy(30,1);Write('CHECK-IN TAMU HOTEL');
         gotoxy(20,2);Write('=================================');
         gotoxy(20,12);Write('=================================');

         gotoxy(18,4);Write('Tipe Kamar ( 0 : Single; 1 : Twin ; 2 : Suite ) ');
         gotoxy(18,5);Write('Tipe Kamar        = ');
       
        repeat
            gotoxy(38,5);
            Readln(TKamar);
            clreol;
        until TKamar  in ['0'..'2'];
        case TKamar of
            '0': InfoTamu.Tipekamar := Single;
            '1': InfoTamu.Tipekamar := Twin;
            '2': InfoTamu.Tipekamar := Suite;
        end;

        if (InfoTamu.TipeKaMar= Single) then
            begin
                gotoxy(41,5);Write('( Single )');
                gotoxy(18,6);Write('Kamar yang tersedia = ');
                for NoKamar := No301 to No310 do
                    begin
                        if DataTamu[NoKamar].Status = kosong then
                            write(TampilNoKamar(NoKamar),' ');
                    end;
                gotoxy(18,7);Write('Nomor Kamar       = ');
                repeat
                    begin
                    gotoxy(38,7);
                    Readln(NomorKamar);
                    InfoTamu.NumKamar := AmbilKamar(NomorKamar);
                    Jawab := CekStatus(DataTamu,InfoTamu.NumKamar);
                        if Jawab = false then
                            begin
                                gotoxy(38,7);clreol;
                            end;
                    end;
                until jawab = true and ((NomorKamar = 301) or (NomorKamar = 302) or (NomorKamar = 303) or
                    (NomorKamar = 304) or (NomorKamar = 305) or (NomorKamar = 306) or
                    (NomorKamar = 307) or (NomorKamar = 308) or (NomorKamar = 309) or
                    (NomorKamar = 310) );
            end
        else
        if (InfoTamu.TipeKaMar= Twin) then
            begin
                gotoxy(41,5);Write('( Twin )');
                gotoxy(18,6);Write('Kamar yang tersedia = ');
                for NoKamar := No201 to No205 do
                    begin
                        if DataTamu[NoKamar].Status = kosong then
                            write(TampilNoKamar(NoKamar),' ');
                    end;
                gotoxy(18,7);Write('Nomor Kamar       = ');
                repeat
                    begin
                    gotoxy(38,7);
                    Readln(NomorKamar);
                    InfoTamu.NumKamar := AmbilKamar(NomorKamar);
                    Jawab := CekStatus(DataTamu,InfoTamu.NumKamar);
                        if Jawab = false then
                            begin
                                gotoxy(38,7);clreol;
                            end;
                    end;
                until jawab = true and ((NomorKamar = 201) or (NomorKamar = 202) or (NomorKamar = 203) or
                    (NomorKamar = 204) or (NomorKamar = 205));
            end
        else
            begin
                gotoxy(46,5);Write('( Suite )');
                gotoxy(18,6);Write('Kamar yang tersedia : ');
                for NoKamar := No101 to No105 do
                    begin
                        if DataTamu[NoKamar].Status = kosong then
                            write(TampilNoKamar(NoKamar),' ');
                    end;
                gotoxy(18,7);Write('Nomor Kamar       = ');
                repeat
                    begin
                    gotoxy(38,7);
                    Readln(NomorKamar);
                    InfoTamu.NumKamar := AmbilKamar(NomorKamar);
                    Jawab := CekStatus(DataTamu,InfoTamu.NumKamar);
                        if Jawab = false then
                            begin
                                gotoxy(38,7);clreol;
                            end;
                    end;
                until jawab = true and ((NomorKamar = 101) or (NomorKamar = 102) or (NomorKamar = 103) or
                    (NomorKamar = 104) or (NomorKamar = 105));

            end;
       
        gotoxy(18,8);Write('Nama Tamu         = ');
        repeat
            begin
            gotoxy(38,8);ClrEol;
            Readln(InfoTamu.Nama);;
            end;
        until(InfoTamu.Nama<>'');

        gotoxy(18,9);Write('No Identitas      = ');
        repeat
            begin
            gotoxy(38,9);ClrEol;
            Readln(InfoTamu.NoId);
            end;
        until(InfoTamu.NoId<>'');
       
        gotoxy(18,10);write('Data sudah benar ??? ( y ) / ( t ) : ');readln(tanya);
        if tanya = 'y' then
         begin
            NoKamar := InfoTamu.NumKamar;
            DataTamu[NoKamar].Tipekamar:= Infotamu.TipeKamar ;
            DataTamu[NoKamar].Nama := InfoTamu.Nama;
            DataTamu[NoKamar].NoId := InfoTamu.NoId;
            DataTamu[NoKamar].WaktuIn := Today;
            DataTamu[NoKamar].Status := Isi;
            benar := true;
          end
         else
            benar := false;
       
 until benar = true;
 end;
 
Procedure PelangganKeluar(Var DataTamu:TDataTamu);
var
 EnoKamar   :ENomorKamar;
 tanya : char;
 benar : boolean;

begin
repeat
  clrscr;
  gotoxy(30,1);Write('CHECK-OUT TAMU HOTEL');
  gotoxy(25,2);write('=================================');
  gotoxy(25,17);write('=================================');
  gotoxy(25,4);Write('Daftar Kamar yang berisi = ');
 
  gotoxy(28,5);
    for EnoKamar := No101 to No310 do
    begin
      if DataTamu[EnoKamar].Status = Isi then
      write(tampilNoKamar(EnoKamar),' ');
    end;
   
  gotoxy(25,6);
    Write('No Kamar         = ');Readln(nomorKamar);
    EnoKamar := AmbilKamar(nomorKamar);
  gotoxy(25,7);Writeln('  Nama             = ', DataTamu[EnoKamar].Nama);
  gotoxy(25,8);Writeln('  No. Identitas    = ', DataTamu[EnoKamar].NoId);
  gotoxy(25,9);Writeln('  Tanggal Check-in = ', formatDateTime(Tanggal,DataTamu[EnoKamar].WaktuIn));
  gotoxy(25,10);writeln('Tipe Kamar        = ');
  gotoxy(45,10);
    if (DataTamu[EnoKamar].TipeKaMar= Single) then
      Write('Single')
    else
    if (DataTamu[EnoKamar].TipeKaMar= Twin) then
      Write('Twin')
    else
      Write('Suite');
  gotoxy(25,12);Write('Data benar ?? ( y ) / ( t ) = ');readln(tanya);
  if tanya = 'y' then
    begin
        DataTamu[EnoKamar].WaktuOut := Today;
        benar := true
    end
  else
        benar := false;
 until benar = true;       
 end;
 
procedure DaftarTamu(tampil : TDataTamu);
var EnoKamar : ENomorKamar;
begin
 clrscr;
 gotoxy(30,1);writeln('.: DATA TAMU HOTEL :.');writeln;
 write('================================================================================');
 gotoxy(1,4);write('#');gotoxy(80,4);write('#');
 gotoxy(19,4);write('#');gotoxy(43,4);write('#');
 gotoxy(64,4);write('#');gotoxy(1,5);write('#');
 gotoxy(80,5);write('#');gotoxy(19,5);write('#');
 gotoxy(43,5);write('#');gotoxy(64,5);write('#');
 gotoxy(4,5);write('No Kamar');
 gotoxy(25,5);write('Nama Tamu');gotoxy(46,5);write('No Identitas');
 gotoxy(68,5);write('Check In   ');
 writeln;
 writeln ('================================================================================');
 for EnoKamar := No101 to No310 do
  begin
    if tampil[EnoKamar].Status = Isi then
     begin
       Writeln(tampilNoKamar(EnoKamar):8,tampil[EnoKamar].Nama:22,tampil[EnoKamar].NoId:25,
       formatDateTime(Tanggal,tampil[EnoKamar].WaktuIn):22);
    end;
  end;
  writeln;
  writeln ('================================================================================');
  writeln('Tekan <Enter> untuk kembali ke Menu Utama');
 readln;
end;

procedure Tagihan(Var DataTamu : TDataTamu);
var
JmlHari : integer;
EnoKamar : ENomorKamar;

begin
clrscr;
 gotoxy(30,1);write('.: TAGIHAN TAMU HOTEL :.');
 gotoxy(25,2);write('=================================');
 gotoxy(25,4);Write('Daftar Kamar yang berisi = ');
 gotoxy(28,5);
    for EnoKamar := No101 to No310 do
    begin
      if DataTamu[EnoKamar].Status = Isi then
      write(tampilNoKamar(EnoKamar),' ');
    end;
  gotoxy(25,6);
    Write('No Kamar         = ');Readln(nomorKamar);
    EnoKamar := AmbilKamar(nomorKamar);
 gotoxy(25,7);Write('Tanggal Check-in   = ', formatDateTime(Tanggal,DataTamu[EnoKamar].WaktuIn));
 gotoxy(25,8);write('Tanggal Check Out  = ', formatDateTime(Tanggal,DataTamu[EnoKamar].WaktuOut));
 gotoxy(25,9);write('Tipe Kamar         = ');
 gotoxy(46,9);
    if (DataTamu[EnoKamar].TipeKaMar= Single) then
      Write('Single')
    else
    if (DataTamu[EnoKamar].TipeKaMar= Twin) then
      Write('Twin')
    else
      Write('Suite');
     
    JmlHari := DaysBetween((DataTamu[ENoKamar].WaktuOut),(DataTamu[ENoKamar].WaktuIn));
    if JmlHari = 0 then JmlHari := JmlHari + 1;
       
    gotoxy(25,10);Write('Lama Menginap      = ',JmlHari,' hari');
    DataTamu[EnoKamar].TotalBiaya := CHargaKamar[DataTamu[EnoKamar].TipeKamar] * JmlHari;
    gotoxy(25,11);Write('Total Biaya        = Rp ',DataTamu[EnoKamar].TotalBiaya);
    gotoxy(25,13);write('=================================');
    gotoxy(25,14);write('Tekan <Enter> untuk kembali ke Menu Utama');
 DataTamu[EnoKamar].Status := Kosong;
 readln;
end;


begin
repeat
    clrscr;
    gotoxy(28,1);writeln('SISTEM INFORMASI PERHOTELAN');
    gotoxy(35,3);writeln('MENU PROGRAM');
    gotoxy(28,4);writeln('[1].Check - in');
    gotoxy(28,5);writeln('[2].Check - out');
    gotoxy(28,6);writeln('[3].Daftar Tamu');
    gotoxy(28,7);writeln('[4].Cetak Tagihan');
    gotoxy(28,8);writeln('[5].Selesai');
    gotoxy(28,10);write('Silahkan Masukkan Pilihan : ');

    gotoxy(56,10);readln(pil);
 case pil of
'1':PelangganMasuk(Datatamu);
'2':PelangganKeluar(Datatamu);
'3':DaftarTamu(Datatamu);
'4':Tagihan(Datatamu);

end;
until pil = '5' ;
readln;
end.