mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-02-01 16:36:45 +01:00
Aggiornamento passaggi tra documenti
This commit is contained in:
parent
f419db5872
commit
df1102d4b5
@ -2,9 +2,7 @@
|
||||
|
||||
$result['id'] = isset($result['id']) ? $result['id'] : null;
|
||||
|
||||
/*
|
||||
Form di inserimento riga documento
|
||||
*/
|
||||
// Form di inserimento riga documento
|
||||
echo '
|
||||
<form action="'.ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'" method="post">
|
||||
<input type="hidden" name="id_plugin" value="'.$id_plugin.'">
|
||||
|
322
include/common/importa.php
Normal file
322
include/common/importa.php
Normal file
@ -0,0 +1,322 @@
|
||||
<?php
|
||||
|
||||
$id_record = $result['id_record'];
|
||||
$id_documento_finale = $result['id_documento'];
|
||||
$final_module = Modules::get($options['final_module']);
|
||||
$original_module = Modules::get($options['original_module']);
|
||||
|
||||
$dir = $options['dir'];
|
||||
$op = $options['op'];
|
||||
|
||||
$table = $options['sql']['table'];
|
||||
$rows = $options['sql']['rows'];
|
||||
$id_rows = $options['sql']['id_rows'];
|
||||
|
||||
// Info documento
|
||||
$documento = $dbo->fetchOne('SELECT * FROM '.$table.' WHERE id = '.prepare($id_record));
|
||||
$numero = !empty($documento['numero_esterno']) ? $documento['numero_esterno'] : $documento['numero'];
|
||||
$id_anagrafica = $documento['idanagrafica'];
|
||||
$id_pagamento = $documento['idpagamento'];
|
||||
$id_conto = $documento['idconto'];
|
||||
|
||||
if (empty($documento)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$id_iva = $id_iva ?: setting('Iva predefinita');
|
||||
if (empty($id_conto)) {
|
||||
$id_conto = ($dir == 'entrata') ? setting('Conto predefinito fatture di vendita') : setting('Conto predefinito fatture di acquisto');
|
||||
}
|
||||
|
||||
// Selezione articoli dell'ordine da portare nel ddt
|
||||
$righe = $dbo->fetchArray('SELECT *, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),"") AS codice, (qta - qta_evasa) AS qta_rimanente FROM '.$table.' INNER JOIN '.$rows.' ON '.$table.'.id='.$rows.'.'.$id_rows.' WHERE '.$table.'.id='.prepare($id_record).' HAVING qta_rimanente > 0 OR is_descrizione = 1 ORDER BY `order`');
|
||||
|
||||
if (!empty($righe)) {
|
||||
echo '
|
||||
|
||||
<form action="'.ROOTDIR.'/controller.php?id_module='.$final_module['id'].(!empty($id_documento_finale) ? '&id_record='.$id_documento_finale : '').'" method="post">
|
||||
<input type="hidden" name="'.$options['id_importazione'].'" value="'.$id_record.'">
|
||||
|
||||
<input type="hidden" name="idanagrafica" value="'.$id_anagrafica.'">
|
||||
<input type="hidden" name="idconto" value="'.$id_conto.'">
|
||||
<input type="hidden" name="idpagamento" value="'.$id_pagamento.'">
|
||||
<input type="hidden" name="iddocumento" value="'.$id_record.'">
|
||||
|
||||
<input type="hidden" name="op" value="'.$op.'">
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
<input type="hidden" name="dir" value="'.$dir.'">';
|
||||
|
||||
// Creazione fattura dal documento
|
||||
if (!empty($options['create_document'])) {
|
||||
echo '
|
||||
<div class="row">
|
||||
<input type="hidden" name="create_document" value="on"/>
|
||||
|
||||
<div class="col-md-6">
|
||||
{[ "type": "date", "label": "'.tr('Data del documento').'", "name": "data", "required": 1, "value": "-now-" ]}
|
||||
</div>';
|
||||
|
||||
if ($final_module['name'] == 'Fatture di vendita' || $final_module['name'] == 'Fatture di acquisto') {
|
||||
if ($op == 'nota_accredito' && !empty($segmenti)) {
|
||||
$segmento = $dbo->fetchOne("SELECT * FROM zz_segments WHERE predefined_accredito='1'");
|
||||
|
||||
$id_segment = $segmento['id'];
|
||||
} else {
|
||||
$id_segment = $_SESSION['module_'.$final_module['id']]['id_segment'];
|
||||
}
|
||||
|
||||
echo '
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.prepare($final_module['id']).' ORDER BY name", "value": "'.$id_segment.'" ]}
|
||||
</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
|
||||
<div class="row">';
|
||||
|
||||
// Iva
|
||||
if ($original_module['name'] == 'Preventivi' || $original_module['name'] == 'Contratti') {
|
||||
echo '
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Iva').'", "name": "id_iva", "required": 1, "value": "'.$id_iva.'", "ajax-source": "iva" ]}
|
||||
</div>';
|
||||
}
|
||||
|
||||
// Conto
|
||||
if (($final_module['name'] == 'Fatture di vendita' || $final_module['name'] == 'Fatture di acquisto') && $op != 'nota_credito') {
|
||||
echo '
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Conto').'", "name": "id_conto", "required": 1, "value": "'.$id_conto.'", "ajax-source": "'.($dir == 'entrata' ? 'conti-vendite' : 'conti-acquisti').'" ]}
|
||||
</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
<div class="clearfix"></div>
|
||||
<br>
|
||||
|
||||
<p>'.tr('Seleziona le righe e le relative quantità da inserire nel documento').'.</p>
|
||||
|
||||
<table class="table table-striped table-hover table-condensed">
|
||||
<tr>
|
||||
<th>'.tr('Descrizione').'</th>
|
||||
<th width="10%">'.tr('Q.tà').'</th>
|
||||
<th width="15%">'.tr('Q.tà da evadere').'</th>
|
||||
<th width="20%">'.tr('Subtot.').'</th>';
|
||||
|
||||
if (!empty($options['serials'])) {
|
||||
echo '
|
||||
<th width="20%">'.tr('Seriali').'</th>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</tr>';
|
||||
|
||||
$totale = 0.00;
|
||||
|
||||
foreach ($righe as $i => $r) {
|
||||
// Descrizione
|
||||
echo '
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
<input type="hidden" name="abilita_serial['.$r['id'].']" value="'.$r['abilita_serial'].'" />
|
||||
<input type="hidden" id="idarticolo_'.$i.'" name="idarticolo['.$r['id'].']" value="'.$r['idarticolo'].'" />
|
||||
<input type="hidden" id="descrizione_'.$i.'" name="descrizione['.$r['id'].']" value="'.$r['descrizione'].'" />';
|
||||
|
||||
// Checkbox - da evadere?
|
||||
echo '
|
||||
<input type="checkbox" checked="checked" id="checked_'.$i.'" name="evadere['.$r['id'].']" value="on" onclick="ricalcola_subtotale_riga('.$i.');" />';
|
||||
|
||||
$descrizione = (!empty($r['codice']) ? $r['codice'].' - ' : '').$r['descrizione'];
|
||||
|
||||
echo ' '.nl2br($descrizione);
|
||||
|
||||
echo '
|
||||
</td>';
|
||||
|
||||
// Q.tà rimanente
|
||||
echo '
|
||||
<td>
|
||||
<input type="hidden" id="qtamax_'.$i.'" value="'.($r['qta'] - $r['qta_evasa']).'" />
|
||||
<input type="hidden" id="um_'.$i.'" name="um['.$r['id'].']" value="'.$r['um'].'" />
|
||||
<p class="text-center">'.Translator::numberToLocale($r['qta_rimanente']).'</p>
|
||||
</td>';
|
||||
|
||||
// Q.tà da evadere
|
||||
echo '
|
||||
<td>
|
||||
{[ "type": "number", "name": "qta_da_evadere['.$r['id'].']", "id": "qta_'.$i.'", "required": 1, "value": "'.$r['qta_rimanente'].'", "extra" : "onkeyup=\"ricalcola_subtotale_riga('.$i.');\"", "decimals": "qta", "min-value": "0", "extra": "'.(($r['is_descrizione']) ? 'readonly' : '').'" ]}
|
||||
</td>';
|
||||
|
||||
// Subtotale
|
||||
$subtotale = $r['subtotale'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
|
||||
$sconto = $r['sconto'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
|
||||
$iva = $r['iva'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
|
||||
|
||||
echo '
|
||||
<td>
|
||||
<input type="hidden" id="subtot_'.$i.'" name="subtot['.$r['id'].']" value="'.str_replace('.', ',', ($r['subtotale'] / $r['qta'])).'" />
|
||||
<input type="hidden" id="sconto_'.$i.'" name="sconto['.$r['id'].']" value="'.str_replace('.', ',', ($r['sconto'] / $r['qta'])).'" />
|
||||
<input type="hidden" id="idiva_'.$i.'" name="idiva['.$r['id'].']" value="'.$r['idiva'].'" />
|
||||
<input type="hidden" id="iva_'.$i.'" name="iva['.$r['id'].']" value="'.str_replace('.', ',', ($r['iva'] / $r['qta'])).'" />
|
||||
|
||||
<big id="subtotale_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto + $iva).' €</big><br/>
|
||||
|
||||
<small style="color:#777;" id="subtotaledettagli_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva).'</small>
|
||||
</td>';
|
||||
|
||||
// Seriali
|
||||
if (!empty($options['serials'])) {
|
||||
echo '
|
||||
<td>';
|
||||
|
||||
if (!empty($r['abilita_serial'])) {
|
||||
$query = 'SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir='.prepare($dir).' AND '.$options['serials']['id_riga'].' = '.prepare($r['id']).' AND serial IS NOT NULL AND serial NOT IN (SELECT serial FROM mg_prodotti AS t WHERE serial IS NOT NULL AND dir='.prepare($dir).' AND '.$options['serials']['condition'].')';
|
||||
|
||||
$values = $dbo->fetchArray($query);
|
||||
if (!empty($values)) {
|
||||
echo '
|
||||
{[ "type": "select", "name": "serial['.$r['id'].'][]", "id": "serial_'.$i.'", "multiple": 1, "values": "query='.$query.'", "value": "'.implode(',', array_column($values, 'id')).'", "extra": "data-maximum=\"'.intval($r['qta_rimanente']).'\"" ]}';
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($r['abilita_serial']) || empty($values)) {
|
||||
echo '-';
|
||||
}
|
||||
|
||||
echo '
|
||||
</td>';
|
||||
}
|
||||
|
||||
echo '
|
||||
</tr>';
|
||||
|
||||
$totale += $subtotale - $sconto + $iva;
|
||||
}
|
||||
|
||||
// Totale
|
||||
echo '
|
||||
<tr>
|
||||
<td colspan="'.(!empty($options['serials']) ? 4 : 3).'" align="right" class="text-right">
|
||||
<b>'.tr('Totale').':</b>
|
||||
</td>
|
||||
<td class="text-right" colspan="2">
|
||||
<big id="totale">'.Translator::numberToLocale($totale).' €</big>
|
||||
</td>
|
||||
</tr>
|
||||
</table>';
|
||||
|
||||
echo '
|
||||
|
||||
<!-- PULSANTI -->
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-right">
|
||||
<button type="submit" id="submit_btn" class="btn btn-primary pull-right">
|
||||
<i class="fa fa-plus"></i> '.$options['button'].'
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>';
|
||||
} else {
|
||||
echo '
|
||||
<p>'.tr('Non ci sono elementi da evadere').'...</p>';
|
||||
}
|
||||
|
||||
echo '
|
||||
<script src="'.ROOTDIR.'/lib/init.js"></script>';
|
||||
|
||||
?>
|
||||
|
||||
<script type="text/javascript">
|
||||
function ricalcola_subtotale_riga(r) {
|
||||
subtot = $("#subtot_" + r).val();
|
||||
sconto = $("#sconto_" + r).val();
|
||||
iva = $("#iva_" + r).val();
|
||||
|
||||
qtamax = $("#qtamax_" + r).val() ? $("#qtamax_" + r).val() : 0;
|
||||
|
||||
subtot = parseFloat(subtot);
|
||||
sconto = parseFloat(sconto);
|
||||
iva = parseFloat(iva);
|
||||
qtamax = parseFloat(qtamax);
|
||||
|
||||
subtot = subtot - sconto;
|
||||
|
||||
qta = $("#qta_" + r).val().toEnglish();
|
||||
|
||||
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
|
||||
if (qta > qtamax) {
|
||||
qta = qtamax;
|
||||
|
||||
$('#qta_' + r).val(qta);
|
||||
}
|
||||
|
||||
// Se tolgo la spunta della casella dell'evasione devo azzerare i conteggi
|
||||
if (isNaN(qta) || !$('#checked_' + r).is(':checked')) {
|
||||
qta = 0;
|
||||
}
|
||||
|
||||
$("#serial_" + r).selectClear();
|
||||
$("#serial_" + r).select2("destroy");
|
||||
$("#serial_" + r).data('maximum', qta);
|
||||
start_superselect();
|
||||
|
||||
subtotale = (subtot * qta + iva * qta).toLocale();
|
||||
|
||||
$("#subtotale_" + r).html(subtotale + " €");
|
||||
$("#subtotaledettagli_" + r).html((subtot * qta).toLocale() + " + " + (iva * qta).toLocale());
|
||||
|
||||
ricalcola_totale();
|
||||
}
|
||||
|
||||
function ricalcola_totale() {
|
||||
tot_qta = 0;
|
||||
r = 0;
|
||||
totale = 0.00;
|
||||
$('input[id*=qta_]').each(function() {
|
||||
qta = $(this).val().toEnglish();
|
||||
|
||||
if (!$('#checked_' + r).is(':checked') || isNaN(qta)) {
|
||||
qta = 0;
|
||||
}
|
||||
|
||||
subtot = $("#subtot_" + r).val();
|
||||
sconto = $("#sconto_" + r).val();
|
||||
iva = $("#iva_" + r).val();
|
||||
|
||||
subtot = parseFloat(subtot);
|
||||
sconto = parseFloat(sconto);
|
||||
iva = parseFloat(iva);
|
||||
|
||||
subtot = subtot - sconto;
|
||||
|
||||
totale += subtot * qta + iva * qta;
|
||||
|
||||
r++;
|
||||
|
||||
tot_qta += qta;
|
||||
});
|
||||
|
||||
$('#totale').html((totale.toLocale()) + " €");
|
||||
|
||||
<?php
|
||||
|
||||
if (empty($options['sql']['allow-empty'])) {
|
||||
echo '
|
||||
if (tot_qta > 0)
|
||||
$("#submit_btn").show();
|
||||
else
|
||||
$("#submit_btn").hide();';
|
||||
}
|
||||
|
||||
?>
|
||||
}
|
||||
</script>
|
@ -9,7 +9,7 @@ use UnexpectedValueException;
|
||||
|
||||
abstract class Article extends Row
|
||||
{
|
||||
protected $serialRowID = 'documento';
|
||||
protected $serialRowID = null;
|
||||
protected $abilita_movimentazione = true;
|
||||
|
||||
protected $qta_movimentazione = 0;
|
||||
|
@ -127,6 +127,7 @@ abstract class Description extends Model
|
||||
*/
|
||||
protected function customInitCopiaIn($original)
|
||||
{
|
||||
$this->is_descrizione = $original->is_descrizione;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -12,6 +12,11 @@ abstract class Row extends Description
|
||||
{
|
||||
protected $prezzo_unitario_vendita_riga = null;
|
||||
|
||||
protected $casts = [
|
||||
'qta' => 'float',
|
||||
//'qta_evasa' => 'float',
|
||||
];
|
||||
|
||||
public static function build(Document $document, $bypass = false)
|
||||
{
|
||||
return parent::build($document, true);
|
||||
|
@ -1064,11 +1064,7 @@ jQuery.fn.selectData = function () {
|
||||
if ($select_obj[0] == undefined) {
|
||||
return undefined;
|
||||
} else {
|
||||
if ($select_obj[0].selected == false) {
|
||||
return $select_obj[0];
|
||||
} else {
|
||||
return $select_obj[0].element.dataset;
|
||||
}
|
||||
return $select_obj[0];
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -10,13 +10,11 @@ switch ($resource) {
|
||||
$filter[] = 'id='.prepare($element);
|
||||
}
|
||||
|
||||
$where[] = 'an_anagrafiche.idanagrafica='.prepare($superselect['idanagrafica']);
|
||||
if (empty($elements)) {
|
||||
$where[] = 'an_anagrafiche.idanagrafica='.prepare($superselect['idanagrafica']);
|
||||
|
||||
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'pianificabile';
|
||||
$where[] = 'idstato IN (SELECT `id` FROM co_staticontratti WHERE '.$stato.' = 1)';
|
||||
|
||||
if (!empty($superselect['non_fatturato'])) {
|
||||
$where[] = 'id NOT IN (SELECT idcontratto FROM co_righe_documenti WHERE idcontratto IS NOT NULL)';
|
||||
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'pianificabile';
|
||||
$where[] = 'idstato IN (SELECT `id` FROM co_staticontratti WHERE '.$stato.' = 1)';
|
||||
}
|
||||
|
||||
if (!empty($search)) {
|
||||
|
@ -3,15 +3,18 @@
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$rs_documento = $dbo->fetchArray('SELECT * FROM co_righe_contratti WHERE idcontratto='.prepare($id_record));
|
||||
|
||||
/* permetto di fatturare il contratto solo se contiene righe e si trova in uno stato fatturabile */
|
||||
echo '
|
||||
<button type="button" class="btn btn-info" '.((($record['fatturabile']) and (sizeof($rs_documento) > 0)) ? '' : 'disabled')." onclick=\"if( confirm('Creare una fattura per questo contratto?') ){fattura_da_contratto();}\">
|
||||
<i class=\"fa fa-magic\"></i> ".tr('Crea fattura').'...
|
||||
<button type="button" class="btn btn-info '.(($record['fatturabile'] && !empty($rs_documento)) ? '' : 'disabled').'" data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=fattura" data-toggle="modal" data-title="'.tr('Crea fattura').'">
|
||||
<i class="fa fa-magic"></i> '.tr('Crea fattura').'
|
||||
</button>';
|
||||
|
||||
if ($record['rinnovabile']) {
|
||||
$rinnova = !empty($record['data_accettazione']) && !empty($record['data_conclusione']) && $record['data_accettazione'] != '0000-00-00' && $record['data_conclusione'] != '0000-00-00' && $record['pianificabile'];
|
||||
|
||||
$stati_pianificabili = $dbo->fetchOne('SELECT GROUP_CONCAT(`descrizione` SEPARATOR ", ") AS stati_pianificabili FROM `co_staticontratti` WHERE `pianificabile` = 1')['stati_pianificabili'];
|
||||
|
||||
echo '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Il contratto è rinnovabile se sono definite le date di accettazione e conclusione e si trova in uno stato di questi stati: '.$stati_pianificabili).'" style="display:inline;">
|
||||
<button type="button" class="btn btn-warning ask '.($rinnova ? '' : 'disabled').'" data-backto="record-edit" data-op="renew" data-msg="'.tr('Rinnovare questo contratto?').'" data-button="Rinnova" data-class="btn btn-lg btn-warning" '.($rinnova ? '' : 'disabled').'>
|
||||
|
27
modules/contratti/crea_documento.php
Normal file
27
modules/contratti/crea_documento.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
||||
$options = [
|
||||
'op' => 'add_contratto',
|
||||
'id_importazione' => 'id_contratto',
|
||||
'final_module' => 'Fatture di vendita',
|
||||
'original_module' => $module['name'],
|
||||
'sql' => [
|
||||
'table' => 'co_contratti',
|
||||
'rows' => 'co_righe_contratti',
|
||||
'id_rows' => 'idcontratto',
|
||||
],
|
||||
'button' => tr('Aggiungi'),
|
||||
'dir' => 'entrata',
|
||||
'create_document' => true,
|
||||
];
|
||||
|
||||
$result = [
|
||||
'id_record' => $id_record,
|
||||
'id_documento' => get('iddocumento'),
|
||||
];
|
||||
|
||||
echo App::load('importa.php', $result, $options, true);
|
@ -378,12 +378,6 @@ if (!empty($record['idcontratto_prev'])) {
|
||||
|
||||
{( "name": "log_email", "id_module": "$id_module$", "id_record": "$id_record$" )}
|
||||
|
||||
<form action='<?php echo $rootdir; ?>/editor.php?id_module=<?php echo Modules::get('Fatture di vendita')['id']; ?>' method='post' id='form_creafattura'>
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
<input type='hidden' name='op' value='fattura_da_contratto'>
|
||||
<input type="hidden" name="id_record" value="<?php echo $id_record; ?>">
|
||||
</form>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
$('#data_accettazione').on("dp.change", function(){
|
||||
@ -406,10 +400,6 @@ if (!empty($record['idcontratto_prev'])) {
|
||||
$("#data_rifiuto").trigger("dp.change");
|
||||
});
|
||||
|
||||
function fattura_da_contratto(){
|
||||
$('#form_creafattura').submit();
|
||||
}
|
||||
|
||||
$('#idanagrafica_c').change( function(){
|
||||
session_set('superselect,idanagrafica', $(this).val(), 0);
|
||||
|
||||
|
@ -3,5 +3,11 @@
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
if (isset($id_record)) {
|
||||
$record = $dbo->fetchOne('SELECT *, (SELECT tipo FROM an_anagrafiche WHERE idanagrafica = co_contratti.idanagrafica) AS tipo_anagrafica, (SELECT fatturabile FROM co_staticontratti WHERE id=idstato) AS fatturabile, (SELECT pianificabile FROM co_staticontratti WHERE id=idstato) AS pianificabile, (SELECT descrizione FROM co_staticontratti WHERE id=idstato) AS stato, (SELECT GROUP_CONCAT(my_impianti_contratti.idimpianto) FROM my_impianti_contratti WHERE idcontratto = co_contratti.id) AS idimpianti FROM co_contratti WHERE id='.prepare($id_record));
|
||||
$record = $dbo->fetchOne('SELECT *,
|
||||
(SELECT tipo FROM an_anagrafiche WHERE idanagrafica = co_contratti.idanagrafica) AS tipo_anagrafica,
|
||||
(SELECT fatturabile FROM co_staticontratti WHERE id=idstato) AS fatturabile,
|
||||
(SELECT pianificabile FROM co_staticontratti WHERE id=idstato) AS pianificabile,
|
||||
(SELECT descrizione FROM co_staticontratti WHERE id=idstato) AS stato,
|
||||
SELECT GROUP_CONCAT(my_impianti_contratti.idimpianto) FROM my_impianti_contratti WHERE idcontratto = co_contratti.id) AS idimpianti
|
||||
FROM co_contratti WHERE id='.prepare($id_record));
|
||||
}
|
||||
|
@ -38,10 +38,12 @@ foreach ($rs as $r) {
|
||||
|
||||
// Q.tà
|
||||
echo '
|
||||
<td class="text-right">';
|
||||
<td class="text-center">';
|
||||
|
||||
if (empty($r['is_descrizione'])) {
|
||||
echo '
|
||||
'.Translator::numberToLocale($r['qta'], 'qta');
|
||||
<big>'.Translator::numberToLocale($r['qta'] - $r['qta_evasa'], 'qta').'</big>
|
||||
<br><small>('.tr('Q.tà iniziale').': '.Translator::numberToLocale($r['qta'], 'qta').')</small>';
|
||||
}
|
||||
echo '
|
||||
</td>';
|
||||
|
@ -20,4 +20,18 @@ trait RelationTrait
|
||||
{
|
||||
return $this->parent();
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Rivalsa INPS.
|
||||
*/
|
||||
protected function fixRivalsaINPS()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Ritenuta d'Acconto, basandosi sul valore del campo calcolo_ritenuta_acconto.
|
||||
*/
|
||||
protected function fixRitenutaAcconto()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ namespace Modules\Contratti;
|
||||
use Carbon\Carbon;
|
||||
use Common\Document;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Interventi\Intervento;
|
||||
use Modules\Interventi\TipoSessione;
|
||||
use Traits\RecordTrait;
|
||||
use Util\Generator;
|
||||
@ -138,6 +139,11 @@ class Contratto extends Document
|
||||
return $this->hasOne(Components\Sconto::class, 'idcontratto');
|
||||
}
|
||||
|
||||
public function interventi()
|
||||
{
|
||||
return $this->hasMany(Intervento::class, 'id_contratto');
|
||||
}
|
||||
|
||||
// Metodi statici
|
||||
|
||||
/**
|
||||
|
@ -198,82 +198,61 @@ switch (post('op')) {
|
||||
|
||||
break;
|
||||
|
||||
// Creazione ddt da ordine
|
||||
case 'ddt_da_ordine':
|
||||
$totale_ordine = 0.00;
|
||||
$data = post('data');
|
||||
$idanagrafica = post('idanagrafica');
|
||||
$idsede = post('idsede');
|
||||
$idpagamento = post('idpagamento');
|
||||
$idconto = post('idconto');
|
||||
$idordine = post('idordine');
|
||||
// Aggiunta di un ordine in ddt
|
||||
case 'add_ordine':
|
||||
$ordine = \Modules\Ordini\Ordine::find(post('id_ordine'));
|
||||
|
||||
// Creazione DDT
|
||||
$anagrafica = Anagrafica::find($idanagrafica);
|
||||
$tipo = Tipo::where('dir', $dir)->first();
|
||||
// Creazione della fattura al volo
|
||||
if (post('create_document') == 'on') {
|
||||
$tipo = Tipo::where('dir', $dir)->first();
|
||||
|
||||
$ddt = DDT::build($anagrafica, $tipo, $data);
|
||||
$id_record = $ddt->id;
|
||||
$ddt = DDT::build($ordine->anagrafica, $tipo, date('Y-m-d'));
|
||||
$ddt->idpagamento = $ordine->idpagamento;
|
||||
$ddt->save();
|
||||
|
||||
// Lettura di tutte le righe della tabella in arrivo
|
||||
foreach (post('qta_da_evadere') as $idriga => $value) {
|
||||
// Processo solo le righe da evadere
|
||||
if (post('evadere')[$idriga] == 'on') {
|
||||
$idarticolo = post('idarticolo')[$idriga];
|
||||
$descrizione = post('descrizione')[$idriga];
|
||||
$id_record = $ddt->id;
|
||||
}
|
||||
|
||||
$qta = post('qta_da_evadere')[$idriga];
|
||||
$um = post('um')[$idriga];
|
||||
$abilita_serial = post('abilita_serial')[$idriga];
|
||||
$parziale = false;
|
||||
|
||||
$subtot = post('subtot')[$idriga] * $qta;
|
||||
$sconto = post('sconto')[$idriga];
|
||||
$sconto = $sconto * $qta;
|
||||
$id_iva = get('id_iva');
|
||||
$id_conto = get('id_conto');
|
||||
$righe = $ordine->getRighe();
|
||||
|
||||
$idiva = post('idiva')[$idriga];
|
||||
$iva = post('iva')[$idriga] * $qta;
|
||||
foreach ($righe as $riga) {
|
||||
if (post('evadere')[$riga->id] == 'on') {
|
||||
$qta = post('qta_da_evadere')[$riga->id];
|
||||
|
||||
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM or_righe_ordini WHERE id='.prepare($idriga);
|
||||
$rsprc = $dbo->fetchArray($qprc);
|
||||
|
||||
$sconto_unitario = $rsprc[0]['sconto_unitario'];
|
||||
$tipo_sconto = $rsprc[0]['tipo_sconto'];
|
||||
|
||||
// Calcolo l'iva indetraibile
|
||||
$q = 'SELECT descrizione, indetraibile FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($q);
|
||||
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
|
||||
|
||||
// Inserisco la riga in ddt
|
||||
$dbo->query('INSERT INTO dt_righe_ddt(idddt, idordine, idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, abilita_serial, `order`) VALUES('.prepare($id_record).', '.prepare($idordine).', '.prepare($idarticolo).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare($abilita_serial).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM dt_righe_ddt AS t WHERE idddt='.prepare($id_record).'))');
|
||||
$riga = $dbo->lastInsertedID();
|
||||
$copia = $riga->copiaIn($ddt, $qta);
|
||||
$copia->id_conto = $id_conto;
|
||||
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
$serials = is_array(post('serial')[$idriga]) ? post('serial')[$idriga] : [];
|
||||
$serials = array_clean($serials);
|
||||
if ($copia->isArticolo()) {
|
||||
$copia->movimenta($copia->qta);
|
||||
|
||||
$dbo->sync('mg_prodotti', ['id_riga_ddt' => $riga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]);
|
||||
$serials = is_array(post('serial')[$riga->id]) ? post('serial')[$riga->id] : [];
|
||||
|
||||
// Scalo la quantità dall'ordine
|
||||
$dbo->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idriga));
|
||||
|
||||
// Movimento il magazzino
|
||||
if (!empty($idarticolo)) {
|
||||
// vendita
|
||||
if ($dir == 'entrata') {
|
||||
add_movimento_magazzino($idarticolo, -$qta, ['idddt' => $id_record]);
|
||||
}
|
||||
|
||||
// acquisto
|
||||
else {
|
||||
add_movimento_magazzino($idarticolo, $qta, ['idddt' => $id_record]);
|
||||
}
|
||||
$copia->serials = $serials;
|
||||
}
|
||||
}
|
||||
|
||||
if ($riga->qta != $riga->qta_evasa) {
|
||||
$parziale = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Impostazione del nuovo stato
|
||||
$descrizione = $parziale ? 'Parzialmente evaso' : 'Evaso';
|
||||
$stato = \Modules\Ordini\Stato::where('descrizione', $descrizione)->first();
|
||||
$ordine->stato()->associate($stato);
|
||||
$ordine->save();
|
||||
|
||||
ricalcola_costiagg_ddt($id_record);
|
||||
flash()->info(tr('Creato un nuovo ddt!'));
|
||||
|
||||
flash()->info(tr('Ordine _NUM_ aggiunto!', [
|
||||
'_NUM_' => $ordine->numero,
|
||||
]));
|
||||
|
||||
break;
|
||||
|
||||
// Scollegamento articolo da ddt
|
||||
|
@ -4,41 +4,88 @@ include_once __DIR__.'/../../core.php';
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
||||
if ($module['name'] == 'Ddt di vendita') {
|
||||
$dir = 'entrata';
|
||||
$module_origin = 'Ordini cliente';
|
||||
} else {
|
||||
$dir = 'uscita';
|
||||
$module_origin = 'Ordini fornitore';
|
||||
$dir = ($module['name'] == 'Ddt di vendita') ? 'entrata' : 'uscita';
|
||||
|
||||
if (get('op')) {
|
||||
$options = [
|
||||
'op' => 'add_ordine',
|
||||
'id_importazione' => 'id_ordine',
|
||||
'final_module' => $module['name'],
|
||||
'original_module' => $module['name'] == 'Ddt di vendita' ? 'Ordini cliente' : 'Ordini fornitore',
|
||||
'sql' => [
|
||||
'table' => 'or_ordini',
|
||||
'rows' => 'or_righe_ordini',
|
||||
'id_rows' => 'idordine',
|
||||
],
|
||||
'serials' => [
|
||||
'id_riga' => 'id_riga_ddt',
|
||||
'condition' => '(id_riga_documento IS NOT NULL)',
|
||||
],
|
||||
'button' => tr('Aggiungi'),
|
||||
'dir' => $dir,
|
||||
];
|
||||
|
||||
$result = [
|
||||
'id_record' => $id_record,
|
||||
'id_documento' => get('iddocumento'),
|
||||
];
|
||||
|
||||
echo App::load('importa.php', $result, $options, true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$info = $dbo->fetchOne('SELECT * FROM dt_ddt WHERE id='.prepare($id_record));
|
||||
$numero = ($info['numero_esterno'] != '') ? $info['numero_esterno'] : $info['numero'];
|
||||
$idconto = $info['idconto'];
|
||||
$idanagrafica = $info['idanagrafica'];
|
||||
|
||||
// Preventivo
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Ordine').'", "name": "id_ordine", "required": 1, "values": "query=SELECT or_ordini.id, CONCAT(IF(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d/%m/%Y\')) AS descrizione FROM or_ordini WHERE idanagrafica='.prepare($idanagrafica).' AND idstatoordine IN (SELECT id FROM or_statiordine WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoordine=(SELECT id FROM or_tipiordine WHERE dir='.prepare($dir).' LIMIT 0,1) AND or_ordini.id IN (SELECT idordine FROM or_righe_ordini WHERE or_righe_ordini.idordine = or_ordini.id AND (qta - qta_evasa) > 0) ORDER BY data DESC, numero DESC" ]}
|
||||
</div>
|
||||
</div>';
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{[ "type": "select", "label": "'.tr('Ordine').'", "name": "id_documento", "values": "query=SELECT or_ordini.id, CONCAT(IF(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d-%m-%Y\')) AS descrizione FROM or_ordini WHERE idanagrafica='.prepare($idanagrafica).' AND idstatoordine IN (SELECT id FROM or_statiordine WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoordine=(SELECT id FROM or_tipiordine WHERE dir='.prepare($dir).' LIMIT 0,1) AND or_ordini.id IN (SELECT idordine FROM or_righe_ordini WHERE or_righe_ordini.idordine = or_ordini.id AND (qta - qta_evasa) > 0) ORDER BY data DESC, numero DESC" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="box" id="info-box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.tr('Informazioni di importazione').'</h3>
|
||||
</div>
|
||||
<div class="box-body" id="righe_documento">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info" id="box-loading">
|
||||
<i class="fa fa-spinner fa-spin"></i> '.tr('Caricamento in corso').'...
|
||||
</div>';
|
||||
|
||||
$file = basename(__FILE__);
|
||||
echo '
|
||||
<div class="row">
|
||||
<div id="righeordine" class="col-md-12"></div>
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>';
|
||||
|
||||
?>
|
||||
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>
|
||||
|
||||
<script>
|
||||
$('#id_ordine').change( function(){
|
||||
$('#righeordine').html('<i>Caricamento in corso...</i>');
|
||||
var box = $("#info-box");
|
||||
var content = $("#righe_documento");
|
||||
var loader = $("#box-loading");
|
||||
|
||||
$(document).ready(function(){
|
||||
box.hide();
|
||||
loader.hide();
|
||||
})
|
||||
|
||||
$("#id_documento").on("change", function(){
|
||||
loader.show();
|
||||
box.hide();
|
||||
|
||||
$('#righeordine').load(globals.rootdir + '/modules/fatture/crea_documento.php?id_module=' + <?php echo Modules::get($module_origin)['id']; ?> + '&id_record=' + $(this).find('option:selected').val() + '&documento=ddt&op=add_ordine&iddocumento=' + globals.id_record);
|
||||
var id = $(this).selectData() ? $(this).selectData().id : "";
|
||||
|
||||
content.html("<i>'.tr('Caricamento in corso').'...</i>");
|
||||
content.load("'.$structure->fileurl($file).'?id_module='.$id_module.'&id_record=" + id + "&documento=fattura&op=add_ordine&iddocumento='.$id_record.'", function() {
|
||||
if(content.html() != ""){
|
||||
box.show();
|
||||
}
|
||||
|
||||
loader.hide();
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
</script>';
|
||||
|
@ -2,9 +2,7 @@
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
if (!in_array($record['stato'], ['Bozza', 'Fatturato'])) {
|
||||
echo '
|
||||
<a class="btn btn-info" data-href="'.$rootdir.'/modules/fatture/crea_documento.php?id_module='.$id_module.'&id_record='.$id_record.'&documento=fattura" data-toggle="modal" data-title="Crea fattura">
|
||||
<i class="fa fa-magic"></i> '.tr('Crea fattura').'
|
||||
</a>';
|
||||
}
|
||||
echo '
|
||||
<a class="btn btn-info '.(in_array($record['stato'], ['Bozza', 'Parzialmente fatturato']) ? '' : 'disabled').'" data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=fattura" data-toggle="modal" data-title="'.tr('Crea fattura').'">
|
||||
<i class="fa fa-magic"></i> '.tr('Crea fattura').'
|
||||
</a>';
|
||||
|
34
modules/ddt/crea_documento.php
Normal file
34
modules/ddt/crea_documento.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
||||
$final_module = $module['name'] == 'Ddt di vendita' ? 'Fatture di vendita' : 'Fatture di acquisto';
|
||||
$dir = $module['name'] == 'Ddt di vendita' ? 'entrata' : 'uscita';
|
||||
|
||||
$options = [
|
||||
'op' => 'add_ddt',
|
||||
'id_importazione' => 'id_ddt',
|
||||
'final_module' => $final_module,
|
||||
'original_module' => $module['name'],
|
||||
'sql' => [
|
||||
'table' => 'dt_ddt',
|
||||
'rows' => 'dt_righe_ddt',
|
||||
'id_rows' => 'idddt',
|
||||
],
|
||||
'serials' => [
|
||||
'id_riga' => 'id_riga_ddt',
|
||||
'condition' => '(id_riga_documento IS NOT NULL)',
|
||||
],
|
||||
'button' => tr('Aggiungi'),
|
||||
'dir' => $dir,
|
||||
'create_document' => true,
|
||||
];
|
||||
|
||||
$result = [
|
||||
'id_record' => $id_record,
|
||||
'id_documento' => get('iddocumento'),
|
||||
];
|
||||
|
||||
echo App::load('importa.php', $result, $options, true);
|
@ -2,8 +2,10 @@
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
use Modules\DDT\DDT;
|
||||
|
||||
if (isset($id_record)) {
|
||||
$ddt = Modules\DDT\DDT::with('tipo', 'stato')->find($id_record);
|
||||
$ddt = DDT::with('tipo', 'stato')->find($id_record);
|
||||
|
||||
$record = $dbo->fetchOne('SELECT *, dt_ddt.note, dt_ddt.idpagamento, dt_ddt.id AS idddt, dt_statiddt.descrizione AS `stato`, dt_tipiddt.descrizione AS `descrizione_tipodoc`,
|
||||
(SELECT completato FROM dt_statiddt WHERE dt_statiddt.id=dt_ddt.idstatoddt) AS flag_completato
|
||||
|
@ -11,6 +11,7 @@ class Articolo extends Article
|
||||
use RelationTrait;
|
||||
|
||||
protected $table = 'dt_righe_ddt';
|
||||
protected $serialRowID = 'ddt';
|
||||
|
||||
/**
|
||||
* Crea un nuovo articolo collegato ad una ddt.
|
||||
|
@ -20,4 +20,18 @@ trait RelationTrait
|
||||
{
|
||||
return $this->parent();
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Rivalsa INPS.
|
||||
*/
|
||||
protected function fixRivalsaINPS()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Ritenuta d'Acconto, basandosi sul valore del campo calcolo_ritenuta_acconto.
|
||||
*/
|
||||
protected function fixRitenutaAcconto()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -256,279 +256,6 @@ switch (post('op')) {
|
||||
}
|
||||
break;
|
||||
|
||||
case 'addpreventivo':
|
||||
if (!empty($id_record) && post('idpreventivo') !== null) {
|
||||
$idpreventivo = post('idpreventivo');
|
||||
$descrizione = post('descrizione');
|
||||
$idiva = post('idiva');
|
||||
$idconto = post('idconto');
|
||||
|
||||
$prezzo = post('prezzo');
|
||||
$qta = 1;
|
||||
|
||||
// Calcolo dello sconto
|
||||
$sconto_unitario = post('sconto');
|
||||
$tipo_sconto = post('tipo_sconto');
|
||||
$sconto = calcola_sconto([
|
||||
'sconto' => $sconto_unitario,
|
||||
'prezzo' => $prezzo,
|
||||
'tipo' => $tipo_sconto,
|
||||
'qta' => $qta,
|
||||
]);
|
||||
|
||||
$subtot = 0;
|
||||
$aggiorna_budget = (post('aggiorna_budget') == 'on') ? 1 : 0;
|
||||
|
||||
// Leggo l'anagrafica del cliente
|
||||
$rs = $dbo->fetchArray('SELECT idanagrafica, numero FROM `co_preventivi` WHERE id='.prepare($idpreventivo));
|
||||
$idanagrafica = $rs[0]['idanagrafica'];
|
||||
$numero = $rs[0]['numero'];
|
||||
|
||||
// Calcolo iva
|
||||
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$iva = ($prezzo - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
|
||||
$desc_iva = $rs[0]['descrizione'];
|
||||
|
||||
// Calcolo rivalsa inps
|
||||
$query = 'SELECT * FROM co_rivalse WHERE id='.prepare(setting('Percentuale rivalsa'));
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$rivalsainps = ($prezzo - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
|
||||
// Calcolo ritenuta d'acconto TOTALE
|
||||
$query = 'SELECT * FROM co_ritenutaacconto WHERE id = '.prepare(setting("Percentuale ritenuta d'acconto"));
|
||||
$rs = $dbo->fetchArray($query);
|
||||
if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
|
||||
$ritenutaacconto = ($prezzo - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
} else {
|
||||
$ritenutaacconto = ($prezzo - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
|
||||
}
|
||||
|
||||
if (!empty(post('import'))) {
|
||||
// Replicazione delle righe del preventivo sul documento
|
||||
$righe = $dbo->fetchArray('SELECT idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, um, qta, sconto, sconto_unitario, tipo_sconto, is_descrizione, IFNULL( (SELECT mg_articoli.abilita_serial FROM mg_articoli WHERE mg_articoli.id=co_righe_preventivi.idarticolo), 0 ) AS abilita_serial FROM co_righe_preventivi WHERE idpreventivo='.prepare($idpreventivo));
|
||||
|
||||
foreach ($righe as $key => $riga) {
|
||||
$subtot = $riga['subtotale'];
|
||||
|
||||
$sconto = $riga['sconto'];
|
||||
|
||||
// Ricalcolo ritenuta per ogni singola riga
|
||||
if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
|
||||
$ritenutaacconto = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
} else {
|
||||
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
|
||||
}
|
||||
|
||||
$dbo->insert('co_righe_documenti', [
|
||||
'iddocumento' => $id_record,
|
||||
'idpreventivo' => $idpreventivo,
|
||||
'idconto' => $idconto,
|
||||
'idarticolo' => $riga['idarticolo'],
|
||||
'idiva' => $riga['idiva'],
|
||||
'desc_iva' => $riga['desc_iva'],
|
||||
'iva' => $riga['iva'],
|
||||
'iva_indetraibile' => $riga['iva_indetraibile'],
|
||||
'descrizione' => str_replace('SCONTO', 'SCONTO '.$descrizione, $riga['descrizione']),
|
||||
'subtotale' => $riga['subtotale'],
|
||||
'um' => $riga['um'],
|
||||
'qta' => $riga['qta'],
|
||||
'is_descrizione' => $riga['is_descrizione'],
|
||||
'sconto' => $riga['sconto'],
|
||||
'sconto_unitario' => $riga['sconto_unitario'],
|
||||
'tipo_sconto' => $riga['tipo_sconto'],
|
||||
'order' => orderValue('co_righe_documenti', 'iddocumento', $id_record),
|
||||
'idritenutaacconto' => setting("Percentuale ritenuta d'acconto"),
|
||||
'ritenutaacconto' => $ritenutaacconto,
|
||||
'idrivalsainps' => setting('Percentuale rivalsa'),
|
||||
'rivalsainps' => $rivalsainps,
|
||||
'abilita_serial' => $riga['abilita_serial'],
|
||||
'calcolo_ritenuta_acconto' => setting("Metodologia calcolo ritenuta d'acconto predefinito"),
|
||||
]);
|
||||
|
||||
if (!empty($riga['idarticolo'])) {
|
||||
add_movimento_magazzino($riga['idarticolo'], -$riga['qta'], ['iddocumento' => $id_record]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Aggiunta riga preventivo sul documento
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idpreventivo, is_preventivo, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idritenutaacconto, ritenutaacconto, idrivalsainps, rivalsainps, `order`) VALUES('.prepare($id_record).', '.prepare($idpreventivo).', "1", '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', 1, ".prepare(setting("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(setting('Percentuale rivalsa')).', '.prepare($rivalsainps).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
|
||||
$dbo->query($query);
|
||||
|
||||
// Scarico gli articoli nel preventivo
|
||||
$righe = $dbo->fetchArray('SELECT * FROM co_righe_preventivi WHERE idpreventivo='.prepare($idpreventivo));
|
||||
foreach ($righe as $key => $riga) {
|
||||
if (!empty($riga['idarticolo'])) {
|
||||
add_movimento_magazzino($riga['idarticolo'], -$riga['qta'], ['iddocumento' => $id_record]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Aggiorno lo stato degli interventi collegati al preventivo se ce ne sono
|
||||
$query2 = 'SELECT idpreventivo FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND NOT idpreventivo=0 AND idpreventivo IS NOT NULL';
|
||||
$rs2 = $dbo->fetchArray($query2);
|
||||
|
||||
for ($j = 0; $j < sizeof($rs2); ++$j) {
|
||||
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Fatturato') WHERE id_preventivo=".prepare($rs2[$j]['idpreventivo']));
|
||||
}
|
||||
|
||||
flash()->info(tr('Preventivo _NUM_ aggiunto!', [
|
||||
'_NUM_' => $numero,
|
||||
]));
|
||||
|
||||
// Aggiorno il budget sul preventivo con l'importo inserito in fattura e imposto lo stato del preventivo "In attesa di pagamento" (se selezionato)
|
||||
if ($aggiorna_budget) {
|
||||
$dbo->query('UPDATE co_preventivi SET budget='.prepare($prezzo).' WHERE id='.prepare($idpreventivo));
|
||||
}
|
||||
$dbo->query("UPDATE co_preventivi SET idstato=(SELECT id FROM co_statipreventivi WHERE descrizione='In attesa di pagamento') WHERE id=".prepare($idpreventivo));
|
||||
|
||||
// Ricalcolo inps, ritenuta e bollo
|
||||
if ($dir == 'entrata') {
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
} else {
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 'addcontratto':
|
||||
if (!empty($id_record) && post('idcontratto') !== null) {
|
||||
$idcontratto = post('idcontratto');
|
||||
$descrizione = post('descrizione');
|
||||
$idiva = post('idiva');
|
||||
$idconto = post('idconto');
|
||||
|
||||
$prezzo = post('prezzo');
|
||||
$qta = 1;
|
||||
|
||||
// Calcolo dello sconto
|
||||
$sconto_unitario = post('sconto');
|
||||
$tipo_sconto = post('tipo_sconto');
|
||||
$sconto = calcola_sconto([
|
||||
'sconto' => $sconto_unitario,
|
||||
'prezzo' => $prezzo,
|
||||
'tipo' => $tipo_sconto,
|
||||
'qta' => $qta,
|
||||
]);
|
||||
|
||||
$subtot = 0;
|
||||
$aggiorna_budget = (post('aggiorna_budget') == 'on') ? 1 : 0;
|
||||
|
||||
// Leggo l'anagrafica del cliente
|
||||
$rs = $dbo->fetchArray('SELECT idanagrafica, numero FROM `co_contratti` WHERE id='.prepare($idcontratto));
|
||||
$idanagrafica = $rs[0]['idanagrafica'];
|
||||
$numero = $rs[0]['numero'];
|
||||
|
||||
// Calcolo iva
|
||||
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$iva = ($prezzo - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
|
||||
$desc_iva = $rs[0]['descrizione'];
|
||||
|
||||
// Calcolo rivalsa inps
|
||||
$query = 'SELECT * FROM co_rivalse WHERE id='.prepare(setting('Percentuale rivalsa'));
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$rivalsainps = ($prezzo - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
|
||||
// Calcolo ritenuta d'acconto
|
||||
$query = 'SELECT * FROM co_ritenutaacconto WHERE id='.prepare(setting("Percentuale ritenuta d'acconto"));
|
||||
$rs = $dbo->fetchArray($query);
|
||||
if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
|
||||
$ritenutaacconto = ($prezzo - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
} else {
|
||||
$ritenutaacconto = ($prezzo - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
|
||||
}
|
||||
|
||||
if (!empty(post('import'))) {
|
||||
// Replicazione delle righe del contratto sul documento
|
||||
$righe = $dbo->fetchArray('SELECT *, IFNULL( (SELECT mg_articoli.abilita_serial FROM mg_articoli WHERE mg_articoli.id=co_righe_contratti.idarticolo), 0 ) AS abilita_serial FROM co_righe_contratti WHERE idcontratto='.prepare($idcontratto));
|
||||
|
||||
foreach ($righe as $key => $riga) {
|
||||
$subtot = $riga['subtotale'];
|
||||
|
||||
$sconto = $riga['sconto'];
|
||||
|
||||
// Ricalcolo ritenuta per ogni singola riga
|
||||
if (setting("Metodologia calcolo ritenuta d'acconto predefinito") == 'Imponibile') {
|
||||
$ritenutaacconto = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
} else {
|
||||
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
|
||||
}
|
||||
|
||||
$dbo->insert('co_righe_documenti', [
|
||||
'iddocumento' => $id_record,
|
||||
'idcontratto' => $idcontratto,
|
||||
'idconto' => $idconto,
|
||||
'idarticolo' => $riga['idarticolo'],
|
||||
'idiva' => $riga['idiva'],
|
||||
'desc_iva' => $riga['desc_iva'],
|
||||
'iva' => $riga['iva'],
|
||||
'iva_indetraibile' => $riga['iva_indetraibile'],
|
||||
'descrizione' => str_replace('SCONTO', 'SCONTO '.$descrizione, $riga['descrizione']),
|
||||
'subtotale' => $riga['subtotale'],
|
||||
'um' => $riga['um'],
|
||||
'qta' => $riga['qta'],
|
||||
'sconto' => $riga['sconto'],
|
||||
'sconto_unitario' => $riga['sconto_unitario'],
|
||||
'tipo_sconto' => $riga['tipo_sconto'],
|
||||
'order' => orderValue('co_righe_documenti', 'iddocumento', $id_record),
|
||||
'idritenutaacconto' => setting("Percentuale ritenuta d'acconto"),
|
||||
'ritenutaacconto' => $ritenutaacconto,
|
||||
'idrivalsainps' => setting('Percentuale rivalsa'),
|
||||
'rivalsainps' => $rivalsainps,
|
||||
'abilita_serial' => $riga['abilita_serial'],
|
||||
'calcolo_ritenuta_acconto' => setting("Metodologia calcolo ritenuta d'acconto predefinito"),
|
||||
]);
|
||||
|
||||
if (!empty($riga['idarticolo'])) {
|
||||
add_movimento_magazzino($riga['idarticolo'], -$riga['qta'], ['iddocumento' => $id_record]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Aggiunta riga contratto sul documento
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idcontratto, is_contratto, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenuta_acconto, `order`) VALUES('.prepare($id_record).', '.prepare($idcontratto).', "1", '.prepare($idconto).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($prezzo).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).", '-', 1, ".prepare(setting('Percentuale rivalsa')).', '.prepare($rivalsainps).', '.prepare(setting("Percentuale ritenuta d'acconto")).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
|
||||
$dbo->query($query);
|
||||
|
||||
// Scalo le qta degli articoli nel contratto
|
||||
$righe = $dbo->fetchArray('SELECT * FROM co_righe_contratti WHERE idcontratto='.prepare($idcontratto));
|
||||
foreach ($righe as $key => $riga) {
|
||||
if (!empty($riga['idarticolo'])) {
|
||||
add_movimento_magazzino($riga['idarticolo'], -$riga['qta'], ['iddocumento' => $id_record]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flash()->info(tr('Contratto _NUM_ aggiunto!', [
|
||||
'_NUM_' => $numero,
|
||||
]));
|
||||
|
||||
// Aggiorno lo stato degli interventi collegati al contratto se ce ne sono
|
||||
$query2 = 'SELECT idcontratto FROM co_righe_documenti WHERE iddocumento='.prepare($id_record).' AND NOT idcontratto=0 AND idcontratto IS NOT NULL';
|
||||
$rs2 = $dbo->fetchArray($query2);
|
||||
|
||||
for ($j = 0; $j < sizeof($rs2); ++$j) {
|
||||
$dbo->query("UPDATE in_interventi SET idstatointervento=(SELECT idstatointervento FROM in_statiintervento WHERE descrizione='Fatturato') WHERE id_contratto=".prepare($rs2[$j]['idcontratto']));
|
||||
}
|
||||
|
||||
// Aggiorno il budget sul contratto con l'importo inserito in fattura e imposto lo stato del contratto "In attesa di pagamento" (se selezionato)
|
||||
if ($aggiorna_budget) {
|
||||
$dbo->query('UPDATE co_contratti SET budget='.prepare($prezzo).' WHERE id='.prepare($idcontratto));
|
||||
}
|
||||
|
||||
$dbo->query("UPDATE co_contratti SET idstato=(SELECT id FROM co_staticontratti WHERE descrizione='In attesa di pagamento') WHERE id=".prepare($idcontratto));
|
||||
|
||||
// Ricalcolo inps, ritenuta e bollo
|
||||
if ($dir == 'entrata') {
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
} else {
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'manage_articolo':
|
||||
if (post('idriga') != null) {
|
||||
$articolo = Articolo::find(post('idriga'));
|
||||
@ -651,294 +378,6 @@ switch (post('op')) {
|
||||
|
||||
break;
|
||||
|
||||
// Creazione fattura da ddt
|
||||
case 'fattura_da_ddt':
|
||||
$totale_fattura = 0.00;
|
||||
$data = post('data');
|
||||
$idanagrafica = post('idanagrafica');
|
||||
$idarticolo = post('idarticolo');
|
||||
$idpagamento = post('idpagamento');
|
||||
$idddt = post('idddt');
|
||||
|
||||
$id_segment = post('id_segment');
|
||||
$numero = get_new_numerofattura($data);
|
||||
|
||||
if ($dir == 'entrata') {
|
||||
$numero_esterno = get_new_numerosecondariofattura($data);
|
||||
} else {
|
||||
$numero_esterno = '';
|
||||
}
|
||||
|
||||
if ($dir == 'entrata') {
|
||||
$tipo_documento = 'Fattura differita di vendita';
|
||||
$idconto = setting('Conto predefinito fatture di vendita');
|
||||
} else {
|
||||
$tipo_documento = 'Fattura differita di acquisto';
|
||||
$idconto = setting('Conto predefinito fatture di acquisto');
|
||||
}
|
||||
|
||||
// Creazione nuova fattura
|
||||
$dbo->query('INSERT INTO co_documenti(numero, numero_esterno, data, idanagrafica, idtipodocumento, idstatodocumento, idpagamento, idconto, id_segment) VALUES('.prepare($numero).', '.prepare($numero_esterno).', '.prepare($data).', '.prepare($idanagrafica).', (SELECT id FROM co_tipidocumento WHERE descrizione='.prepare($tipo_documento)."), (SELECT id FROM co_statidocumento WHERE descrizione='Bozza'), ".prepare($idpagamento).', '.prepare($idconto).', '.prepare($id_segment).' )');
|
||||
$id_record = $dbo->lastInsertedID();
|
||||
|
||||
// Lettura di tutte le righe della tabella in arrivo
|
||||
foreach (post('qta_da_evadere') as $i => $value) {
|
||||
// Processo solo le righe da evadere
|
||||
if (post('evadere')[$i] == 'on') {
|
||||
$idrigaddt = $i;
|
||||
$idarticolo = post('idarticolo')[$i];
|
||||
$descrizione = post('descrizione')[$i];
|
||||
$qta = post('qta_da_evadere')[$i];
|
||||
$um = post('um')[$i];
|
||||
$subtot = post('subtot')[$i] * $qta;
|
||||
$sconto = post('sconto')[$i];
|
||||
$sconto = $sconto * $qta;
|
||||
$idiva = post('idiva')[$i];
|
||||
|
||||
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM dt_righe_ddt WHERE id='.prepare($idrigaddt);
|
||||
$rsprc = $dbo->fetchArray($qprc);
|
||||
|
||||
$sconto_unitario = $rsprc[0]['sconto_unitario'];
|
||||
$tipo_sconto = $rsprc[0]['tipo_sconto'];
|
||||
|
||||
// Leggo la descrizione iva
|
||||
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$perc_iva = $rs[0]['percentuale'];
|
||||
$desc_iva = $rs[0]['descrizione'];
|
||||
$iva = ($subtot - $sconto) / 100 * $perc_iva;
|
||||
|
||||
// Calcolo l'iva indetraibile
|
||||
$q = 'SELECT indetraibile FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($q);
|
||||
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
|
||||
|
||||
$qdesc = 'SELECT is_descrizione FROM dt_righe_ddt WHERE id='.prepare($idrigaddt);
|
||||
$rsdesc = $dbo->fetchArray($qdesc);
|
||||
|
||||
// Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza
|
||||
if (!empty($idarticolo)) {
|
||||
$idiva_acquisto = $idiva;
|
||||
$prezzo_acquisto = $subtot;
|
||||
$idriga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto);
|
||||
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
$serials = is_array(post('serial')[$i]) ? post('serial')[$i] : [];
|
||||
$serials = array_clean($serials);
|
||||
|
||||
$dbo->sync('mg_prodotti', ['id_riga_documento' => $idriga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]);
|
||||
}
|
||||
|
||||
// Inserimento riga normale
|
||||
else {
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, is_descrizione, idddt, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($rsdesc[0]['is_descrizione']).', '.prepare($idddt).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
|
||||
|
||||
$dbo->query($query);
|
||||
}
|
||||
|
||||
// Scalo la quantità dal ddt
|
||||
$dbo->query('UPDATE dt_righe_ddt SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idrigaddt));
|
||||
}
|
||||
}
|
||||
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
|
||||
flash()->info(tr('Creata una nuova fattura!'));
|
||||
|
||||
break;
|
||||
|
||||
// Creazione fattura da ordine
|
||||
case 'fattura_da_ordine':
|
||||
$totale_fattura = 0.00;
|
||||
$data = post('data');
|
||||
$idanagrafica = post('idanagrafica');
|
||||
$idarticolo = post('idarticolo');
|
||||
$idpagamento = post('idpagamento');
|
||||
$idconto = post('idconto');
|
||||
$idordine = post('idordine');
|
||||
$id_segment = post('id_segment');
|
||||
$numero = get_new_numerofattura($data);
|
||||
$numero_esterno = get_new_numerosecondariofattura($data);
|
||||
|
||||
$tipo_documento = ($dir == 'entrata') ? 'Fattura immediata di vendita' : 'Fattura immediata di acquisto';
|
||||
|
||||
// Creazione nuova fattura
|
||||
$dbo->query('INSERT INTO co_documenti(numero, numero_esterno, data, idanagrafica, idtipodocumento, idstatodocumento, idpagamento, idconto, id_segment) VALUES('.prepare($numero).', '.prepare($numero_esterno).', '.prepare($data).', '.prepare($idanagrafica).', (SELECT id FROM co_tipidocumento WHERE descrizione='.prepare($tipo_documento)."), (SELECT id FROM co_statidocumento WHERE descrizione='Bozza'), ".prepare($idpagamento).', '.prepare($idconto).','.prepare($id_segment).')');
|
||||
$id_record = $dbo->lastInsertedID();
|
||||
|
||||
// Lettura di tutte le righe della tabella in arrivo
|
||||
foreach (post('qta_da_evadere') as $i => $value) {
|
||||
// Processo solo le righe da evadere
|
||||
if (post('evadere')[$i] == 'on') {
|
||||
$idriga = $i;
|
||||
$idarticolo = post('idarticolo')[$i];
|
||||
$descrizione = post('descrizione')[$i];
|
||||
$qta = post('qta_da_evadere')[$i];
|
||||
$um = post('um')[$i];
|
||||
$subtot = post('subtot')[$i] * $qta;
|
||||
$idiva = post('idiva')[$i];
|
||||
$iva = post('iva')[$i] * $qta;
|
||||
$sconto = post('sconto')[$i];
|
||||
$sconto = $sconto * $qta;
|
||||
|
||||
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM or_righe_ordini WHERE id='.prepare($idriga);
|
||||
$rsprc = $dbo->fetchArray($qprc);
|
||||
|
||||
$sconto_unitario = $rsprc[0]['sconto_unitario'];
|
||||
$tipo_sconto = $rsprc[0]['tipo_sconto'];
|
||||
|
||||
// Calcolo l'iva indetraibile
|
||||
$q = 'SELECT indetraibile FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($q);
|
||||
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
|
||||
|
||||
// Leggo la descrizione iva
|
||||
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$desc_iva = $rs[0]['descrizione'];
|
||||
|
||||
$qdesc = 'SELECT is_descrizione FROM dt_righe_ddt WHERE id='.prepare($idriga);
|
||||
$rsdesc = $dbo->fetchArray($qdesc);
|
||||
|
||||
// Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza
|
||||
if (!empty($idarticolo)) {
|
||||
$idiva_acquisto = $idiva;
|
||||
$prezzo_acquisto = $subtot;
|
||||
$riga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto);
|
||||
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
$serials = is_array(post('serial')[$i]) ? post('serial')[$i] : [];
|
||||
$serials = array_clean($serials);
|
||||
|
||||
$dbo->sync('mg_prodotti', ['id_riga_documento' => $riga, 'dir' => $dir, 'id_articolo' => $idarticolo], ['serial' => $serials]);
|
||||
|
||||
// Imposto la provenienza dell'ordine
|
||||
$dbo->query('UPDATE co_righe_documenti SET idordine='.prepare($idordine).' WHERE id='.prepare($idriga));
|
||||
}
|
||||
|
||||
// Inserimento riga normale
|
||||
else {
|
||||
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idarticolo, idordine, idiva, desc_iva, iva, iva_indetraibile, descrizione, is_descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idordine).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($rdesc[0]['is_descrizione']).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))');
|
||||
}
|
||||
|
||||
// Scalo la quantità dall'ordine
|
||||
$dbo->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idriga));
|
||||
}
|
||||
}
|
||||
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
flash()->info(tr('Creata una nuova fattura!'));
|
||||
|
||||
break;
|
||||
|
||||
// Creazione fattura da contratto
|
||||
case 'fattura_da_contratto':
|
||||
$idcontratto = post('id_record');
|
||||
$data = date('Y-m-d');
|
||||
|
||||
$rs_segment = $dbo->fetchArray('SELECT * FROM zz_segments WHERE id_module='.prepare($id_module)." AND predefined='1'");
|
||||
$id_segment = $rs_segment[0]['id'];
|
||||
|
||||
$numero = get_new_numerofattura($data);
|
||||
$numero_esterno = get_new_numerosecondariofattura($data);
|
||||
$tipo_documento = 'Fattura immediata di vendita';
|
||||
|
||||
// Info contratto
|
||||
$rs_contratto = $dbo->fetchArray('SELECT * FROM co_contratti WHERE id='.prepare($idcontratto));
|
||||
$idanagrafica = $rs_contratto[0]['idanagrafica'];
|
||||
$idpagamento = $rs_contratto[0]['idpagamento'];
|
||||
$idconto = setting('Conto predefinito fatture di vendita');
|
||||
|
||||
// Creazione nuova fattura
|
||||
$dbo->query('INSERT INTO co_documenti(numero, numero_esterno, data, idanagrafica, idtipodocumento, idstatodocumento, idpagamento, idconto, id_segment) VALUES('.prepare($numero).', '.prepare($numero_esterno).', '.prepare($data).', '.prepare($idanagrafica).', (SELECT id FROM co_tipidocumento WHERE descrizione='.prepare($tipo_documento)."), (SELECT id FROM co_statidocumento WHERE descrizione='Bozza'), ".prepare($idpagamento).', '.prepare($idconto).','.prepare($id_segment).')');
|
||||
$id_record = $dbo->lastInsertedID();
|
||||
|
||||
// Righe contratto
|
||||
$rs_righe = $dbo->fetchArray('SELECT * FROM co_righe_contratti WHERE idcontratto='.prepare($idcontratto));
|
||||
|
||||
for ($i = 0; $i < sizeof($rs_righe); ++$i) {
|
||||
// Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza
|
||||
if ($rs_righe[$i]['idarticolo'] != 0) {
|
||||
add_articolo_infattura($id_record, $rs_righe[$i]['idarticolo'], $rs_righe[$i]['descrizione'], $rs_righe[$i]['idiva'], $rs_righe[$i]['qta'], $rs_righe[$i]['subtotale'], $rs_righe[$i]['sconto'], $rs_righe[$i]['sconto_unitario'], $rs_righe[$i]['tipo_sconto']);
|
||||
}
|
||||
|
||||
// Inserimento riga normale
|
||||
else {
|
||||
$dbo->query('INSERT INTO co_righe_documenti(iddocumento, idcontratto, is_descrizione, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, sconto_globale, idiva, desc_iva, iva, iva_indetraibile, um, qta, idconto, `order`) values('.prepare($id_record).', '.prepare($idcontratto).', '.prepare($rs_righe[$i]['is_descrizione']).', '.prepare($rs_righe[$i]['descrizione']).', '.prepare($rs_righe[$i]['subtotale']).', '.prepare($rs_righe[$i]['sconto']).', '.prepare($rs_righe[$i]['sconto_unitario']).', '.prepare($rs_righe[$i]['tipo_sconto']).', '.prepare($rs_righe[$i]['sconto_globale']).', '.prepare($rs_righe[$i]['idiva']).', '.prepare($rs_righe[$i]['desc_iva']).', '.prepare($rs_righe[$i]['iva']).', '.prepare($rs_righe[$i]['iva_indetraibile']).', '.prepare($rs_righe[$i]['um']).', '.prepare($rs_righe[$i]['qta']).', '.prepare($idconto).', '.prepare($rs_righe[$i]['order']).')');
|
||||
}
|
||||
}
|
||||
|
||||
flash()->info(tr('Creata una nuova fattura!'));
|
||||
break;
|
||||
|
||||
// aggiungi righe da ddt
|
||||
case 'add_ddt':
|
||||
$idddt = post('iddocumento');
|
||||
|
||||
$rs = $dbo->fetchArray('SELECT * FROM co_documenti WHERE id='.prepare($id_record));
|
||||
$idconto = $rs[0]['idconto'];
|
||||
|
||||
// Lettura di tutte le righe della tabella in arrivo
|
||||
foreach (post('qta_da_evadere') as $i => $value) {
|
||||
// Processo solo le righe da evadere
|
||||
if (post('evadere')[$i] == 'on') {
|
||||
$idrigaddt = $i;
|
||||
$idarticolo = post('idarticolo')[$i];
|
||||
$descrizione = post('descrizione')[$i];
|
||||
|
||||
$qta = post('qta_da_evadere')[$i];
|
||||
$um = post('um')[$i];
|
||||
|
||||
$subtot = post('subtot')[$i] * $qta;
|
||||
$sconto = post('sconto')[$i];
|
||||
$sconto = $sconto * $qta;
|
||||
|
||||
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM dt_righe_ddt WHERE id='.prepare($idrigaddt);
|
||||
$rsprc = $dbo->fetchArray($qprc);
|
||||
|
||||
$sconto_unitario = $rsprc[0]['sconto_unitario'];
|
||||
$tipo_sconto = $rsprc[0]['tipo_sconto'];
|
||||
|
||||
$idiva = post('idiva')[$i];
|
||||
|
||||
// Calcolo l'iva indetraibile
|
||||
$q = 'SELECT percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($q);
|
||||
$iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
|
||||
|
||||
// Leggo la descrizione iva
|
||||
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$desc_iva = $rs[0]['descrizione'];
|
||||
|
||||
// Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza
|
||||
if (!empty($idarticolo)) {
|
||||
$idiva_acquisto = $idiva;
|
||||
$prezzo_acquisto = $subtot;
|
||||
$riga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, 0, 0, 'UNT', 0, $idconto, $um);
|
||||
|
||||
// Lettura lotto, serial, altro dalla riga dell'ddt
|
||||
$dbo->query('INSERT INTO mg_prodotti (id_riga_documento, id_articolo, dir, serial, lotto, altro) SELECT '.prepare($riga).', '.prepare($idarticolo).', '.prepare($dir).', serial, lotto, altro FROM mg_prodotti AS t WHERE id_riga_ddt='.prepare($idrigaddt));
|
||||
}
|
||||
|
||||
// Inserimento riga normale
|
||||
else {
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idconto, idddt, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($idconto).', '.prepare($idddt).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
|
||||
$dbo->query($query);
|
||||
}
|
||||
|
||||
// Scalo la quantità dal ddt
|
||||
$dbo->query('UPDATE dt_righe_ddt SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idrigaddt));
|
||||
}
|
||||
}
|
||||
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
|
||||
flash()->info(tr('Aggiunti nuovi articoli in fattura!'));
|
||||
|
||||
break;
|
||||
|
||||
// Scollegamento intervento da documento
|
||||
case 'unlink_intervento':
|
||||
if (!empty($id_record) && post('idriga') !== null) {
|
||||
@ -1182,71 +621,238 @@ switch (post('op')) {
|
||||
|
||||
break;
|
||||
|
||||
// aggiungi righe da ordine
|
||||
// Aggiunta di un ordine in fattura
|
||||
case 'add_ordine':
|
||||
$idordine = post('iddocumento');
|
||||
$ordine = \Modules\Ordini\Ordine::find(post('id_ordine'));
|
||||
|
||||
// Lettura di tutte le righe della tabella in arrivo
|
||||
foreach (post('qta_da_evadere') as $i => $value) {
|
||||
// Processo solo le righe da evadere
|
||||
if (post('evadere')[$i] == 'on') {
|
||||
$idriga = $i;
|
||||
$idarticolo = post('idarticolo')[$i];
|
||||
$descrizione = post('descrizione')[$i];
|
||||
// Creazione della fattura al volo
|
||||
if (post('create_document') == 'on') {
|
||||
$descrizione = ($dir == 'entrata') ? 'Fattura immediata di vendita' : 'Fattura immediata di acquisto';
|
||||
$tipo = Tipo::where('descrizione', $descrizione)->first();
|
||||
|
||||
$qta = post('qta_da_evadere')[$i];
|
||||
$um = post('um')[$i];
|
||||
$fattura = Fattura::build($ordine->anagrafica, $tipo, date('Y-m-d'), post('id_segment'));
|
||||
$fattura->idpagamento = $ordine->idpagamento;
|
||||
$fattura->save();
|
||||
|
||||
$subtot = post('subtot')[$i] * $qta;
|
||||
$sconto = post('sconto')[$i];
|
||||
$sconto = $sconto * $qta;
|
||||
$id_record = $fattura->id;
|
||||
}
|
||||
|
||||
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM or_righe_ordini WHERE id='.prepare($idriga);
|
||||
$rsprc = $dbo->fetchArray($qprc);
|
||||
$parziale = false;
|
||||
|
||||
$sconto_unitario = $rsprc[0]['sconto_unitario'];
|
||||
$tipo_sconto = $rsprc[0]['tipo_sconto'];
|
||||
$id_iva = get('id_iva');
|
||||
$id_conto = get('id_conto');
|
||||
$righe = $ordine->getRighe();
|
||||
|
||||
$idiva = post('idiva')[$i];
|
||||
foreach ($righe as $riga) {
|
||||
if (post('evadere')[$riga->id] == 'on') {
|
||||
$qta = post('qta_da_evadere')[$riga->id];
|
||||
|
||||
// Calcolo l'iva indetraibile
|
||||
$q = 'SELECT percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($q);
|
||||
$iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
|
||||
$copia = $riga->copiaIn($fattura, $qta);
|
||||
$copia->id_conto = $id_conto;
|
||||
|
||||
// Leggo la descrizione iva
|
||||
$query = 'SELECT * FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$desc_iva = $rs[0]['descrizione'];
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
if ($copia->isArticolo()) {
|
||||
$copia->movimenta($copia->qta);
|
||||
|
||||
$rs = $dbo->fetchArray('SELECT * FROM co_righe_documenti WHERE id='.prepare($idriga));
|
||||
$idconto = $rs[0]['idconto'];
|
||||
$serials = is_array(post('serial')[$riga->id]) ? post('serial')[$riga->id] : [];
|
||||
|
||||
// Se sto aggiungendo un articolo uso la funzione per inserirlo e incrementare la giacenza
|
||||
if (!empty($idarticolo)) {
|
||||
$idiva_acquisto = $idiva;
|
||||
$prezzo_acquisto = $subtot;
|
||||
$riga = add_articolo_infattura($id_record, $idarticolo, $descrizione, $idiva_acquisto, $qta, $prezzo_acquisto, $sconto, $sconto_unitario, $tipo_sconto, 0, $idconto);
|
||||
|
||||
// Lettura lotto, serial, altro dalla riga dell'ordine
|
||||
$dbo->query('INSERT INTO mg_prodotti (id_riga_documento, id_articolo, dir, serial, lotto, altro) SELECT '.prepare($riga).', '.prepare($idarticolo).', '.prepare($dir).', serial, lotto, altro FROM mg_prodotti AS t WHERE id_riga_ordine='.prepare($idriga));
|
||||
$copia->serials = $serials;
|
||||
}
|
||||
|
||||
// Inserimento riga normale
|
||||
elseif ($qta != 0) {
|
||||
$query = 'INSERT INTO co_righe_documenti(iddocumento, idarticolo, descrizione, idconto, idordine, idiva, desc_iva, iva, iva_indetraibile, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($descrizione).', '.prepare($idconto).', '.prepare($idordine).', '.prepare($idiva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_record).'))';
|
||||
$dbo->query($query);
|
||||
}
|
||||
|
||||
// Scalo la quantità dall ordine
|
||||
$dbo->query('UPDATE or_righe_ordini SET qta_evasa = qta_evasa+'.$qta.' WHERE id='.prepare($idriga));
|
||||
}
|
||||
|
||||
if ($riga->qta != $riga->qta_evasa) {
|
||||
$parziale = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Impostazione del nuovo stato
|
||||
$descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato';
|
||||
$stato = \Modules\Ordini\Stato::where('descrizione', $descrizione)->first();
|
||||
$ordine->stato()->associate($stato);
|
||||
$ordine->save();
|
||||
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
|
||||
flash()->info(tr('Ordine _NUM_ aggiunto!', [
|
||||
'_NUM_' => $ordine->numero,
|
||||
]));
|
||||
|
||||
break;
|
||||
|
||||
// Aggiunta di un ddt in fattura
|
||||
case 'add_ddt':
|
||||
$ddt = \Modules\DDT\DDT::find(post('id_ddt'));
|
||||
|
||||
// Creazione della fattura al volo
|
||||
if (post('create_document') == 'on') {
|
||||
$descrizione = ($dir == 'entrata') ? 'Fattura differita di vendita' : 'Fattura differita di acquisto';
|
||||
$tipo = Tipo::where('descrizione', $descrizione)->first();
|
||||
|
||||
$fattura = Fattura::build($ddt->anagrafica, $tipo, date('Y-m-d'), post('id_segment'));
|
||||
$fattura->idpagamento = $ddt->idpagamento;
|
||||
$fattura->save();
|
||||
|
||||
$id_record = $fattura->id;
|
||||
}
|
||||
|
||||
$parziale = false;
|
||||
|
||||
$id_iva = get('id_iva');
|
||||
$id_conto = get('id_conto');
|
||||
$righe = $ddt->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
if (post('evadere')[$riga->id] == 'on') {
|
||||
$qta = post('qta_da_evadere')[$riga->id];
|
||||
|
||||
$copia = $riga->copiaIn($fattura, $qta);
|
||||
$copia->id_conto = $id_conto;
|
||||
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
if ($copia->isArticolo()) {
|
||||
$serials = is_array(post('serial')[$riga->id]) ? post('serial')[$riga->id] : [];
|
||||
|
||||
$copia->serials = $serials;
|
||||
}
|
||||
}
|
||||
|
||||
if ($riga->qta != $riga->qta_evasa) {
|
||||
$parziale = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Impostazione del nuovo stato
|
||||
$descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato';
|
||||
$stato = \Modules\DDT\Stato::where('descrizione', $descrizione)->first();
|
||||
$ddt->stato()->associate($stato);
|
||||
$ddt->save();
|
||||
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
|
||||
flash()->info(tr('DDT _NUM_ aggiunto!', [
|
||||
'_NUM_' => $ddt->numero,
|
||||
]));
|
||||
|
||||
break;
|
||||
|
||||
// Aggiunta di un preventivo in fattura
|
||||
case 'add_preventivo':
|
||||
$preventivo = \Modules\Preventivi\Preventivo::find(post('id_preventivo'));
|
||||
|
||||
// Creazione della fattura al volo
|
||||
if (post('create_document') == 'on') {
|
||||
$tipo = Tipo::where('descrizione', 'Fattura immediata di vendita')->first();
|
||||
|
||||
$fattura = Fattura::build($preventivo->anagrafica, $tipo, date('Y-m-d'), post('id_segment'));
|
||||
$fattura->idpagamento = $preventivo->idpagamento;
|
||||
$fattura->save();
|
||||
|
||||
$id_record = $fattura->id;
|
||||
}
|
||||
|
||||
$parziale = false;
|
||||
|
||||
$id_iva = get('id_iva');
|
||||
$id_conto = get('id_conto');
|
||||
$righe = $preventivo->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
if (post('evadere')[$riga->id] == 'on') {
|
||||
$qta = post('qta_da_evadere')[$riga->id];
|
||||
|
||||
$copia = $riga->copiaIn($fattura, $qta);
|
||||
$copia->id_iva = $id_iva;
|
||||
$copia->id_conto = $id_conto;
|
||||
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
if ($copia->isArticolo()) {
|
||||
$copia->movimenta($copia->qta);
|
||||
}
|
||||
}
|
||||
|
||||
if ($riga->qta != $riga->qta_evasa) {
|
||||
$parziale = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Impostazione del nuovo stato
|
||||
$descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato';
|
||||
$stato = \Modules\Preventivi\Stato::where('descrizione', $descrizione)->first();
|
||||
$preventivo->stato()->associate($stato);
|
||||
$preventivo->save();
|
||||
|
||||
// Trasferimento degli interventi collegati
|
||||
$interventi = $preventivo->interventi;
|
||||
$stato_intervento = \Modules\Interventi\Stato::where('descrizione', 'Fatturato')->first();
|
||||
foreach ($interventi as $intervento) {
|
||||
$intervento->stato()->associate($stato_intervento);
|
||||
$intervento->save();
|
||||
}
|
||||
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
|
||||
flash()->info(tr('Aggiunti nuovi articoli in fattura!'));
|
||||
flash()->info(tr('Preventivo _NUM_ aggiunto!', [
|
||||
'_NUM_' => $preventivo->numero,
|
||||
]));
|
||||
|
||||
break;
|
||||
|
||||
// Aggiunta di un contratto in fattura
|
||||
case 'add_contratto':
|
||||
$contratto = \Modules\Contratti\Contratto::find(post('id_contratto'));
|
||||
|
||||
// Creazione della fattura al volo
|
||||
if (post('create_document') == 'on') {
|
||||
$tipo = Tipo::where('descrizione', 'Fattura immediata di vendita')->first();
|
||||
|
||||
$fattura = Fattura::build($contratto->anagrafica, $tipo, date('Y-m-d'), post('id_segment'));
|
||||
$fattura->idpagamento = $contratto->idpagamento;
|
||||
$fattura->save();
|
||||
|
||||
$id_record = $fattura->id;
|
||||
}
|
||||
|
||||
$parziale = false;
|
||||
|
||||
$id_iva = get('id_iva');
|
||||
$id_conto = get('id_conto');
|
||||
$righe = $contratto->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
if (post('evadere')[$riga->id] == 'on') {
|
||||
$qta = post('qta_da_evadere')[$riga->id];
|
||||
|
||||
$copia = $riga->copiaIn($fattura, $qta);
|
||||
$copia->id_iva = $id_iva;
|
||||
$copia->id_conto = $id_conto;
|
||||
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
if ($copia->isArticolo()) {
|
||||
$copia->movimenta($copia->qta);
|
||||
}
|
||||
}
|
||||
|
||||
if ($riga->qta != $riga->qta_evasa) {
|
||||
$parziale = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Impostazione del nuovo stato
|
||||
$descrizione = $parziale ? 'Parzialmente fatturato' : 'Fatturato';
|
||||
$stato = \Modules\Contratti\Stato::where('descrizione', $descrizione)->first();
|
||||
$contratto->stato()->associate($stato);
|
||||
$contratto->save();
|
||||
|
||||
// Trasferimento degli interventi collegati
|
||||
$interventi = $contratto->interventi;
|
||||
$stato_intervento = \Modules\Interventi\Stato::where('descrizione', 'Fatturato')->first();
|
||||
foreach ($interventi as $intervento) {
|
||||
$intervento->stato()->associate($stato_intervento);
|
||||
$intervento->save();
|
||||
}
|
||||
|
||||
ricalcola_costiagg_fattura($id_record);
|
||||
|
||||
flash()->info(tr('Contratto _NUM_ aggiunto!', [
|
||||
'_NUM_' => $contratto->numero,
|
||||
]));
|
||||
|
||||
break;
|
||||
|
||||
|
@ -4,93 +4,82 @@ include_once __DIR__.'/../../core.php';
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
||||
if ($module['name'] == 'Fatture di vendita') {
|
||||
$dir = 'entrata';
|
||||
$conti = 'conti-vendite';
|
||||
} else {
|
||||
$dir = 'uscita';
|
||||
$conti = 'conti-acquisti';
|
||||
$dir = ($module['name'] == 'Fatture di vendita') ? 'entrata' : 'uscita';
|
||||
|
||||
if (get('op')) {
|
||||
$options = [
|
||||
'op' => 'add_contratto',
|
||||
'id_importazione' => 'id_contratto',
|
||||
'final_module' => $module['name'],
|
||||
'original_module' => 'Contratti',
|
||||
'sql' => [
|
||||
'table' => 'co_contratti',
|
||||
'rows' => 'co_righe_contratti',
|
||||
'id_rows' => 'idcontratto',
|
||||
],
|
||||
'serials' => false,
|
||||
'button' => tr('Aggiungi'),
|
||||
'dir' => $dir,
|
||||
];
|
||||
|
||||
$result = [
|
||||
'id_record' => $id_record,
|
||||
'id_documento' => get('iddocumento'),
|
||||
];
|
||||
|
||||
echo App::load('importa.php', $result, $options, true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$info = $dbo->fetchOne('SELECT * FROM co_documenti WHERE id='.prepare($id_record));
|
||||
$numero = ($info['numero_esterno'] != '') ? $info['numero_esterno'] : $info['numero'];
|
||||
$idconto = $info['idconto'];
|
||||
$idanagrafica = $info['idanagrafica'];
|
||||
|
||||
/*
|
||||
Form di inserimento riga documento
|
||||
*/
|
||||
echo '
|
||||
<p>'.tr('Documento numero _NUM_', [
|
||||
'_NUM_' => $numero,
|
||||
]).'</p>
|
||||
|
||||
<form action="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'" method="post">
|
||||
<input type="hidden" name="op" value="addcontratto">
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
<input type="hidden" name="dir" value="'.$dir.'">';
|
||||
|
||||
// Contratto
|
||||
$_SESSION['superselect']['stato'] = 'fatturabile';
|
||||
$_SESSION['superselect']['non_fatturato'] = 1;
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Contratto').'", "name": "idcontratto", "required": 1, "ajax-source": "contratti", "extra": "onchange=\"$data = $(this).selectData(); $(\'#descrizione\').val($data.text); $(\'#prezzo\').val($data.totale); $(\'#sconto\').val($data.sconto); if ($data.n_righe>0) { $(\'#import\').prop(\'checked\', true); $(\'input[name=import]\').val(\'1\'); $(\'#import\').removeAttr(\'disabled\'); }else{ $(\'#import\').prop(\'checked\', false); $(\'input[name=import]\').val(\'0\'); $(\'#import\').prop(\'disabled\', true); } \"" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
{[ "type": "checkbox", "label": "'.tr('Importa righe').'", "name": "import", "value": "1", "placeholder": "'.tr('Replica righe del contratto in fattura').'" ]}
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
// Descrizione
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione", "required": 1 ]}
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
// Leggo l'iva predefinita dall'articolo e se non c'è leggo quella predefinita generica
|
||||
$idiva = $idiva ?: setting('Iva predefinita');
|
||||
|
||||
// Iva
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Iva').'", "name": "idiva", "required": 1, "value": "'.$idiva.'", "ajax-source": "iva" ]}
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Conto').'", "name": "idconto", "required": 1, "value": "'.$idconto.'", "ajax-source": "'.$conti.'" ]}
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
// Costo unitario
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "number", "label": "'.tr('Costo unitario').'", "name": "prezzo", "required": 1, "icon-after": "€" ]}
|
||||
</div>';
|
||||
|
||||
// Sconto unitario
|
||||
echo '
|
||||
<div class="col-md-6">
|
||||
{[ "type": "number", "label": "'.tr('Sconto unitario').'", "name": "sconto", "icon-after": "choice|untprc" ]}
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
|
||||
<!-- PULSANTI -->
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-right">
|
||||
<button type="submit" class="btn btn-primary pull-right"><i class="fa fa-plus"></i> '.tr('Aggiungi').'</button>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{[ "type": "select", "label": "'.tr('Contratto').'", "name": "id_documento", "ajax-source": "contratti" ]}
|
||||
</div>
|
||||
</form>';
|
||||
</div>
|
||||
|
||||
<div class="box" id="info-box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.tr('Informazioni di importazione').'</h3>
|
||||
</div>
|
||||
<div class="box-body" id="righe_documento">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info" id="box-loading">
|
||||
<i class="fa fa-spinner fa-spin"></i> '.tr('Caricamento in corso').'...
|
||||
</div>';
|
||||
|
||||
$file = basename(__FILE__);
|
||||
echo '
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>';
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>
|
||||
|
||||
<script>
|
||||
var box = $("#info-box");
|
||||
var content = $("#righe_documento");
|
||||
var loader = $("#box-loading");
|
||||
|
||||
$(document).ready(function(){
|
||||
box.hide();
|
||||
loader.hide();
|
||||
})
|
||||
|
||||
$("#id_documento").on("change", function(){
|
||||
loader.show();
|
||||
box.hide();
|
||||
|
||||
var id = $(this).selectData() ? $(this).selectData().id : "";
|
||||
|
||||
content.html("<i>'.tr('Caricamento in corso').'...</i>");
|
||||
content.load("'.$structure->fileurl($file).'?id_module='.$id_module.'&id_record=" + id + "&documento=fattura&op=add_ordine&iddocumento='.$id_record.'", function() {
|
||||
if(content.html() != ""){
|
||||
box.show();
|
||||
}
|
||||
|
||||
loader.hide();
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
</script>';
|
||||
|
@ -4,40 +4,88 @@ include_once __DIR__.'/../../core.php';
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
||||
if ($module['name'] == 'Fatture di vendita') {
|
||||
$dir = 'entrata';
|
||||
$module_origin = 'Ddt di vendita';
|
||||
} else {
|
||||
$dir = 'uscita';
|
||||
$module_origin = 'Ddt di acquisto';
|
||||
$dir = ($module['name'] == 'Fatture di vendita') ? 'entrata' : 'uscita';
|
||||
|
||||
if (get('op')) {
|
||||
$options = [
|
||||
'op' => 'add_ddt',
|
||||
'id_importazione' => 'id_ddt',
|
||||
'final_module' => $module['name'],
|
||||
'original_module' => $module['name'] == 'Fatture di vendita' ? 'Ddt di vendita' : 'Ddt di acquisto',
|
||||
'sql' => [
|
||||
'table' => 'dt_ddt',
|
||||
'rows' => 'dt_righe_ddt',
|
||||
'id_rows' => 'idddt',
|
||||
],
|
||||
'serials' => [
|
||||
'id_riga' => 'id_riga_ddt',
|
||||
'condition' => '(id_riga_documento IS NOT NULL)',
|
||||
],
|
||||
'button' => tr('Aggiungi'),
|
||||
'dir' => $dir,
|
||||
];
|
||||
|
||||
$result = [
|
||||
'id_record' => $id_record,
|
||||
'id_documento' => get('iddocumento'),
|
||||
];
|
||||
|
||||
echo App::load('importa.php', $result, $options, true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$info = $dbo->fetchOne('SELECT * FROM co_documenti WHERE id='.prepare($id_record));
|
||||
$numero = ($info['numero_esterno'] != '') ? $info['numero_esterno'] : $info['numero'];
|
||||
$idanagrafica = $info['idanagrafica'];
|
||||
|
||||
// Ddt
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Ddt').'", "name": "id_ddt", "required": 1, "values": "query=SELECT dt_ddt.id, CONCAT(\'nr. \', IF(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d-%m-%Y\')) AS descrizione FROM dt_ddt WHERE idanagrafica='.prepare($idanagrafica).' AND idstatoddt IN (SELECT id FROM dt_statiddt WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoddt=(SELECT id FROM dt_tipiddt WHERE dir='.prepare($dir).') AND dt_ddt.id IN (SELECT idddt FROM dt_righe_ddt WHERE dt_righe_ddt.idddt = dt_ddt.id AND (qta - qta_evasa) > 0) ORDER BY data DESC, numero DESC" ]}
|
||||
</div>
|
||||
</div>';
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{[ "type": "select", "label": "'.tr('Ddt').'", "name": "id_documento", "values": "query=SELECT dt_ddt.id, CONCAT(\'DDT num. \', IF(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d-%m-%Y\')) AS descrizione FROM dt_ddt WHERE idanagrafica='.prepare($idanagrafica).' AND idstatoddt IN (SELECT id FROM dt_statiddt WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoddt=(SELECT id FROM dt_tipiddt WHERE dir='.prepare($dir).') AND dt_ddt.id IN (SELECT idddt FROM dt_righe_ddt WHERE dt_righe_ddt.idddt = dt_ddt.id AND (qta - qta_evasa) > 0) ORDER BY data DESC, numero DESC" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="box" id="info-box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.tr('Informazioni di importazione').'</h3>
|
||||
</div>
|
||||
<div class="box-body" id="righe_documento">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info" id="box-loading">
|
||||
<i class="fa fa-spinner fa-spin"></i> '.tr('Caricamento in corso').'...
|
||||
</div>';
|
||||
|
||||
$file = basename(__FILE__);
|
||||
echo '
|
||||
<div class="row">
|
||||
<div id="righeddt" class="col-md-12"></div>
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>';
|
||||
|
||||
?>
|
||||
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>
|
||||
|
||||
<script>
|
||||
$('#id_ddt').change( function(){
|
||||
$('#righeddt').html('<i>Caricamento in corso...</i>');
|
||||
var box = $("#info-box");
|
||||
var content = $("#righe_documento");
|
||||
var loader = $("#box-loading");
|
||||
|
||||
$(document).ready(function(){
|
||||
box.hide();
|
||||
loader.hide();
|
||||
})
|
||||
|
||||
$("#id_documento").on("change", function(){
|
||||
loader.show();
|
||||
box.hide();
|
||||
|
||||
$('#righeddt').load(globals.rootdir + '/modules/fatture/crea_documento.php?id_module=' + <?php echo Modules::get($module_origin)['id']; ?> + '&id_record=' + $(this).find('option:selected').val() + '&documento=fattura&op=add_ddt&iddocumento=' + globals.id_record);
|
||||
var id = $(this).selectData() ? $(this).selectData().id : "";
|
||||
|
||||
content.html("<i>'.tr('Caricamento in corso').'...</i>");
|
||||
content.load("'.$structure->fileurl($file).'?id_module='.$id_module.'&id_record=" + id + "&documento=fattura&op=add_ordine&iddocumento='.$id_record.'", function() {
|
||||
if(content.html() != ""){
|
||||
box.show();
|
||||
}
|
||||
|
||||
loader.hide();
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
</script>';
|
||||
|
@ -4,40 +4,88 @@ include_once __DIR__.'/../../core.php';
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
||||
if ($module['name'] == 'Fatture di vendita') {
|
||||
$dir = 'entrata';
|
||||
$module_origin = 'Ordini cliente';
|
||||
} else {
|
||||
$dir = 'uscita';
|
||||
$module_origin = 'Ordini fornitore';
|
||||
$dir = ($module['name'] == 'Fatture di vendita') ? 'entrata' : 'uscita';
|
||||
|
||||
if (get('op')) {
|
||||
$options = [
|
||||
'op' => 'add_ordine',
|
||||
'id_importazione' => 'id_ordine',
|
||||
'final_module' => $module['name'],
|
||||
'original_module' => $module['name'] == 'Fatture di vendita' ? 'Ordini cliente' : 'Ordini fornitore',
|
||||
'sql' => [
|
||||
'table' => 'or_ordini',
|
||||
'rows' => 'or_righe_ordini',
|
||||
'id_rows' => 'idordine',
|
||||
],
|
||||
'serials' => [
|
||||
'id_riga' => 'id_riga_ddt',
|
||||
'condition' => '(id_riga_documento IS NOT NULL)',
|
||||
],
|
||||
'button' => tr('Aggiungi'),
|
||||
'dir' => $dir,
|
||||
];
|
||||
|
||||
$result = [
|
||||
'id_record' => $id_record,
|
||||
'id_documento' => get('iddocumento'),
|
||||
];
|
||||
|
||||
echo App::load('importa.php', $result, $options, true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$info = $dbo->fetchOne('SELECT * FROM co_documenti WHERE id='.prepare($id_record));
|
||||
$numero = ($info['numero_esterno'] != '') ? $info['numero_esterno'] : $info['numero'];
|
||||
$idanagrafica = $info['idanagrafica'];
|
||||
|
||||
// Ordine
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Ordine').'", "name": "id_ordine", "required": 1, "values": "query=SELECT or_ordini.id, CONCAT(IF(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d-%m-%Y\')) AS descrizione FROM or_ordini WHERE idanagrafica='.prepare($idanagrafica).' AND idstatoordine IN (SELECT id FROM or_statiordine WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoordine=(SELECT id FROM or_tipiordine WHERE dir='.prepare($dir).' LIMIT 0,1) AND or_ordini.id IN (SELECT idordine FROM or_righe_ordini WHERE or_righe_ordini.idordine = or_ordini.id AND (qta - qta_evasa) > 0) ORDER BY data DESC, numero DESC" ]}
|
||||
</div>
|
||||
</div>';
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{[ "type": "select", "label": "'.tr('Ordine').'", "name": "id_documento", "values": "query=SELECT or_ordini.id, CONCAT(IF(numero_esterno != \'\', numero_esterno, numero), \' del \', DATE_FORMAT(data, \'%d-%m-%Y\')) AS descrizione FROM or_ordini WHERE idanagrafica='.prepare($idanagrafica).' AND idstatoordine IN (SELECT id FROM or_statiordine WHERE descrizione IN(\'Bozza\', \'Evaso\', \'Parzialmente evaso\', \'Parzialmente fatturato\')) AND idtipoordine=(SELECT id FROM or_tipiordine WHERE dir='.prepare($dir).' LIMIT 0,1) AND or_ordini.id IN (SELECT idordine FROM or_righe_ordini WHERE or_righe_ordini.idordine = or_ordini.id AND (qta - qta_evasa) > 0) ORDER BY data DESC, numero DESC" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="box" id="info-box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.tr('Informazioni di importazione').'</h3>
|
||||
</div>
|
||||
<div class="box-body" id="righe_documento">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info" id="box-loading">
|
||||
<i class="fa fa-spinner fa-spin"></i> '.tr('Caricamento in corso').'...
|
||||
</div>';
|
||||
|
||||
$file = basename(__FILE__);
|
||||
echo '
|
||||
<div class="row">
|
||||
<div id="righeordine" class="col-md-12"></div>
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>';
|
||||
|
||||
?>
|
||||
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>
|
||||
|
||||
<script>
|
||||
$('#id_ordine').change( function(){
|
||||
$('#righeordine').html('<i>Caricamento in corso...</i>');
|
||||
var box = $("#info-box");
|
||||
var content = $("#righe_documento");
|
||||
var loader = $("#box-loading");
|
||||
|
||||
$(document).ready(function(){
|
||||
box.hide();
|
||||
loader.hide();
|
||||
})
|
||||
|
||||
$("#id_documento").on("change", function(){
|
||||
loader.show();
|
||||
box.hide();
|
||||
|
||||
$('#righeordine').load(globals.rootdir + '/modules/fatture/crea_documento.php?id_module=' + <?php echo Modules::get($module_origin)['id']; ?> + '&id_record=' + $(this).find('option:selected').val() + '&documento=fattura&op=add_ordine&iddocumento=' + globals.id_record);
|
||||
var id = $(this).selectData() ? $(this).selectData().id : "";
|
||||
|
||||
content.html("<i>'.tr('Caricamento in corso').'...</i>");
|
||||
content.load("'.$structure->fileurl($file).'?id_module='.$id_module.'&id_record=" + id + "&documento=fattura&op=add_ordine&iddocumento='.$id_record.'", function() {
|
||||
if(content.html() != ""){
|
||||
box.show();
|
||||
}
|
||||
|
||||
loader.hide();
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
</script>
|
||||
</script>';
|
||||
|
@ -4,93 +4,80 @@ include_once __DIR__.'/../../core.php';
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
||||
if ($module['name'] == 'Fatture di vendita') {
|
||||
$dir = 'entrata';
|
||||
$conti = 'conti-vendite';
|
||||
} else {
|
||||
$dir = 'uscita';
|
||||
$conti = 'conti-acquisti';
|
||||
if (get('op')) {
|
||||
$options = [
|
||||
'op' => 'add_preventivo',
|
||||
'id_importazione' => 'id_preventivo',
|
||||
'final_module' => $module['name'],
|
||||
'original_module' => 'Preventivi',
|
||||
'sql' => [
|
||||
'table' => 'co_preventivi',
|
||||
'rows' => 'co_righe_preventivi',
|
||||
'id_rows' => 'idpreventivo',
|
||||
],
|
||||
'serials' => false,
|
||||
'button' => tr('Aggiungi'),
|
||||
'dir' => $dir,
|
||||
];
|
||||
|
||||
$result = [
|
||||
'id_record' => $id_record,
|
||||
'id_documento' => get('iddocumento'),
|
||||
];
|
||||
|
||||
echo App::load('importa.php', $result, $options, true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$info = $dbo->fetchOne('SELECT * FROM co_documenti WHERE id='.prepare($id_record));
|
||||
$numero = ($info['numero_esterno'] != '') ? $info['numero_esterno'] : $info['numero'];
|
||||
$idanagrafica = $info['idanagrafica'];
|
||||
|
||||
$idconto = ($dir == 'entrata') ? setting('Conto predefinito fatture di vendita') : setting('Conto predefinito fatture di acquisto');
|
||||
|
||||
/*
|
||||
Form di inserimento riga documento
|
||||
*/
|
||||
echo '
|
||||
<p>'.tr('Documento numero _NUM_', [
|
||||
'_NUM_' => $numero,
|
||||
]).'</p>
|
||||
|
||||
<form action="'.$rootdir.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.'" method="post">
|
||||
<input type="hidden" name="op" value="addpreventivo">
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
<input type="hidden" name="dir" value="'.$dir.'">';
|
||||
|
||||
// Preventivo
|
||||
$_SESSION['superselect']['stati'] = [
|
||||
'Accettato',
|
||||
'In lavorazione',
|
||||
'In attesa di conferma',
|
||||
];
|
||||
$_SESSION['superselect']['non_fatturato'] = 1;
|
||||
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Preventivo').'", "name": "idpreventivo", "required": 1, "ajax-source": "preventivi", "extra": "onchange=\"$data = $(this).selectData(); $(\'#descrizione\').val($data.text); $(\'#prezzo\').val($data.totale - $data.sconto);console.log($data.totale)\"" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
{[ "type": "checkbox", "label": "'.tr('Importa righe').'", "name": "import", "value": "1", "placeholder": "'.tr('Replica righe del preventivo in fattura').'" ]}
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
// Descrizione
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione", "required": 1 ]}
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
// Leggo l'iva predefinita dall'articolo e se non c'è leggo quella predefinita generica
|
||||
$idiva = $idiva ?: setting('Iva predefinita');
|
||||
|
||||
// Iva
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Iva').'", "name": "idiva", "required": 1, "value": "'.$idiva.'", "ajax-source": "iva" ]}
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Conto').'", "name": "idconto", "required": 1, "value": "'.$idconto.'", "ajax-source": "'.$conti.'" ]}
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
// Costo unitario
|
||||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{[ "type": "number", "label": "'.tr('Costo unitario').'", "name": "prezzo", "required": 1, "icon-after": "€", "disabled": 1 ]}
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
|
||||
<!-- PULSANTI -->
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-right">
|
||||
<button type="submit" class="btn btn-primary pull-right"><i class="fa fa-plus"></i> '.tr('Aggiungi').'</button>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
{[ "type": "select", "label": "'.tr('Preventivo').'", "name": "id_documento", "ajax-source": "preventivi" ]}
|
||||
</div>
|
||||
</form>';
|
||||
</div>
|
||||
|
||||
<div class="box" id="info-box">
|
||||
<div class="box-header with-border">
|
||||
<h3 class="box-title">'.tr('Informazioni di importazione').'</h3>
|
||||
</div>
|
||||
<div class="box-body" id="righe_documento">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info" id="box-loading">
|
||||
<i class="fa fa-spinner fa-spin"></i> '.tr('Caricamento in corso').'...
|
||||
</div>';
|
||||
|
||||
$file = basename(__FILE__);
|
||||
echo '
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>';
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>
|
||||
|
||||
<script>
|
||||
var box = $("#info-box");
|
||||
var content = $("#righe_documento");
|
||||
var loader = $("#box-loading");
|
||||
|
||||
$(document).ready(function(){
|
||||
box.hide();
|
||||
loader.hide();
|
||||
})
|
||||
|
||||
$("#id_documento").on("change", function(){
|
||||
loader.show();
|
||||
box.hide();
|
||||
|
||||
var id = $(this).selectData() ? $(this).selectData().id : "";
|
||||
|
||||
content.html("<i>'.tr('Caricamento in corso').'...</i>");
|
||||
content.load("'.$structure->fileurl($file).'?id_module='.$id_module.'&id_record=" + id + "&documento=fattura&op=add_ordine&iddocumento='.$id_record.'", function() {
|
||||
if(content.html() != ""){
|
||||
box.show();
|
||||
}
|
||||
|
||||
loader.hide();
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
</script>';
|
||||
|
@ -13,10 +13,10 @@ echo '
|
||||
<i class="fa fa-copy"></i> '.tr('Duplica fattura').'
|
||||
</button>';
|
||||
|
||||
if ($dir == 'entrata' && empty($record['ref_documento']) && $record['stato'] == 'Emessa') {
|
||||
if ($dir == 'entrata') {
|
||||
echo '
|
||||
<div class="btn-group">
|
||||
<button type="button" class="btn btn-primary unblockable dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<button type="button" class="btn btn-primary unblockable dropdown-toggle '.(!empty($record['ref_documento']) || $record['stato'] == 'Emessa' ? '' : 'disabled').'" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="fa fa-magic"></i> '.tr('Crea').' <span class="caret"></span>
|
||||
<span class="sr-only">Toggle Dropdown</span>
|
||||
</button>
|
||||
|
@ -4,340 +4,29 @@ include_once __DIR__.'/../../core.php';
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
||||
$data = [
|
||||
'ddt' => [
|
||||
'table' => 'dt_ddt', // Tabella del documento
|
||||
'rows' => 'dt_righe_ddt', // Tabella delle righe
|
||||
'id' => 'idddt', // ID nella tabella delle righe
|
||||
'condition' => '(id_riga_documento IS NOT NULL)', // Condizione per i seriali
|
||||
],
|
||||
'ord' => [
|
||||
'table' => 'or_ordini',
|
||||
'rows' => 'or_righe_ordini',
|
||||
'id' => 'idordine',
|
||||
'condition' => '(id_riga_ddt IS NOT NULL OR id_riga_documento IS NOT NULL)',
|
||||
],
|
||||
'fat' => [
|
||||
$options = [
|
||||
'op' => 'nota_credito',
|
||||
'id_importazione' => 'id_documento',
|
||||
'final_module' => $module['name'],
|
||||
'original_module' => $module['name'],
|
||||
'sql' => [
|
||||
'table' => 'co_documenti',
|
||||
'rows' => 'co_righe_documenti',
|
||||
'id' => 'iddocumento',
|
||||
'condition' => '(1 = 2)',
|
||||
'allow-empty' => true,
|
||||
'id_rows' => 'iddocumento',
|
||||
],
|
||||
'serials' => [
|
||||
'id_riga' => 'id_riga_documento',
|
||||
'condition' => '(1 = 2)',
|
||||
],
|
||||
'button' => tr('Aggiungi'),
|
||||
'dir' => $dir,
|
||||
'create_document' => true,
|
||||
'allow-empty' => true,
|
||||
];
|
||||
|
||||
$documento = get('documento');
|
||||
$result = [
|
||||
'id_record' => $id_record,
|
||||
'id_documento' => get('iddocumento'),
|
||||
];
|
||||
|
||||
if ($module['name'] == 'Ordini cliente' || $module['name'] == 'Ordini fornitore') {
|
||||
$pos = 'ord';
|
||||
$op = ($documento == 'ddt') ? 'ddt_da_ordine' : 'fattura_da_ordine';
|
||||
|
||||
$head = tr('Ordine numero _NUM_');
|
||||
|
||||
$dir = ($module['name'] == 'Ordini cliente') ? 'entrata' : 'uscita';
|
||||
} elseif ($module['name'] == 'Ddt di vendita' || $module['name'] == 'Ddt di acquisto') {
|
||||
$pos = 'ddt';
|
||||
$op = 'fattura_da_ddt';
|
||||
|
||||
$head = tr('Ddt numero _NUM_');
|
||||
|
||||
$dir = ($module['name'] == 'Ddt di vendita') ? 'entrata' : 'uscita';
|
||||
} else {
|
||||
$pos = 'fat';
|
||||
$op = 'nota_credito';
|
||||
|
||||
$head = tr('Fattura numero _NUM_');
|
||||
|
||||
$dir = 'entrata';
|
||||
}
|
||||
|
||||
$table = $data[$pos]['table'];
|
||||
$rows = $data[$pos]['rows'];
|
||||
$id = $data[$pos]['id'];
|
||||
$row = str_replace('id', 'id_riga_', $id);
|
||||
|
||||
if ($module['name'] == 'Ordini cliente') {
|
||||
$module_name = ($documento == 'ddt') ? 'Ddt di vendita' : 'Fatture di vendita';
|
||||
} elseif ($module['name'] == 'Ordini fornitore') {
|
||||
$module_name = ($documento == 'ddt') ? 'Ddt di acquisto' : 'Fatture di acquisto';
|
||||
} elseif ($module['name'] == 'Ddt di acquisto') {
|
||||
$module_name = 'Fatture di acquisto';
|
||||
} else {
|
||||
$module_name = 'Fatture di vendita';
|
||||
}
|
||||
|
||||
$op = !empty(get('op')) ? get('op') : $op;
|
||||
|
||||
$button = ($documento == 'ddt') ? tr('Crea ddt') : tr('Crea fattura');
|
||||
$button = !empty(get('op')) ? tr('Aggiungi') : $button;
|
||||
|
||||
// Info documento
|
||||
$rs = $dbo->fetchArray('SELECT * FROM '.$table.' WHERE id='.prepare($id_record));
|
||||
$numero = !empty($rs[0]['numero_esterno']) ? $rs[0]['numero_esterno'] : $rs[0]['numero'];
|
||||
$idanagrafica = $rs[0]['idanagrafica'];
|
||||
$idpagamento = $rs[0]['idpagamento'];
|
||||
$idconto = $rs[0]['idconto'];
|
||||
|
||||
if (empty($idconto)) {
|
||||
$idconto = ($dir == 'entrata') ? setting('Conto predefinito fatture di vendita') : setting('Conto predefinito fatture di acquisto');
|
||||
}
|
||||
|
||||
/*
|
||||
Form di inserimento riga documento
|
||||
*/
|
||||
echo '
|
||||
<p>'.str_replace('_NUM_', $numero, $head).'.</p>';
|
||||
|
||||
// Selezione articoli dell'ordine da portare nel ddt
|
||||
$rs = $dbo->fetchArray('SELECT *, IFNULL((SELECT codice FROM mg_articoli WHERE id=idarticolo),"") AS codice, (qta - qta_evasa) AS qta_rimanente FROM '.$table.' INNER JOIN '.$rows.' ON '.$table.'.id='.$rows.'.'.$id.' WHERE '.$table.'.id='.prepare($id_record).' HAVING qta_rimanente > 0 OR is_descrizione = 1 ORDER BY `order`');
|
||||
|
||||
if (!empty($rs)) {
|
||||
echo '
|
||||
<p>'.tr('Seleziona le righe e le relative quantità da inserire nel documento').'.</p>
|
||||
|
||||
<form action="'.$rootdir.'/editor.php?id_module='.Modules::get($module_name)['id'].(!empty(get('iddocumento')) ? '&id_record='.get('iddocumento') : '').'" method="post">
|
||||
<input type="hidden" name="'.$id.'" value="'.$id_record.'">
|
||||
<input type="hidden" name="idanagrafica" value="'.$idanagrafica.'">
|
||||
<input type="hidden" name="idconto" value="'.$idconto.'">
|
||||
<input type="hidden" name="idpagamento" value="'.$idpagamento.'">
|
||||
<input type="hidden" name="iddocumento" value="'.$id_record.'">
|
||||
|
||||
<input type="hidden" name="op" value="'.$op.'">
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
<input type="hidden" name="dir" value="'.$dir.'">';
|
||||
|
||||
if (empty(get('op'))) {
|
||||
echo '
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6">
|
||||
{[ "type": "date", "label": "'.tr('Data del documento').'", "name": "data", "required": 1, "value": "-now-" ]}
|
||||
</div>';
|
||||
|
||||
if ($module_name == 'Fatture di vendita' || $module_name == 'Fatture di acquisto') {
|
||||
$rs_segment = $dbo->fetchArray("SELECT * FROM zz_segments WHERE predefined_accredito='1'");
|
||||
if ($op == 'nota_accredito' && sizeof($rs_segment) > 0) {
|
||||
echo '
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.prepare(Modules::get($module_name)['id']).' ORDER BY name", "value": "'.$rs_segment[0]['id'].'" ]}
|
||||
</div>';
|
||||
} else {
|
||||
echo '
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.prepare(Modules::get($module_name)['id']).' ORDER BY name", "value": "'.$_SESSION['module_'.Modules::get($module_name)['id']]['id_segment'].'" ]}
|
||||
</div>';
|
||||
}
|
||||
}
|
||||
|
||||
echo
|
||||
'</div>';
|
||||
}
|
||||
|
||||
echo '
|
||||
<div class="clearfix"></div>
|
||||
<br>
|
||||
|
||||
<table class="table table-striped table-hover table-condensed">
|
||||
<tr>
|
||||
<th>'.tr('Descrizione').'</th>
|
||||
<th width="10%">'.tr('Q.tà').'</th>
|
||||
<th width="15%">'.tr('Q.tà da evadere').'</th>
|
||||
<th width="20%">'.tr('Subtot.').'</th>
|
||||
<th width="20%">'.tr('Seriali').'</th>
|
||||
</tr>';
|
||||
|
||||
$totale = 0.00;
|
||||
|
||||
foreach ($rs as $i => $r) {
|
||||
// Descrizione
|
||||
echo '
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
<input type="hidden" name="abilita_serial['.$r['id'].']" value="'.$r['abilita_serial'].'" />
|
||||
<input type="hidden" id="idarticolo_'.$i.'" name="idarticolo['.$r['id'].']" value="'.$r['idarticolo'].'" />
|
||||
<input type="hidden" id="descrizione_'.$i.'" name="descrizione['.$r['id'].']" value="'.$r['descrizione'].'" />';
|
||||
|
||||
// Checkbox - da evadere?
|
||||
echo '
|
||||
<input type="checkbox" checked="checked" id="checked_'.$i.'" name="evadere['.$r['id'].']" value="on" onclick="ricalcola_subtotale_riga('.$i.');" />';
|
||||
|
||||
$descrizione = (!empty($r['codice']) ? $r['codice'].' - ' : '').$r['descrizione'];
|
||||
|
||||
echo ' '.nl2br($descrizione);
|
||||
|
||||
echo '
|
||||
</td>';
|
||||
|
||||
// Q.tà rimanente
|
||||
echo '
|
||||
<td>
|
||||
<input type="hidden" id="qtamax_'.$i.'" value="'.($r['qta'] - $r['qta_evasa']).'" />
|
||||
<input type="hidden" id="um_'.$i.'" name="um['.$r['id'].']" value="'.$r['um'].'" />
|
||||
<p class="text-center">'.Translator::numberToLocale($r['qta_rimanente']).'</p>
|
||||
</td>';
|
||||
|
||||
// Q.tà da evadere
|
||||
echo '
|
||||
<td>
|
||||
{[ "type": "number", "name": "qta_da_evadere['.$r['id'].']", "id": "qta_'.$i.'", "required": 1, "value": "'.$r['qta_rimanente'].'", "extra" : "onkeyup=\"ricalcola_subtotale_riga('.$i.');\"", "decimals": "qta", "min-value": "0", "extra": "'.(($r['is_descrizione']) ? 'readonly' : '').'" ]}
|
||||
</td>';
|
||||
|
||||
// Subtotale
|
||||
$subtotale = $r['subtotale'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
|
||||
$sconto = $r['sconto'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
|
||||
$iva = $r['iva'] / $r['qta'] * ($r['qta'] - $r['qta_evasa']);
|
||||
|
||||
echo '
|
||||
<td>
|
||||
<input type="hidden" id="subtot_'.$i.'" name="subtot['.$r['id'].']" value="'.str_replace('.', ',', ($r['subtotale'] / $r['qta'])).'" />
|
||||
<input type="hidden" id="sconto_'.$i.'" name="sconto['.$r['id'].']" value="'.str_replace('.', ',', ($r['sconto'] / $r['qta'])).'" />
|
||||
<input type="hidden" id="idiva_'.$i.'" name="idiva['.$r['id'].']" value="'.$r['idiva'].'" />
|
||||
<input type="hidden" id="iva_'.$i.'" name="iva['.$r['id'].']" value="'.str_replace('.', ',', ($r['iva'] / $r['qta'])).'" />
|
||||
|
||||
<big id="subtotale_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto + $iva).' €</big><br/>
|
||||
|
||||
<small style="color:#777;" id="subtotaledettagli_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva).'</small>
|
||||
</td>';
|
||||
|
||||
// Seriali
|
||||
echo '
|
||||
<td>';
|
||||
if (!empty($r['abilita_serial'])) {
|
||||
$query = 'SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir='.prepare($dir).' AND '.$row.' = '.prepare($r['id']).' AND serial IS NOT NULL AND serial NOT IN (SELECT serial FROM mg_prodotti AS t WHERE serial IS NOT NULL AND dir='.prepare($dir).' AND '.$data[$pos]['condition'].')';
|
||||
|
||||
$values = $dbo->fetchArray($query);
|
||||
if (!empty($values)) {
|
||||
echo '
|
||||
{[ "type": "select", "name": "serial['.$r['id'].'][]", "id": "serial_'.$i.'", "multiple": 1, "values": "query='.$query.'", "value": "'.implode(',', array_column($values, 'id')).'", "extra": "data-maximum=\"'.intval($r['qta_rimanente']).'\"" ]}';
|
||||
} else {
|
||||
echo '-';
|
||||
}
|
||||
} else {
|
||||
echo '-';
|
||||
}
|
||||
echo '
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
$totale += $subtotale - $sconto + $iva;
|
||||
}
|
||||
|
||||
// Totale
|
||||
echo '
|
||||
<tr>
|
||||
<td colspan="4" align="right" class="text-right">
|
||||
<b>'.tr('Totale').':</b>
|
||||
</td>
|
||||
<td class="text-right" colspan="2">
|
||||
<big id="totale">'.Translator::numberToLocale($totale).' €</big>
|
||||
</td>
|
||||
</tr>
|
||||
</table>';
|
||||
|
||||
echo '
|
||||
|
||||
<!-- PULSANTI -->
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-right">
|
||||
<button type="submit" id="submit_btn" class="btn btn-primary pull-right">
|
||||
<i class="fa fa-plus"></i> '.$button.'
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>';
|
||||
} else {
|
||||
echo '
|
||||
<p>'.tr('Non ci sono articoli da evadere').'...</p>';
|
||||
}
|
||||
|
||||
echo '
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>';
|
||||
|
||||
?>
|
||||
|
||||
<script type="text/javascript">
|
||||
function ricalcola_subtotale_riga(r) {
|
||||
subtot = $("#subtot_" + r).val();
|
||||
sconto = $("#sconto_" + r).val();
|
||||
iva = $("#iva_" + r).val();
|
||||
|
||||
qtamax = $("#qtamax_" + r).val() ? $("#qtamax_" + r).val() : 0;
|
||||
|
||||
subtot = parseFloat(subtot);
|
||||
sconto = parseFloat(sconto);
|
||||
iva = parseFloat(iva);
|
||||
qtamax = parseFloat(qtamax);
|
||||
|
||||
subtot = subtot - sconto;
|
||||
|
||||
qta = $("#qta_" + r).val().toEnglish();
|
||||
|
||||
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
|
||||
if (qta > qtamax) {
|
||||
qta = qtamax;
|
||||
|
||||
$('#qta_' + r).val(qta);
|
||||
}
|
||||
|
||||
// Se tolgo la spunta della casella dell'evasione devo azzerare i conteggi
|
||||
if (isNaN(qta) || !$('#checked_' + r).is(':checked')) {
|
||||
qta = 0;
|
||||
}
|
||||
|
||||
$("#serial_" + r).selectClear();
|
||||
$("#serial_" + r).select2("destroy");
|
||||
$("#serial_" + r).data('maximum', qta);
|
||||
start_superselect();
|
||||
|
||||
subtotale = (subtot * qta + iva * qta).toLocale();
|
||||
|
||||
$("#subtotale_" + r).html(subtotale + " €");
|
||||
$("#subtotaledettagli_" + r).html((subtot * qta).toLocale() + " + " + (iva * qta).toLocale());
|
||||
|
||||
ricalcola_totale();
|
||||
}
|
||||
|
||||
function ricalcola_totale() {
|
||||
tot_qta = 0;
|
||||
r = 0;
|
||||
totale = 0.00;
|
||||
$('input[id*=qta_]').each(function() {
|
||||
qta = $(this).val().toEnglish();
|
||||
|
||||
if (!$('#checked_' + r).is(':checked') || isNaN(qta)) {
|
||||
qta = 0;
|
||||
}
|
||||
|
||||
subtot = $("#subtot_" + r).val();
|
||||
sconto = $("#sconto_" + r).val();
|
||||
iva = $("#iva_" + r).val();
|
||||
|
||||
subtot = parseFloat(subtot);
|
||||
sconto = parseFloat(sconto);
|
||||
iva = parseFloat(iva);
|
||||
|
||||
subtot = subtot - sconto;
|
||||
|
||||
totale += subtot * qta + iva * qta;
|
||||
|
||||
r++;
|
||||
|
||||
tot_qta += qta;
|
||||
});
|
||||
|
||||
$('#totale').html((totale.toLocale()) + " €");
|
||||
|
||||
<?php
|
||||
|
||||
if (empty($data[$pos]['allow-empty'])) {
|
||||
echo '
|
||||
if (tot_qta > 0)
|
||||
$("#submit_btn").show();
|
||||
else
|
||||
$("#submit_btn").hide();';
|
||||
}
|
||||
|
||||
?>
|
||||
}
|
||||
</script>
|
||||
echo App::load('importa.php', $result, $options, true);
|
||||
|
@ -432,7 +432,7 @@ if ($record['stato'] != 'Pagato' && $record['stato'] != 'Emessa') {
|
||||
</div>';
|
||||
|
||||
// Lettura preventivi accettati, in attesa di conferma o in lavorazione
|
||||
$prev_query = 'SELECT COUNT(*) AS tot FROM co_preventivi WHERE idanagrafica='.prepare($record['idanagrafica'])." AND id NOT IN (SELECT idpreventivo FROM co_righe_documenti WHERE idpreventivo IS NOT NULL) AND id NOT IN (SELECT idpreventivo FROM or_righe_ordini WHERE NOT idpreventivo IS NOT NULL) AND idstato IN(SELECT id FROM co_statipreventivi WHERE descrizione='Accettato' OR descrizione='In lavorazione' OR descrizione='In attesa di conferma') AND default_revision=1";
|
||||
$prev_query = 'SELECT COUNT(*) AS tot FROM co_preventivi WHERE idanagrafica='.prepare($record['idanagrafica'])." AND idstato IN(SELECT id FROM co_statipreventivi WHERE descrizione='Accettato' OR descrizione='In lavorazione' OR descrizione='In attesa di conferma') AND default_revision=1 AND co_preventivi.id IN (SELECT idpreventivo FROM co_righe_preventivi WHERE co_righe_preventivi.idpreventivo = co_preventivi.id AND (qta - qta_evasa) > 0)";
|
||||
$preventivi = $dbo->fetchArray($prev_query)[0]['tot'];
|
||||
echo '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Preventivi accettati, in attesa di conferma o in lavorazione.').'" style="display:inline;">
|
||||
@ -442,7 +442,7 @@ if ($record['stato'] != 'Pagato' && $record['stato'] != 'Emessa') {
|
||||
</div>';
|
||||
|
||||
// Lettura contratti accettati, in attesa di conferma o in lavorazione
|
||||
$contr_query = 'SELECT COUNT(*) AS tot FROM co_contratti WHERE idanagrafica='.prepare($record['idanagrafica']).' AND id NOT IN (SELECT idcontratto FROM co_righe_documenti WHERE idcontratto IS NOT NULL) AND idstato IN( SELECT id FROM co_staticontratti WHERE fatturabile = 1) AND NOT EXISTS (SELECT id FROM co_righe_documenti WHERE co_righe_documenti.idcontratto = co_contratti.id)';
|
||||
$contr_query = 'SELECT COUNT(*) AS tot FROM co_contratti WHERE idanagrafica='.prepare($record['idanagrafica']).' AND idstato IN( SELECT id FROM co_staticontratti WHERE fatturabile = 1) AND co_contratti.id IN (SELECT idcontratto FROM co_righe_contratti WHERE co_righe_contratti.idcontratto = co_contratti.id AND (qta - qta_evasa) > 0)';
|
||||
$contratti = $dbo->fetchArray($contr_query)[0]['tot'];
|
||||
echo '
|
||||
<div class="tip" data-toggle="tooltip" title="'.tr('Contratti accettati, in attesa di conferma o in lavorazione.').'" style="display:inline;">
|
||||
|
@ -11,6 +11,7 @@ class Articolo extends Article
|
||||
use RelationTrait;
|
||||
|
||||
protected $table = 'co_righe_documenti';
|
||||
protected $serialRowID = 'documento';
|
||||
|
||||
/**
|
||||
* Crea un nuovo articolo collegato ad una fattura.
|
||||
|
@ -5,7 +5,6 @@ include_once __DIR__.'/../../core.php';
|
||||
// Rimuovo session usate sui select combinati (sedi, preventivi, contratti, impianti)
|
||||
unset($_SESSION['superselect']['idanagrafica']);
|
||||
unset($_SESSION['superselect']['idsede']);
|
||||
unset($_SESSION['superselect']['non_fatturato']);
|
||||
|
||||
// Calcolo del nuovo codice
|
||||
$new_codice = \Modules\Interventi\Intervento::getNextCodice();
|
||||
|
@ -4,6 +4,7 @@ namespace Modules\Interventi;
|
||||
|
||||
use Common\Document;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Contratti\Contratto;
|
||||
use Modules\Interventi\Components\Articolo;
|
||||
use Modules\Interventi\Components\Riga;
|
||||
use Modules\Preventivi\Preventivo;
|
||||
@ -46,7 +47,12 @@ class Intervento extends Document
|
||||
|
||||
public function preventivo()
|
||||
{
|
||||
return $this->hasOne(Preventivo::class, 'id_preventivo');
|
||||
return $this->belongsTo(Preventivo::class, 'id_preventivo');
|
||||
}
|
||||
|
||||
public function contratto()
|
||||
{
|
||||
return $this->belongsTo(Contratto::class, 'id_contratto');
|
||||
}
|
||||
|
||||
public function stato()
|
||||
|
@ -22,11 +22,8 @@ switch (post('op')) {
|
||||
$idanagrafica = post('idanagrafica');
|
||||
$data = post('data');
|
||||
|
||||
// Leggo se l'ordine è cliente o fornitore
|
||||
$tipo = $dbo->fetchOne('SELECT id FROM or_tipiordine WHERE dir='.prepare($dir));
|
||||
|
||||
$anagrafica = Anagrafica::find($idanagrafica);
|
||||
$tipo = Tipo::find($tipo['id']);
|
||||
$tipo = Tipo::where('dir', $dir)->first();
|
||||
|
||||
$ordine = Ordine::build($anagrafica, $tipo, $data);
|
||||
$id_record = $ordine->id;
|
||||
@ -347,88 +344,51 @@ switch (post('op')) {
|
||||
|
||||
break;
|
||||
|
||||
case 'ordine_da_preventivo':
|
||||
// Aggiunta di un preventivo in ordine
|
||||
case 'add_preventivo':
|
||||
$preventivo = \Modules\Preventivi\Preventivo::find(post('id_preventivo'));
|
||||
|
||||
$idanagrafica = post('idanagrafica');
|
||||
$idpreventivo = post('idpreventivo');
|
||||
// Creazione della fattura al volo
|
||||
if (post('create_document') == 'on') {
|
||||
$tipo = Tipo::where('dir', $dir)->first();
|
||||
|
||||
$data = post('data');
|
||||
$ordine = Ordine::build($preventivo->anagrafica, $tipo, date('Y-m-d'), post('id_segment'));
|
||||
$ordine->idpagamento = $preventivo->idpagamento;
|
||||
$ordine->save();
|
||||
|
||||
// Leggo se l'ordine è cliente o fornitore
|
||||
$rs = $dbo->fetchArray('SELECT id FROM or_tipiordine WHERE dir='.prepare($dir));
|
||||
$idtipoordine = $rs[0]['id'];
|
||||
$id_record = $ordine->id;
|
||||
}
|
||||
|
||||
if (post('idanagrafica') !== null) {
|
||||
$numero = get_new_numeroordine($data);
|
||||
if ($dir == 'entrata') {
|
||||
$numero_esterno = get_new_numerosecondarioordine($data);
|
||||
} else {
|
||||
$numero_esterno = '';
|
||||
}
|
||||
$parziale = false;
|
||||
|
||||
$campo = ($dir == 'entrata') ? 'idpagamento_vendite' : 'idpagamento_acquisti';
|
||||
$id_iva = get('id_iva');
|
||||
$id_conto = get('id_conto');
|
||||
$righe = $preventivo->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
if (post('evadere')[$riga->id] == 'on') {
|
||||
$qta = post('qta_da_evadere')[$riga->id];
|
||||
|
||||
// Tipo di pagamento predefinito dall'anagrafica
|
||||
$query = 'SELECT id FROM co_pagamenti WHERE id=(SELECT '.$campo.' AS pagamento FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica).')';
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$idpagamento = isset($rs[0]) ? $rs[0]['id'] : null;
|
||||
$copia = $riga->copiaIn($ordine, $qta);
|
||||
$copia->id_iva = $id_iva;
|
||||
$copia->id_conto = $id_conto;
|
||||
|
||||
// Se l'ordine è un ordine cliente e non è stato associato un pagamento predefinito al cliente leggo il pagamento dalle impostazioni
|
||||
if ($dir == 'entrata' && empty($idpagamento)) {
|
||||
$idpagamento = setting('Tipo di pagamento predefinito');
|
||||
}
|
||||
|
||||
$query = 'INSERT INTO or_ordini( numero, numero_esterno, idanagrafica, idtipoordine, idpagamento, data, idstatoordine ) VALUES ( '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($idanagrafica).', '.prepare($idtipoordine).', '.prepare($idpagamento).', '.prepare($data).", (SELECT `id` FROM `or_statiordine` WHERE `descrizione`='Bozza') )";
|
||||
$dbo->query($query);
|
||||
|
||||
$id_record = $dbo->lastInsertedID();
|
||||
|
||||
flash()->info(tr('Aggiunto ordine numero _NUM_!', [
|
||||
'_NUM_' => $numero,
|
||||
]));
|
||||
|
||||
// Lettura di tutte le righe della tabella in arrivo
|
||||
// Inserisco anche le righe descrittive
|
||||
foreach (post('evadere') as $i => $value) {
|
||||
// Processo solo le righe da evadere
|
||||
if (post('evadere')[$i] == 'on') {
|
||||
$descrizione = post('descrizione')[$i];
|
||||
$prezzo = post('subtot')[$i];
|
||||
$qta = post('qta_da_evadere')[$i];
|
||||
$idiva = post('idiva')[$i];
|
||||
$um = post('um')[$i];
|
||||
$subtot = $prezzo * $qta;
|
||||
$idarticolo = post('idarticolo')[$i];
|
||||
$sconto = post('sconto')[$i];
|
||||
|
||||
// Ottengo le informazioni sullo sconto
|
||||
$qprc = 'SELECT tipo_sconto, sconto_unitario FROM co_righe_preventivi WHERE id='.prepare($i);
|
||||
$rsprc = $dbo->fetchArray($qprc);
|
||||
|
||||
$sconto_unitario = $rsprc[0]['sconto_unitario'];
|
||||
$tipo_sconto = $rsprc[0]['tipo_sconto'];
|
||||
|
||||
$sconto = $sconto * $qta;
|
||||
|
||||
// Calcolo iva
|
||||
$query = 'SELECT descrizione, percentuale, indetraibile FROM co_iva WHERE id='.prepare($idiva);
|
||||
$rs = $dbo->fetchArray($query);
|
||||
$iva = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
|
||||
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
|
||||
|
||||
$query = 'INSERT INTO or_righe_ordini(idordine, idarticolo, idpreventivo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, is_descrizione, `order`) VALUES('.prepare($id_record).', '.prepare($idarticolo).', '.prepare($idpreventivo).', '.prepare($idiva).', '.prepare($rs[0]['descrizione']).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto_unitario).', '.prepare($tipo_sconto).', '.prepare($um).', '.prepare($qta).', '.prepare(empty($qta)).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM or_righe_ordini AS t WHERE idordine='.prepare($id_record).'))';
|
||||
$dbo->query($query);
|
||||
// Aggiornamento seriali dalla riga dell'ordine
|
||||
if ($copia->isArticolo()) {
|
||||
$copia->movimenta($copia->qta);
|
||||
}
|
||||
}
|
||||
|
||||
// Ricalcolo inps, ritenuta e bollo
|
||||
if ($dir == 'entrata') {
|
||||
ricalcola_costiagg_ordine($id_record);
|
||||
} else {
|
||||
ricalcola_costiagg_ordine($id_record);
|
||||
if ($riga->qta != $riga->qta_evasa) {
|
||||
$parziale = true;
|
||||
}
|
||||
}
|
||||
|
||||
ricalcola_costiagg_ordine($id_record);
|
||||
|
||||
flash()->info(tr('Preventivo _NUM_ aggiunto!', [
|
||||
'_NUM_' => $preventivo->numero,
|
||||
]));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2,32 +2,26 @@
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
if (!in_array($record['stato'], ['Fatturato'])) {
|
||||
echo '
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-info dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
|
||||
echo '
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-info dropdown-toggle '.(!in_array($record['stato'], ['Fatturato', 'Evaso']) ? '' : 'disabled').'" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
|
||||
<i class="fa fa-magic"></i> '.tr('Crea').'...
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu dropdown-menu-right">';
|
||||
|
||||
if (in_array($record['stato'], ['Bozza', 'Parzialmente evaso'])) {
|
||||
echo '
|
||||
<li>
|
||||
<a data-href="'.$rootdir.'/modules/fatture/crea_documento.php?id_module='.$id_module.'&id_record='.$id_record.'&documento=ddt" data-toggle="modal" data-title="'.tr('Crea ddt').'"><i class="fa fa-file-o"></i> '.tr('ddt').'
|
||||
</a>
|
||||
</li>';
|
||||
}
|
||||
|
||||
if (in_array($record['stato'], ['Bozza', 'Evaso', 'Parzialmente evaso', 'Parzialmente fatturato'])) {
|
||||
echo '
|
||||
<li>
|
||||
<a data-href="'.$rootdir.'/modules/fatture/crea_documento.php?id_module='.$id_module.'&id_record='.$id_record.'&documento=fattura" data-toggle="modal" data-title="'.tr('Crea fattura').'"><i class="fa fa-file"></i> '.tr('fattura').'
|
||||
</a>
|
||||
</li>';
|
||||
}
|
||||
echo '
|
||||
<li>
|
||||
<a data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=ddt" data-toggle="modal" data-title="'.tr('Crea ddt').'" class="'.(in_array($record['stato'], ['Bozza', 'Parzialmente evaso']) ? '' : 'disabled').'"><i class="fa fa-file-o"></i> '.tr('ddt').'
|
||||
</a>
|
||||
</li>';
|
||||
|
||||
echo '
|
||||
</ul>
|
||||
</div>';
|
||||
}
|
||||
<li>
|
||||
<a data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=fattura" data-toggle="modal" data-title="'.tr('Crea fattura').'" class="'.(in_array($record['stato'], ['Bozza', 'Parzialmente fatturato']) ? '' : 'disabled').'"><i class="fa fa-file"></i> '.tr('fattura').'
|
||||
</a>
|
||||
</li>';
|
||||
|
||||
echo '
|
||||
</ul>
|
||||
</div>';
|
||||
|
@ -4,268 +4,36 @@ include_once __DIR__.'/../../core.php';
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
||||
$data = [
|
||||
'preventivo' => [
|
||||
'table' => 'co_preventivi',
|
||||
'rows' => 'co_righe_preventivi',
|
||||
'id' => 'idpreventivo',
|
||||
'condition' => '',
|
||||
],
|
||||
];
|
||||
|
||||
$documento = get('documento');
|
||||
|
||||
$pos = 'preventivo';
|
||||
$op = 'ordine_da_preventivo';
|
||||
|
||||
$head = tr('Preventivo numero _NUM_');
|
||||
|
||||
$table = $data[$pos]['table'];
|
||||
$rows = $data[$pos]['rows'];
|
||||
$id = $data[$pos]['id'];
|
||||
$row = str_replace('id', 'id_riga_', $id);
|
||||
|
||||
$module_name = 'Ordini cliente';
|
||||
|
||||
$op = !empty(get('op')) ? get('op') : $op;
|
||||
|
||||
$button = tr('Crea ordine');
|
||||
$button = !empty(get('op')) ? tr('Aggiungi') : $button;
|
||||
|
||||
// Info documento
|
||||
$rs = $dbo->fetchArray('SELECT * FROM '.$table.' WHERE id='.prepare($id_record));
|
||||
$numero = !empty($rs[0]['numero_esterno']) ? $rs[0]['numero_esterno'] : $rs[0]['numero'];
|
||||
$idanagrafica = $rs[0]['idanagrafica'];
|
||||
$idsede = $rs[0]['idsede'];
|
||||
$idpagamento = $rs[0]['idpagamento'];
|
||||
$idconto = $rs[0]['idconto'];
|
||||
|
||||
/*
|
||||
Form di inserimento riga documento
|
||||
*/
|
||||
echo '
|
||||
<p>'.str_replace('_NUM_', $numero, $head).'.</p>';
|
||||
|
||||
// Selezione articoli del preventivo da copiare nell'ordine, usando l'ordinamento scelto dall'utente
|
||||
$rs = $dbo->fetchArray('SELECT * FROM '.$table.' INNER JOIN '.$rows.' ON '.$table.'.id='.$rows.'.'.$id.' WHERE '.$table.'.id='.prepare($id_record).' ORDER BY `order`');
|
||||
|
||||
if (!empty($rs)) {
|
||||
echo '
|
||||
<p>'.tr('Seleziona le righe e le relative quantità da inserire nell\'ordine.').'.</p>
|
||||
|
||||
<form action="'.$rootdir.'/editor.php?id_module='.Modules::get($module_name)['id'].(!empty(get('iddocumento')) ? '&id_record='.get('iddocumento') : '').'" method="post">
|
||||
<input type="hidden" name="'.$id.'" value="'.$id_record.'">
|
||||
<input type="hidden" name="idanagrafica" value="'.$idanagrafica.'">
|
||||
<input type="hidden" name="idsede" value="'.$idsede.'">
|
||||
<input type="hidden" name="idconto" value="'.$idconto.'">
|
||||
<input type="hidden" name="idpagamento" value="'.$idpagamento.'">
|
||||
<input type="hidden" name="iddocumento" value="'.$id_record.'">
|
||||
|
||||
<input type="hidden" name="op" value="'.$op.'">
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
<input type="hidden" name="dir" value="'.$dir.'">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-md-6">
|
||||
{[ "type": "date", "label": "'.tr('Data del documento').'", "name": "data", "required": 1, "value": "-now-" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
<br>
|
||||
|
||||
<table class="table table-striped table-hover table-condensed">
|
||||
<tr>
|
||||
<th>'.tr('Descrizione').'</th>
|
||||
<th width="10%">'.tr('Q.tà').'</th>
|
||||
<th width="15%">'.tr('Q.tà da evadere').'</th>
|
||||
<th width="20%">'.tr('Subtot.').'</th>
|
||||
<th width="20%">'.tr('Seriali').'</th>
|
||||
</tr>';
|
||||
|
||||
$totale = 0.00;
|
||||
|
||||
foreach ($rs as $i => $r) {
|
||||
// Descrizione
|
||||
echo '
|
||||
<tr>
|
||||
<td '.($r['is_descrizione'] ? 'colspan="5"' : '').' >
|
||||
|
||||
<input type="hidden" name="abilita_serial['.$r['id'].']" value="'.$r['abilita_serial'].'" />
|
||||
<input type="hidden" id="idarticolo_'.$i.'" name="idarticolo['.$r['id'].']" value="'.$r['idarticolo'].'" />
|
||||
<input type="hidden" id="descrizione_'.$i.'" name="descrizione['.$r['id'].']" value="'.$r['descrizione'].'" />';
|
||||
|
||||
// Checkbox - da evadere?
|
||||
echo '
|
||||
<input type="checkbox" checked="checked" id="checked_'.$i.'" name="evadere['.$r['id'].']" value="on" onclick="ricalcola_subtotale_riga('.$i.');" />';
|
||||
|
||||
echo nl2br($r['descrizione']);
|
||||
|
||||
echo '
|
||||
</td>';
|
||||
|
||||
if ($r['is_descrizione']) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Q.tà rimanente
|
||||
echo '
|
||||
<td>
|
||||
<input type="hidden" id="qtamax_'.$i.'" value="'.($r['qta']).'" />
|
||||
<input type="hidden" id="um_'.$i.'" name="um['.$r['id'].']" value="'.$r['um'].'" />
|
||||
<p class="text-center">'.Translator::numberToLocale($r['qta'], 'qta').'</p>
|
||||
</td>';
|
||||
|
||||
// Q.tà da evadere
|
||||
echo '
|
||||
<td>
|
||||
{[ "type": "number", "name": "qta_da_evadere['.$r['id'].']", "id": "qta_'.$i.'", "required": 1, "value": "'.$r['qta'].'", "extra" : "onkeyup=\"ricalcola_subtotale_riga('.$i.');\"", "decimals": "qta", "min-value": "0" ]}
|
||||
</td>';
|
||||
|
||||
// Subtotale
|
||||
$subtotale = $r['subtotale'] / $r['qta'] * ($r['qta']);
|
||||
$sconto = $r['sconto'] / $r['qta'] * ($r['qta']);
|
||||
$iva = $r['iva'] / $r['qta'] * ($r['qta']);
|
||||
|
||||
echo '
|
||||
<td>
|
||||
<input type="hidden" id="subtot_'.$i.'" name="subtot['.$r['id'].']" value="'.($r['subtotale'] / $r['qta']).'" />
|
||||
<input type="hidden" id="sconto_'.$i.'" name="sconto['.$r['id'].']" value="'.($r['sconto'] / $r['qta']).'" />
|
||||
<input type="hidden" id="idiva_'.$i.'" name="idiva['.$r['id'].']" value="'.$r['idiva'].'" />
|
||||
<input type="hidden" id="iva_'.$i.'" name="iva['.$r['id'].']" value="'.($r['iva'] / $r['qta']).'" />
|
||||
|
||||
<big id="subtotale_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto + $iva).' €</big><br/>
|
||||
|
||||
<small style="color:#777;" id="subtotaledettagli_'.$i.'">'.Translator::numberToLocale($subtotale - $sconto).' + '.Translator::numberToLocale($iva).'</small>
|
||||
</td>';
|
||||
|
||||
// Seriali
|
||||
echo '
|
||||
<td>';
|
||||
if (!empty($r['abilita_serial'])) {
|
||||
$values = $dbo->fetchArray('SELECT DISTINCT serial FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$row.' = \''.$r['id'].'\' AND serial IS NOT NULL AND serial NOT IN (SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND dir=\''.$dir.'\' AND '.$data[$pos]['condition'].')');
|
||||
|
||||
echo '
|
||||
{[ "type": "select", "name": "serial['.$i.']['.$r['id'].']", "id": "serial_'.$i.'", "multiple": 1, "values": "query=SELECT DISTINCT serial AS id, serial AS descrizione FROM mg_prodotti WHERE dir=\''.$dir.'\' AND '.$row.' = \''.$r['id'].'\' AND serial IS NOT NULL AND serial NOT IN (SELECT serial FROM mg_prodotti WHERE serial IS NOT NULL AND dir=\''.$dir.'\' AND '.$data[$pos]['condition'].')", "value": "'.implode(',', array_column($values, 'serial')).'", "extra": "data-maximum=\"'.intval($r['qta_rimanente']).'\"" ]}
|
||||
';
|
||||
} else {
|
||||
echo '-';
|
||||
}
|
||||
echo '
|
||||
</td>
|
||||
</tr>';
|
||||
|
||||
$totale += $subtotale - $sconto + $iva;
|
||||
}
|
||||
|
||||
// Totale
|
||||
echo '
|
||||
<tr>
|
||||
<td colspan="4" align="right" class="text-right">
|
||||
<b>'.tr('Totale').':</b>
|
||||
</td>
|
||||
<td class="text-right" colspan="2">
|
||||
<big id="totale">'.Translator::numberToLocale($totale).' €</big>
|
||||
</td>
|
||||
</tr>
|
||||
</table>';
|
||||
|
||||
echo '
|
||||
|
||||
<!-- PULSANTI -->
|
||||
<div class="row">
|
||||
<div class="col-md-12 text-right">
|
||||
<button type="submit" id="submit_btn" class="btn btn-primary pull-right">
|
||||
<i class="fa fa-plus"></i> '.$button.'
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>';
|
||||
if (get('documento') == 'fattura') {
|
||||
$final_module = $module['name'] == 'Ordini cliente' ? 'Fatture di vendita' : 'Fatture di acquisto';
|
||||
} else {
|
||||
echo '
|
||||
<p>'.tr('Non ci sono articoli da evadere').'...</p>';
|
||||
$final_module = $module['name'] == 'Ordini cliente' ? 'Ddt di vendita' : 'Ddt di acquisto';
|
||||
}
|
||||
|
||||
echo '
|
||||
<script src="'.$rootdir.'/lib/init.js"></script>';
|
||||
$dir = $module['name'] == 'Ordini cliente' ? 'entrata' : 'uscita';
|
||||
|
||||
?>
|
||||
$options = [
|
||||
'op' => 'add_ordine',
|
||||
'id_importazione' => 'id_ordine',
|
||||
'final_module' => $final_module,
|
||||
'original_module' => $module['name'],
|
||||
'sql' => [
|
||||
'table' => 'or_ordini',
|
||||
'rows' => 'or_righe_ordini',
|
||||
'id_rows' => 'idordine',
|
||||
],
|
||||
'serials' => [
|
||||
'id_riga' => 'id_riga_ordine',
|
||||
'condition' => '(id_riga_ddt IS NOT NULL OR id_riga_documento IS NOT NULL)',
|
||||
],
|
||||
'button' => tr('Aggiungi'),
|
||||
'dir' => $dir,
|
||||
'create_document' => true,
|
||||
];
|
||||
|
||||
<script type="text/javascript">
|
||||
function ricalcola_subtotale_riga( r ){
|
||||
subtot = $("#subtot_"+r).val();
|
||||
sconto = $("#sconto_"+r).val();
|
||||
iva = $("#iva_"+r).val();
|
||||
$result = [
|
||||
'id_record' => $id_record,
|
||||
'id_documento' => get('iddocumento'),
|
||||
];
|
||||
|
||||
qtamax = $("#qtamax_"+r).val() ? $("#qtamax_"+r).val() : 0;
|
||||
|
||||
subtot = parseFloat(subtot);
|
||||
sconto = parseFloat(sconto);
|
||||
iva = parseFloat(iva);
|
||||
qtamax = parseFloat(qtamax);
|
||||
|
||||
subtot = subtot - sconto;
|
||||
|
||||
qta = $("#qta_"+r).val().toEnglish();
|
||||
|
||||
// Se inserisco una quantità da evadere maggiore di quella rimanente, la imposto al massimo possibile
|
||||
if(qta > qtamax){
|
||||
qta = qtamax;
|
||||
|
||||
$('#qta_'+r).val(qta);
|
||||
}
|
||||
|
||||
// Se tolgo la spunta della casella dell'evasione devo azzerare i conteggi
|
||||
if(isNaN(qta) || !$('#checked_'+r).is(':checked')){
|
||||
qta = 0;
|
||||
}
|
||||
|
||||
$("#serial_"+r).selectClear();
|
||||
$("#serial_"+r).select2("destroy");
|
||||
$("#serial_"+r).data('maximum', qta);
|
||||
start_superselect();
|
||||
|
||||
subtotale = (subtot * qta + iva * qta).toLocale();
|
||||
|
||||
$("#subtotale_"+r).html(subtotale+" €");
|
||||
$("#subtotaledettagli_"+r).html((subtot * qta).toLocale() + " + " + (iva * qta).toLocale());
|
||||
|
||||
ricalcola_totale();
|
||||
}
|
||||
|
||||
function ricalcola_totale(){
|
||||
tot_qta = 0;
|
||||
r = 0;
|
||||
totale = 0.00;
|
||||
$('input[id*=qta_]').each( function(){
|
||||
qta = $(this).val().toEnglish();
|
||||
|
||||
if( !$('#checked_'+r).is(':checked') || isNaN(qta) ){
|
||||
qta = 0;
|
||||
}
|
||||
|
||||
subtot = $("#subtot_"+r).val();
|
||||
sconto = $("#sconto_"+r).val();
|
||||
iva = $("#iva_"+r).val();
|
||||
|
||||
subtot = parseFloat(subtot);
|
||||
sconto = parseFloat(sconto);
|
||||
iva = parseFloat(iva);
|
||||
|
||||
subtot = subtot-sconto;
|
||||
|
||||
totale += subtot*qta+iva*qta;
|
||||
|
||||
r++;
|
||||
|
||||
tot_qta +=qta;
|
||||
});
|
||||
|
||||
$('#totale').html( (totale.toLocale()) + " €" );
|
||||
|
||||
if( tot_qta>0 )
|
||||
$('#submit_btn').show();
|
||||
else
|
||||
$('#submit_btn').hide();
|
||||
}
|
||||
</script>
|
||||
echo App::load('importa.php', $result, $options, true);
|
||||
|
@ -11,6 +11,7 @@ class Articolo extends Article
|
||||
use RelationTrait;
|
||||
|
||||
protected $table = 'or_righe_ordini';
|
||||
protected $serialRowID = 'ordine';
|
||||
|
||||
/**
|
||||
* Crea un nuovo articolo collegato ad una ordine.
|
||||
|
@ -20,4 +20,18 @@ trait RelationTrait
|
||||
{
|
||||
return $this->parent();
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Rivalsa INPS.
|
||||
*/
|
||||
protected function fixRivalsaINPS()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Ritenuta d'Acconto, basandosi sul valore del campo calcolo_ritenuta_acconto.
|
||||
*/
|
||||
protected function fixRitenutaAcconto()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -3,8 +3,6 @@
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Fatture\Fattura;
|
||||
use Modules\Fatture\Tipo as TipoFattura;
|
||||
use Modules\Interventi\TipoSessione;
|
||||
use Modules\Preventivi\Components\Articolo;
|
||||
use Modules\Preventivi\Components\Riga;
|
||||
@ -368,36 +366,6 @@ switch (post('op')) {
|
||||
|
||||
flash()->info(tr('Aggiunta nuova revisione!'));
|
||||
break;
|
||||
|
||||
// Creazione fattura da preventivo
|
||||
case 'fattura_da_preventivo':
|
||||
$preventivo = Preventivo::find($id_record);
|
||||
|
||||
$tipo = TipoFattura::where('descrizione', 'Fattura immediata di vendita')->first();
|
||||
$id_segment = $dbo->fetchOne('SELECT * FROM zz_segments WHERE id_module='.prepare($id_module)." AND predefined='1'")['id'];
|
||||
$data = date('Y-m-d');
|
||||
|
||||
$fattura = Fattura::build($preventivo->anagrafica, $tipo, $data, $id_segment);
|
||||
$fattura->idpagamento = $preventivo->idpagamento;
|
||||
|
||||
$id_conto = setting('Conto predefinito fatture di vendita');
|
||||
|
||||
$righe = $preventivo->getRighe();
|
||||
foreach ($righe as $riga) {
|
||||
$copia = $riga->copiaIn($fattura);
|
||||
$copia->idconto = $id_conto;
|
||||
|
||||
if ($riga->isArticolo()) {
|
||||
$copia->movimenta($copia->qta);
|
||||
}
|
||||
}
|
||||
|
||||
flash()->info(tr('Creata una nuova fattura!'));
|
||||
|
||||
$id_record = $fattura->id;
|
||||
$id_module = Modules::get('Fatture di vendita')['id'];
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (post('op') !== null && post('op') != 'update') {
|
||||
|
@ -11,24 +11,12 @@ switch ($resource) {
|
||||
$filter[] = 'id='.prepare($element);
|
||||
}
|
||||
|
||||
$where[] = 'an_anagrafiche.idanagrafica='.prepare($superselect['idanagrafica']);
|
||||
$where[] = 'co_preventivi.default_revision=1';
|
||||
if (empty($elements)) {
|
||||
$where[] = 'an_anagrafiche.idanagrafica='.prepare($superselect['idanagrafica']);
|
||||
$where[] = 'co_preventivi.default_revision=1';
|
||||
|
||||
$stati = !empty($superselect['stati']) ? $superselect['stati'] : [
|
||||
'In attesa di conferma',
|
||||
'Accettato',
|
||||
'In lavorazione',
|
||||
'Concluso',
|
||||
'In attesa di pagamento',
|
||||
];
|
||||
$desc = [];
|
||||
foreach ($stati as $value) {
|
||||
$desc[] = prepare($value);
|
||||
}
|
||||
$where[] = 'idstato IN (SELECT `id` FROM co_statipreventivi WHERE descrizione IN ('.implode(',', $desc).'))';
|
||||
|
||||
if (!empty($superselect['non_fatturato'])) {
|
||||
$where[] = 'id NOT IN (SELECT idpreventivo FROM co_righe_documenti WHERE idpreventivo IS NOT NULL)';
|
||||
$stato = !empty($superselect['stato']) ? $superselect['stato'] : 'fatturabile';
|
||||
$where[] = 'idstato IN (SELECT `id` FROM co_staticontratti WHERE '.$stato.' = 1)';
|
||||
}
|
||||
|
||||
if (!empty($search)) {
|
||||
|
@ -5,33 +5,31 @@ include_once __DIR__.'/../../core.php';
|
||||
echo'
|
||||
<button type="button" class="btn btn-primary" onclick="if( confirm(\'Duplicare questo preventivo?\') ){ $(\'#copia-preventivo\').submit(); }"> <i class="fa fa-copy"></i> '.tr('Duplica preventivo').'</button>';
|
||||
|
||||
if (!in_array($record['stato'], ['Bozza', 'Rifiutato', 'In attesa di conferma'])) {
|
||||
$disabled = '';
|
||||
} else {
|
||||
$disabled = $record['fatturabile'] || $record['annullato'];
|
||||
if (!$disabled) {
|
||||
echo '
|
||||
<button type="button" class="btn btn-warning" onclick="if(confirm(\'Vuoi creare un nuova revisione?\')){$(\'#crea-revisione\').submit();}"><i class="fa fa-edit"></i> '.tr('Crea nuova revisione...').'</button>';
|
||||
$disabled = 'disabled';
|
||||
}
|
||||
|
||||
// Creazione altri documenti
|
||||
echo '
|
||||
<div style="margin-left:4px;" class="dropdown pull-right" >
|
||||
<button class="btn btn-info dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" '.$disabled.' >
|
||||
<i class="fa fa-magic"></i> '.tr('Crea').'...
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu dropdown-menu-right">
|
||||
|
||||
<div style="margin-left:4px;" class="dropdown pull-right">
|
||||
<button class="btn btn-info dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" '.($disabled ? '' : 'disabled').' >
|
||||
<i class="fa fa-magic"></i> '.tr('Crea').'...
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu dropdown-menu-right">
|
||||
<li>
|
||||
<a data-href="'.$rootdir.'/modules/ordini/crea_documento.php?id_module='.$id_module.'&id_record='.$id_record.'&documento=ordine" data-toggle="modal" data-title="'.tr('Crea ordine').'"><i class="fa fa-file-o"></i> '.tr('Ordine').'
|
||||
</a>
|
||||
<a class="'.($disabled ? '' : 'disabled').'" data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=ordine" data-toggle="modal" data-title="'.tr('Crea ordine').'">
|
||||
<i class="fa fa-file"></i> '.tr('Ordine').'
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a onclick="crea_fattura()"><i class="fa fa-file"></i> '.tr('Fattura').'
|
||||
<a class="'.($disabled ? '' : 'disabled').'" data-href="'.$structure->fileurl('crea_documento.php').'?id_module='.$id_module.'&id_record='.$id_record.'&documento=fattura" data-toggle="modal" data-title="'.tr('Crea fattura').'">
|
||||
<i class="fa fa-file"></i> '.tr('Fattura').'
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>';
|
||||
|
||||
@ -49,24 +47,3 @@ echo '
|
||||
<input type="hidden" name="op" value="add_revision">
|
||||
<input type="hidden" name="id_record" value="'.$id_record.'">
|
||||
</form>';
|
||||
|
||||
// Crea fattura
|
||||
echo '
|
||||
<form action="" method="post" id="fattura-da-preventivo">
|
||||
<input type="hidden" name="backto" value="record-edit">
|
||||
<input type="hidden" name="op" value="fattura_da_preventivo">
|
||||
<input type="hidden" name="id_record" value="'.$id_record.'">
|
||||
</form>
|
||||
|
||||
<script>
|
||||
function crea_fattura(){
|
||||
swal({
|
||||
title: "'.tr('Creare una fattura per questo preventivo?').'",
|
||||
type: "warning",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "'.tr('Sì').'"
|
||||
}).then(function (result) {
|
||||
$("#fattura-da-preventivo").submit();
|
||||
})
|
||||
}
|
||||
</script>';
|
||||
|
27
modules/preventivi/crea_documento.php
Normal file
27
modules/preventivi/crea_documento.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$module = Modules::get($id_module);
|
||||
|
||||
$options = [
|
||||
'op' => 'add_preventivo',
|
||||
'id_importazione' => 'id_preventivo',
|
||||
'final_module' => get('documento') == 'fattura' ? 'Fatture di vendita' : 'Ordini cliente',
|
||||
'original_module' => $module['name'],
|
||||
'sql' => [
|
||||
'table' => 'co_preventivi',
|
||||
'rows' => 'co_righe_preventivi',
|
||||
'id_rows' => 'idpreventivo',
|
||||
],
|
||||
'button' => tr('Aggiungi'),
|
||||
'dir' => 'entrata',
|
||||
'create_document' => true,
|
||||
];
|
||||
|
||||
$result = [
|
||||
'id_record' => $id_record,
|
||||
'id_documento' => get('iddocumento'),
|
||||
];
|
||||
|
||||
echo App::load('importa.php', $result, $options, true);
|
@ -5,5 +5,11 @@ include_once __DIR__.'/../../core.php';
|
||||
if (isset($id_record)) {
|
||||
$preventivo = Modules\Preventivi\Preventivo::with('stato')->find($id_record);
|
||||
|
||||
$record = $dbo->fetchOne('SELECT *, (SELECT tipo FROM an_anagrafiche WHERE idanagrafica = co_preventivi.idanagrafica) AS tipo_anagrafica, (SELECT descrizione FROM co_statipreventivi WHERE id=idstato) AS stato FROM co_preventivi WHERE id='.prepare($id_record));
|
||||
$record = $dbo->fetchOne('SELECT *,
|
||||
(SELECT tipo FROM an_anagrafiche WHERE idanagrafica = co_preventivi.idanagrafica) AS tipo_anagrafica,
|
||||
(SELECT fatturabile FROM co_statipreventivi WHERE id=idstato) AS fatturabile,
|
||||
(SELECT annullato FROM co_statipreventivi WHERE id=idstato) AS annullato,
|
||||
(SELECT descrizione FROM co_statipreventivi WHERE id=idstato) AS stato
|
||||
FROM co_preventivi
|
||||
WHERE id='.prepare($id_record));
|
||||
}
|
||||
|
@ -40,10 +40,11 @@ foreach ($rs as $r) {
|
||||
|
||||
// q.tà
|
||||
echo '
|
||||
<td class="text-right">';
|
||||
<td class="text-center">';
|
||||
if (empty($r['is_descrizione'])) {
|
||||
echo '
|
||||
'.Translator::numberToLocale($r['qta'], 'qta');
|
||||
<big>'.Translator::numberToLocale($r['qta'] - $r['qta_evasa'], 'qta').'</big>
|
||||
<br><small>('.tr('Q.tà iniziale').': '.Translator::numberToLocale($r['qta'], 'qta').')</small>';
|
||||
}
|
||||
echo '
|
||||
</td>';
|
||||
|
@ -20,4 +20,18 @@ trait RelationTrait
|
||||
{
|
||||
return $this->parent();
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Rivalsa INPS.
|
||||
*/
|
||||
protected function fixRivalsaINPS()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Effettua i conti per la Ritenuta d'Acconto, basandosi sul valore del campo calcolo_ritenuta_acconto.
|
||||
*/
|
||||
protected function fixRitenutaAcconto()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ namespace Modules\Preventivi;
|
||||
use Carbon\Carbon;
|
||||
use Common\Document;
|
||||
use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Interventi\Intervento;
|
||||
use Modules\Interventi\TipoSessione;
|
||||
use Traits\RecordTrait;
|
||||
use Util\Generator;
|
||||
@ -132,6 +133,11 @@ class Preventivo extends Document
|
||||
return $this->hasOne(Components\Sconto::class, 'idpreventivo');
|
||||
}
|
||||
|
||||
public function interventi()
|
||||
{
|
||||
return $this->hasMany(Intervento::class, 'id_preventivo');
|
||||
}
|
||||
|
||||
// Metodi statici
|
||||
|
||||
/**
|
||||
|
11
src/App.php
11
src/App.php
@ -201,15 +201,16 @@ class App
|
||||
/**
|
||||
* Restituisce il codice HTML per il form contenente il file indicato.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $file
|
||||
* @param array $result
|
||||
* @param array $options
|
||||
* @param bool $disableForm
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function load($file, $result, $options)
|
||||
public static function load($file, $result, $options, $disableForm = false)
|
||||
{
|
||||
$form = self::internalLoad('form.php', $result, $options);
|
||||
$form = $disableForm ? '|response|' : self::internalLoad('form.php', $result, $options);
|
||||
|
||||
$response = self::internalLoad($file, $result, $options);
|
||||
|
||||
@ -221,7 +222,7 @@ class App
|
||||
/**
|
||||
* Restituisce il codice HTML generato del file indicato.
|
||||
*
|
||||
* @param string $path
|
||||
* @param string $file
|
||||
* @param array $result
|
||||
* @param array $options
|
||||
* @param string $directory
|
||||
@ -232,6 +233,8 @@ class App
|
||||
{
|
||||
$module = Modules::getCurrent();
|
||||
|
||||
$database = $dbo = database();
|
||||
|
||||
$id_module = $module['id'];
|
||||
$id_record = filter('id_record');
|
||||
|
||||
|
@ -1 +1,19 @@
|
||||
UPDATE `in_interventi` SET `id_contratto` = (SELECT `idcontratto` FROM `co_promemoria` WHERE `idintervento` = `in_interventi`.`id`);
|
||||
|
||||
ALTER TABLE `co_righe_contratti` ADD `qta_evasa` DECIMAL(12, 4) NOT NULL;
|
||||
ALTER TABLE `co_righe_preventivi` ADD `qta_evasa` DECIMAL(12, 4) NOT NULL;
|
||||
|
||||
-- Inserisco due nuovi stati preventivi
|
||||
UPDATE `co_statipreventivi` SET `descrizione` = 'Fatturato', `completato` = 1, `annullato` = 0, `icona` = 'fa fa-file-text-o text-success' WHERE `descrizione` = 'In attesa di pagamento';
|
||||
INSERT INTO `co_statipreventivi` (`id`, `descrizione`, `completato`, `annullato`, `icona`) VALUES
|
||||
(NULL, 'Parzialmente fatturato', 0, 0, 'fa fa-file-text-o text-warning');
|
||||
|
||||
ALTER TABLE `co_statipreventivi` ADD `fatturabile` BOOLEAN NOT NULL DEFAULT FALSE;
|
||||
UPDATE `co_statipreventivi` SET `fatturabile` = 1 WHERE `descrizione` IN('Parzialmente fatturato', 'Concluso', 'Pagato', 'In lavorazione', 'Accettato', 'In attesa di conferma');
|
||||
|
||||
-- Inserisco due nuovi stati contratti
|
||||
UPDATE `co_statipreventivi` SET `descrizione` = 'Fatturato', `pianificabile` = 0, `annullato` = 0, `icona` = 'fa fa-file-text-o text-success' WHERE `descrizione` = 'In attesa di pagamento';
|
||||
INSERT INTO `co_staticontratti` (`id`, `descrizione`, `pianificabile`, `fatturabile`, `icona`) VALUES
|
||||
(NULL, 'Parzialmente fatturato', 0, 1, 'fa fa-file-text-o text-warning');
|
||||
|
||||
UPDATE `zz_widgets` SET `query` = REPLACE(`query`, 'In attesa di pagamento', 'Fatturato');
|
||||
|
Loading…
x
Reference in New Issue
Block a user