Aggiunta impostazione Raggruppa attività per tipologia in fattura

This commit is contained in:
Pek5892 2024-03-18 16:04:01 +01:00
parent 395aeae7b6
commit d60890734e
5 changed files with 126 additions and 16 deletions

View File

@ -20,6 +20,7 @@
use Modules\Fatture\Fattura;
use Modules\Iva\Aliquota;
use Util\Generator;
use Modules\Interventi\Intervento;
/*
* Funzione per generare un nuovo numero per la fattura.
@ -462,4 +463,90 @@ if (!function_exists('verifica_numero_fattura')) {
return null;
}
function get_righe_composte(Fattura $documento)
{
global $dbo;
$righe = [];
// Righe documento
$righe_documento = $documento->getRighe()->where('idintervento','!=',NULL)->groupBy(function ($item, $key) {
return $item['prezzo_unitario'].'|'.$item['idiva'].'|'.$item['sconto_unitario'];
});
if (setting('Raggruppa attività per tipologia in fattura') && !$righe_documento->isEmpty() ){
$articoli = [];
foreach ($righe_documento as $gruppo) {
$riga_base = [];
foreach($gruppo as $riga){
$intervento = Intervento::find($riga->idintervento);
if (!empty($intervento) ){
if ($riga['is_descrizione']==1 ){
if( empty($riga_base[$intervento->idtipointervento]['descrizione']) ){
$riga_base[$intervento->idtipointervento]['descrizione'] = $riga;
}else{
$riga_base[$intervento->idtipointervento]['descrizione']['descrizione'] .= "\n".$riga->descrizione;
$riga_base[$intervento->idtipointervento]['descrizione']['qta'] += $riga->qta;
}
}
if( $riga['is_descrizione']==0 ){
if( empty($riga_base[$intervento->idtipointervento]['riga']) && empty($riga->idarticolo) ){
$riga_base[$intervento->idtipointervento]['riga'] = $riga;
}elseif( empty($riga->idarticolo) ){
$riga_base[$intervento->idtipointervento]['riga']['descrizione'] .= "\n".$riga->descrizione;
$riga_base[$intervento->idtipointervento]['riga']['qta'] += $riga->qta;
}else{
$riga_base[$intervento->idtipointervento]['articoli'][] = $riga;
}
}
}else{
$articoli[] = $riga;
}
}
foreach($riga_base as $riga){
if( !empty($riga['descrizione']) ){
$righe[] = $riga['descrizione'];
}
if( !empty($riga['riga']) ){
$righe[] = $riga['riga'];
}
if( !empty($riga['articoli']) ){
foreach($riga['articoli'] as $articolo){
$righe[] = $articolo;
}
}
}
if( !empty($articoli) ){
$righe = array_merge($righe,$articoli);
}
}
//Estraggo le righe non collegate a interventi
$righe_esterne = $documento->getRighe()->where('idintervento','=',NULL);
foreach($righe_esterne as $riga){
$righe[] = $riga;
}
}else{
$righe = $documento->getRighe();
}
for($index=0;$index<count($righe);$index++){
if( empty($righe[$index]) ){
unset($righe[$index]);
}
}
$righe = collect($righe);
return $righe;
}
}

View File

@ -96,7 +96,7 @@ switch (post('op')) {
$raggruppamento = post('raggruppamento');
$where = '';
$query = 'SELECT *, IFNULL((SELECT MIN(`orario_inizio`) FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`), `in_interventi`.`data_richiesta`) AS data, `in_statiintervento_lang`.`name` AS stato, `in_interventi`.`codice` AS codice_intervento FROM `in_interventi` INNER JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`id` LEFT JOIN `in_statiintervento_lang` ON (`in_statiintervento_lang`.`id_record`=`in_statiintervento`.`id` AND `in_statiintervento_lang`.`id_lang`='.prepare(\App::getLang()).') WHERE `in_statiintervento`.`is_fatturabile`=1 AND `in_interventi`.`id` NOT IN (SELECT `idintervento` FROM `co_righe_documenti` WHERE `idintervento` IS NOT NULL) AND `in_interventi`.`id` IN ('.implode(',', $id_records).')';
$query = 'SELECT `in_interventi`.*, IFNULL((SELECT MIN(`orario_inizio`) FROM `in_interventi_tecnici` WHERE `in_interventi_tecnici`.`idintervento` = `in_interventi`.`id`), `in_interventi`.`data_richiesta`) AS data, `in_statiintervento_lang`.`name` AS stato, `in_interventi`.`codice` AS codice_intervento FROM `in_interventi` INNER JOIN `in_statiintervento` ON `in_interventi`.`idstatointervento`=`in_statiintervento`.`id` LEFT JOIN `in_statiintervento_lang` ON (`in_statiintervento_lang`.`id_record`=`in_statiintervento`.`id` AND `in_statiintervento_lang`.`id_lang`='.prepare(\App::getLang()).') WHERE `in_statiintervento`.`is_fatturabile`=1 AND `in_interventi`.`id` NOT IN (SELECT `idintervento` FROM `co_righe_documenti` WHERE `idintervento` IS NOT NULL) AND `in_interventi`.`id` IN ('.implode(',', $id_records).')';
// Se non è attiva la relativa impostazione considero solo interventi non collegati a contratti, ordini o preventivi (default)
if (!setting('Permetti fatturazione delle attività collegate a contratti')) {

View File

@ -49,7 +49,12 @@ echo "
<tbody>';
// Righe documento
$righe = $documento->getRighe();
if (setting('Raggruppa attività per tipologia in fattura')) {
$righe = get_righe_composte($documento);
} else {
$righe = $documento->getRighe();
}
$num = 0;
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
@ -108,15 +113,15 @@ foreach ($righe as $riga) {
'.nl2br($text);
}
}
$r['descrizione'] = preg_replace("/Rif\.(.*)/s", '', $r['descrizione']);
$r['descrizione'] = preg_replace("/Rif\.(.*)/s", ' ', $r['descrizione']);
$autofill->count($r['descrizione']);
}
$source_type = get_class($riga);
if (!setting('Visualizza riferimento su ogni riga in stampa')) {
if (setting('Visualizza riferimento su ogni riga in stampa')) {
echo $num.'
</td>
<td>'.$r['descrizione'];
<td>'.nl2br($r['descrizione']).'<br>';
} else {
echo $num.'
</td>
@ -124,10 +129,8 @@ foreach ($righe as $riga) {
}
if ($riga->isArticolo()) {
echo '<br><small>'.$riga->codice.'</small>';
} else {
echo '-';
}
echo '<small>'.$riga->codice.'</small>';
};
if ($riga->isArticolo()) {
// Seriali

View File

@ -22,13 +22,30 @@ if (!empty($options['last-page-footer']) && !$is_last_page) {
}
// Calcoli
$imponibile = abs($documento->imponibile);
$sconto = $documento->sconto;
$totale_imponibile = abs($documento->totale_imponibile);
$totale_iva = abs($documento->iva);
$sconto_finale = abs($documento->getScontoFinale());
//$imponibile = abs($documento->imponibile);
//$sconto = $documento->sconto;
//$totale_imponibile = abs($documento->totale_imponibile);
//$totale_iva = abs($documento->iva);
//$totale = abs($documento->totale) - $rivalsa;
$totale_imponibile = 0;
foreach($v_totale as $key=>$v){
$totale_imponibile += $v;
}
$totale_iva = 0;
foreach($v_iva as $key=>$v){
$totale_iva += $v;
}
$sconto = 0;
foreach($righe as $riga){
$sconto += floatval($riga->sconto);
}
$rivalsa = floatval($record['rivalsainps']);
$totale = abs($documento->totale) - $rivalsa;
$imponibile = $totale_imponibile + $sconto;
$totale = $totale_iva + $totale_imponibile;
$show_sconto = $sconto > 0;

View File

@ -2310,3 +2310,6 @@ ALTER TABLE `zz_cache`
DROP `name`;
ALTER TABLE `zz_cache_lang` ADD CONSTRAINT `zz_cache_lang_ibfk_1` FOREIGN KEY (`id_record`) REFERENCES `zz_cache`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT;
INSERT INTO `zz_settings` (`nome`, `valore`, `tipo`, `editable`, `sezione`) VALUES ('Raggruppa attività per tipologia in fattura', '0', 'boolean', '1', 'Fatturazione');
INSERT INTO `zz_settings_lang` (`id_record`, `id_lang`, `title`) VALUES ((SELECT `id` FROM `zz_settings` WHERE `nome` = 'Raggruppa attività per tipologia in fattura'), (SELECT `valore` FROM `zz_settings` WHERE `nome` = 'Lingua'), 'Raggruppa attività per tipologia in fattura');