Avoiding double transaction creating

skala
Julio Montoya 13 years ago
parent f731eab576
commit b8a1823cfb
  1. 36
      tests/migrate/migration.class.php
  2. 54
      tests/migrate/migration.custom.class.php

@ -586,6 +586,22 @@ class Migration {
return Database::store_result($result, 'ASSOC');
}
static function get_transaction_by_item_id($item_id, $branch_id) {
$table = Database::get_main_table(TABLE_MIGRATION_TRANSACTION);
$branch_id = intval($branch_id);
$item_id = intval($item_id);
if (!empty($item_id) && !empty($branch_id)) {
$sql = "SELECT * FROM $table WHERE item_id = $item_id AND branch_id = $branch_id";
$result = Database::query($sql);
if (Database::num_rows($result)) {
return Database::fetch_array($result, 'ASSOC');
}
}
return false;
}
/**
* Gets the latest completed transaction for a specific branch (allows the building of a request to the branch to get new transactions)
* @param int The ID of the branch
@ -792,20 +808,26 @@ class Migration {
*
*/
function load_transaction_by_third_party_id($transaction_external_id) {
//Asking for 2 transactions by getting 1
$result = self::soap_call($this->web_service_connection_info,'transacciones', array('ultimo' => $transaction_external_id, 'cantidad' => 2));
//Hacking webservice default result
if ($result && isset($result[0])) {
//Getting 1 transaction
$result = $result[0];
//Hacking webservice
$transaction_external_id++;
if ($result['idt'] == $transaction_external_id) {
$message = Display::return_message('Transaction id found in third party', 'info');
//Adding third party transaction to Chamilo not sure about this
$chamilo_transaction_id = MigrationCustom::process_transaction($result);
//Adding third party transaction to Chamilo
$transaction_result = MigrationCustom::process_transaction($result);
$transaction_chamilo_info = array();
if ($chamilo_transaction_id) {
$message .= Display::return_message("Transaction added to Chamilo with Id #$chamilo_transaction_id", 'info');
if ($transaction_result['error'] == false) {
$chamilo_transaction_id = $transaction_result['id'];
$message .= Display::return_message($transaction_result['message'], 'info');
$transaction_chamilo_info = self::get_transaction_by_params(array('Where' => array('id = ?' => $chamilo_transaction_id), 'first'));
if (isset($transaction_chamilo_info) && isset($transaction_chamilo_info[$chamilo_transaction_id])) {
$transaction_chamilo_info = $transaction_chamilo_info[$chamilo_transaction_id];
@ -813,8 +835,8 @@ class Migration {
$transaction_chamilo_info = null;
}
} else {
$message .= Display::return_message("Transaction NOT added to Chamilo. Executing transaction on the fly", 'info');
$transaction_chamilo_info = MigrationCustom::process_transaction($result, false);
$message .= Display::return_message("Transaction NOT added to Chamilo. {$transaction_result['message']}", 'warning');
//$transaction_chamilo_info = MigrationCustom::process_transaction($result, false);
}
if (!empty($transaction_chamilo_info)) {

@ -47,6 +47,11 @@ class MigrationCustom {
const TRANSACTION_TYPE_ADD_INTENS = 25;
const TRANSACTION_TYPE_DEL_INTENS = 26;
const TRANSACTION_TYPE_EDIT_INTENS = 27;
static function get_transaction_status_list() {
$table = Database::get_main_table(TABLE_MIGRATION_TRANSACTION_STATUS);
return Database::select("*", $table);
}
/**
* The only required method is the 'none' method, which will not trigger
@ -1513,6 +1518,8 @@ class MigrationCustom {
*/
function process_transactions($params, $web_service_details) {
$transactions = Migration::soap_call($web_service_details, 'transacciones', $params);
$transaction_status_list = self::get_transaction_status_list();
if (!empty($transactions)) {
foreach ($transactions as $transaction_info) {
/*
@ -1525,7 +1532,7 @@ class MigrationCustom {
timestamp
*/
//Add transactions here
self::process_transaction($transaction_info);
self::process_transaction($transaction_info, $transaction_status_list);
}
}
}
@ -1535,8 +1542,13 @@ class MigrationCustom {
* @param array simple return of the webservice transaction
* @return int
*/
static function process_transaction($transaction_info, $save_to_db = true) {
static function process_transaction($transaction_info, $transaction_status_list = array()) {
if ($transaction_info) {
if (empty($transaction_status_list)) {
$transaction_status_list = self::get_transaction_status_list();
}
$params = array(
'transaction_id' => $transaction_info['idt'],
'action' => $transaction_info['ida'],
@ -1545,11 +1557,39 @@ class MigrationCustom {
'branch_id' => $transaction_info['idsede'],
'dest_id' => isset($transaction_info['idd']) ? $transaction_info['idd'] : null,
'status_id' => 0
);
if (!$save_to_db) {
return $params;
}
return Migration::add_transaction($params);
);
//what to do if transaction already exists?
$transaction_info = Migration::get_transaction_by_item_id($params['item_id'], $params['branch_id']);
if (empty($transaction_info)) {
$transaction_id = Migration::add_transaction($params);
return array(
'id' => $transaction_id,
'error' => false,
'message' => "Transaction added to Chamilo #$transaction_id"
);
} else {
//only process transaction if it was failed or to be executed
if (in_array($transaction_info['status_id'], array(MigrationCustom::TRANSACTION_STATUS_FAILED, MigrationCustom::TRANSACTION_STATUS_TO_BE_EXECUTED))) {
return array(
'id' => $transaction_info['id'],
'error' => false,
'message' => "Transaction #{$transaction_info['id']} was already added to Chamilo. Trying to execute because transaction has status: {$transaction_status_list[$transaction_info['status_id']]['title']}"
);
} else {
return array(
'id' => null,
'error' => true,
'message' => "Transaction #{$transaction_info['id']} was already added to Chamilo. Transaction can't be executed twice. Transacion status_id = {$transaction_status_list[$transaction_info['status_id']]['title']}"
);
}
}
return array(
'id' => null,
'error' => true,
'message' => 'Transaction was already treated'
);
}
return false;
}

Loading…
Cancel
Save