From f7bc2da6d6ca03102219aa94c5cc88dbb93c89e3 Mon Sep 17 00:00:00 2001 From: Matteo Baccarin Date: Fri, 24 Jan 2020 15:58:59 +0100 Subject: [PATCH] Reintroduzione plugin Pianificazione fatturazione --- modules/contratti/plugins/addfattura.php | 60 +++ .../contratti.fatturaordiniservizio.php | 377 ++++++++++++++++++ update/2_4_13.sql | 6 +- 3 files changed, 442 insertions(+), 1 deletion(-) create mode 100755 modules/contratti/plugins/addfattura.php create mode 100755 modules/contratti/plugins/contratti.fatturaordiniservizio.php mode change 100644 => 100755 update/2_4_13.sql diff --git a/modules/contratti/plugins/addfattura.php b/modules/contratti/plugins/addfattura.php new file mode 100755 index 000000000..5a4891d3a --- /dev/null +++ b/modules/contratti/plugins/addfattura.php @@ -0,0 +1,60 @@ +fetchArray('SELECT numero, (SELECT descrizione FROM an_zone WHERE id=(SELECT idzona FROM co_ordiniservizio_pianificazionefatture WHERE id='.prepare($idpianificazione).')) AS zona FROM co_contratti WHERE id='.prepare($idcontratto)); +$numero = $rs[0]['numero']; +$zona = $rs[0]['zona']; + +echo ' +
+ '; + +// Data +echo ' +
+
+ {[ "type": "date", "label": "'.tr('Data').'", "name": "data", "required": 1, "class": "text-center", "value": "-now-" ]} +
'; + +// Tipo di documento +echo ' +
+ {[ "type": "select", "label": "'.tr('Tipo di fattura').'", "name": "idtipodocumento", "required": 1, "values": "query=SELECT * FROM co_tipidocumento WHERE dir=\'entrata\'" ]} +
'; + +// Sezionale +echo ' +
+ {[ "type": "select", "label": "'.tr('Sezionale').'", "name": "id_segment", "required": 1, "values": "query=SELECT id, name AS descrizione FROM zz_segments WHERE id_module='.Modules::get('Fatture di vendita')['id'].' ORDER BY name", "value":"'.$_SESSION['module_'.Modules::get('Fatture di vendita')['id']]['id_segment'].'" ]} +
+ +
'; + +// Note +echo ' +
+
+ {[ "type": "textarea", "label": "'.tr('Descrizione').'", "name": "note", "value": "Rata '.$n_rata.' del contratto numero '.$numero.', zona '.$zona.'" ]} +
+
'; + +echo ' + +
+
+ +
+
+
'; + +echo ' + '; diff --git a/modules/contratti/plugins/contratti.fatturaordiniservizio.php b/modules/contratti/plugins/contratti.fatturaordiniservizio.php new file mode 100755 index 000000000..2a14b1395 --- /dev/null +++ b/modules/contratti/plugins/contratti.fatturaordiniservizio.php @@ -0,0 +1,377 @@ + $zone) { + foreach ($zone as $n => $idzona) { + $dbo->query('DELETE FROM co_ordiniservizio_pianificazionefatture WHERE idzona='.prepare($idzona).' AND iddocumento=0 AND idcontratto='.prepare($id_record)); + } + } + + // Ciclo fra le voci in arrivo dal form + foreach (post('zona') as $data_scadenza => $zone) { + // Ogni data può avere più zone da pianificare + foreach ($zone as $n => $idzona) { + // Aggiunta pianificazione solo se la zona è spuntata + if (in_array($idzona, post('idzona'))) { + // Creazione pianificazione + $dbo->query('INSERT INTO co_ordiniservizio_pianificazionefatture(idcontratto, data_scadenza, idzona, iddocumento) VALUES('.prepare($id_record).', '.prepare($data_scadenza).', '.prepare($idzona).', 0)'); + } + + $prev_data = $data_scadenza; + } + } + + flash()->info(tr('Pianificazione generata correttamente!')); +} + +// Eliminazione pianificazione specifica +elseif (get('op') == 'del_pianificazione') { + $idpianificazione = get('idpianificazione'); + + $n = $dbo->fetchNum('SELECT id FROM co_ordiniservizio_pianificazionefatture WHERE id='.prepare($idpianificazione)); + + if ($n == 1) { + // Eliminazione ordine di servizio + if ($dbo->query('DELETE FROM co_ordiniservizio_pianificazionefatture WHERE id='.prepare($idpianificazione))) { + flash()->info(tr('Pianificazione eliminata correttamente!')); + } + } +} + +// Creazione fattura pianificata +elseif (get('op') == 'addfattura') { + $idpianificazione = get('idpianificazione'); + $descrizione = post('note'); + $data = post('data'); + $idtipodocumento = post('idtipodocumento'); + $note = post('note'); + + // Lettura idanagrafica + $rs = $dbo->fetchArray('SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record)); + $idanagrafica = $rs[0]['idanagrafica']; + + $dir = 'entrata'; + $idconto = setting('Conto predefinito fatture di vendita'); + $numero = get_new_numerofattura($data); + $id_segment = post('id_segment'); + $numero_esterno = get_new_numerosecondariofattura($data); + + // Tipo di pagamento + banca predefinite dall'anagrafica + $query = 'SELECT id, (SELECT idbanca_vendite FROM an_anagrafiche WHERE idanagrafica = '.prepare($idanagrafica).') AS idbanca FROM co_pagamenti WHERE id = (SELECT idpagamento_vendite AS pagamento FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica).')'; + $rs = $dbo->fetchArray($query); + $idpagamento = $rs[0]['id']; + $idbanca = $rs[0]['idbanca']; + + // Se la fattura è di vendita e non è stato associato un pagamento predefinito al cliente leggo il pagamento dalle impostazioni + if ($dir == 'entrata' && $idpagamento == '') { + $idpagamento = setting('Tipo di pagamento predefinito'); + } + + // Se non è impostata la banca dell'anagrafica, uso quella del pagamento. + if (empty($idbanca)) { + // Banca predefinita del pagamento + $query = 'SELECT id FROM co_banche WHERE id_pianodeiconti3 = (SELECT idconto_vendite FROM co_pagamenti WHERE id = '.prepare($idpagamento).')'; + $rs = $dbo->fetchArray($query); + $idbanca = $rs[0]['id']; + } + + $query = 'INSERT INTO co_documenti(numero, numero_esterno, idanagrafica, idtipodocumento, idpagamento, data, idstatodocumento, note, idsede_destinazione, id_segment, idconto, idbanca) VALUES ('.prepare($numero).', '.prepare($numero_esterno).', '.prepare($idanagrafica).', '.prepare($idtipodocumento).', '.prepare($idpagamento).', '.prepare($data).", (SELECT `id` FROM `co_statidocumento` WHERE `descrizione`='Bozza'), ".prepare($note).', (SELECT idsede_fatturazione FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica).'), '.prepare($id_segment).', '.prepare($idconto).', '.prepare($idbanca).' )'; + $dbo->query($query); + $iddocumento = $dbo->lastInsertedID(); + + // Imposto l'iddocumento anche sulla pianificazione, giusto per tener traccia della fattura generata + $dbo->query('UPDATE co_ordiniservizio_pianificazionefatture SET iddocumento='.prepare($iddocumento).' WHERE id='.prepare($idpianificazione)); + + // Leggo quante rate si vogliono pagare per dividerle per mese + $rs = $dbo->fetchArray('SELECT id FROM co_ordiniservizio_pianificazionefatture WHERE idcontratto='.prepare($id_record)); + + // L'importo deve essere diviso per il numero di mesi + $rs2 = $dbo->fetchArray('SELECT SUM(subtotale) AS totale FROM co_righe_contratti WHERE idcontratto='.prepare($id_record)); + $importo = $rs2[0]['totale'] / sizeof($rs); + + // Lettura iva del cliente o predefinita + $rs2 = $dbo->fetchArray('SELECT idiva_vendite AS idiva FROM an_anagrafiche WHERE idanagrafica='.prepare($idanagrafica)); + $idiva = $rs2[0]['idiva']; + + if ($idiva != 0) { + $rs2 = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare($idiva)); + } else { + $rs2 = $dbo->fetchArray('SELECT * FROM co_iva WHERE id='.prepare(setting('Iva predefinita'))); + } + + $desc_iva = $rs2[0]['descrizione']; + + $iva = $importo / 100 * $rs2[0]['percentuale']; + $iva_indetraibile = $importo / 100 * $rs2[0]['indetraibile']; + + // Inserimento riga in fattura + $dbo->query('INSERT INTO co_righe_documenti(iddocumento, idcontratto, descrizione, desc_iva, iva, iva_indetraibile, subtotale, um, qta, `order`) VALUES('.prepare($iddocumento).', '.prepare($id_record).', '.prepare($descrizione).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($importo).", '-', 1, (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento=".prepare($iddocumento).'))'); + + redirect($rootdir.'/editor.php?id_module='.Modules::get('Fatture di vendita')['id'].'&id_record='.$iddocumento.'&dir=entrata'); + exit(); +} + +echo ' +
+
+

'.tr('Pianificazione fatturazione').'

+
+
'; + +echo ' +

'.tr('Qui puoi programmare la fatturazione del contratto').'.

'; + +/* + Fatture pianificate +*/ +$rs = $dbo->fetchArray('SELECT *, (SELECT SUM(subtotale) FROM co_righe_contratti WHERE idcontratto='.prepare($id_record).') AS budget_contratto, (SELECT descrizione FROM an_zone WHERE id=idzona) AS zona FROM co_ordiniservizio_pianificazionefatture WHERE idcontratto='.prepare($id_record).' ORDER BY data_scadenza ASC'); + +if (empty($rs)) { + echo ' +

'.tr('Non sono ancora state pianificate fatture').'...

'; +} else { + $rs2 = $dbo->fetchArray('SELECT * FROM co_ordiniservizio_pianificazionefatture WHERE idcontratto='.prepare($id_record).' ORDER BY idzona'); + + for ($i = 0; $i < sizeof($rs2); ++$i) { + // Leggo quante rate sono pianificate per dividere l'importo delle sedi in modo corretto + ++$n_rate[$rs2[$i]['idzona']]; + + // Leggo il totale già fatturato per questa zona per toglierlo dalla divisione (totale/n_rate) + $rs3 = $dbo->fetchArray('SELECT SUM(subtotale-sconto) AS totale FROM co_righe_documenti WHERE iddocumento IN (SELECT iddocumento FROM co_ordiniservizio_pianificazionefatture WHERE iddocumento='.prepare($rs2[$i]['iddocumento']).')'); + $gia_fatturato[$rs2[$i]['idzona']] += $rs3[0]['totale']; + } + + echo ' + + + + + + + + + '; + + $prev_mese = ''; + $n_rata = 0; + + for ($i = 0; $i < sizeof($rs); ++$i) { + // Lettura numero di sedi in cui si sono pianificati ordini di servizio per la zona corrente + if (!empty($rs[$i]['idzona'])) { + $n_sedi_pianificate = $dbo->fetchNum('SELECT DISTINCT(idsede) FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).') AND idsede IN(SELECT id FROM an_sedi WHERE idzona='.prepare($rs[$i]['idzona']).')'); + + // Verifico se ci sono impianti in questa zona legati alla sede legale + $n_sedi_pianificate += $dbo->fetchNum('SELECT DISTINCT(idsede) FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).') AND idsede=(SELECT idsede FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record).') AND idzona='.prepare($rs[$i]['idzona']).') AND idsede=0'); + } + // Fix nel caso non siano previste sedi pianificate (l'eventuale 0 portava a problemi nel calcolo dell'importo) + $n_sedi_pianificate = ($n_sedi_pianificate < 1) ? 1 : $n_sedi_pianificate; + // else{ + // $n_sedi_pianificate = $dbo->fetchNum("SELECT (idsede) FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto=\"".$id_record."\") AND idsede=0"); + // } + + echo ' + + '; + } + echo ' + '; + + // Sede + if ($rs[$i]['zona'] == '') { + $zona = 'Altro'; + } else { + $zona = $rs[$i]['zona']; + } + + if ($n_sedi_pianificate == 1) { + $n_sedi = tr('1 sede'); + } else { + $n_sedi = tr('_NUM_ sedi', [ + '_NUM_' => $n_sedi_pianificate, + ]); + } + + echo ' + '; + + /* + Importo + */ + // Se è stata emessa una fattura, bisogna utilizzare il totale della fattura da scalare al totale pianificato + if ($rs[$i]['iddocumento'] != 0) { + $rs2 = $dbo->fetchArray('SELECT SUM(subtotale-sconto) AS totale FROM co_righe_documenti WHERE iddocumento='.prepare($rs[$i]['iddocumento'])); + $importo = $rs2[0]['totale']; + } else { + // $importo = ($rs[$i]['budget_contratto'] * $n_sedi_pianificate / $n_rate[ $rs[$i]['idzona'] ]) - ($gia_fatturato[ $rs[$i]['idzona'] ] * $n_sedi_pianificate / sizeof($gia_fatturato[ $rs[$i]['idzona'] ]) ); + $importo = ($rs[$i]['budget_contratto'] * $n_sedi_pianificate / $n_rate[$rs[$i]['idzona']]); + } + + echo ' + '; + + // Documento collegato (fattura) + if ($rs[$i]['iddocumento'] != 0) { + $rsf = $dbo->fetchArray('SELECT numero, numero_esterno, data, (SELECT SUM(subtotale) FROM co_righe_documenti WHERE iddocumento=co_documenti.id) AS imponibile, (SELECT icona FROM co_statidocumento WHERE id=co_documenti.idstatodocumento) AS icona, (SELECT descrizione FROM co_statidocumento WHERE id=co_documenti.idstatodocumento) AS stato FROM co_documenti WHERE id='.prepare($rs[$i]['iddocumento'])); + + if ($rsf[0]['numero_esterno'] != '') { + $numero_doc = $rsf[0]['numero_esterno']; + } else { + $numero_doc = $rsf[0]['numero']; + } + + $documento = Modules::link('Fatture di vendita', $rs[$i]['iddocumento'], tr('Fattura num. _NUM_ del _DATE_', [ + '_NUM_' => $numero_doc, + '_DATE_' => Translator::dateToLocale($rsf[0]['data']), + ])); + + $stato = ' '.$rsf[0]['stato']; + } else { + $documento = ''; + $stato = ' '.tr('Non ancora fatturato'); + } + + // Link a fattura + echo ' + '; + + // Stato + echo ' + '; + + // Funzioni + echo ' + + '; + + $prev_mese = $rs[$i]['data_scadenza']; + } + echo ' +
'.tr('Scadenza').''.tr('Zona').''.tr('Importo').''.tr('Documento').''.tr('Stato').'
'; + // Data scadenza + if ($prev_mese != $rs[$i]['data_scadenza']) { + ++$n_rata; + echo ' + '.$mesi[intval(date('m', strtotime($rs[$i]['data_scadenza']))) - 1].' '.date('Y', strtotime($rs[$i]['data_scadenza'])).''.$zona.' ('.$n_sedi.') + '.moneyFormat($importo).'
+ '.moneyFormat($rs[$i]['budget_contratto']).' x '.$n_sedi_pianificate.' sedi / '.$n_rate[$rs[$i]['idzona']].' rate'.$extra.' +
'.$documento.''.$stato.''; + if ($rs[$i]['iddocumento'] == 0) { + // Creazione fattura + echo " + '; + + // Eliminazione pianificazione + echo ' + + + '; + } + + echo ' +
'; +} +echo ' +

'; + +/* + Schema per pianificare la fatturazione per zona +*/ +$rs = $dbo->fetchArray('SELECT id, descrizione FROM an_zone WHERE ( id IN (SELECT idzona FROM an_sedi WHERE id IN (SELECT idsede FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).'))) ) OR ( id=(SELECT idzona FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record).") AND idzona=an_zone.id) ) UNION SELECT 0, 'Altro'"); + +if (sizeof($rs) == 0) { + echo ' +

'.tr('Non sono ancora stati pianificati ordini di servizio').'...

'; +} + +// Elenco voci di servizio con mesi in cui eseguirle +else { + // Calcolo mese iniziale e finale del contratto + $rs2 = $dbo->fetchArray('SELECT data_accettazione, data_conclusione, TIMESTAMPDIFF( MONTH, data_accettazione, data_conclusione ) AS mesi FROM co_contratti WHERE id='.prepare($id_record)); + $n_mesi = $rs2[0]['mesi'] + 1; + $mese_start = date('m', strtotime($rs2[0]['data_accettazione'])); + + echo " + +
'; + + echo " +
+ "; + + // Indice zone fatturabili + echo ' +
+
+ {[ "type": "select", "label": "'.tr('Zone per le quali pianificare la fatturazione').'", "name": "idzona[]", "values": "query=SELECT id, descrizione FROM an_zone WHERE (id IN (SELECT idzona FROM an_sedi WHERE id IN (SELECT idsede FROM my_impianti WHERE id IN (SELECT idimpianto FROM co_ordiniservizio WHERE idcontratto='.prepare($id_record).')))) OR ( id=(SELECT idzona FROM an_anagrafiche WHERE idanagrafica=(SELECT idanagrafica FROM co_contratti WHERE id='.prepare($id_record).') AND idzona=an_zone.id) ) UNION SELECT 0, \'Altro\'", "multiple": 1, "extra": "onchange=\"$(this).find(\'option\').each( function(){ if( $(this).is(\':selected\') ){ $(\'#zona_\'+$(this).val()).removeClass(\'hide\'); }else{ $(\'#zona_\'+$(this).val()).addClass(\'hide\'); } });\"" ]} +
+
'; + + // Zone + for ($i = 0; $i < sizeof($rs); ++$i) { + echo ' +
+ '.$rs[$i]['descrizione'].' +
+
'; + + for ($j = 0; $j < $n_mesi; ++$j) { + echo ' +
+ +
'; + } + + echo ' +
+
'; + } + + echo " + +
+
"; + + // Pianificazione + echo " + '; + + echo ' +
'; +} + +echo ' +
+
'; diff --git a/update/2_4_13.sql b/update/2_4_13.sql old mode 100644 new mode 100755 index d5e81cd5a..b1c610198 --- a/update/2_4_13.sql +++ b/update/2_4_13.sql @@ -134,4 +134,8 @@ ORDER BY `an_relazioni`.`created_at` DESC', '', 'fa fa-angle-right ', '2.4.13', INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`, `default`, `visible`, `format`) VALUES ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Relazioni'), 'id', 'an_relazioni.id', 1, 0, 0, 1, 0, 0), ((SELECT `id` FROM `zz_modules` WHERE `name` = 'Relazioni'), 'Descrizione', 'an_relazioni.descrizione', 2, 1, 0, 1, 1, 0), -((SELECT `id` FROM `zz_modules` WHERE `name` = 'Relazioni'), 'Colore', 'an_relazioni.colore', 3, 1, 0, 1, 1, 0); \ No newline at end of file +((SELECT `id` FROM `zz_modules` WHERE `name` = 'Relazioni'), 'Colore', 'an_relazioni.colore', 3, 1, 0, 1, 1, 0); + +-- Ripristino modulo pianificazione fatturazione +INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`) VALUES +(27, 'Pianificazione fatturazione', 'Pianificazione fatturazione', (SELECT `id` FROM `zz_modules` WHERE `name` = 'Contratti'), (SELECT `id` FROM `zz_modules` WHERE `name` = 'Contratti'), 'tab', 'contratti.fatturaordiniservizio.php', 1, 0, 0, '', '', NULL, NULL, '', '');