public function fromCSV($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 = array_flip($this->csv_header); $liste_comptes = $db->simpleStatementFetchAssoc('SELECT id, id FROM compta_comptes;'); $liste_cats = $db->simpleStatementFetchAssoc('SELECT intitule, id FROM compta_categories;'); $liste_moyens = $cats->listMoyensPaiement(); $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 ($line === 1) { if (trim($row[0]) != 'Numéro mouvement') { throw new UserException('Erreur sur la ligne ' . $line . ' : l\'entête des colonnes est absent ou incorrect.'); } continue; } if (count($row) != count($columns)) { $db->exec('ROLLBACK;'); throw new UserException('Erreur sur la ligne ' . $line . ' : le nombre de colonnes est incorrect.'); } if (trim($row[0]) !== '' && !is_numeric($row[0])) { $db->exec('ROLLBACK;'); throw new UserException('Erreur sur la ligne ' . $line . ' : la première colonne doit être vide ou contenir le numéro unique d\'opération.'); } $id = $col('Numéro mouvement'); $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]; // En dehors de l'exercice courant if ($db->simpleQuerySingle('SELECT 1 FROM compta_exercices WHERE (? < debut OR ? > fin) AND cloture = 0;', false, $date, $date)) { continue; } $debit = $col('Compte de débit - numéro'); $credit = $col('Compte de crédit - numéro'); if (trim($debit) == '' && trim($credit) != '') { $debit = null; } elseif (trim($debit) != '' && trim($credit) == '') { $credit = null; } $cat = $col('Catégorie'); $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)) { $cat = $moyen = false; } $data = ['libelle' => $col('Libellé'), 'montant' => (double) $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]; } if (empty($id)) { $journal->add($data); } else { $journal->edit($id, $data); } } $db->exec('END;'); fclose($fp); return true; }