1
0
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:
Luca 2021-02-26 15:47:20 +01:00
parent 91aec2d651
commit 018b716d71
4 changed files with 150 additions and 75 deletions

View File

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

View File

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

View File

@ -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.'",

View File

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