Example #1
0
 /**
  * Supprime un compte bancaire
  * La suppression sera refusée si le compte est utilisé dans l'exercice en cours
  * ou dans une catégorie.
  * Le compte bancaire sera supprimé et le compte au plan comptable seulement désactivé
  * si le compte est utilisé dans un exercice précédent.
  *
  * La désactivation d'un compte fait qu'il n'est plus utilisable dans l'exercice courant
  * ou les exercices suivants, mais il est possible de le réactiver.
  * @param  string $id  Numéro du compte
  * @return boolean     TRUE si la suppression ou désactivation a été effectuée, une exception ou FALSE sinon
  */
 public function delete($id)
 {
     $db = DB::getInstance();
     if (!$db->simpleQuerySingle('SELECT 1 FROM compta_comptes_bancaires WHERE id = ?;', false, trim($id))) {
         throw new UserException('Ce compte n\'est pas un compte bancaire.');
     }
     // Ne pas supprimer/désactiver un compte qui est utilisé dans l'exercice courant
     if ($db->simpleQuerySingle('SELECT 1 FROM compta_journal
             WHERE id_exercice = (SELECT id FROM compta_exercices WHERE cloture = 0 LIMIT 1) 
             AND (compte_debit = ? OR compte_debit = ?) LIMIT 1;', false, $id, $id)) {
         throw new UserException('Ce compte ne peut être supprimé car des écritures y sont liées sur l\'exercice courant. ' . 'Il faut supprimer ou ré-attribuer ces écritures avant de pouvoir supprimer le compte.');
     }
     // Il n'est pas possible de supprimer ou désactiver un compte qui est lié à des catégories
     if ($db->simpleQuerySingle('SELECT 1 FROM compta_categories WHERE compte = ? LIMIT 1;', false, $id)) {
         throw new UserException('Ce compte ne peut être supprimé car des catégories y sont liées. ' . 'Merci de supprimer ou modifier les catégories liées avant de le supprimer.');
     }
     $db->simpleExec('DELETE FROM compta_comptes_bancaires WHERE id = ?;', trim($id));
     try {
         $return = parent::delete($id);
     } catch (UserException $e) {
         // Impossible de supprimer car des opérations y sont encore liées
         // sur les exercices précédents, alors on le désactive
         $return = parent::disable($id);
     }
     return $return;
 }
Example #2
0
 /**
  * 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;
 }
Example #3
0
    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;
    }