Compare commits

...

12 Commits

28 changed files with 147 additions and 92 deletions

View File

@ -195,3 +195,5 @@ Verificheremo se la pull request soddisferà i requisiti e, una volta approvata,
## Licenza ## Licenza
Questo progetto è tutelato dalla licenza [**GPL 3**](https://github.com/devcode-it/openstamanager/blob/master/LICENSE). Questo progetto è tutelato dalla licenza [**GPL 3**](https://github.com/devcode-it/openstamanager/blob/master/LICENSE).
Si richiede che qualsiasi distribuzione del software (o di sue versioni modificate) includa una copia del codice sorgente completo, una menzione adeguata al software originale **OpenSTAManager** e una copia della licenza GPL 3.

View File

@ -52,7 +52,7 @@ echo '
if ($options['dir'] == 'uscita' && $articolo->fattore_um_secondaria) { if ($options['dir'] == 'uscita' && $articolo->fattore_um_secondaria) {
echo ' echo '
<div class="col-md-3"> <div class="col-md-3">
{[ "type": "number", "label": "'.tr('Q.tà secondaria').'", "name": "fattore_um_secondaria", "value": "'.abs((float) $articolo->fattore_um_secondaria * $result['qta']).'", "icon-after": "'.$articolo->um_secondaria.'" ]} {[ "type": "number", "label": "'.tr('Q.tà secondaria').'", "name": "fattore_um_secondaria", "value": "'.abs((float) $articolo->fattore_um_secondaria * $result['qta']).'", "icon-after": "'.$articolo->um_secondaria.'", "decimals": "qta"]}
</div> </div>
<script> <script>

View File

@ -232,7 +232,7 @@ if (in_array($id_azienda, $tipi_anagrafica)) {
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Distanza'); ?>", "name": "km", "decimals":"1", "class": "text-center", "value": "$km$", "icon-after": "Km" ]} {[ "type": "number", "label": "<?php echo tr('Distanza'); ?>", "name": "km", "decimals": "qta", "class": "text-center", "value": "$km$", "icon-after": "Km" ]}
</div> </div>
</div> </div>

View File

@ -30,41 +30,55 @@ class Anagrafiche extends Resource implements RetrieveInterface, CreateInterface
{ {
public function retrieve($request) public function retrieve($request)
{ {
$table = '`an_anagrafiche`'; $table = 'an_anagrafiche';
$select = [ $select = [
'`an_anagrafiche`.*', 'an_anagrafiche.*',
'`an_nazioni_lang`.`title` AS nazione', 'an_nazioni_lang.title AS nazione',
]; ];
$joins[] = [ $joins[] = [
'an_nazioni_lang' => '`an_nazioni_lang`.`id_record` = `an_nazioni`.`id` AND `an_nazioni_lang`.`id_lang` = '.\Models\Locale::getDefault()->id, 'an_nazioni',
'an_nazioni.id',
'an_anagrafiche.id_nazione',
]; ];
$where[] = ['`an_anagrafiche`.`deleted_at`', '=', null]; $joins[] = [
'an_nazioni_lang',
'an_nazioni_lang.id_record',
'an_nazioni.id',
'an_nazioni_lang.id_lang',
\Models\Locale::getDefault()->id,
];
$order['`an_anagrafiche`.`ragione_sociale`'] = 'ASC'; $where[] = ['an_anagrafiche.deleted_at', '=', null];
$order['an_anagrafiche.ragione_sociale'] = 'ASC';
if ($request['resource'] != 'anagrafiche') { if ($request['resource'] != 'anagrafiche') {
$type = 'Cliente'; $type = 'Cliente';
$joins[] = [ $joins[] = [
'`an_tipianagrafiche_anagrafiche`', 'an_tipianagrafiche_anagrafiche',
'`an_anagrafiche`.`idanagrafica`', 'an_anagrafiche.idanagrafica',
'`an_tipianagrafiche_anagrafiche`.`idanagrafica`', 'an_tipianagrafiche_anagrafiche.idanagrafica',
]; ];
$joins[] = [ $joins[] = [
'`an_tipianagrafiche`', 'an_tipianagrafiche',
'`an_tipianagrafiche_anagrafiche`.`idtipoanagrafica`', 'an_tipianagrafiche_anagrafiche.idtipoanagrafica',
'`an_tipianagrafiche`.`id`', 'an_tipianagrafiche.id',
]; ];
$joins[] = [ $joins[] = [
'an_tipianagrafiche_lang' => '`an_tipianagrafiche_lang`.`idrecord` = `an_tipianagrafiche`.`id` AND `an_tipianagrafiche_lang`.`idlang` = '.\Models\Locale::getDefault()->id, 'an_tipianagrafiche_lang',
'an_tipianagrafiche_lang.id_record',
'an_tipianagrafiche.id',
'an_tipianagrafiche_lang.id_lang',
\Models\Locale::getDefault()->id,
'an_tipianagrafiche_lang.title',
''.$type.'',
]; ];
$where[] = ['`an_tipianagrafiche_lang`.`title`', '=', $type];
} }
return [ return [

View File

@ -33,39 +33,51 @@ class Articoli extends Resource implements RetrieveInterface, UpdateInterface, C
$table = 'mg_articoli'; $table = 'mg_articoli';
$select = [ $select = [
'mg_articoli.*', 'mg_articoli.*',
'`categorie`.`nome` AS categoria', 'categorie_lang.title AS categoria',
'`sottocategorie`.`nome` AS sottocategoria', 'sottocategorie_lang.title AS sottocategoria',
]; ];
$joins[] = [ $joins[] = [
'mg_articoli_lang' => 'mg_articoli_lang.id_record = mg_articoli.id AND mg_articoli_lang.id_lang = '.\Models\Locale::getDefault()->id, 'mg_articoli_lang',
'mg_articoli_lang.id_record',
'mg_articoli.id',
'mg_articoli_lang.id_lang',
\Models\Locale::getDefault()->id,
]; ];
$joins[] = [ $joins[] = [
'`mg_categorie` AS categorie', 'mg_categorie AS categorie',
'`mg_articoli`.`id_categoria`', 'mg_articoli.id_categoria',
'`categorie`.`id`', 'categorie.id',
]; ];
$joins[] = [ $joins[] = [
'mg_categorie_lang AS categorie_lang' => '`mg_categorie_lang`.`id_record` = `categorie`.`id` AND `mg_categorie_lang`.`id_lang` = '.\Models\Locale::getDefault()->id, 'mg_categorie_lang AS categorie_lang',
'categorie_lang.id_record',
'categorie.id',
'categorie_lang.id_lang',
\Models\Locale::getDefault()->id,
]; ];
$joins[] = [ $joins[] = [
'`mg_categorie` AS sottocategorie', 'mg_categorie AS sottocategorie',
'`mg_articoli`.`id_sottocategoria`', 'mg_articoli.id_sottocategoria',
'`sottocategorie`.`id`', 'sottocategorie.id',
]; ];
$joins[] = [ $joins[] = [
'`mg_categorie_lang` AS sottocategorie_lang' => '`mg_categorie_lang`.`id_record` = `sottocategorie`.`id` AND `mg_categorie_lang`.`id_lang` = '.\Models\Locale::getDefault()->id, 'mg_categorie_lang AS sottocategorie_lang',
'sottocategorie_lang.id_record',
'sottocategorie.id',
'sottocategorie_lang.id_lang',
\Models\Locale::getDefault()->id,
]; ];
$where[] = ['`mg_articoli`.`deleted_at`', '=', null]; $where[] = ['mg_articoli.deleted_at', '=', null];
$whereraw = []; $whereraw = [];
$order['`mg_articoli`.`id`'] = 'ASC'; $order['mg_articoli.id'] = 'ASC';
return [ return [
'table' => $table, 'table' => $table,

View File

@ -27,4 +27,3 @@ echo '
</form> </form>
<button type="button" class="btn btn-primary" onclick="if( confirm(\'Confermando, tutte le checklist degli impianti di questa categoria verranno aggiornate. Continuare?\') ){ $(\'#check-impianto\').submit(); }"> <i class="fa fa-refresh"></i> '.tr('Sincronizza checklist impianti').'</button>'; <button type="button" class="btn btn-primary" onclick="if( confirm(\'Confermando, tutte le checklist degli impianti di questa categoria verranno aggiornate. Continuare?\') ){ $(\'#check-impianto\').submit(); }"> <i class="fa fa-refresh"></i> '.tr('Sincronizza checklist impianti').'</button>';

View File

@ -138,7 +138,7 @@ foreach ($righe as $riga) {
// Quantità e unità di misura // Quantità e unità di misura
echo ' echo '
<td> <td>
{[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "<span class=\'tip\' title=\''.tr('Quantità evasa').' / '.tr('totale').': '.tr('_QTA_ / _TOT_', ['_QTA_' => numberFormat($riga->qta_evasa, 'qta'), '_TOT_' => numberFormat($riga->qta, 'qta')]).'\'>'.$riga->um.' <small><i class=\'text-muted fa fa-info-circle\'></i></small></span>", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'" ]} {[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "decimals": "qta", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "<span class=\'tip\' title=\''.tr('Quantità evasa').' / '.tr('totale').': '.tr('_QTA_ / _TOT_', ['_QTA_' => numberFormat($riga->qta_evasa, 'qta'), '_TOT_' => numberFormat($riga->qta, 'qta')]).'\'>'.$riga->um.' <small><i class=\'text-muted fa fa-info-circle\'></i></small></span>", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'" ]}
<div class="progress" style="height:4px;">'; <div class="progress" style="height:4px;">';
// Visualizzazione evasione righe per documento // Visualizzazione evasione righe per documento
$evasione_bar = []; $evasione_bar = [];

View File

@ -326,7 +326,7 @@ if ($dir == 'entrata') {
<div class="row"> <div class="row">
<div class="col-md-3"> <div class="col-md-3">
{[ "type": "number", "label": "'.tr('Peso').'", "name": "peso", "value": "$peso$", "readonly": "'.intval(empty($record['peso_manuale'])).'", "help": "'.tr('Il valore del campo Peso viene calcolato in automatico sulla base degli articoli inseriti nel documento, a meno dell\'impostazione di un valore manuale in questo punto').'" ]} {[ "type": "number", "label": "'.tr('Peso').'", "name": "peso", "value": "$peso$", "readonly": "'.intval(empty($record['peso_manuale'])).'", "help": "'.tr('Il valore del campo Peso viene calcolato in automatico sulla base degli articoli inseriti nel documento, a meno dell\'impostazione di un valore manuale in questo punto').'" ]}
<input type="hidden" id="peso_calcolato" name="peso_calcolato" value="'.$ddt->peso_calcolato.'"> <input type="hidden" id="peso_calcolato" name="peso_calcolato" value="'.$ddt->peso_calcolato.'", "decimals": "qta">
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
@ -335,7 +335,7 @@ if ($dir == 'entrata') {
<div class="col-md-3"> <div class="col-md-3">
{[ "type": "number", "label": "'.tr('Volume').'", "name": "volume", "value": "$volume$", "readonly": "'.intval(empty($record['volume_manuale'])).'", "help": "'.tr('Il valore del campo volume viene calcolato in automatico sulla base degli articoli inseriti nel documento, a meno dell\'impostazione di un valore manuale in questo punto').'" ]} {[ "type": "number", "label": "'.tr('Volume').'", "name": "volume", "value": "$volume$", "readonly": "'.intval(empty($record['volume_manuale'])).'", "help": "'.tr('Il valore del campo volume viene calcolato in automatico sulla base degli articoli inseriti nel documento, a meno dell\'impostazione di un valore manuale in questo punto').'" ]}
<input type="hidden" id="volume_calcolato" name="volume_calcolato" value="'.$ddt->volume_calcolato.'"> <input type="hidden" id="volume_calcolato" name="volume_calcolato" value="'.$ddt->volume_calcolato.'", "decimals": "qta">
</div> </div>
<div class="col-md-3"> <div class="col-md-3">

View File

@ -159,7 +159,7 @@ foreach ($righe as $riga) {
// Quantità e unità di misura // Quantità e unità di misura
echo ' echo '
<td> <td>
{[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "<span class=\'tip\' title=\''.tr('Quantità evasa').' / '.tr('totale').': '.tr('_QTA_ / _TOT_', ['_QTA_' => numberFormat($riga->qta_evasa, 'qta'), '_TOT_' => numberFormat($riga->qta, 'qta')]).'\'>'.$riga->um.' <small><i class=\'text-muted fa fa-info-circle\'></i></small></span>", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'" ]} {[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "<span class=\'tip\' title=\''.tr('Quantità evasa').' / '.tr('totale').': '.tr('_QTA_ / _TOT_', ['_QTA_' => numberFormat($riga->qta_evasa, 'qta'), '_TOT_' => numberFormat($riga->qta, 'qta')]).'\'>'.$riga->um.' <small><i class=\'text-muted fa fa-info-circle\'></i></small></span>", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'", "decimals": "qta" ]}
<div class="progress" style="height:4px;">'; <div class="progress" style="height:4px;">';
// Visualizzazione evasione righe per documento // Visualizzazione evasione righe per documento
$evasione_bar = []; $evasione_bar = [];

View File

@ -709,7 +709,8 @@ $operations['exportFE-bulk'] = [
], ],
]; ];
$operations['export-ricevute-bulk'] = [ if ($module->getTranslation('title') == 'Fatture di vendita') {
$operations['export-ricevute-bulk'] = [
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta ricevute').'</span>', 'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta ricevute').'</span>',
'data' => [ 'data' => [
'title' => '', 'title' => '',
@ -718,9 +719,9 @@ $operations['export-ricevute-bulk'] = [
'class' => 'btn btn-lg btn-warning', 'class' => 'btn btn-lg btn-warning',
'blank' => true, 'blank' => true,
], ],
]; ];
$operations['export-xml-bulk'] = [ $operations['export-xml-bulk'] = [
'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta XML').'</span>', 'text' => '<span class="'.((!extension_loaded('zip')) ? 'text-muted disabled' : '').'"><i class="fa fa-file-archive-o"></i> '.tr('Esporta XML').'</span>',
'data' => [ 'data' => [
'title' => '', 'title' => '',
@ -729,9 +730,8 @@ $operations['export-xml-bulk'] = [
'class' => 'btn btn-lg btn-warning', 'class' => 'btn btn-lg btn-warning',
'blank' => true, 'blank' => true,
], ],
]; ];
if ($module->getTranslation('title') == 'Fatture di vendita') {
$operations['genera-xml'] = [ $operations['genera-xml'] = [
'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Genera fatture elettroniche').'</span>', 'text' => '<span><i class="fa fa-file-code-o"></i> '.tr('Genera fatture elettroniche').'</span>',
'data' => [ 'data' => [

View File

@ -736,7 +736,7 @@ if ($record['descrizione_tipo'] == 'Fattura accompagnatoria di vendita') {
echo ' echo '
<div class="row"> <div class="row">
<div class="col-md-3"> <div class="col-md-3">
{[ "type": "number", "label": "'.tr('Peso').'", "name": "peso", "value": "$peso$", "readonly": "'.intval(empty($record['peso_manuale'])).'", "help": "'.tr('Il valore del campo Peso viene calcolato in automatico sulla base degli articoli inseriti nel documento, a meno dell\'impostazione di un valore manuale in questo punto').'" ]} {[ "type": "number", "label": "'.tr('Peso').'", "name": "peso", "value": "$peso$", "readonly": "'.intval(empty($record['peso_manuale'])).'", "help": "'.tr('Il valore del campo Peso viene calcolato in automatico sulla base degli articoli inseriti nel documento, a meno dell\'impostazione di un valore manuale in questo punto').'", "decimals": "qta" ]}
<input type="hidden" id="peso_calcolato" name="peso_calcolato" value="'.$fattura->peso_calcolato.'"> <input type="hidden" id="peso_calcolato" name="peso_calcolato" value="'.$fattura->peso_calcolato.'">
</div> </div>
@ -745,7 +745,7 @@ if ($record['descrizione_tipo'] == 'Fattura accompagnatoria di vendita') {
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
{[ "type": "number", "label": "'.tr('Volume').'", "name": "volume", "value": "$volume$", "readonly": "'.intval(empty($record['volume_manuale'])).'", "help": "'.tr('Il valore del campo Volume viene calcolato in automatico sulla base degli articoli inseriti nel documento, a meno dell\'impostazione di un valore manuale in questo punto').'" ]} {[ "type": "number", "label": "'.tr('Volume').'", "name": "volume", "value": "$volume$", "readonly": "'.intval(empty($record['volume_manuale'])).'", "help": "'.tr('Il valore del campo Volume viene calcolato in automatico sulla base degli articoli inseriti nel documento, a meno dell\'impostazione di un valore manuale in questo punto').'", "decimals": "qta" ]}
<input type="hidden" id="volume_calcolato" name="volume_calcolato" value="'.$fattura->volume_calcolato.'"> <input type="hidden" id="volume_calcolato" name="volume_calcolato" value="'.$fattura->volume_calcolato.'">
</div> </div>

View File

@ -219,7 +219,7 @@ foreach ($righe as $riga) {
// Quantità e unità di misura // Quantità e unità di misura
echo ' echo '
<td> <td>
{[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'" ]} {[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'", "decimals": "qta" ]}
</td>'; </td>';
if ($riga->isArticolo()) { if ($riga->isArticolo()) {

View File

@ -59,12 +59,12 @@ class CSV extends CSVImporter
'label' => 'Nome', 'label' => 'Nome',
], ],
[ [
'field' => 'cliente', 'field' => 'partita_iva',
'label' => 'Cliente', 'label' => 'Partita IVA cliente',
], ],
[ [
'field' => 'telefono', 'field' => 'codice_fiscale',
'label' => 'Telefono', 'label' => 'Codice Fiscale cliente',
], ],
[ [
'field' => 'categoria', 'field' => 'categoria',
@ -102,8 +102,10 @@ class CSV extends CSVImporter
$database = database(); $database = database();
$primary_key = $this->getPrimaryKey(); $primary_key = $this->getPrimaryKey();
if (!empty($record['telefono'])) { if (!empty($record['partita_iva'])) {
$anagrafica = Anagrafica::where('telefono', $record['telefono'])->first(); $anagrafica = Anagrafica::where('piva', '=', $record['partita_iva'])->first();
} elseif (!empty($record['codice_fiscale'])) {
$anagrafica = Anagrafica::where('codice_fiscale', '=', $record['codice_fiscale'])->first();
} }
if (!empty($anagrafica)) { if (!empty($anagrafica)) {
@ -229,11 +231,11 @@ class CSV extends CSVImporter
public static function getExample() public static function getExample()
{ {
return [ return [
['Matricola', 'Immagine', 'Import immagine', 'Nome', 'Cliente', 'Telefono', 'Categoria', 'Sottocategoria', 'Sede', 'Descrizione', 'Data installazione'], ['Matricola', 'Immagine', 'Import immagine', 'Nome', 'Partita IVA Cliente', 'Codice Fiscale Cliente', 'Categoria', 'Sottocategoria', 'Sede', 'Descrizione', 'Data installazione'],
['00001', 'https://openstamanager.com/moduli/budget/budget.webp', '2', 'Lavatrice', 'Mario Rossi', '+39 0429 60 25 12', 'Elettrodomestici', 'Marca1', '', '', '2023-01-01'], ['00001', 'https://openstamanager.com/moduli/budget/budget.webp', '2', 'Lavatrice', '123456789', '123456789', 'Elettrodomestici', 'Marca1', '', '', '2023-01-01'],
['00002', 'https://openstamanager.com/moduli/3cx/3cx.webp', '2', 'Caldaia', 'Mario Rossi', '+39 0429 60 25 12', 'Elettrodomestici', 'Marca2', '', '', '2023-03-06'], ['00002', 'https://openstamanager.com/moduli/3cx/3cx.webp', '2', 'Caldaia', '123456789', '123456789', 'Elettrodomestici', 'Marca2', '', '', '2023-03-06'],
['00003', 'https://openstamanager.com/moduli/disponibilita-tecnici/tecnici.webp', '2', 'Forno', 'Mario Rossi', '+39 0429 60 25 12', 'Elettrodomestici', 'Marca3', '', '', '2023-04-01'], ['00003', 'https://openstamanager.com/moduli/disponibilita-tecnici/tecnici.webp', '2', 'Forno', '123456789', '123456789', 'Elettrodomestici', 'Marca3', '', '', '2023-04-01'],
['00004', 'https://openstamanager.com/moduli/distinta-base/distinta.webp', '2', 'Lavastoviglie', 'Mario Rossi', '+39 0429 60 25 12', 'Elettrodomestici', 'Marca4', '', '', '2023-08-06'], ['00004', 'https://openstamanager.com/moduli/distinta-base/distinta.webp', '2', 'Lavastoviglie', '123456789', '123456789', 'Elettrodomestici', 'Marca4', '', '', '2023-08-06'],
]; ];
} }
} }

View File

@ -318,7 +318,6 @@ switch (post('op')) {
flash()->info(tr('Attività duplicate correttamente!')); flash()->info(tr('Attività duplicate correttamente!'));
break; break;
case 'delete-bulk': case 'delete-bulk':

View File

@ -72,7 +72,7 @@ echo '
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
{[ "type": "number", "label": "'.tr('Km').'", "name": "km", "value": "'.$sessione['km'].'"]} {[ "type": "number", "label": "'.tr('Km').'", "name": "km", "value": "'.$sessione['km'].'","decimals": "qta"]}
</div> </div>
</div> </div>

View File

@ -123,7 +123,7 @@ foreach ($righe as $riga) {
// Quantità e unità di misura // Quantità e unità di misura
echo ' echo '
<td> <td>
{[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "'.($riga->um ?: '&nbsp;').'", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'" ]} {[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-after": "'.($riga->um ?: '&nbsp;').'", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'","decimals": "qta" ]}
</td>'; </td>';
if ($show_prezzi) { if ($show_prezzi) {

View File

@ -51,7 +51,11 @@ class Interventi extends Resource implements RetrieveInterface, CreateInterface,
]; ];
$joins[] = [ $joins[] = [
'in_statiintervento_lang' => 'in_statiintervento_lang.id_record = in_statiintervento.id AND in_statiintervento_lang.id_lang = '.\Models\Locale::getDefault()->id, 'in_statiintervento_lang',
'in_statiintervento_lang.id_record',
'in_statiintervento.id',
'in_statiintervento_lang.id_lang',
\Models\Locale::getDefault()->id,
]; ];
$joins[] = [ $joins[] = [

View File

@ -44,8 +44,12 @@ class CSV extends CSVImporter
'primary_key' => true, 'primary_key' => true,
], ],
[ [
'field' => 'telefono', 'field' => 'partita_iva',
'label' => 'Telefono', 'label' => 'Partita IVA cliente',
],
[
'field' => 'codice_fiscale',
'label' => 'Codice Fiscale cliente',
], ],
[ [
'field' => 'data', 'field' => 'data',
@ -99,8 +103,10 @@ class CSV extends CSVImporter
$database = database(); $database = database();
$primary_key = $this->getPrimaryKey(); $primary_key = $this->getPrimaryKey();
if (!empty($record['telefono'])) { if (!empty($record['partita_iva'])) {
$anagrafica = Anagrafica::where('telefono', $record['telefono'])->first(); $anagrafica = Anagrafica::where('piva', '=', $record['partita_iva'])->first();
} elseif (!empty($record['codice_fiscale'])) {
$anagrafica = Anagrafica::where('codice_fiscale', '=', $record['codice_fiscale'])->first();
} }
if (!empty($record['impianto'])) { if (!empty($record['impianto'])) {
@ -187,9 +193,9 @@ class CSV extends CSVImporter
public static function getExample() public static function getExample()
{ {
return [ return [
['Codice', 'Telefono', 'Data', 'Data richiesta', 'Ora inizio', 'Ora fine', 'Tecnico', 'Tipo', 'Note', 'Impianto', 'Richiesta', 'Descrizione', 'Stato'], ['Codice', 'Partita IVA Cliente', 'Codice Fiscale Cliente', 'Data', 'Data richiesta', 'Ora inizio', 'Ora fine', 'Tecnico', 'Tipo', 'Note', 'Impianto', 'Richiesta', 'Descrizione', 'Stato'],
['00001/2024', '+39 0429 60 25 12', '07/11/2024', '03/11/2024', '8:30', '9:30', 'Stefano Bianchi', '', '', '12345-85A22', 'Manutenzione ordinaria', 'eseguito intervento di manutenzione', 'Da programmare'], ['00001/2024', '123456789', '123456789', '07/11/2024', '03/11/2024', '8:30', '9:30', 'Stefano Bianchi', '', '', '12345-85A22', 'Manutenzione ordinaria', 'eseguito intervento di manutenzione', 'Da programmare'],
['0002/2024', '+39 0429 60 25 12', '08/11/2024', '04/11/2024', '11:20', '', 'Stefano Bianchi', '', '', '12345-85B23', 'Manutenzione ordinaria', 'eseguito intervento di manutenzione', ''], ['0002/2024', '123456789', '123456789', '08/11/2024', '04/11/2024', '11:20', '', 'Stefano Bianchi', '', '', '12345-85B23', 'Manutenzione ordinaria', 'eseguito intervento di manutenzione', ''],
]; ];
} }
} }

View File

@ -212,7 +212,7 @@ foreach ($righe as $riga) {
// Quantità e unità di misura // Quantità e unità di misura
echo ' echo '
<td> <td>
{[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-before": "<span class=\'tip\' title=\''.($riga->confermato ? tr('Articolo confermato') : tr('Articolo non confermato')).'\'><i class=\''.($riga->confermato ? 'fa fa-check text-success' : 'fa fa-clock-o text-warning').'\'></i></span>", "icon-after": "<span class=\'tip\' title=\''.tr('Quantità evasa').' / '.tr('totale').': '.tr('_QTA_ / _TOT_', ['_QTA_' => numberFormat($riga->qta_evasa, 'qta'), '_TOT_' => numberFormat($riga->qta, 'qta')]).'\'>'.$riga->um.' <small><i class=\'text-muted fa fa-info-circle\'></i></small></span>", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'" ]} {[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-before": "<span class=\'tip\' title=\''.($riga->confermato ? tr('Articolo confermato') : tr('Articolo non confermato')).'\'><i class=\''.($riga->confermato ? 'fa fa-check text-success' : 'fa fa-clock-o text-warning').'\'></i></span>", "icon-after": "<span class=\'tip\' title=\''.tr('Quantità evasa').' / '.tr('totale').': '.tr('_QTA_ / _TOT_', ['_QTA_' => numberFormat($riga->qta_evasa, 'qta'), '_TOT_' => numberFormat($riga->qta, 'qta')]).'\'>'.$riga->um.' <small><i class=\'text-muted fa fa-info-circle\'></i></small></span>", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'", "decimals": "qta" ]}
<div class="progress" style="height:4px;">'; <div class="progress" style="height:4px;">';
// Visualizzazione evasione righe per documento // Visualizzazione evasione righe per documento
$evasione_bar = []; $evasione_bar = [];

View File

@ -168,7 +168,7 @@ foreach ($righe as $key => $riga) {
// Quantità e unità di misura // Quantità e unità di misura
echo ' echo '
<td class="text-center"> <td class="text-center">
{[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-before": "<span class=\'tip\' title=\''.($riga->confermato ? tr('Articolo confermato') : tr('Articolo non confermato')).'\'><i class=\''.($riga->confermato ? 'fa fa-check text-success' : 'fa fa-clock-o text-warning').'\'></i></span>", "icon-after": "<span class=\'tip\' title=\''.tr('Quantità evasa').' / '.tr('totale').': '.tr('_QTA_ / _TOT_', ['_QTA_' => numberFormat($riga->qta_evasa, 'qta'), '_TOT_' => numberFormat($riga->qta, 'qta')]).'\'>'.$riga->um.' <small><i class=\'text-muted fa fa-info-circle\'></i></small></span>", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'" ]} {[ "type": "number", "name": "qta_'.$riga->id.'", "value": "'.$riga->qta.'", "min-value": "0", "onchange": "aggiornaInline($(this).closest(\'tr\').data(\'id\'))", "icon-before": "<span class=\'tip\' title=\''.($riga->confermato ? tr('Articolo confermato') : tr('Articolo non confermato')).'\'><i class=\''.($riga->confermato ? 'fa fa-check text-success' : 'fa fa-clock-o text-warning').'\'></i></span>", "icon-after": "<span class=\'tip\' title=\''.tr('Quantità evasa').' / '.tr('totale').': '.tr('_QTA_ / _TOT_', ['_QTA_' => numberFormat($riga->qta_evasa, 'qta'), '_TOT_' => numberFormat($riga->qta, 'qta')]).'\'>'.$riga->um.' <small><i class=\'text-muted fa fa-info-circle\'></i></small></span>", "disabled": "'.($riga->isSconto() ? 1 : 0).'", "disabled": "'.($block_edit || $riga->isSconto()).'", "decimals": "qta" ]}
<div class="progress" style="height:4px;">'; <div class="progress" style="height:4px;">';
// Visualizzazione evasione righe per documento // Visualizzazione evasione righe per documento
$evasione_bar = []; $evasione_bar = [];

View File

@ -172,6 +172,13 @@ switch (post('op')) {
])); ]));
} }
// Se non sono stati inviati alcuni i solleciti, mostro un messaggio di avviso
if (!empty(array_diff($id_records, $list))) {
flash()->warning(tr('_NUM_ solleciti non sono stati inviati.', [
'_NUM_' => sizeof(array_diff($id_records, $list)),
]));
}
break; break;
} }
@ -212,7 +219,7 @@ $operations['send-sollecito'] = [
'text' => '<span><i class="fa fa-envelope"></i> '.tr('Invia mail sollecito').'</span>', 'text' => '<span><i class="fa fa-envelope"></i> '.tr('Invia mail sollecito').'</span>',
'data' => [ 'data' => [
'title' => tr('Inviare mail sollecito?'), 'title' => tr('Inviare mail sollecito?'),
'msg' => tr('Per ciascuna scadenza selezionata collegata ad una fattura di vendita, verrà inviata una mail con allegata la fattura di vendita corrispondente.<br>(Template utilizzato: Sollecito di pagamento raggruppato per anagrafica)'), 'msg' => tr('Per ciascuna rata scaduta selezionata collegata ad una fattura di vendita, verrà inviata una mail con allegata la fattura di vendita corrispondente.<br>(Template utilizzato: Sollecito di pagamento raggruppato per anagrafica)'),
'button' => tr('Invia'), 'button' => tr('Invia'),
'class' => 'btn btn-lg btn-warning', 'class' => 'btn btn-lg btn-warning',
], ],

View File

@ -69,7 +69,7 @@ echo '
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
{[ "type": "number", "label": "'.tr('Qta minima ordinabile').'", "name": "qta_minima", "required": 0, "value": "'.$fornitore['qta_minima'].'", "icon-after": "'.$articolo->um.'" ]} {[ "type": "number", "label": "'.tr('Qta minima ordinabile').'", "name": "qta_minima", "required": 0, "value": "'.$fornitore['qta_minima'].'", "icon-after": "'.$articolo->um.'","decimals": "qta" ]}
</div> </div>
<div class="col-md-6"> <div class="col-md-6">

View File

@ -138,7 +138,7 @@ echo '
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
{[ "type": "number", "label": "'.tr('Qta minima ordinabile').'", "name": "qta_minima", "required": 0, "value": "'.$fornitore['qta_minima'].'", "icon-after": "'.$articolo->um.'" ]} {[ "type": "number", "label": "'.tr('Qta minima ordinabile').'", "name": "qta_minima", "required": 0, "value": "'.$fornitore['qta_minima'].'", "icon-after": "'.$articolo->um.'", "decimals": "qta" ]}
</div> </div>
<div class="col-md-6"> <div class="col-md-6">

View File

@ -132,7 +132,7 @@ foreach ($righe as $riga) {
{[ "type": "number", "label": "'.tr('Q.tà per fattura').'", "class":"qta_fattura", "name": "qta['.$riga->id.']", "required": 1, "value": "1", "decimals": "qta", "min-value": "1", "icon-after":"'.tr('su _TOT_ totali', [ {[ "type": "number", "label": "'.tr('Q.tà per fattura').'", "class":"qta_fattura", "name": "qta['.$riga->id.']", "required": 1, "value": "1", "decimals": "qta", "min-value": "1", "icon-after":"'.tr('su _TOT_ totali', [
'_TOT_' => Translator::numberToLocale($riga->qta - $riga->qta_evasa), '_TOT_' => Translator::numberToLocale($riga->qta - $riga->qta_evasa),
]).'", "options":"'.str_replace('"', '\"', $options).'" ]} ]).'", "options":"'.str_replace('"', '\"', $options).'", "decimals": "qta" ]}
</div> </div>
<div class="col-md-3" id="totali_'.$riga->id.'"> <div class="col-md-3" id="totali_'.$riga->id.'">
</div> </div>

View File

@ -98,7 +98,7 @@ echo '
{[ "type": "select", "label": "'.tr('Zona').'", "name": "idzona", "ajax-source": "zone", "value": "$idzona$", "placeholder": "'.tr('Nessuna zona').'", "icon-after": "add|'.Module::where('name', 'Zone')->first()->id.'" ]} {[ "type": "select", "label": "'.tr('Zona').'", "name": "idzona", "ajax-source": "zone", "value": "$idzona$", "placeholder": "'.tr('Nessuna zona').'", "icon-after": "add|'.Module::where('name', 'Zone')->first()->id.'" ]}
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
{[ "type": "number", "label": "'.tr('Km').'", "name": "km", "value": "$km$" ]} {[ "type": "number", "label": "'.tr('Km').'", "name": "km", "value": "$km$", "decimals": "qta" ]}
</div> </div>
</div> </div>
<div class="row"> <div class="row">

View File

@ -180,7 +180,17 @@ class Manager
} }
foreach ($joins as $join) { foreach ($joins as $join) {
$query->leftJoin($join[0], $join[1], $join[2]); if (count($join) >= 3) {
$query->leftJoin($join[0], function($joinClause) use ($join) {
$joinClause->on($join[1], $join[2]);
// Aggiungi condizioni aggiuntive se ci sono abbastanza elementi in $join
if (isset($join[3])) {
$joinClause->whereRaw($join[3] . ' = ?', [$join[4]]);
}
});
}
} }
if (!empty($where)) { if (!empty($where)) {

View File

@ -282,7 +282,7 @@ class DefaultHandler implements HandlerInterface
// Gestione della precisione (numero specifico, oppure "qta" per il valore previsto nell'impostazione "Cifre decimali per quantità"). // Gestione della precisione (numero specifico, oppure "qta" per il valore previsto nell'impostazione "Cifre decimali per quantità").
$decimals = null; $decimals = null;
if (isset($values['decimals'])) { if (!empty($values['decimals'])) {
if (is_numeric($values['decimals'])) { if (is_numeric($values['decimals'])) {
$decimals = $values['decimals']; $decimals = $values['decimals'];
} elseif (string_starts_with($values['decimals'], 'qta')) { } elseif (string_starts_with($values['decimals'], 'qta')) {

View File

@ -20,7 +20,7 @@
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
use Models\Module; use Models\Module;
$dir = $_GET['dir']; $dir = filter('dir');
$id_sezionale = filter('id_sezionale'); $id_sezionale = filter('id_sezionale');
$sezionale = $dbo->fetchOne('SELECT `zz_segments_lang`.`title` FROM `zz_segments` LEFT JOIN `zz_segments_lang` ON (`zz_segments`.`id` = `zz_segments_lang`.`id_record` AND `zz_segments_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `zz_segments`.`id` = '.$id_sezionale)['name']; $sezionale = $dbo->fetchOne('SELECT `zz_segments_lang`.`title` FROM `zz_segments` LEFT JOIN `zz_segments_lang` ON (`zz_segments`.`id` = `zz_segments_lang`.`id_record` AND `zz_segments_lang`.`id_lang` = '.prepare(Models\Locale::getDefault()->id).') WHERE `zz_segments`.`id` = '.$id_sezionale)['name'];