From 5976e096f5024841bb8b4005fd0522edcc1a0813 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Thu, 1 Sep 2022 12:52:33 +0200 Subject: [PATCH] Aggiunta anagrafica nelle scadenze e migliorie creazione file xml --- composer.json | 2 +- modules/fatture/src/Gestori/Scadenze.php | 3 +- modules/scadenzario/actions.php | 3 +- modules/scadenzario/add.php | 12 ++-- modules/scadenzario/edit.php | 59 ++++++++----------- modules/scadenzario/init.php | 2 +- modules/scadenzario/src/Scadenza.php | 9 ++- plugins/presentazioni_bancarie/actions.php | 32 +++++----- plugins/presentazioni_bancarie/generate.php | 4 +- .../presentazioni_bancarie/src/Gestore.php | 28 +++++---- update/2_4_36.php | 12 ++++ update/2_4_36.sql | 16 ++++- 12 files changed, 109 insertions(+), 73 deletions(-) create mode 100644 update/2_4_36.php diff --git a/composer.json b/composer.json index 46fdc7082..d686ff4fb 100755 --- a/composer.json +++ b/composer.json @@ -59,7 +59,7 @@ "symfony/var-dumper": "^3.3", "thenetworg/oauth2-azure": "^2.0", "willdurand/geocoder": "^4.2", - "digitick/sepa-xml": "^1.6", + "digitick/sepa-xml": "^2.1", "wdog/sdd_ita": "dev-master" }, "require-dev": { diff --git a/modules/fatture/src/Gestori/Scadenze.php b/modules/fatture/src/Gestori/Scadenze.php index fac9f9d43..e8051189e 100644 --- a/modules/fatture/src/Gestori/Scadenze.php +++ b/modules/fatture/src/Gestori/Scadenze.php @@ -101,8 +101,9 @@ class Scadenze { $numero = $fattura->numero_esterno ?: $fattura->numero; $descrizione = $fattura->tipo->descrizione.' numero '.$numero; + $idanagrafica = $fattura->idanagrafica; - $scadenza = Scadenza::build($descrizione, $importo, $data_scadenza, $type, $is_pagato); + $scadenza = Scadenza::build($idanagrafica, $descrizione, $importo, $data_scadenza, $type, $is_pagato); $scadenza->documento()->associate($fattura); $scadenza->data_emissione = $fattura->data; diff --git a/modules/scadenzario/actions.php b/modules/scadenzario/actions.php index 159c82984..c09857e4c 100755 --- a/modules/scadenzario/actions.php +++ b/modules/scadenzario/actions.php @@ -21,12 +21,13 @@ include_once __DIR__.'/../../core.php'; switch (post('op')) { case 'add': + $idanagrafica = post('idanagrafica'); $data = post('data'); $tipo = post('tipo'); $da_pagare = post('da_pagare'); $descrizione = post('descrizione'); - $dbo->query('INSERT INTO co_scadenziario(descrizione, tipo, data_emissione, scadenza, da_pagare, pagato) VALUES('.prepare($descrizione).', '.prepare($tipo).', CURDATE(), '.prepare($data).', '.prepare($da_pagare).", '0')"); + $dbo->query('INSERT INTO co_scadenziario(idanagrafica, descrizione, tipo, data_emissione, scadenza, da_pagare, pagato) VALUES('.prepare($idanagrafica).', '.prepare($descrizione).', '.prepare($tipo).', CURDATE(), '.prepare($data).', '.prepare($da_pagare).", '0')"); $id_record = $dbo->lastInsertedID(); flash()->info(tr('Scadenza inserita!')); diff --git a/modules/scadenzario/add.php b/modules/scadenzario/add.php index 7b5cb4ba8..b521966a6 100755 --- a/modules/scadenzario/add.php +++ b/modules/scadenzario/add.php @@ -28,15 +28,19 @@ include_once __DIR__.'/../../core.php';
- {[ "type": "select", "label": "", "name": "tipo", "required": 1, "ajax-source": "tipi_scadenze", "icon-after": "add|" ]} + {[ "type": "select", "label": "", "name": "idanagrafica", "required": 1, "ajax-source": "anagrafiche" ]}
- {[ "type": "date", "label": "", "name": "data", "required": 1, "value": "-now-" ]} + {[ "type": "select", "label": "", "name": "tipo", "required": 1, "ajax-source": "tipi_scadenze", "icon-after": "add|" ]}
-
- {[ "type": "number", "label": "", "name": "da_pagare", "required": 1, "value": "", "help": "Le scadenze inserite con importo positivo indicano un credito da un cliente, le scadenze inserite con importo negativo indicano un debito verso un fornitore" ]} +
+ {[ "type": "date", "label": "", "name": "data", "required": 1, "value": "-now-" ]} +
+ +
+ {[ "type": "number", "label": "", "name": "da_pagare", "required": 1, "value": "", "help": "Le scadenze inserite con importo positivo indicano un credito da un cliente, le scadenze inserite con importo negativo indicano un debito verso un fornitore" ]}
diff --git a/modules/scadenzario/edit.php b/modules/scadenzario/edit.php index c1f0bda90..edfd4122c 100755 --- a/modules/scadenzario/edit.php +++ b/modules/scadenzario/edit.php @@ -46,18 +46,16 @@ echo '
-
'; - -if (!empty($documento)) { - echo ' +
- + - - + '; +if (!empty($documento)) { + echo ' @@ -76,8 +74,20 @@ if (!empty($documento)) { - + '; +} else { + + $scadenza = $dbo->fetchOne('SELECT * FROM co_scadenziario WHERE id = '.prepare($id_record)); + echo ' + + + + '; +} +echo '
'.($dir == 'entrata' ? tr('Cliente') : tr('Fornitore')).':'.($dir == 'entrata' ? tr('Cliente') : ($dir == 'uscita' ? tr('Fornitore') : tr('Anagrafica'))).': - '.Modules::link('Anagrafiche', $documento->anagrafica->id, $documento->anagrafica->ragione_sociale).' + '.Modules::link('Anagrafiche', $record['idanagrafica'], $record['ragione_sociale']).'
'.tr('Documento').': '.$documento->tipo->descrizione.'
'.tr('Netto a pagare').': '.moneyFormat($documento->netto).'
'.tr('Descrizione').': + {[ "type": "textarea", "name": "descrizione", "value": "'.$record['descrizione'].'" ]} +
'.tr('Note').': @@ -99,31 +109,12 @@ if (!empty($documento)) { }else{ $export_riba = ' '.tr('Non ancora esportata'); } - - echo ' - -
- - '.Modules::link($documento->module, $record['iddocumento'], ' '.tr('Apri documento'), null, 'class="btn btn-primary"'); -} else { - $scadenza = $dbo->fetchOne('SELECT * FROM co_scadenziario WHERE id = '.prepare($id_record)); - - echo input([ - 'type' => 'textarea', - 'label' => tr('Descrizione'), - 'name' => 'descrizione', - 'required' => 1, - 'value' => $scadenza['descrizione'], - ]); - - echo input([ - 'type' => 'text', - 'label' => tr('Info distinta'), - 'name' => 'distinta', - 'value' => $scadenza['distinta'], - ]); -} - +echo ' + '; + + if (!empty($documento)) { + echo Modules::link($documento->module, $record['iddocumento'], ' '.tr('Apri documento'), null, 'class="btn btn-primary"'); + } echo '
diff --git a/modules/scadenzario/init.php b/modules/scadenzario/init.php index 9b7d6ad1c..b93db7463 100755 --- a/modules/scadenzario/init.php +++ b/modules/scadenzario/init.php @@ -22,7 +22,7 @@ use Modules\Fatture\Fattura; include_once __DIR__.'/../../core.php'; if (isset($id_record)) { - $record = $dbo->fetchOne('SELECT * FROM co_scadenziario WHERE id = '.prepare($id_record)); + $record = $dbo->fetchOne('SELECT co_scadenziario.*, an_anagrafiche.ragione_sociale FROM co_scadenziario LEFT JOIN an_anagrafiche ON co_scadenziario.idanagrafica=an_anagrafiche.idanagrafica WHERE id = '.prepare($id_record)); $documento = Fattura::find($record['iddocumento']); // Scelgo la query in base alla scadenza diff --git a/modules/scadenzario/src/Scadenza.php b/modules/scadenzario/src/Scadenza.php index d846cb490..905b1de60 100755 --- a/modules/scadenzario/src/Scadenza.php +++ b/modules/scadenzario/src/Scadenza.php @@ -21,6 +21,7 @@ namespace Modules\Scadenzario; use Common\SimpleModelTrait; use Illuminate\Database\Eloquent\Model; +use Modules\Anagrafiche\Anagrafica; use Modules\Fatture\Fattura; class Scadenza extends Model @@ -34,10 +35,11 @@ class Scadenza extends Model 'data_pagamento', ]; - public static function build($descrizione, $importo, $data_scadenza, $type = 'fattura', $is_pagato = false) + public static function build($idanagrafica, $descrizione, $importo, $data_scadenza, $type = 'fattura', $is_pagato = false) { $model = new static(); + $model->idanagrafica = $idanagrafica; $model->descrizione = $descrizione; $model->scadenza = $data_scadenza; $model->da_pagare = $importo; @@ -55,4 +57,9 @@ class Scadenza extends Model { return $this->belongsTo(Fattura::class, 'iddocumento'); } + + public function anagrafica() + { + return $this->belongsTo(Anagrafica::class, 'idanagrafica'); + } } diff --git a/plugins/presentazioni_bancarie/actions.php b/plugins/presentazioni_bancarie/actions.php index 08781cfc2..b2d6aab85 100644 --- a/plugins/presentazioni_bancarie/actions.php +++ b/plugins/presentazioni_bancarie/actions.php @@ -38,24 +38,22 @@ switch (filter('op')) { foreach ($scadenze as $key => $scadenza) { $documento = $scadenza->documento; - if (empty($documento)) { - continue; - } + $descrizione = $scadenza->descrizione; + if (!empty($documento)) { + // Individuazione altre scadenze del documento + $scadenze_documento = $documento->scadenze->sortBy('scadenza'); + $pos = $scadenze_documento->search(function ($item, $key) use ($scadenza) { + return $item->id == $scadenza->id; + }); - // Individuazione altre scadenze del documento - $scadenze_documento = $documento->scadenze->sortBy('scadenza'); - $pos = $scadenze_documento->search(function ($item, $key) use ($scadenza) { - return $item->id == $scadenza->id; - }); - - // Generazione della descrizione del pagamento - $descrizione = $documento->getReference(); - if ($scadenze_documento->count() > 1) { - $descrizione .= tr('_DOC_, pagamento _NUM_/_TOT_', [ - '_DOC_' => $descrizione, - '_NUM_' => $pos + 1, - '_TOT_' => $scadenze_documento->count(), - ]); + // Generazione della descrizione del pagamento + if ($scadenze_documento->count() > 1) { + $descrizione .= tr('_DOC_, pagamento _NUM_/_TOT_', [ + '_DOC_' => $descrizione, + '_NUM_' => $pos + 1, + '_TOT_' => $scadenze_documento->count(), + ]); + } } // Controllo sulla banca aziendale collegata alla scadenza diff --git a/plugins/presentazioni_bancarie/generate.php b/plugins/presentazioni_bancarie/generate.php index e24642888..a01f47b35 100644 --- a/plugins/presentazioni_bancarie/generate.php +++ b/plugins/presentazioni_bancarie/generate.php @@ -58,7 +58,7 @@ if (!$esporta_processati) { $scadenze = $scadenze->get(); $id_scadenze = $scadenze->pluck('id'); -$raggruppamento = $scadenze->groupBy('documento.idanagrafica'); +$raggruppamento = $scadenze->groupBy('idanagrafica'); if ($raggruppamento->isEmpty()) { echo '

'.tr('Nessun pagamento disponibile secondo la selezione effettuata').'.

'; @@ -67,7 +67,7 @@ if ($raggruppamento->isEmpty()) { } foreach ($raggruppamento as $id_anagrafica => $scadenze_anagrafica) { - $anagrafica = $scadenze_anagrafica->first()->documento->anagrafica; + $anagrafica = $scadenze_anagrafica->first()->anagrafica; echo '

diff --git a/plugins/presentazioni_bancarie/src/Gestore.php b/plugins/presentazioni_bancarie/src/Gestore.php index 2aaac2b6b..8f491e866 100644 --- a/plugins/presentazioni_bancarie/src/Gestore.php +++ b/plugins/presentazioni_bancarie/src/Gestore.php @@ -128,17 +128,19 @@ class Gestore public function aggiungi(Scadenza $scadenza, int $identifier, string $descrizione, string $codice_sequenza = null) { $documento = $scadenza->documento; - $controparte = $documento->anagrafica; + $controparte = $scadenza->anagrafica; $banca_controparte = self::getBancaControparte($scadenza); if (empty($banca_controparte)) { return false; } + $ctgypurp = $this->getTipo($scadenza)['ctgypurp'] ?: 'SUPP'; $pagamento = $documento->pagamento; $direzione = $documento->direzione; + $importo = $scadenza->da_pagare - $scadenza->pagato; $totale = (abs($scadenza->da_pagare) - abs($scadenza->pagato)); - $is_credito_diretto = $direzione == 'uscita' && in_array($pagamento->codice_modalita_pagamento_fe, ['MP09', 'MP10', 'MP11', 'MP19', 'MP20', 'MP21']); + $is_credito_diretto = ($direzione == 'uscita' && in_array($pagamento->codice_modalita_pagamento_fe, ['MP05','MP09', 'MP10', 'MP11', 'MP19', 'MP20', 'MP21'])) || (empty($documento) && $importo < 0); $is_debito_diretto = $direzione == 'entrata' && in_array($pagamento->codice_modalita_pagamento_fe, ['MP09', 'MP10', 'MP11', 'MP19', 'MP20', 'MP21']) && !empty($this->banca_azienda->creditor_id); // Mandato SEPA disponibile $is_riba = $direzione == 'entrata' && in_array($pagamento->codice_modalita_pagamento_fe, ['MP12']) && !empty($this->banca_azienda->codice_sia); @@ -149,7 +151,7 @@ class Gestore } if ($is_credito_diretto) { - return $this->aggiungiCreditoDiretto($identifier, $controparte, $banca_controparte, $descrizione, $totale, $scadenza->scadenza); + return $this->aggiungiCreditoDiretto($identifier, $controparte, $banca_controparte, $descrizione, $totale, $scadenza->scadenza, $ctgypurp); } elseif ($is_debito_diretto) { return $this->aggiungiDebitoDiretto($identifier, $controparte, $banca_controparte, $descrizione, $totale, $scadenza->scadenza, $method, $codice_sequenza); } elseif ($is_riba) { @@ -213,27 +215,29 @@ class Gestore return true; } - public function aggiungiCreditoDiretto(int $identifier, Anagrafica $controparte, Banca $banca_controparte, string $descrizione, $totale, DateTime $data_prevista) + public function aggiungiCreditoDiretto(int $identifier, Anagrafica $controparte, Banca $banca_controparte, string $descrizione, $totale, DateTime $data_prevista, $ctgypurp) { $id = 'pagamento_'.$identifier; // Esportazione del pagamento - $this->credito_diretto->addPaymentInfo($id, [ + $payment = $this->credito_diretto->addPaymentInfo($id, [ 'id' => $identifier, - 'dueDate' => $data_prevista->format('dmy'), + 'dueDate' => $data_prevista->format('Y-m-d'), 'debtorName' => $this->azienda->ragione_sociale, 'debtorAccountIBAN' => $this->banca_azienda->iban, 'debtorAgentBIC' => $this->banca_azienda->bic, ]); $this->credito_diretto->addTransfer($id, [ - 'amount' => $totale, + 'amount' => $totale*100, 'creditorIban' => $banca_controparte->iban, 'creditorBic' => $banca_controparte->bic, 'creditorName' => $controparte->ragione_sociale, 'remittanceInformation' => $descrizione, ]); + $payment->setCategoryPurposeCode($ctgypurp); + return true; } @@ -255,7 +259,7 @@ class Gestore // Add a Single Transaction to the named payment $mandato = $this->getMandato($banca_controparte); $this->debito_diretto->addTransfer($id, [ - 'amount' => $totale, + 'amount' => $totale*100, 'debtorName' => $controparte->ragione_sociale, 'debtorIban' => $banca_controparte->iban, 'debtorBic' => $banca_controparte->bic, @@ -305,11 +309,10 @@ class Gestore public static function getBancaControparte(Scadenza $scadenza): ?Banca { $documento = $scadenza->documento; - $anagrafica = $documento->anagrafica; $banca_controparte = $documento->id_banca_controparte ? Banca::find($documento->id_banca_controparte) : null; if (empty($banca_controparte)) { - $banca_controparte = Banca::where('id_anagrafica', $anagrafica->id) + $banca_controparte = Banca::where('id_anagrafica', $scadenza->idanagrafica) ->where('predefined', 1) ->first(); } @@ -419,4 +422,9 @@ class Gestore return []; } } + + protected function getTipo(Scadenza $scadenza) + { + return database()->fetchOne('SELECT * FROM co_tipi_scadenze WHERE nome = '.prepare($scadenza->tipo)); + } } diff --git a/update/2_4_36.php b/update/2_4_36.php new file mode 100644 index 000000000..c5db43ee6 --- /dev/null +++ b/update/2_4_36.php @@ -0,0 +1,12 @@ +fetchArray('SELECT * FROM co_scadenziario'); + +foreach ($scadenze as $scadenza) { + $idanagrafica = $dbo->selectOne('co_documenti', 'idanagrafica', ['id' => $scadenza['iddocumento']])['idanagrafica']; + $dbo->update('co_scadenziario', [ + 'idanagrafica' => $idanagrafica ?: setting('Azienda predefinita'), + ], ['id' => $scadenza['id']]); +} + +?> \ No newline at end of file diff --git a/update/2_4_36.sql b/update/2_4_36.sql index 4edccd024..dec7c1030 100644 --- a/update/2_4_36.sql +++ b/update/2_4_36.sql @@ -4,4 +4,18 @@ ALTER TABLE `in_interventi` ADD CONSTRAINT `in_interventi_ibfk_3` FOREIGN KEY (` ALTER TABLE `in_interventi` DROP FOREIGN KEY `in_interventi_ibfk_4`; ALTER TABLE `in_interventi` ADD CONSTRAINT `in_interventi_ibfk_4` FOREIGN KEY (`id_contratto`) REFERENCES `co_contratti`(`id`) ON DELETE SET NULL ON UPDATE RESTRICT; ALTER TABLE `in_interventi` DROP FOREIGN KEY `in_interventi_ibfk_7`; -ALTER TABLE `in_interventi` ADD CONSTRAINT `in_interventi_ibfk_7` FOREIGN KEY (`id_ordine`) REFERENCES `or_ordini`(`id`) ON DELETE SET NULL ON UPDATE RESTRICT; \ No newline at end of file +ALTER TABLE `in_interventi` ADD CONSTRAINT `in_interventi_ibfk_7` FOREIGN KEY (`id_ordine`) REFERENCES `or_ordini`(`id`) ON DELETE SET NULL ON UPDATE RESTRICT; + +-- Aggiunta anagrafica alle scadenze +ALTER TABLE `co_scadenziario` ADD `idanagrafica` INT NOT NULL AFTER `iddocumento`; + +-- Aggiunto campo ctgypurp per esportazione xml bonifici +ALTER TABLE `co_tipi_scadenze` ADD `ctgypurp` VARCHAR(255) NOT NULL AFTER `descrizione`; + +UPDATE `co_tipi_scadenze` SET `ctgypurp` = 'TAXS' WHERE `co_tipi_scadenze`.`nome` = 'f24'; +UPDATE `co_tipi_scadenze` SET `ctgypurp` = 'SUPP' WHERE `co_tipi_scadenze`.`nome` = 'generico'; +INSERT INTO `co_tipi_scadenze` (`id`, `nome`, `descrizione`, `ctgypurp`, `can_delete`) VALUES (NULL, 'stipendio', 'Stipendi', 'SALA', '1'); + +UPDATE `zz_views` SET `query` = 'an_anagrafiche.ragione_sociale' WHERE `zz_views`.`name` = 'Anagrafica' AND `id_module`=(SELECT `id` FROM `zz_modules` WHERE `name`='Scadenzario'); + +UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_scadenziario`\nLEFT JOIN `co_documenti` ON `co_scadenziario`.`iddocumento` = `co_documenti`.`id`\nLEFT JOIN `an_anagrafiche` ON `co_scadenziario`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\nLEFT JOIN `co_pagamenti` ON `co_documenti`.`idpagamento` = `co_pagamenti`.`id`\nLEFT JOIN `co_tipidocumento` ON `co_documenti`.`idtipodocumento` = `co_tipidocumento`.`id`\nLEFT JOIN `co_statidocumento` ON `co_documenti`.`idstatodocumento` = `co_statidocumento`.`id`\nLEFT JOIN (\n SELECT `zz_operations`.`id_email`, `zz_operations`.`id_record`\n FROM `zz_operations`\n INNER JOIN `em_emails` ON `zz_operations`.`id_email` = `em_emails`.`id`\n INNER JOIN `em_templates` ON `em_emails`.`id_template` = `em_templates`.`id`\n INNER JOIN `zz_modules` ON `zz_operations`.`id_module` = `zz_modules`.`id`\n WHERE `zz_modules`.`name` = \'Scadenzario\' AND `zz_operations`.`op` = \'send-email\'\n GROUP BY `zz_operations`.`id_record`\n ) AS `email` ON `email`.`id_record` = `co_scadenziario`.`id`\nWHERE 1=1 AND\n(`co_statidocumento`.`descrizione` IS NULL OR `co_statidocumento`.`descrizione` IN(\'Emessa\',\'Parzialmente pagato\',\'Pagato\'))\nHAVING 2=2\nORDER BY `scadenza` ASC' WHERE `zz_modules`.`name` = 'Scadenzario'; \ No newline at end of file