id; flash()->info(tr('Aggiunto preventivo numero _NUM_!', [ '_NUM_' => $preventivo['numero'], ])); break; case 'update': if (isset($id_record)) { $idstato = post('idstato'); $nome = post('nome'); $idanagrafica = post('idanagrafica'); $idagente = post('idagente'); $idreferente = post('idreferente'); $idpagamento = post('idpagamento'); $idporto = post('idporto'); $tempi_consegna = post('tempi_consegna'); $numero = post('numero'); $tipo_sconto = post('tipo_sconto_generico'); $sconto = post('sconto_generico'); // $budget = post('budget'); // $budget = str_replace( ",", ".", $budget ); $data_bozza = post('data_bozza'); $data_accettazione = post('data_accettazione'); $data_rifiuto = post('data_rifiuto'); $data_conclusione = post('data_conclusione'); $esclusioni = post('esclusioni'); $descrizione = post('descrizione'); $validita = post('validita'); $idtipointervento = post('idtipointervento'); // $costo_diritto_chiamata = post('costo_diritto_chiamata'); // $ore_lavoro = str_replace( ",", ".", post('ore_lavoro') ); // $costo_orario = post('costo_orario'); // $costo_km = post('costo_km'); $idiva = post('idiva'); $id_documento_fe = post('id_documento_fe'); $codice_cig = post('codice_cig'); $codice_cup = post('codice_cup'); $query = 'UPDATE co_preventivi SET idstato='.prepare($idstato).','. ' nome='.prepare($nome).','. ' idanagrafica='.prepare($idanagrafica).','. ' idagente='.prepare($idagente).','. ' idreferente='.prepare($idreferente).','. ' idpagamento='.prepare($idpagamento).','. ' idporto='.prepare($idporto).','. ' tempi_consegna='.prepare($tempi_consegna).','. ' numero='.prepare($numero).','. ' data_bozza='.prepare($data_bozza).','. ' data_accettazione='.prepare($data_accettazione).','. ' data_rifiuto='.prepare($data_rifiuto).','. ' data_conclusione='.prepare($data_conclusione).','. ' esclusioni='.prepare($esclusioni).','. ' descrizione='.prepare($descrizione).','. ' tipo_sconto_globale='.prepare($tipo_sconto).','. ' sconto_globale='.prepare($sconto).','. ' id_documento_fe='.prepare($id_documento_fe).','. ' codice_cig='.prepare($codice_cig).','. ' codice_cup='.prepare($codice_cup).','. ' validita='.prepare($validita).','. ' idtipointervento='.prepare($idtipointervento).','. ' idiva='.prepare($idiva).' WHERE id='.prepare($id_record); $dbo->query($query); aggiorna_sconto([ 'parent' => 'co_preventivi', 'row' => 'co_righe_preventivi', ], [ 'parent' => 'id', 'row' => 'idpreventivo', ], $id_record); // update_budget_preventivo( $id_record ); flash()->info(tr('Preventivo modificato correttamente!')); } break; // Duplica preventivo case 'copy': $dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM co_preventivi WHERE id = '.prepare($id_record)); $dbo->query('ALTER TABLE tmp DROP id'); $dbo->query('INSERT INTO co_preventivi SELECT NULL,tmp.* FROM tmp'); $id_record = $dbo->lastInsertedID(); $dbo->query('DROP TEMPORARY TABLE tmp'); // Codice preventivo: calcolo il successivo in base al formato specificato $numeropreventivo_template = setting('Formato codice preventivi'); $numeropreventivo_template = str_replace('#', '%', $numeropreventivo_template); $rs = $dbo->fetchArray('SELECT numero FROM co_preventivi WHERE numero LIKE('.prepare(Util\Generator::complete($numeropreventivo_template)).') ORDER BY numero DESC LIMIT 0,1'); $numero = Util\Generator::generate(setting('Formato codice preventivi'), $rs[0]['numero']); $dbo->query('UPDATE co_preventivi SET idstato=1, numero = '.prepare($numero).', master_revision = id WHERE id='.prepare($id_record)); //copio anche le righe del preventivo $dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM co_righe_preventivi WHERE idpreventivo = '.filter('id_record')); $dbo->query('ALTER TABLE tmp DROP id'); $dbo->query('UPDATE tmp SET idpreventivo = '.prepare($id_record)); $dbo->query('INSERT INTO co_righe_preventivi SELECT NULL,tmp.* FROM tmp'); $dbo->query('DROP TEMPORARY TABLE tmp'); flash()->info(tr('Preventivo duplicato correttamente!')); break; case 'addintervento': if (post('idintervento') !== null) { // Selezione costi da intervento $idintervento = post('idintervento'); $rs = $dbo->fetchArray('SELECT * FROM in_interventi WHERE id='.prepare($idintervento)); $costo_km = $rs[0]['prezzo_km_unitario']; $costo_orario = $rs[0]['prezzo_ore_unitario']; $dbo->update('in_interventi', [ 'id_preventivo' => $id_record, ], ['id' => $idintervento]); // Imposto il preventivo nello stato "In lavorazione" se inizio ad aggiungere interventi $dbo->query("UPDATE `co_preventivi` SET idstato=(SELECT `id` FROM `co_statipreventivi` WHERE `descrizione`='In lavorazione') WHERE `id`=".prepare($id_record)); flash()->info(tr('Intervento _NUM_ aggiunto!', [ '_NUM_' => $rs[0]['codice'], ])); } break; // Scollegamento articolo da ordine case 'unlink_articolo': if (post('idriga') !== null) { $idriga = post('idriga'); $idarticolo = post('idarticolo'); // Leggo la quantità di questo articolo nell'ordine $query = 'SELECT qta, subtotale FROM co_righe_preventivi WHERE id='.prepare($idriga); $rs = $dbo->fetchArray($query); $qta = floatval($rs[0]['qta']); $subtotale = $rs[0]['subtotale']; // Elimino la riga dal preventivo $dbo->query('DELETE FROM co_righe_preventivi WHERE id='.prepare($idriga)); flash()->info(tr('Riga rimossa!')); } break; // Scollegamento intervento da preventivo case 'unlink': if (isset($_GET['idpreventivo']) && isset($_GET['idintervento'])) { $idintervento = get('idintervento'); $dbo->update('in_interventi', [ 'id_preventivo' => null, ], ['id' => $idintervento]); flash()->info(tr('Intervento _NUM_ rimosso!', [ '_NUM_' => $idintervento, ])); } break; // eliminazione preventivo case 'delete': $rs_revisioni = $dbo->fetchArray('SELECT master_revision FROM co_preventivi WHERE id='.prepare($id_record)); //Cancello preventivo e revisioni $dbo->query('DELETE FROM co_preventivi WHERE master_revision='.prepare($rs_revisioni[0]['master_revision'])); $dbo->update('in_interventi', [ 'id_preventivo' => null, ], ['id_preventivo' => $id_record]); flash()->info(tr('Preventivo eliminato!')); break; // Aggiungo una riga al preventivo case 'addriga': $idarticolo = post('idarticolo'); $idiva = post('idiva'); $descrizione = post('descrizione'); $qta = post('qta'); $prezzo = post('prezzo'); $prezzo_acquisto = post('prezzo_acquisto'); // Calcolo dello sconto $sconto_unitario = post('sconto'); $tipo_sconto = post('tipo_sconto'); $sconto = calcola_sconto([ 'sconto' => $sconto_unitario, 'prezzo' => $prezzo, 'tipo' => $tipo_sconto, 'qta' => $qta, ]); $subtot = $prezzo * $qta; $um = post('um'); // Lettura iva dell'articolo $rs2 = $dbo->fetchArray('SELECT descrizione, percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva)); $iva = ($subtot - $sconto) / 100 * $rs2[0]['percentuale']; $iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile']; $dbo->query('INSERT INTO co_righe_preventivi(idpreventivo, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, prezzo_unitario_acquisto, subtotale, um, qta, sconto, sconto_unitario, tipo_sconto, is_descrizione, `order`) VALUES ('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs2[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo_acquisto).', '.prepare($subtot).', '.prepare($um).', '.prepare($qta).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_preventivi AS t WHERE idpreventivo='.prepare($id_record).'))'); // Messaggi informativi if (!empty($idarticolo)) { flash()->info(tr('Articolo aggiunto!')); } elseif (!empty($qta)) { flash()->info(tr('Riga aggiunta!')); } else { flash()->info(tr('Riga descrittiva aggiunta!')); } break; case 'editriga': $idriga = post('idriga'); $descrizione = post('descrizione'); $idarticolo = post('idarticolo'); //Info riga Preventivo $rs = $dbo->fetchArray('SELECT * FROM co_righe_preventivi WHERE id='.prepare($idriga)); $is_descrizione = $rs[0]['is_descrizione']; $qta = post('qta'); $prezzo = post('prezzo'); $prezzo_acquisto = post('prezzo_acquisto'); $subtot = $prezzo * $qta; // Calcolo dello sconto $sconto_unitario = post('sconto'); $tipo_sconto = post('tipo_sconto'); $sconto = calcola_sconto([ 'sconto' => $sconto_unitario, 'prezzo' => $prezzo, 'tipo' => $tipo_sconto, 'qta' => $qta, ]); $idiva = post('idiva'); $um = post('um'); // Calcolo iva $rs2 = $dbo->fetchArray('SELECT descrizione, percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva)); $iva = ($subtot - $sconto) / 100 * $rs2[0]['percentuale']; $iva_indetraibile = $iva / 100 * $rs2[0]['indetraibile']; $desc_iva = $rs2[0]['descrizione']; if ($is_descrizione == 0) { // Modifica riga generica sul documento $query = 'UPDATE co_righe_preventivi SET idarticolo='.prepare($idarticolo).', idiva='.prepare($idiva).', desc_iva='.prepare($desc_iva).', iva='.prepare($iva).', iva_indetraibile='.prepare($iva_indetraibile).', descrizione='.prepare($descrizione).', prezzo_unitario_acquisto='.prepare($prezzo_acquisto).',subtotale='.prepare($subtot).', sconto='.prepare($sconto).', sconto_unitario='.prepare($sconto_unitario).', tipo_sconto='.prepare($tipo_sconto).', um='.prepare($um).', qta='.prepare($qta).' WHERE id='.prepare($idriga); } else { $query = 'UPDATE co_righe_preventivi SET descrizione='.prepare($descrizione).' WHERE id='.prepare($idriga); } $dbo->query($query); flash()->info('Riga modificata!'); break; case 'update_position': $orders = explode(',', $_POST['order']); $order = 0; foreach ($orders as $idriga) { $dbo->query('UPDATE `co_righe_preventivi` SET `order`='.prepare($order).' WHERE id='.prepare($idriga)); ++$order; } break; case 'add_revision': //Copio il preventivo $rs_preventivo = $dbo->fetchArray("SELECT * FROM co_preventivi WHERE id='".$id_record."'"); //Tolgo il flag default_revision da tutte le revisioni e dal record_principale $dbo->query('UPDATE co_preventivi SET default_revision=0 WHERE master_revision='.prepare($rs_preventivo[0]['master_revision'])); $preventivo = [ 'numero' => $rs_preventivo[0]['numero'], 'nome' => $rs_preventivo[0]['nome'], 'idagente' => $rs_preventivo[0]['idagente'], 'data_bozza' => $rs_preventivo[0]['data_bozza'], 'data_accettazione' => $rs_preventivo[0]['data_accettazione'], 'data_rifiuto' => $rs_preventivo[0]['data_rifiuto'], 'data_conclusione' => $rs_preventivo[0]['data_conclusione'], 'data_pagamento' => $rs_preventivo[0]['data_pagamento'], 'budget' => $rs_preventivo[0]['budget'], 'descrizione' => $rs_preventivo[0]['descrizione'], 'idstato' => $rs_preventivo[0]['idstato'], 'validita' => $rs_preventivo[0]['validita'], 'tempi_consegna' => $rs_preventivo[0]['tempi_consegna'], 'idanagrafica' => $rs_preventivo[0]['idanagrafica'], 'esclusioni' => $rs_preventivo[0]['esclusioni'], 'idreferente' => $rs_preventivo[0]['idreferente'], 'idpagamento' => $rs_preventivo[0]['idpagamento'], 'idporto' => $rs_preventivo[0]['idporto'], 'idtipointervento' => $rs_preventivo[0]['idtipointervento'], 'idiva' => $rs_preventivo[0]['idiva'], 'costo_diritto_chiamata' => $rs_preventivo[0]['costo_diritto_chiamata'], 'ore_lavoro' => $rs_preventivo[0]['ore_lavoro'], 'costo_orario' => $rs_preventivo[0]['costo_orario'], 'costo_km' => $rs_preventivo[0]['costo_km'], 'sconto_globale' => $rs_preventivo[0]['sconto_globale'], 'tipo_sconto_globale' => $rs_preventivo[0]['tipo_sconto_globale'], 'master_revision' => $rs_preventivo[0]['master_revision'], 'default_revision' => '1', ]; $dbo->insert('co_preventivi', $preventivo); $id_record_new = $dbo->lastInsertedID(); $rs_righe_preventivo = $dbo->fetchArray('SELECT * FROM co_righe_preventivi WHERE idpreventivo='.prepare($id_record)); for ($i = 0; $i < sizeof($rs_righe_preventivo); ++$i) { $righe_preventivo = [ 'data_evasione' => $rs_righe_preventivo[$i]['data_evasione'], 'idpreventivo' => $id_record_new, 'idarticolo' => $rs_righe_preventivo[$i]['idarticolo'], 'is_descrizione' => $rs_righe_preventivo[$i]['is_descrizione'], 'idiva' => $rs_righe_preventivo[$i]['idiva'], 'desc_iva' => $rs_righe_preventivo[$i]['desc_iva'], 'iva' => $rs_righe_preventivo[$i]['iva'], 'iva_indetraibile' => $rs_righe_preventivo[$i]['iva_indetraibile'], 'descrizione' => $rs_righe_preventivo[$i]['descrizione'], 'subtotale' => $rs_righe_preventivo[$i]['subtotale'], 'sconto' => $rs_righe_preventivo[$i]['sconto'], 'sconto_unitario' => $rs_righe_preventivo[$i]['sconto_unitario'], 'tipo_sconto' => $rs_righe_preventivo[$i]['tipo_sconto'], 'sconto_globale' => $rs_righe_preventivo[$i]['sconto_globale'], 'um' => $rs_righe_preventivo[$i]['um'], 'qta' => $rs_righe_preventivo[$i]['qta'], 'order' => $rs_righe_preventivo[$i]['order'], ]; $dbo->insert('co_righe_preventivi', $righe_preventivo); } $id_record = $id_record_new; flash()->info(tr('Aggiunta nuova revisione!')); break; // Creazione fattura da preventivo case 'fattura_da_preventivo': $preventivo = Preventivo::find($id_record); $tipo = TipoFattura::where('descrizione', 'Fattura immediata di vendita')->first(); $id_segment = $dbo->fetchOne('SELECT * FROM zz_segments WHERE id_module='.prepare($id_module)." AND predefined='1'")['id']; $data = date('Y-m-d'); $fattura = Fattura::build($preventivo->anagrafica, $tipo, $data, $id_segment); $fattura->idpagamento = $preventivo->idpagamento; $id_conto = setting('Conto predefinito fatture di vendita'); $righe = $preventivo->getRighe(); foreach ($righe as $riga) { $copia = $riga->copiaIn($fattura); $copia->idconto = $id_conto; if ($riga->isArticolo()) { $copia->movimenta($copia->qta); } } flash()->info(tr('Creata una nuova fattura!')); $id_record = $fattura->id; $id_module = Modules::get('Fatture di vendita')['id']; break; } if (post('op') !== null && post('op') != 'update') { aggiorna_sconto([ 'parent' => 'co_preventivi', 'row' => 'co_righe_preventivi', ], [ 'parent' => 'id', 'row' => 'idpreventivo', ], $id_record); }