$query="SELECT IFNULL(MAX(numero),'0') AS max_numerofattura FROM co_documenti WHERE DATE_FORMAT( data, '%Y' ) = ".prepare(date('Y',strtotime($data))).' AND idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir='.prepare($dir).') ORDER BY CAST(numero AS UNSIGNED) DESC LIMIT 0, 1';
$query="SELECT numero_esterno FROM co_documenti WHERE DATE_FORMAT( data, '%Y' ) = ".prepare(date('Y',strtotime($data))).' AND idtipodocumento IN(SELECT id FROM co_tipidocumento WHERE dir='.prepare($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');
$query3='SELECT ritenutaacconto, data FROM co_documenti WHERE id='.prepare($iddocumento);
$rs=$dbo->fetchArray($query3);
$data=$rs[0]['data'];
$ritenutaacconto=$rs[0]['ritenutaacconto'];
// Verifico se la fattura è di acquisto o di vendita per scegliere che segno mettere nel totale
$query2='SELECT dir FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
// All'ultimo ciclo imposto come cifra da pagare il totale della fattura meno gli importi già inseriti in scadenziario per evitare di inserire cifre arrotondate "male"
// Verifico se la fattura è di acquisto o di vendita per scegliere che segno mettere nel totale
$query2='SELECT dir FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
$rs2=$dbo->fetchArray($query2);
$dir=$rs2[0]['dir'];
// Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato.
// Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive
for($i=0;$i<sizeof($rs);++$i){
if($rimanente_da_pagare>0){
// ...riempio il pagato della rata con il totale della rata stessa se ho ricevuto un pagamento superiore alla rata stessa
// Imposto i segni + e - in base se la fattura è di acquisto o vendita
if($dir=='uscita'){
$segno_mov1_cliente=-1;
$segno_mov2_ricavivendite=1;
$segno_mov3_iva=1;
$segno_mov4_inps=1;
$segno_mov5_ritenutaacconto=-1;
$segno_mov6_bollo=1;
// Lettura conto fornitore
$query='SELECT idconto_fornitore FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
$rs=$dbo->fetchArray($query);
$idconto_controparte=$rs[0]['idconto_fornitore'];
if($idconto_controparte==''){
$query="SELECT id FROM co_pianodeiconti3 WHERE descrizione='Riepilogativo fornitori'";
$rs=$dbo->fetchArray($query);
$idconto_controparte=$rs[0]['idconto_fornitore'];
}
}else{
$segno_mov1_cliente=1;
$segno_mov2_ricavivendite=-1;
$segno_mov3_iva=-1;
$segno_mov4_inps=-1;
$segno_mov5_ritenutaacconto=1;
$segno_mov6_bollo=-1;
// Lettura conto cliente
$query='SELECT idconto_cliente FROM an_anagrafiche INNER JOIN co_documenti ON an_anagrafiche.idanagrafica=co_documenti.idanagrafica WHERE co_documenti.id='.prepare($iddocumento);
$rs=$dbo->fetchArray($query);
$idconto_controparte=$rs[0]['idconto_cliente'];
if($idconto_controparte==''){
$query="SELECT id FROM co_pianodeiconti3 WHERE descrizione='Riepilogativo clienti'";
$rs=$dbo->fetchArray($query);
$idconto_controparte=$rs[0]['idconto_cliente'];
}
}
// Lettura info fattura
$query='SELECT *, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipodoc` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento);
$rs=$dbo->fetchArray($query);
$n=sizeof($rs);
$data=$rs[0]['data'];
$idanagrafica=$rs[0]['idanagrafica'];
$ragione_sociale=$rs[0]['ragione_sociale'];
$stato=$rs[0]['stato'];
$idconto=$rs[0]['idconto'];
// Scrivo il movimento solo se è stato selezionato un conto
if($idconto!=''){
$idmastrino=get_new_idmastrino();
// Prendo il numero doc. esterno se c'è, altrimenti quello normale
if(!empty($rs[0]['numero_esterno'])){
$numero=$rs[0]['numero_esterno'];
}else{
$numero=$rs[0]['numero'];
}
$descrizione=$rs[0]['descrizione_tipodoc']." numero $numero";
// 2) Aggiungo il totale sul conto dei ricavi/spese scelto
// Lettura descrizione conto ricavi/spese per ogni riga del documento
$righe=$dbo->fetchArray('SELECT idconto, SUM(subtotale - sconto) AS imponibile FROM co_righe_documenti WHERE iddocumento='.prepare($iddocumento).' GROUP BY idconto');
$query='SELECT MAX(idmastrino) AS maxidmastrino FROM co_movimenti';
$rs=$dbo->fetchArray($query);
returnintval($rs[0]['maxidmastrino'])+1;
}
/**
*Calcoloimponibilefattura(totale_righe-sconto).
*/
functionget_imponibile_fattura($iddocumento)
{
global$dbo;
$query='SELECT SUM(co_righe_documenti.subtotale - co_righe_documenti.sconto) AS imponibile FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
$rs=$dbo->fetchArray($query);
return$rs[0]['imponibile'];
}
/**
*Calcolototalefattura(imponibile+iva).
*/
functionget_totale_fattura($iddocumento)
{
global$dbo;
// Sommo l'iva di ogni riga al totale
$query='SELECT SUM(iva) AS iva FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
$rs=$dbo->fetchArray($query);
// Aggiungo la rivalsa inps se c'è
$query2='SELECT rivalsainps FROM co_documenti WHERE id='.prepare($iddocumento);
$rs2=$dbo->fetchArray($query2);
// Leggo l'iva predefinita per calcolare l'iva aggiuntiva sulla rivalsa inps
$qi='SELECT percentuale FROM co_iva WHERE id='.prepare(get_var('Iva predefinita'));
$query='SELECT SUM(iva)-SUM(iva_indetraibile) AS iva_detraibile FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
$rs=$dbo->fetchArray($query);
return$rs[0]['iva_detraibile'];
}
/**
*Calcoloivaindetraibilefattura.
*/
functionget_ivaindetraibile_fattura($iddocumento)
{
global$dbo;
$query='SELECT SUM(iva_indetraibile) AS iva_indetraibile FROM co_righe_documenti GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento);
$query2='SELECT bollo FROM co_documenti WHERE id='.prepare($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='.prepare($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='.prepare(get_var('Iva predefinita'));
$query='SELECT percentuale FROM co_ritenutaacconto WHERE id='.prepare($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);
if($dir=='uscita'){
if($bolli!=0.00){
$bolli=str_replace(',','.',$bolli);
if(abs($bolli)>0&&abs($netto_a_pagare>get_var("Soglia minima per l'applicazione della marca da bollo"))){
$marca_da_bollo=str_replace(',','.',$bolli);
}else{
$marca_da_bollo=0.00;
}
}
}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 co_documenti SET ritenutaacconto='.prepare($ritenutaacconto).', rivalsainps='.prepare($rivalsainps).', iva_rivalsainps='.prepare($iva_rivalsainps).', bollo='.prepare($marca_da_bollo).' WHERE id='.prepare($iddocumento));
}else{
$dbo->query("UPDATE co_documenti SET ritenutaacconto='0', bollo='0', rivalsainps='0', iva_rivalsainps='0' WHERE id=".prepare($iddocumento));
$query='SELECT qta, idintervento, idpreventivo, idordine, idddt, subtotale, descrizione, lotto, serial, altro FROM co_righe_documenti WHERE id='.prepare($idrigadocumento);
// Se l'articolo è stato inserito in fattura tramite un ddt devo sanare la qta_evasa
if(!empty($idddt)){
$dbo->query('UPDATE dt_righe_ddt SET qta_evasa=qta_evasa-'.$qta.' WHERE qta='.prepare($qta).' AND idarticolo='.prepare($idarticolo).' AND idddt='.prepare($idddt).' AND lotto='.prepare($rs[0]['lotto']).' AND serial='.prepare($rs[0]['serial']).' AND altro='.prepare($rs[0]['altro']));
}
// Se l'articolo è stato inserito in fattura tramite un ordine devo sanare la qta_evasa
if(!empty($idordine)){
$dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$qta.' WHERE qta='.prepare($qta).' AND idarticolo='.prepare($idarticolo).' AND idordine='.prepare($idordine));
}
}
if($dir=='uscita'){
// Elimino eventuali articoli caricati in mg_prodotti esclusivamente con la fattura di acquisto
$dbo->query('DELETE FROM `mg_prodotti` WHERE lotto='.prepare($rs[0]['lotto']).' AND serial='.prepare($rs[0]['serial']).' AND altro='.prepare($rs[0]['altro']).' AND id_articolo='.prepare($rs[0]['id_articolo']));
// Elimino i movimenti avvenuti nel magazzino per questo articolo lotto, serial, altro
$dbo->query('DELETE FROM `mg_movimenti` WHERE idarticolo = '.prepare($idarticolo).' AND iddocumento = '.prepare($iddocumento).' AND id = '.prepare($idrigadocumento));
$subtotale=$dbo->fetchArray('SELECT SUM(subtotale - sconto) AS imponibile FROM (SELECT '.$tables['row'].'.subtotale, '.$tables['row'].'.sconto FROM '.$tables['row'].' WHERE '.$fields['row'].'='.prepare($id_record).') AS t')[0]['imponibile'];
// Controllo sul numero di seriali effettivi da rimuovere
$count=$dbo->fetchArray('SELECT COUNT(*) AS tot FROM mg_prodotti WHERE '.$field.'='.prepare($id_riga))[0]['tot'];
if($new_qta<$count){
$deletes=$dbo->fetchArray("SELECT id FROM mg_prodotti WHERE serial NOT IN (SELECT serial FROM mg_prodotti WHERE dir = 'entrata' AND ".$field.'!='.prepare($id_riga).') AND '.$field.'='.prepare($id_riga).' ORDER BY serial DESC LIMIT '.abs($count-$new_qta));
// Rimozione
foreach($deletesas$delete){
$dbo->query('DELETE FROM mg_prodotti WHERE id = '.prepare($delete['id']));
$results=$dbo->fetchArray("SELECT serial FROM mg_prodotti WHERE serial IN (SELECT serial FROM mg_prodotti WHERE dir = 'entrata') AND ".$field.'='.prepare($id_riga));