2017-08-04 16:28:16 +02:00
< ? php
include_once __DIR__ . '/../../core.php' ;
/**
* Funzione per generare un nuovo numero per il ddt .
*/
function get_new_numeroddt ( $data )
{
global $dir ;
2018-06-22 17:04:37 +02:00
$dbo = Database :: getConnection ();
2017-08-04 16:28:16 +02:00
$query = " SELECT IFNULL(MAX(numero),'0') AS max_numeroddt FROM dt_ddt WHERE DATE_FORMAT( data, '%Y' ) = ' " . date ( 'Y' , strtotime ( $data )) . " ' AND idtipoddt IN(SELECT id FROM dt_tipiddt WHERE dir=' " . $dir . " ') ORDER BY CAST(numero AS UNSIGNED) DESC LIMIT 0,1 " ;
$rs = $dbo -> fetchArray ( $query );
return intval ( $rs [ 0 ][ 'max_numeroddt' ]) + 1 ;
}
/**
* Funzione per calcolare il numero secondario successivo utilizzando la maschera dalle impostazioni .
*/
function get_new_numerosecondarioddt ( $data )
{
global $dir ;
2018-03-22 15:40:20 +01:00
2018-06-22 17:04:37 +02:00
$dbo = Database :: getConnection ();
2017-08-04 16:28:16 +02:00
// Calcolo il numero secondario se stabilito dalle impostazioni e se documento di vendita
2018-07-08 18:11:17 +02:00
$formato_numero_secondario = setting ( 'Formato numero secondario ddt' );
2018-03-22 15:40:20 +01:00
2018-03-19 19:07:32 +01:00
$query = " SELECT numero_esterno FROM dt_ddt WHERE DATE_FORMAT( data, '%Y' ) = ' " . date ( 'Y' , strtotime ( $data )) . " ' AND idtipoddt IN(SELECT id FROM dt_tipiddt WHERE dir=' " . $dir . " ') ORDER BY numero_esterno DESC LIMIT 0,1 " ;
2018-03-22 15:40:20 +01:00
2018-03-19 18:17:34 +01:00
$rs = $dbo -> fetchArray ( $query );
$numero_secondario = $rs [ 0 ][ 'numero_esterno' ];
2017-08-04 16:28:16 +02:00
if ( $numero_secondario == '' ) {
$numero_secondario = $formato_numero_secondario ;
}
if ( $formato_numero_secondario != '' && $dir == 'entrata' ) {
2018-03-22 15:40:20 +01:00
$numero_esterno = Util\Generator :: generate ( $formato_numero_secondario , $numero_secondario );
2017-08-04 16:28:16 +02:00
} else {
$numero_esterno = '' ;
}
return $numero_esterno ;
}
/**
* Questa funzione rimuove un articolo dal ddt data e lo riporta in magazzino
* $idarticolo integer codice dell ' articolo da scollegare dal ddt
* $idddt integer codice del ddt da cui scollegare l ' articolo .
*/
function rimuovi_articolo_daddt ( $idarticolo , $idddt , $idrigaddt )
{
global $dir ;
2018-06-22 17:04:37 +02:00
$dbo = Database :: getConnection ();
2017-08-04 16:28:16 +02:00
// Leggo la quantità di questo articolo in ddt
2017-09-05 17:31:58 +02:00
$query = 'SELECT qta, subtotale FROM dt_righe_ddt WHERE id=' . prepare ( $idrigaddt );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
$qta = floatval ( $rs [ 0 ][ 'qta' ]);
$subtotale = $rs [ 0 ][ 'subtotale' ];
// Leggo l'idordine
$query = 'SELECT idordine FROM dt_righe_ddt WHERE id=' . prepare ( $idrigaddt );
$rs = $dbo -> fetchArray ( $query );
$idordine = $rs [ 0 ][ 'idordine' ];
2017-09-05 17:31:58 +02:00
$non_rimovibili = seriali_non_rimuovibili ( 'id_riga_ddt' , $idrigaddt , $dir );
if ( ! empty ( $non_rimovibili )) {
return false ;
2017-08-04 16:28:16 +02:00
}
// Ddt di vendita
if ( $dir == 'entrata' ) {
add_movimento_magazzino ( $idarticolo , $qta , [ 'idddt' => $idddt ]);
// Se il ddt è stato generato da un ordine tolgo questa quantità dalla quantità evasa
if ( ! empty ( $idordine )) {
$dbo -> query ( 'UPDATE or_righe_ordini SET qta_evasa=qta_evasa-' . $qta . ' WHERE idarticolo=' . prepare ( $idarticolo ) . ' AND idordine=' . prepare ( $idordine ));
}
}
// Ddt di acquisto
else {
add_movimento_magazzino ( $idarticolo , - $qta , [ 'idddt' => $idddt ]);
// Se il ddt è stato generato da un ordine tolgo questa quantità dalla quantità evasa
if ( ! empty ( $idordine )) {
$dbo -> query ( 'UPDATE or_righe_ordini SET qta_evasa=qta_evasa-' . $qta . ' WHERE idarticolo=' . prepare ( $idarticolo ) . ' AND idordine=' . prepare ( $idordine ));
}
}
$dbo -> query ( $query );
// Elimino la riga dal ddt
2017-09-05 17:31:58 +02:00
$dbo -> query ( 'DELETE FROM `dt_righe_ddt` WHERE id=' . prepare ( $idrigaddt ) . ' AND idddt=' . prepare ( $idddt ));
2018-06-26 14:30:26 +02:00
2018-06-25 11:44:06 +02:00
//Aggiorno lo stato dell'ordine
2018-07-08 18:11:17 +02:00
if ( setting ( 'Cambia automaticamente stato ordini fatturati' ) && ! empty ( $idordine )) {
2018-06-25 11:44:06 +02:00
$dbo -> query ( 'UPDATE or_ordini SET idstatoordine=(SELECT id FROM or_statiordine WHERE descrizione="' . get_stato_ordine ( $idordine ) . '") WHERE id = ' . prepare ( $idordine ));
}
2017-08-04 16:28:16 +02:00
2017-09-06 10:48:59 +02:00
// Elimino i seriali utilizzati dalla riga
$dbo -> query ( 'DELETE FROM `mg_prodotti` WHERE id_articolo = ' . prepare ( $idarticolo ) . ' AND id_riga_ddt = ' . prepare ( $idrigaddt ));
2017-08-04 16:28:16 +02:00
return true ;
}
/**
* Calcolo imponibile ddt ( totale_righe - sconto ) .
*/
function get_imponibile_ddt ( $idddt )
{
2018-06-22 17:04:37 +02:00
$dbo = Database :: getConnection ();
2017-08-04 16:28:16 +02:00
2017-08-24 10:39:32 +02:00
$query = 'SELECT SUM(subtotale-sconto) AS imponibile FROM dt_righe_ddt GROUP BY idddt HAVING idddt=' . prepare ( $idddt );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
return $rs [ 0 ][ 'imponibile' ];
}
/**
* Calcolo totale ddt ( imponibile + iva ) .
*/
function get_totale_ddt ( $idddt )
{
2018-06-22 17:04:37 +02:00
$dbo = Database :: getConnection ();
2017-08-04 16:28:16 +02:00
// Sommo l'iva di ogni riga al totale
2018-06-22 17:04:37 +02:00
$query = 'SELECT SUM(iva) AS iva FROM dt_righe_ddt GROUP BY idddt HAVING idddt=' . prepare ( $idddt );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
// Aggiungo la rivalsa inps se c'è
2018-06-22 17:04:37 +02:00
$query2 = 'SELECT rivalsainps FROM dt_ddt WHERE id=' . prepare ( $idddt );
2017-08-04 16:28:16 +02:00
$rs2 = $dbo -> fetchArray ( $query2 );
return get_imponibile_ddt ( $idddt ) + $rs [ 0 ][ 'iva' ] + $rs2 [ 0 ][ 'rivalsainps' ];
}
/**
* Calcolo netto a pagare ddt ( totale - ritenute - bolli ) .
*/
function get_netto_ddt ( $idddt )
{
2018-06-22 17:04:37 +02:00
$dbo = Database :: getConnection ();
2017-08-04 16:28:16 +02:00
2018-06-22 17:04:37 +02:00
$query = 'SELECT ritenutaacconto,bollo FROM dt_ddt WHERE id=' . prepare ( $idddt );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
return get_totale_ddt ( $idddt ) - $rs [ 0 ][ 'ritenutaacconto' ] + $rs [ 0 ][ 'bollo' ];
}
/**
* Calcolo iva detraibile ddt .
*/
function get_ivadetraibile_ddt ( $idddt )
{
2018-06-22 17:04:37 +02:00
$dbo = Database :: getConnection ();
2017-08-04 16:28:16 +02:00
2018-06-22 17:04:37 +02:00
$query = 'SELECT SUM(iva)-SUM(iva_indetraibile) AS iva_detraibile FROM dt_righe_ddt GROUP BY idddt HAVING idddt=' . prepare ( $idddt );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
return $rs [ 0 ][ 'iva_detraibile' ];
}
/**
* Calcolo iva indetraibile ddt .
*/
function get_ivaindetraibile_ddt ( $idddt )
{
2018-06-22 17:04:37 +02:00
$dbo = Database :: getConnection ();
2017-08-04 16:28:16 +02:00
2018-06-22 17:04:37 +02:00
$query = 'SELECT SUM(iva_indetraibile) AS iva_indetraibile FROM dt_righe_ddt GROUP BY idddt HAVING idddt=' . prepare ( $idddt );
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
return $rs [ 0 ][ 'iva_indetraibile' ];
}
/**
* 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 .
*/
function ricalcola_costiagg_ddt ( $idddt , $idrivalsainps = '' , $idritenutaacconto = '' , $bolli = '' )
{
global $dir ;
2018-06-22 17:04:37 +02:00
$dbo = Database :: getConnection ();
2017-08-04 16:28:16 +02: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 ' " ;
$rs = $dbo -> fetchArray ( $query );
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' ];
}
// Leggo la rivalsa inps se c'è (per i ddt di vendita lo leggo dalle impostazioni)
if ( $dir == 'entrata' ) {
if ( ! empty ( $idrivalsainps )) {
2018-07-08 18:11:17 +02:00
$idrivalsainps = setting ( 'Percentuale rivalsa INPS' );
2017-08-04 16:28:16 +02:00
}
}
$query = " SELECT percentuale FROM co_rivalsainps WHERE id=' " . $idrivalsainps . " ' " ;
$rs = $dbo -> fetchArray ( $query );
$rivalsainps = $totale_imponibile / 100 * $rs [ 0 ][ 'percentuale' ];
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
2018-07-08 18:11:17 +02:00
$qi = " SELECT percentuale FROM co_iva WHERE id=' " . setting ( 'Iva predefinita' ) . " ' " ;
2017-08-04 16:28:16 +02:00
$rsi = $dbo -> fetchArray ( $qi );
$iva_rivalsainps = $rivalsainps / 100 * $rsi [ 0 ][ 'percentuale' ];
// 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' ) {
2018-07-08 18:11:17 +02:00
$idritenutaacconto = setting ( " Percentuale ritenuta d'acconto " );
2017-08-04 16:28:16 +02: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 );
2018-07-08 18:11:17 +02:00
if ( abs ( $bolli ) > 0 && abs ( $netto_a_pagare > setting ( " Soglia minima per l'applicazione della marca da bollo " ))) {
2017-08-04 16:28:16 +02:00
$marca_da_bollo = str_replace ( ',' , '.' , $bolli );
} else {
$marca_da_bollo = 0.00 ;
}
}
} else {
2018-07-08 18:11:17 +02:00
$bolli = str_replace ( ',' , '.' , setting ( 'Importo marca da bollo' ));
if ( abs ( $bolli ) > 0 && abs ( $netto_a_pagare ) > abs ( setting ( " Soglia minima per l'applicazione della marca da bollo " ))) {
2017-08-04 16:28:16 +02:00
$marca_da_bollo = str_replace ( ',' , '.' , $bolli );
} else {
$marca_da_bollo = 0.00 ;
}
2018-07-05 17:56:38 +02:00
// Se l'importo è negativo può essere una nota di credito, quindi cambio segno alla marca da bollo
2017-08-04 16:28:16 +02:00
if ( $netto_a_pagare < 0 ) {
$marca_da_bollo *= - 1 ;
}
}
$dbo -> query ( " UPDATE dt_ddt SET ritenutaacconto=' $ritenutaacconto ', bollo=' $marca_da_bollo ' WHERE id=' $idddt ' " );
} else {
$dbo -> query ( " UPDATE dt_ddt SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id=' $idddt ' " );
}
}
/**
* Questa funzione aggiunge un articolo nel ddt
* $iddocumento integer id dell ' ordine
* $idarticolo integer id dell 'articolo da inserire nell' ordine
* $idiva integer id del codice iva associato all ' articolo
* $qta float quantità dell 'articolo nell' ordine
* $prezzo float prezzo totale degli articoli ( prezzounitario * qtà ) .
*/
2018-06-22 17:04:37 +02:00
function add_articolo_inddt ( $idddt , $idarticolo , $descrizione , $idiva , $qta , $idum , $prezzo , $sconto = 0 , $sconto_unitario = 0 , $tipo_sconto = 'UNT' )
2017-08-04 16:28:16 +02:00
{
global $dir ;
2018-06-25 11:44:06 +02:00
global $idordine ;
2017-08-04 16:28:16 +02:00
2018-06-22 17:04:37 +02:00
$dbo = Database :: getConnection ();
2017-08-04 16:28:16 +02:00
// Lettura unità di misura dell'articolo
if ( empty ( $idum )) {
2018-06-22 17:04:37 +02:00
$rs = $dbo -> fetchArray ( 'SELECT um FROM mg_articoli WHERE id=' . prepare ( $idarticolo ));
2017-08-04 16:28:16 +02:00
$um = $rs [ 0 ][ 'valore' ];
} else {
$um = $idum ;
}
// Lettura iva dell'articolo
$rs2 = $dbo -> fetchArray ( 'SELECT percentuale, indetraibile FROM co_iva WHERE id=' . prepare ( $idiva ));
$iva = ( $prezzo - $sconto ) / 100 * $rs2 [ 0 ][ 'percentuale' ];
$iva_indetraibile = $iva / 100 * $rs2 [ 0 ][ 'indetraibile' ];
if ( $qta > 0 ) {
$rsart = $dbo -> fetchArray ( 'SELECT abilita_serial FROM mg_articoli WHERE id=' . prepare ( $idarticolo ));
2017-09-05 17:31:58 +02:00
$dbo -> query ( 'INSERT INTO dt_righe_ddt(idddt, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, qta, abilita_serial, um, `order`) VALUES (' . prepare ( $idddt ) . ', ' . prepare ( $idarticolo ) . ', ' . 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 ( $um ) . ', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt=' . prepare ( $idddt ) . '))' );
2017-08-04 16:28:16 +02:00
$idriga = $dbo -> lastInsertedID ();
/*
Ddt cliente
*/
if ( $dir == 'entrata' ) {
// Decremento la quantità dal magazzino centrale
add_movimento_magazzino ( $idarticolo , - $qta , [ 'idddt' => $idddt ]);
}
/*
Ddt fornitore
*/
elseif ( $dir == 'uscita' ) {
// Decremento la quantità dal magazzino centrale
add_movimento_magazzino ( $idarticolo , $qta , [ 'idddt' => $idddt ]);
}
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 dt_righe_ddt SET idordine=' . prepare ( $idordine ) . ' WHERE id=' . prepare ( $idriga ));
2017-08-04 16:28:16 +02:00
}
return $idriga ;
}
2018-01-23 17:36:44 +01:00
/**
* Restituisce lo stato del ddt in base alle righe .
*/
function get_stato_ddt ( $idddt )
{
2018-06-22 17:04:37 +02:00
$dbo = Database :: getConnection ();
2018-01-23 17:36:44 +01:00
$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 ));
2018-01-23 18:05:29 +01:00
if ( $rs [ 0 ][ 'qta' ] == 0 ) {
return 'Bozza' ;
2018-01-23 17:36:44 +01:00
} else {
2018-01-23 18:05:29 +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 17:36:44 +01:00
}
2018-02-18 19:53:23 +01:00
}