diff --git a/include/common/articolo.php b/include/common/articolo.php
index 5d69bc430..1ebdbed78 100755
--- a/include/common/articolo.php
+++ b/include/common/articolo.php
@@ -66,7 +66,9 @@ if (empty($result['idarticolo'])) {
}
echo '
- ';
+
+
+ ';
// Selezione impianto per gli Interventi
if ($module['name'] == 'Interventi') {
@@ -185,6 +187,14 @@ $("#idarticolo").on("change", function() {
}
$("#um").selectSetNew($data.um, $data.um);
+
+ if ($data.provvigione) {
+ input("provvigione").set($data.provvigione);
+ input("tipo_provvigione").set($data.tipo_provvigione);
+ } else {
+ input("provvigione").set(input("provvigione_default").get());
+ input("tipo_provvigione").set(input("tipo_provvigione_default").get());
+ }
});
});
diff --git a/include/common/barcode.php b/include/common/barcode.php
index 92f2ce143..b7e5bbd36 100644
--- a/include/common/barcode.php
+++ b/include/common/barcode.php
@@ -43,7 +43,7 @@ echo '
';
+ if ($record['idagente'] != 0) {
+ echo Modules::link('Anagrafiche', $record['idagente'], null, null, 'class="pull-right"');
+ }
+ echo '
+ {[ "type": "select", "label": "'.tr('Agente').'", "name": "idagente", "ajax-source": "agenti", "select-options": {"idanagrafica": '.$record['idanagrafica'].'}, "value": "$idagente$" ]}
+
diff --git a/modules/interventi/row-add.php b/modules/interventi/row-add.php
index 4bdc0b18b..a262f7155 100755
--- a/modules/interventi/row-add.php
+++ b/modules/interventi/row-add.php
@@ -41,6 +41,7 @@ $options = [
'idsede_partenza' => $documento->idsede_partenza,
'idsede_destinazione' => $documento->idsede_destinazione,
'permetti_movimento_a_zero' => 0,
+ 'idagente' => $documento->idagente,
],
'impianti' => [
'idintervento' => $documento->id,
@@ -59,8 +60,13 @@ $result = [
'idiva' => '',
'idconto' => $idconto,
'ritenuta_contributi' => true,
+ 'provvigione_default' => 0,
+ 'tipo_provvigione_default' => 'PRC',
];
+// Leggo la provvigione predefinita per l'anagrafica
+$result['provvigione_default'] = $dbo->fetchOne('SELECT provvigione_default FROM an_anagrafiche WHERE idanagrafica='.prepare($documento->idagente))['provvigione_default'];
+
// Leggo l'iva predefinita per l'anagrafica e se non c'è leggo quella predefinita generica
$iva = $dbo->fetchArray('SELECT idiva_vendite AS idiva FROM an_anagrafiche WHERE idanagrafica='.prepare($documento['idanagrafica']));
$result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita');
diff --git a/modules/interventi/row-list.php b/modules/interventi/row-list.php
index bc9f5cca2..c329392f5 100755
--- a/modules/interventi/row-list.php
+++ b/modules/interventi/row-list.php
@@ -229,6 +229,20 @@ echo '
';
}
+ // Provvigione
+ if(!empty($intervento->provvigione)) {
+ echo '
+
'.tr('Margine (_PRC_%)', [
diff --git a/plugins/provvigioni/actions.php b/plugins/provvigioni/actions.php
new file mode 100644
index 000000000..edcafcdde
--- /dev/null
+++ b/plugins/provvigioni/actions.php
@@ -0,0 +1,55 @@
+.
+ */
+
+include_once __DIR__.'/../../core.php';
+
+$operazione = filter('op');
+
+switch ($operazione) {
+ case 'addprovvigione':
+ $dbo->insert('co_provvigioni', [
+ 'idarticolo' => $id_parent,
+ 'idagente' => post('idagente'),
+ 'provvigione' => post('provvigione'),
+ 'tipo_provvigione' => post('tipo_provvigione'),
+ ]);
+ $id_record = $dbo->lastInsertedID();
+
+ flash()->info(tr('Aggiunta nuova provvigione!'));
+
+ break;
+
+ case 'updateprovvigione':
+ $dbo->update('co_provvigioni', [
+ 'idagente' => post('idagente'),
+ 'provvigione' => post('provvigione'),
+ 'tipo_provvigione' => post('tipo_provvigione'),
+ ], ['id' => $id_record]);
+
+ flash()->info(tr('Salvataggio completato!'));
+
+ break;
+
+ case 'deletereferente':
+ $dbo->query('DELETE FROM `co_provvigioni` WHERE `id`='.prepare($id_record));
+
+ flash()->info(tr('Provvigione eliminata!'));
+
+ break;
+}
diff --git a/plugins/provvigioni/add.php b/plugins/provvigioni/add.php
new file mode 100644
index 000000000..58cd30ecc
--- /dev/null
+++ b/plugins/provvigioni/add.php
@@ -0,0 +1,51 @@
+.
+ */
+
+include_once __DIR__.'/../../core.php';
+
+echo '
+';
diff --git a/plugins/provvigioni/edit.php b/plugins/provvigioni/edit.php
new file mode 100644
index 000000000..dbc96155d
--- /dev/null
+++ b/plugins/provvigioni/edit.php
@@ -0,0 +1,54 @@
+.
+ */
+
+include_once __DIR__.'/../../core.php';
+
+echo '
+';
diff --git a/plugins/provvigioni/init.php b/plugins/provvigioni/init.php
new file mode 100644
index 000000000..96d69f7f8
--- /dev/null
+++ b/plugins/provvigioni/init.php
@@ -0,0 +1,27 @@
+.
+ */
+
+include_once __DIR__.'/../../core.php';
+
+use Modules\Articoli\Articolo;
+
+if (isset($id_record)) {
+ $record = $dbo->fetchOne('SELECT * FROM co_provvigioni WHERE id='.prepare($id_record));
+ $articolo = Articolo::withTrashed()->find($id_parent);
+}
\ No newline at end of file
diff --git a/src/Common/Components/Accounting.php b/src/Common/Components/Accounting.php
index 557db4f1a..9a93a3222 100644
--- a/src/Common/Components/Accounting.php
+++ b/src/Common/Components/Accounting.php
@@ -62,6 +62,8 @@ abstract class Accounting extends Component
'sconto_unitario' => 'float',
'sconto_iva_unitario' => 'float',
'sconto_unitario_ivato' => 'float',
+ 'provvigione_percentuale' => 'float',
+ 'provvigione_unitaria' => 'float',
//'qta_evasa' => 'float',
];
@@ -72,6 +74,7 @@ abstract class Accounting extends Component
'spesa',
'imponibile',
'sconto',
+ 'provvigione',
'totale_imponibile',
'iva',
'totale',
@@ -152,7 +155,7 @@ abstract class Accounting extends Component
*/
public function getMargineAttribute()
{
- return $this->totale_imponibile - $this->spesa;
+ return $this->totale_imponibile - $this->spesa - $this->provvigione;
}
/**
@@ -270,6 +273,27 @@ abstract class Accounting extends Component
}
}
+ /**
+ * Imposta la provvigione secondo le informazioni indicate per valore e tipologia (UNT o PRC).
+ *
+ * @param $value
+ * @param $type
+ */
+ public function setProvvigione($value, $type)
+ {
+ $provvigione_unitaria = 0;
+
+ if ($type == 'PRC') {
+ $this->provvigione_percentuale = $value;
+ $provvigione_unitaria = ($this->prezzo_unitario - $this->sconto_unitario) / 100 * floatval($value);
+ $this->provvigione_unitaria = $provvigione_unitaria;
+ } else {
+ $this->provvigione_percentuale = 0;
+ $provvigione_unitaria = $value;
+ $this->provvigione_unitaria = $provvigione_unitaria;
+ }
+ }
+
public function incorporaIVA()
{
return $this->getDocument()->direzione == 'entrata' && setting('Utilizza prezzi di vendita comprensivi di IVA');
@@ -299,6 +323,17 @@ abstract class Accounting extends Component
return $this->qta * $this->sconto_unitario;
}
+ /**
+ * Restituisce la provvigione della riga corrente in euro.
+ *
+ * @return float
+ */
+ public function getProvvigioneAttribute()
+ {
+ return $this->qta * $this->provvigione_unitaria;
+ }
+
+
/**
* Restituisce il prezzo unitario corrente (unitario oppure unitario ivato a seconda dell'impostazione 'Utilizza prezzi di vendita comprensivi di IVA') per la riga.
*
@@ -321,7 +356,7 @@ abstract class Accounting extends Component
*/
public function getMarginePercentualeAttribute()
{
- return $this->imponibile ? (($this->imponibile / $this->spesa) - 1) * 100 : 100;
+ return ($this->totale_imponibile && ($this->spesa || $this->provvigione)) ? (($this->totale_imponibile / ($this->spesa + $this->provvigione)) - 1) * 100 : 100;
}
/**
@@ -378,6 +413,7 @@ abstract class Accounting extends Component
// Fix dei campi statici
$this->fixSubtotale();
$this->fixSconto();
+ $this->fixProvvigione();
$this->fixIva();
@@ -424,6 +460,15 @@ abstract class Accounting extends Component
$this->attributes['tipo_sconto'] = $this->sconto_percentuale ? 'PRC' : 'UNT';
}
+ /**
+ * Effettua i conti per lo sconto totale.
+ */
+ protected function fixProvvigione()
+ {
+ $this->attributes['provvigione'] = $this->provvigione;
+ $this->attributes['tipo_provvigione'] = $this->provvigione_percentuale ? 'PRC' : 'UNT';
+ }
+
protected static function boot()
{
parent::boot();
diff --git a/src/Common/Document.php b/src/Common/Document.php
index b055ebe1d..2e7ae39da 100755
--- a/src/Common/Document.php
+++ b/src/Common/Document.php
@@ -169,6 +169,17 @@ abstract class Document extends Model implements ReferenceInterface, DocumentInt
return $this->calcola('sconto');
}
+ /**
+ * Calcola la provvigione totale del documento.
+ *
+ * @return float
+ */
+ public function getProvvigioneAttribute()
+ {
+ return $this->calcola('provvigione');
+ }
+
+
/**
* Calcola il totale imponibile del documento.
*
@@ -226,7 +237,7 @@ abstract class Document extends Model implements ReferenceInterface, DocumentInt
*/
public function getMarginePercentualeAttribute()
{
- return ($this->totale_imponibile && $this->spesa) ? (($this->totale_imponibile / $this->spesa) - 1) * 100 : 100;
+ return ($this->totale_imponibile && ($this->spesa || $this->provvigione)) ? (($this->totale_imponibile / ($this->spesa + $this->provvigione)) - 1) * 100 : 100;
}
public function delete()
diff --git a/update/2_4_34.sql b/update/2_4_34.sql
index 221f6c426..4a4c3dfac 100644
--- a/update/2_4_34.sql
+++ b/update/2_4_34.sql
@@ -8,3 +8,31 @@ INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`,
-- Aggiunta permessi viste ai gruppi
INSERT INTO `zz_group_view` (`id_gruppo`, `id_vista`) ( SELECT `zz_groups`.`id`, `zz_views`.`id` FROM `zz_groups`, `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` WHERE `zz_modules`.`name` = 'Interventi' AND `zz_views`.`name` IN('Ore', 'Costi', 'Ricavi') );
+
+-- Nuovo plugin "Provvigioni"
+CREATE TABLE IF NOT EXISTS `co_provvigioni` (
+ `id` int NOT NULL AUTO_INCREMENT,
+ `idagente` int NOT NULL,
+ `idarticolo` int NOT NULL,
+ `provvigione` decimal(12,6) NOT NULL,
+ `tipo_provvigione` enum('UNT','PRC') NOT NULL DEFAULT 'UNT',
+ PRIMARY KEY (`id`)
+);
+
+INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`) VALUES (NULL, 'Provvigioni', 'Provvigioni', (SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), (SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), 'tab', '', '1', '1', '0', '', '', NULL, '{ \"main_query\": [ { \"type\": \"table\", \"fields\": \"Agente, Provvigione\", \"query\": \"SELECT co_provvigioni.id, an_anagrafiche.ragione_sociale AS `Agente`, CONCAT(FORMAT(co_provvigioni.provvigione,2), \' \', IF(co_provvigioni.tipo_provvigione=\'UNT\', \'€\', \'%\')) AS `Provvigione` FROM co_provvigioni LEFT JOIN an_anagrafiche ON co_provvigioni.idagente=an_anagrafiche.idanagrafica WHERE co_provvigioni.idarticolo=|id_parent| HAVING 2=2 ORDER BY co_provvigioni.id DESC\"} ]}', 'provvigioni', '');
+
+ALTER TABLE `co_righe_contratti` ADD `provvigione` DECIMAL(12,6) NOT NULL AFTER `prezzo_unitario_ivato`, ADD `provvigione_unitaria` DECIMAL(12,6) NOT NULL AFTER `provvigione`, ADD `provvigione_percentuale` DECIMAL(12,6) NOT NULL AFTER `provvigione_unitaria`, ADD `tipo_provvigione` ENUM('UNT','PRC') NOT NULL DEFAULT 'UNT' AFTER `provvigione_percentuale`;
+
+ALTER TABLE `co_righe_preventivi` ADD `provvigione` DECIMAL(12,6) NOT NULL AFTER `prezzo_unitario_ivato`, ADD `provvigione_unitaria` DECIMAL(12,6) NOT NULL AFTER `provvigione`, ADD `provvigione_percentuale` DECIMAL(12,6) NOT NULL AFTER `provvigione_unitaria`, ADD `tipo_provvigione` ENUM('UNT','PRC') NOT NULL DEFAULT 'UNT' AFTER `provvigione_percentuale`;
+
+ALTER TABLE `co_righe_documenti` ADD `provvigione` DECIMAL(12,6) NOT NULL AFTER `prezzo_unitario_ivato`, ADD `provvigione_unitaria` DECIMAL(12,6) NOT NULL AFTER `provvigione`, ADD `provvigione_percentuale` DECIMAL(12,6) NOT NULL AFTER `provvigione_unitaria`, ADD `tipo_provvigione` ENUM('UNT','PRC') NOT NULL DEFAULT 'UNT' AFTER `provvigione_percentuale`;
+
+ALTER TABLE `dt_righe_ddt` ADD `provvigione` DECIMAL(12,6) NOT NULL AFTER `prezzo_unitario_ivato`, ADD `provvigione_unitaria` DECIMAL(12,6) NOT NULL AFTER `provvigione`, ADD `provvigione_percentuale` DECIMAL(12,6) NOT NULL AFTER `provvigione_unitaria`, ADD `tipo_provvigione` ENUM('UNT','PRC') NOT NULL DEFAULT 'UNT' AFTER `provvigione_percentuale`;
+
+ALTER TABLE `in_righe_interventi` ADD `provvigione` DECIMAL(12,6) NOT NULL AFTER `prezzo_unitario_ivato`, ADD `provvigione_unitaria` DECIMAL(12,6) NOT NULL AFTER `provvigione`, ADD `provvigione_percentuale` DECIMAL(12,6) NOT NULL AFTER `provvigione_unitaria`, ADD `tipo_provvigione` ENUM('UNT','PRC') NOT NULL DEFAULT 'UNT' AFTER `provvigione_percentuale`;
+
+ALTER TABLE `or_righe_ordini` ADD `provvigione` DECIMAL(12,6) NOT NULL AFTER `prezzo_unitario_ivato`, ADD `provvigione_unitaria` DECIMAL(12,6) NOT NULL AFTER `provvigione`, ADD `provvigione_percentuale` DECIMAL(12,6) NOT NULL AFTER `provvigione_unitaria`, ADD `tipo_provvigione` ENUM('UNT','PRC') NOT NULL DEFAULT 'UNT' AFTER `provvigione_percentuale`;
+
+ALTER TABLE `an_anagrafiche` ADD `provvigione_default` DECIMAL(12,6) NOT NULL AFTER `idtipointervento_default`;
+
+ALTER TABLE `in_interventi` ADD `idagente` INT NOT NULL AFTER `idreferente`;
\ No newline at end of file
|