class BANK create run feature {NONE} -- Implementation store: BANK_STORE over: BOOLEAN last_error: STRING data_file: RAW_FILE data_filename: STRING = "bank.data" feature {NONE} -- Initialization run do create store.make(100) store.ranges.account.creditline := [-1000.0, 0.0] store.ranges.account.interest_deposit := [0.01, 0.04] store.ranges.account.interest_debit := [0.02, 0.1] store.ranges.studentaccount.creditline := [-300.0, 0.0] store.ranges.studentaccount.interest_deposit := [0.02, 0.03] store.ranges.studentaccount.interest_debit := [0.03, 0.06] store.ranges.retireeaccount.creditline := [-300.0, 0.0] store.ranges.retireeaccount.interest_deposit := [0.02, 0.03] store.ranges.retireeaccount.interest_debit := [0.03, 0.06] create last_error.make_empty create data_file.make (data_filename) if data_file.exists then data_file.open_read store ?= store.retrieved (data_file) data_file.close end session if data_file.is_creatable then data_file.open_write store.independent_store (data_file) data_file.close end end feature -- Basic operations session do from until over loop main_screen end end print_last_error do if not last_error.is_empty then print (last_error + "%N%N") last_error := "" end end print_header do clear_screen print ("**************************************%N") print ("********* BANK of FOOP *********%N") print ("**************************************%N") end clear_screen do io.put_character ((0x1B).to_character_8) io.put_string ("[2J") io.put_character ((0x1B).to_character_8) io.put_string ("[H") end main_screen do print_header print ("Operations:%N") print (" r ...list/edit global ranges%N") print (" p ...list/create/edit/delete persons%N") print (" a ...list/create/edit/delete accounts%N") print (" q ...quit%N") print ("%N") print_last_error print ("Enter a command, followed by : ") io.read_character io.next_line inspect io.last_character.lower when 'r' then ranges_screen when 'p' then persons_screen when 'a' then accounts_screen when 'q' then over := True else last_error := "Error: Unknown command '" + io.last_character.out + "'" end print ("%N%N") end ranges_screen local back: BOOLEAN do from until back loop print_header print ("Global Ranges:%N") print (" Account:%N") print_ranges(store.ranges.account) print (" Student account:%N") print_ranges(store.ranges.studentaccount) print (" Retiree account:%N") print_ranges(store.ranges.retireeaccount) print ("%N") print ("Operations:%N") print (" a ...edit account ranges%N") print (" s ...edit student account ranges%N") print (" r ...edit retiree account ranges%N") print (" b ...back%N") print ("%N") print_last_error print ("Enter a command, followed by : ") io.read_character io.next_line inspect io.last_character when 'a' then edit_ranges("account", store.ranges.account) when 's' then edit_ranges("student account", store.ranges.studentaccount) when 'r' then edit_ranges("retiree account", store.ranges.retireeaccount) when 'b' then back := True else last_error := "Error: Unknown command '" + io.last_character.out + "'" end print ("%N%N") end end print_ranges(range: like {BANK_STORE}.account_range) do print (" - Creditline: " + print_range(range.creditline) + "%N") print (" - Interest deposit: " + print_range(range.interest_deposit) + "%N") print (" - Interest debit: " + print_range(range.interest_debit) + "%N") end print_range(range: like {BANK_STORE}.range): STRING_8 local fd: FORMAT_DOUBLE do create fd.make(2, 2) Result := "[" + fd.formatted(range.min) + ", " + fd.formatted(range.max) + "]" end edit_ranges(type: STRING_8; range: like {BANK_STORE}.account_range) do print ("%N") print ("Edit " + type + " range:%N") edit_range("creditline", range.creditline) edit_range("interest depost", range.interest_deposit) edit_range("interest debit", range.interest_debit) end edit_range(type: STRING_8; range: like {BANK_STORE}.range) local fd: FORMAT_DOUBLE do create fd.make(2, 2) print ("Enter " + type + " minimum [" + fd.formatted(range.min) + "]: ") io.readline if io.last_string.is_double then range.min := io.last_string.to_double end print ("Enter " + type + " maximum [" + fd.formatted(range.max) + "]: ") io.readline if io.last_string.is_double then range.max := io.last_string.to_double end end persons_screen local back: BOOLEAN do from until back loop print_header print ("Operations:%N") print (" l ...list persons%N") print (" c ...create person%N") print (" e ...edit person%N") print (" d ...delete person%N") print (" b ...back%N") print ("%N") print_last_error print ("Enter a command, followed by : ") io.read_character io.next_line inspect io.last_character when 'l' then list_persons when 'c' then create_persons when 'e' then edit_person when 'd' then delete_person when 'b' then back := True else last_error := "Error: Unknown command '" + io.last_character.out + "'" end print ("%N%N") end end accounts_screen local back: BOOLEAN do from until back loop print_header print ("Operations:%N") print (" l ...list accounts%N") print (" c ...create account%N") print (" e ...edit account%N") print (" d ...delete account%N") print (" b ...back%N") print ("%N") print_last_error print ("Enter a command, followed by : ") io.read_character io.next_line inspect io.last_character when 'l' then list_accounts when 'c' then when 'e' then when 'd' then when 'b' then back := True else last_error := "Error: Unknown command '" + io.last_character.out + "'" end print ("%N%N") end end list_persons do print ("%N") print ("Persons: " + store.persons.count.out + "%N%N") from store.persons.start until store.persons.off loop print ("#" + store.persons.index.out + " " + store.persons.item.surname + ", " + store.persons.item.firstname) if attached {RETIREE} store.persons.item then print (" (RETIREE)") elseif attached {STUDENT} store.persons.item then print (" (STUDENT)") end print ("%N") store.persons.forth end print ("%N") print ("Press to go back") io.read_line end list_accounts do print ("%N") print ("Accounts: " + store.accounts.count.out + "%N%N") from store.accounts.start until store.accounts.off loop --TODO print ("#" + store.accounts.index.out + "%N") print (" balance=" + store.accounts.item.balance.out + "%N") print (" creditline=" + store.accounts.item.creditline.out + "%N") if attached {RETIREEACCOUNT} store.accounts.item then print (" (RETIREEACCOUNT)") elseif attached {STUDENTACCOUNT} store.accounts.item then print (" (STUDENTACCOUNT)") end print ("%N") store.accounts.forth end print ("%N") print ("Press to go back") io.read_line end create_persons local back: BOOLEAN firstname: STRING surname: STRING do from until back loop print_header print ("Operations:%N") print (" p ...create person%N") print (" s ...create student%N") print (" r ...create retiree%N") print (" b ...back%N") print ("%N") print_last_error print ("Enter a command, followed by : ") io.read_character io.next_line inspect io.last_character when 'p', 's', 'r' then print ("Enter surname: ") io.readline surname := io.last_string.twin print ("Enter firstname: ") io.readline firstname := io.last_string.twin inspect io.last_character when 'p' then store.persons.put(create {PERSON}.make(surname, firstname)) when 's' then store.persons.put(create {STUDENT}.make(surname, firstname)) when 'r' then store.persons.put(create {RETIREE}.make(surname, firstname)) else end last_error := "Person (#" + store.persons.count.out + ") created successfully" back := True when 'b' then back := True else last_error := "Error: Unknown command '" + io.last_character.out + "'" end print ("%N%N") end rescue if not (create {EXCEPTIONS}).is_signal then last_error := "Exception: " + (create {EXCEPTIONS}).tag_name retry end end edit_person do print ("%N") print ("Enter person id (0 ...back): ") io.read_integer if io.last_integer > 0 then if store.persons.valid_index (io.last_integer) then store.persons.go_i_th (io.last_integer) print ("Enter surname [" + store.persons.item.surname + "]: ") io.readline if not io.last_string.is_empty then store.persons.item.surname := io.last_string.twin end print ("Enter firstname [" + store.persons.item.firstname + "]: ") io.readline if not io.last_string.is_empty then store.persons.item.firstname := io.last_string.twin end else last_error := "Invalid person id" end end end delete_person do print ("%N") print ("Enter person id (0 ...back): ") io.read_integer if io.last_integer > 0 then if store.persons.valid_index (io.last_integer) then store.persons.go_i_th (io.last_integer) store.persons.remove last_error := "Person (#" + io.last_integer.out + ") removed successfully" else last_error := "Invalid person id" end end end end