diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4dd496b95..d5a5e47a5 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -40,6 +40,7 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
- Nuovo filtro in contratti per mostrare al cliente solo i contratti collegati.
- Nuovo pulsante **Duplica Template** per copiare un template già esistente.
- Aggiunto controllo nelle fatture di vendita per segnalare l'eventuale fatturazione di un'attività con la data di una sessione futura rispetto alla data della fattura.
+ - Aggiunta possibilità di creare un ordine fornitore da un preventivo.
## 2.4.22
diff --git a/include/common/importa.php b/include/common/importa.php
index f638aea7b..af5fc5343 100755
--- a/include/common/importa.php
+++ b/include/common/importa.php
@@ -138,9 +138,9 @@ if (!empty($options['create_document'])) {
}
// Selezione fornitore per Ordine fornitore
- if ($options['op'] == 'add_ordine_cliente') {
- $tipo_anagrafica = tr('Fornitore');
- $ajax = 'fornitori';
+ if ($options['op'] == 'add_ordine_cliente' || $options['op'] == 'add_intervento' || $options['op'] == 'add_ordine_fornitore') {
+ $tipo_anagrafica = $options['op'] == 'add_intervento' ? tr('Cliente') : tr('Fornitore');
+ $ajax = $options['op'] == 'add_intervento' ? 'clienti' : 'fornitori';
echo '
diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php
index ddc98f1ee..d6a498e7f 100644
--- a/modules/interventi/actions.php
+++ b/modules/interventi/actions.php
@@ -394,6 +394,7 @@ switch (post('op')) {
break;
// Aggiunta di un documento in ordine
+ case 'add_intervento':
case 'add_documento':
$class = post('class');
$id_documento = post('id_documento');
@@ -413,8 +414,10 @@ switch (post('op')) {
if (post('create_document') == 'on') {
$stato = Stato::find(post('id_stato_intervento'));
$tipo = TipoSessione::find(post('id_tipo_intervento'));
+
+ $anagrafica = post('idanagrafica') ? Anagrafica::find(post('idanagrafica')) : $documento->anagrafica;
- $intervento = Intervento::build($documento->anagrafica, $tipo, $stato, post('data'));
+ $intervento = Intervento::build($anagrafica, $tipo, $stato, post('data'));
$intervento->idsede_destinazione = $id_sede;
$intervento->id_documento_fe = $documento->id_documento_fe;
diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php
index e912c4e9c..c60359850 100755
--- a/modules/ordini/actions.php
+++ b/modules/ordini/actions.php
@@ -27,6 +27,7 @@ use Modules\Ordini\Components\Riga;
use Modules\Ordini\Components\Sconto;
use Modules\Ordini\Ordine;
use Modules\Ordini\Tipo;
+use Modules\Preventivi\Preventivo;
$module = Modules::get($id_module);
@@ -480,6 +481,68 @@ switch (post('op')) {
}
}
+ // Modifica finale dello stato
+ if (post('create_document') == 'on') {
+ $ordine->idstatoordine = post('id_stato');
+ $ordine->save();
+ }
+
+ ricalcola_costiagg_ordine($id_record);
+
+ flash()->info(tr('Ordine _NUM_ aggiunto!', [
+ '_NUM_' => $ordine->numero,
+ ]));
+
+ break;
+
+ // Aggiunta di un ordine fornitore da un preventivo
+ case 'add_ordine_fornitore':
+ $preventivo = Preventivo::find(post('id_documento'));
+
+ // Creazione dell' ordine al volo
+ if (post('create_document') == 'on') {
+ $anagrafica = Anagrafica::find(post('idanagrafica'));
+ $tipo = Tipo::where('dir', $dir)->first();
+
+ $ordine = Ordine::build($anagrafica, $tipo, post('data'));
+ $ordine->save();
+
+ $id_record = $ordine->id;
+ }
+
+ $righe = $preventivo->getRighe();
+ foreach ($righe as $riga) {
+ if (post('evadere')[$riga->id] == 'on' and !empty(post('qta_da_evadere')[$riga->id])) {
+ $qta = post('qta_da_evadere')[$riga->id];
+
+ $copia = $riga->copiaIn($ordine, $qta, false);
+ $copia->save();
+
+ // Ripristino dei valori di default per campi potenzialmente impostati
+ $copia->original_id = null;
+ $copia->original_type = null;
+ $copia->qta = $qta;
+ $copia->qta_evasa = 0;
+ $copia->costo_unitario = 0;
+ $copia->setSconto(0, 'EUR');
+
+ // Impostazione al prezzo di acquisto per Articoli
+ if ($copia->isArticolo()) {
+ $articolo = $copia->articolo;
+ $fornitore = $articolo->dettaglioFornitore($anagrafica->id); // Informazioni del fornitore
+ $copia->setPrezzoUnitario($fornitore ? $fornitore->prezzo_acquisto : $articolo->prezzo_acquisto, $copia->aliquota->id);
+ }
+
+ $copia->save();
+ }
+ }
+
+ // Modifica finale dello stato
+ if (post('create_document') == 'on') {
+ $ordine->idstatoordine = post('id_stato');
+ $ordine->save();
+ }
+
ricalcola_costiagg_ordine($id_record);
flash()->info(tr('Ordine _NUM_ aggiunto!', [
diff --git a/modules/ordini/crea_documento.php b/modules/ordini/crea_documento.php
index 11c3201d7..c7ae8e9eb 100755
--- a/modules/ordini/crea_documento.php
+++ b/modules/ordini/crea_documento.php
@@ -38,7 +38,7 @@ if (get('documento') == 'fattura') {
$tipo_documento_finale = Ordine::class;
} elseif (get('documento') == 'intervento') {
$final_module = 'Interventi';
- $op = 'add_documento';
+ $op = $module->name == 'Ordini cliente' ? 'add_documento' : 'add_intervento';
$tipo_documento_finale = Intervento::class;
} else {
$final_module = $module['name'] == 'Ordini cliente' ? 'Ddt di vendita' : 'Ddt di acquisto';
diff --git a/modules/preventivi/buttons.php b/modules/preventivi/buttons.php
index 384053232..38310aaa7 100644
--- a/modules/preventivi/buttons.php
+++ b/modules/preventivi/buttons.php
@@ -59,10 +59,16 @@ echo '
-
+
'.tr('Ordine cliente').'
-
+
+
+
+
+ '.tr('Ordine fornitore').'
+
+
diff --git a/modules/preventivi/crea_documento.php b/modules/preventivi/crea_documento.php
index 41a26b861..5193c25c8 100644
--- a/modules/preventivi/crea_documento.php
+++ b/modules/preventivi/crea_documento.php
@@ -31,10 +31,14 @@ if (get('documento') == 'fattura') {
$final_module = 'Fatture di vendita';
$op = 'add_documento';
$tipo_documento_finale = Fattura::class;
-} elseif (get('documento') == 'ordine') {
+} elseif (get('documento') == 'ordine_cliente') {
$final_module = 'Ordini cliente';
$op = 'add_preventivo';
$tipo_documento_finale = Ordine::class;
+} elseif (get('documento') == 'ordine_fornitore') {
+ $final_module = 'Ordini fornitore';
+ $op = 'add_ordine_fornitore';
+ $tipo_documento_finale = Ordine::class;
} elseif (get('documento') == 'ddt') {
$final_module = 'Ddt di vendita';
$op = 'add_documento';
@@ -50,7 +54,6 @@ $options = [
'type' => 'preventivo',
'module' => $final_module,
'button' => tr('Aggiungi'),
- 'dir' => 'entrata',
'create_document' => true,
'documento' => $documento,
'tipo_documento_finale' => $tipo_documento_finale,
diff --git a/src/Common/Components/Component.php b/src/Common/Components/Component.php
index 9a8ccdb3b..ccdfacc8d 100644
--- a/src/Common/Components/Component.php
+++ b/src/Common/Components/Component.php
@@ -181,12 +181,13 @@ abstract class Component extends Model
/**
* Copia l'oggetto (articolo, riga, descrizione) nel corrispettivo per il documento indicato.
*
- * @param Document $document Documento di destinazione
- * @param float|null $qta Quantità da riportare
+ * @param Document $document Documento di destinazione
+ * @param float|null $qta Quantità da riportare
+ * @param boolean $evadi_qta_parent Definisce se evadere la quantità di provenienza
*
* @return self
*/
- public function copiaIn(Document $document, $qta = null)
+ public function copiaIn(Document $document, $qta = null, $evadi_qta_parent = true)
{
// Individuazione classe di destinazione
$class = get_class($document);
@@ -216,8 +217,7 @@ abstract class Component extends Model
unset($attributes[$model->getDocumentID()]);
// Riferimento di origine per l'evasione automatica della riga
- $is_evasione = true;
- if ($is_evasione) {
+ if ($evadi_qta_parent) {
// Mantenimento dell'origine della riga precedente
$model->original_id = $attributes['original_id'];
$model->original_type = $attributes['original_type'];