diff --git a/include/src/Components/Article.php b/include/src/Components/Article.php index 95cb7586c..3f833180b 100755 --- a/include/src/Components/Article.php +++ b/include/src/Components/Article.php @@ -5,6 +5,7 @@ namespace Common\Components; use Common\Document; use Illuminate\Database\Eloquent\Builder; use Modules\Articoli\Articolo as Original; +use Modules\Articoli\Movimento; use UnexpectedValueException; abstract class Article extends Row @@ -49,7 +50,10 @@ abstract class Article extends Row } } - abstract public function getDirection(); + public function getDirection() + { + return $this->parent->direzione; + } /** * Imposta i seriali collegati all'articolo. @@ -205,7 +209,24 @@ abstract class Article extends Row return !empty($this->abilita_serial) && !empty($this->serialRowID); } - abstract protected function movimentaMagazzino($qta); + protected function movimentaMagazzino($qta) + { + $documento = $this->fattura; + $data = $documento->data; + + $qta_movimento = $documento->direzione == 'uscita' ? $qta : -$qta; + $movimento = Movimento::descrizioneMovimento($qta_movimento, $documento->direzione).' - '.$documento->getReference(); + + $partenza = $documento->direzione == 'uscita' ? $documento->idsede_destinazione : $documento->idsede_partenza; + $arrivo = $documento->direzione == 'uscita' ? $documento->idsede_partenza : $documento->idsede_destinazione; + + $this->articolo->movimenta($qta_movimento, $movimento, $data, false, [ + 'reference_type' => get_class($documento), + 'reference_id' => $documento->id, + 'idsede_azienda' => $partenza, + 'idsede_controparte' => $arrivo, + ]); + } protected static function boot() { diff --git a/include/src/Document.php b/include/src/Document.php index 74ae1e300..3f04bee7f 100755 --- a/include/src/Document.php +++ b/include/src/Document.php @@ -4,7 +4,7 @@ namespace Common; use Common\Components\Description; -abstract class Document extends Model +abstract class Document extends Model implements ReferenceInterface { /** * Restituisce la collezione di righe e articoli con valori rilevanti per i conti. @@ -66,6 +66,8 @@ abstract class Document extends Model abstract public function sconti(); + abstract public function getDirezioneAttribute(); + /** * Calcola l'imponibile del documento. * diff --git a/include/src/ReferenceInterface.php b/include/src/ReferenceInterface.php new file mode 100644 index 000000000..fed8e4323 --- /dev/null +++ b/include/src/ReferenceInterface.php @@ -0,0 +1,14 @@ + (!empty($riga->sconto_percentuale) ? '%' : currency()), ]); } + +function reference($document) +{ + if (!empty($document) && !($document instanceof \Common\ReferenceInterface)) { + return; + } + + $extra = ''; + $module_id = null; + $document_id = null; + + if (empty($document)) { + $description = tr('Documento di riferimento non disponibile'); + $extra = 'class="disabled"'; + } else { + $module_id = $document->module; + $document_id = $document->id; + + $description = $document->getReference(); + } + + return Modules::link($module_id, $document_id, $description, $description, $extra); +} diff --git a/modules/anagrafiche/ajax/select.php b/modules/anagrafiche/ajax/select.php index 28901fe13..b76d9d1d4 100755 --- a/modules/anagrafiche/ajax/select.php +++ b/modules/anagrafiche/ajax/select.php @@ -243,7 +243,7 @@ switch ($resource) { case 'sedi_azienda': if (isset($superselect['idanagrafica'])) { $user = Auth::user(); - $id_azienda = get_var('Azienda predefinita'); + $id_azienda = setting('Azienda predefinita'); $query = "SELECT * FROM (SELECT '0' AS id, CONCAT_WS(' - ', 'Sede legale' , (SELECT CONCAT (citta, ' (', ragione_sociale,')') FROM an_anagrafiche |where|)) AS descrizione UNION SELECT id, CONCAT_WS(' - ', nomesede, citta) FROM an_sedi |where|) AS tab |filter| ORDER BY descrizione"; diff --git a/modules/anagrafiche/src/Anagrafica.php b/modules/anagrafiche/src/Anagrafica.php index f8716a0d2..3953e14fd 100755 --- a/modules/anagrafiche/src/Anagrafica.php +++ b/modules/anagrafiche/src/Anagrafica.php @@ -205,6 +205,11 @@ class Anagrafica extends Model // Attributi Eloquent + public function getModuleAttribute() + { + return 'Anagrafiche'; + } + /** * Restituisce l'identificativo. * diff --git a/modules/articoli/plugins/articoli.movimenti.php b/modules/articoli/plugins/articoli.movimenti.php index c28176f4d..a89a402df 100755 --- a/modules/articoli/plugins/articoli.movimenti.php +++ b/modules/articoli/plugins/articoli.movimenti.php @@ -7,6 +7,29 @@ echo '
'.tr('Quantità calcolata dai movimenti').': '.Translator::numberToLocale($qta_totale, 'qta').' '.$record['um'].'
'; +'.tr('Quantità calcolata dai movimenti').': '.Translator::numberToLocale($qta_totale, 'qta').' '.$record['um'].'
'; echo ' -'.tr('Quantità calcolata attuale').': '.Translator::numberToLocale($qta_totale_attuale, 'qta').' '.$record['um'].'
'; +'.tr('Quantità calcolata attuale').': '.Translator::numberToLocale($qta_totale_attuale, 'qta').' '.$record['um'].'
'; -// Elenco movimenti magazzino -$query = 'SELECT * FROM mg_movimenti WHERE idarticolo='.prepare($id_record).' ORDER BY data DESC, id DESC'; -if (empty($_GET['show_all1'])) { - $query .= ' LIMIT 0, 20'; +// Individuazione movimenti +$movimenti = $articolo->movimentiComposti() + ->orderBy('data', 'id'); +if (empty($_GET['movimentazione_completa'])) { + $movimenti->limit(20); } -$movimenti = $dbo->fetchArray($query); +// Raggruppamento per documento +$movimenti = $movimenti->get(); if (!empty($movimenti)) { - if (empty($_GET['show_all1'])) { - echo ' -[ '.tr('Mostra tutti i movimenti').' ]
'; - } else { - echo ' -[ '.tr('Mostra solo gli ultimi 20 movimenti').' ]
'; - } - echo ''.tr('Q.tà').' | '.tr('Q.tà progressiva').' | -'.tr('Causale').' | +'.tr('Operazione').' | '.tr('Data').' | # | |
---|---|---|---|---|---|---|
- '.numberFormat($movimento['qta'], 'qta').' '.$record['um'].' + '.numberFormat($movimento->qta, 'qta').' '.$record['um'].' | - +'.numberFormat($movimento['progressivo_iniziale'], 'qta').' '.$record['um'].' '.numberFormat($movimento['progressivo_finale'], 'qta').' '.$record['um'].' + | + ++ '.$movimento->descrizione.''.($movimento->hasDocument() ? ' - '.reference($movimento->getDocument()) : '').' | '; - // Causale - $dir = ($movimento['qta'] < 0) ? 'vendita' : 'acquisto'; - - if (!empty($movimento['iddocumento'])) { - $dir = $dbo->fetchArray('SELECT dir FROM co_tipidocumento WHERE id = (SELECT idtipodocumento FROM co_documenti WHERE id = '.prepare($movimento['iddocumento']).')')[0]['dir'] == 'entrata' ? 'vendita' : 'acquisto'; - } - - echo ' -'.$movimento['movimento'].' - '.((!empty($movimento['idintervento'])) ? Modules::link('Interventi', $movimento['idintervento']) : '').' - '.((!empty($movimento['idddt'])) ? (Modules::link('DDt di '.$dir, $movimento['idddt'], null, null, (intval($database->fetchOne('SELECT * FROM `dt_ddt` WHERE `id` ='.prepare($movimento['idddt'])))) ? '' : 'class="disabled"')) : '').' - '.((!empty($movimento['iddocumento'])) ? (Modules::link('Fatture di '.$dir, $movimento['iddocumento'], null, null, (intval($database->fetchOne('SELECT * FROM `co_documenti` WHERE `id` ='.prepare($movimento['iddocumento'])))) ? '' : 'class="disabled"')) : '').' - | '; - // Data echo ' -'.Translator::dateToLocale($movimento['data']).' | '; +'.dateFormat($movimento->data).' | '; // Operazioni echo '';
- if (Auth::admin() && $movimento['manuale'] == '1') {
+ if (Auth::admin() && $movimento->isManuale()) {
echo '
-
+
';
}
diff --git a/modules/articoli/src/Articolo.php b/modules/articoli/src/Articolo.php
index 6f04f8ce3..639dba028 100755
--- a/modules/articoli/src/Articolo.php
+++ b/modules/articoli/src/Articolo.php
@@ -128,6 +128,28 @@ class Articolo extends Model
return $this->hasMany(ArticoloIntervento::class, 'idarticolo');
}
+ /**
+ * Restituisce i movimenti di magazzino dell'articolo.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany|\Illuminate\Database\Query\Builder
+ */
+ public function movimenti()
+ {
+ return $this->hasMany(Movimento::class, 'idarticolo');
+ }
+
+ /**
+ * Restituisce i movimenti di magazzino dell'articolo raggruppati per documento relativo.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany|\Illuminate\Database\Query\Builder
+ */
+ public function movimentiComposti()
+ {
+ return $this->movimenti()
+ ->selectRaw('*, sum(qta) as qta_documento, IFNULL(reference_type, UUID()) as tipo_gruppo')
+ ->groupBy('tipo_gruppo', 'reference_id');
+ }
+
public function categoria()
{
return $this->belongsTo(Categoria::class, 'id_categoria');
diff --git a/modules/articoli/src/Movimento.php b/modules/articoli/src/Movimento.php
new file mode 100644
index 000000000..116f12250
--- /dev/null
+++ b/modules/articoli/src/Movimento.php
@@ -0,0 +1,127 @@
+articolo()->associate($articolo);
+
+ $model->qta = $qta;
+ $model->descrizone = $descrizone;
+ $model->data = $data;
+
+ if (!empty($document)) {
+ $class = get_class($document);
+ $id = $document->id;
+
+ $model->reference_type = $class;
+ $model->reference_id = $id;
+ } else {
+ $model->manuale = true;
+ }
+
+ $model->save();
+
+ return $model;
+ }
+
+ public function getDescrizioneAttribute()
+ {
+ $descrizione = $this->movimento;
+ if ($this->hasDocument()) {
+ $documento = $this->getDocument();
+
+ $descrizione = $documento ? self::descrizioneMovimento($this->qta, $documento->direzione) : $descrizione;
+ }
+
+ return $descrizione;
+ }
+
+ public function getDataAttribute()
+ {
+ $data = $this->attributes['data'];
+ if ($this->hasDocument()) {
+ $documento = $this->getDocument();
+
+ $data = $documento ? $documento->getReferenceDate() : $data;
+ }
+
+ return $data;
+ }
+
+ public function getQtaAttribute()
+ {
+ if (isset($this->qta_documento)) {
+ return $this->qta_documento;
+ }
+
+ return $this->qta;
+ }
+
+ public function articolo()
+ {
+ return $this->hasOne(Articolo::class, 'idarticolo');
+ }
+
+ public function movimentiRelativi()
+ {
+ return $this->hasMany(Movimento::class, 'idarticolo', 'idarticolo')
+ ->where('reference_type', $this->reference_type)
+ ->where('reference_id', $this->reference_id);
+ }
+
+ public function hasDocument()
+ {
+ return isset($this->reference_type);
+ }
+
+ public function isManuale()
+ {
+ return !empty($this->manuale);
+ }
+
+ /**
+ * Restituisce il documento collegato al movimento.
+ *
+ * @return Model
+ */
+ public function getDocument()
+ {
+ if ($this->hasDocument() && !isset($this->document)) {
+ $class = $this->reference_type;
+ $id = $this->reference_id;
+
+ $this->document = $class::find($id);
+ }
+
+ return $this->document;
+ }
+
+ public static function descrizioneMovimento($qta, $direzione = 'entrata')
+ {
+ if (empty($direzione)) {
+ $direzione = 'entrata';
+ }
+
+ $carico = ($direzione == 'entrata') ? tr('Ripristino articolo') : tr('Carico magazzino');
+ $scarico = ($direzione == 'entrata') ? tr('Scarico magazzino') : tr('Rimozione articolo');
+
+ $descrizione = $qta > 0 ? $carico : $scarico;
+
+ // Descrizione per vecchi documenti rimossi ma con movimenti azzerati
+ if ($qta == 0) {
+ $descrizione = tr('Nessun movimento');
+ }
+
+ return $descrizione;
+ }
+}
diff --git a/modules/causali/actions.php b/modules/causali/actions.php
index 5e7b99a81..fd21ca8d9 100755
--- a/modules/causali/actions.php
+++ b/modules/causali/actions.php
@@ -25,7 +25,7 @@ switch (filter('op')) {
]));
}
} else {
- flash()->error(tr('Ci sono stati alcuni errori durante il salvataggio.'));
+ flash()->error(tr('Ci sono stati alcuni errori durante il salvataggio'));
}
break;
diff --git a/modules/causali_movimenti/actions.php b/modules/causali_movimenti/actions.php
new file mode 100755
index 000000000..33588f3e2
--- /dev/null
+++ b/modules/causali_movimenti/actions.php
@@ -0,0 +1,41 @@
+update('mg_causali_movimenti', [
+ 'nome' => post('nome'),
+ 'movimento_carico' => post('movimento_carico'),
+ 'descrizione' => post('descrizione'),
+ ], [
+ 'id' => $id_record,
+ ]);
+ } else {
+ flash()->error(tr('Ci sono stati alcuni errori durante il salvataggio'));
+ }
+
+ break;
+
+ case 'add':
+ $database->insert('mg_causali_movimenti', [
+ 'nome' => post('nome'),
+ 'movimento_carico' => post('movimento_carico'),
+ 'descrizione' => post('descrizione'),
+ ]);
+ $id_record = $database->lastInsertedID();
+
+ break;
+
+ case 'delete':
+ if (isset($id_record)) {
+ $dbo->query('DELETE FROM `mg_causali_movimenti` WHERE `id`='.prepare($id_record));
+
+ flash()->info(tr('Tipologia di _TYPE_ eliminata con successo!', [
+ '_TYPE_' => 'movimento predefinito',
+ ]));
+ }
+
+ break;
+}
diff --git a/modules/causali_movimenti/add.php b/modules/causali_movimenti/add.php
new file mode 100755
index 000000000..8019cfd69
--- /dev/null
+++ b/modules/causali_movimenti/add.php
@@ -0,0 +1,31 @@
+
diff --git a/modules/causali_movimenti/edit.php b/modules/causali_movimenti/edit.php
new file mode 100755
index 000000000..5ecb07a25
--- /dev/null
+++ b/modules/causali_movimenti/edit.php
@@ -0,0 +1,37 @@
+
+
+
+
+
diff --git a/modules/causali_movimenti/init.php b/modules/causali_movimenti/init.php
new file mode 100755
index 000000000..909f99184
--- /dev/null
+++ b/modules/causali_movimenti/init.php
@@ -0,0 +1,7 @@
+fetchOne('SELECT * FROM `mg_causali_movimenti` WHERE id='.prepare($id_record));
+}
diff --git a/modules/contratti/src/Components/Articolo.php b/modules/contratti/src/Components/Articolo.php
index a59deea58..1d199d926 100755
--- a/modules/contratti/src/Components/Articolo.php
+++ b/modules/contratti/src/Components/Articolo.php
@@ -25,14 +25,4 @@ class Articolo extends Article
return $model;
}
-
- public function movimentaMagazzino($qta)
- {
- return;
- }
-
- public function getDirection()
- {
- return $this->contratto->tipo->dir;
- }
}
diff --git a/modules/contratti/src/Contratto.php b/modules/contratti/src/Contratto.php
index d1146f1e2..cd6b234a6 100755
--- a/modules/contratti/src/Contratto.php
+++ b/modules/contratti/src/Contratto.php
@@ -11,10 +11,12 @@ use Modules\TipiIntervento\Tipo as TipoSessione;
use Plugins\PianificazioneFatturazione\Pianificazione;
use Plugins\PianificazioneInterventi\Promemoria;
use Traits\RecordTrait;
+use Traits\ReferenceTrait;
use Util\Generator;
class Contratto extends Document
{
+ use ReferenceTrait;
use RecordTrait;
protected $table = 'co_contratti';
@@ -223,4 +225,21 @@ class Contratto extends Document
return $numero;
}
+
+ // Opzioni di riferimento
+
+ public function getReferenceName()
+ {
+ return 'Contratto';
+ }
+
+ public function getReferenceNumber()
+ {
+ return $this->numero;
+ }
+
+ public function getReferenceDate()
+ {
+ return $this->data_bozza;
+ }
}
diff --git a/modules/ddt/actions.php b/modules/ddt/actions.php
index 2fb41506d..7ac4313fe 100755
--- a/modules/ddt/actions.php
+++ b/modules/ddt/actions.php
@@ -315,8 +315,6 @@ switch (post('op')) {
try {
$ddt->delete();
- $dbo->query('DELETE FROM mg_movimenti WHERE idddt = '.prepare($id_record));
-
flash()->info(tr('Ddt eliminato!'));
} catch (InvalidArgumentException $e) {
flash()->error(tr('Sono stati utilizzati alcuni serial number nel documento: impossibile procedere!'));
diff --git a/modules/ddt/bulk.php b/modules/ddt/bulk.php
index 050d1f08e..38b9d5e75 100755
--- a/modules/ddt/bulk.php
+++ b/modules/ddt/bulk.php
@@ -104,9 +104,11 @@ switch (post('op')) {
case 'delete-bulk':
foreach ($id_records as $id) {
- $dbo->query('DELETE FROM dt_ddt WHERE id = '.prepare($id).Modules::getAdditionalsQuery($id_module));
- $dbo->query('DELETE FROM dt_righe_ddt WHERE idddt='.prepare($id).Modules::getAdditionalsQuery($id_module));
- $dbo->query('DELETE FROM mg_movimenti WHERE idddt='.prepare($id).Modules::getAdditionalsQuery($id_module));
+ $documento = DDT::find($id);
+ try {
+ $documento->delete();
+ } catch (InvalidArgumentException $e) {
+ }
}
flash()->info(tr('Ddt eliminati!'));
diff --git a/modules/ddt/row-list.php b/modules/ddt/row-list.php
index 5bea4c373..5a77ca0e9 100755
--- a/modules/ddt/row-list.php
+++ b/modules/ddt/row-list.php
@@ -63,11 +63,9 @@ foreach ($righe as $riga) {
}
// Aggiunta dei riferimenti ai documenti
- $ref = doc_references($r, $dir, ['idddt']);
-
- if (!empty($ref)) {
+ if ($riga->hasOriginal()) {
echo '
- '.Modules::link($ref['module'], $ref['id'], $ref['description'], $ref['description']); + '.reference($riga->getOriginal()->parent); } echo ' diff --git a/modules/ddt/src/Components/Articolo.php b/modules/ddt/src/Components/Articolo.php index 03ca86cc4..53be420ee 100755 --- a/modules/ddt/src/Components/Articolo.php +++ b/modules/ddt/src/Components/Articolo.php @@ -24,38 +24,4 @@ class Articolo extends Article return $model; } - - public function movimentaMagazzino($qta) - { - $ddt = $this->ddt; - $tipo = $ddt->tipo; - - $numero = $ddt->numero_esterno ?: $ddt->numero; - $data = $ddt->data; - - $carico = ($tipo->dir == 'entrata') ? tr('Ripristino articolo da _TYPE_ numero _NUM_') : tr('Carico magazzino da _TYPE_ numero _NUM_'); - $scarico = ($tipo->dir == 'entrata') ? tr('Scarico magazzino per _TYPE_ numero _NUM_') : tr('Rimozione articolo da _TYPE_ numero _NUM_'); - - $qta = ($tipo->dir == 'uscita') ? -$qta : $qta; - $movimento = ($qta < 0) ? $carico : $scarico; - - $movimento = replace($movimento, [ - '_TYPE_' => $tipo->descrizione, - '_NUM_' => $numero, - ]); - - $partenza = $ddt->direzione == 'uscita' ? $ddt->idsede_destinazione : $ddt->idsede_partenza; - $arrivo = $ddt->direzione == 'uscita' ? $ddt->idsede_partenza : $ddt->idsede_destinazione; - - $this->articolo->movimenta(-$qta, $movimento, $data, false, [ - 'idddt' => $ddt->id, - 'idsede_azienda' => $partenza, - 'idsede_controparte' => $arrivo, - ]); - } - - public function getDirection() - { - return $this->ddt->tipo->dir; - } } diff --git a/modules/ddt/src/DDT.php b/modules/ddt/src/DDT.php index 1685a23b4..64dfe9462 100755 --- a/modules/ddt/src/DDT.php +++ b/modules/ddt/src/DDT.php @@ -7,10 +7,12 @@ use Common\Components\Description; use Common\Document; use Modules\Anagrafiche\Anagrafica; use Traits\RecordTrait; +use Traits\ReferenceTrait; use Util\Generator; class DDT extends Document { + use ReferenceTrait; use RecordTrait; protected $table = 'dt_ddt'; @@ -205,4 +207,21 @@ class DDT extends Document return $numero; } + + // Opzioni di riferimento + + public function getReferenceName() + { + return $this->tipo->descrizione; + } + + public function getReferenceNumber() + { + return $this->numero_esterno ?: $this->numero; + } + + public function getReferenceDate() + { + return $this->data; + } } diff --git a/modules/fatture/bulk.php b/modules/fatture/bulk.php index 8ace33dbd..f174ffbca 100755 --- a/modules/fatture/bulk.php +++ b/modules/fatture/bulk.php @@ -45,19 +45,6 @@ switch (post('op')) { break; - case 'delete-bulk': - - foreach ($id_records as $id) { - $dbo->query('DELETE FROM co_documenti WHERE id = '.prepare($id).Modules::getAdditionalsQuery($id_module)); - $dbo->query('DELETE FROM co_righe_documenti WHERE iddocumento='.prepare($id).Modules::getAdditionalsQuery($id_module)); - $dbo->query('DELETE FROM co_scadenziario WHERE iddocumento='.prepare($id).Modules::getAdditionalsQuery($id_module)); - $dbo->query('DELETE FROM mg_movimenti WHERE iddocumento='.prepare($id).Modules::getAdditionalsQuery($id_module)); - } - - flash()->info(tr('Fatture eliminate!')); - - break; - case 'genera-xml': $failed = []; $added = []; @@ -247,11 +234,23 @@ switch (post('op')) { flash()->info(tr('Fatture duplicate correttamente!')); break; + + case 'delete-bulk': + foreach ($id_records as $id) { + $documento = Fattura::find($id); + try { + $documento->delete(); + } catch (InvalidArgumentException $e) { + } + } + + flash()->info(tr('Fatture eliminate!')); + break; } if (App::debug()) { $operations = [ - 'delete-bulk' => ' '.tr('Elimina selezionati').'', + 'delete-bulk' => tr('Elimina selezionati'), ]; } diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index 6ca652920..69cd1c358 100755 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -142,10 +142,10 @@ foreach ($righe as $riga) { '.Modules::link($id_module, $record['ref_documento'], $text, $text); } - $ref = doc_references($r, $dir, ['iddocumento']); - if (!empty($ref)) { + // Aggiunta dei riferimenti ai documenti + if ($riga->hasOriginal()) { echo ' - '.Modules::link($ref['module'], $ref['id'], $ref['description'], $ref['description']); + '.reference($riga->getOriginal()->parent); } echo ' diff --git a/modules/fatture/src/Components/Articolo.php b/modules/fatture/src/Components/Articolo.php index b1cd2a3ba..c41637ff0 100755 --- a/modules/fatture/src/Components/Articolo.php +++ b/modules/fatture/src/Components/Articolo.php @@ -24,38 +24,4 @@ class Articolo extends Article return $model; } - - public function movimentaMagazzino($qta) - { - $fattura = $this->fattura; - $tipo = $fattura->tipo; - - $numero = $fattura->numero_esterno ?: $fattura->numero; - $data = $fattura->data; - - $carico = ($tipo->dir == 'entrata') ? tr('Ripristino articolo da _TYPE_ numero _NUM_') : tr('Carico magazzino da _TYPE_ numero _NUM_'); - $scarico = ($tipo->dir == 'entrata') ? tr('Scarico magazzino per _TYPE_ numero _NUM_') : tr('Rimozione articolo da _TYPE_ numero _NUM_'); - - $qta = ($tipo->dir == 'uscita') ? -$qta : $qta; - $movimento = ($qta < 0) ? $carico : $scarico; - - $movimento = replace($movimento, [ - '_TYPE_' => $tipo->descrizione, - '_NUM_' => $numero, - ]); - - $partenza = $fattura->direzione == 'uscita' ? $fattura->idsede_destinazione : $fattura->idsede_partenza; - $arrivo = $fattura->direzione == 'uscita' ? $fattura->idsede_partenza : $fattura->idsede_destinazione; - - $this->articolo->movimenta(-$qta, $movimento, $data, false, [ - 'iddocumento' => $fattura->id, - 'idsede_azienda' => $partenza, - 'idsede_controparte' => $arrivo, - ]); - } - - public function getDirection() - { - return $this->fattura->tipo->dir; - } } diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index 490ce8a31..0941eda22 100755 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -16,11 +16,13 @@ use Modules\Scadenzario\Scadenza; use Plugins\DichiarazioniIntento\Dichiarazione; use Plugins\ExportFE\FatturaElettronica; use Traits\RecordTrait; +use Traits\ReferenceTrait; use Util\Generator; class Fattura extends Document { use RecordTrait; + use ReferenceTrait; protected $table = 'co_documenti'; @@ -749,4 +751,21 @@ class Fattura extends Document return $numero; } + + // Opzioni di riferimento + + public function getReferenceName() + { + return $this->tipo->descrizione; + } + + public function getReferenceNumber() + { + return $this->numero_esterno ?: $this->numero; + } + + public function getReferenceDate() + { + return $this->data; + } } diff --git a/modules/interventi/src/Components/Articolo.php b/modules/interventi/src/Components/Articolo.php index 25c45ad57..34a475590 100755 --- a/modules/interventi/src/Components/Articolo.php +++ b/modules/interventi/src/Components/Articolo.php @@ -30,36 +30,4 @@ class Articolo extends Article return $model; } - - public function movimentaMagazzino($qta) - { - $intervento = $this->intervento; - - $numero = $intervento->codice; - $data = database()->fetchOne('SELECT MAX(orario_fine) AS data FROM in_interventi_tecnici WHERE idintervento = :id_intervento', [ - ':id_intervento' => $intervento->id, - ])['data']; - - $data = $data ?: $intervento->data_richiesta; - - $descrizione = ($qta < 0) ? tr('Ripristino articolo da Attività numero _NUM_', [ - '_NUM_' => $numero, - ]) : tr('Scarico magazzino per intervento _NUM_', [ - '_NUM_' => $numero, - ]); - - $partenza = $intervento->idsede_partenza; - $arrivo = $intervento->idsede_destinazione; - - $this->articolo->movimenta(-$qta, $descrizione, $data, false, [ - 'idintervento' => $intervento->id, - 'idsede_azienda' => $partenza, - 'idsede_controparte' => $arrivo, - ]); - } - - public function getDirection() - { - return 'entrata'; - } } diff --git a/modules/interventi/src/Intervento.php b/modules/interventi/src/Intervento.php index 76698a180..0bf0e3d4e 100755 --- a/modules/interventi/src/Intervento.php +++ b/modules/interventi/src/Intervento.php @@ -8,10 +8,13 @@ use Modules\Contratti\Contratto; use Modules\Preventivi\Preventivo; use Modules\TipiIntervento\Tipo as TipoSessione; use Traits\RecordTrait; +use Traits\ReferenceTrait; use Util\Generator; class Intervento extends Document { + use ReferenceTrait; + use RecordTrait; protected $table = 'in_interventi'; @@ -90,6 +93,11 @@ class Intervento extends Document return 'Interventi'; } + public function getDirezioneAttribute() + { + return 'entrata'; + } + /** * Restituisce la collezione di righe e articoli con valori rilevanti per i conti. * @@ -198,4 +206,21 @@ class Intervento extends Document return $numero; } + + // Opzioni di riferimento + + public function getReferenceName() + { + return 'Attività'; + } + + public function getReferenceNumber() + { + return $this->codice; + } + + public function getReferenceDate() + { + return $this->data_richiesta; + } } diff --git a/modules/misure/actions.php b/modules/misure/actions.php index cf92f75a0..3f96411f7 100755 --- a/modules/misure/actions.php +++ b/modules/misure/actions.php @@ -16,7 +16,7 @@ switch (filter('op')) { ])); } } else { - flash()->error(tr('Ci sono stati alcuni errori durante il salvataggio.')); + flash()->error(tr('Ci sono stati alcuni errori durante il salvataggio')); } break; @@ -43,7 +43,7 @@ switch (filter('op')) { ])); } } else { - flash()->error(tr('Ci sono stati alcuni errori durante il salvataggio.')); + flash()->error(tr('Ci sono stati alcuni errori durante il salvataggio')); } break; diff --git a/modules/movimenti/actions.php b/modules/movimenti/actions.php index b4b72cf14..00776bb6e 100755 --- a/modules/movimenti/actions.php +++ b/modules/movimenti/actions.php @@ -8,9 +8,10 @@ switch (post('op')) { case 'add': $idsede_partenza = post('idsede_partenza'); $idsede_destinazione = post('idsede_destinazione'); - $qta = (post('direzione') == 'Carico manuale') ? post('qta') : -post('qta'); + $direzione = post('direzione'); - if (post('direzione') == 'Carico manuale') { + $qta = !empty($direzione) ? post('qta') : -post('qta'); + if (!empty($direzione)) { if ($idsede_partenza == 0 && $idsede_destinazione != 0) { $qta = -post('qta'); } elseif ($idsede_partenza != 0 && $idsede_destinazione == 0) { diff --git a/modules/movimenti/add.php b/modules/movimenti/add.php index 6068a584f..671a6cd9c 100755 --- a/modules/movimenti/add.php +++ b/modules/movimenti/add.php @@ -3,7 +3,7 @@ include_once __DIR__.'/../../core.php'; // Imposto come azienda l'azienda predefinita per selezionare le sedi a cui ho accesso -$_SESSION['superselect']['idanagrafica'] = get_var('Azienda predefinita'); +$_SESSION['superselect']['idanagrafica'] = setting('Azienda predefinita'); // Azzero le sedi selezionate unset($_SESSION['superselect']['idsede_partenza']); @@ -19,35 +19,37 @@ $_SESSION['superselect']['idsede_destinazione'] = 0;
- {["type":"select", "label":"", "name":"idarticolo", "ajax-source":"articoli", "value":"", "required":1]}
+ {["type": "select", "label": "", "name": "idarticolo", "ajax-source": "articoli", "value": "", "required": 1 ]}
- {["type":"number", "label":"", "name":"qta", "decimals":"2", "value":"1", "required":1]}
+ {["type": "number", "label": "", "name": "qta", "decimals": "2", "value": "1", "required": 1 ]}
- {["type":"date", "label":"", "name":"data", "value":"-now-", "required":1]}
+ {["type": "date", "label": "", "name": "data", "value": "-now-", "required": 1 ]}
- {["type":"select", "label":"", "name":"direzione", "values":"list=\"Carico manuale\":\"Carico\", \"Scarico manuale\":\"Scarico\" ", "value":"Carico manuale", "required":1]}
+ {["type": "select", "label": "", "name": "causale", "values": "query=SELECT id, nome as text, descrizione, movimento_carico FROM mg_causali_movimenti", "value": 1, "required": 1 ]}
+
+
- {["type":"textarea", "label":"", "name":"movimento", "required":1]}
+ {["type": "textarea", "label": "", "name": "movimento", "required": 1 ]}
- {[ "type": "select", "label": "", "name": "idsede_destinazione", "ajax-source": "sedi_azienda", "value": "0", "required":1 ]}
+ {[ "type": "select", "label": "", "name": "idsede_destinazione", "ajax-source": "sedi_azienda", "value": "0", "required": 1 ]}
- {[ "type": "select", "label": "", "name": "idsede_partenza", "ajax-source": "sedi_azienda", "value": "0", "required":1 ]}
+ {[ "type": "select", "label": "", "name": "idsede_partenza", "ajax-source": "sedi_azienda", "value": "0", "required": 1 ]}
'.Modules::link($ref['module'], $ref['id'], $ref['description'], $ref['description']); + '.reference($riga->getOriginal()->parent); } echo ' diff --git a/modules/ordini/src/Components/Articolo.php b/modules/ordini/src/Components/Articolo.php index 488c5f49a..22224cead 100755 --- a/modules/ordini/src/Components/Articolo.php +++ b/modules/ordini/src/Components/Articolo.php @@ -26,14 +26,4 @@ class Articolo extends Article return $model; } - - public function movimentaMagazzino($qta) - { - return; - } - - public function getDirection() - { - return $this->ordine->tipo->dir; - } } diff --git a/modules/ordini/src/Ordine.php b/modules/ordini/src/Ordine.php index f5d08b120..c8f021946 100755 --- a/modules/ordini/src/Ordine.php +++ b/modules/ordini/src/Ordine.php @@ -7,10 +7,12 @@ use Common\Document; use Modules\Anagrafiche\Anagrafica; use Modules\DDT\DDT; use Traits\RecordTrait; +use Traits\ReferenceTrait; use Util\Generator; class Ordine extends Document { + use ReferenceTrait; use RecordTrait; protected $table = 'or_ordini'; @@ -200,4 +202,21 @@ class Ordine extends Document return $numero; } + + // Opzioni di riferimento + + public function getReferenceName() + { + return $this->tipo->descrizione; + } + + public function getReferenceNumber() + { + return $this->numero_esterno ?: $this->numero; + } + + public function getReferenceDate() + { + return $this->data; + } } diff --git a/modules/preventivi/src/Components/Articolo.php b/modules/preventivi/src/Components/Articolo.php index d5afe1c28..89f109d28 100755 --- a/modules/preventivi/src/Components/Articolo.php +++ b/modules/preventivi/src/Components/Articolo.php @@ -25,14 +25,4 @@ class Articolo extends Article return $model; } - - public function movimentaMagazzino($qta) - { - return; - } - - public function getDirection() - { - return $this->preventivo->tipo->dir; - } } diff --git a/modules/preventivi/src/Preventivo.php b/modules/preventivi/src/Preventivo.php index 2e5b25431..8f0b375a8 100755 --- a/modules/preventivi/src/Preventivo.php +++ b/modules/preventivi/src/Preventivo.php @@ -10,10 +10,12 @@ use Modules\Interventi\Intervento; use Modules\Ordini\Ordine; use Modules\TipiIntervento\Tipo as TipoSessione; use Traits\RecordTrait; +use Traits\ReferenceTrait; use Util\Generator; class Preventivo extends Document { + use ReferenceTrait; use RecordTrait; protected $table = 'co_preventivi'; @@ -245,4 +247,21 @@ class Preventivo extends Document return $numero; } + + // Opzioni di riferimento + + public function getReferenceName() + { + return 'Preventivo'; + } + + public function getReferenceNumber() + { + return $this->numero; + } + + public function getReferenceDate() + { + return $this->data_bozza; + } } diff --git a/modules/primanota/add.php b/modules/primanota/add.php index 56921e60d..aae7f7037 100755 --- a/modules/primanota/add.php +++ b/modules/primanota/add.php @@ -104,7 +104,7 @@ foreach ($id_documenti as $id_documento) { // Predisposizione prima riga $conto_field = 'idconto_'.($dir == 'entrata' ? 'vendite' : 'acquisti'); - $id_conto_aziendale = $fattura->pagamento[$conto_field] ?: get_var('Conto aziendale predefinito'); + $id_conto_aziendale = $fattura->pagamento[$conto_field] ?: setting('Conto aziendale predefinito'); // Predisposizione conto crediti clienti $conto_field = 'idconto_'.($dir == 'entrata' ? 'cliente' : 'fornitore'); @@ -334,7 +334,7 @@ include $structure->filepath('movimenti.php'); $('#modals > div table.scadenze > tbody').append( ' |
'.tr('Valore totale', [], ['upper' => true]).' | - + '; $totali = []; diff --git a/update/2_4_14.sql b/update/2_4_14.sql index 79d5c687f..c61bbca6e 100755 --- a/update/2_4_14.sql +++ b/update/2_4_14.sql @@ -392,6 +392,34 @@ UPDATE `zz_views` SET `query` = 'righe.totale_imponibile' WHERE `id_module` = (S INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `format`, `default`, `visible`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Ordini fornitore'), 'Totale ivato', 'righe.totale', 5, 1, 1, 1, 1); +-- Aggiunta gestione dinamica dei movimenti degli Articoli +ALTER TABLE `mg_movimenti` ADD `reference_id` int(11), ADD `reference_type` varchar(255); +UPDATE `mg_movimenti` SET `reference_id` = `iddocumento`, `reference_type` = 'Modules\\Fatture\\Fattura' WHERE `iddocumento` IS NOT NULL AND `iddocumento` != 0; +UPDATE `mg_movimenti` SET `reference_id` = `idintervento`, `reference_type` = 'Modules\\Interventi\\Intervento' WHERE `idintervento` IS NOT NULL AND `idintervento` != 0; +UPDATE `mg_movimenti` SET `reference_id` = `idddt`, `reference_type` = 'Modules\\DDT\\DDT' WHERE `idddt` IS NOT NULL AND `idddt` != 0; + +-- Descrizioni movimenti predefinite per l'aggiunta dal modulo Movimenti +CREATE TABLE IF NOT EXISTS `mg_causali_movimenti` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `nome` varchar(255) NOT NULL, + `descrizione` varchar(255) NOT NULL, + `movimento_carico` BOOLEAN DEFAULT TRUE, + PRIMARY KEY (`id`) +) ENGINE=InnoDB; + +INSERT INTO `mg_causali_movimenti` (`id`, `nome`, `descrizione`, `movimento_carico`) VALUES +(NULL, 'Carico', 'Carico manuale', '1'), +(NULL, 'Scarico', 'Scarico manuale', '0'); + +-- Introduzione modulo Movimenti predefiniti +INSERT INTO `zz_modules` (`id`, `name`, `title`, `directory`, `options`, `options2`, `icon`, `version`, `compatibility`, `order`, `parent`, `default`, `enabled`) VALUES (NULL, 'Causali movimenti', 'Causali movimenti', 'causali_movimenti', 'SELECT |select| FROM `mg_causali_movimenti` WHERE 1=1 HAVING 2=2', '', 'fa fa-truck', '2.4.14', '2.4.14', '1', (SELECT `id` FROM `zz_modules` t WHERE t.`name` = 'Tabelle'), '1', '1'); + +INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `default`, `visible`) VALUES +((SELECT `id` FROM `zz_modules` WHERE `name` = 'Causali movimenti'), 'Movimento di carico', 'IF(movimento_carico, ''Si'', ''No'')', 4, 1, 0, 0, 1), +((SELECT `id` FROM `zz_modules` WHERE `name` = 'Causali movimenti'), 'Descrizione', 'descrizione', 3, 1, 0, 0, 1), +((SELECT `id` FROM `zz_modules` WHERE `name` = 'Causali movimenti'), 'Nome', 'nome', 2, 1, 0, 0, 1), +((SELECT `id` FROM `zz_modules` WHERE `name` = 'Causali movimenti'), 'id', 'id', 1, 1, 0, 0, 0); + -- Miglioramento della cache interna CREATE TABLE IF NOT EXISTS `zz_cache` ( `id` int(11) NOT NULL AUTO_INCREMENT, diff --git a/update/tables.php b/update/tables.php index 6ebf43748..6c89ad33d 100755 --- a/update/tables.php +++ b/update/tables.php @@ -79,6 +79,7 @@ return [ 'in_vociservizio', 'mg_articoli', 'mg_categorie', + 'mg_causali_movimenti', 'mg_listini', 'mg_movimenti', 'mg_prodotti',