Changeset 60667 in spip-zone


Ignore:
Timestamp:
Apr 26, 2012, 2:10:47 AM (9 years ago)
Author:
gildas.cotomale@…
Message:

refonte de la compta : retour des destinations sur les listes de synthèse, mais une seule à la fois.

Location:
_plugins_/Association/Associaspip
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/Association/Associaspip/association_options.php

    r60425 r60667  
    501501}
    502502
     503/* selecteur d'exercice comptable */
     504function association_selectionner_exercice($exercice='', $url_action='') {
     505    if ($url_action) {
     506                $res = '<form method="get" action="'.$url_action.'"><div>';
     507    } else {
     508                $res = '';
     509    }
     510    $res .= '<select name ="exercice" onchange="form.submit()">';
     511    $res .= '<option value="0" ';
     512    if (!$exercice) {
     513                $res .= ' selected="selected"';
     514    }
     515    $res .= '>'. _L("choisir l'exercice ?") .'</option>';
     516    $sql = sql_select('id_exercice, intitule', 'spip_asso_exercices','', 'intitule DESC');
     517    while ($val = sql_fetch($sql)) {
     518                $res .= '<option value="'.$val['id_exercice'].'" ';
     519                if ($exercice==$val['id_exercice']) {
     520                        $res .= ' selected="selected"';
     521                }
     522                $res .= '>'.$val['intitule'].'</option>';
     523    }
     524    $res .= '</select><noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>';
     525    if ($url_action) {
     526                $res .= '</div></form>';
     527    }
     528    return $res;
     529}
     530
     531/* selecteur d'exercice comptable */
     532function association_selectionner_destination($destination='', $url_action='') {
     533    if ($url_action) {
     534                $res = '<form method="get" action="'.$url_action.'"><div>';
     535    } else {
     536                $res = '';
     537    }
     538//    $res .= '<select name ="destination[]" multiple="multiple" onchange="form.submit()">';
     539    $res .= '<select name ="destination" onchange="form.submit()">';
     540    $res .= '<option value="0" ';
     541//    if ( !(array_search(0, $destinations)===FALSE) ) {
     542    if (!$destination) {
     543                $res .= ' selected="selected"';
     544    }
     545    $res .= '>'. _T('asso:toutes_destinations') .'</option><option disabled="disabled">--------</option>';
     546    $intitule_destinations = array();
     547    $sql = sql_select('id_destination, intitule', 'spip_asso_destination','', 'intitule DESC');
     548    while ($val = sql_fetch($sql)) {
     549                $res .= '<option value="'.$val['id_destination'].'" ';
     550//              if (!(array_search($val['id_destination'], $destinations)===FALSE)) {
     551                if ($destination==$val['id_destination']) {
     552                        $res .= ' selected="selected"';
     553                }
     554                $res .= '>'.$val['intitule'].'</option>';
     555                $intitule_destinations[$val['id_destination']] = $val['intitule'];
     556    }
     557    $res .= '</select><noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript>';
     558    if ($url_action) {
     559                $res .= '</div></form>';
     560    }
     561    if ($GLOBALS['association_metas']['destinations']){
     562                return $res;
     563        } else {
     564                return FALSE;
     565        }
     566}
     567
    503568function encadre($texte,$avant='[',$apres=']')
    504569{
  • _plugins_/Association/Associaspip/exec/bilan.php

    r60578 r60667  
    3434                if (!($ids_destination_bilan = _request('destination')))
    3535                        $ids_destination_bilan = array(0);
     36                include_spip('inc/association_comptabilite');
    3637                onglets_association('titre_onglet_comptes');
    3738                // INTRO : rappel de l'exercicee affichee
     
    7778                        $join = $sel = $where = $having = $order = '';
    7879                }
     80                $classes = array(
     81                        sql_quote($GLOBALS['association_metas']['classe_charges']),
     82                        sql_quote($GLOBALS['association_metas']['classe_produits']),
     83//                      sql_quote($GLOBALS['association_metas']['classe_contributions_volontaires']),
     84//                      sql_quote($GLOBALS['association_metas']['classe_banques']),
     85                );
    7986                // on boucle sur le tableau des destinations en refaisant le fetch a chaque iteration
    8087                foreach ($ids_destination_bilan as $id_destination) {
     
    8895                        echo "\n<fieldset>";
    8996                        echo '<legend><strong>'. _T('asso:resultat_courant') . ' ' .$intitule_destination_bilan. '</strong></legend>';
    90                         echo "<table width='100%' class='asso_tablo' id='asso_tablo_bilan_resultat'>\n";
    91                         echo "<thead>\n<tr>";
    92                         echo '<th colspan="2">&nbsp;</th>';
    93                         echo '<th width="50">'. _T('asso:bilan_recettes') .'</th>';
    94                         echo '<th width="50">'. _T('asso:bilan_depenses') .'</th>';
    95                         echo '<th width="50">'. _T('asso:bilan_solde').'</th>';
    96                         echo "</tr>\n</thead><tbody>";
    97                         if ($id_destination==0) { // on fait le bilan sur toutes les destinations (quand aucune de selectionnee ou que destination n'est pas on)
    98                                 $query = sql_select(
    99                                         "imputation, SUM(recette) AS recettes, SUM(depense) AS depenses $sel",
    100                                         "spip_asso_comptes $join",
    101                                         $where, $order, '', '', $having);
    102                         } else { // on fait le bilan d'une seule destination
    103                                 $query = sql_select(
    104                                         "imputation,
    105                                         SUM(spip_asso_destination_op.recette) AS recettes,
    106                                         SUM(spip_asso_destination_op.depense) AS depenses,
    107                                         spip_asso_destination_op.id_destination $sel",
    108                                         "spip_asso_comptes LEFT JOIN spip_asso_destination_op ON spip_asso_destination_op.id_compte=spip_asso_comptes.id_compte $join",
    109                                         "spip_asso_destination_op.id_destination=$id_destination AND $where",
    110                                         $order, '', '', $having);
    111                         }
    112                         while ($data = sql_fetch($query)) {
    113                                 $recettes = $data['recettes'];
    114                                 $depenses = $data['depenses'];
    115                                 $solde = $recettes-$depenses;
    116                                 echo '<tr>';
    117                                 echo '<td class="text">'. $data['code'] . '</td>';
    118                                 echo '<td class="text">'. $data['intitule'] .'</td>';
    119                                 echo '<td class="decimal">'.association_prixfr($recettes).'</td>';
    120                                 echo '<td class="decimal">'.association_prixfr($depenses).'</td>';
    121                                 echo '<td class="decimal">'.association_prixfr($solde).'</td>';
    122                                 echo "</tr>\n";
    123                                 $total_recettes += $recettes;
    124                                 $total_depenses += $depenses;
    125                                 $total_soldes += $solde;
    126                         }
    127                         echo "</tbody><tfoot>\n<tr>";
    128                         echo '<th colspan="2">'. _T('asso:resultat_courant') .'</th>';
    129                         echo '<th class="decimal">'. association_prixfr($total_recettes) .'</th>';
    130                         echo '<th class="decimal">'. association_prixfr($total_depenses) .'</th>';
    131                         echo '<th class="decimal">'. association_prixfr($total_soldes) .'</th>';
    132                         echo "</tr>\n</tfoot>\n</table>\n";
     97                        $solde = association_liste_totaux_comptes_classes($classes, 'cpte_resultat', 0, $exercice, $id_destination);
    13398                        echo '</fieldset>';
    13499                }
     
    137102}
    138103
    139 /* Dans la fonction suivante "bilan_encaisse($annee)" on dissocie la "lecture" et "l'affichage"
     104/* Dans la fonction suivante on dissocie la "lecture" et "l'affichage"
    140105 * afin de pouvoir traiter et calculer des valeurs intermédiaires :
    141106 * 1 - on ne comptabilise pour le terme "encaisse" que les sommes dont le journal est 53xx ou 51xx
     
    146111 *              y a desequilibre !
    147112 */
    148 
    149 // TODO : le passage en exercice budgétaire - 1)date de fin de l'exercice 2)faire apparaitre l'avoir initial : qui est le solde à (debut -1) de l'exercice (report)
    150 
    151113function bilan_encaisse()
    152114{
  • _plugins_/Association/Associaspip/exec/compte_bilan.php

    r60658 r60667  
    2424                echo minipres();
    2525        } else {
     26// initialisations
    2627                $plan = sql_countsel('spip_asso_plan','active=1');
    2728                $id_exercice = intval(_request('exercice'));
     
    2930                        /* on recupere l'id_exercice dont la date "fin" est "la plus grande" */
    3031                        $id_exercice = sql_getfetsel('id_exercice', 'spip_asso_exercices', '', '', 'fin DESC');
    31                         if(!$id_exercice)
    32                                 $id_exercice = 0;
    33                 }
     32                }
     33                $destination = intval(_request('destination'));
    3434                $exercice_data = sql_asso1ligne('exercice', $id_exercice);
     35                include_spip('inc/association_comptabilite');
     36// traitements
    3537                onglets_association('titre_onglet_comptes');
    3638                // INTRO : rappel de l'exercicee affichee
     
    4042                // pas de sommes de synthes puisque tous les totaux sont dans la zone centrale ;-
    4143                // datation et raccourcis
    42                 icones_association(array('comptes', "exercice=$exercice"), array(
    43                         'encaisse_titre_general' => array('finances-24.png', 'encaisse', "exercice=$id_exercice"),
    44                         'cpte_resultat_titre_general' => array('finances-24.png', 'compte_resultat', "exercice=$id_exercice"),
    45 #                       'annexe_titre_general' => array('finances-24.png', 'annexe', "exercice=$id_exercice"),
     44                icones_association(array('comptes', "exercice=$id_exercice"), array(
     45                        'encaisse_titre_general' => array('finances-24.png', 'encaisse', "exercice=$id_exercice".($destination?"&destination=$id_destination":'')),
     46                        'cpte_resultat_titre_general' => array('finances-24.png', 'compte_resultat', "exercice=$id_exercice".($destination?"&destination=$id_destination":'')),
     47#                       'annexe_titre_general' => array('finances-24.png', 'annexe', "exercice=$id_exercice".($destination?"&destination=$id_destination":'')),
    4648                ));
    4749                // elements communs aux requetes
     
    7274*/
    7375                debut_cadre_association('finances-24.jpg', 'cpte_bilan_titre_general', $exercice_data['intitule']);
    74                 include_spip('inc/association_comptabilite');
     76                echo "\n<table width='100%'><tr>";
     77                echo '<td width="50%" align="left">'. association_selectionner_exercice($id_exercice, generer_url_ecrire('compte_bilan',($id_destination?"destination=$id_destination":'')) ) .'</td>';
     78                echo '<td width="50%" align="right">'. association_selectionner_destination($id_destination, generer_url_ecrire('compte_bilan',($id_exercice?"exercice=$id_exercice":'')) ) .'</td>';
     79                echo '</tr></table>';
    7580                // les autres classes a prendre en compte ici
    7681                $classes_bilan = array();
     
    8691                }
    8792                // liste des actifs cumulees par comptes
    88                 $dettes = association_liste_totaux_comptes_classes($classes_bilan, 'cpte_bilan', '-1', $id_exercice, 0);
     93                $actifs = association_liste_totaux_comptes_classes($classes_bilan, 'cpte_bilan', '-1', $id_exercice, $id_destination);
    8994                // liste des passifs cumulees par comptes
    90                 $patrimoine = association_liste_totaux_comptes_classes($classes_bilan, 'cpte_bilan', '+1', $id_exercice, 0);
     95                $passifs = association_liste_totaux_comptes_classes($classes_bilan, 'cpte_bilan', '+1', $id_exercice, $id_destination);
    9196                // liste des bilans (actifs et passifs) par comptes
    92 #               $bilan = association_liste_totaux_comptes_classes($classes_bilan, 'cpte_bilan', '', $id_exercice, 0);
     97#               $bilan = association_liste_totaux_comptes_classes($classes_bilan, 'cpte_bilan', '', $id_exercice, $id_destination);
    9398/*
    9499                if(autoriser('associer', 'export_compte_bilans') && $plan){ // on peut exporter : pdf, csv, xml, ...
  • _plugins_/Association/Associaspip/exec/compte_resultat.php

    r60658 r60667  
    2424                echo minipres();
    2525        } else {
     26// initialisations
    2627                $plan = sql_countsel('spip_asso_plan','active=1');
    2728                $id_exercice = intval(_request('exercice'));
     
    2930                        /* on recupere l'id_exercice dont la date "fin" est "la plus grande" */
    3031                        $id_exercice = sql_getfetsel('id_exercice', 'spip_asso_exercices', '', '', 'fin DESC');
    31                         if(!$id_exercice)
    32                                 $id_exercice = 0;
    33                 }
     32                }
     33                $id_destination = intval(_request('destination'));
    3434                $exercice_data = sql_asso1ligne('exercice', $id_exercice);
     35                include_spip('inc/association_comptabilite');
     36// traitements
    3537                onglets_association('titre_onglet_comptes');
    3638                // INTRO : rappel de l'exercicee affichee
     
    4042                // pas de sommes de synthes puisque tous les totaux sont dans la zone centrale ;-
    4143                // datation et raccourcis
    42                 icones_association(array('comptes', "exercice=$exercice"), array(
    43                         'encaisse_titre_general' => array('finances-24.png', 'encaisse', "exercice=$exercice"),
    44                         'cpte_bilan_titre_general' => array('finances-24.png', 'compte_bilan', "exercice=$id_exercice"),
    45 #                       'annexe_titre_general' => array('finances-24.png', 'annexe', "exercice=$id_exercice"),
     44                icones_association(array('comptes', "exercice=$id_exercice"), array(
     45                        'encaisse_titre_general' => array('finances-24.png', 'encaisse', "exercice=$id_exercice".($destination?"&destination=$id_destination":'')),
     46                        'cpte_bilan_titre_general' => array('finances-24.png', 'compte_bilan', "exercice=$id_exercice".($destination?"&destination=$id_destination":'')),
     47#                       'annexe_titre_general' => array('finances-24.png', 'annexe', "exercice=$id_exercice".($destination?"&destination=$id_destination":'')),
    4648                ));
    47                 include_spip('inc/association_comptabilite');
    4849                // elements communs aux requetes
    4950                if ($plan) {
     
    7071                }
    7172                debut_cadre_association('finances-24.jpg', 'cpte_resultat_titre_general', $exercice_data['intitule']);
     73                echo "\n<table width='100%'><tr>";
     74                echo '<td width="50%" align="left">'. association_selectionner_exercice($id_exercice, generer_url_ecrire('compte_resultat',($id_destination?"destination=$id_destination":'')) ) .'</td>';
     75                echo '<td width="50%" align="right">'. association_selectionner_destination($id_destination, generer_url_ecrire('compte_resultat',($id_exercice?"exercice=$id_exercice":'')) ) .'</td>';
     76                echo '</tr></table>';
    7277                // liste des charges cumulees par comptes
    73                 $depenses = association_liste_totaux_comptes_classes($GLOBALS['association_metas']['classe_charges'], 'cpte_resultat', '-1', $id_exercice, 0);
     78                $charges = association_liste_totaux_comptes_classes($GLOBALS['association_metas']['classe_charges'], 'cpte_resultat', '-1', $id_exercice, $id_destination);
    7479                // liste des produits cumules par comptes
    75                 $recettes = association_liste_totaux_comptes_classes($GLOBALS['association_metas']['classe_produits'], 'cpte_resultat', '+1', $id_exercice, 0);
     80                $produits = association_liste_totaux_comptes_classes($GLOBALS['association_metas']['classe_produits'], 'cpte_resultat', '+1', $id_exercice, $id_destination);
    7681                // resultat comptable courant
    77                 compte_resultat_benefice_perte($recettes, $depenses);
     82                compte_resultat_benefice_perte($produits, $charges);
    7883                // liste des contributions volontaires (emplois et ressources) par comptes
    79                 association_liste_totaux_comptes_classes($GLOBALS['association_metas']['classe_contributions_volontaires'], 'cpte_benevolat', 0, $id_exercice, 0);
     84                $contributions = association_liste_totaux_comptes_classes($GLOBALS['association_metas']['classe_contributions_volontaires'], 'cpte_benevolat', 0, $id_exercice, $id_destination);
    8085/*
    8186                if(autoriser('associer', 'export_compte_resultats') && $plan){ // on peut exporter : pdf, csv, xml, ...
  • _plugins_/Association/Associaspip/exec/comptes.php

    r60418 r60667  
    2222        } else {
    2323// initialisations
    24                 $exercice = intval(_request('exercice'));
    25                 if(!$exercice){
     24                $id_exercice = intval(_request('exercice'));
     25                if(!$id_exercice){
    2626                        /* on recupere l'id du dernier exercice */
    27                         $exercice = sql_getfetsel('id_exercice','spip_asso_exercices','','','debut DESC');
    28                         if(!$exercice)
    29                                 $exercice = 0;
     27                        $id_exercice = sql_getfetsel('id_exercice','spip_asso_exercices','','','debut DESC');
    3028                }
    3129                $vu = _request('vu');
     
    4644                }
    4745                $debut = intval(_request('debut'));
    48                 $exercice_data = sql_asso1ligne('exercice', $exercice);
     46                $exercice_data = sql_asso1ligne('exercice', $id_exercice);
    4947// traitements
    5048                $where = 'imputation LIKE '. sql_quote($imputation);
     
    5351                onglets_association('titre_onglet_comptes');
    5452                // INTRO : rappel de l'exercicee affichee
    55                 echo totauxinfos_intro($exercice_data['intitule'],'exercice',$exercice);
     53                echo totauxinfos_intro($exercice_data['intitule'],'exercice',$id_exercice);
    5654                $journaux = sql_allfetsel('journal, intitule', 'spip_asso_comptes RIGHT JOIN spip_asso_plan ON journal=code', "date>='$exercice_data[debut]' AND date<='$exercice_data[fin]'", "intitule DESC"); // on se permet sql_allfetsel car il s'agit d'une association (mois d'une demie dizaine de comptes) et non d'un etablissement financier (des milliers de comptes clients)
    5755                // TOTAUX : operations de l'exercice par compte financier (indique rapidement les comptes financiers les plus utilises ou les modes de paiement preferes...)
     
    8280                // datation et raccourcis
    8381                icones_association(array(), array(
    84                         'encaisse_titre_general' => array('finances-24.png', 'encaisse', "exercice=$exercice"),
    85                         'cpte_resultat_titre_general' => array('finances-24.png', 'compte_resultat', "exercice=$exercice"),
    86                         'cpte_bilan_titre_general' => array('finances-24.png', 'compte_bilan', "exercice=$exercice"),
    87 #                       'annexe_titre_general' => array('finances-24.png', 'annexe', "exercice=$exercice"),
     82                        'encaisse_titre_general' => array('finances-24.png', 'encaisse', "exercice=$id_exercice"),
     83                        'cpte_resultat_titre_general' => array('finances-24.png', 'compte_resultat', "exercice=$id_exercice"),
     84                        'cpte_bilan_titre_general' => array('finances-24.png', 'compte_bilan', "exercice=$id_exercice"),
     85#                       'annexe_titre_general' => array('finances-24.png', 'annexe', "exercice=$id_exercice"),
    8886                        'ajouter_une_operation' => array('ajout-24.png', 'edit_compte'),
    8987                ) );
    9088                debut_cadre_association('finances-24.png', 'informations_comptables');
    91                 echo "\n<table width='100%'>";
    92                 echo '<tr><td>';
    93                 echo '<form method="post" action="'.generer_url_ecrire('comptes',"imputation=$imputation").'"><div>';
    94                 echo '<select name ="exercice" onchange="form.submit()">';
    95                 echo '<option value="0" ';
    96                 if (!$exercice) {
     89                echo "\n<table width='100%'><tr>";
     90                echo '<td width="50%" align="left">'. association_selectionner_exercice($id_exercice, generer_url_ecrire('comptes',"imputation=$imputation") ) .'</td>';
     91                echo '<td width="50%" align="right">';
     92                echo '<form method="post" action="'.generer_url_ecrire('comptes', "exercice=$id_exercice").'"><div>';
     93                echo '<select name ="imputation" onchange="form.submit()">';
     94                echo '<option value="%" ';
     95                if ($imputation=='%') {
    9796                        echo ' selected="selected"';
    9897                }
    99                 echo '>Choix Exercice ?</option>';
    100                 $sql = sql_select('id_exercice, intitule', 'spip_asso_exercices','', "intitule DESC");
    101                 while ($val = sql_fetch($sql)) {
    102                         echo '<option value="'.$val['id_exercice'].'" ';
    103                         if ($exercice==$val['id_exercice']) { echo ' selected="selected"'; }
    104                         echo '>'.$val['intitule'].'</option>';
    105                 }
    106                 echo '</select><noscript><input type="submit" value="'._T('asso:bouton_lister').'" /></noscript></div></form></td>';
    107                 echo '<td>';
    108                 echo '<form method="post" action="'.generer_url_ecrire('comptes', "exercice=$exercice").'"><div>';
    109                 echo '<select name ="imputation" class="fondl" onchange="form.submit()">';
    110                 echo '<option value="%" ';
    111                 if ($imputation=="%") { echo ' selected="selected"'; }
    11298                echo '>Tous</option>';
    11399                /* Remplir le select uniquement avec les comptes utilises */
     
    120106                while ($plan = sql_fetch($sql)) {
    121107                        echo '<option value="'.$plan['code'].'" ';
    122                         if ($imputation==$plan['code']) { echo ' selected="selected"'; }
     108                        if ($imputation==$plan['code']) {
     109                                echo ' selected="selected"';
     110                        }
    123111                        echo '>'.$plan['code'].' - '.$plan['intitule'].'</option>';
    124112                }
  • _plugins_/Association/Associaspip/exec/encaisse.php

    r60658 r60667  
    2222                echo minipres();
    2323        } else {
     24// initialisations
    2425                $plan = sql_countsel('spip_asso_plan');
    25                 $exercice = intval(_request('exercice'));
    26                 if(!$exercice){ // on recupere l'id_exercice dont la date "fin" est "la plus grande"
    27                         $exercice = sql_getfetsel('id_exercice','spip_asso_exercices','','');
    28                         if(!$exercice)
    29                                 $exercice = 0;
     26                $id_exercice = intval(_request('exercice'));
     27                if(!$id_exercice){ // on recupere l'id_exercice dont la date "fin" est "la plus grande"
     28                        $id_exercice = sql_getfetsel('id_exercice','spip_asso_exercices','','');
    3029                }
     30// traitements
    3131                onglets_association('titre_onglet_comptes');
    3232                // INTRO : rappel de l'exercicee affichee
     
    3838                }
    3939                // datation et raccourcis
    40                 icones_association(array('comptes', "exercice=$exercice"), array(
    41                         'cpte_resultat_titre_general' => array('finances-24.png', 'compte_resultat', "exercice=$exercice"),
    42                         'cpte_bilan_titre_general' => array('finances-24.png', 'compte_bilan', "exercice=$exercice"),
    43 #                       'annexe_titre_general' => array('finances-24.png', 'annexe', "exercice=$exercice"),
     40                icones_association(array('comptes', "exercice=$id_exercice"), array(
     41                        'cpte_resultat_titre_general' => array('finances-24.png', 'compte_resultat', "exercice=$id_exercice"),
     42                        'cpte_bilan_titre_general' => array('finances-24.png', 'compte_bilan', "exercice=$id_exercice"),
     43#                       'annexe_titre_general' => array('finances-24.png', 'annexe', "exercice=$id_exercice"),
    4444                ));
    4545                debut_cadre_association('finances-24.png', 'encaisse');
  • _plugins_/Association/Associaspip/inc/association_comptabilite.php

    r60658 r60667  
    388388        $annee = date('Y'); // on prende l'annee actuelle
    389389    }
    390     $destination = intval(_request('destination'));
    391     if( !$destination ) { // pas de destination
     390    $id_destination = intval(_request('destination'));
     391    if( !$id_destination ) { // pas de destination
    392392    }
    393393    return serialize(array($exercice, $destination) );
     
    416416#    } elseif ( $classe==$GLOBALS['association_metas']['classe_banques'] ) { // encaisse
    417417#       $c_where = 'LEFT(a_c.imputation,1)<>'. sql_quote($GLOBALS['association_metas']['classe_contributions_volontaires']) .' AND a_c.date>=a_p.date_anterieure AND a_c.date<=NOW() ';
    418     } else { // tout ?!?
    419         $c_where = '';
     418    } else { // tout depuis le debut ?!?
     419        $c_where = 'a_c.date<=NOW()'; // il faut mettre un test valide car la chaine peut etre precedee de "AND "...  limiter alors a aujourd'hui ?
    420420    }
    421421    $query = sql_select(
Note: See TracChangeset for help on using the changeset viewer.