/obj/item/device/eftpos
name = "\improper EFTPOS scanner"
desc = "Swipe your ID card to make purchases electronically."
icon = 'icons/obj/device.dmi'
icon_state = "eftpos"
w_class = ITEMSIZE_TINY
var/machine_id = ""
var/eftpos_name = "Default EFTPOS scanner"
var/transaction_locked = 0
var/transaction_paid = 0
var/transaction_amount = 0
var/transaction_purpose = "Default charge"
var/access_code = 0
var/datum/money_account/linked_account
var/prelocked_account = null
/obj/item/device/eftpos/Initialize()
..()
machine_id = "[station_name()] EFTPOS #[SSeconomy.num_financial_terminals++]"
access_code = rand(1111,111111)
link_account()
return INITIALIZE_HINT_LATELOAD
/obj/item/device/eftpos/proc/link_account()
//Link to the station account, unless prelocked_account is set
if(!prelocked_account)
linked_account = SSeconomy.station_account
else
linked_account = SSeconomy.get_department_account(prelocked_account)
/obj/item/device/eftpos/LateInitialize()
print_reference()
//create a short manual as well
var/obj/item/paper/R = new(src.loc)
R.name = "Steps to success: Correct EFTPOS Usage"
//Temptative new manual:
R.info += "First EFTPOS setup:
"
R.info += "1. Memorise your EFTPOS command code (provided with all EFTPOS devices).
"
R.info += "2. Connect the EFTPOS to the account in which you want to receive the funds.
"
R.info += "When starting a new transaction:
"
R.info += "1. Enter the amount of money you want to charge and a purpose message for the new transaction.
"
R.info += "2. Lock the new transaction. If you want to modify or cancel the transaction, you simply have to reset your EFTPOS device.
"
R.info += "3. Give the EFTPOS device to your customer, he/she must finish the transaction by swiping their ID card or a charge card with enough funds.
"
R.info += "4. If everything is done correctly, the money will be transferred. To unlock the device you will have to reset the EFTPOS device.
"
//stamp the paper
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
if(!R.stamped)
R.stamped = new
R.offset_x += 0
R.offset_y += 0
R.ico += "paper_stamp-cent"
R.stamped += /obj/item/stamp
R.add_overlay(stampoverlay)
R.stamps += "
This paper has been stamped by the EFTPOS device."
/obj/item/device/eftpos/proc/print_reference()
var/obj/item/paper/R = new(src.loc)
var/pname = "Reference: [eftpos_name]"
var/info = "[eftpos_name] reference
"
info += "Access code: [access_code]
"
info += "Do not lose or misplace this code.
"
R.set_content_unsafe(pname, info)
//stamp the paper
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
if(!R.stamped)
R.stamped = new
R.stamped += /obj/item/stamp
R.add_overlay(stampoverlay)
R.stamps += "
This paper has been stamped by the EFTPOS device."
var/obj/item/smallDelivery/D = new(R.loc)
R.forceMove(D)
D.wrapped = R
D.name = "small parcel - 'EFTPOS access code'"
/obj/item/device/eftpos/attack_self(mob/user as mob)
if(get_dist(src,user) <= 1)
var/dat = "[eftpos_name]
"
dat += "This terminal is [machine_id]. Report this code when contacting IT Support
"
if(transaction_locked)
dat += "Back[transaction_paid ? "" : " (authentication required)"]
"
dat += "Transaction purpose: [transaction_purpose]
"
dat += "Value: $[transaction_amount]
"
dat += "Linked account: [linked_account ? linked_account.owner_name : "None"]
"
if(transaction_paid)
dat += "This transaction has been processed successfully.
"
else
dat += "Swipe your card below the line to finish this transaction.
"
dat += "\[------\]"
else
dat += "Lock in new transaction
"
dat += "Transaction purpose: [transaction_purpose]
"
dat += "Value: $[transaction_amount]
"
if(!prelocked_account)
dat += "Linked account: [linked_account ? linked_account.owner_name : "None"]
"
else
dat += "Linked account: [linked_account.owner_name]
"
dat += "Change access code
"
dat += "Change EFTPOS ID
"
dat += "Scan card to reset access code \[------\]"
user << browse(dat,"window=eftpos")
else
user << browse(null,"window=eftpos")
/obj/item/device/eftpos/attackby(var/obj/item/O, var/mob/user)
var/obj/item/card/id/I = O.GetID()
if(I)
if(linked_account)
scan_card(I, O)
else
to_chat(user, "[icon2html(src, user)]Unable to connect to linked account.")
else if (istype(O, /obj/item/spacecash/ewallet))
var/obj/item/spacecash/ewallet/E = O
if (linked_account)
if(!linked_account.suspended)
if(transaction_locked && !transaction_paid)
if(transaction_amount <= E.worth)
playsound(src, 'sound/machines/chime.ogg', 50, 1)
src.visible_message("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.")
transaction_paid = 1
//transfer the money
E.worth -= transaction_amount
linked_account.money += transaction_amount
//create entry in the EFTPOS linked account transaction log
var/datum/transaction/T = new()
T.target_name = E.owner_name //D.owner_name
T.purpose = (transaction_purpose ? transaction_purpose : "None supplied.")
T.amount = transaction_amount
T.source_terminal = machine_id
T.date = worlddate2text()
T.time = worldtime2text()
SSeconomy.add_transaction_log(linked_account,T)
else
to_chat(user, "[icon2html(src, user)]\The [O] doesn't have that much money!")
else
to_chat(user, "[icon2html(src, user)]Connected account has been suspended.")
else
to_chat(user, "[icon2html(src, user)]EFTPOS is not connected to an account.")
else
..()
/obj/item/device/eftpos/Topic(var/href, var/href_list)
if(href_list["choice"])
switch(href_list["choice"])
if("change_code")
var/attempt_code = input("Re-enter the current EFTPOS access code", "Confirm old EFTPOS code") as num
if(attempt_code == access_code)
var/trycode = input("Enter a new access code for this device (4-6 digits, numbers only)", "Enter new EFTPOS code") as num
if(trycode >= 1000 && trycode <= 999999)
access_code = trycode
else
alert("That is not a valid code!")
print_reference()
else
to_chat(usr, "[icon2html(src, usr)]Incorrect code entered.")
if("change_id")
var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code"))
if(attempt_code == access_code)
eftpos_name = sanitize(input("Enter a new terminal ID for this device", "Enter new EFTPOS ID"), MAX_NAME_LEN) + " EFTPOS scanner"
print_reference()
else
to_chat(usr, "[icon2html(src, usr)]Incorrect code entered.")
if("link_account")
if (!prelocked_account)
var/attempt_account_num = input("Enter account number to pay EFTPOS charges into", "New account number") as num
var/attempt_pin = input("Enter pin code", "Account pin") as num
linked_account = SSeconomy.attempt_account_access(attempt_account_num, attempt_pin, 1)
if(linked_account)
if(linked_account.suspended)
linked_account = null
to_chat(usr, "[icon2html(src, usr)]Account has been suspended.")
else
to_chat(usr, "[icon2html(src, usr)]Account not found.")
if("trans_purpose")
var/choice = sanitize(input("Enter reason for EFTPOS transaction", "Transaction purpose"))
if(choice) transaction_purpose = choice
if("trans_value")
var/try_num = input("Enter amount for EFTPOS transaction", "Transaction amount") as num
if(try_num < 0)
alert("That is not a valid amount!")
else
transaction_amount = try_num
if("toggle_lock")
if(transaction_locked)
if (transaction_paid)
transaction_locked = 0
transaction_paid = 0
else
var/attempt_code = input("Enter EFTPOS access code", "Reset Transaction") as num
if(attempt_code == access_code)
transaction_locked = 0
transaction_paid = 0
else if(linked_account)
transaction_locked = 1
else
to_chat(usr, "[icon2html(src, usr)]No account connected to send transactions to.")
if("scan_card")
if(linked_account)
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/card))
scan_card(I)
else
to_chat(usr, "[icon2html(src, usr)]Unable to link accounts.")
if("reset")
//reset the access code - requires HoP/captain access
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/card))
var/obj/item/card/id/C = I
if((access_cent_captain in C.access) || (access_hop in C.access) || (access_captain in C.access))
access_code = 0
to_chat(usr, "[icon2html(src, usr)]Access code reset to 0.")
else if (istype(I, /obj/item/card/emag))
access_code = 0
to_chat(usr, "[icon2html(src, usr)]Access code reset to 0.")
src.attack_self(usr)
/obj/item/device/eftpos/proc/scan_card(var/obj/item/card/I, var/obj/item/ID_container)
if (istype(I, /obj/item/card/id))
var/obj/item/card/id/C = I
if(I==ID_container || ID_container == null)
usr.visible_message("\The [usr] swipes a card through \the [src].")
else
usr.visible_message("\The [usr] swipes \the [ID_container] through \the [src].")
if(transaction_locked && !transaction_paid)
if(linked_account)
var/message = SSeconomy.transfer_money(C.associated_account_number, linked_account.account_number, transaction_purpose, machine_id, transaction_amount, null, usr)
if(message)
to_chat(usr,"[icon2html(src, usr)][message].")
else
playsound(src, 'sound/machines/chime.ogg', 50, 1)
src.visible_message("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.")
transaction_paid = 1
else
to_chat(usr, "[icon2html(src, usr)]EFTPOS is not connected to an account.")
else if (istype(I, /obj/item/card/emag))
if(transaction_locked)
if(transaction_paid)
to_chat(usr, "[icon2html(src, usr)]You stealthily swipe \the [I] through \the [src].")
transaction_locked = 0
transaction_paid = 0
else
usr.visible_message("\The [usr] swipes a card through \the [src].")
playsound(src, 'sound/machines/chime.ogg', 50, 1)
src.visible_message("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.")
transaction_paid = 1