[OPEN-ILS-GENERAL] Negative balances and void payment types

2014-03-05 Thread Kathy Lussier

Hi all,

Following up on a suggestion Chris Sharp made to the Evergreen 
developers list that more development discussion happen on the public 
lists - http://markmail.org/message/cueotsw7ck7crkvd, I would like to 
bring forward a discussion that has been taking place on 
https://bugs.launchpad.net/evergreen/+bug/1198465.


MassLNC contracted with Jason Stephenson to do several projects in the 
area of billing, including this project that would give libraries more 
control over whether negative balances appear on user's record. As many 
of you know, if you configure Evergreen to void a bill when a lost item 
is returned and the patron has already paid for that lost item, a 
negative balance is applied to the patron's record. Some libraries will 
refund these lost fees, so the negative balance makes sense, but most of 
our libraries are unable to issue refunds. Jason shared his plans 
regarding the project on this list back in July - 
http://markmail.org/message/rbz6atf7j2zhe2k3.


I don't think there is any disagreement that fixing the negative balance 
issue is a good thing, but there have been disagreements about the 
approach taken.


To approach this problem, Jason changed the way voiding works in 
Evergreen. Instead of entirely voiding a payment, the system would start 
using a void payment type, similar to the cash, credit, and forgive 
payment types that are already in use. This would allow the system to 
partially void bills that would otherwise show a negative balance. 
Quoting from his original specs:


I believe that a new payment type will need to be added to handle 
voiding of bills. This new payment type will replace the current void 
logic that simply flags bills as voided.


This new payment type is needed because the current way that Evergreen 
voids bills requires that all voids happen in the same increments as 
the bills themselves. This prevents voiding of a partial bill or a 
bill that has had a partial payment applied.


Upon a week's worth reflection on the original code and the alternate 
approaches that have been suggested, I would like to advocate for the 
approach that Jason originally proposed for this project. The void 
payment type makes sense to me for several reasons:


- As was mentioned in the Launchpad discussion, it provides something 
akin to an accounting ledger of credits and debits. No bills simply 
disappear because they have been voided.


- The void payment type works the same way as other credits on the 
patrons' records, providing a level of consistency to the end user.


- There have been suggestions to rename things to fine_reversal or 
account_adjustment. However, I think void is the term that is most 
understandable to our users. Conceptually, when a lost book is returned, 
the billing shouldn't have happened and therefore should be voided. For 
our circ desk staff, there is no distinction in the terminology used for 
bills that are fully voided or partially voided.


- After spending many hours testing this development, I can say the 
learning curve for this new approach is small. Since void payments is 
using the same logic as our other payment types, it is something I 
believe staff can easily understand. When a bill is voided, it no longer 
disappears on the patron record, but remains  with a clear indication 
that the bill was voided, making it very easy for staff to track the 
history of a bill. I have some screenshots at 
http://www.screencast.com/t/ETwr4HCz0 and 
http://www.screencast.com/t/7zgMIiQqu if anyone is interested in seeing 
how it looks to the end user.


I also am concerned about an approach that would make voids work one 
with in a certain set of circumstances and in another way for another 
set of circumstances. One thing that can be confusing for our users is 
when the system does things in a particular way in some cases, but not 
in others. It also makes training and documentation more difficult. I 
wouldn't want to exacerbate this problem.


I agree that there are bugs with this code that needs to be fixed. 
However, having been involved in multiple development project over the 
past few years, I can't say this code has more bugs than other code when 
it is first submitted. Those are fixable. I also understand from the LP 
discussion that the code may affect existing reports. I hope there are 
ways to mitigate this issue, but am I correct in assuming this is likely 
to happen whenever there is an infrastructure change? This bug submitted 
to Launchpad yesterday regarding another recent infrastructure change 
makes me think it isn't unique - 
https://bugs.launchpad.net/evergreen/+bug/1287967. Does this mean we 
shouldn't sometimes look at infrastructure changes when there is an 
overall benefit to the change?


Thank you all for hearing me out on this issue. This functionality is 
something our users are looking forward to seeing in Evergreen, and I 
hope we can come to some kind of agreement.


Kathy

--
Kathy Lussier
Project 

Re: [OPEN-ILS-GENERAL] Negative balances and void payment types

2014-03-05 Thread Mike Rylander
Kathy,

I'm trying to make my response here as in-depth as your email
deserves.  Please bear with me as I work through my thought on this.
I've considered it quite a bit in isolation, and I have been following
along with the conversation over the last few weeks, but it is a
complicated issue that requires a great deal of focused attention to
reason about correctly.  I apologize in advance if I misrepresent
anyone's position or goals, but I've tried my best to make my
understanding of the desired result the focus of my response here.

On Wed, Mar 5, 2014 at 12:18 PM, Kathy Lussier kluss...@masslnc.org wrote:
 Hi all,

 Following up on a suggestion Chris Sharp made to the Evergreen developers
 list that more development discussion happen on the public lists -
 http://markmail.org/message/cueotsw7ck7crkvd, I would like to bring forward
 a discussion that has been taking place on
 https://bugs.launchpad.net/evergreen/+bug/1198465.

 MassLNC contracted with Jason Stephenson to do several projects in the area
 of billing, including this project that would give libraries more control
 over whether negative balances appear on user's record. As many of you know,
 if you configure Evergreen to void a bill when a lost item is returned and
 the patron has already paid for that lost item, a negative balance is
 applied to the patron's record. Some libraries will refund these lost fees,
 so the negative balance makes sense, but most of our libraries are unable to
 issue refunds. Jason shared his plans regarding the project on this list
 back in July - http://markmail.org/message/rbz6atf7j2zhe2k3.

 I don't think there is any disagreement that fixing the negative balance
 issue is a good thing, but there have been disagreements about the approach
 taken.

 To approach this problem, Jason changed the way voiding works in Evergreen.
 Instead of entirely voiding a payment, the system would start using a void
 payment type, similar to the cash, credit, and forgive payment types that
 are already in use. This would allow the system to partially void bills that
 would otherwise show a negative balance. Quoting from his original specs:

 I believe that a new payment type will need to be added to handle voiding
 of bills. This new payment type will replace the current void logic that
 simply flags bills as voided.

 This new payment type is needed because the current way that Evergreen
 voids bills requires that all voids happen in the same increments as the
 bills themselves. This prevents voiding of a partial bill or a bill that has
 had a partial payment applied.


This presupposes a definition for void which (from a historical
perspective) does not match the intent of the code, though the
statements about voiding are, in themselves, completely correct.  I
will address that below, but I just want to put a pin in this point.

 Upon a week's worth reflection on the original code and the alternate
 approaches that have been suggested, I would like to advocate for the
 approach that Jason originally proposed for this project. The void payment
 type makes sense to me for several reasons:

 - As was mentioned in the Launchpad discussion, it provides something akin
 to an accounting ledger of credits and debits. No bills simply disappear
 because they have been voided.

 - The void payment type works the same way as other credits on the patrons'
 records, providing a level of consistency to the end user.

 - There have been suggestions to rename things to fine_reversal or
 account_adjustment. However, I think void is the term that is most
 understandable to our users. Conceptually, when a lost book is returned, the
 billing shouldn't have happened and therefore should be voided. For our circ
 desk staff, there is no distinction in the terminology used for bills that
 are fully voided or partially voided.


Please, all, take this with a big pinch of pedant-flavored salt (and
feel free to skip this paragraph if you'd rather not see more pedantry
from me), but there's just no such thing as partially voided.  It's
correct to say that in a double-entry ledger you can use a balancing
credit to partially or completely cancel a debit, as Jason mentions in
the LP thread, but that's not voiding.  Voiding, as it exists in
double-entry accounting, means exactly strike through this, because
it was a mistake (or premature or incorrect) and does not match
reality, so we will ignore its effects.  For instance, in QuickBooks
(only because I happen to have the docs for that handy), voiding zeros
the effective amount of the ledger entry.  Now, QB is no paragon of
industrial strength double-entry accounting software, but it's
certainly more right than wrong.  (And, while I hesitate to cite them,
MS Office's docs say basically the same thing about voiding ... though
I'm not sure that helps my case. ;) ).  My point is that void has a
well-defined meaning, and in all cases where we could compare what
Evergreen does to another accounting software package, 

Re: [OPEN-ILS-GENERAL] Negative balances and void payment types

2014-03-05 Thread Mike Rylander
Thanks, Dan.

I see where my thinking went astray.  I was imagining (as a final
implementation) a design where we leverage the payment-by-billing-type
code to walk backwards through the line items of a transaction,
voiding anything with no payments  (where appropriate) until we hit a
billing with a payment, at which point we have to start using
balancing credits.  So, I was jumping to a version of your (2),
basically.

I think I agree with your assertion about overdues being adjusted
instead of voided -- that really is a credit the patron situation
which is separate from both credit (not card) and forgive payment
types.  Un-adjusting those billings when the item is found would
probably be best done as a void of the adjustment from a logical
standpoint, but simply deleting them might be easier to deal with.
Obviously, credit-style payments are the only kind that should be
delete-able, so perhaps a new level in the inheritance hierarchy
would be in order, which could also serve as the level at which the
billing link might be added to those credit type payments.  And now
I've digressed far into implementation details and should stop (on
this thread, at least) ... but, suffice it to say, I do certainly see
an internally self-consistent and manageable path forward to address
not just the specific issue of negative patron balances, but a host of
currently-circuitous workarounds and oddities with complex billing
situations.

My misunderstanding (and belief that (2) would be the ideal) aside,
and addressing your branch specifically with regard to the core point
of this discussion, I maintain that reimplementing void is the
primary danger -- for the reasons I listed up-thread -- and I really
want to see if my belief that your adjustments to Jason's work fill
the needs of MassLNC.  I'm pretty confident that they will, even more
so now that you've clarified that the adjust behavior does
effectively replace the current void behavior.

Again, thanks, Dan and all!


On Wed, Mar 5, 2014 at 5:10 PM, Dan Wells d...@calvin.edu wrote:
 Mike and Kathy, thanks for taking the time it took to craft your thorough 
 responses.  It really helps outline many of the areas of contention.

 I want to point out, though, that my current branch doesn't do quite what is 
 stated in Mike's email.  There are really three ways we could go when 
 applying the new logic:

 1) Always* do voids (old way)
 2) Do voids where you can, adjust where you need to (mixed way)
 3) Always* do adjustments (new way)

 My current code lets you pick between 1 and 3, rather than go the extra mile 
 and try to be context sensitive (the mixed way).  (*It also lets you set a 
 different always-ness for lost vs overdue, if desired.)  Not saying we 
 can't or shouldn't work in a direction where the code is context sensitive, 
 but it seemed like early adopters were putting a high value on sameness of 
 the transactions, so the first crack went that route.

 Also, I want to highlight something else about my branch which I noted in one 
 of my long comments on the LP bug:

  c) * The one place where the code now always adjusts (never voids) is for 
 overdue-lost behavior. Overdue fines are adjusted to zero (if the option is 
 on), not voided. I think this makes sense logically (they still happened, we 
 are just not charging for them), and it makes it much easier to accurately 
 reinstate these fines if the lost item is returned (if *that* option is on).

 Basically, I believe that voiding overdues when marking an item lost is a 
 grey area for our technical definition of void (especially if plan to 
 possibly reinstate them), so I took it the other direction in that one case.  
 This is primarily an implementation choice, and not particular crucial to the 
 discussion, but since it is used in a couple of Mike's examples, I wanted to 
 point it out.

 Thanks again,
 Dan



-- 
Mike Rylander
 | Director of Research and Development
 | Equinox Software, Inc. / Your Library's Guide to Open Source
 | phone:  1-877-OPEN-ILS (673-6457)
 | email:  mi...@esilibrary.com
 | web:  http://www.esilibrary.com