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
2018-08-31 17:41:24 +02:00
use Modules\Fatture\Fattura ;
2024-03-22 15:52:24 +01:00
use Modules\Interventi\Intervento ;
2024-03-06 17:26:58 +01:00
use Modules\Iva\Aliquota ;
2020-03-02 16:13:07 +01:00
use Util\Generator ;
2018-08-31 17:41:24 +02:00
2023-12-06 17:24:23 +01:00
/*
2017-08-04 16:28:16 +02:00
* Funzione per generare un nuovo numero per la fattura .
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_numerofattura' )) {
function get_new_numerofattura ( $data )
{
global $dir ;
global $id_segment ;
2018-03-21 22:30:15 +01:00
2023-12-06 16:48:54 +01:00
return Fattura :: getNextNumero ( $data , $dir , $id_segment );
}
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_numerosecondariofattura' )) {
function get_new_numerosecondariofattura ( $data )
{
global $dir ;
global $id_segment ;
return Fattura :: getNextNumeroSecondario ( $data , $dir , $id_segment );
}
2017-08-04 16:28:16 +02:00
}
2023-12-06 17:24:23 +01:00
/*
2019-01-01 11:39:20 +01:00
* Calcolo imponibile fattura ( totale_righe - sconto ) .
*
* @ deprecated 2.4 . 5
*/
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'get_imponibile_fattura' )) {
function get_imponibile_fattura ( $iddocumento )
{
$fattura = Fattura :: find ( $iddocumento );
return $fattura -> imponibile ;
}
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 totale fattura ( imponibile + iva ) .
*
* @ deprecated 2.4 . 5
*/
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'get_totale_fattura' )) {
function get_totale_fattura ( $iddocumento )
{
$fattura = Fattura :: find ( $iddocumento );
2019-01-01 11:39:20 +01:00
2023-12-06 16:48:54 +01:00
return $fattura -> 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 fattura ( totale - ritenute - bolli ) .
*
* @ deprecated 2.4 . 5
*/
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'get_netto_fattura' )) {
function get_netto_fattura ( $iddocumento )
{
$fattura = Fattura :: find ( $iddocumento );
2019-01-01 11:39:20 +01:00
2023-12-06 16:48:54 +01:00
return $fattura -> 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 fattura .
*
* @ deprecated 2.4 . 5
*/
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'get_ivadetraibile_fattura' )) {
function get_ivadetraibile_fattura ( $iddocumento )
{
$fattura = Fattura :: find ( $iddocumento );
2019-01-01 11:39:20 +01:00
2023-12-06 16:48:54 +01:00
return $fattura -> 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 fattura .
*
* @ deprecated 2.4 . 5
*/
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'get_ivaindetraibile_fattura' )) {
function get_ivaindetraibile_fattura ( $iddocumento )
{
$fattura = Fattura :: find ( $iddocumento );
return $fattura -> iva_indetraibile ;
}
2019-01-01 11:39:20 +01:00
}
2023-12-06 17:24:23 +01:00
/*
2017-08-04 16:28:16 +02:00
* Elimina una scadenza in base al codice documento .
2020-08-05 17:58:54 +02:00
*
* @ deprecated 2.4 . 17
2017-08-04 16:28:16 +02:00
*/
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'elimina_scadenze' )) {
function elimina_scadenze ( $iddocumento )
{
$fattura = Fattura :: find ( $iddocumento );
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
$fattura -> rimuoviScadenze ();
}
2017-08-04 16:28:16 +02:00
}
2023-12-06 17:24:23 +01:00
/*
2018-05-18 19:04:39 +02:00
* Funzione per ricalcolare lo scadenzario di una determinata fattura
* $iddocumento string E ' l' id del documento di cui ricalcolare lo scadenzario
2017-08-04 16:28:16 +02:00
* $pagamento string Nome del tipo di pagamento . Se è vuoto lo leggo da co_pagamenti_documenti , perché significa che devo solo aggiornare gli importi .
2018-09-03 16:49:43 +02:00
* $pagato boolean Indica se devo segnare l ' importo come pagato .
2020-08-05 17:58:54 +02:00
*
* @ deprecated 2.4 . 17
2017-08-04 16:28:16 +02:00
*/
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'aggiungi_scadenza' )) {
function aggiungi_scadenza ( $iddocumento , $pagamento = '' , $pagato = false )
{
$fattura = Fattura :: find ( $iddocumento );
2019-02-12 11:42:48 +01:00
2023-12-06 16:48:54 +01:00
$fattura -> registraScadenze ( $pagato );
}
2017-08-04 16:28:16 +02:00
}
2023-12-06 17:24:23 +01:00
/*
2017-08-04 16:28:16 +02:00
* Elimina i movimenti collegati ad una fattura .
2019-11-26 16:36:50 +01:00
* Se il flag $prima_nota è impostato a 1 elimina solo i movimenti di Prima Nota , altrimenti rimuove quelli automatici .
*
* @ param $iddocumento
* @ param int $prima_nota
2020-08-05 17:58:54 +02:00
*
* @ deprecated 2.4 . 17
2017-08-04 16:28:16 +02:00
*/
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'elimina_movimenti' )) {
function elimina_movimenti ( $id_documento , $prima_nota = 0 )
{
$dbo = database ();
2019-12-11 17:57:01 +01:00
2023-12-06 16:48:54 +01:00
$idmastrino = $dbo -> fetchOne ( 'SELECT idmastrino FROM co_movimenti WHERE iddocumento=' . prepare ( $id_documento ) . ' AND primanota=' . prepare ( $prima_nota ))[ 'idmastrino' ];
$query2 = 'DELETE FROM co_movimenti WHERE idmastrino=' . prepare ( $idmastrino ) . ' AND primanota=' . prepare ( $prima_nota );
$dbo -> query ( $query2 );
}
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 aggiungere la fattura in prima nota
* $iddocumento string E ' l' id del documento da collegare alla prima nota
* $dir string Direzione dell ' importo ( entrata , uscita )
* $primanota boolean Indica se il movimento è un movimento di prima nota o un movimento normale ( di default movimento normale ) .
2020-08-05 17:58:54 +02:00
*
* @ deprecated 2.4 . 17
2017-08-04 16:28:16 +02:00
*/
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'aggiungi_movimento' )) {
function aggiungi_movimento ( $iddocumento , $dir , $primanota = 0 )
{
$dbo = database ();
2017-08-04 16:28:16 +02:00
2024-01-15 15:30:45 +01:00
$fattura = Fattura :: find ( $iddocumento );
2023-12-06 16:48:54 +01:00
$is_nota = $fattura -> isNota ();
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
// Totale marca da bollo, inps, ritenuta, idagente
$query = 'SELECT data, bollo, ritenutaacconto, rivalsainps, split_payment FROM co_documenti WHERE id=' . prepare ( $iddocumento );
$rs = $dbo -> fetchArray ( $query );
$totale_bolli = $is_nota ? - $rs [ 0 ][ 'bollo' ] : $rs [ 0 ][ 'bollo' ];
$totale_ritenutaacconto = $is_nota ? - $rs [ 0 ][ 'ritenutaacconto' ] : $rs [ 0 ][ 'ritenutaacconto' ];
$totale_ritenutacontributi = $is_nota ? - $fattura -> totale_ritenuta_contributi : $fattura -> totale_ritenuta_contributi ;
$totale_rivalsainps = $is_nota ? - $rs [ 0 ][ 'rivalsainps' ] : $rs [ 0 ][ 'rivalsainps' ];
$data_documento = $rs [ 0 ][ 'data' ];
$split_payment = $rs [ 0 ][ 'split_payment' ];
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
$netto_fattura = get_netto_fattura ( $iddocumento );
$totale_fattura = get_totale_fattura ( $iddocumento );
$totale_fattura = $is_nota ? - $totale_fattura : $totale_fattura ;
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
$imponibile_fattura = get_imponibile_fattura ( $iddocumento );
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
// Calcolo l'iva della rivalsa inps
$iva_rivalsainps = 0 ;
2017-08-04 16:28:16 +02:00
2024-02-06 17:36:05 +01:00
$rsr = $dbo -> fetchArray ( 'SELECT `idiva`, `rivalsainps` FROM `co_righe_documenti` WHERE `iddocumento`=' . prepare ( $iddocumento ));
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
for ( $r = 0 ; $r < sizeof ( $rsr ); ++ $r ) {
2024-02-06 17:36:05 +01:00
$qi = Aliquota :: find ( prepare ( $rsr [ $r ][ 'idiva' ])) -> percentuale ;
2023-12-06 16:48:54 +01:00
$rsi = $dbo -> fetchArray ( $qi );
$iva_rivalsainps += $rsr [ $r ][ 'rivalsainps' ] / 100 * $rsi [ 0 ][ 'percentuale' ];
}
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
// Lettura iva indetraibile fattura
2024-02-06 17:36:05 +01:00
$query = 'SELECT SUM(`iva_indetraibile`) AS iva_indetraibile FROM `co_righe_documenti` GROUP BY `iddocumento` HAVING `iddocumento`=' . prepare ( $iddocumento );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
2023-12-06 16:48:54 +01:00
$iva_indetraibile_fattura = $is_nota ? - $rs [ 0 ][ 'iva_indetraibile' ] : $rs [ 0 ][ 'iva_indetraibile' ];
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
// Lettura iva delle righe in fattura
2024-02-06 17:36:05 +01:00
$query = 'SELECT `iva` FROM `co_righe_documenti` WHERE `iddocumento`=' . prepare ( $iddocumento );
2023-12-06 16:48:54 +01:00
$rs = $dbo -> fetchArray ( $query );
$iva_fattura = sum ( array_column ( $rs , 'iva' ), null ) + $iva_rivalsainps - $iva_indetraibile_fattura ;
$iva_fattura = $is_nota ? - $iva_fattura : $iva_fattura ;
// Imposto i segni + e - in base se la fattura è di acquisto o vendita
if ( $dir == 'uscita' ) {
$segno_mov1_cliente = - 1 ;
$segno_mov2_ricavivendite = 1 ;
$segno_mov3_iva = 1 ;
$segno_mov4_inps = 1 ;
$segno_mov5_ritenutaacconto = - 1 ;
// Lettura conto fornitore
$query = 'SELECT idconto_fornitore FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id=' . prepare ( $iddocumento );
$rs = $dbo -> fetchArray ( $query );
$idconto_controparte = $rs [ 0 ][ 'idconto_fornitore' ];
if ( $idconto_controparte == '' ) {
$idconto_controparte = setting ( 'Conto per Riepilogativo fornitori' );
}
} else {
$segno_mov1_cliente = 1 ;
$segno_mov2_ricavivendite = - 1 ;
$segno_mov3_iva = - 1 ;
$segno_mov4_inps = - 1 ;
$segno_mov5_ritenutaacconto = 1 ;
// Lettura conto cliente
$query = 'SELECT idconto_cliente FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id=' . prepare ( $iddocumento );
$rs = $dbo -> fetchArray ( $query );
$idconto_controparte = $rs [ 0 ][ 'idconto_cliente' ];
if ( $idconto_controparte == '' ) {
$idconto_controparte = setting ( 'Conto per Riepilogativo clienti' );
}
2017-08-04 16:28:16 +02:00
}
2023-12-06 16:48:54 +01:00
// Lettura info fattura
2024-04-18 17:44:05 +02:00
$query = 'SELECT *, `co_documenti`.`data_competenza`, `co_documenti`.`note`, `co_documenti`.`idpagamento`, `co_documenti`.`id` AS iddocumento, `co_statidocumento_lang`.`title` AS `stato`, `co_tipidocumento_lang`.`title` AS descrizione_tipo FROM `co_documenti` INNER JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento`=`co_statidocumento`.`id` INNER JOIN `an_anagrafiche` ON `co_documenti`.`idanagrafica`=`an_anagrafiche`.`idanagrafica` INNER JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento`=`co_tipidocumento`.`id` LEFT JOIN `co_tipidocumento_lang` ON (`co_tipidocumento_lang`.`id_record` = `co_tipidocumento`.`id` AND `co_tipidocumento_lang`.`id_lang` = ' . prepare ( Models\Locale :: getDefault () -> id ) . ') WHERE `co_documenti`.`id`=' . prepare ( $iddocumento );
2024-02-13 15:50:26 +01:00
2023-12-06 16:48:54 +01:00
$rs = $dbo -> fetchArray ( $query );
$data = $rs [ 0 ][ 'data_competenza' ];
$ragione_sociale = $rs [ 0 ][ 'ragione_sociale' ];
$idmastrino = get_new_idmastrino ();
// Prendo il numero doc. esterno se c'è, altrimenti quello normale
if ( ! empty ( $rs [ 0 ][ 'numero_esterno' ])) {
$numero = $rs [ 0 ][ 'numero_esterno' ];
} else {
$numero = $rs [ 0 ][ 'numero' ];
}
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
// Abbreviazioni contabili dei movimenti
$tipodoc = '' ;
if ( $rs [ 0 ][ 'descrizione_tipo' ] == 'Nota di credito' ) {
$tipodoc = 'Nota di credito' ;
} elseif ( $rs [ 0 ][ 'descrizione_tipo' ] == 'Nota di debito' ) {
$tipodoc = 'Nota di debito' ;
} else {
$tipodoc = 'Fattura' ;
}
2019-02-14 01:40:54 +01:00
2023-12-06 16:48:54 +01:00
$descrizione = $tipodoc . ' num. ' . $numero ;
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
/*
Il mastrino si apre con almeno 3 righe di solito ( esempio fattura di vendita ) :
1 ) dare imponibile + iva al conto cliente
2 ) avere imponibile sul conto dei ricavi
3 ) avere iva sul conto dell ' iva a credito ( ed eventuale iva indetraibile sul rispettivo conto )
2018-10-23 15:19:04 +02:00
2023-12-06 16:48:54 +01:00
aggiuntivo :
4 ) eventuale rivalsa inps
5 ) eventuale ritenuta d ' acconto
*/
// 1) Aggiungo la riga del conto cliente
$importo_cliente = $totale_fattura ;
2018-12-29 11:15:34 +01:00
2023-12-06 16:48:54 +01:00
if ( $split_payment ) {
$importo_cliente = sum ( $importo_cliente , - $iva_fattura , 2 );
}
2018-12-29 11:15:34 +01:00
2024-05-23 11:36:25 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime (( string ) $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_controparte ) . ', ' . prepare (( $importo_cliente + $totale_bolli ) * $segno_mov1_cliente ) . ', ' . prepare ( $primanota ) . ' )' ;
2023-12-06 16:48:54 +01:00
$dbo -> query ( $query2 );
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
// 2) Aggiungo il totale sul conto dei ricavi/spese scelto
// Lettura descrizione conto ricavi/spese per ogni riga del documento
$righe = $dbo -> fetchArray ( 'SELECT idconto, SUM(subtotale - sconto) AS imponibile FROM co_righe_documenti WHERE iddocumento=' . prepare ( $iddocumento ) . ' GROUP BY idconto' );
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
foreach ( $righe as $riga ) {
// Retrocompatibilità
2024-01-15 15:34:29 +01:00
$idconto_riga = $riga [ 'idconto' ];
2023-12-06 16:48:54 +01:00
$riga [ 'imponibile' ] = $is_nota ? - $riga [ 'imponibile' ] : $riga [ 'imponibile' ];
2017-08-04 16:28:16 +02:00
2024-05-23 11:36:25 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime (( string ) $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_riga ) . ', ' . prepare ( $riga [ 'imponibile' ] * $segno_mov2_ricavivendite ) . ', ' . prepare ( $primanota ) . ')' ;
2023-12-06 16:48:54 +01:00
$dbo -> query ( $query2 );
}
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
// 3) Aggiungo il totale sul conto dell'iva
// Lettura id conto iva
if ( $iva_fattura != 0 && ! $split_payment ) {
$descrizione_conto_iva = ( $dir == 'entrata' ) ? 'Iva su vendite' : 'Iva su acquisti' ;
$idconto_iva = setting ( 'Conto per ' . $descrizione_conto_iva );
2017-08-04 16:28:16 +02:00
2024-05-23 11:36:25 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime (( string ) $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_iva ) . ', ' . prepare ( $iva_fattura * $segno_mov3_iva ) . ', ' . prepare ( $primanota ) . ')' ;
2023-12-06 16:48:54 +01:00
$dbo -> query ( $query2 );
}
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
// Lettura id conto iva indetraibile
if ( $iva_indetraibile_fattura != 0 && ! $split_payment ) {
$idconto_iva2 = setting ( 'Conto per Iva indetraibile' );
2017-08-04 16:28:16 +02:00
2024-05-23 11:36:25 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime (( string ) $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_iva2 ) . ', ' . prepare ( $iva_indetraibile_fattura * $segno_mov3_iva ) . ', ' . prepare ( $primanota ) . ')' ;
2023-12-06 16:48:54 +01:00
$dbo -> query ( $query2 );
}
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
// 4) Aggiungo la rivalsa INPS se c'è
// Lettura id conto inps
if ( $totale_rivalsainps != 0 ) {
$idconto_inps = setting ( 'Conto per Erario c/INPS' );
2017-08-04 16:28:16 +02:00
2024-05-23 11:36:25 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime (( string ) $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_inps ) . ', ' . prepare ( $totale_rivalsainps * $segno_mov4_inps ) . ', ' . prepare ( $primanota ) . ')' ;
2023-12-06 16:48:54 +01:00
$dbo -> query ( $query2 );
}
2018-10-23 15:19:04 +02:00
2023-12-06 16:48:54 +01:00
// 5) Aggiungo la ritenuta d'acconto se c'è
// Lettura id conto ritenuta e la storno subito
if ( $totale_ritenutaacconto != 0 ) {
$idconto_ritenutaacconto = setting ( " Conto per Erario c/ritenute d'acconto " );
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
// DARE nel conto ritenuta
2024-05-23 11:36:25 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime (( string ) $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_ritenutaacconto ) . ', ' . prepare ( $totale_ritenutaacconto * $segno_mov5_ritenutaacconto ) . ', ' . prepare ( $primanota ) . ')' ;
2023-12-06 16:48:54 +01:00
$dbo -> query ( $query2 );
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
// AVERE nel riepilogativo clienti
2024-05-23 11:36:25 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime (( string ) $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_controparte ) . ', ' . prepare (( $totale_ritenutaacconto * $segno_mov5_ritenutaacconto ) * - 1 ) . ', ' . prepare ( $primanota ) . ')' ;
2023-12-06 16:48:54 +01:00
$dbo -> query ( $query2 );
}
2019-10-01 19:06:01 +02:00
2023-12-06 16:48:54 +01:00
// 6) Aggiungo la ritenuta enasarco se c'è
// Lettura id conto ritenuta e la storno subito
if ( $totale_ritenutacontributi != 0 ) {
$idconto_ritenutaenasarco = setting ( 'Conto per Erario c/enasarco' );
2019-10-01 19:06:01 +02:00
2023-12-06 16:48:54 +01:00
// DARE nel conto ritenuta
2024-05-23 11:36:25 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime (( string ) $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_ritenutaenasarco ) . ', ' . prepare ( $totale_ritenutacontributi * $segno_mov5_ritenutaacconto ) . ', ' . prepare ( $primanota ) . ')' ;
2023-12-06 16:48:54 +01:00
$dbo -> query ( $query2 );
2019-10-01 19:06:01 +02:00
2023-12-06 16:48:54 +01:00
// AVERE nel riepilogativo clienti
2024-05-23 11:36:25 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, id_anagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime (( string ) $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_controparte ) . ', ' . prepare (( $totale_ritenutacontributi * $segno_mov5_ritenutaacconto ) * - 1 ) . ', ' . prepare ( $primanota ) . ')' ;
2023-12-06 16:48:54 +01:00
$dbo -> query ( $query2 );
}
2019-10-01 19:06:01 +02:00
}
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 generare un nuovo codice per il mastrino .
2020-08-05 17:58:54 +02:00
*
* @ deprecated 2.4 . 17
2017-08-04 16:28:16 +02:00
*/
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'get_new_idmastrino' )) {
function get_new_idmastrino ( $table = 'co_movimenti' )
{
$dbo = database ();
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
$query = 'SELECT MAX(idmastrino) AS maxidmastrino FROM ' . $table ;
$rs = $dbo -> fetchArray ( $query );
2017-08-04 16:28:16 +02:00
2023-12-06 16:48:54 +01:00
return intval ( $rs [ 0 ][ 'maxidmastrino' ]) + 1 ;
}
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 fattura ( rivalsa inps , ritenuta d ' acconto , marca da bollo )
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
2019-04-19 20:52:02 +02:00
* $iddocumento int ID della fattura .
2020-08-05 17:58:54 +02:00
*
* @ deprecated 2.4 . 17
2017-08-04 16:28:16 +02:00
*/
2023-12-06 17:24:23 +01:00
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'ricalcola_costiagg_fattura' )) {
function ricalcola_costiagg_fattura ( $iddocumento )
{
global $dir ;
$fattura = Fattura :: find ( $iddocumento );
$fattura -> save ();
}
2017-08-04 16:28:16 +02:00
}
2023-12-06 17:24:23 +01:00
/*
2020-03-02 16:13:07 +01:00
* Verifica che il numero_esterno della fattura indicata sia correttamente impostato , a partire dai valori delle fatture ai giorni precedenti .
* Restituisce il numero_esterno mancante in caso di numero errato .
*
* @ return bool | string
*/
2023-12-06 16:48:54 +01:00
if ( ! function_exists ( 'verifica_numero_fattura' )) {
function verifica_numero_fattura ( Fattura $fattura )
{
if ( empty ( $fattura -> numero_esterno )) {
return null ;
}
2020-03-02 16:13:07 +01:00
2023-12-06 16:48:54 +01:00
$id_segment = $fattura -> id_segment ;
$data = $fattura -> data ;
2020-03-02 16:13:07 +01:00
2023-12-06 16:48:54 +01:00
$documenti = Fattura :: where ( 'id_segment' , '=' , $id_segment )
-> where ( 'data' , '=' , $data )
-> get ();
2020-03-02 16:13:07 +01:00
2023-12-06 16:48:54 +01:00
// Recupero maschera per questo segmento
$maschera = Generator :: getMaschera ( $id_segment );
2020-03-02 16:13:07 +01:00
2023-12-06 16:48:54 +01:00
$ultimo = Generator :: getPreviousFrom ( $maschera , 'co_documenti' , 'numero_esterno' , [
'data < ' . prepare ( date ( 'Y-m-d' , strtotime ( $data ))),
'YEAR(data) = ' . prepare ( date ( 'Y' , strtotime ( $data ))),
'id_segment = ' . prepare ( $id_segment ),
], $data );
2021-02-18 18:48:44 +01:00
2023-12-06 16:48:54 +01:00
do {
$numero = Generator :: generate ( $maschera , $ultimo , 1 , Generator :: dateToPattern ( $data ));
2020-03-02 16:13:07 +01:00
2024-04-09 12:18:08 +02:00
$filtered = $documenti -> reject ( fn ( $item , $key ) => $item -> numero_esterno == $numero );
2020-03-02 16:13:07 +01:00
2023-12-06 16:48:54 +01:00
if ( $documenti -> count () == $filtered -> count ()) {
return $numero ;
}
2020-03-02 16:13:07 +01:00
2023-12-06 16:48:54 +01:00
$documenti = $filtered ;
$ultimo = $numero ;
} while ( $numero != $fattura -> numero_esterno );
2020-03-02 16:13:07 +01:00
2023-12-06 16:48:54 +01:00
return null ;
}
2024-03-18 16:04:01 +01:00
function get_righe_composte ( Fattura $documento )
{
global $dbo ;
2024-03-22 15:52:24 +01:00
2024-03-18 16:04:01 +01:00
$righe = [];
// Righe documento
2024-04-09 12:18:08 +02:00
$righe_documento = $documento -> getRighe () -> where ( 'idintervento' , '!=' , null ) -> groupBy ( fn ( $item , $key ) => $item [ 'prezzo_unitario' ] . '|' . $item [ 'idiva' ] . '|' . $item [ 'sconto_unitario' ]);
2024-03-18 16:04:01 +01:00
2024-03-22 15:52:24 +01:00
if ( setting ( 'Raggruppa attività per tipologia in fattura' ) && ! $righe_documento -> isEmpty ()) {
2024-03-18 16:04:01 +01:00
$articoli = [];
foreach ( $righe_documento as $gruppo ) {
$riga_base = [];
2024-03-22 15:52:24 +01:00
foreach ( $gruppo as $riga ) {
2024-03-18 16:04:01 +01:00
$intervento = Intervento :: find ( $riga -> idintervento );
2024-03-22 15:52:24 +01:00
if ( ! empty ( $intervento )) {
if ( $riga [ 'is_descrizione' ] == 1 ) {
if ( empty ( $riga_base [ $intervento -> idtipointervento ][ 'descrizione' ])) {
2024-03-18 16:04:01 +01:00
$riga_base [ $intervento -> idtipointervento ][ 'descrizione' ] = $riga ;
2024-03-22 15:52:24 +01:00
} else {
2024-03-18 16:04:01 +01:00
$riga_base [ $intervento -> idtipointervento ][ 'descrizione' ][ 'descrizione' ] .= " \n " . $riga -> descrizione ;
$riga_base [ $intervento -> idtipointervento ][ 'descrizione' ][ 'qta' ] += $riga -> qta ;
}
}
2024-03-22 15:52:24 +01:00
if ( $riga [ 'is_descrizione' ] == 0 ) {
if ( empty ( $riga_base [ $intervento -> idtipointervento ][ 'riga' ]) && empty ( $riga -> idarticolo )) {
2024-03-18 16:04:01 +01:00
$riga_base [ $intervento -> idtipointervento ][ 'riga' ] = $riga ;
2024-03-22 15:52:24 +01:00
} elseif ( empty ( $riga -> idarticolo )) {
2024-03-18 16:04:01 +01:00
$riga_base [ $intervento -> idtipointervento ][ 'riga' ][ 'descrizione' ] .= " \n " . $riga -> descrizione ;
$riga_base [ $intervento -> idtipointervento ][ 'riga' ][ 'qta' ] += $riga -> qta ;
2024-03-22 15:52:24 +01:00
} else {
2024-03-18 16:04:01 +01:00
$riga_base [ $intervento -> idtipointervento ][ 'articoli' ][] = $riga ;
}
}
2024-03-22 15:52:24 +01:00
} else {
2024-03-18 16:04:01 +01:00
$articoli [] = $riga ;
}
}
2024-03-22 15:52:24 +01:00
foreach ( $riga_base as $riga ) {
if ( ! empty ( $riga [ 'descrizione' ])) {
2024-03-18 16:04:01 +01:00
$righe [] = $riga [ 'descrizione' ];
}
2024-03-22 15:52:24 +01:00
if ( ! empty ( $riga [ 'riga' ])) {
2024-03-18 16:04:01 +01:00
$righe [] = $riga [ 'riga' ];
}
2024-03-22 15:52:24 +01:00
if ( ! empty ( $riga [ 'articoli' ])) {
foreach ( $riga [ 'articoli' ] as $articolo ) {
2024-03-18 16:04:01 +01:00
$righe [] = $articolo ;
}
}
}
2024-03-22 15:52:24 +01:00
if ( ! empty ( $articoli )) {
$righe = array_merge ( $righe , $articoli );
2024-03-18 16:04:01 +01:00
}
}
2024-03-22 15:52:24 +01:00
// Estraggo le righe non collegate a interventi
$righe_esterne = $documento -> getRighe () -> where ( 'idintervento' , '=' , null );
foreach ( $righe_esterne as $riga ) {
2024-03-18 16:04:01 +01:00
$righe [] = $riga ;
}
2024-03-22 15:52:24 +01:00
} else {
2024-03-18 16:04:01 +01:00
$righe = $documento -> getRighe ();
}
2024-03-22 15:52:24 +01:00
for ( $index = 0 ; $index < count ( $righe ); ++ $index ) {
if ( empty ( $righe [ $index ])) {
2024-03-18 16:04:01 +01:00
unset ( $righe [ $index ]);
}
}
$righe = collect ( $righe );
2024-03-22 15:52:24 +01:00
return $righe ;
2024-03-18 16:04:01 +01:00
}
2023-12-06 17:24:23 +01:00
}