mirror of
https://github.com/devcode-it/openstamanager.git
synced 2024-12-26 07:44:02 +01:00
Correzione procedura di importazione
Aggiunto controllo sulla chiave primaria se impostata. Corretta l'importazione degli articoli con dettaglio prezzi,
This commit is contained in:
parent
91aec2d651
commit
018b716d71
@ -35,8 +35,6 @@ use Plugins\DettagliArticolo\DettaglioPrezzo;
|
||||
*/
|
||||
class CSV extends CSVImporter
|
||||
{
|
||||
protected $id_articoli_processati;
|
||||
|
||||
public function getAvailableFields()
|
||||
{
|
||||
return [
|
||||
@ -167,11 +165,51 @@ class CSV extends CSVImporter
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Procedura di inizializzazione per l'importazione.
|
||||
* Effettua una rimozione di tutti i dettagli prezzi per le coppie Articolo - Anagrafica presenti nel CSV.
|
||||
*
|
||||
* @return mixed|void
|
||||
*/
|
||||
public function init()
|
||||
{
|
||||
$database = database();
|
||||
$primary_key = $this->getPrimaryKey();
|
||||
|
||||
// Count the numbers of rows in a CSV
|
||||
$number = $this->csv->each(function ($row) {
|
||||
return true;
|
||||
});
|
||||
|
||||
$rows = $this->getRows(0, $number);
|
||||
$first_record = $this->getRecord($rows[1]);
|
||||
if (!isset($first_record['anagrafica_listino']) || empty($this->getPrimaryKey())) {
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($rows as $row) {
|
||||
// Interpretazione secondo la selezione
|
||||
$record = $this->getRecord($row);
|
||||
if (empty($record['anagrafica_listino'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$articolo = Articolo::where($primary_key, $record[$primary_key])
|
||||
->first();
|
||||
$anagrafica = Anagrafica::where('ragione_sociale', $record['anagrafica_listino'])
|
||||
->first();
|
||||
if (empty($articolo) || empty($anagrafica)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$database->query('DELETE FROM mg_prezzi_articoli WHERE id_articolo = '.prepare($articolo->id).' AND id_anagrafica = '.prepare($anagrafica->id));
|
||||
}
|
||||
}
|
||||
|
||||
public function import($record)
|
||||
{
|
||||
$database = database();
|
||||
$primary_key = $this->getPrimaryKey();
|
||||
$anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita'));
|
||||
|
||||
// Fix per campi con contenuti derivati da query implicite
|
||||
if (!empty($record['id_fornitore'])) {
|
||||
@ -179,107 +217,82 @@ class CSV extends CSVImporter
|
||||
}
|
||||
|
||||
// Gestione categoria e sottocategoria
|
||||
$obj_categoria = null;
|
||||
$categoria = null;
|
||||
$sotto_categoria = null;
|
||||
if (!empty($record['id_categoria'])) {
|
||||
// Categoria
|
||||
$obj_categoria = Categoria::where('nome', strtolower($record['id_categoria']))->first();
|
||||
$categoria = Categoria::where('nome', strtolower($record['id_categoria']))->first();
|
||||
|
||||
if (empty($obj_categoria)) {
|
||||
$obj_categoria = Categoria::build($record['id_categoria']);
|
||||
if (empty($categoria)) {
|
||||
$categoria = Categoria::build($record['id_categoria']);
|
||||
}
|
||||
|
||||
// Sotto-categoria
|
||||
$obj_sottocategoria = null;
|
||||
if (!empty($record['id_sottocategoria'])) {
|
||||
$obj_sottocategoria = Categoria::where('nome', $record['id_sottocategoria'])
|
||||
->where('parent', $obj_categoria->id)
|
||||
$sotto_categoria = Categoria::where('nome', $record['id_sottocategoria'])
|
||||
->where('parent', $categoria->id)
|
||||
->first();
|
||||
|
||||
if (empty($sottocategoria)) {
|
||||
$obj_sottocategoria = Categoria::build($record['id_categoria']);
|
||||
$obj_sottocategoria->parent()->associate($obj_categoria);
|
||||
$obj_sottocategoria->save();
|
||||
$sotto_categoria = Categoria::build($record['id_categoria']);
|
||||
$sotto_categoria->parent()->associate($categoria);
|
||||
$sotto_categoria->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
unset($record['id_categoria']);
|
||||
unset($record['id_sottocategoria']);
|
||||
|
||||
// Individuazione dell'IVA di vendita tramite il relativo Codice
|
||||
$aliquota = null;
|
||||
if (!empty($record['codice_iva_vendita'])) {
|
||||
$aliquota = Aliquota::where('codice', $record['codice_iva_vendita'])->first();
|
||||
}
|
||||
unset($record['codice_iva_vendita']);
|
||||
|
||||
// Individuazione articolo e generazione
|
||||
$articolo = Articolo::where($primary_key, $record[$primary_key])->first();
|
||||
$articolo = null;
|
||||
// Ricerca sulla base della chiave primaria se presente
|
||||
if (!empty($primary_key)) {
|
||||
$articolo = Articolo::where($primary_key, $record[$primary_key])->first();
|
||||
}
|
||||
if (empty($articolo)) {
|
||||
$articolo = Articolo::build($record['codice'], $record['descrizione'], $obj_categoria, $obj_sottocategoria);
|
||||
$articolo = Articolo::build($record['codice'], $record['descrizione'], $categoria, $sotto_categoria);
|
||||
}
|
||||
|
||||
$articolo->idiva_vendita = $aliquota->id;
|
||||
$articolo->attivo = 1;
|
||||
|
||||
// Prezzo di vendita
|
||||
$articolo->setPrezzoVendita($record['prezzo_vendita'], ($aliquota->id ? $aliquota->id : setting('Iva predefinita')));
|
||||
unset($record['prezzo_vendita']);
|
||||
$articolo->setPrezzoVendita($record['prezzo_vendita'], $aliquota->id ? $aliquota->id : setting('Iva predefinita'));
|
||||
|
||||
// Esportazione della quantità indicata
|
||||
$qta_registrata = (float) ($record['qta']);
|
||||
$nome_sede = $record['nome_sede'];
|
||||
unset($record['qta']);
|
||||
unset($record['nome_sede']);
|
||||
|
||||
// Salvataggio delle informazioni generali
|
||||
$articolo->fill([
|
||||
'codice' => $record['codice'],
|
||||
'descrizione' => $record['descrizione'],
|
||||
'prezzo_acquisto' => $record['prezzo_acquisto'],
|
||||
'peso_lordo' => $record['peso_lordo'],
|
||||
'volume' => $record['volume'],
|
||||
'barcode' => $record['barcode'],
|
||||
'id_fornitore' => $record['id_fornitore'],
|
||||
'ubicazione' => $record['ubicazione'],
|
||||
'note' => $record['note'],
|
||||
]);
|
||||
$articolo->save();
|
||||
|
||||
// Aggiornamento dettaglio prezzi
|
||||
$dettagli['anagrafica_listino'] = $record['anagrafica_listino'];
|
||||
$dettagli['qta_minima'] = $record['qta_minima'];
|
||||
$dettagli['qta_massima'] = $record['qta_massima'];
|
||||
$dettagli['prezzo_listino'] = $record['prezzo_listino'];
|
||||
$dettagli['sconto_listino'] = $record['sconto_listino'];
|
||||
$dettagli['dir'] = $record['dir'];
|
||||
unset($record['anagrafica_listino']);
|
||||
unset($record['qta_minima']);
|
||||
unset($record['qta_massima']);
|
||||
unset($record['prezzo_listino']);
|
||||
unset($record['sconto_listino']);
|
||||
unset($record['dir']);
|
||||
|
||||
// Salvataggio delle informazioni generali
|
||||
$articolo->fill($record);
|
||||
$articolo->save();
|
||||
|
||||
// Listini
|
||||
$anagrafica = Anagrafica::where('ragione_sociale', $dettagli['anagrafica_listino'])->first();
|
||||
|
||||
$dettagli['dir'] = strtolower($dettagli['dir']);
|
||||
if ($dettagli['dir'] == 'fornitore') {
|
||||
$dettagli['dir'] = 'uscita';
|
||||
} elseif ($dettagli['dir'] == 'cliente') {
|
||||
$dettagli['dir'] = 'entrata';
|
||||
} else {
|
||||
$dettagli['dir'] = null;
|
||||
}
|
||||
|
||||
if (!empty($anagrafica) && !empty($dettagli['dir'])) {
|
||||
if (!in_array($articolo->id, $this->$id_articoli_processati)) {
|
||||
$database->query('DELETE FROM mg_prezzi_articoli WHERE id_articolo='.prepare($articolo->id));
|
||||
}
|
||||
$this->$id_articoli_processati[] = $articolo->id;
|
||||
|
||||
$dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $dettagli['dir']);
|
||||
$dettaglio_predefinito->sconto_percentuale = $dettagli['sconto_listino'];
|
||||
$dettaglio_predefinito->setPrezzoUnitario($dettagli['prezzo_listino']);
|
||||
|
||||
if ($dettagli['qta_minima'] !== null && !empty($dettagli['qta_massima'])) {
|
||||
$dettaglio_predefinito->minimo = $dettagli['qta_minima'];
|
||||
$dettaglio_predefinito->massimo = $dettagli['qta_massima'];
|
||||
}
|
||||
|
||||
$dettaglio_predefinito->save();
|
||||
}
|
||||
$this->aggiornaDettaglioPrezzi($articolo, $dettagli);
|
||||
|
||||
// Movimentazione della quantità registrata
|
||||
$giacenze = $articolo->getGiacenze();
|
||||
$anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita'));
|
||||
$id_sede = 0;
|
||||
if (!empty($nome_sede)) {
|
||||
$sede = Sede::where('nomesede', $nome_sede)
|
||||
@ -305,4 +318,32 @@ class CSV extends CSVImporter
|
||||
['00004', '719376861871', 'Articolo', 'Mario Rossi', '10', 'Kg', '5.25', '12.72', '10.2', '500', 'Categoria4', 'Sottocategoria2', 'Scaffale 1', 'Articolo di prova', 'Mario Verdi', '1', '10', '20', '10', 'Cliente'],
|
||||
];
|
||||
}
|
||||
|
||||
protected function aggiornaDettaglioPrezzi(Articolo $articolo, $dettagli)
|
||||
{
|
||||
// Listini
|
||||
$anagrafica = Anagrafica::where('ragione_sociale', $dettagli['anagrafica_listino'])->first();
|
||||
|
||||
$dettagli['dir'] = strtolower($dettagli['dir']);
|
||||
if ($dettagli['dir'] == 'fornitore') {
|
||||
$dettagli['dir'] = 'uscita';
|
||||
} elseif ($dettagli['dir'] == 'cliente') {
|
||||
$dettagli['dir'] = 'entrata';
|
||||
} else {
|
||||
$dettagli['dir'] = null;
|
||||
}
|
||||
|
||||
if (!empty($anagrafica) && !empty($dettagli['dir'])) {
|
||||
$dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $dettagli['dir']);
|
||||
$dettaglio_predefinito->sconto_percentuale = $dettagli['sconto_listino'];
|
||||
$dettaglio_predefinito->setPrezzoUnitario($dettagli['prezzo_listino']);
|
||||
|
||||
if ($dettagli['qta_minima'] !== null && !empty($dettagli['qta_massima'])) {
|
||||
$dettaglio_predefinito->minimo = $dettagli['qta_minima'];
|
||||
$dettaglio_predefinito->massimo = $dettagli['qta_massima'];
|
||||
}
|
||||
|
||||
$dettaglio_predefinito->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ switch (filter('op')) {
|
||||
// Inizializzazione del lettore CSV
|
||||
$csv = new $import_manager($record->filepath);
|
||||
foreach ($fields as $key => $value) {
|
||||
$csv->setColumnAssociation($key, $value);
|
||||
$csv->setColumnAssociation($key, $value - 1);
|
||||
}
|
||||
|
||||
// Generazione offset sulla base della pagina
|
||||
@ -82,10 +82,10 @@ switch (filter('op')) {
|
||||
|
||||
// Gestione automatica dei valori convertiti
|
||||
$primary_key = post('primary_key');
|
||||
$csv->setPrimaryKey($primary_key);
|
||||
$csv->setPrimaryKey($primary_key - 1);
|
||||
|
||||
// Operazioni di inizializzazione per l'importazione
|
||||
if (!isset($page) || $page == 0) {
|
||||
if (!isset($page) || empty($page)) {
|
||||
$csv->init();
|
||||
}
|
||||
|
||||
|
@ -58,6 +58,7 @@ if (empty($id_record)) {
|
||||
<div class="col-md-8">
|
||||
{[ "type": "checkbox", "label": "'.tr('Importa prima riga').'", "name": "include_first_row", "extra":"", "value": "1" ]}
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
{[ "type": "select", "label": "'.tr('Chiave primaria').'", "name": "primary_key", "values": '.json_encode($campi_disponibili).', "value": "'.$primary_key.'" ]}
|
||||
</div>
|
||||
@ -160,9 +161,27 @@ $(document).ready(function() {';
|
||||
});
|
||||
|
||||
function importPage(page) {
|
||||
// Ricerca della chiave primaria tra i campi selezionati
|
||||
let primary_key = input("primary_key").get();
|
||||
if (primary_key) {
|
||||
let primary_key_found = false;
|
||||
$("[name^=fields]").each(function() {
|
||||
primary_key_found = primary_key_found || (input(this).get() == primary_key);
|
||||
});
|
||||
|
||||
if (!primary_key_found) {
|
||||
swal({
|
||||
title: "'.tr('Chiave primaria selezionata non presente tra i campi').'",
|
||||
type: "error",
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$("#main_loading").show();
|
||||
|
||||
data = {
|
||||
let data = {
|
||||
id_module: "'.$id_module.'",
|
||||
id_plugin: "'.$id_plugin.'",
|
||||
id_record: "'.$id_record.'",
|
||||
|
@ -94,18 +94,10 @@ abstract class CSVImporter implements ImporterInterface
|
||||
|
||||
public function importRows($offset, $length)
|
||||
{
|
||||
$associations = $this->getColumnAssociations();
|
||||
|
||||
$rows = $this->getRows($offset, $length);
|
||||
foreach ($rows as $row) {
|
||||
// Interpretazione della riga come record
|
||||
$record = [];
|
||||
foreach ($row as $key => $value) {
|
||||
$field = isset($associations[$key]) ? $associations[$key] : null;
|
||||
if (!empty($field)) {
|
||||
$record[$field] = $value;
|
||||
}
|
||||
}
|
||||
$record = $this->getRecord($row);
|
||||
|
||||
// Importazione del record
|
||||
$this->import($record);
|
||||
@ -139,4 +131,27 @@ abstract class CSVImporter implements ImporterInterface
|
||||
|
||||
fclose($file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Interpreta una riga del CSV secondo i campi impostati dinamicamente.
|
||||
*
|
||||
* @param $row
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getRecord($row)
|
||||
{
|
||||
$associations = $this->getColumnAssociations();
|
||||
|
||||
// Interpretazione della riga come record
|
||||
$record = [];
|
||||
foreach ($row as $key => $value) {
|
||||
$field = isset($associations[$key]) ? $associations[$key] : null;
|
||||
if (!empty($field)) {
|
||||
$record[$field] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $record;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user