1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-02-17 03:51:06 +01:00
This commit is contained in:
Beppe 2021-11-03 14:16:53 +01:00
commit 8460ee36b1
20 changed files with 265 additions and 79 deletions

1
.gitignore vendored
View File

@ -76,7 +76,6 @@ package-lock.json
assets/dist/
backup/*
!backup/.htaccess
custom/
files/*
!files/.htaccess
!files/impianti/

View File

@ -79,7 +79,7 @@ switch ($resource) {
mg_articoli.idconto_acquisto,
categoria.`nome` AS categoria,
sottocategoria.`nome` AS sottocategoria,
(SUM((co_righe_documenti.prezzo_unitario-co_righe_documenti.sconto_unitario)*co_righe_documenti.qta)/SUM(co_righe_documenti.qta)) AS media_ponderata,
righe.media_ponderata,
CONCAT(conto_vendita_categoria .numero, '.', conto_vendita_sottocategoria.numero, ' ', conto_vendita_sottocategoria.descrizione) AS idconto_vendita_title,
CONCAT(conto_acquisto_categoria .numero, '.', conto_acquisto_sottocategoria.numero, ' ', conto_acquisto_sottocategoria.descrizione) AS idconto_acquisto_title
@ -92,9 +92,10 @@ switch ($resource) {
LEFT JOIN co_pianodeiconti3 AS conto_acquisto_sottocategoria ON conto_acquisto_sottocategoria.id=mg_articoli.idconto_acquisto
LEFT JOIN co_pianodeiconti2 AS conto_acquisto_categoria ON conto_acquisto_sottocategoria.idpianodeiconti2=conto_acquisto_categoria.id
LEFT JOIN co_righe_documenti ON co_righe_documenti.idarticolo=mg_articoli.id
LEFT JOIN (SELECT co_righe_documenti.idarticolo AS id, (SUM((co_righe_documenti.prezzo_unitario-co_righe_documenti.sconto_unitario)*co_righe_documenti.qta)/SUM(co_righe_documenti.qta)) AS media_ponderata FROM co_righe_documenti
LEFT JOIN co_documenti ON co_documenti.id=co_righe_documenti.iddocumento
LEFT JOIN co_tipidocumento ON co_tipidocumento.id=co_documenti.idtipodocumento
LEFT JOIN co_tipidocumento ON co_tipidocumento.id=co_documenti.idtipodocumento WHERE co_tipidocumento.dir='uscita' GROUP BY co_righe_documenti.idarticolo) AS righe
ON righe.id=mg_articoli.id
LEFT JOIN co_iva AS iva_articolo ON iva_articolo.id = mg_articoli.idiva_vendita
LEFT JOIN co_iva AS iva_predefinita ON iva_predefinita.id = (SELECT valore FROM zz_settings WHERE nome = 'Iva predefinita')";
@ -137,7 +138,6 @@ switch ($resource) {
$where[] = 'mg_articoli.attivo = 1';
$where[] = 'mg_articoli.deleted_at IS NULL';
$where[] = '(co_tipidocumento.dir="uscita" OR co_tipidocumento.dir IS NULL)';
if (!empty($search)) {
$search_fields[] = 'mg_articoli.descrizione LIKE '.prepare('%'.$search.'%');

View File

@ -207,7 +207,7 @@ switch (post('op')) {
}
if ($n_articoli > 0) {
flash()->info(tr('Categoria cambiata a _NUM_ articoli!', [
flash()->info(tr('Aliquota iva cambiata a _NUM_ articoli!', [
'_NUM_' => $n_articoli,
]));
} else {
@ -237,6 +237,28 @@ switch (post('op')) {
'_NUM_' => $n_art,
]));
break;
case 'change-um':
$um = post('um');
$n_articoli = 0;
foreach ($id_records as $id) {
$articolo = Articolo::find($id);
$articolo->um = $um;
$articolo->save();
++$n_articoli;
}
if ($n_articoli > 0) {
flash()->info(tr('Unità di misura cambiata a _NUM_ articoli!', [
'_NUM_' => $n_articoli,
]));
} else {
flash()->warning(tr('Nessun articolo modificato!'));
}
break;
}
@ -356,4 +378,15 @@ $operations['set-acquisto-ifzero'] = [
],
];
$operations['change-um'] = [
'text' => '<span><i class="fa fa-balance-scale"></i> '.tr('Aggiorna unità di misura').'</span>',
'data' => [
'title' => tr('Cambiare l\'unità di misura?'),
'msg' => tr('Per ciascun articolo selezionato, verrà modificata l\'unità di misura').'
<br><br>{[ "type": "select", "label": "'.tr('Unità di misura').'", "name": "um", "required": 1, "ajax-source": "misure" ]}',
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-warning',
],
];
return $operations;

View File

@ -114,10 +114,12 @@ echo '
<table id="table-serials" class="table table-striped table-hover table-condensed table-bordered text-center datatables">
<thead>
<tr>
<th id="th_Serial">'.tr('Serial').'</th>
<th id="th_Data di creazione">'.tr('Data di creazione').'</th>
<th id="th_Documento di vendita">'.tr('Documento di vendita').'</th>
<th id="th_Totale">'.tr('Totale').'</th>
<th>'.tr('Serial').'</th>
<th>'.tr('Data di creazione').'</th>
<th>'.tr('Documento di acquisto').'</th>
<th>'.tr('Prezzo di acquisto').'</th>
<th>'.tr('Documento di vendita').'</th>
<th>'.tr('Prezzo di vendita').'</th>
<th class="text-center">#</th>
</tr>
</thead>
@ -132,6 +134,91 @@ for ($i = 0; $i < count($rs2); ++$i) {
echo '
<td>'.Translator::timestampToLocale($rs2[$i]['created_at']).'</td>';
// Ricerca acquisti
$acquisti = $dbo->fetchArray('SELECT * FROM mg_prodotti WHERE dir=\'uscita\' AND id_articolo='.prepare($id_record).' AND (id_riga_documento IS NOT NULL OR id_riga_ordine IS NOT NULL OR id_riga_ddt IS NOT NULL) AND serial='.prepare($rs2[$i]['serial']));
if (!empty($acquisti)) {
echo '
<td>';
$totali = [];
foreach ($acquisti as $acquisto) {
// Acquistato su fatture
if (!empty($acquisto['id_riga_documento'])) {
$module_id = Modules::get('Fatture di acquisto')['id'];
// Ricerca vendite su fatture
$query = 'SELECT *, ( SELECT descrizione FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS tipo_documento, ( SELECT `dir` FROM co_tipidocumento WHERE id=(SELECT idtipodocumento FROM co_documenti WHERE id=iddocumento) ) AS `dir`, ( SELECT numero FROM co_documenti WHERE id=iddocumento ) AS numero, ( SELECT numero_esterno FROM co_documenti WHERE id=iddocumento ) AS numero_esterno, ( SELECT data FROM co_documenti WHERE id=iddocumento ) AS data FROM co_righe_documenti WHERE co_righe_documenti.id='.prepare($acquisto['id_riga_documento']);
$data = $dbo->fetchArray($query);
$id = $data[0]['iddocumento'];
}
// Acquistato su ddt
elseif (!empty($acquisto['id_riga_ddt'])) {
$module_id = Modules::get('Ddt di acquisto')['id'];
$query = 'SELECT *, ( SELECT descrizione FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS tipo_documento, ( SELECT `dir` FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS `dir`, ( SELECT numero FROM dt_ddt WHERE id=idddt ) AS numero, ( SELECT numero_esterno FROM dt_ddt WHERE id=idddt ) AS numero_esterno, ( SELECT data FROM dt_ddt WHERE id=idddt ) AS data FROM dt_righe_ddt WHERE dt_righe_ddt.id='.prepare($acquisto['id_riga_ddt']);
$data = $dbo->fetchArray($query);
$id = $data[0]['idddt'];
}
// Inserito su ordini
elseif (!empty($acquisto['id_riga_ordine'])) {
$module_id = Modules::get('Ordini cliente')['id'];
// Ricerca inserimenti su ordini
$query = 'SELECT *, ( SELECT descrizione FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS tipo_documento, ( SELECT `dir` FROM or_tipiordine WHERE id=(SELECT idtipoordine FROM or_ordini WHERE id=idordine) ) AS `dir`, ( SELECT numero FROM or_ordini WHERE id=idordine ) AS numero, ( SELECT numero_esterno FROM or_ordini WHERE id=idordine ) AS numero_esterno, ( SELECT data FROM or_ordini WHERE id=idordine ) AS data FROM or_righe_ordini WHERE or_righe_ordini.id='.prepare($acquisto['id_riga_ordine']);
$data = $dbo->fetchArray($query);
$id = $data[0]['idordine'];
}
$totali[] = [($data[0]['prezzo_unitario']-$data[0]['sconto_unitario']), $data[0]['iva_unitaria']];
$numero = !empty($data[0]['numero_esterno']) ? $data[0]['numero_esterno'] : $data[0]['numero'];
$text = tr('_DOC_ num. _NUM_ del _DATE_', [
'_DOC_' => $data[0]['tipo_documento'],
'_NUM_' => $numero,
'_DATE_' => Translator::dateToLocale($data[0]['data']),
]).(!empty($extra) ? ' '.$extra : '');
echo
Modules::link($module_id, $id, $text).'<br>';
}
echo '
</td>
<td class="text-center">';
foreach ($totali as $value) {
$subtotale = $value[0];
$iva = $value[1];
echo '
<span>'.moneyFormat($subtotale + $iva).'</span>';
if (!empty($subtotale) && !empty($iva)) {
echo '
<small style="color:#555;">('.Translator::numberToLocale($subtotale).' + '.Translator::numberToLocale($iva).')</small>';
}
echo '
<br>';
}
echo '
</td>';
}
// Non venduto
else {
echo '
<td></td>
<td></td>';
}
// Ricerca vendite
$vendite = $dbo->fetchArray('SELECT * FROM mg_prodotti WHERE dir=\'entrata\' AND id_articolo='.prepare($id_record).' AND serial='.prepare($rs2[$i]['serial']));
@ -155,7 +242,6 @@ for ($i = 0; $i < count($rs2); ++$i) {
// Venduto su ddt
elseif (!empty($vendita['id_riga_ddt'])) {
$numero = ($rs3[0]['numero_esterno'] != '') ? $rs3[0]['numero_esterno'] : $rs3[0]['numero'];
$module_id = Modules::get('Ddt di vendita')['id'];
$query = 'SELECT *, ( SELECT descrizione FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS tipo_documento, ( SELECT `dir` FROM dt_tipiddt WHERE id=(SELECT idtipoddt FROM dt_ddt WHERE id=idddt) ) AS `dir`, ( SELECT numero FROM dt_ddt WHERE id=idddt ) AS numero, ( SELECT numero_esterno FROM dt_ddt WHERE id=idddt ) AS numero_esterno, ( SELECT data FROM dt_ddt WHERE id=idddt ) AS data FROM dt_righe_ddt WHERE dt_righe_ddt.id='.prepare($vendita['id_riga_ddt']);
@ -186,15 +272,13 @@ for ($i = 0; $i < count($rs2); ++$i) {
$id = $data[0]['idintervento'];
$data[0]['tipo_documento'] = tr('Intervento').' '.$data[0]['codice'];
$data[0]['subtotale'] = $data[0]['prezzo_vendita'] * $data[0]['qta'];
$data[0]['iva'] = 0;
$extra = tr('(q.tà _QTA_)', [
'_QTA_' => $data[0]['qta'],
]);
}
$totali[] = [$data[0]['subtotale'], $data[0]['iva']];
$totali[] = [($data[0]['prezzo_unitario']-$data[0]['sconto_unitario']), $data[0]['iva_unitaria']];
$numero = !empty($data[0]['numero_esterno']) ? $data[0]['numero_esterno'] : $data[0]['numero'];
@ -202,10 +286,10 @@ for ($i = 0; $i < count($rs2); ++$i) {
'_DOC_' => $data[0]['tipo_documento'],
'_NUM_' => $numero,
'_DATE_' => Translator::dateToLocale($data[0]['data']),
]).(!empty($extra) ? ' '.$extra : '');
echo '
'.Modules::link($module_id, $id, $text).'<br>';
]).(!empty($extra) ? ' '.$extra : '');
echo
Modules::link($module_id, $id, $text).'<br>';
}
echo '
@ -236,13 +320,9 @@ for ($i = 0; $i < count($rs2); ++$i) {
else {
// Documento di vendita
echo '
<td></td>';
<td></td>
<td></td>
// Totale
echo '
<td></td>';
echo '
<td class="text-center">
<a class="btn btn-danger btn-sm ask" data-backto="record-edit" data-op="delprodotto" data-idprodotto="'.$rs2[$i]['id'].'">
<i class="fa fa-trash"></i>

View File

@ -355,9 +355,19 @@ if (!$block_edit) {
<a class="btn btn-sm btn-primary'.(!empty($ordini) ? '' : ' disabled').'" data-href="'.base_path().'/modules/ddt/add_ordine.php?id_module='.$id_module.'&id_record='.$id_record.'" data-toggle="modal" data-title="'.tr('Aggiungi Ordine').'">
<i class="fa fa-plus"></i> '.tr('Ordine').'
</a>';
// Lettura articoli
$art_query = 'SELECT id FROM mg_articoli WHERE attivo = 1 AND deleted_at IS NULL';
if ($dir == 'entrata' && !setting('Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita')) {
$art_query .= ' AND (qta > 0 OR servizio = 1)';
} else {
//Gli articoli possono essere creati al volo direttamente dal modale di aggiunta articolo
$art_query .= ' OR 1=1';
}
$articoli = $dbo->fetchNum($art_query);
echo '
<button type="button" class="btn btn-sm btn-primary tip" title="'.tr('Aggiungi articolo').'" onclick="gestioneArticolo(this)">
<button type="button" class="btn btn-sm btn-primary tip'.(!empty($articoli) ? '' : ' disabled').'" title="'.tr('Aggiungi articolo').'" onclick="gestioneArticolo(this)">
<i class="fa fa-plus"></i> '.tr('Articolo').'
</button>';

View File

@ -695,7 +695,7 @@ if (!$block_edit) {
// Lettura articoli
$art_query = 'SELECT id FROM mg_articoli WHERE attivo = 1 AND deleted_at IS NULL';
if ($dir == 'entrata') {
if ($dir == 'entrata' && !setting('Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita')) {
$art_query .= ' AND (qta > 0 OR servizio = 1)';
} else {
//Gli articoli possono essere creati al volo direttamente dal modale di aggiunta articolo
@ -781,7 +781,7 @@ if ($dir == 'uscita' && $fattura->isFE()) {
if (stored == null) {
div.addClass("alert-info").html("'.tr("Il file XML non contiene il nodo ''ImportoTotaleDocumento'': impossibile controllare corrispondenza dei totali").'.")
} else if (stored == calculated){
} else if (stored.toLocale() == calculated.toLocale()){
div.addClass("alert-success").html("'.tr('Il totale del file XML corrisponde a quello calcolato dal gestionale').'.")
} else {
div.addClass("alert-warning").html("'.tr('Il totale del file XML non corrisponde a quello calcolato dal gestionale: previsto _XML_, calcolato _CALC_ (differenza _DIFF_)', [

View File

@ -50,7 +50,7 @@ class Bollo
$righe_bollo = $this->fattura->getRighe()->filter(function ($item, $key) {
return $item->aliquota != null && in_array($item->aliquota->codice_natura_fe, ['N1', 'N2.1', 'N2.2', 'N3.1', 'N3.2', 'N3.3', 'N3.4', 'N3.5', 'N3.6', 'N4']);
});
$importo_righe_bollo = $righe_bollo->sum('netto');
$importo_righe_bollo = $righe_bollo->sum('totale_imponibile');
// Leggo la marca da bollo se c'è e se il netto a pagare supera la soglia
$bollo = ($this->fattura->direzione == 'uscita') ? $this->fattura->bollo : setting('Importo marca da bollo');

View File

@ -454,8 +454,15 @@ if (!$block_edit) {
</button>
</div>';
// Lettura articoli
$art_query = 'SELECT id FROM mg_articoli WHERE attivo = 1 AND deleted_at IS NULL';
if (!setting('Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita')) {
$art_query .= ' AND (qta > 0 OR servizio = 1)';
}
$articoli = $dbo->fetchNum($art_query);
echo '
<button type="button" class="btn btn-sm btn-primary tip" title="'.tr('Aggiungi articolo').'" onclick="gestioneArticolo(this)">
<button type="button" class="btn btn-sm btn-primary tip'.(!empty($articoli) ? '' : ' disabled').'" title="'.tr('Aggiungi articolo').'" onclick="gestioneArticolo(this)">
<i class="fa fa-plus"></i> '.tr('Articolo').'
</button>';

View File

@ -44,15 +44,15 @@ echo '
<div class="col-md-4">
{[ "type": "span", "label": "'.tr('Tecnico').'", "name": "tecnico", "required": 0, "value": "'.$sessione['ragione_sociale'].' '.(!empty($sessione['deleted_at']) ? '<small class="text-danger"><em>('.tr('Eliminato').')</em></small>' : '').'" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Tipo attività').'", "name": "idtipointerventot", "value": "'.$sessione['idtipointervento'].'", "required": 1, "values": "query=SELECT in_tipiintervento.idtipointervento AS id, descrizione, in_tariffe.costo_ore AS prezzo_ore_unitario, in_tariffe.costo_km AS prezzo_km_unitario, in_tariffe.costo_dirittochiamata AS prezzo_dirittochiamata FROM in_tipiintervento JOIN in_tariffe ON in_tipiintervento.idtipointervento = in_tariffe.idtipointervento WHERE in_tariffe.idtecnico = '.prepare($sessione['idtecnico']).' ORDER BY descrizione" ]}
</div>
</div>';
// Orari
echo '
<div class="row">
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Tipo attività').'", "name": "idtipointerventot", "value": "'.$sessione['idtipointervento'].'", "required": 1, "values": "query=SELECT in_tipiintervento.idtipointervento AS id, descrizione, in_tariffe.costo_ore AS prezzo_ore_unitario, in_tariffe.costo_km AS prezzo_km_unitario, in_tariffe.costo_dirittochiamata AS prezzo_dirittochiamata FROM in_tipiintervento JOIN in_tariffe ON in_tipiintervento.idtipointervento = in_tariffe.idtipointervento WHERE in_tariffe.idtecnico = '.prepare($sessione['idtecnico']).' ORDER BY descrizione" ]}
</div>
<div class="col-md-4">
{[ "type": "timestamp", "label": "'.tr('Inizio attività').'", "name": "orario_inizio", "required": 1, "value": "'.$sessione['orario_inizio'].'" ]}
</div>
@ -60,32 +60,10 @@ echo '
<div class="col-md-4">
{[ "type": "timestamp", "label": "'.tr('Fine attività').'", "name": "orario_fine", "required": 1, "value": "'.$sessione['orario_fine'].'" ]}
</div>
</div>';
echo '
<div class="row">';
// Km
echo '
<div class="col-md-4">
{[ "type": "number", "label": "'.tr('Km').'", "name": "km", "value": "'.$sessione['km'].'"]}
</div>';
$class = $show_costi ? '' : 'hide';
// Sconto ore
echo '
<div class="col-md-4 '.$class.'" >
{[ "type": "number", "label": "'.tr('Sconto ore').'", "name": "sconto", "value": "'.$sessione['sconto_unitario'].'", "icon-after": "choice|untprc|'.$sessione['tipo_sconto'].'"]}
</div>';
// Sconto km
echo '
<div class="col-md-4 '.$class.'">
{[ "type": "number", "label": "'.tr('Sconto km').'", "name": "sconto_km", "value": "'.$sessione['scontokm_unitario'].'", "icon-after": "choice|untprc|'.$sessione['tipo_sconto_km'].'"]}
</div>';
echo '
</div>
</div>
<div class="row">
@ -94,17 +72,31 @@ echo '
</div>
<div class="col-md-4 '.$class.'">
{[ "type": "number", "label": "'.tr('Addebito km').'", "name": "prezzo_km_unitario", "value": "'.$sessione['prezzo_km_unitario'].'" ]}
{[ "type": "number", "label": "'.tr('Addebito al km').'", "name": "prezzo_km_unitario", "value": "'.$sessione['prezzo_km_unitario'].'" ]}
</div>
<div class="col-md-4 '.$class.'">
{[ "type": "number", "label": "'.tr('Addebito diritto ch.').'", "name": "prezzo_dirittochiamata", "value": "'.$sessione['prezzo_dirittochiamata'].'" ]}
</div>
</div>
<div class="row">';
// Sconto ore
echo '
<div class="col-md-4 '.$class.'" >
{[ "type": "number", "label": "'.tr('Sconto orario').'", "name": "sconto", "value": "'.$sessione['sconto_unitario'].'", "icon-after": "choice|untprc|'.$sessione['tipo_sconto'].'"]}
</div>';
$class = $show_costi ? '' : 'hide';
// Sconto km
echo '
<div class="col-md-4 '.$class.'">
{[ "type": "number", "label": "'.tr('Sconto al km').'", "name": "sconto_km", "value": "'.$sessione['scontokm_unitario'].'", "icon-after": "choice|untprc|'.$sessione['tipo_sconto_km'].'"]}
</div>';
echo '
</div>';
echo '
</div>
<!-- PULSANTI -->
<div class="row">

View File

@ -68,15 +68,17 @@ class Sessione extends Model
$model->orario_inizio = $inizio;
$model->orario_fine = $fine;
// Sede secondaria
if (!empty($intervento['idsede_destinazione'])) {
$sede = database()->fetchOne('SELECT km FROM an_sedi WHERE id = '.prepare($intervento['idsede_destinazione']));
$km = $sede['km'];
}
if ($tipo_sessione->calcola_km) {
// Sede secondaria
if (!empty($intervento['idsede_destinazione'])) {
$sede = database()->fetchOne('SELECT km FROM an_sedi WHERE id = '.prepare($intervento['idsede_destinazione']));
$km = $sede['km'];
}
// Sede legale dell'anagrafica
else {
$km = $intervento->anagrafica->sedeLegale->km;
// Sede legale dell'anagrafica
else {
$km = $intervento->anagrafica->sedeLegale->km;
}
}
$model->km = empty($km) ? 0 : $km;

View File

@ -0,0 +1,37 @@
<?php
include_once __DIR__.'/../../core.php';
use Modules\Newsletter\Lista;
switch (post('op')) {
case 'aggiorna-liste':
foreach ($id_records as $id) {
$lista = Lista::find($id);
$query = $lista->query;
if (check_query($query)) {
$lista->query = html_entity_decode($query);
}
$lista->save();
}
flash()->info(tr('Liste aggiornate!'));
break;
}
$operations['aggiorna-liste'] = [
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Aggiorna liste').'</span>',
'data' => [
'msg' => tr(''),
'button' => tr('Procedi'),
'class' => 'btn btn-lg btn-danger',
],
];
return $operations;

View File

@ -26,6 +26,7 @@ use Modules\ListeNewsletter\Lista;
use Modules\Newsletter\Newsletter;
use Notifications\EmailNotification;
use PHPMailer\PHPMailer\Exception;
use Modules\Newsletter\Lista as ListaNewsletter;
include_once __DIR__.'/../../core.php';
@ -175,6 +176,15 @@ switch (filter('op')) {
// Selezione da lista newsletter
$id_list = post('id_list');
if (!empty($id_list)) {
//Aggiornamento della lista
$lista = ListaNewsletter::find($id_list);
$query = $lista->query;
if (check_query($query)) {
$lista->query = html_entity_decode($query);
}
$lista->save();
// Rimozione preventiva dei record duplicati dalla newsletter
$database->query('DELETE em_newsletter_receiver.* FROM em_newsletter_receiver
INNER JOIN em_list_receiver ON em_list_receiver.record_type = em_newsletter_receiver.record_type AND em_list_receiver.record_id = em_newsletter_receiver.record_id

View File

@ -24,6 +24,7 @@ include_once __DIR__.'/../../core.php';
switch (post('op')) {
case 'update':
$tipo->descrizione = post('descrizione');
$tipo->calcola_km = post('calcola_km');
$tipo->tempo_standard = post('tempo_standard');
$tipo->costo_orario = post('costo_orario');
@ -41,6 +42,7 @@ switch (post('op')) {
case 'add':
$codice = post('codice');
$tipo->calcola_km = post('calcola_km');
$descrizione = post('descrizione');
$tipo = Tipo::build($codice, $descrizione);

View File

@ -24,14 +24,18 @@ include_once __DIR__.'/../../core.php';
<input type="hidden" name="backto" value="record-edit">
<div class="row">
<div class="col-md-4">
<div class="col-md-2">
{[ "type": "text", "label": "<?php echo tr('Codice'); ?>", "name": "codice", "maxlength": 10, "class": "alphanumeric-mask", "required": 1 ]}
</div>
<div class="col-md-6">
<div class="col-md-5">
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1 ]}
</div>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Calcola km'); ?>", "id":"km", "name": "calcola_km", "help": "<?php echo tr('Flag per effettuare o meno il calcolo dei km percorsi tra sede azienda e sede cliente'); ?>.", "value": "1" ]}
</div>
<div class="col-md-2">
{[ "type": "number", "label": "<small><?php echo tr('Tempo standard'); ?></small>", "name": "tempo_standard", "help": "<?php echo tr('Valore compreso tra 0,25 - 24 ore. <br><small>Esempi: <em><ul><li>60 minuti = 1 ora</li><li>30 minuti = 0,5 ore</li><li>15 minuti = 0,25 ore</li></ul></em></small>'); ?>", "min-value": "0", "max-value": "24", "class": "text-center", "value": "$tempo_standard$", "icon-after": "ore" ]}
</div>

View File

@ -25,14 +25,18 @@ include_once __DIR__.'/../../core.php';
<input type="hidden" name="id_record" value="<?php echo $id_record; ?>">
<div class="row">
<div class="col-md-4">
<div class="col-md-3">
{[ "type": "span", "label": "<?php echo tr('Codice'); ?>", "name": "codice", "value": "$codice$" ]}
</div>
<div class="col-md-6">
<div class="col-md-5">
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": "$descrizione$" ]}
</div>
<div class="col-md-2">
{[ "type": "checkbox", "label": "<?php echo tr('Calcola km'); ?>", "name": "calcola_km", "help": "<?php echo tr('Specifica se inserire automaticamente i km percorsi tra sede azienda e sede cliente'); ?>.", "value": "$calcola_km$" ]}
</div>
<div class="col-md-2">
{[ "type": "number", "label": "<?php echo tr('Tempo standard'); ?>", "name": "tempo_standard", "help": "<?php echo tr('Valore compreso tra 0,25 - 24 ore. <br><small>Esempi: <em><ul><li>60 minuti = 1 ora</li><li>30 minuti = 0,5 ore</li><li>15 minuti = 0,25 ore</li></ul></em></small> Suggerisce il tempo solitamente impiegato per questa tipologia di attivita'); ?>.", "min-value": "0", "max-value": "24", "class": "text-center", "value": "$tempo_standard$", "icon-after": "ore" ]}
</div>

View File

@ -59,7 +59,10 @@ function compile(btn) {
return;
}
$("#id_tipo").selectSet(response.id_tipo);
if(!$("#id_tipo").val()) {
$("#id_tipo").selectSet(response.id_tipo);
}
$("#pagamento").selectSetNew(response.pagamento.id, response.pagamento.descrizione);
$("select[name^=iva]").each(function(){

View File

@ -204,9 +204,7 @@ class FatturaOrdinaria extends FatturaElettronica
// Nel caso il prezzo sia negativo viene gestito attraverso l'inversione della quantità (come per le note di credito)
// TODO: per migliorare la visualizzazione, sarebbe da lasciare negativo il prezzo e invertire gli sconti.
$prezzo = $riga['PrezzoUnitario'];
$prezzo = $riga['PrezzoUnitario'] < 0 ? -$prezzo : $prezzo;
$qta = $riga['Quantita'] ?: 1;
$qta = $riga['PrezzoUnitario'] < 0 ? -$qta : $qta;
// Prezzo e quantità
$obj->prezzo_unitario = $prezzo;
@ -309,7 +307,7 @@ class FatturaOrdinaria extends FatturaElettronica
$totali_righe = array_column($righe, 'PrezzoTotale');
$totale_righe = sum($totali_righe, null, 2);
$diff = abs($totale_righe) - abs($fattura->totale_imponibile);
$diff = round(abs($totale_righe) - abs($fattura->totale_imponibile), 2);
if (!empty($diff)) {
// Rimozione dell'IVA calcolata automaticamente dal gestionale
$iva_arrotondamento = database()->fetchOne('SELECT * FROM co_iva WHERE percentuale=0 AND deleted_at IS NULL');

View File

@ -46,9 +46,9 @@ FROM co_movimenti
INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id
INNER JOIN co_iva ON co_righe_documenti.idiva=co_iva.id
INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = co_documenti.idanagrafica
WHERE dir = '.prepare($dir).' AND idstatodocumento NOT IN (SELECT id FROM co_statidocumento WHERE descrizione="Bozza" OR descrizione="Annullata") AND is_descrizione = 0 AND co_documenti.data_registrazione >= '.prepare($date_start).' AND co_documenti.data_registrazione <= '.prepare($date_end).' AND '.((!empty($id_sezionale)) ? 'co_documenti.id_segment = '.prepare($id_sezionale).'' : '1=1').'
WHERE dir = '.prepare($dir).' AND idstatodocumento NOT IN (SELECT id FROM co_statidocumento WHERE descrizione="Bozza" OR descrizione="Annullata") AND is_descrizione = 0 AND co_documenti.data_competenza >= '.prepare($date_start).' AND co_documenti.data_competenza <= '.prepare($date_end).' AND '.((!empty($id_sezionale)) ? 'co_documenti.id_segment = '.prepare($id_sezionale).'' : '1=1').'
GROUP BY co_documenti.id, co_righe_documenti.idiva
ORDER BY CAST(co_documenti.'.(($dir == 'entrata') ? 'data' : 'numero').' AS '.(($dir == 'entrata') ? 'DATE' : 'UNSIGNED').'), co_documenti.'.(($dir == 'entrata') ? 'numero_esterno' : 'data_registrazione');
ORDER BY CAST(co_documenti.'.(($dir == 'entrata') ? 'data' : 'numero').' AS '.(($dir == 'entrata') ? 'DATE' : 'UNSIGNED').'), co_documenti.'.(($dir == 'entrata') ? 'numero_esterno' : 'data_competenza');
$records = $dbo->fetchArray($query);
// Sostituzioni specifiche

View File

@ -1,5 +1,5 @@
-- Rimosso il referente dalla lista sedi, per non mostrare sedi duplicate nella lista sedi
UPDATE `zz_plugins` SET `options` = ' { "main_query": [ { "type": "table", "fields": "Nome, Indirizzo, Città, CAP, Provincia", "query": "SELECT an_sedi.id, an_sedi.nomesede AS Nome, an_sedi.indirizzo AS Indirizzo, an_sedi.citta AS Città, an_sedi.cap AS CAP, an_sedi.provincia AS Provincia FROM an_sedi WHERE 1=1 AND an_sedi.idanagrafica=|idanagrafica| HAVING 2=2 ORDER BY an_sedi.id DESC"} ]}', `created_at` = NULL WHERE `zz_plugins`.`name` = 'Sedi';
UPDATE `zz_plugins` SET `options` = ' { "main_query": [ { "type": "table", "fields": "Nome, Indirizzo, Città, CAP, Provincia", "query": "SELECT an_sedi.id, an_sedi.nomesede AS Nome, an_sedi.indirizzo AS Indirizzo, an_sedi.citta AS Città, an_sedi.cap AS CAP, an_sedi.provincia AS Provincia FROM an_sedi WHERE 1=1 AND an_sedi.idanagrafica=|idanagrafica| HAVING 2=2 ORDER BY an_sedi.id DESC"} ]}' WHERE `zz_plugins`.`name` = 'Sedi';
-- Aggiunta possibilità di collegare allegati anche ai plugins
ALTER TABLE `zz_files` ADD `id_plugin` int(11) AFTER `id_module`;

5
update/2_4_28.sql Normal file
View File

@ -0,0 +1,5 @@
-- Aggiunto help per impostazione
UPDATE `zz_settings` SET `help` = 'Documenti di Vendita quali Fatture, DDT e Attività' WHERE `zz_settings`.`nome` = 'Permetti selezione articoli con quantità minore o uguale a zero in Documenti di Vendita';
ALTER TABLE `in_tipiintervento` ADD `calcola_km` TINYINT NOT NULL AFTER `costo_diritto_chiamata_tecnico`;
UPDATE `in_tipiintervento` SET `calcola_km`=1;