mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-02-17 03:51:06 +01:00
Merge branch 'master' of https://github.com/devcode-it/openstamanager
This commit is contained in:
commit
8460ee36b1
1
.gitignore
vendored
1
.gitignore
vendored
@ -76,7 +76,6 @@ package-lock.json
|
||||
assets/dist/
|
||||
backup/*
|
||||
!backup/.htaccess
|
||||
custom/
|
||||
files/*
|
||||
!files/.htaccess
|
||||
!files/impianti/
|
||||
|
@ -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.'%');
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
|
@ -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>';
|
||||
|
||||
|
@ -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_)', [
|
||||
|
@ -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');
|
||||
|
@ -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>';
|
||||
|
||||
|
@ -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">
|
||||
|
@ -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;
|
||||
|
37
modules/liste_newsletter/bulk.php
Executable file
37
modules/liste_newsletter/bulk.php
Executable 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;
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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(){
|
||||
|
@ -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');
|
||||
|
@ -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
|
||||
|
@ -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
5
update/2_4_28.sql
Normal 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;
|
Loading…
x
Reference in New Issue
Block a user