magfest / ubersystem

MAGFest's Ubersystem - handles ticketing, staffing, analytics, volunteers, and tons more
http://magfest.org
GNU Affero General Public License v3.0
48 stars 55 forks source link

as an accountant, I need the money in ubersystem to line up with our books #2069

Open binary1230 opened 8 years ago

binary1230 commented 8 years ago

Note 1: existing budget page is currently still broken and over-reporting income by ... a lot :) like $60k/5% off. I plan on rewriting it with a new version that is a more accurate report. needless to say we don't currently use this broken report for anything that touches our real accounting/books :)

We get small discrepancies from year to year due to things like taking payments via cash, square, refunds in stripe/etc.

Originally this task would be a 'nice to have' but turns out we really do need an accurate breakdown of our income for reporting things like donations and cost of goods sold on our non-profit taxes.

It would be cool if we were doing 2 things: 1) (probably not too hard) - do refunds ONLY through ubersystem. Right now reg folks have to go to Stripe and do the refund, and then record the amount in ubersystem. This is a manual and potentially error-prone process. We should be able to do this right within ubersystem via the Stripe API.

2) Need to make sure we are correctly tracking the following stuff:

3) need to create a report which starts with the total amount of all money that uber is aware of, and can lock this down by date so that we can periodically run journal entries in our accounting software for specific date ranges.

the idea would be that we could group charges into categories and do it in a way that subtracts them from the total amount, so the numbers always add up.

i.e. if the total amount for the year so far is $100,000, uber could pull individual charges out of that sum and report:

binary1230 commented 8 years ago

this query gets me $590 under what Stripe reports:

sum([a.amount_paid - a.amount_refunded for a in session.query(Attendee).all()]) + 
sum([g.amount_paid for g in session.query(Group).all()]) + 
sum([a.amount for a in session.query(ArbitraryCharge).all()])

I might be missing something though.

kitsuta commented 8 years ago

Number 1 is impossible when the payment was taken through Square or via cash. Refunds via those methods happens more than you'd think - I'd say at a much higher % than refunds for payments through Stripe (not counting 'expected' refunds like staff badge comping). I'm not super sure what we'd want to do in this case.

Also, just to clarify, reg is not even close to the only department that does refunds. We've had pretty serious problems in the past with departments less-accustomed to the process making assumptions about how it works, so we'd need to either route all refunds via one department (... plz no) or get very good about only granting refund/payment recording access to admins who've been through training.

kitsuta commented 8 years ago

Other thoughts:

1) There is literally no way to record refunds for groups. This is low-hanging fruit, although my personal opinion is that the group payment system should be entirely overhauled due to the weaknesses in its capabilities exposed by the bucket-based pricing.

2) We are mostly recording cash and Square payments OK, but there is little workflow flexibility in terms of how much money was actually taken. In other words, if we decide to discount a badge, a volunteer can click 'mark as paid' and the system will record what badge price should have been paid. The volunteer may forget to go in and adjust that number, causing a discrepancy. We'll want to expose that number to volunteers - perhaps popping up a confirmation box that says "You took $_____ via [cash/Square]" and then if they change the amount, we ideally get sign-off from a higher-level admin (I know that'd be super hard to do right now) and then adjust the overridden_price for the badge (much more doable).

3) AnthroCon (who will no longer be using RAMS) has in the past suggested that we have an accounts report that records every negative and positive adjustment, and whose reports can never be deleted. I think that's called an accounts receivable? Anyway, I expect we'd want to have that somewhere.

EliAndrewC commented 8 years ago

There is literally no way to record refunds for groups.

FWIW, the extremely painful workaround is to mark the individual badges as "paid and refunded" and set the amount_paid for each badge in the group to add up to the total cost of the group, then set the cost of the group to zero. (This is every bit as annoying as it sounds.)

Hachi05 commented 7 years ago

Linking #2502