2017-08-04 16:28:16 +02:00
< ? php
2018-08-31 17:41:24 +02:00
use Modules\Fatture\Fattura ;
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
}
/**
2019-03-08 16:59:55 +01:00
* Funzione per aggiornare lo stato dei pagamenti nello scadenziario .
*
* @ param $iddocumento int ID della fattura
* @ param $totale_pagato float Totale importo pagato
* @ param $data_pagamento datetime Data in cui avviene il pagamento ( yyyy - mm - dd )
2017-08-04 16:28:16 +02:00
*/
2019-07-05 09:53:53 +02:00
function aggiorna_scadenziario ( $iddocumento , $totale_pagato , $data_pagamento , $idscadenza = '' )
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-04-12 01:11:32 +02:00
if ( $totale_pagato > 0 ) {
2019-04-11 16:04:08 +02:00
// Lettura righe scadenziario
2019-07-05 09:53:53 +02:00
if ( $idscadenza != '' ) {
2019-07-04 09:20:02 +02:00
$add_query = 'AND id=' . prepare ( $idscadenza );
}
2019-07-05 09:53:53 +02:00
$query = " SELECT * FROM co_scadenziario WHERE iddocumento=' $iddocumento ' AND ABS(pagato) < ABS(da_pagare) " . $add_query . ' ORDER BY scadenza ASC' ;
2019-04-11 16:04:08 +02:00
$rs = $dbo -> fetchArray ( $query );
$rimanente_da_pagare = abs ( $rs [ 0 ][ 'pagato' ]) + $totale_pagato ;
// Verifico se la fattura è di acquisto o di vendita per scegliere che segno mettere nel totale
$query2 = 'SELECT dir FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id=' . prepare ( $iddocumento );
$rs2 = $dbo -> fetchArray ( $query2 );
$dir = $rs2 [ 0 ][ 'dir' ];
// Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato.
// Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive
for ( $i = 0 ; $i < sizeof ( $rs ); ++ $i ) {
if ( $rimanente_da_pagare > 0 ) {
// ...riempio il pagato della rata con il totale della rata stessa se ho ricevuto un pagamento superiore alla rata stessa
if ( abs ( $rimanente_da_pagare ) >= abs ( $rs [ $i ][ 'da_pagare' ])) {
2017-08-04 16:28:16 +02:00
$pagato = abs ( $rs [ $i ][ 'da_pagare' ]);
$rimanente_da_pagare -= abs ( $rs [ $i ][ 'da_pagare' ]);
2019-04-11 16:04:08 +02:00
} else {
// Se si inserisce una somma maggiore al dovuto, tengo valido il rimanente per saldare il tutto...
if ( abs ( $rimanente_da_pagare ) > abs ( $rs [ $i ][ 'da_pagare' ])) {
$pagato = abs ( $rs [ $i ][ 'da_pagare' ]);
$rimanente_da_pagare -= abs ( $rs [ $i ][ 'da_pagare' ]);
}
// ...altrimenti aggiungo l'importo pagato
else {
$pagato = abs ( $rimanente_da_pagare );
$rimanente_da_pagare -= abs ( $rimanente_da_pagare );
}
2017-08-04 16:28:16 +02:00
}
2019-04-11 16:04:08 +02:00
if ( $dir == 'uscita' ) {
$rimanente_da_pagare = - $rimanente_da_pagare ;
2017-08-04 16:28:16 +02:00
}
2019-04-11 16:04:08 +02:00
if ( $pagato > 0 ) {
if ( $dir == 'uscita' ) {
$dbo -> query ( 'UPDATE co_scadenziario SET pagato=' . prepare ( - $pagato ) . ', data_pagamento=' . prepare ( $data_pagamento ) . ' WHERE id=' . prepare ( $rs [ $i ][ 'id' ]));
} else {
$dbo -> query ( 'UPDATE co_scadenziario SET pagato=' . prepare ( $pagato ) . ', data_pagamento=' . prepare ( $data_pagamento ) . ' WHERE id=' . prepare ( $rs [ $i ][ 'id' ]));
}
}
2017-08-04 16:28:16 +02:00
}
2019-04-11 16:04:08 +02:00
}
2019-04-12 01:11:32 +02:00
} else {
2019-04-11 16:04:08 +02:00
// Lettura righe scadenziario
$query = " SELECT * FROM co_scadenziario WHERE iddocumento=' $iddocumento ' AND ABS(pagato)>0 ORDER BY scadenza DESC " ;
$rs = $dbo -> fetchArray ( $query );
2019-04-15 12:41:15 +02:00
$residuo_pagato = abs ( $totale_pagato );
2019-04-11 16:04:08 +02:00
// Verifico se la fattura è di acquisto o di vendita per scegliere che segno mettere nel totale
$query2 = 'SELECT dir FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id=' . prepare ( $iddocumento );
$rs2 = $dbo -> fetchArray ( $query2 );
$dir = $rs2 [ 0 ][ 'dir' ];
// Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato.
// Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive
for ( $i = 0 ; $i < sizeof ( $rs ); ++ $i ) {
2019-04-19 01:39:58 +02:00
if ( $residuo_pagato > 0 ) {
2019-04-15 12:41:15 +02:00
// Se si inserisce una somma maggiore al dovuto, tengo valido il rimanente per saldare il tutto...
if ( $residuo_pagato <= abs ( $rs [ $i ][ 'pagato' ])) {
2019-04-11 16:04:08 +02:00
$pagato = 0 ;
$residuo_pagato -= abs ( $rs [ $i ][ 'pagato' ]);
}
2019-04-15 12:41:15 +02:00
// ...altrimenti aggiungo l'importo pagato
else {
$pagato = abs ( $residuo_pagato );
$residuo_pagato -= abs ( $residuo_pagato );
}
2019-04-19 01:39:58 +02:00
2017-08-04 16:28:16 +02:00
if ( $dir == 'uscita' ) {
2019-04-11 16:04:08 +02:00
$residuo_pagato = - $residuo_pagato ;
}
if ( $pagato >= 0 ) {
if ( $dir == 'uscita' ) {
$dbo -> query ( 'UPDATE co_scadenziario SET pagato=' . prepare ( - $pagato ) . ', data_pagamento=' . prepare ( $data_pagamento ) . ' WHERE id=' . prepare ( $rs [ $i ][ 'id' ]));
} else {
$dbo -> query ( 'UPDATE co_scadenziario SET pagato=' . prepare ( $pagato ) . ', data_pagamento=' . prepare ( $data_pagamento ) . ' WHERE id=' . prepare ( $rs [ $i ][ 'id' ]));
}
2017-08-04 16:28:16 +02:00
}
}
}
}
}
/**
* Elimina i movimenti collegati ad una fattura .
*/
2019-07-25 17:20:24 +02:00
function elimina_movimenti ( $iddocumento , $anche_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
$query2 = 'DELETE FROM co_movimenti WHERE iddocumento=' . prepare ( $iddocumento ) . ' AND primanota=' . prepare ( $anche_prima_nota );
$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
// 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' ];
$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 == '' ) {
$query = " SELECT id FROM co_pianodeiconti3 WHERE descrizione='Riepilogativo fornitori' " ;
$rs = $dbo -> fetchArray ( $query );
$idconto_controparte = $rs [ 0 ][ 'idconto_fornitore' ];
}
} 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 == '' ) {
$query = " SELECT id FROM co_pianodeiconti3 WHERE descrizione='Riepilogativo clienti' " ;
$rs = $dbo -> fetchArray ( $query );
$idconto_controparte = $rs [ 0 ][ 'idconto_cliente' ];
}
}
// Lettura info fattura
$query = 'SELECT *, 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 );
$rs = $dbo -> fetchArray ( $query );
$n = sizeof ( $rs );
$data = $rs [ 0 ][ 'data' ];
$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 );
}
2018-12-28 18:03:38 +01:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $data_documento ) . ', ' . 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
2018-10-23 15:19:04 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $data_documento ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_riga ) . ', ' . prepare ( $riga [ 'imponibile' ] * $segno_mov2_ricavivendite ) . ', ' . prepare ( $primanota ) . ')' ;
$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' ;
$query = 'SELECT id, descrizione FROM co_pianodeiconti3 WHERE descrizione=' . prepare ( $descrizione_conto_iva );
$rs = $dbo -> fetchArray ( $query );
$idconto_iva = $rs [ 0 ][ 'id' ];
$descrizione_conto_iva = $rs [ 0 ][ 'descrizione' ];
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $data_documento ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_iva ) . ', ' . prepare ( $iva_fattura * $segno_mov3_iva ) . ', ' . prepare ( $primanota ) . ')' ;
$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 ) {
2018-10-23 15:19:04 +02:00
$descrizione_conto_iva2 = 'Iva indetraibile' ;
$query = 'SELECT id, descrizione FROM co_pianodeiconti3 WHERE descrizione=' . prepare ( $descrizione_conto_iva2 );
$rs = $dbo -> fetchArray ( $query );
$idconto_iva2 = $rs [ 0 ][ 'id' ];
$descrizione_conto_iva2 = $rs [ 0 ][ 'descrizione' ];
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $data_documento ) . ', ' . 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 ) . ')' ;
$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 ) {
$query = " SELECT id, descrizione FROM co_pianodeiconti3 WHERE descrizione='Erario c/INPS' " ;
$rs = $dbo -> fetchArray ( $query );
$idconto_inps = $rs [ 0 ][ 'id' ];
$descrizione_conto_inps = $rs [ 0 ][ 'descrizione' ];
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02:00
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $data_documento ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_inps ) . ', ' . prepare ( $totale_rivalsainps * $segno_mov4_inps ) . ', ' . prepare ( $primanota ) . ')' ;
$dbo -> query ( $query2 );
}
// 5) Aggiungo la ritenuta d'acconto se c'è
// Lettura id conto ritenuta e la storno subito
if ( $totale_ritenutaacconto != 0 ) {
$query = " SELECT id, descrizione FROM co_pianodeiconti3 WHERE descrizione= \" Erario c/ritenute d'acconto \" " ;
$rs = $dbo -> fetchArray ( $query );
$idconto_ritenutaacconto = $rs [ 0 ][ 'id' ];
$descrizione_conto_ritenutaacconto = $rs [ 0 ][ 'descrizione' ];
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02:00
// DARE nel conto ritenuta
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $data_documento ) . ', ' . prepare ( $iddocumento ) . " , '', " . prepare ( $descrizione . ' del ' . date ( 'd/m/Y' , strtotime ( $data )) . ' (' . $ragione_sociale . ')' ) . ', ' . prepare ( $idconto_ritenutaacconto ) . ', ' . prepare ( $totale_ritenutaacconto * $segno_mov5_ritenutaacconto ) . ', ' . prepare ( $primanota ) . ')' ;
$dbo -> query ( $query2 );
2017-08-04 16:28:16 +02:00
2018-10-23 15:19:04 +02:00
// AVERE nel riepilogativo clienti
$query2 = 'INSERT INTO co_movimenti(idmastrino, data, data_documento, iddocumento, idanagrafica, descrizione, idconto, totale, primanota) VALUES(' . prepare ( $idmastrino ) . ', ' . prepare ( $data ) . ', ' . prepare ( $data_documento ) . ', ' . 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 ) . ')' ;
$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 ) .
*/
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 ;
}