FinAccount Transactions for Gift Certificates, Calling Cards, Customer 
Accounts, etc.
-------------------------------------------------------------------------------------

                 Key: OFBIZ-288
                 URL: http://issues.apache.org/jira/browse/OFBIZ-288
             Project: OFBiz (The Open for Business Project)
          Issue Type: New Feature
          Components: accounting
    Affects Versions: SVN trunk
            Reporter: Marco Risaliti


We will be implementing support for FinAccount and FinAccountTransactions as a 
way to purchase and pay with gift certificates, calling cards, or customer 
accounts in OFBiz. Below is a general outline of how it would work: 

Setting up Gift Certificates as Products 

1.Create a new ProductType = "FIN_ACCOUNT" with isPhysical="N" and isDigital = 
"Y" 
2.Add a new field Product.fixedAmount which stores the amount of the gift 
certificate. (This allows the price to be different than the amount, for 
promotions and such.) 

Ordering Gift Certificates 

1.When gift certificate is ordered, system generates a unique random 12-digit 
code of numbers and uppercase letters. It then creates FinAccount, stores email 
in a ContactMech and associates it with FinAccount through a 
FinAccountContactMech. It creates a CommunicationEvent for the gift message and 
stores the gift message there, sets the CommunicationEvent to PENDING, and 
associates it with FinAccount through a finAccountId on CommunicationEvent. 
2.Associate finAccountId with ShoppingCartItem, OrderItem, and InvoiceItem with 
finAccountId. This allows us later to create a feature where people could add 
value to a FinAccount. 
3.When the order is created, the gift certificate products will be fulfilled 
automatically and separately from the other physical products using the 
checkDigitalFulfillment services. Note: This will always be the case, 
regardless of whether the physical items are in stock or not. Separate invoices 
will be generated for the gift certificates and physical products. 
4.When a payment is processed, then the FinAccountTransaction is created for 
the finAccountId. This assures that gift certificates won't be charged until 
the payment is actually collected. FinAccountTransaction is only related to 
payment. 

Using Gift Certificates to Pay 

1.Setting up Gift Certificates as PaymentMethods with PaymentMethodType = 
FIN_ACCOUNT (or GIFT_CERTIFICATE) Model it similar to EXT_BILLACT payments Add 
finAccountId to OrderPaymentPreference. OrderPaymentPreference.maxAmount stores 
maximum amount to be deducted from the FinAccount. 
2.On check out, separate box for Gift Certificate code. 
3.Look up FinAccount from gift certificate code (case insensitive) 
4.Authorize the FinAccount (new authorizeFinAccount service) which checks if 
gift certificate balance plus all un-expired authorizations (in a new entity 
FinAccountAuths) > order amount 
5.If not, return to ask user to add another payment method 
6.Modify authOrderPaymentPreference so that for GIFT_CERTIFICATE it authorizes 
based on balances of FinAccount in FinAccountTransactions and FinAccountAuths 
and store the new authorization in FinAccountAuths 
7.Modify captureOrderPayments to create a FinAccountTransaction. Release 
FinAccountAuth by updating its expiration date to time of payment. 

Email 

1.Email address is Stored in ContactMech and associated with 
FinAccountContactMechPurpose 
2.Message is stored as a CommunicationEvent with the finAccountId 
3.Create new ProductStoreEmailSetting for the template of the email 
4.Get all CommunicationEvent which are PENDING with finAccountId, find matching 
email setting from (3) based on type of CommunicationEvent, and send them. 
5.SECA to send email when any FinAccountTransaction happens? 

Order Cancellation 

1.If an order is cancelled, we should release the authorization by setting its 
expiration date to time in the past. 

Returns 

1.New refundToFinAccount service which creates a Payment and a 
FinAccountTransaction to increase value of FinAccount, related with paymentId 
2.Modify processRefund/processCreditReturn to call service from (1). If 
multiple payment methods are available, refund to credit card, then to gift 
certificates. Each payment methods should be refunded up to the maximum of the 
original OrderPaymentPreference amount. 

(Note about Recording Gift Certificate Authorizations: It is important to 
record the authorizations explicitly rather than rely upon an implicit check of 
current balances because orders usually cause inventory to be reserved for the 
customer. Thus, we don't want several FinAccount transactions to cause 
excessive inventory to be set aside, when in fact the transactions could not go 
through.) 

Entity Model Changes 

1.New Product.fixedAmount field 
2.FinAccountContactMechPurpose entity with fields: finAccountId*, 
contactMechId*, fromDate*, thruDate, contactMechPurposeTypeId 
3.New CommunicationEvent.finAccountId 
4.OrderItem.finAccountId 
5.InvoiceItem.finAccountId 
6.OrderPaymentPreference.finAccountId 
7.FinAccountAuth entity with finAccountAuthId*, finAccountId, authAmount, 
currencyUomId, authTimestamp, fromDate, thruDate 

New Seed Data 
ContactMechPurposeTypeId = "GIFT_CERT_RECIPIENT" 
CommunicationEventTypeId = "GIFT_CERT_MESSAGE" 
PaymentMethodTypeId = "FIN_ACCOUNT" and "GIFT_CERTIFICATE"
 
 

 All    Comments    Work Log    Change History       Sort Order:   
Comment by Jacques Le Roux [29/Mar/06 08:17 AM] [ Permlink ] 
Si, 

Is there a way to link this issue to OFBIZ-733 ? 

Jacques 

Comment by Si Chen [31/Mar/06 01:35 PM] [ Permlink ] 
It turns out that there are some configuration issues for gift certificates 
such as expiration dates, length of authorization, length of account codes, 
etc. These seem most logically associated at the product store level, so I am 
going to create a ProductStoreFinActSetting entity for configuring them. 

Also a couple of other notes - 
1. FinAccountTrans only referenced Payment but did not store its own amount. 
This can be problematic if one payment was used to purchase or activate several 
FinAccounts. So FinAccountTrans needs its own amount field. 
2. FinAccount also needs from and thru dates to govern expiration of various 
types of accounts. 

Comment by Si Chen [31/Mar/06 01:35 PM] [ Permlink ] 
Jacques, I agree this may be a way to solve the issue of advance payments, but 
it is not necessarily the only one. I'm not sure if it's the optimal one 
either. If you're ready to start working on it, let me know. We could discuss 
it further. Si 

Comment by Bradley Plies [31/Mar/06 04:14 PM] [ Permlink ] 
Neat idea. Plan seems pretty thorough. I have a few scenarios or use cases to 
offer for consideration which may not be of any value to what you are intending 
to do. 

1. 12 character code - to prevent brute force attempts to identify and use 
valid gift certificate numbers, some websites I've encountered also introduce a 
"claim code" in addition to the gift certificate number. Even though a 12 
character code represents a large space of potential cert numbers. (10 digits + 
26 capital alphabet characters) ^ 12 digits = 4,738,381,338,321,616,896 
combinations. Given that the number will be random, there is still a 
possibility of generating a number that is already in use so therefore a 
collission-resolution policy (retry) will be necessary. 

2. I know the intent is for digital/online gift cards, but how might this also 
be usable with a physical store / POS that *can* sell gift cards/certs online? 
Could this be used for a physical storefront? Suppose you bought an online gift 
certificate at Best Buy, it could feasibly also be used at a physical store too 
right? Suppose there was a case of having preloaded gift cards for sale at a 
physical store that aren't "activated" until purchased through a POS register. 
Naturally a physical gift card won't have a claim code as merely being in 
possession of the card is all the authentication required... unless the card 
could be tampered with. 

Just other related ideas to consider that may not have much bearing on your 
plan or intent. 

Comment by Si Chen [31/Mar/06 08:49 PM] [ Permlink ] 
With r 7154 thru r 7164 the basic support is in place for tracking balances, 
authorizations, and available balances. Now we'll slowly integrate them into 
the whole checkout. 

Comment by Si Chen [31/Mar/06 08:54 PM] [ Permlink ] 
by the way, for those of you who want to try it, this is a simple beanshell 
test suite for it. 

Comment by Si Chen [05/Apr/06 09:41 AM] [ Permlink ] 
Just a note: 

I am merging these features with the some older GiftCertificateServices. So 
what happens now is: 

1. You set up a Digital Product with a ProductContent for external async 
fulfillment pointing to a gift certificate purchase service. 
2. You configure a survey to collect purchase information in a new 
ProductStoreFinActSetting. 
3. The purchase/authorize/capture/release/refund processes for a gift 
certificate are created as payment gateway services and associated with 
GIFT_CARD payment types via ProductStorePaymentSettings. 

The system would then treat your gift certificate as a GIFT CARD and execute 
normal order processing. 

Comment by Si Chen [05/Apr/06 09:43 AM] [ Permlink ] 
Also, to follow up Brad's comment, 

1. The length of account code is configurable in ProductStoreFinActSetting, and 
whether a PIN # is required is configured there as well. 

2. Yes, this should work in POS as well as ecommerce, though I do not currently 
have plans to implement in POS. 

Comment by Jacques Le Roux [05/Apr/06 10:22 AM] [ Permlink ] 
Thanks Si, 

I'll think about it. 

Jacques 

Comment by Si Chen [04/May/06 05:57 PM] [ Permlink ] 
At this point most of it is done. We just need to move some view and management 
screens back. 

What does everybody think of changing [Billing Account] tab in accounting 
manager to [Accounts] tab, with separate sub-tabs for Billing and Fin Account? 

Comment by Marco Risaliti [13/Sep/06 04:23 PM] [ Permlink ] 
Hi Si, 

which is the status of this issue, it has been completed and so it can be 
closed ? 

Thanks 
Marco 

Comment by Jacques Le Roux [14/Sep/06 01:43 PM] [ Permlink ] 
It's OK for my part. I created a new issue in Apache Jira because I want to 
keep these comments. 

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to