/**
 * 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);
}
/**
 * permet de modifier le tableau de valeurs envoyé par la fonction charger d’un formulaire CVT
 *
 * @pipeline formulaire_charger
 *
 * @param array $flux
 *        	Données du pipeline
 * @return array Données du pipeline
 */
function reservation_bank_formulaire_charger($flux)
{
    $form = $flux['args']['form'];
    if ($form == 'reservation') {
        $flux['data']['checkout'] = _request('checkout');
        if ($flux['data']['checkout'] = _request('checkout')) {
            $flux['data']['message_ok'] .= recuperer_fond('inclure/paiement_reservation', array('id_reservation' => session_get('id_reservation'), 'cacher_paiement_public' => FALSE));
            $flux['data']['editable'] = FALSE;
        }
    }
    if ($form == 'encaisser_reglement') {
        $id_transaction = $flux['data']['_id_transaction'];
        // Les infos supplémentaires de la transaction
        $transaction = sql_fetsel('id_reservation,montant,auteur', 'spip_transactions', 'id_transaction=' . $id_transaction);
        $id_reservation = $flux['id_reservation'] = $transaction['id_reservation'];
        $montant_transaction = $flux['montant'] = $transaction['montant'];
        // Cas spécial pour les crédits
        if ($flux['data']['_mode'] == 'credit' and $credit = credit_client('', $transaction['auteur'])) {
            $flux['data']['credit'] = '';
            $flux['data']['email_client'] = $email_client = $transaction['auteur'];
            $flux['_hidden'] .= '<input name="email_client" value="' . $email_client . '" type="hidden"/>';
        }
        // Définir les champs pour les détails de réservation.
        $sql = sql_select('id_reservations_detail,prix,prix_ht,quantite,devise,taxe,descriptif,montant_paye', 'spip_reservations_details', 'id_reservation=' . $id_reservation);
        $montant_detail = array();
        $montant_reservations_detail_defaut = array();
        $montant_reservations_detail_total = array();
        $count = sql_count($sql);
        $montant_transaction_detail = '';
        if ($count > 0) {
            $montant_transaction_detail = $montant_transaction / $count;
        }
        $montant_ouvert = '';
        $montant_defaut = '';
        while ($data = sql_fetch($sql)) {
            $id_reservations_detail = $data['id_reservations_detail'];
            $devise = $data['devise'];
            $montant_paye[$id_reservations_detail] = $data['montant_paye'];
            if ($montant = $data['prix'] <= 0) {
                $montant = $data['prix_ht'] + $data['taxe'];
            }
            $montant_reservations_detail_total[$id_reservations_detail] = $montant;
            $montant_ouvert = $montant_defaut = $montant - $data['montant_paye'];
            if ($montant_ouvert < $montant_transaction_detail and $montant_ouvert >= 0) {
                if (!($montant_defaut = _request('montant_reservations_detail_' . $id_reservations_detail))) {
                    $montant_defaut = $montant_ouvert;
                }
            }
            if ($credit[$devise] > 0 and $credit[$devise] / $count <= $montant_defaut) {
                $montant_defaut = $credit[$devise] / $count;
            }
            if ($montant_defaut > 0) {
                $montant_detail[] = array('saisie' => 'input', 'options' => array('nom' => 'montant_reservations_detail_' . $id_reservations_detail, 'label' => $data['descriptif'], 'defaut' => $montant_defaut, 'size' => 20));
            }
            $flux['data']['montant_reservations_detail_' . $id_reservations_detail] = '';
            $montant_reservations_detail_defaut[$id_reservations_detail] = $montant_ouvert;
        }
        if ($credit) {
            $flux['credit'] = '';
            $flux['_hidden'] .= '<input name="credit" value="' . $credit[$devise] . '" type="hidden"/>';
        }
        $flux['_mes_saisies'] = array(array('saisie' => 'fieldset', 'options' => array('nom' => 'specifier', 'label' => _T('reservation_bank:label_fieldset_specifier')), 'saisies' => array(array('saisie' => 'oui_non', 'options' => array('nom' => 'specifier_montant', 'label' => _T('reservation_bank:label_specifier_montant'), 'defaut' => _request('specifier_montant'))))), array('saisie' => 'fieldset', 'options' => array('nom' => 'montant', 'label' => _T('reservation_bank:label_fieldset_montant_detail', array('devise' => $devise)), 'afficher_si' => '@specifier_montant@ == "on"'), 'saisies' => $montant_detail));
        $flux['data']['specifier_montant'] = _request('specifier_montant');
        $flux['data']['montant_reservations_detail_defaut'] = '';
        $flux['data']['montant_paye'] = $montant_paye;
        $flux['_hidden'] .= '<input name="id_reservation" value="' . $id_reservation . '" type="hidden"/>';
        $flux['_hidden'] .= '<input name="id_transaction" value="' . $id_transaction . '" type="hidden"/>';
        $montant_reservations_detail_defaut = serialize($montant_reservations_detail_defaut);
        $montant_reservations_detail_total = serialize($montant_reservations_detail_total);
        $flux['_hidden'] .= "<input name='montant_reservations_detail_defaut' value='{$montant_reservations_detail_defaut}' type='hidden'/>";
        $flux['_hidden'] .= "<input name='montant_reservations_detail_total' value='{$montant_reservations_detail_total}' type='hidden'/>";
    }
    return $flux;
}