Aggiornamento passaggi tra documenti

This commit is contained in:
Thomas Zilio 2019-02-14 17:49:58 +01:00
parent f419db5872
commit df1102d4b5
47 changed files with 1297 additions and 1736 deletions

View File

@ -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
View 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.').'</th>
<th width="15%">'.tr('Q. 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 '&nbsp;'.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).' &euro;</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).' &euro;</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 + " &euro;");
$("#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()) + " &euro;");
<?php
if (empty($options['sql']['allow-empty'])) {
echo '
if (tot_qta > 0)
$("#submit_btn").show();
else
$("#submit_btn").hide();';
}
?>
}
</script>

View File

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

View File

@ -127,6 +127,7 @@ abstract class Description extends Model
*/
protected function customInitCopiaIn($original)
{
$this->is_descrizione = $original->is_descrizione;
}
/**

View File

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

View File

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

View File

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

View File

@ -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').'>

View 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);

View File

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

View File

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

View File

@ -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. iniziale').': '.Translator::numberToLocale($r['qta'], 'qta').')</small>';
}
echo '
</td>';

View File

@ -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()
{
}
}

View File

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

View File

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

View File

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

View File

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

View 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);

View File

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

View File

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

View File

@ -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()
{
}
}

View File

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

View File

@ -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": "&euro;" ]}
</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>';

View File

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

View File

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

View File

@ -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": "&euro;", "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>';

View File

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

View File

@ -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.').'</th>
<th width="15%">'.tr('Q. 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 '&nbsp;'.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).' &euro;</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).' &euro;</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 + " &euro;");
$("#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()) + " &euro;");
<?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);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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>&nbsp;'.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>&nbsp;'.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>&nbsp;'.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>&nbsp;'.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>&nbsp;'.tr('fattura').'
</a>
</li>';
echo '
</ul>
</div>';

View File

@ -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.').'</th>
<th width="15%">'.tr('Q. 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).' &euro;</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).' &euro;</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+" &euro;");
$("#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()) + " &euro;" );
if( tot_qta>0 )
$('#submit_btn').show();
else
$('#submit_btn').hide();
}
</script>
echo App::load('importa.php', $result, $options, true);

View File

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

View File

@ -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()
{
}
}

View File

@ -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') {

View File

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

View File

@ -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>&nbsp;'.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>&nbsp;'.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>&nbsp;'.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>&nbsp;'.tr('Ordine').'
</a>
</li>
<li>
<a onclick="crea_fattura()"><i class="fa fa-file"></i>&nbsp;'.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>&nbsp;'.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>';

View 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);

View File

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

View File

@ -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. iniziale').': '.Translator::numberToLocale($r['qta'], 'qta').')</small>';
}
echo '
</td>';

View File

@ -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()
{
}
}

View File

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

View File

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

View File

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