00001  def new global shared var prog-started as log.
00002  def new global shared var u-name as char.
00003  
00004  def shared var screen-title as char.
00005  
00006  def shared var total-floor-no as int init 4.
00007  def shared var room-types as char extent 5.
00008  
00009  def shared var res-state as char extent 4.
00010  def shared var res-state-ch as char extent 4.
00011  
00012  def shared var res-state-placed as int init 1.
00013  def shared var res-state-canceled as int init 2.
00014  def shared var res-state-checked-in as int init 3.
00015  def shared var res-state-checked-out as int init 4.
00016  
00017  prog-started = true. 
00018  def var h-time as char.
00019  
00020  form u-name view-as text
00021       screen-title view-as text
00022       h-time view-as text
00023       with frame f-main-header size 80 by 1 no-box no-underline no-labels at row 1 col 1.
00024   
00025  
00026  screen-title = "Guest Info Management".
00027  
00028  def var selection as char init ?.
00029  
00030  def buffer b-guest for guest.
00031  
00032  def var g-id like guest.guest-id.
00033  def var g-f-n like guest.first-name.
00034  def var g-l-n like guest.last-name.
00035  def var g-dob like guest.date-of-birth.
00036  def var g-id-type like guest.id-type no-undo.
00037  def var g-id-# like guest.id-number no-undo.
00038  def var g-phone-# like guest.phone-number.
00039  def var g-street-1 like guest.street-1.
00040  def var g-street-2 like guest.street-2.
00041  def var g-city like guest.city.
00042  def var g-state like guest.state.
00043  def var g-zip like guest.zip.
00044  def var g-country like guest.country.
00045  
00046  form g-id g-id-type view-as combo-box list-item-pairs "Passport","1","State ID","2","Driver's License","3","Unknown","4" format ">>>>>>>>>>>>>>>999" g-id-# format "x(15)" skip (2) 
00047       g-f-n skip g-l-n skip
00048       g-dob g-phone-# skip(2)
00049       g-street-1 at row 9 col 15 colon-aligned
00050       g-street-2 at row 10 col 15 colon-aligned
00051       g-city at row 11 col 15 colon-aligned
00052       g-state at row 12 col 15 colon-aligned
00053       g-zip at row 13 col 15 colon-aligned
00054       g-country at row 14 col 15 colon-aligned 
00055     with frame f-guest side-labels size 78 by 20 at row 2 col 1.
00056  
00057  view frame f-guest.
00058  
00059  procedure refresh.
00060     if not avail(guest) then do:
00061        clear frame f-guest all no-pause.
00062        return.
00063     end.
00064  
00065     g-id = guest.guest-id.
00066     g-f-n = guest.first-name.
00067     g-l-n = guest.last-name.
00068     g-dob = guest.date-of-birth.
00069     g-id-type = guest.id-type.
00070     g-id-# = guest.id-number.
00071     g-phone-# = guest.phone-number.
00072     g-street-1 = guest.street-1.
00073     g-street-2 = guest.street-2.
00074     g-city = guest.city.
00075     g-state = guest.state.
00076     g-zip = guest.zip.
00077     g-country = guest.country.
00078     
00079     display g-id g-f-n g-l-n g-dob g-id-type g-id-# g-phone-# 
00080             g-street-1 g-street-2 g-city g-state g-zip g-country 
00081        with frame f-guest. 
00082  end.
00083  
00084  define query q-guest for guest scrolling.
00085  open query q-guest for each guest use-index idx-g-id.
00086  get first q-guest.
00087  
00088  run refresh.
00089  
00090  PROC:
00091  repeat:
00092     if u-name = ? or u-name = "" then do:
00093     message "You are not logged in - access denied" view-as alert-box.
00094     quit.
00095  end.
00096  
00097  h-time = string(now, "99/99/99 HH:MM:SS").
00098  h-time = substring(h-time, 10).
00099  
00100  do with frame f-main-header:
00101     u-name:column = 1.
00102     screen-title:column = u-name:column + length(u-name) + (frame f-main-header:width-chars - length(u-name) - length(screen-title) - length(h-time)) / 2.
00103     h-time:column = frame f-main-header:width-chars - length(h-time).
00104     screen-title:format = "x(" + string(length(screen-title)) + ")".
00105  end.
00106  
00107  display u-name screen-title h-time with frame f-main-header.
00108   
00109     
00110     case selection:
00111        when "P" then do:
00112           get prev q-guest.
00113           if not avail guest then do:
00114              get first q-guest.
00115           end.
00116  
00117           run refresh.
00118        end.
00119        when "N" then do:
00120           get next q-guest.
00121           if not avail guest then do:
00122              get last q-guest.
00123           end.
00124  
00125           run refresh.
00126        end.
00127        when "F" then do:
00128           get first q-guest.
00129  
00130           run refresh.
00131        end.
00132        when "L" then do:
00133           get last q-guest.
00134  
00135           run refresh.
00136        end.
00137        when "I" then do:
00138           /* find by name, date of birth */
00139           def button btn-ok label "Find".
00140           def button btn-cancel label "Cancel".
00141           
00142           form g-f-n skip
00143                g-l-n skip
00144                g-dob skip
00145                btn-ok
00146                btn-cancel
00147                with frame f-guest-search side-labels overlay at row 2 col 1 title "Find Guest"
00148                     cancel-button btn-cancel default-button btn-ok.
00149  
00150           on "choose" of btn-cancel in frame f-guest-search do:
00151              apply "f4" to frame f-guest-search.
00152           end.
00153           on "choose" of btn-ok in frame f-guest-search do:
00154              apply "go" to frame f-guest-search.
00155           end.
00156  
00157           G-SEARCH:
00158           repeat on endkey undo, leave:
00159              g-f-n = "".
00160              g-l-n = "".
00161              g-dob = ?.
00162              
00163              update g-f-n g-l-n g-dob btn-ok btn-cancel with frame f-guest-search.
00164              
00165              if g-f-n = "" and g-l-n = "" and g-dob = ?
00166              then do:
00167                 message "Enter at least one search criteria!".
00168                 next g-search.
00169              end.
00170        
00171              find first b-guest 
00172                 where (if g-f-n = ? or g-f-n = "" then true else b-guest.first-name matches g-f-n + "*") and 
00173                       (if g-l-n = ? or g-l-n = "" then true else b-guest.last-name matches g-l-n + "*") and
00174                       (if g-dob = ? then true else b-guest.date-of-birth = g-dob) use-index idx-g-id no-lock no-error.
00175  
00176              if avail b-guest then do:
00177                 reposition q-guest to rowid rowid(b-guest).
00178                 get next q-guest.
00179                 run refresh.
00180              end.
00181              else do:
00182                 message "No matching record found.".
00183                 next g-search.
00184              end.
00185              
00186              leave.
00187           end.
00188           
00189           hide frame f-guest-search no-pause.
00190        end.
00191        when "D" then do:
00192           if avail guest then do transaction:
00193              find b-guest where b-guest.guest-id = guest.guest-id exclusive-lock.
00194              delete b-guest.
00195              
00196              get prev q-guest.
00197           end.
00198  
00199           run refresh.
00200        end.
00201        when "A" then do:
00202           ADD-GUEST:
00203           do transaction on error undo, leave
00204                          on endkey undo, leave:
00205              CREATE-GUEST:
00206              repeat:
00207                 do on error undo, retry:
00208                    find last b-guest use-index idx-g-id no-lock no-error.
00209                    g-id = (if avail b-guest then b-guest.guest-id + 1 else 1).
00210                    release b-guest.
00211     
00212                    create b-guest.
00213                    assign b-guest.guest-id = g-id.
00214                    leave CREATE-GUEST.
00215                 end.
00216              end.
00217     
00218              clear frame f-guest all.
00219              display g-id
00220                      with frame f-guest.
00221              
00222              g-f-n = "".
00223              g-l-n = "".
00224              g-dob = ?.
00225              g-id-type = ?.
00226              g-id-# = "".
00227              g-phone-# = "".
00228              g-street-1 = "".
00229              g-street-2 = "".
00230              g-city = "".
00231              g-state = "".
00232              g-zip = "".
00233              g-country = "".
00234  
00235              U-GUEST:
00236              repeat on error undo add-guest, leave add-guest
00237                     on endkey undo add-guest, leave add-guest:
00238  
00239                 display g-f-n g-l-n g-dob g-phone-# with frame f-guest.
00240                 update g-id-type g-id-# with frame f-guest.
00241                 
00242                 U-GUEST-1:
00243                 repeat on endkey undo u-guest, retry u-guest:
00244  
00245                    display g-street-1 g-street-2 g-city g-state g-zip g-country with frame f-guest.
00246                    update g-f-n g-l-n g-dob g-phone-# with frame f-guest.
00247                    
00248                    U-GUEST-2:
00249                    repeat on endkey undo u-guest-2, leave u-guest-2:
00250                       update g-street-1 g-street-2 g-city g-state g-zip g-country with frame f-guest.
00251  
00252                       b-guest.id-type = g-id-type.
00253                       b-guest.id-number = g-id-#.
00254                    
00255                       b-guest.first-name = g-f-n.
00256                       b-guest.last-name = g-l-n.
00257                       b-guest.date-of-birth = g-dob.
00258                       b-guest.phone-number = g-phone-#.
00259  
00260                       b-guest.street-1 = g-street-1.
00261                       b-guest.street-2 = g-street-2.
00262                       b-guest.city = g-city.
00263                       b-guest.state = g-state.
00264                       b-guest.zip = g-zip.
00265                       b-guest.country = g-country.
00266                       
00267                       leave u-guest.
00268                    end.
00269                 end.
00270              end.
00271           end.
00272  
00273           find guest where guest.guest-id = g-id no-lock no-error.
00274           reposition q-guest to rowid rowid(guest).
00275           get next q-guest.
00276           run refresh.
00277        end.
00278        when "U" then do:
00279           if avail guest then
00280           U-GUEST:
00281           repeat transaction on error undo, leave
00282                              on endkey undo, leave:
00283              
00284              find b-guest where b-guest.guest-id = guest.guest-id exclusive-lock.
00285              g-id-type = b-guest.id-type.
00286              if g-id-type = ? then g-id-type = 1.
00287              
00288              display g-f-n g-l-n g-dob g-phone-# with frame f-guest.
00289              update g-id-type g-id-# with frame f-guest.
00290              
00291              U-GUEST-1:
00292              repeat on endkey undo u-guest, retry u-guest:
00293  
00294                 display g-street-1 g-street-2 g-city g-state g-zip g-country with frame f-guest.
00295                 update g-f-n g-l-n g-dob g-phone-# with frame f-guest.
00296                 
00297                 U-GUEST-2:
00298                 repeat on endkey undo u-guest-2, leave u-guest-2:
00299                    update g-street-1 g-street-2 g-city g-state g-zip g-country with frame f-guest.
00300              
00301                    b-guest.id-type = g-id-type.
00302                    b-guest.id-number = g-id-#.
00303  
00304                    b-guest.first-name = g-f-n.
00305                    b-guest.last-name = g-l-n.
00306                    b-guest.date-of-birth = g-dob.
00307                    b-guest.phone-number = g-phone-#.
00308  
00309                    b-guest.street-1 = g-street-1.
00310                    b-guest.street-2 = g-street-2.
00311                    b-guest.city = g-city.
00312                    b-guest.state = g-state.
00313                    b-guest.zip = g-zip.
00314                    b-guest.country = g-country.
00315                    
00316                    leave u-guest.
00317                 end.
00318              end.
00319           end.
00320           
00321           run refresh.
00322        end.
00323        when "R" then do:
00324           publish "pop-program".
00325           leave PROC.
00326        end.
00327        otherwise do:
00328           if selection <> ? then do:
00329              message "Invalid selection - try again".
00330              selection = ?.
00331              pause.
00332              next. 
00333           end.
00334        end.
00335     end.
00336  
00337        selection = "R". /* assume we are returning; otherwise the user entered something valid */
00338  
00339     CHOICE: 
00340     repeat on endkey undo CHOICE, leave CHOICE:
00341        hide message no-pause.
00342        message "(P)rev   (N)ext   (F)irst   (L)ast".
00343        message "F(i)nd   (A)dd   (U)pdate   (D)elete   (R)eturn" update selection format "x(1)" auto-return.
00344  
00345        selection = caps(selection).
00346        leave.
00347     end.
00348   
00349  end.
00350