283 lines
12 KiB
PHP
Executable File
283 lines
12 KiB
PHP
Executable File
<?php
|
|
/*
|
|
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
|
* Copyright (C) DevCode s.r.l.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
include_once __DIR__.'/../../core.php';
|
|
|
|
use Modules\PrimaNota\Mastrino;
|
|
use Modules\PrimaNota\Movimento;
|
|
|
|
switch (post('op')) {
|
|
// Aggiunta nuovo conto nel partitario
|
|
case 'add':
|
|
$id_conto = post('id_conto');
|
|
$numero = post('numero');
|
|
$descrizione = post('descrizione');
|
|
$lvl = post('lvl');
|
|
|
|
if (post('id_conto') !== null) {
|
|
if ($lvl == '2') {
|
|
// Controllo che non sia stato usato un numero non valido del conto
|
|
$query = 'SELECT idpianodeiconti1, numero FROM co_pianodeiconti2 WHERE numero='.prepare($numero).' AND idpianodeiconti1='.prepare($id_conto);
|
|
$rs = $dbo->fetchArray($query);
|
|
|
|
if (sizeof($rs) == 0) {
|
|
$query = 'INSERT INTO co_pianodeiconti2(numero, descrizione, idpianodeiconti1) VALUES('.prepare($numero).', '.prepare($descrizione).', '.prepare($id_conto).')';
|
|
}
|
|
} else {
|
|
// Controllo che non sia stato usato un numero non valido del conto
|
|
$query = 'SELECT idpianodeiconti2, numero FROM co_pianodeiconti3 WHERE numero='.prepare($numero).' AND idpianodeiconti2='.prepare($id_conto);
|
|
$rs = $dbo->fetchArray($query);
|
|
|
|
if (sizeof($rs) == 0) {
|
|
$query = 'INSERT INTO co_pianodeiconti3(numero, descrizione, idpianodeiconti2, dir, percentuale_deducibile) VALUES('.prepare($numero).', '.prepare($descrizione).', '.prepare($id_conto).', (SELECT dir FROM co_pianodeiconti2 WHERE id='.prepare($id_conto).'), '.post('percentuale_deducibile').')';
|
|
}
|
|
}
|
|
|
|
if ($dbo->query($query)) {
|
|
flash()->info(tr('Nuovo conto aggiunto!'));
|
|
} else {
|
|
flash()->error(tr('Il numero scelto è già esistente!'));
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
// Modifica conto di livello 2 e 3 nel partitario
|
|
case 'edit':
|
|
$idconto = post('idconto');
|
|
$idpianodeiconti = post('idpianodeiconti');
|
|
$numero = post('numero');
|
|
$descrizione = post('descrizione');
|
|
$dir = post('dir');
|
|
|
|
$lvl = post('lvl');
|
|
if ($lvl == 2) {
|
|
$duplicate_query = 'SELECT numero FROM co_pianodeiconti2 WHERE numero='.prepare($numero).' AND NOT id='.prepare($idconto).' AND idpianodeiconti1='.prepare($idpianodeiconti);
|
|
|
|
$update_query = 'UPDATE co_pianodeiconti2 SET numero='.prepare($numero).', descrizione='.prepare($descrizione).', dir='.prepare($dir).' WHERE id='.prepare($idconto);
|
|
} else {
|
|
$duplicate_query = 'SELECT idpianodeiconti2, numero FROM co_pianodeiconti3 WHERE numero='.prepare($numero).' AND NOT id='.prepare($idconto).' AND idpianodeiconti2='.prepare($idpianodeiconti);
|
|
|
|
$update_query = 'UPDATE co_pianodeiconti3 SET numero='.prepare($numero).', descrizione='.prepare($descrizione).', percentuale_deducibile='.prepare(post('percentuale_deducibile')).' WHERE id='.prepare($idconto);
|
|
}
|
|
|
|
// Controllo che non sia stato usato un numero non valido del conto
|
|
if ($dbo->fetchNum($duplicate_query) == 0) {
|
|
if ($dbo->query($update_query)) {
|
|
flash()->info(tr('Descrizione conto modificata!'));
|
|
}
|
|
} else {
|
|
flash()->error(tr('Il numero scelto è già esistente!'));
|
|
}
|
|
|
|
break;
|
|
|
|
// Eliminazione conto dal partitario
|
|
case 'del':
|
|
$idconto = post('idconto');
|
|
|
|
// Controllo che non esistano movimenti associati al conto
|
|
$movimenti = $dbo->fetchNum('SELECT id FROM co_movimenti WHERE idconto = '.prepare($idconto));
|
|
|
|
if ($idconto != '' and empty($movimenti)) {
|
|
// Se elimino il conto lo scollego anche da eventuali anagrafiche (cliente e fornitore)
|
|
$dbo->query('UPDATE an_anagrafiche SET idconto_cliente = NULL WHERE idconto_cliente = '.prepare($idconto));
|
|
$dbo->query('UPDATE an_anagrafiche SET idconto_fornitore = NULL WHERE idconto_fornitore = '.prepare($idconto));
|
|
|
|
$query = 'DELETE FROM co_pianodeiconti3 WHERE id='.prepare($idconto);
|
|
|
|
if ($dbo->query($query)) {
|
|
flash()->info(tr('Conto eliminato!'));
|
|
}
|
|
}
|
|
break;
|
|
|
|
// Apertura bilancio
|
|
case 'apri-bilancio':
|
|
// Eliminazione eventuali movimenti di apertura fatti finora
|
|
$dbo->query('DELETE FROM co_movimenti WHERE is_apertura=1 AND data='.prepare($_SESSION['period_start']));
|
|
|
|
$idconto_apertura = setting('Conto per Apertura conti patrimoniali');
|
|
$idconto_chiusura = setting('Conto per Chiusura conti patrimoniali');
|
|
$data_inizio = date('Ymd', strtotime($_SESSION['period_start'].' -1 year'));
|
|
$data_fine = $_SESSION['period_start'];
|
|
|
|
// Lettura di tutti i conti dello stato patrimoniale con saldo != 0
|
|
$conti = $dbo->fetchArray('SELECT co_pianodeiconti3.id, SUM(co_movimenti.totale) AS totale FROM ((co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id) INNER JOIN co_pianodeiconti1 ON co_pianodeiconti2.idpianodeiconti1=co_pianodeiconti1.id) INNER JOIN co_movimenti ON co_pianodeiconti3.id=co_movimenti.idconto WHERE co_pianodeiconti1.descrizione="Patrimoniale" AND data >= '.prepare($data_inizio).' AND data < '.prepare($data_fine).' AND co_pianodeiconti3.id!='.prepare($idconto_chiusura).' AND is_chiusura=0 GROUP BY co_pianodeiconti3.id HAVING totale != 0');
|
|
|
|
$mastrino = Mastrino::build(tr('Apertura conto'), $_SESSION['period_start'], 0, true);
|
|
|
|
$totale = 0;
|
|
|
|
foreach ($conti as $conto) {
|
|
if ($conto['totale'] >= 0) {
|
|
$dare = abs($conto['totale']);
|
|
$avere = 0;
|
|
} else {
|
|
$dare = 0;
|
|
$avere = abs($conto['totale']);
|
|
}
|
|
|
|
$movimento = Movimento::build($mastrino, $conto['id']);
|
|
$movimento->setTotale($avere, $dare);
|
|
$movimento->is_apertura = true;
|
|
$movimento->save();
|
|
|
|
$totale += $conto['totale'];
|
|
}
|
|
|
|
// Movimento sul conto di apertura
|
|
$totale = -$totale;
|
|
|
|
if ($totale >= 0) {
|
|
$dare = abs($totale);
|
|
$avere = 0;
|
|
} else {
|
|
$dare = 0;
|
|
$avere = abs($totale);
|
|
}
|
|
|
|
$movimento = Movimento::build($mastrino, $idconto_apertura);
|
|
$movimento->setTotale($avere, $dare);
|
|
$movimento->is_apertura = true;
|
|
$movimento->save();
|
|
|
|
flash()->info(tr('Apertura bilancio completata!'));
|
|
|
|
break;
|
|
|
|
// Chiusura bilancio
|
|
case 'chiudi-bilancio':
|
|
// Eliminazione eventuali movimenti di chiusura fatti finora
|
|
$dbo->query('DELETE FROM co_movimenti WHERE is_chiusura=1 AND data='.prepare($_SESSION['period_end']));
|
|
|
|
$idconto_apertura = setting('Conto per Apertura conti patrimoniali');
|
|
$idconto_chiusura = setting('Conto per Chiusura conti patrimoniali');
|
|
|
|
$data_inizio = $_SESSION['period_start'];
|
|
$data_fine = $_SESSION['period_end'];
|
|
|
|
// Lettura di tutti i conti dello stato patrimoniale con saldo != 0
|
|
$conti = $dbo->fetchArray('SELECT co_pianodeiconti3.id, SUM(co_movimenti.totale) AS totale FROM ((co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id) INNER JOIN co_pianodeiconti1 ON co_pianodeiconti2.idpianodeiconti1=co_pianodeiconti1.id) INNER JOIN co_movimenti ON co_pianodeiconti3.id=co_movimenti.idconto WHERE co_pianodeiconti1.descrizione="Patrimoniale" AND data >= '.prepare($data_inizio).' AND data <= '.prepare($data_fine).' AND co_pianodeiconti3.id!='.prepare($idconto_chiusura).' AND is_chiusura=0 GROUP BY co_pianodeiconti3.id HAVING totale != 0');
|
|
|
|
$mastrino = Mastrino::build(tr('Chiusura conto'), $_SESSION['period_end'], 0, true);
|
|
|
|
$totale = 0;
|
|
|
|
foreach ($conti as $conto) {
|
|
if ($conto['totale'] < 0) {
|
|
$dare = abs($conto['totale']);
|
|
$avere = 0;
|
|
} else {
|
|
$dare = 0;
|
|
$avere = abs($conto['totale']);
|
|
}
|
|
|
|
$movimento = Movimento::build($mastrino, $conto['id']);
|
|
$movimento->setTotale($avere, $dare);
|
|
$movimento->is_chiusura = true;
|
|
$movimento->save();
|
|
|
|
$totale += $conto['totale'];
|
|
}
|
|
|
|
// Movimento sul conto di chiusura
|
|
// $totale = -$totale;
|
|
|
|
if ($totale >= 0) {
|
|
$dare = abs($totale);
|
|
$avere = 0;
|
|
} else {
|
|
$dare = 0;
|
|
$avere = abs($totale);
|
|
}
|
|
|
|
$movimento = Movimento::build($mastrino, $idconto_chiusura);
|
|
$movimento->setTotale($avere, $dare);
|
|
$movimento->is_chiusura = true;
|
|
$movimento->save();
|
|
|
|
flash()->info(tr('Chiusura bilancio completata!'));
|
|
|
|
break;
|
|
|
|
case 'aggiorna_reddito':
|
|
$start = post('start');
|
|
$end = post('end');
|
|
$id_conto = post('id_conto');
|
|
|
|
$dbo->query('UPDATE co_movimenti
|
|
INNER JOIN co_pianodeiconti3 ON co_pianodeiconti3.id = co_movimenti.idconto
|
|
SET co_movimenti.totale_reddito = (co_movimenti.totale * co_pianodeiconti3.percentuale_deducibile / 100)
|
|
WHERE co_pianodeiconti3.id = '.prepare($id_conto).' AND
|
|
co_movimenti.data BETWEEN '.prepare($start).' AND '.prepare($end));
|
|
|
|
break;
|
|
|
|
case 'search':
|
|
$text = post('text');
|
|
$id_conti2 = 0;
|
|
$id_conti3 = 0;
|
|
|
|
if (!empty($text)) {
|
|
$id_conti = $dbo->fetchArray('SELECT id AS idpianodeiconti2 FROM co_pianodeiconti2 WHERE descrizione LIKE '.prepare('%'.$text.'%'));
|
|
$id_conti2 = array_column($id_conti, 'idpianodeiconti2');
|
|
|
|
$id_conti = $dbo->fetchArray('SELECT id AS idpianodeiconti3, idpianodeiconti2 FROM co_pianodeiconti3 WHERE descrizione LIKE '.prepare('%'.$text.'%'));
|
|
|
|
$id_conti3 = array_column($id_conti, 'idpianodeiconti3');
|
|
$id_conti2_3 = array_column($id_conti, 'idpianodeiconti2');
|
|
}
|
|
|
|
echo json_encode(['conti2' => $id_conti2, 'conti3' => $id_conti3, 'conti2_3' => $id_conti2_3]);
|
|
|
|
break;
|
|
|
|
case 'manage_verifica':
|
|
$id_movimento = post('id_movimento');
|
|
$is_verificato = post('is_verificato');
|
|
$response = null;
|
|
|
|
try {
|
|
$movimento = Movimento::find($id_movimento);
|
|
|
|
if ($is_verificato) {
|
|
$movimento->verified_at = date('Y-m-d H:i:s');
|
|
$movimento->verified_by = $user->id;
|
|
} else {
|
|
$movimento->verified_at = null;
|
|
$movimento->verified_by = 0;
|
|
}
|
|
$movimento->save();
|
|
|
|
$response = [
|
|
'result' => true,
|
|
];
|
|
} catch (Error $e) {
|
|
$response = [
|
|
'result' => false,
|
|
'message' => $e->getMessage(),
|
|
];
|
|
}
|
|
|
|
echo json_encode($response);
|
|
|
|
break;
|
|
}
|