
<?

/*

######
# API:
$set_refund_reason
$set_reason_code = ""; // (GSP = 11 = CHARGEBACK; 12 = REFUND;)
$set_administrative_message
$set_deposit_translogid
$set_deposit_transactionid
$set_merchant_rating_action
$set_processing_gateway_action
######


logger3("callback_action",$callback_action);
logger3("callback_reason",$callback_reason);

/// GET DEPOSIT DETAILS:
$set_deposit_transactionid = trim($set_deposit_transactionid);
$set_deposit_translogid = trim($set_deposit_translogid);

*/


logger3("111. set_reason_code",$set_reason_code);
logger3("111. set_deposit_translogid",$set_deposit_translogid);
logger3("111. set_deposit_transactionid",$set_deposit_transactionid);
logger3("111. set_refund_reason",$set_refund_reason);
///logger3("set_master_transactionid",$set_master_transactionid); //<-- webbilling


if(!empty($set_deposit_transactionid)) {
	$tmp_sql = "SELECT * FROM transactions WHERE description = 'Deposit' AND transactionid LIKE '" . $set_deposit_transactionid . "';";

} else if(!empty($set_deposit_translogid)) {
	$tmp_sql = "SELECT * FROM transactions WHERE description = 'Deposit' AND translogid LIKE '" . $set_deposit_translogid . "';";
}

logger3("tmp_sql",$tmp_sql);
$transaction_deposit = object2array(readTHECASHIER($tmp_sql));

logger3("transaction_deposit",$transaction_deposit);


//$transaction_deposit['return_datetime'] = "";
if(empty($transaction_deposit['return_datetime'])) {
	
	### GET TRANSLOG DETAILS:
	$tmp_sql = "SELECT * FROM translog WHERE translogid LIKE '". $transaction_deposit['translogid'] ."';";
	$translog_details = object2array(readTHECASHIER($tmp_sql));
	

	#####################################################################################
	/// GET OUTGOING DETAILS:
	$tmp_sql = "SELECT * FROM transactions WHERE 
		description = 'Outgoing' AND 
		method_details = '" . $transaction_deposit['account_details'] . "' AND 
		transaction_gross_value = '" . $transaction_deposit['transaction_gross_value'] . "' AND 
		authorization = '" . $transaction_deposit['authorization'] . "';";
	$transaction_outgoing = object2array(readTHECASHIER($tmp_sql));
	
	logger3("tmp_sql",$tmp_sql);
	logger3("transaction_outgoing",$transaction_outgoing);
	
	
	
	/// GET INCOMING DETAILS:
	logger3("transaction_deposit['account_details']",$transaction_deposit['account_details']);
	logger3("transaction_deposit['transaction_gross_value']",$transaction_deposit['transaction_gross_value']);
	logger3("transaction_deposit['requested_datetime'] ",$transaction_deposit['requested_datetime']);
	
	
	$tmp_sql = "SELECT * FROM transactions WHERE 
		description = 'Incoming' AND 
		method_details = '" . $transaction_deposit['account_details'] . "' AND 
		transaction_gross_value = '" . $transaction_deposit['transaction_gross_value'] . "' AND 
		requested_datetime = '" . $transaction_deposit['requested_datetime'] . "';";
	$transaction_incoming = object2array(readTHECASHIER($tmp_sql));
	
	logger3("tmp_sql",$tmp_sql);
	logger3("transaction_incoming",$transaction_incoming);
	
	if(empty($transaction_incoming['hash'])) {
		
		$tmp_sql = "SELECT * FROM transactions WHERE 
		description = 'Incoming' AND 
		account_details = '" . $transaction_outgoing['account_details'] . "' AND 
		transaction_gross_value = '" . $transaction_outgoing['transaction_gross_value'] . "' AND 
		requested_datetime = '" . $transaction_outgoing['requested_datetime'] . "';";
		$transaction_incoming = object2array(readTHECASHIER($tmp_sql));
		
	}
	
	
	logger3("tmp_sql",$tmp_sql);
	logger3("transaction_incoming",$transaction_incoming);
	
	
	
	
	
	
	#####################################################################################
	### SET MESSAGES
	
	
	if(
	($set_reason_code == "1")
	) {
		
		$update_deposit_status = "Failed";
		$update_outgoing_status = "Failed";
		$update_incoming_status = "Chargeback";
		
		$update_deposit_return_reason = "Reversed";
		$update_outgoing_return_reason = "Reversed";
		$update_incoming_return_reason = "Customer Dispute";
	}
	
	
	if(
	($set_reason_code == "2")
	) {
		
		$update_deposit_status = "Failed";
		$update_outgoing_status = "Failed";
		$update_incoming_status = "Chargeback";
		
		$update_deposit_return_reason = "Failed";
		$update_outgoing_return_reason = "Failed";
		$update_incoming_return_reason = "Bank Account Does Not Exist";
	}
	
	
	if(
	($set_reason_code == "3")
	) {
		
		$update_deposit_status = "Failed";
		$update_outgoing_status = "Failed";
		$update_incoming_status = "Chargeback";
		
		$update_deposit_return_reason = "Failed";
		$update_outgoing_return_reason = "Failed";
		$update_incoming_return_reason = "Insufficient Funds.  (NOTE:  REBILL is available once per sale.  <p><b>INSTRUCTION:</b> REBILL <b><i>only after</i></b> customer confirms funds have been added.)";  // actually, "No Settlement" (but that doesn't mean anything to anyonne)
	}
	
	
	if(
	($set_reason_code == "4")
	) {
		
		$update_deposit_status = "Failed";
		$update_outgoing_status = "Failed";
		$update_incoming_status = "Chargeback";
		
		$update_deposit_return_reason = "Failed";
		$update_outgoing_return_reason = "Failed";
		$update_incoming_return_reason = "Insufficient Bank Details";
	}
	
	
	if(
	($set_reason_code == "5")
	) {
		
		$update_deposit_status = "Failed";
		$update_outgoing_status = "Failed";
		$update_incoming_status = "Chargeback";
		
		$update_deposit_return_reason = "Failed";
		$update_outgoing_return_reason = "Failed";
		$update_incoming_return_reason = "Direct Debit Blocked";
	}
	
	
	if(
	($set_reason_code == "6")
	) {
		
		$update_deposit_status = "Failed";
		$update_outgoing_status = "Failed";
		$update_incoming_status = "Chargeback";
		
		$update_deposit_return_reason = "Failed";
		$update_outgoing_return_reason = "Failed";
		$update_incoming_return_reason = "Insufficient Funds.  (NOTE:  REBILL is available once per sale. <p> <b>INSTRUCTION:</b> REBILL <b><i>only after</i></b> customer confirms funds have been added.)";
	}
	
	
	if(
	($set_reason_code == "10")
	) { 
		
		$update_deposit_status = "Failed";
		$update_outgoing_status = "Failed";
		$update_incoming_status = "Failed";
		
		$update_deposit_return_reason = "Failed";
		$update_outgoing_return_reason = "Failed";
		$update_incoming_return_reason = "SEPA Blocked. (Customer must call bank to \"activate SEPA Direct Debit\".)<p>
		<b>INSTRUCTION:</b> REBILL <b><i>after</i></b> customer confirms \"SEPA activation\"."; // actually, "Unknown Reason"
	}
	
	
	
	### GSP:
	
	if(
	($set_reason_code == "11") ||
	(stristr($set_reason_code,"CHARGEBACK")) // CREDITCARD (GSP) CHARGEBACK
	) {
		
		$update_deposit_status = "Chargeback";
		$update_outgoing_status = "Chargeback";
		$update_incoming_status = "Chargeback";
		
		$update_deposit_return_reason = "Chargeback";
		$update_outgoing_return_reason = "Chargeback";
		$update_incoming_return_reason = "<u>Customer-Initiated: Chargeback / <i>Demanded Payment Reversal</i></u> (via the processing bank).";
		//$set_processing_gateway_action = "SKIP";
	}
	
	if(
	($set_reason_code == "12") ||
	(stristr($set_reason_code,"CANCEL"))
	) {// CREDITCARD (GSP) REFUND
		
		$update_deposit_status = "Canceled";
		$update_outgoing_status = "Reversed";
		$update_incoming_status = "Canceled";
		
		$update_deposit_return_reason = "Canceled";
		$update_outgoing_return_reason = "Canceled";
		$update_incoming_return_reason = "<u>Customer-Initiated: Chargeback / <i>Demanded Payment Reversal</i></u> (via <b>" . $_SESSION['template']['company']['domain'] . "</b>).";
	}
	
	
	if(
	($set_reason_code == "13") ||
	(stristr($set_reason_code,"FRAUD"))
	) {// CREDITCARD (GSP) REFUND
		
		$update_deposit_status = "Canceled";
		$update_outgoing_status = "Reversed";
		$update_incoming_status = "Fraud";
		
		$update_deposit_return_reason = "Fraud";
		$update_outgoing_return_reason = "Fraud";
		$update_incoming_return_reason = "<u>Customer Claims \"MERCHANT FARUD\": <i>Demanded Refund</i></u> (via <b>" . $_SESSION['template']['company']['domain'] . "</b>).";
	}
	
	if(
	($set_reason_code == "14") ||
	(stristr($set_reason_code,"REFUND"))
	) {// CREDITCARD (GSP) REFUND
		
		$update_deposit_status = "Refunded";
		$update_outgoing_status = "Refunded";
		$update_incoming_status = "Refunded";
		
		$update_deposit_return_reason = "Refunded";
		$update_outgoing_return_reason = "Refunded";
		$update_incoming_return_reason = "Merchant-Initiated: A refund was issued to the customer. (<u>Your Merchant Rating was NOT EFFECTED</u>.)";
		$set_merchant_rating_action = "SKIP"; // always set SKIP for business-initiated REFUND
	}
	
	if(
	($set_reason_code == "15") ||
	(stristr($set_reason_code,"ADMIN")) ||
	(stristr($set_reason_code,"REVERSED"))
	) {// CREDITCARD (GSP) REFUND
		
		$update_deposit_status = "Reversed";
		$update_outgoing_status = "Reversed";
		$update_incoming_status = "Reversed";
		
		$update_deposit_return_reason = "Reversed";
		$update_outgoing_return_reason = "Reversed";
		$update_incoming_return_reason = "ADMINISTRATIVE REFUND: ".$set_refund_reason;
		
	}
	
	
	
	
	
	$datetime_updated = datetime();
	
	#####################################################################################
	#####################################################################################
	$do_the_refund_now = "enabled"; // disable for testing
	if($do_the_refund_now) {
		
		
		#####################################################################################
		/// UPDATE TRANSLOG:
		$tmp_sql = "UPDATE translog SET 
			status = '" . $update_deposit_status . "', 
			datetime_updated = '" . $datetime_updated . "' 
		   	WHERE translogid LIKE '" . $transaction_deposit['translogid'] . "';";
		$transaction_update_translog = updateTHECASHIER($tmp_sql);
		
		logger3("tmp_sql",$tmp_sql);
		logger3("transaction_update_translog",$transaction_update_translog);
		
		
		
		
		
		####################################
		### UPDATE THE "DEPOSIT" TRANSACTION
		
		$tmp_sql = "UPDATE transactions SET 
			status = '" . $update_deposit_status . "', 
			return_datetime = '" . $datetime_updated . "', 
			return_reason = '" . $update_deposit_return_reason . "' 
		   	WHERE transactionid LIKE '" . $transaction_deposit['transactionid'] . "';";
		$transaction_update_deposit = updateTHECASHIER($tmp_sql);
		
		logger3("tmp_sql",$tmp_sql);
		logger3("transaction_update_deposit",$transaction_update_deposit);
		
		
		
		####################################
		### UPDATE THE ASSOCIATED "OUTGOING" TRANSFER:
		$tmp_sql = "UPDATE transactions SET 
			status = '" . $update_outgoing_status . "', 
			return_datetime = '" . $datetime_updated . "', 
			return_reason = '" . $update_outgoing_return_reason . "'
			WHERE transactionid LIKE '" . $transaction_outgoing['transactionid'] . "';";
		$transaction_update_outgoing = updateTHECASHIER($tmp_sql);
		
		logger3("tmp_sql",$tmp_sql);
		logger3("transaction_update_outgoing",$transaction_update_outgoing);
		
		
		
		####################################
		### UPDATE THE ASSOCIATED "INCOMING" TRANSACTION:
		

		$balance_of_business_before = balance($transaction_incoming['accountid']);
		logger3("balance_of_business_before",$balance_of_business_before);
		
		logger3("transaction_incoming['fee_total_value']",$transaction_incoming['fee_total_value']);
		logger3("transaction_incoming['transaction_gross_value']",$transaction_incoming['transaction_gross_value']);
		logger3("transaction_incoming",$transaction_incoming);
		
		$transaction_incoming['net_value'] = currency_format($transaction_incoming['transaction_gross_value'] - $transaction_incoming['fee_total_value']);
		logger3("incoming_net_value",$transaction_incoming['net_value']);
		
		//$balance_of_customer_after = $balance_of_customer_before['account'] - $transaction_deposit['transaction_gross_value'];  // no need -- customer is a wash
		$balance_of_business_after['account'] = currency_format($balance_of_business_before['account_balance'] - $transaction_incoming['net_value']);
		logger3("balance_of_business_after['account']",$balance_of_business_after['account']);
		
		
		# if(
		# ($transaction_deposit['rolling_release_datetime'] != NULL) &&
		# ($transaction_deposit['rolling_release_datetime'] != "NULL") &&
		# ($transaction_deposit['rolling_release_datetime'] != "") &&
		# ($transaction_deposit['rolling_release_datetime'] != " ")
		# ) {
		# 	/// deduct from available balance:
		# 	$balance_of_business_after['available'] = currency_format($balance_of_business_before['available'] - $transaction_incoming['net_value']);
		# } else {
		#     $balance_of_business_after['available'] = currency_format($balance_of_business_before['available']);
		# }
		
		### 2014.05.03
		// always subtract from available -- down to 0.00 -- never negative
		## check to see if DTR has released, or not:
		
		if(!empty($transaction_incoming['rolling_release_datetime'])) {
			$balance_of_business_after['available'] = currency_format($balance_of_business_before['available'] - $transaction_incoming['net_value']);
			if($balance_of_business_after['available'] < "0.00") {
				$balance_of_business_after['available'] = "0.00";
			}
			$add_available_balance = ",available = '" . $balance_of_business_after['available'] . "'";
		}
		
		logger3("balance_of_business_after['available']",$balance_of_business_after['available']);
		
		
		
		$tmp_sql = "UPDATE balances 
					SET 
					account_balance = '" . $balance_of_business_after['account'] . "'
					$add_available_balance
					WHERE 
					accountid LIKE '" . $transaction_incoming['accountid'] . "'
					AND platform = '".$_SESSION['template']['company']['domain']."'
					AND currency_iso3 = '".$_SESSION['template']['company']['currency1']."';";
		$transaction_update_balances = updateTHECASHIER($tmp_sql);
		logger3("tmp_sql",$tmp_sql);
		logger3("transaction_update_balances",$transaction_update_balances);
		
		
		
		$tmp_sql = "UPDATE transactions SET 
					status = '" . $update_incoming_status . "', 
					return_datetime = '" . $datetime_updated . "', 
					return_reason = '" . $update_incoming_return_reason . "', 
					return_account_balance_before = '" . $balance_of_business_before['account'] . "',
					return_account_balance_after = '" . $balance_of_business_after['account'] . "', 
					return_available_balance_before = '" . $balance_of_business_before['available'] . "',
					return_available_balance_after = '" . $balance_of_business_after['available'] . "',
					return_effects_merchant_rating = '".$set_merchant_rating_action."'
					WHERE 
					transactionid LIKE '" . $transaction_incoming['transactionid'] . "';
					";
		$transaction_update_incoming = updateTHECASHIER($tmp_sql);
		logger3("INCOMING: tmp_sql",$tmp_sql);
		logger3("INCOMING: transaction_update_incoming",$$transaction_update_incoming);
		
		
		####################################
		### UPDATE THE ASSOCIATED "INCOMING" TRANSFER:
		#$tmp_sql = "UPDATE transactions SET 
		#			status = '" . $update_incoming_status . "', 
		#			return_datetime = '" . $datetime_updated . "', 
		#			return_reason = '" . $update_incoming_return_reason . "'
		#			WHERE 
		#			transactionid LIKE '" . $transaction_incoming['transactionid'] . "';";
		#$tmp_transaction_update = updateTHECASHIER($tmp_sql);
		#logger3("tmp_sql",$tmp_sql);
		#logger3("tmp_transaction_update",$tmp_transaction_update);
	}
	
	

	
	if(
	($transaction_update_translog == 1) &&
	($transaction_update_deposit == 1) &&
	($transaction_update_outgoing == 1) &&
	($transaction_update_balances == 1) &&
	($transaction_update_incoming == 1) 
	) {
		$process_refund_results = "APPROVED";
		
	} else {
		$process_refund_results = "FAILED";
	}
	
	
	logger3("process_chargeback",$process_refund_results);
	logger3("set_processing_gateway_action",$set_processing_gateway_action);
	### SEND TO GATEWAY
	if(
	(stristr($process_refund_results,"APPROVED")) &&
	(!stristr($set_processing_gateway_action,"SKIP"))
	) {

		
		logger3("translog_details['transactionid_from_gateway']",$translog_details['transactionid_from_gateway']);
		logger3("translog_details['amount']",$translog_details['amount']);

		
	    $process_refund_results = refund_to_gateway($transactionid=$transaction_deposit['transactionid'],$comments='(none)');
	    logger3("process_refund_results",$process_refund_results);
	
	} else {
	
		logger3("SKIPPED: set_processing_gateway_action",$set_processing_gateway_action);
	
	}
	
	
	

		
		
		
		
	logger3("process_refund_results",$process_refund_results);

		
	if($process_refund_results == "APPROVED") {
	
		### EMAIL RECEIPT:
		$business_account = account($transaction_incoming['accountid']);
		logger3("business_account",$business_account);
		$customer_account = account($transaction_deposit['accountid']);
		logger3("customer_account",$customer_account);
		$customer_member = member($transaction_deposit['memberid']);
		logger3("customer_member",$customer_member);
		
		$business_creator_member = member($business_account['creator_memberid']);
		
		
		logger3("update_incoming_status",$update_incoming_status);
		//exit;
		
		
		if(stristr($update_incoming_status,"REFUND")) {
			
			# one to the customer:
			$email_receipt = "reversal_customer_REFUND";
			include($_SESSION['template']['company']['file_path'] . "shared/email_receipts.shared");
			
			# one to the business:
			$email_receipt = "reversal_business_REFUND";
			include($_SESSION['template']['company']['file_path'] . "shared/email_receipts.shared");
			
			$send_reminder_to_use_CRM = "NO";
		}
		
		
		if(stristr($update_incoming_status,"CANCEL")) {
			
			# one to the customer:
			$email_receipt = "reversal_customer_CANCEL";
			include($_SESSION['template']['company']['file_path'] . "shared/email_receipts.shared");
			
			# one to the business:
			//$email_receipt = "reversal_business_CANCEL";
			$email_receipt = "chargeback_business";
			include($_SESSION['template']['company']['file_path'] . "shared/email_receipts.shared");
			
			$send_reminder_to_use_CRM = "YES";
		}
		
		
		
		if(stristr($update_incoming_status,"FRAUD")) {
		
			
		
			# one to the customer:
			$email_receipt = "reversal_customer_FRAUD";
			include($_SESSION['template']['company']['file_path'] . "shared/email_receipts.shared");
			
			# one to the business:
			$email_receipt = "reversal_business_FRAUD";
			include($_SESSION['template']['company']['file_path'] . "shared/email_receipts.shared");
		
			$send_reminder_to_use_CRM = "YES";
			
		}
		
		
		if(stristr($update_incoming_status,"CHARGEBACK")) {
		
			# one to the customer: why ?
			//$email_receipt = "chargeback_customer";
			//include($_SESSION['template']['company']['file_path'] . "shared/email_receipts.shared");
			
			
			# one to the business:
			$email_receipt = "chargeback_business";
			include($_SESSION['template']['company']['file_path'] . "shared/email_receipts.shared");
			
			$send_reminder_to_use_CRM = "YES";
		}
		
		
		### SEND POSSIBLE REMINDER TO USE CRM:
		if($send_reminder_to_use_CRM == "YES") {
						
			
			$email_receipt = "remember_to_use_CRM";
			include($_SESSION['template']['company']['file_path'] . "shared/email_receipts.shared");
			
		}
		
		
		
		
			
			
		## EMAIL MESSAGE:
		//if(stristr($update_incoming_status,"CANCEL")) $update_incoming_status = "CHARGEBACK"; // visual fix
		
		
		
		$business_creator_member = member($business_account['creator_memberid']);
		
		if(empty($source_of_refund_request)) $source_of_refund_request = "?";
		
		/// $CALLBACK_TIME = FROM CALL_transaction_courtesy_followup_v2.gate
		if(stristr($_SERVER['SCRIPT_URL'],"CALL_transaction_courtesy_followup")) $source_of_refund_request = "DAY $CALLBACK_TIME CALLBACK";
		
		// logger3("_SERVER['SCRIPT_URL']",$_SERVER['SCRIPT_URL']);
		// exit;
		
		$message = "
		REFUND/CHARGEBACK REPORT (via ".$source_of_refund_request .")<br>
		<br>
		CUSTOMER NAME: ". $customer_account['accountname'] ."<br>
		TRANSACTION VALUE: ".currency_format($transaction_deposit['transaction_gross_value']) ."<br>
		<br>
		". $translog_details['acquirer'] ." TRANSACTION ID: ". $translog_details['transactionid_from_gateway'] ."<br>
		GMT TRANSACTION TIMESTAMP: ". $transaction_deposit['requested_datetime'] ."<br>
		<br>
		<hr>
		<br>
		DATETIME: ". datetime() ."<br>
		<br>
		CUSTOMER MEMBER ID: ". $customer_member['hash'] ."<br>
		CUSTOMER ACCOUNT ID: ". $customer_account['hash'] ."<br>
		CUSTOMER NAME: ". $customer_account['accountname'] ."<br>
		TRANSACTION VALUE: ". currency_format($transaction_deposit['transaction_gross_value']) ."<br>
		STATUS: REVERSAL/<b>". strtoupper($update_incoming_status) ."</b><br>
		DB UPDATE STATUS: ". $process_refund_results ."<br>
		<br>
		BUSINESS OWNER (MEMBER ID): ". $business_creator_member['hash'] ."<br>
		BUSINESS ID: ". $business_account['hash'] ."<br>
		BUSINESS NAME: ". $business_account['accountname'] ."<br>
		<br>
		";
		
		//quick_mailer($master_config_admin_emailaddress,,$message,$alert=null);
		$subject = "process_chargeback.shared: REVERSAL/".strtoupper($update_incoming_status);
		bmailalert($subject,$message);
	} ## END IF COMPLETE
	

} else {

	$process_refund_results = "FAILED / POSSIBLE DUPLICATE";

}


### DO NOT EXIT -- SCRIPT CONTINUES AFTER THIS ICNLUDE...



?>