diff --git a/composer.json b/composer.json index 98b57fc26..2f204dc03 100644 --- a/composer.json +++ b/composer.json @@ -36,6 +36,7 @@ "mpociot/vat-calculator": "^2.3", "phpmailer/phpmailer": "^6.0", "respect/validation": "^1.1", + "servo/fluidxml": "^1.21", "spipu/html2pdf": "^5.0", "symfony/filesystem": "^3.3", "symfony/finder": "^3.3", @@ -49,7 +50,9 @@ }, "autoload": { "psr-4": { - "": "src/" + "": "src/", + "Modules\\": "modules/", + "Plugins\\": "plugins/" }, "files": [ "lib/functions.php", diff --git a/modules/ddt/modutil.php b/modules/ddt/modutil.php index f2d1503e4..95f9ff85b 100644 --- a/modules/ddt/modutil.php +++ b/modules/ddt/modutil.php @@ -263,7 +263,7 @@ function ricalcola_costiagg_ddt($idddt, $idrivalsainps = '', $idritenutaacconto $marca_da_bollo = 0.00; } - // Se l'importo è negativo può essere una nota di accredito, quindi cambio segno alla marca da bollo + // Se l'importo è negativo può essere una nota di credito, quindi cambio segno alla marca da bollo if ($netto_a_pagare < 0) { $marca_da_bollo *= -1; } diff --git a/modules/fatture/actions.php b/modules/fatture/actions.php index 165864af7..165e41186 100644 --- a/modules/fatture/actions.php +++ b/modules/fatture/actions.php @@ -1412,7 +1412,6 @@ switch (post('op')) { $rs = $dbo->fetchArray($query); $desc_iva = $rs[0]['descrizione']; - $rs = $dbo->fetchArray('SELECT * FROM co_righe_documenti WHERE id='.prepare($idriga)); $idconto = $rs[0]['idconto']; @@ -1443,8 +1442,8 @@ switch (post('op')) { break; - // Nota di accredito - case 'nota_accredito': + // Nota di credito + case 'nota_credito': $id_segment = post('id_segment'); $numero = get_new_numerofattura($records[0]['data']); @@ -1454,7 +1453,7 @@ switch (post('op')) { $idconto = $rs[0]['idconto']; $ref_documento = $id_record; - $dbo->query('INSERT INTO co_documenti (numero, numero_esterno, ref_documento, idanagrafica, idconto, idtipodocumento, idpagamento, idbanca, data, idstatodocumento, idsede, id_segment) SELECT '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($ref_documento).', idanagrafica, idconto, (SELECT `id` FROM `co_tipidocumento` WHERE `descrizione`=\'Nota di accredito\' AND dir = \'entrata\'), idpagamento, idbanca, data, (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`=\'Bozza\'), idsede, '.prepare($id_segment).' FROM co_documenti AS t WHERE id = '.prepare($id_record)); + $dbo->query('INSERT INTO co_documenti (numero, numero_esterno, ref_documento, idanagrafica, idconto, idtipodocumento, idpagamento, idbanca, data, idstatodocumento, idsede, id_segment) SELECT '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($ref_documento).', idanagrafica, idconto, (SELECT `id` FROM `co_tipidocumento` WHERE `descrizione`=\'Nota di credito\' AND dir = \'entrata\'), idpagamento, idbanca, data, (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`=\'Bozza\'), idsede, '.prepare($id_segment).' FROM co_documenti AS t WHERE id = '.prepare($id_record)); $id_record = $dbo->lastInsertedID(); // Lettura di tutte le righe della tabella in arrivo @@ -1523,14 +1522,14 @@ switch (post('op')) { break; } -// Nota di addebito +// Nota di debito if (get('op') == 'nota_addebito') { $id_segment = $records[0]['id_segment']; $numero = get_new_numerofattura($records[0]['data']); $numero_esterno = get_new_numerosecondariofattura($records[0]['data']); - $dbo->query('INSERT INTO co_documenti (numero, numero_esterno, ref_documento, idanagrafica, idconto, idtipodocumento, idpagamento, idbanca, data, idstatodocumento, idsede, id_segment) SELECT '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($id_record).', idanagrafica, idconto, (SELECT `id` FROM `co_tipidocumento` WHERE `descrizione`=\'Nota di addebito\' AND dir = \'entrata\'), idpagamento, idbanca, data, (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`=\'Bozza\'), idsede, id_segment FROM co_documenti AS t WHERE id = '.prepare($id_record)); + $dbo->query('INSERT INTO co_documenti (numero, numero_esterno, ref_documento, idanagrafica, idconto, idtipodocumento, idpagamento, idbanca, data, idstatodocumento, idsede, id_segment) SELECT '.prepare($numero).', '.prepare($numero_esterno).', '.prepare($id_record).', idanagrafica, idconto, (SELECT `id` FROM `co_tipidocumento` WHERE `descrizione`=\'Nota di debito\' AND dir = \'entrata\'), idpagamento, idbanca, data, (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`=\'Bozza\'), idsede, id_segment FROM co_documenti AS t WHERE id = '.prepare($id_record)); $id_record = $dbo->lastInsertedID(); } diff --git a/modules/fatture/buttons.php b/modules/fatture/buttons.php index 41fc9fef7..2537d964d 100644 --- a/modules/fatture/buttons.php +++ b/modules/fatture/buttons.php @@ -23,11 +23,11 @@ if ($dir == 'entrata' && empty($records[0]['ref_documento']) && $records[0]['sta '; diff --git a/modules/fatture/crea_documento.php b/modules/fatture/crea_documento.php index 864c46873..69f0c0a33 100644 --- a/modules/fatture/crea_documento.php +++ b/modules/fatture/crea_documento.php @@ -44,7 +44,7 @@ if ($module['name'] == 'Ordini cliente' || $module['name'] == 'Ordini fornitore' $dir = ($module['name'] == 'Ddt di vendita') ? 'entrata' : 'uscita'; } else { $pos = 'fat'; - $op = 'nota_accredito'; + $op = 'nota_credito'; $head = tr('Fattura numero _NUM_'); diff --git a/modules/fatture/modutil.php b/modules/fatture/modutil.php index 8ebaa2c5a..79c5ae80b 100644 --- a/modules/fatture/modutil.php +++ b/modules/fatture/modutil.php @@ -625,7 +625,7 @@ function ricalcola_costiagg_fattura($iddocumento, $idrivalsainps = '', $idritenu $marca_da_bollo = $bolli; } - // Se l'importo è negativo può essere una nota di accredito, quindi cambio segno alla marca da bollo + // Se l'importo è negativo può essere una nota di credito, quindi cambio segno alla marca da bollo $marca_da_bollo = abs($marca_da_bollo); $dbo->query('UPDATE co_documenti SET ritenutaacconto='.prepare($ritenutaacconto).', rivalsainps='.prepare($rivalsainps).', iva_rivalsainps='.prepare($iva_rivalsainps).', bollo='.prepare($marca_da_bollo).' WHERE id='.prepare($iddocumento)); @@ -1066,7 +1066,7 @@ function rimuovi_riga_fattura($id_documento, $id_riga, $dir) $dbo->query('UPDATE or_righe_ordini SET qta_evasa=qta_evasa-'.$riga['qta'].' WHERE qta='.prepare($riga['qta']).' AND idarticolo='.prepare($riga['idarticolo']).' AND idordine='.prepare($riga['idordine'])); } - // Nota di accredito + // Nota di credito if (!empty($riga['ref_riga_documento'])) { $dbo->query('UPDATE co_righe_documenti SET qta_evasa = qta_evasa+'.$riga['qta'].' WHERE id='.prepare($riga['ref_riga_documento'])); diff --git a/modules/ordini/modutil.php b/modules/ordini/modutil.php index d646eea65..8adc47c1a 100644 --- a/modules/ordini/modutil.php +++ b/modules/ordini/modutil.php @@ -256,7 +256,7 @@ function ricalcola_costiagg_ordine($idordine, $idrivalsainps = '', $idritenutaac $marca_da_bollo = 0.00; } - // Se l'importo è negativo può essere una nota di accredito, quindi cambio segno alla marca da bollo + // Se l'importo è negativo può essere una nota di credito, quindi cambio segno alla marca da bollo if ($netto_a_pagare < 0) { $marca_da_bollo *= -1; } diff --git a/modules/preventivi/modutil.php b/modules/preventivi/modutil.php index 09b558e22..150e46dc3 100644 --- a/modules/preventivi/modutil.php +++ b/modules/preventivi/modutil.php @@ -85,7 +85,7 @@ function ricalcola_costiagg_preventivo($idpreventivo, $idrivalsainps = '', $idri $marca_da_bollo = 0.00; } - // Se l'importo è negativo può essere una nota di accredito, quindi cambio segno alla marca da bollo + // Se l'importo è negativo può essere una nota di credito, quindi cambio segno alla marca da bollo if ($netto_a_pagare < 0) { $marca_da_bollo *= -1; } diff --git a/modules/primanota/add.php b/modules/primanota/add.php index 3ccf69e73..59cba7593 100644 --- a/modules/primanota/add.php +++ b/modules/primanota/add.php @@ -21,10 +21,10 @@ include_once __DIR__.'/../../core.php'; $numero_doc = !empty($rs[0]['numero_esterno']) ? $rs[0]['numero_esterno'] : $rs[0]['numero']; $tipo_doc = $rs[0]['tdescrizione']; - $nota_accredito = false; + $nota_credito = false; - if ($tipo_doc == 'Nota di accredito') { - $nota_accredito = true; + if ($tipo_doc == 'Nota di credito') { + $nota_credito = true; } $descrizione = tr('_DOC_ numero _NUM_ del _DATE_ (_NAME_)', [ @@ -188,8 +188,8 @@ include_once __DIR__.'/../../core.php'; $value_avere = ''; } - // Se è una nota di accredito, inverto i valori - if ($nota_accredito) { + // Se è una nota di credito, inverto i valori + if ($nota_credito) { $tmp = $value_dare; $value_dare = $value_avere; $value_avere = $tmp; diff --git a/plugins/fatturazione/FatturaElettronica.php b/plugins/fatturazione/FatturaElettronica.php new file mode 100644 index 000000000..93c519f8c --- /dev/null +++ b/plugins/fatturazione/FatturaElettronica.php @@ -0,0 +1,898 @@ +documento = $database->fetchOne('SELECT *, (SELECT `codice_fe` FROM `co_tipidocumento` WHERE `co_tipidocumento`.`id` = `co_documenti`.`idtipodocumento`) AS `tipo_documento` FROM `co_documenti` WHERE `id` = '.prepare($id_documento)); + + // Righe del documento + $this->righe_documento = $database->select('co_righe_documenti', '*', ['iddocumento' => $id_documento]); + + // Anagrafica azienda + $this->azienda = $database->fetchOne('SELECT *, (SELECT `iso2` FROM `an_nazioni` WHERE `an_nazioni`.`id` = `an_anagrafiche`.`id_nazione`) AS nazione FROM `an_anagrafiche` WHERE `idanagrafica` = '.prepare(\Settings::get('Azienda predefinita'))); + + // Anagrafica cliente + $this->cliente = $database->fetchOne('SELECT *, (SELECT `iso2` FROM `an_nazioni` WHERE `an_nazioni`.`id` = `an_anagrafiche`.`id_nazione`) AS nazione FROM `an_anagrafiche` WHERE `idanagrafica` = '.prepare($this->documento['idanagrafica'])); + } + + public function getAzienda() + { + return $this->azienda; + } + + public function getCliente() + { + return $this->cliente; + } + + public function getDocumento() + { + return $this->documento; + } + + public function getRigheDocumento() + { + return $this->righe_documento; + } + + /** + * Undocumented function. + * + * @return array + */ + protected static function getDatiTrasmissione($documento, $azienda, $cliente) + { + // Generazione dell'header + $result = [ + 'IdTrasmittente' => [ + 'IdPaese' => $azienda['nazione'], + 'IdCodice' => $azienda['piva'], + ], + 'ProgressivoInvio' => $documento['numero_esterno'], + 'FormatoTrasmissione' => ($cliente['tipo'] == 'Ente pubblico') ? 'FPA12' : 'FPR12', + 'CodiceDestinatario' => !empty($cliente['cod_sogei']) ? $cliente['cod_sogei'] : '0000000', + 'ContattiTrasmittente' => [ + 'Telefono' => $azienda['email'], + 'Email' => $azienda['email'], + ], + ]; + + // Inizializzazione PEC solo se necessario + if (empty($cliente['cod_sogei'])) { + $result['PECDestinatario'] = $cliente['cod_sogei_pec']; + } + + return $result; + } + + /** + * Undocumented function. + * + * @return array + */ + protected static function getDatiAzienda($azienda) + { + $result = [ + 'DatiAnagrafici' => [ + 'IdFiscaleIVA' => [ + 'IdPaese' => $azienda['nazione'], + 'IdCodice' => $azienda['piva'], + ], + 'CodiceFiscale' => $azienda['codice_fiscale'], + 'Anagrafica' => [ + 'Denominazione' => $azienda['ragione_sociale'], // Massimo 80 caratteri + // TODO: 'Nome' => $azienda['ragione_sociale'], // Massimo 80 caratteri + // TODO: 'Cognome' => $azienda['ragione_sociale'], // Massimo 80 caratteri + // TODO: 'Titolo' => $azienda['ragione_sociale'], // Massimo 80 caratteri + // TODO: CodEORI + ], + // TODO: AlboProfessionale, ProvinciaAlbo, NumeroIscrizioneAlbo, DataIscrizioneAlbo + 'RegimeFiscale' => \Settings::get('Regime Fiscale'), // Da introdurre + ], + 'Sede' => [ + 'Indirizzo' => $azienda['indirizzo'], // Massimo 60 caratteri + 'CAP' => $azienda['cap'], // Massimo 5 di 10 caratteri + 'Comune' => $azienda['citta'], // Massimo 60 caratteri + 'Provincia' => $azienda['provincia'], // SOLO SE nazione ITALIA + 'Nazione' => $azienda['nazione'], + ], + // TODO: StabileOrganizzazione, IscrizioneREA, Contatti, RiferimentoAmministrazione + ]; + + return $result; + } + + /** + * Undocumented function. + * + * @return array + */ + protected static function getDatiCliente($cliente) + { + $result = [ + 'DatiAnagrafici' => [ + 'CodiceFiscale' => $cliente['codice_fiscale'], // Oppure PARTITA IVA in alternativa + 'Anagrafica' => [ + 'Denominazione' => $cliente['ragione_sociale'], // Massimo 80 caratteri + ], + ], + 'Sede' => [ + 'Indirizzo' => $cliente['indirizzo'], // Massimo 60 caratteri + 'CAP' => $cliente['cap'], // Massimo 5 di 10 caratteri + 'Comune' => $cliente['citta'], // Massimo 60 caratteri + 'Provincia' => $cliente['provincia'], + 'Nazione' => $cliente['nazione'], + ], + ]; + + return $result; + } + + /** + * Undocumented function. + * + * @return array + */ + protected static function getDatiGeneraliDocumento($documento) + { + $result = [ + 'TipoDocumento' => $documento['tipo_documento'], + 'Divisa' => 'EUR', + 'Data' => $documento['data'], + 'Numero' => $documento['numero_esterno'], + //'Causale' => $documento['causale'], + ]; + + return $result; + } + + /** + * Undocumented function. + * + * @return array + */ + protected static function getDatiDocumento($documento) + { + $result = [ + 'DatiGeneraliDocumento' => self::getDatiGeneraliDocumento($documento), + ]; + + return $result; + } + + /** + * Undocumented function. + * + * @return array + */ + protected static function getDatiBeniServizi($documento, $righe_documento) + { + $database = \Database::getConnection(); + + $result = []; + + // Righe del documento + foreach ($righe_documento as $numero => $riga) { + $prezzo_unitario = $riga['subtotale'] / $riga['qta']; + $prezzo_totale = $riga['subtotale'] - $riga['sconto']; + + $iva = $database->fetchArray('SELECT percentuale FROM co_iva WHERE id='.prepare($riga['idiva'])); + $id_iva = $iva[0]['percentuale']; + + $result[] = [ + 'DettaglioLinee' => [ + 'NumeroLinea' => $numero, + 'Descrizione' => $riga['descrizione'], + 'Quantita' => $riga['qta'], + 'PrezzoUnitario' => $prezzo_unitario, + 'ScontoMaggiorazione' => [ + 'Tipo' => 'SC', + 'Percentuale' => ($riga['tipo_sconto'] == 'PRC') ? $riga['sconto'] : ($riga['sconto'] * 100) / $riga['subtotale'], + ], + 'PrezzoTotale' => $prezzo_totale, + 'AliquotaIVA' => $id_iva, + ], + ]; + } + + // Riepiloghi per IVA + $riepiloghi = $database->fetchArray('SELECT SUM(subtotale - sconto) as totale, SUM(iva) as iva, idiva FROM `co_righe_documenti` WHERE iddocumento = '.prepare($id_documento).' GROUP BY idiva'); + foreach ($riepiloghi as $numero => $riepilogo) { + $iva = $database->fetchArray('SELECT percentuale FROM co_iva WHERE id='.prepare($riepilogo['idiva'])); + $id_iva = $iva[0]['percentuale']; + + $result[] = [ + 'DatiRiepilogo' => [ + 'AliquotaIVA' => $id_iva, + 'ImponibileImporto' => $riepilogo['tot'], + 'Imposta' => $riepilogo['iva'], + 'EsigibilitaIVA' => 'I', + ], + ]; + } + + return $result; + } + + /** + * Undocumented function. + * + * @return array + */ + protected static function getDatiPagamento($documento) + { + $result = [ + 'CondizioniPagamento' => '', + 'DettaglioPagamento' => [ + 'ModalitaPagamento' => '', + 'DataScadenzaPagamento' => '', + 'ImportoPagamento' => '', + ], + ]; + + return $result; + } + + protected static function getHeader($documento, $azienda, $cliente) + { + $result = [ + 'DatiTrasmissione' => self::getDatiTrasmissione($documento, $azienda, $cliente), + 'CedentePrestatore' => self::getDatiAzienda($azienda), + 'CessionarioCommittente' => self::getDatiCliente($cliente), + ]; + + return $result; + } + + protected static function getBody($documento, $azienda, $cliente, $righe_documento) + { + $result = [ + 'DatiGenerali' => self::getDatiDocumento($documento), + 'DatiBeniServizi' => self::getDatiBeniServizi($documento, $righe_documento), + 'DatiPagamento' => self::getDatiPagamento($documento), + ]; + + return $result; + } + + protected static function prepareForXML($input, $key = null) + { + $output = null; + if (is_array($input)) { + foreach ($input as $key => $value) { + $output[$key] = self::prepareForXML($value, $key); + } + } elseif (!is_null($input)) { + $info = self::$validators[$key]; + $size = isset($info['size']) ? $info['size'] : null; + $size = explode('-', $info['size']); + + $output = $input; + // Operazioni di normalizzazione + if ($info['type'] == 'decimal') { + $output = number_format($output, 2, '.', ''); + } elseif (isset($size[1])) { + S::create($output)->substr(2, $size[1]); + } + + // Validazione + if ($info['type'] == 'string' || $info['type'] == 'normalizedString') { + if ($info['type'] == 'string') { + $validator = v::alnum(); + } elseif ('normalizedString') { + $validator = v::alnum()->noWhitespace(); + } + + if (isset($size[1])) { + $validator = $validator->length($size[0], $size[1]); + } + } elseif ($info['type'] == 'decimal') { + $validator = v::floatVal(); + } elseif ($info['type'] == 'date') { + $validator = v::date(); + } + + if (!empty($validator)) { + //echo $key.': '.intval($validator->validate($output)).'
'; + } + } + + return $output; + } + + public function save($directory) + { + $documento = $this->getDocumento(); + $filename = $documento['codice_xml']; + + // Generazione nome XML + if (empty($filename)) { + $azienda = $this->getAzienda(); + $codice = empty($azienda['piva']) ? $azienda['codice_fiscale'] : $azienda['piva']; + + $filename = 'IT'.$codice.'_'.date('y').secure_random_string(3); + + // Registrazione + $database = \Database::getConnection(); + $database->update('co_documenti', ['codice_xml' => $filename], ['id' => $documento['id']]); + $this->documento['codice_xml'] = $filename; + } + $filename .= '.xml'; + + // Salvataggio del file + $result = directory($directory) && file_put_contents(rtrim($directory, '/').'/'.$filename, $this->__toString()); + + return ($result === false) ? null : $filename; + } + + public function __toString() + { + $azienda = $this->getAzienda(); + $documento = $this->getDocumento(); + $cliente = $this->getCliente(); + $righe_documento = $this->getRigheDocumento(); + + // Inizializzazione libreria per la generazione della fattura in XML + $fattura = new FluidXml(null); + + // Generazione dell'elemento root + $fattura->namespace('p', 'http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2'); + $root = $fattura->addChild('p:FatturaElettronica', true); // Our document is with no root node, let's create one. + $rootNode = $root[0]; + + // Completamento dei tag + $attributes = [ + 'versione' => ($cliente['tipo'] == 'Ente pubblico') ? 'FPA12' : 'FPR12', + 'xmlns:ds' => 'http://www.w3.org/2000/09/xmldsig#', + 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance', + 'xsi:schemaLocation' => 'http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd', + ]; + foreach ($attributes as $key => $value) { + $rootNode->setAttribute($key, $value); + } + + $xml = [ + 'FatturaElettronicaHeader' => self::getHeader($documento, $azienda, $cliente), + 'FatturaElettronicaBody' => self::getBody($documento, $azienda, $cliente, $righe_documento), + ]; + $xml = self::prepareForXML($xml); + + $fattura->add($xml); + + return $fattura->__toString(); + } + + protected static $validators = [ + 'IdPaese' => [ + 'type' => 'string', + 'size' => 2, + ], + 'IdCodice' => [ + 'type' => 'string', + 'size' => '1-28', + ], + 'ProgressivoInvio' => [ + 'type' => 'normalizedString', + 'size' => '1-10', + ], + 'FormatoTrasmissione' => [ + 'type' => 'string', + 'size' => 5, + ], + 'CodiceDestinatario' => [ + 'type' => 'string', + 'size' => '6-7', + ], + 'Telefono' => [ + 'type' => 'normalizedString', + 'size' => '5-12', + ], + 'Email' => [ + 'type' => 'string', + 'size' => '7-256', + ], + 'PECDestinatario' => [ + 'type' => 'normalizedString', + 'size' => '7-256', + ], + 'CodiceFiscale' => [ + 'type' => 'string', + 'size' => '11-16', + ], + 'Denominazione' => [ + 'type' => 'normalizedString', + 'size' => '1-80', + ], + 'Nome' => [ + 'type' => 'normalizedString', + 'size' => '1-60', + ], + 'Cognome' => [ + 'type' => 'normalizedString', + 'size' => '1-60', + ], + 'Titolo' => [ + 'type' => 'normalizedString', + 'size' => '2-10', + ], + 'CodEORI' => [ + 'type' => 'string', + 'size' => '13-17', + ], + 'AlboProfessionale' => [ + 'type' => 'normalizedString', + 'size' => '1-60', + ], + 'ProvinciaAlbo' => [ + 'type' => 'string', + 'size' => 2, + ], + 'NumeroIscrizioneAlbo' => [ + 'type' => 'normalizedString', + 'size' => '1-60', + ], + 'DataIscrizioneAlbo' => [ + 'type' => 'date', + 'size' => 10, + ], + 'RegimeFiscale' => [ + 'type' => 'string', + 'size' => 4, + ], + 'Indirizzo' => [ + 'type' => 'normalizedString', + 'size' => '1-60', + ], + 'NumeroCivico' => [ + 'type' => 'normalizedString', + 'size' => '1-8', + ], + 'CAP' => [ + 'type' => 'string', + 'size' => 5, + ], + 'Comune' => [ + 'type' => 'normalizedString', + 'size' => '1-60', + ], + 'Provincia' => [ + 'type' => 'string', + 'size' => 2, + ], + 'Nazione' => [ + 'type' => 'string', + 'size' => 2, + ], + 'Ufficio' => [ + 'type' => 'string', + 'size' => 2, + ], + 'NumeroREA' => [ + 'type' => 'normalizedString', + 'size' => '1-20', + ], + 'CapitaleSociale' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'SocioUnico' => [ + 'type' => 'string', + 'size' => 2, + ], + 'StatoLiquidazione' => [ + 'type' => 'string', + 'size' => 2, + ], + 'Fax' => [ + 'type' => 'normalizedString', + 'size' => '5-12', + ], + 'RiferimentoAmministrazione' => [ + 'type' => 'normalizedString', + 'size' => '1-20', + ], + 'SoggettoEmittente' => [ + 'type' => 'string', + 'size' => 2, + ], + 'TipoDocumento' => [ + 'type' => 'string', + 'size' => 4, + ], + 'Divisa' => [ + 'type' => 'string', + 'size' => 3, + ], + 'Data' => [ + 'type' => 'date', + 'size' => 10, + ], + 'Numero' => [ + 'type' => 'normalizedString', + 'size' => '1-20', + ], + 'TipoRitenuta' => [ + 'type' => 'string', + 'size' => 4, + ], + 'ImportoRitenuta' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'AliquotaRitenuta' => [ + 'type' => 'decimal', + 'size' => '4-6', + ], + 'CausalePagamento' => [ + 'type' => 'string', + 'size' => '1-2', + ], + 'BolloVirtuale' => [ + 'type' => 'string', + 'size' => 2, + ], + 'ImportoBollo' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'TipoCassa' => [ + 'type' => 'string', + 'size' => 4, + ], + 'AlCassa' => [ + 'type' => 'decimal', + 'size' => '4-6', + ], + 'ImportoContributoCassa' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'ImponibileCassa' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'AliquotaIVA' => [ + 'type' => 'decimal', + 'size' => '4-6', + ], + 'Ritenuta' => [ + 'type' => 'string', + 'size' => 2, + ], + 'Natura' => [ + 'type' => 'string', + 'size' => 2, + ], + 'Tipo' => [ + 'type' => 'string', + 'size' => 2, + ], + 'Percentuale' => [ + 'type' => 'decimal', + 'size' => '4-6', + ], + 'Importo' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'ImportoTotaleDocumento' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'Arrotondamento' => [ + 'type' => 'decimal', + 'size' => '4-21', + ], + 'Causale' => [ + 'type' => 'normalizedString', + 'size' => '1-200', + ], + 'Art73' => [ + 'type' => 'string', + 'size' => 2, + ], + 'RiferimentoNumeroLinea' => [ + 'type' => 'integer', + 'size' => '1-4', + ], + 'IdDocumento' => [ + 'type' => 'normalizedString', + 'size' => '1-20', + ], + 'NumItem' => [ + 'type' => 'normalizedString', + 'size' => '1-20', + ], + 'CodiceCommessaConvenzione' => [ + 'type' => 'normalizedString', + 'size' => '1-100', + ], + 'CodiceCUP' => [ + 'type' => 'normalizedString', + 'size' => '1-15', + ], + 'CodiceCIG' => [ + 'type' => 'normalizedString', + 'size' => '1-15', + ], + 'RiferimentoFase' => [ + 'type' => 'integer', + 'size' => '1-3', + ], + 'NumeroDDT' => [ + 'type' => 'normalizedString', + 'size' => '1-20', + ], + 'DataDDT' => [ + 'type' => 'date', + 'size' => 10, + ], + 'NumeroLicenzaGuida' => [ + 'type' => 'normalizedString', + 'size' => '1-20', + ], + 'MezzoTrasporto' => [ + 'type' => 'normalizedString', + 'size' => '1-80', + ], + 'CausaleTrasporto' => [ + 'type' => 'normalizedString', + 'size' => '1-100', + ], + 'NumeroColli' => [ + 'type' => 'integer', + 'size' => '1-4', + ], + 'Descrizione' => [ + 'type' => 'normalizedString', + 'size' => '1-1000', + ], + 'UnitaMisuraPeso' => [ + 'type' => 'normalizedString', + 'size' => '1-10', + ], + 'PesoLordo' => [ + 'type' => 'decimal', + 'size' => '4-7', + ], + 'PesoNetto' => [ + 'type' => 'decimal', + 'size' => '4-7', + ], + 'DataOraRitiro' => [ + 'type' => 'date', + 'size' => 19, + ], + 'DataInizioTrasporto' => [ + 'type' => 'date', + 'size' => 10, + ], + 'TipoResa' => [ + 'type' => 'string', + 'size' => 3, + ], + 'DataOraConsegna' => [ + 'type' => 'date', + 'size' => 19, + ], + 'NumeroFatturaPrincipale' => [ + 'type' => 'string', + 'size' => '1-20', + ], + 'DataFatturaPrincipale' => [ + 'type' => 'date', + 'size' => 10, + ], + 'NumeroLinea' => [ + 'type' => 'integer', + 'size' => '1-4', + ], + 'TipoCessionePrestazione' => [ + 'type' => 'string', + 'size' => 2, + ], + 'CodiceArticolo' => [ + 'type' => 'normalizedString', + ], + 'CodiceTipo' => [ + 'type' => 'normalizedString', + 'size' => '1-35', + ], + 'CodiceValore' => [ + 'type' => 'normalizedString', + 'size' => '1-35', + ], + 'Quantita' => [ + 'type' => 'decimal', + 'size' => '4-21', + ], + 'UnitaMisura' => [ + 'type' => 'normalizedString', + 'size' => '1-10', + ], + 'DataInizioPeriodo' => [ + 'type' => 'date', + 'size' => 10, + ], + 'DataFinePeriodo' => [ + 'type' => 'date', + 'size' => 10, + ], + 'PrezzoUnitario' => [ + 'type' => 'decimal', + 'size' => '4-21', + ], + 'PrezzoTotale' => [ + 'type' => 'decimal', + 'size' => '4-21', + ], + 'TipoDato' => [ + 'type' => 'normalizedString', + 'size' => '1-10', + ], + 'RiferimentoTesto' => [ + 'type' => 'normalizedString', + 'size' => '1-60', + ], + 'RiferimentoNumero' => [ + 'type' => 'decimal', + 'size' => '4-21', + ], + 'RiferimentoData' => [ + 'type' => 'normalizedString', + 'size' => 10, + ], + 'SpeseAccessorie' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'ImponibileImporto' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'Imposta' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'EsigibilitaIVA' => [ + 'type' => 'string', + 'size' => 1, + ], + 'RiferimentoNormativo' => [ + 'type' => 'normalizedString', + 'size' => '1-100', + ], + 'TotalePercorso' => [ + 'type' => 'normalizedString', + 'size' => '1-15', + ], + 'CondizioniPagamento' => [ + 'type' => 'string', + 'size' => 4, + ], + 'Beneficiario' => [ + 'type' => 'string', + 'size' => '1-200', + ], + 'ModalitaPagamento' => [ + 'type' => 'string', + 'size' => 4, + ], + 'DataRiferimentoTerminiPagamento' => [ + 'type' => 'date', + 'size' => 10, + ], + 'GiorniTerminiPagamento' => [ + 'type' => 'integer', + 'size' => '1-3', + ], + 'DataScadenzaPagamento' => [ + 'type' => 'date', + 'size' => 10, + ], + 'ImportoPagamento' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'CodUfficioPostale' => [ + 'type' => 'normalizedString', + 'size' => '1-20', + ], + 'CognomeQuietanzante' => [ + 'type' => 'normalizedString', + 'size' => '1-60', + ], + 'NomeQuietanzante' => [ + 'type' => 'normalizedString', + 'size' => '1-60', + ], + 'CFQuietanzante' => [ + 'type' => 'string', + 'size' => 16, + ], + 'TitoloQuietanzante' => [ + 'type' => 'normalizedString', + 'size' => '2-10', + ], + 'IstitutoFinanziario' => [ + 'type' => 'normalizedString', + 'size' => '1-80', + ], + 'IBAN' => [ + 'type' => 'string', + 'size' => '15-34', + ], + 'ABI' => [ + 'type' => 'string', + 'size' => 5, + ], + 'CAB' => [ + 'type' => 'string', + 'size' => 5, + ], + 'BIC' => [ + 'type' => 'string', + 'size' => '8-11', + ], + 'ScontoPagamentoAnticipato' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'DataLimitePagamentoAnticipato' => [ + 'type' => 'date', + 'size' => 10, + ], + 'PenalitaPagamentiRitardati' => [ + 'type' => 'decimal', + 'size' => '4-15', + ], + 'DataDecorrenzaPenale' => [ + 'type' => 'date', + 'size' => 10, + ], + 'CodicePagamento' => [ + 'type' => 'string', + 'size' => '1-60', + ], + 'NomeAttachment' => [ + 'type' => 'normalizedString', + 'size' => '1-60', + ], + 'AlgoritmoCompressione' => [ + 'type' => 'string', + 'size' => '1-10', + ], + 'FormatoAttachment' => [ + 'type' => 'string', + 'size' => '1-10', + ], + 'DescrizioneAttachment' => [ + 'type' => 'normalizedString', + 'size' => '1-100', + ], + 'Attachment' => [ + 'type' => 'base64Binary', + ], + ]; +} diff --git a/update/2_4_1.sql b/update/2_4_1.sql index c1a2e657f..10a150cbd 100644 --- a/update/2_4_1.sql +++ b/update/2_4_1.sql @@ -63,7 +63,6 @@ INSERT INTO `zz_group_view` (`id_gruppo`, `id_vista`) VALUES (4, (SELECT id FROM `zz_views` WHERE id_module=(SELECT id FROM zz_modules WHERE name='Modelli prima nota') AND name='id' )), (4, (SELECT id FROM `zz_views` WHERE id_module=(SELECT id FROM zz_modules WHERE name='Modelli prima nota') AND name='Causale predefinita' )); - -- Widget per stampa calendario INSERT INTO `zz_widgets` (`id`, `name`, `type`, `id_module`, `location`, `class`, `query`, `bgcolor`, `icon`, `print_link`, `more_link`, `more_link_type`, `php_include`, `text`, `enabled`, `order`, `help` ) VALUES (NULL, 'Stampa calendario', 'print', '1', 'controller_top', 'col-md-12', NULL, '#4ccc4c', 'fa fa-print', '', './modules/dashboard/widgets/stampa_calendario.dashboard.php', 'popup', '', 'Stampa calendario', '1', '7', NULL); @@ -73,11 +72,9 @@ INSERT INTO `zz_prints` (`id`, `id_module`, `is_record`, `name`, `title`, `direc -- Rimosso group by nome banche UPDATE `zz_modules` SET `options` = 'SELECT |select| FROM `co_banche` WHERE 1=1 AND deleted = 0 HAVING 2=2' WHERE `zz_modules`.`name` = 'Banche'; - -- impianti per pianificazione contratti ALTER TABLE `co_righe_contratti` ADD `idimpianti` VARCHAR(255) NOT NULL AFTER `idsede`; - -- Struttura della tabella `co_righe_contratti_materiali` CREATE TABLE IF NOT EXISTS `co_righe_contratti_materiali` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -97,7 +94,6 @@ CREATE TABLE IF NOT EXISTS `co_righe_contratti_materiali` ( KEY `id_riga_contratto` (`id_riga_contratto`) ); - -- Struttura della tabella `co_righe_contratti_articoli` CREATE TABLE IF NOT EXISTS `co_righe_contratti_articoli` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -122,7 +118,6 @@ CREATE TABLE IF NOT EXISTS `co_righe_contratti_articoli` ( KEY `idimpianto` (`idimpianto`) ); - -- Modifica query wiget per mostrare solo quelli che non sono stati rinnovati UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(id) AS dato, co_contratti.id, DATEDIFF( data_conclusione, NOW() ) AS giorni_rimanenti FROM co_contratti WHERE idstato IN(SELECT id FROM co_staticontratti WHERE fatturabile = 1) AND rinnovabile=1 AND NOW() > DATE_ADD( data_conclusione, INTERVAL - ABS(giorni_preavviso_rinnovo) DAY) AND YEAR(data_conclusione) > 1970 HAVING ISNULL((SELECT id FROM co_contratti contratti WHERE contratti.idcontratto_prev=co_contratti.id )) ORDER BY giorni_rimanenti ASC' WHERE `zz_widgets`.`name` = 'Contratti in scadenza'; @@ -141,7 +136,6 @@ UPDATE `in_interventi_tecnici` SET `uid` = NULL WHERE `uid` = ''; UPDATE `in_interventi_tecnici` SET `summary` = NULL WHERE `summary` = ''; ALTER TABLE `in_interventi_tecnici` CHANGE `uid` `uid` int(11); - -- Aggiorno campo 'Data' in 'Data movimento' UPDATE `zz_views` SET `name` = 'Data movimento', `order` = '6' WHERE `zz_views`.`id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Movimenti') AND name = 'Data'; diff --git a/update/2_4_2.php b/update/2_4_2.php index c35ba1800..fe9e1ce69 100644 --- a/update/2_4_2.php +++ b/update/2_4_2.php @@ -1,6 +1,8 @@ 'Afghanistan', @@ -42,7 +44,7 @@ $it = [ 'CA' => 'Canada', 'CV' => 'Capo Verde', 'BQ' => 'Caraibi olandesi', - 'CZ' => 'Cèchia', + 'CZ' => 'Repubblica ceca', 'EA' => 'Ceuta e Melilla', 'TD' => 'Ciad', 'CL' => 'Cile', @@ -144,7 +146,7 @@ $it = [ 'LU' => 'Lussemburgo', 'MG' => 'Madagascar', 'MW' => 'Malawi', - 'MY' => 'Malaysia', + 'MY' => 'Malesia', 'MV' => 'Maldive', 'ML' => 'Mali', 'MT' => 'Malta', @@ -258,6 +260,7 @@ $it = [ 'YE' => 'Yemen', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe', + 'AN' => 'Antille olandesi', ]; $en = [ @@ -314,8 +317,8 @@ $en = [ 'CC' => 'Cocos (Keeling) Islands', 'CO' => 'Colombia', 'KM' => 'Comoros', - 'CG' => 'Congo - Brazzaville', - 'CD' => 'Congo - Kinshasa', + 'CG' => 'Repubblica del Congo', + 'CD' => 'Repubblica Democratica del Congo', 'CK' => 'Cook Islands', 'CR' => 'Costa Rica', 'CI' => 'Côte d’Ivoire', @@ -516,11 +519,104 @@ $en = [ 'YE' => 'Yemen', 'ZM' => 'Zambia', 'ZW' => 'Zimbabwe', + 'AN' => 'Netherlands Antilles', ]; +// Fix dei valori preimpostati +$database->update('an_nazioni', [ + 'nome' => 'Antigua e Barbuda', +], ['nome' => 'ANTIGUA AND BARBUDA']); + +$database->update('an_nazioni', [ + 'nome' => 'Azerbaijan', +], ['nome' => 'AZERBAIJAN REPUBLIC']); + +$database->update('an_nazioni', [ + 'nome' => 'Bosnia & Herzegovina', +], ['nome' => 'BOSNIA AND HERZEGOVINA']); + +$database->update('an_nazioni', [ + 'nome' => 'China', +], ['nome' => 'CHINA WORLDWIDE']); + +$database->update('an_nazioni', [ + 'nome' => 'Repubblica Democratica del Congo', +], ['nome' => 'DEMOCRATIC REPUBLIC OF THE CONGO']); + +$database->update('an_nazioni', [ + 'nome' => 'Micronesia', +], ['nome' => 'FEDERATED STATES OF MICRONESIA']); + +$database->update('an_nazioni', [ + 'nome' => 'Gabon', +], ['nome' => 'GABON REPUBLIC']); + +$database->update('an_nazioni', [ + 'nome' => 'Guinea-Bissau', +], ['nome' => 'GUINEA BISSAU']); + +$database->update('an_nazioni', [ + 'nome' => 'RAS di Hong Kong', +], ['nome' => 'HONG KONG']); + +$database->update('an_nazioni', [ + 'nome' => 'Paesi Bassi', +], ['nome' => 'OLANDA']); + +$database->update('an_nazioni', [ + 'nome' => 'Norway', +], ['nome' => 'NORWEGIA']); + +$database->update('an_nazioni', [ + 'nome' => 'Saint Vincent e Grenadines', +], ['nome' => 'SAINT VINCENT AND THE GRENADINES']); + +$database->update('an_nazioni', [ + 'nome' => 'South Africa', +], ['nome' => 'SUD AFRICA']); + +$database->update('an_nazioni', [ + 'nome' => 'Corea del Sud', +], ['nome' => 'SUD KOREA']); + +$database->update('an_nazioni', [ + 'nome' => 'Saint Kitts e Nevis', +], ['nome' => 'ST. KITTS AND NEVIS']); + +$database->update('an_nazioni', [ + 'nome' => 'St. Pierre & Miquelon', +], ['nome' => 'ST. PIERRE AND MIQUELON']); + +$database->update('an_nazioni', [ + 'nome' => 'Svalbard e Jan Mayen', +], ['nome' => 'SVALBARD AND JAN MAYEN ISLANDS']); + +$database->update('an_nazioni', [ + 'nome' => 'Isole Turks e Caicos', +], ['nome' => 'TURKS AND CAICOS ISLANDS']); + +$database->update('an_nazioni', [ + 'nome' => 'Wallis & Futuna', +], ['nome' => 'WALLIS AND FUTUNA ISLANDS']); + +// Aggiornamenti e inserimenti foreach ($it as $key => $value) { - $database->update('an_nazioni', [ - 'iso2' => $key, - 'name' => $en[$key], - ], ['nome' => $value]); + $italian = $value; + $english = $en[$key]; + + if ($database->fetchNum('SELECT id FROM an_nazioni WHERE nome IN('.prepare($italian).', '.prepare($english).')') != 0) { + $database->update('an_nazioni', [ + 'iso2' => $key, + 'nome' => $italian, + 'name' => $english, + ], [ + 'nome' => [$italian, $english], + ]); + } else { + $database->insert('an_nazioni', [ + 'iso2' => $key, + 'nome' => $italian, + 'name' => $english, + ]); + } } diff --git a/update/2_4_2.sql b/update/2_4_2.sql index ee1e28e8f..bff6d9c96 100644 --- a/update/2_4_2.sql +++ b/update/2_4_2.sql @@ -28,3 +28,164 @@ INSERT INTO `zz_modules` (`id`, `name`, `title`, `directory`, `options`, `option -- Fatturazione elettronica ALTER TABLE `an_nazioni` ADD `name` VARCHAR(255); +ALTER TABLE `co_documenti` ADD `codice_xml` VARCHAR(255); + +CREATE TABLE IF NOT EXISTS `fe_regime_fiscale` ( + `codice` varchar(4) NOT NULL, + `descrizione` varchar(255) NOT NULL, + PRIMARY KEY (`codice`) +) ENGINE=InnoDB; + +-- Tabelle per la fatturazione elettronica +INSERT INTO `fe_regime_fiscale` (`codice`, `descrizione`) VALUES +('RF01','Ordinario'), +('RF02','Contribuenti minimi (art.1, c.96-117, L. 244/07)'), +('RF04','Agricoltura e attività connesse e pesca (artt.34 e 34-bis, DPR 633/72)'), +('RF05','Vendita sali e tabacchi (art.74, c.1, DPR. 633/72)'), +('RF06','Commercio fiammiferi (art.74, c.1, DPR 633/72)'), +('RF07','Editoria (art.74, c.1, DPR 633/72)'), +('RF08','Gestione servizi telefonia pubblica (art.74, c.1, DPR 633/72)'), +('RF09','Rivendita documenti di trasporto pubblico e di sosta (art.74, c.1, DPR 633/72)'), +('RF10','Intrattenimenti, giochi e altre attività di cui alla tariffa allegata al DPR 640/72 (art.74, c.6, DPR 633/72)'), +('RF11','Agenzie viaggi e turismo (art.74-ter, DPR 633/72)'), +('RF12','Agriturismo (art.5, c.2, L. 413/91)'), +('RF13','Vendite a domicilio (art.25-bis, c.6, DPR 600/73)'), +('RF14','Rivendita beni usati, oggetti d’arte, d’antiquariato o da collezione (art.36, DL 41/95)'), +('RF15','Agenzie di vendite all’asta di oggetti d’arte, antiquariato o da collezione (art.40-bis, DL 41/95)'), +('RF16','IVA per cassa P.A. (art.6, c.5, DPR 633/72)'), +('RF17','IVA per cassa (art. 32-bis, DL 83/2012)'), +('RF18','Altro'), +('RF19','Regime forfettario (art.1, c.54-89, L. 190/2014)'); + +CREATE TABLE IF NOT EXISTS `fe_tipo_cassa` ( + `codice` varchar(4) NOT NULL, + `descrizione` varchar(255) NOT NULL, + PRIMARY KEY (`codice`) +) ENGINE=InnoDB; + +INSERT INTO `fe_tipo_cassa` (`codice`, `descrizione`) VALUES +('TC01','Cassa nazionale previdenza e assistenza avvocati e procuratori legali'), +('TC02','Cassa previdenza dottori commercialisti'), +('TC03','Cassa previdenza e assistenza geometri'), +('TC04','Cassa nazionale previdenza e assistenza ingegneri e architetti liberi professionisti'), +('TC05','Cassa nazionale del notariato'), +('TC06','Cassa nazionale previdenza e assistenza ragionieri e periti commerciali'), +('TC07','Ente nazionale assistenza agenti e rappresentanti di commercio (ENASARCO)'), +('TC08','Ente nazionale previdenza e assistenza consulenti del lavoro (ENPACL)'), +('TC09','Ente nazionale previdenza e assistenza medici (ENPAM)'), +('TC10','Ente nazionale previdenza e assistenza farmacisti (ENPAF)'), +('TC11','Ente nazionale previdenza e assistenza veterinari (ENPAV)'), +('TC12','Ente nazionale previdenza e assistenza impiegati dell agricoltura (ENPAIA)'), +('TC13','Fondo previdenza impiegati imprese di spedizione e agenzie marittime'), +('TC14','Istituto nazionale previdenza giornalisti italiani (INPGI)'), +('TC15','Opera nazionale assistenza orfani sanitari italiani (ONAOSI)'), +('TC16','Cassa autonoma assistenza integrativa giornalisti italiani (CASAGIT)'), +('TC17','Ente previdenza periti industriali e periti industriali laureati (EPPI)'), +('TC18','Ente previdenza e assistenza pluricategoriale (EPAP)'), +('TC19','Ente nazionale previdenza e assistenza biologi (ENPAB)'), +('TC20','Ente nazionale previdenza e assistenza professione infermieristica (ENPAPI)'), +('TC21','Ente nazionale previdenza e assistenza psicologi (ENPAP)'), +('TC22','INPS'); + +CREATE TABLE IF NOT EXISTS `fe_modalita_pagamento` ( + `codice` varchar(4) NOT NULL, + `descrizione` varchar(255) NOT NULL, + PRIMARY KEY (`codice`) +) ENGINE=InnoDB; + +INSERT INTO `fe_modalita_pagamento` (`codice`, `descrizione`) VALUES +('MP01','Contanti'), +('MP02','Assegno'), +('MP03','Assegno circolare'), +('MP04','Contanti presso Tesoreria'), +('MP05','Bonifico'), +('MP06','Vaglia cambiario'), +('MP07','Bollettino bancario'), +('MP08','Carta di pagamento'), +('MP09','RID'), +('MP10','RID utenze'), +('MP11','RID veloce'), +('MP12','RIBA'), +('MP13','MAV'), +('MP14','Quietanza erario'), +('MP15','Giroconto su conti di contabilità speciale'), +('MP16','Domiciliazione bancaria'), +('MP17','Domiciliazione postale'), +('MP18','Bollettino di c/c postale'), +('MP19','SEPA Direct Debit'), +('MP20','SEPA Direct Debit CORE'), +('MP21','SEPA Direct Debit B2B'), +('MP22','Trattenuta su somme già riscosse'); + +CREATE TABLE IF NOT EXISTS `fe_tipi_documento` ( + `codice` varchar(4) NOT NULL, + `descrizione` varchar(255) NOT NULL, + PRIMARY KEY (`codice`) +) ENGINE=InnoDB; + +INSERT INTO `fe_tipi_documento` (`codice`, `descrizione`) VALUES +('TD01','Fattura'), +('TD02','Acconto/anticipo su fattura'), +('TD03','Acconto/anticipo su parcella'), +('TD04','Nota di credito'), +('TD05','Nota di debito'), +('TD06','Parcella'); + +ALTER TABLE `co_tipidocumento` ADD `codice_fe` varchar(4) NOT NULL; +UPDATE `co_tipidocumento` SET `codice_fe` = 'TD01' WHERE `descrizione` IN('Fattura immediata di acquisto', 'Fattura immediata di vendita', 'Fattura differita di acquisto', 'Fattura differita di vendita', 'Fattura accompagnatoria di acquisto', 'Fattura accompagnatoria di vendita'); +UPDATE `co_tipidocumento` SET `codice_fe` = 'TD04', `descrizione` = 'Nota di credito' WHERE `descrizione` = 'Nota di accredito'; +UPDATE `co_tipidocumento` SET `codice_fe` = 'TD05', `descrizione` = 'Nota di debito' WHERE `descrizione` = 'Nota di addebito'; +ALTER TABLE `co_tipidocumento` ADD FOREIGN KEY (`codice_fe`) REFERENCES `fe_tipi_documento`(`codice`) ON DELETE CASCADE; + +CREATE TABLE IF NOT EXISTS `fe_natura` ( + `codice` varchar(2) NOT NULL, + `descrizione` text NOT NULL, + PRIMARY KEY (`codice`) +) ENGINE=InnoDB; + +INSERT INTO `fe_natura` (`codice`, `descrizione`) VALUES +('N1','Escluse ex art. 15'), +('N2','Non soggette'), +('N3','Non imponibili'), +('N4','Esenti'), +('N5','Regime del margine / IVA non esposta in fattura'), +('N6','Inversione contabile (per le operazioni in reverse charge ovvero nei casi di autofatturazione per acquisti extra UE di servizi ovvero per importazioni di beni nei soli casi previsti)'), +('N7','IVA assolta in altro stato UE (vendite a distanza ex art. 40 c. 3 e 4 e art. 41 c. 1 lett. b, DL 331/93; prestazione di servizi di telecomunicazioni, tele-radiodiffusione ed elettronici ex art. 7-sexies lett. f, g, art. 74-sexies DPR 633/72)'); + +CREATE TABLE IF NOT EXISTS `fe_causali_pagamento_ritenuta` ( + `codice` varchar(4) NOT NULL, + `descrizione` varchar(1000) NOT NULL, + PRIMARY KEY (`codice`) +) ENGINE=InnoDB; + +INSERT INTO `fe_causali_pagamento_ritenuta` (`codice`, `descrizione`) VALUES +('A', 'Prestazioni di lavoro autonomo rientranti nell''esercizio di arte o professione abituale'), +('B', 'Utilizzazione economica, da parte dell''autore o dell''inventore, di opere dell''ingegno, di brevetti industriali e di processi, formule o informazioni relativi a esperienze acquisite in campo industriale, commerciale o scientifico'), +('C', 'Utili derivanti da contratti di associazione in partecipazione e da contratti di cointeressenza, quando l''apporto è costituito esclusivamente dalla prestazione di lavoro'), +('D', 'Utili spettanti ai soci promotori e ai soci fondatori delle società di capitali'), +('E', 'Levata di protesti cambiari da parte dei segretari comunali'), +('G', 'Indennità corrisposte per la cessazione di attività sportiva professionale'), +('H', 'Indennità corrisposte per la cessazione dei rapporti di agenzia delle persone fisiche e delle società di persone, con esclusione delle somme maturate entro il 31.12.2003, già imputate per competenza e tassate come reddito d''impresa'), +('I', 'Indennità corrisposte per la cessazione da funzioni notarili'), +('L', 'Utilizzazione economica, da parte di soggetto diverso dall''autore o dall''inventore, di opere dell''ingegno, di brevetti industriali e di processi, formule e informazioni relative a esperienze acquisite in campo industriale, commerciale o scientifico'), +('M', 'Prestazioni di lavoro autonomo non esercitate abitualmente, obblighi di fare, di non fare o permettere'), +('N', 'Indennità di trasferta, rimborso forfetario di spese, premi e compensi erogati nell''esercizio diretto di attività sportive dilettantistiche e in relazione a rapporti di collaborazione coordinata e continuativa di carattere amministrativo-gestionale, di natura non profe +ssionale, resi a favore di società e associazioni sportive dilettantistiche e di cori, bande e filodrammatiche da parte del diretto +re e dei collaboratori tecnici'), +('O', 'Prestazioni di lavoro autonomo non esercitate abitualmente, obblighi di fare, di non fare o permettere, per le quali non sussiste l''obbligo di iscrizione alla gestione separata (Circ. Inps 104/2001)'), +('P', 'Compensi corrisposti a soggetti non residenti privi di stabile organizzazione per l''uso o la concessione in uso di attrezzature industriali, commerciali o scientifiche che si trovano nel territorio dello Stato ovvero a società svizzere o stabili organizzazioni di soci +età svizzere che possiedono i requisiti di cui all''art. 15, c. 2 dell’Accordo tra la Comunità Europea e la Confederazione svizzera del 26.10 +.2004 (pubblicato in G.U.C.E. 29.12.2004, n. 385/30)'), +('Q', 'Provvigioni corrisposte ad agente o rappresentante di commercio monomandatario'), +('R', 'Provvigioni corrisposte ad agente o rappresentante di commercio plurimandatario'), +('S', 'Provvigioni corrisposte a commissionario'), +('T', 'Provvigioni corrisposte a mediatore'), +('U', 'Provvigioni corrisposte a procacciatore di affari'), +('V', 'Provvigioni corrisposte a incaricato per le vendite a domicilio e provvigioni corrisposte a incaricato per la vendita porta a porta e per la vendita ambulante di giornali quotidiani e periodici (L. 25.02.1987, n. 67)'), +('W', 'Corrispettivi erogati nel 2013 per prestazioni relative a contratti d''appalto cui si sono resi applicabili le disposizioni contenute nell''art. 25-ter D.P.R. 600/1973'), +('X', 'Canoni corrisposti nel 2004 da società o enti residenti, ovvero da stabili organizzazioni di società estere di cui all''art. 26-quater, c. 1, lett. a) e b) D.P.R. 600/1973, a società o stabili organizzazioni di società, situate in altro Stato membro dell''Unione Europea in presenza dei relativi requisiti richiesti, per i quali è stato effettuato nel 2006 il rimborso della ritenuta ai sensi dell''art. 4 D. Lgs. 143/2005'), +('Y', 'Canoni corrisposti dal 1.01.2005 al 26.07.2005 da soggetti di cui al punto precedente'), +('Z', 'Titolo diverso dai precedenti'); + +-- Impostazione per Regime Fiscale +INSERT INTO `zz_settings` (`idimpostazione`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES (NULL, 'Regime Fiscale', 'RF01', 'query=SELECT codice AS id, descrizione FROM fe_regime_fiscale', 1, 'Generali', 19);