This commit is contained in:
Beppe 2022-03-07 14:52:43 +01:00
commit 80fe5f4e49
33 changed files with 1024 additions and 236 deletions

View File

@ -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",

View File

@ -258,6 +258,19 @@ if (in_array($final_module['name'], ['Fatture di vendita', 'Fatture di acquisto'
</div>';
}
$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 '
<div class="box box-success">
@ -279,7 +292,7 @@ echo '
<th width="15%">'.tr('Q. da evadere').'</th>
<th width="20%" class="text-center">'.tr('Subtot.').'</th>';
if (!empty($options['serials'])) {
if (!empty($has_serial)) {
echo '
<th width="20%">'.tr('Seriali').'</th>';
}
@ -322,6 +335,19 @@ foreach ($righe as $i => $riga) {
echo '&nbsp;'.nl2br($descrizione);
if ($riga->isArticolo() && !empty($riga->abilita_serial)) {
$serials = $riga->serials;
$mancanti = abs($riga->qta) - count($serials);
if (!empty($mancanti)) {
echo '
<br><b><small class="text-danger">'.tr('_NUM_ serial mancanti', [
'_NUM_' => $mancanti,
]).'</small></b>';
}
}
echo '
</td>';
@ -343,7 +369,7 @@ foreach ($righe as $i => $riga) {
</td>';
// Seriali
if (!empty($options['serials'])) {
if (!empty($has_serial)) {
echo '
<td style="vertical-align:middle">';
@ -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();

View File

@ -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 ]}
</div>';
}
if (empty($emails)) {
echo '
<div class="col-md-12">
{[ "type": "email", "name": "destinatari['.$idx++.']", "value": "", "icon-before": "choice|email", "extra": "onkeyup=\'aggiungiDestinatario();\'", "class": "destinatari", "required": 0 ]}
</div>';
}
echo '
</div>

View File

@ -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), ',', '#'), '.', ','), '#', '.'), ' &euro;' ) AS descrizione FROM co_dichiarazioni_intento |where| ORDER BY data";
foreach ($elements as $element) {
$filter[] = 'id='.prepare($element);

View File

@ -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;

View File

@ -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);
?><form action="" method="post" id="add-form">
<input type="hidden" name="op" value="add">
<input type="hidden" name="backto" value="record-edit">
@ -63,16 +69,10 @@ include_once __DIR__.'/../../core.php';
</div>
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Quantità iniziale'); ?>", "name": "qta", "decimals": "qta" ]}
{[ "type": "number", "label": "<?php echo tr('Coefficiente di vendita'); ?>", "name": "coefficiente", "help": "<?php echo tr('Imposta un coefficiente per calcolare automaticamente il prezzo di vendita quando cambia il prezzo di acquisto'); ?>." ]}
</div>
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Soglia minima quantità'); ?>", "name": "threshold_qta", "decimals": "qta", "min-value": "undefined" ]}
</div>
</div>
<div class="row">
<div class="col-md-6">
<?php
if (!setting('Utilizza prezzi di vendita comprensivi di IVA')) {
echo '
@ -83,8 +83,21 @@ include_once __DIR__.'/../../core.php';
{[ "type": "number", "label": "<?php echo tr('Prezzo di vendita'); ?>", "name": "prezzo_vendita", "icon-after": "<?php echo currency(); ?>", "help": "<?php echo setting('Utilizza prezzi di vendita comprensivi di IVA') ? tr('Importo IVA inclusa') : ''; ?>" ]}
</div>
<div class="col-md-6">
</div>
<div class="row">
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Quantità iniziale'); ?>", "name": "qta", "decimals": "qta" ]}
</div>
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Soglia minima quantità'); ?>", "name": "threshold_qta", "decimals": "qta", "min-value": "undefined" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Iva di vendita'); ?>", "name": "idiva_vendita", "ajax-source": "iva", "valore_predefinito": "Iva predefinita", "help": "<?php echo tr('Se non specificata, verrà utilizzata l\'iva di default delle impostazioni'); ?>" ]}
<input type="hidden" name="prezzi_ivati" value="<?php echo $prezzi_ivati; ?>">
<input type="hidden" name="aliquota_predefinita" value="<?php echo $aliquota_predefinita; ?>">
</div>
</div>
@ -109,6 +122,9 @@ include_once __DIR__.'/../../core.php';
</form>
<script>
iva_vendita = $("#add-form").find("#idiva_vendita");
percentuale = 0;
$(document).ready(function () {
var sub = $('#add-form').find('#subcategoria_add');
var original = sub.parent().find(".input-group-addon button").attr("onclick");
@ -128,24 +144,65 @@ $(document).ready(function () {
}
});
input("coefficiente").on('keyup', function(){
if (iva_vendita.val()) {
percentuale = parseFloat(iva_vendita.selectData().percentuale);
}
if (!percentuale) {
percentuale = parseFloat(input("aliquota_predefinita").get());
}
if (input("coefficiente").get()) {
let prezzo_vendita = input('prezzo_acquisto').get() * input("coefficiente").get();
if (parseFloat(input("prezzi_ivati").get())) {
prezzo_vendita = prezzo_vendita + (prezzo_vendita * percentuale / 100);
}
input("prezzo_vendita").set(prezzo_vendita);
input("prezzo_vendita").disable();
$("#scorpora_iva_add").addClass("disabled");
} else {
input("prezzo_vendita").enable();
$("#scorpora_iva_add").removeClass("disabled");
}
});
input("prezzo_acquisto").on('keyup change', function(){
if (iva_vendita.val()) {
percentuale = parseFloat(iva_vendita.selectData().percentuale);
}
if (!percentuale) {
percentuale = parseFloat(input("aliquota_predefinita").get());
}
if (input("coefficiente").get()) {
let prezzo_vendita = input('prezzo_acquisto').get() * input("coefficiente").get();
if (parseFloat(input("prezzi_ivati").get())) {
prezzo_vendita = prezzo_vendita + (prezzo_vendita * percentuale / 100);
}
input("prezzo_vendita").set(prezzo_vendita);
input("prezzo_vendita").disable();
$("#scorpora_iva_add").addClass("disabled");
} else {
input("prezzo_vendita").enable();
$("#scorpora_iva_add").removeClass("disabled");
}
});
$("#scorpora_iva_add").click( function() {
scorpora_iva_add();
});
});
function scorpora_iva_add() {
if ($("#add-form").find("#idiva_vendita").val() != '') {
var percentuale = parseFloat($("#add-form").find("#idiva_vendita").selectData().percentuale);
if(!percentuale) return;
var input = $("#add-form").find("#prezzo_vendita");
var prezzo = input.val().toEnglish();
var scorporato = prezzo * 100 / (100 + percentuale);
input.val(scorporato);
}else{
swal("<?php echo tr('Attenzione'); ?>", "<?php echo tr('Seleziona Iva di vendita.'); ?>", "warning");
if (iva_vendita.val()) {
percentuale = parseFloat(iva_vendita.selectData().percentuale);
}
if (!percentuale) {
percentuale = parseFloat(input("aliquota_predefinita").get());
}
if(!percentuale) return;
let input = $("#prezzo_vendita");
let prezzo = input.val().toEnglish();
let scorporato = prezzo * 100 / (100 + percentuale);
input.val(scorporato);
}
</script>

View File

@ -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' => '<span><i class="fa fa-refresh"></i> '.tr('Aggiorna prezzo di acquisto').'</span>',
'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.<br><br>{[ "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.').'<br><br>{[ "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' => '<span><i class="fa fa-refresh"></i> '.tr('Aggiorna prezzo di vendita').'</span>',
'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.<br><br>
'msg' => tr('Per indicare uno sconto inserire la percentuale con il segno meno, al contrario per un rincaro inserire la percentuale senza segno.').'<br><br>
{[ "type": "select", "label": "'.tr('Partendo da:').'", "name": "prezzo_partenza", "required": 1, "values": "list=\"acquisto\":\"Prezzo di acquisto\",\"vendita\":\"Prezzo di vendita\"" ]}<br>
{[ "type": "number", "label": "'.tr('Percentuale sconto/magg.').'", "name": "percentuale", "required": 1, "icon-after": "%" ]}<br>
{[ "type": "select", "label": "'.tr('Arrotonda prezzo:').'", "name": "tipologia", "values": "list=\"0\":\"Non arrotondare\",\"imponibile\":\"Imponibile\",\"ivato\":\"Ivato\"", "value": 0 ]}<br>
@ -378,6 +401,17 @@ $operations['change-vendita'] = [
],
];
$operations['change-coefficiente'] = [
'text' => '<span><i class="fa fa-refresh"></i> '.tr('Aggiorna coefficiente di vendita').'</span>',
'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').'<br><br>{[ "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' => '<span><i class="fa fa-barcode"></i> '.tr('Stampa etichette').'</span>',
'data' => [

View File

@ -19,6 +19,8 @@
include_once __DIR__.'/../../core.php';
use Modules\Iva\Aliquota;
?><form action="" method="post" id="edit-form" enctype="multipart/form-data">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="update">
@ -162,11 +164,15 @@ include_once __DIR__.'/../../core.php';
<div class="panel-body">
<div class="row">
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Prezzo di acquisto'); ?>", "name": "prezzo_acquisto", "value": "$prezzo_acquisto$", "icon-after": "<?php echo currency(); ?>", "help": "<?php echo tr('Prezzo di acquisto previsto per i fornitori i cui dati non sono stati inseriti nel plugin Fornitori'); ?>." ]}
</div>
<div class="col-md-6">
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Coefficiente di vendita'); ?>", "name": "coefficiente", "value": "$coefficiente$", "help": "<?php echo tr('Imposta un coefficiente per calcolare automaticamente il prezzo di vendita quando cambia il prezzo di acquisto'); ?>." ]}
</div>
<div class="col-md-4">
{[ "type": "number", "label": "<?php echo tr('Soglia minima quantità'); ?>", "name": "threshold_qta", "value": "$threshold_qta$", "decimals": "qta", "min-value": "undefined" ]}
</div>
</div>
@ -215,21 +221,25 @@ include_once __DIR__.'/../../core.php';
<div class="col-md-6">
<?php
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
$iva_predefinita = setting('Iva predefinita');
$aliquota_predefinita = floatval(Aliquota::find($iva_predefinita)->percentuale);
if (empty($prezzi_ivati)) {
echo '
<button type="button" class="btn btn-info btn-xs pull-right tip pull-right" title="'.tr('Scorpora l\'IVA dal prezzo di vendita.').'" id="scorporaIva">
<button type="button" class="btn btn-info btn-xs pull-right tip pull-right '.(!empty((int)$articolo->coefficiente) ? 'disabled' : '').'" title="'.tr('Scorpora l\'IVA dal prezzo di vendita.').'" id="scorporaIva">
<i class="fa fa-calculator"></i>
</button>';
}
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).'" ]}
</div>';
?>
<div class="col-md-6">
{[ "type": "select", "label": "<?php echo tr('Iva di vendita'); ?>", "name": "idiva_vendita", "ajax-source": "iva", "value": "$idiva_vendita$", "help": "<?php echo tr('Se non specificata, verrà utilizzata l\'iva di default delle impostazioni'); ?>" ]}
<input type="hidden" name="prezzi_ivati" value="<?php echo $prezzi_ivati; ?>">
<input type="hidden" name="aliquota_predefinita" value="<?php echo $aliquota_predefinita; ?>">
</div>
</div>
@ -306,6 +316,48 @@ echo '
{( "name": "filelist_and_upload", "id_module": "$id_module$", "id_record": "$id_record$" )}
<script>
let iva_vendita = $("#idiva_vendita");
let percentuale = 0;
$(document).ready(function() {
if (iva_vendita.val()) {
percentuale = parseFloat(iva_vendita.selectData().percentuale);
}
if (!percentuale) {
percentuale = parseFloat(input("aliquota_predefinita").get());
}
input("coefficiente").on('keyup', function(){
if (input("coefficiente").get()) {
let prezzo_vendita = input('prezzo_acquisto').get() * input("coefficiente").get();
if (parseFloat(input("prezzi_ivati").get())) {
prezzo_vendita = prezzo_vendita + (prezzo_vendita * percentuale / 100);
}
input("prezzo_vendita").set(prezzo_vendita);
input("prezzo_vendita").disable();
$("#scorporaIva").addClass("disabled");
} else {
input("prezzo_vendita").enable();
$("#scorporaIva").removeClass("disabled");
}
});
input("prezzo_acquisto").on('keyup change', function(){
if (input("coefficiente").get()) {
let prezzo_vendita = input('prezzo_acquisto').get() * input("coefficiente").get();
if (parseFloat(input("prezzi_ivati").get())) {
prezzo_vendita = prezzo_vendita + (prezzo_vendita * percentuale / 100);
}
input("prezzo_vendita").set(prezzo_vendita);
input("prezzo_vendita").disable();
$("#scorporaIva").addClass("disabled");
} else {
input("prezzo_vendita").enable();
$("#scorporaIva").removeClass("disabled");
}
});
});
$("#categoria").change(function() {
updateSelectOption("id_categoria", $(this).val());
@ -313,27 +365,17 @@ $("#categoria").change(function() {
});
function scorporaIva() {
let iva_vendita = $("#idiva_vendita");
if(!percentuale) return;
if (iva_vendita.val()) {
let percentuale = parseFloat(iva_vendita.selectData().percentuale);
if(!percentuale) return;
let input = $("#prezzo_vendita");
let prezzo = input.val().toEnglish();
let scorporato = prezzo * 100 / (100 + percentuale);
input.val(scorporato);
}else{
swal("<?php echo tr('Attenzione'); ?>", "<?php echo tr('Seleziona Iva di vendita.'); ?>", "warning");
}
let input = $("#prezzo_vendita");
let prezzo = input.val().toEnglish();
let scorporato = prezzo * 100 / (100 + percentuale);
input.val(scorporato);
}
$("#scorporaIva").click( function() {
scorporaIva();
});
</script>

View File

@ -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.
*

View File

@ -28,7 +28,7 @@ echo '
<div class="row">
<div class="col-md-4">
{[ "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").'." ]}
</div>
<div class="col-md-4">

View File

@ -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,

View File

@ -213,7 +213,6 @@ if (!empty($numero_previsto)) {
<script>
$("#idspedizione").change(function() {
//Per tutti tipi di spedizione, a parte "Espressa" o "Vettore", il campo vettore non deve essere richiesto
if($(this).val()){
if (!$(this).selectData().esterno) {
$("#idvettore").attr("required", false);

View File

@ -38,22 +38,16 @@ if ($dir == 'entrata') {
}
// Informazioni sulla dichiarazione d'intento, visibili solo finchè la fattura è in bozza
if ($dir == 'entrata' && !empty($fattura->dichiarazione) && $fattura->stato->descrizione == 'Bozza') {
if ($dir == 'entrata' && !empty($fattura->dichiarazione) ) {
$diff = $fattura->dichiarazione->massimale - $fattura->dichiarazione->totale;
$diff_in_days = Carbon::parse($fattura->dichiarazione->data_fine)->diffAsCarbonInterval($fattura->data);
$id_iva = setting("Iva per lettere d'intento");
$iva = Aliquota::find($id_iva);
if (!empty($iva)) {
if ($diff > 0) {
echo '
<div class="alert alert-info">
<i class="fa fa-warning"></i> '.tr("La fattura è collegata a una dichiarazione d'intento con diponibilità di _MONEY_: per collegare una riga alla dichiarazione è sufficiente inserire come IVA _IVA_", [
'_MONEY_' => moneyFormat(abs($diff)),
'_IVA_' => '"'.$iva->descrizione.'"',
]).'.</b>
</div>';
} elseif ($diff == 0) {
if ($diff == 0) {
echo '
<div class="alert alert-warning">
<i class="fa fa-warning"></i> '.tr("La dichiarazione d'intento ha raggiunto il massimale previsto di _MONEY_: le nuove righe della fattura devono presentare IVA diversa da _IVA_", [
@ -61,15 +55,25 @@ if ($dir == 'entrata' && !empty($fattura->dichiarazione) && $fattura->stato->des
'_IVA_' => '"'.$iva->descrizione.'"',
]).'.</b>
</div>';
} else {
} elseif ($diff < 0) {
echo '
<div class="alert alert-danger">
<div class="alert alert-warning">
<i class="fa fa-warning"></i> '.tr("La dichiarazione d'intento ha superato il massimale previsto di _MONEY_: per rimuovere righe della fattura dalla dichiarazione è sufficiente modificare l'IVA in qualcosa di diverso da _IVA_", [
'_MONEY_' => moneyFormat(abs($diff)),
'_IVA_' => '"'.$iva->descrizione.'"',
]).'.</b>
</div>';
}
elseif ($diff_in_days < 0) {
echo '
<div class="alert alert-warning">
<i class="fa fa-warning"></i> '.tr("La dichiarazione d'intento ha come data fine validità _SCADENZA_ mentre la fattura ha data _DATA_", [
'_SCADENZA_' => dateFormat($fattura->dichiarazione->data_fine),
'_DATA_' => dateFormat($fattura->data),
]).'.</b>
</div>';
}
} else {
//TODO link ad impostazioni con nuova ricerca rapida
echo '
@ -81,6 +85,18 @@ if ($dir == 'entrata' && !empty($fattura->dichiarazione) && $fattura->stato->des
}
}
// Ricordo che si sta emettendo una fattura conto terzi
if ($dir == 'entrata' && $fattura->stato->descrizione == 'Bozza' ) {
if ($fattura->is_fattura_conto_terzi){
echo '
<div class="alert alert-info">
<i class="fa fa-info"></i> '.tr("Questa è una fattura per conto di terzi. Nell'XML della Fattura Elettronica sarà indicato il fornitore _FORNITORE_ come cessionario e il cliente come cedente/prestatore", ['_FORNITORE_' => '"<b>'.stripslashes($database->fetchOne('SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica = '.prepare(setting('Azienda predefinita')))['ragione_sociale']).'</b>"',]).'.</b>
</div>';
}
}
// Verifica aggiuntive sulla sequenzialità dei numeri
if ($dir == 'entrata') {
$numero_previsto = verifica_numero_fattura($fattura);
@ -379,24 +395,32 @@ elseif ($record['stato'] == 'Bozza') {
?>
</div>
<!-- Split payment + Fattura per conto terzi (solo uscita) + Sconto in fattura (solo uscita) -->
<div class="row">
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Split payment'); ?>", "name": "split_payment", "value": "$split_payment$", "help": "<?php echo tr('Abilita lo split payment per questo documento. Le aliquote iva con natura N6.X (reverse charge) non saranno disponibili.'); ?>", "placeholder": "<?php echo tr('Split payment'); ?>" ]}
</div>
<?php
// TODO: Fattura per conto del fornitore (es. cooperative agricole che emettono la fattura per conto dei propri soci produttori agricoli conferenti)
if ($dir == 'entrata') {
?>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Fattura per conto terzi'); ?>", "name": "is_fattura_conto_terzi", "value": "$is_fattura_conto_terzi$", "help": "<?php echo tr('Nell\'xml della FE imposta il fornitore ('.stripslashes($database->fetchOne('SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica = '.prepare(setting('Azienda predefinita')))['ragione_sociale']).') come cessionario e il cliente come cedente/prestatore.'); ?>", "placeholder": "<?php echo tr('Fattura per conto terzi'); ?>" ]}
</div>
<?php
}
?>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Split payment'); ?>", "name": "split_payment", "value": "$split_payment$", "help": "<?php echo tr('Abilita lo split payment per questo documento. Le aliquote iva con natura N6.X (reverse charge) non saranno disponibili.'); ?>", "placeholder": "<?php echo tr('Split payment'); ?>" ]}
</div>
<?php
// TODO: Fattura per conto del fornitore (es. cooperative agricole che emettono la fattura per conto dei propri soci produttori agricoli conferenti)
if ($dir == 'entrata') {
?>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Fattura per conto terzi'); ?>", "name": "is_fattura_conto_terzi", "value": "$is_fattura_conto_terzi$", "help": "<?php echo tr('Nell\'XML della Fattura Elettronica sarà indicato il fornitore ('.stripslashes($database->fetchOne('SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica = '.prepare(setting('Azienda predefinita')))['ragione_sociale']).') come cessionario e il cliente come cedente/prestatore.'); ?>", "placeholder": "<?php echo tr('Fattura per conto terzi'); ?>" ]}
</div>
<?php
echo '<div class="col-md-3">
{[ "type": "number", "label": "'.tr('Sconto in fattura').'", "name": "sconto_finale", "value": "'.($fattura->sconto_finale_percentuale ?: $fattura->sconto_finale).'", "icon-after": "choice|untprc|'.(empty($fattura->sconto_finale) ? 'PRC' : 'UNT').'", "help": "'.tr('Sconto in fattura, utilizzabile per applicare sconti sul Netto a pagare del documento e le relative scadenze').'. '.tr('Per utilizzarlo in relazione a una riga della Fattura Elettronica, inserire il tipo di dato in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'TipoDato\'\' e il testo di descrizione in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'RiferimentoTesto\'\' della specifica riga').'. '.tr('Nota: lo sconto in fattura non influenza i movimenti contabili').'." ]}
</div>';
}
?>
</div>
<div class="row">
<div class="col-md-6">
<?php echo !empty($record['id_ritenuta_contributi']) ? Modules::link('Ritenute previdenziali', $record['id_ritenuta_contributi'], null, null, 'class="pull-right"') : ''; ?>
{[ "type": "select", "label": "<?php echo tr('Ritenuta previdenziale'); ?>", "name": "id_ritenuta_contributi", "value": "$id_ritenuta_contributi$", "values": "query=SELECT *, CONCAT(descrizione,(IF(percentuale>0, CONCAT(\" - \", percentuale, \"% sul \", percentuale_imponibile, \"% imponibile\"), \"\"))) AS descrizione FROM co_ritenuta_contributi", "help": "<?php echo tr('Ritenuta previdenziale da applicare alle righe della fattura.'); ?>" ]}
</div>
@ -404,20 +428,20 @@ elseif ($record['stato'] == 'Bozza') {
<?php
if ($dir == 'uscita') {
echo '
<div class="col-md-3">
<div class="col-md-6">
{[ "type": "checkbox", "label": "'.tr('Ritenuta pagata dal fornitore').'", "name": "is_ritenuta_pagata", "value": "$is_ritenuta_pagata$" ]}
</div>';
}
if ($dir == 'entrata') {
echo '
<div class="col-md-3">';
<div class="col-md-6">';
if (!empty($record['id_dichiarazione_intento'])) {
echo Plugins::link("Dichiarazioni d'Intento", $record['idanagrafica'], null, null, 'class="pull-right"');
}
echo '
{[ "type": "select", "label": "'.tr("Dichiarazione d'intento").'", "name": "id_dichiarazione_intento", "ajax-source": "dichiarazioni_intento", "select-options": {"idanagrafica": '.$record['idanagrafica'].', "data": "'.$record['data'].'"},"value": "$id_dichiarazione_intento$" ]}
{[ "type": "select", "label": "'.tr("Dichiarazione d'intento").'", "name": "id_dichiarazione_intento", "help": "'.tr('Elenco delle dichiarazioni d\'intento definite all\'interno dell\'anagrafica del cliente').'.", "ajax-source": "dichiarazioni_intento", "select-options": {"idanagrafica": '.$record['idanagrafica'].', "data": "'.$record['data'].'"},"value": "$id_dichiarazione_intento$" ]}
</div>';
}
echo '
@ -439,10 +463,6 @@ elseif ($record['stato'] == 'Bozza') {
<div class="col-md-3 bollo">
{[ "type": "number", "label": "'.tr('Importo marca da bollo').'", "name": "bollo", "value": "$bollo$"]}
</div>
<div class="col-md-3">
{[ "type": "number", "label": "'.tr('Sconto in fattura').'", "name": "sconto_finale", "value": "'.($fattura->sconto_finale_percentuale ?: $fattura->sconto_finale).'", "icon-after": "choice|untprc|'.(empty($fattura->sconto_finale) ? 'PRC' : 'UNT').'", "help": "'.tr('Sconto in fattura, utilizzabile per applicare sconti sul Netto a pagare del documento e le relative scadenze').'. '.tr('Per utilizzarlo in relazione a una riga della Fattura Elettronica, inserire il tipo di dato in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'TipoDato\'\' e il testo di descrizione in \'\'Attributi avanzati\'\' -> \'\'Altri Dati Gestionali\'\' -> \'\'RiferimentoTesto\'\' della specifica riga').'. '.tr('Nota: lo sconto in fattura non influenza i movimenti contabili').'." ]}
</div>
</div>';
$bollo = new Bollo($fattura);
@ -491,37 +511,58 @@ if ($record['descrizione_tipo'] == 'Fattura accompagnatoria di vendita') {
<div class="row">
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Tipo di spedizione').'", "name": "idspedizione", "values": "query=SELECT id, descrizione FROM dt_spedizione ORDER BY descrizione ASC", "value": "$idspedizione$" ]}
{[ "type": "select", "label": "'.tr('Tipo di spedizione').'", "name": "idspedizione", "values": "query=SELECT id, descrizione, esterno FROM dt_spedizione ORDER BY descrizione ASC", "value": "$idspedizione$" ]}
</div>
<div class="col-md-3">
{[ "type": "select", "label": "'.tr('Vettore').'", "name": "idvettore", "ajax-source": "vettori", "value": "$idvettore$", "icon-after": "add|'.Modules::get('Anagrafiche')['id'].'|tipoanagrafica=Vettore|'.((($record['idspedizione'] != 3) and ($record['stato'] == 'Bozza')) ? '' : 'disabled').'", "disabled": '.intval($record['idspedizione'] == 3).', "required": '.intval($record['idspedizione'] != 3).' ]}
<div class="col-md-3">';
if (!empty($record['idvettore'])) {
echo Modules::link('Anagrafiche', $record['idvettore'], null, null, 'class="pull-right"');
}
$esterno = $dbo->selectOne('dt_spedizione', 'esterno', [
'id' => $record['idspedizione'],
])['esterno'];
?>
{[ "type": "select", "label": "<?php echo tr('Vettore'); ?>", "name": "idvettore", "ajax-source": "vettori", "value": "$idvettore$", "disabled": <?php echo empty($esterno) || (!empty($esterno) && !empty($record['idvettore'])) ? 1 : 0; ?>, "required": <?php echo !empty($esterno) ?: 0; ?>, "icon-after": "add|<?php echo Modules::get('Anagrafiche')['id']; ?>|tipoanagrafica=Vettore&readonly_tipo=1|btn_idvettore|<?php echo ($esterno and (intval(!$record['flag_completato']) || empty($record['idvettore']))) ? '' : 'disabled'; ?>", "class": "<?php echo empty($record['idvettore']) ? 'unblockable' : ''; ?>" ]}
</div>
<script>
$("#idspedizione").change(function() {
if ($(this).val() == 3) {
if($(this).val()){
if (!$(this).selectData().esterno) {
$("#idvettore").attr("required", false);
input("idvettore").disable();
$("label[for=idvettore]").text("<?php echo tr('Vettore'); ?>");
$("#idvettore").selectReset("<?php echo tr("Seleziona un\'opzione"); ?>");
$(".btn_idvettore").prop("disabled", true);
$(".btn_idvettore").addClass("disabled");
}else{
$("#idvettore").attr("required", true);
input("idvettore").enable();
$("label[for=idvettore]").text("<?php echo tr('Vettore'); ?>*");
$(".btn_idvettore").prop("disabled", false);
$(".btn_idvettore").removeClass("disabled");
}
} else{
$("#idvettore").attr("required", false);
$("#idvettore").attr("disabled", true);
$("label[for=idvettore]").text("'.tr('Vettore').'");
$("#idvettore").selectReset(" '.tr("Seleziona un'opzione").'");
$("#idvettore").next().next().find("button.bound:nth-child(1)").prop("disabled", true);
}else{
$("#idvettore").attr("required", true);
$("#idvettore").attr("disabled", false);
$("label[for=idvettore]").text("'.tr('Vettore').'*");
$("#idvettore").next().next().find("button.bound:nth-child(1)").prop("disabled", false);
input("idvettore").disable();
$("label[for=idvettore]").text("<?php echo tr('Vettore'); ?>");
$("#idvettore").selectReset("<?php echo tr("Seleziona un\'opzione"); ?>");
$(".btn_idvettore").prop("disabled", true);
$(".btn_idvettore").addClass("disabled");
}
});
$("#idcausalet").change(function() {
$("#idcausalet").change(function() {
if ($(this).val() == 3) {
$("#tipo_resa").attr("disabled", false);
}else{
$("#tipo_resa").attr("disabled", true);
$("#tipo_resa").attr("disabled", true);
}
});
</script>';
</script>
<?php
$tipo_resa = [
[
@ -609,8 +650,23 @@ if ($record['descrizione_tipo'] == 'Fattura accompagnatoria di vendita') {
}
echo '
</form>
</form>';
//Dich. intento collegata
if ($dir == 'entrata' && !empty($fattura->dichiarazione)){
if ($fattura->stato->descrizione == 'Bozza'){
echo '
<div class="alert alert-info">
<i class="fa fa-info"></i> '.tr("La fattura è collegata ad una dichiarazione d'intento con diponibilità residura pari a _MONEY_.", [ '_MONEY_' => moneyFormat(abs($diff)),]).'<br>'.tr("Per collegare una riga alla dichiarazione è sufficiente specificare come IVA _IVA_", ['_IVA_' => '"<b>'.$iva->codice.' - '.$iva->descrizione.'</b>"',]).'.</b>
</div>';
}
}
echo '
<!-- RIGHE -->
<div class="panel panel-primary">
<div class="panel-heading">

View File

@ -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;

View File

@ -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'].'" ]}
<input type="hidden" name="idcontratto_riga" value="'.$idcontratto_riga.'">
</div>

View File

@ -36,11 +36,11 @@ include_once __DIR__.'/../../core.php';
</div>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Spedizione predefinita'); ?>", "name": "predefined", "value": "$predefined$", "help":"<?php echo tr('Impostare questo tipo di spedizione come predefinito per i ddt'); ?>." ]}
{[ "type": "checkbox", "label": "<?php echo tr('Spedizione predefinita'); ?>", "name": "predefined", "value": "$predefined$", "help":"<?php echo tr('Impostare questo tipo di spedizione come predefinito per i documenti'); ?>." ]}
</div>
<div class="col-md-3">
{[ "type": "checkbox", "label": "<?php echo tr('Spedizione con vettore'); ?>", "name": "esterno", "value": "$esterno$", "help":"<?php echo tr('Impostare per rendere obbligatorio il campo vettore in fase di modifica ddt'); ?>." ]}
{[ "type": "checkbox", "label": "<?php echo tr('Rendi obbligatorio il vettore'); ?>", "name": "esterno", "value": "$esterno$", "help":"<?php echo tr('Impostare per rendere obbligatorio il campo vettore in fase di modifica documento'); ?>." ]}
</div>
</div>
</div>

View File

@ -0,0 +1,53 @@
<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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;
}

View File

@ -0,0 +1,34 @@
<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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;
}

View File

@ -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 '
<form action="" method="post" onsubmit="if($(this).parsley().validate()) { return avvia_stampa(); }" >
<div class="alert alert-info hidden" id="period">
<i class="fa fa-exclamation-circle"></i> '.tr('Non è possibile creare la stampa definitiva nel periodo selezionato, è necessario prima impostare un trimestre!').'
</div>
<div class="alert alert-warning hidden" id="is_definitiva">
<i class="fa fa-warning"></i> '.tr('È già presente la stampa definitiva per il periodo selezionato!').'
</div>
<form action="" method="post" id="form" >
<div class="row">';
if ($nome_stampa != 'Liquidazione IVA') {
echo '
if ($nome_stampa != 'Liquidazione IVA') {
echo '
<div class="col-md-4">
{[ "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" ]}
</div>';
}
echo '
}
echo '
<div class="col-md-4">
{[ "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'].'" ]}
</div>
<div class="col-md-4">
{[ "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'].'" ]}
</div>
</div>';
echo '
echo '
<div class="row">
<div class="col-md-4">
{[ "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 '
<div class="col-md-4">
{[ "type": "select", "label": "'.tr('Orientamento').'", "name": "orientation", "required": "1", "values": "list=\"L\": \"'.tr('Orizzontale').'\", \"P\": \"'.tr('Verticale').'\"", "value": "'.$_SESSION['stampe_contabili']['orientation'].'" ]}
</div>
</div>';
if ($nome_stampa != 'Liquidazione IVA') {
echo '
<div class="col-md-4">
{[ "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').'" ]}
</div>';
}
echo '
<div class="col-md-4 pull-right">
<p style="line-height:14px;">&nbsp;</p>
<button type="submit" class="btn btn-primary btn-block">
<button type="button" class="btn btn-primary btn-block" onclick="if($(\'#form\').parsley().validate()) { return avvia_stampa(); }">
<i class="fa fa-print"></i> '.tr('Stampa').'
</button>
</div>
</div>
</form>
<br>';
<script>$(document).ready(init)</script>';
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 '
<div class="box box-primary collapsable collapsed-box">
<div class="box-header with-border">
<h3 class="box-title"><i class="fa fa-print"></i> '.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']),
]).'</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-plus"></i></button>
</div>
</div>
<div class="box-body">
<ul>';
foreach ($elementi as $elemento) {
$descrizione = tr('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 '
<li>
<a class="btn btn-xs btn-primary" href="'.base_path().'/actions.php?id_module='.$id_module.'&op=download-allegato&id='.$file['id'].'&filename='.$file['filename'].'" target="_blank"><i class="fa fa-download"></i>
</a>
'.$descrizione.'
</li>';
}
if (empty($elementi)) {
echo '<p class="text-center">'.tr('Nessuna stampa presente').'</p>';
}
echo '
</ul>
</div>
</div>';
echo '
<script>
$(document).ready(init);
$(document).ready(function () {
eseguiControlli();
});
$("#date_start").blur(function(){
eseguiControlli();
});
$("#date_end").blur(function(){
eseguiControlli();
});
function eseguiControlli() {
let date_start = $("#date_start").data("DateTimePicker").date().format("YYYY-MM-DD");
let date_end = $("#date_end").data("DateTimePicker").date().format("YYYY-MM-DD");
controllaDate(date_start, date_end);
}
// Controllo se le date inserite corrispondono ad uno dei 4 trimestri
function controllaDate(date_start, date_end) {
let intervallo_corretto = 0;
let date = new Date(date_start);
let year = date.getFullYear();
let m_start = 0;
let m_end = 3;
for (i=0; i<=3; i++) {
let start = new Date(year, m_start, 1);
let end = new Date(year, m_end, 0);
int_start = start.getFullYear() + "-" + ("0" + (start.getMonth() + 1)).slice(-2) + "-" + ("0" + start.getDate()).slice(-2);
int_end = end.getFullYear() + "-" + ("0" + (end.getMonth() + 1)).slice(-2) + "-" + ("0" + end.getDate()).slice(-2);
if (date_start == int_start && date_end == int_end) {
intervallo_corretto = 1;
}
m_start += 3;
m_end += 3;
}
$("#is_definitiva").addClass("hidden");
if (intervallo_corretto) {
$("#period").addClass("hidden");
controllaStampa(date_start, date_end);
} else {
$("#period").removeClass("hidden");
input("definitiva").disable();
$("#definitiva").prop("checked", false);
}
}
// Controllo se è già stata creata una stampa definitiva nel periodo selezionato
function controllaStampa(date_start, date_end) {
$(document).load(globals.rootdir + "/ajax_complete.php?module=stampe_contabili&op=controlla_stampa&dir='.$dir.'&id_print='.$id_print.'&date_start=" + date_start + "&date_end=" + date_end, function(response) {
let stampa_definitiva = response;
if (stampa_definitiva==0) {
$("#is_definitiva").addClass("hidden");
input("definitiva").enable();
} else {
$("#is_definitiva").removeClass("hidden");
input("definitiva").disable();
$("#definitiva").prop("checked", false);
}
});
}
</script>';
}
echo '
<script>
function avvia_stampa (){
window.open("'.$link.'&dir='.$dir.'&id_sezionale="+$("#id_sezionale").val()+"&date_start="+$("#date_start").val()+"&date_end="+$("#date_end").val()+"");
if ($("#definitiva").is(":checked")) {
let date_start = $("#date_start").data("DateTimePicker").date().format("YYYY-MM-DD");
let date_end = $("#date_end").data("DateTimePicker").date().format("YYYY-MM-DD");
$.ajax({
url: globals.rootdir + "/actions.php",
type: "POST",
data: {
id_module: globals.id_module,
op: "crea_definitiva",
date_start: date_start,
date_end: date_end,
id_print: '.$id_print.',
id_sezionale: $("#id_sezionale").val(),
dir: "'.$dir.'",
},
success: function(result) {
window.open("'.$link.'&dir='.$dir.'&id_sezionale="+$("#id_sezionale").val()+"&date_start="+$("#date_start").val()+"&date_end="+$("#date_end").val()+"");
$("#modals > div").modal("hide");
}
});
} else {
window.open("'.$link.'&dir='.$dir.'&notdefinitiva=1&id_sezionale="+$("#id_sezionale").val()+"&date_start="+$("#date_start").val()+"&date_end="+$("#date_end").val()+"");
$("#modals > div").modal("hide");
}
}
$("#format").change(function() {
session_set("stampe_contabili,format", $(this).val(), 0, 0);
});
$("#orientation").change(function() {
session_set("stampe_contabili,orientation", $(this).val(), 0, 0);
});
$("#format").change(function() {
session_set("stampe_contabili,format", $(this).val(), 0, 0);
});
$(function() {
});
$("#orientation").change(function() {
session_set("stampe_contabili,orientation", $(this).val(), 0, 0);
});
</script>';

View File

@ -25,6 +25,9 @@ echo '
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="add">
<!-- Fix creazione da Anagrafica -->
<input type="hidden" name="id_record" value="">
<div class="row">
<div class="col-md-4">
@ -40,18 +43,18 @@ echo '
</div>
<div class="col-md-3">
{[ "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-" ]}
</div>
</div>
<div class="row">
<div class="col-md-3">
{[ "type": "date", "label": "'.tr('Data di inizio').'", "name": "data_inizio", "required": 1 ]}
{[ "type": "date", "label": "'.tr('Data inizio').'", "name": "data_inizio", "required": 1 ]}
</div>
<div class="col-md-3">
{[ "type": "date", "label": "'.tr('Data di fine').'", "name": "data_fine", "required": 1 ]}
{[ "type": "date", "label": "'.tr('Data fine').'", "name": "data_fine", "required": 1 ]}
</div>
<div class="col-md-3">

View File

@ -42,18 +42,18 @@ echo '
</div>
<div class="col-md-3">
{[ "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'].'" ]}
</div>
</div>
<div class="row">
<div class="col-md-3">
{[ "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'].'" ]}
</div>
<div class="col-md-3">
{[ "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'].'" ]}
</div>
<div class="col-md-3">
@ -61,7 +61,7 @@ echo '
</div>
<div class="col-md-3">
{[ "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 ]}
</div>
</div>

View File

@ -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),

View File

@ -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);
}
},

View File

@ -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 '
</div>';
// Pagamento
$pagamento = Pagamento::where('codice_modalita_pagamento_fe', $codice_modalita_pagamento)->where('predefined', '1')->first();
echo '
<div class="row" >
<div class="col-md-3">
@ -269,7 +271,7 @@ echo '
<i class="fa fa-refresh"></i> '.tr('Visualizza tutte le modalità').'
</button>
{[ "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.'" ]}
</div>';
// Movimentazioni
@ -324,6 +326,34 @@ if (!empty($righe)) {
<tbody>';
// 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']);
$start_query = $query;
@ -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 '
<tr data-id="'.$key.'" data-qta="'.$qta.'" data-prezzo_unitario="'.$prezzo_unitario.'" data-iva_percentuale="'.$riga['AliquotaIVA'].'">
<td>
'.(empty($codice_principale) ? '<span class="label label-warning pull-right text-muted articolo-warning hidden">'.tr('Creazione automatica articolo non disponibile').'</span>' : '').'
<small class="pull-right text-muted" id="riferimento_'.$key.'"></small>
<small class="pull-right text-muted" id="riferimento_'.$key.'"></small><br>
<small class="pull-right text-muted">'.$riferimento_fe.'</small>
'.$riga['Descrizione'].'<br>
@ -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, "<br>");
}
$("#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("<br><b class=\"tip\" title=\"" + tooltip_icona + "\"><i class=\"fa " + icona_documento + "\"></i> " + documento.opzione + "</b><br>");
// 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 = `<i class="fa fa-check"></i> ` + contenuto;
elemento.addClass("text-success").removeClass("text-warning");

View File

@ -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();

View File

@ -25,6 +25,9 @@ echo '
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="addreferente">
<!-- Fix creazione da Anagrafica -->
<input type="hidden" name="id_record" value="">
<div class="row">
<div class="col-md-6">
{[ "type": "text", "label": "'.tr('Nominativo').'", "name": "nome", "required": 1 ]}

View File

@ -25,6 +25,9 @@ echo '
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="addsede">
<!-- Fix creazione da Anagrafica -->
<input type="hidden" name="id_record" value="">
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Anagrafica').'", "name": "id_anagrafica", "required": "1", "value": "'.$id_parent.'", "ajax-source": "anagrafiche", "disabled": 1 ]}

View File

@ -699,6 +699,8 @@ class Prints
$file['pdf'] = file_get_contents($filename);
}
$file['pages'] = $mpdf->pages;
return $file;
}

View File

@ -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;

View File

@ -17,18 +17,14 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
echo '
<table style="color:#aaa; font-size:10px;">
<tr>
<td align="left" style="width:97mm;">
'.tr('Stampato con OpenSTAManager il _DATE_', ['_DATE_' => date('d/m/Y')]).'
</td>
<td class="text-right" style="width:97mm;">
'.tr('Pagina _PAGE_ di _TOTAL_', [
'_PAGE_' => '{PAGENO}',
'_TOTAL_' => '{nb}',
if (!empty($page)) {
echo '
<p class="text-right">
'.tr('_YEAR_/_PAGE_', [
'_PAGE_' => $page++,
'_YEAR_' => date('Y'),
]).'
</td>
</tr>
</table>';
</p>';
} else {
echo '<p></p>';
}

View File

@ -0,0 +1,32 @@
<?php
/*
* OpenSTAManager: il software gestionale open source per l'assistenza tecnica e la fatturazione
* Copyright (C) DevCode s.r.l.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/*
* 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 '
<div class="text-right">
<p><b>'.$f_ragionesociale.'</b></p>
</div>';

View File

@ -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,

View File

@ -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), \",\", \"#\"), \".\", \",\"), \"#\", \".\"), \"&euro;\") AS dato FROM mg_articoli WHERE qta>0 AND deleted_at IS NULL AND servizio=0' WHERE `zz_widgets`.`name` = 'Valore magazzino';
UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS(\" \", REPLACE(REPLACE(REPLACE(FORMAT(SUM(prezzo_acquisto*qta),2), \",\", \"#\"), \".\", \",\"), \"#\", \".\"), \"&euro;\") 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, \'<br />\',IF(an_sedi.telefono!=\'\',CONCAT(an_sedi.telefono,\'<br />\'),\'\'),IF(an_sedi.cellulare!=\'\',CONCAT(an_sedi.cellulare,\'<br />\'),\'\'),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<br>\',IF(an_anagrafiche.telefono!=\'\',CONCAT(an_anagrafiche.telefono,\'<br />\'),\'\'),IF(an_anagrafiche.cellulare!=\'\',CONCAT(an_anagrafiche.cellulare,\'<br />\'),\'\'),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&agrave;\") 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, '''', ''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);