SELECT * FROM (
SELECT DISTINCT ON(id_progetto, codice_fiscale)
   id_progetto AS idprogetto
 , codice_fiscale AS cf
 , beneficiario_ultimo AS ben
 , forma_giuridica_attuale AS fga
 , forma_giuridica AS fg
 , tipo_beneficiario AS tipoben
 , fine_esercizio
 , comune_sede_legale_attuale AS comsl
 , cap_sede_legale_attuale AS capsl
 , provincia_sede_legale_attuale AS prvsl
 , indirizzo_sede_legale_attuale AS indsl
 , codice_comune_sede_legale
 , COALESCE(c1.comune, comune_sede_legale) AS comunesedelegale
 , COALESCE(c1.cap, cap_sede_legale) AS capsedelegale 
 , COALESCE(c1.provincia, provincia_sede_legale) AS provinciasedelegale
 , indirizzo_sede_legale
 , codice_comune_unita_locale
 , COALESCE(c2.comune, comune_unita_locale) AS comul
 , COALESCE(c2.cap, cap_unita_locale) AS capul
 , COALESCE(c2.provincia, provincia_unita_locale) AS prvul
 , indirizzo_unita_locale AS indul
 , codice_comune_unita_locale_progetto
 , COALESCE(c3.comune, comune_unita_locale_progetto) AS comuneloc
 , COALESCE(c3.cap, cap_unita_locale_progetto) AS capulp
 , COALESCE(c3.provincia, provincia_unita_locale_progetto) AS provincialoc
 , indirizzo_unita_locale_progetto AS indulp
 , codice_istat_bda AS istat
 , codice_istat_bda_progetto AS istatp
 , dimensione_impresa_attuale AS dimatt
 , dimensione_impresa AS dimensioneimpresa
 , dimensione_impresa AS dimimp
 , ruolo_partner AS ruopar
 , ruolo_partner IS NOT NULL AS parternariato
 , legale_rappr AS lrappr
 , settore_attivita AS setatt
 , fatturato AS fatt
 , addetti_bilancio AS addbil
 , spese_rendicontate_ammesse
 , dipartimento
 , ambiti_disciplinari
 , numero_rea
 , partita_iva
 , partita_iva AS piva
 , contatto_nominativo AS referentebeneficiario
 , contatto_telefono
 , contatto_fax
 , contatto_email
 , parco_scientifico_tecnologico
 , centro_di_competenza
 , tipo_beneficiario_attuale
 , codice_ateco_2007 AS codiceatecobeneficiario
 , presenza_varianti
 , erogazioni_terminate
 , erogatore
 , organismo_intermedio
 , stato_richiesta AS status
 , tipo_iniziativa
 , motivazione_respinta
 , programma
 , linea
 , linea AS clin
 , descrizione_linea AS dlin
 , codice_bando AS cban
 , dirigente AS dirigenteregionaleresponsabile
 , (atto_approvazione_bando).numero AS numeroattoapprovazione
 , tipologia_aiuto AS tipologiaaiuto
 , data_domanda AS ddom
 , descrizione_attivita AS desat
 , data_avvio_investimento AS dai
 , data_ultimazione_prevista AS dataprevistafineprogetto
 , data_completamento_istruttoria AS dci
 , data_rinuncia_ritiro AS drr
 , data_respinta AS dres
 , titolo_progetto AS titoloprogetto
 , data_prevista_inizio_progetto AS dataprevistafineprogetto
 , data_effettiva_fine_progetto AS dataeffettivafineprogetto
 , piano_dei_costi AS pdc
 , link_documentazione AS documenti
 , procedura_attivazione AS pratt
 , controlli_in_loco AS cil
 , data_ultimo_controllo_in_loco AS ducil
 , esl_percentuale
 , esl_valore AS aimat
 , atto_revoca AS atrev
 , gruppo AS grp
 , macrogruppo AS mgrp
 , ruolo_nel_gruppo AS rng
 , array_to_string(tipo_agevolazione, ',') AS formaagevolazione
 , importo_richiesto * (NOT deminimis)::integer AS iric
 , importo_richiesto_deminimis * deminimis::integer AS iricdm
 , array_to_string(atto_concessione_provvisoria, ',') AS atpro
 , importo_provvisorio * (NOT deminimis)::integer AS ipro
 , importo_provvisorio_deminimis * deminimis::integer AS iprodm
 , array_to_string(atto_concessione_definitiva, ',') AS atdef
 , array_to_string(array(SELECT (unnest(atto_concessione_definitiva)).data), ',') AS dataammissionefinanziamento
 , array_to_string(array(SELECT (unnest(atto_concessione_definitiva)).numero), ',') AS numeroammissionefinanziamento
 , array_to_string(data_erogazione, ',') AS dataultimaerogazionebeneficiario
 , importo_definitivo * (NOT deminimis)::integer AS contributoammesso
 , importo_definitivo_deminimis * deminimis::integer AS idefdm
 , importo_definitivo_aiuto_limitato_compatibile AS idefalc
 , importo_richiesto_aiuto_limitato_compatibile AS iricalc
 , importo_provvisorio_aiuto_limitato_compatibile AS iproalc
 , array_to_string(data_erogazione, ',') AS dataultimaerogazione
 , importo_erogato AS contributoerogato
 , ultima_erogazione AS uerog
 , erogazione_bancaria
 , array_to_string(motivazione_revoca, ',') AS motivorevoca
 , importo_revocato AS irev
 , array_to_string(atto_agevolazione_revocata, ',') AS attrev
 , array_to_string(tipologia_spesa, ',') AS tipspe
 , spesa_richiesta AS costototaleprogetto
 , spesa_ammessa_in_istruttoria AS speseammissibiliistruttoria
 , spesa_ammessa AS investimentoammesso
 , cup_docup_std
 , cup_cipe
 , cup_docup
 , cup_st
 , cup_artea
 , cup_docup_std AS docupstd
 , cup_cipe AS cupcipe
 , cup_docup AS docup
 , cup_st AS cupst
 , cup_artea AS cupartea
 , COALESCE(cup_docup_std, cup_docup, cup_cipe, cup_st, cup_artea) AS codiceunicoprogetto
 , array_to_string(verbale, ',') AS verb
 , array_to_string(tipo_verbale, ',') AS tipoverb
 , fonte_db AS fdb
 , fonte_dati AS fdati
 , fonte_db_data AS fdbd
FROM beneficiari_progetti
LEFT JOIN beneficiari USING(codice_fiscale)
LEFT JOIN progetti USING(id_progetto)
LEFT JOIN linee USING(programma,linea)
LEFT JOIN bandi USING(codice_bando)
LEFT JOIN gruppi_beneficiari_progetti USING(codice_fiscale,id_progetto)
LEFT JOIN gruppi USING(gruppo)
LEFT JOIN (SELECT id_progetto, codice AS cup_docup_std FROM codici_di_progetto WHERE codifica = 'DOCUP STANDARD')codici_di_progetto_docup_std USING(id_progetto)
LEFT JOIN (SELECT id_progetto, codice AS cup_cipe FROM codici_di_progetto WHERE codifica = 'MIP/CUP')codici_di_progetto_cup_cipe USING(id_progetto)
LEFT JOIN (SELECT id_progetto, codice AS cup_docup FROM codici_di_progetto WHERE codifica = 'DOCUP')codici_di_progetto_cup_docup USING(id_progetto)
LEFT JOIN (SELECT id_progetto, codice AS cup_st FROM codici_di_progetto WHERE codifica = 'Sviluppo Toscana')codici_di_progetto_cup_st USING(id_progetto)
LEFT JOIN (SELECT id_progetto, codice AS cup_artea FROM codici_di_progetto WHERE codifica = 'ARTEA')codici_di_progetto_cup_artea USING(id_progetto)
LEFT JOIN comuni c1 ON(c1.codice_comune = codice_comune_sede_legale)
LEFT JOIN comuni c2 ON(c2.codice_comune = codice_comune_unita_locale)
LEFT JOIN comuni c3 ON(c3.codice_comune = codice_comune_unita_locale_progetto)
LEFT JOIN (
	SELECT
	   id_progetto
	 , array_agg(DISTINCT tipo_verbale) AS tipo_verbale
	 , array_agg(DISTINCT verbale) AS verbale
	FROM verbali
	GROUP BY id_progetto
) AS verbali USING(id_progetto)
LEFT JOIN (
	SELECT
	   *
	FROM (
		SELECT
		   id_progetto
		 , codice_fiscale
		 , array_agg(DISTINCT tipo_agevolazione) AS tipo_agevolazione
		 , sum(importo_richiesto) AS importo_richiesto
		 , sum(importo_richiesto_deminimis) AS importo_richiesto_deminimis
		 , sum(importo_provvisorio) AS importo_provvisorio
		 , sum(importo_provvisorio_deminimis) AS importo_provvisorio_deminimis
		 , array_agg(DISTINCT atto_concessione_provvisoria) AS atto_concessione_provvisoria
		 , sum(importo_definitivo) AS importo_definitivo
		 , sum(importo_definitivo_deminimis) AS importo_definitivo_deminimis
		 , array_agg(DISTINCT atto_concessione_definitiva) AS atto_concessione_definitiva
		 , sum(importo_richiesto_aiuto_limitato_compatibile) AS importo_richiesto_aiuto_limitato_compatibile
		 , sum(importo_provvisorio_aiuto_limitato_compatibile) AS importo_provvisorio_aiuto_limitato_compatibile
		 , sum(importo_definitivo_aiuto_limitato_compatibile) AS importo_definitivo_aiuto_limitato_compatibile
		FROM agevolazioni_richieste_e_concesse
		WHERE (:finanziatoil::text IS NULL OR COALESCE(:finanziatoil::integer = extract(year FROM (atto_concessione_definitiva).data)::integer, FALSE))
		  AND (:finanziatoda::text IS NULL OR COALESCE(:finanziatoda::integer <= extract(year FROM (atto_concessione_definitiva).data)::integer, FALSE))
		GROUP BY id_progetto,codice_fiscale
	) AS agevolazioni_richieste_e_concesse
	FULL JOIN (
		SELECT
		   id_progetto
		 , codice_fiscale
		 , array_agg(DISTINCT data_erogazione) AS data_erogazione
		 , sum(importo_erogato) AS importo_erogato
		 , bool_or(ultima_erogazione) AS ultima_erogazione
		 , sum(erogazione_bancaria) AS erogazione_bancaria
		FROM agevolazioni_erogate_restituite
		GROUP BY id_progetto,codice_fiscale
	) AS agevolazioni_erogate_restituite USING(id_progetto,codice_fiscale)
	FULL JOIN (
		SELECT
		   id_progetto
		 , codice_fiscale
		 , array_agg(DISTINCT motivazione_revoca) AS motivazione_revoca
		 , sum(importo_revocato) AS importo_revocato
		 , array_agg(DISTINCT atto_agevolazione_revocata) AS atto_agevolazione_revocata
		FROM agevolazioni_revocate
		GROUP BY id_progetto,codice_fiscale
	) AS agevolazioni_revocate USING(id_progetto,codice_fiscale)
	FULL JOIN (
		SELECT
		   id_progetto
		 , codice_fiscale
		 , array_agg(DISTINCT tipologia_spesa) AS tipologia_spesa
		 , sum(spesa_richiesta) AS spesa_richiesta
		 , sum(spesa_ammessa_in_istruttoria) AS spesa_ammessa_in_istruttoria
		 , sum(spesa_ammessa) AS spesa_ammessa
		FROM spese
		GROUP BY id_progetto,codice_fiscale
	) AS spese USING(id_progetto,codice_fiscale)
) AS dati_finanziari USING(id_progetto,codice_fiscale)
WHERE COALESCE(codice_fiscale = upper(:cf), :cf IS NULL)
  AND COALESCE(beneficiario_ultimo ILIKE :ben, TRUE)
  AND COALESCE(:ben_adv % ANY(rs_sign_array(beneficiario_ultimo)), TRUE)
  AND COALESCE(titolo_progetto ~* (:titoloprogetto), TRUE)
  AND COALESCE(:codiceunicoprogetto = ANY(ARRAY[cup_cipe, cup_docup, cup_docup_std, cup_st, cup_artea, id_progetto]), :codiceunicoprogetto IS NULL)
  AND COALESCE(comune_sede_legale = :comunesl, :comunesl IS NULL)
  AND COALESCE(provincia_sede_legale = :provinciasl, :provinciasl IS NULL)
  AND COALESCE(comune_unita_locale_progetto = :comuneloc, :comuneloc IS NULL)
  AND COALESCE(provincia_unita_locale_progetto = :provincialoc, :provincialoc IS NULL)
  AND COALESCE((:dattobando, :nattobando)::atto = atto_approvazione_bando, (:dattobando, :nattobando)::atto IS NULL)
  AND COALESCE((:dattograd, :nattograd)::atto = ANY(atto_concessione_definitiva), (:dattograd, :nattograd)::atto IS NULL)
  AND COALESCE(programma = :programma, :programma IS NULL)
  AND COALESCE(linea = :linea, :linea IS NULL)
  AND COALESCE(tipologia_aiuto = :tipologiaaiuto, :tipologiaaiuto IS NULL)
  AND COALESCE(tipo_agevolazione @> string_to_array(:formaagevolazione,','), :formaagevolazione IS NULL)
  AND COALESCE(data_effettiva_fine_progetto <= :finanziatoa::timestamp, :finanziatoa IS NULL)
  AND (:finanziatoil::text IS NULL OR COALESCE(:finanziatoil::integer = ANY(array(SELECT extract(year FROM (unnest(atto_concessione_definitiva)).data)::integer)), FALSE))
  AND (:finanziatoda::text IS NULL OR COALESCE(:finanziatoda::integer <= ANY(array(SELECT extract(year FROM (unnest(atto_concessione_definitiva)).data)::integer)), FALSE))
  AND COALESCE(codice_ateco_2007 = :ateco, :ateco IS NULL)
  AND CASE WHEN :ricerca::text IS NOT NULL THEN tipo_linea = 'Ricerca' ELSE TRUE END
) tmp
ORDER BY ben