Aggiunta anagrafica nelle scadenze e migliorie creazione file xml

This commit is contained in:
MatteoPistorello 2022-09-01 12:52:33 +02:00
parent 731039c9a9
commit 5976e096f5
12 changed files with 109 additions and 73 deletions

View File

@ -59,7 +59,7 @@
"symfony/var-dumper": "^3.3", "symfony/var-dumper": "^3.3",
"thenetworg/oauth2-azure": "^2.0", "thenetworg/oauth2-azure": "^2.0",
"willdurand/geocoder": "^4.2", "willdurand/geocoder": "^4.2",
"digitick/sepa-xml": "^1.6", "digitick/sepa-xml": "^2.1",
"wdog/sdd_ita": "dev-master" "wdog/sdd_ita": "dev-master"
}, },
"require-dev": { "require-dev": {

View File

@ -101,8 +101,9 @@ class Scadenze
{ {
$numero = $fattura->numero_esterno ?: $fattura->numero; $numero = $fattura->numero_esterno ?: $fattura->numero;
$descrizione = $fattura->tipo->descrizione.' numero '.$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->documento()->associate($fattura);
$scadenza->data_emissione = $fattura->data; $scadenza->data_emissione = $fattura->data;

View File

@ -21,12 +21,13 @@ include_once __DIR__.'/../../core.php';
switch (post('op')) { switch (post('op')) {
case 'add': case 'add':
$idanagrafica = post('idanagrafica');
$data = post('data'); $data = post('data');
$tipo = post('tipo'); $tipo = post('tipo');
$da_pagare = post('da_pagare'); $da_pagare = post('da_pagare');
$descrizione = post('descrizione'); $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(); $id_record = $dbo->lastInsertedID();
flash()->info(tr('Scadenza inserita!')); flash()->info(tr('Scadenza inserita!'));

View File

@ -27,15 +27,19 @@ include_once __DIR__.'/../../core.php';
<input type="hidden" name="dir" value="<?php echo $dir; ?>"> <input type="hidden" name="dir" value="<?php echo $dir; ?>">
<div class="row"> <div class="row">
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Anagrafica'); ?>", "name": "idanagrafica", "required": 1, "ajax-source": "anagrafiche" ]}
</div>
<div class="col-md-4"> <div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Tipo'); ?>", "name": "tipo", "required": 1, "ajax-source": "tipi_scadenze", "icon-after": "add|<?php echo Modules::get('Tipi scadenze')['id']; ?>" ]} {[ "type": "select", "label": "<?php echo tr('Tipo'); ?>", "name": "tipo", "required": 1, "ajax-source": "tipi_scadenze", "icon-after": "add|<?php echo Modules::get('Tipi scadenze')['id']; ?>" ]}
</div> </div>
<div class="col-md-4"> <div class="col-md-2">
{[ "type": "date", "label": "<?php echo tr('Data scadenza'); ?>", "name": "data", "required": 1, "value": "-now-" ]} {[ "type": "date", "label": "<?php echo tr('Data scadenza'); ?>", "name": "data", "required": 1, "value": "-now-" ]}
</div> </div>
<div class="col-md-4"> <div class="col-md-2">
{[ "type": "number", "label": "<?php echo tr('Importo'); ?>", "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": "number", "label": "<?php echo tr('Importo'); ?>", "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" ]}
</div> </div>
</div> </div>

View File

@ -46,18 +46,16 @@ echo '
<div class="row"> <div class="row">
<!-- Info scadenza --> <!-- Info scadenza -->
<div class="col-md-6">'; <div class="col-md-6">
if (!empty($documento)) {
echo '
<table class="table table-striped table-hover table-condensed table-bordered"> <table class="table table-striped table-hover table-condensed table-bordered">
<tr> <tr>
<th width="120">'.($dir == 'entrata' ? tr('Cliente') : tr('Fornitore')).':</th> <th width="125">'.($dir == 'entrata' ? tr('Cliente') : ($dir == 'uscita' ? tr('Fornitore') : tr('Anagrafica'))).':</th>
<td> <td>
'.Modules::link('Anagrafiche', $documento->anagrafica->id, $documento->anagrafica->ragione_sociale).' '.Modules::link('Anagrafiche', $record['idanagrafica'], $record['ragione_sociale']).'
</td> </td>
</tr> </tr>';
if (!empty($documento)) {
echo '
<tr> <tr>
<th>'.tr('Documento').':</th> <th>'.tr('Documento').':</th>
<td>'.$documento->tipo->descrizione.'</td> <td>'.$documento->tipo->descrizione.'</td>
@ -76,8 +74,20 @@ if (!empty($documento)) {
<tr> <tr>
<th>'.tr('Netto a pagare').':</th> <th>'.tr('Netto a pagare').':</th>
<td>'.moneyFormat($documento->netto).'</td> <td>'.moneyFormat($documento->netto).'</td>
</tr> </tr>';
} else {
$scadenza = $dbo->fetchOne('SELECT * FROM co_scadenziario WHERE id = '.prepare($id_record));
echo '
<tr>
<th>'.tr('Descrizione').':</th>
<td>
{[ "type": "textarea", "name": "descrizione", "value": "'.$record['descrizione'].'" ]}
</td>
</tr>';
}
echo '
<tr> <tr>
<th>'.tr('Note').':</th> <th>'.tr('Note').':</th>
<td> <td>
@ -99,31 +109,12 @@ if (!empty($documento)) {
}else{ }else{
$export_riba = '<i class="fa fa-clock-o text-warning"></i> '.tr('Non ancora esportata'); $export_riba = '<i class="fa fa-clock-o text-warning"></i> '.tr('Non ancora esportata');
} }
echo ' echo '
</table>';
</table> if (!empty($documento)) {
echo Modules::link($documento->module, $record['iddocumento'], '<i class="fa fa-folder-open"></i> '.tr('Apri documento'), null, 'class="btn btn-primary"');
'.Modules::link($documento->module, $record['iddocumento'], '<i class="fa fa-folder-open"></i> '.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 ' echo '
</div> </div>

View File

@ -22,7 +22,7 @@ use Modules\Fatture\Fattura;
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
if (isset($id_record)) { 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']); $documento = Fattura::find($record['iddocumento']);
// Scelgo la query in base alla scadenza // Scelgo la query in base alla scadenza

View File

@ -21,6 +21,7 @@ namespace Modules\Scadenzario;
use Common\SimpleModelTrait; use Common\SimpleModelTrait;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Modules\Anagrafiche\Anagrafica;
use Modules\Fatture\Fattura; use Modules\Fatture\Fattura;
class Scadenza extends Model class Scadenza extends Model
@ -34,10 +35,11 @@ class Scadenza extends Model
'data_pagamento', '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 = new static();
$model->idanagrafica = $idanagrafica;
$model->descrizione = $descrizione; $model->descrizione = $descrizione;
$model->scadenza = $data_scadenza; $model->scadenza = $data_scadenza;
$model->da_pagare = $importo; $model->da_pagare = $importo;
@ -55,4 +57,9 @@ class Scadenza extends Model
{ {
return $this->belongsTo(Fattura::class, 'iddocumento'); return $this->belongsTo(Fattura::class, 'iddocumento');
} }
public function anagrafica()
{
return $this->belongsTo(Anagrafica::class, 'idanagrafica');
}
} }

View File

@ -38,10 +38,8 @@ switch (filter('op')) {
foreach ($scadenze as $key => $scadenza) { foreach ($scadenze as $key => $scadenza) {
$documento = $scadenza->documento; $documento = $scadenza->documento;
if (empty($documento)) { $descrizione = $scadenza->descrizione;
continue; if (!empty($documento)) {
}
// Individuazione altre scadenze del documento // Individuazione altre scadenze del documento
$scadenze_documento = $documento->scadenze->sortBy('scadenza'); $scadenze_documento = $documento->scadenze->sortBy('scadenza');
$pos = $scadenze_documento->search(function ($item, $key) use ($scadenza) { $pos = $scadenze_documento->search(function ($item, $key) use ($scadenza) {
@ -49,7 +47,6 @@ switch (filter('op')) {
}); });
// Generazione della descrizione del pagamento // Generazione della descrizione del pagamento
$descrizione = $documento->getReference();
if ($scadenze_documento->count() > 1) { if ($scadenze_documento->count() > 1) {
$descrizione .= tr('_DOC_, pagamento _NUM_/_TOT_', [ $descrizione .= tr('_DOC_, pagamento _NUM_/_TOT_', [
'_DOC_' => $descrizione, '_DOC_' => $descrizione,
@ -57,6 +54,7 @@ switch (filter('op')) {
'_TOT_' => $scadenze_documento->count(), '_TOT_' => $scadenze_documento->count(),
]); ]);
} }
}
// Controllo sulla banca aziendale collegata alla scadenza // Controllo sulla banca aziendale collegata alla scadenza
$banca_azienda = Gestore::getBancaAzienda($scadenza); $banca_azienda = Gestore::getBancaAzienda($scadenza);

View File

@ -58,7 +58,7 @@ if (!$esporta_processati) {
$scadenze = $scadenze->get(); $scadenze = $scadenze->get();
$id_scadenze = $scadenze->pluck('id'); $id_scadenze = $scadenze->pluck('id');
$raggruppamento = $scadenze->groupBy('documento.idanagrafica'); $raggruppamento = $scadenze->groupBy('idanagrafica');
if ($raggruppamento->isEmpty()) { if ($raggruppamento->isEmpty()) {
echo ' echo '
<p>'.tr('Nessun pagamento disponibile secondo la selezione effettuata').'.</p>'; <p>'.tr('Nessun pagamento disponibile secondo la selezione effettuata').'.</p>';
@ -67,7 +67,7 @@ if ($raggruppamento->isEmpty()) {
} }
foreach ($raggruppamento as $id_anagrafica => $scadenze_anagrafica) { foreach ($raggruppamento as $id_anagrafica => $scadenze_anagrafica) {
$anagrafica = $scadenze_anagrafica->first()->documento->anagrafica; $anagrafica = $scadenze_anagrafica->first()->anagrafica;
echo ' echo '
<h3> <h3>

View File

@ -128,17 +128,19 @@ class Gestore
public function aggiungi(Scadenza $scadenza, int $identifier, string $descrizione, string $codice_sequenza = null) public function aggiungi(Scadenza $scadenza, int $identifier, string $descrizione, string $codice_sequenza = null)
{ {
$documento = $scadenza->documento; $documento = $scadenza->documento;
$controparte = $documento->anagrafica; $controparte = $scadenza->anagrafica;
$banca_controparte = self::getBancaControparte($scadenza); $banca_controparte = self::getBancaControparte($scadenza);
if (empty($banca_controparte)) { if (empty($banca_controparte)) {
return false; return false;
} }
$ctgypurp = $this->getTipo($scadenza)['ctgypurp'] ?: 'SUPP';
$pagamento = $documento->pagamento; $pagamento = $documento->pagamento;
$direzione = $documento->direzione; $direzione = $documento->direzione;
$importo = $scadenza->da_pagare - $scadenza->pagato;
$totale = (abs($scadenza->da_pagare) - abs($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_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); $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) { 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) { } elseif ($is_debito_diretto) {
return $this->aggiungiDebitoDiretto($identifier, $controparte, $banca_controparte, $descrizione, $totale, $scadenza->scadenza, $method, $codice_sequenza); return $this->aggiungiDebitoDiretto($identifier, $controparte, $banca_controparte, $descrizione, $totale, $scadenza->scadenza, $method, $codice_sequenza);
} elseif ($is_riba) { } elseif ($is_riba) {
@ -213,27 +215,29 @@ class Gestore
return true; 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; $id = 'pagamento_'.$identifier;
// Esportazione del pagamento // Esportazione del pagamento
$this->credito_diretto->addPaymentInfo($id, [ $payment = $this->credito_diretto->addPaymentInfo($id, [
'id' => $identifier, 'id' => $identifier,
'dueDate' => $data_prevista->format('dmy'), 'dueDate' => $data_prevista->format('Y-m-d'),
'debtorName' => $this->azienda->ragione_sociale, 'debtorName' => $this->azienda->ragione_sociale,
'debtorAccountIBAN' => $this->banca_azienda->iban, 'debtorAccountIBAN' => $this->banca_azienda->iban,
'debtorAgentBIC' => $this->banca_azienda->bic, 'debtorAgentBIC' => $this->banca_azienda->bic,
]); ]);
$this->credito_diretto->addTransfer($id, [ $this->credito_diretto->addTransfer($id, [
'amount' => $totale, 'amount' => $totale*100,
'creditorIban' => $banca_controparte->iban, 'creditorIban' => $banca_controparte->iban,
'creditorBic' => $banca_controparte->bic, 'creditorBic' => $banca_controparte->bic,
'creditorName' => $controparte->ragione_sociale, 'creditorName' => $controparte->ragione_sociale,
'remittanceInformation' => $descrizione, 'remittanceInformation' => $descrizione,
]); ]);
$payment->setCategoryPurposeCode($ctgypurp);
return true; return true;
} }
@ -255,7 +259,7 @@ class Gestore
// Add a Single Transaction to the named payment // Add a Single Transaction to the named payment
$mandato = $this->getMandato($banca_controparte); $mandato = $this->getMandato($banca_controparte);
$this->debito_diretto->addTransfer($id, [ $this->debito_diretto->addTransfer($id, [
'amount' => $totale, 'amount' => $totale*100,
'debtorName' => $controparte->ragione_sociale, 'debtorName' => $controparte->ragione_sociale,
'debtorIban' => $banca_controparte->iban, 'debtorIban' => $banca_controparte->iban,
'debtorBic' => $banca_controparte->bic, 'debtorBic' => $banca_controparte->bic,
@ -305,11 +309,10 @@ class Gestore
public static function getBancaControparte(Scadenza $scadenza): ?Banca public static function getBancaControparte(Scadenza $scadenza): ?Banca
{ {
$documento = $scadenza->documento; $documento = $scadenza->documento;
$anagrafica = $documento->anagrafica;
$banca_controparte = $documento->id_banca_controparte ? Banca::find($documento->id_banca_controparte) : null; $banca_controparte = $documento->id_banca_controparte ? Banca::find($documento->id_banca_controparte) : null;
if (empty($banca_controparte)) { if (empty($banca_controparte)) {
$banca_controparte = Banca::where('id_anagrafica', $anagrafica->id) $banca_controparte = Banca::where('id_anagrafica', $scadenza->idanagrafica)
->where('predefined', 1) ->where('predefined', 1)
->first(); ->first();
} }
@ -419,4 +422,9 @@ class Gestore
return []; return [];
} }
} }
protected function getTipo(Scadenza $scadenza)
{
return database()->fetchOne('SELECT * FROM co_tipi_scadenze WHERE nome = '.prepare($scadenza->tipo));
}
} }

12
update/2_4_36.php Normal file
View File

@ -0,0 +1,12 @@
<?php
$scadenze = $dbo->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']]);
}
?>

View File

@ -5,3 +5,17 @@ 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` 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` 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; 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';