X-Git-Url: https://git.cyclocoop.org/?p=garradin.git;a=blobdiff_plain;f=include%2Fclass.compta_import.php;h=ec1688d8d554d4e661e565eea67a50d5e116333e;hp=73fd99b2e5c1b80d4cd52bd591c3115f9b7ba125;hb=f7ee0ae730f47bfef173c394fa4db71a22dece61;hpb=1ab3343a95ed3ef4958d91dfbf49372dce8a092e;ds=sidebyside diff --git a/include/class.compta_import.php b/include/class.compta_import.php index 73fd99b..ec1688d 100644 --- a/include/class.compta_import.php +++ b/include/class.compta_import.php @@ -25,28 +25,30 @@ class Compta_Import { $db = DB::getInstance(); - $res = $db->prepare('SELECT - journal.id, - strftime(\'%d/%m/%Y\', date) AS date, - (CASE cat.type WHEN 1 THEN \'Recette\' WHEN -1 THEN \'Dépense\' ELSE \'Autre\' END) AS type, - (CASE cat.intitule WHEN NULL THEN \'\' ELSE cat.intitule END) AS cat, - journal.libelle, - montant, - compte_debit, - debit.libelle AS libelle_debit, - compte_credit, - credit.libelle AS libelle_credit, - (CASE moyen_paiement WHEN NULL THEN \'\' ELSE moyen.nom END) AS moyen, - numero_cheque, - numero_piece, - remarques + $retro_comptatibility = 'SELECT count(montant) AS montants FROM compta_flux WHERE compta_flux.id_journal = journal.id'; + $res = $db->prepare(' + SELECT + journal.id, + strftime(\'%d/%m/%Y\', date) AS date, + (CASE cat.type WHEN 1 THEN \'Recette\' WHEN -1 THEN \'Dépense\' ELSE \'Autre\' END) AS type, + (CASE cat.intitule WHEN NULL THEN \'\' ELSE cat.intitule END), + journal.libelle, + abs(flux.montant) AS montant, + (CASE WHEN flux.montant >= 0 THEN flux.compte ELSE \'\' END), + (CASE WHEN flux.montant >= 0 THEN flux_compte.libelle ELSE \'\' END) AS compte_debit_libelle, + (CASE WHEN flux.montant < 0 THEN flux.compte ELSE \'\' END), + (CASE WHEN flux.montant < 0 THEN flux_compte.libelle ELSE \'\' END) AS compte_credit_libelle, + (CASE moyen_paiement WHEN NULL THEN \'\' ELSE moyen.nom END) AS moyen, + numero_cheque, + numero_piece, + remarques FROM compta_journal AS journal LEFT JOIN compta_categories AS cat ON cat.id = journal.id_categorie - LEFT JOIN compta_comptes AS debit ON debit.id = journal.compte_debit - LEFT JOIN compta_comptes AS credit ON credit.id = journal.compte_credit LEFT JOIN compta_moyens_paiement AS moyen ON moyen.code = journal.moyen_paiement + LEFT JOIN compta_flux AS flux ON flux.id_journal = journal.id + LEFT JOIN compta_comptes AS flux_compte ON flux_compte.id = flux.compte WHERE id_exercice = '.(int)$exercice.' - ORDER BY journal.date; + ORDER BY journal.id; ')->execute(); $fp = fopen('php://output', 'w'); @@ -101,11 +103,15 @@ class Compta_Import }; $line = 0; + $last_id = 0; + $id = 0; $delim = utils::find_csv_delim($fp); + unset($data); while (!feof($fp)) { $row = fgetcsv($fp, 4096, $delim); + print_r(["row" => $row]); $line++; if (empty($row)) @@ -135,77 +141,136 @@ class Compta_Import throw new UserException('Erreur sur la ligne ' . $line . ' : la première colonne doit être vide ou contenir le numéro unique d\'opération.'); } + $last_id = $id; $id = $col('Numéro mouvement'); - $date = $col('Date'); - - if (!preg_match('!^\d{2}/\d{2}/\d{4}$!', $date)) + if ($id == $last_id) { - $db->exec('ROLLBACK;'); - throw new UserException('Erreur sur la ligne ' . $line . ' : la date n\'est pas au format jj/mm/aaaa.'); + $montant = $col('Montant'); + $debit = $col('Compte de débit - numéro'); + $credit = $col('Compte de crédit - numéro'); + + if (trim($debit) == '' && trim($credit) != '') + { + $debit = null; + $fluxs[] = + [ 'compte' => $credit + , 'montant' => - $montant + ]; + } + if (trim($debit) != '' && trim($credit) == '') + { + $credit = null; + $fluxs[] = + [ 'compte' => $debit + , 'montant' => $montant + ]; + } } + else + { + if (isset($data)) { + // NOTE: import previously collected $last_id + $data['fluxs'] = $fluxs; + $id_journal = $db->simpleQuerySingle('SELECT id FROM compta_journal WHERE id = ?;', false, $last_id); + if (empty($last_id) || empty($id_journal)) + { + print_r(["data" => $data]); + $journal->add($data); + } + else + { + print_r(['id' => $last_id, "data" => $data]); + $journal->edit($last_id, $data); + } + unset($data); + } + + // NOTE: start collecting $id + $fluxs = []; + $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]; + $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; - } + // 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'); + $cat = $col('Catégorie'); + $moyen = strtoupper(substr($col('Moyen de paiement'), 0, 2)); - if (trim($debit) == '' && trim($credit) != '') - { - $debit = null; - } - elseif (trim($debit) != '' && trim($credit) == '') - { - $credit = null; - } + if (!$moyen || !array_key_exists($moyen, $liste_moyens)) + { + $moyen = false; + $cat = false; + } - $cat = $col('Catégorie'); - $moyen = strtoupper(substr($col('Moyen de paiement'), 0, 2)); + if ($cat && !array_key_exists($cat, $liste_cats)) + { + $cat = $moyen = false; + } - if (!$moyen || !array_key_exists($moyen, $liste_moyens)) - { - $moyen = false; - $cat = false; - } + $montant = $col('Montant'); + $debit = $col('Compte de débit - numéro'); + $credit = $col('Compte de crédit - numéro'); - if ($cat && !array_key_exists($cat, $liste_cats)) - { - $cat = $moyen = false; - } + if (trim($debit) == '' && trim($credit) != '') + { + $debit = null; + $fluxs[] = + [ 'compte' => $credit + , 'montant' => - $montant + ]; + } + if (trim($debit) != '' && trim($credit) == '') + { + $credit = null; + $fluxs[] = + [ 'compte' => $debit + , 'montant' => $montant + ]; + } - $data = [ - 'libelle' => $col('Libellé'), - 'montant' => (float) $col('Montant'), - 'date' => $date, - 'compte_credit' => $credit, - 'compte_debit' => $debit, - 'numero_piece' => $col('Numéro de pièce'), - 'remarques' => $col('Remarques'), - ]; + $data = [ + 'libelle' => $col('Libellé'), + 'date' => $date, + '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 ($cat) + { + $data['moyen_paiement'] = $moyen; + $data['numero_cheque'] = $col('Numéro de chèque'); + $data['id_categorie'] = $liste_cats[$cat]; + } } - - if (empty($id)) + } + if (isset($data)) { + // NOTE: import previously collected $id + $data['fluxs'] = $fluxs; + $id_journal = $db->simpleQuerySingle('SELECT id FROM compta_journal WHERE id = ?;', false, $id); + if (empty($id) || empty($id_journal)) { + print_r(["data" => $data]); $journal->add($data); } else { + print_r(['id (end)' => $id, "data" => $data]); $journal->edit($id, $data); } - } + unset($data); + } $db->exec('END;'); @@ -384,4 +449,4 @@ class Compta_Import } } -?> \ No newline at end of file +?>