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
// 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
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)) {
echo '
@ -455,31 +458,15 @@ if (!empty($elementi)) {
<ul>';
// Elenco attività o contratti collegati
foreach ($elementi as $riga) {
if (!empty($riga['dir'])) {
$descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [
'_DOC_' => $riga['tipo_documento'],
'_NUM_' => !empty($riga['numero_esterno']) ? $riga['numero_esterno'] : $riga['numero'],
'_DATE_' => Translator::dateToLocale($riga['data']),
]);
foreach ($elementi as $elemento) {
$descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [
'_DOC_' => $elemento['tipo_documento'],
'_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']),
]);
$modulo = ($riga['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto';
$id = $riga['id'];
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 '
<li>'.Modules::link($elemento['modulo'], $elemento['id'], $descrizione).'</li>';
}
echo '

View File

@ -51,8 +51,8 @@ echo '
$rs = $dbo->fetchArray('SELECT
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(\'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\'), " [", `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\')) AS info,
CONCAT(\'\n\', in_interventi.descrizione) AS descrizione_intervento,
IF(idclientefinale='.prepare($idanagrafica).', \'Interventi conto terzi\', \'Interventi diretti\') AS `optgroup`
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'],
'_DATE_' => Translator::dateToLocale($intervento['data']),
'_STATE_' => $intervento['stato'],

View File

@ -158,7 +158,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$sessioni = $intervento->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,
]));
} else {
@ -171,7 +171,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$sessione = $gruppo->first();
$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,
'_DATE_' => dateFormat($data),
]);
@ -202,7 +202,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$diritto_chiamata = $gruppo->first();
$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,
'_DATE_' => dateFormat($data),
]);
@ -236,7 +236,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$viaggio = $gruppo->first();
$riga = Riga::build($fattura);
$riga->descrizione = tr("Trasferta dell'intervento _NUM_ del _DATE_", [
$riga->descrizione = tr("Trasferta dell'attività _NUM_ del _DATE_", [
'_NUM_' => $codice,
'_DATE_' => dateFormat($data),
]);

View File

@ -364,11 +364,14 @@ $(document).ready(function() {
});
</script>';
//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).')
// 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, 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
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`');
@ -393,15 +396,8 @@ if (!empty($elementi)) {
'_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 '
<li>'.Modules::link($modulo, $id, $descrizione).'</li>';
<li>'.Modules::link($elemento['modulo'], $elemento['id'], $descrizione).'</li>';
}
echo '

View File

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

View File

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

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');
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;