/**
 * il faut avoir un id_transaction et un transaction_hash coherents
 * pour se premunir d'une tentative d'appel exterieur
 *
 * @param array $config
 * @param null|array $response
 * @return array
 */
function presta_credit_call_response_dist($config, $response = null)
{
    $mode = $config['presta'];
    // recuperer la reponse en post et la decoder, en verifiant la signature
    if (!$response) {
        $response = bank_response_simple($mode);
    }
    if (!isset($response['id_transaction']) or !isset($response['transaction_hash'])) {
        return bank_transaction_invalide(0, array('mode' => $mode, 'erreur' => "id_transaction ou transaction_hash absent", 'log' => bank_shell_args($response)));
    }
    $id_transaction = $response['id_transaction'];
    $transaction_hash = $response['transaction_hash'];
    if (!($row = sql_fetsel('*', 'spip_transactions', 'id_transaction=' . intval($id_transaction)))) {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "transaction inconnue", 'log' => bank_shell_args($response)));
    }
    if ($transaction_hash != $row['transaction_hash']) {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "id_transaction {$id_transaction}, hash {$transaction_hash} non conforme", 'log' => bank_shell_args($response)));
    }
    // Obtenir la devise.
    $auteur = $row['auteur'];
    include_spip('reservations_credits_fonctions');
    /*$credit = credit_client('', $row['auteur'], $devise);
    	spip_log("credit : $credit, montant $montant,auteur $auteur", 'credit');*/
    if ($id_reservation = $row['id_reservation']) {
        $donnees = sql_fetsel('spip_reservations_details.devise,reference,email,id_auteur', 'spip_reservations LEFT JOIN spip_reservations_details USING (id_reservation)', 'spip_reservations.id_reservation=' . $id_reservation);
        $devise = $donnees['devise'];
        $descriptif = _T('reservation_bank:paiement_reservation', array('id_reservation' => $id_reservation));
    } elseif ($id_commande = $row['id_commande']) {
        $devise = 'EUR';
        $descriptif = _T('reservation_bank:paiement_commande', array('id_commande' => $id_commande));
        $id_objet = $id_commande;
        $objet = 'commande';
    } else {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "id_transaction {$id_transaction}, hash {$transaction_hash} objet non connu", 'log' => bank_shell_args($response)));
    }
    // Si on trouve un crédit
    if (isset($row['auteur']) and $email = $row['auteur'] and $credit = credit_client('', $row['auteur'], $devise) and (intval($credit) >= 0 or floatval($var) >= 0.0)) {
        if (!($montant_reservations_detail_total = _request('montant_reservations_detail_total'))) {
            include_spip('inc/reservation_bank');
            $montant_reservations_detail_total = montant_reservations_detail_total($id_reservation);
        }
        $paiement_detail = array();
        foreach (array_keys($montant_reservations_detail_total) as $id_reservation_detail) {
            $paiement_detail[$id_reservation_detail] = _request('montant_reservations_detail_' . $id_reservation_detail);
        }
        if (!($montant_regle = array_sum($paiement_detail))) {
            $montant_regle = $transaction['montant'];
        }
        $set = array("mode" => $mode, "montant_regle" => $montant_regle, "date_paiement" => date('Y-m-d H:i:s'), "statut" => 'ok', "reglee" => 'oui');
        if (intval($credit) >= intval($row['montant']) or floatval($credit) >= floatval($row['montant'])) {
            // OK, on peut accepter le reglement
            $statut = 'reglée';
            $res = true;
        } else {
            // Le crédit n'est pas suffisant
            $set['montant_regle'] = $montant_regle;
            $set['statut'] = 'attente';
            $set['reglee'] = 'par';
            $statut = 'reglée acompte';
            $res = 'wait';
        }
        sql_updateq("spip_transactions", $set, "id_transaction=" . intval($id_transaction));
        spip_log("call_response : id_transaction {$id_transaction}, {$statut}", $mode);
        // Enregistrer un mouvement crédit
        $action = charger_fonction('editer_objet', 'action');
        $reference = $donnes['reference'];
        $set = array('type' => 'debit', 'email' => $email, 'descriptif' => $descriptif, 'id_reservation' => $id_reservation, 'id_objet' => $id_objet, 'objet' => $objet, 'montant' => $montant_regle, 'devise' => $donnees['devise']);
        $action('new', 'reservation_credit_mouvement', $set);
    } else {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "id_transaction {$id_transaction}, montant " . $row['montant'] . "> pas de crédit diponible", 'log' => bank_shell_args($response)));
    }
    $regler_transaction = charger_fonction('regler_transaction', 'bank');
    $regler_transaction($id_transaction, array('row_prec' => $row));
    return array($id_transaction, $res);
}
/**
 * Enregistrer le bon reglement d'une commande liee a une transaction du plugin bank
 *
 * @pipeline bank_traiter_reglement
 *
 * @param array $flux        	
 * @return array mixed
 */
function reservation_bank_bank_traiter_reglement($flux)
{
    // Si on est dans le bon cas d'un paiement de reservation et qu'il y a un id_reservation et que la reservation existe toujours
    if ($id_transaction = $flux['args']['id_transaction'] and $transaction = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction)) and $id_reservation = $transaction['id_reservation']) {
        if (!($montant_reservations_detail_total = _request('montant_reservations_detail_total'))) {
            include_spip('inc/reservation_bank');
            $montant_reservations_detail_total = montant_reservations_detail_total($id_reservation);
        }
        $paiement_detail = array();
        foreach (array_keys($montant_reservations_detail_total) as $id_reservation_detail) {
            $paiement_detail[$id_reservation_detail] = _request('montant_reservations_detail_' . $id_reservation_detail);
        }
        if (!($montant_regle = array_sum($paiement_detail))) {
            $montant_regle = $transaction['montant_regle'];
        } elseif (is_array($montant_regle)) {
            $montant_regle = array_sum($montant_regle);
        }
        set_request('montant_regle', $montant_regle);
        $set = array('montant_regle' => $montant_regle, 'paiement_detail' => serialize($paiement_detail));
        sql_updateq('spip_transactions', $set, 'id_transaction=' . $id_transaction);
        include_spip('action/editer_objet');
        objet_instituer('reservation', $id_reservation, array('statut' => 'accepte', 'date_paiement' => $transaction['date_transaction']));
    }
    return $flux;
}