1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-02-16 11:30:55 +01:00

Merge branch 'master' into 2.4

This commit is contained in:
Thomas Zilio 2018-02-17 09:02:19 +01:00
commit 33b7220ae4
35 changed files with 480 additions and 274 deletions

View File

@ -4,7 +4,12 @@ Tutti i maggiori cambiamenti di questo progetto saranno documentati in questo fi
Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://keepachangelog.com/), e il progetto segue il [Semantic Versioning](http://semver.org/) per definire le versioni delle release.
- [2.3 (In sviluppo)](#23-in-sviluppo)
- [2.3.1 (2018-02-16)](#231)
- [Aggiunto (Added)](#aggiunto-added)
- [Modificato (Changed)](#modificato-changed)
- [Rimosso (Removed)](#rimosso-removed)
- [Fixed](#fixed)
- [2.3 (2018-01-27)](#23-in-sviluppo)
- [Aggiunto (Added)](#aggiunto-added)
- [Modificato (Changed)](#modificato-changed)
- [Deprecato (Deprecated)](#deprecato-deprecated)
@ -19,7 +24,45 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k
- [Modificato (Changed)](#modificato-changed)
- [Fixed](#fixed)
## 2.3 (In sviluppo)
## 2.3.1 (2018-02-16)
### Aggiunto (Added)
- Aggiunti i seriali in stampa
- Aggiunta la zona nelle attività (in sola lettura dall'anagrafica)
- Aggiunta tramite flag la possibilità di inserire la descrizione dell'intervento in fattura
- Aggiunta esportazione bulk in zip dei pdf degli interventi selezionati
- Aggiunte informazioni del cliente e fornitore nelle relative stampe ordini
### Modificato (Changed)
- Migliorati i widget di "Crediti da clienti" e "Debiti verso fornitori", con calcolo parziale del rimanente
- Disabilitato di default il modulo "Viste"
- Migliorata la gestione della pianificazione attività sui contratti, con la possibilità di eliminare tutte le pianificazioni
o di creare direttamente un intervento collegato
- Modificato l'inserimento di interventi in fattura raggruppando per costo orario nel caso ci siano più costi orari
- Spostato il conto "Perdite e profitti" nello stato patrimoniale
### Fixed
- Corretti diversi problemi in fase di installazione
- Modifica e miglioramento dell'arrotondamento iva in fattura, sia a video che in stampa
- Corretto il caricamento di menu a tendina per gli utenti con permessi limitati
- Corretti i permessi per la stampa fattura per utenti con permessi limitati
- Corretto e migliorato il funzionamento delle viste
- Corretto il calcolo dello sconto incondizionato in percentuale nei principali moduli
- Corretta la stampa consuntivo del preventivo
- Corrette alcune funzioni dello scadenzario, in quanto sparivano delle scadenze in fase di modifica prima nota
- Corretto il cambio di stato automatico di ddt dopo la fatturazione
- Migliorato il caricamento dinamico del calendario via ajax in quanto a volte si bloccava
- Correzioni varie sulla gestione viste
- Corretto il piano dei conti per arrotondare gli importi come negli altri moduli
- Corretto il calcolo iva nei contratti
- Corretto il salvataggio delle sessioni tecnico nei propri interventi
- Corretto un problema nel salvataggio firma intervento su alcuni tablet
- Corretto ordinamento voci di menu laterale
- Altre correzioni minori e strutturali
## 2.3 (2018-02-16)
### Aggiunto (Added)

View File

@ -1001,6 +1001,10 @@ function start_inputmask(element) {
$(element+'.email-mask').inputmask('Regex', {
regex: "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+(?:\\.[a-zA-Z0-9_!#$%&'*+/=?`{|}~^-]+)*@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$",
});
$(element+'.alphanumeric-mask').inputmask('Regex', {
regex: "[A-Za-z0-9]{10}",
});
if (isMobile.any()) {
$(element+'.inputmask-decimal, '+element+'.date-mask, '+element+'.timestamp-mask').each(function () {

View File

@ -107,12 +107,22 @@ switch (post('op')) {
// Ordinamento moduli di primo livello
case 'sortmodules':
$ids = explode(',', post('ids'));
$ids = explode(',', $_POST['ids']);
for ($i = 0; $i < count($ids); ++$i) {
$dbo->query('UPDATE zz_modules SET `order`='.prepare($i).' WHERE id='.prepare($ids[$i]));
/*$rs = $dbo->fetchArray('SELECT id, name FROM zz_modules WHERE id='.prepare($ids[$i]));
$voce = $rs[0]['name'];
$_SESSION['infos'][] = tr('Posizione della voce _VOCE_ aggiornata!', [
'_VOCE_' => '"'.$voce.'"',
]);*/
}
$_SESSION['infos'][] = tr('Posizione voci di menù aggiornate!');
break;
case 'sortwidget':

View File

@ -2,6 +2,11 @@
include_once __DIR__.'/../../core.php';
$id_azienda = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Azienda'")[0]['idtipoanagrafica'];
$id_cliente = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Cliente'")[0]['idtipoanagrafica'];
$id_fornitore = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Fornitore'")[0]['idtipoanagrafica'];
$id_tecnico = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Tecnico'")[0]['idtipoanagrafica'];
switch (post('op')) {
case 'update':
// Leggo tutti i valori passati dal POST e li salvo in un array

View File

@ -8,8 +8,3 @@ if (isset($id_record)) {
$records[0]['lat'] = floatval($records[0]['lat']);
$records[0]['lng'] = floatval($records[0]['lng']);
}
$id_azienda = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Azienda'")[0]['idtipoanagrafica'];
$id_cliente = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Cliente'")[0]['idtipoanagrafica'];
$id_fornitore = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Fornitore'")[0]['idtipoanagrafica'];
$id_tecnico = $dbo->fetchArray("SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione='Tecnico'")[0]['idtipoanagrafica'];

View File

@ -50,8 +50,8 @@ if (!empty($rs_art)) {
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo
Translator::numberToLocale($r['qta']);
echo '
'.Translator::numberToLocale($r['qta']);
}
echo '
</td>';
@ -60,8 +60,8 @@ if (!empty($rs_art)) {
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo
$r['um'];
echo '
'.$r['um'];
}
echo '
</td>';
@ -70,8 +70,8 @@ if (!empty($rs_art)) {
echo '
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo
Translator::numberToLocale($r['subtotale'] / $r['qta']).' &euro;';
echo '
'.Translator::numberToLocale($r['subtotale'] / $r['qta']).' &euro;';
}
echo'
</td>';
@ -80,8 +80,8 @@ if (!empty($rs_art)) {
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo
Translator::numberToLocale($r['iva'])." &euro;<br>
echo '
'.Translator::numberToLocale($r['iva'])." &euro;<br>
<small class='help-block'>".$r['desc_iva'].'</small>';
}
echo '
@ -91,15 +91,15 @@ if (!empty($rs_art)) {
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo
Translator::numberToLocale($r['subtotale']).' &euro;';
echo '
'.Translator::numberToLocale($r['subtotale']).' &euro;';
if ($r['sconto_unitario'] > 0) {
echo '
<br><small class="label label-danger">- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'</small>';
<br><small class="label label-danger">- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'</small>';
}
}
echo '

View File

@ -61,8 +61,8 @@ for ($i = 0; $i < count($rs); ++$i) {
++$count;
}
}
$checks .= "<li><input type='checkbox' id='idstato_".$rs[$i]['id']."' value=\"".$rs[$i]['id'].'" '.$attr." onclick=\"session_set_array( 'dashboard,idstatiintervento', '".$rs[$i]['id']."' ); $('#calendar').fullCalendar('refetchEvents'); update_counter( 'idstati_count', $('#idstati_ul').find('input:checked').length );\"> <label for='idstato_".$rs[$i]['id']."'> <span class='badge' style=\"color:#333; background:".$rs[$i]['colore'].';">'.$rs[$i]['descrizione']."</span></label></li>\n";
$checks .= "<li><input type='checkbox' id='idstato_".$rs[$i]['id']."' value=\"".$rs[$i]['id'].'" '.$attr." onclick=\"$.when ( session_set_array( 'dashboard,idstatiintervento', '".$rs[$i]['id']."' ) ).promise().then(function( ){ $('#calendar').fullCalendar('refetchEvents'); }); update_counter( 'idstati_count', $('#idstati_ul').find('input:checked').length ); \"> <label for='idstato_".$rs[$i]['id']."'> <span class='badge' style=\"color:#333; background:".$rs[$i]['colore'].';">'.$rs[$i]['descrizione']."</span></label></li>\n";
$allchecksstati .= "session_set_array( 'dashboard,idstatiintervento', '".$rs[$i]['id']."', 0 ); ";
}
@ -115,8 +115,9 @@ for ($i = 0; $i < count($rs); ++$i) {
++$count;
}
}
$checks .= "<li><input type='checkbox' id='idtipo_".$rs[$i]['id']."' value=\"".$rs[$i]['id'].'" '.$attr." onclick=\"session_set_array( 'dashboard,idtipiintervento', '".$rs[$i]['id']."' ); $('#calendar').fullCalendar('refetchEvents'); update_counter( 'idtipi_count', $('#idtipi_ul').find('input:checked').length );\"> <label for='idtipo_".$rs[$i]['id']."'> ".$rs[$i]['descrizione']."</label></li>\n";
$checks .= "<li><input type='checkbox' id='idtipo_".$rs[$i]['id']."' value=\"".$rs[$i]['id'].'" '.$attr." onclick=\"$.when ( session_set_array( 'dashboard,idtipiintervento', '".$rs[$i]['id']."' ) ).promise().then(function( ){ $('#calendar').fullCalendar('refetchEvents'); }); update_counter( 'idtipi_count', $('#idtipi_ul').find('input:checked').length ); \"> <label for='idtipo_".$rs[$i]['id']."'> ".$rs[$i]['descrizione']."</label></li>\n";
$allcheckstipi .= "session_set_array( 'dashboard,idtipiintervento', '".$rs[$i]['id']."', 0 ); ";
}
@ -173,7 +174,9 @@ for ($i = 0; $i < count($rs); ++$i) {
}
}
$checks .= "<li><input type='checkbox' id='tech_".$rs[$i]['id']."' value=\"".$rs[$i]['id'].'" '.$attr." onclick=\"session_set_array( 'dashboard,idtecnici', '".$rs[$i]['id']."' ); $('#calendar').fullCalendar('refetchEvents'); update_counter( 'idtecnici_count', $('#idtecnici_ul').find('input:checked').length );\"> <label for='tech_".$rs[$i]['id']."'> ".$rs[$i]['ragione_sociale']."</label></li>\n";
$checks .= "<li><input type='checkbox' id='tech_".$rs[$i]['id']."' value=\"".$rs[$i]['id'].'" '.$attr." onclick=\"$.when ( session_set_array( 'dashboard,idtecnici', '".$rs[$i]['id']."' ) ).promise().then(function( ){ $('#calendar').fullCalendar('refetchEvents'); }); update_counter( 'idtecnici_count', $('#idtecnici_ul').find('input:checked').length ); \"> <label for='tech_".$rs[$i]['id']."'> ".$rs[$i]['ragione_sociale']."</label></li>\n";
$allchecktecnici .= "session_set_array( 'dashboard,idtecnici', '".$rs[$i]['id']."', 0 ); ";
}
@ -195,8 +198,8 @@ if ($total > 0) {
++$count;
}
}
$checks .= "<li><input type='checkbox' id='tech_".$rs[$i]['id']."' value=\"".$rs[$i]['id'].'" '.$attr." onclick=\"session_set_array( 'dashboard,idtecnici', '".$rs[$i]['id']."' ); $('#calendar').fullCalendar('refetchEvents'); update_counter( 'idtecnici_count', $('#idtecnici_ul').find('input:checked').length );\"> <label for='tech_".$rs[$i]['id']."'> ".$rs[$i]['ragione_sociale']."</label></li>\n";
$checks .= "<li><input type='checkbox' id='tech_".$rs[$i]['id']."' value=\"".$rs[$i]['id'].'" '.$attr." onclick=\"$.when ( session_set_array( 'dashboard,idtecnici', '".$rs[$i]['id']."' ) ).promise().then(function( ){ $('#calendar').fullCalendar('refetchEvents'); }); update_counter( 'idtecnici_count', $('#idtecnici_ul').find('input:checked').length ); \"> <label for='tech_".$rs[$i]['id']."'> ".$rs[$i]['ragione_sociale']."</label></li>\n";
$allchecktecnici .= "session_set_array( 'dashboard,idtecnici', '".$rs[$i]['id']."', 0 ); ";
} // end for
@ -248,7 +251,7 @@ for ($i = 0; $i < count($rs); ++$i) {
}
}
$checks .= "<li><input type='checkbox' id='idzone_".$rs[$i]['id']."' value=\"".$rs[$i]['id'].'" '.$attr." onclick=\"session_set_array( 'dashboard,idzone', '".$rs[$i]['id']."' ); $('#calendar').fullCalendar('refetchEvents'); update_counter( 'idzone_count', $('#idzone_ul').find('input:checked').length );\"> <label for='idzone_".$rs[$i]['id']."'> ".$rs[$i]['descrizione']."</label></li>\n";
$checks .= "<li><input type='checkbox' id='idzone_".$rs[$i]['id']."' value=\"".$rs[$i]['id'].'" '.$attr." onclick=\"$.when ( session_set_array( 'dashboard,idzone', '".$rs[$i]['id']."' ) ).promise().then(function( ){ $('#calendar').fullCalendar('refetchEvents'); update_counter( 'idzone_count', $('#idzone_ul').find('input:checked').length ); }); \"> <label for='idzone_".$rs[$i]['id']."'> ".$rs[$i]['descrizione']."</label></li>\n";
$allcheckzone .= "session_set_array( 'dashboard,idzone', '".$rs[$i]['id']."', 0 ); ";
}
@ -324,80 +327,118 @@ if ($vista == 'mese') {
$(document).ready(function() {
// Comandi seleziona tutti
$('#selectallstati').click(function(event) {
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
this.checked = true;
$(this).parent().parent().find('li input[type=checkbox]').each(function(i) { //loop through each checkbox
this.checked = true;
$.when (session_set_array( 'dashboard,idstatiintervento', this.value, 0 )).promise().then(function() {
$('#calendar').fullCalendar('refetchEvents');
});
i++;
update_counter( 'idstati_count',i);
});
update_counter( 'idstati_count', $('#idstati_ul').find('input:checked').length );
$('#calendar').fullCalendar('refetchEvents');
});
$('#selectalltipi').click(function(event) {
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
this.checked = true;
});
$(this).parent().parent().find('li input[type=checkbox]').each(function(i) { //loop through each checkbox
this.checked = true;
$.when (session_set_array( 'dashboard,idtipiintervento', this.value, 0 )).promise().then(function() {
$('#calendar').fullCalendar('refetchEvents');
});
i++;
update_counter( 'idtipi_count', i);
update_counter( 'idtipi_count', $('#idtipi_ul').find('input:checked').length );
$('#calendar').fullCalendar('refetchEvents');
});
});
$('#selectalltecnici').click(function(event) {
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
this.checked = true;
$(this).parent().parent().find('li input[type=checkbox]').each(function(i) { //loop through each checkbox
this.checked = true;
$.when (session_set_array( 'dashboard,idtecnici', this.value, 0 )).promise().then(function() {
$('#calendar').fullCalendar('refetchEvents');
});
i++;
update_counter( 'idtecnici_count', i);
});
update_counter( 'idtecnici_count', $('#idtecnici_ul').find('input:checked').length );
$('#calendar').fullCalendar('refetchEvents');
});
$('#selectallzone').click(function(event) {
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
this.checked = true;
});
$(this).parent().parent().find('li input[type=checkbox]').each(function(i) { //loop through each checkbox
this.checked = true;
$.when (session_set_array( 'dashboard,idzone', this.value, 0 )).promise().then(function() {
$('#calendar').fullCalendar('refetchEvents');
});
i++
update_counter( 'idzone_count', i);
update_counter( 'idzone_count', $('#idzone_ul').find('input:checked').length );
$('#calendar').fullCalendar('refetchEvents');
});
});
// Comandi deseleziona tutti
$('#deselectallstati').click(function(event) {
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
if( this.checked == true ) session_set_array( 'dashboard,idstatiintervento', this.value, 1 );
this.checked = false;
});
update_counter( 'idstati_count', $('#idstati_ul').find('input:checked').length );
$('#calendar').fullCalendar('refetchEvents');
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
this.checked = false;
$.when (session_set_array( 'dashboard,idstatiintervento', this.value, 1 )).promise().then(function() {
$('#calendar').fullCalendar('refetchEvents');
});
update_counter( 'idstati_count', 0);
});
});
$('#deselectalltipi').click(function(event) {
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
if( this.checked == true ) session_set_array( 'dashboard,idtipiintervento', this.value, 1 );
this.checked = false;
});
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
this.checked = false;
$.when (session_set_array( 'dashboard,idtipiintervento', this.value, 1 )).promise().then(function() {
$('#calendar').fullCalendar('refetchEvents');
});
update_counter( 'idtipi_count', 0);
update_counter( 'idtipi_count', $('#idtipi_ul').find('input:checked').length );
$('#calendar').fullCalendar('refetchEvents');
});
});
$('#deselectalltecnici').click(function(event) {
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
if( this.checked == true ) session_set_array( 'dashboard,idtecnici', this.value, 1 );
this.checked = false;
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
this.checked = false;
$.when (session_set_array( 'dashboard,idtecnici', this.value, 1 )).promise().then(function() {
$('#calendar').fullCalendar('refetchEvents');
});
update_counter( 'idtecnici_count', 0);
});
update_counter( 'idtecnici_count', $('#idtecnici_ul').find('input:checked').length );
$('#calendar').fullCalendar('refetchEvents');
});
$('#deselectallzone').click(function(event) {
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
if( this.checked == true ) session_set_array( 'dashboard,idzone', this.value, 1 );
this.checked = false;
$(this).parent().parent().find('li input[type=checkbox]').each(function() { //loop through each checkbox
this.checked = false;
$.when (session_set_array( 'dashboard,idzone', this.value, 1 )).promise().then(function() {
$('#calendar').fullCalendar('refetchEvents');
});
update_counter( 'idzone_count', 0);
});
update_counter( 'idzone_count', $('#idzone_ul').find('input:checked').length );
$('#calendar').fullCalendar('refetchEvents');
});
// Creazione del calendario

View File

@ -85,7 +85,7 @@ if (!empty($rs)) {
echo '
<td class="text-center">';
if($r['is_descrizione']==0){
if (empty($r['is_descrizione'])) {
if (empty($r['sconto_globale'])) {
echo '
<big>'.Translator::numberToLocale($r['qta'] - $r['qta_evasa']).'</big>
@ -100,9 +100,9 @@ if (!empty($rs)) {
// Unità di misura
echo '
<td class="text-center">';
if($r['is_descrizione']==0){
echo
$r['um'];
if (empty($r['is_descrizione'])) {
echo '
'.$r['um'];
}
echo '
</td>';
@ -110,16 +110,16 @@ if (!empty($rs)) {
// Costo unitario
echo '
<td class="text-right">';
if($r['is_descrizione']==0){
echo
Translator::numberToLocale($r['subtotale'] / $r['qta']).' &euro;';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['subtotale'] / $r['qta']).' &euro;';
if ($r['sconto_unitario'] > 0) {
echo '
<br><small class="label label-danger">- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'</small>';
<br><small class="label label-danger">- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'</small>';
}
}
echo '
@ -128,9 +128,9 @@ if (!empty($rs)) {
// Iva
echo '
<td class="text-right">';
if($r['is_descrizione']==0){
echo
Translator::numberToLocale($r['iva']).' &euro;
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['iva']).' &euro;
<br><small class="help-block">'.$r['desc_iva'].'</small>';
}
echo '
@ -139,9 +139,9 @@ if (!empty($rs)) {
// Imponibile
echo '
<td class="text-right">';
if($r['is_descrizione']==0){
echo
Translator::numberToLocale($r['subtotale'] - $r['sconto']).' &euro;';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['subtotale'] - $r['sconto']).' &euro;';
}
echo '
</td>';
@ -207,7 +207,7 @@ echo '
// Calcoli
$imponibile = sum(array_column($rs, 'subtotale'));
$sconto = sum(array_column($rs, 'sconto'));
$iva = sum(array_column($rs, 'iva'));
$iva = sum(array_column($rs, 'iva'), null, 4);
$imponibile_scontato = sum($imponibile, -$sconto);

View File

@ -195,7 +195,7 @@ switch (post('op')) {
$rs = $dbo->fetchArray($query);
for ($i = 0; $i < sizeof($rs); ++$i) {
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Completato') WHERE id=".prepare($rs[$i]['idintervento']));
$dbo->query("UPDATE in_interventi SET idstatointervento='OK' WHERE id=".prepare($rs[$i]['idintervento']));
}
// Se delle righe sono state create da un ordine, devo riportare la quantità evasa nella tabella degli ordini al valore di prima, riaggiungendo la quantità che sto togliendo
@ -1131,7 +1131,7 @@ switch (post('op')) {
// Se ci sono degli interventi collegati li rimetto nello stato "Completato"
for ($i = 0; $i < sizeof($rs); ++$i) {
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Completato') WHERE id=".prepare($rs[$i]['idintervento']));
$dbo->query("UPDATE in_interventi SET idstatointervento='OK' WHERE id=".prepare($rs[$i]['idintervento']));
// Rimuovo dalla fattura gli articoli collegati all'intervento
$rs2 = $dbo->fetchArray('SELECT idarticolo FROM mg_articoli_interventi WHERE idintervento='.prepare($idintervento));
@ -1190,7 +1190,7 @@ switch (post('op')) {
$dbo->query("UPDATE co_preventivi SET idstato=(SELECT id FROM co_statipreventivi WHERE descrizione='In lavorazione') WHERE id=".prepare($rsp[$i]['idpreventivo']));
// Aggiorno anche lo stato degli interventi collegati ai preventivi
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Completato') WHERE id IN (SELECT idintervento FROM co_preventivi_interventi WHERE idpreventivo=".prepare($rsp[$i]['idpreventivo']).')');
$dbo->query("UPDATE in_interventi SET idstatointervento='OK' WHERE id IN (SELECT idintervento FROM co_preventivi_interventi WHERE idpreventivo=".prepare($rsp[$i]['idpreventivo']).')');
}
/*
@ -1240,7 +1240,7 @@ switch (post('op')) {
$dbo->query("UPDATE co_contratti SET idstato=(SELECT id FROM co_staticontratti WHERE descrizione='In lavorazione') WHERE id=".prepare($rsp[$i]['idcontratto']));
// Aggiorno anche lo stato degli interventi collegati ai contratti
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Completato') WHERE id IN (SELECT idintervento FROM co_righe_contratti WHERE idcontratto=".prepare($rsp[$i]['idcontratto']).')');
$dbo->query("UPDATE in_interventi SET idstatointervento='OK' WHERE id IN (SELECT idintervento FROM co_righe_contratti WHERE idcontratto=".prepare($rsp[$i]['idcontratto']).')');
}
/*

View File

@ -32,7 +32,7 @@ echo '
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="dir" value="'.$dir.'">';
$rs = $dbo->fetchArray('SELECT in_interventi.id, CONCAT(\'Intervento numero \', codice, \' del \', DATE_FORMAT(IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), data_richiesta), \'%d/%m/%Y\')) AS descrizione, IF(idclientefinale='.prepare($idanagrafica).', \'Interventi conto terzi\', \'Interventi diretti\') AS `optgroup`FROM in_interventi WHERE (idanagrafica='.prepare($idanagrafica).' OR idclientefinale='.prepare($idanagrafica).') AND NOT idstatointervento=\'DENY\' AND in_interventi.id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND NOT in_interventi.id IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND NOT in_interventi.id IN (SELECT idintervento FROM co_righe_contratti WHERE idintervento IS NOT NULL)');
$rs = $dbo->fetchArray('SELECT in_interventi.id, CONCAT(\'Intervento numero \', codice, \' del \', DATE_FORMAT(IFNULL((SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE in_interventi_tecnici.idintervento=in_interventi.id), data_richiesta), \'%d/%m/%Y\')) AS descrizione, CONCAT(\'\n\', descrizione) AS descrizione_intervento, IF(idclientefinale='.prepare($idanagrafica).', \'Interventi conto terzi\', \'Interventi diretti\') AS `optgroup`FROM in_interventi WHERE (idanagrafica='.prepare($idanagrafica).' OR idclientefinale='.prepare($idanagrafica).') AND NOT idstatointervento=\'DENY\' AND in_interventi.id NOT IN (SELECT idintervento FROM co_righe_documenti WHERE idintervento IS NOT NULL) AND NOT in_interventi.id IN (SELECT idintervento FROM co_preventivi_interventi WHERE idintervento IS NOT NULL) AND NOT in_interventi.id IN (SELECT idintervento FROM co_righe_contratti WHERE idintervento IS NOT NULL)');
foreach ($rs as $key => $value) {
$rs[$key]['prezzo'] = get_costi_intervento($value['id'])['totale'];
}
@ -40,9 +40,15 @@ foreach ($rs as $key => $value) {
// Intervento
echo '
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Intervento').'", "name": "idintervento", "required": 1, "values": '.json_encode($rs).', "extra": "onchange=\"$data = $(this).selectData(); $(\'#descrizione\').val($data.descrizione); $(\'#prezzo\').val($data.prezzo);\"" ]}
{[ "type": "select", "label": "'.tr('Intervento').'", "name": "idintervento", "required": 1, "values": '.json_encode($rs).', "extra": "onchange=\"$data = $(this).selectData(); $(\'#descrizione\').val($data.descrizione); if($(\'#copia_descrizione\').is(\':checked\')){ $(\'#descrizione\').val($data.descrizione + $data.descrizione_intervento); }; $(\'#prezzo\').val($data.prezzo);\"" ]}
</div>
<div class="col-md-6">
{[ "type": "checkbox", "label": "'.tr('Copia descrizione').'", "name": "copia_descrizione", "required": 0, "values": "", "extra": "", "help": "", "placeholder": "'.tr('In fase di selezione copia la descrizione dell\'intervento').'." ]}
</div>
</div>';
// Descrizione

View File

@ -743,9 +743,13 @@ function aggiorna_sconto($tables, $fields, $id_record, $options = [])
$sconto[0]['sconto_globale'] = floatval($sconto[0]['sconto_globale']);
// Aggiorno l'eventuale sconto gestendolo con le righe in fattura
$iva = 0;
if (!empty($sconto[0]['sconto_globale'])) {
if ($sconto[0]['tipo_sconto_globale'] == 'PRC') {
$subtotale = $dbo->fetchArray('SELECT SUM(subtotale - sconto) AS imponibile FROM (SELECT '.$tables['row'].'.subtotale, '.$tables['row'].'.sconto FROM '.$tables['row'].' WHERE '.$fields['row'].'='.prepare($id_record).') AS t')[0]['imponibile'];
$rs = $dbo->fetchArray('SELECT SUM(subtotale - sconto) AS imponibile, SUM(iva) AS iva FROM (SELECT '.$tables['row'].'.subtotale, '.$tables['row'].'.sconto, '.$tables['row'].'.iva FROM '.$tables['row'].' WHERE '.$fields['row'].'='.prepare($id_record).') AS t');
$subtotale = $rs[0]['imponibile'];
$iva += $rs[0]['iva'] / 100 * $sconto[0]['sconto_globale'];
$subtotale = -$subtotale / 100 * $sconto[0]['sconto_globale'];
$descrizione = $descrizione.' '.Translator::numberToLocale($sconto[0]['sconto_globale']).'%';
@ -756,7 +760,6 @@ function aggiorna_sconto($tables, $fields, $id_record, $options = [])
// Calcolo dell'IVA da scontare
$idiva = get_var('Iva predefinita');
$rsi = $dbo->select('co_iva', ['descrizione', 'percentuale'], ['id' => $idiva]);
$iva = $subtotale / 100 * $rsi[0]['percentuale'];
$values = [
$fields['row'] => $id_record,
@ -765,7 +768,7 @@ function aggiorna_sconto($tables, $fields, $id_record, $options = [])
'qta' => 1,
'idiva' => $idiva,
'desc_iva' => $rsi[0]['descrizione'],
'iva' => $iva,
'iva' => -$iva,
'sconto_globale' => 1,
'#order' => '(SELECT IFNULL(MAX(`order`) + 1, 0) FROM '.$tables['row'].' AS t WHERE '.$fields['row'].'='.prepare($id_record).')',
];

View File

@ -165,8 +165,8 @@ if (!empty($rs)) {
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo
Translator::numberToLocale($r['qta']);
echo '
'.Translator::numberToLocale($r['qta']);
}
echo '
@ -177,8 +177,8 @@ if (!empty($rs)) {
<td class="text-center">';
if (empty($r['is_descrizione'])) {
echo
$r['um'];
echo '
'.$r['um'];
}
echo '
@ -189,15 +189,15 @@ if (!empty($rs)) {
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo
Translator::numberToLocale($r['subtotale'] / $r['qta']).' &euro;';
echo '
'.Translator::numberToLocale($r['subtotale'] / $r['qta']).' &euro;';
if ($r['sconto_unitario'] > 0) {
echo '
<br><small class="label label-danger">- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'</small>';
<br><small class="label label-danger">- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'</small>';
}
}
@ -209,8 +209,8 @@ if (!empty($rs)) {
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo
Translator::numberToLocale($r['iva']).' &euro;
echo '
'.Translator::numberToLocale($r['iva']).' &euro;
<br><small class="help-block">'.$r['desc_iva'].'</small>';
}
@ -221,8 +221,8 @@ if (!empty($rs)) {
echo '
<td class="text-right">';
if (empty($r['is_descrizione'])) {
echo
Translator::numberToLocale($r['subtotale'] - $r['sconto']).' &euro;';
echo '
'.Translator::numberToLocale($r['subtotale'] - $r['sconto']).' &euro;';
}
echo '
</td>';
@ -278,7 +278,7 @@ echo '
// Calcoli
$imponibile = sum(array_column($rs, 'subtotale'));
$sconto = sum(array_column($rs, 'sconto'));
$iva = sum(array_column($rs, 'iva'));
$iva = sum(array_column($rs, 'iva'), null, 4);
$imponibile_scontato = sum($imponibile, -$sconto);

View File

@ -576,7 +576,7 @@ switch (post('op')) {
if (!$img->save($docroot.'/files/interventi/'.$firma_file)) {
$_SESSION['errors'][] = tr('Impossibile creare il file!');
} elseif ($dbo->query('UPDATE in_interventi SET firma_file='.prepare($firma_file).', firma_data=NOW(), firma_nome = '.prepare($firma_nome).', idstatointervento = (SELECT idstatointervento FROM in_statiintervento WHERE completato = 1 LIMIT 0, 1) WHERE id='.prepare($id_record))) {
} elseif ($dbo->query('UPDATE in_interventi SET firma_file='.prepare($firma_file).', firma_data=NOW(), firma_nome = '.prepare($firma_nome).', idstatointervento = "OK" WHERE id='.prepare($id_record))) {
$_SESSION['infos'][] = tr('Firma salvata correttamente!');
$_SESSION['infos'][] = tr('Attività completata!');
} else {

View File

@ -71,7 +71,7 @@ elseif (!empty($idcontratto) && !empty($idcontratto_riga)) {
$idimpianto = implode(',', array_column($rs, 'idimpianto'));
// Seleziono "In programmazione" come stato
$rs = $dbo->fetchArray("SELECT * FROM in_statiintervento WHERE descrizione='In programmazione'");
$rs = $dbo->fetchArray("SELECT * FROM in_statiintervento WHERE codice='WIP'");
$idstatointervento = $rs[0]['idstatointervento'];
}
@ -184,7 +184,7 @@ if (empty($new_codice)) {
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Stato intervento'); ?>", "name": "idstatointervento", "required": 1, "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento", "value": "<?php echo $idstatointervento; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Stato intervento'); ?>", "name": "idstatointervento", "required": 1, "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento WHERE deleted = 0", "value": "<?php echo $idstatointervento; ?>" ]}
</div>
<div class="col-md-2">

View File

@ -25,7 +25,7 @@ if (!empty($rs)) {
<th width="15%">'.tr('Subtotale').'</th>';
}
if ($rs[0]['stato'] != 'Fatturato' && $rs[0]['stato'] != 'Completato') {
if ( !$records[0]['flg_completato'] ) {
echo '
<th width="80"></th>';
}
@ -109,7 +109,7 @@ if (!empty($rs)) {
// Pulsante per riportare nel magazzino centrale.
// Visibile solo se l'intervento non è stato nè fatturato nè completato.
if ($rs[0]['stato'] != 'Fatturato' && $rs[0]['stato'] != 'Completato') {
if ( !$records[0]['flg_completato'] ) {
echo '
<td>';

View File

@ -9,6 +9,15 @@ $rs_iva = $dbo->fetchArray('SELECT descrizione, percentuale, indetraibile FROM c
if (Auth::admin() || $_SESSION['gruppo'] != 'Tecnici') {
$costi = get_costi_intervento($id_record);
$rss = $dbo->fetchArray('SELECT in_statiintervento.completato FROM in_statiintervento INNER JOIN in_interventi ON in_statiintervento.idstatointervento=in_interventi.idstatointervento WHERE in_interventi.id='.prepare($id_record));
$flg_completato = $rss[0]['completato'];
if( $flg_completato ){
$readonly = 'readonly';
} else {
$readonly = '';
}
echo '
<!-- Riepilogo dei costi -->
@ -97,7 +106,7 @@ echo '
<!-- SCONTO -->
<div class="row">
<div class="col-md-4 pull-right">
{[ "type": "number", "label": "'.tr('Sconto incondizionato').'", "name": "sconto_globale", "value": "'.$sconto.'", "icon-after": "choice|untprc|'.$tipo_sconto.'" ]}
{[ "type": "number", "label": "'.tr('Sconto incondizionato').'", "name": "sconto_globale", "value": "'.$sconto.'", "icon-after": "choice|untprc|'.$tipo_sconto.'", "extra": "'.$readonly.'" ]}
</div>
</div>';

View File

@ -19,7 +19,7 @@ if (count($rs2) > 0) {
<th width="15%">'.tr('Subtotale').'</th>';
}
if ($records[0]['stato'] != 'Fatturato' && $records[0]['stato'] != 'Completato') {
if ( !$records[0]['flg_completato'] ) {
echo '
<th width="80"></th>';
}
@ -76,7 +76,7 @@ if (count($rs2) > 0) {
// Pulsante per riportare nel magazzino centrale.
// Visibile solo se l'intervento non è stato nè fatturato nè completato.
if ($records[0]['stato'] != 'Fatturato' && $records[0]['stato'] != 'Completato') {
if ( !$records[0]['flg_completato'] ) {
echo '
<td>
<button type="button" class="btn btn-warning btn-xs" data-toggle="tooltip" onclick="launch_modal(\''.tr('Modifica spesa').'\', \''.$rootdir.'/modules/interventi/add_righe.php?id_module='.$id_module.'&id_record='.$id_record.'&idriga='.$r['id'].'\', 1);"><i class="fa fa-edit"></i></button>

View File

@ -2,7 +2,11 @@
include_once __DIR__.'/../../core.php';
include_once $docroot.'/modules/interventi/modutil.php';
if (file_exists($docroot.'/modules/interventi/custom/modutil.php')){
include_once $docroot.'/modules/interventi/custom/modutil.php';
} else {
include_once $docroot.'/modules/interventi/modutil.php';
}
switch (get('op')) {
// OPERAZIONI PER AGGIUNTA NUOVA SESSIONE DI LAVORO
@ -36,13 +40,23 @@ if ($user['gruppo'] == 'Tecnici') {
}
// RECUPERO IL TIPO DI INTERVENTO
$rss = $dbo->fetchArray('SELECT idtipointervento FROM in_interventi WHERE id='.prepare($id_record));
$idtipointervento = $rs[0]['idtipointervento'];
$rss = $dbo->fetchArray('SELECT idtipointervento, idstatointervento FROM in_interventi WHERE id='.prepare($id_record));
$idtipointervento = $rss[0]['idtipointervento'];
$idstatointervento = $rss[0]['idstatointervento'];
$rss = $dbo->fetchArray('SELECT completato FROM in_statiintervento WHERE idstatointervento='.prepare($idstatointervento));
$flg_completato = $rss[0]['completato'];
$query = 'SELECT * FROM an_anagrafiche JOIN in_interventi_tecnici ON in_interventi_tecnici.idtecnico = an_anagrafiche.idanagrafica WHERE deleted=0 AND idintervento='.prepare($id_record)." AND idanagrafica IN (SELECT idanagrafica FROM an_tipianagrafiche_anagrafiche WHERE idtipoanagrafica = (SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione = 'Tecnico')) ORDER BY ragione_sociale ASC, in_interventi_tecnici.orario_inizio ASC, in_interventi_tecnici.id ASC";
$rs2 = $dbo->fetchArray($query);
$prev_tecnico = '';
if( $flg_completato ){
$readonly = 'readonly';
} else {
$readonly = '';
}
if (!empty($rs2)) {
foreach ($rs2 as $key => $r) {
$idtecnico = $r['idanagrafica'];
@ -116,7 +130,7 @@ if (!empty($rs2)) {
if ($rs[0]['stato'] != 'Fatturato') {
// Elenco tipologie di interventi
echo '
{[ "type": "select", "name": "idtipointerventot['.$id.']", "value": "'.$r['idtipointervento'].'", "values": "query=SELECT idtipointervento AS id, descrizione, IFNULL((SELECT costo_ore FROM in_tariffe WHERE idtipointervento=in_tipiintervento.idtipointervento AND idtecnico='.prepare($r['idtecnico']).'), 0) AS costo_orario FROM in_tipiintervento ORDER BY descrizione", "class": "", "extra": "" ]}';
{[ "type": "select", "name": "idtipointerventot['.$id.']", "value": "'.$r['idtipointervento'].'", "values": "query=SELECT idtipointervento AS id, descrizione, IFNULL((SELECT costo_ore FROM in_tariffe WHERE idtipointervento=in_tipiintervento.idtipointervento AND idtecnico='.prepare($r['idtecnico']).'), 0) AS costo_orario FROM in_tipiintervento ORDER BY descrizione", "class": "", "extra": "'.$readonly.'" ]}';
}
echo '
@ -131,7 +145,7 @@ if (!empty($rs2)) {
<input type="hidden" name="orario_inizio['.$id.']" value="'.$orario_inizio.'">';
} else {
echo '
{[ "type": "timestamp", "name": "orario_inizio['.$id.']", "id": "inizio_'.$id.'", "value": "'.$orario_inizio.'", "class": "orari min-width" ]}';
{[ "type": "timestamp", "name": "orario_inizio['.$id.']", "id": "inizio_'.$id.'", "value": "'.$orario_inizio.'", "class": "orari min-width", "extra": "'.$readonly.'" ]}';
}
echo '
</td>';
@ -145,7 +159,7 @@ if (!empty($rs2)) {
<input type="hidden" name="orario_fine['.$id.']" value="'.$orario_fine.'">';
} else {
echo '
{[ "type": "timestamp", "name": "orario_fine['.$id.']", "id": "fine_'.$id.'", "value": "'.$orario_fine.'", "class": "orari min-width", "min-date": "'.$orario_inizio.'" ]}';
{[ "type": "timestamp", "name": "orario_fine['.$id.']", "id": "fine_'.$id.'", "value": "'.$orario_fine.'", "class": "orari min-width", "min-date": "'.$orario_inizio.'", "extra": "'.$readonly.'" ]}';
}
echo '
</td>';
@ -167,7 +181,7 @@ if (!empty($rs2)) {
// KM
echo '
<td style="border-right:1px solid #aaa;">
{[ "type": "number", "name": "km['.$id.']", "value": "'.$km.'", "class": "small-width" ]}
{[ "type": "number", "name": "km['.$id.']", "value": "'.$km.'", "class": "small-width", "extra": "'.$readonly.'" ]}
<div class="extra hide">
<table class="table table-condensed table-bordered">
@ -202,7 +216,7 @@ if (!empty($rs2)) {
<td style="border-right:1px solid #aaa;">';
if ($user['idanagrafica'] == 0 || $show_costi) {
echo '
{[ "type": "number", "name": "sconto['.$id.']", "value": "'.$sconto_unitario.'", "icon-after": "choice|untprc|'.$tipo_sconto.'", "class": "small-width" ]}';
{[ "type": "number", "name": "sconto['.$id.']", "value": "'.$sconto_unitario.'", "icon-after": "choice|untprc|'.$tipo_sconto.'", "class": "small-width", "extra": "'.$readonly.'" ]}';
} else {
echo '
<input type="hidden" name="sconto['.$id.']" value="'.Translator::numberToLocale($sconto_unitario).'" />
@ -217,7 +231,7 @@ if (!empty($rs2)) {
<td style="border-right:1px solid #aaa;">';
if ($user['idanagrafica'] == 0 || $show_costi) {
echo '
{[ "type": "number", "name": "scontokm['.$id.']", "value": "'.$scontokm_unitario.'", "icon-after": "choice|untprc|'.$tipo_scontokm.'", "class": "small-width" ]}';
{[ "type": "number", "name": "scontokm['.$id.']", "value": "'.$scontokm_unitario.'", "icon-after": "choice|untprc|'.$tipo_scontokm.'", "class": "small-width", "extra": "'.$readonly.'" ]}';
} else {
echo '
<input type="hidden" name="scontokm['.$id.']" value="'.Translator::numberToLocale($scontokm_unitario).'" />
@ -231,10 +245,16 @@ if (!empty($rs2)) {
<input type="hidden" name="prezzo_km_consuntivotecnico['.$id.']" value="'.Translator::numberToLocale($costo_km_consuntivo_tecnico).'" />
</td>';
// Pulsante aggiunta nuova sessione
// Pulsante eliminazione sessione
echo '
<td>';
if( !$flg_completato ){
echo '
<a class="btn btn-danger" id="delbtn_'.$id.'" onclick="elimina_sessione(\''.$id.'\', \''.$id_record.'\', \''.$idzona.'\');" title="Elimina riga" class="only_rw"><i class="fa fa-trash"></i></a>';
}
echo '
<td>
<a class="btn btn-danger" id="delbtn_'.$id.'" onclick="elimina_sessione(\''.$id.'\', \''.$id_record.'\', \''.$idzona.'\');" title="Elimina riga" class="only_rw"><i class="fa fa-trash"></i></a>
</td>
</tr>';
@ -250,21 +270,22 @@ if (!empty($rs2)) {
'<p>'.tr('Nessun tecnico presente').'.</p>';
}
echo '
<!-- AGGIUNTA TECNICO -->
<div class="row">
<div class="col-md-offset-6 col-md-3">
{[ "type": "select", "label": "'.tr('Aggiungi tecnico').'", "name": "nuovotecnico", "ajax-source": "tecnici" ]}
</div>
<div class="col-md-3">
<br>
<button type="button" class="btn btn-primary btn-block" onclick="if($(\'#nuovotecnico\').val()){ add_tecnici( \''.$id_record.'\', $(\'#nuovotecnico\').val()); }else{ alert(\'Seleziona un tecnico!\'); }">
<i class="fa fa-plus"></i> '.tr('Aggiungi tecnico').'
</button>
</div>
</div>';
if ( !$flg_completato ) {
echo '
<!-- AGGIUNTA TECNICO -->
<div class="row">
<div class="col-md-offset-6 col-md-3">
{[ "type": "select", "label": "'.tr('Aggiungi tecnico').'", "name": "nuovotecnico", "ajax-source": "tecnici" ]}
</div>
<div class="col-md-3">
<br>
<button type="button" class="btn btn-primary btn-block" onclick="if($(\'#nuovotecnico\').val()){ add_tecnici( \''.$id_record.'\', $(\'#nuovotecnico\').val()); }else{ alert(\'Seleziona un tecnico!\'); }">
<i class="fa fa-plus"></i> '.tr('Aggiungi tecnico').'
</button>
</div>
</div>';
}
?>
<script src="<?php echo $rootdir ?>/lib/init.js"></script>

View File

@ -5,6 +5,16 @@ include_once __DIR__.'/../../core.php';
unset($_SESSION['superselect']['idanagrafica']);
$_SESSION['superselect']['idanagrafica'] = $records[0]['idanagrafica'];
//Disabilito il tasto di firma per gli interventi completati
if( $records[0]['flg_completato'] ){
$disabled = 'disabled';
$readonly = 'readonly';
} else {
$disabled = '';
$readonly = '';
}
if (empty($records[0]['firma_file'])) {
$frase = tr('Anteprima e firma');
$info_firma = '';
@ -32,7 +42,7 @@ if (empty($records[0]['firma_file'])) {
<!-- EVENTUALE FIRMA GIA' EFFETTUATA -->
<?php echo $info_firma ?>
<div class="pull-right">
<button type="button" class="btn btn-primary " onclick="launch_modal( '<?php echo tr('Anteprima e firma') ?>', '<?php echo $rootdir ?>/modules/interventi/add_firma.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>&anteprima=1', 1 );"><i class="fa fa-desktop"></i> <?php echo $frase ?>...</button>
<button type="button" class="btn btn-primary " onclick="launch_modal( '<?php echo tr('Anteprima e firma') ?>', '<?php echo $rootdir ?>/modules/interventi/add_firma.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>&anteprima=1', 1 );" <?= $disabled ?>><i class="fa fa-desktop"></i> <?php echo $frase ?>...</button>
{( "name": "button", "type": "print", "id_module": "<?php echo $id_module ?>", "id_record": "<?php echo $id_record ?>" )}
@ -47,22 +57,22 @@ if (empty($records[0]['firma_file'])) {
<?php
echo Modules::link('Anagrafiche', $records[0]['idanagrafica'], null, null, 'class="pull-right"');
?>
{[ "type": "select", "label": "<?php echo tr('Cliente'); ?>", "name": "idanagrafica", "required": 1, "values": "query=SELECT an_anagrafiche.idanagrafica AS id, ragione_sociale AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE descrizione='Cliente' AND deleted=0 ORDER BY ragione_sociale", "value": "$idanagrafica$", "ajax-source": "clienti" ]}
{[ "type": "select", "label": "<?php echo tr('Cliente'); ?>", "name": "idanagrafica", "required": 1, "values": "query=SELECT an_anagrafiche.idanagrafica AS id, ragione_sociale AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE descrizione='Cliente' AND deleted=0 ORDER BY ragione_sociale", "value": "$idanagrafica$", "ajax-source": "clienti", "extra": "<?= $readonly ?>" ]}
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Sede'); ?>", "name": "idsede", "values": "query=SELECT 0 AS id, 'Sede legale' AS descrizione UNION SELECT id, CONCAT_WS( ' - ', nomesede, citta ) AS descrizione FROM an_sedi WHERE idanagrafica='$idanagrafica$'", "value": "$idsede$", "ajax-source": "sedi" ]}
{[ "type": "select", "label": "<?php echo tr('Sede'); ?>", "name": "idsede", "values": "query=SELECT 0 AS id, 'Sede legale' AS descrizione UNION SELECT id, CONCAT_WS( ' - ', nomesede, citta ) AS descrizione FROM an_sedi WHERE idanagrafica='$idanagrafica$'", "value": "$idsede$", "ajax-source": "sedi", "extra": "<?= $readonly ?>" ]}
</div>
<div class="col-md-3">
<?php
echo Modules::link('Anagrafiche', $records[0]['idclientefinale'], null, null, 'class="pull-right"');
?>
{[ "type": "select", "label": "<?php echo tr('Per conto di'); ?>", "name": "idclientefinale", "value": "$idclientefinale$", "ajax-source": "clienti" ]}
{[ "type": "select", "label": "<?php echo tr('Per conto di'); ?>", "name": "idclientefinale", "value": "$idclientefinale$", "ajax-source": "clienti", "extra": "<?= $readonly ?>" ]}
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Referente'); ?>", "name": "idreferente", "value": "$idreferente$", "ajax-source": "referenti" ]}
{[ "type": "select", "label": "<?php echo tr('Referente'); ?>", "name": "idreferente", "value": "$idreferente$", "ajax-source": "referenti", "extra": "<?= $readonly ?>" ]}
</div>
</div>
@ -78,7 +88,7 @@ if (empty($records[0]['firma_file'])) {
}
?>
{[ "type": "select", "label": "<?php echo tr('Preventivo'); ?>", "name": "idpreventivo", "value": "$idpreventivo$", "ajax-source": "preventivi" ]}
{[ "type": "select", "label": "<?php echo tr('Preventivo'); ?>", "name": "idpreventivo", "value": "$idpreventivo$", "ajax-source": "preventivi", "extra": "<?= $readonly ?>" ]}
</div>
<div class="col-md-3">
@ -98,7 +108,7 @@ if (empty($records[0]['firma_file'])) {
}
?>
{[ "type": "select", "label": "<?php echo tr('Contratto'); ?>", "name": "idcontratto", "value": "<?php echo $idcontratto; ?>", "ajax-source": "contratti" ]}
{[ "type": "select", "label": "<?php echo tr('Contratto'); ?>", "name": "idcontratto", "value": "<?php echo $idcontratto; ?>", "ajax-source": "contratti", "extra": "<?= $readonly ?>" ]}
<input type='hidden' name='idcontratto_riga' value='<?php echo $idcontratto_riga ?>'>
</div>
</div>
@ -123,11 +133,11 @@ if (empty($records[0]['firma_file'])) {
<!-- RIGA 3 -->
<div class="row">
<div class="col-md-3">
{[ "type": "span", "label": "<?php echo tr('Codice'); ?>", "name": "codice", "value": "$codice$" ]}
{[ "type": "span", "label": "<?php echo tr('Codice'); ?>", "name": "codice", "value": "$codice$", "extra": "<?= $readonly ?>" ]}
</div>
<div class="col-md-3">
{[ "type": "date", "label": "<?php echo tr('Data richiesta'); ?>", "name": "data_richiesta", "required": 1, "value": "$data_richiesta$" ]}
{[ "type": "date", "label": "<?php echo tr('Data richiesta'); ?>", "name": "data_richiesta", "required": 1, "value": "$data_richiesta$", "extra": "<?= $readonly ?>" ]}
</div>
<div class="col-md-3">
@ -142,15 +152,15 @@ if (empty($records[0]['firma_file'])) {
<!-- RIGA 4 -->
<div class="row">
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Tipo attività'); ?>", "name": "idtipointervento", "required": 1, "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento", "value": "$idtipointervento$" ]}
{[ "type": "select", "label": "<?php echo tr('Tipo attività'); ?>", "name": "idtipointervento", "required": 1, "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento", "value": "$idtipointervento$", "extra": "<?= $readonly ?>" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Stato'); ?>", "name": "idstatointervento", "required": 1, "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento", "value": "$idstatointervento$" ]}
{[ "type": "select", "label": "<?php echo tr('Stato'); ?>", "name": "idstatointervento", "required": 1, "values": "query=SELECT idstatointervento AS id, descrizione, colore AS _bgcolor_ FROM in_statiintervento WHERE deleted = 0", "value": "$idstatointervento$" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Automezzo'); ?>", "name": "idautomezzo", "values": "query=SELECT id, CONCAT_WS( ')', CONCAT_WS( ' (', CONCAT_WS( ', ', nome, descrizione), targa ), '' ) AS descrizione FROM dt_automezzi", "help": "<?php echo tr('Se selezionato i materiali verranno presi prima dall&rsquo;automezzo e poi dal magazzino centrale.'); ?>", "value": "$idautomezzo$" ]}
{[ "type": "select", "label": "<?php echo tr('Automezzo'); ?>", "name": "idautomezzo", "values": "query=SELECT id, CONCAT_WS( ')', CONCAT_WS( ' (', CONCAT_WS( ', ', nome, descrizione), targa ), '' ) AS descrizione FROM dt_automezzi", "help": "<?php echo tr('Se selezionato i materiali verranno presi prima dall&rsquo;automezzo e poi dal magazzino centrale.'); ?>", "value": "$idautomezzo$", "extra": "<?= $readonly ?>" ]}
</div>
</div>
@ -158,11 +168,11 @@ if (empty($records[0]['firma_file'])) {
<!-- RIGA 5 -->
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "<?php echo tr('Richiesta'); ?>", "name": "richiesta", "required": 1, "class": "autosize", "value": "$richiesta$", "extra": "rows='5'" ]}
{[ "type": "textarea", "label": "<?php echo tr('Richiesta'); ?>", "name": "richiesta", "required": 1, "class": "autosize", "value": "$richiesta$", "extra": "rows='5' <?= $readonly ?>" ]}
</div>
<div class="col-md-12">
{[ "type": "textarea", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "class": "autosize", "value": "$descrizione$", "extra": "rows='10'" ]}
{[ "type": "textarea", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "class": "autosize", "value": "$descrizione$", "extra": "rows='10' <?= $readonly ?>" ]}
</div>
<div class="col-md-12">
@ -207,7 +217,7 @@ if (empty($records[0]['firma_file'])) {
<?php include $docroot.'/modules/interventi/ajax_articoli.php'; ?>
</div>
<?php if ($records[0]['stato'] != 'Fatturato' && $records[0]['stato'] != 'Completato') {
<?php if ( !$records[0]['flg_completato'] ) {
?>
<button type="button" class="btn btn-primary" onclick="launch_modal( '<?php echo tr('Aggiungi articolo') ?>', '<?php echo $rootdir ?>/modules/interventi/add_articolo.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>&idriga=0&idautomezzo='+$('#idautomezzo').find(':selected').val(), 1);"><i class="fa fa-plus"></i> <?php echo tr('Aggiungi articolo') ?>...</button>
<?php
@ -226,7 +236,7 @@ if (empty($records[0]['firma_file'])) {
<?php include $docroot.'/modules/interventi/ajax_righe.php'; ?>
</div>
<?php if ($records[0]['stato'] != 'Fatturato' && $records[0]['stato'] != 'Completato') {
<?php if ( !$records[0]['flg_completato'] ) {
?>
<button type="button" class="btn btn-primary" onclick="launch_modal( '<?php echo tr('Aggiungi altre spese') ?>', '<?php echo $rootdir ?>/modules/interventi/add_righe.php?id_module=<?php echo $id_module ?>&id_record=<?php echo $id_record ?>', 1 );"><i class="fa fa-plus"></i> <?php echo tr('Aggiungi altre spese') ?>...</button>
<?php

View File

@ -3,7 +3,7 @@
include_once __DIR__.'/../../core.php';
if (isset($id_record)) {
$records = $dbo->fetchArray('SELECT *, IF((in_interventi.idsede = 0), (SELECT idzona FROM an_anagrafiche WHERE idanagrafica = in_interventi.idanagrafica), (SELECT idzona FROM an_sedi WHERE id = in_interventi.idsede)) AS idzona, (SELECT colore FROM in_statiintervento WHERE idstatointervento=in_interventi.idstatointervento) AS colore, (SELECT idpreventivo FROM co_preventivi_interventi WHERE idintervento=in_interventi.id LIMIT 0,1) AS idpreventivo FROM in_interventi WHERE id='.prepare($id_record).Modules::getAdditionalsQuery($id_module));
$records = $dbo->fetchArray('SELECT *, (SELECT completato FROM in_statiintervento WHERE idstatointervento=in_interventi.idstatointervento) AS flg_completato, IF((in_interventi.idsede = 0), (SELECT idzona FROM an_anagrafiche WHERE idanagrafica = in_interventi.idanagrafica), (SELECT idzona FROM an_sedi WHERE id = in_interventi.idsede)) AS idzona, (SELECT colore FROM in_statiintervento WHERE idstatointervento=in_interventi.idstatointervento) AS colore, (SELECT idpreventivo FROM co_preventivi_interventi WHERE idintervento=in_interventi.id LIMIT 0,1) AS idpreventivo FROM in_interventi WHERE id='.prepare($id_record).Modules::getAdditionalsQuery($id_module));
}
$jscript_modules[] = $rootdir.'/modules/interventi/js/interventi_helperjs.js';

View File

@ -49,6 +49,18 @@ if (filter('op') == 'link_myimpianti') {
$_SESSION['infos'][] = tr('Informazioni componenti salvate!');
}
//Blocco della modifica impianti se l'intervento è completato
$rss = $dbo->fetchArray('SELECT in_statiintervento.completato FROM in_statiintervento INNER JOIN in_interventi ON in_statiintervento.idstatointervento=in_interventi.idstatointervento WHERE in_interventi.id='.prepare($id_record));
$flg_completato = $rss[0]['completato'];
if( $flg_completato ){
$readonly = 'readonly';
$disabled = 'disabled';
} else {
$readonly = '';
$disabled = '';
}
// IMPIANTI
echo '
<div class="box">
@ -106,7 +118,7 @@ foreach ($rs as $r) {
<form action="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'&op=link_componenti&matricola='.$r['id'].'" method="post">
<input type="hidden" name="backto" value="record-edit">
<select class="superselect" name="componenti[]" multiple>';
<select class="superselect" name="componenti[]" multiple '.$readonly.' '.$disabled.'>';
$inseriti = $dbo->fetchArray('SELECT * FROM my_componenti_interventi WHERE id_intervento='.prepare($id_record));
$inseriti = !empty($inseriti) ? array_column($inseriti, 'id_componente') : [];
$list = [];
@ -137,7 +149,7 @@ foreach ($rs as $r) {
</select><br><br>
<input type="hidden" name="list" value="'.implode(',', $list).'">
<button type="submit" class="btn btn-success"><i class="fa fa-check"></i> '.tr('Salva componenti').'</button>
<button type="submit" class="btn btn-success" '.$disabled.'><i class="fa fa-check"></i> '.tr('Salva componenti').'</button>
</form>
</td>
</tr>
@ -164,12 +176,12 @@ echo '
<input type="hidden" name="backto" value="record-edit">
<div class="row">
<div class="col-xs-12 col-md-6">
{[ "type": "select", "name": "matricole[]", "multiple": 1, "value": "'.implode(',', $impianti).'", "values": "query=SELECT my_impianti.id, CONCAT(matricola, \' - \', nome) AS descrizione, CONCAT(nomesede, IF(citta IS NULL OR citta = \'\', \'\', CONCAT(\' (\', citta, \')\'))) AS optgroup FROM my_impianti JOIN (SELECT id, nomesede, citta FROM an_sedi UNION SELECT 0, \'Sede legale\', \'\') AS t ON t.id = my_impianti.idsede WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' ORDER BY idsede ASC, matricola ASC" ]}
{[ "type": "select", "name": "matricole[]", "multiple": 1, "value": "'.implode(',', $impianti).'", "values": "query=SELECT my_impianti.id, CONCAT(matricola, \' - \', nome) AS descrizione, CONCAT(nomesede, IF(citta IS NULL OR citta = \'\', \'\', CONCAT(\' (\', citta, \')\'))) AS optgroup FROM my_impianti JOIN (SELECT id, nomesede, citta FROM an_sedi UNION SELECT 0, \'Sede legale\', \'\') AS t ON t.id = my_impianti.idsede WHERE idanagrafica='.prepare($records[0]['idanagrafica']).' ORDER BY idsede ASC, matricola ASC", "extra": "'.$readonly.'" ]}
</div>
</div>
<br><br>
<button type="submit" class="btn btn-success"><i class="fa fa-check"></i> '.tr('Salva impianti').'</button></a>
<button type="submit" class="btn btn-success" '.$disabled.'><i class="fa fa-check"></i> '.tr('Salva impianti').'</button></a>
</form>';
echo '

View File

@ -18,7 +18,8 @@ $idanagrafica = $rs[0]['idanagrafica'];
// Seleziona articolo
// - per i documenti di vendita deve esserci almeno 1 unità
// - per i documenti di acquisto mostro tutti gli articoli
$_SESSION['superselect']['dir'] = $dir;
//$_SESSION['superselect']['dir'] = $dir;
unset( $_SESSION['superselect']['dir'] );
echo '
<p>'.tr('Ordine numero _NUM_', [

View File

@ -75,7 +75,7 @@ if (!empty($rs)) {
echo '
<td class="text-center">';
if($r['is_descrizione']==0){
if (empty($r['is_descrizione'])) {
if (empty($r['sconto_globale'])) {
echo '
<big>'.Translator::numberToLocale($r['qta'] - $r['qta_evasa']).'</big>
@ -90,9 +90,9 @@ if (!empty($rs)) {
// Unità di misura
echo '
<td class="text-center">';
if($r['is_descrizione']==0){
echo
$r['um'];
if (empty($r['is_descrizione'])) {
echo '
'.$r['um'];
}
echo '
</td>';
@ -100,16 +100,16 @@ if (!empty($rs)) {
// Costo unitario
echo '
<td class="text-right">';
if($r['is_descrizione']==0){
echo
Translator::numberToLocale($r['subtotale'] / $r['qta']).' &euro;';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['subtotale'] / $r['qta']).' &euro;';
if ($r['sconto_unitario'] > 0) {
echo '
<br><small class="label label-danger">- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'</small>';
<br><small class="label label-danger">- '.tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'</small>';
}
}
echo '
@ -118,9 +118,9 @@ if (!empty($rs)) {
// Iva
echo '
<td class="text-right">';
if($r['is_descrizione']==0){
echo
Translator::numberToLocale($r['iva']).' &euro;
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['iva']).' &euro;
<br><small class="help-block">'.$r['desc_iva'].'</small>';
}
echo '
@ -129,9 +129,9 @@ if (!empty($rs)) {
// Imponibile
echo '
<td class="text-right">';
if($r['is_descrizione']==0){
echo
Translator::numberToLocale($r['subtotale'] - $r['sconto']).' &euro;';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['subtotale'] - $r['sconto']).' &euro;';
}
echo '
</td>';
@ -190,7 +190,7 @@ echo '
// Calcoli
$imponibile = sum(array_column($rs, 'subtotale'));
$sconto = sum(array_column($rs, 'sconto'));
$iva = sum(array_column($rs, 'iva'));
$iva = sum(array_column($rs, 'iva'), null, 4);
$imponibile_scontato = sum($imponibile, -$sconto);

View File

@ -39,9 +39,9 @@ if (!empty($rs)) {
// q.tà
echo '
<td class="text-center">';
if($r['is_descrizione']==0){
echo
Translator::numberToLocale($r['qta'] - $r['qta_evasa']);
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['qta'] - $r['qta_evasa']);
}
echo '
</td>';
@ -49,9 +49,9 @@ if (!empty($rs)) {
// um
echo '
<td class="text-center">';
if($r['is_descrizione']==0){
echo
$r['um'];
if (empty($r['is_descrizione'])) {
echo '
'.$r['um'];
}
echo '
</td>';
@ -59,9 +59,9 @@ if (!empty($rs)) {
// costo unitario
echo '
<td class="text-right">';
if($r['is_descrizione']==0){
echo
Translator::numberToLocale($r['subtotale'] / $r['qta']).' &euro;';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['subtotale'] / $r['qta']).' &euro;';
if ($r['sconto_unitario'] > 0) {
echo '
@ -78,9 +78,9 @@ if (!empty($rs)) {
// iva
echo '
<td class="text-right">';
if($r['is_descrizione']==0){
echo
Translator::numberToLocale($r['iva']).' &euro;
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['iva']).' &euro;
<br><small class="help-block">'.$r['desc_iva'].'</small>';
}
echo'
@ -89,9 +89,9 @@ if (!empty($rs)) {
// Imponibile
echo '
<td class="text-right">';
if($r['is_descrizione']==0){
echo
Translator::numberToLocale($r['subtotale'] - $r['sconto']).' &euro;';
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['subtotale'] - $r['sconto']).' &euro;';
}
echo'
</td>';
@ -131,7 +131,7 @@ if (!empty($rs)) {
// Calcoli
$imponibile = sum(array_column($rs, 'subtotale'));
$sconto = sum(array_column($rs, 'sconto'));
$iva = sum(array_column($rs, 'iva'));
$iva = sum(array_column($rs, 'iva'), null, 4);
$imponibile_scontato = sum($imponibile, -$sconto);

View File

@ -10,11 +10,11 @@ switch (post('op')) {
$query = 'UPDATE in_statiintervento SET colore='.prepare($colore).' WHERE idstatointervento='.prepare($id_record);
$dbo->query($query);
// Aggiorna descrizione solo se non è uno stato di default
$query = 'UPDATE in_statiintervento SET descrizione='.prepare($descrizione).' WHERE idstatointervento='.prepare($id_record).' AND `default`=0';
// Aggiorna descrizione
$query = 'UPDATE in_statiintervento SET descrizione='.prepare($descrizione).' WHERE idstatointervento='.prepare($id_record);
$dbo->query($query);
$_SESSION['infos'][] = tr('Informazioni salvate correttamente!');
$_SESSION['infos'][] = tr('Informazioni salvate correttamente.');
break;
@ -22,20 +22,31 @@ switch (post('op')) {
$idstatointervento = post('idstatointervento');
$descrizione = post('descrizione');
$colore = post('colore');
$query = 'INSERT INTO in_statiintervento(idstatointervento, descrizione, colore) VALUES ('.prepare($idstatointervento).', '.prepare($descrizione).', '.prepare($colore).')';
$dbo->query($query);
$id_record = $idstatointervento;
$_SESSION['infos'][] = tr('Nuovo stato di intervento aggiunto!');
//controllo idstatointervento che non sia duplicato
if (count($dbo->fetchArray('SELECT idstatointervento FROM in_statiintervento WHERE idstatointervento='.prepare($idstatointervento).''))>0){
$_SESSION['errors'][] = tr('Stato di intervento già esistente.');
}else{
$query = 'INSERT INTO in_statiintervento(idstatointervento, descrizione, colore) VALUES ('.prepare($idstatointervento).', '.prepare($descrizione).', '.prepare($colore).')';
$dbo->query($query);
$id_record = $idstatointervento;
$_SESSION['infos'][] = tr('Nuovo stato di intervento aggiunto.');
}
break;
case 'delete':
$query = 'DELETE FROM in_statiintervento WHERE idstatointervento='.prepare($id_record).' AND `default`=0';
$dbo->query($query);
//scelgo se settare come eliminato o cancellare direttamente la riga se non è stato utilizzato negli interventi
if (count($dbo->fetchArray('SELECT id FROM in_interventi WHERE idstatointervento='.prepare($id_record).''))>0){
$query = 'UPDATE in_statiintervento SET deleted = 1 WHERE idstatointervento='.prepare($id_record).' AND `can_delete`=1';
}else{
$query = 'DELETE FROM in_statiintervento WHERE idstatointervento='.prepare($id_record).' AND `can_delete`=1';
}
$dbo->query($query);
$_SESSION['infos'][] = tr('Stato di intervento eliminato!');
$_SESSION['infos'][] = tr('Stato di intervento eliminato.');
break;
}

View File

@ -8,7 +8,7 @@ include_once __DIR__.'/../../core.php';
<div class="row">
<div class="col-md-2">
{[ "type": "text", "label": "<?php echo tr('Codice'); ?>", "name": "idstatointervento", "required": 1, "value": "" ]}
{[ "type": "text", "label": "<?php echo tr('Codice'); ?>", "name": "idstatointervento", "class": "alphanumeric-mask", "required": 1, "value": "" ]}
</div>
<div class="col-md-6">

View File

@ -1,18 +1,8 @@
<?php
include_once __DIR__.'/../../core.php';
?>
//Se lo stato intervento è uno di quelli di default, non lo lascio modificare
if ($records[0]['default']) {
$attr = "readonly='true'";
$warning_text = '<div class="alert alert-warning">'.tr('Puoi modificare solo il colore di questo intervento!').'</div>';
} else {
$attr = '';
$warning_text = '';
}
echo $warning_text;
?><form action="" method="post">
<form action="" method="post">
<input type="hidden" name="op" value="update">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="id_record" value="<?php echo $id_record ?>">
@ -39,8 +29,8 @@ echo $warning_text;
</form>
<?php
//Se lo stato intervento è uno di quelli di default, non lo lascio modificare
if (!$records[0]['default']) {
// Record eliminabile solo se permesso
if ($records[0]['can_delete']) {
?>
<a class="btn btn-danger ask" data-backto="record-list">
<i class="fa fa-trash"></i> <?php echo tr('Elimina') ?>

View File

@ -145,7 +145,7 @@ if (!empty($options) && $options != 'custom') {
if (!$editable) {
echo ', "readonly": "1"';
}
echo ', "required": "1", "help": "'.tr('Nome effettivo del campo sulla tabella oppure subquery che permette di ottenere il valore del campo').'" ]}
echo ', "required": "1", "help": "'.tr('Nome effettivo del campo sulla tabella oppure subquery che permette di ottenere il valore del campo').'.<br>'.tr('ATTENZIONE: utilizza sempre i caratteri < o > seguiti da spazio!').'" ]}
</div>
</div>
@ -210,7 +210,7 @@ if (!empty($options) && $options != 'custom') {
if (!$editable) {
echo ', "readonly": "1"';
}
echo ', "help": "'.tr('Query personalizzata per la ricerca (consigliata per colori e icone)').'" ]}
echo ', "help": "'.tr('Query personalizzata per la ricerca (consigliata per colori e icone)').'.<br>'.tr('ATTENZIONE: utilizza sempre i caratteri < o > seguiti da spazio!').'" ]}
</div>
<div class="col-xs-12 col-md-6">
@ -218,7 +218,7 @@ if (!empty($options) && $options != 'custom') {
if (!$editable) {
echo ', "readonly": "1"';
}
echo ', "help": "'.tr("Query personalizzata per l'ordinamento (date e numeri formattati tramite query)").'" ]}
echo ', "help": "'.tr("Query personalizzata per l'ordinamento (date e numeri formattati tramite query)").'.<br>'.tr('ATTENZIONE: utilizza sempre i caratteri < o > seguiti da spazio!').'" ]}
</div>
</div>
</div>

View File

@ -107,9 +107,9 @@ foreach ($righe as $r) {
echo "
<td class='text-center'>";
if($r['is_descrizione']==0){
echo
(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'])).' '.$r['um'];
if (empty($r['is_descrizione'])) {
echo '
'.(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'])).' '.$r['um'];
}
echo '
</td>';
@ -118,9 +118,9 @@ foreach ($righe as $r) {
// Prezzo unitario
echo "
<td class='text-right'>";
if($r['is_descrizione']==0){
echo
(empty($r['qta']) || empty($r['subtotale']) ? '' : Translator::numberToLocale($r['subtotale'] / $r['qta'])).' &euro;';
if (empty($r['is_descrizione'])) {
echo '
'.(empty($r['qta']) || empty($r['subtotale']) ? '' : Translator::numberToLocale($r['subtotale'] / $r['qta'])).' &euro;';
}
echo '
</td>';
@ -128,9 +128,9 @@ foreach ($righe as $r) {
// Imponibile
echo "
<td class='text-right'>";
if($r['is_descrizione']==0){
echo
(empty($r['subtotale']) ? '' : Translator::numberToLocale($r['subtotale'])).' &euro;';
if (empty($r['is_descrizione'])) {
echo '
'.(empty($r['subtotale']) ? '' : Translator::numberToLocale($r['subtotale'])).' &euro;';
if ($r['sconto'] > 0) {
echo '

View File

@ -164,7 +164,7 @@ echo '
// Info per il footer
$imponibile = sum($imponibile) - sum($sconto);
$iva = sum($iva);
$iva = sum($iva, null, 4);
$totale = $imponibile + $iva;

View File

@ -269,7 +269,7 @@ if (abs($records[0]['bollo']) > 0) {
// Info per il footer
$imponibile = sum($imponibile);
$iva = sum($iva) + $records[0]['iva_rivalsainps'];
$iva = sum($iva, null, 4) + $records[0]['iva_rivalsainps'];
$sconto = sum($sconto);
$totale = $imponibile + $iva - $sconto + $records[0]['rivalsainps'];

View File

@ -71,7 +71,10 @@ $custom = [
'vettore' => $records[0]['vettore'],
];
// Controllo sui permessi
if ($id_cliente != Auth::user()['idanagrafica'] && !Auth::admin()) {
// Accesso solo a:
// - cliente se è impostato l'idanagrafica di un Cliente
// - utente qualsiasi con permessi almeno in lettura sul modulo
// - admin
if ( ( !empty(Auth::user()['idanagrafica']) && $id_cliente != Auth::user()['idanagrafica'] && !Auth::admin()) || Modules::getPermission($module_name)=='-') {
die(tr('Non hai i permessi per questa stampa!'));
}

View File

@ -151,7 +151,7 @@ foreach ($righe as $r) {
$sconto = sum($sconto);
$imponibile = sum($imponibile);
$iva = sum($iva);
$iva = sum($iva, null, 4);
$totale = $imponibile - $sconto;

View File

@ -108,9 +108,9 @@ foreach ($righe as $r) {
echo "
<td class='text-center'>";
if($r['is_descrizione']==0){
echo
(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'])).' '.$r['um'];
if (empty($r['is_descrizione'])) {
echo '
'.(empty($r['qta']) ? '' : Translator::numberToLocale($r['qta'])).' '.$r['um'];
}
echo '
</td>';
@ -119,16 +119,16 @@ foreach ($righe as $r) {
// Prezzo unitario
echo "
<td class='text-right'>";
if($r['is_descrizione']==0){
echo
(empty($r['qta']) || empty($r['subtotale']) ? '' : Translator::numberToLocale($r['subtotale'] / $r['qta'])).' &euro;';
if (empty($r['is_descrizione'])) {
echo '
'.(empty($r['qta']) || empty($r['subtotale']) ? '' : Translator::numberToLocale($r['subtotale'] / $r['qta'])).' &euro;';
if ($r['sconto'] > 0) {
echo "
<br><small class='text-muted'>- ".tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'</small>';
<br><small class='text-muted'>- ".tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto_unitario']),
'_TYPE_' => ($r['tipo_sconto'] == 'PRC' ? '%' : '&euro;'),
]).'</small>';
if ($count <= 1) {
$count += 0.4;
@ -141,16 +141,16 @@ foreach ($righe as $r) {
// Imponibile
echo "
<td class='text-right'>";
if($r['is_descrizione']==0){
echo
(empty($r['subtotale']) ? '' : Translator::numberToLocale($r['subtotale'])).' &euro;';
if (empty($r['is_descrizione'])) {
echo '
'.(empty($r['subtotale']) ? '' : Translator::numberToLocale($r['subtotale'])).' &euro;';
if ($r['sconto'] > 0) {
echo "
<br><small class='text-muted'>- ".tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto']),
'_TYPE_' => '&euro;',
]).'</small>';
<br><small class='text-muted'>- ".tr('sconto _TOT_ _TYPE_', [
'_TOT_' => Translator::numberToLocale($r['sconto']),
'_TYPE_' => '&euro;',
]).'</small>';
if ($count <= 1) {
$count += 0.4;
@ -168,9 +168,9 @@ foreach ($righe as $r) {
// Iva
echo '
<td class="text-center">';
if($r['is_descrizione']==0){
echo
Translator::numberToLocale($r['perc_iva']);
if (empty($r['is_descrizione'])) {
echo '
'.Translator::numberToLocale($r['perc_iva']);
}
echo '
</td>
@ -185,7 +185,7 @@ foreach ($righe as $r) {
$sconto = sum($sconto);
$imponibile = sum($imponibile);
$iva = sum($iva);
$iva = sum($iva, null, 4);
$totale = $imponibile - $sconto;

View File

@ -24,6 +24,48 @@ UPDATE `zz_views` SET `query` = 'CONCAT(co_tipidocumento.descrizione, CONCAT(\'
UPDATE `zz_views` SET `query` = 'GROUP_CONCAT(CASE WHEN totale > 0 THEN co_pianodeiconti3.descrizione ELSE NULL END)' WHERE `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Prima nota') AND `name` = 'Conto avere';
UPDATE `zz_views` SET `query` = 'GROUP_CONCAT(CASE WHEN totale < 0 THEN co_pianodeiconti3.descrizione ELSE NULL END)' WHERE `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Prima nota') AND `name` = 'Conto dare';
-- Spostamento conti di apertura e chiusura stato patrimoniale sotto lo stato patrimoniale
UPDATE `co_pianodeiconti2` SET `idpianodeiconti1`=1 WHERE `descrizione` = 'Perdite e profitti';
-- Aggiungo 1=1 nel WHERE per il widget clienti in anagrafica
UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(an_anagrafiche.idanagrafica) AS dato FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE 1=1 AND descrizione="Cliente" AND deleted=0' WHERE `zz_widgets`.`name` = 'Numero di clienti';
-- Aggiungo 1=1 nel WHERE e 2=2 nel HAVING per il widget clienti in anagrafica
UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(an_anagrafiche.idanagrafica) AS dato FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE 1=1 AND descrizione="Cliente" AND deleted=0 HAVING 2=2' WHERE `zz_widgets`.`name` = 'Numero di clienti';
-- Aggiungo 1=1 nel WHERE e 2=2 nel HAVING per il widget tecnici in anagrafica
UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(an_anagrafiche.idanagrafica) AS dato FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE 1=1 AND descrizione="Tecnico" AND deleted=0 HAVING 2=2' WHERE `zz_widgets`.`name` = 'Numero di tecnici';
-- Aggiungo 1=1 nel WHERE e 2=2 nel HAVING per il widget fornitori in anagrafica
UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(an_anagrafiche.idanagrafica) AS dato FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE 1=1 AND descrizione="Fornitore" AND deleted=0 HAVING 2=2' WHERE `zz_widgets`.`name` = 'Numero di fornitori';
-- Aggiungo 1=1 nel WHERE e 2=2 nel HAVING per il widget agenti in anagrafica
UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(an_anagrafiche.idanagrafica) AS dato FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE 1=1 AND descrizione="Agente" AND deleted=0 HAVING 2=2' WHERE `zz_widgets`.`name` = 'Numero di agenti';
-- Aggiungo 1=1 nel WHERE e 2=2 nel HAVING per il widget vettori in anagrafica
UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(an_anagrafiche.idanagrafica) AS dato FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE 1=1 AND descrizione="Vettore" AND deleted=0 HAVING 2=2' WHERE `zz_widgets`.`name` = 'Numero di vettori';
-- Aggiungo 1=1 nel WHERE e 2=2 nel HAVING per il widget tutte le anagrafiche
UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(an_anagrafiche.idanagrafica) AS dato FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE 1=1 AND deleted=0 HAVING 2=2' WHERE `zz_widgets`.`name` = 'Tutte le anagrafiche';
-- Aggiornamento widget "Crediti da clienti" anche con totali parziali
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE(FORMAT(da_pagare-pagato, 2), ",", "#"), ".", ","), "#", "."), "€") AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=\'entrata\'' WHERE `zz_widgets`.`name` = 'Crediti da clienti';
-- Aggiornamento widget "Debiti verso fornitori" anche con totali parziali
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(" ", REPLACE(REPLACE(REPLACE(FORMAT( -(da_pagare-pagato), 2), ",", "#"), ".", ","), "#", "."), "€") AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=\'uscita\'' WHERE `zz_widgets`.`name` = 'Debiti verso fornitori';
-- Aggiungo flag deleted per gli stati intervento
ALTER TABLE `in_statiintervento` ADD `deleted` BOOLEAN NOT NULL DEFAULT FALSE AFTER `completato`;
-- Aggiorno query modulo stati intervento
UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `in_statiintervento` WHERE 1=1 AND deleted = 0 HAVING 2=2' WHERE `zz_modules`.`name` = 'Stati di intervento';
-- Aggiungo il flag can_delete ed elimino il flag `default` in quanto non serve più
ALTER TABLE `in_statiintervento` ADD `can_delete` BOOLEAN NOT NULL DEFAULT TRUE AFTER `default`;
ALTER TABLE `in_statiintervento` DROP `default`;
-- Aggiunti come eliminabili gli stati "Chiamata" e "In programmazione"
UPDATE `in_statiintervento` SET `can_delete` = 1 WHERE `idstatointervento` IN( 'CALL', 'WIP' );
-- Aggiunti come non eliminabili ma modificabili gli stati "Fatturato" e "Completato"
UPDATE `in_statiintervento` SET `can_delete` = 0 WHERE `idstatointervento` IN( 'FAT', 'OK' );
-- Impostazione di tutti gli eventuali altri tipi di intervento a modificabili e cancellabili
UPDATE `in_statiintervento` SET `can_delete` = 1 WHERE `idstatointervento` NOT IN( 'FAT', 'OK', 'CALL', 'WIP' );