. * * @filesource comptes.php * @package controllers * * controleur de gestion des comptes. */ set_include_path(getcwd() . "/..:" . get_include_path()); include_once ('application/libraries/Gvv_Controller.php'); class Comptes extends Gvv_Controller { protected $controller = 'comptes'; protected $model = 'comptes_model'; protected $modification_level = 'tresorier'; // régles de validation protected $rules = array (); protected $filter_variables = array ( 'filter_active', 'filter_solde' ); /** * Constructor * * Affiche header et menu */ function __construct() { parent::__construct(); $this->load->model('plan_comptable_model'); $this->load->model('ecritures_model'); $this->load->helper('csv'); $this->lang->load('comptes'); } /** * Supprime un élèment */ function delete($id) { $this->load->model('ecritures_model'); $count = $this->ecritures_model->count_all($id); if ($count) { $this->session->set_flashdata('popup', "Suppression $id non authorisée $count lignes dans le compte"); redirect($this->controller . "/page"); return; } else { // détruit en base $this->pre_delete($id); $this->gvv_model->delete(array ( $this->kid => $id )); // réaffiche la liste (serait sympa de réafficher la même page) redirect($this->controller . "/page"); } } /** * Génération des éléments à passer au formulaire en cas de création, * modification ou réaffichage après erreur. * * @param * $actions */ function form_static_element($action) { parent::form_static_element($action); // @todo supprimer après validation $this->data ['codec_selector'] = $this->plan_comptable_model->selector(); $this->data ['compte_selector'] = $this->gvv_model->selector(); $this->data ['saisie_par'] = $this->dx_auth->get_username(); $pil_selector = $this->membres_model->selector_with_null(); $this->data ['pil_selector'] = $pil_selector; $this->gvvmetadata->set_selector('codec_selector', $this->plan_comptable_model->selector()); $this->gvvmetadata->set_selector('compte_selector', $this->gvv_model->selector()); $this->gvvmetadata->set_selector('pilote_selector', $pil_selector); } /** * Active ou désactive le filtrage */ public function filterValidation() { // echo "in filterValidation " . $this->session->userdata('return_url') . br(); $this->active_filter($this->filter_variables); $this->pop_return_url(); } /** * Retourne la selection format ActiveData utilisable par les requêtes * SQL pour filtrer les données en fonction des choix faits par l'utilisateur * dans la section de filtrage. */ function filter_solde() { $this->data ['filter_active'] = $this->session->userdata('filter_active'); $filter_solde = 0; if ($this->session->userdata('filter_solde')) { $filter_solde = $this->session->userdata('filter_solde'); } return $filter_solde; } /** * Affiche une page de compte * $codec: classe de compte à afficher, ex 512= tous les comptes bancaires * $codec2: permet d'afficher entre deux classe ex: 4/5 = tous les comptes de classe 4 * $detail: si 1 affiche la somme des débits et des crédits (utile * pour afficher la somme des créances et des dettes des comptes 400) */ function page($codec = "", $codec2 = "", $detail = 0) { $this->push_return_url("comptes page"); $general = $this->session->userdata('general') && ! $codec; $this->load_filter($this->filter_variables); $filter_solde = $this->filter_solde(); // gestion de la date d'affichage $balance_date = $this->session->userdata('balance_date'); if ($balance_date) { $this->data ['balance_date'] = $balance_date; } else { $this->data ['balance_date'] = date('d/m/Y'); } $date_op = date_ht2db($balance_date); // selection des codec $titre = ""; $selection = array (); if ($codec != '') { // $selection['codec'] = $codec; $selection = "codec = \"$codec\""; if ($codec2 != "") { $selection = "codec >= \"$codec\" and codec < \"$codec2\""; } } $this->data ['title_key'] = "gvv_comptes_title_balance"; $this->data ['codec'] = $codec; $this->data ['codec2'] = $codec2; $this->data ['general'] = $general; if ($general) { $result = $this->gvv_model->select_page_general($selection, $this->data ['balance_date'], $filter_solde); } else { $result = $this->gvv_model->select_page($selection, $this->data ['balance_date'], $filter_solde); } $total = array ( 'debit' => 0, 'credit' => 0, 'solde_debit' => 0, 'solde_credit' => 0 ); foreach ( $result as $row ) { foreach ( array ( 'debit', 'credit', 'solde_debit', 'solde_credit' ) as $field ) { $total [$field] += $row [$field]; } } $this->data ['total'] = $total; $this->data ['detail'] = $detail; $this->data ['select_result'] = $result; $this->data ['kid'] = $this->kid; $this->data ['controller'] = $this->controller; $this->data ['count'] = $this->gvv_model->count(); $this->data ['premier'] = 0; $this->data ['message'] = ""; $this->data ['has_modification_rights'] = (! isset($this->modification_level) || $this->dx_auth->is_role($this->modification_level, true, true)); // Ici l'URL de retour est toujours correct, donc écrasé après ... // echo "# " . $this->session->userdata('return_url'); return load_last_view($this->table_view, $this->data, $this->unit_test); } /* * Affiche la balance en comptablitié générale */ function general() { $this->session->set_userdata('general', true); $this->page(); } /* * Affiche la balance en comptablitié détaillé */ function detail($codec = "", $codec2 = "", $detail = 0) { $this->session->set_userdata('general', false); $this->page($codec, $codec2, $detail); } /** * Balance des comptes */ function view($codec = '') { $this->page($codec); } /** * Affiche le résultat de l'exercice' */ function resultat() { $this->data ['controller'] = "comptes"; $this->data ['year_selector'] = $this->ecritures_model->getYearSelector("date_op"); $this->data ['year'] = $this->session->userdata('year'); $this->data ['resultat_table'] = $this->ecritures_model->resultat_table($this->ecritures_model->select_resultat(), true, nbs(6), '.'); $this->push_return_url("resultat"); load_last_view('comptes/resultatView', $this->data); } /** * Activé par la barre de boutons de résultats */ function export_resultat($mode = "csv") { if ($mode == "csv") { $this->csv_resultat(); } else { redirect(controller_url("rapports/pdf_resultats")); } } /** * Export des résultats en CSV */ function csv_resultat() { $title = $this->lang->line("gvv_comptes_title_resultat"); $resultat = $this->ecritures_model->select_resultat(); $csv_data = array (); $csv_data [] = array ( $this->lang->line("comptes_label_date"), $resultat ['balance_date'], '', '', '', '' ); $csv_data = array_merge($csv_data, $this->ecritures_model->resultat_table($resultat, false, '', ',')); csv_file($title, $csv_data); } /** * Résultats par catégories */ function csv_resultat_categories() { $this->select_categorie(); $annee_exercise = $this->data ['annee_exercise']; $csv_data = array (); $csv_data [] = array ( "Résultat par catégories", $annee_exercise ); $csv_data [] = array ( "Catégorie", "Compte", "Code", "Montant", "Total" ); foreach ( $this->data ['results'] as $row ) { $annee_exercise = $row ['annee_exercise']; $categorie = $row ['categorie']; $nom_compte1 = $row ['nom_compte1']; $code1 = $row ['code1']; $total = number_format($row ['total'], 2, ",", ""); $csv_data [] = array ( $categorie, $nom_compte1, $code1, $total ); } csv_file("Résultat par catégories", $csv_data); } /** * Résultat */ function select_categorie() { $this->data = array (); $this->data ['annee_exercise'] = date("Y"); $this->data ['nom_club'] = $this->config->item('nom_club'); $this->data ['results'] = $this->ecritures_model->select_categorie('code1 >= "6" and code1 < "7"'); } /** * Résultat par catégorie * * @deprecated * */ function resultat_categorie() { $this->select_categorie(); // print_r($this->data['results']); $this->data ['annee_exercise'] = date("Y"); $this->data ['controller'] = "comptes"; load_last_view('comptes/resultatCategorie', $this->data); } /** * Affiche la trésorerie, écart entre les dépenses et les recettes */ function tresorerie() { $this->data ['controller'] = "comptes"; $this->data ['year_selector'] = $this->ecritures_model->getYearSelector("date_op"); $this->data ['year'] = $this->session->userdata('year'); $this->data ['jsonurl'] = base_url() . 'index.php/' . $this->controller . '/ajax_cumuls'; $this->data ['title'] = $this->lang->line("gvv_comptes_title_cash"); $this->push_return_url("tresorerie"); load_last_view('comptes/tresorerie', $this->data); } /** * Retourne les informations pour le cumul */ function ajax_cumuls() { $year = $this->session->userdata('year'); $json = $this->ecritures_model->json_resultat($year); echo $json; } /** * Balance des comptes * * @param * $comptes */ function balance_csv($codec = '', $codec2 = "") { $general = $this->session->userdata('general'); // selection des codec // Titre $titre = $this->lang->line("gvv_comptes_title_balance"); $selection = array (); if ($codec != '') { // $selection['codec'] = $codec; $selection = "codec = \"$codec\""; $titre .= ", " . $this->lang->line('comptes_label_class') . "=$codec"; if ($codec2 != "") { $selection = "codec >= \"$codec\" and codec < \"$codec2\""; $titre .= " " . $this->lang->line('comptes_label_to') . " $codec2"; } } else { $this->data ['codec'] = ''; } // gestion de la date d'affichage $balance_date = $this->session->userdata('balance_date'); if (! $balance_date) { $balance_date = date('d/m/Y'); } $titre .= ", " . $this->lang->line("comptes_label_date") . "=$balance_date"; if ($general) { $result = $this->gvv_model->select_page_general($selection, $balance_date); $fields = array ( 'codec', 'nom', 'solde_debit', 'solde_credit' ); } else { $result = $this->gvv_model->select_page($selection, $balance_date); $fields = array ( 'codec', 'id', 'solde_debit', 'solde_credit' ); } $this->gvvmetadata->csv_table("vue_comptes", $result, array ( 'title' => $titre, 'fields' => $fields )); } /** * Soldes pilotes */ function balance_pdf($codec = '', $codec2 = "") { $general = $this->session->userdata('general'); // selection des codec // Titre $titre = $this->lang->line("gvv_comptes_title_balance"); $selection = array (); if ($codec != '') { // $selection['codec'] = $codec; $selection = "codec = \"$codec\""; $titre .= ", " . $this->lang->line('comptes_label_class') . "=$codec"; if ($codec2 != "") { $selection = "codec >= \"$codec\" and codec < \"$codec2\""; $titre .= " " . $this->lang->line('comptes_label_to') . " $codec2"; } } else { $this->data ['codec'] = ''; } // gestion de la date d'affichage $balance_date = $this->session->userdata('balance_date'); if (! $balance_date) { $balance_date = date('d/m/Y'); } $titre .= ", " . $this->lang->line("comptes_label_date") . "=$balance_date"; if ($general) { $result = $this->gvv_model->select_page_general($selection, $balance_date); $fields = array ( 'codec', 'nom', 'solde_debit', 'solde_credit' ); } else { $result = $this->gvv_model->select_page($selection, $balance_date); $fields = array ( 'codec', 'id', 'solde_debit', 'solde_credit' ); } $this->load->library('Pdf'); $pdf = new Pdf(); $pdf->AddPage(); $this->gvvmetadata->pdf_table("vue_comptes", $result, $pdf, array ( 'title' => $titre, 'width' => array ( 12, 50, 30, 30 ), 'fields' => $fields )); $pdf->Output(); } /** * Bilan */ function bilan() { $this->push_return_url("bilan"); $year = $this->session->userdata('year'); $bilan = $this->gvv_model->select_all_for_bilan($year); $bilan_prec = $this->gvv_model->select_all_for_bilan($year - 1); $this->data = $bilan; $this->data ['bilan_table'] = bilan_table($bilan, $bilan_prec, true); load_last_view('comptes/bilanView', $this->data); } /** * Export du bilan en CSV * * @param * $comptes */ function bilan_csv() { $year = $this->session->userdata('year'); $bilan = $this->gvv_model->select_all_for_bilan($year); $bilan_prec = $this->gvv_model->select_all_for_bilan($year - 1); $bilan_table = bilan_table($bilan, $bilan_prec, false); $year = $this->session->userdata('year'); csv_file($this->lang->line('gvv_comptes_title_bilan') . " $year", $bilan_table); } /** * Vérifie que les soldes des comptes enregistrés dans les comptes correspondent bien * à la somme des opérations sur ces comptes. * L'enregistrement du solde dans les comptes * peut-être considéré comme une optimisation, mais c'est un risque si le moteur de la base de données * ne gre pas correctement les transactions. (Cas chez free). */ function check() { $selection = array (); $result = $this->gvv_model->select_page($selection, "31/12/2013", 0); $cnt = 0; $errors = 0; $msg = ""; foreach ( $result as $row ) { $cnt ++; $id = $row ['id']; $date = date("Y-m-d"); $actif = $row ['actif']; // echo $row['nom'] . ' ' . $actif . ' ' . $row['debit'] . ' ' . $row['credit'] . br(); $solde_compte = $row ['credit'] - $row ['debit']; if ($actif) { $credit = $this->ecritures_model->select_emploi_compte($date, $id); $debit = $this->ecritures_model->select_ressource_compte($date, $id); } else { $debit = $this->ecritures_model->select_emploi_compte($date, $id); $credit = $this->ecritures_model->select_ressource_compte($date, $id); } $solde = $credit - $debit; if ($actif) $solde = - $solde; if (abs($solde_compte - $solde) >= 0.01) { $errors ++; // var_dump($row); $msg .= $row ['nom']; $msg .= " solde compte=$solde_compte, solde ecritures=$solde" . br(); $changes = ($actif) ? array ( 'debit' => $credit, 'credit' => $debit ) : array ( 'debit' => $debit, 'credit' => $credit ); $this->db->where('id', $row ['id']); $this->db->update('comptes', $changes); } } $popup = "$cnt comptes vérifiés; $errors erreur(s)."; $msg .= br() . $popup; $data = array ( 'text' => $msg, 'popup' => $popup, 'title' => "Vérification de la cohérence des comptes." ); load_last_view('message', $data); } /** * Callback pour les boutons de stat * * @param unknown_type $year */ function export_bilan($mode = "csv") { if ($mode == "csv") { $this->bilan_csv(); } else { redirect(controller_url("rapports/bilan")); } } /* * Recalcul la balance pour la nouvelle date */ function new_balance_date($jour, $mois, $annee) { $date = "$jour/$mois/$annee"; gvv_debug("Balance date = $date"); $this->session->set_userdata('balance_date', $date); $this->session->set_userdata('year', $annee); $this->pop_return_url(); } /** * Retourne une liste de comptes * * @param unknown $selection */ private function liste_comptes($selection, $date) { $result = $this->gvv_model->select_page($selection, $date); $table = array (); $table [] = $this->lang->line("comptes_list_header"); ; foreach ( $result as $row ) { $table [] = array ( $row ['codec'], $row ['nom'], euro($row ['debit']), euro($row ['credit']), euro($row ['solde_debit']), euro($row ['solde_credit']) ); } return $table; } /** * Retourne une liste de comptes * * @param unknown $selection */ private function comptes_de_resultat($selection, $date) { $result = $this->gvv_model->select_page($selection, $date); $exedant = 0; $deficit = 0; foreach ( $result as $row ) { if ($row ['codec'] == 120) $exedant = $row ['id']; if ($row ['codec'] == 129) $deficit = $row ['id']; } return array ( '120' => $exedant, '129' => $deficit ); } /** * passe les écritures d'intégration * * @param unknown $selection */ private function ecritures_integration($selection, $date, $year, $capital, $comment) { $result = $this->gvv_model->select_page($selection, $date); // var_dump($result); /* * Array ( [id] => 0 * [annee_exercise] => 2011 * [date_creation] => 2011-03-20 * [date_op] => 2011-03-20 * [compte1] => 6 * [compte2] => 7 * [montant] => 100 * [description] => heure de vol en fauconet * [num_cheque] => xxx * [saisie_par] => fpeignot ) */ $line = array ( 'annee_exercise' => $year, 'date_creation' => $date, 'date_op' => $date, 'description' => $comment, 'num_cheque' => "Clôture exercice $year", 'saisie_par' => $this->dx_auth->get_username() ); foreach ( $result as $row ) { if ($row ['solde_debit'] > 0.001) { $line ['montant'] = $row ['solde_debit']; $line ['compte2'] = $row ['id']; $line ['compte1'] = $capital; $this->ecritures_model->create_ecriture($line); } if ($row ['solde_credit'] > 0.001) { $line ['montant'] = $row ['solde_credit']; $line ['compte1'] = $row ['id']; $line ['compte2'] = $capital; $this->ecritures_model->create_ecriture($line); } } } /** * passe les écritures d'intégration * * @param unknown $selection */ private function charges_integration($selection, $date, $year, $debiteur, $crediteur, $comment) { $result = $this->gvv_model->select_page($selection, $date); // var_dump($result); $line = array ( 'annee_exercise' => $year, 'date_creation' => $date, 'date_op' => $date, 'description' => $comment, 'num_cheque' => "Clôture exercice $year", 'saisie_par' => $this->dx_auth->get_username() ); foreach ( $result as $row ) { if ($row ['solde_debit'] > 0.001) { $line ['montant'] = $row ['solde_debit']; $line ['compte2'] = $row ['id']; $line ['compte1'] = $debiteur; $this->ecritures_model->create_ecriture($line); } if ($row ['solde_credit'] > 0.001) { $line ['montant'] = $row ['solde_credit']; $line ['compte1'] = $row ['id']; $line ['compte2'] = $crediteur; $this->ecritures_model->create_ecriture($line); } } } /** * Clôture de l'exercice * * todo: il faudra réfélchir à quoi faire si l'utilisateur ne cloture pas tous ses exercices. */ function cloture($action = MODIFICATION) { // remplissage des dates $balance_date = $this->session->userdata('balance_date'); if (! $balance_date) { $balance_date = date("d/m/Y"); } $year = substr($balance_date, 6, 4); $date_fin = "31/12/$year"; $date_gel = $this->config->item('date_gel'); $comment = $this->lang->line("gvv_comptes_title_cloture") . " $year"; $this->data ['controller'] = 'comptes'; $this->data ['action'] = $action; $this->data ['balance_date'] = $balance_date; $this->data ['year'] = $year; $this->data ['date_fin'] = $date_fin; $this->data ['date_gel'] = $date_gel; if (french_date_compare($date_gel, $date_fin, '>=')) { $error = $this->lang->line("comptes_cloture_impossible") . " $date_gel."; } else { $error = ""; } $error_120 = $this->lang->line("comptes_cloture_error_120"); $error_129 = $this->lang->line("comptes_cloture_error_129"); if (count($this->db->select('*')->from('comptes')->where('codec = "120"')->order_by('codec')->get()->result_array()) == 0) $error .= "
$error_120"; if (count($this->db->select('*')->from('comptes')->where('codec = "129"')->order_by('codec')->get()->result_array()) == 0) $error .= "
$error_129"; $this->data ['error'] = $error; // compte de fonds associatif ou capital à utiliser pour intégrer le résultat et les ecarts // des exercices précédants. $where = array ( "codec >=" => "10", 'codec <' => "11" ); // $this->gvvmetadata->set_selector('capital_selector', $this->gvv_model->selector($where)); $this->data ['capital_selector'] = $this->gvv_model->selector($where); $this->data ['capital'] = ''; $this->data ['a_integrer'] = $this->liste_comptes("codec >= \"110\" and codec < \"130\"", $balance_date); $this->data ['charges'] = $this->liste_comptes("codec >= \"6\" and codec < \"7\"", $balance_date); $this->data ['produits'] = $this->liste_comptes("codec >= \"7\" and codec < \"8\"", $balance_date); if ($action == VALIDATION) { $this->load->model('comptes_model'); $date_op = date_ht2db($balance_date); $capital = $this->input->post('capital'); $comment = $this->lang->line("comptes_cloture") . " $year, " . $this->lang->line("comptes_cloture_reintegration_resultat") . " ($year -1)"; $this->ecritures_integration("codec >= \"110\" and codec < \"130\"", $date_op, $year, $capital, $comment); $cpts_resultat = $this->comptes_de_resultat("codec >= \"110\" and codec < \"130\"", $date_op); $resultat_debiteur = $cpts_resultat ['129']; $resultat_crediteur = $cpts_resultat ['120']; $comment = $this->lang->line("comptes_cloture") . " $year, " . $this->lang->line("comptes_cloture_raz_charges"); $this->charges_integration("codec >= \"6\" and codec < \"7\"", $date_op, $year, $resultat_debiteur, $resultat_crediteur, $comment); $comment = $this->lang->line("comptes_cloture") . " $year, " . $this->lang->line("comptes_cloture_raz_produits"); $this->charges_integration("codec >= \"7\" and codec < \"8\"", $date_op, $year, $resultat_debiteur, $resultat_crediteur, $comment); redirect($this->controller . "/cloture/" . VISUALISATION); } return load_last_view($this->controller . "/cloture", $this->data, $this->unit_test); } /** * Test unitaire */ function test($format = "html") { // parent::test($format); $this->unit_test = TRUE; $this->load->library('unit_test'); $this->unit->run(true, true, "Tests $this->controller"); $this->tests_results($format); } }