From bdd52f5bfc2a6853fc3c33bb1088162f5578de30 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Thu, 11 Apr 2019 14:52:03 -0700 Subject: [PATCH 1/7] Fix #553 --- modules/contratti/init.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/contratti/init.php b/modules/contratti/init.php index de8c94780..1238b6b4a 100644 --- a/modules/contratti/init.php +++ b/modules/contratti/init.php @@ -2,7 +2,11 @@ include_once __DIR__.'/../../core.php'; +use Modules\Contratti\Contratto; + if (isset($id_record)) { + $contratto = Contratto::find($id_record); + $record = $dbo->fetchOne('SELECT *, (SELECT tipo FROM an_anagrafiche WHERE idanagrafica = co_contratti.idanagrafica) AS tipo_anagrafica, (SELECT is_fatturabile FROM co_staticontratti WHERE id=idstato) AS is_fatturabile, From c7076f3557e1331035de52f60ed466f29ba7d2d0 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Thu, 11 Apr 2019 15:06:55 -0700 Subject: [PATCH 2/7] Fix #551 --- include/src/Components/Discount.php | 14 +++++++++++++- include/src/Components/Row.php | 2 +- modules/interventi/modutil.php | 9 --------- modules/preventivi/actions.php | 1 - plugins/exportFE/src/FatturaElettronica.php | 16 ---------------- update/2_4_9.php | 1 + update/2_4_9.sql | 19 ++++++++++++------- 7 files changed, 27 insertions(+), 35 deletions(-) diff --git a/include/src/Components/Discount.php b/include/src/Components/Discount.php index 0890d4a7b..89fc85eb1 100644 --- a/include/src/Components/Discount.php +++ b/include/src/Components/Discount.php @@ -2,10 +2,22 @@ namespace Common\Components; +use Common\Document; use Illuminate\Database\Eloquent\Builder; abstract class Discount extends Row { + protected $guarded = []; + + public static function build(Document $document, $bypass = false) + { + $model = parent::build($document, true); + + $model->is_sconto = 1; + + return $model; + } + public function getIvaAttribute() { return $this->attributes['iva']; @@ -31,7 +43,7 @@ abstract class Discount extends Row parent::boot(true); static::addGlobalScope('discounts', function (Builder $builder) { - $builder->where('subtotale', '=', 0); + $builder->where('is_sconto', '=', 1); }); } } diff --git a/include/src/Components/Row.php b/include/src/Components/Row.php index d8aba110f..c162bd5b8 100644 --- a/include/src/Components/Row.php +++ b/include/src/Components/Row.php @@ -179,7 +179,7 @@ abstract class Row extends Description }); static::addGlobalScope('not_discounts', function (Builder $builder) { - $builder->where('subtotale', '!=', 0); + $builder->where('is_sconto', '=', 0); }); } } diff --git a/modules/interventi/modutil.php b/modules/interventi/modutil.php index a562bb5b6..a2ad3ae07 100644 --- a/modules/interventi/modutil.php +++ b/modules/interventi/modutil.php @@ -324,15 +324,6 @@ function get_costi_intervento($id_intervento) $result['altro_scontato'] + ($result['altro_scontato'] * $result['altro_iva'] / 100), ]); - // Calcolo dello sconto incondizionato - $sconto = $dbo->fetchArray('SELECT sconto_globale, tipo_sconto_globale FROM in_interventi WHERE id='.prepare($id_intervento))[0]; - $result['sconto_globale'] = ($sconto['tipo_sconto_globale'] == 'PRC') ? $result['totale_scontato'] * $sconto['sconto_globale'] / 100 : $sconto['sconto_globale']; - $result['sconto_globale'] = round($result['sconto_globale'], $decimals); - - $result['totale_scontato'] = sum($result['totale_scontato'], -$result['sconto_globale']); - $result['iva_totale'] = sum($result['iva_totale'], -($result['sconto_globale'] * $rs_iva[0]['percentuale'] / 100)); - $result['totale'] = sum($result['totale'], -($result['sconto_globale'] + ($result['sconto_globale'] * $rs_iva[0]['percentuale'] / 100))); - return $result; } diff --git a/modules/preventivi/actions.php b/modules/preventivi/actions.php index 910c13320..2d595b759 100644 --- a/modules/preventivi/actions.php +++ b/modules/preventivi/actions.php @@ -371,7 +371,6 @@ switch (post('op')) { 'sconto' => $rs_righe_preventivo[$i]['sconto'], 'sconto_unitario' => $rs_righe_preventivo[$i]['sconto_unitario'], 'tipo_sconto' => $rs_righe_preventivo[$i]['tipo_sconto'], - 'sconto_globale' => $rs_righe_preventivo[$i]['sconto_globale'], 'um' => $rs_righe_preventivo[$i]['um'], 'qta' => $rs_righe_preventivo[$i]['qta'], 'order' => $rs_righe_preventivo[$i]['order'], diff --git a/plugins/exportFE/src/FatturaElettronica.php b/plugins/exportFE/src/FatturaElettronica.php index 904ed0c73..c71073e31 100644 --- a/plugins/exportFE/src/FatturaElettronica.php +++ b/plugins/exportFE/src/FatturaElettronica.php @@ -689,22 +689,6 @@ class FatturaElettronica // Sconto globale (2.1.1.8) // Disabilitazione per aggiornamento sconti - /* - $documento['sconto_globale'] = floatval($documento['sconto_globale']); - if (!empty($documento['sconto_globale'])) { - $sconto = [ - 'Tipo' => $documento['sconto_globale'] > 0 ? 'SC' : 'MG', - ]; - - if ($documento['tipo_sconto_globale'] == 'PRC') { - $sconto['Percentuale'] = $documento['sconto_globale']; - } else { - $sconto['Importo'] = $documento['sconto_globale']; - } - - $result['ScontoMaggiorazione'] = $sconto; - } - */ // Importo Totale Documento (2.1.1.9) // Valorizzare l’importo complessivo lordo della fattura (onnicomprensivo di Iva, bollo, contributi previdenziali, ecc…) diff --git a/update/2_4_9.php b/update/2_4_9.php index 649aa07a4..05fd9ab11 100644 --- a/update/2_4_9.php +++ b/update/2_4_9.php @@ -61,6 +61,7 @@ foreach ($interventi as $intervento) { 'sconto' => $sconto_globale, 'sconto_unitario' => $sconto_globale, 'tipo_sconto' => 'UNT', + 'is_sconto' => 1, 'idiva' => $id_iva['id'], 'desc_iva' => $iva['descrizione'], 'iva' => $valore_iva, diff --git a/update/2_4_9.sql b/update/2_4_9.sql index 255b92d9d..35bd45d6e 100644 --- a/update/2_4_9.sql +++ b/update/2_4_9.sql @@ -117,24 +117,29 @@ ALTER TABLE `co_contratti` DROP `sconto_globale`, DROP `tipo_sconto_globale`; ALTER TABLE `or_ordini` DROP `sconto_globale`, DROP `tipo_sconto_globale`; ALTER TABLE `dt_ddt` DROP `sconto_globale`, DROP `tipo_sconto_globale`; -UPDATE `co_righe_documenti` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT' WHERE `sconto_globale` != 0; +ALTER TABLE `co_righe_documenti` ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`; +UPDATE `co_righe_documenti` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT', `is_sconto` = 1 WHERE `sconto_globale` != 0; ALTER TABLE `co_righe_documenti` DROP `sconto_globale`; -UPDATE `co_righe_preventivi` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT' WHERE `sconto_globale` != 0; +ALTER TABLE `co_righe_preventivi` ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`; +UPDATE `co_righe_preventivi` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT', `is_sconto` = 1 WHERE `sconto_globale` != 0; ALTER TABLE `co_righe_preventivi` DROP `sconto_globale`; -UPDATE `co_righe_contratti` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT' WHERE `sconto_globale` != 0; +ALTER TABLE `co_righe_contratti` ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`; +UPDATE `co_righe_contratti` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT', `is_sconto` = 1 WHERE `sconto_globale` != 0; ALTER TABLE `co_righe_contratti` DROP `sconto_globale`; -UPDATE `or_righe_ordini` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT' WHERE `sconto_globale` != 0; +ALTER TABLE `or_righe_ordini` ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`; +UPDATE `or_righe_ordini` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT', `is_sconto` = 1 WHERE `sconto_globale` != 0; ALTER TABLE `or_righe_ordini` DROP `sconto_globale`; -UPDATE `dt_righe_ddt` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT' WHERE `sconto_globale` != 0; +ALTER TABLE `dt_righe_ddt` ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`; +UPDATE `dt_righe_ddt` SET `sconto` = `sconto_globale`, `sconto_unitario` = `sconto_globale`, `tipo_sconto` = 'UNT', `is_sconto` = 1 WHERE `sconto_globale` != 0; ALTER TABLE `dt_righe_ddt` DROP `sconto_globale`; -- Fix per la tabella in_righe_interventi ALTER TABLE `in_righe_interventi` ADD `is_descrizione` TINYINT(1) NOT NULL AFTER `idintervento`, ADD `idarticolo` INT(11) AFTER `idintervento`, ADD FOREIGN KEY (`idarticolo`) REFERENCES `mg_articoli`(`id`); -ALTER TABLE `mg_articoli_interventi` ADD `is_descrizione` TINYINT(1) NOT NULL AFTER `idintervento`; +ALTER TABLE `mg_articoli_interventi` ADD `is_descrizione` TINYINT(1) NOT NULL AFTER `idintervento`, ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`; -- Rimozione campi inutilizzati co_ritenutaacconto ALTER TABLE `co_ritenutaacconto` DROP `esente`, DROP `indetraibile`; @@ -144,4 +149,4 @@ UPDATE `co_ritenutaacconto` SET `percentuale_imponibile` = 100; UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS('' '', REPLACE(REPLACE(REPLACE(FORMAT((SELECT ABS(SUM(da_pagare-pagato))), 2), '','', ''#''), ''.'', '',''),''#'', ''.''), ''€'') AS dato FROM (co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_tipidocumento.dir=''uscita'' AND co_documenti.idstatodocumento!=1 |segment| AND 1=1' WHERE `zz_widgets`.`name` = 'Debiti verso fornitori'; -- Aggiunta idsede anche preventivi (completamento 2.4.1) -ALTER TABLE `co_preventivi` ADD `idsede` INT NOT NULL AFTER `idanagrafica`; \ No newline at end of file +ALTER TABLE `co_preventivi` ADD `idsede` INT NOT NULL AFTER `idanagrafica`; From b3f91d4a3628f76004a7c40db1726b3a0f1b161a Mon Sep 17 00:00:00 2001 From: Matteo Baccarin Date: Thu, 11 Apr 2019 16:04:08 +0200 Subject: [PATCH 3/7] Auto stash before merge of "master" and "origin/master" --- modules/fatture/bulk.php | 14 +++ modules/fatture/buttons.php | 8 ++ modules/fatture/init.php | 1 + modules/fatture/modutil.php | 124 ++++++++++++++++++-------- modules/fatture/variables.php | 15 ++++ modules/modelli_primanota/actions.php | 18 ++-- modules/modelli_primanota/add.php | 38 +++++++- modules/modelli_primanota/edit.php | 53 ++++++++++- modules/modelli_primanota/init.php | 4 +- modules/partitario/ajax/select.php | 53 +++++++++++ modules/primanota/actions.php | 14 ++- modules/primanota/add.php | 83 +++++++++++++---- modules/primanota/ajax/complete.php | 2 +- modules/scadenzario/edit.php | 6 +- update/2_4_9.sql | 28 ++++++ 15 files changed, 383 insertions(+), 78 deletions(-) diff --git a/modules/fatture/bulk.php b/modules/fatture/bulk.php index fc81e3fd3..db602d068 100644 --- a/modules/fatture/bulk.php +++ b/modules/fatture/bulk.php @@ -139,12 +139,26 @@ switch (post('op')) { } } break; + + case 'registra-contabile': + + break; } $bulk = [ 'delete-bulk' => tr('Elimina selezionati'), ]; +$bulk['registra-contabile'] = [ + 'text' => tr('Registra contabile pagamento'), + 'data' => [ + 'msg' => tr('Vuoi aggiungere un movimento contabile per le fatture selezionate?'), + 'button' => tr('Procedi'), + 'class' => 'btn btn-lg btn-warning', + 'blank' => true, + ], +]; + if ($module->name == 'Fatture di vendita') { $bulk['export-bulk'] = [ 'text' => tr('Esporta stampe'), diff --git a/modules/fatture/buttons.php b/modules/fatture/buttons.php index 84060cf31..9d4dda066 100644 --- a/modules/fatture/buttons.php +++ b/modules/fatture/buttons.php @@ -47,6 +47,14 @@ if (empty($record['is_fiscale'])) { + + fetchNum('SELECT id FROM co_movimenti WHERE iddocumento='.prepare($id_record).' AND primanota=1'); diff --git a/modules/fatture/init.php b/modules/fatture/init.php index f7e08a293..a1cc7d11c 100644 --- a/modules/fatture/init.php +++ b/modules/fatture/init.php @@ -29,6 +29,7 @@ if (isset($id_record)) { LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id + LEFT JOIN co_pagamenti ON co_documenti.idpagamento=co_pagamenti.id WHERE co_tipidocumento.dir = '.prepare($dir).' AND co_documenti.id='.prepare($id_record)); $note_accredito = $dbo->fetchArray("SELECT co_documenti.id, IF(numero_esterno != '', numero_esterno, numero) AS numero, data FROM co_documenti JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE reversed = 1 AND ref_documento=".prepare($id_record)); diff --git a/modules/fatture/modutil.php b/modules/fatture/modutil.php index dc78bbe49..da738c607 100755 --- a/modules/fatture/modutil.php +++ b/modules/fatture/modutil.php @@ -122,52 +122,100 @@ function aggiorna_scadenziario($iddocumento, $totale_pagato, $data_pagamento) { $dbo = database(); - // Lettura righe scadenziario - $query = "SELECT * FROM co_scadenziario WHERE iddocumento='$iddocumento' AND ABS(pagato) < ABS(da_pagare) ORDER BY scadenza ASC"; - $rs = $dbo->fetchArray($query); - $netto_fattura = get_netto_fattura($iddocumento); - $rimanente = $netto_fattura; - $rimanente_da_pagare = abs($rs[0]['pagato']) + $totale_pagato; + if($totale_pagato>0){ + // Lettura righe scadenziario + $query = "SELECT * FROM co_scadenziario WHERE iddocumento='$iddocumento' AND ABS(pagato) < ABS(da_pagare) ORDER BY scadenza ASC"; + $rs = $dbo->fetchArray($query); + $rimanente_da_pagare = abs($rs[0]['pagato']) + $totale_pagato; - // Verifico se la fattura è di acquisto o di vendita per scegliere che segno mettere nel totale - $query2 = 'SELECT dir FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento); - $rs2 = $dbo->fetchArray($query2); - $dir = $rs2[0]['dir']; + // Verifico se la fattura è di acquisto o di vendita per scegliere che segno mettere nel totale + $query2 = 'SELECT dir FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento); + $rs2 = $dbo->fetchArray($query2); + $dir = $rs2[0]['dir']; - // Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato. - // Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive - for ($i = 0; $i < sizeof($rs); ++$i) { - if ($rimanente_da_pagare != 0) { - // ...riempio il pagato della rata con il totale della rata stessa se ho ricevuto un pagamento superiore alla rata stessa - if (abs($rimanente_da_pagare) >= abs($rs[$i]['da_pagare'])) { - $pagato = abs($rs[$i]['da_pagare']); - $rimanente_da_pagare -= abs($rs[$i]['da_pagare']); - } else { - // Se si inserisce una somma maggiore al dovuto, tengo valido il rimanente per saldare il tutto... - if (abs($rimanente_da_pagare) > abs($rs[$i]['da_pagare'])) { + // Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato. + // Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive + for ($i = 0; $i < sizeof($rs); ++$i) { + if ($rimanente_da_pagare > 0) { + // ...riempio il pagato della rata con il totale della rata stessa se ho ricevuto un pagamento superiore alla rata stessa + if (abs($rimanente_da_pagare) >= abs($rs[$i]['da_pagare'])) { $pagato = abs($rs[$i]['da_pagare']); $rimanente_da_pagare -= abs($rs[$i]['da_pagare']); - } - - // ...altrimenti aggiungo l'importo pagato - else { - $pagato = abs($rimanente_da_pagare); - $rimanente_da_pagare -= abs($rimanente_da_pagare); - } - } - - if ($dir == 'uscita') { - $rimanente_da_pagare = -$rimanente_da_pagare; - } - - if ($pagato > 0) { - if ($dir == 'uscita') { - $dbo->query('UPDATE co_scadenziario SET pagato='.prepare(-$pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id'])); } else { - $dbo->query('UPDATE co_scadenziario SET pagato='.prepare($pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id'])); + // Se si inserisce una somma maggiore al dovuto, tengo valido il rimanente per saldare il tutto... + if (abs($rimanente_da_pagare) > abs($rs[$i]['da_pagare'])) { + $pagato = abs($rs[$i]['da_pagare']); + $rimanente_da_pagare -= abs($rs[$i]['da_pagare']); + } + + // ...altrimenti aggiungo l'importo pagato + else { + $pagato = abs($rimanente_da_pagare); + $rimanente_da_pagare -= abs($rimanente_da_pagare); + } + } + + if ($dir == 'uscita') { + $rimanente_da_pagare = -$rimanente_da_pagare; + } + + if ($pagato > 0) { + if ($dir == 'uscita') { + $dbo->query('UPDATE co_scadenziario SET pagato='.prepare(-$pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id'])); + } else { + $dbo->query('UPDATE co_scadenziario SET pagato='.prepare($pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id'])); + } } } } + }else{ + + // Lettura righe scadenziario + $query = "SELECT * FROM co_scadenziario WHERE iddocumento='$iddocumento' AND ABS(pagato)>0 ORDER BY scadenza DESC"; + $rs = $dbo->fetchArray($query); + $residuo_pagato = abs($rs[0]['pagato']) + $totale_pagato; + + // Verifico se la fattura è di acquisto o di vendita per scegliere che segno mettere nel totale + $query2 = 'SELECT dir FROM co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento); + $rs2 = $dbo->fetchArray($query2); + $dir = $rs2[0]['dir']; + + // Ciclo tra le rate dei pagamenti per inserire su `pagato` l'importo effettivamente pagato. + // Nel caso il pagamento superi la rata, devo distribuirlo sulle rate successive + for ($i = 0; $i < sizeof($rs); ++$i) { + if ($residuo_pagato >= 0) { + // ...riempio il pagato della rata con il totale della rata stessa se ho ricevuto un pagamento superiore alla rata stessa + if (abs($residuo_pagato) <= abs($rs[$i]['pagato'])) { + $pagato = 0; + $residuo_pagato -= abs($rs[$i]['pagato']); + } else { + // Se si inserisce una somma maggiore al dovuto, tengo valido il rimanente per saldare il tutto... + if (abs($residuo_pagato) < abs($rs[$i]['pagato'])) { + $pagato = 0; + $residuo_pagato -= abs($rs[$i]['pagato']); + } + + // ...altrimenti aggiungo l'importo pagato + else { + $pagato = abs($residuo_pagato); + $residuo_pagato -= abs($residuo_pagato); + } + } + + if ($dir == 'uscita') { + $residuo_pagato = -$residuo_pagato; + } + + if ($pagato >= 0) { + if ($dir == 'uscita') { + $dbo->query('UPDATE co_scadenziario SET pagato='.prepare(-$pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id'])); + } else { + $dbo->query('UPDATE co_scadenziario SET pagato='.prepare($pagato).', data_pagamento='.prepare($data_pagamento).' WHERE id='.prepare($rs[$i]['id'])); + } + } + } + + } } } diff --git a/modules/fatture/variables.php b/modules/fatture/variables.php index 0b2376517..4ab51bd80 100644 --- a/modules/fatture/variables.php +++ b/modules/fatture/variables.php @@ -2,6 +2,8 @@ $r = $dbo->fetchOne('SELECT co_documenti.*, an_anagrafiche.email, + an_anagrafiche.idconto_cliente, + an_anagrafiche.idconto_fornitore, an_anagrafiche.pec, an_anagrafiche.ragione_sociale, (SELECT pec FROM zz_smtps WHERE zz_smtps.id='.prepare($template['id_smtp']).') AS is_pec @@ -9,6 +11,17 @@ FROM co_documenti INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anag $logo_azienda = str_replace(DOCROOT, ROOTDIR, App::filepath('templates/base|custom|/logo_azienda.jpg')); +//cliente +if($r['idconto_cliente']!=''){ + $conto = $r['idconto_cliente']; + $conto_descrizione = $dbo->fetchOne('SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) AS descrizione FROM co_pianodeiconti3 WHERE id='.prepare($conto))['descrizione']; +} +//Fornitore +else if($r['idconto_fornitore']!=''){ + $conto = $r['idconto_fornitore']; + $conto_descrizione = $dbo->fetchOne('SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) AS descrizione FROM co_pianodeiconti3 WHERE id='.prepare($conto))['descrizione']; +} + // Variabili da sostituire return [ 'email' => $r['is_pec'] ? $r['pec'] : $r['email'], @@ -18,4 +31,6 @@ return [ 'note' => $r['note'], 'data' => Translator::dateToLocale($r['data']), 'logo_azienda' => !empty($logo_azienda) ? '' : '', + 'conto' => $conto, + 'conto_descrizione' => $conto_descrizione, ]; diff --git a/modules/modelli_primanota/actions.php b/modules/modelli_primanota/actions.php index 02839ce95..8bd0ea3fa 100644 --- a/modules/modelli_primanota/actions.php +++ b/modules/modelli_primanota/actions.php @@ -6,12 +6,15 @@ switch (post('op')) { case 'add': $idmastrino = get_new_idmastrino('co_movimenti_modelli'); $descrizione = post('descrizione'); + $nome = post('nome'); for ($i = 0; $i < sizeof(post('idconto')); ++$i) { $idconto = post('idconto')[$i]; - $query = 'INSERT INTO co_movimenti_modelli(idmastrino, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($descrizione).', '.prepare($idconto).')'; - if ($dbo->query($query)) { - $id_record = $dbo->lastInsertedID(); + if(!empty($idconto)){ + $query = 'INSERT INTO co_movimenti_modelli(idmastrino, nome, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($nome).', '.prepare($descrizione).', '.prepare($idconto).')'; + if ($dbo->query($query)) { + $id_record = $idmastrino; + } } } @@ -20,15 +23,18 @@ switch (post('op')) { case 'editriga': $idmastrino = post('idmastrino'); $descrizione = post('descrizione'); + $nome = post('nome'); // Eliminazione prima nota $dbo->query('DELETE FROM co_movimenti_modelli WHERE idmastrino='.prepare($idmastrino)); for ($i = 0; $i < sizeof(post('idconto')); ++$i) { $idconto = post('idconto')[$i]; - $query = 'INSERT INTO co_movimenti_modelli(idmastrino, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($descrizione).', '.prepare($idconto).')'; - if ($dbo->query($query)) { - $id_record = $dbo->lastInsertedID(); + if(!empty($idconto)){ + $query = 'INSERT INTO co_movimenti_modelli(idmastrino, nome, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($nome).', '.prepare($descrizione).', '.prepare($idconto).')'; + if ($dbo->query($query)) { + $id_record = $idmastrino; + } } } diff --git a/modules/modelli_primanota/add.php b/modules/modelli_primanota/add.php index de1e220c4..bb180720e 100644 --- a/modules/modelli_primanota/add.php +++ b/modules/modelli_primanota/add.php @@ -7,8 +7,11 @@ include_once __DIR__.'/../../core.php';
-
- {[ "type": "text", "label": "", "name": "descrizione", "required": 1 ]} +
+ {[ "type": "text", "label": "", "name": "nome", "required": 1 ]} +
+
+ {[ "type": "text", "label": "", "name": "descrizione", "required": 1 ]}
@@ -40,7 +43,36 @@ include_once __DIR__.'/../../core.php'; echo ' '; - ?> + + // Variabili utilizzabili + $variables = include Modules::filepath(Modules::get("Fatture di vendita")['id'], 'variables.php'); + + echo ' + +
+
'; + + if (!empty($variables)) { + echo ' +

'.tr("Puoi utilizzare le seguenti sequenze di testo all'interno del campo causale, verranno sostituite in fase generazione prima nota dalla fattura.").':

+
    '; + + foreach ($variables as $variable => $value) { + echo ' +
  • {'.$variable.'}
  • '; + } + + echo ' +
'; + } else { + echo ' +

'.tr('Non sono state definite variabili da utilizzare nel template').'.

'; + } + + echo ' +
+
'; +?>
diff --git a/modules/modelli_primanota/edit.php b/modules/modelli_primanota/edit.php index b364dc12d..273f8373f 100644 --- a/modules/modelli_primanota/edit.php +++ b/modules/modelli_primanota/edit.php @@ -11,8 +11,11 @@ include_once __DIR__.'/../../core.php';
-
- {[ "type": "text", "label": "", "name": "descrizione", "required": 1, "value": "$descrizione$" ]} +
+ {[ "type": "text", "label": "", "name": "nome", "required": 1, "value": "$nome$" ]} +
+
+ {[ "type": "text", "label": "", "name": "descrizione", "required": 1, "value": "$descrizione$" ]}
@@ -52,7 +55,7 @@ for ($i = 0; $i < 10; ++$i) { echo ' - {[ "type": "select", "name": "idconto['.$i.']", "value": "'.$rs[$i]['idconto'].'", "ajax-source": "conti", "required": "'.$required.'" ]} + {[ "type": "select", "name": "idconto['.$i.']", "value": "'.$rs[$i]['idconto'].'", "ajax-source": "conti-modelliprimanota", "required": "'.$required.'" ]} '; } @@ -80,6 +83,50 @@ echo ' + +
+
'; + +if (!empty($variables)) { + echo ' +

'.tr("Puoi utilizzare le seguenti sequenze di testo all'interno del campo causale, verranno sostituite in fase generazione prima nota dalla fattura.").':

+
    '; + + foreach ($variables as $variable => $value) { + echo ' +
  • {'.$variable.'}
  • '; + } + + echo ' +
'; +} else { + echo ' +

'.tr('Non sono state definite variabili da utilizzare nel template').'.

'; +} + +echo ' +
+
'; +?> + + + + + diff --git a/modules/modelli_primanota/init.php b/modules/modelli_primanota/init.php index eb2888a22..8903f4738 100644 --- a/modules/modelli_primanota/init.php +++ b/modules/modelli_primanota/init.php @@ -1,7 +1,5 @@ fetchOne('SELECT * FROM co_movimenti_modelli WHERE id='.prepare($id_record)); + $record = $dbo->fetchOne('SELECT * FROM co_movimenti_modelli WHERE idmastrino='.prepare($id_record)); } diff --git a/modules/partitario/ajax/select.php b/modules/partitario/ajax/select.php index 227e61b30..874040a3a 100644 --- a/modules/partitario/ajax/select.php +++ b/modules/partitario/ajax/select.php @@ -84,4 +84,57 @@ switch ($resource) { } break; + + case 'conti-modelliprimanota': + $query = 'SELECT co_pianodeiconti2.* FROM co_pianodeiconti2 LEFT JOIN co_pianodeiconti3 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id |where| GROUP BY co_pianodeiconti2.id'; + + if ($search != '') { + $wh = 'WHERE (co_pianodeiconti3.descrizione LIKE '.prepare('%'.$search.'%')." OR CONCAT( co_pianodeiconti2.numero, '.', co_pianodeiconti3.numero ) LIKE ".prepare('%'.$search.'%').')'; + } else { + $wh = ''; + } + $query = str_replace('|where|', $wh, $query); + + $rs = $dbo->fetchArray($query); + foreach ($rs as $r) { + $results[] = ['text' => $r['numero'].' '.$r['descrizione'], 'children' => []]; + + $subquery = 'SELECT co_pianodeiconti3.* FROM co_pianodeiconti3 INNER JOIN co_pianodeiconti2 ON co_pianodeiconti3.idpianodeiconti2=co_pianodeiconti2.id |where|'; + + $where = []; + $filter = []; + $search_fields = []; + + foreach ($elements as $element) { + $filter[] = 'co_pianodeiconti3.id='.prepare($element); + } + if (!empty($filter)) { + $where[] = '('.implode(' OR ', $filter).')'; + } + + $where[] = 'idpianodeiconti2='.prepare($r['id']); + + if (!empty($search)) { + $search_fields[] = '(co_pianodeiconti3.descrizione LIKE '.prepare('%'.$search.'%')." OR CONCAT(co_pianodeiconti2.numero, '.', co_pianodeiconti3.numero) LIKE ".prepare('%'.$search.'%').')'; + } + if (!empty($search_fields)) { + $where[] = '('.implode(' OR ', $search_fields).')'; + } + + $wh = ''; + if (count($where) != 0) { + $wh = 'WHERE '.implode(' AND ', $where); + } + $subquery = str_replace('|where|', $wh, $subquery); + + $rs2 = $dbo->fetchArray($subquery); + foreach ($rs2 as $r2) { + $results[count($results) - 1]['children'][] = ['id' => $r2['id'], 'text' => $r['numero'].'.'.$r2['numero'].' '.$r2['descrizione']]; + } + + $results[] = ['text' => 'Conto cliente/fornitore fattura', 'children' => []]; + $results[count($results) - 1]['children'][] = ['id' => '-1', 'text' => '{Conto cliente/fornitore fattura}']; + } + + break; } diff --git a/modules/primanota/actions.php b/modules/primanota/actions.php index 3ae5c2e3f..626040ba9 100644 --- a/modules/primanota/actions.php +++ b/modules/primanota/actions.php @@ -9,6 +9,7 @@ switch (post('op')) { $data = post('data'); $idmastrino = get_new_idmastrino(); $descrizione = post('descrizione'); + $insoluto = post('insoluto'); // Lettura info fattura $query = 'SELECT *, co_documenti.note, co_documenti.idpagamento, co_documenti.id AS iddocumento, co_statidocumento.descrizione AS `stato`, co_tipidocumento.descrizione AS `descrizione_tipodoc` FROM ((co_documenti LEFT OUTER JOIN co_statidocumento ON co_documenti.idstatodocumento=co_statidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica) INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id WHERE co_documenti.id='.prepare($iddocumento); @@ -42,9 +43,12 @@ switch (post('op')) { } } - // Inserisco nello scadenziario il totale pagato - if ($totale_pagato != 0) { + if ($totale_pagato != 0 && empty($insoluto)) { + // Inserisco nello scadenziario il totale pagato aggiorna_scadenziario($iddocumento, abs($totale_pagato), $data); + }else if(!empty($insoluto)){ + //Rimuovo dallo scadenzario l'insoluto + aggiorna_scadenziario($iddocumento, -abs($totale_pagato), $data); } // Se non va a buon fine qualcosa elimino il mastrino per non lasciare incongruenze nel db @@ -61,8 +65,10 @@ switch (post('op')) { // Aggiorno lo stato della fattura if (abs($rs[0]['tot_pagato']) == abs($rs[0]['tot_da_pagare'])) { $dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Pagato') WHERE id=".prepare($iddocumento)); - } else { + } else if(abs($rs[0]['tot_pagato']) != abs($rs[0]['tot_da_pagare']) && abs($rs[0]['tot_pagato'])!='0'){ $dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Parzialmente pagato') WHERE id=".prepare($iddocumento)); + }else{ + $dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Emessa') WHERE id=".prepare($iddocumento)); } // Aggiorno lo stato dei preventivi collegati alla fattura se ce ne sono @@ -101,7 +107,7 @@ switch (post('op')) { for ($i = 0; $i < sizeof(post('idconto')); ++$i) { $idconto = post('idconto')[$i]; - $query = 'INSERT INTO co_movimenti_modelli(idmastrino, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($descrizione).', '.prepare($idconto).')'; + $query = 'INSERT INTO co_movimenti_modelli(idmastrino, nome, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($descrizione).', '.prepare($descrizione).', '.prepare($idconto).')'; $dbo->query($query); } } diff --git a/modules/primanota/add.php b/modules/primanota/add.php index e9810794a..511875404 100644 --- a/modules/primanota/add.php +++ b/modules/primanota/add.php @@ -5,7 +5,7 @@ include_once __DIR__.'/../../core.php'; ?>
- + @@ -13,6 +13,15 @@ include_once __DIR__.'/../../core.php'; $idconto = get('idconto'); $iddocumento = get('iddocumento'); $dir = get('dir'); + $insoluto = get('insoluto'); + + if(!empty($insoluto)){ + echo ''; + } + + // Lettura delle variabili nei singoli moduli + $id_record = $iddocumento; + $variables = include Modules::filepath(Modules::get('Fatture di vendita')['id'], 'variables.php'); if (!empty($iddocumento)) { // Lettura numero e tipo di documento @@ -33,7 +42,14 @@ include_once __DIR__.'/../../core.php'; $tipo_doc = 'fattura'; } - $descrizione = tr('Pag. _DOC_ num. _NUM_ del _DATE_ (_NAME_)', [ + if(!empty($insoluto)){ + $operation = 'Registrazione insoluto'; + }else{ + $operation = 'Pag.'; + } + + $descrizione = tr('_OP_ _DOC_ num. _NUM_ del _DATE_ (_NAME_)', [ + '_OP_' => $operation, '_DOC_' => $tipo_doc, '_NUM_' => $numero_doc, '_DATE_' => Translator::dateToLocale($rs[0]['data']), @@ -74,7 +90,11 @@ include_once __DIR__.'/../../core.php'; $query = 'SELECT SUM(pagato) AS tot_pagato, SUM(da_pagare) AS tot_da_pagare FROM co_scadenziario GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento); $rs = $dbo->fetchArray($query); - $importo_conto_aziendale = abs($rs[0]['tot_da_pagare']) - abs($rs[0]['tot_pagato']); + if(!empty($insoluto)){ + $importo_conto_aziendale = abs($rs[0]['tot_da_pagare']); + }else{ + $importo_conto_aziendale = abs($rs[0]['tot_da_pagare']) - abs($rs[0]['tot_pagato']); + } $totale_dare = $importo_conto_aziendale; } @@ -124,7 +144,7 @@ include_once __DIR__.'/../../core.php';
- {[ "type": "select", "label": "", "id": "modello_primanota", "values": "query=SELECT idmastrino AS id, descrizione FROM co_movimenti_modelli GROUP BY idmastrino" ]} + {[ "type": "select", "label": "", "id": "modello_primanota", "values": "query=SELECT idmastrino AS id, nome AS descrizione, descrizione as causale FROM co_movimenti_modelli GROUP BY idmastrino" ]}
@@ -195,7 +215,7 @@ include_once __DIR__.'/../../core.php'; } // Se è una nota di credito, inverto i valori - if ($nota_credito) { + if ($nota_credito || $insoluto) { $tmp = $value_dare; $value_dare = $value_avere; $value_avere = $tmp; @@ -350,26 +370,53 @@ include_once __DIR__.'/../../core.php'; $('#bs-popup #idmastrino').val(0); } - var idmastrino = $(this).val(); + var idmastrino = $(this).val(); + var variables = ; + + var replaced = 0; if(idmastrino!=''){ - var causale = $(this).find('option:selected').text(); + var causale = $(this).find('option:selected').data('causale'); + + if($('#iddocumento').val()!=''){ + for (i in variables){ + if(causale.includes('{'+i+'}')){ + replaced++; + causale = causale.replace('{'+i+'}', variables[i]); + } + } + }else{ + for (i in variables){ + causale = causale.replace('{'+i+'}', '_'); + } + } - //aggiornava erroneamente anche la causale ed eventuale numero di fattura e data - - $('#bs-popup #desc').val(causale); - + //aggiornava erroneamente anche la causale ed eventuale numero di fattura e data + if(replaced>0 || $('#iddocumento').val()==''){ + $('#bs-popup #desc').val(causale); + } $.get('/ajax_complete.php?op=get_conti&idmastrino='+idmastrino, function(data){ var conti = data.split(','); for(i=0;i").val(conto[0]).text(conto[1]); - $('#bs-popup #conto'+i).selectReset(); - $('#bs-popup #conto'+i).append(option).trigger('change'); - } + var conto = conti[i].split(';'); + //Sostituzione conto cliente/fornitore + if(conto[0]==-1){ + if($('#iddocumento').val()!=''){ + var option = $("").val(variables['conto']).text(variables['conto_descrizione']); + $('#bs-popup #conto'+i).selectReset(); + $('#bs-popup #conto'+i).append(option).trigger('change'); + } + }else{ + var option = $("").val(conto[0]).text(conto[1]); + $('#bs-popup #conto'+i).selectReset(); + $('#bs-popup #conto'+i).append(option).trigger('change'); + } + } + for(i=9;i>=conti.length;i--){ + $('#bs-popup #conto'+i).selectReset(); + console.log('#bs-popup #conto'+i); + } }); } }); diff --git a/modules/primanota/ajax/complete.php b/modules/primanota/ajax/complete.php index 97353c606..98a1f75a4 100644 --- a/modules/primanota/ajax/complete.php +++ b/modules/primanota/ajax/complete.php @@ -6,7 +6,7 @@ switch ($resource) { case 'get_conti': $idmastrino = get('idmastrino'); $conti = []; - $rs_conti = $dbo->fetchArray('SELECT *, (SELECT descrizione FROM co_pianodeiconti3 WHERE id=co_movimenti_modelli.idconto) AS descrizione_conto FROM co_movimenti_modelli WHERE idmastrino='.prepare($idmastrino).' GROUP BY id'); + $rs_conti = $dbo->fetchArray('SELECT *, (SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) FROM co_pianodeiconti3 WHERE id=co_movimenti_modelli.idconto) AS descrizione_conto FROM co_movimenti_modelli WHERE idmastrino='.prepare($idmastrino).' GROUP BY id ORDER BY id'); for ($i = 0; $i < sizeof($rs_conti); ++$i) { $conti[$i] = $rs_conti[$i]['idconto'].';'.$rs_conti[$i]['descrizione_conto']; diff --git a/modules/scadenzario/edit.php b/modules/scadenzario/edit.php index bce440c54..59a8c3794 100644 --- a/modules/scadenzario/edit.php +++ b/modules/scadenzario/edit.php @@ -127,8 +127,10 @@ echo ' ?> - - + +
+ +
diff --git a/update/2_4_9.sql b/update/2_4_9.sql index 35bd45d6e..2865eaa4d 100644 --- a/update/2_4_9.sql +++ b/update/2_4_9.sql @@ -150,3 +150,31 @@ UPDATE `zz_widgets` SET `query` = 'SELECT CONCAT_WS('' '', REPLACE(REPLACE(REPLA -- Aggiunta idsede anche preventivi (completamento 2.4.1) ALTER TABLE `co_preventivi` ADD `idsede` INT NOT NULL AFTER `idanagrafica`; + +-- Aggiunta flag riba per tipi di pagamento Ri.Ba. +ALTER TABLE `co_pagamenti` ADD `riba` TINYINT(1) NOT NULL DEFAULT '0' AFTER `codice_modalita_pagamento_fe`; +UPDATE `co_pagamenti` SET `riba` = 1 WHERE `descrizione` LIKE 'Ri.Ba.%'; + +-- Creazione nuovo conto per anticipi Ri.Ba. +INSERT INTO `co_pianodeiconti3` (`id`, `numero`, `descrizione`, `idpianodeiconti2`, `dir`, `can_delete`, `can_edit`) VALUES (NULL, '000021', 'Banca C/C (conto anticipi)', '1', '', '0', '0'); + +-- Aggiunta colonna nome per i modelli primanota +ALTER TABLE `co_movimenti_modelli` ADD `nome` VARCHAR(255) NOT NULL AFTER `idmastrino`; + +UPDATE `zz_views` SET `name` = 'Nome', `query` = 'co_movimenti_modelli.nome' WHERE `zz_views`.`id_module` = (SELECT id FROM zz_modules WHERE name='Modelli prima nota') AND `zz_views`.`name`='Causale predefinita'; +UPDATE `zz_views` SET `query` = 'co_movimenti_modelli.idmastrino' WHERE `zz_views`.`id_module` = (SELECT id FROM zz_modules WHERE name='Modelli prima nota') AND `zz_views`.`name`='id'; + +-- Modelli primanota default +INSERT INTO `co_movimenti_modelli` (`id`, `idmastrino`, `nome`, `descrizione`, `idconto`) VALUES +(NULL, 1, 'Anticipo fattura', 'Anticipo fattura num. {numero} del {data}', -1), +(NULL, 1, 'Anticipo fattura', 'Anticipo fattura num. {numero} del {data}', (SELECT id FROM co_pianodeiconti3 WHERE descrizione = 'Banca C/C (conto anticipi)')), +(NULL, 1, 'Anticipo fattura', 'Anticipo fattura num. {numero} del {data}', (SELECT id FROM co_pianodeiconti3 WHERE descrizione = 'Spese bancarie')), +(NULL, 2, 'Accredito anticipo', 'Accredito anticipo fattura num. {numero} del {data}', (SELECT id FROM co_pianodeiconti3 WHERE descrizione = 'Banca C/C (conto anticipi)')), +(NULL, 2, 'Accredito anticipo', 'Accredito anticipo fattura num. {numero} del {data}', (SELECT id FROM co_pianodeiconti3 WHERE descrizione = 'Banca C/C')); + +-- Segmenti per modulo scadenzario +INSERT INTO `zz_segments` (`id`, `id_module`, `name`, `clause`, `position`, `pattern`, `note`, `predefined`, `predefined_accredito`, `predefined_addebito` `is_fiscale`) VALUES +(NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario totale', '1=1', 'WHR', '####', '', 1, 0, 0, 1), +(NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario clienti', '((SELECT dir FROM co_tipidocumento WHERE co_tipidocumento.id=co_documenti.idtipodocumento)=\'entrata\')', 'WHR', '####', '', 0, 0, 0, 0), +(NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario fornitori', '((SELECT dir FROM co_tipidocumento WHERE co_tipidocumento.id=co_documenti.idtipodocumento)=\'uscita\')', 'WHR', '####', '', 0, 0, 0, 0), +(NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario Ri.Ba.', 'co_pagamenti.riba=1', 'WHR', '####', '', 0, 0, 0, 0); \ No newline at end of file From 32a34de1895709fb6fc71d1ed23f639c87c8089e Mon Sep 17 00:00:00 2001 From: Matteo Baccarin Date: Thu, 11 Apr 2019 16:31:11 +0200 Subject: [PATCH 4/7] Fix installazione --- update/2_4_9.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/update/2_4_9.sql b/update/2_4_9.sql index 2865eaa4d..7d6f217ed 100644 --- a/update/2_4_9.sql +++ b/update/2_4_9.sql @@ -173,7 +173,7 @@ INSERT INTO `co_movimenti_modelli` (`id`, `idmastrino`, `nome`, `descrizione`, ` (NULL, 2, 'Accredito anticipo', 'Accredito anticipo fattura num. {numero} del {data}', (SELECT id FROM co_pianodeiconti3 WHERE descrizione = 'Banca C/C')); -- Segmenti per modulo scadenzario -INSERT INTO `zz_segments` (`id`, `id_module`, `name`, `clause`, `position`, `pattern`, `note`, `predefined`, `predefined_accredito`, `predefined_addebito` `is_fiscale`) VALUES +INSERT INTO `zz_segments` (`id`, `id_module`, `name`, `clause`, `position`, `pattern`, `note`, `predefined`, `predefined_accredito`, `predefined_addebito`, `is_fiscale`) VALUES (NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario totale', '1=1', 'WHR', '####', '', 1, 0, 0, 1), (NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario clienti', '((SELECT dir FROM co_tipidocumento WHERE co_tipidocumento.id=co_documenti.idtipodocumento)=\'entrata\')', 'WHR', '####', '', 0, 0, 0, 0), (NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario fornitori', '((SELECT dir FROM co_tipidocumento WHERE co_tipidocumento.id=co_documenti.idtipodocumento)=\'uscita\')', 'WHR', '####', '', 0, 0, 0, 0), From 85d5ee692e141a5f341cbbe74109f2eaefde2956 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Thu, 11 Apr 2019 16:11:32 -0700 Subject: [PATCH 5/7] Fix #550 --- composer.json | 16 +++++++------- include/common/importa.php | 20 ++++++----------- include/src/Components/Description.php | 13 +++++++++-- include/src/Components/Discount.php | 1 + modules/contratti/actions.php | 15 ++++++------- modules/contratti/buttons.php | 3 +-- modules/ddt/actions.php | 2 -- modules/fatture/actions.php | 8 +++---- modules/fatture/bulk.php | 2 +- modules/fatture/buttons.php | 3 +-- modules/fatture/modutil.php | 6 ++---- modules/fatture/variables.php | 4 ++-- modules/interventi/actions.php | 2 -- modules/modelli_primanota/actions.php | 6 +++--- modules/modelli_primanota/add.php | 26 +++++++++++----------- modules/modelli_primanota/edit.php | 2 +- modules/ordini/actions.php | 3 +-- modules/preventivi/actions.php | 12 +++++------ modules/primanota/actions.php | 6 +++--- modules/primanota/add.php | 10 ++++----- modules/smtp/actions.php | 2 +- update/2_4_9.sql | 30 ++++++++++++++++++++++++-- 22 files changed, 103 insertions(+), 89 deletions(-) diff --git a/composer.json b/composer.json index 671d4bfb6..b4645c24e 100644 --- a/composer.json +++ b/composer.json @@ -21,17 +21,17 @@ "type": "project", "require": { "php": ">=5.6", - "ext-mbstring": "*", - "ext-json": "*", - "ext-pdo": "*", - "ext-zip": "*", - "ext-intl": "*", - "ext-simplexml": "*", - "ext-libxml": "*", - "ext-dom": "*", "ext-curl": "*", + "ext-dom": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", "ext-openssl": "*", + "ext-pdo": "*", + "ext-simplexml": "*", "ext-xsl": "*", + "ext-zip": "*", "aluguest/ical-easy-reader": "^1.5", "danielstjules/stringy": "^3.1", "davidepastore/codice-fiscale": "^0.4.0", diff --git a/include/common/importa.php b/include/common/importa.php index f18d68c52..5019b6275 100644 --- a/include/common/importa.php +++ b/include/common/importa.php @@ -106,17 +106,11 @@ if (!empty($righe)) { echo ' '; - $totale = 0.00; - foreach ($righe as $i => $r) { // Descrizione echo ' - - - - - '; + '; // Checkbox - da evadere? echo ' @@ -133,7 +127,6 @@ if (!empty($righe)) { echo ' -

'.Translator::numberToLocale($r['qta_rimanente']).'

'; @@ -152,7 +145,6 @@ if (!empty($righe)) { - '.Translator::numberToLocale($subtotale - $sconto + $iva).' €
@@ -185,8 +177,6 @@ if (!empty($righe)) { echo ' '; - - $totale += $subtotale - $sconto + $iva; } // Totale @@ -196,7 +186,7 @@ if (!empty($righe)) { '.tr('Totale').': - '.Translator::numberToLocale($totale).' € + '; @@ -285,7 +275,9 @@ echo ' subtot = subtot - sconto; - totale += subtot * qta + iva * qta; + if(subtot) { + totale += subtot * qta + iva * qta; + } r++; @@ -306,4 +298,6 @@ echo ' ?> } + + ricalcola_totale(); diff --git a/include/src/Components/Description.php b/include/src/Components/Description.php index 28a66440e..12b1a53bf 100644 --- a/include/src/Components/Description.php +++ b/include/src/Components/Description.php @@ -16,6 +16,7 @@ abstract class Description extends Model if (!$bypass) { $model->is_descrizione = 1; + $model->qta = 1; } $model->setParent($document); @@ -42,6 +43,16 @@ abstract class Description extends Model return $diff; } + /** + * Restituisce la quantità rimanente dell'elemento. + * + * @return float + */ + public function getQtaRimanenteAttribute() + { + return $this->qta - $this->qta_evasa; + } + public function delete() { $this->evasione(-$this->qta); @@ -62,8 +73,6 @@ abstract class Description extends Model if (empty($this->disableOrder)) { $this->order = orderValue($this->table, $this->getParentID(), $document->id); } - - $this->save(); } /** diff --git a/include/src/Components/Discount.php b/include/src/Components/Discount.php index 89fc85eb1..2bbde2535 100644 --- a/include/src/Components/Discount.php +++ b/include/src/Components/Discount.php @@ -14,6 +14,7 @@ abstract class Discount extends Row $model = parent::build($document, true); $model->is_sconto = 1; + $model->qta = 1; return $model; } diff --git a/modules/contratti/actions.php b/modules/contratti/actions.php index 2f861af88..2f5fc174d 100644 --- a/modules/contratti/actions.php +++ b/modules/contratti/actions.php @@ -126,8 +126,8 @@ switch (post('op')) { } break; - - // Duplica contratto + + // Duplica contratto case 'copy': $dbo->query('CREATE TEMPORARY TABLE tmp SELECT * FROM co_contratti WHERE id = '.prepare($id_record)); $dbo->query('ALTER TABLE tmp DROP id'); @@ -146,14 +146,13 @@ switch (post('op')) { $dbo->query('UPDATE tmp SET idcontratto = '.prepare($id_record)); $dbo->query('INSERT INTO co_righe_contratti SELECT NULL,tmp.* FROM tmp'); $dbo->query('DROP TEMPORARY TABLE tmp'); - - //Azzero eventuale quantità evasa - $dbo->query('UPDATE co_righe_contratti SET qta_evasa=0 WHERE id='.prepare($id_record)); + + //Azzero eventuale quantità evasa + $dbo->query('UPDATE co_righe_contratti SET qta_evasa=0 WHERE id='.prepare($id_record)); flash()->info(tr('Contratto duplicato correttamente!')); - break; - + break; case 'manage_sconto': if (post('idriga') != null) { @@ -162,8 +161,6 @@ switch (post('op')) { $sconto = Sconto::build($contratto); } - $sconto->qta = 1; - $sconto->descrizione = post('descrizione'); $sconto->id_iva = post('idiva'); diff --git a/modules/contratti/buttons.php b/modules/contratti/buttons.php index 893c7a300..1b9b0926d 100644 --- a/modules/contratti/buttons.php +++ b/modules/contratti/buttons.php @@ -26,10 +26,9 @@ if ($record['rinnovabile']) {
'; } - // Duplica contratto echo ' -'; \ No newline at end of file +'; diff --git a/modules/ddt/actions.php b/modules/ddt/actions.php index 0c3b9c579..abf4d215d 100644 --- a/modules/ddt/actions.php +++ b/modules/ddt/actions.php @@ -188,8 +188,6 @@ switch (post('op')) { $sconto = Sconto::build($ddt); } - $sconto->qta = 1; - $sconto->descrizione = post('descrizione'); $sconto->id_iva = post('idiva'); diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index 2a3d4a2ec..de0cfe021 100644 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -299,7 +299,7 @@ switch (post('op')) { $articolo->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto') ?: null; $articolo->id_ritenuta_acconto = post('id_ritenuta_acconto') ?: null; - $articolo->ritenuta_contributi = post('ritenuta_contributi'); + $articolo->ritenuta_contributi = boolval(post('ritenuta_contributi')); $articolo->id_rivalsa_inps = post('id_rivalsa_inps') ?: null; $articolo->prezzo_unitario_acquisto = post('prezzo_acquisto') ?: 0; @@ -339,8 +339,6 @@ switch (post('op')) { $sconto = Sconto::build($fattura); } - $sconto->qta = 1; - $sconto->descrizione = post('descrizione'); $sconto->id_iva = post('idiva'); @@ -348,7 +346,7 @@ switch (post('op')) { $sconto->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto') ?: null; $sconto->id_ritenuta_acconto = post('id_ritenuta_acconto') ?: null; - $sconto->ritenuta_contributi = post('ritenuta_contributi'); + $sconto->ritenuta_contributi = boolval(post('ritenuta_contributi')); $sconto->id_rivalsa_inps = post('id_rivalsa_inps') ?: null; $sconto->sconto_unitario = post('sconto_unitario'); @@ -387,7 +385,7 @@ switch (post('op')) { $riga->calcolo_ritenuta_acconto = post('calcolo_ritenuta_acconto') ?: null; $riga->id_ritenuta_acconto = post('id_ritenuta_acconto') ?: null; - $riga->ritenuta_contributi = post('ritenuta_contributi'); + $riga->ritenuta_contributi = boolval(post('ritenuta_contributi')); $riga->id_rivalsa_inps = post('id_rivalsa_inps') ?: null; $riga->prezzo_unitario_acquisto = post('prezzo_acquisto') ?: 0; diff --git a/modules/fatture/bulk.php b/modules/fatture/bulk.php index db602d068..31edf7f0a 100644 --- a/modules/fatture/bulk.php +++ b/modules/fatture/bulk.php @@ -141,7 +141,7 @@ switch (post('op')) { break; case 'registra-contabile': - + break; } diff --git a/modules/fatture/buttons.php b/modules/fatture/buttons.php index 9d4dda066..cbe8004c3 100644 --- a/modules/fatture/buttons.php +++ b/modules/fatture/buttons.php @@ -47,10 +47,9 @@ if (empty($record['is_fiscale'])) { + ?> 0){ + if ($totale_pagato > 0) { // Lettura righe scadenziario $query = "SELECT * FROM co_scadenziario WHERE iddocumento='$iddocumento' AND ABS(pagato) < ABS(da_pagare) ORDER BY scadenza ASC"; $rs = $dbo->fetchArray($query); @@ -168,8 +168,7 @@ function aggiorna_scadenziario($iddocumento, $totale_pagato, $data_pagamento) } } } - }else{ - + } else { // Lettura righe scadenziario $query = "SELECT * FROM co_scadenziario WHERE iddocumento='$iddocumento' AND ABS(pagato)>0 ORDER BY scadenza DESC"; $rs = $dbo->fetchArray($query); @@ -214,7 +213,6 @@ function aggiorna_scadenziario($iddocumento, $totale_pagato, $data_pagamento) } } } - } } } diff --git a/modules/fatture/variables.php b/modules/fatture/variables.php index 4ab51bd80..dd78870ea 100644 --- a/modules/fatture/variables.php +++ b/modules/fatture/variables.php @@ -12,12 +12,12 @@ FROM co_documenti INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anag $logo_azienda = str_replace(DOCROOT, ROOTDIR, App::filepath('templates/base|custom|/logo_azienda.jpg')); //cliente -if($r['idconto_cliente']!=''){ +if ($r['idconto_cliente'] != '') { $conto = $r['idconto_cliente']; $conto_descrizione = $dbo->fetchOne('SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) AS descrizione FROM co_pianodeiconti3 WHERE id='.prepare($conto))['descrizione']; } //Fornitore -else if($r['idconto_fornitore']!=''){ +elseif ($r['idconto_fornitore'] != '') { $conto = $r['idconto_fornitore']; $conto_descrizione = $dbo->fetchOne('SELECT CONCAT ((SELECT numero FROM co_pianodeiconti2 WHERE id=co_pianodeiconti3.idpianodeiconti2), ".", numero, " ", descrizione) AS descrizione FROM co_pianodeiconti3 WHERE id='.prepare($conto))['descrizione']; } diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index 4d5d355f3..a8869e053 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -332,8 +332,6 @@ switch (post('op')) { $sconto = Riga::build($intervento); } - $sconto->qta = 1; - $sconto->descrizione = post('descrizione'); $sconto->id_iva = post('idiva'); diff --git a/modules/modelli_primanota/actions.php b/modules/modelli_primanota/actions.php index 8bd0ea3fa..a3954a2b4 100644 --- a/modules/modelli_primanota/actions.php +++ b/modules/modelli_primanota/actions.php @@ -10,7 +10,7 @@ switch (post('op')) { for ($i = 0; $i < sizeof(post('idconto')); ++$i) { $idconto = post('idconto')[$i]; - if(!empty($idconto)){ + if (!empty($idconto)) { $query = 'INSERT INTO co_movimenti_modelli(idmastrino, nome, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($nome).', '.prepare($descrizione).', '.prepare($idconto).')'; if ($dbo->query($query)) { $id_record = $idmastrino; @@ -30,8 +30,8 @@ switch (post('op')) { for ($i = 0; $i < sizeof(post('idconto')); ++$i) { $idconto = post('idconto')[$i]; - if(!empty($idconto)){ - $query = 'INSERT INTO co_movimenti_modelli(idmastrino, nome, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($nome).', '.prepare($descrizione).', '.prepare($idconto).')'; + if (!empty($idconto)) { + $query = 'INSERT INTO co_movimenti_modelli(idmastrino, nome, descrizione, idconto) VALUES('.prepare($idmastrino).', '.prepare($nome).', '.prepare($descrizione).', '.prepare($idconto).')'; if ($dbo->query($query)) { $id_record = $idmastrino; } diff --git a/modules/modelli_primanota/add.php b/modules/modelli_primanota/add.php index bb180720e..5fc507025 100644 --- a/modules/modelli_primanota/add.php +++ b/modules/modelli_primanota/add.php @@ -44,32 +44,32 @@ include_once __DIR__.'/../../core.php'; echo ' '; - // Variabili utilizzabili - $variables = include Modules::filepath(Modules::get("Fatture di vendita")['id'], 'variables.php'); + // Variabili utilizzabili + $variables = include Modules::filepath(Modules::get('Fatture di vendita')['id'], 'variables.php'); - echo ' + echo '
'; - if (!empty($variables)) { - echo ' + if (!empty($variables)) { + echo '

'.tr("Puoi utilizzare le seguenti sequenze di testo all'interno del campo causale, verranno sostituite in fase generazione prima nota dalla fattura.").':

    '; - foreach ($variables as $variable => $value) { - echo ' + foreach ($variables as $variable => $value) { + echo '
  • {'.$variable.'}
  • '; - } + } - echo ' + echo '
'; - } else { - echo ' + } else { + echo '

'.tr('Non sono state definite variabili da utilizzare nel template').'.

'; - } + } - echo ' + echo '
'; ?> diff --git a/modules/modelli_primanota/edit.php b/modules/modelli_primanota/edit.php index 273f8373f..39fca21dc 100644 --- a/modules/modelli_primanota/edit.php +++ b/modules/modelli_primanota/edit.php @@ -85,7 +85,7 @@ echo ' diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php index 3d557a40f..f1f4d6bb2 100644 --- a/modules/ordini/actions.php +++ b/modules/ordini/actions.php @@ -220,6 +220,7 @@ switch (post('op')) { flash()->info(tr('Riga rimossa!')); } + break; case 'manage_sconto': @@ -229,8 +230,6 @@ switch (post('op')) { $sconto = Sconto::build($ordine); } - $sconto->qta = 1; - $sconto->descrizione = post('descrizione'); $sconto->id_iva = post('idiva'); diff --git a/modules/preventivi/actions.php b/modules/preventivi/actions.php index 2d595b759..7467a43b5 100644 --- a/modules/preventivi/actions.php +++ b/modules/preventivi/actions.php @@ -32,7 +32,7 @@ switch (post('op')) { $idstato = post('idstato'); $nome = post('nome'); $idanagrafica = post('idanagrafica'); - $idsede = post('idsede'); + $idsede = post('idsede'); $idagente = post('idagente'); $idreferente = post('idreferente'); $idpagamento = post('idpagamento'); @@ -70,7 +70,7 @@ switch (post('op')) { $query = 'UPDATE co_preventivi SET idstato='.prepare($idstato).','. ' nome='.prepare($nome).','. ' idanagrafica='.prepare($idanagrafica).','. - ' idsede='.prepare($idsede).','. + ' idsede='.prepare($idsede).','. ' idagente='.prepare($idagente).','. ' idreferente='.prepare($idreferente).','. ' idpagamento='.prepare($idpagamento).','. @@ -116,9 +116,9 @@ switch (post('op')) { $dbo->query('UPDATE tmp SET idpreventivo = '.prepare($id_record)); $dbo->query('INSERT INTO co_righe_preventivi SELECT NULL,tmp.* FROM tmp'); $dbo->query('DROP TEMPORARY TABLE tmp'); - - //Azzero eventuale quantità evasa - $dbo->query('UPDATE co_righe_preventivi SET qta_evasa=0 WHERE id='.prepare($id_record)); + + //Azzero eventuale quantità evasa + $dbo->query('UPDATE co_righe_preventivi SET qta_evasa=0 WHERE id='.prepare($id_record)); flash()->info(tr('Preventivo duplicato correttamente!')); @@ -243,8 +243,6 @@ switch (post('op')) { $sconto = Sconto::build($preventivo); } - $sconto->qta = 1; - $sconto->descrizione = post('descrizione'); $sconto->id_iva = post('idiva'); diff --git a/modules/primanota/actions.php b/modules/primanota/actions.php index 626040ba9..097a4c8eb 100644 --- a/modules/primanota/actions.php +++ b/modules/primanota/actions.php @@ -46,7 +46,7 @@ switch (post('op')) { if ($totale_pagato != 0 && empty($insoluto)) { // Inserisco nello scadenziario il totale pagato aggiorna_scadenziario($iddocumento, abs($totale_pagato), $data); - }else if(!empty($insoluto)){ + } elseif (!empty($insoluto)) { //Rimuovo dallo scadenzario l'insoluto aggiorna_scadenziario($iddocumento, -abs($totale_pagato), $data); } @@ -65,9 +65,9 @@ switch (post('op')) { // Aggiorno lo stato della fattura if (abs($rs[0]['tot_pagato']) == abs($rs[0]['tot_da_pagare'])) { $dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Pagato') WHERE id=".prepare($iddocumento)); - } else if(abs($rs[0]['tot_pagato']) != abs($rs[0]['tot_da_pagare']) && abs($rs[0]['tot_pagato'])!='0'){ + } elseif (abs($rs[0]['tot_pagato']) != abs($rs[0]['tot_da_pagare']) && abs($rs[0]['tot_pagato']) != '0') { $dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Parzialmente pagato') WHERE id=".prepare($iddocumento)); - }else{ + } else { $dbo->query("UPDATE co_documenti SET idstatodocumento=(SELECT id FROM co_statidocumento WHERE descrizione='Emessa') WHERE id=".prepare($iddocumento)); } diff --git a/modules/primanota/add.php b/modules/primanota/add.php index 511875404..c70711922 100644 --- a/modules/primanota/add.php +++ b/modules/primanota/add.php @@ -15,7 +15,7 @@ include_once __DIR__.'/../../core.php'; $dir = get('dir'); $insoluto = get('insoluto'); - if(!empty($insoluto)){ + if (!empty($insoluto)) { echo ''; } @@ -42,9 +42,9 @@ include_once __DIR__.'/../../core.php'; $tipo_doc = 'fattura'; } - if(!empty($insoluto)){ + if (!empty($insoluto)) { $operation = 'Registrazione insoluto'; - }else{ + } else { $operation = 'Pag.'; } @@ -90,9 +90,9 @@ include_once __DIR__.'/../../core.php'; $query = 'SELECT SUM(pagato) AS tot_pagato, SUM(da_pagare) AS tot_da_pagare FROM co_scadenziario GROUP BY iddocumento HAVING iddocumento='.prepare($iddocumento); $rs = $dbo->fetchArray($query); - if(!empty($insoluto)){ + if (!empty($insoluto)) { $importo_conto_aziendale = abs($rs[0]['tot_da_pagare']); - }else{ + } else { $importo_conto_aziendale = abs($rs[0]['tot_da_pagare']) - abs($rs[0]['tot_pagato']); } $totale_dare = $importo_conto_aziendale; diff --git a/modules/smtp/actions.php b/modules/smtp/actions.php index ee5563b0c..da625c3f3 100644 --- a/modules/smtp/actions.php +++ b/modules/smtp/actions.php @@ -72,7 +72,7 @@ switch (post('op')) { case 'test': $mail = new Mail($id_record); - echo json_encode( [ + echo json_encode([ 'test' => $mail->testSMTP(), ]); diff --git a/update/2_4_9.sql b/update/2_4_9.sql index 2865eaa4d..f75a41131 100644 --- a/update/2_4_9.sql +++ b/update/2_4_9.sql @@ -138,7 +138,7 @@ UPDATE `dt_righe_ddt` SET `sconto` = `sconto_globale`, `sconto_unitario` = `scon ALTER TABLE `dt_righe_ddt` DROP `sconto_globale`; -- Fix per la tabella in_righe_interventi -ALTER TABLE `in_righe_interventi` ADD `is_descrizione` TINYINT(1) NOT NULL AFTER `idintervento`, ADD `idarticolo` INT(11) AFTER `idintervento`, ADD FOREIGN KEY (`idarticolo`) REFERENCES `mg_articoli`(`id`); +ALTER TABLE `in_righe_interventi` ADD `is_descrizione` TINYINT(1) NOT NULL AFTER `idintervento`, ADD `idarticolo` INT(11) AFTER `idintervento`, ADD FOREIGN KEY (`idarticolo`) REFERENCES `mg_articoli`(`id`), ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`; ALTER TABLE `mg_articoli_interventi` ADD `is_descrizione` TINYINT(1) NOT NULL AFTER `idintervento`, ADD `is_sconto` BOOLEAN DEFAULT FALSE NOT NULL AFTER `is_descrizione`; -- Rimozione campi inutilizzati co_ritenutaacconto @@ -177,4 +177,30 @@ INSERT INTO `zz_segments` (`id`, `id_module`, `name`, `clause`, `position`, `pat (NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario totale', '1=1', 'WHR', '####', '', 1, 0, 0, 1), (NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario clienti', '((SELECT dir FROM co_tipidocumento WHERE co_tipidocumento.id=co_documenti.idtipodocumento)=\'entrata\')', 'WHR', '####', '', 0, 0, 0, 0), (NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario fornitori', '((SELECT dir FROM co_tipidocumento WHERE co_tipidocumento.id=co_documenti.idtipodocumento)=\'uscita\')', 'WHR', '####', '', 0, 0, 0, 0), -(NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario Ri.Ba.', 'co_pagamenti.riba=1', 'WHR', '####', '', 0, 0, 0, 0); \ No newline at end of file +(NULL, (SELECT id FROM zz_modules WHERE name='Scadenzario'), 'Scadenzario Ri.Ba.', 'co_pagamenti.riba=1', 'WHR', '####', '', 0, 0, 0, 0); + +-- Fix vari +ALTER TABLE `co_righe_documenti` CHANGE `um` `um` VARCHAR(20) NULL; +UPDATE `co_righe_documenti` SET `um` = NULL WHERE `um` = ''; +ALTER TABLE `co_righe_documenti` CHANGE `idritenutaacconto` `idritenutaacconto` INT(11) NULL, CHANGE `idrivalsainps` `idrivalsainps` INT(11) NULL; +UPDATE `co_righe_documenti` SET `idritenutaacconto` = NULL WHERE `idritenutaacconto` = 0; +UPDATE `co_righe_documenti` SET `idrivalsainps` = NULL WHERE `idrivalsainps` = 0; + +ALTER TABLE `co_righe_preventivi` CHANGE `um` `um` VARCHAR(20) NULL; +UPDATE `co_righe_preventivi` SET `um` = NULL WHERE `um` = ''; + +ALTER TABLE `co_righe_contratti` CHANGE `um` `um` VARCHAR(20) NULL; +UPDATE `co_righe_contratti` SET `um` = NULL WHERE `um` = ''; + +ALTER TABLE `or_righe_ordini` CHANGE `um` `um` VARCHAR(20) NULL; +UPDATE `or_righe_ordini` SET `um` = NULL WHERE `um` = ''; + +ALTER TABLE `dt_righe_ddt` CHANGE `um` `um` VARCHAR(20) NULL; +UPDATE `dt_righe_ddt` SET `um` = NULL WHERE `um` = ''; + +ALTER TABLE `in_righe_interventi` CHANGE `um` `um` VARCHAR(20) NULL; +UPDATE `in_righe_interventi` SET `um` = NULL WHERE `um` = ''; + +ALTER TABLE `mg_articoli_interventi` CHANGE `um` `um` VARCHAR(20) NULL; +UPDATE `mg_articoli_interventi` SET `um` = NULL WHERE `um` = ''; + From 02f0cd25933bd507c07438e96597c240296e6830 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Thu, 11 Apr 2019 16:18:09 -0700 Subject: [PATCH 6/7] Fix #552 --- include/src/Components/Description.php | 1 + include/src/Components/Discount.php | 2 +- modules/ordini/actions.php | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/src/Components/Description.php b/include/src/Components/Description.php index 12b1a53bf..29bf20de2 100644 --- a/include/src/Components/Description.php +++ b/include/src/Components/Description.php @@ -172,6 +172,7 @@ abstract class Description extends Model protected function customInitCopiaIn($original) { $this->is_descrizione = $original->is_descrizione; + $this->is_sconto = $original->is_sconto; } /** diff --git a/include/src/Components/Discount.php b/include/src/Components/Discount.php index 2bbde2535..9faf30fdd 100644 --- a/include/src/Components/Discount.php +++ b/include/src/Components/Discount.php @@ -9,7 +9,7 @@ abstract class Discount extends Row { protected $guarded = []; - public static function build(Document $document, $bypass = false) + public static function build(Document $document) { $model = parent::build($document, true); diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php index f1f4d6bb2..32e99c96c 100644 --- a/modules/ordini/actions.php +++ b/modules/ordini/actions.php @@ -370,7 +370,7 @@ switch (post('op')) { $id_record = $ordine->id; } - + $parziale = false; $righe = $preventivo->getRighe(); foreach ($righe as $riga) { From 16fa83f8b272d455ef28c9ed4ecaee69d1c357d3 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Thu, 11 Apr 2019 16:50:20 -0700 Subject: [PATCH 7/7] =?UTF-8?q?Introduzione=20classe=20Sessioni=20per=20le?= =?UTF-8?q?=20Attivit=C3=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interventi/src/Components/Sessione.php | 196 ++++++++++++++++++ modules/interventi/src/Intervento.php | 11 +- modules/ordini/actions.php | 2 +- 3 files changed, 204 insertions(+), 5 deletions(-) create mode 100644 modules/interventi/src/Components/Sessione.php diff --git a/modules/interventi/src/Components/Sessione.php b/modules/interventi/src/Components/Sessione.php new file mode 100644 index 000000000..21301372d --- /dev/null +++ b/modules/interventi/src/Components/Sessione.php @@ -0,0 +1,196 @@ +belongsTo(Intervento::class, $this->getParentID()); + } + + // Costi per l'azienda + + /** + * Restituisce il costo orario (per l'azienda) per la sessione del tecnico. + * + * @return float + */ + public function getCostoOrarioAttribute() + { + return $this->attributes['prezzo_ore_unitario_tecnico']; + } + + /** + * Restituisce il costo del diritto di chiamata (per l'azienda) per la sessione del tecnico. + * + * @return float + */ + public function getCostoDirittoChiamataAttribute() + { + return $this->attributes['prezzo_dirittochiamata_tecnico']; + } + + /** + * Restituisce il costo chilometrico (per l'azienda) del viaggio del tecnico. + * + * @return float + */ + public function getCostoChilometricoAttribute() + { + return $this->attributes['prezzo_km_unitario_tecnico']; + } + + /** + * Restituisce il costo totale della manodopera escluso il diritto di chiamata (per l'azienda) per la sessione del tecnico. + * + * @return float + */ + public function getCostoManodoperaAttribute() + { + return $this->costo_orario * $this->ore; + } + + /** + * Restituisce il costo totale (per l'azienda) del viaggio del tecnico. + * + * @return float + */ + public function getCostoViaggioAttribute() + { + return $this->costo_chilometrico * $this->km; + } + + // Prezzi per il cliente + + /** + * Restituisce il prezzo del diritto di chiamata (per il cliente) per la sessione del tecnico. + * + * @return float + */ + public function getPrezzoDirittoChiamataAttribute() + { + return $this->attributes['prezzo_dirittochiamata']; + } + + /** + * Restituisce il prezzo del diritto di chiamata (per il cliente) per la sessione del tecnico. + * + * @return float + */ + public function getPrezzoChilometricoAttribute() + { + return $this->attributes['prezzo_km_unitario']; + } + + /** + * Restituisce il prezzo del diritto di chiamata (per il cliente) per la sessione del tecnico. + * + * @return float + */ + public function getPrezzoOrarioAttribute() + { + return $this->attributes['prezzo_ore_unitario']; + } + + /** + * Restituisce il prezzo totale della manodopera escluso il diritto di chiamata (per il cliente) per la sessione del tecnico. + * + * @return float + */ + public function getPrezzoManodoperaAttribute() + { + return $this->prezzo_orario * $this->ore; + } + + /** + * Restituisce lo sconto totale km in euro. + * + * @return float + */ + public function getScontoTotaleManodoperaAttribute() + { + return calcola_sconto([ + 'sconto' => $this->sconto_unitario, + 'prezzo' => $this->prezzo_manodopera, + 'tipo' => $this->tipo_sconto, + ]); + } + + /** + * Restituisce il prezzo totale scontato (per il cliente) del viaggio del tecnico. + * + * @return float + */ + public function getPrezzoManodoperaScontatoAttribute() + { + return $this->prezzo_manodopera - $this->sconto_totale_manodopera; + } + + /** + * Restituisce il prezzo totale (per il cliente) del viaggio del tecnico. + * + * @return float + */ + public function getPrezzoViaggioAttribute() + { + return $this->prezzo_chilometrico * $this->km; + } + + /** + * Restituisce lo sconto totale km in euro. + * + * @return float + */ + public function getScontoTotaleKmAttribute() + { + return calcola_sconto([ + 'sconto' => $this->scontokm_unitario, + 'prezzo' => $this->prezzo_viaggio, + 'tipo' => $this->tipo_scontokm, + ]); + } + + /** + * Restituisce il prezzo totale scontato (per il cliente) del viaggio del tecnico. + * + * @return float + */ + public function getPrezzoViaggioScontatoAttribute() + { + return $this->prezzo_viaggio - $this->sconto_totale_km; + } + + /** + * Crea un nuova sessione collegata ad un intervento. + * + * @param Intervento $intervento + * + * @return self + */ + public static function build(Intervento $intervento) + { + $model = parent::build($intervento); + + $model->parent()->associate($intervento); + + return $model; + } +} diff --git a/modules/interventi/src/Intervento.php b/modules/interventi/src/Intervento.php index a89867c48..db23c9dd4 100644 --- a/modules/interventi/src/Intervento.php +++ b/modules/interventi/src/Intervento.php @@ -5,8 +5,6 @@ namespace Modules\Interventi; use Common\Document; use Modules\Anagrafiche\Anagrafica; use Modules\Contratti\Contratto; -use Modules\Interventi\Components\Articolo; -use Modules\Interventi\Components\Riga; use Modules\Preventivi\Preventivo; use Util\Generator; @@ -67,12 +65,12 @@ class Intervento extends Document public function articoli() { - return $this->hasMany(Articolo::class, 'idintervento'); + return $this->hasMany(Components\Articolo::class, 'idintervento'); } public function righe() { - return $this->hasMany(Riga::class, 'idintervento'); + return $this->hasMany(Components\Riga::class, 'idintervento'); } public function sconti() @@ -85,6 +83,11 @@ class Intervento extends Document return $this->righe()->where('prezzo_vendita', 0); } + public function sessioni() + { + return $this->hasMany(Components\Sessione::class, 'idintervento'); + } + // Metodi statici /** diff --git a/modules/ordini/actions.php b/modules/ordini/actions.php index 32e99c96c..f1f4d6bb2 100644 --- a/modules/ordini/actions.php +++ b/modules/ordini/actions.php @@ -370,7 +370,7 @@ switch (post('op')) { $id_record = $ordine->id; } - + $parziale = false; $righe = $preventivo->getRighe(); foreach ($righe as $riga) {