diff --git a/composer.json b/composer.json index 907b70ae4..7c28d2fa3 100755 --- a/composer.json +++ b/composer.json @@ -38,7 +38,7 @@ "ifsnop/mysqldump-php": "^2.3", "illuminate/database": "^6.0", "intervention/image": "^2.3", - "league/csv": "^8.2", + "league/csv": "9.5.0", "league/oauth2-client": "^2.6", "league/oauth2-google": "^3.0", "maximebf/debugbar": "^1.15", diff --git a/include/common/importa.php b/include/common/importa.php index d42799440..8af3f8982 100755 --- a/include/common/importa.php +++ b/include/common/importa.php @@ -258,6 +258,19 @@ if (in_array($final_module['name'], ['Fatture di vendita', 'Fatture di acquisto' '; } +$has_serial = 0; +if (!empty($options['serials'])) { + foreach ($righe as $riga) { + if (!empty($riga['abilita_serial'])) { + $serials = $riga->serials ?: 0; + + if (!empty($serials)) { + $has_serial = 1; + } + } + } +} + // Righe del documento echo '
@@ -279,7 +292,7 @@ echo ' '.tr('Q.tà da evadere').' '.tr('Subtot.').''; -if (!empty($options['serials'])) { +if (!empty($has_serial)) { echo ' '.tr('Seriali').''; } @@ -322,6 +335,19 @@ foreach ($righe as $i => $riga) { echo ' '.nl2br($descrizione); + if ($riga->isArticolo() && !empty($riga->abilita_serial)) { + $serials = $riga->serials; + $mancanti = abs($riga->qta) - count($serials); + + if (!empty($mancanti)) { + echo ' +
'.tr('_NUM_ serial mancanti', [ + '_NUM_' => $mancanti, + ]).''; + } + } + + echo ' '; @@ -343,7 +369,7 @@ foreach ($righe as $i => $riga) { '; // Seriali - if (!empty($options['serials'])) { + if (!empty($has_serial)) { echo ' '; @@ -521,10 +547,10 @@ echo ' } $("input[name=righe]").each(function() { - ricalcolaTotaleRiga($(this).val()); + ricalcolaTotaleRiga($(this).val(), first = true); }); - function ricalcolaTotaleRiga(r) { + function ricalcolaTotaleRiga(r, first) { let prezzo_unitario = $("#prezzo_unitario_" + r).val(); let sconto = $("#sconto_unitario_" + r).val(); @@ -551,11 +577,12 @@ echo ' qta = 0; } - let serial_select = $("#serial_" + r); - serial_select.selectClear(); - serial_select.select2("destroy"); - serial_select.data("maximum", qta); - start_superselect(); + if (!first) { + let serial_select = $("#serial_" + r); + serial_select.selectClear(); + serial_select.data("maximum", qta); + initSelectInput("#serial_" + r); + } let subtotale = (prezzo_scontato * qta).toLocale(); diff --git a/mail.php b/mail.php index 8300dc7bb..2e81d86b6 100755 --- a/mail.php +++ b/mail.php @@ -28,16 +28,20 @@ $smtp = $template->account; $body = $module->replacePlaceholders($id_record, $template['body']); $subject = $module->replacePlaceholders($id_record, $template['subject']); -$emails = explode(';', $module->replacePlaceholders($id_record, '{email}')); +$emails = []; +if ($module->replacePlaceholders($id_record, '{email}')) { + $emails = explode(';', $module->replacePlaceholders($id_record, '{email}')); +} + $id_anagrafica = $module->replacePlaceholders($id_record, '{id_anagrafica}'); // Aggiungo email referenti in base alla mansione impostata nel template $mansioni = $dbo->select('em_mansioni_template', 'idmansione', ['id_template' => $template->id]); foreach ($mansioni as $mansione) { - $referenti = $dbo->select('an_referenti', 'email', ['idmansione' => $mansione['idmansione'], 'idanagrafica' => $id_anagrafica]); + $referenti = $dbo->table('an_referenti')->where('idmansione', $mansione['idmansione'])->where('idanagrafica', $id_anagrafica)->where('email', '!=', '')->get(); foreach ($referenti as $referente) { - if (!in_array($referente['email'], $emails)) { - $emails[] = $referente['email']; + if (!in_array($referente->email, $emails)) { + $emails[] = $referente->email; } } } @@ -101,6 +105,13 @@ echo ' {[ "type": "email", "name": "destinatari['.$idx++.']", "value": "'.$email.'", "icon-before": "choice|email", "extra": "onkeyup=\'aggiungiDestinatario();\'", "class": "destinatari", "required": 0 ]}
'; } + + if (empty($emails)) { + echo ' +
+ {[ "type": "email", "name": "destinatari['.$idx++.']", "value": "", "icon-before": "choice|email", "extra": "onkeyup=\'aggiungiDestinatario();\'", "class": "destinatari", "required": 0 ]} +
'; + } echo ' diff --git a/modules/anagrafiche/ajax/select.php b/modules/anagrafiche/ajax/select.php index 2d12a0b39..2e7c27501 100755 --- a/modules/anagrafiche/ajax/select.php +++ b/modules/anagrafiche/ajax/select.php @@ -356,8 +356,9 @@ switch ($resource) { * Opzioni utilizzate: * - idanagrafica */ + case 'dichiarazioni_intento': - $query = "SELECT id, CONCAT(CONCAT_WS(' - ', numero_protocollo, numero_progressivo), ' data di fine ', DATE_FORMAT(data_fine, '%d/%m/%Y')) AS descrizione FROM co_dichiarazioni_intento |where| ORDER BY data"; + $query = "SELECT id, CONCAT('Prot. ', numero_protocollo, ' con data fine ', DATE_FORMAT(data_fine, '%d/%m/%Y'),' - utilizzati ',REPLACE(REPLACE(REPLACE(FORMAT(SUM(totale),2), ',', '#'), '.', ','), '#', '.'), ' su ' , REPLACE(REPLACE(REPLACE(FORMAT(SUM(massimale),2), ',', '#'), '.', ','), '#', '.'), ' €' ) AS descrizione FROM co_dichiarazioni_intento |where| ORDER BY data"; foreach ($elements as $element) { $filter[] = 'id='.prepare($element); diff --git a/modules/articoli/actions.php b/modules/articoli/actions.php index 03a8c82a9..b083dc68b 100755 --- a/modules/articoli/actions.php +++ b/modules/articoli/actions.php @@ -58,8 +58,12 @@ switch (post('op')) { $articolo->barcode = post('barcode'); $articolo->threshold_qta = post('threshold_qta'); + $articolo->coefficiente = post('coefficiente'); + $articolo->idiva_vendita = post('idiva_vendita'); $articolo->prezzo_acquisto = post('prezzo_acquisto'); - $articolo->setPrezzoVendita(post('prezzo_vendita'), post('idiva_vendita')); + if (empty(post('coefficiente'))) { + $articolo->setPrezzoVendita(post('prezzo_vendita'), post('idiva_vendita')); + } $articolo->idconto_vendita = post('idconto_vendita'); $articolo->idconto_acquisto = post('idconto_acquisto'); $articolo->save(); @@ -116,6 +120,8 @@ switch (post('op')) { $articolo->abilita_serial = post('abilita_serial'); $articolo->ubicazione = post('ubicazione'); $articolo->threshold_qta = post('threshold_qta'); + $articolo->coefficiente = post('coefficiente'); + $articolo->idiva_vendita = post('idiva_vendita'); $articolo->prezzo_acquisto = post('prezzo_acquisto'); $articolo->idconto_vendita = post('idconto_vendita'); $articolo->idconto_acquisto = post('idconto_acquisto'); @@ -129,7 +135,9 @@ switch (post('op')) { $articolo->fattore_um_secondaria = post('fattore_um_secondaria'); $articolo->qta_multipla = post('qta_multipla'); - $articolo->setPrezzoVendita(post('prezzo_vendita'), post('idiva_vendita')); + if (empty(post('coefficiente'))) { + $articolo->setPrezzoVendita(post('prezzo_vendita'), post('idiva_vendita')); + } $componente = post('componente_filename'); $articolo->componente_filename = $componente; diff --git a/modules/articoli/add.php b/modules/articoli/add.php index d3ff9805d..c93d28f8c 100755 --- a/modules/articoli/add.php +++ b/modules/articoli/add.php @@ -19,6 +19,12 @@ include_once __DIR__.'/../../core.php'; +use Modules\Iva\Aliquota; + +$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA'); +$iva_predefinita = setting('Iva predefinita'); +$aliquota_predefinita = floatval(Aliquota::find($iva_predefinita)->percentuale); + ?>
@@ -63,16 +69,10 @@ include_once __DIR__.'/../../core.php';
- {[ "type": "number", "label": "", "name": "qta", "decimals": "qta" ]} + {[ "type": "number", "label": "", "name": "coefficiente", "help": "." ]}
- {[ "type": "number", "label": "", "name": "threshold_qta", "decimals": "qta", "min-value": "undefined" ]} -
- - -
-
", "name": "prezzo_vendita", "icon-after": "", "help": "" ]}
+ +
-
+
+
+ {[ "type": "number", "label": "", "name": "qta", "decimals": "qta" ]} +
+ +
+ {[ "type": "number", "label": "", "name": "threshold_qta", "decimals": "qta", "min-value": "undefined" ]} +
+ +
{[ "type": "select", "label": "", "name": "idiva_vendita", "ajax-source": "iva", "valore_predefinito": "Iva predefinita", "help": "" ]} + +
@@ -109,6 +122,9 @@ include_once __DIR__.'/../../core.php'; diff --git a/modules/articoli/bulk.php b/modules/articoli/bulk.php index 0b9da83b9..caa4d17ba 100644 --- a/modules/articoli/bulk.php +++ b/modules/articoli/bulk.php @@ -55,36 +55,59 @@ switch (post('op')) { $tipologia = post('tipologia'); $arrotondamento = post('arrotondamento'); $prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA'); + $articoli_coeff = 0; foreach ($id_records as $id) { $articolo = Articolo::find($id); - $prezzo_partenza = post('prezzo_partenza') == 'vendita' ? $articolo->prezzo_vendita : $articolo->prezzo_acquisto; - $aliquota_iva = floatval(Aliquota::find($articolo->idiva_vendita)->percentuale); - $new_prezzo_vendita = $prezzo_partenza + ($prezzo_partenza * $percentuale / 100); + if (empty((int)$articolo->coefficiente)) { + $prezzo_partenza = post('prezzo_partenza') == 'vendita' ? $articolo->prezzo_vendita : $articolo->prezzo_acquisto; + $aliquota_iva = floatval(Aliquota::find($articolo->idiva_vendita)->percentuale); - // Arrotondamento - if (!empty($tipologia) && !empty($arrotondamento)) { - if ($tipologia == 'ivato') { + $new_prezzo_vendita = $prezzo_partenza + ($prezzo_partenza * $percentuale / 100); + + // Arrotondamento + if (!empty($tipologia) && !empty($arrotondamento)) { + if ($tipologia == 'ivato') { + $new_prezzo_vendita = $new_prezzo_vendita + ($new_prezzo_vendita * $aliquota_iva / 100); + } + + $new_prezzo_vendita = ceil($new_prezzo_vendita / $arrotondamento) * $arrotondamento; + } + + if (in_array($tipologia, ['ivato', '']) && !$prezzi_ivati) { + $new_prezzo_vendita = $new_prezzo_vendita * 100 / (100 + $aliquota_iva); + } + + if (in_array($tipologia, ['imponibile', '']) && $prezzi_ivati) { $new_prezzo_vendita = $new_prezzo_vendita + ($new_prezzo_vendita * $aliquota_iva / 100); } - $new_prezzo_vendita = ceil($new_prezzo_vendita / $arrotondamento) * $arrotondamento; + $articolo->setPrezzoVendita($new_prezzo_vendita, $articolo->idiva_vendita); + $articolo->save(); + } else { + $articoli_coeff++; } - - if (in_array($tipologia, ['ivato', '']) && !$prezzi_ivati) { - $new_prezzo_vendita = $new_prezzo_vendita * 100 / (100 + $aliquota_iva); - } - - if (in_array($tipologia, ['imponibile', '']) && $prezzi_ivati) { - $new_prezzo_vendita = $new_prezzo_vendita + ($new_prezzo_vendita * $aliquota_iva / 100); - } - - $articolo->setPrezzoVendita($new_prezzo_vendita, $articolo->idiva_vendita); - $articolo->save(); } flash()->info(tr('Prezzi di vendita aggiornati!')); + flash()->warning(tr('_NUM_ prezzi di vendita non aggiornati per coefficiente impostato!', [ + '_NUM_' => $articoli_coeff, + ])); + + break; + + case 'change-coefficiente': + foreach ($id_records as $id) { + $articolo = Articolo::find($id); + $coefficiente = post('coefficiente'); + + $articolo->coefficiente = $coefficiente; + $articolo->prezzo_acquisto = $articolo->prezzo_acquisto; + $articolo->save(); + } + + flash()->info(tr('Coefficienti di vendita aggiornati!')); break; @@ -356,7 +379,7 @@ $operations['change-acquisto'] = [ 'text' => ' '.tr('Aggiorna prezzo di acquisto').'', 'data' => [ 'title' => tr('Aggiornare il prezzo di acquisto per gli articoli selezionati?'), - 'msg' => 'Per indicare uno sconto inserire la percentuale con il segno meno, al contrario per un rincaro inserire la percentuale senza segno.

{[ "type": "number", "label": "'.tr('Percentuale sconto/magg.').'", "name": "percentuale", "required": 1, "icon-after": "%" ]}', + 'msg' => tr('Per indicare uno sconto inserire la percentuale con il segno meno, al contrario per un rincaro inserire la percentuale senza segno.').'

{[ "type": "number", "label": "'.tr('Percentuale sconto/magg.').'", "name": "percentuale", "required": 1, "icon-after": "%" ]}', 'button' => tr('Procedi'), 'class' => 'btn btn-lg btn-warning', 'blank' => false, @@ -367,7 +390,7 @@ $operations['change-vendita'] = [ 'text' => ' '.tr('Aggiorna prezzo di vendita').'', 'data' => [ 'title' => tr('Aggiornare il prezzo di vendita per gli articoli selezionati?'), - 'msg' => 'Per indicare uno sconto inserire la percentuale con il segno meno, al contrario per un rincaro inserire la percentuale senza segno.

+ 'msg' => tr('Per indicare uno sconto inserire la percentuale con il segno meno, al contrario per un rincaro inserire la percentuale senza segno.').'

{[ "type": "select", "label": "'.tr('Partendo da:').'", "name": "prezzo_partenza", "required": 1, "values": "list=\"acquisto\":\"Prezzo di acquisto\",\"vendita\":\"Prezzo di vendita\"" ]}
{[ "type": "number", "label": "'.tr('Percentuale sconto/magg.').'", "name": "percentuale", "required": 1, "icon-after": "%" ]}
{[ "type": "select", "label": "'.tr('Arrotonda prezzo:').'", "name": "tipologia", "values": "list=\"0\":\"Non arrotondare\",\"imponibile\":\"Imponibile\",\"ivato\":\"Ivato\"", "value": 0 ]}
@@ -378,6 +401,17 @@ $operations['change-vendita'] = [ ], ]; +$operations['change-coefficiente'] = [ + 'text' => ' '.tr('Aggiorna coefficiente di vendita').'', + 'data' => [ + 'title' => tr('Aggiornare il coefficiente di vendita per gli articoli selezionati?'), + 'msg' => tr('Per ciascun articolo selezionato, verrà modificato il coefficiente e il relativo prezzo di vendita').'

{[ "type": "number", "label": "'.tr('Coefficiente di vendita').'", "name": "coefficiente", "required": 1 ]}', + 'button' => tr('Procedi'), + 'class' => 'btn btn-lg btn-warning', + 'blank' => false, + ], +]; + $operations['stampa-etichette'] = [ 'text' => ' '.tr('Stampa etichette').'', 'data' => [ diff --git a/modules/articoli/edit.php b/modules/articoli/edit.php index a5d01ed94..87df104fe 100755 --- a/modules/articoli/edit.php +++ b/modules/articoli/edit.php @@ -19,6 +19,8 @@ include_once __DIR__.'/../../core.php'; +use Modules\Iva\Aliquota; + ?>
@@ -162,11 +164,15 @@ include_once __DIR__.'/../../core.php';
-
+
{[ "type": "number", "label": "", "name": "prezzo_acquisto", "value": "$prezzo_acquisto$", "icon-after": "", "help": "." ]}
-
+
+ {[ "type": "number", "label": "", "name": "coefficiente", "value": "$coefficiente$", "help": "." ]} +
+ +
{[ "type": "number", "label": "", "name": "threshold_qta", "value": "$threshold_qta$", "decimals": "qta", "min-value": "undefined" ]}
@@ -215,21 +221,25 @@ include_once __DIR__.'/../../core.php';
percentuale); if (empty($prezzi_ivati)) { echo ' - '; } echo ' - {[ "type": "number", "label": "'.tr('Prezzo di vendita').'", "name": "prezzo_vendita", "value": "'.($prezzi_ivati ? $articolo->prezzo_vendita_ivato : $articolo->prezzo_vendita).'", "icon-after": "'.currency().'", "help": "'.($prezzi_ivati ? tr('Importo IVA inclusa') : '').'" ]} + {[ "type": "number", "label": "'.tr('Prezzo di vendita').'", "name": "prezzo_vendita", "value": "'.($prezzi_ivati ? $articolo->prezzo_vendita_ivato : $articolo->prezzo_vendita).'", "icon-after": "'.currency().'", "help": "'.($prezzi_ivati ? tr('Importo IVA inclusa') : '').'", "disabled": "'.(!empty((int)$articolo->coefficiente) ? 1 : 0).'" ]}
'; ?>
{[ "type": "select", "label": "", "name": "idiva_vendita", "ajax-source": "iva", "value": "$idiva_vendita$", "help": "" ]} + +
@@ -306,6 +316,48 @@ echo ' {( "name": "filelist_and_upload", "id_module": "$id_module$", "id_record": "$id_record$" )} diff --git a/modules/articoli/src/Articolo.php b/modules/articoli/src/Articolo.php index 0866cf5fd..816ac3bd3 100755 --- a/modules/articoli/src/Articolo.php +++ b/modules/articoli/src/Articolo.php @@ -142,6 +142,30 @@ class Articolo extends Model } } + /** + * Imposta il prezzo di acquisto e aggiorna il prezzo di vendita in base al coefficiente. + * + * @param $value + */ + public function setPrezzoAcquistoAttribute($value) + { + $this->attributes['prezzo_acquisto'] = $value; + + if (!empty($this->coefficiente)) { + $prezzo_vendita = $value * $this->coefficiente; + + $prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA'); + $id_iva = $this->idiva_vendita ?: setting('Iva predefinita'); + $percentuale_aliquota = floatval(Aliquota::find($id_iva)->percentuale); + + if ($prezzi_ivati) { + $prezzo_vendita = $prezzo_vendita * (1 + $percentuale_aliquota / 100); + } + + $this->setPrezzoVendita($prezzo_vendita, $this->idiva_vendita); + } + } + /** * Verifica se l'articolo corrente è una variante per una Combinazione. * diff --git a/modules/articoli/widgets/stampa_inventario.php b/modules/articoli/widgets/stampa_inventario.php index bbb8e53a5..a1040bd80 100755 --- a/modules/articoli/widgets/stampa_inventario.php +++ b/modules/articoli/widgets/stampa_inventario.php @@ -28,7 +28,7 @@ echo '
- {[ "type": "select", "label": "'.tr('Articoli da stampare').'", "name": "tipo", "required": "1", "values": "list=\"full\": \"'.tr('Tutti').'\", \"nozero\": \"'.tr('Solo esistenti').'\"", "value": "nozero" ]} + {[ "type": "select", "label": "'.tr('Articoli da stampare').'", "name": "tipo", "required": "1", "values": "list=\"full\": \"'.tr('Tutti').'\", \"nozero\": \"'.tr('Solo esistenti').'\"", "value": "nozero", "help": "'.tr("''Solo esistenti'' indica articoli (attivi o disattivi) con quantità totale maggiore di 0").'." ]}
diff --git a/modules/ddt/bulk.php b/modules/ddt/bulk.php index 9120c8a4e..905173e71 100755 --- a/modules/ddt/bulk.php +++ b/modules/ddt/bulk.php @@ -40,7 +40,7 @@ if (!isset($_SESSION['module_'.$id_fatture]['id_segment'])) { $_SESSION['module_'.$id_fatture]['id_segment'] = isset($segments[0]['id']) ? $segments[0]['id'] : null; } $id_segment = $_SESSION['module_'.$id_fatture]['id_segment']; -$idconto = setting('Conto predefinito fatture di vendita'); +$idconto = $module_fatture == 'Fatture di vendita' ? setting('Conto predefinito fatture di vendita') : setting('Conto predefinito fatture di acquisto'); $idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [ 'predefined' => 1, 'dir' => $dir, diff --git a/modules/ddt/edit.php b/modules/ddt/edit.php index 2f83e36d0..0925bec37 100755 --- a/modules/ddt/edit.php +++ b/modules/ddt/edit.php @@ -213,7 +213,6 @@ if (!empty($numero_previsto)) { '; + + +'; +//Dich. intento collegata +if ($dir == 'entrata' && !empty($fattura->dichiarazione)){ + + if ($fattura->stato->descrizione == 'Bozza'){ + + echo ' +
+ '.tr("La fattura è collegata ad una dichiarazione d'intento con diponibilità residura pari a _MONEY_.", [ '_MONEY_' => moneyFormat(abs($diff)),]).'
'.tr("Per collegare una riga alla dichiarazione è sufficiente specificare come IVA _IVA_", ['_IVA_' => '"'.$iva->codice.' - '.$iva->descrizione.'"',]).'. +
'; + + } + +} + +echo '
diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php index ff3a95c9c..b63f484fa 100755 --- a/modules/fatture/src/Fattura.php +++ b/modules/fatture/src/Fattura.php @@ -165,7 +165,7 @@ class Fattura extends Document $id_banca_azienda = $anagrafica->{'idbanca_'.$conto}; if (empty($id_banca_azienda)) { $azienda = Anagrafica::find(setting('Azienda predefinita')); - $id_banca_azienda = $database->fetchOne('SELECT id FROM co_banche WHERE id_pianodeiconti3 = (SELECT idconto_'.$conto.' FROM co_pagamenti WHERE id = :id_pagamento) AND id_anagrafica = :id_anagrafica', [ + $id_banca_azienda = $database->fetchOne('SELECT id FROM co_banche WHERE deleted_at IS NULL AND id_pianodeiconti3 = (SELECT idconto_'.$conto.' FROM co_pagamenti WHERE id = :id_pagamento) AND id_anagrafica = :id_anagrafica', [ ':id_pagamento' => $id_pagamento, ':id_anagrafica' => $azienda->id, ])['id']; @@ -210,6 +210,13 @@ class Fattura extends Document } $model->note = implode("\n", $notes); + + if ($tipo_documento->descrizione == 'Fattura accompagnatoria di vendita') { + $model->idporto = database()->fetchOne('SELECT id FROM dt_porto WHERE predefined = 1')['id']; + $model->idcausalet = database()->fetchOne('SELECT id FROM dt_causalet WHERE predefined = 1')['id']; + $model->idspedizione = database()->fetchOne('SELECT id FROM dt_spedizione WHERE predefined = 1')['id']; + } + $model->save(); return $model; diff --git a/modules/interventi/edit.php b/modules/interventi/edit.php index 814381f6d..836135e34 100755 --- a/modules/interventi/edit.php +++ b/modules/interventi/edit.php @@ -101,7 +101,7 @@ if (!empty($record['idcontratto'])) { } echo ' - {[ "type": "select", "label": "'.tr('Contratto').'", "name": "idcontratto", "value": "'.$record['id_contratto'].'", "ajax-source": "contratti", "select-options": '.json_encode(['idanagrafica' => $record['idanagrafica']]).', "readonly": "'.$record['flag_completato'].'" ]} + {[ "type": "select", "label": "'.tr('Contratto').'", "name": "idcontratto", "value": "'.$record['id_contratto'].'", "ajax-source": "contratti", "select-options": '.json_encode(['idanagrafica' => $record['idanagrafica']]).', "readonly": "'.$record['flag_completato'].'", "icon-after": "add|'.Modules::get('Contratti')['id'].'|pianificabile=1&idanagrafica='.$record['idanagrafica'].'" ]}
diff --git a/modules/spedizioni/edit.php b/modules/spedizioni/edit.php index 9dd222ceb..c099ab684 100755 --- a/modules/spedizioni/edit.php +++ b/modules/spedizioni/edit.php @@ -36,11 +36,11 @@ include_once __DIR__.'/../../core.php';
- {[ "type": "checkbox", "label": "", "name": "predefined", "value": "$predefined$", "help":"." ]} + {[ "type": "checkbox", "label": "", "name": "predefined", "value": "$predefined$", "help":"." ]}
- {[ "type": "checkbox", "label": "", "name": "esterno", "value": "$esterno$", "help":"." ]} + {[ "type": "checkbox", "label": "", "name": "esterno", "value": "$esterno$", "help":"." ]}
diff --git a/modules/stampe_contabili/actions.php b/modules/stampe_contabili/actions.php new file mode 100644 index 000000000..3dfbb378d --- /dev/null +++ b/modules/stampe_contabili/actions.php @@ -0,0 +1,53 @@ +. + */ + +include_once __DIR__.'/../../core.php'; + +switch (filter('op')) { + case 'crea_definitiva': + $year = date('Y', strtotime(post('date_start'))); + $print = Prints::render(post('id_print'), null, null, true); + $pages = count($print['pages']); + + $first_page = $dbo->fetchOne('SELECT MAX(last_page) AS last_page FROM co_stampecontabili WHERE `id_print`='.prepare(post('id_print')).' AND YEAR(`date_end`)='.prepare($year).' AND `dir`='.prepare(post('dir')))['last_page']+1; + $last_page = $first_page + $pages - 1; + + $result = $dbo->table('co_stampecontabili')->insertGetId([ + 'id_print' => post('id_print'), + 'date_start' => post('date_start'), + 'date_end' => post('date_end'), + 'first_page' => $first_page, + 'last_page' => $last_page, + 'dir' => post('dir'), + ]); + + $print = Prints::render(post('id_print'), null, null, true); + $name = 'Registro_iva_'.(post('dir') == 'entrata' ? 'vendite' : 'acquisti').'_del_'.post('date_start'); + $upload = Uploads::upload($print['pdf'], [ + 'name' => $name, + 'original_name' => $name.'.pdf', + 'category' => 'Generale', + 'id_module' => $id_module, + 'id_record' => $result, + ]); + + echo json_encode($result); + + break; +} diff --git a/modules/stampe_contabili/ajax/complete.php b/modules/stampe_contabili/ajax/complete.php new file mode 100644 index 000000000..7389c9f8f --- /dev/null +++ b/modules/stampe_contabili/ajax/complete.php @@ -0,0 +1,34 @@ +. + */ + +include_once __DIR__.'/../../../core.php'; + +switch ($resource) { + case 'controlla_stampa': + $date_start = get('date_start'); + $date_end = get('date_end'); + $id_print = get('id_print'); + $dir = get('dir'); + + $stampa_definitiva = $database->fetchOne('SELECT id FROM co_stampecontabili WHERE id_print='.prepare($id_print).' AND dir='.prepare($dir).' AND date_start='.prepare($date_start).' AND date_end='.prepare($date_end))['id']; + + echo json_encode($stampa_definitiva ?: 0); + + break; +} diff --git a/modules/stampe_contabili/stampe_contabili.php b/modules/stampe_contabili/stampe_contabili.php index 32606c1fc..e99bc0cba 100644 --- a/modules/stampe_contabili/stampe_contabili.php +++ b/modules/stampe_contabili/stampe_contabili.php @@ -19,36 +19,46 @@ include_once __DIR__.'/../../core.php'; +use Models\Module; + $id_record = filter('id_record'); $dir = filter('dir'); $nome_stampa = filter('nome_stampa'); +$id_print = $dbo->fetchOne('SELECT id FROM zz_prints WHERE name='.prepare($nome_stampa))['id']; +$id_module = Module::pool('Stampe contabili')->id; // Trovo id_print della stampa $link = Prints::getHref($nome_stampa, $id_record); echo ' -
+ + + +
'; - - if ($nome_stampa != 'Liquidazione IVA') { - echo ' + if ($nome_stampa != 'Liquidazione IVA') { + echo '
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_sezionale", "required": "1", "values": "query=SELECT id AS id, name AS descrizione FROM zz_segments WHERE id_module = (SELECT id FROM zz_modules WHERE name = \''.(($dir == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto').'\') AND is_fiscale = 1 UNION SELECT 0 AS id, \'Tutti i sezionali\' AS descrizione" ]}
'; - } - echo ' + } + echo '
- {[ "type": "date", "label": "'.tr('Data inizio').'", "required": "1", "name": "date_start", "value": "'.Translator::dateToLocale($_SESSION['period_start']).'" ]} + {[ "type": "date", "label": "'.tr('Data inizio').'", "required": "1", "name": "date_start", "value": "'.$_SESSION['period_start'].'" ]}
- {[ "type": "date", "label": "'.tr('Data fine').'", "required": "1", "name": "date_end", "value": "'.Translator::dateToLocale($_SESSION['period_end']).'" ]} + {[ "type": "date", "label": "'.tr('Data fine').'", "required": "1", "name": "date_end", "value": "'.$_SESSION['period_end'].'" ]}
'; -echo ' + echo '
{[ "type": "select", "label": "'.tr('Formato').'", "name": "format", "required": "1", "values": "list=\"A4\": \"'.tr('A4').'\", \"A3\": \"'.tr('A3').'\"", "value": "'.$_SESSION['stampe_contabili']['format'].'" ]} @@ -56,34 +66,180 @@ echo '
{[ "type": "select", "label": "'.tr('Orientamento').'", "name": "orientation", "required": "1", "values": "list=\"L\": \"'.tr('Orizzontale').'\", \"P\": \"'.tr('Verticale').'\"", "value": "'.$_SESSION['stampe_contabili']['orientation'].'" ]} -
+
'; + if ($nome_stampa != 'Liquidazione IVA') { + echo '
+ {[ "type": "checkbox", "label": "'.tr('Definitiva').'", "disabled": "1", "name": "definitiva", "help": "'.tr('Per abilitare il pulsante è necessario impostare nei campi Data inizio e Data fine uno dei 4 trimestri e non deve essere già stata creata la stampa definitiva del periodo selezionato').'" ]} +
'; + } + + echo ' +

 

-
-
+
'; -'; +if ($nome_stampa != 'Liquidazione IVA') { + $elementi = $dbo->fetchArray('SELECT * FROM co_stampecontabili WHERE date_end BETWEEN '.prepare($_SESSION['period_start']).' AND '.prepare($_SESSION['period_end']).' AND id_print='.prepare($id_print).' AND dir='.prepare($dir)); + echo ' +
+
+

'.tr('Stampe definitive registro iva _DIR_ dal _START_ al _END_', [ + '_DIR_' => $dir == 'entrata' ? 'vendite' : 'acquisti', + '_START_' => dateFormat($_SESSION['period_start']), + '_END_' => dateFormat($_SESSION['period_end']), + ]).'

+
+ +
+
+
+
    '; + + foreach ($elementi as $elemento) { + $descrizione = tr('Stampa definitiva dal _START_ al _END_ (_FIRST_-_LAST_)', [ + '_START_' => dateFormat($elemento['date_start']), + '_END_' => dateFormat($elemento['date_end']), + '_FIRST_' => $elemento['first_page'], + '_LAST_' => $elemento['last_page'], + ]); + + $file = $dbo->selectOne('zz_files', '*', ['id_module' => $id_module, 'id_record' => $elemento['id']]); + + echo ' +
  • + + + '.$descrizione.' +
  • '; + } + + if (empty($elementi)) { + echo '

    '.tr('Nessuna stampa presente').'

    '; + } + + echo ' +
+
+
'; + + echo ' + '; +} echo ' '; diff --git a/plugins/dichiarazioni_intento/add.php b/plugins/dichiarazioni_intento/add.php index df8e08c35..0ffcb4f70 100755 --- a/plugins/dichiarazioni_intento/add.php +++ b/plugins/dichiarazioni_intento/add.php @@ -25,6 +25,9 @@ echo ' + + +
@@ -40,18 +43,18 @@ echo '
- {[ "type": "date", "label": "'.tr('Data di ricezione').'", "name": "data", "required": 1, "value": "-now-" ]} + {[ "type": "date", "label": "'.tr('Data ricezione').'", "name": "data", "required": 1, "value": "-now-" ]}
- {[ "type": "date", "label": "'.tr('Data di inizio').'", "name": "data_inizio", "required": 1 ]} + {[ "type": "date", "label": "'.tr('Data inizio').'", "name": "data_inizio", "required": 1 ]}
- {[ "type": "date", "label": "'.tr('Data di fine').'", "name": "data_fine", "required": 1 ]} + {[ "type": "date", "label": "'.tr('Data fine').'", "name": "data_fine", "required": 1 ]}
diff --git a/plugins/dichiarazioni_intento/edit.php b/plugins/dichiarazioni_intento/edit.php index 65262552a..3d71ffc53 100755 --- a/plugins/dichiarazioni_intento/edit.php +++ b/plugins/dichiarazioni_intento/edit.php @@ -42,18 +42,18 @@ echo '
- {[ "type": "date", "label": "'.tr('Data di ricezione').'", "name": "data", "required": 1, "value": "'.$record['data'].'" ]} + {[ "type": "date", "label": "'.tr('Data ricezione').'", "name": "data", "required": 1, "value": "'.$record['data'].'" ]}
- {[ "type": "date", "label": "'.tr('Data di inizio').'", "name": "data_inizio", "required": 1, "value": "'.$record['data_inizio'].'" ]} + {[ "type": "date", "label": "'.tr('Data inizio').'", "name": "data_inizio", "required": 1, "value": "'.$record['data_inizio'].'" ]}
- {[ "type": "date", "label": "'.tr('Data di fine').'", "name": "data_fine", "required": 1, "value": "'.$record['data_fine'].'" ]} + {[ "type": "date", "label": "'.tr('Data fine').'", "name": "data_fine", "required": 1, "value": "'.$record['data_fine'].'" ]}
@@ -61,7 +61,7 @@ echo '
- {[ "type": "date", "label": "'.tr('Data di emissione').'", "name": "data_emissione", "value": "'.$record['data_emissione'].'", "required": 1 ]} + {[ "type": "date", "label": "'.tr('Data emissione').'", "name": "data_emissione", "value": "'.$record['data_emissione'].'", "required": 1 ]}
diff --git a/plugins/importFE/actions.php b/plugins/importFE/actions.php index b63ff03c8..7a2064459 100755 --- a/plugins/importFE/actions.php +++ b/plugins/importFE/actions.php @@ -19,6 +19,7 @@ include_once __DIR__.'/../../core.php'; +use Carbon\Carbon; use Modules\DDT\DDT; use Modules\Ordini\Ordine; use Modules\Fatture\Fattura; @@ -228,15 +229,6 @@ switch (filter('op')) { }); $id_tipo = $tipi->sort()->keys()->last(); - // Ricerca del tipo di pagamento più utilizzato - $pagamenti = $fatture->mapToGroups(function ($item, $key) { - return [$item->pagamento->id => $item->pagamento]; - }); - $id_pagamento = $pagamenti->map(function ($item, $key) { - return $item->count(); - })->sort()->keys()->last(); - $pagamento = $pagamenti[$id_pagamento]->first(); - // Ricerca del conto più utilizzato $conti = $righe->groupBy(function ($item, $key) { return $item->idconto; @@ -289,10 +281,40 @@ switch (filter('op')) { $results = []; + // Dati ordini + $DatiOrdini = $fattura_pa->getBody()['DatiGenerali']['DatiOrdineAcquisto']; + $DatiDDT = $fattura_pa->getBody()['DatiGenerali']['DatiDDT']; + + + // Riorganizzazione dati ordini per numero di riga + $dati_ordini = []; + foreach ($DatiOrdini as $dato) { + foreach ($dato['RiferimentoNumeroLinea'] as $dati => $linea) { + $dati_ordini[(int)$linea] = [ + 'numero' => $dato['IdDocumento'], + 'anno' => ( new Carbon($dato['Data']) )->format('Y'), + ]; + } + } + + // Riorganizzazione dati ordini per numero di riga + $dati_ddt = []; + foreach ($DatiDDT as $dato) { + foreach ($dato['RiferimentoNumeroLinea'] as $dati => $linea) { + $dati_ddt[(int)$linea] = [ + 'numero' => $dato['NumeroDDT'], + 'anno' => ( new Carbon($dato['DataDDT']) )->format('Y'), + ]; + } + } + // Iterazione sulle singole righe $righe = $fattura_pa->getRighe(); foreach ($righe as $key => $riga) { $collegamento = null; + $match_documento_da_fe = true; + + $numero_linea = (int)$riga['NumeroLinea']; // Visualizzazione codici articoli $codici = $riga['CodiceArticolo'] ?: []; @@ -303,10 +325,18 @@ switch (filter('op')) { foreach ($codici as $codice) { if (!empty($anagrafica) && empty($id_articolo)) { $id_articolo = $database->fetchOne('SELECT id_articolo AS id FROM mg_fornitore_articolo WHERE codice_fornitore = '.prepare($codice['CodiceValore']).' AND id_fornitore = '.prepare($anagrafica->id))['id']; + + if (empty($id_articolo)) { + $id_articolo = $database->fetchOne('SELECT id_articolo AS id FROM mg_fornitore_articolo WHERE REPLACE(codice_fornitore, " ", "") = '.prepare($codice['CodiceValore']).' AND id_fornitore = '.prepare($anagrafica->id))['id']; + } } if (empty($id_articolo)) { - $id_articolo = $database->fetchOne('SELECT id FROM mg_articoli WHERE codice = '.prepare($codice['CodiceValore']))['id']; + $id_articolo = $database->fetchOne('SELECT id FROM mg_articoli WHERE codice = '.prepare($codice['CodiceValore']).' AND deleted_at IS NULL')['id']; + + if (empty($id_articolo)) { + $id_articolo = $database->fetchOne('SELECT id FROM mg_articoli WHERE REPLACE(codice, " ", "") = '.prepare($codice['CodiceValore']).' AND deleted_at IS NULL')['id']; + } } if (!empty($id_articolo)) { @@ -314,46 +344,126 @@ switch (filter('op')) { } } + // Se nella fattura elettronica è indicato un DDT cerco quel documento specifico + $ddt = $dati_ddt[$numero_linea]; $query = "SELECT dt_righe_ddt.id, dt_righe_ddt.idddt AS id_documento, dt_righe_ddt.is_descrizione, dt_righe_ddt.idarticolo, dt_righe_ddt.is_sconto, 'ddt' AS ref, - CONCAT('DDT num. ', IF(numero_esterno != '', numero_esterno, numero), ' del ', DATE_FORMAT(data, '%d/%m/%Y'), ' [', (SELECT descrizione FROM dt_statiddt WHERE id = idstatoddt) , ']') AS opzione - FROM dt_righe_ddt - INNER JOIN dt_ddt ON dt_ddt.id = dt_righe_ddt.idddt - WHERE dt_ddt.idanagrafica = ".prepare($anagrafica->id)." AND |where_ddt| + CONCAT('DDT num. ', IF(numero_esterno != '', numero_esterno, numero), ' del ', DATE_FORMAT(data, '%d/%m/%Y'), ' [', (SELECT descrizione FROM dt_statiddt WHERE id = idstatoddt) , ']') AS opzione + FROM dt_righe_ddt + INNER JOIN dt_ddt ON dt_ddt.id = dt_righe_ddt.idddt + WHERE + dt_ddt.numero_esterno = ".prepare($ddt['numero'])." + AND + YEAR(dt_ddt.data) = ".prepare($ddt['anno'])." + AND + dt_ddt.idanagrafica = ".prepare($anagrafica->id)." + AND + |where|"; - UNION SELECT or_righe_ordini.id, or_righe_ordini.idordine AS id_documento, or_righe_ordini.is_descrizione, or_righe_ordini.idarticolo, or_righe_ordini.is_sconto, 'ordine' AS ref, - CONCAT('Ordine num. ', IF(numero_esterno != '', numero_esterno, numero), ' del ', DATE_FORMAT(data, '%d/%m/%Y'), ' [', (SELECT descrizione FROM or_statiordine WHERE id = idstatoordine) , ']') AS opzione - FROM or_righe_ordini - INNER JOIN or_ordini ON or_ordini.id = or_righe_ordini.idordine - WHERE or_ordini.idanagrafica = ".prepare($anagrafica->id).' AND |where_ordini|'; - - // Ricerca di righe DDT/Ordine con stesso Articolo + // Ricerca di righe DDT con stesso Articolo if (!empty($id_articolo)) { $query_articolo = replace($query, [ - '|where_ddt|' => 'dt_righe_ddt.idarticolo = '.prepare($id_articolo), - '|where_ordini|' => 'or_righe_ordini.idarticolo = '.prepare($id_articolo), + '|where|' => 'dt_righe_ddt.idarticolo = '.prepare($id_articolo), ]); $collegamento = $database->fetchOne($query_articolo); } - // Ricerca di righe DDT/Ordine per stessa descrizione + // Ricerca di righe DDT per stessa descrizione if (empty($collegamento)) { + $match_documento_da_fe = false; $query_descrizione = replace($query, [ - '|where_ddt|' => 'dt_righe_ddt.descrizione = '.prepare($riga['Descrizione']), - '|where_ordini|' => 'or_righe_ordini.descrizione = '.prepare($riga['Descrizione']), + '|where|' => 'dt_righe_ddt.descrizione = '.prepare($riga['Descrizione']), ]); $collegamento = $database->fetchOne($query_descrizione); } - // Ricerca di righe DDT/Ordine per stesso importo - if (empty($collegamento)) { - $query_descrizione = replace($query, [ - '|where_ddt|' => 'dt_righe_ddt.prezzo_unitario = '.prepare($riga['PrezzoUnitario']), - '|where_ordini|' => 'or_righe_ordini.prezzo_unitario = '.prepare($riga['PrezzoUnitario']), - ]); - $collegamento = $database->fetchOne($query_descrizione); + // Se nella fattura elettronica NON è indicato un DDT ed è indicato anche un ordine + // cerco per quell'ordine + if (empty($collegamento)) { + $ordine = $dati_ordini[$numero_linea]; + $query = "SELECT or_righe_ordini.id, or_righe_ordini.idordine AS id_documento, or_righe_ordini.is_descrizione, or_righe_ordini.idarticolo, or_righe_ordini.is_sconto, 'ordine' AS ref, + CONCAT('Ordine num. ', IF(numero_esterno != '', numero_esterno, numero), ' del ', DATE_FORMAT(data, '%d/%m/%Y'), ' [', (SELECT descrizione FROM or_statiordine WHERE id = idstatoordine) , ']') AS opzione + FROM or_righe_ordini + INNER JOIN or_ordini ON or_ordini.id = or_righe_ordini.idordine + WHERE + or_ordini.numero_esterno = ".prepare($ddt['numero'])." + AND + YEAR(or_ordini.data) = ".prepare($ddt['anno'])." + AND + or_ordini.idanagrafica = ".prepare($anagrafica->id)." + AND + |where|"; + + // Ricerca di righe Ordine con stesso Articolo + if (!empty($id_articolo)) { + $query_articolo = replace($query, [ + '|where|' => 'or_righe_ordini.idarticolo = '.prepare($id_articolo), + ]); + + $collegamento = $database->fetchOne($query_articolo); + } + + // Ricerca di righe Ordine per stessa descrizione + if (empty($collegamento)) { + $query_descrizione = replace($query, [ + '|where|' => 'or_righe_ordini.descrizione = '.prepare($riga['Descrizione']), + ]); + + $collegamento = $database->fetchOne($query_descrizione); + } + } + + + /** + * TENTATIVO 2: ricerca solo per articolo o descrizione su documenti + * non referenziati nella fattura elettronica + */ + // Se non ci sono Ordini o DDT cerco per contenuto + if (empty($collegamento)) { + $match_documento_da_fe = false; + $query = "SELECT dt_righe_ddt.id, dt_righe_ddt.idddt AS id_documento, dt_righe_ddt.is_descrizione, dt_righe_ddt.idarticolo, dt_righe_ddt.is_sconto, 'ddt' AS ref, + CONCAT('DDT num. ', IF(numero_esterno != '', numero_esterno, numero), ' del ', DATE_FORMAT(data, '%d/%m/%Y'), ' [', (SELECT descrizione FROM dt_statiddt WHERE id = idstatoddt) , ']') AS opzione + FROM dt_righe_ddt + INNER JOIN dt_ddt ON dt_ddt.id = dt_righe_ddt.idddt + WHERE dt_ddt.idanagrafica = ".prepare($anagrafica->id)." AND |where_ddt| + + UNION SELECT or_righe_ordini.id, or_righe_ordini.idordine AS id_documento, or_righe_ordini.is_descrizione, or_righe_ordini.idarticolo, or_righe_ordini.is_sconto, 'ordine' AS ref, + CONCAT('Ordine num. ', IF(numero_esterno != '', numero_esterno, numero), ' del ', DATE_FORMAT(data, '%d/%m/%Y'), ' [', (SELECT descrizione FROM or_statiordine WHERE id = idstatoordine) , ']') AS opzione + FROM or_righe_ordini + INNER JOIN or_ordini ON or_ordini.id = or_righe_ordini.idordine + WHERE or_ordini.idanagrafica = ".prepare($anagrafica->id).' AND |where_ordini|'; + + // Ricerca di righe DDT/Ordine con stesso Articolo + if (!empty($id_articolo)) { + $query_articolo = replace($query, [ + '|where_ddt|' => 'dt_righe_ddt.idarticolo = '.prepare($id_articolo), + '|where_ordini|' => 'or_righe_ordini.idarticolo = '.prepare($id_articolo), + ]); + + $collegamento = $database->fetchOne($query_articolo); + } + + // Ricerca di righe DDT/Ordine per stessa descrizione + if (empty($collegamento)) { + $query_descrizione = replace($query, [ + '|where_ddt|' => 'dt_righe_ddt.descrizione = '.prepare($riga['Descrizione']), + '|where_ordini|' => 'or_righe_ordini.descrizione = '.prepare($riga['Descrizione']), + ]); + + $collegamento = $database->fetchOne($query_descrizione); + } + + // Ricerca di righe DDT/Ordine per stesso importo + if (empty($collegamento)) { + $query_descrizione = replace($query, [ + '|where_ddt|' => 'dt_righe_ddt.prezzo_unitario = '.prepare($riga['PrezzoUnitario']), + '|where_ordini|' => 'or_righe_ordini.prezzo_unitario = '.prepare($riga['PrezzoUnitario']), + ]); + + $collegamento = $database->fetchOne($query_descrizione); + } } if (!empty($collegamento)) { @@ -383,6 +493,7 @@ switch (filter('op')) { 'id' => $collegamento['id_documento'], 'descrizione' => reference($documento, tr('Origine')), 'opzione' => $collegamento['opzione'], + 'match_documento_da_fe' => $match_documento_da_fe, ], 'riga' => [ 'tipo' => get_class($riga), diff --git a/plugins/importFE/buttons.php b/plugins/importFE/buttons.php index 1075a2896..67910eef7 100755 --- a/plugins/importFE/buttons.php +++ b/plugins/importFE/buttons.php @@ -106,11 +106,13 @@ function compilaRiferimenti(btn) { return; } - for (const [id_riga, data] of response.entries()) { - // Selezione dinamica - $("#selezione_riferimento" + id_riga).selectSetNew(data.documento.id, data.documento.opzione); + for (id_riga in response) { + data = response[id_riga]; - // Impostazione del riferiment + // Selezione dinamica + $("#selezione_riferimento" + id_riga).addClass("already-loaded").selectSetNew(data.documento.id, data.documento.opzione).removeClass("already-loaded"); + + // Impostazione del riferimento impostaRiferimento(id_riga, data.documento, data.riga); } }, diff --git a/plugins/importFE/generate.php b/plugins/importFE/generate.php index f43ff33f7..52af2f8fe 100755 --- a/plugins/importFE/generate.php +++ b/plugins/importFE/generate.php @@ -18,6 +18,7 @@ */ use Carbon\Carbon; +use Modules\Pagamenti\Pagamento; use Plugins\ImportFE\FatturaElettronica; include_once __DIR__.'/../../core.php'; @@ -262,6 +263,7 @@ echo '
'; // Pagamento +$pagamento = Pagamento::where('codice_modalita_pagamento_fe', $codice_modalita_pagamento)->where('predefined', '1')->first(); echo '
@@ -269,7 +271,7 @@ echo ' '.tr('Visualizza tutte le modalità').' - {[ "type": "select", "label": "'.tr('Pagamento').'", "name": "pagamento", "required": 1, "ajax-source": "pagamenti", "select-options": '.json_encode(['codice_modalita_pagamento_fe' => $codice_modalita_pagamento]).' ]} + {[ "type": "select", "label": "'.tr('Pagamento').'", "name": "pagamento", "required": 1, "ajax-source": "pagamenti", "select-options": '.json_encode(['codice_modalita_pagamento_fe' => $codice_modalita_pagamento]).', "value": "'.$pagamento->id.'" ]}
'; // Movimentazioni @@ -323,6 +325,34 @@ if (!empty($righe)) { '; + + // Dati ordini + $DatiOrdini = $fattura_pa->getBody()['DatiGenerali']['DatiOrdineAcquisto']; + $DatiDDT = $fattura_pa->getBody()['DatiGenerali']['DatiDDT']; + + + // Riorganizzazione dati ordini per numero di riga + $dati_ordini = []; + foreach ($DatiOrdini as $dato) { + foreach ($dato['RiferimentoNumeroLinea'] as $dati => $linea) { + $dati_ordini[(int)$linea] = [ + 'numero' => $dato['IdDocumento'], + 'data' => ( new Carbon($dato['Data']) )->format('d/m/Y'), + ]; + } + } + + // Riorganizzazione dati ordini per numero di riga + $dati_ddt = []; + foreach ($DatiDDT as $dato) { + foreach ($dato['RiferimentoNumeroLinea'] as $dati => $linea) { + $dati_ddt[(int)$linea] = [ + 'numero' => $dato['NumeroDDT'], + 'data' => ( new Carbon($dato['DataDDT']) )->format('d/m/Y'), + ]; + } + } + foreach ($righe as $key => $riga) { $query = "SELECT id, IF(codice IS NULL, descrizione, CONCAT(codice, ' - ', descrizione)) AS descrizione FROM co_iva WHERE deleted_at IS NULL AND percentuale = ".prepare($riga['AliquotaIVA']); @@ -374,11 +404,23 @@ if (!empty($righe)) { $prezzo_unitario = $riga['PrezzoUnitario'] ?: $riga['Importo']; $is_descrizione = empty((float)$riga['Quantita']) && empty((float)$prezzo_unitario); + $riferimento_fe = ''; + + if ($dati_ddt[(int)$riga['NumeroLinea']]) { + $riferimento_fe = tr('DDT _NUMERO_ del _DATA_', + [ + '_NUMERO_' => $dati_ddt[(int)$riga['NumeroLinea']]['numero'], + '_DATA_' => $dati_ddt[(int)$riga['NumeroLinea']]['data'], + ]); + } + + echo ' '.(empty($codice_principale) ? '' : '').' - +
+ '.$riferimento_fe.' '.$riga['Descrizione'].'
@@ -560,13 +602,15 @@ input("crea_articoli").on("change", function (){ } }); - $("select[name^=selezione_riferimento").change(function() { - let $this = $(this); - let data = $this.selectData(); +$("select[name^=selezione_riferimento").change(function() { + if (!$(this).hasClass("already-loaded")) { + let $this = $(this); + let data = $this.selectData(); - if (data) { - let riga = $this.closest("tr").prev(); - selezionaRiferimento(riga, data.tipo, data.id, data.dir); + if (data) { + let riga = $this.closest("tr").prev(); + selezionaRiferimento(riga, data.tipo, data.id, data.dir); + } } }); @@ -649,23 +693,29 @@ function impostaRiferimento(id_riga, documento, riga) { let riga_fe = $("#id_riga_riferimento_" + id_riga).closest("tr").prev(); // Informazioni visibili sulla quantità - impostaContenuto(riga_fe.data("qta"), riga.qta, (riga.um ? " " + riga.um : ""), "#riferimento_" + id_riga + "_qta"); + impostaContenuto(riga_fe.data("qta"), riga.qta, (riga.um ? " " + riga.um : ""), "#riferimento_" + id_riga + "_qta", true); // Informazioni visibili sul prezzo unitario - impostaContenuto(riga_fe.data("prezzo_unitario"), riga.prezzo_unitario, " " + globals.currency, "#riferimento_" + id_riga + "_prezzo"); + impostaContenuto(riga_fe.data("prezzo_unitario"), riga.prezzo_unitario, " " + globals.currency, "#riferimento_" + id_riga + "_prezzo", true); // Informazioni visibili sull\'aliquota IVA - impostaContenuto(riga_fe.data("iva_percentuale"), riga.iva_percentuale, "%", "#riferimento_" + id_riga + "_iva"); + impostaContenuto(riga_fe.data("iva_percentuale"), parseInt(riga.iva_percentuale), "%", "#riferimento_" + id_riga + "_iva", false); $("#riferimento_" + id_riga).html(documento.descrizione ? documento.descrizione : ""); var descrizione = riga.descrizione; - console.log(descrizione); if(typeof descrizione !== "undefined"){ - descrizione = descrizione.replace(/_/g, " "); + descrizione = descrizione.replace(/_/g, " ").replace(/\n/g, "
"); } - $("#riferimento_" + id_riga + "_descrizione").html(descrizione ? descrizione : ""); + // Dettagli del documento trovato + icona_documento = documento.match_documento_da_fe ? "fa-check-circle text-success" : "fa-question-circle text-orange"; + tooltip_icona = documento.match_documento_da_fe ? "La corrispondenza trovata è avvenuta in base a quanto ha specificato il fornitore nella fattura elettronica" : "Nessuna corrispondenza con quanto ha specificato il fornitore nella fattura elettronica, il riferimento potrebbe non essere corretto"; + + $("#riferimento_" + id_riga + "_descrizione").html("
" + documento.opzione + "
"); + + // Dettagli della riga trovata + $("#riferimento_" + id_riga + "_descrizione").append(descrizione ? descrizione : ""); // Colorazione dell\'intera riga let warnings = riga_fe.find(".text-warning"); @@ -677,7 +727,7 @@ function impostaRiferimento(id_riga, documento, riga) { } // Informazioni visibili sull\'aliquota IVA -function impostaContenuto(valore_riga, valore_riferimento, contenuto_successivo, id_elemento) { +function impostaContenuto(valore_riga, valore_riferimento, contenuto_successivo, id_elemento, parse_riferimento) { let elemento = $(id_elemento); if (valore_riferimento === undefined) { elemento.html(""); @@ -687,7 +737,7 @@ function impostaContenuto(valore_riga, valore_riferimento, contenuto_successivo, valore_riga = parseFloat(valore_riga); valore_riferimento = parseFloat(valore_riferimento); - let contenuto = valore_riferimento.toLocale() + contenuto_successivo; + let contenuto = (parse_riferimento ? valore_riferimento.toLocale() + contenuto_successivo : valore_riferimento + contenuto_successivo); if (valore_riferimento === valore_riga) { contenuto = ` ` + contenuto; elemento.addClass("text-success").removeClass("text-warning"); diff --git a/plugins/importFE/src/FatturaOrdinaria.php b/plugins/importFE/src/FatturaOrdinaria.php index a7002fc10..56ffe491f 100755 --- a/plugins/importFE/src/FatturaOrdinaria.php +++ b/plugins/importFE/src/FatturaOrdinaria.php @@ -126,6 +126,11 @@ class FatturaOrdinaria extends FatturaElettronica $ritenuta_contributi = !empty($fattura->id_ritenuta_contributi); $conto_arrotondamenti = null; + // Disattivo temporaneamente l'impostazione per evadere solo le quantità previste + $original_setting_evasione = setting('Permetti il superamento della soglia quantità dei documenti di origine'); + + \Settings::setValue('Permetti il superamento della soglia quantità dei documenti di origine', 1); + foreach ($righe as $key => $riga) { $articolo = ArticoloOriginale::find($articoli[$key]); @@ -178,9 +183,9 @@ class FatturaOrdinaria extends FatturaElettronica $obj->descrizione = $riga['Descrizione']; // Collegamento al documento di riferimento - if (!empty($tipi_riferimenti[$key]) && is_subclass_of($tipi_riferimenti[$key], Component::class)) { + if (!empty($tipi_riferimenti[$key]) && is_subclass_of($tipi_riferimenti[$key], Component::class) && !empty($id_riferimenti[$key])) { $riga_origine = ($tipi_riferimenti[$key])::find($id_riferimenti[$key]); - list($riferimento_precedente, $nuovo_riferimento) = $obj->impostaOrigine($riga_origine); + list($riferimento_precedente, $nuovo_riferimento) = $obj->impostaOrigine($tipi_riferimenti[$key], $id_riferimenti[$key]); // Correzione della descrizione $obj->descrizione = str_replace($riferimento_precedente, '', $obj->descrizione); @@ -316,6 +321,9 @@ class FatturaOrdinaria extends FatturaElettronica $obj->save(); } + // Ripristino l'impostazione iniziale di evasione quantità + \Settings::setValue('Permetti il superamento della soglia quantità dei documenti di origine', $original_setting_evasione); + // Ricaricamento della fattura $fattura->refresh(); diff --git a/plugins/referenti/add.php b/plugins/referenti/add.php index 6bc3d5ecb..4748ed91d 100755 --- a/plugins/referenti/add.php +++ b/plugins/referenti/add.php @@ -25,6 +25,9 @@ echo ' + + +
{[ "type": "text", "label": "'.tr('Nominativo').'", "name": "nome", "required": 1 ]} diff --git a/plugins/sedi/add.php b/plugins/sedi/add.php index 8c372dbe8..55192eda0 100755 --- a/plugins/sedi/add.php +++ b/plugins/sedi/add.php @@ -25,6 +25,9 @@ echo ' + + +
{[ "type": "select", "label": "'.tr('Anagrafica').'", "name": "id_anagrafica", "required": "1", "value": "'.$id_parent.'", "ajax-source": "anagrafiche", "disabled": 1 ]} diff --git a/src/Prints.php b/src/Prints.php index d07155913..71561dea8 100755 --- a/src/Prints.php +++ b/src/Prints.php @@ -698,6 +698,8 @@ class Prints $file = self::getFile($infos, $id_record, $directory, $replaces); $file['pdf'] = file_get_contents($filename); } + + $file['pages'] = $mpdf->pages; return $file; } diff --git a/src/Util/XML.php b/src/Util/XML.php index e2cedf753..5599ebde3 100755 --- a/src/Util/XML.php +++ b/src/Util/XML.php @@ -48,6 +48,12 @@ class XML throw new Exception($message); } + $xpath = '//*[not(normalize-space())]'; + + foreach (array_reverse($xml->xpath($xpath)) as $remove) { + unset($remove[0]); + } + $result = json_decode(json_encode($xml), true); return $result; diff --git a/templates/registro_iva/footer.php b/templates/registro_iva/footer.php index 4c16d9c19..4bff4fb01 100755 --- a/templates/registro_iva/footer.php +++ b/templates/registro_iva/footer.php @@ -17,18 +17,14 @@ * along with this program. If not, see . */ -echo ' - - - - - - -
- '.tr('Stampato con OpenSTAManager il _DATE_', ['_DATE_' => date('d/m/Y')]).' - - '.tr('Pagina _PAGE_ di _TOTAL_', [ - '_PAGE_' => '{PAGENO}', - '_TOTAL_' => '{nb}', +if (!empty($page)) { + echo ' +

+ '.tr('_YEAR_/_PAGE_', [ + '_PAGE_' => $page++, + '_YEAR_' => date('Y'), ]).' -

'; +

'; +} else { + echo '

'; +} diff --git a/templates/registro_iva/header.php b/templates/registro_iva/header.php new file mode 100644 index 000000000..add70532a --- /dev/null +++ b/templates/registro_iva/header.php @@ -0,0 +1,32 @@ +. + */ + +/* + * Header di default. + * I contenuti di questo file vengono utilizzati per generare l'header delle stampe nel caso non esista un file header.php all'interno della stampa. + * + * Per modificare l'header della stampa basta aggiungere un file header.php all'interno della cartella della stampa con i contenuti da mostrare (vedasi templates/fatture/header.php). + * + * La personalizzazione specifica dell'header deve comunque seguire lo standard della cartella custom: anche se il file header.php non esiste nella stampa originaria, se si vuole personalizzare l'header bisogna crearlo all'interno della cartella custom. + */ + +echo ' +
+

'.$f_ragionesociale.'

+
'; diff --git a/templates/registro_iva/init.php b/templates/registro_iva/init.php index b84740294..cf8020334 100755 --- a/templates/registro_iva/init.php +++ b/templates/registro_iva/init.php @@ -51,6 +51,10 @@ 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_competenza'); $records = $dbo->fetchArray($query); +if (empty(get('notdefinitiva'))) { + $page = $dbo->fetchOne('SELECT first_page FROM co_stampecontabili WHERE dir='.prepare(filter('dir')).' AND date_start='.prepare(filter('date_start')).' AND date_end='.prepare(filter('date_end')))['first_page']; +} + // Sostituzioni specifiche $custom = [ 'tipo' => $tipo, diff --git a/update/2_4_31.sql b/update/2_4_31.sql index 6a98b53ef..9972a0526 100644 --- a/update/2_4_31.sql +++ b/update/2_4_31.sql @@ -32,4 +32,63 @@ ALTER TABLE `zz_views` ADD `html_format` TINYINT NOT NULL DEFAULT '1' AFTER `for UPDATE `zz_views` SET `html_format` = '1'; -- Correzione widget valore magazzino -UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(\" \", REPLACE(REPLACE(REPLACE(FORMAT(SUM(prezzo_acquisto*qta),2), \",\", \"#\"), \".\", \",\"), \"#\", \".\"), \"€\") AS dato FROM mg_articoli WHERE qta>0 AND deleted_at IS NULL AND servizio=0' WHERE `zz_widgets`.`name` = 'Valore magazzino'; \ No newline at end of file +UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(\" \", REPLACE(REPLACE(REPLACE(FORMAT(SUM(prezzo_acquisto*qta),2), \",\", \"#\"), \".\", \",\"), \"#\", \".\"), \"€\") AS dato FROM mg_articoli WHERE qta>0 AND deleted_at IS NULL AND servizio=0 AND 1=1', `help` = 'Articoli a magazzino (tutti o solo attivi secondo il segmento)' WHERE `zz_widgets`.`name` = 'Valore magazzino'; + +-- Aggiunte informazioni nella colonna sede per la Sede legale in Interventi +UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `in_interventi`\nINNER JOIN `an_anagrafiche` ON `in_interventi`.`idanagrafica` = `an_anagrafiche`.`idanagrafica`\nLEFT JOIN `in_interventi_tecnici` ON `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`\nLEFT JOIN `in_interventi_tecnici_assegnati` ON `in_interventi_tecnici_assegnati`.`id_intervento` = `in_interventi`.`id`\nLEFT JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`idstatointervento`\nLEFT JOIN (\n SELECT an_sedi.id, CONCAT(an_sedi.nomesede, \'
\',IF(an_sedi.telefono!=\'\',CONCAT(an_sedi.telefono,\'
\'),\'\'),IF(an_sedi.cellulare!=\'\',CONCAT(an_sedi.cellulare,\'
\'),\'\'),an_sedi.citta,IF(an_sedi.indirizzo!=\'\',CONCAT(\' - \',an_sedi.indirizzo),\'\')) AS info FROM an_sedi\n) AS sede_destinazione ON sede_destinazione.id = in_interventi.idsede_destinazione\nLEFT JOIN (\n SELECT co_righe_documenti.idintervento, CONCAT(\'Fatt. \', co_documenti.numero_esterno, \' del \', DATE_FORMAT(co_documenti.data, \'%d/%m/%Y\')) AS info FROM co_documenti INNER JOIN co_righe_documenti ON co_documenti.id = co_righe_documenti.iddocumento\n) AS fattura ON fattura.idintervento = in_interventi.id\nLEFT JOIN (SELECT `zz_operations`.`id_email`, `zz_operations`.`id_record`\n FROM `zz_operations`\n INNER JOIN `em_emails` ON `zz_operations`.`id_email` = `em_emails`.`id`\n INNER JOIN `em_templates` ON `em_emails`.`id_template` = `em_templates`.`id`\n INNER JOIN `zz_modules` ON `zz_operations`.`id_module` = `zz_modules`.`id` \n WHERE `zz_modules`.`name` = \'Interventi\' AND `zz_operations`.`op` = \'send-email\' \n GROUP BY `zz_operations`.`id_record`) AS email ON email.id_record=in_interventi.id\nWHERE 1=1 |date_period(`orario_inizio`,`data_richiesta`)|\nGROUP BY `in_interventi`.`id`\nHAVING 2=2\nORDER BY IFNULL(`orario_fine`, `data_richiesta`) DESC' WHERE `zz_modules`.`name` = 'Interventi'; +UPDATE `zz_views` SET `query` = 'IF(in_interventi.idsede_destinazione > 0, sede_destinazione.info, CONCAT(\'Sede legale
\',IF(an_anagrafiche.telefono!=\'\',CONCAT(an_anagrafiche.telefono,\'
\'),\'\'),IF(an_anagrafiche.cellulare!=\'\',CONCAT(an_anagrafiche.cellulare,\'
\'),\'\'),IF(an_anagrafiche.citta!=\'\',an_anagrafiche.citta,\'\'),IF(an_anagrafiche.indirizzo!=\'\',CONCAT(\' - \',an_anagrafiche.indirizzo),\'\')))' WHERE `zz_views`.`name` = 'Sede' AND `id_module`=(SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'); + +-- Aggiunto pagamenti predefiniti per importazione FE +ALTER TABLE `co_pagamenti` ADD `predefined` TINYINT NOT NULL AFTER `idconto_acquisti`; +INSERT INTO `co_pagamenti` (`id`, `descrizione`, `giorno`, `num_giorni`, `prc`, `idconto_vendite`, `idconto_acquisti`, `predefined`, `codice_modalita_pagamento_fe`) VALUES (NULL, 'Ri.Ba.', '0', '0', '100.00', '2', '2', '1', 'MP12'); +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Contanti' AND `codice_modalita_pagamento_fe`='MP01'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Assegno' AND `codice_modalita_pagamento_fe`='MP02'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Assegno circolare' AND `codice_modalita_pagamento_fe`='MP03'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Contanti presso Tesoreria' AND `codice_modalita_pagamento_fe`='MP04'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Bonifico bancario' AND `codice_modalita_pagamento_fe`='MP05'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Vaglia cambiario' AND `codice_modalita_pagamento_fe`='MP06'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Bollettino bancario' AND `codice_modalita_pagamento_fe`='MP07'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Bancomat' AND `codice_modalita_pagamento_fe`='MP08'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'RID' AND `codice_modalita_pagamento_fe`='MP09'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'RID utenze' AND `codice_modalita_pagamento_fe`='MP10'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'RID veloce' AND `codice_modalita_pagamento_fe`='MP11'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'MAV' AND `codice_modalita_pagamento_fe`='MP13'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Quietanza erario' AND `codice_modalita_pagamento_fe`='MP14'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Giroconto su conti di contabilità speciale' AND `codice_modalita_pagamento_fe`='MP15'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Domiciliazione bancaria' AND `codice_modalita_pagamento_fe`='MP16'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Domiciliazione postale' AND `codice_modalita_pagamento_fe`='MP17'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Bollettino di c/c postale' AND `codice_modalita_pagamento_fe`='MP18'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'SEPA Direct Debit' AND `codice_modalita_pagamento_fe`='MP19'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'SEPA Direct Debit CORE' AND `codice_modalita_pagamento_fe`='MP20'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'SEPA Direct Debit B2B' AND `codice_modalita_pagamento_fe`='MP21'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'Trattenuta su somme già riscosse' AND `codice_modalita_pagamento_fe`='MP22'; +UPDATE `co_pagamenti` SET `predefined` = '1' WHERE `co_pagamenti`.`descrizione` = 'PagoPA' AND `codice_modalita_pagamento_fe`='MP23'; + +-- Segmento Tutti/Solo attivi per articoli. +INSERT INTO `zz_segments` (`id`, `id_module`, `name`, `clause`, `position`, `pattern`, `note`, `predefined`, `predefined_accredito`, `predefined_addebito`, `is_fiscale`) VALUES +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), 'Tutti', '1=1', 'WHR', '####', '', 1, 0, 0, 0), +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), 'Solo attivi', 'attivo=1', 'WHR', '####', '', 0, 0, 0, 0); + +-- Correzione widget articoli in magazzino +UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(\" \", REPLACE(REPLACE(REPLACE(FORMAT(SUM(qta),2), \",\", \"#\"), \".\", \",\"), \"#\", \".\"), \"unità\") AS dato FROM mg_articoli WHERE qta>0 AND deleted_at IS NULL AND servizio=0 AND 1=1', `help` = 'Articoli a magazzino (tutti o solo attivi secondo il segmento)' WHERE `zz_widgets`.`name` = 'Articoli in magazzino'; + +-- Aggiunta colonna "Servizio" per vista Articoli +INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `visible`, `format`, `default`) VALUES +(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), 'Servizio', 'IF(mg_articoli.servizio, ''Sì'', ''No'')', 13, 1, 0, 1); + +-- Summable per Q.tà, Q.tà disponibile, Q.tà impegnata e Q.tà ordinata +UPDATE `zz_views` SET `summable` = '1' WHERE (`zz_views`.`name` = 'Q.tà ordinata' OR `zz_views`.`name` = 'Q.tà' OR `zz_views`.`name` = 'Q.tà disponibile' OR `zz_views`.`name` = 'Q.tà impegnata') AND `zz_views`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'); + +-- Stampe definitive registri iva +CREATE TABLE `co_stampecontabili` ( `id` INT NOT NULL AUTO_INCREMENT , `id_print` INT NOT NULL , `date_start` DATE NOT NULL , `date_end` DATE NOT NULL , `first_page` INT NOT NULL , `last_page` INT NOT NULL , `dir` VARCHAR(255) NOT NULL , PRIMARY KEY (`id`)); + +-- Coefficiente di vendita +ALTER TABLE `mg_articoli` ADD `coefficiente` DECIMAL(12,6) NOT NULL AFTER `prezzo_acquisto`; + +-- Codice iva in selezione Iva per lettere d'intento +UPDATE `zz_settings` SET `tipo` = 'query=SELECT id, CONCAT(codice,\' - \',descrizione) AS descrizione FROM `co_iva` WHERE codice_natura_fe LIKE \'N3.%\' AND deleted_at IS NULL ORDER BY descrizione ASC' WHERE `zz_settings`.`nome` = 'Iva per lettere d''intento'; + +-- Aggiunte colonne codice e barcode fornitore in listini +INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `format`, `html_format`, `search_inside`, `order_by`, `visible`, `summable`, `default`) VALUES +((SELECT `id` FROM `zz_modules` WHERE `name` = 'Listini'), 'Codice', '(SELECT codice_fornitore FROM mg_fornitore_articolo WHERE id_articolo=mg_prezzi_articoli.id_articolo AND id_fornitore=mg_prezzi_articoli.id_anagrafica AND deleted_at IS NULL)', 8, 1, 0, 0, 1, '', '', 0, 0, 1), +((SELECT `id` FROM `zz_modules` WHERE `name` = 'Listini'), 'Barcode', '(SELECT barcode_fornitore FROM mg_fornitore_articolo WHERE id_articolo=mg_prezzi_articoli.id_articolo AND id_fornitore=mg_prezzi_articoli.id_anagrafica AND deleted_at IS NULL)', 9, 1, 0, 0, 1, '', '', 0, 0, 1); \ No newline at end of file