Introduzione compilazione automatica FE

This commit is contained in:
Thomas Zilio 2020-02-24 12:21:47 +01:00
parent cbbc4069ab
commit 73d627a062
13 changed files with 165 additions and 14 deletions

View File

@ -270,7 +270,7 @@ switch (post('op')) {
$dbo->query('UPDATE zz_users SET enabled = 0 WHERE idanagrafica = '.prepare($id_record));
// Disabilito anche il token
$dbo->query('UPDATE zz_tokens SET enabled = 0 WHERE id_utente = '.prepare($id_utente));
flash()->info(tr('Anagrafica eliminata!'));
}

View File

@ -226,7 +226,7 @@ switch ($resource) {
case 'sedi':
if (isset($superselect['idanagrafica'])) {
$query = "SELECT * FROM (SELECT '0' AS id, CONCAT_WS(' - ', 'Sede legale' , (SELECT CONCAT (citta, ' (', ragione_sociale,')') FROM an_anagrafiche |where|)) AS descrizione UNION SELECT id, CONCAT_WS(' - ', nomesede, citta) FROM an_sedi |where|) AS tab HAVING descrizione LIKE ".prepare('%'.$search.'%')." ORDER BY descrizione";
$query = "SELECT * FROM (SELECT '0' AS id, CONCAT_WS(' - ', 'Sede legale' , (SELECT CONCAT (citta, ' (', ragione_sociale,')') FROM an_anagrafiche |where|)) AS descrizione UNION SELECT id, CONCAT_WS(' - ', nomesede, citta) FROM an_sedi |where|) AS tab HAVING descrizione LIKE ".prepare('%'.$search.'%').' ORDER BY descrizione';
foreach ($elements as $element) {
$filter[] = 'id='.prepare($element);

View File

@ -3,6 +3,7 @@
namespace Modules\Anagrafiche;
use Common\Model;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletes;
use Modules\Contratti\Contratto;
use Modules\DDT\DDT;
@ -277,6 +278,20 @@ class Anagrafica extends Model
return $this->hasMany(Fattura::class, 'idanagrafica');
}
public function fattureVendita()
{
return $this->fatture()->whereHas('tipo', function (Builder $query) {
$query->where('dir', 'entrata');
});
}
public function fattureAcquisto()
{
return $this->fatture()->whereHas('tipo', function (Builder $query) {
$query->where('dir', 'uscita');
});
}
public function ordini()
{
return $this->hasMany(Ordine::class, 'idanagrafica');

View File

@ -129,7 +129,7 @@ trait RelationTrait
public function getIdContoAttribute()
{
return $this->idconto;
return $this->attributes['idconto'];
}
public function setIdContoAttribute($value)

View File

@ -6,6 +6,7 @@ use Auth;
use Carbon\Carbon;
use Common\Components\Description;
use Common\Document;
use Illuminate\Database\Eloquent\Builder;
use Modules\Anagrafiche\Anagrafica;
use Modules\Fatture\Components\Riga;
use Modules\Pagamenti\Pagamento;
@ -592,6 +593,20 @@ class Fattura extends Document
return $result;
}
/**
* Scope a query to only include popular users.
*
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeContabile($query)
{
return $query->whereHas('stato', function (Builder $query) {
$query->whereIn('descrizione', ['Emessa', 'Parzialmente pagato', 'Pagato']);
});
}
/**
* Restituisce i dati bancari in base al pagamento.
*

View File

@ -185,11 +185,11 @@ echo '
<?php
if (empty($documento)) {
echo '
echo '
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> '.tr('Elimina').'
</a>';
}
}
echo '
<table class="hide">

View File

@ -119,7 +119,7 @@ switch (filter('op')) {
$utente = User::find($id_utente);
$tokens = $utente->getApiTokens();
foreach ($tokens as $token){
foreach ($tokens as $token) {
$dbo->query('UPDATE zz_tokens SET enabled = 1 WHERE id = '.prepare($token['id']));
}
@ -131,7 +131,7 @@ switch (filter('op')) {
$utente = User::find($id_utente);
$tokens = $utente->getApiTokens();
foreach ($tokens as $token){
foreach ($tokens as $token) {
$dbo->query('UPDATE zz_tokens SET enabled = 0 WHERE id = '.prepare($token['id']));
}

View File

@ -75,15 +75,13 @@ if (!empty($utenti)) {
// Disabilitazione token API, se diverso da id_utente #1 (admin)
$token = $dbo->fetchOne('SELECT `enabled` FROM `zz_tokens` WHERE `id_utente` = '.prepare($utente['id']).'')['enabled'];
if ($utente['id'] == '1') {
echo '
<span title="'.tr("Non è possibile gestire l'accesso API per l'utente admin").'" class="text-muted tip">
<i class="fa fa-2x fa-key "></i>
</span>';
} elseif (!empty($token)) {
echo '
<a title="'.tr('Disabilita API').'" class="text-danger clickable tip ask" data-msg="" data-backto="record-edit" data-title="'.tr("Disabilitare l'accesso API per questo utente?").'" data-op="token_disable" data-id_utente="'.$utente['id'].'" data-button="'.tr('Disabilita').'">
<i class="fa fa-2x fa-key"></i>

View File

@ -589,7 +589,6 @@ class FatturaElettronica
}
//Rimuovo eventuali idicazioni relative alla nazione
$result['IdFiscaleIVA']['IdCodice'] = str_replace($anagrafica->nazione->iso2, '', $anagrafica['piva']);
}
// Codice fiscale
@ -598,9 +597,9 @@ class FatturaElettronica
$result['CodiceFiscale'] = preg_replace('/\s+/', '', $anagrafica['codice_fiscale']);
//$result['CodiceFiscale'] = str_replace($anagrafica->nazione->iso2, '', $result['CodiceFiscale']);
//Rimuovo eventuali idicazioni relative all'iso2 della nazione, solo se la stringa inizia con quest'ultima.
$result['CodiceFiscale'] = preg_replace('/^' . preg_quote($anagrafica->nazione->iso2, '/') . '/', '', $anagrafica['codice_fiscale']);
$result['CodiceFiscale'] = preg_replace('/^'.preg_quote($anagrafica->nazione->iso2, '/').'/', '', $anagrafica['codice_fiscale']);
}
if (!empty($anagrafica['nome']) or !empty($anagrafica['cognome'])) {

View File

@ -166,4 +166,78 @@ switch (filter('op')) {
}
break;
case 'compile':
$fatture = $anagrafica->fattureAcquisto()
->contabile()
->orderByDesc('created_at')
->take(10)
->get();
$righe = collect();
foreach ($fatture as $fattura) {
$righe->push($fattura->righe);
$righe->push($fattura->articoli);
}
$righe = $righe->flatten();
// Ricerca del tipo di documento più utilizzato
$tipi = $fatture->groupBy(function ($item, $key) {
return $item->tipo->id;
})->transform(function ($item, $key) {
return $item->count();
});
$id_tipo = $tipi->sort()->keys()->last();
// Ricerca del tipo di pagamento più utilizzato
$pagamenti = $fatture->mapToGroups(function ($item, $key) {
return [$item->pagamento->id => $item->pagamento];
});
$id_pagamento = $pagamenti->map(function ($item, $key) {
return $item->count();
})->sort()->keys()->last();
$pagamento = $pagamenti[$id_pagamento]->first();
// Ricerca del conto più utilizzato
$conti = $righe->groupBy(function ($item, $key) {
return $item->idconto;
})->transform(function ($item, $key) {
return $item->count();
});
$id_conto = $conti->sort()->keys()->last();
$conto = $dbo->fetchOne('SELECT * FROM co_pianodeiconti3 WHERE id = '.prepare($id_conto));
// Ricerca dell'IVA più utilizzata secondo percentuali
$iva = [];
$percentuali_iva = $righe->groupBy(function ($item, $key) {
return $item->aliquota->percentuale;
});
foreach ($percentuali_iva as $key => $values) {
$aliquote = $values->mapToGroups(function ($item, $key) {
return [$item->aliquota->id => $item->aliquota];
});
$id_aliquota = $aliquote->map(function ($item, $key) {
return $item->count();
})->sort()->keys()->last();
$aliquota = $aliquote[$id_aliquota]->first();
$iva[$key] = [
'id' => $aliquota->id,
'descrizione' => $aliquota->descrizione,
];
}
echo json_encode([
'id_tipo' => $id_tipo,
'pagamento' => [
'id' => $pagamento->id,
'descrizione' => $pagamento->descrizione,
],
'conto' => [
'id' => $conto['id'],
'descrizione' => $conto['descrizione'],
],
'iva' => $iva,
]);
break;
}

View File

@ -0,0 +1,47 @@
<?php
echo '
<button type="button" class="btn btn-primary tip" '.(!empty($anagrafica) ? '' : 'disabled').' onclick="compile(this)" title="'.tr('Tenta la compilazione automatica delle informazioni delle fattura elettronica sulla base delle precedenti fatture del Fornitore').'.">
<i class="fa fa-address-book"></i> '.tr('Compila automaticamente').'
</button>
<script>
function compile(btn) {
var restore = buttonLoading(btn);
$.ajax({
url: globals.rootdir + "/actions.php",
cache: false,
type: "GET",
data: {
id_module: "'.$id_module.'",
id_plugin: "'.$id_plugin.'",
id_record: "'.$id_record.'",
op: "compile",
},
success: function(response) {
var data = JSON.parse(response);
console.log(data);
$("#id_tipo").selectSet(data.id_tipo);
$("#pagamento").selectSetNew(data.pagamento.id, data.pagamento.descrizione);
$("select[name^=iva]").each(function(){
var aliquota = $(this).closest("tr").find("[id^=aliquota]").text();
$(this).selectSet(data.iva[aliquota].id);
});
$("select[name^=conto]").each(function(){
$(this).selectSetNew(data.conto.id, data.conto.descrizione);
});
buttonRestore(btn, restore);
},
error: function(data) {
swal("'.tr('Errore').'", "'.tr('La compilazione automatica dei campi non è andata a buon fine').'.", "error");
buttonRestore(btn, restore);
}
});
}
</script>';

View File

@ -310,6 +310,8 @@ if (!empty($righe)) {
'_VALUE_' => empty($riga['Natura']) ? numberFormat($riga['AliquotaIVA']).'%' : $riga['Natura'],
'_DESC_' => $riga['RiferimentoNormativo'] ? ' - '.$riga['RiferimentoNormativo'] : '',
]).'</small>
<span class="hide" id="aliquota['.$key.']">'.$riga['AliquotaIVA'].'</span>
</td>
<td>
{[ "type": "select", "name": "iva['.$key.']", "values": "query='.str_replace('"', '\"', $query).'", "required": 1, "placeholder": "Aliquota iva" ]}

View File

@ -172,7 +172,8 @@ class User extends Model
return $anagrafica->ragione_sociale.' ('.$this->username.')';
}
public function getApiTokens(){
public function getApiTokens()
{
$query = 'SELECT * FROM `zz_tokens` WHERE `enabled` = 1 AND `id_utente` = '.prepare($this->id);
$database = database();