$v) $cliente[$k] = addslashes($v); if(!$cliente[codice]){ $codice = db_qrs("SELECT ifNull(MAX(codice) + 1, 1) as numero FROM $DATI[db_invoicex].clie_forn"); $cliente[codice] = $codice; } else { $codice = $cliente[codice]; $esiste = db_qrs("SELECT codice FROM $DATI[db_invoicex].clie_forn WHERE codice = '" . $cliente[codice] . "'"); if($esiste and !$aggiorna) return "cliente_esistente"; } if($esiste){ $sql = "UPDATE $DATI[db_invoicex].clie_forn SET "; foreach($cliente as $chiave => $valore){ if($chiave != "codice") $update .= $update ? ", $chiave = '$valore'" : "$chiave = '$valore'"; } $sql .= $update; $sql .= " WHERE codice = '$codice'"; } else { $sql_chiavi = array_keys($cliente); $sql_valori = array_values($cliente); $sql = "INSERT INTO $DATI[db_invoicex].clie_forn (" . implode(", ", $sql_chiavi) . ") VALUES ('" . implode("', '", $sql_valori) . "')"; } db_q($sql); return $codice; } function calcola_totale_righe($righe, $codice_iva = 22){ global $DATI; $totale = 0; $timpo = 0; $tiva = 0; foreach($righe as $k => $riga){ $codice_iva = $riga["iva"] ? $riga["iva"] : $codice_iva; $sqliva = "SELECT percentuale FROM $DATI[db_invoicex].codici_iva WHERE codice = '$codice_iva'"; $iva = db_qrs($sqliva); $qta = $riga["quantita"] ? $riga["quantita"] : 1; $rtot = round($qta * $riga["prezzo_unitario"], 2); $riva = round(($rtot * $iva) / (100 + $iva),2); $rimp = $rtot - $riva; $totale += $rtot; $timpo += $rimp; $tiva += $riva; } return array("imponibile" => $timpo, "iva" => $tiva, "totale" => $totale); } function indi_genera_fattura_invoicex($righe, $pagamento, $cliente, $iva = 22, $serie = "", $data_forzata = null, $agente = "0", $provvigione = 0, $prezzi_ivati = "S") { global $DATI; if(!$DATI[db_invoicex]) return "Impossibile trovare database"; // Salvataggio cliente if(is_array($cliente)) $codCliente = indi_salva_cliente_invoicex($cliente); else $codCliente = $cliente; $notePagamento = db_qrs("SELECT note_su_documenti FROM $DATI[db_invoicex].pagamenti WHERE codice = '$pagamento'"); // Estremi documento $data = $data_forzata ? $data_forzata : date("Y-m-d"); $anno = date("Y", strtotime($data)); $numero = db_qrs("SELECT ifNull(MAX(numero) + 1, 1) as numero FROM $DATI[db_invoicex].test_fatt WHERE anno = '$anno' AND serie = '$serie'"); // Totali di fattura $totale = calcola_totale_righe($righe, $iva); // Inserisco la testata di fattura $sqlt = "INSERT INTO $DATI[db_invoicex].test_fatt SET serie = '$serie', numero = '$numero', anno = '$anno', cliente = '$codCliente', old_cliente_destinazione = '0', id_cliente_destinazione = '0', data = '$data', pagamento = '$pagamento', banca_abi = '', banca_cab = '', note = '', totale_imponibile = '" . number_format($totale["imponibile"], 2, ".", "") . "', totale_iva = '" . number_format($totale["iva"], 2, ".", "") . "', totale = '" . number_format($totale["totale"], 2, ".", "") . "', sconto1 = '" . number_format(0, 2, ".", "") . "', sconto2 = '" . number_format(0, 2, ".", "") . "', sconto3 = '" . number_format(0, 2, ".", "") . "', riferimento = '', codice_listino = '1', spese_trasporto = '" . number_format(0, 2, ".", "") . "', spese_incasso = '" . number_format(0, 2, ".", "") . "', dest_ragione_sociale = '', dest_indirizzo = '', dest_cap = '', dest_localita = '', dest_provincia = '', dest_telefono = '', dest_cellulare = '', tipo_fattura = '1', aspetto_esteriore_beni = '', numero_colli = '', peso_lordo = '', peso_netto = '', vettore1 = '', porto = '', causale_trasporto = '', mezzo_consegna = '', opzione_riba_dest_diversa = 'N', note_pagamento = '$notePagamento', agente_codice = '$agente', agente_percentuale = '" . number_format($provvigione, 2, ".", "") . "', giorno_pagamento = '0', banca_iban = '', dataoraddt = '" . date("d/m/Y H:i") . "', dest_paese = '', ritenuta = '0', totale_ritenuta = '" . number_format(0, 2, ".", "") . "', totale_da_pagare = '" . number_format($totale["totale"], 2, ".", "") . "', totaleRivalsa = '" . number_format(0, 2, ".", "") . "', fornitore = '0', marca_da_bollo = '" . number_format(0, 2, ".", "") . "', prezzi_ivati = '$prezzi_ivati', totale_imponibile_pre_sconto = '" . number_format($imponibile, 2, ".", "") . "', totale_ivato_pre_sconto = '" . number_format($totale["totale"], 2, ".", "") . "'"; $res_testa = db_q($sqlt); if($res_testa){ $id_fattura_testa = db_qrs("SELECT LAST_INSERT_ID()"); // Inizio inserimento righe $numRiga = 0; foreach($righe as $r => $riga){ $numRiga++; $iva = $riga[iva] ? $riga[iva] : $iva; $sqliva = "SELECT * FROM $DATI[db_invoicex].codici_iva WHERE codice = '$iva'"; $iva = db_qr($sqliva); $qta = $riga[quantita] ? $riga[quantita] : 1; $isdescrizione = $riga[is_descrizione] ? 'S' : 'N'; $prezzo_unitario_imponibile = round(100 * $riga[prezzo_unitario] / (100 + $iva[percentuale]), 5); $prezzo_unitario_ivato = round($riga[prezzo_unitario], 2); $rtot = round($qta * $riga[prezzo_unitario], 2); $riva = round(($rtot * $iva[percentuale]) / (100 + $iva[percentuale]),2); $rimp = $rtot - $riva; $codice_art = $riga['codice_articolo']; $descrizione = $riga['descrizione']; $qta = $riga['quantita']; $totImponibile += $rimp; $totIva += $riva; $totFattura += $rtot; // Inserimento della riga $sqlr = "INSERT INTO $DATI[db_invoicex].righ_fatt SET serie = '$serie', numero = '$numero', anno = '$anno', riga = '$numRiga', codice_articolo = '" . addslashes($codice_art) . "', descrizione = '" . addslashes($descrizione) . "', um = '', quantita = '" . number_format($qta, 2, ".", "") . "', iva = '" . $iva[codice] . "', sconto1 = '" . number_format(0, 2, ".", "") . "', sconto2 = '" . number_format(0, 2, ".", "") . "', stato = 'P', id_padre = '" . $id_fattura_testa . "', flag_ritenuta = 'S', provvigione = '" . number_format($provvigione, 2, ".", "") . "', arrotondamento_parametro = '0', arrotondamento_tipo = 'Inf.', prezzo = '" . number_format($prezzo_unitario_imponibile, 5, ".", "") . "', prezzo_ivato = '" . number_format($prezzo_unitario_ivato, 2, ".", "") . "', totale_imponibile = '" . number_format($rimp, 2, ".", "") . "', totale_ivato = '" . number_format($rtot, 2, ".", "") . "', is_descrizione = '$isdescrizione'"; if($riga[righe_personalizzazione]) { foreach($riga[righe_personalizzazione] as $campo => $valore){ $sqlr .= ", $campo = '$valore'"; } } $res_righe = db_q($sqlr); if(!$res_righe){ // cancello fattura e ritorno errore db_q("DELETE FROM righ_fatt WHERE id_padre = '$id_fattura_testa'"); db_q("DELETE FROM test_fatt WHERE id = '$id_fattura_testa'"); return "Errore in fase di inserimento righe"; } else { // Aggiorno totali fattura $sqlut = "UPDATE $DATI[db_invoicex].test_fatt SET totale_imponibile = '$totImponibile', totale_iva = '$totIva', totale = '$totFattura', totale_da_pagare = '$totFattura', totale_imponibile_pre_sconto = '$totImponibile', totale_ivato_pre_sconto = '$totFattura' WHERE id = '$id_fattura_testa'"; db_q($sqlut); } } } else { return "Errore nell'inserimento della testata"; } indi_genera_scadenze_invoicex($id_fattura_testa); if($agente) indi_genera_provvigioni_invoicex($id_fattura_testa); $informazioniCliente = db_qr("SELECT * FROM $DATI[db_invoicex].clie_forn WHERE codice = '" . addslashes($codCliente) . "'"); if($informazioniCliente["email_pec"] || $informazioniCliente["xmlpa_codice_dest"]){ db_q(" INSERT INTO $DATI[db_invoicex].test_fatt_xmlpa SET id_fattura = '" . addslashes($id_fattura_testa) . "', dt_codice_dest = '" . addslashes($informazioniCliente["xmlpa_codice_dest"] ? $informazioniCliente["xmlpa_codice_dest"] : "") . "', dt_pec_dest = '" . addslashes($informazioniCliente["email_pec"] ? $informazioniCliente["email_pec"] : "") . "'"); } return $id_fattura_testa; } function indi_genera_provvigioni_invoicex($id_fattura){ global $DATI; //cecca / test per nuova procedura in invoicex (aggancio a Invoicex.jar) $invoicexGeneraProvvigioni = "invoicexGeneraProvvigioni"; if (function_exists($invoicexGeneraProvvigioni)) { //chiamo la funzione che richiama Invoicex.jar mail("mceccarelli@demo.tnx.it", "indi_genera_provvigioni_invoicex", $DATI["baseurl"] . "\n\nid_fattura:" . $id_fattura, "From: cecca@tnx.it\r\n"); $ret = $invoicexGeneraProvvigioni($id_fattura); if (!$ret) { mail("mceccarelli@demo.tnx.it", "problema su generazione provvigioni fattura id $id_fattura", $DATI["baseurl"] . "\n\nret:\n" . print_r($ret, true) . "\n\noutput:\n" . print_r($GLOBALS["invoicex_output"], true), "From: cecca@tnx.it\r\n"); } else { mail("mceccarelli@demo.tnx.it", "generazione provvigioni fattura id $id_fattura", $DATI["baseurl"] . "\n\nret:\n" . print_r($ret, true) . "\n\noutput:\n" . print_r($GLOBALS["invoicex_output"], true), "From: cecca@tnx.it\r\n"); } return $ret; } $TESTA = db_qr("SELECT serie, numero, anno, totale_imponibile, agente_codice, sconto, sconto1 as sc1t, sconto2 as sc2t, sconto3 as sc3t FROM $DATI[db_invoicex].test_fatt WHERE id = '$id_fattura'"); $RIGHE = db_qa("SELECT quantita, prezzo, sconto1, sconto2, provvigione FROM $DATI[db_invoicex].righ_fatt WHERE id_padre = '$id_fattura'"); //test per id_doc $col_id_doc = db_qa("SHOW COLUMNS FROM $DATI[db_invoicex].scadenze LIKE 'id_doc'"); $col_id_doc_exist = is_array($col_id_doc) ? true : false; $serie = $TESTA[serie]; $numero = $TESTA[numero]; $anno = $TESTA[anno]; if (!$col_id_doc_exist) { $sql = "SELECT data_scadenza FROM $DATI[db_invoicex].scadenze WHERE documento_tipo = 'FA' AND documento_serie = '$serie' AND documento_numero = '$numero' AND documento_anno = '$anno'"; } else { $sql = "SELECT data_scadenza, id FROM $DATI[db_invoicex].scadenze WHERE documento_tipo = 'FA' AND id_doc = '$id_fattura'"; } $SCAD = db_qa($sql); $TOT = count($SCAD); foreach($RIGHE as $ROW) { $tot_riga = $ROW["quantita"] * $ROW["prezzo"]; $tot_riga = $tot_riga - ($tot_riga / 100 * $ROW["sconto1"]); $tot_riga = $tot_riga - ($tot_riga / 100 * $ROW["sconto2"]); $tot_riga = $tot_riga - ($tot_riga / 100 * $TESTA["sc1t"]); $tot_riga = $tot_riga - ($tot_riga / 100 * $TESTA["sc2t"]); $tot_riga = $tot_riga - ($tot_riga / 100 * $TESTA["sc3t"]); // tolgo una proporzione in base all'importo riga con il totale(al lordo sconto) dello sconto totale se presente if ($TESTA[sconto] > 0) { //importo_riga : totale_lordo = x : sconto_a_importo -> x = importo_riga * sconto_a_importo / totale_lordo $sconto_proporzionato = $tot_riga * $TESTA[sconto] / ($TESTA[totale_imponibile] + $TESTA[sconto]); $tot_riga -= $sconto_proporzionato; } $importoTotale += $tot_riga; $importoProvvigione += $tot_riga / 100 * $ROW["provvigione"]; } $importoProvvigione = round($importoProvvigione, 2); $importoSingolaProvvigione = round($importoProvvigione / $TOT, 2); foreach($SCAD as $k => $S){ $P = array(); $P[numero] = $k +1; $P[agente_id] = $TESTA[agente_codice]; $P[documento_tipo] = "FA"; if (!$col_id_doc_exist) { $P[documento_serie] = $TESTA[serie]; $P[documento_numero] = $TESTA[numero]; $P[documento_anno] = $TESTA[anno]; } else { $P[id_doc] = $id_fattura; $P[id_scadenza] = $S[id]; } $P[data_scadenza] = $S[data_scadenza]; $P[pagata] = "N"; $P[importo] = $importoTotale; $P[importo_provvigione] = $importoSingolaProvvigione; $totale += $importoSingolaProvvigione; $PROVVIGIONI[] = $P; } if($totale != $importoProvvigione) $PROVVIGIONI[count($PROVVIGIONI) - 1][importo_provvigione] += $importoProvvigione - $totale; foreach($PROVVIGIONI as $PROV){ $sql = "INSERT INTO $DATI[db_invoicex].provvigioni SET "; foreach($PROV as $campo => $valore) $insert[] = "$campo = '$valore'"; $sql .= implode(", ", $insert); db_q($sql); } return true; } function indi_genera_scadenze_invoicex($id_fattura){ global $DATI; $fattura = db_qr("SELECT data, totale_imponibile, totale_iva, numero, serie, anno, pagamento FROM $DATI[db_invoicex].test_fatt WHERE id = '$id_fattura'"); if(!$fattura[pagamento]) return "Scadenze di pagamento non generate perchè vuoto il tipo di pagamento"; $pagamento = db_qr("SELECT * FROM $DATI[db_invoicex].pagamenti WHERE codice = '" . $fattura[pagamento] . "'"); $pagate = $pagamento[flag_pagata]; $fine_mese = $pagamento[FINEMESE] == "S"; $iva30gg = $pagamento[iva30gg] == "S"; $campi_esclusi = array("codice", "descrizione", "coordinate_necessarie", "FINEMESE", "riba", "note_su_documenti", "flag_pagata", "giorno_pagamento", "flag_richiedi_giorno", "id_conto", "codice", "id_pagamento_ipsoa", "iva30gg"); $data_fattura = explode("-", $fattura[data]); //test per id_doc $sql_cols = "SHOW COLUMNS FROM $DATI[db_invoicex].scadenze LIKE 'id_doc'"; $col_id_doc = db_qa($sql_cols); $col_id_doc_exist = is_array($col_id_doc) ? true : false; foreach($pagamento as $giorni => $val){ if(!in_array($giorni , $campi_esclusi) AND $val == "S"){ $giorni_offset = $giorni == "IMMEDIATO" ? 0 : $giorni; $mesi_offset = intval($giorni_offset) / 30; if($fine_mese) $giorno = indi_last_day_of_month($data_fattura[1] + $mesi_offset, $data_fattura[0]); else $giorno = $data_fattura[2]; $timestamp = mktime(0, 0, 0, $data_fattura[1] + $mesi_offset, $giorno, $data_fattura[0]); $data_scadenza = date("Y-m-d", $timestamp); $da_generare[$giorni] = array("data" => $data_scadenza, "pagata" => $pagate); } } $numScadenze = count($da_generare); if($iva30gg AND $pagamento[30] == "S"){ $divisione = doubleval($fattura[totale_imponibile]) / $numScadenze; $totale = $fattura[totale_imponibile]; $divisione = $totale / doubleval($numScadenze); $divisione = round($divisione, 2); foreach($da_generare as $s => $scadenza){ $da_generare[$s][importo] = $divisione; } $quadratura = $totale - round($divisione * ($numScadenze - 1), 2); $da_generare[30][importo] = $quadratura + $fattura[totale_iva]; } else { $totale = $fattura[totale_imponibile] + $fattura[totale_iva]; $divisione = $totale / doubleval($numScadenze); $divisione = round($divisione, 2); foreach($da_generare as $s => $scadenza){ $first = $first ? $first : $s; $da_generare[$s][importo] = $divisione; } $quadratura = $totale - round($divisione * ($numScadenze - 1), 2); $da_generare[$first][importo] = $quadratura; } $serie = $fattura[serie]; $numero = $fattura[numero]; $anno = $fattura[anno]; // Cancello vecchie scadenze $sql = "SELECT id FROM $DATI[db_invoicex].scadenze"; $sql .= " WHERE documento_tipo = 'FA'"; $sql .= " AND documento_serie = '$serie'"; $sql .= " AND documento_numero = '$numero'"; $sql .= " AND documento_anno = '$anno'"; if ($col_id_doc_exist) { $sql = "SELECT id FROM $DATI[db_invoicex].scadenze"; $sql .= " WHERE documento_tipo = 'FA'"; $sql .= " AND id_doc = '$id_fattura'"; } $id_scadenze_precedenti = db_qa($sql); if($id_scadenze_precedenti){ foreach($id_scadenze_precedenti as $k => $ids){ $id = $ids[id]; db_q("DELETE FROM $DATI[db_invoicex].scadenze WHERE id = '$id'"); db_q("DELETE FROM $DATI[db_invoicex].scadenze_parziali WHERE id_scadenza = '$id'"); } } $count = 1; foreach($da_generare as $k => $scadenza){ $sql = "INSERT INTO $DATI[db_invoicex].scadenze SET "; $sql.= "numero = '$count', "; $sql.= "documento_tipo = 'FA', "; if (!$col_id_doc_exist) { $sql.= "documento_serie = '$serie', "; $sql.= "documento_numero = '$numero', "; $sql.= "documento_anno = '$anno', "; } else { $sql.= "id_doc = '$id_fattura', "; } $sql.= "data_scadenza = '" . $scadenza[data] . "', "; $sql.= "pagata = '" . $scadenza[pagata] . "', "; $sql.= "importo = '" . number_format($scadenza[importo], 2, ".", "") . "'"; $res = db_q($sql); $id_scadenza = db_qrs("SELECT LAST_INSERT_ID()"); if($res AND $pagate){ $sql = "INSERT INTO $DATI[db_invoicex].scadenze_parziali SET "; $sql.= "id_scadenza = '$id_scadenza', "; $sql.= "data = '" . $scadenza[data] . "', "; $sql.= "importo = '" . number_format($scadenza[importo], 2, ".", "") . "'"; db_q($sql); } $count++; } } function indi_last_day_of_month($month = null, $year = null){ $month = $month ? intval($month) : intval(date("m")); $year = $year ? $year : date("Y"); $array_31 = array(1, 3, 5, 7, 8, 10, 12); if($month == 2 AND $year % 4 == 0) return 29; if($month == 2) return 28; if(in_array($month, $array_31)) return 31; return 30; } function indi_elimina_fattura($id){ $fattura = db_qr("SELECT * FROM test_fatt WHERE id = '$id'"); $numero = $fattura["numero"]; $anno = $fattura["anno"]; $serie = $fattura["serie"]; // Cancello scadenze $scadenze = db_qa("SELECT * FROM scadenze WHERE documento_tipo = 'FA' AND documento_serie = '$serie' AND documento_anno = '$anno' AND documento_numero = '$numero'"); if($scadenze){ foreach($scadenze as $scadenza){ // Scadenze Parziali: $ids = $scadenza["id"]; db_q("DELETE FROM scadenze_parziali WHERE id_scadenza = '$ids'"); db_q("DELETE FROM scadenze WHERE id = '$ids'"); } } // Cancello movimenti magazzino db_q("DELETE FROM movimenti_magazzino WHERE da_tabella = 'test_fatt' AND da_id = '$id'"); // Cancello provvigioni db_q("DELETE FROM provvigioni WHERE documento_tipo = 'FA' AND documento_serie = '$serie' AND documento_anno = '$anno' AND documento_numero = '$anno'"); // Cancello righe fattura db_q("DELETE FROM righ_fatt WHERE id_padre = '$id'"); // Cancello testata fattura db_q("DELETE FROM test_fatt WHERE id = '$id'"); return true; } ?>