Compare commits

...

7 Commits

Author SHA1 Message Date
Luca d0b0c9f915 Aggiunta informazione esigibilità aliq. iva righe fattura 2021-06-28 19:25:57 +02:00
Luca 3569b1f888 Aggiunta vista "Esigibilità" per il modulo "IVA" 2021-06-28 19:18:18 +02:00
Luca 5de282ce3c Introduzione "Dettagli cliente" in fase apertura attività 2021-06-28 18:44:27 +02:00
Luca 81795f2918 Aggiunto box informativo: fatture con termini di pagamento trascorsi 2021-06-28 17:14:54 +02:00
MatteoPistorello aad3eb180b Merge 2021-06-28 15:46:02 +02:00
MatteoPistorello 7feb2aca8c Aggiunta colonna Scaduto in Scadenzario 2021-06-28 15:37:20 +02:00
Luca 5cfd218ae8 Aggiunta vista "N. utenti" per il modulo "Utenti e permessi"
Migliorie minori
2021-06-28 15:06:30 +02:00
10 changed files with 259 additions and 34 deletions

View File

@ -42,6 +42,7 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
- Aggiunta impostazione per la visualizzazione delle ore nella stampa intervento (Decimale, Sessantesimi).
- Aggiunta possibilità di selezionare la sede di partenza della merce in fase di aggiunta articolo da un'attività
- Sostituito plugin **Componenti** nel modulo Impianti con la possibilità di inserire gli articoli di magazzino
- Aggiunta colonna Scaduto nel modulo Scadenzario
### Fixed
-

View File

@ -287,6 +287,33 @@ switch (post('op')) {
break;
// Elenco fatture Scadute per il cliente
case 'fatture_scadute':
$id_anagrafica = post('id_anagrafica');
$stato1 = Stato::where('descrizione', 'Emessa')->first();
$stato2 = Stato::where('descrizione', 'Prazialmente pagato')->first();
$fatture = Fattura::vendita()
->select('*', 'co_documenti.id AS id', 'co_documenti.data AS data')
->where('idanagrafica', $id_anagrafica)
->whereIn('idstatodocumento', [$stato1->id, $stato2->id])
->join('co_scadenziario', 'co_documenti.id', '=', 'co_scadenziario.iddocumento')
->where('co_scadenziario.da_pagare', '>', 'co_scadenziario.pagato')
->whereRaw('co_scadenziario.scadenza < NOW()')
->groupBy('co_scadenziario.iddocumento')
->get();
$results = [];
foreach ($fatture as $result) {
$results[] = Modules::link('Fatture di vendita', $result->id, reference($result));
}
echo json_encode($results);
break;
// eliminazione documento
case 'delete':
try {

View File

@ -77,17 +77,36 @@ $idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
{[ "type": "select", "label": "<?php echo tr('Sezionale'); ?>", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='<?php echo $id_module; ?>' ORDER BY name", "value": "<?php echo $_SESSION['module_'.$id_module]['id_segment']; ?>" ]}
</div>
</div>
<div class="box hidden" id="info">
<div class="box-header with-border">
<h3 class="box-title"><?php echo tr('Fatture in stato Bozza del cliente'); ?></h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-minus"></i>
</button>
<div id="info" class="hidden">
<div class="row">
<div class="col-md-6 ">
<div id="info-title-bozza" class="box">
<div class="box-header with-border">
<h3 class="box-title"><?php echo tr('Fatture in stato Bozza del cliente'); ?></h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-minus"></i>
</button>
</div>
</div>
<div class="box-body" id="info-content-bozza"></div>
</div>
</div>
<div class="col-md-6">
<div id="info-title-scadute" class="box">
<div class="box-header with-border">
<h3 class="box-title"><?php echo tr('Fatture con termini di pagamento trascorsi'); ?></h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-minus"></i>
</button>
</div>
</div>
<div class="box-body" id="info-content-scadute"></div>
</div>
</div>
</div>
<div class="box-body" id="info-content">
</div>
</div>
@ -109,10 +128,8 @@ $(document).ready(function () {
let data = $(this).selectData();
if (data !== undefined) {
if (!data.id){
$("#info").addClass("hidden");
return;
}
$("#info").removeClass("hidden");
$.ajax({
url: globals.rootdir + "/actions.php",
@ -124,23 +141,61 @@ $(document).ready(function () {
op: "fatture_bozza",
},
success: function (results) {
$("#info").removeClass("hidden");
$("#info").removeClass("box-info");
$("#info").removeClass("box-warning");
if (results.length === 0){
$("#info").addClass("box-info");
$("#info-content").html("<p>'.tr('Per il cliente selezionato non è presente alcuna fattura in stato di Bozza').'</p>")
$("#info-title-bozza").addClass("box-info");
$("#info-title-bozza").removeClass("box-warning");
$("#info-content-bozza").html("<p>'.tr('Per il cliente selezionato non è presente alcuna fattura in stato Bozza').'</p>")
} else {
let content = "";
results.forEach(function(item) {
content += "<li>" + item + "</li>";
});
$("#info").addClass("box-warning");
$("#info-content").html("<p>'.tr('Attenzione: per il cliente selezionato sono presenti le seguenti fatture in stato Bozza').':</p><ul>" + content + "</ul>")
$("#info-title-bozza").addClass("box-warning");
$("#info-title-bozza").removeClass("box-info");
$("#info-content-bozza").html("<p>'.tr('Attenzione: per il cliente selezionato sono presenti le seguenti fatture in stato Bozza').':</p><ul>" + content + "</ul>")
}
}
});
$.ajax({
url: globals.rootdir + "/actions.php",
type: "POST",
dataType: "json",
data: {
id_module: globals.id_module,
id_anagrafica: data.id,
op: "fatture_scadute",
},
success: function (results) {
$("#info").removeClass("box-info");
$("#info").removeClass("box-warning");
if (results.length === 0){
$("#info-title-scadute").addClass("box-info");
$("#info-title-scadute").removeClass("box-warning");
$("#info-content-scadute").html("<p>'.tr('Per il cliente selezionato non è presente alcuna fattura Scaduta').'</p>")
} else {
let content = "";
results.forEach(function(item) {
content += "<li>" + item + "</li>";
});
$("#info-title-scadute").addClass("box-warning");
$("#info-title-scadute").removeClass("box-info");
$("#info-content-scadute").html("<p>'.tr('Attenzione: per il cliente selezionato le seguenti fatture presentamento una o più rate scadute').':</p><ul>" + content + "</ul>")
}
}
});
}else{
$("#info").addClass("hidden");
return;
}
})
})

View File

@ -188,7 +188,7 @@ foreach ($righe as $riga) {
echo '
<td class="text-right">
'.moneyFormat($riga->iva_unitaria_scontata).'
<br><small class="'.(($riga->aliquota->deleted_at) ? 'text-red' : '').' text-muted">'.$riga->aliquota->descrizione.(($riga->aliquota->esente) ? ' ('.$riga->aliquota->codice_natura_fe.')' : null).'</small>
<br><small class="'.(($riga->aliquota->deleted_at) ? 'text-red' : '').' text-muted">'.$riga->aliquota->descrizione.' ('.$riga->aliquota->esigibilita.') '.(($riga->aliquota->esente) ? ' ('.$riga->aliquota->codice_natura_fe.')' : null).'</small>
</td>';
// Importo

View File

@ -315,6 +315,24 @@ echo '
</div>
</div>
<!-- DETTAGLI CLIENTE -->
<div class="box box-success collapsable collapsed-box">
<div class="box-header with-border">
<h3 class="box-title">'.tr('Dettagli cliente').'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse">
<i class="fa fa-plus"></i>
</button>
</div>
</div>
<div class="box-body" id="dettagli_ciente">
Prima seleziona un cliente...
</div>
</div>
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
@ -429,6 +447,15 @@ echo '
input("idtipointervento").getElement()
.selectSetNew(data.idtipointervento, data.idtipointervento_descrizione);
}
if (data !== undefined) {
//Carico nel panel i dettagli del cliente
$.get("'.$rootdir.'/modules/interventi/ajax_details.php?op=dettagli&id_anagrafica="+$(this).val(), function(data){
$("#dettagli_ciente").html(data);
});
}else{
$("#dettagli_ciente").html("Prima seleziona un cliente...");
}
});
// Gestione della modifica della sede selezionato

View File

@ -0,0 +1,78 @@
<?php
include_once __DIR__.'/../../core.php';
$id_anagrafica = get('id_anagrafica');
$op = get('op');
switch($op){
case "dettagli":
echo "
<div class='row'>";
//Contratti attivi
$rs_contratti = $dbo->fetchArray("SELECT co_contratti.id AS id, CONCAT('Contratto ', numero, ' del ', DATE_FORMAT(data_bozza, '%d/%m/%Y'), ' - ', co_contratti.nome, ' [', (SELECT `descrizione` FROM `co_staticontratti` WHERE `co_staticontratti`.`id` = `idstato`) , ']') AS descrizione FROM co_contratti INNER JOIN an_anagrafiche ON co_contratti.idanagrafica=an_anagrafiche.idanagrafica WHERE idstato IN (SELECT `id` FROM `co_staticontratti` WHERE is_pianificabile=1) AND co_contratti.idanagrafica=".prepare($id_anagrafica));
echo "
<div class='col-md-4'>
<b>CONTRATTI:</b><hr style='margin-top:5px;margin-bottom:15px;'>";
if(sizeof($rs_contratti)>0){
foreach($rs_contratti AS $contratto){
echo "
<div class='alert alert-info' style='margin-bottom: 10px;'>
".$contratto['descrizione']."
</div>";
}
}else{
echo "Nessun contratto per questo cliente...";
}
echo "
</div>";
//Fatture emesse o parzialnente pagate
$rs_documenti = $dbo->fetchArray("SELECT co_documenti.id AS id, CONCAT('Fattura ', numero_esterno, ' del ', DATE_FORMAT(data, '%d/%m/%Y')) AS descrizione FROM co_documenti WHERE idstatodocumento IN(SELECT id FROM co_statidocumento WHERE descrizione IN('Emessa', 'Parzialmente pagato')) AND idanagrafica=".prepare($id_anagrafica));
echo "
<div class='col-md-4'>
<b>Fatture:</b><hr style='margin-top:5px;margin-bottom:15px;'>";
if(sizeof($rs_documenti)>0){
foreach($rs_documenti AS $documento){
$rs_scadenze = $dbo->fetchArray("SELECT * FROM co_scadenziario WHERE iddocumento=".prepare($documento['id']));
echo "
<div class='alert alert-info' style='margin-bottom: 10px;'>
".$documento['descrizione']."<br>";
foreach($rs_scadenze AS $scadenza){
echo Translator::dateToLocale($scadenza['scadenza'])." - ".Translator::numberToLocale($scadenza['da_pagare'])." €<br>";
}
echo "
</div>";
}
}else{
echo "Nessuna fattura per questo cliente...";
}
echo "
</div>";
//Note dell'anagrafica
$rs_anagrafica = $dbo->fetchOne("SELECT note FROM an_anagrafiche WHERE idanagrafica=".prepare($id_anagrafica));
if($rs_anagrafica['note']!=''){
echo "
<div class='col-md-4'>
<b>NOTE CLIENTE:</b><hr style='margin-top:5px;margin-bottom:15px;'>
<div class='alert alert-info' style='margin-bottom: 10px;'>".$rs_anagrafica['note']."</div>
</div>";
}else{
echo "Nessuna nota per questo cliente...";
}
echo "
</div>";
break;
}
?>

View File

@ -195,15 +195,15 @@ if (!empty($sessioni)) {
if (!$is_completato) {
echo '
<td class="text-center">
<button type="button" class="btn btn-xs btn-primary" onclick="copySessione(this)">
<button type="button" class="btn btn-xs btn-primary tip" title="'.tr('Salva e duplica sessione').'" onclick="copySessione(this)">
<i class="fa fa-files-o"></i>
</button>
<button type="button" class="btn btn-xs btn-warning tip" title="'.tr('Modifica sessione').'" onclick="modificaSessione(this)">
<button type="button" class="btn btn-xs btn-warning tip" title="'.tr('Salva e modifica sessione').'" onclick="modificaSessione(this)">
<i class="fa fa-edit"></i>
</button>
<button type="button" class="btn btn-xs btn-danger" id="delbtn_'.$sessione['id'].'" onclick="elimina_sessione(\''.$sessione['id'].'\');" title="Elimina riga" class="only_rw"><i class="fa fa-trash"></i></button>
<button type="button" class="btn btn-xs btn-danger tip" id="delbtn_'.$sessione['id'].'" onclick="elimina_sessione(\''.$sessione['id'].'\');" title="'.tr('Elimina sessione').'" class="only_rw"><i class="fa fa-trash"></i></button>
</td>';
}
@ -328,7 +328,13 @@ function add_tecnici(id_tecnico) {
* Rimuove la sessione di lavoro dall\'intervento.
*/
function elimina_sessione(id_sessione) {
if (confirm("Eliminare sessione di lavoro?")) {
swal({
title: "'.tr('Eliminare la sessione di lavoro?').'",
type: "warning",
showCancelButton: true,
confirmButtonText: "'.tr('Elimina').'"
}).then(function (result) {
$.ajax({
url: globals.rootdir + "/actions.php",
data: {
@ -341,11 +347,11 @@ function elimina_sessione(id_sessione) {
success: function() {
caricaTecnici();
caricaCosti();
calcolaConflittiTecnici();
}
});
}
}).catch(swal.noop);
}
async function copySessione(button) {

View File

@ -350,7 +350,7 @@ foreach ($tecnici as $tecnico) {
$sessioni = Stats::monthly($sessioni, $start, $end);
//Colore tecnico
$background = $tecnico['colore'];
$background = strtoupper($tecnico['colore']);
if (empty($background) || $background == '#FFFFFF') {
//Random color
$background = '#'.dechex(rand(256, 16777215));
@ -403,7 +403,7 @@ $(document).ready(function() {
// Include a dollar sign in the ticks
callback: function(value, index, values) {
var text = "";
if (value<=1){
if (value<=1 && value!=0){
text = " ora";
}else{
text = " ore";
@ -423,8 +423,16 @@ $(document).ready(function() {
if (label) {
label += ": ";
}
label += tooltipItem.xLabel+" ore (attività completate)";
label += tooltipItem.xLabel;
if (tooltipItem.xLabel<=1) {
label += " ora ";
}else{
label += " ore ";
}
label += "(in attività completate)";
return label;
}

View File

@ -37,6 +37,7 @@ if (!empty($utenti)) {
<table class="table table-hover table-condensed table-striped">
<tr>
<th>'.tr('Nome utente').'</th>
<th>'.tr('Email').'</th>
<th>'.tr('Ragione sociale').'</th>
<th>'.tr('Tipo di anagrafica').'</th>
<th>'.tr('Sedi').'</th>
@ -50,6 +51,14 @@ if (!empty($utenti)) {
<i class="fa fa-user"></i> '.$utente['username'].'
</td>';
if (!empty($utente['email'])) {
echo '
<td>'.$utente['email'].'</td>';
} else {
echo '
<td>-</td>';
}
if (!empty($utente['idanagrafica'])) {
echo '
<td>'.Modules::link('Anagrafiche', $utente['idanagrafica'], $utente['ragione_sociale']).'</td>
@ -71,7 +80,7 @@ if (!empty($utenti)) {
// Disabilitazione utente, se diverso da id_utente #1 (admin)
if ($utente['id'] == '1') {
echo '
<div data-toggle="tooltip" class="tip" title="'.tr("Non è possibile disabilitare l'utente admin").'" ><span class="btn btn-xs btn-default disabled">
<div data-toggle="tooltip" class="tip" title="'.tr("Non è possibile disabilitare l'utente admin").'" ><span class="btn btn-xs btn-danger disabled">
<i class="fa fa-eye-slash"></i>
</span></div>';
} elseif ($utente['enabled'] == 1) {
@ -95,7 +104,7 @@ if (!empty($utenti)) {
if ($utente['id'] == '1') {
echo '
<div data-toggle="tooltip" class="tip" title="'.tr("Non è possibile gestire l'accesso API per l'utente admin").'" ><span class="btn btn-xs btn-default disabled">
<div data-toggle="tooltip" class="tip" title="'.tr("Non è possibile gestire l'accesso API per l'utente admin").'" ><span class="btn btn-xs btn-danger disabled">
<i class="fa fa-key "></i>
</span></div>';
} elseif (!empty($token)) {
@ -113,7 +122,7 @@ if (!empty($utenti)) {
// Eliminazione utente, se diverso da id_utente #1 (admin)
if ($utente['id'] == '1') {
echo '
<div data-toggle="tooltip" class="tip" title="'.tr("Non è possibile eliminare l'utente admin").'" ><span class="btn btn-xs btn-default disabled">
<div data-toggle="tooltip" class="tip" title="'.tr("Non è possibile eliminare l'utente admin").'" ><span class="btn btn-xs btn-danger disabled">
<i class="fa fa-trash"></i>
</span></div>';
} else {

View File

@ -42,4 +42,18 @@ INSERT INTO `zz_plugins` ( `name`, `title`, `idmodule_from`, `idmodule_to`, `pos
CREATE TABLE `my_componenti_articoli` ( `id` INT NOT NULL AUTO_INCREMENT, `id_impianto` INT NOT NULL , `id_articolo` INT NOT NULL , `pre_id_articolo` INT NOT NULL, `note` TEXT NOT NULL , `data_registrazione` DATE NULL , `data_installazione` DATE NULL , `data_disinstallazione` DATE NULL , `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , `updated_at` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`));
-- Aggiunta vista referente in modulo attività
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES (NULL, (SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name`='Interventi' ), 'Referente', '(SELECT an_referenti.nome FROM an_referenti WHERE an_referenti.id=in_interventi.idreferente)', '7', '1', '0', '0', '', '', '1', '0', '0');
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES (NULL, (SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name`='Interventi' ), 'Referente', '(SELECT an_referenti.nome FROM an_referenti WHERE an_referenti.id=in_interventi.idreferente)', '7', '1', '0', '0', '', '', '1', '0', '0');
-- Aggiunta vista scaduto in scadenzario
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES
((SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name`='Scadenzario' ), 'Scaduto', 'IF(pagato = da_pagare, \'NO\', IF(data_concordata IS NOT NULL AND data_concordata > NOW(), \'NO\', IF(scadenza < NOW(), \'\', \'NO\')))', 14, 1, 0, 0, '', '', 1, 0, 0);
INSERT INTO `zz_group_view` (`id_gruppo`, `id_vista`) (SELECT `zz_groups`.`id`, `zz_views`.`id` FROM `zz_groups`, `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` WHERE `zz_modules`.`name` = 'Scadenzario' AND `zz_views`.`name` = 'Scaduto');
-- Aggiunta vista "N. utenti" per il modulo "Utenti e permessi"
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES
(NULL, (SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name`='Utenti e permessi'), 'N. utenti', '(SELECT COUNT(`id`) FROM `zz_users` WHERE `idgruppo` = `zz_groups`.`id`)', 3, 1, 0, 0, '', '', 1, 0, 0);
-- Aggiunta vista "Esigibilità" per il modulo "IVA"
INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES
(NULL, (SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name`='IVA'), 'Esigibilità', 'IF(esigibilita=\'I\', \'IVA ad esigibilità immediata\', IF(esigibilita=\'D\', \'IVA ad esigibilità differita\', \'Scissione dei pagamenti\'))', 5, 1, 0, 0, '', '', 1, 0, 0);