diff --git a/CHANGELOG.md b/CHANGELOG.md index 28cb4fd44..4a4844df6 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,8 +46,6 @@ Il formato utilizzato è basato sulle linee guida di [Keep a Changelog](http://k - Aggiunta stampa del bilancio - Aggiunta possibilità di notificare al cliente/tecnico in modo automatico quando viene cambiato lo stato dell'intervento - Aggiunta flag per escludere la generazione scadenza di una ritenuta d'acconto se viene versata dal fornitore - - Aggiunta stampa fattura elettronica nelle fatture di vendita e di acquisto - - Aggiunta azione massiva per esportare le stampe delle fatture elettroniche ### Modificato (Changed) - Impostazione CAP automatico a 99999 nella FE per clienti esteri diff --git a/add.php b/add.php index d0ff12c82..c19114543 100755 --- a/add.php +++ b/add.php @@ -91,7 +91,6 @@ $(document).ready(function(){ select = "#'.get('select').'"; if ($(select).val() !== undefined) { $(select).selectSetNew(response.id, response.text, response.data); - $(select).change(); } $form.closest("div[id^=bs-popup").modal("hide"); diff --git a/composer.json b/composer.json index 24950b58a..f3d0ce6f4 100755 --- a/composer.json +++ b/composer.json @@ -55,8 +55,7 @@ "symfony/polyfill-php70": "^1.8", "symfony/translation": "^3.3", "symfony/var-dumper": "^3.3", - "willdurand/geocoder": "^3.3", - "ckeditor/ckeditor": "dev-full/stable" + "willdurand/geocoder": "^3.3" }, "require-dev": { "codeception/codeception": "^3.0", diff --git a/gulpfile.js b/gulpfile.js index 812ff7ce5..7bd55701b 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -274,8 +274,8 @@ function srcFonts() { function ckeditor() { return gulp.src([ - './vendor/ckeditor/ckeditor/{adapters,lang,skins,plugins}/**/*.{js,json,css,png}', - './vendor/ckeditor/ckeditor/*.{js,css}', + config.nodeDirectory + '/ckeditor4/{adapters,lang,skins,plugins}/**/*.{js,json,css,png}', + config.nodeDirectory + '/ckeditor4/*.{js,css}', ]) .pipe(gulp.dest(config.production + '/' + config.paths.js + '/ckeditor')); } @@ -345,7 +345,7 @@ function i18n() { config.nodeDirectory + '/**/{i18n,lang,locale,locales}/*.{js,json}', config.development + '/' + config.paths.js + '/i18n/**/*.{js,json}', '!' + config.nodeDirectory + '/**/{src,plugins}/**', - '!./vendor/ckeditor/ckeditor/**', + '!' + config.nodeDirectory + '/ckeditor4/**', '!' + config.nodeDirectory + '/summernote/**', '!' + config.nodeDirectory + '/jquery-ui/**', ]) diff --git a/modules/anagrafiche/edit.php b/modules/anagrafiche/edit.php index 7be4e868b..f70bc65a2 100755 --- a/modules/anagrafiche/edit.php +++ b/modules/anagrafiche/edit.php @@ -450,10 +450,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) { '; } else { echo ' -
- '.tr('Non sono presenti banche per l\'anagrafica').'... '.Modules::link('Banche', null, tr('Creane una')).' -
'; - +

'.tr("Nessuna banca disponibile per l'Anagrafica").'

'; } echo ' @@ -680,7 +677,7 @@ if ($is_cliente or $is_fornitore or $is_tecnico) {
- {[ "type": "checkbox", "label": "", "name": "disable_newsletter", "value": "" ]} + {[ "type": "checkbox", "label": "", "name": "disable_newsletter", "value": "" ]}
diff --git a/modules/articoli/add.php b/modules/articoli/add.php index b0a962938..c7fe120f3 100755 --- a/modules/articoli/add.php +++ b/modules/articoli/add.php @@ -101,7 +101,7 @@ include_once __DIR__.'/../../core.php';
@@ -84,33 +94,59 @@ echo '
'; $iva_righe = $contratto->getRighe()->groupBy('idiva'); + +/* foreach ($iva_righe as $id_iva => $righe) { $iva = $righe->first()->aliquota; + $descrizione = $righe->first()->descrizione; $righe = $righe->toArray(); +*/ + +$righe = $contratto->getRighe(); + +echo ' +
+

'.tr("Puoi utilizzare le seguenti variabili nella descrizione delle righe").':

'.variables()['list'].' +
'; + +foreach ($righe as $riga) { + $id_iva = $riga->id_iva; + $descrizione = $riga->descrizione."\n{periodo}"; + + $options = [ + 'id' => $riga->id, + 'totale_imponibile' => $riga->totale_imponibile, + 'iva' => $riga->iva, + 'totale' => $riga->totale, + 'qta' => $riga->qta, + ]; + $options = json_encode($options); echo ' -
'.tr('Informazioni generali sulle righe con IVA: _IVA_', [ - '_IVA_' => $iva->descrizione, - ]).'
+
- {[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione['.$id_iva.']", "value": "'.tr('Canone contratto numero _NUM__IVA_', [ - '_IVA_' => (count($iva_righe) > 1) ? ': '.$iva->descrizione : '', - '_NUM_' => $contratto->numero, - ]).'" ]} + {[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "descrizione['.$riga->id.']", "value": "'.$descrizione.'" ]} - {[ "type": "number", "label": "'.tr('Q.tà per fattura').'", "name": "qta['.$id_iva.']", "required": 1, "value": "1", "decimals": "qta", "min-value": "1" ]} + {[ "type": "number", "label": "'.tr('Q.tà per fattura').'", "class":"qta_fattura", "name": "qta['.$riga->id.']", "required": 1, "value": "1", "decimals": "qta", "min-value": "1", "icon-after":"'.tr('Su _TOT_',[ + '_TOT_' => Translator::numberToLocale( ($riga->qta-$riga->qta_evasa) ), + ]).'", "options":"'.str_replace('"','\"',$options).'" ]}
-
-

'.tr('Imponibile').': '.moneyFormat(sum(array_column($righe, 'totale_imponibile'))).'

-

'.tr('IVA').': '.moneyFormat(sum(array_column($righe, 'iva'))).'

-

'.tr('Totale').': '.moneyFormat(sum(array_column($righe, 'totale'))).'

+

'; } +echo ' +
+
+
+
'; + echo '
@@ -127,15 +163,98 @@ echo ' '; diff --git a/plugins/pianificazione_fatturazione/ajax_cadenza.php b/plugins/pianificazione_fatturazione/ajax_cadenza.php new file mode 100644 index 000000000..b37cab03b --- /dev/null +++ b/plugins/pianificazione_fatturazione/ajax_cadenza.php @@ -0,0 +1,93 @@ +. + */ + +use Carbon\Carbon; +use Modules\Contratti\Contratto; + +include_once __DIR__.'/../../core.php'; + +$contratto = Contratto::find($id_record); + +if(get('scadenza')=='Mensile'){ + $timeing = '+1 month'; +} +if(get('scadenza')=='Bimestrale'){ + $timeing = '+2 month'; +} +if(get('scadenza')=='Trimestrale'){ + $timeing = '+3 month'; +} +if(get('scadenza')=='Quadrimestrale'){ + $timeing = '+4 month'; +} +if(get('scadenza')=='Semestrale'){ + $timeing = '+6 month'; +} +if(get('scadenza')=='Annuale'){ + $timeing = '+12 month'; +} + +$data_inizio = new Carbon(get('data_inizio')); + +echo ' +
'; + + $data_corrente = $data_inizio->startOfMonth(); + $data_conclusione = $contratto->data_conclusione; + $count = 0; + + while ($data_corrente->lessThanOrEqualTo($data_conclusione)) { + $data = $data_corrente->endOfMonth()->format('Y-m-d'); + $data_fatturazione = ($data_fatturazione ?: date("Y-m", strtotime($data)) ); + unset($checked); + + if( $id_module==Modules::get('Contratti')['id'] ){ + if( $data==date("Y-m-t", strtotime($timeing, strtotime($data_fatturazione)) ) ){ + $checked = 'checked'; + $data_fatturazione = date("Y-m", strtotime($data)); + } + } + + echo ' +
+ + +
'; + + $data_corrente = $data_corrente->addDay(); + ++$count; + } + + echo ' +
+ +'; \ No newline at end of file diff --git a/plugins/pianificazione_fatturazione/crea_fattura.php b/plugins/pianificazione_fatturazione/crea_fattura.php index 79775519b..8bf7c81f2 100755 --- a/plugins/pianificazione_fatturazione/crea_fattura.php +++ b/plugins/pianificazione_fatturazione/crea_fattura.php @@ -1,7 +1,7 @@ pianificazioni->search(function ($item) use ($id_pian $module_fattura = Modules::get('Fatture di vendita'); $id_conto = setting('Conto predefinito fatture di vendita'); +$data = date("Y-m",strtotime($pianificazione->data_scadenza))."-".date("d",strtotime($contratto->data_accettazione)); echo '
@@ -47,7 +48,7 @@ echo ' echo '
- {[ "type": "date", "label": "'.tr('Data').'", "name": "data", "required": 1, "class": "text-center", "value": "-now-" ]} + {[ "type": "date", "label": "'.tr('Data').'", "name": "data", "required": 1, "class": "text-center", "value": "'.$pianificazione->data_scadenza.'" ]}
'; // Tipo di documento diff --git a/plugins/pianificazione_fatturazione/edit.php b/plugins/pianificazione_fatturazione/edit.php index 0a235a9e7..2bbc1b4ea 100755 --- a/plugins/pianificazione_fatturazione/edit.php +++ b/plugins/pianificazione_fatturazione/edit.php @@ -1,7 +1,7 @@ 'Gennaio', + '02' => 'Febbraio', + '03' => 'Marzo', + '04' => 'Aprile', + '05' => 'Maggio', + '06' => 'Giugno', + '07' => 'Luglio', + '08' => 'Agosto', + '09' => 'Settembre', + '11' => 'Ottobre', + '11' => 'Novembre', + '12' => 'Dicembre', + ]; + + $result['list'] = ""; + + if( !empty($descrizione) ){ + $result['descrizione'] = str_replace("{periodo}","durata dal ".Translator::dateToLocale($inizio)." al ".Translator::dateToLocale($fine),$descrizione); + $result['descrizione'] = str_replace("{data_inizio}",Translator::dateToLocale($inizio), $result['descrizione']); + $result['descrizione'] = str_replace("{data_fine}",Translator::dateToLocale($fine), $result['descrizione']); + $result['descrizione'] = str_replace("{mese_fatturazione}", $mese[date('m',strtotime($inizio))], $result['descrizione']); + } + + return $result; + } \ No newline at end of file diff --git a/plugins/pianificazione_fatturazione/src/Pianificazione.php b/plugins/pianificazione_fatturazione/src/Pianificazione.php index 42ee2b691..0bdca3812 100755 --- a/plugins/pianificazione_fatturazione/src/Pianificazione.php +++ b/plugins/pianificazione_fatturazione/src/Pianificazione.php @@ -1,7 +1,7 @@ leftjoin('co_contratti', 'co_contratti.id', '=', 'co_fatturazione_contratti.idcontratto') - ->leftjoin('an_anagrafiche', 'an_anagrafiche.idanagrafica', '=', 'co_contratti.idanagrafica') ->orderBy('data_scadenza', 'asc') - ->orderBy('ragione_sociale', 'asc') ->whereHas('contratto', function($q){ $q->whereHas('stato', function($q){ $q->where('is_fatturabile', 1); diff --git a/plugins/rinnovi_contratti/edit.php b/plugins/rinnovi_contratti/edit.php index dec0375e9..e35970a17 100755 --- a/plugins/rinnovi_contratti/edit.php +++ b/plugins/rinnovi_contratti/edit.php @@ -18,13 +18,48 @@ */ include_once __DIR__.'/../../core.php'; +include_once __DIR__.'/../init.php'; $id_contratto_precedente = $record['idcontratto_prev']; -if (empty($id_contratto_precedente)) { - echo ' - '; -} +echo ' + + + + + +
+
+

'.tr('Informazioni per rinnovo').'

+
+ +
+ +
+
+ {[ "type": "checkbox", "label": "'.tr('Rinnovabile').'", "name": "rinnovabile", "help": "'.tr('Il contratto è rinnovabile?').'", "value": "$rinnovabile$" ]} +
+ +
+ {[ "type": "checkbox", "label": "'.tr('Rinnovo automatico').'", "name": "rinnovo_automatico", "help": "'.tr('Il contratto è da rinnovare automaticamente alla scadenza').'", "value": "$rinnovo_automatico$", "disabled": '.($record['rinnovabile'] ? 0 : 1).' ]} +
+ + +
+ {[ "type": "number", "label": "'.tr('Preavviso per rinnovo').'", "name": "giorni_preavviso_rinnovo", "decimals": "2", "value": "$giorni_preavviso_rinnovo$", "icon-after": "giorni", "disabled": '.($record['rinnovabile'] ? 0 : 1).' ]} +
+ +
+ {[ "type": "number", "label": "'.tr('Ore rimanenti rinnovo').'", "name": "ore_preavviso_rinnovo", "decimals": "2", "value": "$ore_preavviso_rinnovo$", "icon-after": "ore", "disabled": '.($record['rinnovabile'] ? 0 : 1).', "help": "'.tr('Ore residue nel contratto prima di visualizzare una avviso per un eventuale rinnovo anticipato.').'" ]} +
+
+ +
+ +
+
+
+'; echo ' diff --git a/plugins/statistiche_articoli/edit.php b/plugins/statistiche_articoli/edit.php index c2e33af2d..87000825c 100755 --- a/plugins/statistiche_articoli/edit.php +++ b/plugins/statistiche_articoli/edit.php @@ -43,7 +43,7 @@ echo '
-

'.tr('Prezzo medio acquisto').'

+

'.tr('Prezzo medio acquisto').'

@@ -69,7 +69,7 @@ echo '
-

'.tr('Prezzo medio vendita').'

+

'.tr('Prezzo medio vendita').'

diff --git a/src/API/App/v1/Interventi.php b/src/API/App/v1/Interventi.php index 798f31ee6..a6d4cc11b 100644 --- a/src/API/App/v1/Interventi.php +++ b/src/API/App/v1/Interventi.php @@ -148,8 +148,7 @@ class Interventi extends AppResource IF(idsede_destinazione = 0, NULL, idsede_destinazione) AS id_sede, firma_file, IF(firma_data = '0000-00-00 00:00:00', '', firma_data) AS firma_data, - firma_nome, - (SELECT GROUP_CONCAT(ragione_sociale SEPARATOR ',') FROM in_interventi_tecnici_assegnati INNER JOIN an_anagrafiche ON in_interventi_tecnici_assegnati.id_tecnico=an_anagrafiche.idanagrafica WHERE id_intervento=in_interventi.id) AS tecnici_assegnati + firma_nome FROM in_interventi WHERE in_interventi.id = ".prepare($id); diff --git a/src/Plugins.php b/src/Plugins.php index 3b90ff89e..279e327c8 100755 --- a/src/Plugins.php +++ b/src/Plugins.php @@ -135,7 +135,7 @@ class Plugins if (!empty($plugin) && in_array($plugin->permission, ['r', 'rw'])) { $anchor = 'tab_'.$plugin->id; - return Modules::link($plugin->module->id, $id_record, $testo, $alternativo, $extra, $blank, $anchor); + return Modules::link($plugin->originalModule->id, $id_record, $testo, $alternativo, $extra, $blank, $anchor); } return $alternativo; diff --git a/templates/fatture_elettroniche/body.php b/templates/fatture_elettroniche/body.php deleted file mode 100644 index d3659b8ac..000000000 --- a/templates/fatture_elettroniche/body.php +++ /dev/null @@ -1,110 +0,0 @@ -. - */ - -use Models\Upload; -use Plugins\ExportFE\FatturaElettronica; - -include_once __DIR__.'/../../core.php'; - -try { - $fattura_pa = new FatturaElettronica($id_record); -} catch (UnexpectedValueException $e) { - echo '
'.tr("Questo documento non è una fattura elettronica").'
'; - return; -} -$file = Upload::where('filename', $fattura_pa->getFilename()) - ->where('id_record', $id_record) - ->first(); - -$file = Models\Upload::find($file['id']); - -if (empty($file)) { - echo '
'.tr("Questo documento non è una fattura elettronica").'
'; - return; -} - -$link = base_path().'/'.$file->filepath; - -if ($file->isFatturaElettronica()) { - $content = file_get_contents(base_dir().'/'.$file->filepath); - - // Individuazione stylesheet - $default_stylesheet = 'asso-invoice'; - - $name = basename($file->original_name); - $filename = explode('.', $name)[0]; - $pieces = explode('_', $filename); - $stylesheet = $pieces[2]; - - $stylesheet = base_dir().'/plugins/xml/'.$stylesheet.'.xsl'; - $stylesheet = file_exists($stylesheet) ? $stylesheet : base_dir().'/plugins/xml/'.$default_stylesheet.'.xsl'; - - // XML - $xml = new DOMDocument(); - $xml->loadXML($content); - - // XSL - $xsl = new DOMDocument(); - $xsl->load($stylesheet); - - // XSLT - $xslt = new XSLTProcessor(); - $xslt->importStylesheet($xsl); - echo $xslt->transformToXML($xml); - - echo ' -'; - - -} else { - echo ' -'; - - if ($file->isImage()) { - echo ' - '; - } else { - if ($file->isPDF()) { - $src = \Prints::getPDFLink($file->filepath); - } - - echo ' - '; - } -} diff --git a/update/2_4_22.sql b/update/2_4_22.sql index 58a37ce67..b4ca30acd 100644 --- a/update/2_4_22.sql +++ b/update/2_4_22.sql @@ -137,6 +137,13 @@ INSERT INTO `zz_views` (`id`, `id_module`, `name`, `query`, `order`, `search`, ` INSERT INTO `zz_group_view` (`id_gruppo`, `id_vista`) (SELECT `zz_groups`.`id`, `zz_views`.`id` FROM `zz_groups`, `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` WHERE `zz_modules`.`name` = 'Fatture di acquisto' AND `zz_views`.`name` = '_bg_'); + +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`) VALUES (NULL, 'Descrizione fattura pianificata', 'Canone {rata} del contratto numero {numero}', 'text', '1', 'Fatturazione'); + +ALTER TABLE `co_righe_contratti` ADD `idpianificazione` INT NULL DEFAULT NULL AFTER `idarticolo`; INSERT INTO `zz_prints` (`id`, `id_module`, `is_record`, `name`, `title`, `filename`, `directory`, `previous`, `options`, `icon`, `version`, `compatibility`, `order`, `predefined`, `default`, `enabled`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name`='Fatture di vendita'), '1', 'Fattura elettronica di vendita', 'Fattura elettronica di vendita', 'Fattura elettronica {numero} del {data}', 'fatture_elettroniche', 'iddocumento', '{\"hide-header\": true, \"hide-footer\": true}', 'fa fa-print', '', '', '0', '1', '1', '1'); -INSERT INTO `zz_prints` (`id`, `id_module`, `is_record`, `name`, `title`, `filename`, `directory`, `previous`, `options`, `icon`, `version`, `compatibility`, `order`, `predefined`, `default`, `enabled`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name`='Fatture di acquisto'), '1', 'Fattura elettronica di acquisto', 'Fattura elettronica di acquisto', 'Fattura elettronica {numero} del {data}', 'fatture_elettroniche', 'iddocumento', '{\"hide-header\": true, \"hide-footer\": true}', 'fa fa-print', '', '', '0', '1', '1', '1'); \ No newline at end of file +INSERT INTO `zz_prints` (`id`, `id_module`, `is_record`, `name`, `title`, `filename`, `directory`, `previous`, `options`, `icon`, `version`, `compatibility`, `order`, `predefined`, `default`, `enabled`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name`='Fatture di acquisto'), '1', 'Fattura elettronica di acquisto', 'Fattura elettronica di acquisto', 'Fattura elettronica {numero} del {data}', 'fatture_elettroniche', 'iddocumento', '{\"hide-header\": true, \"hide-footer\": true}', 'fa fa-print', '', '', '0', '1', '1', '1'); + +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES +(NULL, 'Numero massimo di tentativi', '10', 'integer', 1, 'Newsletter', 1, 'Numero massimo di tentativi da effettuare per cercare di inviare una mail');