Base per i dettagli articolo per anagrafica
This commit is contained in:
parent
3318f97434
commit
8ccee151f9
|
@ -21,7 +21,7 @@
|
||||||
}],
|
}],
|
||||||
"type": "project",
|
"type": "project",
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=5.6",
|
"php": ">=5.6.4",
|
||||||
"ext-curl": "*",
|
"ext-curl": "*",
|
||||||
"ext-dom": "*",
|
"ext-dom": "*",
|
||||||
"ext-fileinfo": "*",
|
"ext-fileinfo": "*",
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
"aluguest/ical-easy-reader": "^1.5",
|
"aluguest/ical-easy-reader": "^1.5",
|
||||||
"danielstjules/stringy": "^3.1",
|
"danielstjules/stringy": "^3.1",
|
||||||
"davidepastore/codice-fiscale": "^0.4.0",
|
"davidepastore/codice-fiscale": "^0.4.0",
|
||||||
"dragonmantank/cron-expression": "^3.0",
|
"dragonmantank/cron-expression": "^1.0",
|
||||||
"ezyang/htmlpurifier": "^4.8",
|
"ezyang/htmlpurifier": "^4.8",
|
||||||
"filp/whoops": "^2.1",
|
"filp/whoops": "^2.1",
|
||||||
"guzzlehttp/guzzle": "^6.3",
|
"guzzlehttp/guzzle": "^6.3",
|
||||||
|
@ -83,6 +83,9 @@
|
||||||
"sort-packages": true,
|
"sort-packages": true,
|
||||||
"optimize-autoloader": true,
|
"optimize-autoloader": true,
|
||||||
"apcu-autoloader": true,
|
"apcu-autoloader": true,
|
||||||
"prefer-stable": true
|
"prefer-stable": true,
|
||||||
|
"platform": {
|
||||||
|
"php": "5.6.4"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,5 +40,5 @@ return [
|
||||||
'plugins/pianificazione_interventi' => 'Plugins\PianificazioneInterventi',
|
'plugins/pianificazione_interventi' => 'Plugins\PianificazioneInterventi',
|
||||||
'plugins/pianificazione_fatturazione' => 'Plugins\PianificazioneFatturazione',
|
'plugins/pianificazione_fatturazione' => 'Plugins\PianificazioneFatturazione',
|
||||||
'plugins/statistiche_articoli' => 'Plugins\StatisticheArticoli',
|
'plugins/statistiche_articoli' => 'Plugins\StatisticheArticoli',
|
||||||
'plugins/fornitori_articolo' => 'Plugins\FornitoriArticolo',
|
'plugins/dettagli_articolo' => 'Plugins\DettagliArticolo',
|
||||||
];
|
];
|
||||||
|
|
|
@ -6,7 +6,7 @@ use Common\Document;
|
||||||
use Illuminate\Database\Eloquent\Builder;
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Modules\Articoli\Articolo as Original;
|
use Modules\Articoli\Articolo as Original;
|
||||||
use Modules\Articoli\Movimento;
|
use Modules\Articoli\Movimento;
|
||||||
use Plugins\FornitoriArticolo\Dettaglio;
|
use Plugins\DettagliArticolo\DettaglioFornitore;
|
||||||
use UnexpectedValueException;
|
use UnexpectedValueException;
|
||||||
|
|
||||||
abstract class Article extends Row
|
abstract class Article extends Row
|
||||||
|
@ -172,7 +172,7 @@ abstract class Article extends Row
|
||||||
|
|
||||||
public function dettaglioFornitore()
|
public function dettaglioFornitore()
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Dettaglio::class, 'id_dettaglio_fornitore')->withTrashed();
|
return $this->belongsTo(DettaglioFornitore::class, 'id_dettaglio_fornitore')->withTrashed();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function movimentazione($value = true)
|
public function movimentazione($value = true)
|
||||||
|
|
|
@ -7,7 +7,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
use Modules;
|
use Modules;
|
||||||
use Modules\Interventi\Components\Articolo as ArticoloIntervento;
|
use Modules\Interventi\Components\Articolo as ArticoloIntervento;
|
||||||
use Modules\Iva\Aliquota;
|
use Modules\Iva\Aliquota;
|
||||||
use Plugins\FornitoriArticolo\Dettaglio;
|
use Plugins\DettagliArticolo\DettaglioFornitore;
|
||||||
use Traits\RecordTrait;
|
use Traits\RecordTrait;
|
||||||
use Uploads;
|
use Uploads;
|
||||||
|
|
||||||
|
@ -199,7 +199,7 @@ class Articolo extends Model
|
||||||
|
|
||||||
public function dettaglioFornitori()
|
public function dettaglioFornitori()
|
||||||
{
|
{
|
||||||
return $this->hasMany(Dettaglio::class, 'id_articolo');
|
return $this->hasMany(DettaglioFornitore::class, 'id_articolo');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function dettaglioFornitore($id_fornitore)
|
public function dettaglioFornitore($id_fornitore)
|
||||||
|
|
8
plugins/fornitori_articolo/actions.php → plugins/dettagli_articolo/actions.php
Normal file → Executable file
8
plugins/fornitori_articolo/actions.php → plugins/dettagli_articolo/actions.php
Normal file → Executable file
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
use Modules\Anagrafiche\Anagrafica;
|
use Modules\Anagrafiche\Anagrafica;
|
||||||
use Modules\Articoli\Articolo;
|
use Modules\Articoli\Articolo;
|
||||||
use Plugins\FornitoriArticolo\Dettaglio;
|
use Plugins\DettagliArticolo\DettaglioFornitore;
|
||||||
|
|
||||||
include_once __DIR__.'/../../core.php';
|
include_once __DIR__.'/../../core.php';
|
||||||
|
|
||||||
|
@ -12,14 +12,14 @@ switch (filter('op')) {
|
||||||
$articolo = Articolo::find($id_articolo);
|
$articolo = Articolo::find($id_articolo);
|
||||||
|
|
||||||
$id_anagrafica = filter('id_anagrafica');
|
$id_anagrafica = filter('id_anagrafica');
|
||||||
$precedente = Dettaglio::where('id_articolo', $id_record)
|
$precedente = DettaglioFornitore::where('id_articolo', $id_record)
|
||||||
->where('id_fornitore', $id_anagrafica)
|
->where('id_fornitore', $id_anagrafica)
|
||||||
->first();
|
->first();
|
||||||
|
|
||||||
if (empty($precedente)) {
|
if (empty($precedente)) {
|
||||||
$anagrafica = Anagrafica::find($id_anagrafica);
|
$anagrafica = Anagrafica::find($id_anagrafica);
|
||||||
|
|
||||||
$fornitore = Dettaglio::build($anagrafica, $articolo);
|
$fornitore = DettaglioFornitore::build($anagrafica, $articolo);
|
||||||
} else {
|
} else {
|
||||||
$fornitore = $precedente->replicate();
|
$fornitore = $precedente->replicate();
|
||||||
$precedente->delete();
|
$precedente->delete();
|
||||||
|
@ -39,7 +39,7 @@ switch (filter('op')) {
|
||||||
case 'delete_fornitore':
|
case 'delete_fornitore':
|
||||||
$id_riga = post('id_riga');
|
$id_riga = post('id_riga');
|
||||||
|
|
||||||
$fornitore = Dettaglio::find($id_riga);
|
$fornitore = DettaglioFornitore::find($id_riga);
|
||||||
$fornitore->delete();
|
$fornitore->delete();
|
||||||
|
|
||||||
flash()->info(tr('Relazione articolo-fornitore rimossa correttamente!'));
|
flash()->info(tr('Relazione articolo-fornitore rimossa correttamente!'));
|
4
plugins/fornitori_articolo/edit.php → plugins/dettagli_articolo/edit.php
Normal file → Executable file
4
plugins/fornitori_articolo/edit.php → plugins/dettagli_articolo/edit.php
Normal file → Executable file
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use Plugins\FornitoriArticolo\Dettaglio;
|
use Plugins\DettagliArticolo\DettaglioFornitore;
|
||||||
|
|
||||||
include_once __DIR__.'/../../core.php';
|
include_once __DIR__.'/../../core.php';
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ echo '
|
||||||
</div>
|
</div>
|
||||||
</div>';
|
</div>';
|
||||||
|
|
||||||
$fornitori = Dettaglio::where('id_articolo', $id_record)->get();
|
$fornitori = DettaglioFornitore::where('id_articolo', $id_record)->get();
|
||||||
if (!$fornitori->isEmpty()) {
|
if (!$fornitori->isEmpty()) {
|
||||||
echo '
|
echo '
|
||||||
<h4>'.tr('Elenco fornitori').'</h4>
|
<h4>'.tr('Elenco fornitori').'</h4>
|
4
plugins/fornitori_articolo/edit_fornitore.php → plugins/dettagli_articolo/edit_fornitore.php
Normal file → Executable file
4
plugins/fornitori_articolo/edit_fornitore.php → plugins/dettagli_articolo/edit_fornitore.php
Normal file → Executable file
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
use Modules\Anagrafiche\Anagrafica;
|
use Modules\Anagrafiche\Anagrafica;
|
||||||
use Modules\Articoli\Articolo;
|
use Modules\Articoli\Articolo;
|
||||||
use Plugins\FornitoriArticolo\Dettaglio;
|
use Plugins\DettagliArticolo\DettaglioFornitore;
|
||||||
|
|
||||||
include_once __DIR__.'/../../core.php';
|
include_once __DIR__.'/../../core.php';
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ $anagrafica = Anagrafica::find($id_anagrafica);
|
||||||
$id_riga = get('id_riga');
|
$id_riga = get('id_riga');
|
||||||
$fornitore = [];
|
$fornitore = [];
|
||||||
if (!empty($id_riga)) {
|
if (!empty($id_riga)) {
|
||||||
$fornitore = Dettaglio::find($id_riga);
|
$fornitore = DettaglioFornitore::find($id_riga);
|
||||||
} else {
|
} else {
|
||||||
$fornitore = $articolo->dettaglioFornitore($id_anagrafica);
|
$fornitore = $articolo->dettaglioFornitore($id_anagrafica);
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace Plugins\FornitoriArticolo;
|
namespace Plugins\DettagliArticolo;
|
||||||
|
|
||||||
use Common\Model;
|
use Common\Model;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
@ -12,7 +12,7 @@ use Modules\Articoli\Articolo;
|
||||||
*
|
*
|
||||||
* @since 2.4.15
|
* @since 2.4.15
|
||||||
*/
|
*/
|
||||||
class Dettaglio extends Model
|
class DettaglioFornitore extends Model
|
||||||
{
|
{
|
||||||
use SoftDeletes;
|
use SoftDeletes;
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Plugins\DettagliArticolo;
|
||||||
|
|
||||||
|
use Common\Model;
|
||||||
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
use Modules\Anagrafiche\Anagrafica;
|
||||||
|
use Modules\Articoli\Articolo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Classe per la gestione delle relazioni articolo-prezzo sulla base di un range di quantità e di una specifica anagrafica.
|
||||||
|
*
|
||||||
|
* @since 2.4.18
|
||||||
|
*/
|
||||||
|
class DettaglioPrezzo extends Model
|
||||||
|
{
|
||||||
|
use SoftDeletes;
|
||||||
|
|
||||||
|
protected $table = 'mg_prezzi_articoli';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crea una nuova relazione tra Articolo e Fornitore.
|
||||||
|
*
|
||||||
|
* @return self
|
||||||
|
*/
|
||||||
|
public static function build(Anagrafica $fornitore, Articolo $articolo)
|
||||||
|
{
|
||||||
|
$model = parent::build();
|
||||||
|
|
||||||
|
$model->anagrafica()->associate($fornitore);
|
||||||
|
$model->articolo()->associate($articolo);
|
||||||
|
|
||||||
|
$model->save();
|
||||||
|
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Relazioni Eloquent
|
||||||
|
|
||||||
|
public function anagrafica()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Anagrafica::class, 'id_fornitore');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function articolo()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Articolo::class, 'id_articolo');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Plugins\DettagliArticolo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formato: https://www.metel.it/wp-content/uploads/2020/04/536_L001_1r18_listino_021.pdf.
|
||||||
|
*
|
||||||
|
* @since 2.4.18
|
||||||
|
*/
|
||||||
|
class METEL
|
||||||
|
{
|
||||||
|
const HEADER = [
|
||||||
|
1 => 'Identificazione tracciato',
|
||||||
|
21 => 'Sigla Azienda',
|
||||||
|
24 => 'Partita IVA',
|
||||||
|
35 => 'Numero listino prezzi',
|
||||||
|
41 => 'Decorrenza listino prezzi',
|
||||||
|
49 => 'Data ultima variazione/immissione',
|
||||||
|
57 => 'Descrizione listino prezzi',
|
||||||
|
87 => 'Filler (spazi)',
|
||||||
|
126 => 'Versione tracciato listino prezzi',
|
||||||
|
129 => 'Data decorrenza listino grossista',
|
||||||
|
137 => 'Isopartita',
|
||||||
|
153 => 'Filler (spazi)',
|
||||||
|
];
|
||||||
|
|
||||||
|
const ROW = [
|
||||||
|
1 => 'Sigla Marchio',
|
||||||
|
4 => 'Codice Prodotto Azienda',
|
||||||
|
20 => 'Codice EAN',
|
||||||
|
33 => 'Descrizione prodotto',
|
||||||
|
76 => 'Quantità cartone',
|
||||||
|
81 => 'Quantità multipla ordinazione',
|
||||||
|
86 => 'Quantità minima ordinazione',
|
||||||
|
91 => 'Quantità massima ordinazione',
|
||||||
|
97 => 'Lead Time',
|
||||||
|
98 => 'Prezzo al rivenditore',
|
||||||
|
109 => 'Prezzo al Pubblico',
|
||||||
|
120 => 'Moltiplicatore prezzo',
|
||||||
|
126 => 'Codice Valuta',
|
||||||
|
129 => 'Unità di misura',
|
||||||
|
132 => 'Prodotto Composto',
|
||||||
|
133 => 'Stato del prodotto',
|
||||||
|
134 => 'Data ultima variazione',
|
||||||
|
142 => 'Famiglia di sconto',
|
||||||
|
160 => 'Famiglia statistica',
|
||||||
|
178 => 'Codice Electrocod',
|
||||||
|
188 => 'Codice Etim',
|
||||||
|
198 => 'Codice Barcode',
|
||||||
|
233 => 'Qualificatore Codice Barcode',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function parse($string, $fields)
|
||||||
|
{
|
||||||
|
$fields_number = count($fields);
|
||||||
|
$keys = array_keys($fields);
|
||||||
|
|
||||||
|
$results = [];
|
||||||
|
for ($i = 0; $i < $fields_number; ++$i) {
|
||||||
|
$key = $keys[$i];
|
||||||
|
$start = $key - 1;
|
||||||
|
|
||||||
|
if ($fields_number - 1 == $i) {
|
||||||
|
$end = strlen($string);
|
||||||
|
} else {
|
||||||
|
$end = $keys[$i + 1] - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$length = $end - $start;
|
||||||
|
|
||||||
|
$piece = substr($string, $start, $length);
|
||||||
|
$results[$fields[$key]] = trim($piece);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function parseHeader($content)
|
||||||
|
{
|
||||||
|
return $this->parse($content, static::HEADER);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function parseRow($content)
|
||||||
|
{
|
||||||
|
return $this->parse($content, static::ROW);
|
||||||
|
}
|
||||||
|
}
|
|
@ -37,9 +37,9 @@ UPDATE `em_templates` SET `predefined` = '1' WHERE `em_templates`.`name` = 'Noti
|
||||||
UPDATE `em_templates` SET `predefined` = '1' WHERE `em_templates`.`name` = 'Reset password';
|
UPDATE `em_templates` SET `predefined` = '1' WHERE `em_templates`.`name` = 'Reset password';
|
||||||
UPDATE `em_templates` SET `predefined` = '1' WHERE `em_templates`.`name` = 'Rapportino intervento';
|
UPDATE `em_templates` SET `predefined` = '1' WHERE `em_templates`.`name` = 'Rapportino intervento';
|
||||||
|
|
||||||
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Notifica al tecnico l\'assegnazione all\'attività', '0', 'boolean', '1', 'Interventi', NULL, 'Notifica via email al tecnico le nuove sessioni di lavoro che gli sono state assegnate (l\'indirizzo email deve essere specificato nella sua anagrafica)');
|
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Notifica al tecnico l''assegnazione all''attività', '0', 'boolean', '1', 'Interventi', NULL, 'Notifica via email al tecnico le nuove sessioni di lavoro che gli sono state assegnate (l''indirizzo email deve essere specificato nella sua anagrafica)');
|
||||||
|
|
||||||
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Notifica al tecnico la rimozione dall\'attività', '0', 'boolean', '1', 'Interventi', NULL, 'Notifica via email al tecnico la rimozione dalle sessioni di lavoro che gli erano state assegnate (l\'indirizzo email deve essere specificato nella sua anagrafica)');
|
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Notifica al tecnico la rimozione dall''attività', '0', 'boolean', '1', 'Interventi', NULL, 'Notifica via email al tecnico la rimozione dalle sessioni di lavoro che gli erano state assegnate (l''indirizzo email deve essere specificato nella sua anagrafica)');
|
||||||
|
|
||||||
UPDATE `zz_settings` SET `sezione` = 'Fatturazione Elettronica' WHERE `zz_settings`.`nome` = 'Riferimento dei documenti in Fattura Elettronica';
|
UPDATE `zz_settings` SET `sezione` = 'Fatturazione Elettronica' WHERE `zz_settings`.`nome` = 'Riferimento dei documenti in Fattura Elettronica';
|
||||||
|
|
||||||
|
|
|
@ -21,3 +21,20 @@ DELETE FROM `zz_hooks` WHERE `class` = 'Modules\\Backups\\BackupHook';
|
||||||
|
|
||||||
-- Modifica dei Listini in Piani di sconto/rincaro
|
-- Modifica dei Listini in Piani di sconto/rincaro
|
||||||
UPDATE `zz_modules` SET `title` = 'Piani di sconto/rincaro' WHERE `name` = 'Listini';
|
UPDATE `zz_modules` SET `title` = 'Piani di sconto/rincaro' WHERE `name` = 'Listini';
|
||||||
|
|
||||||
|
-- Aggiunto supporto ai prezzi per Articoli specifici per Anagrafica e range di quantità
|
||||||
|
CREATE TABLE IF NOT EXISTS `mg_prezzi_articoli` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`id_articolo` int(11) NOT NULL,
|
||||||
|
`id_anagrafica` int(11),
|
||||||
|
`minimo` DECIMAL(15,6),
|
||||||
|
`massimo` DECIMAL(15,6),
|
||||||
|
`prezzo_unitario` DECIMAL(15,6) NOT NULL,
|
||||||
|
`prezzo_unitario_ivato` DECIMAL(15,6) NOT NULL,
|
||||||
|
`direzione` VARCHAR(255) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
FOREIGN KEY (`id_articolo`) REFERENCES `mg_articoli`(`id`),
|
||||||
|
FOREIGN KEY (`id_anagrafica`) REFERENCES `an_anagrafiche`(`idanagrafica`)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
UPDATE `zz_plugins` SET `directory` = 'dettagli_articolo', `name`= 'Dettagli articolo', `title`= 'Dettagli' WHERE `name` = 'Fornitori Articolo';
|
||||||
|
|
Loading…
Reference in New Issue