2017-08-04 16:28:16 +02:00
< ? php
include_once __DIR__ . '/../../core.php' ;
/**
* Funzione per generare un nuovo numero per la fattura .
*/
function get_new_numeroordine ( $data )
{
global $dir ;
2018-09-20 12:05:22 +02:00
$dbo = database ();
2018-06-22 17:04:37 +02:00
2017-08-04 16:28:16 +02:00
$query = " SELECT numero AS max_numeroordine FROM or_ordini WHERE DATE_FORMAT( data, '%Y' ) = " . prepare ( date ( 'Y' , strtotime ( $data ))) . ' AND idtipoordine IN(SELECT id FROM or_tipiordine WHERE dir=' . prepare ( $dir ) . ') ORDER BY CAST(numero AS UNSIGNED) DESC LIMIT 0,1' ;
$rs = $dbo -> fetchArray ( $query );
$numero = $rs [ 0 ][ 'max_numeroordine' ] + 1 ;
return $numero ;
}
/**
* Funzione per calcolare il numero secondario successivo utilizzando la maschera dalle impostazioni .
*/
function get_new_numerosecondarioordine ( $data )
{
global $dir ;
2018-09-20 12:05:22 +02:00
$dbo = database ();
2018-06-22 17:04:37 +02:00
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 ordine' );
2018-08-20 18:07:13 +02:00
$formato_numero_secondario = str_replace ( '#' , '%' , $formato_numero_secondario );
2018-06-22 17:04:37 +02:00
2018-08-20 18:07:13 +02:00
$query = 'SELECT numero_esterno FROM or_ordini WHERE DATE_FORMAT( data, "%Y" ) = ' . prepare ( date ( 'Y' , strtotime ( $data ))) . ' AND idtipoordine IN(SELECT id FROM or_tipiordine WHERE dir=' . prepare ( $dir ) . ') AND numero_esterno LIKE(' . prepare ( Util\Generator :: complete ( $formato_numero_secondario )) . ') ORDER BY CAST(numero AS UNSIGNED) DESC LIMIT 0,1' ;
2017-08-04 16:28:16 +02:00
$rs = $dbo -> fetchArray ( $query );
$numero_secondario = $rs [ 0 ][ 'numero_esterno' ];
if ( $numero_secondario == '' ) {
2018-08-29 18:15:12 +02:00
$numero_secondario = setting ( 'Formato numero secondario ordine' );
2017-08-04 16:28:16 +02:00
}
if ( $formato_numero_secondario != '' && $dir == 'entrata' ) {
2018-08-29 18:15:12 +02:00
$numero_esterno = Util\Generator :: generate ( setting ( 'Formato numero secondario ordine' ), $numero_secondario );
2017-08-04 16:28:16 +02:00
} else {
$numero_esterno = '' ;
}
return $numero_esterno ;
}
/**
* Calcolo imponibile ordine ( totale_righe - sconto ) .
*/
function get_imponibile_ordine ( $idordine )
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2017-08-04 16:28:16 +02:00
$query = 'SELECT SUM(subtotale-sconto) AS imponibile FROM or_righe_ordini GROUP BY idordine HAVING idordine=' . prepare ( $idordine );
$rs = $dbo -> fetchArray ( $query );
return $rs [ 0 ][ 'imponibile' ];
}
/**
* Calcolo totale ordine ( imponibile + iva ) .
*/
function get_totale_ordine ( $idordine )
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2017-08-04 16:28:16 +02:00
// Sommo l'iva di ogni riga al totale
$query = 'SELECT SUM(iva) AS iva FROM or_righe_ordini GROUP BY idordine HAVING idordine=' . prepare ( $idordine );
$rs = $dbo -> fetchArray ( $query );
// Aggiungo la rivalsa inps se c'è
$query2 = 'SELECT rivalsainps FROM or_ordini WHERE id=' . prepare ( $idordine );
$rs2 = $dbo -> fetchArray ( $query2 );
return get_imponibile_ordine ( $idordine ) + $rs [ 0 ][ 'iva' ] + $rs2 [ 0 ][ 'rivalsainps' ];
}
/**
* Calcolo netto a pagare ordine ( totale - iva ) .
*/
function get_netto_ordine ( $idordine )
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2017-08-04 16:28:16 +02:00
$query = 'SELECT ritenutaacconto,bollo FROM or_ordini WHERE id=' . prepare ( $idordine );
$rs = $dbo -> fetchArray ( $query );
return get_totale_ordine ( $idordine ) - $rs [ 0 ][ 'ritenutaacconto' ] + $rs [ 0 ][ 'bollo' ];
}
/**
* Calcolo iva detraibile ordine .
*/
function get_ivadetraibile_ordine ( $idordine )
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2017-08-04 16:28:16 +02:00
$query = 'SELECT SUM(iva)-SUM(iva_indetraibile) AS iva_detraibile FROM or_righe_ordini GROUP BY idordine HAVING idordine=' . prepare ( $idordine );
$rs = $dbo -> fetchArray ( $query );
return $rs [ 0 ][ 'iva_detraibile' ];
}
/**
* Calcolo iva indetraibile ordine .
*/
function get_ivaindetraibile_ordine ( $idordine )
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2017-08-04 16:28:16 +02:00
$query = 'SELECT SUM(iva_indetraibile) AS iva_indetraibile FROM or_righe_ordini GROUP BY idordine HAVING idordine=' . prepare ( $idordine );
$rs = $dbo -> fetchArray ( $query );
return $rs [ 0 ][ 'iva_indetraibile' ];
}
/**
* Questa funzione aggiunge un articolo nell 'ordine. E' comoda quando si devono inserire
* degli interventi con articoli collegati o preventivi che hanno interventi con articoli collegati !
* $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_inordine ( $idordine , $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-09-20 12:05:22 +02:00
$dbo = database ();
2017-08-04 16:28:16 +02:00
2018-06-22 17:04:37 +02:00
// Lettura unità di misura dell'articolo
if ( empty ( $idum )) {
$rs = $dbo -> fetchArray ( 'SELECT um FROM mg_articoli WHERE id=' . prepare ( $idarticolo ));
$um = $rs [ 0 ][ 'valore' ];
} else {
$um = $idum ;
}
2017-08-04 16:28:16 +02:00
// Lettura iva dell'articolo
$rs2 = $dbo -> fetchArray ( 'SELECT descrizione, 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 or_righe_ordini(idordine, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, abilita_serial, `order`) VALUES (' . prepare ( $idordine ) . ', ' . prepare ( $idarticolo ) . ', ' . prepare ( $idiva ) . ', ' . prepare ( $rs2 [ 0 ][ 'descrizione' ]) . ', ' . prepare ( $iva ) . ', ' . prepare ( $iva_indetraibile ) . ', ' . prepare ( $descrizione ) . ', ' . prepare ( $prezzo ) . ', ' . prepare ( $sconto ) . ', ' . prepare ( $sconto_unitario ) . ', ' . prepare ( $tipo_sconto ) . ', ' . prepare ( $um ) . ', ' . prepare ( $qta ) . ', ' . prepare ( $rsart [ 0 ][ 'abilita_serial' ]) . ', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine=' . prepare ( $idordine ) . '))' );
2017-08-04 16:28:16 +02:00
}
}
/**
* Questa funzione rimuove un articolo dall ' ordine
* $idarticolo integer codice dell 'articolo da scollegare dall' ordine
* $idordine integer codice dell 'ordine da cui scollegare l' articolo
* $idrigaordine integer id della riga ordine da rimuovere .
*/
function rimuovi_articolo_daordine ( $idarticolo , $idordine , $idrigaordine )
{
global $dir ;
2018-09-20 12:05:22 +02:00
$dbo = database ();
2018-06-22 17:04:37 +02:00
2017-09-05 17:31:58 +02:00
$non_rimovibili = seriali_non_rimuovibili ( 'id_riga_ordine' , $idrigaordine , $dir );
if ( ! empty ( $non_rimovibili )) {
return false ;
2017-08-04 16:28:16 +02:00
}
// Elimino la riga dall'ordine
$dbo -> query ( 'DELETE FROM `or_righe_ordini` WHERE id=' . prepare ( $idrigaordine ));
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_ordine = ' . prepare ( $idrigaordine ));
2017-08-04 16:28:16 +02:00
return true ;
}
/**
* Ricalcola i costi aggiuntivi in ordine ( rivalsa inps , ritenuta d ' acconto , marca da bollo )
* Deve essere eseguito ogni volta che si aggiunge o toglie una riga
* $idordine int ID del ordine
* $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_ordine ( $idordine , $idrivalsainps = '' , $idritenutaacconto = '' , $bolli = '' )
{
global $dir ;
2018-09-20 12:05:22 +02:00
$dbo = database ();
2018-06-22 17:04:37 +02:00
2017-08-04 16:28:16 +02:00
// Se ci sono righe nel ordine faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
$query = 'SELECT COUNT(id) AS righe FROM or_righe_ordini WHERE idordine=' . prepare ( $idordine );
$rs = $dbo -> fetchArray ( $query );
if ( $rs [ 0 ][ 'righe' ] > 0 ) {
$totale_imponibile = get_imponibile_ordine ( $idordine );
$totale_ordine = get_totale_ordine ( $idordine );
// Leggo gli id dei costi aggiuntivi
if ( $dir == 'uscita' ) {
$query2 = 'SELECT idrivalsainps, idritenutaacconto, bollo FROM or_ordini WHERE id=' . prepare ( $idordine );
$rs2 = $dbo -> fetchArray ( $query2 );
$idrivalsainps = $rs2 [ 0 ][ 'idrivalsainps' ];
$idritenutaacconto = $rs2 [ 0 ][ 'idritenutaacconto' ];
$bollo = $rs2 [ 0 ][ 'bollo' ];
}
// Leggo la rivalsa inps se c'è (per i ordine 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=' . prepare ( $idrivalsainps );
$rs = $dbo -> fetchArray ( $query );
$rivalsainps = $totale_imponibile / 100 * $rs [ 0 ][ 'percentuale' ];
// Aggiorno la rivalsa inps
$dbo -> query ( " UPDATE or_ordini SET rivalsainps=' $rivalsainps ' WHERE id= " . prepare ( $idordine ));
// Leggo la ritenuta d'acconto se c'è
$totale_ordine = get_totale_ordine ( $idordine );
// Leggo la rivalsa inps se c'è (per i ordine 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=' . prepare ( $idritenutaacconto );
$rs = $dbo -> fetchArray ( $query );
$ritenutaacconto = $totale_ordine / 100 * $rs [ 0 ][ 'percentuale' ];
$netto_a_pagare = $totale_ordine - $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 ;
}
}
// 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=' . prepare ( setting ( 'Iva predefinita' ));
2017-08-04 16:28:16 +02:00
$rsi = $dbo -> fetchArray ( $qi );
$iva_rivalsainps = $rivalsainps / 100 * $rsi [ 0 ][ 'percentuale' ];
$dbo -> query ( 'UPDATE or_ordini SET ritenutaacconto=' . prepare ( $ritenutaacconto ) . ', bollo=' . prepare ( $marca_da_bollo ) . ', iva_rivalsainps=' . prepare ( $iva_rivalsainps ) . ' WHERE id=' . prepare ( $idordine ));
} else {
$dbo -> query ( " UPDATE or_ordini SET ritenutaacconto='0', bollo='0', rivalsainps='0' WHERE id= " . prepare ( $idordine ));
}
}
/**
* Restituisce lo stato dell ' ordine in base alle righe .
*/
function get_stato_ordine ( $idordine )
{
2018-09-20 12:05:22 +02:00
$dbo = database ();
2018-06-22 17:04:37 +02:00
2018-05-22 14:41:42 +02:00
$rs_ordine = $dbo -> fetchArray ( " SELECT IFNULL(SUM(qta), 0) AS qta FROM or_righe_ordini WHERE idordine=' " . $idordine . " ' " );
2018-06-22 17:04:37 +02:00
$qta_ordine = $rs_ordine [ 0 ][ 'qta' ];
2018-05-22 14:41:42 +02:00
//Righe dell'ordine in ddt
$rs_ddt = $dbo -> fetchArray ( 'SELECT IFNULL(SUM(qta), 0) AS qta FROM dt_righe_ddt WHERE idordine=' . prepare ( $idordine ));
$qta_ddt = $rs_ddt [ 0 ][ 'qta' ];
2018-06-22 17:04:37 +02:00
2018-05-22 14:41:42 +02:00
//Righe dell'ordine in fattura
$rs_fattura = $dbo -> fetchArray ( 'SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idordine=' . prepare ( $idordine ));
$qta_fattura = $rs_fattura [ 0 ][ 'qta' ];
2018-06-22 17:04:37 +02:00
2018-05-22 14:41:42 +02:00
//Righe dell'ordine in fattura passando da ddt
$rs_ddt_fattura = $dbo -> fetchArray ( " SELECT IFNULL(SUM(qta), 0) AS qta FROM co_righe_documenti WHERE idddt IN(SELECT DISTINCT idddt FROM dt_righe_ddt WHERE idordine=' " . $idordine . " ') " );
$qta_ddt_fattura = $rs_ddt_fattura [ 0 ][ 'qta' ];
2018-06-22 17:04:37 +02:00
if ( $qta_ddt == 0 ) {
2018-05-22 14:41:42 +02:00
$stato = 'Bozza' ;
}
2018-06-22 17:04:37 +02:00
if ( $qta_fattura == 0 ) {
2018-05-22 14:41:42 +02:00
$stato = 'Bozza' ;
}
2018-06-22 17:04:37 +02:00
if ( $qta_ddt > 0 && $qta_ddt < $qta_ordine && $qta_ordine > 0 ) {
2018-05-22 14:41:42 +02:00
$stato = 'Parzialmente evaso' ;
2017-08-04 16:28:16 +02:00
}
2018-06-22 17:04:37 +02:00
if ( $qta_ddt == $qta_ordine && $qta_ordine > 0 ) {
2018-05-22 14:41:42 +02:00
$stato = 'Evaso' ;
}
2018-06-22 17:04:37 +02:00
if ( $qta_fattura > 0 && $qta_fattura < $qta_ordine && $qta_ordine > 0 ) {
2018-05-22 14:41:42 +02:00
$stato = 'Parzialmente fatturato' ;
}
2018-06-22 17:04:37 +02:00
if ( $qta_fattura == $qta_ordine && $qta_ordine > 0 ) {
2018-05-22 14:41:42 +02:00
$stato = 'Fatturato' ;
}
2018-06-22 17:04:37 +02:00
if ( $qta_ddt_fattura > 0 && $qta_ddt_fattura < $qta_ordine && $qta_ordine > 0 ) {
2018-05-22 14:41:42 +02:00
$stato = 'Parzialmente fatturato' ;
}
2018-06-22 17:04:37 +02:00
if ( $qta_ddt_fattura == $qta_ordine && $qta_ordine > 0 ) {
2018-05-22 14:41:42 +02:00
$stato = 'Fatturato' ;
}
2018-06-22 17:04:37 +02:00
return $stato ;
2017-08-04 16:28:16 +02:00
}