diff --git a/config/namespaces.php b/config/namespaces.php index d8c5086db..e649cfb4b 100644 --- a/config/namespaces.php +++ b/config/namespaces.php @@ -5,6 +5,7 @@ return [ 'modules/anagrafiche' => 'Modules\Anagrafiche', 'modules/articoli' => 'Modules\Articoli', 'modules/ritenute' => 'Modules\Ritenute', + 'modules/rivalse' => 'Modules\Rivalse', 'modules/iva' => 'Modules\Iva', 'modules/ddt' => 'Modules\DDT', 'modules/fatture' => 'Modules\Fatture', diff --git a/core.php b/core.php index e29f09032..a900822b2 100644 --- a/core.php +++ b/core.php @@ -111,7 +111,7 @@ Monolog\ErrorHandler::register($logger, [], Monolog\Logger::ERROR, Monolog\Logge // Aggiunta di Monolog a Whoops if (App::debug()) { - $whoops->pushHandler(function (\Whoops\Exception\ErrorException $exception, $inspector, $run) use ($logger) { + $whoops->pushHandler(function ($exception, $inspector, $run) use ($logger) { $logger->addError($exception->getMessage(), [ 'code' => $exception->getCode(), 'message' => $exception->getMessage(), diff --git a/include/src/Components/Article.php b/include/src/Components/Article.php index 7c6819def..993a91e4e 100644 --- a/include/src/Components/Article.php +++ b/include/src/Components/Article.php @@ -96,32 +96,6 @@ abstract class Article extends Row return $this->belongsTo(Original::class, 'idarticolo'); } - public function copiaIn(Document $document) - { - $class = get_class($document); - $namespace = implode('\\', explode('\\', $class, -1)); - - $current = get_class($this); - $pieces = explode('\\', $current); - $type = end($pieces); - - $object = $namespace.'\\Components\\'.$type; - - $attributes = $this->getAttributes(); - unset($attributes['id']); - - $model = $object::build($document, $this->articolo); - $model->save(); - - $model = $object::find($model->id); - $accepted = $model->getAttributes(); - - $attributes = array_intersect_key($attributes, $accepted); - $model->fill($attributes); - - return $model; - } - protected static function boot() { parent::boot(true); @@ -169,4 +143,9 @@ abstract class Article extends Row return true; } + + protected function customCopiaIn($original) + { + $this->articolo()->associate($original->articolo); + } } diff --git a/include/src/Components/Description.php b/include/src/Components/Description.php index b219e4d74..b552d4d5a 100644 --- a/include/src/Components/Description.php +++ b/include/src/Components/Description.php @@ -23,6 +23,11 @@ abstract class Description extends Model return $model; } + /** + * Imposta il proprietario dell'oggetto e l'ordine relativo all'interno delle righe. + * + * @param Document $document + */ public function setParent(Document $document) { $this->parent()->associate($document); @@ -35,8 +40,17 @@ abstract class Description extends Model $this->save(); } - public function copiaIn(Document $document) + /** + * Copia l'oggetto (articolo, riga, descrizione) nel corrispettivo per il documento indicato. + * + * @param Document $document + * @param float|null $qta + * + * @return self + */ + public function copiaIn(Document $document, $qta = null) { + // Individuazione classe di destinazione $class = get_class($document); $namespace = implode('\\', explode('\\', $class, -1)); @@ -46,18 +60,34 @@ abstract class Description extends Model $object = $namespace.'\\Components\\'.$type; + // Attributi dell'oggetto da copiare $attributes = $this->getAttributes(); unset($attributes['id']); - $model = $object::build($document); + if ($qta !== null) { + $attributes['qta'] = $qta; + } + + // Creazione del nuovo oggetto + $model = new $object(); + $model->setParent($document); + + $model->customCopiaIn($this); + $model->save(); + // Impostazione degli attributi $model = $object::find($model->id); $accepted = $model->getAttributes(); $attributes = array_intersect_key($attributes, $accepted); $model->fill($attributes); + $model->save(); + + // Rimozione quantità evasa + $this->qta_evasa = $this->qta_evasa + $attributes['qta']; + return $model; } @@ -65,6 +95,15 @@ abstract class Description extends Model abstract public function getParentID(); + /** + * Azione personalizzata per la copia dell'oggetto. + * + * @param $original + */ + protected function customCopiaIn($original) + { + } + protected static function boot($bypass = false) { parent::boot(); diff --git a/include/src/Components/Row.php b/include/src/Components/Row.php index 4a3cb5210..f3fea9e43 100644 --- a/include/src/Components/Row.php +++ b/include/src/Components/Row.php @@ -6,7 +6,7 @@ use Common\Document; use Illuminate\Database\Eloquent\Builder; use Modules\Iva\Aliquota; use Modules\Ritenute\RitenutaAcconto; -use Modules\Ritenute\RivalsaINPS; +use Modules\Rivalse\RivalsaINPS; abstract class Row extends Description { diff --git a/modules/contratti/actions.php b/modules/contratti/actions.php index f876017ba..eb946a383 100644 --- a/modules/contratti/actions.php +++ b/modules/contratti/actions.php @@ -58,11 +58,10 @@ switch (post('op')) { $costo_orario = post('costo_orario'); $costo_km = post('costo_km'); $costo_diritto_chiamata = post('costo_diritto_chiamata'); - - $id_documento_fe = post('id_documento_fe'); + + $id_documento_fe = post('id_documento_fe'); $codice_cig = post('codice_cig'); $codice_cup = post('codice_cup'); - $query = 'UPDATE co_contratti SET idanagrafica='.prepare($idanagrafica).', idsede='.prepare($idsede).', @@ -84,7 +83,7 @@ switch (post('op')) { id_documento_fe='.prepare($id_documento_fe).', codice_cig='.prepare($codice_cig).', codice_cup='.prepare($codice_cup).' WHERE id='.prepare($id_record); - + // costo_diritto_chiamata='.prepare($costo_diritto_chiamata).', ore_lavoro='.prepare($ore_lavoro).', costo_orario='.prepare($costo_orario).', costo_km='.prepare($costo_km).' $dbo->query($query); diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index c8fbb7225..f6eee76f3 100644 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -444,7 +444,7 @@ switch (post('op')) { if (!empty(post('import'))) { // Replicazione delle righe del contratto sul documento - $righe = $dbo->fetchArray('SELECT idarticolo, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, um, qta, sconto, sconto_unitario, tipo_sconto, IFNULL( (SELECT mg_articoli.abilita_serial FROM mg_articoli WHERE mg_articoli.id=co_righe_contratti.idarticolo), 0 ) AS abilita_serial FROM co_righe_contratti WHERE idcontratto='.prepare($idcontratto)); + $righe = $dbo->fetchArray('SELECT *, IFNULL( (SELECT mg_articoli.abilita_serial FROM mg_articoli WHERE mg_articoli.id=co_righe_contratti.idarticolo), 0 ) AS abilita_serial FROM co_righe_contratti WHERE idcontratto='.prepare($idcontratto)); foreach ($righe as $key => $riga) { $subtot = $riga['subtotale']; diff --git a/modules/fatture/modutil.php b/modules/fatture/modutil.php index 2dc237062..64c519fc2 100755 --- a/modules/fatture/modutil.php +++ b/modules/fatture/modutil.php @@ -555,15 +555,13 @@ function ricalcola_costiagg_fattura($iddocumento, $idrivalsainps = '', $idritenu $marca_da_bollo = 0; if (abs($bolli) > 0 && abs($netto_a_pagare > setting("Soglia minima per l'applicazione della marca da bollo"))) { - //Controllo che tra le iva ce ne sia almeno una con natura N1, N2, N3 o N4 - $check_natura = $dbo->fetchArray("SELECT codice_natura_fe FROM co_righe_documenti INNER JOIN co_iva ON co_righe_documenti.idiva=co_iva.id WHERE iddocumento=".prepare($iddocumento)." AND codice_natura_fe IN('N1','N2','N3','N4') GROUP BY codice_natura_fe"); - if(($dir == 'entrata' && sizeof($check_natura)>0) || $dir == 'uscita'){ + $check_natura = $dbo->fetchArray('SELECT codice_natura_fe FROM co_righe_documenti INNER JOIN co_iva ON co_righe_documenti.idiva=co_iva.id WHERE iddocumento='.prepare($iddocumento)." AND codice_natura_fe IN('N1','N2','N3','N4') GROUP BY codice_natura_fe"); + if (($dir == 'entrata' && sizeof($check_natura) > 0) || $dir == 'uscita') { $marca_da_bollo = $bolli; - }else{ + } else { $marca_da_bollo = 0.00; } - } // Se l'importo è negativo può essere una nota di credito, quindi cambio segno alla marca da bollo diff --git a/modules/fatture/row-list.php b/modules/fatture/row-list.php index 4736d33f2..1bbe1805b 100644 --- a/modules/fatture/row-list.php +++ b/modules/fatture/row-list.php @@ -58,24 +58,24 @@ foreach ($righe as $riga) { elseif (!empty($riga['idintervento'])) { //$ref_modulo = Modules::get('Interventi')['id']; //$ref_id = $riga['idintervento']; - + $intervento = $dbo->fetchOne('SELECT codice_cig,codice_cup,id_documento_fe FROM in_interventi WHERE id = '.prepare($riga['idintervento'])); $riga['codice_cig'] = $intervento['codice_cig']; $riga['codice_cup'] = $intervento['codice_cup']; $riga['id_documento_fe'] = $intervento['id_documento_fe']; - + $delete = 'unlink_intervento'; } // Preventivi elseif (!empty($riga['idpreventivo'])) { //$ref_modulo = Modules::get('Preventivi')['id']; //$ref_id = $riga['idpreventivo']; - - $preventivo = $dbo->fetchOne('SELECT codice_cig,codice_cup,id_documento_fe FROM co_preventivi WHERE id = '.prepare($riga['idpreventivo'])); + + $preventivo = $dbo->fetchOne('SELECT codice_cig,codice_cup,id_documento_fe FROM co_preventivi WHERE id = '.prepare($riga['idpreventivo'])); $riga['codice_cig'] = $preventivo['codice_cig']; $riga['codice_cup'] = $preventivo['codice_cup']; $riga['id_documento_fe'] = $preventivo['id_documento_fe']; - + $delete = 'unlink_preventivo'; } // Contratti @@ -108,14 +108,14 @@ foreach ($righe as $riga) { } $extra_riga = ''; - if (!$riga['is_descrizione']){ - $extra_riga = tr('_DESCRIZIONE_CONTO_ _ID_DOCUMENTO_ _CODICE_CIG_ _CODICE_CUP_ ', [ - '_DESCRIZIONE_CONTO_' => $riga['descrizione_conto'] ?: null, - '_CODICE_CIG_' => $riga['codice_cig'] ? ',CIG: '.$riga['codice_cig'] : null, - '_CODICE_CUP_' => $riga['codice_cup'] ? ',CUP: '.$riga['codice_cup'] : null, - '_ID_DOCUMENTO_' => $riga['id_documento_fe'] ? ' - DOC: '.$riga['id_documento_fe'] : null, - ]); - } + if (!$riga['is_descrizione']) { + $extra_riga = tr('_DESCRIZIONE_CONTO_ _ID_DOCUMENTO_ _CODICE_CIG_ _CODICE_CUP_ ', [ + '_DESCRIZIONE_CONTO_' => $riga['descrizione_conto'] ?: null, + '_CODICE_CIG_' => $riga['codice_cig'] ? ',CIG: '.$riga['codice_cig'] : null, + '_CODICE_CUP_' => $riga['codice_cup'] ? ',CUP: '.$riga['codice_cup'] : null, + '_ID_DOCUMENTO_' => $riga['id_documento_fe'] ? ' - DOC: '.$riga['id_documento_fe'] : null, + ]); + } echo ' diff --git a/modules/preventivi/actions.php b/modules/preventivi/actions.php index d06e61878..936453547 100644 --- a/modules/preventivi/actions.php +++ b/modules/preventivi/actions.php @@ -59,11 +59,10 @@ switch (post('op')) { // $costo_km = post('costo_km'); $idiva = post('idiva'); - - $id_documento_fe = post('id_documento_fe'); + + $id_documento_fe = post('id_documento_fe'); $codice_cig = post('codice_cig'); $codice_cup = post('codice_cup'); - $query = 'UPDATE co_preventivi SET idstato='.prepare($idstato).','. ' nome='.prepare($nome).','. @@ -82,9 +81,9 @@ switch (post('op')) { ' descrizione='.prepare($descrizione).','. ' tipo_sconto_globale='.prepare($tipo_sconto).','. ' sconto_globale='.prepare($sconto).','. - ' id_documento_fe='.prepare($id_documento_fe).','. - ' codice_cig='.prepare($codice_cig).','. - ' codice_cup='.prepare($codice_cup).','. + ' id_documento_fe='.prepare($id_documento_fe).','. + ' codice_cig='.prepare($codice_cig).','. + ' codice_cup='.prepare($codice_cup).','. ' validita='.prepare($validita).','. ' idtipointervento='.prepare($idtipointervento).','. ' idiva='.prepare($idiva).' WHERE id='.prepare($id_record); diff --git a/modules/preventivi/buttons.php b/modules/preventivi/buttons.php index 3ee1ece93..7c73c7d21 100644 --- a/modules/preventivi/buttons.php +++ b/modules/preventivi/buttons.php @@ -6,14 +6,13 @@ echo' '; if (!in_array($record['stato'], ['Bozza', 'Rifiutato', 'In attesa di conferma'])) { - $disabled = ''; + $disabled = ''; } else { echo ' '; - $disabled = 'disabled'; + $disabled = 'disabled'; } - // crea ordine echo ' '; - //duplica preventivo echo ' diff --git a/modules/ritenute/src/RivalsaINPS.php b/modules/rivalse/src/RivalsaINPS.php similarity index 78% rename from modules/ritenute/src/RivalsaINPS.php rename to modules/rivalse/src/RivalsaINPS.php index 6438d5c50..2dd8aba60 100644 --- a/modules/ritenute/src/RivalsaINPS.php +++ b/modules/rivalse/src/RivalsaINPS.php @@ -1,6 +1,6 @@ fetchArray('SELECT `id_documento_fe`, `codice_cig`, `codice_cup` FROM `co_contratti` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`idcontratto` = `co_contratti`.`id` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id']).' AND `id_documento_fe` IS NOT NULL'); - - $preventivi = $database->fetchArray('SELECT `id_documento_fe`, `codice_cig`, `codice_cup` FROM `co_preventivi` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`idpreventivo` = `co_preventivi`.`id` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id']).' AND `id_documento_fe` IS NOT NULL'); + + $preventivi = $database->fetchArray('SELECT `id_documento_fe`, `codice_cig`, `codice_cup` FROM `co_preventivi` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`idpreventivo` = `co_preventivi`.`id` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id']).' AND `id_documento_fe` IS NOT NULL'); $interventi = $database->fetchArray('SELECT `id_documento_fe`, `codice_cig`, `codice_cup` FROM `in_interventi` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`idintervento` = `in_interventi`.`id` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id']).' AND `id_documento_fe` IS NOT NULL'); - - $ordini = $database->fetchArray('SELECT `id_documento_fe`, `codice_cig`, `codice_cup` FROM `or_ordini` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`idordine` = `or_ordini`.`id` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id']).' AND `id_documento_fe` IS NOT NULL'); + + $ordini = $database->fetchArray('SELECT `id_documento_fe`, `codice_cig`, `codice_cup` FROM `or_ordini` INNER JOIN `co_righe_documenti` ON `co_righe_documenti`.`idordine` = `or_ordini`.`id` WHERE `co_righe_documenti`.`iddocumento` = '.prepare($documento['id']).' AND `id_documento_fe` IS NOT NULL'); $this->contratti = array_merge($contratti, $preventivi, $interventi, $ordini); } @@ -633,12 +633,14 @@ class FatturaElettronica ]; $ritenuta_predefinita = setting("Percentuale ritenuta d'acconto"); - if (!empty($ritenuta_predefinita)) + if (!empty($ritenuta_predefinita)) { $dati_cassa['Ritenuta'] = 'SI'; - - if (!empty($iva['codice_natura_fe'])) - $dati_cassa['Natura'] = $iva['codice_natura_fe']; - + } + + if (!empty($iva['codice_natura_fe'])) { + $dati_cassa['Natura'] = $iva['codice_natura_fe']; + } + //$dati_cassa['RiferimentoAmministrazione'] = ''; $result['DatiCassaPrevidenziale'] = $dati_cassa; @@ -882,23 +884,22 @@ class FatturaElettronica //2.2.1.3 if (!empty($riga['idarticolo'])) { - - $tipo_codice = $database->fetchOne('SELECT `mg_categorie`.`nome` FROM `mg_categorie` INNER JOIN `mg_articoli` ON `mg_categorie`.`id` = `mg_articoli`.`id_categoria` WHERE `mg_articoli`.`id` = '.prepare($riga['idarticolo']))['nome']; - + $tipo_codice = $database->fetchOne('SELECT `mg_categorie`.`nome` FROM `mg_categorie` INNER JOIN `mg_articoli` ON `mg_categorie`.`id` = `mg_articoli`.`id_categoria` WHERE `mg_articoli`.`id` = '.prepare($riga['idarticolo']))['nome']; + $codice_articolo = [ - 'CodiceTipo' => ($tipo_codice) ? : 'OSM', + 'CodiceTipo' => ($tipo_codice) ?: 'OSM', 'CodiceValore' => $database->fetchOne('SELECT `codice` FROM `mg_articoli` WHERE `id` = '.prepare($riga['idarticolo']))['codice'], ]; $dettaglio['CodiceArticolo'] = $codice_articolo; } - - //Non ammesso ’ - //$descrizione = html_entity_decode($riga['descrizione'], ENT_HTML5, 'UTF-8'); - $descrizione = str_replace(">", " ", $riga['descrizione']); - $descrizione = str_replace("…", "...", $descrizione); - - $dettaglio['Descrizione'] = str_replace("’", " ", $descrizione); + + //Non ammesso ’ + //$descrizione = html_entity_decode($riga['descrizione'], ENT_HTML5, 'UTF-8'); + $descrizione = str_replace('>', ' ', $riga['descrizione']); + $descrizione = str_replace('…', '...', $descrizione); + + $dettaglio['Descrizione'] = str_replace('’', ' ', $descrizione); $dettaglio['Quantita'] = $riga['qta']; if (!empty($riga['um'])) { @@ -986,8 +987,8 @@ class FatturaElettronica if (!empty($riepilogo['dicitura'])) { // $iva['RiferimentoNormativo'] = $riepilogo['dicitura']; } - - //2.2.2 + + //2.2.2 $result[] = [ 'DatiRiepilogo' => $iva, ]; @@ -1009,8 +1010,8 @@ class FatturaElettronica if ($documento['split_payment']) { $iva['EsigibilitaIVA'] = 'S'; } - - //2.2.2 + + //2.2.2 $result[] = [ 'DatiRiepilogo' => $iva, ]; diff --git a/plugins/importFE/actions.php b/plugins/importFE/actions.php index a974c3230..caf6d4466 100644 --- a/plugins/importFE/actions.php +++ b/plugins/importFE/actions.php @@ -45,7 +45,7 @@ switch (filter('op')) { //Processo il file ricevuto $process_result = Interaction::processXML($filename); - if($process_result!=''){ + if ($process_result != '') { flash()->error($process_result); redirect(ROOTDIR.'/controller.php?id_module='.$id_module); exit; diff --git a/plugins/importFE/src/FatturaElettronica.php b/plugins/importFE/src/FatturaElettronica.php index 784acfbd7..513c79d79 100644 --- a/plugins/importFE/src/FatturaElettronica.php +++ b/plugins/importFE/src/FatturaElettronica.php @@ -222,23 +222,20 @@ class FatturaElettronica $sconti = $riga['ScontoMaggiorazione']; if (!empty($sconti)) { - - foreach ($sconti as $key => $sconto) { - $tipo = !empty($sconto['Percentuale']) ? 'PRC' : 'EUR'; - $unitario = $sconto['Percentuale'] ?: $sconto['Importo']; - - //SConto o MaGgiorazione - $unitario = ($sconto['Tipo'] == 'SC') ? $unitario : -$unitario; - - if (!empty($unitario)){ - $obj->sconto_unitario = $unitario; - $obj->tipo_sconto = $tipo; - } - } - - } - - + foreach ($sconti as $key => $sconto) { + $tipo = !empty($sconto['Percentuale']) ? 'PRC' : 'EUR'; + $unitario = $sconto['Percentuale'] ?: $sconto['Importo']; + + //SConto o MaGgiorazione + $unitario = ($sconto['Tipo'] == 'SC') ? $unitario : -$unitario; + + if (!empty($unitario)) { + $obj->sconto_unitario = $unitario; + $obj->tipo_sconto = $tipo; + } + } + } + $obj->save(); } } diff --git a/plugins/importFE/src/Interaction.php b/plugins/importFE/src/Interaction.php index 6f3df4ebb..64a56cdb1 100644 --- a/plugins/importFE/src/Interaction.php +++ b/plugins/importFE/src/Interaction.php @@ -20,21 +20,21 @@ class Interaction extends Connection $code = $body['code']; - if($code=='200'){ + if ($code == '200') { $files = $body['results']; foreach ($files as $file) { - /** + /* * Verifico che l'XML non sia già stato importato nel db */ - - if( preg_match( "/^([A-Z]{2})(.+?)_([^\.]+)\.xml/i", $file, $m ) ){ + + if (preg_match("/^([A-Z]{2})(.+?)_([^\.]+)\.xml/i", $file, $m)) { $partita_iva = $m[2]; $progressivo_invio = $m[3]; $fattura = database()->fetchOne('SELECT co_documenti.id FROM (co_documenti INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id) INNER JOIN an_anagrafiche ON co_documenti.idanagrafica=an_anagrafiche.idanagrafica WHERE co_tipidocumento.dir="uscita" AND an_anagrafiche.piva='.prepare($partita_iva).' AND co_documenti.progressivo_invio='.prepare($progressivo_invio)); - + if (!$fattura) { - $list[] = basename($file); + $list[] = basename($file); } } } @@ -62,17 +62,17 @@ class Interaction extends Connection public static function processXML($filename) { - $response = static::request('POST', 'process_xml', [ + $response = static::request('POST', 'process_xml', [ 'filename' => $filename, ]); - $body = static::responseBody($response); + $body = static::responseBody($response); - if($body['processed']=='0'){ - $message = $body['code']." - ".$body['message']; - }else{ - $message = ""; - } + if ($body['processed'] == '0') { + $message = $body['code'].' - '.$body['message']; + } else { + $message = ''; + } return $message; } diff --git a/src/AJAX.php b/src/AJAX.php index 9d4a75e61..657383673 100644 --- a/src/AJAX.php +++ b/src/AJAX.php @@ -157,7 +157,7 @@ class AJAX if (!empty($permissions)) { $modules = Modules::getAvailableModules(); } else { - $modules = Modules::getModules(); + $modules = Models\Module::withoutGlobalScope('enabled')->get(); } $modules = $modules->toArray(); diff --git a/src/Util/Generator.php b/src/Util/Generator.php index 1dd082367..a87157ca5 100644 --- a/src/Util/Generator.php +++ b/src/Util/Generator.php @@ -100,7 +100,7 @@ class Generator $values = array_column($replaces, 'regex'); $pattern = preg_replace('/#{1,}/', '#', $pattern); - $pattern = str_replace('\\#','#',preg_quote($pattern, '/')); + $pattern = str_replace('\\#', '#', preg_quote($pattern, '/')); $pattern = str_replace(array_keys($replaces), array_values($values), $pattern); // Individuazione dei valori