diff --git a/modules/fatture/crea_documento.php b/modules/fatture/crea_documento.php index 8ad2234ac..03968f78e 100644 --- a/modules/fatture/crea_documento.php +++ b/modules/fatture/crea_documento.php @@ -73,7 +73,7 @@ echo '

'.str_replace('_NUM_', $numero, $head).'.

'; // Selezione articoli dell'ordine da portare nel ddt -$rs = $dbo->fetchArray('SELECT *, (qta - qta_evasa) AS qta_rimanente FROM '.$table.' INNER JOIN '.$rows.' ON '.$table.'.id='.$rows.'.'.$id.' WHERE '.$table.'.id='.prepare($id_record).' HAVING qta_rimanente > 0'); +$rs = $dbo->fetchArray('SELECT *, (qta - qta_evasa) AS qta_rimanente FROM '.$table.' INNER JOIN '.$rows.' ON '.$table.'.id='.$rows.'.'.$id.' WHERE '.$table.'.id='.prepare($id_record).' HAVING qta_rimanente > 0 ORDER BY `order`'); if (!empty($rs)) { echo ' diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php index 888515988..5d30de6d7 100644 --- a/modules/ordini/actions.php +++ b/modules/ordini/actions.php @@ -352,6 +352,97 @@ switch (post('op')) { } break; + + case 'ordine_da_preventivo': + + $idanagrafica = post('idanagrafica'); + + $data = $post['data']; + + // Leggo se l'ordine è cliente o fornitore + $rs = $dbo->fetchArray('SELECT id FROM or_tipiordine WHERE dir='.prepare($dir)); + $idtipoordine = $rs[0]['id']; + + if (isset($post['idanagrafica'])) { + $numero = get_new_numeroordine($data); + if ($dir == 'entrata') { + $numero_esterno = get_new_numerosecondarioordine($data); + } else { + $numero_esterno = ''; + } + + $campo = ($dir == 'entrata') ? 'idpagamento_vendite' : 'idpagamento_acquisti'; + + // Tipo di pagamento predefinito dall'anagrafica + $query = 'SELECT id FROM co_pagamenti WHERE id=(SELECT '.$campo.' AS pagamento FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica).')'; + $rs = $dbo->fetchArray($query); + $idpagamento = $rs[0]['id']; + + // Se l'ordine è un ordine cliente e non è stato associato un pagamento predefinito al cliente leggo il pagamento dalle impostazioni + if ($dir == 'entrata' && $idpagamento == '') { + $idpagamento = get_var('Tipo di pagamento predefinito'); + } + + $query = 'INSERT INTO or_ordini( numero, numero_esterno, idanagrafica, idtipoordine, idpagamento, data, idstatoordine ) VALUES ( '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($idanagrafica).', '.prepare($idtipoordine).', '.prepare($idpagamento).', '.prepare($data).", (SELECT `id` FROM `or_statiordine` WHERE `descrizione`='Bozza') )"; + $dbo->query($query); + + $id_record = $dbo->lastInsertedID(); + + $_SESSION['infos'][] = tr('Aggiunto ordine numero _NUM_!', [ + '_NUM_' => $numero, + ]); + + + // Lettura di tutte le righe della tabella in arrivo + // Inserisco anche le righe descrittive + foreach ($post['evadere'] as $i => $value) { + // Processo solo le righe da evadere + if ($post['evadere'][$i] == 'on') { + + $descrizione = post('descrizione')[$i]; + $prezzo = post('subtot')[$i]; + $qta = post('qta_da_evadere')[$i]; + $idiva = post('idiva')[$i]; + $um = post('um')[$i]; + $subtot = $prezzo * $qta; + $idarticolo = post('idarticolo')[$i]; + $sconto = post('sconto')[$i]; + + // Ottengo le informazioni sullo sconto + $qprc = 'SELECT tipo_sconto, sconto_unitario FROM co_righe_preventivi WHERE id='.prepare($i); + $rsprc = $dbo->fetchArray($qprc); + + $sconto_unitario = $rsprc[0]['sconto_unitario']; + $tipo_sconto = $rsprc[0]['tipo_sconto']; + + $sconto = $sconto * $qta; + + // Calcolo iva + $query = 'SELECT descrizione, percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva); + $rs = $dbo->fetchArray($query); + $iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale']; + $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; + + $query = 'INSERT INTO or_righe_ordini(idordine, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, is_descrizione, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine='.prepare($id_record).'))'; + $dbo->query($query); + + + } + + + } + + // Ricalcolo inps, ritenuta e bollo + if ($dir == 'entrata') { + ricalcola_costiagg_ordine($id_record); + } else { + ricalcola_costiagg_ordine($id_record); + } + + + } + + break; } if (post('op') !== null && post('op') != 'update') { diff --git a/modules/ordini/crea_documento.php b/modules/ordini/crea_documento.php new file mode 100644 index 000000000..88ba1b937 --- /dev/null +++ b/modules/ordini/crea_documento.php @@ -0,0 +1,269 @@ + [ + 'table' => 'co_preventivi', + 'rows' => 'co_righe_preventivi', + 'id' => 'idpreventivo', + 'condition' => '', + ] +]; + +$documento = get('documento'); + +$pos = 'preventivo'; +$op = 'ordine_da_preventivo'; + +$head = tr('Preventivo numero _NUM_'); + + +$table = $data[$pos]['table']; +$rows = $data[$pos]['rows']; +$id = $data[$pos]['id']; +$row = str_replace('id', 'id_riga_', $id); + +$module_name = "Ordini cliente"; + +$op = !empty($get['op']) ? $get['op'] : $op; + +$button = tr('Crea ordine'); +$button = !empty($get['op']) ? tr('Aggiungi') : $button; + +// Info documento +$rs = $dbo->fetchArray('SELECT * FROM '.$table.' WHERE id='.prepare($id_record)); +$numero = !empty($rs[0]['numero_esterno']) ? $rs[0]['numero_esterno'] : $rs[0]['numero']; +$idanagrafica = $rs[0]['idanagrafica']; +$idpagamento = $rs[0]['idpagamento']; +$idconto = $rs[0]['idconto']; + +/* + Form di inserimento riga documento +*/ +echo ' +

'.str_replace('_NUM_', $numero, $head).'.

'; + + +// Selezione articoli del preventivo da copiare nell'ordine, usando l'ordinamento scelto dall'utente +$rs = $dbo->fetchArray('SELECT * FROM '.$table.' INNER JOIN '.$rows.' ON '.$table.'.id='.$rows.'.'.$id.' WHERE '.$table.'.id='.prepare($id_record).' ORDER BY `order`'); + +if (!empty($rs)) { + echo ' +

'.tr('Seleziona le righe e le relative quantità da inserire nell\'ordine.').'.

+ +
+ + + + + + + + + +
+ +
+ {[ "type": "date", "label": "'.tr('Data del documento').'", "name": "data", "required": 1, "value": "-now-" ]} +
+
+ +
+
+ + + + + + + + + '; + + $totale = 0.00; + + foreach ($rs as $i => $r) { + // Descrizione + echo ' + + '; + + if ($r['is_descrizione']) continue; + + // Q.tà rimanente + echo ' + '; + + // Q.tà da evadere + echo ' + '; + + // Subtotale + $subtotale = $r['subtotale'] / $r['qta'] * ($r['qta']); + $sconto = $r['sconto'] / $r['qta'] * ($r['qta']); + $iva = $r['iva'] / $r['qta'] * ($r['qta']); + + echo ' + '; + + // Seriali + echo ' + + '; + + $totale += $subtotale - $sconto + $iva; + } + + // Totale + echo ' + + + + +
'.tr('Descrizione').''.tr('Q.tà').''.tr('Q.tà da evadere').''.tr('Subtot.').''.tr('Seriali').'
+ + + + '; + + // Checkbox - da evadere? + echo ' + '; + + echo nl2br($r['descrizione']); + + echo ' + + + +

'.Translator::numberToLocale($r['qta']).'

+
+ {[ "type": "number", "name": "qta_da_evadere['.$r['id'].']", "id": "qta_'.$i.'", "required": 1, "value": "'.$r['qta'].'", "extra" : "onkeyup=\"ricalcola_subtotale_riga('.$i.');\"", "decimals": "qta", "min-value": "0" ]} + + + + + + + '.Translator::numberToLocale($subtotale - $sconto + $iva).' €
+ + '.Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva).' +
'; + if (!empty($r['abilita_serial'])) { + $values = $dbo->fetchArray('SELECT DISTINCT serial FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$row.' = \''.$r['id'].'\' AND serial IS NOT NULL AND serial NOT IN (SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND dir=\''.$dir.'\' AND '.$data[$pos]['condition'].')'); + + echo ' + {[ "type": "select", "name": "serial['.$i.']['.$r['id'].']", "id": "serial_'.$i.'", "multiple": 1, "values": "query=SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$row.' = \''.$r['id'].'\' AND serial IS NOT NULL AND serial NOT IN (SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND dir=\''.$dir.'\' AND '.$data[$pos]['condition'].')", "value": "'.implode(',', array_column($values, 'serial')).'", "extra": "data-maximum=\"'.intval($r['qta_rimanente']).'\"" ]} + '; + } else { + echo '-'; + } + echo ' +
+ '.tr('Totale').': + + '.Translator::numberToLocale($totale).' € +
'; + + echo ' + + +
+
+ +
+
+
'; +} else { + echo ' +

'.tr('Non ci sono articoli da evadere').'...

'; +} + +echo ' + '; + +?> + + diff --git a/modules/preventivi/buttons.php b/modules/preventivi/buttons.php new file mode 100644 index 000000000..cc0e35d8c --- /dev/null +++ b/modules/preventivi/buttons.php @@ -0,0 +1,26 @@ + + + + '; + + +} \ No newline at end of file diff --git a/modules/preventivi/edit.php b/modules/preventivi/edit.php index 22c9a0290..ca97334ac 100644 --- a/modules/preventivi/edit.php +++ b/modules/preventivi/edit.php @@ -134,11 +134,11 @@ $_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica']; - + - + - +