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'"); } } ?>