mirror of
https://github.com/devcode-it/openstamanager.git
synced 2025-02-17 03:51:06 +01:00
Merge branch 'master' of https://github.com/devcode-it/openstamanager
This commit is contained in:
commit
0ef48623b0
@ -32,6 +32,7 @@ switch ($resource) {
|
||||
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
|
||||
$usare_dettaglio_fornitore = $superselect['dir'] == 'uscita';
|
||||
$usare_iva_anagrafica = $superselect['dir'] == 'entrata' && !empty($superselect['idanagrafica']);
|
||||
$solo_non_varianti = $superselect['solo_non_varianti'];
|
||||
|
||||
$query = "SELECT
|
||||
IF(`categoria`.`nome` IS NOT NULL, CONCAT(`categoria`.`nome`, IF(`sottocategoria`.`nome` IS NOT NULL, CONCAT(' (', `sottocategoria`.`nome`, ')'), '-')), '<i>".tr('Nessuna categoria')."</i>') AS optgroup,
|
||||
@ -139,6 +140,10 @@ switch ($resource) {
|
||||
$where[] = 'mg_articoli.attivo = 1';
|
||||
$where[] = 'mg_articoli.deleted_at IS NULL';
|
||||
|
||||
if ($solo_non_varianti) {
|
||||
$where[] = 'mg_articoli.id_combinazione IS NULL';
|
||||
}
|
||||
|
||||
if (!empty($search)) {
|
||||
$search_fields[] = 'mg_articoli.descrizione LIKE '.prepare('%'.$search.'%');
|
||||
$search_fields[] = 'mg_articoli.codice LIKE '.prepare('%'.$search.'%');
|
||||
|
@ -44,7 +44,7 @@ switch (filter('op')) {
|
||||
break;
|
||||
|
||||
case 'gestione-variante':
|
||||
$combinazione->generaVariante((array) filter('attributo'));
|
||||
$combinazione->generaVariante((array) filter('attributo'), filter('id_articolo'));
|
||||
|
||||
flash()->info(tr('Variante aggiunta correttamente!'));
|
||||
|
||||
|
@ -34,6 +34,12 @@ foreach ($attributi as $key => $attributo) {
|
||||
</div>';
|
||||
}
|
||||
|
||||
// Scelta articolo esistente
|
||||
echo '
|
||||
<div class="col-md-4">
|
||||
{[ "type": "select", "label": "'.tr('Collega articolo esistente').' ('.tr('facoltativo').')", "name": "id_articolo", "ajax-source": "articoli", "select-options": {"solo_non_varianti": 1, "permetti_movimento_a_zero": 1} ]}
|
||||
</div>';
|
||||
|
||||
echo '
|
||||
</div>
|
||||
|
||||
|
@ -76,7 +76,7 @@ class Combinazione extends Model
|
||||
*
|
||||
* @param $valori_attributi
|
||||
*/
|
||||
public function generaVariante($valori_attributi)
|
||||
public function generaVariante($valori_attributi, $id_articolo = null)
|
||||
{
|
||||
$database = database();
|
||||
|
||||
@ -84,20 +84,42 @@ class Combinazione extends Model
|
||||
$variante = ValoreAttributo::findMany($valori_attributi)->pluck('nome')->all();
|
||||
|
||||
// Generazione Articolo di base
|
||||
$articoli = $this->articoli;
|
||||
if ($articoli->isEmpty()) {
|
||||
$articolo = Articolo::build($this->nome, $this->nome);
|
||||
$articolo->id_combinazione = $this->id;
|
||||
if (empty($id_articolo)) {
|
||||
$articoli = $this->articoli;
|
||||
if ($articoli->isEmpty()) {
|
||||
$articolo = Articolo::build($this->nome, $this->nome);
|
||||
$articolo->id_combinazione = $this->id;
|
||||
|
||||
$articolo->id_categoria = $this->id_categoria;
|
||||
$articolo->id_sottocategoria = $this->id_sottocategoria;
|
||||
} else {
|
||||
$articolo_base = $articoli->first();
|
||||
$articolo = $articolo_base->replicate();
|
||||
$articolo->id_categoria = $this->id_categoria;
|
||||
$articolo->id_sottocategoria = $this->id_sottocategoria;
|
||||
} else {
|
||||
$articolo_base = $articoli->first();
|
||||
$articolo = $articolo_base->replicate();
|
||||
|
||||
$nome_immagine = $articolo_base->immagine_upload->name;
|
||||
$allegato = $articolo_base->uploads()->where('name', $nome_immagine)->first();
|
||||
|
||||
if (!empty($allegato)) {
|
||||
$allegato->copia([
|
||||
'id_module' => $articolo->getModule()->id,
|
||||
'id_record' => $articolo->id,
|
||||
]);
|
||||
|
||||
$articolo->immagine = $articolo->uploads()->where('name', $nome_immagine)->first()->filename;
|
||||
$articolo->save();
|
||||
}
|
||||
}
|
||||
$articolo->descrizione = $this->nome.' ['.implode(', ', $variante).']';
|
||||
$articolo->codice = $this->codice.'-'.implode('|', $variante);
|
||||
$articolo->save();
|
||||
}
|
||||
|
||||
// Uso di un articolo già esistente
|
||||
else {
|
||||
$articolo = Articolo::find($id_articolo);
|
||||
$articolo->id_combinazione = $this->id;
|
||||
$articolo->save();
|
||||
}
|
||||
$articolo->descrizione = $this->nome.' ['.implode(', ', $variante).']';
|
||||
$articolo->codice = $this->codice.'-'.implode('|', $variante);
|
||||
$articolo->save();
|
||||
|
||||
// Associazione valori della variante
|
||||
foreach ($valori_attributi as $id => $id_valore) {
|
||||
@ -106,22 +128,6 @@ class Combinazione extends Model
|
||||
'id_valore' => $id_valore,
|
||||
]);
|
||||
}
|
||||
|
||||
// Salvataggio immagine relativa
|
||||
if (!$articoli->isEmpty()) {
|
||||
$nome_immagine = $articolo_base->immagine_upload->name;
|
||||
$allegato = $articolo_base->uploads()->where('name', $nome_immagine)->first();
|
||||
|
||||
if (!empty($allegato)) {
|
||||
$allegato->copia([
|
||||
'id_module' => $articolo->getModule()->id,
|
||||
'id_record' => $articolo->id,
|
||||
]);
|
||||
|
||||
$articolo->immagine = $articolo->uploads()->where('name', $nome_immagine)->first()->filename;
|
||||
$articolo->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -372,6 +372,7 @@ if (!empty($righe)) {
|
||||
$qta = $riga['Quantita'];
|
||||
$um = $riga['UnitaMisura'];
|
||||
$prezzo_unitario = $riga['PrezzoUnitario'] ?: $riga['Importo'];
|
||||
$is_descrizione = empty((float)$riga['Quantita']) && empty((float)$prezzo_unitario);
|
||||
|
||||
echo '
|
||||
<tr data-id="'.$key.'" data-qta="'.$qta.'" data-prezzo_unitario="'.$prezzo_unitario.'" data-iva_percentuale="'.$riga['AliquotaIVA'].'">
|
||||
@ -404,8 +405,11 @@ if (!empty($righe)) {
|
||||
]).'
|
||||
<span id="riferimento_'.$key.'_iva"></span>
|
||||
</td>
|
||||
</tr>
|
||||
</tr>';
|
||||
|
||||
|
||||
if (!$is_descrizione) {
|
||||
echo '
|
||||
<tr id="dati_'.$key.'">
|
||||
<td colspan="4" class="row">
|
||||
<span class="hide" id="aliquota['.$key.']">'.$riga['AliquotaIVA'].'</span>
|
||||
@ -462,6 +466,24 @@ if (!empty($righe)) {
|
||||
</div>
|
||||
</td>
|
||||
</tr>';
|
||||
} else {
|
||||
echo '
|
||||
<input type="hidden" name="qta_riferimento['.$key.']" id="qta_riferimento_'.$key.'" value="'.$riga['Quantita'].'">
|
||||
|
||||
<input type="hidden" name="tipo_riferimento['.$key.']" id="tipo_riferimento_'.$key.'" value="">
|
||||
<input type="hidden" name="id_riferimento['.$key.']" id="id_riferimento_'.$key.'" value="">
|
||||
<input type="hidden" name="id_riga_riferimento['.$key.']" id="id_riga_riferimento_'.$key.'" value="">
|
||||
<input type="hidden" name="tipo_riga_riferimento['.$key.']" id="tipo_riga_riferimento_'.$key.'" value="">
|
||||
|
||||
<input type="hidden" name="tipo_riferimento_vendita['.$key.']" id="tipo_riferimento_vendita_'.$key.'" value="">
|
||||
<input type="hidden" name="id_riferimento_vendita['.$key.']" id="id_riferimento_vendita_'.$key.'" value="">
|
||||
<input type="hidden" name="id_riga_riferimento_vendita['.$key.']" id="id_riga_riferimento_vendita_'.$key.'" value="">
|
||||
<input type="hidden" name="tipo_riga_riferimento_vendita['.$key.']" id="tipo_riga_riferimento_vendita_'.$key.'" value="">
|
||||
|
||||
<input type="hidden" name="conto['.$key.']" value="">
|
||||
<input type="hidden" name="iva['.$key.']" value="">
|
||||
<input type="hidden" name="update_info['.$key.']" value="">';
|
||||
}
|
||||
}
|
||||
|
||||
echo '
|
||||
|
@ -24,6 +24,7 @@ use Modules\Anagrafiche\Anagrafica;
|
||||
use Modules\Articoli\Articolo as ArticoloOriginale;
|
||||
use Modules\Articoli\Categoria;
|
||||
use Modules\Fatture\Components\Articolo;
|
||||
use Modules\Fatture\Components\Descrizione;
|
||||
use Modules\Fatture\Components\Riga;
|
||||
use Modules\Fatture\Fattura;
|
||||
use Plugins\ListinoClienti\DettaglioPrezzo;
|
||||
@ -123,6 +124,7 @@ class FatturaOrdinaria extends FatturaElettronica
|
||||
$id_rivalsa = $info['id_rivalsa'];
|
||||
$calcolo_ritenuta_acconto = $info['rivalsa_in_ritenuta'] ? 'IMP+RIV' : 'IMP';
|
||||
$ritenuta_contributi = !empty($fattura->id_ritenuta_contributi);
|
||||
$conto_arrotondamenti = null;
|
||||
|
||||
foreach ($righe as $key => $riga) {
|
||||
$articolo = ArticoloOriginale::find($articoli[$key]);
|
||||
@ -130,6 +132,8 @@ class FatturaOrdinaria extends FatturaElettronica
|
||||
$riga['PrezzoUnitario'] = floatval($riga['PrezzoUnitario']);
|
||||
$riga['Quantita'] = floatval($riga['Quantita']);
|
||||
|
||||
$is_descrizione = empty($riga['Quantita']) && empty($riga['PrezzoUnitario']);
|
||||
|
||||
$codici = $riga['CodiceArticolo'] ?: [];
|
||||
$codici = !empty($codici) && !isset($codici[0]) ? [$codici] : $codici;
|
||||
|
||||
@ -161,6 +165,10 @@ class FatturaOrdinaria extends FatturaElettronica
|
||||
$obj->movimentazione($movimentazione);
|
||||
|
||||
$target_type = Articolo::class;
|
||||
} elseif($is_descrizione) {
|
||||
$obj = Descrizione::build($fattura);
|
||||
|
||||
$target_type = Descrizione::class;
|
||||
} else {
|
||||
$obj = Riga::build($fattura);
|
||||
|
||||
@ -190,113 +198,120 @@ class FatturaOrdinaria extends FatturaElettronica
|
||||
]);
|
||||
}
|
||||
|
||||
$obj->id_iva = $iva[$key];
|
||||
$obj->idconto = $conto[$key];
|
||||
if (!$is_descrizione) {
|
||||
$obj->id_iva = $iva[$key];
|
||||
$obj->idconto = $conto[$key];
|
||||
|
||||
$obj->id_rivalsa_inps = $id_rivalsa;
|
||||
$obj->ritenuta_contributi = $ritenuta_contributi;
|
||||
|
||||
if (!empty($riga['Ritenuta'])) {
|
||||
$obj->id_ritenuta_acconto = $id_ritenuta_acconto;
|
||||
$obj->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
|
||||
}
|
||||
|
||||
// Nel caso il prezzo sia negativo viene gestito attraverso l'inversione della quantità (come per le note di credito)
|
||||
// TODO: per migliorare la visualizzazione, sarebbe da lasciare negativo il prezzo e invertire gli sconti.
|
||||
$prezzo = $riga['PrezzoUnitario'];
|
||||
$qta = $riga['Quantita'] ?: 1;
|
||||
|
||||
// Prezzo e quantità
|
||||
$obj->prezzo_unitario = $prezzo;
|
||||
$obj->qta = $qta;
|
||||
|
||||
if (!empty($riga['UnitaMisura'])) {
|
||||
$obj->um = $riga['UnitaMisura'];
|
||||
}
|
||||
|
||||
// Sconti e maggiorazioni
|
||||
$sconti = $riga['ScontoMaggiorazione'];
|
||||
if (!empty($sconti)) {
|
||||
$sconto_unitario = 0;
|
||||
$sconti = $sconti[0] ? $sconti : [$sconti];
|
||||
|
||||
// Determina il tipo di sconto in caso di sconti misti UNT e PRC
|
||||
foreach ($sconti as $sconto) {
|
||||
$tipo_sconto = !empty($sconto['Importo']) ? 'UNT' : 'PRC';
|
||||
if (!empty($tipo) && $tipo_sconto != $tipo) {
|
||||
$tipo = 'UNT';
|
||||
} else {
|
||||
$tipo = $tipo_sconto;
|
||||
}
|
||||
if (empty($conto_arrotondamenti) && !empty($conto[$key]) ){
|
||||
$conto_arrotondamenti = $conto[$key];
|
||||
}
|
||||
|
||||
foreach ($sconti as $sconto) {
|
||||
$unitario = $sconto['Importo'] ?: $sconto['Percentuale'];
|
||||
$obj->id_rivalsa_inps = $id_rivalsa;
|
||||
$obj->ritenuta_contributi = $ritenuta_contributi;
|
||||
|
||||
// Sconto o Maggiorazione
|
||||
$sconto_riga = ($sconto['Tipo'] == 'SC') ? $unitario : -$unitario;
|
||||
if (!empty($riga['Ritenuta'])) {
|
||||
$obj->id_ritenuta_acconto = $id_ritenuta_acconto;
|
||||
$obj->calcolo_ritenuta_acconto = $calcolo_ritenuta_acconto;
|
||||
}
|
||||
|
||||
$tipo_sconto = !empty($sconto['Importo']) ? 'UNT' : 'PRC';
|
||||
if ($tipo_sconto == 'PRC') {
|
||||
$sconto_calcolato = calcola_sconto([
|
||||
'sconto' => $sconto_riga,
|
||||
'prezzo' => $sconto_unitario ? $obj->prezzo_unitario - ($sconto_calcolato / $obj->qta) : $obj->prezzo_unitario,
|
||||
'tipo' => 'PRC',
|
||||
'qta' => $obj->qta,
|
||||
]);
|
||||
// Nel caso il prezzo sia negativo viene gestito attraverso l'inversione della quantità (come per le note di credito)
|
||||
// TODO: per migliorare la visualizzazione, sarebbe da lasciare negativo il prezzo e invertire gli sconti.
|
||||
$prezzo = $riga['PrezzoUnitario'];
|
||||
$qta = $riga['Quantita'] ?: 1;
|
||||
|
||||
if ($tipo == 'PRC') {
|
||||
$tot_sconto = $sconto_calcolato * 100 / $obj->imponibile;
|
||||
// Prezzo e quantità
|
||||
$obj->prezzo_unitario = $prezzo;
|
||||
$obj->qta = $qta;
|
||||
|
||||
if (!empty($riga['UnitaMisura'])) {
|
||||
$obj->um = $riga['UnitaMisura'];
|
||||
}
|
||||
|
||||
// Sconti e maggiorazioni
|
||||
$sconti = $riga['ScontoMaggiorazione'];
|
||||
if (!empty($sconti)) {
|
||||
$sconto_unitario = 0;
|
||||
$sconti = $sconti[0] ? $sconti : [$sconti];
|
||||
|
||||
// Determina il tipo di sconto in caso di sconti misti UNT e PRC
|
||||
foreach ($sconti as $sconto) {
|
||||
$tipo_sconto = !empty($sconto['Importo']) ? 'UNT' : 'PRC';
|
||||
if (!empty($tipo) && $tipo_sconto != $tipo) {
|
||||
$tipo = 'UNT';
|
||||
} else {
|
||||
$tot_sconto = $sconto_calcolato;
|
||||
$tipo = $tipo_sconto;
|
||||
}
|
||||
} else {
|
||||
$tot_sconto = $sconto_riga;
|
||||
}
|
||||
|
||||
$sconto_unitario += $tot_sconto;
|
||||
foreach ($sconti as $sconto) {
|
||||
$unitario = $sconto['Importo'] ?: $sconto['Percentuale'];
|
||||
|
||||
// Sconto o Maggiorazione
|
||||
$sconto_riga = ($sconto['Tipo'] == 'SC') ? $unitario : -$unitario;
|
||||
|
||||
$tipo_sconto = !empty($sconto['Importo']) ? 'UNT' : 'PRC';
|
||||
if ($tipo_sconto == 'PRC') {
|
||||
$sconto_calcolato = calcola_sconto([
|
||||
'sconto' => $sconto_riga,
|
||||
'prezzo' => $sconto_unitario ? $obj->prezzo_unitario - ($sconto_calcolato / $obj->qta) : $obj->prezzo_unitario,
|
||||
'tipo' => 'PRC',
|
||||
'qta' => $obj->qta,
|
||||
]);
|
||||
|
||||
if ($tipo == 'PRC') {
|
||||
$tot_sconto = $sconto_calcolato * 100 / $obj->imponibile;
|
||||
} else {
|
||||
$tot_sconto = $sconto_calcolato;
|
||||
}
|
||||
} else {
|
||||
$tot_sconto = $sconto_riga;
|
||||
}
|
||||
|
||||
$sconto_unitario += $tot_sconto;
|
||||
}
|
||||
|
||||
$obj->setSconto($sconto_unitario, $tipo);
|
||||
}
|
||||
|
||||
$obj->setSconto($sconto_unitario, $tipo);
|
||||
}
|
||||
// Aggiornamento prezzo di acquisto e fornitore predefinito in base alle impostazioni
|
||||
if (!empty($articolo)) {
|
||||
if ($update_info[$key] == 'update_price' || $update_info[$key] == 'update_all') {
|
||||
$dettaglio_predefinito = DettaglioPrezzo::dettaglioPredefinito($articolo->id, $anagrafica->idanagrafica, $direzione)
|
||||
->first();
|
||||
|
||||
// Aggiornamento prezzo di acquisto e fornitore predefinito in base alle impostazioni
|
||||
if (!empty($articolo)) {
|
||||
if ($update_info[$key] == 'update_price' || $update_info[$key] == 'update_all') {
|
||||
$dettaglio_predefinito = DettaglioPrezzo::dettaglioPredefinito($articolo->id, $anagrafica->idanagrafica, $direzione)
|
||||
->first();
|
||||
// Aggiungo associazione fornitore-articolo se non presente
|
||||
if (empty($dettaglio_predefinito)) {
|
||||
$dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $direzione);
|
||||
}
|
||||
|
||||
// Aggiungo associazione fornitore-articolo se non presente
|
||||
if (empty($dettaglio_predefinito)) {
|
||||
$dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $direzione);
|
||||
}
|
||||
// Imposto lo sconto nel listino solo se è una percentuale, se è un importo lo sottraggo dal prezzo
|
||||
if ($tipo == 'PRC') {
|
||||
$dettaglio_predefinito->sconto_percentuale = $sconto_unitario;
|
||||
$prezzo_unitario = $obj->prezzo_unitario;
|
||||
$prezzo_acquisto = $obj->prezzo_unitario - ($obj->prezzo_unitario * $sconto_unitario / 100);
|
||||
} else {
|
||||
$prezzo_unitario = $obj->prezzo_unitario - $sconto_unitario;
|
||||
$prezzo_acquisto = $prezzo_unitario;
|
||||
}
|
||||
|
||||
// Imposto lo sconto nel listino solo se è una percentuale, se è un importo lo sottraggo dal prezzo
|
||||
if ($tipo == 'PRC') {
|
||||
$dettaglio_predefinito->sconto_percentuale = $sconto_unitario;
|
||||
$prezzo_unitario = $obj->prezzo_unitario;
|
||||
$prezzo_acquisto = $obj->prezzo_unitario - ($obj->prezzo_unitario * $sconto_unitario / 100);
|
||||
} else {
|
||||
$prezzo_unitario = $obj->prezzo_unitario - $sconto_unitario;
|
||||
$prezzo_acquisto = $prezzo_unitario;
|
||||
}
|
||||
// Aggiornamento listino
|
||||
$dettaglio_predefinito->setPrezzoUnitario($prezzo_unitario);
|
||||
$dettaglio_predefinito->save();
|
||||
|
||||
// Aggiornamento listino
|
||||
$dettaglio_predefinito->setPrezzoUnitario($prezzo_unitario);
|
||||
$dettaglio_predefinito->save();
|
||||
|
||||
// Aggiornamento fornitore predefinito
|
||||
if ($update_info[$key] == 'update_all') {
|
||||
// Aggiornamento prezzo di acquisto e fornitore predefinito
|
||||
$articolo->prezzo_acquisto = $prezzo_acquisto;
|
||||
$articolo->id_fornitore = $anagrafica->idanagrafica;
|
||||
$articolo->save();
|
||||
// Aggiornamento fornitore predefinito
|
||||
if ($update_info[$key] == 'update_all') {
|
||||
// Aggiornamento prezzo di acquisto e fornitore predefinito
|
||||
$articolo->prezzo_acquisto = $prezzo_acquisto;
|
||||
$articolo->id_fornitore = $anagrafica->idanagrafica;
|
||||
$articolo->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$tipo = null;
|
||||
$sconto_unitario = null;
|
||||
}
|
||||
|
||||
$tipo = null;
|
||||
$sconto_unitario = null;
|
||||
$obj->save();
|
||||
}
|
||||
|
||||
@ -317,7 +332,7 @@ class FatturaOrdinaria extends FatturaElettronica
|
||||
|
||||
$obj->descrizione = tr('Arrotondamento calcolato in automatico');
|
||||
$obj->id_iva = $iva_arrotondamento['id'];
|
||||
$obj->idconto = $conto[0];
|
||||
$obj->idconto = $conto_arrotondamenti;
|
||||
$obj->prezzo_unitario = round($diff, 4);
|
||||
$obj->qta = 1;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user