2017-08-04 16:28:16 +02:00
|
|
|
<?php
|
2020-09-07 15:04:06 +02:00
|
|
|
/*
|
|
|
|
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
|
2021-01-20 15:08:51 +01:00
|
|
|
* Copyright (C) DevCode s.r.l.
|
2020-09-07 15:04:06 +02:00
|
|
|
*
|
|
|
|
* 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/>.
|
|
|
|
*/
|
2017-08-04 16:28:16 +02:00
|
|
|
|
|
|
|
include_once __DIR__.'/../../core.php';
|
|
|
|
|
2019-01-01 11:39:20 +01:00
|
|
|
use Modules\DDT\DDT;
|
2024-03-06 17:26:58 +01:00
|
|
|
use Modules\Iva\Aliquota;
|
2022-02-21 18:49:31 +01:00
|
|
|
use Util\Generator;
|
2019-01-01 11:39:20 +01:00
|
|
|
|
2023-12-06 17:24:23 +01:00
|
|
|
/*
|
2017-08-04 16:28:16 +02:00
|
|
|
* Funzione per generare un nuovo numero per il ddt.
|
2019-01-01 11:39:20 +01:00
|
|
|
*
|
|
|
|
* @deprecated 2.4.5
|
2017-08-04 16:28:16 +02:00
|
|
|
*/
|
2023-12-06 16:48:54 +01:00
|
|
|
if (!function_exists('get_new_numeroddt')) {
|
|
|
|
function get_new_numeroddt($data)
|
|
|
|
{
|
|
|
|
global $dir;
|
2017-08-04 16:28:16 +02:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
return DDT::getNextNumero($data, $dir);
|
|
|
|
}
|
2017-08-04 16:28:16 +02:00
|
|
|
}
|
|
|
|
|
2023-12-06 17:24:23 +01:00
|
|
|
/*
|
2017-08-04 16:28:16 +02:00
|
|
|
* Funzione per calcolare il numero secondario successivo utilizzando la maschera dalle impostazioni.
|
2019-01-01 11:39:20 +01:00
|
|
|
*
|
|
|
|
* @deprecated 2.4.5
|
2017-08-04 16:28:16 +02:00
|
|
|
*/
|
2023-12-06 16:48:54 +01:00
|
|
|
if (!function_exists('get_new_numerosecondarioddt')) {
|
2023-12-06 17:24:23 +01:00
|
|
|
function get_new_numerosecondarioddt($data)
|
2023-12-06 16:48:54 +01:00
|
|
|
{
|
|
|
|
global $dir;
|
|
|
|
global $id_segment;
|
2018-03-22 15:40:20 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
return DDT::getNextNumeroSecondario($data, $dir, $id_segment);
|
|
|
|
}
|
2019-01-01 11:39:20 +01:00
|
|
|
}
|
2018-06-22 17:04:37 +02:00
|
|
|
|
2023-12-06 17:24:23 +01:00
|
|
|
/*
|
2019-01-01 11:39:20 +01:00
|
|
|
* Calcolo imponibile ddt (totale_righe - sconto).
|
|
|
|
*
|
|
|
|
* @deprecated 2.4.5
|
|
|
|
*/
|
2023-12-06 16:48:54 +01:00
|
|
|
if (!function_exists('get_imponibile_ddt')) {
|
|
|
|
function get_imponibile_ddt($id_ddt)
|
|
|
|
{
|
|
|
|
$ddt = DDT::find($id_ddt);
|
2018-03-22 15:40:20 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
return $ddt->imponibile;
|
|
|
|
}
|
2019-01-01 11:39:20 +01:00
|
|
|
}
|
2018-03-22 15:40:20 +01:00
|
|
|
|
2023-12-06 17:24:23 +01:00
|
|
|
/*
|
2019-01-01 11:39:20 +01:00
|
|
|
* Calcolo totale ddt (imponibile + iva).
|
|
|
|
*
|
|
|
|
* @deprecated 2.4.5
|
|
|
|
*/
|
2023-12-06 16:48:54 +01:00
|
|
|
if (!function_exists('get_totale_ddt')) {
|
|
|
|
function get_totale_ddt($id_ddt)
|
|
|
|
{
|
|
|
|
$ddt = DDT::find($id_ddt);
|
2017-08-04 16:28:16 +02:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
return $ddt->totale;
|
|
|
|
}
|
2019-01-01 11:39:20 +01:00
|
|
|
}
|
2023-12-06 17:24:23 +01:00
|
|
|
/*
|
2019-01-01 11:39:20 +01:00
|
|
|
* Calcolo netto a pagare ddt (totale - ritenute - bolli).
|
|
|
|
*
|
|
|
|
* @deprecated 2.4.5
|
|
|
|
*/
|
2023-12-06 16:48:54 +01:00
|
|
|
if (!function_exists('get_netto_ddt')) {
|
|
|
|
function get_netto_ddt($id_ddt)
|
|
|
|
{
|
|
|
|
$ddt = DDT::find($id_ddt);
|
2019-01-01 11:39:20 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
return $ddt->netto;
|
|
|
|
}
|
2019-01-01 11:39:20 +01:00
|
|
|
}
|
|
|
|
|
2023-12-06 17:24:23 +01:00
|
|
|
/*
|
2019-01-01 11:39:20 +01:00
|
|
|
* Calcolo iva detraibile ddt.
|
|
|
|
*
|
|
|
|
* @deprecated 2.4.5
|
|
|
|
*/
|
2023-12-06 16:48:54 +01:00
|
|
|
if (!function_exists('get_ivadetraibile_ddt')) {
|
|
|
|
function get_ivadetraibile_ddt($id_ddt)
|
|
|
|
{
|
|
|
|
$ddt = DDT::find($id_ddt);
|
2019-01-01 11:39:20 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
return $ddt->iva_detraibile;
|
|
|
|
}
|
2019-01-01 11:39:20 +01:00
|
|
|
}
|
|
|
|
|
2023-12-06 17:24:23 +01:00
|
|
|
/*
|
2019-01-01 11:39:20 +01:00
|
|
|
* Calcolo iva indetraibile ddt.
|
|
|
|
*
|
|
|
|
* @deprecated 2.4.5
|
|
|
|
*/
|
2023-12-06 16:48:54 +01:00
|
|
|
if (!function_exists('get_ivaindetraibile_ddt')) {
|
|
|
|
function get_ivaindetraibile_ddt($id_ddt)
|
|
|
|
{
|
|
|
|
$ddt = DDT::find($id_ddt);
|
2017-08-04 16:28:16 +02:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
return $ddt->iva_indetraibile;
|
|
|
|
}
|
2017-08-04 16:28:16 +02:00
|
|
|
}
|
|
|
|
|
2023-12-06 17:24:23 +01:00
|
|
|
/*
|
2017-08-04 16:28:16 +02:00
|
|
|
* Ricalcola i costi aggiuntivi in ddt (rivalsa inps, ritenuta d'acconto, marca da bollo)
|
|
|
|
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
|
|
|
|
* $idddt int ID del ddt
|
|
|
|
* $idrivalsainps int ID della rivalsa inps da applicare. Se omesso viene utilizzata quella impostata di default
|
|
|
|
* $idritenutaacconto int ID della ritenuta d'acconto da applicare. Se omesso viene utilizzata quella impostata di default
|
|
|
|
* $bolli float Costi aggiuntivi delle marche da bollo. Se omesso verrà usata la cifra predefinita.
|
|
|
|
*/
|
2023-12-06 16:48:54 +01:00
|
|
|
if (!function_exists('ricalcola_costiagg_ddt')) {
|
|
|
|
function ricalcola_costiagg_ddt($idddt, $idrivalsainps = '', $idritenutaacconto = '', $bolli = '')
|
|
|
|
{
|
|
|
|
global $dir;
|
2017-08-04 16:28:16 +02:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
$dbo = database();
|
2017-08-04 16:28:16 +02:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
// Se ci sono righe nel ddt faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
|
|
|
|
$query = "SELECT COUNT(id) AS righe FROM dt_righe_ddt WHERE idddt='$idddt'";
|
2017-08-04 16:28:16 +02:00
|
|
|
$rs = $dbo->fetchArray($query);
|
2023-12-06 16:48:54 +01:00
|
|
|
if ($rs[0]['righe'] > 0) {
|
|
|
|
$totale_imponibile = get_imponibile_ddt($idddt);
|
|
|
|
$totale_ddt = get_totale_ddt($idddt);
|
|
|
|
|
|
|
|
// Leggo gli id dei costi aggiuntivi
|
|
|
|
if ($dir == 'uscita') {
|
|
|
|
$query2 = "SELECT idrivalsainps, idritenutaacconto, bollo FROM dt_ddt WHERE id='$idddt'";
|
|
|
|
$rs2 = $dbo->fetchArray($query2);
|
|
|
|
$idrivalsainps = $rs2[0]['idrivalsainps'];
|
|
|
|
$idritenutaacconto = $rs2[0]['idritenutaacconto'];
|
|
|
|
$bollo = $rs2[0]['bollo'];
|
|
|
|
}
|
2017-08-04 16:28:16 +02:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
// Leggo la rivalsa inps se c'è (per i ddt di vendita lo leggo dalle impostazioni)
|
|
|
|
if ($dir == 'entrata') {
|
|
|
|
if (!empty($idrivalsainps)) {
|
|
|
|
$idrivalsainps = setting('Cassa previdenziale predefinita');
|
|
|
|
}
|
|
|
|
}
|
2017-08-04 16:28:16 +02:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
$query = "SELECT percentuale FROM co_rivalse WHERE id='".$idrivalsainps."'";
|
|
|
|
$rs = $dbo->fetchArray($query);
|
|
|
|
$rivalsainps = $totale_imponibile / 100 * $rs[0]['percentuale'];
|
2017-08-04 16:28:16 +02:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
|
2024-02-06 17:36:05 +01:00
|
|
|
$qi = Aliquota::find(setting('Iva predefinita'))->percentuale;
|
2024-04-03 16:21:14 +02:00
|
|
|
$iva_rivalsainps = $rivalsainps / 100 * $qi;
|
2017-08-04 16:28:16 +02:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
// Aggiorno la rivalsa inps
|
|
|
|
$dbo->query("UPDATE dt_ddt SET rivalsainps='$rivalsainps', iva_rivalsainps='$iva_rivalsainps' WHERE id='$idddt'");
|
|
|
|
|
|
|
|
$totale_ddt = get_totale_ddt($idddt);
|
|
|
|
|
|
|
|
// Leggo la ritenuta d'acconto se c'è (per i ddt di vendita lo leggo dalle impostazioni)
|
|
|
|
if (!empty($idritenutaacconto)) {
|
|
|
|
if ($dir == 'entrata') {
|
|
|
|
$idritenutaacconto = setting("Ritenuta d'acconto predefinita");
|
|
|
|
}
|
2017-08-04 16:28:16 +02:00
|
|
|
}
|
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
$query = "SELECT percentuale FROM co_ritenutaacconto WHERE id='".$idritenutaacconto."'";
|
|
|
|
$rs = $dbo->fetchArray($query);
|
|
|
|
$ritenutaacconto = $totale_ddt / 100 * $rs[0]['percentuale'];
|
|
|
|
$netto_a_pagare = $totale_ddt - $ritenutaacconto;
|
|
|
|
|
|
|
|
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
|
|
|
|
$bolli = str_replace(',', '.', $bolli);
|
|
|
|
$bolli = floatval($bolli);
|
|
|
|
if ($dir == 'uscita') {
|
|
|
|
if ($bolli != 0.00) {
|
|
|
|
$bolli = str_replace(',', '.', $bolli);
|
|
|
|
if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) {
|
|
|
|
$marca_da_bollo = str_replace(',', '.', $bolli);
|
|
|
|
} else {
|
|
|
|
$marca_da_bollo = 0.00;
|
|
|
|
}
|
2017-08-04 16:28:16 +02:00
|
|
|
}
|
2023-12-06 16:48:54 +01:00
|
|
|
} else {
|
|
|
|
$marca_da_bollo = 0.00;
|
2017-08-04 16:28:16 +02:00
|
|
|
}
|
2023-12-06 16:48:54 +01:00
|
|
|
|
|
|
|
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='$ritenutaacconto', bollo='$marca_da_bollo' WHERE id='$idddt'");
|
2017-08-04 16:28:16 +02:00
|
|
|
} else {
|
2023-12-06 16:48:54 +01:00
|
|
|
$dbo->query("UPDATE dt_ddt SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id='$idddt'");
|
2017-08-04 16:28:16 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-12-06 17:24:23 +01:00
|
|
|
/*
|
2018-01-23 17:36:44 +01:00
|
|
|
* Restituisce lo stato del ddt in base alle righe.
|
|
|
|
*/
|
2023-12-06 16:48:54 +01:00
|
|
|
if (!function_exists('get_stato_ddt')) {
|
|
|
|
function get_stato_ddt($idddt)
|
|
|
|
{
|
|
|
|
$dbo = database();
|
|
|
|
|
|
|
|
$rs = $dbo->fetchArray('SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM dt_righe_ddt GROUP BY idddt HAVING idddt='.prepare($idddt));
|
|
|
|
|
|
|
|
if ($rs[0]['qta'] == 0) {
|
|
|
|
return 'Bozza';
|
2018-01-23 18:05:29 +01:00
|
|
|
} else {
|
2023-12-06 16:48:54 +01:00
|
|
|
if ($rs[0]['qta_evasa'] > 0) {
|
|
|
|
if ($rs[0]['qta'] > $rs[0]['qta_evasa']) {
|
|
|
|
return 'Parzialmente fatturato';
|
|
|
|
} elseif ($rs[0]['qta'] == $rs[0]['qta_evasa']) {
|
|
|
|
return 'Fatturato';
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return 'Evaso';
|
|
|
|
}
|
2018-01-23 18:05:29 +01:00
|
|
|
}
|
2018-01-23 17:36:44 +01:00
|
|
|
}
|
2018-02-18 19:53:23 +01:00
|
|
|
}
|
2022-02-21 18:49:31 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
if (!function_exists('verifica_numero_ddt')) {
|
|
|
|
function verifica_numero_ddt(DDT $ddt)
|
|
|
|
{
|
|
|
|
global $dbo;
|
2022-02-21 18:49:31 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
$data = $ddt->data;
|
|
|
|
$tipo = $ddt->tipo;
|
|
|
|
$dir = $ddt->direzione;
|
|
|
|
$numero = ($dir == 'entrata' ? $ddt->numero_esterno : $ddt->numero);
|
|
|
|
$campo = ($dir == 'entrata' ? 'numero_esterno' : 'numero');
|
2022-04-20 17:29:14 +02:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
if (empty($numero)) {
|
|
|
|
return null;
|
|
|
|
}
|
2022-02-21 18:49:31 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
$documenti = DDT::where('idtipoddt', $tipo->id)
|
|
|
|
->where('data', $data)
|
|
|
|
->get();
|
2022-02-21 18:49:31 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
// Recupero maschera per questo segmento
|
|
|
|
$maschera = setting('Formato numero secondario ddt');
|
2022-02-21 18:49:31 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
$ultimo = Generator::getPreviousFrom($maschera, 'dt_ddt', $campo, [
|
|
|
|
'data < '.prepare(date('Y-m-d', strtotime($data))),
|
|
|
|
'YEAR(data) = '.prepare(date('Y', strtotime($data))),
|
|
|
|
'idtipoddt = '.prepare($tipo->id),
|
|
|
|
], $data);
|
2023-08-04 14:54:28 +02:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
do {
|
|
|
|
$numero = Generator::generate($maschera, $ultimo, 1, Generator::dateToPattern($data));
|
2022-02-21 18:49:31 +01:00
|
|
|
|
2024-04-09 12:18:08 +02:00
|
|
|
$filtered = $documenti->reject(fn ($item, $key) => $item->numero_esterno == $numero);
|
2022-02-21 18:49:31 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
if ($documenti->count() == $filtered->count()) {
|
|
|
|
return $numero;
|
|
|
|
}
|
2022-02-21 18:49:31 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
$documenti = $filtered;
|
|
|
|
$ultimo = $numero;
|
|
|
|
} while ($numero != $ddt->numero_esterno);
|
2022-02-21 18:49:31 +01:00
|
|
|
|
2023-12-06 16:48:54 +01:00
|
|
|
return null;
|
|
|
|
}
|
2023-12-06 17:24:23 +01:00
|
|
|
}
|