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, +]).'.
+