mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-01-27 22:19:26 +01:00
6510807bdd
Miglioramento della presentazione del progetto e delle informazioni relative. Aggiunti messaggi per segnalare il collegamento dei documenti tra di loro ed evitare cancellazioni involontarie. Unificato il sistema di identificazione dei numeri (ora abbreviati in "num.").
369 lines
16 KiB
PHP
369 lines
16 KiB
PHP
<?php
|
|
|
|
include_once __DIR__.'/../../../core.php';
|
|
|
|
/*
|
|
GESTIONE ORDINI DI SERVIZIO
|
|
*/
|
|
$mesi = [
|
|
tr('Gennaio'),
|
|
tr('Febbraio'),
|
|
tr('Marzo'),
|
|
tr('Aprile'),
|
|
tr('Maggio'),
|
|
tr('Giugno'),
|
|
tr('Luglio'),
|
|
tr('Agosto'),
|
|
tr('Settembre'),
|
|
tr('Ottobre'),
|
|
tr('Novembre'),
|
|
tr('Dicembre'),
|
|
];
|
|
|
|
// Pianificazione fatture
|
|
if ($get['op'] == 'add_fatturazione') {
|
|
$prev_data = '';
|
|
|
|
// Azzero la pianificazione zone se era già stata fatta, per poter sostituire la pianificazione,
|
|
// mantenendo però le pianificazioni già fatturate
|
|
foreach ($post['zona'] as $data_scadenza => $zone) {
|
|
foreach ($zone as $n => $idzona) {
|
|
$dbo->query('DELETE FROM co_ordiniservizio_pianificazionefatture WHERE idzona='.prepare($idzona).' AND iddocumento=0 AND idcontratto='.prepare($id_record));
|
|
}
|
|
}
|
|
|
|
// Ciclo fra le voci in arrivo dal form
|
|
foreach ($post['zona'] as $data_scadenza => $zone) {
|
|
// Ogni data può avere più zone da pianificare
|
|
foreach ($zone as $n => $idzona) {
|
|
// Aggiunta pianificazione solo se la zona è spuntata
|
|
if (in_array($idzona, $post['idzona'])) {
|
|
// Creazione pianificazione
|
|
$dbo->query('INSERT INTO co_ordiniservizio_pianificazionefatture(idcontratto, data_scadenza, idzona, iddocumento) VALUES('.prepare($id_record).', '.prepare($data_scadenza).', '.prepare($idzona).', 0)');
|
|
}
|
|
|
|
$prev_data = $data_scadenza;
|
|
}
|
|
}
|
|
|
|
$_SESSION['infos'][] = tr('Pianificazione generata correttamente!');
|
|
}
|
|
|
|
// Eliminazione pianificazione specifica
|
|
elseif ($get['op'] == 'del_pianificazione') {
|
|
$idpianificazione = $get['idpianificazione'];
|
|
|
|
$n = $dbo->fetchNum('SELECT id FROM co_ordiniservizio_pianificazionefatture WHERE id='.prepare($idpianificazione));
|
|
|
|
if ($n == 1) {
|
|
// Eliminazione ordine di servizio
|
|
if ($dbo->query('DELETE FROM co_ordiniservizio_pianificazionefatture WHERE id='.prepare($idpianificazione))) {
|
|
$_SESSION['infos'][] = tr('Pianificazione eliminata correttamente!');
|
|
}
|
|
}
|
|
}
|
|
|
|
// Creazione fattura pianificata
|
|
elseif ($get['op'] == 'addfattura') {
|
|
include $docroot.'/modules/fatture/modutil.php';
|
|
|
|
$idpianificazione = $get['idpianificazione'];
|
|
$descrizione = post('note');
|
|
$data = $post['data'];
|
|
$idtipodocumento = $post['idtipodocumento'];
|
|
$note = $post['note'];
|
|
|
|
// Lettura idanagrafica
|
|
$rs = $dbo->fetchArray('SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record));
|
|
$idanagrafica = $rs[0]['idanagrafica'];
|
|
|
|
$dir = 'entrata';
|
|
$numero = get_new_numerofattura($data);
|
|
$numero_esterno = get_new_numerosecondariofattura($data);
|
|
|
|
// Tipo di pagamento predefinito dall'anagrafica
|
|
$query = 'SELECT id FROM co_pagamenti WHERE id=(SELECT idpagamento_vendite FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica).')';
|
|
$rs = $dbo->fetchArray($query);
|
|
$idpagamento = $rs[0]['id'];
|
|
|
|
// Se non è stato associato un pagamento predefinito al cliente leggo il pagamento dalle impostazioni
|
|
if ($idpagamento == '') {
|
|
$idpagamento = get_var('Tipo di pagamento predefinito');
|
|
}
|
|
|
|
$query = 'INSERT INTO co_documenti(numero, numero_esterno, idanagrafica, idtipodocumento, idpagamento, data, idstatodocumento, note, idsede) VALUES ('.prepare($numero).', '.prepare($numero_esterno).', '.prepare($idanagrafica).', '.prepare($idtipodocumento).', '.prepare($idpagamento).', '.prepare($data).", (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`='Bozza'), ".prepare($note).', (SELECT idsede_fatturazione FROM an_anagrafiche WHERE idanagrafica='.prpeare($idanagrafica).') )';
|
|
$dbo->query($query);
|
|
$iddocumento = $dbo->lastInsertedID();
|
|
|
|
// Imposto l'iddocumento anche sulla pianificazione, giusto per tener traccia della fattura generata
|
|
$dbo->query('UPDATE co_ordiniservizio_pianificazionefatture SET iddocumento='.prepare($iddocumento).' WHERE id='.prepare($idpianificazione));
|
|
|
|
// Leggo quante rate si vogliono pagare per dividerle per mese
|
|
$rs = $dbo->fetchArray('SELECT id FROM co_ordiniservizio_pianificazionefatture WHERE idcontratto='.prepare($id_record));
|
|
|
|
// L'importo deve essere diviso per il numero di mesi
|
|
$rs2 = $dbo->fetchArray('SELECT SUM(subtotale) AS totale FROM co_righe2_contratti WHERE idcontratto='.prepare($id_record));
|
|
$importo = $rs2[0]['totale'] / sizeof($rs);
|
|
|
|
// Lettura iva del cliente o predefinita
|
|
$rs2 = $dbo->fetchArray('SELECT idiva FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica));
|
|
$idiva = $rs2[0]['idiva'];
|
|
|
|
if ($idiva != 0) {
|
|
$rs2 = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare($idiva));
|
|
} else {
|
|
$rs2 = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare(get_var('Iva predefinita')));
|
|
}
|
|
|
|
$desc_iva = $rs2[0]['descrizione'];
|
|
|
|
$iva = $importo / 100 * $rs2[0]['percentuale'];
|
|
$iva_indetraibile = $importo / 100 * $rs2[0]['indetraibile'];
|
|
|
|
// Inserimento riga in fattura
|
|
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, descrizione, desc_iva, iva, iva_indetraibile, subtotale, um, qta, `order`) VALUES('.prepare($iddocumento).', '.prepare($descrizione).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($importo).", '-', 1, (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento=".prepare($iddocumento).'))');
|
|
|
|
redirect($rootdir.'/editor.php?id_module='.Modules::getModule('Fatture di vendita')['id'].'&id_record='.$iddocumento.'&dir=entrata');
|
|
exit();
|
|
}
|
|
|
|
echo '
|
|
<div class="box">
|
|
<div class="box-header with-border">
|
|
<h3 class="box-title">'.tr('Pianificazione fatturazione').'</h3>
|
|
</div>
|
|
<div class="box-body">';
|
|
|
|
echo '
|
|
<p>'.tr('Qui puoi programmare la fatturazione del contratto').'.</p>';
|
|
|
|
/*
|
|
Fatture pianificate
|
|
*/
|
|
$rs = $dbo->fetchArray('SELECT *, (SELECT SUM(subtotale) FROM co_righe2_contratti WHERE idcontratto='.prepare($id_record).') AS budget_contratto, (SELECT descrizione FROM an_zone WHERE id=idzona) AS zona FROM co_ordiniservizio_pianificazionefatture WHERE idcontratto='.prepare($id_record).' ORDER BY data_scadenza ASC');
|
|
|
|
if (empty($rs)) {
|
|
echo '
|
|
<p>'.tr('Non sono ancora state pianificate fatture').'...</p>';
|
|
} else {
|
|
$rs2 = $dbo->fetchArray('SELECT * FROM co_ordiniservizio_pianificazionefatture WHERE idcontratto='.prepare($id_record).' ORDER BY idzona');
|
|
|
|
for ($i = 0; $i < sizeof($rs2); ++$i) {
|
|
// Leggo quante rate sono pianificate per dividere l'importo delle sedi in modo corretto
|
|
++$n_rate[$rs2[$i]['idzona']];
|
|
|
|
// Leggo il totale già fatturato per questa zona per toglierlo dalla divisione (totale/n_rate)
|
|
$rs3 = $dbo->fetchArray('SELECT SUM(subtotale-sconto) AS totale FROM co_righe_documenti WHERE iddocumento IN (SELECT iddocumento FROM co_ordiniservizio_pianificazionefatture WHERE iddocumento='.prepare($rs2[$i]['iddocumento']).')');
|
|
$gia_fatturato[$rs2[$i]['idzona']] += $rs3[0]['totale'];
|
|
}
|
|
|
|
echo '
|
|
<table class="table table-bordered table-striped table-hover table-condensed">
|
|
<tr>
|
|
<th width="10%">'.tr('Scadenza').'</th>
|
|
<th width="15%">'.tr('Zona').'</th>
|
|
<th width="15%">'.tr('Importo').'</th>
|
|
<th>'.tr('Documento').'</th>
|
|
<th width="20%">'.tr('Stato').'</th>
|
|
<th width="12%"></th>
|
|
</tr>';
|
|
|
|
$prev_mese = '';
|
|
$n_rata = 0;
|
|
|
|
for ($i = 0; $i < sizeof($rs); ++$i) {
|
|
// Lettura numero di sedi in cui si sono pianificati ordini di servizio per la zona corrente
|
|
if (!empty($rs[$i]['idzona'])) {
|
|
$n_sedi_pianificate = $dbo->fetchNum('SELECT DISTINCT(idsede) FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).') AND idsede IN(SELECT id FROM an_sedi WHERE idzona='.prepare($rs[$i]['idzona']).')');
|
|
|
|
// Verifico se ci sono impianti in questa zona legati alla sede legale
|
|
$n_sedi_pianificate += $dbo->fetchNum('SELECT DISTINCT(idsede) FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).') AND idsede=(SELECT idsede FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record).') AND idzona='.prepare($rs[$i]['idzona']).') AND idsede=0');
|
|
}
|
|
// Fix nel caso non siano previste sedi pianificate (l'eventuale 0 portava a problemi nel calcolo dell'importo)
|
|
$n_sedi_pianificate = ($n_sedi_pianificate < 1) ? 1 : $n_sedi_pianificate;
|
|
// else{
|
|
// $n_sedi_pianificate = $dbo->fetchNum("SELECT (idsede) FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto=\"".$id_record."\") AND idsede=0");
|
|
// }
|
|
|
|
echo '
|
|
<tr>
|
|
<td>';
|
|
// Data scadenza
|
|
if ($prev_mese != $rs[$i]['data_scadenza']) {
|
|
++$n_rata;
|
|
echo '
|
|
<b>'.$mesi[intval(date('m', strtotime($rs[$i]['data_scadenza']))) - 1].' '.date('Y', strtotime($rs[$i]['data_scadenza'])).'</b></td>';
|
|
}
|
|
echo '
|
|
</td>';
|
|
|
|
// Sede
|
|
if ($rs[$i]['zona'] == '') {
|
|
$zona = 'Altro';
|
|
} else {
|
|
$zona = $rs[$i]['zona'];
|
|
}
|
|
|
|
if ($n_sedi_pianificate == 1) {
|
|
$n_sedi = tr('1 sede');
|
|
} else {
|
|
$n_sedi = tr('_NUM_ sedi', [
|
|
'_NUM_' => $n_sedi_pianificate,
|
|
]);
|
|
}
|
|
|
|
echo '
|
|
<td>'.$zona.' ('.$n_sedi.')</td>';
|
|
|
|
/*
|
|
Importo
|
|
*/
|
|
// Se è stata emessa una fattura, bisogna utilizzare il totale della fattura da scalare al totale pianificato
|
|
if ($rs[$i]['iddocumento'] != 0) {
|
|
$rs2 = $dbo->fetchArray('SELECT SUM(subtotale-sconto) AS totale FROM co_righe_documenti WHERE iddocumento='.prepare($rs[$i]['iddocumento']));
|
|
$importo = $rs2[0]['totale'];
|
|
} else {
|
|
// $importo = ($rs[$i]['budget_contratto'] * $n_sedi_pianificate / $n_rate[ $rs[$i]['idzona'] ]) - ($gia_fatturato[ $rs[$i]['idzona'] ] * $n_sedi_pianificate / sizeof($gia_fatturato[ $rs[$i]['idzona'] ]) );
|
|
$importo = ($rs[$i]['budget_contratto'] * $n_sedi_pianificate / $n_rate[$rs[$i]['idzona']]);
|
|
}
|
|
|
|
echo '
|
|
<td class="center">
|
|
'.Translator::numberToLocale($importo).' €<br>
|
|
<small>'.Translator::numberToLocale($rs[$i]['budget_contratto']).' € x '.$n_sedi_pianificate.' sedi / '.$n_rate[$rs[$i]['idzona']].' rate'.$extra.'</small>
|
|
</td>';
|
|
|
|
// Documento collegato (fattura)
|
|
if ($rs[$i]['iddocumento'] != 0) {
|
|
$rsf = $dbo->fetchArray('SELECT numero, numero_esterno, data, (SELECT SUM(subtotale) FROM co_righe_documenti WHERE iddocumento=co_documenti.id) AS imponibile, (SELECT icona FROM co_statidocumento WHERE id=co_documenti.idstatodocumento) AS icona, (SELECT descrizione FROM co_statidocumento WHERE id=co_documenti.idstatodocumento) AS stato FROM co_documenti WHERE id='.prepare($rs[$i]['iddocumento']));
|
|
|
|
if ($rsf[0]['numero_esterno'] != '') {
|
|
$numero_doc = $rsf[0]['numero_esterno'];
|
|
} else {
|
|
$numero_doc = $rsf[0]['numero'];
|
|
}
|
|
|
|
$documento = Modules::link('Fatture di vendita', $rs[$i]['iddocumento'], tr('Fattura num. _NUM_ del _DATE_', [
|
|
'_NUM_' => $numero_doc,
|
|
'_DATE_' => Translator::dateToLocale($rsf[0]['data']),
|
|
]));
|
|
|
|
$stato = '<i class="'.$rsf[0]['icona'].'"></i> '.$rsf[0]['stato'];
|
|
} else {
|
|
$documento = '';
|
|
$stato = '<i class="fa fa-clock-o"></i> '.tr('Non ancora fatturato');
|
|
}
|
|
|
|
// Link a fattura
|
|
echo '
|
|
<td>'.$documento.'</td>';
|
|
|
|
// Stato
|
|
echo '
|
|
<td>'.$stato.'</td>';
|
|
|
|
// Funzioni
|
|
echo '
|
|
<td>';
|
|
if ($rs[$i]['iddocumento'] == 0) {
|
|
// Creazione fattura
|
|
echo "
|
|
<button type='button' class='btn btn-primary btn-sm' onclick=\"launch_modal( 'Crea fattura', '".$rootdir.'/modules/contratti/plugins/addfattura.php?idcontratto='.$id_record.'&idpianificazione='.$rs[$i]['id'].'&importo='.$importo.'&n_rata='.$n_rata."', 1 );\">
|
|
<i class='fa fa-euro'></i> ".tr('Crea fattura').'
|
|
</button>';
|
|
|
|
// Eliminazione pianificazione
|
|
echo '
|
|
<a class="btn btn-danger ask" data-backto="record-edit" data-method="get" data-op="del_pianificazione" data-idpianificazione="'.$rs[$i]['id'].'" data-msg="'.tr('Vuoi eliminare questa pianificazione?').'">
|
|
<i class="fa fa-trash"></i>
|
|
</a>';
|
|
}
|
|
|
|
echo '
|
|
</td>
|
|
</tr>';
|
|
|
|
$prev_mese = $rs[$i]['data_scadenza'];
|
|
}
|
|
echo '
|
|
</table>';
|
|
}
|
|
echo '
|
|
<br><br>';
|
|
|
|
/*
|
|
Schema per pianificare la fatturazione per zona
|
|
*/
|
|
$rs = $dbo->fetchArray('SELECT id, descrizione FROM an_zone WHERE ( id IN (SELECT idzona FROM an_sedi WHERE id IN (SELECT idsede FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).'))) ) OR ( id=(SELECT idzona FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record).") AND idzona=an_zone.id) ) UNION SELECT 0, 'Altro'");
|
|
|
|
if (sizeof($rs) == 0) {
|
|
echo '
|
|
<p>'.tr('Non sono ancora stati pianificati ordini di servizio').'...</p>';
|
|
}
|
|
|
|
// Elenco voci di servizio con mesi in cui eseguirle
|
|
else {
|
|
// Calcolo mese iniziale e finale del contratto
|
|
$rs2 = $dbo->fetchArray('SELECT data_accettazione, data_conclusione, TIMESTAMPDIFF( MONTH, data_accettazione, data_conclusione ) AS mesi FROM co_contratti WHERE id='.prepare($id_record));
|
|
$n_mesi = $rs2[0]['mesi'] + 1;
|
|
$mese_start = date('m', strtotime($rs2[0]['data_accettazione']));
|
|
|
|
echo "
|
|
<button type='button' class='btn btn-primary' onclick=\"$(this).next().next().removeClass('hide'); $(this).remove();\">
|
|
<i class='fa fa-calendar'></i> ".tr('Pianifica la fatturazione').'
|
|
</button>
|
|
<br>';
|
|
|
|
echo "
|
|
<form action='".$rootdir.'/editor.php?id_module='.Modules::getModule('Contratti')['id'].'&id_record='.$id_record."&op=add_fatturazione' id='pianifica_form' method='post' class='hide'>
|
|
<input type='hidden' name='backto' value='record-edit'>";
|
|
|
|
// Indice zone fatturabili
|
|
echo '
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
{[ "type": "select", "label": "'.tr('Zone di cui pianificare la fatturazione').'", "name": "idzona[]", "value": "", "values": "query=SELECT id, descrizione FROM an_zone WHERE (id IN (SELECT idzona FROM an_sedi WHERE id IN (SELECT idsede FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).')))) OR ( id=(SELECT idzona FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record).') AND idzona=an_zone.id) ) UNION SELECT 0, \'Altro\'", "multiple": 1, "extra": "onchange=\"$(this).find(\'option\').each( function(){ if( $(this).is(\':selected\') ){ $(\'#zona_\'+$(this).val()).removeClass(\'hide\'); }else{ $(\'#zona_\'+$(this).val()).addClass(\'hide\'); } });\"" ]}
|
|
</div>
|
|
</div>';
|
|
|
|
// Zone
|
|
for ($i = 0; $i < sizeof($rs); ++$i) {
|
|
echo '
|
|
<div class="hide" id="zona_'.$rs[$i]['id'].'">
|
|
<big><b>'.$rs[$i]['descrizione'].'</b></big>
|
|
<hr>
|
|
<div class="row">';
|
|
|
|
for ($j = 0; $j < $n_mesi; ++$j) {
|
|
echo '
|
|
<div class="col-md-3">
|
|
<small><label for="m_'.date('Ym', strtotime($rs2[0]['data_accettazione'].' +'.$j.' month')).'_'.$rs[$i]['id'].'">
|
|
<input type="checkbox" id="m_'.date('Ym', strtotime($rs2[0]['data_accettazione'].' +'.$j.' month')).'_'.$rs[$i]['id'].'" name="zona['.date('Y-m-t', strtotime($rs2[0]['data_accettazione'].' +'.$j.' month')).'][]" value="'.$rs[$i]['id'].'" />'.$mesi[intval(date('m', strtotime($rs2[0]['data_accettazione'].' +'.$j.' month'))) - 1].' '.date('Y', strtotime($rs2[0]['data_accettazione'].' +'.$j.' month')).'
|
|
</label></small>
|
|
</div>';
|
|
}
|
|
|
|
echo '
|
|
</div>
|
|
</div>';
|
|
}
|
|
|
|
echo "
|
|
|
|
<div class='clearfix'></div>
|
|
<br>";
|
|
|
|
// Pianificazione
|
|
echo "
|
|
<button type='button' class='btn btn-primary' onclick=\"if( $('input[type=checkbox]:checked').length>0 ){ if( confirm('Pianificare la fatturazione?') ){ $('#pianifica_form').submit(); } }\">
|
|
<i class='fa fa-plus'></i> ".tr('Pianifica ora').'
|
|
</button>';
|
|
|
|
echo '
|
|
</form>';
|
|
}
|
|
|
|
echo '
|
|
</div>
|
|
</div>';
|