Merge branch 'master' into app-api

This commit is contained in:
Thomas Zilio 2020-07-27 16:30:19 +02:00
commit a2b7aa240b
66 changed files with 7720 additions and 5194 deletions

View File

@ -140,5 +140,15 @@ switch (filter('op')) {
echo json_encode($response);
break;
case 'summable-results':
$ids = post('ids') ?: [];
$results = Util\Query::getSums($structure, [
'id' => $ids,
]);
echo json_encode($results);
break;
}

View File

@ -350,7 +350,7 @@ function getTable(selector) {
var selected = new Map();
var selected_ids = table.data('selected') ? table.data('selected').split(';') : [];
selected_ids.forEach(function(item, index) {
selected_ids.forEach(function (item, index) {
selected.set(item, true);
});
@ -360,7 +360,7 @@ function getTable(selector) {
id_module: table.data('idmodule'),
id_plugin: table.data('idplugin'),
initDatatable: function() {
initDatatable: function () {
if (table.hasClass('datatables')) {
start_local_datatables();
} else {
@ -395,10 +395,15 @@ function getTable(selector) {
bulk_container.addClass('disabled').attr('disabled', true);
btn_container.addClass('disabled').attr('disabled', true);
}
// Aggiornamento del footer nel caso sia richiesto
if (globals.restrict_summables_to_selected){
this.updateSelectedFooter();
}
},
addSelectedRows: function (row_ids) {
row_ids = Array.isArray(row_ids) ? row_ids : [row_ids];
row_ids.forEach(function(item, index) {
row_ids.forEach(function (item, index) {
selected.set(item, true);
});
@ -406,7 +411,7 @@ function getTable(selector) {
},
removeSelectedRows: function (row_ids) {
row_ids = Array.isArray(row_ids) ? row_ids : [row_ids];
row_ids.forEach(function(item, index) {
row_ids.forEach(function (item, index) {
selected.delete(item);
});
@ -416,5 +421,32 @@ function getTable(selector) {
selected.clear();
this.saveSelectedRows();
},
// Aggiornamento dei campi summable
updateSelectedFooter: function () {
let datatable = this.datatable;
let ids = this.getSelectedRows();
$.ajax({
url: globals.rootdir + "/ajax.php",
type: "POST",
dataType: "json",
data: {
id_module: this.id_module,
id_plugin: this.id_plugin,
op: "summable-results",
ids: ids,
},
success: function (response) {
for (let [column, value] of Object.entries(response)) {
let index = parseInt(column) + 1;
let sel = datatable.column(index).footer();
$(sel).addClass("text-right")
.attr("id", "summable")
.html(value);
}
}
});
},
};
}

View File

@ -478,6 +478,7 @@ function replaceAll(str, find, replace) {
}
function cleanup_inputs() {
$('.bound').removeClass("bound");
$('.superselect, .superselectajax').select2().select2("destroy");
}

View File

@ -359,10 +359,7 @@ if (empty($record) || !$has_access) {
</div>
<div class="col-md-4 text-right">
<p><small class="label label-default tip" title="'.Translator::timestampToLocale($operation['created_at']).'"><i class="fa fa-clock-o"></i> '.Carbon::parse($operation['created_at'])->diffForHumans().'</small></p>
<p><small class="label label-default"><i class="fa fa-user"></i> '.tr('_USER_', [
'_USER_' => $operation['username'],
]).
'</small></p>
<p><small class="label label-default"><i class="fa fa-user"></i> '.$operation['username'].'</small></p>
</div>
</div>
</div>

View File

@ -122,6 +122,7 @@ function srcCSS() {
var themes = gulp.src([
config.development + '/' + config.paths.css + '/themes/*.{css,scss,less,styl}',
config.main.bowerDirectory + '/admin-lte/dist/css/skins/_all-skins.min.css',
])
.pipe(gulpIf('*.scss', sass(), gulpIf('*.less', less(), gulpIf('*.styl', stylus()))))
.pipe(autoprefixer())

194
include/common/barcode.php Normal file
View File

@ -0,0 +1,194 @@
<?php
include_once __DIR__.'/../../core.php';
$_SESSION['superselect']['dir'] = $options['dir'];
$_SESSION['superselect']['idanagrafica'] = $options['idanagrafica'];
$incorpora_iva = setting('Utilizza prezzi di vendita comprensivi di IVA');
$intestazione_prezzo = ($options['dir'] == 'uscita' ? tr('Prezzo di acquisto') : ($incorpora_iva ? tr('Prezzo vendita ivato') : tr('Prezzo vendita imponibile')));
// Articolo
echo '
<div class="row">
<div class="col-md-offset-4 col-md-4">
{[ "type": "text", "label": "'.tr('Barcode').'", "name": "barcode", "value": "", "icon-before": "<i class=\"fa fa-barcode\"></i>" ]}
</div>
</div>
<div class="alert alert-info hidden" id="articolo-missing">
<i class="fa fa-exclamation-circle"></i> '.tr('Nessuna corrispondenza trovata!').'
</div>
<div class="alert alert-warning hidden" id="articolo-qta">
<i class="fa fa-warning"></i> '.tr('Articolo con quantità non sufficiente!').'
</div>
<div class="row">
<div class="col-md-12">
<table class="table table-stripped hide" id="articoli_barcode">
<tr>
<th>'.tr('Articolo').'</th>
<th width="25%">'.$intestazione_prezzo.'</th>
<th width="20%" class="text-center">'.tr('Sconto').'</th>
<th width="10%" class="text-center">'.tr('Q.').'</th>
<th width="5%" class="text-center">#</th>
</tr>
</table>
</div>
</div> ';
echo '
<script>
$(document).ready(function(){
init();
setTimeout(function(){
$("#barcode").focus();
}, 300);
$(".modal-body button").attr("disabled", true);
});
// Gestione dell\'invio da tastiera
$(document).keypress(function(event){
let key = window.event ? event.keyCode : event.which; // IE vs Netscape/Firefox/Opera
if (key == "13") {
event.preventDefault();
$("#barcode").blur()
.focus();
}
});
var dir = "'.$options['dir'].'";
$("#barcode").off("keyup").on("keyup", function (event) {
let key = window.event ? event.keyCode : event.which; // IE vs Netscape/Firefox/Opera
$("#articolo-missing").addClass("hidden");
$("#articolo-qta").addClass("hidden");
if (key !== 13) {
return;
}
$("#barcode").attr("disabled", true);
var barcode = $("#barcode").val();
if (!barcode){
barcodeReset();
return;
}
$.getJSON(globals.rootdir + "/ajax_select.php?op=articoli_barcode&barcode=" + barcode,
function(response) {
let result = response.results[0];
if(!result){
$("#articolo-missing").removeClass("hidden");
barcodeReset();
return;
}
let qta_input = $("#riga_barcode_" + result.id).find("[name^=qta]");
if (result.qta == 0) {
$("#articolo-qta").removeClass("hidden");
barcodeReset();
return;
}
// Controllo se è già presente l\'articolo, in tal caso incremento la quantità, altrimenti inserisco la riga nuova
if (qta_input.length) {
let qta = qta_input.val().toEnglish();
let nuova_qta = qta + 1;
if (result.qta < nuova_qta) {
$("#articolo-qta").removeClass("hidden");
barcodeReset();
return;
}
qta_input.val(nuova_qta).trigger("change");
} else {
let prezzo_unitario = (dir === "uscita") ? result.prezzo_acquisto : result.prezzo_vendita;
let info_prezzi;
if(dir == "entrata") {
info_prezzi = "Acquisto: " + result.prezzo_acquisto + " &euro;";
}else{
info_prezzi = "Vendita: " + result.prezzo_vendita + " &euro;";
}
$("#articoli_barcode").removeClass("hide");
cleanup_inputs();
var text = replaceAll($("#barcode-template").html(), "-id-", result.id);
text = text.replace("|prezzo_unitario|", prezzo_unitario)
.replace("|info_prezzi|", info_prezzi)
.replace("|descrizione|", result.descrizione)
.replace("|codice|", result.codice)
.replace("|qta|", 1)
.replace("|sconto_unitario|", 0)
.replace("|tipo_sconto|", "")
.replace("|id_dettaglio_fornitore|", result.id_dettaglio_fornitore ? result.id_dettaglio_fornitore : "")
$("#articoli_barcode tr:last").after(text);
restart_inputs();
$(".modal-body button").attr("disabled", false);
}
barcodeReset();
$("#barcode").val("");
}, function(){
$("#articolo-missing").removeClass("hidden");
barcodeReset();
});
});
function barcodeReset() {
setTimeout(function(){
$("#barcode")
.attr("disabled",false)
.focus();
},200);
}
function rimuoviRigaBarcode(id) {
if (confirm("'.tr('Eliminare questo articolo?').'")) {
$("#riga_barcode_" + id).remove();
// Disabilito il pulsante di aggiunta se non ci sono articoli inseriti
if ($(".inputmask-decimal").length === 0) {
$(".modal-body button").attr("disabled", true);
$("#articoli_barcode").addClass("hide");
}
}
}
</script>
<table class="hidden">
<tbody id="barcode-template">
<tr id="riga_barcode_-id-">
<td>
|codice| - |descrizione|
<br><small>|info_prezzi|</small>
<input type="hidden" name="id_dettaglio_fornitore[-id-]" value="|id_dettaglio_fornitore|">
</td>
<td>
{[ "type": "number", "name": "prezzo_unitario[-id-]", "value": "|prezzo_unitario|", "required": 0, "icon-after": "'.currency().'" ]}
</td>
<td>
{[ "type": "number", "name": "sconto[-id-]", "value": "|sconto_unitario|", "icon-after": "choice|untprc||tipo_sconto|", "help": "'.tr('Il valore positivo indica uno sconto. Per applicare una maggiorazione inserire un valore negativo.').'" ]}
</td>
<td>
{[ "type": "number", "name": "qta[-id-]", "required": 0, "value": "|qta|", "decimals": "qta" ]}
</td>
<td width="5%" class="text-center">
<button type="button" class="btn btn-xs btn-danger" onclick="rimuoviRigaBarcode(\'-id-\')">
<i class="fa fa-trash"></i>
</button>
</td>
</tr>
</tbody>
</table>';

View File

@ -16,7 +16,7 @@ echo '
// Quantità
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.$result['qta'].'", "decimals": "qta"'.(isset($result['max_qta']) ? ', "icon-after": "<span class=\"tip\" title=\"'.tr("L'elemento è collegato a un documento: la quantità massima ammessa è relativa allo stato di evasione dell'elemento nel documento di osrigine (quantità dell'elemento / quantità massima ammessa)").'\">/ '.numberFormat($result['max_qta'], 'qta').' <i class=\"fa fa-question-circle-o\"></i></span>"' : '').', "min-value": "'.Translator::numberToLocale($result['qta_evasa']).'" ]}
{[ "type": "number", "label": "'.tr('Q.tà').'", "name": "qta", "required": 1, "value": "'.$result['qta'].'", "decimals": "qta"'.(isset($result['max_qta']) ? ', "icon-after": "<span class=\"tip\" title=\"'.tr("L'elemento è collegato a un documento: la quantità massima ammessa è relativa allo stato di evasione dell'elemento nel documento di origine (quantità dell'elemento / quantità massima ammessa)").'\">/ '.numberFormat($result['max_qta'], 'qta').' <i class=\"fa fa-question-circle-o\"></i></span>"' : '').', "min-value": "'.Translator::numberToLocale($result['qta_evasa']).'" ]}
</div>';
// Unità di misura

View File

@ -151,7 +151,7 @@ abstract class Description extends Model
*
* @return self
*/
public function copiaIn(Document $document, $qta = null, $is_evasione = true)
public function copiaIn(Document $document, $qta = null)
{
// Individuazione classe di destinazione
$class = get_class($document);
@ -183,6 +183,7 @@ abstract class Description extends Model
unset($attributes[$model->getParentID()]);
// Riferimento di origine per l'evasione automatica della riga
$is_evasione = true;
if ($is_evasione) {
$model->original_id = $this->id;
$model->original_type = $current;
@ -191,7 +192,7 @@ abstract class Description extends Model
// Impostazione del genitore
$model->setParent($document);
// Azioni specifiche di inizalizzazione
// Azioni specifiche di inizializzazione
$model->customInitCopiaIn($this);
$model->save();

View File

@ -23,6 +23,7 @@ abstract class Row extends Description
protected $appends = [
'prezzo_unitario_corrente',
'sconto_unitario_corrente',
'max_qta',
];
public static function build(Document $document, $bypass = false)

View File

@ -174,6 +174,7 @@ if (Auth::check()) {
order_manager_id: "'.($dbo->isInstalled() ? Modules::get('Stato dei servizi')['id'] : '').'",
dataload_page_buffer: '.setting('Lunghezza in pagine del buffer Datatables').',
tempo_attesa_ricerche: '.setting('Tempo di attesa ricerche in secondi').',
restrict_summables_to_selected: '.setting('Totali delle tabelle ristretti alla selezione').',
};
</script>';
} else {

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -4,13 +4,13 @@ include_once __DIR__.'/../../../core.php';
switch ($resource) {
case 'clienti':
$query = "SELECT an_anagrafiche.idanagrafica AS id, CONCAT(ragione_sociale, IF(citta IS NULL OR citta = '', '', CONCAT(' (', citta, ')')), IF(deleted_at IS NULL, '', ' (".tr('eliminata').")')) AS descrizione, idtipointervento_default 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| ORDER BY ragione_sociale";
$query = "SELECT an_anagrafiche.idanagrafica AS id, CONCAT(ragione_sociale, IF(citta IS NULL OR citta = '', '', CONCAT(' (', citta, ')')), IF(deleted_at IS NULL, '', ' (".tr('eliminata').")')) AS descrizione, idtipointervento_default, in_tipiintervento.descrizione AS idtipointervento_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 LEFT JOIN in_tipiintervento ON an_anagrafiche.idtipointervento_default=in_tipiintervento.idtipointervento |where| ORDER BY ragione_sociale";
foreach ($elements as $element) {
$filter[] = 'an_anagrafiche.idanagrafica='.prepare($element);
}
$where[] = "descrizione='Cliente'";
$where[] = "an_tipianagrafiche.descrizione='Cliente'";
if (empty($filter)) {
$where[] = 'deleted_at IS NULL';
}
@ -22,6 +22,7 @@ switch ($resource) {
}
$custom['idtipointervento'] = 'idtipointervento_default';
$custom['idtipointervento_descrizione'] = 'idtipointervento_descrizione';
break;

View File

@ -296,7 +296,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="tab-pane '.(!$is_cliente ? 'hide' : 'active').'" id="cliente">
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Agenti secondari').'", "multiple": "1", "name": "idagenti[]", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted_at IS NOT NULL, CONCAT(ragione_sociale, \' (Eliminato)\'), 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=\'Agente\' AND deleted_at IS NULL AND an_anagrafiche.idanagrafica NOT IN (SELECT idagente FROM an_anagrafiche WHERE idanagrafica = '.prepare($record['idanagrafica']).')) OR (an_anagrafiche.idanagrafica IN (SELECT idagente FROM an_anagrafiche_agenti WHERE idanagrafica = '.prepare($record['idanagrafica']).') ) ORDER BY ragione_sociale", "value": "$idagenti$" ]}
{[ "type": "select", "label": "'.tr('Tipo attività predefinita').'", "name": "idtipointervento_default", "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "$idtipointervento_default$" ]}
</div>
<div class="col-md-6">
@ -336,11 +336,11 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Tipo attività predefinita').'", "name": "idtipointervento_default", "values": "query=SELECT idtipointervento AS id, descrizione FROM in_tipiintervento ORDER BY descrizione ASC", "value": "$idtipointervento_default$" ]}
{[ "type": "select", "label": "'.tr('Agente principale').'", "name": "idagente", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted_at IS NOT NULL, CONCAT(ragione_sociale, \' (Eliminato)\'), 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=\'Agente\' AND deleted_at IS NULL)'.(isset($record['idagente']) ? 'OR (an_anagrafiche.idanagrafica = '.prepare($record['idagente']).' AND deleted_at IS NOT NULL) ' : '').'ORDER BY ragione_sociale", "value": "$idagente$" ]}
</div>
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Agente principale').'", "name": "idagente", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted_at IS NOT NULL, CONCAT(ragione_sociale, \' (Eliminato)\'), 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=\'Agente\' AND deleted_at IS NULL)'.(isset($record['idagente']) ? 'OR (an_anagrafiche.idanagrafica = '.prepare($record['idagente']).' AND deleted_at IS NOT NULL) ' : '').'ORDER BY ragione_sociale", "value": "$idagente$" ]}
{[ "type": "select", "label": "'.tr('Agenti secondari').'", "multiple": "1", "name": "idagenti[]", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, IF(deleted_at IS NOT NULL, CONCAT(ragione_sociale, \' (Eliminato)\'), 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=\'Agente\' AND deleted_at IS NULL AND an_anagrafiche.idanagrafica NOT IN (SELECT idagente FROM an_anagrafiche WHERE idanagrafica = '.prepare($record['idanagrafica']).')) OR (an_anagrafiche.idanagrafica IN (SELECT idagente FROM an_anagrafiche_agenti WHERE idanagrafica = '.prepare($record['idanagrafica']).') ) ORDER BY ragione_sociale", "value": "$idagenti$" ]}
</div>
</div>';
@ -350,19 +350,16 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
echo '
<div class="row">
<div class="col-md-6">
';
<p><b>'.tr('Piano dei conti cliente').'</b></p>';
if (!empty($conto['numero_conto'])) {
$piano_dei_conti_cliente = tr('_NAME_', [
'_NAME_' => $conto['numero'].'.'.$conto['numero_conto'].' '.htmlentities($conto['descrizione']),
]);
echo Modules::link('Piano dei conti', null, null, null, 'class="pull-right"', 1, 'movimenti-'.$conto['id']);
$piano_dei_conti_cliente = $conto['numero'].'.'.$conto['numero_conto'].' '.$conto['descrizione'];
echo Modules::link('Piano dei conti', null, $piano_dei_conti_cliente, null, '', 1, 'movimenti-'.$conto['id']);
} else {
$piano_dei_conti_cliente = tr('Nessuno');
}
echo '
{[ "type": "select", "label": "'.tr('Piano dei conti cliente').'", "name": "piano_dei_conti_cliente", "values": "list=\"\": \"'.$piano_dei_conti_cliente.'\"", "readonly": 1 ]}
</div>
</div>
</div>';
@ -394,28 +391,21 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
{[ "type": "select", "label": "'.tr('Listino articoli').'", "name": "idlistino_acquisti", "values": "query=SELECT id, nome AS descrizione FROM mg_listini ORDER BY nome ASC", "value": "$idlistino_acquisti$" ]}
</div>';
echo '
<div class="col-md-6">';
/*echo '
<p>'.tr('Piano dei conti collegato: _NAME_', [
'_NAME_' => $conto['numero'].'.'.$conto['numero_conto'].' '.$conto['descrizione'],
]).Modules::link('Piano dei conti', null, '').'</p>';*/
// Collegamento con il conto
$conto = $dbo->fetchOne('SELECT co_pianodeiconti2.numero as numero, co_pianodeiconti3.numero as numero_conto, co_pianodeiconti3.descrizione as descrizione FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti3.id = '.prepare($record['idconto_fornitore']));
$conto = $dbo->fetchOne('SELECT co_pianodeiconti3.id, co_pianodeiconti2.numero as numero, co_pianodeiconti3.numero as numero_conto, co_pianodeiconti3.descrizione as descrizione FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id WHERE co_pianodeiconti3.id = '.prepare($record['idconto_fornitore']));
echo '
<div class="col-md-6">
<p><b>'.tr('Piano dei conti fornitore').'</b></p>';
if (!empty($conto['numero_conto'])) {
$piano_dei_conti_fornitore = tr('_NAME_', [
'_NAME_' => $conto['numero'].'.'.$conto['numero_conto'].' '.$conto['descrizione'],
]);
echo Modules::link('Piano dei conti', null, null, null, 'class="pull-right"');
$piano_dei_conti_fornitore = $conto['numero'].'.'.$conto['numero_conto'].' '.$conto['descrizione'];
echo Modules::link('Piano dei conti', null, $piano_dei_conti_fornitore, null, '', 1, 'movimenti-'.$conto['id']);
} else {
$piano_dei_conti_fornitore = tr('Nessuno');
}
echo '
{[ "type": "select", "label": "'.tr('Piano dei conti fornitore').'", "name": "piano_dei_conti_fornitore", "values": "list=\"\": \"'.$piano_dei_conti_fornitore.'\"", "readonly": 1 ]}
</div>
</div>
</div>';
@ -444,7 +434,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="panel-body">
<div class="row">
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Numero d\'iscrizione registro imprese'); ?>", "name": "codiceri", "value": "$codiceri$", "help": "<?php echo tr('Il numero registro imprese è il numero di iscrizione attribuito dal Registro Imprese della Camera di Commercio.'); ?>" ]}
</div>
@ -454,7 +444,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
'_PATTERN_' => 'RM-123456',
]); ?>" ]}
</div>
<!-- campi già specificati in Codice R.E.A., da eliminare nelle prossime release -->
<!--div class="col-md-3">
@ -464,7 +454,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Città iscr. C.C.I.A.A.'); ?>", "name": "cciaa_citta", "value": "$cciaa_citta$" ]}
</div-->
</div>
<div class="row">
<div class="col-md-3">
@ -508,7 +498,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
<?php
if (in_array($id_azienda, $tipi_anagrafica)) {
echo '
<p class=\'badge badge-info\' >'.tr('Questa anagrafica &egrave; di tipo "Azienda"').'.</p>';
<p class="badge badge-info">'.tr('Questa anagrafica è di tipo "Azienda"').'.</p>';
}
?>
</div>

View File

@ -6,17 +6,34 @@ switch ($resource) {
case 'articoli':
$sedi_non_impostate = !isset($superselect['idsede_partenza']) && !isset($superselect['idsede_destinazione']);
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
$usare_dettaglio_fornitore = $superselect['dir'] == 'uscita';
$query = 'SELECT
mg_articoli.id,
mg_articoli.barcode,
mg_articoli.'.($prezzi_ivati ? 'prezzo_vendita_ivato' : 'prezzo_vendita').' AS prezzo_vendita,
mg_articoli.prezzo_vendita_ivato AS prezzo_vendita_ivato,';
// Informazioni relative al fornitore specificato dal documenti di acquisto
if ($usare_dettaglio_fornitore) {
$query .= '
IFNULL(mg_fornitore_articolo.codice_fornitore, mg_articoli.codice) AS codice,
IFNULL(mg_fornitore_articolo.descrizione, mg_articoli.descrizione) AS descrizione,
IFNULL(mg_fornitore_articolo.prezzo_acquisto, mg_articoli.prezzo_acquisto) AS prezzo_acquisto,
mg_articoli.'.($prezzi_ivati ? 'prezzo_vendita_ivato' : 'prezzo_vendita').' AS prezzo_vendita,
mg_articoli.prezzo_vendita_ivato AS prezzo_vendita_ivato,
IFNULL(mg_fornitore_articolo.qta_minima, 0) AS qta_minima,
mg_fornitore_articolo.id AS id_dettaglio_fornitore,
mg_fornitore_articolo.id AS id_dettaglio_fornitore,';
}
// Informazioni dell'articolo per i documenti di vendita
else {
$query .= '
mg_articoli.codice AS codice,
mg_articoli.descrizione AS descrizione,
mg_articoli.prezzo_acquisto AS prezzo_acquisto,
0 AS qta_minima,
NULL AS id_dettaglio_fornitore,';
}
$query .= '
round(mg_articoli.qta,'.setting('Cifre decimali per quantità').') AS qta,
mg_articoli.um,
mg_articoli.servizio,
@ -79,6 +96,11 @@ switch ($resource) {
$search_fields[] = 'mg_articoli.descrizione LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'mg_articoli.codice LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'mg_articoli.barcode LIKE '.prepare('%'.$search.'%');
if ($usare_dettaglio_fornitore) {
$search_fields[] = 'mg_fornitore_articolo.descrizione LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'mg_fornitore_articolo.codice_fornitore LIKE '.prepare('%'.$search.'%');
}
}
$custom = [
@ -254,5 +276,46 @@ switch ($resource) {
$search_fields[] = 'valore LIKE '.prepare('%'.$search.'%');
}
break;
case 'articoli_barcode':
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
$query = 'SELECT mg_articoli.*,
IFNULL(mg_fornitore_articolo.codice_fornitore, mg_articoli.codice) AS codice,
IFNULL(mg_fornitore_articolo.descrizione, mg_articoli.descrizione) AS descrizione,
IFNULL(mg_fornitore_articolo.prezzo_acquisto, mg_articoli.prezzo_acquisto) AS prezzo_acquisto,
mg_articoli.'.($prezzi_ivati ? 'prezzo_vendita_ivato' : 'prezzo_vendita').' AS prezzo_vendita,
mg_articoli.prezzo_vendita_ivato AS prezzo_vendita_ivato,
IFNULL(mg_fornitore_articolo.qta_minima, 0) AS qta_minima,
mg_fornitore_articolo.id AS id_dettaglio_fornitore
FROM mg_articoli
LEFT JOIN mg_fornitore_articolo ON mg_fornitore_articolo.id_articolo = mg_articoli.id AND mg_fornitore_articolo.deleted_at IS NULL AND mg_fornitore_articolo.id_fornitore = '.prepare($superselect['idanagrafica']).'
|where|';
$where[] = 'barcode='.prepare(get('barcode'));
$where[] = 'mg_articoli.attivo = 1';
$where[] = 'mg_articoli.deleted_at IS NULL';
$custom = [
'id' => 'id',
'codice' => 'codice',
'descrizione' => 'descrizione',
'qta' => 'qta',
'um' => 'um',
'categoria' => 'categoria',
'sottocategoria' => 'sottocategoria',
'idiva_vendita' => 'idiva_vendita',
'iva_vendita' => 'iva_vendita',
'idconto_vendita' => 'idconto_vendita',
'idconto_vendita_title' => 'idconto_vendita_title',
'idconto_acquisto' => 'idconto_acquisto',
'idconto_acquisto_title' => 'idconto_acquisto_title',
'prezzo_acquisto' => 'prezzo_acquisto',
'prezzo_vendita' => 'prezzo_vendita',
'id_dettaglio_fornitore' => 'id_dettaglio_fornitore',
'barcode' => 'barcode',
];
break;
}

View File

@ -114,6 +114,38 @@ switch (post('op')) {
break;
case 'manage_barcode':
foreach (post('qta') as $id_articolo => $qta) {
if ($id_articolo == '-id-') {
continue;
}
// Dati di input
$sconto = post('sconto')[$id_articolo];
$tipo_sconto = post('tipo_sconto')[$id_articolo];
$prezzo_unitario = post('prezzo_unitario')[$id_articolo];
$id_dettaglio_fornitore = post('id_dettaglio_fornitore')[$id_articolo];
$id_iva = $originale->idiva_vendita ? $originale->idiva_vendita : setting('Iva predefinita');
// Creazione articolo
$originale = ArticoloOriginale::find($id_articolo);
$articolo = Articolo::build($contratto, $originale);
$articolo->id_dettaglio_fornitore = $id_dettaglio_fornitore ?: null;
$articolo->setPrezzoUnitario($prezzo_unitario, $id_iva);
if ($dir == 'entrata') {
$articolo->costo_unitario = $originale->prezzo_acquisto;
}
$articolo->setSconto($sconto, $tipo_sconto);
$articolo->qta = $qta;
$articolo->save();
}
flash()->info(tr('Articoli aggiunti!'));
break;
case 'manage_articolo':
if (post('idriga') != null) {
$articolo = Articolo::find(post('idriga'));

View File

@ -27,6 +27,7 @@ if (!empty($id_documento)) {
$id_anagrafica = $documento_finale->idanagrafica;
$_SESSION['superselect']['idanagrafica'] = $id_anagrafica;
$_SESSION['superselect']['stato'] = 'is_fatturabile';
echo '
<div class="row">
@ -36,7 +37,7 @@ echo '
</div>
<div id="righe_documento">
</div>
<div class="alert alert-info" id="box-loading">
@ -46,20 +47,20 @@ echo '
$file = basename(__FILE__);
echo '
<script>$(document).ready(init)</script>
<script>
var content = $("#righe_documento");
var loader = $("#box-loading");
$(document).ready(function(){
loader.hide();
});
$("#id_documento").on("change", function(){
loader.show();
var id = $(this).selectData() ? $(this).selectData().id : "";
content.html("");
content.load("'.$structure->fileurl($file).'?id_module='.$id_module.'&id_record='.$id_record.'&id_documento=" + id, function() {
loader.hide();

View File

@ -310,6 +310,11 @@ if (!$block_edit) {
<i class="fa fa-plus"></i> '.tr('Articolo').'
</a>';
echo '
<a class="btn btn-sm btn-primary"data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_barcode" data-toggle="tooltip" data-title="'.tr('Aggiungi articoli tramite barcode').'">
<i class="fa fa-plus"></i> '.tr('Barcode').'
</a>';
echo '
<a class="btn btn-sm btn-primary" data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_riga" data-toggle="tooltip" data-title="'.tr('Aggiungi riga').'">
<i class="fa fa-plus"></i> '.tr('Riga').'

View File

@ -207,31 +207,33 @@ if (!empty($interventi)) {
</td>
</tr>';
// Totali per stato
echo '
<tr>
<td colspan="6">
<br><b>'.tr('Totale interventi per stato', [], ['upper' => true]).'</b>
</td>
</tr>';
$stati = $interventi->groupBy('idstatointervento');
foreach ($stati as $interventi_collegati) {
$stato = $interventi_collegati->first()->stato;
$totale_stato = sum(array_column($interventi_collegati->toArray(), 'totale_imponibile'));
if (count($stati) > 0) {
// Totali per stato
echo '
<tr>
<td colspan="3"></td>
<tr>
<td colspan="6">
<br><b>'.tr('Totale interventi per stato', [], ['upper' => true]).'</b>
</td>
</tr>';
<td class="text-right" colspan="2" style="background:'.$stato->colore.';">
<big><b>'.$stato->descrizione.':</b></big>
</td>
foreach ($stati as $interventi_collegati) {
$stato = $interventi_collegati->first()->stato;
$totale_stato = sum(array_column($interventi_collegati->toArray(), 'totale_imponibile'));
<td class="text-right">
<big><b>'.moneyFormat($totale_stato).'</b></big>
</td>
</tr>';
echo '
<tr>
<td colspan="3"></td>
<td class="text-right" colspan="2" style="background:'.$stato->colore.';">
<big><b>'.$stato->descrizione.':</b></big>
</td>
<td class="text-right">
<big><b>'.moneyFormat($totale_stato).'</b></big>
</td>
</tr>';
}
}
echo '
@ -269,16 +271,16 @@ if (!empty($totale_ore_contratto)) {
echo '
<div class="row">
<big class="col-md-4 col-md-offset-4 text-center">
<table class="table text-left">
<table class="table text-left table-striped table-bordered">
<tr>
<td colspan="2">'.tr('Ore in contratto').':</td>
<td colspan="2" class="text-right">'.Translator::numberToLocale($totale_ore_contratto).'</td>
<td>'.tr('Ore a contratto').':</td>
<td class="text-right">'.Translator::numberToLocale($totale_ore_contratto).'</td>
</tr>
<tr>
<td>'.tr('Ore erogate totali').':</td>
<td class="text-right">'.Translator::numberToLocale($totale_ore).'</td>
</tr>
<tr>
<td>'.tr('Ore residue totali').':</td>
<td class="text-right">'.Translator::numberToLocale(floatval($totale_ore_contratto) - floatval($totale_ore)).'</td>
</tr>
@ -286,8 +288,9 @@ if (!empty($totale_ore_contratto)) {
<tr>
<td>'.tr('Ore erogate concluse').':</td>
<td class="text-right">'.Translator::numberToLocale($totale_ore_completate).'</td>
<td>'.tr('Ore residue').':</td>
</tr>
<tr>
<td>'.tr('Ore residue concluse').':</td>
<td class="text-right">'.Translator::numberToLocale(floatval($totale_ore_contratto) - floatval($totale_ore_completate)).'</td>
</tr>
</table>

View File

@ -53,6 +53,10 @@ if (get('is_descrizione') !== null) {
$file = 'sconto';
$options['op'] = 'manage_sconto';
} elseif (get('is_barcode') !== null) {
$file = 'barcode';
$options['op'] = 'manage_barcode';
}
echo App::load($file.'.php', $result, $options);

View File

@ -170,16 +170,16 @@ switch (get('op')) {
foreach ($rsp as $r) {
if ($r['mese'] == $mese) {
if (date('Ymd', strtotime($r['data_richiesta'])) < date('Ymd')) {
$class = 'fc-event-danger';
$class = 'danger';
} else {
$class = 'fc-event-primary';
$class = 'primary';
}
echo '
<div class="fc-event '.$class.'" data-id="'.$r['id'].'" data-idcontratto="'.$r['idcontratto'].'" data-ref="'.$r['ref'].'">'.(($r['ref'] == 'intervento') ? '<i class=\'fa fa-wrench pull-right\'></i>' : '<i class=\'fa fa-file-text-o pull-right\'></i>').'
<div class="fc-event fc-event-'.$class.'" data-id="'.$r['id'].'" data-idcontratto="'.$r['idcontratto'].'" data-ref="'.$r['ref'].'">'.(($r['ref'] == 'intervento') ? '<i class=\'fa fa-wrench pull-right\'></i>' : '<i class=\'fa fa-file-text-o pull-right\'></i>').'
<b>'.$r['ragione_sociale'].'</b><br>'.Translator::dateToLocale($r['data_richiesta']).' ('.$r['tipointervento'].')<div class="request" >'.(!empty($r['richiesta']) ? ' - '.$r['richiesta'] : '').'</div>'.(!empty($r['nomecontratto']) ? '<br><b>Contratto:</b> '.$r['nomecontratto'] : '').
(!empty($r['data_scadenza'] and $r['data_scadenza'] != '0000-00-00 00:00:00') ? '<br><small>'.tr('entro il: ').Translator::dateToLocale($r['data_scadenza']).'</small>' : '').
(($r['ref'] == 'intervento') ? (Modules::link('Interventi', $r['id'], '<i class="fa fa-eye"></i>', null, 'title="'.tr('Visualizza scheda').'" class="btn btn-primary btn-xs pull-right"')).'<br>' : (Modules::link('Contratti', $r['idcontratto'], '<i class="fa fa-eye"></i>', null, 'title="'.tr('Visualizza scheda').'" class="btn btn-primary btn-xs pull-right"')).'<br>').
(($r['ref'] == 'intervento') ? (Modules::link('Interventi', $r['id'], '<i class="fa fa-eye"></i>', null, 'title="'.tr('Visualizza scheda').'" class="btn btn-'.$class.' btn-xs pull-right"')).'<br>' : (Modules::link('Contratti', $r['idcontratto'], '<i class="fa fa-eye"></i>', null, 'title="'.tr('Visualizza scheda').'" class="btn btn-'.$class.' btn-xs pull-right"')).'<br>').
'</div>';
}
} ?>

View File

@ -133,6 +133,38 @@ switch (post('op')) {
flash()->info(tr('Ddt modificato correttamente!'));
break;
case 'manage_barcode':
foreach (post('qta') as $id_articolo => $qta) {
if ($id_articolo == '-id-') {
continue;
}
// Dati di input
$sconto = post('sconto')[$id_articolo];
$tipo_sconto = post('tipo_sconto')[$id_articolo];
$prezzo_unitario = post('prezzo_unitario')[$id_articolo];
$id_dettaglio_fornitore = post('id_dettaglio_fornitore')[$id_articolo];
$id_iva = $originale->idiva_vendita ? $originale->idiva_vendita : setting('Iva predefinita');
// Creazione articolo
$originale = ArticoloOriginale::find($id_articolo);
$articolo = Articolo::build($ddt, $originale);
$articolo->id_dettaglio_fornitore = $id_dettaglio_fornitore ?: null;
$articolo->setPrezzoUnitario($prezzo_unitario, $id_iva);
if ($dir == 'entrata') {
$articolo->costo_unitario = $originale->prezzo_acquisto;
}
$articolo->setSconto($sconto, $tipo_sconto);
$articolo->qta = $qta;
$articolo->save();
}
flash()->info(tr('Articoli aggiunti!'));
break;
case 'manage_articolo':
if (post('idriga') != null) {
$articolo = Articolo::find(post('idriga'));
@ -277,7 +309,7 @@ switch (post('op')) {
if (post('evadere')[$riga->id] == 'on' and !empty(post('qta_da_evadere')[$riga->id])) {
$qta = post('qta_da_evadere')[$riga->id];
$copia = $riga->copiaIn($ddt, $qta, $is_evasione);
$copia = $riga->copiaIn($ddt, $qta);
// Aggiornamento seriali dalla riga dell'ordine
if ($copia->isArticolo()) {

View File

@ -50,43 +50,45 @@ switch (post('op')) {
$id_anagrafica = $anagrafica->id;
// Proseguo solo se i documenti scelti sono fatturabili
$righe = $documento_import->getRighe();
if (!empty($righe)) {
++$numero_totale;
if ($documento_import->isImportabile()) {
$righe = $documento_import->getRighe();
if (!empty($righe)) {
++$numero_totale;
// Ricerca fattura per anagrafica tra le registrate
$fattura = $documenti->first(function ($item, $key) use ($id_anagrafica) {
return $item->anagrafica->id == $id_anagrafica;
});
// Ricerca fattura per anagrafica tra le registrate
$fattura = $documenti->first(function ($item, $key) use ($id_anagrafica) {
return $item->anagrafica->id == $id_anagrafica;
});
// Ricerca fattura per anagrafica se l'impostazione di accodamento è selezionata
if (!empty($accodare) && empty($fattura)) {
$fattura = Fattura::where('idanagrafica', $id_anagrafica)
->where('idstatodocumento', $stato_documenti_accodabili->id)
->where('idtipodocumento', $tipo_documento->id)
->first();
// Ricerca fattura per anagrafica se l'impostazione di accodamento è selezionata
if (!empty($accodare) && empty($fattura)) {
$fattura = Fattura::where('idanagrafica', $id_anagrafica)
->where('idstatodocumento', $stato_documenti_accodabili->id)
->where('idtipodocumento', $tipo_documento->id)
->first();
if (!empty($fattura)) {
if (!empty($fattura)) {
$documenti->push($fattura);
}
}
// Creazione fattura per anagrafica
if (empty($fattura)) {
$fattura = Fattura::build($anagrafica, $tipo_documento, $data, $id_segment);
$documenti->push($fattura);
}
}
// Creazione fattura per anagrafica
if (empty($fattura)) {
$fattura = Fattura::build($anagrafica, $tipo_documento, $data, $id_segment);
$documenti->push($fattura);
}
// Inserimento righe
foreach ($righe as $riga) {
$qta = $riga->qta_rimanente;
// Inserimento righe
foreach ($righe as $riga) {
$qta = $riga->qta_rimanente;
if ($qta > 0) {
$copia = $riga->copiaIn($fattura, $qta);
if ($qta > 0) {
$copia = $riga->copiaIn($fattura, $qta);
// Aggiornamento seriali dalla riga dell'ordine
if ($copia->isArticolo()) {
$copia->serials = $riga->serials;
// Aggiornamento seriali dalla riga dell'ordine
if ($copia->isArticolo()) {
$copia->serials = $riga->serials;
}
}
}
}

View File

@ -329,6 +329,11 @@ if (!$block_edit) {
<i class="fa fa-plus"></i> '.tr('Articolo').'
</a>';
echo '
<a class="btn btn-sm btn-primary"data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_barcode" data-toggle="tooltip" data-title="'.tr('Aggiungi articoli tramite barcode').'">
<i class="fa fa-plus"></i> '.tr('Barcode').'
</a>';
echo '
<a class="btn btn-sm btn-primary" data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_riga" data-toggle="tooltip" data-title="'.tr('Aggiungi riga').'">
<i class="fa fa-plus"></i> '.tr('Riga').'

View File

@ -54,6 +54,10 @@ if (get('is_descrizione') !== null) {
$file = 'sconto';
$options['op'] = 'manage_sconto';
} elseif (get('is_barcode') !== null) {
$file = 'barcode';
$options['op'] = 'manage_barcode';
}
echo App::load($file.'.php', $result, $options);

View File

@ -392,6 +392,43 @@ switch (post('op')) {
break;
case 'manage_barcode':
foreach (post('qta') as $id_articolo => $qta) {
if ($id_articolo == '-id-') {
continue;
}
// Dati di input
$sconto = post('sconto')[$id_articolo];
$tipo_sconto = post('tipo_sconto')[$id_articolo];
$prezzo_unitario = post('prezzo_unitario')[$id_articolo];
$id_dettaglio_fornitore = post('id_dettaglio_fornitore')[$id_articolo];
$id_iva = $originale->idiva_vendita ? $originale->idiva_vendita : setting('Iva predefinita');
// Inversione quantità per Note
if (!empty($record['is_reversed'])) {
$qta = -$qta;
}
// Creazione articolo
$originale = ArticoloOriginale::find($id_articolo);
$articolo = Articolo::build($fattura, $originale);
$articolo->id_dettaglio_fornitore = $id_dettaglio_fornitore ?: null;
$articolo->setPrezzoUnitario($prezzo_unitario, $id_iva);
if ($dir == 'entrata') {
$articolo->costo_unitario = $originale->prezzo_acquisto;
}
$articolo->setSconto($sconto, $tipo_sconto);
$articolo->qta = $qta;
$articolo->save();
}
flash()->info(tr('Articoli aggiunti!'));
break;
case 'manage_articolo':
if (post('idriga') != null) {
$articolo = Articolo::find(post('idriga'));
@ -402,6 +439,7 @@ switch (post('op')) {
}
$qta = post('qta');
// Inversione quantità per Note
if (!empty($record['is_reversed'])) {
$qta = -$qta;
}
@ -637,7 +675,7 @@ switch (post('op')) {
if (post('evadere')[$riga->id] == 'on') {
$qta = post('qta_da_evadere')[$riga->id];
$copia = $riga->copiaIn($fattura, $qta, $is_evasione);
$copia = $riga->copiaIn($fattura, $qta);
$copia->id_conto = $id_conto;
$copia->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;

View File

@ -28,6 +28,7 @@ if (!empty($id_documento)) {
$id_anagrafica = $documento_finale->idanagrafica;
$_SESSION['superselect']['idanagrafica'] = $id_anagrafica;
$_SESSION['superselect']['stato'] = 'is_fatturabile';
echo '
<div class="row">
@ -37,7 +38,7 @@ echo '
</div>
<div id="righe_documento">
</div>
<div class="alert alert-info" id="box-loading">
@ -47,20 +48,20 @@ echo '
$file = basename(__FILE__);
echo '
<script>$(document).ready(init)</script>
<script>
var content = $("#righe_documento");
var loader = $("#box-loading");
$(document).ready(function(){
loader.hide();
});
$("#id_documento").on("change", function(){
loader.show();
var id = $(this).selectData() ? $(this).selectData().id : "";
content.html("");
content.load("'.$structure->fileurl($file).'?id_module='.$id_module.'&id_record='.$id_record.'&id_documento=" + id, function() {
loader.hide();

View File

@ -3,6 +3,7 @@
include_once __DIR__.'/../../core.php';
use Modules\Fatture\Fattura;
use Modules\Fatture\Stato;
use Plugins\ExportFE\FatturaElettronica;
use Plugins\ExportFE\Interaction;
use Util\Zip;
@ -173,8 +174,10 @@ switch (post('op')) {
break;
case 'copy-bulk':
$list = array();
foreach ($id_records as $id) {
$fattura = Fattura::find($id);
array_push($list, $fattura->numero_esterno);
$id_segment = (post('id_segment') ? post('id_segment') : $fattura->id_segment);
$dir = $dbo->fetchOne('SELECT dir FROM co_tipidocumento WHERE id='.prepare($fattura->idtipodocumento))['dir'];
@ -199,11 +202,16 @@ switch (post('op')) {
$data = date('Y-m-d', strtotime('+1 year', strtotime($fattura->data)));
}
$stato = Stato::where('descrizione', 'Bozza')->first();
$new = $fattura->replicate();
$new->codice_stato_fe = null;
$new->id_segment = $id_segment;
$new->numero_esterno = Fattura::getNextNumeroSecondario($data, $dir, $id_segment);
$new->numero = Fattura::getNextNumero($data, $dir, $id_segment);
$new->idstatodocumento = 2;
if (!empty($fattura->numero_esterno)) {
$new->numero_esterno = Fattura::getNextNumeroSecondario($data, $dir, $id_segment);
}
$new->stato()->associate($stato);
$new->data = $data;
$new->save();
@ -231,7 +239,9 @@ switch (post('op')) {
}
}
flash()->info(tr('Fatture duplicate correttamente!'));
flash()->info(tr('Fatture _LIST_ duplicate correttamente!', [
'_LIST_' => implode(',', $list),
]));
break;
@ -257,7 +267,7 @@ if (App::debug()) {
$operations['copy-bulk'] = [
'text' => '<span><i class="fa fa-copy"></i> '.tr('Duplica selezionati').'</span>',
'data' => [
'msg' => tr('Vuoi davvero duplicare le righe selezionate?').'<br><br>{[ "type": "select", "label": "", "name": "skip_time", "required": 1, "values": "list=\"Giorno\":\"'.tr('Giorno').'\", \"Settimana\":\"'.tr('Settimana').'\", \"Mese\":\"'.tr('Mese').'\", \"Anno\":\"'.tr('Anno').'\" ", "value": "Giorno" ]}<br>{[ "type": "select", "label": "", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.$id_module.' ORDER BY name", "value": "Giorno" ]}<br>{[ "type": "checkbox", "placeholder": "'.tr('Aggiungere i riferimenti ai documenti esterni?').'", "name": "riferimenti" ]}',
'msg' => tr('Vuoi davvero duplicare le righe selezionate?').'<br><br>{[ "type": "select", "label": "'.tr('Fattura in avanti di').'", "name": "skip_time", "required": 1, "values": "list=\"Giorno\":\"'.tr('Un giorno').'\", \"Settimana\":\"'.tr('Una settimana').'\", \"Mese\":\"'.tr('Un mese').'\", \"Anno\":\"'.tr('Un anno').'\" ", "value": "Giorno" ]}<br>{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.$id_module.' ORDER BY name", "value": "'.$_SESSION['module_'.$id_module]['id_segment'].'" ]}<br>{[ "type": "checkbox", "placeholder": "'.tr('Aggiungere i riferimenti ai documenti esterni?').'", "name": "riferimenti" ]}',
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
],

View File

@ -3,13 +3,7 @@
include_once __DIR__.'/../../core.php';
echo '
<form action="" class="text-right" method="post" id="form-copy">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="copy">
</form>
<button type="button" class="btn btn-primary" '.(empty($record['reversed']) ? '' : 'disabled').' onclick="if( confirm(\'Duplicare questa fattura?\') ){ $(\'#form-copy\').submit(); }">
<button type="button" class="btn btn-primary ask btn-primary" '.(empty($record['is_reversed']) ? '' : 'disabled').' data-msg="'.tr('Duplicare questa fattura?').'" data-op="copy" data-button="'.tr('Duplica').'" data-class="btn btn-lg btn-warning" data-backto="record-edit" >
<i class="fa fa-copy"></i> '.tr('Duplica fattura').'
</button>';
@ -25,7 +19,7 @@ if ($module->name == 'Fatture di vendita') {
if ($dir == 'entrata') {
echo '
<div class="btn-group">
<button type="button" class="btn btn-primary unblockable dropdown-toggle '.(((!empty($record['ref_documento']) || $record['stato'] != 'Bozza') and empty($record['reversed'])) ? '' : 'disabled').'" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<button type="button" class="btn btn-primary unblockable dropdown-toggle '.(((!empty($record['ref_documento']) || $record['stato'] != 'Bozza') and empty($record['is_reversed'])) ? '' : 'disabled').'" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fa fa-magic"></i> '.tr('Crea').' <span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>

View File

@ -672,6 +672,10 @@ if (!$block_edit) {
<a class="btn btn-sm btn-primary'.(!empty($articoli) ? '' : ' disabled').'" data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_articolo" data-toggle="tooltip" data-title="'.tr('Aggiungi articolo').'">
<i class="fa fa-plus"></i> '.tr('Articolo').'
</a>';
echo '
<a class="btn btn-sm btn-primary"data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_barcode" data-toggle="tooltip" data-title="'.tr('Aggiungi articoli tramite barcode').'">
<i class="fa fa-plus"></i> '.tr('Barcode').'
</a>';
echo '
<a class="btn btn-sm btn-primary" data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_riga" data-toggle="tooltip" data-title="'.tr('Aggiungi riga').'">

View File

@ -76,6 +76,10 @@ if (get('is_descrizione') !== null) {
$file = 'sconto';
$options['op'] = 'manage_sconto';
} elseif (get('is_barcode') !== null) {
$file = 'barcode';
$options['op'] = 'manage_barcode';
}
echo App::load($file.'.php', $result, $options);

View File

@ -55,9 +55,8 @@ foreach ($righe as $riga) {
}
$descrizione_conto = $dbo->fetchOne('SELECT descrizione FROM co_pianodeiconti3 WHERE id = '.prepare($riga->id_conto))['descrizione'];
//dump($documento_originale);exit();
$extra_riga = tr('_DESCRIZIONE_CONTO__ID_DOCUMENTO__NUMERO_RIGA__CODICE_CIG__CODICE_CUP__RITENUTA_ACCONTO__RITENUTA_CONTRIBUTI__RIVALSA_', [
$extra_riga = replace('_DESCRIZIONE_CONTO__ID_DOCUMENTO__NUMERO_RIGA__CODICE_CIG__CODICE_CUP__RITENUTA_ACCONTO__RITENUTA_CONTRIBUTI__RIVALSA_', [
'_RIVALSA_' => $riga->rivalsa_inps ? '<br>Rivalsa: '.moneyFormat(abs($riga->rivalsa_inps)) : null,
'_RITENUTA_ACCONTO_' => $riga->ritenuta_acconto ? '<br>Ritenuta acconto: '.moneyFormat(abs($riga->ritenuta_acconto)) : null,
'_RITENUTA_CONTRIBUTI_' => $riga->ritenuta_contributi ? '<br>Ritenuta contributi: '.moneyFormat(abs($riga->ritenuta_contributi)) : null,

View File

@ -205,6 +205,38 @@ $riga = $intervento->getRiga($type, $id_riga);
break;
case 'manage_barcode':
foreach (post('qta') as $id_articolo => $qta) {
if ($id_articolo == '-id-') {
continue;
}
// Dati di input
$sconto = post('sconto')[$id_articolo];
$tipo_sconto = post('tipo_sconto')[$id_articolo];
$prezzo_unitario = post('prezzo_unitario')[$id_articolo];
$id_dettaglio_fornitore = post('id_dettaglio_fornitore')[$id_articolo];
$id_iva = $originale->idiva_vendita ? $originale->idiva_vendita : setting('Iva predefinita');
// Creazione articolo
$originale = ArticoloOriginale::find($id_articolo);
$articolo = Articolo::build($intervento, $originale);
$articolo->id_dettaglio_fornitore = $id_dettaglio_fornitore ?: null;
$articolo->setPrezzoUnitario($prezzo_unitario, $id_iva);
if ($dir == 'entrata') {
$articolo->costo_unitario = $originale->prezzo_acquisto;
}
$articolo->setSconto($sconto, $tipo_sconto);
$articolo->qta = $qta;
$articolo->save();
}
flash()->info(tr('Articoli aggiunti!'));
break;
case 'manage_articolo':
if (post('idriga') != null) {
$articolo = Articolo::find(post('idriga'));

View File

@ -370,6 +370,9 @@ if (!empty($id_intervento)) {
}
// session_set('superselect,idzona', $(this).selectData().idzona, 0);
}
// Settaggio tipo intervento da anagrafica
$('#modals > div #idtipointervento').selectSetNew($(this).selectData().idtipointervento, $(this).selectData().idtipointervento_descrizione);
});
$('#modals > div #idsede_destinazione').change( function(){
@ -392,7 +395,6 @@ if (!empty($id_intervento)) {
}
if($(this).val()){
//TODO: disattivato perché genera problemi con il change successivo di iditpointervento per il tempo standard*
$('#modals > div #idtipointervento').selectSetNew($(this).selectData().idtipointervento, $(this).selectData().idtipointervento_descrizione);
}
});

View File

@ -7,9 +7,11 @@ $block_edit = $record['flag_completato'];
unset($_SESSION['superselect']['idanagrafica']);
unset($_SESSION['superselect']['idsede_partenza']);
unset($_SESSION['superselect']['idsede_destinazione']);
unset($_SESSION['superselect']['idintervento']);
$_SESSION['superselect']['idanagrafica'] = $record['idanagrafica'];
$_SESSION['superselect']['idsede_partenza'] = $record['idsede_partenza'];
$_SESSION['superselect']['idsede_partenza'];
$_SESSION['superselect']['idintervento'] = $id_record;
$_SESSION['superselect']['idsede_destinazione'] = $record['idsede_destinazione'];
$_SESSION['superselect']['permetti_movimento_a_zero'] = false;
@ -233,6 +235,11 @@ if (!$block_edit) {
<i class="fa fa-plus"></i> '.tr('Articolo').'
</a>';
echo '
<a class="btn btn-sm btn-primary"data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_barcode" data-toggle="tooltip" data-title="'.tr('Aggiungi articoli tramite barcode').'">
<i class="fa fa-plus"></i> '.tr('Barcode').'
</a>';
echo '
<a class="btn btn-sm btn-primary" data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_riga" data-toggle="tooltip" data-title="'.tr('Aggiungi riga').'">
<i class="fa fa-plus"></i> '.tr('Riga').'
@ -257,7 +264,7 @@ $articoli = $intervento->articoli;
</div>
<div class="col-md-3">
{[ "type": "select", "label": "<?php echo tr('Partenza merce'); ?>", "name": "idsede_partenza", "ajax-source": "sedi_azienda", "value": "$idsede_partenza$", "readonly": "<?php echo ($record['flag_completato'] || !empty($articoli)) ? 1 : 0; ?>" ]}
{[ "type": "select", "label": "<?php echo tr('Partenza merce'); ?>", "name": "idsede_partenza", "ajax-source": "sedi_azienda", "value": "$idsede_partenza$", "readonly": "<?php echo ($record['flag_completato'] || !$articoli->isEmpty()) ? 1 : 0; ?>" ]}
</div>
</div>

View File

@ -56,6 +56,10 @@ if (get('is_descrizione') !== null) {
$file = 'sconto';
$options['op'] = 'manage_sconto';
} elseif (get('is_barcode') !== null) {
$file = 'barcode';
$options['op'] = 'manage_barcode';
}
echo App::load($file.'.php', $result, $options);

View File

@ -112,6 +112,38 @@ switch (post('op')) {
break;
case 'manage_barcode':
foreach (post('qta') as $id_articolo => $qta) {
if ($id_articolo == '-id-') {
continue;
}
// Dati di input
$sconto = post('sconto')[$id_articolo];
$tipo_sconto = post('tipo_sconto')[$id_articolo];
$prezzo_unitario = post('prezzo_unitario')[$id_articolo];
$id_dettaglio_fornitore = post('id_dettaglio_fornitore')[$id_articolo];
$id_iva = $originale->idiva_vendita ? $originale->idiva_vendita : setting('Iva predefinita');
// Creazione articolo
$originale = ArticoloOriginale::find($id_articolo);
$articolo = Articolo::build($ordine, $originale);
$articolo->id_dettaglio_fornitore = $id_dettaglio_fornitore ?: null;
$articolo->setPrezzoUnitario($prezzo_unitario, $id_iva);
if ($dir == 'entrata') {
$articolo->costo_unitario = $originale->prezzo_acquisto;
}
$articolo->setSconto($sconto, $tipo_sconto);
$articolo->qta = $qta;
$articolo->save();
}
flash()->info(tr('Articoli aggiunti!'));
break;
case 'manage_articolo':
if (post('idriga') != null) {
$articolo = Articolo::find(post('idriga'));

View File

@ -29,12 +29,12 @@ $_SESSION['superselect']['permetti_movimento_a_zero'] = true;
<div class="panel-body">
<div class="row">
<div class="col-md-3">
<div class="col-md-3" <?php echo ($dir == 'entrata') ? 'hidden' : ''; ?>>
{[ "type": "text", "label": "<?php echo tr('Numero ordine'); ?>", "name": "numero", "required": 1, "class": "text-center", "value": "$numero$" ]}
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Numero secondario'); ?>", "name": "numero_esterno", "class": "text-center", "value": "$numero_esterno$" ]}
{[ "type": "text", "label": "<?php echo ($dir == 'entrata') ? tr('Numero ordine') : tr('Numero ordine fornitore'); ?>", "name": "numero_esterno", "class": "text-center", "value": "$numero_esterno$" ]}
</div>
<div class="col-md-3">
@ -116,7 +116,7 @@ $_SESSION['superselect']['permetti_movimento_a_zero'] = true;
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "<?php echo tr('Note aggiuntive'); ?>", "name": "note_aggiuntive", "help": "<?php echo tr('Note interne'); ?>", "value": "$note_aggiuntive$" ]}
{[ "type": "textarea", "label": "<?php echo tr('Note interne'); ?>", "name": "note_aggiuntive", "value": "$note_aggiuntive$" ]}
</div>
</div>
</div>
@ -186,6 +186,11 @@ if (!$block_edit) {
<i class="fa fa-plus"></i> '.tr('Articolo').'
</a>';
echo '
<a class="btn btn-sm btn-primary"data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_barcode" data-toggle="tooltip" data-title="'.tr('Aggiungi articoli tramite barcode').'">
<i class="fa fa-plus"></i> '.tr('Barcode').'
</a>';
echo '
<a class="btn btn-sm btn-primary" data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_riga" data-toggle="tooltip" data-title="'.tr('Aggiungi riga').'">
<i class="fa fa-plus"></i> '.tr('Riga').'
@ -208,7 +213,7 @@ if (!$block_edit) {
echo '
<div class="pull-right">
<a class="btn btn-sm btn-info" data-href="'.$structure->fileurl('quantita_impegnate.php').'?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="tooltip" data-title="'.tr('Controllo sulle quantità impegnate').'">
<i class="fa fa-check"></i> '.tr('Quantità impegnate').'
<i class="fa fa-question-circle"></i> '.tr('Verifica disponibilità').'
</a>
</div>';
}

View File

@ -54,6 +54,10 @@ if (get('is_descrizione') !== null) {
$file = 'sconto';
$options['op'] = 'manage_sconto';
} elseif (get('is_barcode') !== null) {
$file = 'barcode';
$options['op'] = 'manage_barcode';
}
echo App::load($file.'.php', $result, $options);

View File

@ -28,7 +28,7 @@ $info = $dbo->fetchOne($query);
</div>
<div class="col-md-8">
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": "<?php echo $info['descrizione']; ?>" ]}
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": <?php echo json_encode($info['descrizione']); ?> ]}
</div>
</div>
<br>

View File

@ -147,6 +147,38 @@ switch (post('op')) {
break;
case 'manage_barcode':
foreach (post('qta') as $id_articolo => $qta) {
if ($id_articolo == '-id-') {
continue;
}
// Dati di input
$sconto = post('sconto')[$id_articolo];
$tipo_sconto = post('tipo_sconto')[$id_articolo];
$prezzo_unitario = post('prezzo_unitario')[$id_articolo];
$id_dettaglio_fornitore = post('id_dettaglio_fornitore')[$id_articolo];
$id_iva = $originale->idiva_vendita ? $originale->idiva_vendita : setting('Iva predefinita');
// Creazione articolo
$originale = ArticoloOriginale::find($id_articolo);
$articolo = Articolo::build($preventivo, $originale);
$articolo->id_dettaglio_fornitore = $id_dettaglio_fornitore ?: null;
$articolo->setPrezzoUnitario($prezzo_unitario, $id_iva);
if ($dir == 'entrata') {
$articolo->costo_unitario = $originale->prezzo_acquisto;
}
$articolo->setSconto($sconto, $tipo_sconto);
$articolo->qta = $qta;
$articolo->save();
}
flash()->info(tr('Articoli aggiunti!'));
break;
case 'manage_articolo':
if (post('idriga') != null) {
$articolo = Articolo::find(post('idriga'));

View File

@ -15,7 +15,7 @@ switch ($resource) {
$where[] = 'an_anagrafiche.idanagrafica='.prepare($superselect['idanagrafica']);
$where[] = 'co_preventivi.default_revision=1';
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'is_fatturabile';
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'is_pianificabile';
$where[] = 'idstato IN (SELECT `id` FROM `co_statipreventivi` WHERE '.$stato.' = 1)';
}
@ -30,18 +30,5 @@ switch ($resource) {
$custom['sconto'] = 'sconto';
}
break;
case 'preventivi_aperti':
$query = 'SELECT co_preventivi.id AS id, CONCAT(numero, " ", co_preventivi.nome, " (", ragione_sociale, ")") AS descrizione FROM co_preventivi INNER JOIN an_anagrafiche ON co_preventivi.idanagrafica=an_anagrafiche.idanagrafica |where| ORDER BY id';
foreach ($elements as $element) {
$filter[] = 'idpreventivo='.prepare($element);
}
$where[] = 'idstato IN (1)';
if (!empty($search)) {
$search_fields[] = 'nome LIKE '.prepare('%'.$search.'%');
}
break;
}

View File

@ -208,6 +208,16 @@ if (!$block_edit) {
<i class="fa fa-plus"></i> '.tr('Articolo').'
</a>';
echo '
<a class="btn btn-sm btn-primary"data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_barcode" data-toggle="tooltip" data-title="'.tr('Aggiungi articoli tramite barcode').'">
<i class="fa fa-plus"></i> '.tr('Barcode').'
</a>';
echo '
<a class="btn btn-sm btn-primary"data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_barcode" data-toggle="tooltip" data-title="'.tr('Aggiungi articoli tramite barcode').'">
<i class="fa fa-plus"></i> '.tr('Barcode').'
</a>';
echo '
<a class="btn btn-sm btn-primary" data-href="'.$structure->fileurl('row-add.php').'?id_module='.$id_module.'&id_record='.$id_record.'&is_riga" data-toggle="tooltip" data-title="'.tr('Aggiungi riga').'">
<i class="fa fa-plus"></i> '.tr('Riga').'

View File

@ -206,31 +206,33 @@ if (!empty($interventi)) {
</td>
</tr>';
// Totali per stato
echo '
<tr>
<td colspan="6">
<br><b>'.tr('Totale interventi per stato', [], ['upper' => true]).'</b>
</td>
</tr>';
$stati = $interventi->groupBy('idstatointervento');
foreach ($stati as $interventi_collegati) {
$stato = $interventi_collegati->first()->stato;
$totale_stato = sum(array_column($interventi_collegati->toArray(), 'totale_imponibile'));
if (count($stati) > 0) {
// Totali per stato
echo '
<tr>
<td colspan="3"></td>
<tr>
<td colspan="6">
<br><b>'.tr('Totale interventi per stato', [], ['upper' => true]).'</b>
</td>
</tr>';
<td class="text-right" colspan="2" style="background:'.$stato->colore.';">
<big><b>'.$stato->descrizione.':</b></big>
</td>
foreach ($stati as $interventi_collegati) {
$stato = $interventi_collegati->first()->stato;
$totale_stato = sum(array_column($interventi_collegati->toArray(), 'totale_imponibile'));
<td class="text-right">
<big><b>'.moneyFormat($totale_stato).'</b></big>
</td>
</tr>';
echo '
<tr>
<td colspan="3"></td>
<td class="text-right" colspan="2" style="background:'.$stato->colore.';">
<big><b>'.$stato->descrizione.':</b></big>
</td>
<td class="text-right">
<big><b>'.moneyFormat($totale_stato).'</b></big>
</td>
</tr>';
}
}
echo '

View File

@ -53,6 +53,10 @@ if (get('is_descrizione') !== null) {
$file = 'sconto';
$options['op'] = 'manage_sconto';
} elseif (get('is_barcode') !== null) {
$file = 'barcode';
$options['op'] = 'manage_barcode';
}
echo App::load($file.'.php', $result, $options);

View File

@ -85,6 +85,11 @@ var chart_options = {
}
}
},
elements: {
line: {
tension: 0
}
},
annotation: {
annotations: [{
type: "line",

View File

@ -33,11 +33,11 @@ class LineChart extends Stat {
chart.data.datasets.push({
calendar_id: calendar_id,
label: label,
backgroundColor: color,
backgroundColor: color + '55',
borderColor: color,
data: dataset,
labels: labels,
fill: false,
fill: true,
});
chart.update();

View File

@ -53,7 +53,7 @@ function crea_grafico(values){
if (element.count<element.dbCount){
var diff = (element.dbCount-element.count);
$("#message").append("<div class=\"label label-warning\" ><i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\"></i> "+diff+" di file mancanti per allegati.</div><br>");
$("#message").append("<div class=\"label label-warning\" ><i class=\"fa fa-exclamation-triangle\" aria-hidden=\"true\"></i> "+diff+" file non trovati sul disco.</div><br>");
}
}
@ -61,7 +61,7 @@ function crea_grafico(values){
//Numero di file in Allegati per estensione
if (element.dbExtensions.length > 0){
$("#message").append("<p><b>Top 10 allegati:</b></p>");
$("#message").append("<br><p><b>Top 10 allegati:</b></p>");
element.dbExtensions.forEach(function(extension) {

View File

@ -72,24 +72,65 @@ include_once __DIR__.'/../../core.php';
//Permetto eliminazione tipo intervento solo se questo non è utilizzado da nessun'altra parte nel gestionale
//UNION SELECT `in_tariffe`.`idtipointervento` FROM `in_tariffe` WHERE `in_tariffe`.`idtipointervento` = '.prepare($id_record).'
//UNION SELECT `co_contratti_tipiintervento`.`idtipointervento` FROM `co_contratti_tipiintervento` WHERE `co_contratti_tipiintervento`.`idtipointervento` = '.prepare($id_record).'
$elementi = $dbo->fetchArray('SELECT `in_interventi`.`idtipointervento` FROM `in_interventi` WHERE `in_interventi`.`idtipointervento` = '.prepare($id_record).'
$elementi = $dbo->fetchArray('SELECT `in_interventi`.`idtipointervento`, id, codice AS numero, data_richiesta AS data, "Intervento" AS tipo_documento FROM `in_interventi` WHERE `in_interventi`.`idtipointervento` = '.prepare($id_record).'
UNION
SELECT `an_anagrafiche`.`idtipointervento_default` AS `idtipointervento` FROM `an_anagrafiche` WHERE `an_anagrafiche`.`idtipointervento_default` = '.prepare($id_record).'
SELECT `in_interventi_tecnici`.`idtipointervento`, idintervento AS id, codice AS numero, orario_inizio AS data, "Sessione intervento" AS tipo_documento FROM `in_interventi_tecnici` LEFT JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id WHERE `in_interventi_tecnici`.`idtipointervento` = '.prepare($id_record).'
UNION
SELECT `co_preventivi`.`idtipointervento` FROM `co_preventivi` WHERE `co_preventivi`.`idtipointervento` = '.prepare($id_record).'
SELECT `an_anagrafiche`.`idtipointervento_default` AS `idtipointervento`, idanagrafica AS id, codice, "0000-00-00" AS data, "Anagrafica" AS tipo_documento FROM `an_anagrafiche` WHERE `an_anagrafiche`.`idtipointervento_default` = '.prepare($id_record).'
UNION
SELECT `co_promemoria`.`idtipointervento` FROM `co_promemoria` WHERE `co_promemoria`.`idtipointervento` = '.prepare($id_record).'
SELECT `co_preventivi`.`idtipointervento`, id, numero, data_bozza AS data, "Preventivo" AS tipo_documento FROM `co_preventivi` WHERE `co_preventivi`.`idtipointervento` = '.prepare($id_record).'
UNION
SELECT `in_interventi_tecnici`.`idtipointervento` FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idtipointervento` = '.prepare($id_record).'
SELECT `co_promemoria`.`idtipointervento`, idcontratto AS id, numero, data_richiesta AS data, "Promemoria contratto" AS tipo_documento FROM `co_promemoria` LEFT JOIN co_contratti ON co_promemoria.idcontratto=co_contratti.id WHERE `co_promemoria`.`idtipointervento` = '.prepare($id_record).'
ORDER BY `idtipointervento`');
if (!empty($elementi)) {
echo '
<div class="alert alert-danger">
'.tr('Ci sono _NUM_ records collegati', [
<div class="box box-warning collapsable collapsed-box">
<div class="box-header with-border">
<h3 class="box-title"><i class="fa fa-warning"></i> '.tr('Documenti collegati: _NUM_', [
'_NUM_' => count($elementi),
]).'.
</div>';
]).'</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">
<ul>';
foreach ($elementi as $elemento) {
$descrizione = tr('_DOC_ num. _NUM_ del _DATE_', [
'_DOC_' => $elemento['tipo_documento'],
'_NUM_' => $elemento['numero'],
'_DATE_' => Translator::dateToLocale($elemento['data']),
]);
if (in_array($elemento['tipo_documento'], ['Intervento'])) {
$modulo = 'Interventi';
}
if (in_array($elemento['tipo_documento'], ['Sessione intervento'])) {
$modulo = 'Interventi';
}
if (in_array($elemento['tipo_documento'], ['Anagrafica'])) {
$modulo = 'Anagrafiche';
}
if (in_array($elemento['tipo_documento'], ['Preventivo'])) {
$modulo = 'Preventivi';
}
if (in_array($elemento['tipo_documento'], ['Promemoria contratto'])) {
$modulo = 'Contratti';
}
$id = $elemento['id'];
echo '
<li>'.Modules::link($modulo, $id, $descrizione).'</li>';
}
echo '
</ul>
</div>
</div>';
} else {
echo '
<a class="btn btn-danger ask" data-backto="record-list">

View File

@ -87,10 +87,24 @@ if ($structure->permission == 'rw') {
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
<button type="sumbit" class="btn btn-primary">
<button type="submit" class="btn btn-primary" disabled id="aggiungi_nota" >
<i class="fa fa-plus"></i> '.tr('Aggiungi').'
</button>
</div>
</div>
</form>';
}
echo '
<script>
$(document).ready(function(){
CKEDITOR.instances["contenuto"].on("key", function() {
setTimeout(function(){
if(CKEDITOR.instances["contenuto"].getData() == ""){
$("#aggiungi_nota").prop("disabled", true);
}
else $("#aggiungi_nota").prop("disabled", false);
}, 10);
});
});
</script>';

View File

@ -21,25 +21,27 @@ switch (post('op')) {
'stato' => Auth::getStatus()['failed']['code'],
]);
$utente = User::where('username', $username)->where('email', $email)->first();
if (!empty($utente)) {
$utente->reset_token = secure_random_string();
$utente->save();
try {
$utente = User::where('username', $username)->where('email', $email)->first();
if (!empty($utente)) {
$utente->reset_token = secure_random_string();
$utente->save();
$template = Template::get('Reset password');
$template = Template::get('Reset password');
$mail = Mail::build($utente, $template, $utente->id);
$mail->addReceiver($utente->email);
$mail->save();
$mail = Mail::build($utente, $template, $utente->id);
$mail->addReceiver($utente->email);
$mail->save();
$email = EmailNotification::build($mail);
$email->send();
$email = EmailNotification::build($mail);
$email->send();
}
flash()->info(tr("Se le informazioni inserite corrispondono ai dati di un utente, riceverai a breve un'email all'indirizzo collegato").'.');
} catch (Exception $e) {
flash()->error(tr("Errore durante la gestione della richiesta: si prega di contattare l'amministratore").'.');
}
//$message_email = substr($email, 0, 2).str_repeat('*', strlen($email)-8).substr($email, -6);
flash()->info(tr("Se le informazioni inserite corrispondono ai dati di un utente, riceverai a breve un'email all'indirizzo collegato").'.');
redirect(ROOTDIR.'/index.php');
exit();
break;

View File

@ -1,6 +1,6 @@
<?php
namespace Api\Common;
namespace API\Common;
use API\Interfaces\CreateInterface;
use API\Resource;

View File

@ -1,6 +1,6 @@
<?php
namespace Api\Common;
namespace API\Common;
use API\Interfaces\RetrieveInterface;
use API\Resource;

View File

@ -140,11 +140,11 @@ class Query
return '';
}
// Filtri di ricerica
// Filtri di ricerca
$search_filters = [];
foreach ($search as $field => $value) {
foreach ($search as $field => $original_value) {
$pos = array_search($field, $total['fields']);
$value = trim($value);
$value = trim($original_value);
if (isset($value) && $pos !== false) {
$search_query = $total['search_inside'][$pos];
@ -201,7 +201,14 @@ class Query
// Campo id: ricerca tramite comparazione
elseif ($field == 'id') {
$search_filters[] = $field.' = '.prepare($value);
// Filtro per una serie di ID
if (is_array($original_value)) {
if (!empty($original_value)) {
$search_filters[] = $field.' IN ('.implode(', ', $original_value).')';
}
} else {
$search_filters[] = $field.' = '.prepare($value);
}
}
// Ricerca
@ -264,7 +271,7 @@ class Query
*/
public static function getSums($structure, $search = [])
{
$total = self::readQuery($structure, $search);
$total = self::readQuery($structure);
// Calcolo di eventuali somme
if (empty($total['summable'])) {

View File

@ -123,6 +123,8 @@ table#contents tbody td {
}
.fake-footer p,
.fake-footer span,
.fake-footer div,
.fake-footer table,
.fake-footer table.table-bordered th,
.fake-footer table.table-striped tbody tr td,

View File

@ -59,7 +59,7 @@ if ($pricing || !empty($totale_ore)) {
<th colspan="2" class="text-center">
<b>'.Translator::numberToLocale($totale_ore - $totale_ore_impiegate).'</b><br>
<p>'.tr('Ore erogate').': '.Translator::numberToLocale($totale_ore_impiegate).'</p>
<p>'.tr('Ore in contratto').': '.Translator::numberToLocale($totale_ore).'</p>
<p>'.tr('Ore a contratto').': '.Translator::numberToLocale($totale_ore).'</p>
</th>
</tr>';
}

View File

@ -7,7 +7,7 @@ $v_totale = [];
// Creazione righe fantasma
$autofill = new \Util\Autofill(6, 40);
$rows_per_page = $fattura_accompagnatoria ? 15 : 20;
$rows_per_page = $fattura_accompagnatoria ? 13 : 18;
if (!empty($options['last-page-footer'])) {
$rows_per_page += 7;
}
@ -90,7 +90,7 @@ foreach ($righe as $riga) {
if (setting('Riferimento dei documenti nelle stampe') && $riga->hasOriginal()) {
$ref = $riga->getOriginal()->parent->getReference();
if (!empty($riga->getOriginal()->parent->numero_cliente)) {
$ref .= tr('<br>_DOC_ num. _NUM_ del _DATE_', [
$ref .= '<br>'.tr('_DOC_ num. _NUM_ del _DATE_', [
'_DOC_' => 'Rif. Vs. ordine cliente',
'_NUM_' => $riga->getOriginal()->parent->numero_cliente,
'_DATE_' => dateFormat($riga->getOriginal()->parent->data_cliente),
@ -113,7 +113,7 @@ foreach ($righe as $riga) {
$codice_cup = $documento_originale['codice_cup'];
$id_documento_fe = $documento_originale['id_documento_fe'];
$extra_riga = tr('_ID_DOCUMENTO__NUMERO_RIGA__CODICE_CIG__CODICE_CUP_', [
$extra_riga = replace('_ID_DOCUMENTO__NUMERO_RIGA__CODICE_CIG__CODICE_CUP_', [
'_ID_DOCUMENTO_' => $id_documento_fe ? 'DOC: '.$id_documento_fe : null,
'_NUMERO_RIGA_' => $num_item ? ', NRI: '.$num_item : null,
'_CODICE_CIG_' => $codice_cig ? ', CIG: '.$codice_cig : null,
@ -185,8 +185,8 @@ $dicitura = $dbo->fetchOne('SELECT diciturafissafattura AS dicitura FROM an_anag
if (!empty($dicitura['dicitura'])) {
echo '
<p class="text-center">
<b>'.nl2br($dicitura['dicitura']).'</b>
<p class="text-left">
<span>'.nl2br($dicitura['dicitura']).'</span>
</p>';
}

View File

@ -383,8 +383,8 @@ if ($fattura_accompagnatoria) {
}
echo '
<div style="font-size: 7pt; color: #999; text-align: center">
<p>$dicitura_fissa_fattura$</p>
<div style="font-size: 6pt; text-align: left;" class="text-muted">
<span>$dicitura_fissa_fattura$</span>
</div>';
if (empty($options['last-page-footer'])) {

View File

@ -58,7 +58,7 @@ echo '
</td>
</tr>
<tr>
<td colspan="2" style="height:10mm;padding-top:2mm;">
<td colspan="2" style="height:10mm;padding-top:2mm;white-space: nowrap;">
<p class="small-bold">'.tr('IBAN').'</p>
<p>$codiceiban$</p>
</td>

View File

@ -119,7 +119,7 @@ $replaces = array_merge($replaces, [
'rootdir' => ROOTDIR,
'directory' => Prints::get($id_print)['full_directory'],
'footer' => !empty($footer) ? $footer : '',
'dicitura_fissa_fattura' => setting('Dicitura fissa fattura').((!empty(setting('OSMCloud Services API Token'))) ? tr(' Documento privo di valenza fiscale (art 21 dpr 633/72).') : ''),
'dicitura_fissa_fattura' => setting('Dicitura fissa fattura').((!empty(setting('OSMCloud Services API Token'))) ? tr('Documento privo di valenza fiscale (art 21 dpr 633/72).') : ''),
]);
unset($replace);

View File

@ -26,7 +26,7 @@ $query = Query::getQuery($structure, $where, 0, []);
$query = Modules::replaceAdditionals($id_module, $query);
// Modifiche alla query principale
$query = preg_replace('/ FROM `mg_articoli` /', ' FROM mg_articoli LEFT JOIN (SELECT idarticolo, SUM(qta) AS qta_totale FROM mg_movimenti GROUP BY idarticolo) movimenti ON movimenti.idarticolo=mg_articoli.id ', $query);
$query = preg_replace('/ FROM `mg_articoli` /', ' FROM mg_articoli LEFT JOIN (SELECT idarticolo, SUM(qta) AS qta_totale FROM mg_movimenti WHERE data <='.prepare($period_end).' GROUP BY idarticolo) movimenti ON movimenti.idarticolo=mg_articoli.id ', $query);
$query = preg_replace('/^SELECT /', 'SELECT mg_articoli.prezzo_acquisto,', $query);
$query = preg_replace('/^SELECT /', 'SELECT mg_articoli.prezzo_vendita,', $query);

View File

@ -33,30 +33,28 @@ echo '
], ['upper' => true]).'</b>
</div>
<table>
<tr>
<td colspan="2" style="height:10mm;padding-top:2mm;">
<p class="small-bold">'.tr('Pagamento', [], ['upper' => true]).'</p>
<p>'.$pagamento['descrizione'].'</p>
</td>
<td colspan="2" style="height:10mm;padding-top:2mm;">
<p class="small-bold">'.tr('Banca di appoggio', [], ['upper' => true]).'</p>
<p><small>'.$banca['nome'].'</small></p>
</td>
</tr>
<tr>
<td colspan="2" style="height:10mm;padding-top:2mm;">
<p class="small-bold">'.tr('IBAN').'</p>
<p>'.$banca['iban'].'</p>
</td>
<td colspan="2" style="height:10mm;padding-top:2mm;">
<p class="small-bold">'.tr('BIC').'</p>
<p>'.$banca['bic'].'</p>
</td>
</tr>
<table class="table">
<tr>
<td colspan="2" style="height:10mm;padding-top:2mm;">
<p class="small-bold">'.tr('Pagamento', [], ['upper' => true]).'</p>
<p>'.$pagamento['descrizione'].'</p>
</td>
<td colspan="2" style="height:10mm;padding-top:2mm;">
<p class="small-bold">'.tr('Banca di appoggio', [], ['upper' => true]).'</p>
<p><small>'.$banca['nome'].'</small></p>
</td>
</tr>
<tr>
<td colspan="2" style="height:10mm;padding-top:2mm;white-space: nowrap;">
<p class="small-bold">'.tr('IBAN').'</p>
<p>'.$banca['iban'].'</p>
</td>
<td colspan="2" style="height:10mm;padding-top:2mm;">
<p class="small-bold">'.tr('BIC').'</p>
<p>'.$banca['bic'].'</p>
</td>
</tr>
</table>
</div>
<div class="col-xs-6" style="margin-left: 10px">

View File

@ -38,7 +38,7 @@ echo '<h4><b>'.$titolo.'</b></h4>
<th>'.tr('Data comp.').'</th>
<th>'.tr('Tipo').'</th>
<th>'.$tipo.'</th>
<th>'.tr('Tot.&nbsp;doc.').'</th>
<th>'.tr('Tot. doc.').'</th>
<th>'.tr('Imponibile').'</th>
<th>%</th>
<th>'.tr('Iva').'</th>

View File

@ -134,19 +134,16 @@ UPDATE `or_righe_ordini` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario` = `subtotale` / `qta`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`sconto_unitario_ivato` = `sconto_unitario`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),
`sconto_unitario` = IF(`tipo_sconto` = 'PRC', `sconto` / `qta`, `sconto_unitario`),
`sconto_unitario_ivato` = `sconto_unitario`;
UPDATE `in_righe_interventi` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),
`sconto_unitario` = IF(`tipo_sconto` = 'PRC', `sconto` / `qta`, `sconto_unitario`),
`sconto_unitario_ivato` = `sconto_unitario`;
UPDATE `co_promemoria_righe` SET `qta` = IF(`qta` = 0, 1, `qta`),
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`iva_unitaria` = `iva` / `qta`,
`prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`,
`sconto_percentuale` = IF(`tipo_sconto` = 'PRC', `sconto_unitario`, 0),

View File

@ -123,6 +123,49 @@ UPDATE `em_accounts` SET `connected_at` = NOW();
-- Aggiunta del flag is_importabile sulle causali per permettere/bloccare l'importazione dei DDT
ALTER TABLE `dt_causalet` ADD `is_importabile` BOOLEAN DEFAULT TRUE AFTER `descrizione`;
-- Impostazione "Totali delle tabelle ristretti alla selezione"
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES (NULL, 'Totali delle tabelle ristretti alla selezione', '0', 'boolean', '1', 'Generali', 119);
-- Ottimizzazione caricamento lista fatture
ALTER TABLE `co_righe_documenti` ADD INDEX(`iddocumento`);
-- Aggiunta colonna data negli ordini
INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `format`, `default`, `visible`) VALUES
((SELECT `id` FROM `zz_modules` WHERE `name` = 'Ordini fornitore'), 'Data', 'or_ordini.data', 3, 1, 0, 0, 1);
-- Plugin storico attività scheda Aanagrafiche
INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`) VALUES (NULL, 'Storico attività', 'Storico attività', (SELECT id FROM zz_modules WHERE name = 'Interventi'), (SELECT id FROM zz_modules WHERE name='Anagrafiche'), 'tab', '', '1', '1', '0', '2.*', '0.1', NULL, '{ "main_query": [ { "type": "table", "fields": "Numero, Data inizio, Data fine, Tipo", "query": "SELECT in_interventi.id, in_interventi.codice AS Numero, DATE_FORMAT(MAX(orario_inizio),''%d/%m/%Y'') AS ''Data inizio'', DATE_FORMAT(MAX(orario_fine),''%d/%m/%Y'') AS ''Data fine'', (SELECT descrizione FROM in_tipiintervento WHERE idtipointervento=in_interventi.idtipointervento) AS ''Tipo'', (SELECT `id` FROM `zz_modules` WHERE `name` = ''Interventi'') AS _link_module_, in_interventi.id AS _link_record_ FROM in_interventi LEFT JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id` LEFT JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`idstatointervento` WHERE 1=1 AND in_interventi.deleted_at IS NULL AND idanagrafica = |id_parent| HAVING 2=2 ORDER BY in_interventi.id DESC"} ]}', '', '');
-- Fix prezzo_unitario_ivato e sconto_iva_unitario per i documenti
UPDATE `co_righe_contratti` SET `prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`;
UPDATE `co_righe_documenti` SET `prezzo_unitario_ivato` = `prezzo_unitario` + `iva_unitaria`;
UPDATE `co_righe_documenti` INNER JOIN `co_iva` ON `co_iva`.`id` = `co_righe_documenti`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `co_righe_preventivi` INNER JOIN `co_iva` ON `co_iva`.`id` = `co_righe_preventivi`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `co_righe_contratti` INNER JOIN `co_iva` ON `co_iva`.`id` = `co_righe_contratti`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `dt_righe_ddt` INNER JOIN `co_iva` ON `co_iva`.`id` = `dt_righe_ddt`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `or_righe_ordini` INNER JOIN `co_iva` ON `co_iva`.`id` = `or_righe_ordini`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `in_righe_interventi` INNER JOIN `co_iva` ON `co_iva`.`id` = `in_righe_interventi`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
UPDATE `co_righe_promemoria` INNER JOIN `co_iva` ON `co_iva`.`id` = `co_righe_promemoria`.`idiva` SET
`sconto_iva_unitario` = (`co_iva`.`percentuale` * `sconto_unitario` / 100),
`sconto_unitario_ivato` = `sconto_unitario` + `sconto_iva_unitario`;
-- Fix namespace classi Stampa e Allegato per API
UPDATE `zz_api_resources` SET `class` = 'API\\Common\\Stampa' WHERE `class` = 'Api\\Common\\Stampa';
UPDATE `zz_api_resources` SET `class` = 'API\\Common\\Allegato' WHERE `class` = 'Api\\Common\\Allegato';
-- Aggiunta risorse dedicate all'applicazione
DELETE FROM `zz_api_resources` WHERE `version` = 'app-v1';
INSERT INTO `zz_api_resources` (`id`, `version`, `type`, `resource`, `class`, `enabled`) VALUES