2017-08-04 16:28:16 +02:00
< ? php
2018-08-31 17:41:24 +02:00
use Modules\Fatture\Fattura ;
2020-03-02 16:13:07 +01:00
use Util\Generator ;
2018-08-31 17:41:24 +02: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
*/
function get_new_numerofattura ( $data )
{
global $dir ;
2018-03-21 22:30:15 +01:00
global $id_segment ;
2018-12-14 09:18:46 +01:00
return Fattura :: getNextNumero ( $data , $dir , $id_segment );
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
*/
function get_new_numerosecondariofattura ( $data )
{
global $dir ;
2018-03-21 16:57:31 +01:00
global $id_segment ;
2017-08-04 16:28:16 +02:00
2018-12-14 09:18:46 +01:00
return Fattura :: getNextNumeroSecondario ( $data , $dir , $id_segment );
2017-08-04 16:28:16 +02:00
}
2019-01-01 11:39:20 +01:00
/**
* Calcolo imponibile fattura ( totale_righe - sconto ) .
*
* @ deprecated 2.4 . 5
*/
function get_imponibile_fattura ( $iddocumento )
{
$fattura = Fattura :: find ( $iddocumento );
return $fattura -> imponibile ;
}
/**
* Calcolo totale fattura ( imponibile + iva ) .
*
* @ deprecated 2.4 . 5
*/
function get_totale_fattura ( $iddocumento )
{
$fattura = Fattura :: find ( $iddocumento );
return $fattura -> totale ;
}
/**
* Calcolo netto a pagare fattura ( totale - ritenute - bolli ) .
*
* @ deprecated 2.4 . 5
*/
function get_netto_fattura ( $iddocumento )
{
$fattura = Fattura :: find ( $iddocumento );
return $fattura -> netto ;
}
/**
* Calcolo iva detraibile fattura .
*
* @ deprecated 2.4 . 5
*/
function get_ivadetraibile_fattura ( $iddocumento )
{
$fattura = Fattura :: find ( $iddocumento );
return $fattura -> iva_detraibile ;
}
/**
* Calcolo iva indetraibile fattura .
*
* @ deprecated 2.4 . 5
*/
function get_ivaindetraibile_fattura ( $iddocumento )
{
$fattura = Fattura :: find ( $iddocumento );
return $fattura -> iva_indetraibile ;
}
2017-08-04 16:28:16 +02:00
/**
* Elimina una scadenza in base al codice documento .
*/
2019-07-25 17:20:24 +02:00
function elimina_scadenze ( $iddocumento )
2017-08-04 16:28:16 +02:00
{
2019-03-08 16:59:55 +01:00
$fattura = Fattura :: find ( $iddocumento );
2017-08-04 16:28:16 +02:00
2019-03-08 16:59:55 +01:00
$fattura -> rimuoviScadenze ();
2017-08-04 16:28:16 +02: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 .
2017-08-04 16:28:16 +02:00
*/
2019-03-08 16:59:55 +01:00
function aggiungi_scadenza ( $iddocumento , $pagamento = '' , $pagato = false )
2017-08-04 16:28:16 +02:00
{
2019-02-12 11:42:48 +01:00
$fattura = Fattura :: find ( $iddocumento );
2019-03-08 16:59:55 +01:00
$fattura -> registraScadenze ( $pagato );
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
2017-08-04 16:28:16 +02:00
*/
2019-11-26 16:36:50 +01:00
function elimina_movimenti ( $id_documento , $prima_nota = 0 )
2017-08-04 16:28:16 +02:00
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2017-08-04 16:28:16 +02:00
2019-12-11 17:57:01 +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 );
2017-08-04 16:28:16 +02:00
$dbo -> query ( $query2 );
}
/**
* 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 ) .
*/
function aggiungi_movimento ( $iddocumento , $dir , $primanota = 0 )
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2017-08-04 16:28:16 +02:00
2019-10-01 19:06:01 +02:00
$fattura = Modules\Fatture\Fattura :: find ( $iddocumento );
2017-08-04 16:28:16 +02:00
// Totale marca da bollo, inps, ritenuta, idagente
2018-12-28 18:03:38 +01:00
$query = 'SELECT data, bollo, ritenutaacconto, rivalsainps, split_payment FROM co_documenti WHERE id=' . prepare ( $iddocumento );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
$totale_bolli = $rs [ 0 ][ 'bollo' ];
$totale_ritenutaacconto = $rs [ 0 ][ 'ritenutaacconto' ];
2019-10-01 19:06:01 +02:00
$totale_ritenutacontributi = $fattura -> totale_ritenuta_contributi ;
2017-08-04 16:28:16 +02:00
$totale_rivalsainps = $rs [ 0 ][ 'rivalsainps' ];
$data_documento = $rs [ 0 ][ 'data' ];
2018-12-29 11:15:34 +01:00
$split_payment = $rs [ 0 ][ 'split_payment' ];
2017-08-04 16:28:16 +02:00
$netto_fattura = get_netto_fattura ( $iddocumento );
$totale_fattura = get_totale_fattura ( $iddocumento );
$imponibile_fattura = get_imponibile_fattura ( $iddocumento );
2018-05-11 18:15:36 +02:00
// Calcolo l'iva della rivalsa inps
$iva_rivalsainps = 0 ;
2018-06-22 17:04:37 +02:00
$rsr = $dbo -> fetchArray ( 'SELECT idiva, rivalsainps FROM co_righe_documenti WHERE iddocumento=' . prepare ( $iddocumento ));
for ( $r = 0 ; $r < sizeof ( $rsr ); ++ $r ) {
$qi = 'SELECT percentuale FROM co_iva WHERE id=' . prepare ( $rsr [ $r ][ 'idiva' ]);
2018-05-11 18:15:36 +02:00
$rsi = $dbo -> fetchArray ( $qi );
$iva_rivalsainps += $rsr [ $r ][ 'rivalsainps' ] / 100 * $rsi [ 0 ][ 'percentuale' ];
}
2017-08-04 16:28:16 +02:00
// Lettura iva indetraibile fattura
$query = 'SELECT SUM(iva_indetraibile) AS iva_indetraibile FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento=' . prepare ( $iddocumento );
$rs = $dbo -> fetchArray ( $query );
$iva_indetraibile_fattura = $rs [ 0 ][ 'iva_indetraibile' ];
// Lettura iva delle righe in fattura
2018-04-16 10:39:11 +02:00
$query = 'SELECT iva FROM co_righe_documenti WHERE iddocumento=' . prepare ( $iddocumento );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
2018-06-14 14:56:15 +02:00
$iva_fattura = sum ( array_column ( $rs , 'iva' ), null ) + $iva_rivalsainps - $iva_indetraibile_fattura ;
2017-08-04 16:28:16 +02:00
// 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 == '' ) {
2019-12-27 10:28:53 +01:00
$idconto_controparte = setting ( 'Conto per Riepilogativo fornitori' );
2017-08-04 16:28:16 +02:00
}
} 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 == '' ) {
2019-12-27 10:28:53 +01:00
$idconto_controparte = setting ( 'Conto per Riepilogativo clienti' );
2017-08-04 16:28:16 +02:00
}
}
// Lettura info fattura
2019-11-29 17:58:52 +01:00
$query = 'SELECT *, co_documenti.data_competenza, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipodoc` FROM ((co_documenti LEFT OUTER 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 WHERE co_documenti.id=' . prepare ( $iddocumento );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
$n = sizeof ( $rs );
2019-11-29 17:58:52 +01:00
$data = $rs [ 0 ][ 'data_competenza' ];
2017-08-04 16:28:16 +02:00
$idanagrafica = $rs [ 0 ][ 'idanagrafica' ];
$ragione_sociale = $rs [ 0 ][ 'ragione_sociale' ];
$stato = $rs [ 0 ][ 'stato' ];
2018-10-23 15:19:04 +02:00
$idmastrino = get_new_idmastrino ();
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02:00
// 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
2019-02-14 01:40:54 +01:00
// Abbreviazioni contabili dei movimenti
$tipodoc = '' ;
if ( $rs [ 0 ][ 'descrizione_tipodoc' ] == 'Nota di credito' ) {
$tipodoc = 'Nota di credito' ;
} elseif ( $rs [ 0 ][ 'descrizione_tipodoc' ] == 'Nota di debito' ) {
$tipodoc = 'Nota di debito' ;
} else {
$tipodoc = 'Fattura' ;
}
$descrizione = $tipodoc . ' num. ' . $numero ;
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02: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 )
aggiuntivo :
4 ) eventuale rivalsa inps
5 ) eventuale ritenuta d ' acconto
*/
// 1) Aggiungo la riga del conto cliente
2018-12-29 11:15:34 +01:00
$importo_cliente = $totale_fattura ;
if ( $split_payment ) {
$importo_cliente = sum ( $importo_cliente , - $iva_fattura , 2 );
}
2020-07-30 20:06:33 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_controparte ) . ', ' . prepare (( $importo_cliente + $totale_bolli ) * $segno_mov1_cliente ) . ', ' . prepare ( $primanota ) . ' )' ;
2018-10-23 15:19:04 +02:00
$dbo -> query ( $query2 );
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02: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
2018-10-23 15:19:04 +02:00
foreach ( $righe as $riga ) {
// Retrocompatibilità
$idconto_riga = ! empty ( $riga [ 'idconto' ]) ? $riga [ 'idconto' ] : $idconto ;
2017-08-04 16:28:16 +02:00
2020-07-30 20:06:33 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_riga ) . ', ' . prepare ( $riga [ 'imponibile' ] * $segno_mov2_ricavivendite ) . ', ' . prepare ( $primanota ) . ')' ;
2018-10-23 15:19:04 +02:00
$dbo -> query ( $query2 );
}
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02:00
// 3) Aggiungo il totale sul conto dell'iva
// Lettura id conto iva
2018-12-28 18:03:38 +01:00
if ( $iva_fattura != 0 && ! $split_payment ) {
2018-10-23 15:19:04 +02:00
$descrizione_conto_iva = ( $dir == 'entrata' ) ? 'Iva su vendite' : 'Iva su acquisti' ;
2019-12-27 10:28:53 +01:00
$idconto_iva = setting ( 'Conto per ' . $descrizione_conto_iva );
2017-08-04 16:28:16 +02:00
2020-07-30 20:06:33 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_iva ) . ', ' . prepare ( $iva_fattura * $segno_mov3_iva ) . ', ' . prepare ( $primanota ) . ')' ;
2018-10-23 15:19:04 +02:00
$dbo -> query ( $query2 );
}
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02:00
// Lettura id conto iva indetraibile
2018-12-28 18:03:38 +01:00
if ( $iva_indetraibile_fattura != 0 && ! $split_payment ) {
2019-12-27 10:28:53 +01:00
$idconto_iva2 = setting ( 'Conto per Iva indetraibile' );
2017-08-04 16:28:16 +02:00
2020-07-30 20:06:33 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_iva2 ) . ', ' . prepare ( $iva_indetraibile_fattura * $segno_mov3_iva ) . ', ' . prepare ( $primanota ) . ')' ;
2018-10-23 15:19:04 +02:00
$dbo -> query ( $query2 );
}
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02:00
// 4) Aggiungo la rivalsa INPS se c'è
// Lettura id conto inps
if ( $totale_rivalsainps != 0 ) {
2019-12-27 10:28:53 +01:00
$idconto_inps = setting ( 'Conto per Erario c/INPS' );
2017-08-04 16:28:16 +02:00
2020-07-30 20:06:33 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_inps ) . ', ' . prepare ( $totale_rivalsainps * $segno_mov4_inps ) . ', ' . prepare ( $primanota ) . ')' ;
2018-10-23 15:19:04 +02:00
$dbo -> query ( $query2 );
}
// 5) Aggiungo la ritenuta d'acconto se c'è
// Lettura id conto ritenuta e la storno subito
if ( $totale_ritenutaacconto != 0 ) {
2019-12-27 10:28:53 +01:00
$idconto_ritenutaacconto = setting ( " Conto per Erario c/ritenute d'acconto " );
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02:00
// DARE nel conto ritenuta
2020-07-30 20:06:33 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_ritenutaacconto ) . ', ' . prepare ( $totale_ritenutaacconto * $segno_mov5_ritenutaacconto ) . ', ' . prepare ( $primanota ) . ')' ;
2018-10-23 15:19:04 +02:00
$dbo -> query ( $query2 );
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02:00
// AVERE nel riepilogativo clienti
2020-07-30 20:06:33 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_controparte ) . ', ' . prepare (( $totale_ritenutaacconto * $segno_mov5_ritenutaacconto ) * - 1 ) . ', ' . prepare ( $primanota ) . ')' ;
2018-10-23 15:19:04 +02:00
$dbo -> query ( $query2 );
}
2019-10-01 19:06:01 +02:00
// 6) Aggiungo la ritenuta enasarco se c'è
// Lettura id conto ritenuta e la storno subito
if ( $totale_ritenutacontributi != 0 ) {
2020-01-03 17:11:15 +01:00
$idconto_ritenutaenasarco = setting ( 'Conto per Erario c/enasarco' );
2019-10-01 19:06:01 +02:00
// DARE nel conto ritenuta
2020-07-30 20:06:33 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_ritenutaenasarco ) . ', ' . prepare ( $totale_ritenutacontributi * $segno_mov5_ritenutaacconto ) . ', ' . prepare ( $primanota ) . ')' ;
2019-10-01 19:06:01 +02:00
$dbo -> query ( $query2 );
// AVERE nel riepilogativo clienti
2020-07-30 20:06:33 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_controparte ) . ', ' . prepare (( $totale_ritenutacontributi * $segno_mov5_ritenutaacconto ) * - 1 ) . ', ' . prepare ( $primanota ) . ')' ;
2019-10-01 19:06:01 +02:00
$dbo -> query ( $query2 );
}
2017-08-04 16:28:16 +02:00
}
/**
* Funzione per generare un nuovo codice per il mastrino .
*/
2018-05-04 19:25:45 +02:00
function get_new_idmastrino ( $table = 'co_movimenti' )
2017-08-04 16:28:16 +02:00
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2017-08-04 16:28:16 +02:00
2018-05-04 17:57:46 +02:00
$query = 'SELECT MAX(idmastrino) AS maxidmastrino FROM ' . $table ;
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
return intval ( $rs [ 0 ][ 'maxidmastrino' ]) + 1 ;
}
/**
* 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 .
2017-08-04 16:28:16 +02:00
*/
2019-04-19 20:47:55 +02:00
function ricalcola_costiagg_fattura ( $iddocumento )
2017-08-04 16:28:16 +02:00
{
global $dir ;
2019-04-19 20:47:55 +02:00
$fattura = Fattura :: find ( $iddocumento );
$fattura -> save ();
2017-08-04 16:28:16 +02:00
}
/**
* Questa funzione aggiunge un articolo in fattura . E ' comoda quando si devono inserire
* degli interventi con articoli collegati o preventivi che hanno interventi con articoli collegati !
* $iddocumento integer id della fattura
* $idarticolo integer id dell ' articolo da inserire in fattura
* $idiva integer id del codice iva associato all ' articolo
* $qta float quantità dell ' articolo in fattura
* $prezzo float prezzo totale dell ' articolo ( prezzounitario * qtà )
* $idintervento integer id dell 'intervento da cui arriva l' articolo ( per non creare casini quando si rimuoverà un articolo dalla fattura ) .
2019-10-01 18:01:00 +02:00
*
2019-10-01 18:32:06 +02:00
* @ deprecated 2.4 . 11
2017-08-04 16:28:16 +02:00
*/
2018-12-29 11:15:34 +01:00
function add_articolo_infattura ( $iddocumento , $idarticolo , $descrizione , $idiva , $qta , $prezzo , $sconto = 0 , $sconto_unitario = 0 , $tipo_sconto = 'UNT' , $idintervento = 0 , $idconto = 0 , $idum = 0 , $idrivalsainps = '' , $idritenutaacconto = '' , $calcolo_ritenuta_acconto = '' )
2017-08-04 16:28:16 +02:00
{
global $dir ;
global $idddt ;
2018-06-25 11:44:06 +02:00
global $idordine ;
2018-10-30 10:27:44 +01:00
global $idcontratto ;
2018-06-22 17:04:37 +02:00
2018-09-20 12:05:22 +02:00
$dbo = database ();
2018-06-22 17:04:37 +02:00
if ( empty ( $idddt )) {
2017-08-04 16:28:16 +02:00
$idddt = 0 ;
}
2018-06-26 14:30:26 +02:00
2018-06-25 11:44:06 +02:00
if ( empty ( $idordine )) {
$idordine = 0 ;
}
2018-11-30 16:10:15 +01:00
2018-10-30 10:27:44 +01:00
if ( empty ( $idcontratto )) {
$idcontratto = 0 ;
}
2017-08-04 16:28:16 +02:00
// Lettura unità di misura dell'articolo
if ( empty ( $idum )) {
$query = 'SELECT um FROM mg_articoli WHERE id=' . prepare ( $idarticolo );
$rs = $dbo -> fetchArray ( $query );
$um = $rs [ 0 ][ 'valore' ];
} else {
$um = $idum ;
}
// Lettura iva dell'articolo
$rs2 = $dbo -> fetchArray ( 'SELECT * FROM co_iva WHERE id=' . prepare ( $idiva ));
$iva = ( $prezzo - $sconto ) / 100 * $rs2 [ 0 ][ 'percentuale' ];
$desc_iva = $rs2 [ 0 ][ 'descrizione' ];
2018-08-11 15:49:46 +02:00
if ( ! empty ( $idrivalsainps )) {
// Calcolo rivalsa inps
2019-01-22 15:52:22 +01:00
$rs = $dbo -> fetchArray ( 'SELECT * FROM co_rivalse WHERE id=' . prepare ( $idrivalsainps ));
2018-08-11 15:49:46 +02:00
$rivalsainps = ( $prezzo - $sconto ) / 100 * $rs [ 0 ][ 'percentuale' ];
}
if ( ! empty ( $idritenutaacconto )) {
// Calcolo ritenuta d'acconto
$query = 'SELECT * FROM co_ritenutaacconto WHERE id=' . prepare ( $idritenutaacconto );
$rs = $dbo -> fetchArray ( $query );
2018-12-29 11:15:34 +01:00
if ( $calcolo_ritenuta_acconto == 'IMP' ) {
2018-08-11 15:49:46 +02:00
$ritenutaacconto = ( $prezzo - $sconto ) / 100 * $rs [ 0 ][ 'percentuale' ];
2018-12-29 11:15:34 +01:00
} elseif ( $calcolo_ritenuta_acconto == 'IMP+RIV' ) {
2018-08-11 15:49:46 +02:00
$ritenutaacconto = ( $prezzo - $sconto + $rivalsainps ) / 100 * $rs [ 0 ][ 'percentuale' ];
}
}
2017-08-04 16:28:16 +02:00
2018-07-03 17:28:02 +02:00
if ( $qta != 0 ) {
2018-07-09 17:21:25 +02:00
$rsart = $dbo -> fetchArray ( 'SELECT abilita_serial, idconto_vendita, idconto_acquisto FROM mg_articoli WHERE id=' . prepare ( $idarticolo ));
$default_idconto = ( $dir == 'entrata' ) ? setting ( 'Conto predefinito fatture di vendita' ) : setting ( 'Conto predefinito fatture di acquisto' );
if ( $idconto == $default_idconto ) {
$idconto = $rsart [ 0 ][ 'idconto_' . ( $dir == 'entrata' ? 'vendita' : 'acquisto' )];
}
$idconto = empty ( $idconto ) ? $default_idconto : $idconto ;
2017-08-04 16:28:16 +02:00
2018-12-29 11:15:34 +01:00
$dbo -> query ( 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, idintervento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, idconto, um, `order`, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, calcolo_ritenuta_acconto) VALUES (' . prepare ( $iddocumento ) . ', ' . prepare ( $idarticolo ) . ', ' . ( ! empty ( $idintervento ) ? prepare ( $idintervento ) : 'NULL' ) . ', ' . prepare ( $idiva ) . ', ' . prepare ( $desc_iva ) . ', ' . prepare ( $iva ) . ', ' . prepare ( $iva_indetraibile ) . ', ' . prepare ( $descrizione ) . ', ' . prepare ( $prezzo ) . ', ' . prepare ( $sconto ) . ', ' . prepare ( $sconto_unitario ) . ', ' . prepare ( $tipo_sconto ) . ', ' . prepare ( $qta ) . ', ' . prepare ( $rsart [ 0 ][ 'abilita_serial' ]) . ', ' . prepare ( $idconto ) . ', ' . prepare ( $um ) . ', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento=' . prepare ( $iddocumento ) . '), ' . prepare ( $idritenutaacconto ) . ', ' . prepare ( $ritenutaacconto ) . ', ' . prepare ( $idrivalsainps ) . ', ' . prepare ( $rivalsainps ) . ', ' . prepare ( $calcolo_ritenuta_acconto ) . ')' );
2017-08-04 16:28:16 +02:00
$idriga = $dbo -> lastInsertedID ();
/*
Fatture di vendita
*/
if ( $dir == 'entrata' ) {
// Se il documento non è generato da un ddt o intervento allora movimento il magazzino
if ( empty ( $idddt ) && empty ( $idintervento )) {
add_movimento_magazzino ( $idarticolo , - $qta , [ 'iddocumento' => $iddocumento ]);
}
}
/*
Fatture di acquisto
*/
elseif ( $dir == 'uscita' ) {
// Se il documento non è generato da un ddt allora movimento il magazzino
if ( empty ( $idddt )) {
add_movimento_magazzino ( $idarticolo , $qta , [ 'iddocumento' => $iddocumento ]);
}
}
// Inserisco il riferimento del ddt alla riga
$dbo -> query ( 'UPDATE co_righe_documenti SET idddt=' . prepare ( $idddt ) . ' WHERE id=' . prepare ( $idriga ));
2018-06-26 14:30:26 +02:00
2018-06-25 11:44:06 +02:00
// Inserisco il riferimento dell'ordine alla riga
$dbo -> query ( 'UPDATE co_righe_documenti SET idordine=' . prepare ( $idordine ) . ' WHERE id=' . prepare ( $idriga ));
2018-11-30 16:10:15 +01:00
2018-10-30 10:27:44 +01:00
// Inserisco il riferimento del contratto alla riga
$dbo -> query ( 'UPDATE co_righe_documenti SET idcontratto=' . prepare ( $idcontratto ) . ' WHERE id=' . prepare ( $idriga ));
2017-08-04 16:28:16 +02:00
}
return $idriga ;
}
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
*/
function verifica_numero ( Fattura $fattura )
{
if ( empty ( $fattura -> numero_esterno )) {
return null ;
}
$id_segment = $fattura -> id_segment ;
$data = $fattura -> data ;
$documenti = Fattura :: where ( 'id_segment' , $id_segment )
-> where ( 'data' , $data )
-> get ();
// Recupero maschera per questo segmento
$maschera = Generator :: getMaschera ( $id_segment );
$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 ),
]);
do {
$numero = Generator :: generate ( $maschera , $ultimo , 1 , Generator :: dateToPattern ( $data ));
$filtered = $documenti -> reject ( function ( $item , $key ) use ( $numero ) {
return $item -> numero_esterno == $numero ;
});
if ( $documenti -> count () == $filtered -> count ()) {
return $numero ;
}
$documenti = $filtered ;
$ultimo = $numero ;
} while ( $numero != $fattura -> numero_esterno );
return null ;
}