/** * Solder les comptes de charge et de produits de l'exercice N * et les inscrire au résultat de l'exercice N+1 * @param integer $exercice ID de l'exercice à solder * @param string $date Date de début de l'exercice Y-m-d * @return boolean true en cas de succès */ public function solderResultat($exercice, $date) { $db = DB::getInstance(); $resultat_excedent = 120; $resultat_debiteur = 129; $comptes = new Comptes(); if (!$comptes->isActive($resultat_excedent)) { throw new UserException('Impossible de solder l\'exercice : le compte de résultat excédent ' . $resultat_excedent . ' n\'existe pas ou est désactivé.'); } else { if (!$comptes->isActive($resultat_debiteur)) { throw new UserException('Impossible de solder l\'exercice : le compte de résultat débiteur ' . $resultat_debiteur . ' n\'existe pas ou est désactivé.'); } } unset($comptes); $resultat = $this->getCompteResultat($exercice); $resultat = $resultat['resultat']; if ($resultat != 0) { $journal = new Journal(); $journal->add(['libelle' => 'Résultat de l\'exercice précédent', 'date' => $date, 'montant' => abs($resultat), 'compte_debit' => $resultat < 0 ? $resultat_debiteur : NULL, 'compte_credit' => $resultat > 0 ? $resultat_excedent : NULL]); } return true; }
public function fromCitizen($path) { if (!file_exists($path) || !is_readable($path)) { throw new \RuntimeException('Fichier inconnu : ' . $path); } $fp = fopen($path, 'r'); if (!$fp) { return false; } $db = DB::getInstance(); $db->exec('BEGIN;'); $comptes = new Comptes(); $banques = new Comptes_Bancaires(); $cats = new Categories(); $journal = new Journal(); $columns = []; $liste_comptes = $db->simpleStatementFetchAssoc('SELECT id, id FROM compta_comptes;'); $liste_cats = $db->simpleStatementFetchAssoc('SELECT intitule, id FROM compta_categories;'); $liste_moyens = $cats->listMoyensPaiement(); $get_compte = function ($compte, $intitule) use(&$liste_comptes, &$comptes, &$banques) { if (substr($compte, 0, 2) == '51') { $compte = '512' . substr($compte, -1); } // Création comptes if (!array_key_exists($compte, $liste_comptes)) { if (substr($compte, 0, 3) == '512') { $liste_comptes[$compte] = $banques->add(['libelle' => $intitule, 'banque' => 'Inconnue']); } else { $liste_comptes[$compte] = $comptes->add(['id' => $compte, 'libelle' => $intitule, 'parent' => substr($compte, 0, -1)]); } } return $compte; }; $col = function ($column) use(&$row, &$columns) { if (!isset($columns[$column])) { return null; } if (!isset($row[$columns[$column]])) { return null; } return $row[$columns[$column]]; }; $line = 0; $delim = Utils::find_csv_delim($fp); while (!feof($fp)) { $row = fgetcsv($fp, 4096, $delim); $line++; if (empty($row)) { continue; } if (empty($columns)) { $columns = $row; $columns = array_flip($columns); continue; } $date = $col('Date'); if (!preg_match('!^\\d{2}/\\d{2}/\\d{4}$!', $date)) { $db->exec('ROLLBACK;'); throw new UserException('Erreur sur la ligne ' . $line . ' : la date n\'est pas au format jj/mm/aaaa.'); } $date = explode('/', $date); $date = $date[2] . '-' . $date[1] . '-' . $date[0]; if ($db->simpleQuerySingle('SELECT 1 FROM compta_exercices WHERE (? < debut OR ? > fin) AND cloture = 0;', false, $date, $date)) { continue; } $debit = $get_compte($col('Compte débité - Numéro'), $col('Compte débité - Intitulé')); $credit = $get_compte($col('Compte crédité - Numéro'), $col('Compte crédité - Intitulé')); $cat = $col('Rubrique'); $moyen = strtoupper(substr($col('Moyen de paiement'), 0, 2)); if (!$moyen || !array_key_exists($moyen, $liste_moyens)) { $moyen = false; $cat = false; } if ($cat && !array_key_exists($cat, $liste_cats)) { if ($col('Nature') == 'Recette') { $type = $cats::RECETTES; $compte = $credit; } elseif ($col('Nature') == 'Dépense') { $type = $cats::DEPENSES; $compte = $debit; } else { $type = $cats::AUTRES; $cat = false; } if ($type != $cats::AUTRES) { $liste_cats[$cat] = $cats->add(['intitule' => $cat, 'type' => $type, 'compte' => $compte]); } } $data = ['libelle' => $col('Libellé'), 'montant' => $col('Montant'), 'date' => $date, 'compte_credit' => $credit, 'compte_debit' => $debit, 'numero_piece' => $col('Numéro de pièce'), 'remarques' => $col('Remarques')]; if ($cat) { $data['moyen_paiement'] = $moyen; $data['numero_cheque'] = $col('Numéro de chèque'); $data['id_categorie'] = $liste_cats[$cat]; } $journal->add($data); } $db->exec('END;'); fclose($fp); return true; }