2016-08-30 16:43:35 +00:00
|
|
|
# Requirements for the Reimbursement and Outgoing Payment Request System
|
2016-08-30 16:11:48 +00:00
|
|
|
|
|
|
|
## Overview
|
|
|
|
|
2016-08-30 16:38:37 +00:00
|
|
|
One short-term goal of the Non-Profit Accounting Project is to create a
|
2016-08-30 16:43:35 +00:00
|
|
|
system that allows (a) members of an organization, and external parties, to
|
|
|
|
submit requests for reimbursement or request for payment (e.g., invoices),
|
|
|
|
and (b) the organization's bookkeepers, accountants, and managerial approvers
|
|
|
|
to review those requests, add them to the organization's books, and prepare
|
|
|
|
payment. The primary motivation for this project is to save time both groups
|
|
|
|
spend on handling reimbursement requests and outgoing payments, and reduce
|
|
|
|
turnaround time for these requests, and to help members file complete
|
|
|
|
requests that are easy for bookkeepers to review and accept.
|
2016-08-30 16:38:37 +00:00
|
|
|
|
|
|
|
Members of the organization could be employees, members of projects
|
|
|
|
represented by the organization, or others doing work to advance the
|
2016-08-30 16:43:35 +00:00
|
|
|
organization's mission—anyone who the organization might want to reimburse or
|
|
|
|
pay.
|
2016-08-30 16:38:37 +00:00
|
|
|
|
2016-08-30 16:43:35 +00:00
|
|
|
The system should not make assumptions about specific reimbursement policies
|
|
|
|
or invoicing requirements. Instead, it should be possible for a bookkeeper
|
|
|
|
or administrator to define follow-up questions and what responses are and are
|
|
|
|
not eligible for reimbursement or payment. Early versions may require
|
|
|
|
sysadmin-level technical expertise to do this, but ultimately it should be
|
|
|
|
doable by a bookkeeper with appropriate privileges.
|
2016-08-30 16:11:48 +00:00
|
|
|
|
|
|
|
## Requirements for first release
|
|
|
|
|
|
|
|
### Defining the request form
|
|
|
|
|
Additional request state: Pre-Approval
Many travel policies, for example, require that certain expenses be
approved before tickets can be purchased. An example from Conservancy's
travel policy include: hotel bookings beyond the GSA/Dept-of-State Per
Diem hotel rate, and flights that exceed the with-$100-of-cheapest rule.
As such, requestors need the ability to request preapproval.
These changes herein committed, however, do *not* account for the fact
that a request may already be "In Progress" when another expense comes
up. An example of that is a flight was booked already in policy and the
requestor, and uploaded, and the requestor then discovers later that the
hotel is out-of-policy and needs preapproval. We can perhaps ignore
this scenario for the first specification of this to avoid
feature-creep, but I wanted to flag it as a potential issue for future.
The work around might be that the Bookkeeper is allowed to move a
request between any state to another, so the work-around in this
specific instance may have to require an out-of-band conversation
between bookkeeper and requestor. That's not disaster.
2016-08-30 16:55:50 +00:00
|
|
|
Requests for payment have five states: Pre-Approval, In Progress, Submitted,
|
2016-08-30 16:38:37 +00:00
|
|
|
Accepted, and Rejected.
|
2016-08-30 16:11:48 +00:00
|
|
|
|
2016-08-30 16:49:13 +00:00
|
|
|
Administrators can define questions to ask the requestor about the entire
|
2016-08-30 16:38:37 +00:00
|
|
|
request, and about each expense in the request. The system can display
|
|
|
|
forms, validate answers, and record answers for questions with the following
|
|
|
|
types of answers:
|
2016-08-30 16:11:48 +00:00
|
|
|
|
|
|
|
* Text
|
|
|
|
* Boolean (yes/no)
|
|
|
|
* Selection (from a list of values)
|
|
|
|
* Number
|
|
|
|
* Currency (this is probably a string that's validated to have a numeric part plus an optional currency code)
|
|
|
|
* Date
|
|
|
|
* File upload
|
|
|
|
|
2016-08-30 16:38:37 +00:00
|
|
|
For each question, the administrator can define any number of conditions to
|
2016-08-30 16:49:13 +00:00
|
|
|
check against the requestor's answer. When a requestor submits an answer that does
|
2016-08-30 16:38:37 +00:00
|
|
|
not comply with all of the conditions, the answer is flagged in the interface
|
|
|
|
as making the expense non-reimuburseable. The first release must support the
|
|
|
|
following conditions:
|
2016-08-30 16:11:48 +00:00
|
|
|
|
|
|
|
* Boolean: is yes, or is no
|
|
|
|
* Selection: the selected value is in a specific subset of values
|
|
|
|
* Date: the value is N days before and/or after today or a date in another answer
|
|
|
|
|
2016-08-30 16:38:37 +00:00
|
|
|
Using these same conditions, the administrator can define questions that are
|
|
|
|
conditional on other questions' answers. These questions are only presented
|
2016-08-30 18:08:13 +00:00
|
|
|
to the requestors when they submit an answer that meets the specified conditions.
|
2016-08-30 18:22:54 +00:00
|
|
|
For illustration purposes, the canonical deployment will have
|
2016-08-30 16:38:37 +00:00
|
|
|
relatively few unconditional questions about each expense (type of expense,
|
|
|
|
receipt, amount), and then a series of conditional questions based on those
|
|
|
|
answers (e.g., follow-up questions specific to airfare expenses,
|
|
|
|
accommodations expenses, etc.).
|
2016-08-30 16:11:48 +00:00
|
|
|
|
2016-08-30 16:49:13 +00:00
|
|
|
### Requestor workflow
|
2016-08-30 16:11:48 +00:00
|
|
|
|
2016-08-30 18:08:13 +00:00
|
|
|
Requestors can log in and see the status of all their requests. They can also
|
Additional request state: Pre-Approval
Many travel policies, for example, require that certain expenses be
approved before tickets can be purchased. An example from Conservancy's
travel policy include: hotel bookings beyond the GSA/Dept-of-State Per
Diem hotel rate, and flights that exceed the with-$100-of-cheapest rule.
As such, requestors need the ability to request preapproval.
These changes herein committed, however, do *not* account for the fact
that a request may already be "In Progress" when another expense comes
up. An example of that is a flight was booked already in policy and the
requestor, and uploaded, and the requestor then discovers later that the
hotel is out-of-policy and needs preapproval. We can perhaps ignore
this scenario for the first specification of this to avoid
feature-creep, but I wanted to flag it as a potential issue for future.
The work around might be that the Bookkeeper is allowed to move a
request between any state to another, so the work-around in this
specific instance may have to require an out-of-band conversation
between bookkeeper and requestor. That's not disaster.
2016-08-30 16:55:50 +00:00
|
|
|
create a new request, which starts either the Pre-Approval or the In Progress
|
|
|
|
state.
|
2016-08-30 16:11:48 +00:00
|
|
|
|
2016-08-30 16:38:37 +00:00
|
|
|
When they view a report, it shows the questions and answers about the entire
|
|
|
|
report, and a list of associated expenses. Viewing a specific expense
|
|
|
|
similarly shows all the questions and answers about it.
|
2016-08-30 16:11:48 +00:00
|
|
|
|
Additional request state: Pre-Approval
Many travel policies, for example, require that certain expenses be
approved before tickets can be purchased. An example from Conservancy's
travel policy include: hotel bookings beyond the GSA/Dept-of-State Per
Diem hotel rate, and flights that exceed the with-$100-of-cheapest rule.
As such, requestors need the ability to request preapproval.
These changes herein committed, however, do *not* account for the fact
that a request may already be "In Progress" when another expense comes
up. An example of that is a flight was booked already in policy and the
requestor, and uploaded, and the requestor then discovers later that the
hotel is out-of-policy and needs preapproval. We can perhaps ignore
this scenario for the first specification of this to avoid
feature-creep, but I wanted to flag it as a potential issue for future.
The work around might be that the Bookkeeper is allowed to move a
request between any state to another, so the work-around in this
specific instance may have to require an out-of-band conversation
between bookkeeper and requestor. That's not disaster.
2016-08-30 16:55:50 +00:00
|
|
|
When a report is in the Pre-Approval state, the requestor is submitting not
|
|
|
|
receipts or invoices, but documents regarding potential expenses that have
|
|
|
|
not yet been incurred, but for which organization policies require
|
|
|
|
preapproval by organizational management ahead of time. The appropriate
|
|
|
|
management representatives are duly notified by the system of pending
|
|
|
|
Pre-Approval requests, and their approval moves the request into the In
|
|
|
|
Progress state. Their rejection moves the request to the Rejected sate.
|
|
|
|
|
2016-08-30 16:49:13 +00:00
|
|
|
When a report is In Progress state, the requestor can edit any answer in the
|
2016-08-30 16:38:37 +00:00
|
|
|
report or an associated expense. They can also add an expense, which begins
|
|
|
|
by asking them unconditional questions associated with expenses, and then
|
|
|
|
follow-up questions as necessary based on those answers.
|
2016-08-30 16:11:48 +00:00
|
|
|
|
2016-08-30 16:38:37 +00:00
|
|
|
When an In Progress report has at least one expense associated with it, and
|
2016-08-30 16:49:13 +00:00
|
|
|
all questions have been answered, the requestor may submit the request for
|
2016-08-30 16:38:37 +00:00
|
|
|
approval. If any of the answers do not meet the administrator's conditions
|
2016-08-30 16:49:13 +00:00
|
|
|
for payment, the requestor may still submit the request, and provide an
|
2016-08-30 16:43:35 +00:00
|
|
|
explanation for why the request should be paid (e.g., because it was
|
2016-08-30 16:38:37 +00:00
|
|
|
approved in advance). Once the request is submitted, it moves to the
|
|
|
|
Submitted state.
|
2016-08-30 16:11:48 +00:00
|
|
|
|
|
|
|
### Bookkeeper workflow
|
|
|
|
|
|
|
|
Bookkeepers can log into the system and see all requests.
|
|
|
|
|
2016-08-30 18:22:54 +00:00
|
|
|
When bookkeepers review a Submitted report, they can change the report's
|
2016-08-30 16:38:37 +00:00
|
|
|
state, and include a note explaining why the report was moved to that state
|
|
|
|
(e.g., moved back to In Progress because a specific receipt was insufficient
|
2016-08-30 18:23:43 +00:00
|
|
|
documentation). When they do this, the system sends email to the requestor
|
2016-08-30 16:38:37 +00:00
|
|
|
letting them know about the change, including the rationale provided by the
|
|
|
|
bookkeeper.
|
|
|
|
|
|
|
|
The bookkeeper can export any request to the books. The first release of the
|
|
|
|
software will simply provide an archive that includes all of the request's
|
|
|
|
supporting documentation, plus a `.ledger` file with entries for each
|
|
|
|
expense. However, note that when building this feature in the code and UI,
|
2016-08-30 18:22:54 +00:00
|
|
|
it should be relatively generic. Exporting should remain abstract enough
|
|
|
|
that integration with other accounting systems remains simple and
|
|
|
|
straightforward. Note that even the mechanics could be different; for
|
|
|
|
example, an SQLedger exporter may add entries to the system directly, rather
|
|
|
|
than providing the bookkeeper with a file download.
|
2016-08-30 16:11:48 +00:00
|
|
|
|
|
|
|
## Requirements potentially for first release
|
|
|
|
|
2016-08-30 16:38:37 +00:00
|
|
|
These are features that we would like the system to have, and it may make
|
|
|
|
sense to make them requirements of the first release depending on how it's
|
|
|
|
built.
|
|
|
|
|
|
|
|
* CiviCRM integration: Many NPOs are already using CiviCRM. CiviCRM
|
|
|
|
integration would provide a familiar interface to users, and simplify
|
|
|
|
system administration for the organization. It may be possible to build
|
|
|
|
the system as a CiviCRM extension. If so, we would get this feature for
|
|
|
|
"free."
|
|
|
|
|
|
|
|
* Usable without JavaScript: For consistent mission advocacy, it's important
|
2016-08-30 16:49:13 +00:00
|
|
|
that some organizations not require requestor to use JavaScript. (e.g., Tor
|
2016-08-30 16:38:37 +00:00
|
|
|
browsers typically have JavaScript disabled because it can undermine Tor's
|
2016-08-30 16:43:35 +00:00
|
|
|
anonymity guarantees.) It should be possible to submit payment
|
2016-08-30 16:38:37 +00:00
|
|
|
requests without JavaScript. The interface can be enhanced when JavaScript
|
|
|
|
is available.
|
|
|
|
|
|
|
|
Whether or not we do this in the first release probably depends on what
|
|
|
|
framework we decide to build on. If the framework itself requires
|
|
|
|
JavaScript out of the box, it may make sense to have the first release go
|
|
|
|
with the flow, then work to add JavaScript-free functionality in a later
|
|
|
|
release.
|
|
|
|
|
2016-08-30 16:11:48 +00:00
|
|
|
|
|
|
|
## Requirements for later releases
|
|
|
|
|
2016-08-30 16:38:37 +00:00
|
|
|
These are features that we would ultimately like the system to have, but we
|
|
|
|
know aren't necessary for the first version. It's good to keep them in mind
|
|
|
|
when architecting, but also to know that they've been considered and aren't
|
|
|
|
immediately necessary.
|
|
|
|
|
|
|
|
* Allow optional questions: With this, question conditions probably need to
|
|
|
|
be extended to address the case of "other question isn't answered"
|
2016-08-30 16:11:48 +00:00
|
|
|
|
|
|
|
* Additional exporters:
|
|
|
|
* Export to SQLedger
|
|
|
|
* [Certainly many more, feel free to add them here]
|
2016-08-30 18:22:54 +00:00
|
|
|
|
2016-08-30 16:38:37 +00:00
|
|
|
* Richer lifecycle management: A leader may need to approve a request before
|
|
|
|
it's added to the books, like an employee's manager or a program director
|
|
|
|
|
2016-08-30 18:16:34 +00:00
|
|
|
* Various currency improvements:
|
|
|
|
* Automatic currency conversion for validation (e.g., validate that an amount
|
|
|
|
in an aribtrary currency is within a limit in USD)
|
|
|
|
|
|
|
|
* Validate currency amounts from outside data sources: The main case for
|
|
|
|
this is per diem, where many organizations use rates that are determined
|
|
|
|
by another party (e.g., US GSA) and updated periodically.
|
|
|
|
|
|
|
|
* Handle totaling the request based on currency (e.g., expenses can are in
|
|
|
|
USD, EUR, CHR but the traveler may want payment in INR.) Unclear what
|
|
|
|
interface for this would look like, but real-time data about past
|
|
|
|
currency rates might be available via an API somewhere, and we can use
|
|
|
|
that to have the requestor give us "preferred currency for payment" so
|
|
|
|
all changes happen in real time in the interface (even allowing the
|
|
|
|
requestor to be able to decide *while filling out the report*: "ugh,
|
|
|
|
these exchange rates to INR are horrible; I'll have them pay my USD
|
|
|
|
account instead").
|
2016-08-30 16:38:37 +00:00
|
|
|
|
|
|
|
* Data import: Apps like [Tricky Tripper](http://trickytripper.blogspot.de/)
|
|
|
|
let users track expenses for a trip as they go. The system could import
|
|
|
|
this data to prepopulate answers to questions about the request and
|
|
|
|
expenses in it. Probably there would be an import API that can map
|
|
|
|
different import formats to a common format, and then administrators can
|
|
|
|
define how questions in their system can be answered based on imported
|
|
|
|
data.
|