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
include_once __DIR__ . '/../../core.php' ;
2019-01-01 11:39:20 +01:00
use Modules\DDT\DDT ;
2017-08-04 16:28:16 +02:00
/**
* Funzione per generare un nuovo numero per il ddt .
2019-01-01 11:39:20 +01:00
*
* @ deprecated 2.4 . 5
2017-08-04 16:28:16 +02:00
*/
function get_new_numeroddt ( $data )
{
global $dir ;
2019-01-01 11:39:20 +01:00
return DDT :: getNextNumero ( $data , $dir );
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_numerosecondarioddt ( $data )
{
global $dir ;
2018-03-22 15:40:20 +01:00
2019-01-01 11:39:20 +01:00
return DDT :: getNextNumeroSecondario ( $data , $dir );
}
2018-06-22 17:04:37 +02:00
2019-01-01 11:39:20 +01:00
/**
* Calcolo imponibile ddt ( totale_righe - sconto ) .
*
* @ deprecated 2.4 . 5
*/
function get_imponibile_ddt ( $id_ddt )
{
$ddt = DDT :: find ( $id_ddt );
2018-03-22 15:40:20 +01:00
2019-01-01 11:39:20 +01:00
return $ddt -> imponibile ;
}
2018-03-22 15:40:20 +01:00
2019-01-01 11:39:20 +01:00
/**
* Calcolo totale ddt ( imponibile + iva ) .
*
* @ deprecated 2.4 . 5
*/
function get_totale_ddt ( $id_ddt )
{
$ddt = DDT :: find ( $id_ddt );
2017-08-04 16:28:16 +02:00
2019-01-01 11:39:20 +01:00
return $ddt -> totale ;
}
2017-08-04 16:28:16 +02:00
2019-01-01 11:39:20 +01:00
/**
* Calcolo netto a pagare ddt ( totale - ritenute - bolli ) .
*
* @ deprecated 2.4 . 5
*/
function get_netto_ddt ( $id_ddt )
{
$ddt = DDT :: find ( $id_ddt );
return $ddt -> netto ;
}
/**
* Calcolo iva detraibile ddt .
*
* @ deprecated 2.4 . 5
*/
function get_ivadetraibile_ddt ( $id_ddt )
{
$ddt = DDT :: find ( $id_ddt );
return $ddt -> iva_detraibile ;
}
/**
* Calcolo iva indetraibile ddt .
*
* @ deprecated 2.4 . 5
*/
function get_ivaindetraibile_ddt ( $id_ddt )
{
$ddt = DDT :: find ( $id_ddt );
2017-08-04 16:28:16 +02:00
2019-01-01 11:39:20 +01:00
return $ddt -> iva_indetraibile ;
2017-08-04 16:28:16 +02:00
}
/**
* 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 .
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
*/
function rimuovi_articolo_daddt ( $idarticolo , $idddt , $idrigaddt )
{
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
// 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 ;
}
/**
* 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-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 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 )) {
2019-01-22 15:07:09 +01:00
$idrivalsainps = setting ( 'Percentuale rivalsa' );
2017-08-04 16:28:16 +02:00
}
}
2019-01-22 15:52:22 +01:00
$query = " SELECT percentuale FROM co_rivalse WHERE id=' " . $idrivalsainps . " ' " ;
2017-08-04 16:28:16 +02:00
$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 {
2019-03-18 12:37:04 +01:00
$marca_da_bollo = 0.00 ;
2017-08-04 16:28:16 +02:00
}
$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à ) .
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-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-09-20 12:05:22 +02:00
$dbo = database ();
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-09-20 12:05:22 +02:00
$dbo = database ();
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
}