gest366/modules/contratti/modutil.php

493 lines
19 KiB
PHP
Raw Normal View History

2021-02-24 20:40:04 +00:00
<?php
function add_storico($idcontratto,$descrizione){
global $dbo;
$dbo->query("INSERT INTO zz_log_contratti( idcontratto, idutente,data_log,username,descrizione ) VALUES( \"".$idcontratto."\", \"".$_SESSION['idutente']."\",NOW(),\"".$_SESSION['username']."\",\"".$descrizione."\" )");
}
function doc_crea_dacontratto( $id_record,$idtipodocumento,$sta_sucessivo ){
global $dbo;
if( $id_record ){
$rs = $dbo->fetchArray("SELECT * FROM co_contratti WHERE id=\"".$id_record."\"");
$data = $rs[0]['data_accettazione'];
$id_contratto=$id_record;
// ricerca se la numerazione e' progressiva o propria
$numerazione_progressiva=get_var_tipodoc($idtipodocumento,'mod_num');
$dir=get_var_tipodoc($idtipodocumento,'dir');
$idconto=get_var_tipodoc($idtipodocumento,'idconto');
$idpagamento_new=get_var_tipodoc($idtipodocumento,'idpagamento');
$dir=get_var_tipodoc($idtipodocumento,'dir');
$id_gruppodoc=get_var_tipodoc($idtipodocumento,'id_gruppo_tipologia');
$suffisso=get_var_tipodoc($idtipodocumento,'txt_suffisso');
$suffisso_anno=get_var_tipodoc($idtipodocumento,'suffisso_anno');
$idstato = get_var_tipodoc($idtipodocumento,'sta_apertura');
if( $numerazione_progressiva==0) $numero = get_new_numerofattura( $data );
if( $numerazione_progressiva==1) $numero=get_new_numerofattura_multi($data,$idtipodocumento);
if( $dir=='entrata' ){
if( $numerazione_progressiva==0) $numero_esterno = get_new_numerosecondariofattura( $data,$idtipodocumento );
if( $numerazione_progressiva==1) $numero_esterno = get_new_numerosecondariofattura_multi( $data,$idtipodocumento );
}
else{
$numero_esterno = '';
}
if( $sta_sucessivo=='0' ){
$idstatodocumento=$idstato;
}
else{
$idstatodocumento=$sta_sucessivo;
}
$numero_documento=$suffisso.$numero_esterno;
if( $suffisso_anno==1) $numero_documento = $numero_documento."_".date("Y");
$dbo->query("INSERT INTO co_documenti( numero_documento,id_gruppo_tipologia,id_contratto_doc,numero, numero_esterno, data, idanagrafica, idtipodocumento, idstatodocumento, idpagamento )
VALUES( \"".$numero_documento."\",\"".$id_gruppodoc."\",\"".$id_contratto."\",\"".$numero."\", \"".$numero_esterno."\", \"".$rs[0]['data_accettazione']."\", \"".$rs[0]['idanagrafica']."\", \"".$idtipodocumento."\" , '2', \"".$rs[0]['idpagamento']."\" )");
$iddocumento = $dbo->last_inserted_id();
// asegno iddocumento al contratto
$dbo->query( "UPDATE co_contratti SET id_documento='.$iddocumento.' WHERE id='".$id_contratto."'" );
//Inseriemnto posizione nel documento
$rs_contratto = $dbo->fetchArray("SELECT id_tipocanone , nome FROM co_contratti WHERE id=\"".$id_contratto."\"");
$id_tipocontratto=$rs_contratto[0]['id_tipocanone'];
$descrizione=$rs_contratto[0]['nome'];
$rs = $dbo->fetchArray("SELECT costo_annuale FROM co_contratti_tipi WHERE id='".$id_tipocontratto."'");
$subtot=$rs[0]['costo_annuale'];
//Calcolo iva
$idiva=get_var("Iva predefinita");
$query = "SELECT * FROM co_iva WHERE id='".$idiva."'";
$rs = $dbo->fetchArray($query);
$iva = ($subtot)/100*$rs[0]['percentuale'];
$iva_indetraibile = $iva/100*$rs[0]['indetraibile'];
$desc_iva = $rs[0]['descrizione'];
$sconto=0;
$qta=1;
$query = "INSERT INTO co_righe_documenti( iddocumento, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, um, qta, idconto)
VALUES( \"$iddocumento\", \"".$idiva."\", \"$desc_iva\", \"$iva\", \"$iva_indetraibile\", \"$descrizione\", \"$subtot\", \"$sconto\", \"$um\", \"$qta\",
\"".$idconto."\" )";
if( $dbo->query($query) ){
}
// $id_record = $iddocumento;
// return $iddocumento;
}
}
function get_new_numerosecondariofattura( $data ){
global $dbo;
global $dir;
global $idtipodocumento;
$dir="entrata";
//DATE_FORMAT( data, '%Y' ) = '".date("Y", strtotime($data))."'
$query = "SELECT numero_esterno FROM co_documenti WHERE DATE_FORMAT( data, '%Y' ) = '".date("Y", strtotime ( '+3 month' , strtotime ( $data) ))."' AND idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir='".$dir."') ORDER BY CAST(numero_esterno AS UNSIGNED) DESC LIMIT 0,1";
$rs = $dbo->fetchArray($query);
$numero_secondario = $rs[0]['numero_esterno'];
//Calcolo il numero secondario se stabilito dalle impostazioni e se documento di vendita
$formato_numero_secondario = get_var("Formato numero secondario fattura");
if( $numero_secondario=='' )
$numero_secondario = $formato_numero_secondario;
if( $formato_numero_secondario!='' && $dir=='entrata' )
$numero_esterno = get_next_code( $numero_secondario, 1, $formato_numero_secondario );
else
$numero_esterno = '';
return $numero_esterno;
}
function get_new_numerosecondariofattura_multi( $data , $tipodoc ){
global $dbo;
global $dir;
global $idtipodocumento;
$dir="entrata";
$id_gruppodoc=get_var_tipodoc($tipodoc,'id_gruppo_tipologia');
if( $id_gruppodoc=='0' )
$query = "SELECT numero_esterno FROM co_documenti WHERE DATE_FORMAT( data, '%Y' ) = '".date("Y", strtotime($data) )."'
AND idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir='".$dir."' and idtipodocumento='".$tipodoc."' ) ORDER BY CAST(numero_esterno AS UNSIGNED) DESC LIMIT 0,1";
else
$query = "SELECT numero_esterno FROM co_documenti WHERE DATE_FORMAT( data, '%Y' ) = '".date("Y", strtotime($data) )."' and id_gruppo_tipologia='".$id_gruppodoc."'
AND idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir='".$dir."' ) ORDER BY CAST(numero_esterno AS UNSIGNED) DESC LIMIT 0,1";
$rs = $dbo->fetchArray($query);
$numero_secondario = $rs[0]['numero_esterno'];
//Calcolo il numero secondario se stabilito dalle impostazioni e se documento di vendita
$formato_numero_secondario=get_var_tipodoc($tipodoc,'var_formato_num');
if( $numero_secondario=='' )
$numero_secondario = $formato_numero_secondario;
if( $formato_numero_secondario!='' && $dir=='entrata' )
$numero_esterno = get_next_code( $numero_secondario, 1, $formato_numero_secondario );
else
$numero_esterno = '';
return $numero_esterno;
}
/**
* Funzione per generare un nuovo numero per la fattura
*/
function get_new_numerofattura( $data ){
global $dbo;
global $dir;
$dir="entrata";
$query = "SELECT IFNULL(MAX(numero),'0') AS max_numerofattura FROM co_documenti WHERE DATE_FORMAT( data, '%Y' ) = '".date("Y", strtotime($data))."' AND idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir='".$dir."') ORDER BY CAST(numero AS UNSIGNED) DESC LIMIT 0,1";
$rs = $dbo->fetchArray($query);
$numero = $rs[0]['max_numerofattura']+1;
return $numero;
}
function get_new_numerofattura_multi( $data , $tipodoc ){
global $dbo;
global $dir;
$dir="entrata";
$id_gruppodoc=get_var_tipodoc($tipodoc,'id_gruppo_tipologia');
if( $id_gruppodoc=='0' )
$query = "SELECT IFNULL(MAX(numero),'0') AS max_numerofattura FROM co_documenti WHERE DATE_FORMAT( data, '%Y' ) = '".date("Y", strtotime($data))."' AND
idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir='".$dir."' and idtipodocumento='".$tipodoc."' ) ORDER BY CAST(numero AS UNSIGNED) DESC LIMIT 0,1";
else
$query = "SELECT IFNULL(MAX(numero),'0') AS max_numerofattura FROM co_documenti WHERE DATE_FORMAT( data, '%Y' ) = '".date("Y", strtotime($data))."' and id_gruppo_tipologia='".$id_gruppodoc."' AND
idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir='".$dir."' ) ORDER BY CAST(numero AS UNSIGNED) DESC LIMIT 0,1";
$rs = $dbo->fetchArray($query);
$numero = $rs[0]['max_numerofattura']+1;
return $numero;
}
/**
* 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!
* $idpreventivo integer id del preventivo
* $idarticolo integer id dell'articolo da inserire nel preventivo
* $idiva integer id del codice iva associato all'articolo
* $qta float quantità dell'articolo nell'ordine
* $prezzo float prezzo totale degli articoli (prezzounitario*qtà)
*/
function add_articolo_inpreventivo( $idpreventivo, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $lotto='', $serial='', $altro='' ){
global $dbo;
global $dir;
//Lettura unità di misura dell'articolo
$query = "SELECT valore FROM mg_unitamisura WHERE id=(SELECT idum FROM mg_articoli WHERE id='".$idarticolo."')";
$rs = $dbo->fetchArray($query);
$um = $rs[0]['valore'];
/*
Ordine cliente
*/
if( $dir=='entrata' ){
//Lettura iva dell'articolo
$rs2 = $dbo->fetchArray("SELECT percentuale, indetraibile FROM co_iva WHERE id='".$idiva."'");
$iva = $prezzo/100*$rs2[0]['percentuale'];
$iva_indetraibile = $iva/100*$rs2[0]['indetraibile'];
//Verifico se nell'ordine c'è già questo articolo allo stesso prezzo unitario
$rs = $dbo->fetchArray("SELECT id, qta FROM co_righe_preventivi WHERE idarticolo='".$idarticolo."' AND idpreventivo='".$idpreventivo."' AND lotto=\"".$lotto."\" AND serial=\"".$serial."\" AND altro=\"".$altro."\"");
//Inserisco la riga nell'ordine: se nell'ordine c'è già questo articolo incremento la quantità...
if( sizeof($rs) > 0 ){
$dbo->query("UPDATE co_righe_preventivi SET qta=qta+".$qta.", subtotale=subtotale+".$prezzo." WHERE id='".$rs[0]['id']."'");
}
//...altrimenti inserisco la scorta nell'ordine da zero
else{
$dbo->query("INSERT INTO co_righe_preventivi( idpreventivo, idarticolo, idiva, iva, iva_indetraibile, descrizione, subtotale, um, qta, lotto, serial, altro ) VALUES ( '".$idpreventivo."', '".$idarticolo."', '".$idiva."', '".$iva."', '".$iva_indetraibile."', \"".$descrizione."\", '".$prezzo."', '".$um."', '".$qta."', \"".$lotto."\", \"".$serial."\", \"".$altro."\" )");
}
}
/*
Ordine fornitore
*/
else if( $dir=='uscita' ){
}
}
/**
* Questa funzione rimuove un articolo dal ddt data e lo riporta in magazzino
* $idarticolo integer codice dell'articolo da scollegare dall'ordine
* $idordine integer codice dell'ordine da cui scollegare l'articolo
*/
function rimuovi_articolo_dapreventivo( $idarticolo, $idpreventivo, $idriga ){
global $dbo;
global $dir;
//Leggo la quantità di questo articolo nell'ordine
$query = "SELECT qta, subtotale FROM co_righe_preventivi WHERE id='".$idriga."'";
$rs = $dbo->fetchArray($query);
$qta = floatval( $rs[0]['qta'] );
$subtotale = $rs[0]['subtotale'];
//Elimino la riga dall'ordine
$dbo->query("DELETE FROM co_righe_preventivi WHERE id=\"$idriga\"");
}
/**
* 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_preventivo( $idpreventivo, $idrivalsainps='', $idritenutaacconto='', $bolli='' ){
global $dbo;
global $dir;
//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 co_righe_preventivi WHERE idpreventivo='$idpreventivo'";
$rs = $dbo->fetchArray($query);
if( $rs[0]['righe']>0 ){
$totale_imponibile = get_imponibile_preventivo($idpreventivo);
$totale_preventivo = get_totale_preventivo($idpreventivo);
//Leggo la rivalsa inps se c'è (per i ordine di vendita lo leggo dalle impostazioni)
if( $dir=='entrata' ){
if( $idrivalsainps!='0' )
$idrivalsainps = get_var("Percentuale rivalsa INPS");
}
$query = "SELECT percentuale FROM co_rivalsainps WHERE id='".$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='$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( $idritenutaacconto!='0' ){
if( $dir=='entrata' ){
$idritenutaacconto = get_var("Percentuale ritenuta d'acconto");
}
}
$query = "SELECT percentuale FROM co_ritenutaacconto WHERE id='".$idritenutaacconto."'";
$rs = $dbo->fetchArray($query);
$ritenutaacconto = $totale_preventivo/100*$rs[0]['percentuale'];
$netto_a_pagare = $totale_preventivo-$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' ){
}
else{
$bolli = str_replace( ",", ".", get_var("Importo marca da bollo") );
if( abs($bolli)>0 && abs($netto_a_pagare)>abs(get_var("Soglia minima per l'applicazione della marca da bollo")) )
$marca_da_bollo = str_replace( ",", ".", $bolli );
else
$marca_da_bollo = 0.00;
//Se l'importo è negativo può essere una nota di accredito, quindi cambio segno alla marca da bollo
if( $netto_a_pagare<0 )
$marca_da_bollo *= -1;
}
//$dbo->query("UPDATE or_ordini SET ritenutaacconto='$ritenutaacconto', bollo='$marca_da_bollo' WHERE id='$idordine'");
}
else{
//$dbo->query("UPDATE or_ordini SET ritenutaacconto='0', bollo='0', sconto='0', rivalsainps='0' WHERE id='$idordine'");
}
}
/**
* Restituisce lo stato dell'ordine in base alle righe
*/
function get_stato_preventivo( $idpreventivo ){
global $dbo;
$rs = $dbo->fetchArray("SELECT SUM(qta) AS qta, SUM(qta_evasa) AS qta_evasa FROM co_righe_preventivi GROUP BY idpreventivo HAVING idpreventivo='".$idpreventivo."'");
if( $rs[0]['qta_evasa'] > 0 ){
if( $rs[0]['qta'] > $rs[0]['qta_evasa'] )
return "Parzialmente evaso";
else if( $rs[0]['qta'] == $rs[0]['qta_evasa'] )
return "Evaso";
}
else
return "Non evaso";
}
/**
* Aggiorna il budget del preventivo leggendo tutte le righe inserite
*/
function update_budget_preventivo( $idpreventivo ){
global $dbo;
//Totale articoli
$rs = $dbo->fetchArray("SELECT SUM(subtotale) AS totale FROM co_righe_preventivi GROUP BY idpreventivo HAVING idpreventivo=\"".$idpreventivo."\"");
$totale_articoli = $rs[0]['totale'];
//Totale costo ore, km e diritto di chiamata
$rs = $dbo->fetchArray("SELECT SUM(costo_orario*ore_lavoro + costo_diritto_chiamata) AS totale FROM co_preventivi GROUP BY id HAVING id=\"".$idpreventivo."\"");
$totale_lavoro = $rs[0]['totale'];
//Aggiorno il budget su co_preventivi
$dbo->query("UPDATE co_preventivi SET budget=\"".($totale_articoli + $totale_lavoro)."\" WHERE id=\"".$idpreventivo."\"");
}
/**
* 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
* $iddocumento int ID della fattura
* $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_fattura( $iddocumento, $idrivalsainps='', $idritenutaacconto='', $bolli='' ){
global $dbo;
global $dir;
$dir='entrata';
//Se ci sono righe in fattura faccio i conteggi, altrimenti azzero gli sconti e le spese aggiuntive (inps, ritenuta, marche da bollo)
$query = "SELECT COUNT(id) AS righe FROM co_righe_documenti WHERE iddocumento='$iddocumento'";
$rs = $dbo->fetchArray($query);
if( $rs[0]['righe']>0 ){
$totale_imponibile = get_imponibile_fattura($iddocumento);
$totale_fattura = get_totale_fattura($iddocumento);
//Leggo gli id dei costi aggiuntivi
if( $dir=='uscita' ){
$query2 = "SELECT bollo FROM co_documenti WHERE id='$iddocumento'";
$rs2 = $dbo->fetchArray($query2);
$bollo = $rs2[0]['bollo'];
}
$query = "SELECT SUM(rivalsainps) AS rivalsainps, SUM(ritenutaacconto) AS ritenutaacconto FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='".$iddocumento."'";
$rs = $dbo->fetchArray($query);
$rivalsainps = $rs[0]['rivalsainps'];
$ritenutaacconto = $rs[0]['ritenutaacconto'];
if( $dir == "entrata" ){
//Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
$qi = "SELECT percentuale FROM co_iva WHERE id='".get_var("Iva predefinita")."'";
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps = $rivalsainps/100*$rsi[0]['percentuale'];
}
else{
//Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
$qi = "SELECT percentuale FROM co_iva WHERE id='".get_var("Iva predefinita")."'";
$rsi = $dbo->fetchArray($qi);
$iva_rivalsainps = $rivalsainps/100*$rsi[0]['percentuale'];
}
//Leggo la ritenuta d'acconto se c'è
$totale_fattura = get_totale_fattura($iddocumento);
$query = "SELECT percentuale FROM co_ritenutaacconto WHERE id='".$idritenutaacconto."'";
$rs = $dbo->fetchArray($query);
$netto_a_pagare = $totale_fattura - $ritenutaacconto;
//Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
$bolli = str_replace( ",", ".", $bolli);
$bolli = floatval($bolli);
//gestione marca da bollo
$query = "SELECT marca_bollo , ges_marca FROM co_tipidocumento LEFT JOIN co_documenti ON co_tipidocumento.id=co_documenti.idtipodocumento WHERE co_documenti.id='".$iddocumento."'";
$rs_marca = $dbo->fetchArray($query);
$val_bollo=$rs_marca[0]['marca_bollo'];
$ges_bollo=$rs_marca[0]['ges_marca'];
if( $dir=='uscita' ){
if( $bolli!=0.00 ){
$bolli = str_replace( ",", ".", $bolli );
if( abs($bolli)>0 && abs($netto_a_pagare>$ges_bollo) )
$marca_da_bollo = str_replace( ",", ".", $bolli );
else
$marca_da_bollo = 0.00;
}
}
else{
$bolli = str_replace( ",", ".", $val_bollo );
if( abs($bolli)>0 && abs($netto_a_pagare)>abs($ges_bollo) )
$marca_da_bollo = str_replace( ",", ".", $bolli );
else
$marca_da_bollo = 0.00;
//Se l'importo è negativo può essere una nota di accredito, quindi cambio segno alla marca da bollo
if( $netto_a_pagare<0 )
$marca_da_bollo *= -1;
}
$dbo->query("UPDATE co_documenti SET ritenutaacconto='$ritenutaacconto', rivalsainps='".$rivalsainps."', iva_rivalsainps='".$iva_rivalsainps."', bollo='$marca_da_bollo' WHERE id='$iddocumento'");
}
else{
$dbo->query("UPDATE co_documenti SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id='$iddocumento'");
}
}
?>