Registrazione contabile bulk

This commit is contained in:
Thomas Zilio 2019-07-25 15:06:07 +02:00
parent e02b1f812d
commit 854c3255dc
4 changed files with 93 additions and 183 deletions

View File

@ -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' => '<span><i class="fa fa-calculator"></i> '.tr('Registra contabile pagamento').'</span>',
'data' => [
'title' => '',
'msg' => tr('Vuoi aggiungere un movimento contabile per le fatture selezionate?<br><small>(le fatture dovranno essere nello stato <i class="fa fa-clock-o text-info" title="Emessa"></i> <small>Emessa</small> altrimenti non saranno processate)</small>'),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
'blank' => true,
],
];
$operations['registra-contabile-2'] = [
$operations['registrazione-contabile'] = [
'text' => '<span><i class="fa fa-calculator"></i> '.tr('Registrazione contabile').'</span>',
'data' => [
'title' => tr('Registrazione contabile'),

View File

@ -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));

View File

@ -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[] = '<i class="'.$stato['icona'].'"></i> <small>'.$stato['descrizione'].'</small>';
}
echo '
<div class="alert alert-info">
<p>'.tr('Solo le fatture in stato _STATE_ possono essere registrate contabilmente ignorate', [
'_STATE_' => implode(', ', $descrizione_stati),
]).'.</p>
<p><b>'.tr('Sono state ignorate _NUM_ fatture', [
'_NUM_' => $counter,
]).'.</b></p>
</div>';
}
echo '
<form action="'.ROOTDIR.'/controller.php?id_module='.$module->id.'" method="post" id="add-form">
<input type="hidden" name="op" value="add">

View File

@ -0,0 +1,15 @@
<?php
include_once __DIR__.'/../../core.php';
$operations['registrazione-contabile'] = [
'text' => '<span><i class="fa fa-calculator"></i> '.tr('Registrazione contabile').'</span>',
'data' => [
'title' => tr('Registrazione contabile'),
'type' => 'modal',
'origine' => 'scadenzario',
'url' => $rootdir.'/add.php?id_module='.Modules::get('Prima nota')['id'],
],
];
return $operations;