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 ' - + diff --git a/include/common/riga.php b/include/common/riga.php index 253242a0a..8f4844a93 100755 --- a/include/common/riga.php +++ b/include/common/riga.php @@ -77,11 +77,15 @@ if ($options['dir'] == 'entrata') { if ($("#modals select[id^=\'tipo_sconto\']").val() === "PRC") { sconto = sconto / 100 * prezzo; } + var provvigione = $("#provvigione").val().toEnglish(); + if ($("#modals select[id^=\'tipo_provvigione\']").val() === "PRC") { + provvigione = provvigione / 100 * (prezzo - sconto); + } - var guadagno = prezzo - sconto - costo_unitario; - var margine = (((prezzo - sconto) * 100) / costo_unitario) - 100; + var guadagno = prezzo - sconto - provvigione - costo_unitario; + var margine = (((prezzo - sconto) * 100) / (costo_unitario + provvigione)) - 100; var parent = $("#costo_unitario").closest("div").parent(); - var div = parent.find("div[id*=\"errors\"]"); + var div = $(".margine"); var mediaponderata = 0; margine = isNaN(margine) || !isFinite(margine) ? 0: margine; // Fix per magine NaN @@ -90,7 +94,7 @@ if ($options['dir'] == 'entrata') { mediaponderata = parseFloat($("#idarticolo").selectData().media_ponderata); } - div.html("
'.tr('Articolo').''.$intestazione_prezzo.''.$intestazione_prezzo.' '.tr('Sconto').' '.tr('Q.tà').' #
\ + div.html("
\ \ '; } +// Provvigione +if(!empty($contratto->provvigione)) { + echo ' + + + + + '; +} + echo '
\  '.tr('Guadagno').':\ @@ -128,10 +132,10 @@ if ($options['dir'] == 'entrata') { if (guadagno < 0) { parent.addClass("has-error"); - div.addClass("label-danger").removeClass("label-success"); + $(".table-margine").addClass("label-danger").removeClass("label-success"); } else { parent.removeClass("has-error"); - div.removeClass("label-danger").addClass("label-success"); + $(".table-margine").removeClass("label-danger").addClass("label-success"); } } @@ -143,6 +147,8 @@ if ($options['dir'] == 'entrata') { $("#costo_unitario").keyup(aggiorna_guadagno); $("#sconto").keyup(aggiorna_guadagno); $("#modals select[id^=\'tipo_sconto\']").change(aggiorna_guadagno); + $("#provvigione").keyup(aggiorna_guadagno); + $("#modals select[id^=\'tipo_provvigione\']").change(aggiorna_guadagno); '; } @@ -159,6 +165,19 @@ echo ' '; +if ($options['dir'] == 'entrata') { + echo ' +
+
'; + + // Provvigione + echo ' +
+ {[ "type": "number", "label": "'.tr('Provvigione unitaria').'", "name": "provvigione", "value": "'.($result['provvigione_percentuale'] ?: ($result['provvigione_unitaria'] ?: $result['provvigione_default'])).'", "icon-after": "choice|untprc|'.($result['tipo_provvigione'] ?: $result['tipo_provvigione_default']).'", "help": "'.tr('Provvigione destinata all\'agente.').'", "min-value": "0" ]} +
+
'; +} + // Data prevista evasione (per ordini) if (in_array($module['name'], ['Ordini cliente', 'Ordini fornitore', 'Preventivi'])) { diff --git a/modules/anagrafiche/actions.php b/modules/anagrafiche/actions.php index 27a27f87d..16de29310 100755 --- a/modules/anagrafiche/actions.php +++ b/modules/anagrafiche/actions.php @@ -95,6 +95,7 @@ switch (post('op')) { $anagrafica->riferimento_amministrazione = post('riferimento_amministrazione'); $anagrafica->colore = post('colore'); $anagrafica->idtipointervento_default = post('idtipointervento_default') ?: null; + $anagrafica->provvigione_default = post('provvigione_default'); $anagrafica->id_ritenuta_acconto_acquisti = post('id_ritenuta_acconto_acquisti'); $anagrafica->id_ritenuta_acconto_vendite = post('id_ritenuta_acconto_vendite'); $anagrafica->split_payment = post('split_payment'); diff --git a/modules/anagrafiche/edit.php b/modules/anagrafiche/edit.php index fffd9fcc4..873c3c12e 100755 --- a/modules/anagrafiche/edit.php +++ b/modules/anagrafiche/edit.php @@ -25,6 +25,7 @@ include_once __DIR__.'/../../core.php'; $is_fornitore = in_array($id_fornitore, $tipi_anagrafica); $is_cliente = in_array($id_cliente, $tipi_anagrafica); $is_tecnico = in_array($id_tecnico, $tipi_anagrafica); +$is_agente = in_array($id_agente, $tipi_anagrafica); if (!$is_cliente && !$is_fornitore && $is_tecnico) { $ignore = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Sedi' OR name='Referenti' OR name='Dichiarazioni d\'intento'"); @@ -640,15 +641,15 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
{[ "type": "text", "label": "", "name": "riferimento_amministrazione", "value": "$riferimento_amministrazione$", "maxlength": "20" ]}
- - - + +
+ {[ "type": "number", "label": "", "name": "provvigione_default", "value": "$provvigione_default$", "icon-after": "%" ]} +
+
diff --git a/modules/articoli/ajax/select.php b/modules/articoli/ajax/select.php index 9ada8a159..e0485a2db 100755 --- a/modules/articoli/ajax/select.php +++ b/modules/articoli/ajax/select.php @@ -33,6 +33,7 @@ switch ($resource) { $usare_dettaglio_fornitore = $superselect['dir'] == 'uscita'; $usare_iva_anagrafica = $superselect['dir'] == 'entrata' && !empty($superselect['idanagrafica']); $solo_non_varianti = $superselect['solo_non_varianti']; + $idagente = $superselect['idagente']; $query = "SELECT IF(`categoria`.`nome` IS NOT NULL, CONCAT(`categoria`.`nome`, IF(`sottocategoria`.`nome` IS NOT NULL, CONCAT(' (', `sottocategoria`.`nome`, ')'), '-')), '".tr('Nessuna categoria')."') AS optgroup, @@ -73,6 +74,12 @@ switch ($resource) { IFNULL(iva_articolo.percentuale, iva_predefinita.percentuale) AS percentuale,'; } + if ($idagente) { + $query .= ' + co_provvigioni.provvigione AS provvigione, + co_provvigioni.tipo_provvigione AS tipo_provvigione,'; + } + $query .= ' round(mg_articoli.qta,'.setting('Cifre decimali per quantità').") AS qta, mg_articoli.um, @@ -107,6 +114,11 @@ switch ($resource) { LEFT JOIN co_iva AS iva_anagrafica ON iva_anagrafica.id = (SELECT idiva_vendite FROM an_anagrafiche WHERE idanagrafica = '.prepare($superselect['idanagrafica']).')'; } + if ($idagente) { + $query .= ' + LEFT JOIN co_provvigioni ON co_provvigioni.idarticolo = mg_articoli.id AND co_provvigioni.idagente='.prepare($idagente); + } + $query .= ' LEFT JOIN mg_fornitore_articolo ON mg_fornitore_articolo.id_articolo = mg_articoli.id AND mg_fornitore_articolo.deleted_at IS NULL AND mg_fornitore_articolo.id_fornitore = '.prepare($superselect['idanagrafica']); diff --git a/modules/articoli/bulk.php b/modules/articoli/bulk.php index 098d72fbd..80edbd981 100644 --- a/modules/articoli/bulk.php +++ b/modules/articoli/bulk.php @@ -351,6 +351,34 @@ switch (post('op')) { flash()->warning(tr('Nessun articolo modificato!')); } + break; + + case 'set-provvigione': + $n_art = 0; + foreach ($id_records as $id) { + $exist = $dbo->selectOne('co_provvigioni', 'id', ['idarticolo' => $id, 'idagente' => post('idagente')]); + + if ($exist) { + $dbo->update('co_provvigioni', [ + 'idagente' => post('idagente'), + 'provvigione' => post('provvigione'), + 'tipo_provvigione' => post('tipo_provvigione'), + ], ['idarticolo' => $id, 'idagente' => post('idagente')]); + } else { + $dbo->insert('co_provvigioni', [ + 'idarticolo' => $id, + 'idagente' => post('idagente'), + 'provvigione' => post('provvigione'), + 'tipo_provvigione' => post('tipo_provvigione'), + ]); + } + $n_art++; + } + + flash()->info(tr('Provvigioni inserite correttamente!', [ + '_NUM_' => $n_art, + ])); + break; } @@ -517,4 +545,16 @@ $operations['change-conto-vendita'] = [ ], ]; +$operations['set-provvigione'] = [ + 'text' => ' '.tr('Imposta una provvigione').'', + 'data' => [ + 'title' => tr('Impostare una provvigione?'), + 'msg' => tr('Selezionare un agente e la provvigione prevista:').' +

{[ "type": "select", "label": "'.tr('Agente').'", "name": "idagente", "required": 1, "ajax-source": "agenti" ]} +
{[ "type": "number", "label": "'.tr('Provvigione').'", "name": "provvigione", "required": 1, "icon-after": "choice|untprc|" ]}', + 'button' => tr('Procedi'), + 'class' => 'btn btn-lg btn-warning', + ], +]; + return $operations; diff --git a/modules/contratti/actions.php b/modules/contratti/actions.php index 9f698aeea..7250114b7 100644 --- a/modules/contratti/actions.php +++ b/modules/contratti/actions.php @@ -211,6 +211,7 @@ switch (post('op')) { $articolo->costo_unitario = post('costo_unitario') ?: 0; $articolo->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $articolo->setSconto(post('sconto'), post('tipo_sconto')); + $articolo->setProvvigione(post('provvigione'), post('tipo_provvigione')); try { $articolo->qta = $qta; @@ -265,6 +266,7 @@ switch (post('op')) { $riga->costo_unitario = post('costo_unitario') ?: 0; $riga->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $riga->setSconto(post('sconto'), post('tipo_sconto')); + $riga->setProvvigione(post('provvigione'), post('tipo_provvigione')); $riga->qta = $qta; @@ -524,6 +526,7 @@ switch (post('op')) { $contratto->descrizione = $documento->descrizione; $contratto->esclusioni = $documento->esclusioni; $contratto->idreferente = $documento->idreferente; + $contratto->idagente = $documento->idagente; $contratto->save(); diff --git a/modules/contratti/row-add.php b/modules/contratti/row-add.php index 229d7a369..3524458dc 100755 --- a/modules/contratti/row-add.php +++ b/modules/contratti/row-add.php @@ -37,6 +37,7 @@ $options = [ 'idanagrafica' => $documento->idanagrafica, 'dir' => $documento->direzione, 'permetti_movimento_a_zero' => 1, + 'idagente' => $documento->idagente, ], ], ]; @@ -50,8 +51,13 @@ $result = [ 'sconto_unitario' => 0, 'tipo_sconto' => '', 'idiva' => '', + '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/contratti/row-list.php b/modules/contratti/row-list.php index 50876e832..3969cdd06 100755 --- a/modules/contratti/row-list.php +++ b/modules/contratti/row-list.php @@ -260,6 +260,20 @@ if ($totale != $netto_a_pagare) {
+ '.tr('Provvigioni').': + + '.moneyFormat($contratto->provvigione).' +
'; if (!$block_edit && sizeof($righe) > 0) { diff --git a/modules/ddt/actions.php b/modules/ddt/actions.php index 96ec68037..b4c828149 100755 --- a/modules/ddt/actions.php +++ b/modules/ddt/actions.php @@ -207,7 +207,10 @@ switch (filter('op')) { $articolo->costo_unitario = post('costo_unitario') ?: 0; $articolo->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $articolo->setSconto(post('sconto'), post('tipo_sconto')); - + if ($dir == 'entrata') { + $articolo->setProvvigione(post('provvigione'), post('tipo_provvigione')); + } + try { $articolo->qta = post('qta'); } catch (UnexpectedValueException $e) { @@ -263,6 +266,9 @@ switch (filter('op')) { $riga->costo_unitario = post('costo_unitario') ?: 0; $riga->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $riga->setSconto(post('sconto'), post('tipo_sconto')); + if ($dir == 'entrata') { + $riga->setProvvigione(post('provvigione'), post('tipo_provvigione')); + } $riga->qta = post('qta'); @@ -330,6 +336,7 @@ switch (filter('op')) { $ddt->idcausalet = post('id_causale_trasporto'); $ddt->idreferente = $documento->idreferente; + $ddt->idagente = $documento->idagente; $ddt->save(); diff --git a/modules/ddt/row-add.php b/modules/ddt/row-add.php index fe1d1b7bc..f4607f62f 100755 --- a/modules/ddt/row-add.php +++ b/modules/ddt/row-add.php @@ -40,6 +40,7 @@ $options = [ 'idsede_partenza' => $documento->idsede_partenza, 'idsede_destinazione' => $documento->idsede_destinazione, 'permetti_movimento_a_zero' => intval($documento->direzione == 'uscita'), + 'idagente' => $documento->idagente, ], ], ]; @@ -53,8 +54,13 @@ $result = [ 'sconto_unitario' => 0, 'tipo_sconto' => '', 'idiva' => '', + '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_'.($dir == 'uscita' ? 'acquisti' : 'vendite').' AS idiva FROM an_anagrafiche WHERE idanagrafica='.prepare($documento['idanagrafica'])); $result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita'); diff --git a/modules/ddt/row-list.php b/modules/ddt/row-list.php index 0217cd594..ee952bf61 100755 --- a/modules/ddt/row-list.php +++ b/modules/ddt/row-list.php @@ -318,6 +318,20 @@ if ($totale != $netto_a_pagare) { '; } +// Provvigione +if(!empty($ddt->provvigione)) { + echo ' + + + '.tr('Provvigioni').': + + + '.moneyFormat($ddt->provvigione).' + + + '; +} + echo ' '; if (!$block_edit && sizeof($righe) > 0) { diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index 2159da793..69869d27a 100755 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -500,6 +500,9 @@ switch (post('op')) { $articolo->costo_unitario = post('costo_unitario') ?: 0; $articolo->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $articolo->setSconto(post('sconto'), post('tipo_sconto')); + if ($dir == 'entrata') { + $articolo->setProvvigione(post('provvigione'), post('tipo_provvigione')); + } try { $articolo->qta = $qta; @@ -573,6 +576,9 @@ switch (post('op')) { $riga->costo_unitario = post('costo_unitario') ?: 0; $riga->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $riga->setSconto(post('sconto'), post('tipo_sconto')); + if ($dir == 'entrata') { + $riga->setProvvigione(post('provvigione'), post('tipo_provvigione')); + } $riga->qta = $qta; @@ -727,6 +733,7 @@ switch (post('op')) { $fattura->idsede_destinazione = $documento->idsede; $fattura->id_ritenuta_contributi = post('id_ritenuta_contributi') ?: null; $fattura->idreferente = $documento->idreferente; + $fattura->idagente = $documento->idagente; $fattura->save(); diff --git a/modules/fatture/row-add.php b/modules/fatture/row-add.php index 202c40815..b27c32234 100755 --- a/modules/fatture/row-add.php +++ b/modules/fatture/row-add.php @@ -42,6 +42,7 @@ $options = [ 'idsede_partenza' => $documento->idsede_partenza, 'idsede_destinazione' => $documento->idsede_destinazione, 'permetti_movimento_a_zero' => intval($documento->direzione == 'uscita'), + 'idagente' => $documento->idagente, ], 'iva' => [ 'split_payment' => $documento['split_payment'], @@ -66,8 +67,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_'.($dir == 'uscita' ? 'acquisti' : 'vendite').' AS idiva FROM an_anagrafiche WHERE idanagrafica='.prepare($documento['idanagrafica'])); $result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita'); diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index 50ec45d1d..b99e9187d 100755 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -424,6 +424,20 @@ if ($totale != $netto_a_pagare) { '; } +// Provvigione +if(!empty($fattura->provvigione)) { + echo ' + + + '.tr('Provvigioni').': + + + '.moneyFormat($fattura->provvigione).' + + + '; +} + echo ' '; if (!$block_edit && sizeof($righe) > 0) { diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index 619d97c66..0a8832e2a 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -55,6 +55,7 @@ switch (post('op')) { $intervento->idanagrafica = post('idanagrafica'); $intervento->idclientefinale = post('idclientefinale'); $intervento->idreferente = post('idreferente'); + $intervento->idagente = post('idagente'); $intervento->idtipointervento = post('idtipointervento'); $intervento->idstatointervento = post('idstatointervento'); @@ -497,6 +498,7 @@ switch (post('op')) { $articolo->costo_unitario = post('costo_unitario') ?: 0; $articolo->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $articolo->setSconto(post('sconto'), post('tipo_sconto')); + $articolo->setProvvigione(post('provvigione'), post('tipo_provvigione')); try { $articolo->qta = $qta; @@ -562,6 +564,7 @@ switch (post('op')) { $riga->costo_unitario = post('costo_unitario') ?: 0; $riga->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $riga->setSconto(post('sconto'), post('tipo_sconto')); + $riga->setProvvigione(post('provvigione'), post('tipo_provvigione')); $riga->qta = $qta; @@ -615,6 +618,7 @@ switch (post('op')) { $intervento->codice_cig = $documento->codice_cig; $intervento->num_item = $documento->num_item; $intervento->idreferente = $documento->idreferente; + $intervento->idagente = $documento->idagente; $intervento->save(); diff --git a/modules/interventi/edit.php b/modules/interventi/edit.php index 836135e34..e57fe4f0a 100755 --- a/modules/interventi/edit.php +++ b/modules/interventi/edit.php @@ -120,6 +120,14 @@ echo ' {[ "type": "select", "label": "'.tr('Ordine').'", "name": "idordine", "value": "'.$record['id_ordine'].'", "ajax-source": "ordini-cliente", "select-options": '.json_encode(['idanagrafica' => $record['idanagrafica']]).', "readonly": "'.$record['flag_completato'].'" ]} + +
'; + 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('Provvigioni').': + + + '.moneyFormat($intervento->provvigione).' + + + '; + } + } echo' diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php index 49c81b5ee..6c7ebc85f 100755 --- a/modules/ordini/actions.php +++ b/modules/ordini/actions.php @@ -186,6 +186,9 @@ switch (post('op')) { $articolo->confermato = post('confermato') ?: 0; $articolo->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $articolo->setSconto(post('sconto'), post('tipo_sconto')); + if ($dir == 'entrata') { + $articolo->setProvvigione(post('provvigione'), post('tipo_provvigione')); + } try { $articolo->qta = post('qta'); @@ -265,6 +268,9 @@ switch (post('op')) { $riga->confermato = post('confermato') ?: 0; $riga->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $riga->setSconto(post('sconto'), post('tipo_sconto')); + if ($dir == 'entrata') { + $riga->setProvvigione(post('provvigione'), post('tipo_provvigione')); + } $riga->qta = post('qta'); @@ -425,6 +431,7 @@ switch (post('op')) { $ordine->codice_cig = $documento->codice_cig; $ordine->num_item = $documento->num_item; $ordine->idreferente = $documento->idreferente; + $ordine->idagente = $documento->idagente; $ordine->save(); diff --git a/modules/ordini/row-add.php b/modules/ordini/row-add.php index 60a62be91..f4acfea47 100755 --- a/modules/ordini/row-add.php +++ b/modules/ordini/row-add.php @@ -38,6 +38,7 @@ $options = [ 'idanagrafica' => $documento->idanagrafica, 'dir' => $documento->direzione, 'permetti_movimento_a_zero' => 1, + 'idagente' => $documento->idagente, ], ], ]; @@ -51,8 +52,13 @@ $result = [ 'sconto_unitario' => 0, 'tipo_sconto' => '', 'idiva' => '', + '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_'.($dir == 'uscita' ? 'acquisti' : 'vendite').' AS idiva FROM an_anagrafiche WHERE idanagrafica='.prepare($documento['idanagrafica'])); $result['idiva'] = $iva[0]['idiva'] ?: setting('Iva predefinita'); diff --git a/modules/ordini/row-list.php b/modules/ordini/row-list.php index 07808eb1d..28e8994b9 100755 --- a/modules/ordini/row-list.php +++ b/modules/ordini/row-list.php @@ -347,6 +347,20 @@ if ($totale != $netto_a_pagare) { '; } +// Provvigione +if(!empty($ordine->provvigione)) { + echo ' + + + '.tr('Provvigioni').': + + + '.moneyFormat($ordine->provvigione).' + + + '; +} + echo ' '; if (!$block_edit && sizeof($righe) > 0) { diff --git a/modules/preventivi/actions.php b/modules/preventivi/actions.php index 665b4a5e4..a4f66757a 100755 --- a/modules/preventivi/actions.php +++ b/modules/preventivi/actions.php @@ -225,6 +225,7 @@ switch (post('op')) { $articolo->costo_unitario = post('costo_unitario') ?: 0; $articolo->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $articolo->setSconto(post('sconto'), post('tipo_sconto')); + $articolo->setProvvigione(post('provvigione'), post('tipo_provvigione')); try { $articolo->qta = $qta; @@ -300,6 +301,7 @@ switch (post('op')) { $riga->costo_unitario = post('costo_unitario') ?: 0; $riga->setPrezzoUnitario(post('prezzo_unitario'), post('idiva')); $riga->setSconto(post('sconto'), post('tipo_sconto')); + $riga->setProvvigione(post('provvigione'), post('tipo_provvigione')); $riga->qta = $qta; diff --git a/modules/preventivi/row-add.php b/modules/preventivi/row-add.php index 77d59ff7c..5ebbf5fc6 100755 --- a/modules/preventivi/row-add.php +++ b/modules/preventivi/row-add.php @@ -37,6 +37,7 @@ $options = [ 'idanagrafica' => $documento->idanagrafica, 'dir' => $documento->direzione, 'permetti_movimento_a_zero' => 1, + 'idagente' => $documento->idagente, ], ], ]; @@ -50,8 +51,13 @@ $result = [ 'sconto_unitario' => 0, 'tipo_sconto' => '', 'idiva' => '', + '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/preventivi/row-list.php b/modules/preventivi/row-list.php index aca454ff8..7a63e21e0 100755 --- a/modules/preventivi/row-list.php +++ b/modules/preventivi/row-list.php @@ -313,8 +313,23 @@ echo ' '.moneyFormat($preventivo->spesa).' - + '; +// Provvigione +if(!empty($preventivo->provvigione)) { +echo ' + + + '.tr('Provvigioni').': + + + '.moneyFormat($preventivo->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 ' +
+ + + + + + + +
+
+ {[ "type": "select", "label": "'.tr('Articolo').'", "name": "articolo", "ajax-source": "articoli", "value": "'.$id_parent.'", "disabled": "1" ]} +
+ +
+ {[ "type": "select", "label": "'.tr('Agente').'", "name": "idagente", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, CONCAT(ragione_sociale, IF(citta IS NULL OR citta = \'\', \'\', CONCAT(\' (\', citta, \')\')), IF(deleted_at IS NULL, \'\', \' ('.tr('eliminata').')\')) AS descrizione, idtipointervento_default FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE deleted_at IS NULL AND descrizione=\'Agente\' AND an_anagrafiche.idanagrafica NOT IN (SELECT idagente FROM co_provvigioni) ORDER BY ragione_sociale", "required": 1, "icon-after": "add|'.Modules::get('Anagrafiche')['id'].'|tipoanagrafica=Agente&readonly_tipo=1" ]} +
+ +
+ {[ "type": "number", "label": "'.tr('Provvigione').'", "name": "provvigione", "icon-after": "choice|untprc|UNT" ]} +
+
+ + +
+
+ +
+
+
'; 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 ' +
+ + + + + + +
+
+ {[ "type": "select", "label": "'.tr('Articolo').'", "name": "articolo", "ajax-source": "articoli", "value": "'.$id_parent.'", "disabled": "1" ]} +
+ +
+ {[ "type": "select", "label": "'.tr('Agente').'", "name": "idagente", "value": "$idagente$", "values": "query=SELECT an_anagrafiche.idanagrafica AS id, CONCAT(ragione_sociale, IF(citta IS NULL OR citta = \'\', \'\', CONCAT(\' (\', citta, \')\')), IF(deleted_at IS NULL, \'\', \' ('.tr('eliminata').')\')) AS descrizione, idtipointervento_default FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE deleted_at IS NULL AND descrizione=\'Agente\' AND an_anagrafiche.idanagrafica NOT IN (SELECT idagente FROM co_provvigioni WHERE idagente!='.prepare($record['idagente']).') ORDER BY ragione_sociale", "required": 1, "icon-after": "add|'.Modules::get('Anagrafiche')['id'].'|tipoanagrafica=Agente&readonly_tipo=1" ]} +
+ +
+ {[ "type": "number", "label": "'.tr('Provvigione').'", "name": "provvigione", "value": "'.$record['provvigione'].'", "icon-after": "choice|untprc|'.$record['tipo_provvigione'].'" ]} +
+
+ + +
+
+ + '.tr('Elimina').' + + + +
+
+
'; 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