From 2e7f11d2c5e7cdf4d6184d69189c4d16b1a6be5a Mon Sep 17 00:00:00 2001 From: Pek5892 Date: Fri, 24 Nov 2023 13:20:00 +0100 Subject: [PATCH] Aggiunta tipo di pagamento e banca accredito e addebito in scadenza --- modules/fatture/edit.php | 55 ++++--- modules/fatture/src/Gestori/Scadenze.php | 9 +- modules/primanota/src/Mastrino.php | 34 +++-- modules/scadenzario/actions.php | 11 +- modules/scadenzario/add.php | 22 ++- modules/scadenzario/edit.php | 186 +++++++++++++++-------- modules/scadenzario/src/Scadenza.php | 7 +- templates/fatture/footer.php | 14 +- update/2_4_52.sql | 6 +- 9 files changed, 220 insertions(+), 124 deletions(-) diff --git a/modules/fatture/edit.php b/modules/fatture/edit.php index 17dee4845..c6181af61 100755 --- a/modules/fatture/edit.php +++ b/modules/fatture/edit.php @@ -371,10 +371,38 @@ $query .= ' ORDER BY descrizione'; echo Modules::link('Banche', $record['id_banca_azienda'], null, null, 'class="pull-right"'); } ?> - {[ "type": "select", "label": "", "name": "id_banca_azienda", "ajax-source": "banche", "select-options": $anagrafica_azienda->id]); ?>, "value": "$id_banca_azienda$", "icon-after": "add||id_anagrafica=id; ?>", "extra": " " ]} + {[ "type": "select", "label": "", "name": "id_banca_azienda", "ajax-source": "banche", "select-options": $anagrafica_azienda->id]); ?>, "value": "$id_banca_azienda$", "icon-after": "add||id_anagrafica=id; ?>", "extra": " " ]} +
+ + {[ "type": "select", "label": "", "name": "id_banca_controparte", "ajax-source": "banche", "select-options": $record['idanagrafica']]); ?>, "value": "$id_banca_controparte$", "icon-after": "add||idanagrafica=", "extra": " " ]} +
+ + + +
+ +
+ {[ "type": "checkbox", "label": "", "name": "split_payment", "value": "$split_payment$", "help": "", "placeholder": "" ]} +
+ + +
+ {[ "type": "checkbox", "label": "", "name": "is_fattura_conto_terzi", "value": "$is_fattura_conto_terzi$", "help": "fetchOne('SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica = '.prepare(setting('Azienda predefinita')))['ragione_sociale']).') come cessionario e il cliente come cedente/prestatore.'); ?>", "placeholder": "" ]} +
+ + + {[ "type": "number", "label": "'.tr('Sconto in fattura').'", "name": "sconto_finale", "value": "'.($fattura->sconto_finale_percentuale ?: $fattura->sconto_finale).'", "icon-after": "choice|untprc|'.(empty($fattura->sconto_finale) ? 'PRC' : 'UNT').'", "help": "'.tr('Sconto in fattura, utilizzabile per applicare sconti sul Netto a pagare del documento e le relative scadenze').'. '.tr('Per utilizzarlo in relazione a una riga della Fattura Elettronica, inserire il tipo di dato in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'TipoDato\'\' e il testo di descrizione in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'RiferimentoTesto\'\' della specifica riga').'. '.tr('Nota: lo sconto in fattura non influenza i movimenti contabili').'." ]} +
'; + } - scadenze; @@ -431,29 +459,6 @@ $query .= ' ORDER BY descrizione'; '; } ?> - - - -
- -
- {[ "type": "checkbox", "label": "", "name": "split_payment", "value": "$split_payment$", "help": "", "placeholder": "" ]} -
- - -
- {[ "type": "checkbox", "label": "", "name": "is_fattura_conto_terzi", "value": "$is_fattura_conto_terzi$", "help": "fetchOne('SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica = '.prepare(setting('Azienda predefinita')))['ragione_sociale']).') come cessionario e il cliente come cedente/prestatore.'); ?>", "placeholder": "" ]} -
- - - {[ "type": "number", "label": "'.tr('Sconto in fattura').'", "name": "sconto_finale", "value": "'.($fattura->sconto_finale_percentuale ?: $fattura->sconto_finale).'", "icon-after": "choice|untprc|'.(empty($fattura->sconto_finale) ? 'PRC' : 'UNT').'", "help": "'.tr('Sconto in fattura, utilizzabile per applicare sconti sul Netto a pagare del documento e le relative scadenze').'. '.tr('Per utilizzarlo in relazione a una riga della Fattura Elettronica, inserire il tipo di dato in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'TipoDato\'\' e il testo di descrizione in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'RiferimentoTesto\'\' della specifica riga').'. '.tr('Nota: lo sconto in fattura non influenza i movimenti contabili').'." ]} -
'; - } - ?>
diff --git a/modules/fatture/src/Gestori/Scadenze.php b/modules/fatture/src/Gestori/Scadenze.php index e8051189e..4284db070 100644 --- a/modules/fatture/src/Gestori/Scadenze.php +++ b/modules/fatture/src/Gestori/Scadenze.php @@ -97,13 +97,13 @@ class Scadenze * @param bool $is_pagato * @param string $type */ - protected function registraScadenza(Fattura $fattura, $importo, $data_scadenza, $is_pagato, $type = 'fattura') + protected function registraScadenza(Fattura $fattura, $importo, $data_scadenza, $is_pagato, $tipo_pagamento, $id_banca_azienda, $id_banca_controparte, $type = 'fattura') { $numero = $fattura->numero_esterno ?: $fattura->numero; $descrizione = $fattura->tipo->descrizione.' numero '.$numero; $idanagrafica = $fattura->idanagrafica; - $scadenza = Scadenza::build($idanagrafica, $descrizione, $importo, $data_scadenza, $type, $is_pagato); + $scadenza = Scadenza::build($idanagrafica, $descrizione, $importo, $data_scadenza, $tipo_pagamento, $id_banca_azienda, $id_banca_controparte, $type, $is_pagato); $scadenza->documento()->associate($fattura); $scadenza->data_emissione = $fattura->data; @@ -164,8 +164,11 @@ class Scadenze foreach ($rate as $rata) { $scadenza = $rata['scadenza']; $importo = $direzione == 'uscita' ? -$rata['importo'] : $rata['importo']; + $tipo_pagamento = $this->fattura->idpagamento; + $id_banca_azienda = $this->fattura->id_banca_azienda; + $id_banca_controparte = $this->fattura->id_banca_controparte; - self::registraScadenza($this->fattura, $importo, $scadenza, $is_pagato); + self::registraScadenza($this->fattura, $importo, $scadenza, $is_pagato, $tipo_pagamento, $id_banca_azienda, $id_banca_controparte); } } } diff --git a/modules/primanota/src/Mastrino.php b/modules/primanota/src/Mastrino.php index 5a5f6784b..605e8df4c 100755 --- a/modules/primanota/src/Mastrino.php +++ b/modules/primanota/src/Mastrino.php @@ -192,8 +192,27 @@ class Mastrino extends Model $is_nota = false; $documento = $documento ?: $scadenza->documento; + if ($scadenza && empty($documento)) { + $scadenze = [$scadenza]; + $dir = $movimento->totale < 0 ? 'uscita' : 'entrata'; + + $totale_da_distribuire = Movimento::where('id_scadenza', '=', $scadenza->id) + ->where('totale', '>', 0) + ->sum('totale'); + } + + else if ($scadenza) { + $scadenze = [$scadenza]; + $dir = $documento->direzione; + + $totale_da_distribuire = Movimento::where('id_scadenza', '=', $scadenza->id) + ->where('totale', '>', 0) + ->sum('totale'); + } + + // Gestione delle scadenze di un documento - if ($documento) { + else if ($documento) { $dir = $documento->direzione; $scadenze = $documento->scadenze->sortBy('scadenza'); @@ -213,20 +232,11 @@ class Mastrino extends Model $is_nota = $documento->isNota(); } - // Gestione di una singola scadenza - else { - $scadenze = [$scadenza]; - $dir = $movimento->totale < 0 ? 'uscita' : 'entrata'; - - $totale_da_distribuire = Movimento::where('id_scadenza', '=', $scadenza->id) - ->where('totale', '>', 0) - ->sum('totale'); - } - $totale_da_distribuire = abs($totale_da_distribuire); // Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato // Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive + foreach ($scadenze as $scadenza) { $scadenza_da_pagare = abs($scadenza['da_pagare']); @@ -248,7 +258,7 @@ class Mastrino extends Model } // Inversione di segno per la direzione del movimento contabile - $pagato = $dir == 'uscita' ? -$pagato : $pagato; + $pagato = ($dir == 'uscita' ? -$pagato : $pagato); $pagato = $is_nota ? -$pagato : $pagato; // Inversione di segno per le note // Salvataggio delle informazioni diff --git a/modules/scadenzario/actions.php b/modules/scadenzario/actions.php index 49735af37..447e11b28 100755 --- a/modules/scadenzario/actions.php +++ b/modules/scadenzario/actions.php @@ -40,16 +40,17 @@ switch (post('op')) { $tipo = post('tipo'); $descrizione = post('descrizione'); $iddocumento = post('iddocumento') ?: 0; + $scadenze = Scadenza::where('iddocumento', $iddocumento)->get(); $totale_pagato = 0; $id_scadenza_non_completa = null; - foreach (post('da_pagare') as $id => $da_pagare) { + foreach ($scadenze as $id => $scadenza) { $pagato = post('pagato')[$id]; $scadenza = post('scadenza')[$id]; $data_concordata = post('data_concordata')[$id]; $pagato = floatval($pagato); - $da_pagare = floatval($da_pagare); + $da_pagare = post('da_pagare')[$id]; if (!empty($iddocumento)) { $id_tipo = $dbo->selectOne('co_documenti', 'idtipodocumento', ['id' => $iddocumento])['idtipodocumento']; @@ -78,6 +79,9 @@ switch (post('op')) { } $totale_pagato = sum($totale_pagato, $pagato); + $tipo_pagamento = post('tipo_pagamento')[$id]; + $id_banca_azienda = post('id_banca_azienda')[$id]; + $id_banca_controparte = post('id_banca_controparte')[$id]; $id_scadenza = post('id_scadenza')[$id]; if (!empty($id_scadenza)) { @@ -88,6 +92,9 @@ switch (post('op')) { 'pagato' => $pagato, 'scadenza' => $scadenza, 'data_concordata' => $data_concordata, + 'tipo_pagamento' => $tipo_pagamento, + 'id_banca_azienda' => $id_banca_azienda, + 'id_banca_controparte' => $id_banca_controparte, 'note' => post('note'), 'distinta' => post('distinta') ?: null, ], ['id' => $id_scadenza]); diff --git a/modules/scadenzario/add.php b/modules/scadenzario/add.php index b521966a6..8648a649e 100755 --- a/modules/scadenzario/add.php +++ b/modules/scadenzario/add.php @@ -27,26 +27,32 @@ include_once __DIR__.'/../../core.php';
-
+
{[ "type": "select", "label": "", "name": "idanagrafica", "required": 1, "ajax-source": "anagrafiche" ]}
-
+
{[ "type": "select", "label": "", "name": "tipo", "required": 1, "ajax-source": "tipi_scadenze", "icon-after": "add|" ]}
- -
+
+
+
{[ "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" ]}
-
- {[ "type": "textarea", "label": "", "name": "descrizione", "required": 1, "value": "" ]} + 'ckeditor', + 'label' => tr('Descrizione'), + 'name' => 'descrizione', + 'required' => 1, + 'value' => "", + ]); ?> +
diff --git a/modules/scadenzario/edit.php b/modules/scadenzario/edit.php index b6cf60529..401285ddd 100755 --- a/modules/scadenzario/edit.php +++ b/modules/scadenzario/edit.php @@ -37,8 +37,6 @@ echo '

'.tr('Dettagli scadenza').' -

@@ -66,7 +64,9 @@ if (!empty($documento)) { '.tr('Numero').': '.$numero.' + + @@ -75,31 +75,53 @@ if (!empty($documento)) { - '; -} else { - $scadenza = $dbo->fetchOne('SELECT * FROM co_scadenziario WHERE id = '.prepare($id_record)); - echo ' - - - - '; -} - -echo ' - - - - + +
'.tr('Data').': '.Translator::dateToLocale($documento->data).'
'.tr('Netto a pagare').': '.moneyFormat($documento->netto).'
'.tr('Descrizione').': - {[ "type": "textarea", "name": "descrizione", "value": "'.$record['descrizione'].'" ]} -
'.tr('Note').': - {[ "type": "textarea", "name": "note", "value": "'.$record['note'].'" ]} -
'.tr('Info distinta').' : {[ "type": "text", "name": "distinta", "value": "'.$record['distinta'].'" ]}
+ + '.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 ' + + + + + +
'; + echo input([ + 'type' => 'ckeditor', + 'label' => tr('descrizione'), + 'name' => 'descrizione', + 'required' => 1, + 'extra' => 'rows="2"', + 'value' => $record['descrizione'], + ]); + echo ' +
+
'; +} + +echo ' +
+ + + '; if (!empty($record['presentazioni_exported_at'])) { @@ -112,25 +134,40 @@ echo ' echo '
'; + echo input([ + 'type' => 'ckeditor', + 'label' => tr('Note'), + 'name' => 'note', + 'extra' => 'rows="2"', + 'value' =>$record['note'], + ]); + echo ' +
'; - if (!empty($documento)) { - echo Modules::link($documento->module, $record['iddocumento'], ' '.tr('Apri documento'), null, 'class="btn btn-primary"'); - } + echo '
+
+
+
+
+
+

+ '.tr('Rate scadenza').' + +

+
+
+
+
+
+ + + + + + + + + + + + + - -
-
'.tr('Rata').''.tr('Data').''.tr('Importo').''.tr('Pagato').''.tr('Data concordata').''.tr('Banca accredito').''.tr('Banca addebito').''.tr('Tipologia').'
- - - - - - - - - - '; + '; foreach ($scadenze as $i => $scadenza) { if ($scadenza['da_pagare'] == $scadenza['pagato']) { @@ -144,50 +181,67 @@ foreach ($scadenze as $i => $scadenza) { } echo ' - - + + - + - + - + - - '; -} + -echo ' + + + + + + + + '; + } + + echo ' + + +
'.tr('Data').''.tr('Importo').''.tr('Pagato').''.tr('Data concordata').'
- {[ "type": "date", "name": "scadenza['.$i.']", "value": "'.$scadenza['scadenza'].'" ]} - + + '.($scadenza['da_pagare'] > 0 ? tr('Incassa') : tr('Paga')).' + + - {[ "type": "number", "name": "da_pagare['.$i.']", "decimals": 2, "value": "'.numberFormat($scadenza['da_pagare'], 2).'", "onchange": "controlloTotale()" ]} - + {[ "type": "date", "name": "scadenza['.$i.']", "value": "'.$scadenza['scadenza'].'" ]} + - {[ "type": "number", "name": "pagato['.$i.']", "decimals": 2, "value": "'.numberFormat($scadenza['pagato']).'" ]} - + {[ "type": "number", "name": "da_pagare['.$i.']", "decimals": 2, "value": "'.numberFormat($scadenza['da_pagare'], 2).'", "onchange": "controlloTotale()" ]} + - {[ "type": "date", "name": "data_concordata['.$i.']", "value": "'.$scadenza['data_concordata'].'" ]} -
+ {[ "type": "number", "name": "pagato['.$i.']", "decimals": 2, "value": "'.numberFormat($scadenza['pagato']).'" ]} + + {[ "type": "date", "name": "data_concordata['.$i.']", "value": "'.$scadenza['data_concordata'].'" ]} + + '.($scadenza['da_pagare'] > 0 ? + '{[ "type": "select", "name": "id_banca_azienda['.$i.']", "ajax-source": "banche", "select-options": '. json_encode(['id_anagrafica' => $anagrafica_azienda->id]).', "value": "'.$scadenza['id_banca_azienda'].'", "icon-after": "add|'.Modules::get('Banche')['id'].'|id_anagrafica='.$anagrafica_azienda->id.'" ]}' + : + '{[ "type": "select", "name": "id_banca_controparte['.$i.']", "ajax-source": "banche", "select-options":'.json_encode(['id_anagrafica' => $documento->idanagrafica]).', "value": "'.$scadenza['id_banca_controparte'].'", "icon-after": "add|'. Modules::get('Banche')['id'].'|idanagrafica='. $record['idanagrafica'].'"]} + ').' + + '.($scadenza['da_pagare'] > 0 ? + '{[ "type": "select", "name": "id_banca_controparte['.$i.']", "ajax-source": "banche", "select-options":'.json_encode(['id_anagrafica' => $documento->idanagrafica]).', "value": "'.$scadenza['id_banca_controparte'].'", "icon-after": "add|'. Modules::get('Banche')['id'].'|idanagrafica='. $record['idanagrafica'].'"]}' + : + '{[ "type": "select", "name": "id_banca_azienda['.$i.']", "ajax-source": "banche", "select-options": '. json_encode(['id_anagrafica' => $anagrafica_azienda->id]).', "value": "'.$scadenza['id_banca_azienda'].'", "icon-after": "add|'.Modules::get('Banche')['id'].'|id_anagrafica='.$anagrafica_azienda->id.'" ]}' + ).' + + {[ "type": "select", "name": "tipo_pagamento['.$i.']", "ajax-source": "pagamenti", "select-options": '. json_encode(['id_anagrafica' => $anagrafica_azienda->id]).', "value": "'.$scadenza['tipo_pagamento'].'" ]} +
'.tr('Totale').' '.numberFormat($totale_da_pagare).'
'; - -if ($totale_da_pagare != 0) { - echo ' - - -
-
'; -} ?>
scadenza = $data_scadenza; $model->da_pagare = $importo; $model->tipo = $type; - + $model->tipo_pagamento = $tipo_pagamento; + $model->id_banca_azienda = $id_banca_azienda; + $model->id_banca_controparte = $id_banca_controparte; + $model->pagato = $is_pagato ? $importo : 0; $model->data_pagamento = $is_pagato ? $data_scadenza : null; diff --git a/templates/fatture/footer.php b/templates/fatture/footer.php index 5a7775331..6fa8ab5d0 100755 --- a/templates/fatture/footer.php +++ b/templates/fatture/footer.php @@ -61,10 +61,10 @@ echo "   - + - '; @@ -73,17 +73,21 @@ echo " $rs2 = $dbo->fetchArray('SELECT * FROM co_scadenziario WHERE iddocumento='.prepare($id_record).' ORDER BY `scadenza` ASC'); if (!empty($rs2)) { for ($i = 0; $i < sizeof($rs2); ++$i) { + $pagamento = $dbo->fetchOne('SELECT descrizione FROM co_pagamenti WHERE id='.$rs2[$i]['tipo_pagamento'])['descrizione']; echo ' - - - + '; } } diff --git a/update/2_4_52.sql b/update/2_4_52.sql index ad82e1552..cdfefa93f 100644 --- a/update/2_4_52.sql +++ b/update/2_4_52.sql @@ -35,4 +35,8 @@ ALTER TABLE `mg_prodotti` ADD FOREIGN KEY (`id_riga_contratto`) REFERENCES `co_r INSERT INTO `zz_prints` (`id_module`, `is_record`, `name`, `title`, `filename`, `directory`, `previous`, `options`, `icon`, `version`, `compatibility`, `order`, `predefined`, `default`, `enabled`, `available_options`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Preventivi'), '1', 'Preventivo(solo totale imponibile)', 'Preventivo (solo totale imponibile)', 'Preventivo num. {numero} del {data} rev {revisione}', 'preventivi', 'idpreventivo', '{\"pricing\": false, \"last-page-footer\": true, \"images\": true, \"no-iva\":true, \"show-only-total\":true }', 'fa fa-print', '', '', '0', '0', '1', '1', '{\"pricing\":\"Visualizzare i prezzi\", \"hide-total\": \"Nascondere i totali delle righe\", \"show-only-total\": \"Visualizzare solo i totali del documento\", \"hide-header\": \"Nascondere intestazione\", \"hide-footer\": \"Nascondere footer\", \"last-page-footer\": \"Visualizzare footer solo su ultima pagina\", \"hide-item-number\": \"Nascondere i codici degli articoli\"}'); -- Aggiunta indice per ricerca su files più rapida -ALTER TABLE `zz_files` ADD INDEX(`id_record`); \ No newline at end of file +ALTER TABLE `zz_files` ADD INDEX(`id_record`); + +ALTER TABLE `co_scadenziario` ADD `tipo_pagamento` INT NOT NULL; +ALTER TABLE `co_scadenziario` ADD `id_banca_azienda` INT NULL; +ALTER TABLE `co_scadenziario` ADD `id_banca_controparte` INT NULL; \ No newline at end of file
+

".tr('Scadenze pagamenti', [], ['upper' => true]).'

+ '.Translator::dateToLocale($rs2[$i]['scadenza'])." + ".(($rs2[$i]['pagato'] == $rs2[$i]['da_pagare']) ? 'PAGATO' : '')." + ".moneyFormat($rs2[$i]['da_pagare'], 2).' + '.$pagamento.' +