Jaime Metcher
Tue, 08 Dec 2009 13:44:11 -0800
Andre, Is this DAO a singleton? I notice the queries aren't var scoped. If this is a singleton under load another thread could easily overwrite your trans_insert variable in between issuing the query and logging the generated key.
Jaime
On Tue, Dec 8, 2009 at 8:58 PM, Andre Kapp <kap...@gmail.com> wrote:
>
> Ok - changed the pk id field returned to the following:
> <cfset theTransID = trans_insert_res.GENERATED_KEY>
>
> Still the same issue.
>
>
> Here is the complete cfc module.... sorry for it being a bit long...
>
> <cfcomponent displayname="TransDAO">
>
> <cffunction name="init" access="public"
> returntype="moneymaker.core.model.trans.TransDAO" output="false">
> <cfargument name="datasourceSettings"
> type="moneymaker.core.model.DatasourceSettings" required="true"/>
> <cfset variables.dss = arguments.datasourceSettings />
> <cfset variables.dsn = variables.dss.getDatasourceName() />
> <cfset variables.accountService =
> application.serviceFactory.getBean("AccountService")>
> <cfreturn this />
> </cffunction>
>
> <cffunction name="fetch" access="public" returntype="Trans"
> displayname="fetch">
> </cffunction>
>
> <cffunction name="process" access="public" returntype="struct">
>
> <cfargument name="acctid" required="Yes" type="numeric" />
> <cfargument name="cardid" required="Yes" type="numeric" />
> <cfargument name="cardnumber" required="Yes" type="numeric" />
> <cfargument name="amount" required="Yes" type="numeric" />
> <cfargument name="type" required="Yes" type="string" />
> <cfargument name="paytype" required="Yes" type="numeric" />
> <cfargument name="description" required="Yes" type="string" />
> <cfargument name="tracenumber" required="no" type="string"
> default="" />
> <cfargument name="stLimits" required="Yes" type="struct" />
>
> <cfset var stTrans = structNew() />
>
> <cftry>
> <cflog file="transdao_cfc" text="Process tx for
> #cardnumber#" type="information">
> <!--- Get balance --->
> <cfset theCurrentAvailableBalance =
> variables.accountService.getAccountBalance("available", arguments.acctid)>
> <cfset theCurrentActualBalance =
> variables.accountService.getAccountBalance("actual", arguments.acctid)>
> <cfset theNewAvailableBalance =
> numberformat(theCurrentAvailableBalance, "_.__") +
> numberformat(arguments.amount, "_.__")>
> <cfset theNewActualBalance =
> numberformat(theCurrentActualBalance, "_.__") +
> numberformat(arguments.amount, "_.__")>
> <cfset theNewActualRunningBalance =
> numberformat(theCurrentActualBalance, "_.__") +
> numberformat(arguments.amount, "_.__")>
>
> <!--- If debit, make sure there is enough funds --->
>
> <!---
> 2009-09-29 AJK
> Changed this to enabled debit to push the account
> into negative.
>
> <cfif arguments.type IS "D99" AND theNewAvailableBalance LT 0>
> <cfthrow errorcode="51" detail="Insuffcient Funds"
> message="Error 51: Card has insufficient funds">
> </cfif>
> --->
>
> <!--- Check status of card/account --->
> <cfquery datasource="#variables.dsn#" name="cardcheck">
> SELECT *
> FROM card
> WHERE card_id = <cfqueryparam cfsqltype="CF_SQL_NUMERIC"
> value="#arguments.cardid#">
> </cfquery>
>
>
> <cfif cardcheck.status_id NEQ 1>
> <cfswitch expression="#cardcheck.status_id#">
> <!--- Closed account --->
> <cfcase value="3"><cflog text="closed
> card:#cardcheck.card_cardnumber# loaded for #arguments.amount# on
> #dateformat(now(), 'yyyy-mm-dd')# #timeformat(now(), 'HH:mm:ss')#"
> file="closed_card_loads" type="Information"></cfcase>
> <!--- Lost Card --->
> <cfcase value="4"><cfif arguments.type NEQ
> "D98"><cfthrow errorcode="41" detail="Lost Card" message="Error 41: Card has
> been reported lost"></cfif></cfcase>
> <!--- Stolen Card --->
> <cfcase value="5"><cfif arguments.type NEQ
> "D98"><cfthrow errorcode="43" detail="Stolen Card" message="Error 43: Card
> has been reported stolen"></cfif></cfcase>
> <!--- Restricted Card --->
> <cfcase value="10">
> <cfthrow errorcode="62" detail="Restricted Card"
> message="Error 62: Card is restricted">
> </cfcase>
> <!--- New Inactive Card --->
> <cfcase value="11">
> <cftry>
> <cfif cardcheck.card_type_id EQ 1 OR
> cardcheck.bin_prog_link_id EQ 9>
> <cfquery datasource="#variables.dsn#">
> update card
> set status_id = 1
> where card_id = <cfqueryparam
> cfsqltype="CF_SQL_NUMERIC" value="#arguments.cardid#">
> </cfquery>
> <cflog text="#cardcheck.card_cardnumber#
> activated on load" file="activate_on_load" type="Information">
> </cfif>
> <cfcatch type="Any">
> <cflog
> text="#cfcatch.toString()#--#cardcheck.card_cardnumber#"
> file="activate_on_load_error" type="Error">
> </cfcatch>
> </cftry>
> </cfcase>
> <!---Invalid Account --->
> <cfdefaultcase><cfthrow errorcode="14" detail="Closed
> account" message="Error 14: Card account has been closed"></cfdefaultcase>
> </cfswitch>
> </cfif>
>
> <!--- If tracenumber is present, check for duplicate transaction
> --->
>
> <cfif len(arguments.tracenumber)>
> <cfquery name="checkTraceNumber"
> datasource="#variables.dsn#">
> SELECT trans_id
> FROM trans
> WHERE
> trans_api_tracenumber = <cfqueryparam
> cfsqltype="cf_sql_varchar" value="#arguments.tracenumber#"> AND
> card_id = <cfqueryparam cfsqltype="CF_SQL_INTEGER"
> value="#arguments.cardid#"> AND
> status_id = <cfqueryparam cfsqltype="CF_SQL_INTEGER"
> value="6">
> </cfquery>
> <cfif checkTraceNumber.recordCount>
> <cfthrow errorcode="61" detail="Duplicate Transaction"
> message="Error 61: Duplicate Transaction Attempt">
> </cfif>
> </cfif>
>
> <!--- If credit, check load limmits --->
> <cfif arguments.type IS "L99" AND isStruct(stLimits)>
>
> <cfif stLimits.loads.checkperload AND
> numberformat(arguments.amount, "_.__") GT
> numberformat(stLimits.loads.per_load_limit, "_.__")>
> <cfthrow errorcode="61" detail="Exceeds Transaction
> Limit" message="Error 61: Exceeds per load limit">
> </cfif>
>
> <!--- <cflog
> text="#stLimits.loads.checkperload#|#numberformat(arguments.amount,
> '_.__')#|#numberformat(stLimits.loads.per_load_limit, '_.__')#"
> file="perloadcheck" type="Error"> --->
>
> <!--- Check per month limit --->
> <cfif stLimits.loads.checkpermonth>
>
> <cfset startdttm = createdate(datepart('yyyy',now()),
> datepart('m',now()), 1)>
> <cfset enddttm = createdate(datepart('yyyy',now()),
> datepart('m',now()), daysinmonth(now()))>
> <cfquery name="getMonthlySum"
> datasource="#variables.dsn#">
> SELECT
>
> IF(ISNULL(SUM(trans_amount)),0,SUM(trans_amount)) AS monthlysum
> FROM
> trans
> WHERE
> acct_id = #arguments.acctid# AND
> trans_transaction_type = 'L99' AND
> status_id = 6 AND
> trans_datetime >= <cfqueryparam
> cfsqltype="cf_sql_varchar" value="#DateFormat(startdttm, 'yyyy-mm-dd')#
> 00:00:00"> AND
> trans_datetime <= <cfqueryparam
> cfsqltype="cf_sql_varchar" value="#DateFormat(enddttm, 'yyyy-mm-dd')#
> 23:59:59">
> </cfquery>
>
> <cfset t = numberformat(getMonthlySum.monthlysum +
> arguments.amount, "_.__")>
> <!--- <cflog
> text="#stLimits.loads.checkpermonth#|#startdttm#|#enddttm#|#numberformat(stLimits.loads.per_month_limit,
> '_.__')#|#t#" file="permonthcheck" type="Error"> --->
>
> <cfif t GT numberformat(stLimits.loads.per_month_limit,
> "_.__")>
> <cfthrow errorcode="61" detail="Exceeds Transaction
> Limit" message="Error 61: Exceeds monthly load limit">
> </cfif>
> </cfif>
>
> </cfif>
>
> <!--- Process Transaction --->
> <cftransaction isolation="READ_COMMITTED">
>
> <!--- Insert trans into gateway --->
> <cfquery datasource="#variables.dsn#" name="trans_insert"
> result="trans_insert_res">
> INSERT INTO trans (
> acct_id,
> card_id,
> trans_pan,
> trans_amount,
> trans_response_code,
> trans_begin_balance,
> trans_end_balance,
> trans_transaction_type,
> trans_message_type,
> trans_description,
> trans_datetime,
> trans_api_tracenumber,
> status_id
> ) VALUES (
> <cfqueryparam cfsqltype="CF_SQL_INTEGER"
> value="#arguments.acctid#">,
> <cfqueryparam cfsqltype="CF_SQL_INTEGER"
> value="#arguments.cardid#">,
> <cfqueryparam cfsqltype="CF_SQL_VARCHAR"
> value="#arguments.cardNumber#">,
> <cfqueryparam cfsqltype="CF_SQL_FLOAT"
> value="#arguments.amount#">,
> <cfqueryparam cfsqltype="CF_SQL_VARCHAR"
> value="00">,
> <cfqueryparam cfsqltype="CF_SQL_FLOAT"
> value="#theCurrentActualBalance#">,
> <cfqueryparam cfsqltype="CF_SQL_FLOAT"
> value="#theNewActualRunningBalance#">,
> <cfqueryparam cfsqltype="CF_SQL_VARCHAR"
> value="#arguments.type#">,
> <cfqueryparam cfsqltype="CF_SQL_INTEGER"
> value="#arguments.paytype#">,
> <cfqueryparam cfsqltype="CF_SQL_VARCHAR"
> value="#arguments.description#">,
> NOW(),
> <cfqueryparam cfsqltype="cf_sql_varchar"
> value="#arguments.tracenumber#">,
> <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="6">
> )
> </cfquery>
>
> <cfset theParentTransID =
> trans_insert_res.GENERATED_KEY>
>
> <cfset theTransID = trans_insert_res.GENERATED_KEY>
>
>
> <cflog file="transdao_cfc" text="Process tx
> for #cardnumber# with tx id #theTransID# and theParentTransID is
> #theParentTransID#" type="information">
>
> <!--- Update acct balance on gateway --->
> <cfquery datasource="#variables.dsn#">
> UPDATE acct_balances
> SET
> acct_balance = acct_balance + #arguments.amount#,
> acct_balance_available = acct_balance_available +
> #arguments.amount#
> WHERE
> acct_id = <cfqueryparam cfsqltype="CF_SQL_INTEGER"
> value="#arguments.acctid#">
> </cfquery>
>
> </cftransaction>
>
>
> <!---------------------------------------------------------------------------
> CHECK FOR NEG to POS
>
> ---------------------------------------------------------------------------->
> <cftry>
> <cfif theCurrentActualBalance LT 0 AND
> theNewActualBalance GTE 0>
> <cfquery datasource="#variables.dsn#">
> UPDATE fees_collection
> SET
> settled = <cfqueryparam
> cfsqltype="CF_SQL_INTEGER" value="1">,
> settled_trans_id = <cfqueryparam
> cfsqltype="CF_SQL_INTEGER" value="#theTransID#">,
> settled_dttm = NOW()
> WHERE
> acct_id = <cfqueryparam
> cfsqltype="CF_SQL_INTEGER" value="#arguments.acctid#"> AND
> settled = 0
> </cfquery>
> </cfif>
> <cfcatch type="any"><cflog file="transdao_cfc"
> text="#cfcatch.toString()#"></cfcatch>
> </cftry>
>
> <!--- Set response --->
> <cfset stTrans.responsecode = 00 />
> <cfset stTrans.transid = theTransID />
> <cfset stTrans.success = true />
> <cfset stTrans.message = "" />
> <cfset stTrans.start_actualbalance = theCurrentActualBalance>
> <cfset stTrans.start_availablebalance =
> theCurrentAvailableBalance>
> <cfset stTrans.end_actualbalance = theNewActualBalance>
> <cfset stTrans.end_availablebalance = theNewAvailableBalance>
> <cflog file="transdao_cfc" text=" Process tx (after
> transaction) for #cardnumber# with tx id #stTrans.transid# and
> theParentTransID is #theParentTransID#" type="information">
>
>
> <cfif #theParentTransID# NEQ #theTransID#>
> <cflog file="transdao_cfc" text="#########
> Different #####################" type="information">
> </cfif>
>
> <cfcatch type="any">
>
> <cflog file="transdao_cfc" text="Error
> happend !!!!! #cfcatch.message# #cfcatch.errorcode#" type="error">
> <cfset stTrans.responsecode = cfcatch.errorcode />
> <cfset stTrans.transid = "" />
> <cfset stTrans.success = false />
> <cfset stTrans.message = cfcatch.message />
> <cfset stTrans.start_actualbalance = 0>
> <cfset stTrans.start_availablebalance = 0>
> <cfset stTrans.end_actualbalance = 0>
> <cfset stTrans.end_availablebalance = 0>
> <cfwddx action="CFML2WDDX" input="#cfcatch#"
> output="errors_wddx">
> <!---
> <cflog text="#errors_wddx#" file="api_load_errors"
> type="Error">
> --->
> </cfcatch>
>
> </cftry>
>
> <cfreturn stTrans />
>
> </cffunction>
>
> </cfcomponent>
>
>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Want to reach the ColdFusion community with something they want? Let them know
on the House of Fusion mailing lists
Archive:
http://www.houseoffusion.com/groups/cf-talk/message.cfm/messageid:328980
Subscription: http://www.houseoffusion.com/groups/cf-talk/subscribe.cfm
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4