openstamanager/modules/primanota/add.php

345 lines
12 KiB
PHP
Raw Normal View History

<?php
include_once __DIR__.'/../../core.php';
use Modules\Anagrafiche\Anagrafica;
2019-11-15 15:11:20 +01:00
use Modules\Fatture\Fattura;
2019-07-25 12:54:28 +02:00
$module = Modules::get('Prima nota');
2019-07-25 12:54:28 +02:00
$variables = Modules::get('Fatture di vendita')->getPlaceholders($id_documento);
$righe = [];
// Registrazione da remoto
$id_records = get('id_records');
if (!empty($id_records)) {
$id_records = str_replace(';', ',', $id_records);
if (get('origine') == 'fatture') {
$id_documenti = $id_records;
} else {
$id_scadenze = $id_records;
}
2019-07-25 12:54:28 +02:00
}
2019-07-25 15:06:07 +02:00
// ID predefiniti
2019-07-31 18:22:35 +02:00
$dir = 'uscita'; // Le scadenze normali hanno solo direzione in uscita
2019-07-25 15:06:07 +02:00
$singola_scadenza = get('single') != null;
2019-07-31 18:22:35 +02:00
$is_insoluto = get('is_insoluto') != null;
2019-07-25 15:06:07 +02:00
2019-07-25 12:54:28 +02:00
$id_documenti = $id_documenti ?: get('id_documenti');
$id_documenti = $id_documenti ? explode(',', $id_documenti) : [];
2019-07-25 15:06:07 +02:00
$id_scadenze = $id_scadenze ?: get('id_scadenze');
$id_scadenze = $id_scadenze ? explode(',', $id_scadenze) : [];
// Scadenze
foreach ($id_scadenze as $id_scadenza) {
2019-07-31 18:22:35 +02:00
$scadenza = $dbo->fetchOne('SELECT *, SUM(da_pagare - pagato) AS rata FROM co_scadenziario WHERE id='.prepare($id_scadenza));
2019-07-25 15:48:28 +02:00
if (!empty($scadenza['iddocumento'])) {
2019-07-25 15:06:07 +02:00
$id_documenti[] = $scadenza['iddocumento'];
continue;
}
2019-07-31 18:22:35 +02:00
$scadenza['rata'] = abs($scadenza['rata']);
2019-07-25 15:06:07 +02:00
$descrizione_conto = ($dir == 'entrata') ? 'Riepilogativo clienti' : 'Riepilogativo fornitori';
$conto = $dbo->fetchOne('SELECT id FROM co_pianodeiconti3 WHERE descrizione = '.prepare($descrizione_conto));
$id_conto_controparte = $conto['id'];
$righe_documento = [];
$righe_documento[] = [
'id_scadenza' => $scadenza['id'],
2019-07-31 18:22:35 +02:00
'id_conto' => null,
2019-07-25 15:06:07 +02:00
'dare' => ($dir == 'entrata') ? 0 : $scadenza['rata'],
'avere' => ($dir == 'entrata') ? $scadenza['rata'] : 0,
];
$righe_documento[] = [
'id_scadenza' => $scadenza['id'],
2019-07-31 18:22:35 +02:00
'id_conto' => $id_conto_controparte,
2019-07-25 15:06:07 +02:00
'dare' => ($dir == 'entrata') ? $scadenza['rata'] : 0,
'avere' => ($dir == 'entrata') ? 0 : $scadenza['rata'],
];
2019-07-31 18:22:35 +02:00
// Se è un insoluto, inverto i valori
if ($is_insoluto) {
foreach ($righe_documento as $key => $value) {
$tmp = $value['avere'];
$righe_documento[$key]['avere'] = $righe_documento[$key]['dare'];
$righe_documento[$key]['dare'] = $tmp;
}
}
2019-07-25 15:06:07 +02:00
$righe = array_merge($righe, $righe_documento);
}
// Fatture
2019-07-25 12:54:28 +02:00
$numeri = [];
2019-07-25 15:06:07 +02:00
$counter = 0;
$id_documenti = array_unique($id_documenti);
$idanagrafica_mov = 0;
2019-07-25 12:54:28 +02:00
foreach ($id_documenti as $id_documento) {
$fattura = Fattura::find($id_documento);
$tipo = $fattura->tipo;
2019-07-25 12:54:28 +02:00
$dir = $fattura->direzione;
2019-07-25 15:06:07 +02:00
// Inclusione delle sole fatture in stato Emessa, Parzialmente pagato o Pagato
if (!in_array($fattura->stato->descrizione, ['Emessa', 'Parzialmente pagato', 'Pagato'])) {
++$counter;
continue;
}
2019-11-15 15:11:20 +01:00
if ($fattura->idanagrafica != $idanagrafica_mov && $idanagrafica_mov != '') {
$idanagrafica_mov = 0;
2019-11-15 15:11:20 +01:00
} else {
$idanagrafica_mov = $fattura->idanagrafica;
}
2019-07-25 15:06:07 +02:00
2019-07-25 12:54:28 +02:00
$numeri[] = !empty($fattura['numero_esterno']) ? $fattura['numero_esterno'] : $fattura['numero'];
2019-07-25 12:54:28 +02:00
$nota_credito = $tipo->descrizione == 'Nota di credito';
2019-07-25 12:54:28 +02:00
// Predisposizione prima riga
$conto_field = 'idconto_'.($dir == 'entrata' ? 'vendite' : 'acquisti');
$id_conto_aziendale = $fattura->pagamento[$conto_field] ?: setting('Conto aziendale predefinito');
2019-07-25 12:54:28 +02:00
// Predisposizione conto crediti clienti
$conto_field = 'idconto_'.($dir == 'entrata' ? 'cliente' : 'fornitore');
$id_conto_controparte = $fattura->anagrafica[$conto_field];
2019-07-25 12:54:28 +02:00
// Lettura delle scadenza della fattura
$scadenze = $dbo->fetchArray('SELECT id, ABS(da_pagare - pagato) AS rata FROM co_scadenziario WHERE iddocumento='.prepare($id_documento).' AND ABS(da_pagare) > ABS(pagato) ORDER BY YEAR(scadenza) ASC, MONTH(scadenza) ASC');
2019-07-25 12:54:28 +02:00
// Selezione prima scadenza
if ($singola_scadenza && !empty($scadenze)) {
$scadenze = [$scadenze[0]];
}
2019-07-25 12:54:28 +02:00
$righe_documento = [];
// Riga aziendale
$totale = sum(array_column($scadenze, 'rata'));
if ($totale != 0) {
$righe_azienda[] = [
2019-07-25 15:06:07 +02:00
'id_scadenza' => $scadenze[0]['id'],
2019-07-31 18:22:35 +02:00
'id_conto' => $id_conto_aziendale,
2019-10-25 17:16:19 +02:00
'dare' => ($dir == 'entrata') ? $totale : 0,
'avere' => ($dir == 'entrata') ? 0 : $totale,
2019-07-25 12:54:28 +02:00
];
}
2019-07-25 12:54:28 +02:00
// Riga controparte
foreach ($scadenze as $scadenza) {
$righe_documento[] = [
'id_scadenza' => $scadenza['id'],
2019-07-31 18:22:35 +02:00
'id_conto' => $id_conto_controparte,
2019-10-25 17:16:19 +02:00
'dare' => ($dir == 'entrata') ? 0 : $scadenza['rata'],
'avere' => ($dir == 'entrata') ? $scadenza['rata'] : 0,
2019-07-25 12:54:28 +02:00
];
}
2019-07-31 18:22:35 +02:00
// Se è una nota di credito o un insoluto, inverto i valori
2019-07-25 12:54:28 +02:00
if ($nota_credito || $is_insoluto) {
foreach ($righe_documento as $key => $value) {
$tmp = $value['avere'];
$righe_documento[$key]['avere'] = $righe_documento[$key]['dare'];
$righe_documento[$key]['dare'] = $tmp;
}
2019-11-15 15:11:20 +01:00
foreach ($righe_azienda as $key => $value) {
$tmp = $value['avere'];
$righe_azienda[$key]['avere'] = $righe_azienda[$key]['dare'];
$righe_azienda[$key]['dare'] = $tmp;
}
2019-07-25 12:54:28 +02:00
}
$righe = array_merge($righe, $righe_documento);
}
$k = 0;
2019-11-02 15:41:04 +01:00
foreach ($righe_azienda as $key => $riga_azienda) {
if ($righe_azienda[$key]['id_conto'] != $righe_azienda[$key - 1]['id_conto']) {
++$k;
}
$riga_documento[$k]['id_conto'] = $riga_azienda['id_conto'];
$riga_documento[$k]['dare'] += $riga_azienda['dare'];
$riga_documento[$k]['avere'] += $riga_azienda['avere'];
}
$righe = array_merge($righe, $riga_documento);
2019-07-25 12:54:28 +02:00
// Descrizione
$numero_scadenze = count($id_scadenze);
$numero_documenti = count($id_documenti);
if ($numero_documenti + $numero_scadenze > 1) {
2019-11-15 15:11:20 +01:00
if ($idanagrafica_mov != 0) {
$an = Anagrafica::find($idanagrafica_mov);
$descrizione = 'Pag. fatture '.$an->ragione_sociale.' num. '.implode(', ', $numeri);
2019-11-15 15:11:20 +01:00
} else {
$descrizione = 'Pag. fatture num. '.implode(', ', $numeri);
}
2019-07-25 12:54:28 +02:00
} elseif ($numero_documenti == 1) {
$numero_fattura = !empty($fattura['numero_esterno']) ? $fattura['numero_esterno'] : $fattura['numero'];
2019-07-25 12:54:28 +02:00
$tipo_fattura = $fattura->isNota() ? $tipo->descrizione : tr('Fattura');
2019-07-04 09:20:02 +02:00
2019-07-25 12:54:28 +02:00
if (!empty($is_insoluto)) {
$operation = tr('Registrazione insoluto');
} else {
$operation = tr('Pag.');
}
2018-05-11 14:48:46 +02:00
2019-07-25 12:54:28 +02:00
$descrizione = tr('_OP_ _DOC_ num. _NUM_ del _DATE_ (_NAME_)', [
'_OP_' => $operation,
'_DOC_' => strtolower($tipo_fattura),
'_NUM_' => $numero_fattura,
'_DATE_' => Translator::dateToLocale($fattura['data']),
'_NAME_' => $fattura->anagrafica['ragione_sociale'],
]);
} elseif ($numero_scadenze == 1) {
$descrizione = tr('Pag. _OP_ del _DATE_', [
'_OP_' => $scadenza['descrizione'],
'_DATE_' => Translator::dateToLocale($scadenza['scadenza']),
]);
}
2019-07-25 15:06:07 +02:00
if (!empty($id_records) && get('origine') == 'fatture' && !empty($counter)) {
$descrizione_stati = [];
$stati = $database->fetchArray("SELECT * FROM `co_statidocumento` WHERE descrizione IN ('Emessa', 'Parzialmente pagato', 'Pagato') ORDER BY descrizione");
foreach ($stati as $stato) {
$descrizione_stati[] = '<i class="'.$stato['icona'].'"></i> <small>'.$stato['descrizione'].'</small>';
}
echo '
<div class="alert alert-info">
<p>'.tr('Solo le fatture in stato _STATE_ possono essere registrate contabilmente ignorate', [
2019-07-31 18:22:35 +02:00
'_STATE_' => implode(', ', $descrizione_stati),
]).'.</p>
2019-07-25 15:06:07 +02:00
<p><b>'.tr('Sono state ignorate _NUM_ fatture', [
2019-07-31 18:22:35 +02:00
'_NUM_' => $counter,
]).'.</b></p>
2019-07-25 15:06:07 +02:00
</div>';
}
2019-07-25 12:54:28 +02:00
echo '
<form action="'.ROOTDIR.'/controller.php?id_module='.$module->id.'" method="post" id="add-form">
<input type="hidden" name="op" value="add">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="crea_modello" id="crea_modello" value="0">
2019-07-31 18:22:35 +02:00
<input type="hidden" name="idmastrino" id="idmastrino" value="0">
<input type="hidden" name="is_insoluto" value="'.$is_insoluto.'">';
2019-07-25 12:54:28 +02:00
echo '
2018-05-04 17:57:46 +02:00
<div class="row">
<div class="col-md-12">
2019-07-25 12:54:28 +02:00
{[ "type": "select", "label": "'.tr('Modello primanota').'", "id": "modello_primanota", "values": "query=SELECT idmastrino AS id, nome AS descrizione, descrizione as causale FROM co_movimenti_modelli GROUP BY idmastrino" ]}
2018-05-04 17:57:46 +02:00
</div>
</div>
<div class="row">
<div class="col-md-4">
2019-07-25 12:54:28 +02:00
{[ "type": "date", "label": "'.tr('Data movimento').'", "name": "data", "required": 1, "value": "-now-" ]}
</div>
<div class="col-md-8">
2019-07-25 12:54:28 +02:00
{[ "type": "text", "label": "'.tr('Causale').'", "name": "descrizione", "id": "desc", "required": 1, "value": '.json_encode($descrizione).' ]}
</div>
2019-07-25 12:54:28 +02:00
</div>';
2019-07-31 18:22:35 +02:00
include $structure->filepath('movimenti.php');
2019-07-25 12:54:28 +02:00
echo '
<!-- PULSANTI -->
<div class="row">
<div class="col-md-12 text-right">
2019-07-25 12:54:28 +02:00
<button type="button" class="btn btn-default" id="btn_crea_modello">
<i class="fa fa-plus"></i> '.tr('Aggiungi e crea modello').'
</button>
<button type="submit" class="btn btn-primary" id="add-submit">
<i class="fa fa-plus"></i> '.tr('Aggiungi').'
</button>
</div>
</div>
2019-07-25 12:54:28 +02:00
</form>';
?>
<script type="text/javascript">
var variables = <?php echo json_encode($variables); ?>;
var nuovo_modello = "<?php echo tr('Aggiungi e crea modello'); ?>";
var modifica_modello = "<?php echo tr('Aggiungi e modifica modello'); ?>";
2019-08-01 10:08:34 +02:00
$(document).ready(function(e) {
$("#bs-popup #add-form").on("submit", function(e) {
return calcolaBilancio();
2019-07-25 12:54:28 +02:00
});
$('#bs-popup #modello_primanota').change(function() {
if ($(this).val() != '') {
$('#btn_crea_modello').html('<i class="fa fa-edit"></i> ' + modifica_modello);
$('#bs-popup #idmastrino').val($(this).val());
} else {
$('#btn_crea_modello').html('<i class="fa fa-plus"></i> ' + nuovo_modello);
$('#bs-popup #idmastrino').val(0);
}
2019-07-25 12:54:28 +02:00
var idmastrino = $(this).val();
var replaced = 0;
if (idmastrino != '') {
var causale = $(this).find('option:selected').data('causale');
if ($('#iddocumento').val() != '') {
for (i in variables) {
if (causale.includes('{' + i + '}')) {
replaced++;
causale = causale.replace('{' + i + '}', variables[i]);
}
}
2019-07-25 12:54:28 +02:00
} else {
for (i in variables) {
causale = causale.replace('{' + i + '}', '_');
}
2019-07-25 12:54:28 +02:00
}
2019-07-25 12:54:28 +02:00
// aggiornava erroneamente anche la causale ed eventuale numero di fattura e data
if (replaced > 0 || $('#iddocumento').val() == '') {
$('#bs-popup #desc').val(causale);
}
2019-07-25 12:54:28 +02:00
$.get(globals.rootdir + '/ajax_complete.php?op=get_conti&idmastrino=' + idmastrino, function(data) {
var conti = data.split(',');
for (i = 0; i < conti.length; i++) {
var conto = conti[i].split(';');
// Sostituzione conto cliente/fornitore
if (conto[0] == -1) {
if ($('#iddocumento').val() != '') {
var option = $("<option selected></option>").val(variables['conto']).text(variables['conto_descrizione']);
$('#bs-popup #conto' + i).selectReset();
$('#bs-popup #conto' + i).append(option).trigger('change');
}
2019-07-25 12:54:28 +02:00
} else {
var option = $("<option selected></option>").val(conto[0]).text(conto[1]);
$('#bs-popup #conto' + i).selectReset();
$('#bs-popup #conto' + i).append(option).trigger('change');
}
}
2019-07-25 12:54:28 +02:00
for (i = 9; i >= conti.length; i--) {
$('#bs-popup #conto' + i).selectReset();
console.log('#bs-popup #conto' + i);
}
2019-07-25 12:54:28 +02:00
});
}
});
$('#bs-popup #btn_crea_modello').click(function() {
$('#bs-popup #crea_modello').val("1");
$('#bs-popup #add-form').submit();
});
});
</script>