Introduzione collegamento al documento di origine per righe importate

Aggiunti campi original_document_id e original_document_type per favorire la flessibilità nei collegamento tra documenti attraverso l'importazione delle righe.
Miglioramento del supporto all'individuazione dei documenti collegati a Contratti e Preventivi, con l'introduzione del collegamento visibile agli Interventi.
This commit is contained in:
Dasc3er 2021-07-28 11:50:02 +02:00
parent 62e250873f
commit c663f7f2a6
9 changed files with 3666 additions and 2412 deletions

File diff suppressed because it is too large Load Diff

View File

@ -436,9 +436,12 @@ $("#codice_cig, #codice_cup").bind("keyup change", function(e) {
// Collegamenti diretti // Collegamenti diretti
// Fatture o interventi collegati a questo contratto // Fatture o interventi collegati a questo contratto
$elementi = $dbo->fetchArray('SELECT 0 AS `codice`, `co_documenti`.`id` AS `id`, `co_documenti`.`numero` AS `numero`, `co_documenti`.`numero_esterno` AS `numero_esterno`, `co_documenti`.`data`, `co_tipidocumento`.`descrizione` AS `tipo_documento`, `co_tipidocumento`.`dir` AS `dir` FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id` IN (SELECT `iddocumento` FROM `co_righe_documenti` WHERE `idcontratto` = '.prepare($id_record).')'.' $elementi = $dbo->fetchArray('SELECT `co_documenti`.`id`, `co_documenti`.`data`, `co_documenti`.`numero`, `co_documenti`.`numero_esterno`, `co_tipidocumento`.`descrizione` AS tipo_documento, IF(`co_tipidocumento`.`dir` = \'entrata\', \'Fatture di vendita\', \'Fatture di acquisto\') AS modulo FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id` IN (SELECT `iddocumento` FROM `co_righe_documenti` WHERE `idcontratto` = '.prepare($id_record).')
UNION UNION
SELECT `in_interventi`.`codice` AS `codice`, `in_interventi`.`id` AS `id`, 0 AS `numero`, 0 AS `numero_esterno`, `in_interventi`.`data_richiesta` AS `data`, 0 AS `tipo_documento`, 0 AS `dir` FROM `in_interventi` WHERE `in_interventi`.`id_contratto` = '.prepare($id_record).' ORDER BY `data` '); SELECT `in_interventi`.`id`, `in_interventi`.`data_richiesta`, `in_interventi`.`codice`, NULL, \'Attività\', \'Interventi\' FROM `in_interventi` JOIN `in_righe_interventi` ON `in_righe_interventi`.`idintervento` = `in_interventi`.`id` WHERE (`in_righe_interventi`.`original_document_id` = '.prepare($contratto->id).' AND `in_righe_interventi`.`original_document_type` = '.prepare(get_class($contratto)).') OR `in_interventi`.`id_contratto` = '.prepare($id_record).'
ORDER BY `data` ');
if (!empty($elementi)) { if (!empty($elementi)) {
echo ' echo '
@ -455,31 +458,15 @@ if (!empty($elementi)) {
<ul>'; <ul>';
// Elenco attività o contratti collegati // Elenco attività o contratti collegati
foreach ($elementi as $riga) { foreach ($elementi as $elemento) {
if (!empty($riga['dir'])) { $descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [
$descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [ '_DOC_' => $elemento['tipo_documento'],
'_DOC_' => $riga['tipo_documento'], '_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
'_NUM_' => !empty($riga['numero_esterno']) ? $riga['numero_esterno'] : $riga['numero'], '_DATE_' => Translator::dateToLocale($elemento['data']),
'_DATE_' => Translator::dateToLocale($riga['data']), ]);
]);
$modulo = ($riga['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto'; echo '
$id = $riga['id']; <li>'.Modules::link($elemento['modulo'], $elemento['id'], $descrizione).'</li>';
echo '
<li>'.Modules::link($modulo, $id, $descrizione).'</li>';
} else {
$descrizione = tr('Intervento num. _NUM_ del _DATE_', [
'_NUM_' => $riga['codice'],
'_DATE_' => Translator::dateToLocale($riga['data']),
]);
$modulo = 'Interventi';
$id = $riga['id'];
echo '
<li>'.Modules::link($modulo, $id, $descrizione).'</li>';
}
} }
echo ' echo '

View File

@ -51,8 +51,8 @@ echo '
$rs = $dbo->fetchArray('SELECT $rs = $dbo->fetchArray('SELECT
in_interventi.id, in_interventi.id,
CONCAT(\'Intervento numero \', in_interventi.codice, \' del \', DATE_FORMAT(IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), in_interventi.data_richiesta), \'%d/%m/%Y\'), " [", `in_statiintervento`.`descrizione` , "]") AS descrizione, CONCAT(\'Attività numero \', in_interventi.codice, \' del \', DATE_FORMAT(IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), in_interventi.data_richiesta), \'%d/%m/%Y\'), " [", `in_statiintervento`.`descrizione` , "]") AS descrizione,
CONCAT(\'Intervento numero \', in_interventi.codice, \' del \', DATE_FORMAT(IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), in_interventi.data_richiesta), \'%d/%m/%Y\')) AS info, CONCAT(\'Attività numero \', in_interventi.codice, \' del \', DATE_FORMAT(IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), in_interventi.data_richiesta), \'%d/%m/%Y\')) AS info,
CONCAT(\'\n\', in_interventi.descrizione) AS descrizione_intervento, CONCAT(\'\n\', in_interventi.descrizione) AS descrizione_intervento,
IF(idclientefinale='.prepare($idanagrafica).', \'Interventi conto terzi\', \'Interventi diretti\') AS `optgroup` IF(idclientefinale='.prepare($idanagrafica).', \'Interventi conto terzi\', \'Interventi diretti\') AS `optgroup`
FROM FROM

View File

@ -112,7 +112,7 @@ switch (post('op')) {
} }
} }
$descrizione = tr('Intervento numero _NUM_ del _DATE_ [_STATE_]', [ $descrizione = tr('Attività numero _NUM_ del _DATE_ [_STATE_]', [
'_NUM_' => $intervento['codice_intervento'], '_NUM_' => $intervento['codice_intervento'],
'_DATE_' => Translator::dateToLocale($intervento['data']), '_DATE_' => Translator::dateToLocale($intervento['data']),
'_STATE_' => $intervento['stato'], '_STATE_' => $intervento['stato'],

View File

@ -158,7 +158,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$sessioni = $intervento->sessioni; $sessioni = $intervento->sessioni;
if (empty($sessioni)) { if (empty($sessioni)) {
flash()->warning(tr("L'intervento _NUM_ non ha sessioni di lavoro!", [ flash()->warning(tr("L'attività _NUM_ non ha sessioni di lavoro!", [
'_NUM_' => $codice, '_NUM_' => $codice,
])); ]));
} else { } else {
@ -171,7 +171,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$sessione = $gruppo->first(); $sessione = $gruppo->first();
$riga = Riga::build($fattura); $riga = Riga::build($fattura);
$riga->descrizione = tr("Ore di lavoro dell'intervento _NUM_ del _DATE_", [ $riga->descrizione = tr("Ore di lavoro dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice, '_NUM_' => $codice,
'_DATE_' => dateFormat($data), '_DATE_' => dateFormat($data),
]); ]);
@ -202,7 +202,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$diritto_chiamata = $gruppo->first(); $diritto_chiamata = $gruppo->first();
$riga = Riga::build($fattura); $riga = Riga::build($fattura);
$riga->descrizione = tr("Diritto di chiamata dell'intervento _NUM_ del _DATE_", [ $riga->descrizione = tr("Diritto di chiamata dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice, '_NUM_' => $codice,
'_DATE_' => dateFormat($data), '_DATE_' => dateFormat($data),
]); ]);
@ -236,7 +236,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$viaggio = $gruppo->first(); $viaggio = $gruppo->first();
$riga = Riga::build($fattura); $riga = Riga::build($fattura);
$riga->descrizione = tr("Trasferta dell'intervento _NUM_ del _DATE_", [ $riga->descrizione = tr("Trasferta dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice, '_NUM_' => $codice,
'_DATE_' => dateFormat($data), '_DATE_' => dateFormat($data),
]); ]);

View File

@ -364,11 +364,14 @@ $(document).ready(function() {
}); });
</script>'; </script>';
//fatture, ordini collegate a questo preventivo // Fatture, ordini collegate a questo preventivo
$elementi = $dbo->fetchArray('SELECT `co_documenti`.`id`, `co_documenti`.`data`, `co_documenti`.`numero`, `co_documenti`.`numero_esterno`, `co_tipidocumento`.`descrizione` AS tipo_documento, `co_tipidocumento`.`dir` FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id` IN (SELECT `iddocumento` FROM `co_righe_documenti` WHERE `idpreventivo` = '.prepare($id_record).') $elementi = $dbo->fetchArray('SELECT `co_documenti`.`id`, `co_documenti`.`data`, `co_documenti`.`numero`, `co_documenti`.`numero_esterno`, `co_tipidocumento`.`descrizione` AS tipo_documento, IF(`co_tipidocumento`.`dir` = \'entrata\', \'Fatture di vendita\', \'Fatture di acquisto\') AS modulo FROM `co_documenti` JOIN `co_tipidocumento` ON `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento` WHERE `co_documenti`.`id` IN (SELECT `iddocumento` FROM `co_righe_documenti` WHERE `idpreventivo` = '.prepare($id_record).')
UNION UNION
SELECT `or_ordini`.`id`, `or_ordini`.`data`, `or_ordini`.`numero`, `or_ordini`.`numero_esterno`, "Ordine cliente" AS tipo_documento, 0 AS dir FROM `or_ordini` JOIN `or_righe_ordini` ON `or_righe_ordini`.`idordine` = `or_ordini`.`id` WHERE `or_righe_ordini`.`idpreventivo` = '.prepare($id_record).' SELECT `or_ordini`.`id`, `or_ordini`.`data`, `or_ordini`.`numero`, `or_ordini`.`numero_esterno`, \'Ordine cliente\', \'Ordini cliente\' FROM `or_ordini` JOIN `or_righe_ordini` ON `or_righe_ordini`.`idordine` = `or_ordini`.`id` WHERE `or_righe_ordini`.`idpreventivo` = '.prepare($id_record).'
UNION
SELECT `in_interventi`.`id`, `in_interventi`.`data_richiesta`, `in_interventi`.`codice`, NULL, \'Attività\', \'Interventi\' FROM `in_interventi` JOIN `in_righe_interventi` ON `in_righe_interventi`.`idintervento` = `in_interventi`.`id` WHERE (`in_righe_interventi`.`original_document_id` = '.prepare($preventivo->id).' AND `in_righe_interventi`.`original_document_type` = '.prepare(get_class($preventivo)).') OR `in_interventi`.`id_preventivo` = '.prepare($id_record).'
ORDER BY `data`'); ORDER BY `data`');
@ -393,15 +396,8 @@ if (!empty($elementi)) {
'_DATE_' => Translator::dateToLocale($elemento['data']), '_DATE_' => Translator::dateToLocale($elemento['data']),
]); ]);
if (in_array($elemento['tipo_documento'], ['Ordine cliente'])) {
$modulo = 'Ordini cliente';
} else {
$modulo = ($elemento['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto';
}
$id = $elemento['id'];
echo ' echo '
<li>'.Modules::link($modulo, $id, $descrizione).'</li>'; <li>'.Modules::link($elemento['modulo'], $elemento['id'], $descrizione).'</li>';
} }
echo ' echo '

View File

@ -19,6 +19,7 @@
namespace Plugins\ImportFE; namespace Plugins\ImportFE;
use Common\Components\Component;
use Modules\Anagrafiche\Anagrafica; use Modules\Anagrafiche\Anagrafica;
use Modules\Articoli\Articolo as ArticoloOriginale; use Modules\Articoli\Articolo as ArticoloOriginale;
use Modules\Articoli\Categoria; use Modules\Articoli\Categoria;
@ -173,8 +174,9 @@ class FatturaOrdinaria extends FatturaElettronica
$obj->descrizione = $riga['Descrizione']; $obj->descrizione = $riga['Descrizione'];
// Collegamento al documento di riferimento // Collegamento al documento di riferimento
if (!empty($tipi_riferimenti[$key])) { if (!empty($tipi_riferimenti[$key]) && is_subclass_of($tipi_riferimenti[$key], Component::class)) {
list($riferimento_precedente, $nuovo_riferimento) = $obj->impostaOrigine($tipi_riferimenti[$key], $id_riferimenti[$key]); $riga_origine = ($tipi_riferimenti[$key])::find($id_riferimenti[$key]);
list($riferimento_precedente, $nuovo_riferimento) = $obj->impostaOrigine($riga_origine);
// Correzione della descrizione // Correzione della descrizione
$obj->descrizione = str_replace($riferimento_precedente, '', $obj->descrizione); $obj->descrizione = str_replace($riferimento_precedente, '', $obj->descrizione);

View File

@ -34,6 +34,8 @@ use InvalidArgumentException;
* *
* @property string original_type * @property string original_type
* @property string original_id * @property string original_id
* @property string original_document_id
* @property string original_document_type
* *
* @template T * @template T
* *
@ -201,8 +203,10 @@ abstract class Component extends Model
// Attributi dell'oggetto da copiare // Attributi dell'oggetto da copiare
$attributes = $this->getAttributes(); $attributes = $this->getAttributes();
unset($attributes['id']);
unset($attributes['order']); // Rimozione attributi problematici
$remove = ['id', 'order', 'original_id', 'original_type', 'original_document_id', 'original_document_type'];
$attributes = array_diff_key($attributes, array_flip($remove));
if ($qta !== null) { if ($qta !== null) {
$attributes['qta'] = $qta; $attributes['qta'] = $qta;
@ -219,18 +223,17 @@ abstract class Component extends Model
// Riferimento di origine per l'evasione automatica della riga // Riferimento di origine per l'evasione automatica della riga
if ($evadi_qta_parent) { if ($evadi_qta_parent) {
// Mantenimento dell'origine della riga precedente // Mantenimento dell'origine della riga precedente
$model->original_id = $attributes['original_id']; // Utilizzato per la rimozione del riferimento precedente dalla descrizione
$model->original_type = $attributes['original_type']; $model->original_id = $this->original_id;
$model->original_type = $this->original_type;
// Aggiornamento dei riferimenti // Aggiornamento dei riferimenti
list($riferimento_precedente, $nuovo_riferimento) = $model->impostaOrigine($current, $this->id); list($riferimento_precedente, $nuovo_riferimento) = $model->impostaOrigine($this);
// Correzione della descrizione // Correzione della descrizione
$attributes['descrizione'] = str_replace($riferimento_precedente, '', $attributes['descrizione']); $attributes['descrizione'] = str_replace($riferimento_precedente, '', $attributes['descrizione']);
$attributes['descrizione'] .= $nuovo_riferimento; $attributes['descrizione'] .= $nuovo_riferimento;
} }
unset($attributes['original_id']);
unset($attributes['original_type']);
// Impostazione del genitore // Impostazione del genitore
$model->setDocument($document); $model->setDocument($document);
@ -266,30 +269,50 @@ abstract class Component extends Model
* *
* @return array * @return array
*/ */
public function impostaOrigine($type, $id) public function impostaOrigine($riga)
{ {
$riferimento_precedente = null; $riferimento_precedente = null;
$nuovo_riferimento = null; $nuovo_riferimento = null;
// Rimozione del riferimento precedente dalla descrizione // Rimozione del riferimento precedente dalla descrizione
if ($this->hasOriginalComponent()) { if ($this->hasOriginalComponent()) {
$riferimento = $this->getOriginalComponent()->getDocument()->getReference(); $riferimento_precedente = self::getDescrizioneRiferimento(
$riferimento_precedente = "\nRif. ".strtolower($riferimento); $this->getOriginalComponent()->getDocument()
);
} }
$this->original_id = $id; // Informazioni del nuovo riferimento
$this->original_type = $type; if (!empty($riga)) {
$this->original_id = $riga->id;
$this->original_type = get_class($riga);
// Aggiunta del riferimento nella descrizione $documento_origine = $riga->getDocument();
$origine = $type::find($id); $this->original_document_id = $documento_origine->id;
if (!empty($origine)) { $this->original_document_type = get_class($documento_origine);
$riferimento = $origine->getDocument()->getReference();
$nuovo_riferimento = "\nRif. ".strtolower($riferimento); // Aggiunta del riferimento nella descrizione
$nuovo_riferimento = self::getDescrizioneRiferimento(
$documento_origine
);
}
// Rimozione dei riferimenti precedenti
else {
$this->original_id = null;
$this->original_type = null;
$this->original_document_id = null;
$this->original_document_type = null;
} }
return [$riferimento_precedente, $nuovo_riferimento]; return [$riferimento_precedente, $nuovo_riferimento];
} }
public static function getDescrizioneRiferimento(Document $origine)
{
$riferimento = $origine->getReference();
return "\nRif. ".strtolower($riferimento);
}
/** /**
* Imposta il proprietario dell'oggetto e l'ordine relativo all'interno delle righe. * Imposta il proprietario dell'oggetto e l'ordine relativo all'interno delle righe.
* *

View File

@ -158,3 +158,22 @@ INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`,
(NULL, 'Piani di sconto/maggiorazione', 'Piani di sconto/magg.', (SELECT `id` FROM `zz_modules` WHERE `name`='Articoli'), (SELECT `id` FROM `zz_modules` WHERE `name`='Articoli'), 'tab', 'piani_sconto_maggiorazione', 'custom'); (NULL, 'Piani di sconto/maggiorazione', 'Piani di sconto/magg.', (SELECT `id` FROM `zz_modules` WHERE `name`='Articoli'), (SELECT `id` FROM `zz_modules` WHERE `name`='Articoli'), 'tab', 'piani_sconto_maggiorazione', 'custom');
UPDATE `zz_modules` SET `name` = 'Piani di sconto/maggiorazione' WHERE `name` = 'Piani di sconto/magg.'; UPDATE `zz_modules` SET `name` = 'Piani di sconto/maggiorazione' WHERE `name` = 'Piani di sconto/magg.';
-- Aggiunta riferimento documenti
ALTER TABLE `co_righe_promemoria` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `in_righe_interventi` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `co_righe_contratti` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `co_righe_preventivi` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `co_righe_documenti` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `or_righe_ordini` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
ALTER TABLE `dt_righe_ddt` ADD `original_document_type` varchar(255) AFTER `original_type`, ADD `original_document_id` int(11) AFTER `original_type`;
UPDATE `co_righe_documenti` SET `original_document_id` = `idcontratto`, `original_document_type` = 'Modules\\Contratti\\Contratto' WHERE `idcontratto` != 0;
UPDATE `co_righe_documenti` SET `original_document_id` = `idpreventivo`, `original_document_type` = 'Modules\\Preventivi\\Preventivo' WHERE `idpreventivo` != 0;
UPDATE `co_righe_documenti` SET `original_document_id` = `idintervento`, `original_document_type` = 'Modules\\Interventi\\Intervento' WHERE `idintervento` IS NOT NULL;
UPDATE `co_righe_documenti` SET `original_document_id` = `idordine`, `original_document_type` = 'Modules\\Ordini\\Ordine' WHERE `idordine` != 0;
UPDATE `co_righe_documenti` SET `original_document_id` = `idintervento`, `original_document_type` = 'Modules\\DDT\\DDT' WHERE `idddt` != 0;
UPDATE `dt_righe_ddt` SET `original_document_id` = `idordine`, `original_document_type` = 'Modules\\Ordini\\Ordine' WHERE `idordine` != 0;
UPDATE `or_righe_ordini` SET `original_document_id` = `idpreventivo`, `original_document_type` = 'Modules\\Preventivi\\Preventivo' WHERE `idpreventivo` != 0;