Base per i dettagli articolo per anagrafica

This commit is contained in:
Dasc3er 2020-08-25 17:38:10 +02:00
parent 3318f97434
commit 8ccee151f9
12 changed files with 176 additions and 20 deletions

View File

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

View File

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

View File

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

View File

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

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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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