From 854c3255dc10bf40f61ad8cbac0b9ea0ac25105d Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Thu, 25 Jul 2019 15:06:07 +0200 Subject: [PATCH] Registrazione contabile bulk --- modules/fatture/bulk.php | 143 +--------------------------------- modules/primanota/actions.php | 18 ++--- modules/primanota/add.php | 100 ++++++++++++++++-------- modules/scadenzario/bulk.php | 15 ++++ 4 files changed, 93 insertions(+), 183 deletions(-) create mode 100644 modules/scadenzario/bulk.php diff --git a/modules/fatture/bulk.php b/modules/fatture/bulk.php index d5d31bfa2..2ca21f8e1 100644 --- a/modules/fatture/bulk.php +++ b/modules/fatture/bulk.php @@ -166,136 +166,6 @@ switch (post('op')) { } } break; - - case 'registra-contabile': - //Generazione della descrizione del movimento - $rs_fatture = $dbo->fetchArray('SELECT *, co_documenti.id AS id, co_documenti.data AS data_doc FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id IN('.implode(',', $id_records).") AND idstatodocumento IN (SELECT id FROM co_statidocumento WHERE descrizione = 'Emessa' OR descrizione = 'Parzialmente pagato')"); - - $diff = count($id_records) - count($rs_fatture); - if ($diff != 0) { - flash()->warning(tr('_NUM_ fatture non sono state incluse poichè non corrispondenti con i requisiti', [ - '_NUM_' => $diff, - ])); - } - - if (empty($rs_fatture)) { - return; - } - - //calcolo della descrizione - $descrizione_movimento = 'Pag. fatture num. '; - - for ($i = 0; $i < sizeof($rs_fatture); ++$i) { - if ($rs_fatture[$i]['numero_esterno'] != '') { - $descrizione_movimento .= $rs_fatture[$i]['numero_esterno'].' '; - } else { - $descrizione_movimento .= $rs_fatture[$i]['numero'].' '; - } - } - - $idmastrino = get_new_idmastrino(); - - $importo_conto_aziendale = 0; - - for ($i = 0; $i < sizeof($rs_fatture); ++$i) { - //Inserimento righe cliente - - if ($rs_fatture[$i]['dir'] == 'entrata') { - $dir = 'entrata'; - } else { - $dir = 'uscita'; - } - - $field = 'idconto_'.($dir == 'entrata' ? 'vendite' : 'acquisti'); - $idconto_aziendale = $dbo->fetchArray('SELECT '.$field.' FROM co_pagamenti WHERE id = (SELECT idpagamento FROM co_documenti WHERE id='.prepare($rs_fatture[$i]['id']).') GROUP BY descrizione')[0][$field]; - - // Lettura conto di default - $idconto_aziendale = !empty($idconto_aziendale) ? $idconto_aziendale : setting('Conto aziendale predefinito'); - - $query = 'SELECT SUM(ABS(da_pagare-pagato)) AS rata FROM co_scadenziario WHERE iddocumento='.prepare($rs_fatture[$i]['id']).' GROUP BY iddocumento'; - $rs = $dbo->fetchArray($query); - $totale_pagato = $rs[0]['rata']; - - $importo_conto_aziendale += $totale_pagato; - } - - //Inserimento riga unica per conto aziendale - if ($dir == 'entrata') { - $dbo->query('INSERT INTO co_movimenti(idmastrino, data, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', NOW(), '.prepare($descrizione_movimento).', '.prepare($idconto_aziendale).', '.prepare($importo_conto_aziendale).', 1)'); - } else { - $dbo->query('INSERT INTO co_movimenti(idmastrino, data, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', NOW(), '.prepare($descrizione_movimento).', '.prepare($idconto_aziendale).', '.prepare(-$importo_conto_aziendale).', 1)'); - } - - for ($i = 0; $i < sizeof($rs_fatture); ++$i) { - //Inserimento righe cliente - - if ($rs_fatture[$i]['dir'] == 'entrata') { - $dir = 'entrata'; - } else { - $dir = 'uscita'; - } - - $query = 'SELECT SUM(ABS(da_pagare-pagato)) AS rata FROM co_scadenziario WHERE iddocumento='.prepare($rs_fatture[$i]['id']).' GROUP BY iddocumento'; - $rs = $dbo->fetchArray($query); - $totale_pagato = $rs[0]['rata']; - - // conto crediti clienti - if ($dir == 'entrata') { - // Se è la prima nota di una fattura leggo il conto del cliente - if ($rs_fatture[$i]['id'] != '') { - $query = 'SELECT idconto_cliente FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($rs_fatture[$i]['id']); - $rs = $dbo->fetchArray($query); - $idconto_controparte = $rs[0]['idconto_cliente']; - } else { - $query = "SELECT id FROM co_pianodeiconti3 WHERE descrizione='Riepilogativo clienti'"; - $rs = $dbo->fetchArray($query); - $idconto_controparte = $rs[0]['id']; - } - } - // conto debiti fornitori - else { - // Se è la prima nota di una fattura leggo il conto del fornitore - if ($rs_fatture[$i]['id'] != '') { - $query = 'SELECT idconto_fornitore FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($rs_fatture[$i]['id']); - $rs = $dbo->fetchArray($query); - $idconto_controparte = $rs[0]['idconto_fornitore']; - } else { - $query = "SELECT id FROM co_pianodeiconti3 WHERE descrizione='Riepilogativo fornitori'"; - $rs = $dbo->fetchArray($query); - $idconto_controparte = $rs[0]['id']; - } - } - - // Lettura causale movimento (documento e ragione sociale) - $importo_conto_controparte = $totale_pagato; - - if ($dir == 'entrata') { - $dbo->query('INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', NOW(), '.prepare($rs_fatture[$i]['data_doc']).', '.prepare($rs_fatture[$i]['id']).', '.prepare($rs_fatture[$i]['idanagrafica']).', '.prepare($descrizione_movimento).', '.prepare($idconto_controparte).', '.prepare(-$importo_conto_controparte).', 1)'); - } else { - $dbo->query('INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES('.prepare($idmastrino).', NOW(), '.prepare($rs_fatture[$i]['data_doc']).', '.prepare($rs_fatture[$i]['id']).', '.prepare($rs_fatture[$i]['idanagrafica']).', '.prepare($descrizione_movimento).', '.prepare($idconto_controparte).', '.prepare($importo_conto_controparte).', 1)'); - } - - aggiorna_scadenziario($rs_fatture[$i]['id'], abs($totale_pagato), date('d/m/Y')); - - // Verifico se la fattura è stata pagata tutta, così imposto lo stato a "Pagato" - $query = 'SELECT SUM(pagato) AS tot_pagato, SUM(da_pagare) AS tot_da_pagare FROM co_scadenziario GROUP BY iddocumento HAVING iddocumento='.prepare($rs_fatture[$i]['id']); - $rs = $dbo->fetchArray($query); - - // Aggiorno lo stato della fattura - if (abs($rs[0]['tot_pagato']) == abs($rs[0]['tot_da_pagare'])) { - $dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Pagato') WHERE id=".prepare($rs_fatture[$i]['id'])); - } elseif (abs($rs[0]['tot_pagato']) != abs($rs[0]['tot_da_pagare']) && abs($rs[0]['tot_pagato']) != '0') { - $dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Parzialmente pagato') WHERE id=".prepare($rs_fatture[$i]['id'])); - } else { - $dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Emessa') WHERE id=".prepare($rs_fatture[$i]['id'])); - } - } - - $database->commitTransaction(); - redirect($rootdir.'/editor.php?id_module='.Modules::get('Prima nota')['id'].'&id_record='.$idmastrino); - exit; - - break; } if (App::debug()) { @@ -304,18 +174,7 @@ if (App::debug()) { ]; } -$operations['registra-contabile'] = [ - 'text' => ' '.tr('Registra contabile pagamento').'', - 'data' => [ - 'title' => '', - 'msg' => tr('Vuoi aggiungere un movimento contabile per le fatture selezionate?
(le fatture dovranno essere nello stato Emessa altrimenti non saranno processate)'), - 'button' => tr('Procedi'), - 'class' => 'btn btn-lg btn-warning', - 'blank' => true, - ], -]; - -$operations['registra-contabile-2'] = [ +$operations['registrazione-contabile'] = [ 'text' => ' '.tr('Registrazione contabile').'', 'data' => [ 'title' => tr('Registrazione contabile'), diff --git a/modules/primanota/actions.php b/modules/primanota/actions.php index ea600489d..3db4019c3 100644 --- a/modules/primanota/actions.php +++ b/modules/primanota/actions.php @@ -37,16 +37,16 @@ switch (post('op')) { 'primanota' => 1, ]); - if (!empty($id_documento)) { - // Inserisco nello scadenziario il totale pagato - if (empty($insoluto)) { - aggiorna_scadenziario($id_documento, abs($totale), $data, $id_scadenza); - } - // Rimuovo dallo scadenzario l'insoluto - else { - aggiorna_scadenziario($id_documento, -abs($totale), $data, $id_scadenza); - } + // Inserisco nello scadenziario il totale pagato + if (empty($insoluto)) { + aggiorna_scadenziario($id_documento, abs($totale), $data, $id_scadenza); + } + // Rimuovo dallo scadenzario l'insoluto + else { + aggiorna_scadenziario($id_documento, -abs($totale), $data, $id_scadenza); + } + if (!empty($id_documento)) { // Verifico se la fattura è stata pagata tutta, così imposto lo stato a "Pagato" $rs = $dbo->fetchArray('SELECT SUM(pagato) AS tot_pagato, SUM(da_pagare) AS tot_da_pagare FROM co_scadenziario WHERE iddocumento='.prepare($id_documento)); diff --git a/modules/primanota/add.php b/modules/primanota/add.php index 7bdcac935..ac38dfa35 100644 --- a/modules/primanota/add.php +++ b/modules/primanota/add.php @@ -9,8 +9,6 @@ $module = Modules::get('Prima nota'); $variables = Modules::get('Fatture di vendita')->getPlaceholders($id_documento); $righe = []; -$singola_scadenza = get('single') != null; - // Registrazione da remoto $id_records = get('id_records'); if (!empty($id_records)) { @@ -22,19 +20,65 @@ if (!empty($id_records)) { } } -// Fatture +// ID predefiniti +$dir = get('dir'); +$singola_scadenza = get('single') != null; + $id_documenti = $id_documenti ?: get('id_documenti'); $id_documenti = $id_documenti ? explode(',', $id_documenti) : []; + +$id_scadenze = $id_scadenze ?: get('id_scadenze'); +$id_scadenze = $id_scadenze ? explode(',', $id_scadenze) : []; + +// Scadenze +foreach ($id_scadenze as $id_scadenza) { + $scadenza = $dbo->fetchOne('SELECT descrizione, scadenza, iddocumento, SUM(da_pagare - pagato) AS rata FROM co_scadenziario WHERE id='.prepare($id_scadenza)); + if (!empty($scadenza['iddocumento'])){ + $id_documenti[] = $scadenza['iddocumento']; + continue; + } + + $descrizione_conto = ($dir == 'entrata') ? 'Riepilogativo clienti' : 'Riepilogativo fornitori'; + $conto = $dbo->fetchOne('SELECT id FROM co_pianodeiconti3 WHERE descrizione = '.prepare($descrizione_conto)); + $id_conto_controparte = $conto['id']; + + $righe_documento = []; + $righe_documento[] = [ + 'id_scadenza' => $scadenza['id'], + 'conto' => null, + 'dare' => ($dir == 'entrata') ? 0 : $scadenza['rata'], + 'avere' => ($dir == 'entrata') ? $scadenza['rata'] : 0, + ]; + + $righe_documento[] = [ + 'id_scadenza' => $scadenza['id'], + 'conto' => $id_conto_controparte, + 'dare' => ($dir == 'entrata') ? $scadenza['rata'] : 0, + 'avere' => ($dir == 'entrata') ? 0 : $scadenza['rata'], + ]; + + $righe = array_merge($righe, $righe_documento); +} + +// Fatture $numeri = []; +$counter = 0; + foreach ($id_documenti as $id_documento) { $fattura = Fattura::find($id_documento); - $tipo = $fattura->tipo; + $tipo = $fattura->stato; $dir = $fattura->direzione; + // Inclusione delle sole fatture in stato Emessa, Parzialmente pagato o Pagato + if (!in_array($fattura->stato->descrizione, ['Emessa', 'Parzialmente pagato', 'Pagato'])) { + ++$counter; + continue; + } + $numeri[] = !empty($fattura['numero_esterno']) ? $fattura['numero_esterno'] : $fattura['numero']; $nota_credito = $tipo->descrizione == 'Nota di credito'; - $is_insoluto = (!empty($fattura['riba']) && in_array($tipo->descrizione, ['Emessa', 'Parzialmente pagato', 'Pagato']) && $dir == 'entrata'); + $is_insoluto = (!empty($fattura['riba']) && $dir == 'entrata'); // Predisposizione prima riga $conto_field = 'idconto_'.($dir == 'entrata' ? 'vendite' : 'acquisti'); @@ -43,7 +87,6 @@ foreach ($id_documenti as $id_documento) { // Predisposizione conto crediti clienti $conto_field = 'idconto_'.($dir == 'entrata' ? 'cliente' : 'fornitore'); $id_conto_controparte = $fattura->anagrafica[$conto_field]; - //$_SESSION['superselect']['idconto_controparte'] = $id_conto_controparte; // Lettura delle scadenza della fattura $scadenze = $dbo->fetchArray('SELECT id, ABS(da_pagare - pagato) AS rata FROM co_scadenziario WHERE iddocumento='.prepare($id_documento).' AND ABS(da_pagare) > ABS(pagato) ORDER BY YEAR(scadenza) ASC, MONTH(scadenza) ASC'); @@ -57,10 +100,9 @@ foreach ($id_documenti as $id_documento) { // Riga aziendale $totale = sum(array_column($scadenze, 'rata')); - $ids = implode(',', array_column($scadenze, 'id')); if ($totale != 0) { $righe_documento[] = [ - 'id_scadenza' => $ids, + 'id_scadenza' => $scadenze[0]['id'], 'insoluto' => $is_insoluto, 'conto' => $id_conto_aziendale, 'dare' => ($dir == 'entrata') ? 0 : $totale, @@ -91,30 +133,6 @@ foreach ($id_documenti as $id_documento) { $righe = array_merge($righe, $righe_documento); } -$dir = get('dir'); - -// Scadenze -$id_scadenze = $id_scadenze ?: get('id_scadenze'); -$id_scadenze = $id_scadenze ? explode(',', $id_scadenze) : []; -foreach ($id_scadenze as $id_scadenza) { - $scadenza = $dbo->fetchOne('SELECT descrizione, scadenza, SUM(da_pagare - pagato) AS rata FROM co_scadenziario WHERE id='.prepare($id_scadenza)); - - $descrizione_conto = ($dir == 'entrata') ? 'Riepilogativo clienti' : 'Riepilogativo fornitori'; - $conto = $dbo->fetchOne('SELECT id FROM co_pianodeiconti3 WHERE descrizione = '.prepare($descrizione_conto)); - $id_conto_controparte = $conto['id']; - - $righe_documento = []; - - $righe_documento[] = [ - 'id_scadenza' => $scadenza['id'], - 'conto' => $id_conto_controparte, - 'dare' => ($dir == 'entrata') ? $scadenza['rata'] : 0, - 'avere' => ($dir == 'entrata') ? 0 : $scadenza['rata'], - ]; - - $righe = array_merge($righe, $righe_documento); -} - // Descrizione $numero_scadenze = count($id_scadenze); $numero_documenti = count($id_documenti); @@ -145,6 +163,24 @@ if ($numero_documenti + $numero_scadenze > 1) { ]); } +if (!empty($id_records) && get('origine') == 'fatture' && !empty($counter)) { + $descrizione_stati = []; + $stati = $database->fetchArray("SELECT * FROM `co_statidocumento` WHERE descrizione IN ('Emessa', 'Parzialmente pagato', 'Pagato') ORDER BY descrizione"); + foreach ($stati as $stato) { + $descrizione_stati[] = ' '.$stato['descrizione'].''; + } + + echo ' +
+

'.tr('Solo le fatture in stato _STATE_ possono essere registrate contabilmente ignorate', [ + '_STATE_' => implode(', ', $descrizione_stati), +]).'.

+

'.tr('Sono state ignorate _NUM_ fatture', [ + '_NUM_' => $counter, +]).'.

+
'; +} + echo '
diff --git a/modules/scadenzario/bulk.php b/modules/scadenzario/bulk.php new file mode 100644 index 000000000..053250a76 --- /dev/null +++ b/modules/scadenzario/bulk.php @@ -0,0 +1,15 @@ + ' '.tr('Registrazione contabile').'', + 'data' => [ + 'title' => tr('Registrazione contabile'), + 'type' => 'modal', + 'origine' => 'scadenzario', + 'url' => $rootdir.'/add.php?id_module='.Modules::get('Prima nota')['id'], + ], +]; + +return $operations;