fetchArray($query); return intval($rs[0]['max_numeroddt']) + 1; } /** * Funzione per calcolare il numero secondario successivo utilizzando la maschera dalle impostazioni. */ function get_new_numerosecondarioddt($data) { global $dbo; global $dir; $query = "SELECT numero_esterno FROM dt_ddt WHERE DATE_FORMAT( data, '%Y' ) = '".date('Y', strtotime($data))."' AND idtipoddt IN(SELECT id FROM dt_tipiddt 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 ddt'); 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; } /** * 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. */ function rimuovi_articolo_daddt($idarticolo, $idddt, $idrigaddt) { global $dbo; global $dir; // Leggo la quantità di questo articolo in ddt $query = 'SELECT idgruppo, qta, subtotale FROM dt_righe_ddt WHERE id='.prepare($idrigaddt); $rs = $dbo->fetchArray($query); $qta = floatval($rs[0]['qta']); $subtotale = $rs[0]['subtotale']; $idgruppo = $rs[0]['idgruppo']; // Leggo l'idordine $query = 'SELECT idordine FROM dt_righe_ddt WHERE id='.prepare($idrigaddt); $rs = $dbo->fetchArray($query); $idordine = $rs[0]['idordine']; if ($dir == 'uscita') { $non_rimovibili = $dbo->fetchArray("SELECT COUNT(*) AS non_rimovibili FROM dt_righe_ddt WHERE serial IN (SELECT serial FROM vw_serials WHERE dir = 'entrata') AND idgruppo=".prepare($idgruppo).' AND idddt='.prepare($idddt))[0]['non_rimovibili']; if ($non_rimovibili != 0) { return false; } } // 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 $dbo->query('DELETE FROM `dt_righe_ddt` WHERE idgruppo='.prepare($idgruppo)); return true; } /** * Calcolo imponibile ddt (totale_righe - sconto). */ function get_imponibile_ddt($idddt) { global $dbo; $query = "SELECT SUM(subtotale-sconto) AS imponibile FROM dt_righe_ddt GROUP BY idddt HAVING idddt='".$idddt."'"; $rs = $dbo->fetchArray($query); return $rs[0]['imponibile']; } /** * Calcolo totale ddt (imponibile + iva). */ function get_totale_ddt($idddt) { global $dbo; // Sommo l'iva di ogni riga al totale $query = "SELECT SUM(iva) AS iva FROM dt_righe_ddt GROUP BY idddt HAVING idddt='".$idddt."'"; $rs = $dbo->fetchArray($query); // Aggiungo la rivalsa inps se c'è $query2 = "SELECT rivalsainps FROM dt_ddt WHERE id='".$idddt."'"; $rs2 = $dbo->fetchArray($query2); return get_imponibile_ddt($idddt) + $rs[0]['iva'] + $rs2[0]['rivalsainps']; } /** * Calcolo netto a pagare ddt (totale - ritenute - bolli). */ function get_netto_ddt($idddt) { global $dbo; $query = "SELECT ritenutaacconto,bollo FROM dt_ddt WHERE id='".$idddt."'"; $rs = $dbo->fetchArray($query); return get_totale_ddt($idddt) - $rs[0]['ritenutaacconto'] + $rs[0]['bollo']; } /** * Calcolo iva detraibile ddt. */ function get_ivadetraibile_ddt($idddt) { global $dbo; $query = "SELECT SUM(iva)-SUM(iva_indetraibile) AS iva_detraibile FROM dt_righe_ddt GROUP BY idddt HAVING idddt='".$idddt."'"; $rs = $dbo->fetchArray($query); return $rs[0]['iva_detraibile']; } /** * Calcolo iva indetraibile ddt. */ function get_ivaindetraibile_ddt($idddt) { global $dbo; $query = "SELECT SUM(iva_indetraibile) AS iva_indetraibile FROM dt_righe_ddt GROUP BY idddt HAVING idddt='".$idddt."'"; $rs = $dbo->fetchArray($query); return $rs[0]['iva_indetraibile']; } /** * 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 $dbo; global $dir; // 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)) { $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']; // 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']; // 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') { $idritenutaacconto = get_var("Percentuale ritenuta d'acconto"); } } $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); 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 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à). */ function add_articolo_inddt($idddt, $idarticolo, $descrizione, $idiva, $qta, $prezzo, $sconto = 0, $sconto_unitario = 0, $tipo_sconto = 'UNT', $lotto = '', $serial = '', $altro = '', $idgruppo = 0) { 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']; // Lettura unità di misura dell'articolo if (empty($idum)) { $query = 'SELECT um FROM mg_articoli WHERE id='.prepare($idarticolo); $rs = $dbo->fetchArray($query); $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)); $qta_in = !empty($rsart[0]['abilita_serial']) ? $qta : 1; for ($i = 0; $i < $qta_in; ++$i) { /* $iva = $iva / $qta_in; $qta = $qta / $qta_in; $ubtotale = $subtotale / $qta_in; $sconto = $sconto / $qta_in; $iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile']; */ $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, serial, um, idgruppo, `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($serial).', '.prepare($um).', '.prepare($idgruppo).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($idddt).'))'); } $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]); } } return $idriga; }