|
|
|
@ -83,20 +83,15 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
|
|
|
|
|
private static final int SIZE = 10; |
|
|
|
|
|
|
|
|
|
// private static final String TECNICO_MITTENTE =
|
|
|
|
|
// "geniocivile.tecnico.mittente";
|
|
|
|
|
// private static final String TECNICO_OGGETTO =
|
|
|
|
|
// "geniocivile.tecnico.oggetto";
|
|
|
|
|
// private static final String TECNICO_CORPO = "geniocivile.tecnico.corpo";
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void receive(Message message) throws MessageListenerException { |
|
|
|
|
|
|
|
|
|
if (lock.tryLock()) { |
|
|
|
|
try { |
|
|
|
|
// campo abilitazione scheduler
|
|
|
|
|
for (Company company : CompanyLocalServiceUtil.getCompanies()) { |
|
|
|
|
String condition = ConfigurazioneLocalServiceUtil.findByC_ChiaveString( |
|
|
|
|
company.getCompanyId(), ConfigurazioneConstants.SCHEDULER_INVIO_DOCUMENTO); |
|
|
|
|
String condition = ConfigurazioneLocalServiceUtil.findByC_ChiaveString(company.getCompanyId(), |
|
|
|
|
ConfigurazioneConstants.SCHEDULER_INVIO_DOCUMENTO); |
|
|
|
|
if (Boolean.parseBoolean(condition)) { |
|
|
|
|
processAvvisiInvioSuap(); |
|
|
|
|
processIntegrazioniInvioSignal(); |
|
|
|
@ -117,17 +112,11 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
private void processAvvisiInvioSuap() throws SystemException { |
|
|
|
|
|
|
|
|
|
int count = AvvisoLocalServiceUtil.countAvvisiInvioDocumento(); |
|
|
|
|
|
|
|
|
|
if (count > 0) { |
|
|
|
|
|
|
|
|
|
for (int cursor = 0; cursor <= count; cursor += SIZE) { |
|
|
|
|
|
|
|
|
|
List<Avviso> avvisi = AvvisoLocalServiceUtil.getAvvisiInvioDocumento(cursor, cursor + SIZE); |
|
|
|
|
|
|
|
|
|
for (Avviso avviso : avvisi) { |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
|
|
FileEntry fileEntry = null; |
|
|
|
|
try { |
|
|
|
|
fileEntry = DLAppLocalServiceUtil.getFileEntry(avviso.getFileEntryIdInvio()); |
|
|
|
@ -135,7 +124,6 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
// bloccato
|
|
|
|
|
AvvisoLocalServiceUtil.updateAvvisoErrore(avviso.getAvvisoId(), true); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (fileEntry != null) { |
|
|
|
|
// xxx senza suap non serve inviare
|
|
|
|
|
String url = StringPool.BLANK; |
|
|
|
@ -143,27 +131,22 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
if (Validator.isNotNull(avviso.getControlloPraticaId())) { |
|
|
|
|
ControlloPratica controlloPratica = ControlloPraticaLocalServiceUtil |
|
|
|
|
.getControlloPratica(avviso.getControlloPraticaId()); |
|
|
|
|
Avviso avvisoSignal = AvvisoLocalServiceUtil.getAvvisoInvioSignal(avviso |
|
|
|
|
.getAvvisoId()); |
|
|
|
|
Avviso avvisoSignal = AvvisoLocalServiceUtil.getAvvisoInvioSignal(avviso.getAvvisoId()); |
|
|
|
|
if (avvisoSignal != null) { |
|
|
|
|
invioSignal(avvisoSignal, controlloPratica); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Avviso avvisoTempistica = AvvisoLocalServiceUtil.getAvvisoTempistica(avviso |
|
|
|
|
.getAvvisoId()); |
|
|
|
|
if (avvisoTempistica != null) { |
|
|
|
|
gestioneTempistica(avvisoTempistica, controlloPratica); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Avviso avvisoInvioTecnico = AvvisoLocalServiceUtil |
|
|
|
|
.getAvvisoInvioTecnico(avviso.getAvvisoId()); |
|
|
|
|
Avviso avvisoInvioTecnico = AvvisoLocalServiceUtil.getAvvisoInvioTecnico(avviso |
|
|
|
|
.getAvvisoId()); |
|
|
|
|
if (avvisoInvioTecnico != null) { |
|
|
|
|
sendToTecnico(avvisoInvioTecnico); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
_log.error("Error", e); |
|
|
|
|
} |
|
|
|
@ -175,13 +158,9 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
private void processAvvisiInvioSignal() throws SystemException { |
|
|
|
|
|
|
|
|
|
int count = AvvisoLocalServiceUtil.countAvvisiInvioSignal(); |
|
|
|
|
|
|
|
|
|
if (count > 0) { |
|
|
|
|
|
|
|
|
|
for (int cursor = 0; cursor <= count; cursor += SIZE) { |
|
|
|
|
|
|
|
|
|
List<Avviso> avvisi = AvvisoLocalServiceUtil.getAvvisiInvioSignal(cursor, cursor + SIZE); |
|
|
|
|
|
|
|
|
|
for (Avviso avviso : avvisi) { |
|
|
|
|
long controlloPraticaId = avviso.getControlloPraticaId(); |
|
|
|
|
if (controlloPraticaId != 0) { |
|
|
|
@ -190,7 +169,7 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
.getControlloPratica(avviso.getControlloPraticaId()); |
|
|
|
|
invioSignal(avviso, controlloPratica); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
_log.info(e.getMessage() + " " + avviso.getAvvisoId() + " " |
|
|
|
|
_log.info(e.getMessage() + StringPool.SPACE + avviso.getAvvisoId() + StringPool.SPACE |
|
|
|
|
+ avviso.getControlloPraticaId()); |
|
|
|
|
_log.debug("Error", e); |
|
|
|
|
} |
|
|
|
@ -203,26 +182,19 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
private void processIntegrazioniInvioSignal() throws SystemException { |
|
|
|
|
|
|
|
|
|
int count = DettPraticaLocalServiceUtil.countInvioSignal(); |
|
|
|
|
|
|
|
|
|
if (count > 0) { |
|
|
|
|
|
|
|
|
|
for (int cursor = 0; cursor <= count; cursor += SIZE) { |
|
|
|
|
|
|
|
|
|
List<DettPratica> integrazioni = DettPraticaLocalServiceUtil.getInviiSignal(cursor, cursor |
|
|
|
|
+ SIZE); |
|
|
|
|
|
|
|
|
|
List<DettPratica> integrazioni = DettPraticaLocalServiceUtil.getInviiSignal(cursor, cursor + SIZE); |
|
|
|
|
for (DettPratica integrazione : integrazioni) { |
|
|
|
|
try { |
|
|
|
|
ControlloPratica controlloPratica = null; |
|
|
|
|
List<ControlloPratica> controlli = ControlloPraticaLocalServiceUtil |
|
|
|
|
.findByIntPraticaId_Status(integrazione.getIntPraticaId(), |
|
|
|
|
WorkflowConstants.STATUS_PENDING); |
|
|
|
|
List<ControlloPratica> controlli = ControlloPraticaLocalServiceUtil.findByIntPraticaId_Status( |
|
|
|
|
integrazione.getIntPraticaId(), WorkflowConstants.STATUS_PENDING); |
|
|
|
|
if (controlli.isEmpty()) { |
|
|
|
|
ServiceContext serviceContext = new ServiceContext(); |
|
|
|
|
serviceContext.setCompanyId(integrazione.getCompanyId()); |
|
|
|
|
serviceContext.setScopeGroupId(integrazione.getGroupId()); |
|
|
|
|
serviceContext.setUserId(integrazione.getUserId()); |
|
|
|
|
|
|
|
|
|
controlloPratica = ControlloPraticaLocalServiceUtil.addControlloPratica( |
|
|
|
|
integrazione.getGroupId(), integrazione.getUserId(), |
|
|
|
|
integrazione.getIntPraticaId(), integrazione.getDettPraticaId(), false, |
|
|
|
@ -230,8 +202,7 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
} else { |
|
|
|
|
controlloPratica = controlli.get(0); |
|
|
|
|
} |
|
|
|
|
invioSignal(integrazione, controlloPratica, |
|
|
|
|
WorkflowConstants.WORKFLOW_SIGNAL_INTEGRAZIONE); |
|
|
|
|
invioSignal(integrazione, controlloPratica, WorkflowConstants.WORKFLOW_SIGNAL_INTEGRAZIONE); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
_log.error("Error", e); |
|
|
|
|
} |
|
|
|
@ -243,13 +214,9 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
private void processAvvisiTempistica() throws SystemException { |
|
|
|
|
|
|
|
|
|
int count = AvvisoLocalServiceUtil.countAvvisiTempistica(); |
|
|
|
|
|
|
|
|
|
if (count > 0) { |
|
|
|
|
|
|
|
|
|
for (int cursor = 0; cursor <= count; cursor += SIZE) { |
|
|
|
|
|
|
|
|
|
List<Avviso> avvisi = AvvisoLocalServiceUtil.getAvvisiTempistica(cursor, cursor + SIZE); |
|
|
|
|
|
|
|
|
|
for (Avviso avviso : avvisi) { |
|
|
|
|
long controlloPraticaId = avviso.getControlloPraticaId(); |
|
|
|
|
if (controlloPraticaId > 0) { |
|
|
|
@ -258,7 +225,7 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
.getControlloPratica(controlloPraticaId); |
|
|
|
|
gestioneTempistica(avviso, controlloPratica); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
_log.debug(e.getMessage() + " " + avviso.getAvvisoId() + " " |
|
|
|
|
_log.debug(e.getMessage() + StringPool.SPACE + avviso.getAvvisoId() + StringPool.SPACE |
|
|
|
|
+ avviso.getControlloPraticaId()); |
|
|
|
|
_log.debug("Error", e); |
|
|
|
|
} |
|
|
|
@ -268,25 +235,18 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* ADT: gestione notifiche al tecnico istruttore. Al momento gestisce solo |
|
|
|
|
* notifica di assegnazione/riassegnazione |
|
|
|
|
* |
|
|
|
|
* @throws SystemException |
|
|
|
|
*/ |
|
|
|
|
// ADT: gestione notifiche al tecnico istruttore. Al momento gestisce solo notifica di assegnazione/riassegnazione
|
|
|
|
|
private void processAvvisiInvioTecnico() throws SystemException { |
|
|
|
|
|
|
|
|
|
int count = AvvisoLocalServiceUtil.countAvvisiInvioTecnicoNew(); |
|
|
|
|
if (count > 0) { |
|
|
|
|
|
|
|
|
|
_log.info("trovati avvisi per invio email notifiche al tecnico:" + count); |
|
|
|
|
for (int cursor = 0; cursor <= count; cursor += SIZE) { |
|
|
|
|
|
|
|
|
|
List<Avviso> avvisi = AvvisoLocalServiceUtil.getAvvisiInvioTecnicoNew(cursor, cursor + SIZE); |
|
|
|
|
|
|
|
|
|
for (Avviso avviso : avvisi) { |
|
|
|
|
try { |
|
|
|
|
// trattandosi solo di avvisi con tipo documento CI
|
|
|
|
|
// oppure SP si tratta di assegnazione istruttore
|
|
|
|
|
// trattandosi solo di avvisi con tipo documento CI oppure SP si tratta di assegnazione
|
|
|
|
|
// istruttore
|
|
|
|
|
MailUtil.invioNotificaAssegnazioneIstruttore(avviso); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
_log.error("Error", e); |
|
|
|
@ -298,13 +258,10 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
|
|
|
|
|
private void invioDocumento(Avviso avviso, FileEntry fileEntry, String url) throws Exception { |
|
|
|
|
|
|
|
|
|
// xxx senza suap non serve inviare l'avviso se non metterlo come
|
|
|
|
|
// inviato per farlo vedere nel
|
|
|
|
|
// FE
|
|
|
|
|
// xxx senza suap non serve inviare l'avviso se non metterlo come inviato per farlo vedere nel FE
|
|
|
|
|
if (AvvisoUtil.DOCUMENTO_INVIATO.equalsIgnoreCase(avviso.getInviato())) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
AvvisoLocalServiceUtil.updateAvvisoInvio(avviso.getAvvisoId()); |
|
|
|
|
inviaMailnotifica(avviso.getAvvisoId()); |
|
|
|
|
} |
|
|
|
@ -312,27 +269,16 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
private void inviaMailnotifica(long avvisoId) throws SystemException, PortalException { |
|
|
|
|
|
|
|
|
|
Avviso avviso = AvvisoLocalServiceUtil.getAvviso(avvisoId); |
|
|
|
|
|
|
|
|
|
long intPraticaId = avviso.getIntPraticaId(); |
|
|
|
|
DettPratica dettPratica = null; |
|
|
|
|
|
|
|
|
|
// String tipoDocumento =
|
|
|
|
|
// AvvisoUtil.getAllTipoDocumento().containsKey(avviso.getTipoDocumento())
|
|
|
|
|
// ?
|
|
|
|
|
// AvvisoUtil.getAllTipoDocumento().get(
|
|
|
|
|
// avviso.getTipoDocumento()) :
|
|
|
|
|
// "label.admingeniocivile.avviso.tipoDocumento.avvisomanuale";
|
|
|
|
|
String tipoDocumento = avviso.translateTipoDocumento(); |
|
|
|
|
String tipoAvviso = LanguageUtil.get(LocaleUtil.ITALIAN, tipoDocumento); |
|
|
|
|
|
|
|
|
|
String tipoAllegato = StringPool.BLANK; |
|
|
|
|
|
|
|
|
|
if (avviso.getTipoDocumento().equalsIgnoreCase(StatoPraticaConstants.VIDIMATA)) { |
|
|
|
|
tipoAllegato = "accettazione istanza di "; |
|
|
|
|
if (avviso.getClassName().equals(DettPratica.class.getName())) { |
|
|
|
|
dettPratica = DettPraticaLocalServiceUtil.getDettPratica(avviso.getClassPk()); |
|
|
|
|
if (TipoIntegrazioneUtil.VARIAZIONE_SOGGETTO.equalsIgnoreCase(dettPratica |
|
|
|
|
.getTipoIntegrazione())) { |
|
|
|
|
if (TipoIntegrazioneUtil.VARIAZIONE_SOGGETTO.equalsIgnoreCase(dettPratica.getTipoIntegrazione())) { |
|
|
|
|
tipoAllegato += LanguageUtil.get(LocaleUtil.ITALIAN, "label-integrazione-12"); |
|
|
|
|
} else if (TipoIntegrazioneUtil.RICHIESTA_INTEGRAZIONE.equalsIgnoreCase(dettPratica |
|
|
|
|
.getTipoIntegrazione())) { |
|
|
|
@ -341,8 +287,7 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
tipoAllegato += LanguageUtil.get(LocaleUtil.ITALIAN, "label-integrazione-13"); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
dettPratica = DettPraticaLocalServiceUtil.getLastCompletedByIntPratica(avviso |
|
|
|
|
.getIntPraticaId()); |
|
|
|
|
dettPratica = DettPraticaLocalServiceUtil.getLastCompletedByIntPratica(avviso.getIntPraticaId()); |
|
|
|
|
if (avviso.getClassName().equals(FineLavori.class.getName())) { |
|
|
|
|
FineLavori fineLavori = FineLavoriLocalServiceUtil.getFineLavori(avviso.getClassPk()); |
|
|
|
|
tipoAllegato += LanguageUtil.get(LocaleUtil.ITALIAN, |
|
|
|
@ -357,71 +302,53 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
tipoAllegato = "documento di " |
|
|
|
|
+ LanguageUtil.get(LocaleUtil.ITALIAN, |
|
|
|
|
tipoDocumento.replace("tipoDocumento", "documento")); |
|
|
|
|
+ LanguageUtil.get(LocaleUtil.ITALIAN, tipoDocumento.replace("tipoDocumento", "documento")); |
|
|
|
|
dettPratica = DettPraticaLocalServiceUtil.fetchDettPratica(avviso.getClassPk()); |
|
|
|
|
if (Validator.isNull(dettPratica)) { |
|
|
|
|
dettPratica = DettPraticaLocalServiceUtil.getLastCompletedByIntPratica(avviso |
|
|
|
|
.getIntPraticaId()); |
|
|
|
|
dettPratica = DettPraticaLocalServiceUtil.getLastCompletedByIntPratica(avviso.getIntPraticaId()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<Soggetto> soggetti = new ArrayList<Soggetto>( |
|
|
|
|
SoggettoLocalServiceUtil.getValidByIntPratica(intPraticaId)); |
|
|
|
|
Soggetto committentePrincipale = SoggettoLocalServiceUtil |
|
|
|
|
.getValidByIntPratica_CodiceFiscale_TipologiaSoggetto(intPraticaId, |
|
|
|
|
dettPratica.getCodiceFiscalePrincipaleCommittente(), TipoSoggettoUtil.COMMITTENTE); |
|
|
|
|
|
|
|
|
|
List<Soggetto> soggetti = new ArrayList<Soggetto>(SoggettoLocalServiceUtil.getValidByIntPratica(intPraticaId)); |
|
|
|
|
Soggetto committentePrincipale = SoggettoLocalServiceUtil.getValidByIntPratica_CodiceFiscale_TipologiaSoggetto( |
|
|
|
|
intPraticaId, dettPratica.getCodiceFiscalePrincipaleCommittente(), TipoSoggettoUtil.COMMITTENTE); |
|
|
|
|
if (null == committentePrincipale) { |
|
|
|
|
_log.error("Il committente principale non esiste, intPraticaId = " + intPraticaId); |
|
|
|
|
} else { |
|
|
|
|
soggetti.remove(committentePrincipale); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Set<String> sTo = new HashSet<>(); |
|
|
|
|
for (Soggetto soggetto : soggetti) { |
|
|
|
|
sTo.add(soggetto.getEmail()); |
|
|
|
|
} |
|
|
|
|
String[] to = sTo.toArray(new String[sTo.size()]); |
|
|
|
|
|
|
|
|
|
String[] cc = new String[0]; |
|
|
|
|
String[] ccn = new String[0]; |
|
|
|
|
|
|
|
|
|
String tipoPratica = StringPool.BLANK; |
|
|
|
|
if (AzioniPraticheUtil.isDeposito(intPraticaId)) { |
|
|
|
|
tipoPratica = LanguageUtil.get(LocaleUtil.ITALIAN, "tipo-pratica-01"); |
|
|
|
|
} else if (AzioniPraticheUtil.isAutorizzazione(intPraticaId)) { |
|
|
|
|
tipoPratica = LanguageUtil.get(LocaleUtil.ITALIAN, "tipo-pratica-02"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String url = FascicoloURLUtil.getFascicoloFEViewURL(avviso.getCompanyId(), avviso.getIntPraticaId(), |
|
|
|
|
"/html/fascicolofe/view_fascicolo.jsp", StringPool.BLANK); |
|
|
|
|
|
|
|
|
|
JSONObject templateVariables = JSONFactoryUtil.createJSONObject(); |
|
|
|
|
templateVariables.put("tipoPratica", tipoPratica); |
|
|
|
|
templateVariables.put("tipoAvviso", tipoAvviso); |
|
|
|
|
templateVariables.put("tipoAllegato", tipoAllegato); |
|
|
|
|
templateVariables.put("link", url); |
|
|
|
|
|
|
|
|
|
ServiceContext serviceContext = new ServiceContext(); |
|
|
|
|
serviceContext.setScopeGroupId(avviso.getGroupId()); |
|
|
|
|
serviceContext.setCompanyId(avviso.getCompanyId()); |
|
|
|
|
serviceContext.setUserId(avviso.getUserId()); |
|
|
|
|
|
|
|
|
|
MailUtil.invioMailNotifica(intPraticaId, dettPratica.getDettPraticaId(), avvisoId, |
|
|
|
|
Avviso.class.getName(), to, cc, ccn, "NOTIFICA-SOGGETTI-ATTIVI", templateVariables, null, |
|
|
|
|
serviceContext); |
|
|
|
|
|
|
|
|
|
MailUtil.invioMailNotifica(intPraticaId, dettPratica.getDettPraticaId(), avvisoId, Avviso.class.getName(), to, |
|
|
|
|
cc, ccn, "NOTIFICA-SOGGETTI-ATTIVI", templateVariables, null, serviceContext); |
|
|
|
|
if (null != committentePrincipale) { |
|
|
|
|
to = new String[] { committentePrincipale.getEmail() }; |
|
|
|
|
|
|
|
|
|
List<FileAttachment> allegati = new ArrayList<FileAttachment>(); |
|
|
|
|
long fileEntryId = 0l; |
|
|
|
|
|
|
|
|
|
long fileEntryId = 0L; |
|
|
|
|
String[] pdfInvio = new String[] { StatoPraticaConstants.CAMBIO_ISTRUTTORE, |
|
|
|
|
StatoPraticaConstants.SOTTOPOSTA_A_PARERE }; |
|
|
|
|
// se è avviso di Vidimazione o di Avvio procedimento o di Cambio
|
|
|
|
|
// Istruttore => file protocollato
|
|
|
|
|
// se è avviso di Vidimazione o di Avvio procedimento o di Cambio Istruttore => file protocollato
|
|
|
|
|
if (avviso.getTipoDocumento().equalsIgnoreCase(StatoPraticaConstants.VIDIMATA) |
|
|
|
|
|| ArrayUtil.contains(pdfInvio, avviso.getTipoDocumento())) { |
|
|
|
|
if (Validator.isNotNull(avviso.getFileEntryIdProtocollo())) { |
|
|
|
@ -434,45 +361,34 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
fileEntryId = avviso.getFileEntryIdInvio(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (Validator.isNotNull(fileEntryId)) { |
|
|
|
|
FileAttachment fileAttachment = new FileAttachment(); |
|
|
|
|
fileAttachment.setFileEntryId(avviso.getFileEntryIdProtocollo()); |
|
|
|
|
fileAttachment.generateFile(); |
|
|
|
|
allegati.add(fileAttachment); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
MailUtil.invioMailNotifica(intPraticaId, dettPratica.getDettPraticaId(), avvisoId, |
|
|
|
|
Avviso.class.getName(), to, cc, ccn, "NOTIFICA-SOGGETTI-ATTIVI", templateVariables, |
|
|
|
|
allegati, serviceContext); |
|
|
|
|
|
|
|
|
|
String[] suapEnabled = new String[] { StatoPraticaConstants.CONFORME, |
|
|
|
|
StatoPraticaConstants.NON_CONFORME }; |
|
|
|
|
MailUtil.invioMailNotifica(intPraticaId, dettPratica.getDettPraticaId(), avvisoId, Avviso.class.getName(), |
|
|
|
|
to, cc, ccn, "NOTIFICA-SOGGETTI-ATTIVI", templateVariables, allegati, serviceContext); |
|
|
|
|
String[] suapEnabled = new String[] { StatoPraticaConstants.CONFORME, StatoPraticaConstants.NON_CONFORME }; |
|
|
|
|
if ((AzioniPraticheUtil.isAutorizzazione(intPraticaId) && ArrayUtil.contains(suapEnabled, |
|
|
|
|
avviso.getTipoDocumento())) |
|
|
|
|
|| (StatoPraticaConstants.VIDIMATA.equals(avviso.getTipoDocumento()))) { |
|
|
|
|
|
|
|
|
|
IntPratica intPratica = IntPraticaLocalServiceUtil.getIntPratica(intPraticaId); |
|
|
|
|
Territorio territorio = TerritorioLocalServiceUtil |
|
|
|
|
.getTerritorio(intPratica.getTerritorioId()); |
|
|
|
|
Territorio territorio = TerritorioLocalServiceUtil.getTerritorio(intPratica.getTerritorioId()); |
|
|
|
|
Comune comune = ComuneLocalServiceUtil.getComune(territorio.getComuneId()); |
|
|
|
|
|
|
|
|
|
String eMail = StringPool.BLANK; |
|
|
|
|
if (dettPratica.getSuap()) { |
|
|
|
|
eMail = comune.getMailSuap(); |
|
|
|
|
} else { |
|
|
|
|
eMail = comune.getMailSue(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
to = new String[] { eMail }; |
|
|
|
|
|
|
|
|
|
templateVariables.put("cont", StringPool.BLANK); |
|
|
|
|
templateVariables.put("anno", StringPool.BLANK); |
|
|
|
|
templateVariables.put( |
|
|
|
|
"dataVidimazione", |
|
|
|
|
FastDateFormatFactoryUtil.getSimpleDateFormat("dd/MM/yyyy HH:mm").format( |
|
|
|
|
intPratica.getDtPratica())); |
|
|
|
|
|
|
|
|
|
if (to.length > 0 && to[0] != StringPool.BLANK) { |
|
|
|
|
MailUtil.invioMailNotifica(intPraticaId, dettPratica.getDettPraticaId(), avvisoId, |
|
|
|
|
Avviso.class.getName(), to, cc, ccn, "INVIO-SUAP", templateVariables, allegati, |
|
|
|
@ -480,7 +396,6 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void invioSignal(DettPratica integrazione, ControlloPratica controlloPratica, String signalName) |
|
|
|
@ -491,37 +406,23 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
long companyId = controlloPratica.getCompanyId(); |
|
|
|
|
long userId = WorkflowUtil.getWorkflowInstanceCreateUserId(controlloPratica); |
|
|
|
|
try { |
|
|
|
|
|
|
|
|
|
WorkflowInstance workflowInstance = WorkflowInstanceManagerUtil.getWorkflowInstance(companyId, |
|
|
|
|
workflowInstanceId); |
|
|
|
|
|
|
|
|
|
// Fix per errore su No KaleoTransition exists with the key
|
|
|
|
|
// {kaleoNodeId=xxx,
|
|
|
|
|
// name=signal_cittadino}
|
|
|
|
|
// Fix per errore su No KaleoTransition exists with the key {kaleoNodeId=xxx, name=signal_cittadino}
|
|
|
|
|
ServiceContext serviceContext = new ServiceContext(); |
|
|
|
|
serviceContext.setCompanyId(companyId); |
|
|
|
|
KaleoInstance kaleoInstance = KaleoInstanceLocalServiceUtil.getKaleoInstance(workflowInstanceId); |
|
|
|
|
KaleoInstanceToken rootKaleoInstanceToken = kaleoInstance |
|
|
|
|
.getRootKaleoInstanceToken(serviceContext); |
|
|
|
|
|
|
|
|
|
KaleoInstanceToken rootKaleoInstanceToken = kaleoInstance.getRootKaleoInstanceToken(serviceContext); |
|
|
|
|
// ADT:bug importazione portos1 in richiesta di integraione
|
|
|
|
|
this.checkPresenzaIstruttore(controlloPratica, integrazione, serviceContext, userId, |
|
|
|
|
workflowInstanceId); |
|
|
|
|
|
|
|
|
|
if (rootKaleoInstanceToken.getCurrentKaleoNodeName().equals( |
|
|
|
|
WorkflowConstants.WORKFLOW_SIGNAL_INTEGRAZIONE)) { |
|
|
|
|
WorkflowInstanceManagerUtil.signalWorkflowInstance(companyId, userId, workflowInstanceId, |
|
|
|
|
signalName, workflowInstance.getWorkflowContext()); |
|
|
|
|
this.checkPresenzaIstruttore(controlloPratica, integrazione, serviceContext, userId, workflowInstanceId); |
|
|
|
|
if (rootKaleoInstanceToken.getCurrentKaleoNodeName().equals(WorkflowConstants.WORKFLOW_SIGNAL_INTEGRAZIONE)) { |
|
|
|
|
WorkflowInstanceManagerUtil.signalWorkflowInstance(companyId, userId, workflowInstanceId, signalName, |
|
|
|
|
workflowInstance.getWorkflowContext()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DettPraticaLocalServiceUtil.updateSignal(integrazione.getDettPraticaId(), new Date()); |
|
|
|
|
|
|
|
|
|
} catch (WorkflowException e) { |
|
|
|
|
_log.error("Error on controllo pratica id : " + controlloPratica.getControlloPraticaId(), e); |
|
|
|
|
} catch (PortalException e) { |
|
|
|
|
_log.error("Error on controllo pratica id : " + controlloPratica.getControlloPraticaId(), e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void invioSignal(Avviso avviso, ControlloPratica controlloPratica) throws SystemException, |
|
|
|
@ -534,31 +435,18 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
long userId = WorkflowUtil.getWorkflowInstanceCreateUserId(controlloPratica); |
|
|
|
|
String signalName = WorkflowUtil.getSignalByTipoDocumento(avviso.getTipoDocumento()); |
|
|
|
|
try { |
|
|
|
|
|
|
|
|
|
WorkflowInstance workflowInstance = WorkflowInstanceManagerUtil.getWorkflowInstance( |
|
|
|
|
companyId, workflowInstanceId); |
|
|
|
|
|
|
|
|
|
// Fix per errore su No KaleoTransition exists with the key
|
|
|
|
|
// {kaleoNodeId=xxx, name=signal_ff}
|
|
|
|
|
WorkflowInstance workflowInstance = WorkflowInstanceManagerUtil.getWorkflowInstance(companyId, |
|
|
|
|
workflowInstanceId); |
|
|
|
|
// Fix per errore su No KaleoTransition exists with the key {kaleoNodeId=xxx, name=signal_ff}
|
|
|
|
|
ServiceContext serviceContext = new ServiceContext(); |
|
|
|
|
serviceContext.setCompanyId(companyId); |
|
|
|
|
KaleoInstance kaleoInstance = KaleoInstanceLocalServiceUtil |
|
|
|
|
.getKaleoInstance(workflowInstanceId); |
|
|
|
|
KaleoInstanceToken rootKaleoInstanceToken = kaleoInstance |
|
|
|
|
.getRootKaleoInstanceToken(serviceContext); |
|
|
|
|
|
|
|
|
|
KaleoInstance kaleoInstance = KaleoInstanceLocalServiceUtil.getKaleoInstance(workflowInstanceId); |
|
|
|
|
KaleoInstanceToken rootKaleoInstanceToken = kaleoInstance.getRootKaleoInstanceToken(serviceContext); |
|
|
|
|
if (rootKaleoInstanceToken.getCurrentKaleoNodeName().equals(signalName)) { |
|
|
|
|
WorkflowInstanceManagerUtil.signalWorkflowInstance(companyId, userId, workflowInstanceId, |
|
|
|
|
signalName, workflowInstance.getWorkflowContext()); |
|
|
|
|
} |
|
|
|
|
AvvisoLocalServiceUtil.updateAvvisoSignal(avviso.getAvvisoId(), new Date()); |
|
|
|
|
// TODO capire se serve sempre
|
|
|
|
|
// if (signalName.equals(WorkflowConstants.JBPM_SIGNAL_INVIO)) {
|
|
|
|
|
// DettPraticaLocalServiceUtil.updateDettPraticaStatusTask(dettPratica.getDettPraticaId(),
|
|
|
|
|
// 0);
|
|
|
|
|
// }
|
|
|
|
|
} catch (WorkflowException e) { |
|
|
|
|
_log.error("Error on controllo pratica id : " + controlloPratica.getControlloPraticaId(), e); |
|
|
|
|
} catch (PortalException e) { |
|
|
|
|
_log.error("Error on controllo pratica id : " + controlloPratica.getControlloPraticaId(), e); |
|
|
|
|
} |
|
|
|
@ -572,7 +460,6 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
|
|
|
|
|
// FIXME la tempistica non va bene mette le date sbagliate
|
|
|
|
|
String tipoDocumento = avviso.getTipoDocumento(); |
|
|
|
|
// String tipoDocumento = avviso.translateTipoDocumento();
|
|
|
|
|
Date dtInvio = avviso.getDtInvio(); |
|
|
|
|
if (tipoDocumento.equals(StatoPraticaConstants.SOTTOPOSTA_A_PARERE)) { |
|
|
|
|
long intPraticaId = controlloPratica.getIntPraticaId(); |
|
|
|
@ -580,33 +467,25 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
try { |
|
|
|
|
intPratica = IntPraticaLocalServiceUtil.getIntPratica(controlloPratica.getIntPraticaId()); |
|
|
|
|
} catch (PortalException e) { |
|
|
|
|
|
|
|
|
|
_log.error(e, e); |
|
|
|
|
} |
|
|
|
|
// FIX prendo la data di vidimazione e non quella di sottoposto a
|
|
|
|
|
// parere per avvio dei tempi
|
|
|
|
|
// FIX prendo la data di vidimazione e non quella di sottoposto a parere per avvio dei tempi
|
|
|
|
|
Avviso avvisoExtra = null; |
|
|
|
|
if (Validator.isNotNull(intPratica.getDtSorteggio())) { |
|
|
|
|
dtInvio = intPratica.getDtSorteggio(); |
|
|
|
|
} else { |
|
|
|
|
List<Avviso> documentiVid = AvvisoLocalServiceUtil.findByIntPraticaId_tipoDocumento( |
|
|
|
|
intPraticaId, StatoPraticaConstants.VIDIMATA); |
|
|
|
|
List<Avviso> documentiVid = AvvisoLocalServiceUtil.findByIntPraticaId_tipoDocumento(intPraticaId, |
|
|
|
|
StatoPraticaConstants.VIDIMATA); |
|
|
|
|
avvisoExtra = documentiVid.get(0); |
|
|
|
|
dtInvio = avvisoExtra.getDtInvio(); |
|
|
|
|
} |
|
|
|
|
// fino qui
|
|
|
|
|
|
|
|
|
|
// TempisticaLocalServiceUtil.addTempistica(intPraticaId,
|
|
|
|
|
// dettPraticaId, TempisticaConstants.TIPO_PRATICA, dtInvio,
|
|
|
|
|
// serviceContext);
|
|
|
|
|
Date now = new Date(); |
|
|
|
|
|
|
|
|
|
// FIX come sopra
|
|
|
|
|
if (avvisoExtra != null) { |
|
|
|
|
AvvisoLocalServiceUtil.updateAvvisoTempistica(avvisoExtra.getAvvisoId(), now); |
|
|
|
|
} |
|
|
|
|
// fino qui
|
|
|
|
|
|
|
|
|
|
AvvisoLocalServiceUtil.updateAvvisoTempistica(avviso.getAvvisoId(), now); |
|
|
|
|
} else if (tipoDocumento.equals(StatoPraticaConstants.INTEGRAZIONE)) { |
|
|
|
|
long intPraticaId = controlloPratica.getIntPraticaId(); |
|
|
|
@ -614,8 +493,7 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
ServiceContext serviceContext = getServiceContext(controlloPratica); |
|
|
|
|
Tempistica tempistica = TempisticaLocalServiceUtil.getTempistica(serviceContext.getCompanyId(), |
|
|
|
|
intPraticaId, TempisticaConstants.TIPO_PRATICA, false); |
|
|
|
|
// tempstica = null se pratica con cambio di stato forzato e no
|
|
|
|
|
// workflow
|
|
|
|
|
// tempstica = null se pratica con cambio di stato forzato e no workflow
|
|
|
|
|
if (tempistica != null) { |
|
|
|
|
TempisticaLocalServiceUtil.stopTempistica(tempistica.getTempisticaId(), dtInvio); |
|
|
|
|
} |
|
|
|
@ -630,8 +508,7 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
ServiceContext serviceContext = getServiceContext(controlloPratica); |
|
|
|
|
Tempistica tempistica = TempisticaLocalServiceUtil.getTempistica(serviceContext.getCompanyId(), |
|
|
|
|
intPraticaId, TempisticaConstants.TIPO_PRATICA, false); |
|
|
|
|
// tempstica = null se pratica con cambio di stato forzato e no
|
|
|
|
|
// workflow
|
|
|
|
|
// tempstica = null se pratica con cambio di stato forzato e no workflow
|
|
|
|
|
if (tempistica != null) { |
|
|
|
|
TempisticaLocalServiceUtil.concludiTempistica(tempistica.getTempisticaId(), dtInvio); |
|
|
|
|
AvvisoLocalServiceUtil.updateAvvisoTempistica(avviso.getAvvisoId(), new Date()); |
|
|
|
@ -644,87 +521,6 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void sendToTecnico(Avviso avviso) throws SystemException, PortalException { |
|
|
|
|
|
|
|
|
|
// TODO inviare la mail con il nuovo sistema di mail.
|
|
|
|
|
// System.out.println("inviare la mail con il nuovo sistema di mail.");
|
|
|
|
|
// DettPratica dettPratica =
|
|
|
|
|
// DettPraticaLocalServiceUtil.getDettPratica(avviso.getDettPraticaId());
|
|
|
|
|
// IntPratica intPratica =
|
|
|
|
|
// IntPraticaLocalServiceUtil.getIntPratica(dettPratica.getIntPraticaId());
|
|
|
|
|
// Territorio territorio =
|
|
|
|
|
// TerritorioLocalServiceUtil.getTerritorio(intPratica.getTerritorioId());
|
|
|
|
|
// Comune comune =
|
|
|
|
|
// ComuneLocalServiceUtil.getComune(territorio.getComuneId());
|
|
|
|
|
//
|
|
|
|
|
// // tecnico da workflow
|
|
|
|
|
// User user = null;
|
|
|
|
|
// if (intPratica.isVariante()) {
|
|
|
|
|
// IntPratica intPraticaVariata =
|
|
|
|
|
// IntPraticaLocalServiceUtil.findByPratica_da_variare(intPratica.getTerritorioId(),
|
|
|
|
|
// true,
|
|
|
|
|
// intPratica.getIntPraticaId(), intPratica.getNumeroProgetto()).get(0);
|
|
|
|
|
// user =
|
|
|
|
|
// UserLocalServiceUtil.fetchUser(intPraticaVariata.getStatusByUserId());
|
|
|
|
|
// } else {
|
|
|
|
|
// user =
|
|
|
|
|
// UserLocalServiceUtil.fetchUser(intPratica.getStatusByUserId());
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// if (user == null) {
|
|
|
|
|
// // pratica senza workflow o nuova domanda
|
|
|
|
|
// AvvisoLocalServiceUtil.updateAvvisoInviatoTecnico(avviso.getAvvisoId(),
|
|
|
|
|
// true);
|
|
|
|
|
// } else {
|
|
|
|
|
//
|
|
|
|
|
// String destinatario = user.getEmailAddress();
|
|
|
|
|
//
|
|
|
|
|
// String mittente = PortletProps.get(TECNICO_MITTENTE);
|
|
|
|
|
//
|
|
|
|
|
// String oggetto = PortletProps.get(TECNICO_OGGETTO);
|
|
|
|
|
//
|
|
|
|
|
// // variante o integrazione
|
|
|
|
|
// String tipoPratica = StringPool.BLANK;
|
|
|
|
|
// if (intPratica.isVariante()) {
|
|
|
|
|
// tipoPratica = LanguageUtil.get(Locale.ITALIAN,
|
|
|
|
|
// "label.admingeniocivile.statopratica.variante");
|
|
|
|
|
// } else {
|
|
|
|
|
// tipoPratica =
|
|
|
|
|
// LanguageUtil.get(Locale.ITALIAN,
|
|
|
|
|
// TipoIntegrazioneConstants.toLabel(dettPratica.getTipoIntegrazione()));
|
|
|
|
|
// }
|
|
|
|
|
// String tecnico = StringPool.BLANK;
|
|
|
|
|
// if (intPratica.getStatusByUserId() != 0l) {
|
|
|
|
|
// tecnico =
|
|
|
|
|
// UserLocalServiceUtil.getUser(intPratica.getStatusByUserId()).getFullName();
|
|
|
|
|
// }
|
|
|
|
|
// String corpo =
|
|
|
|
|
// StringUtil.replace(
|
|
|
|
|
// PortletProps.get(TECNICO_CORPO),
|
|
|
|
|
// new String[] {"[$NUMERO_PRATICA$]", "[$TIPO_PRATICA$]", "[$COMUNE$]",
|
|
|
|
|
// "[$DATA$]",
|
|
|
|
|
// "[$DESCRIZIONE_PROGETTO$]", "[$TECNICO$]"},
|
|
|
|
|
// new String[] {
|
|
|
|
|
// intPratica.getNumeroProgetto(),
|
|
|
|
|
// tipoPratica,
|
|
|
|
|
// comune.getDescLong(),
|
|
|
|
|
// FastDateFormatFactoryUtil.getSimpleDateFormat("dd/MM/yyyy",
|
|
|
|
|
// Locale.ITALY).format(
|
|
|
|
|
// avviso.getCreateDate()), intPratica.getDescLongIntervento(),
|
|
|
|
|
// tecnico});
|
|
|
|
|
//
|
|
|
|
|
// try {
|
|
|
|
|
//
|
|
|
|
|
// CustomMailEngine.send(new InternetAddress(mittente), new
|
|
|
|
|
// InternetAddress(destinatario),
|
|
|
|
|
// oggetto, corpo, true);
|
|
|
|
|
//
|
|
|
|
|
// AvvisoLocalServiceUtil.updateAvvisoInviatoTecnico(avviso.getAvvisoId(),
|
|
|
|
|
// true);
|
|
|
|
|
//
|
|
|
|
|
// } catch (Exception e) {
|
|
|
|
|
// _log.error("Error", e);
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private ServiceContext getServiceContext(ControlloPratica controlloPratica) { |
|
|
|
@ -736,25 +532,18 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
return serviceContext; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* ADT: check congruenza WF - presenza dell'istruttore per pratiche |
|
|
|
|
* importate da PORTOS1 |
|
|
|
|
* |
|
|
|
|
* |
|
|
|
|
* @param transitionName |
|
|
|
|
* @param workflowTaskId |
|
|
|
|
*/ |
|
|
|
|
// ADT: check congruenza WF - presenza dell'istruttore per pratiche importate da PORTOS1
|
|
|
|
|
private void checkPresenzaIstruttore(ControlloPratica controlloPratica, DettPratica integrazione, |
|
|
|
|
ServiceContext serviceContext, long userId, long workflowInstanceId) { |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
Map<String, Serializable> wfParameters = WorkflowUtil.getFormParameters(controlloPratica); |
|
|
|
|
String istruttore = (String) wfParameters.get("istruttore"); |
|
|
|
|
_log.info("checkPresenzaIstruttore risposta integrazioni - istruttore presente sul workflow= " |
|
|
|
|
+ istruttore + " - -controlloPratica=" + controlloPratica.getControlloPraticaId()); |
|
|
|
|
_log.info("checkPresenzaIstruttore risposta integrazioni - istruttore presente sul workflow= " + istruttore |
|
|
|
|
+ " - -controlloPratica=" + controlloPratica.getControlloPraticaId()); |
|
|
|
|
if (istruttore == null) { |
|
|
|
|
_log.info("checkPresenzaIstruttore gestione risposta integrazioni - rilevata incongrueza WF " |
|
|
|
|
+ "- istruttore non presente per dettpraticaid= " |
|
|
|
|
+ integrazione.getDettPraticaId() |
|
|
|
|
+ "- istruttore non presente per dettpraticaid= " + integrazione.getDettPraticaId() |
|
|
|
|
+ " -controlloPratica=" + controlloPratica.getControlloPraticaId()); |
|
|
|
|
long istruttoreId = IntPraticaLocalServiceUtil.getIntPratica(integrazione.getIntPraticaId()) |
|
|
|
|
.getStatusByUserId(); |
|
|
|
@ -765,8 +554,8 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
JSONSerializer jsonSerializer = JSONFactoryUtil.createJSONSerializer(); |
|
|
|
|
jsonFormParameters = jsonSerializer.serialize(parametri); |
|
|
|
|
serviceContext.setUserId(userId); |
|
|
|
|
FormLogLocalServiceUtil.addFormLog(workflowInstanceId, 0l, "cambio-istruttore", |
|
|
|
|
jsonFormParameters, serviceContext); |
|
|
|
|
FormLogLocalServiceUtil.addFormLog(workflowInstanceId, 0L, "cambio-istruttore", jsonFormParameters, |
|
|
|
|
serviceContext); |
|
|
|
|
_log.info("checkPresenzaIstruttore OK per controlloPratica = " |
|
|
|
|
+ controlloPratica.getControlloPraticaId()); |
|
|
|
|
} else { |
|
|
|
@ -774,15 +563,9 @@ public class SchedulerInvioDocumento implements MessageListener {
|
|
|
|
|
+ controlloPratica.getControlloPraticaId() + " - istruttore non calcolato - "); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
|
|
|
|
_log.error("checkPresenzaIstruttore KO per controlloPratica = " |
|
|
|
|
+ controlloPratica.getControlloPraticaId() + " [" + e.getMessage() + " , " + e.getCause() |
|
|
|
|
+ "]"); |
|
|
|
|
|
|
|
|
|
_log.error("checkPresenzaIstruttore KO per controlloPratica = " + controlloPratica.getControlloPraticaId() |
|
|
|
|
+ " [" + e.getMessage() + StringPool.COMMA_AND_SPACE + e.getCause() + StringPool.CLOSE_BRACKET); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|