<cfset StructDelete(Variables, "error_output")>
<cfset StructDelete(Variables, "fatture_ricevute")>
<cfset StructDelete(Variables, "fattura_ricevuta")>
<cfset StructDelete(Variables, "fatture_inviate")>
<cfset StructDelete(Variables, "fattura_inviata")>
<cfset StructDelete(Variables, "result")>

<cftry>
  <cfquery datasource="#active_session_dsn#" name="fatture_inviate">
    select IDDocumento, inviata_SDI, id_SDI, stato_SDI
    from #active_session_dsn#.fatture_attivo
    where inviata_SDI=1
    and id_SDI is not null
    and ( stato_SDI is null or upper(stato_SDI) not in ('CONSEGNATA','NON CONSEGNATA','SCARTATA', 'RIFIUTATA','ACCETTATA','Decorrenza termini'))
  </cfquery>
  <!--- <cfdump var="#fatture_inviate#"> --->
  <cfcatch>Errore recupero dati da DB...<br /></cfcatch>
</cftry>

<cfif IsDefined("fatture_inviate")>
  <cfif fatture_inviate.recordCount gt 0>
    <cfoutput>Inizio a ciclare le fatture inviate aperte che hanno ID_SdI valorizzato (#fatture_inviate.recordCount#)<br /></cfoutput>
  <cfelse>
    Nessuna fattura da processare.<br />
  </cfif>
  <cfloop query="#fatture_inviate#">
  <cftransaction action="begin">
    <cftry>
      <cfset IDDocumento = fatture_inviate.IDDocumento>
      <cfset FatturaID = fatture_inviate.id_SDI>
      <cfset StatoFattura = fatture_inviate.stato_SDI>

      <cfset ws_url_invoice_out = 'https://ws.fatturazioneelettronica.aruba.it/services/invoice/out/#FatturaID#'>
      <cfoutput><br />*** ID SdI Fattura: #FatturaID# (#ws_url_invoice_out#)<br /></cfoutput>
      <cfhttp url="#ws_url_invoice_out#" result="result" method="get">
        <cfhttpparam type="header" name="Content-Type" value="application/json">
        <cfhttpparam type="header" name="Authorization" value="Bearer #token_SDI#">
      </cfhttp>
      <!--- Gestisce l'errore interno generico 500 ricevuto in risposta alla precedente chiamata --->
      <cfif IsDefined("result.Statuscode") and result.Statuscode eq '500 Internal Server Error'>
        <cfset error_output = '410'>
        <cfoutput>#error_output# | Statuscode='500 Internal Server Error'<br /></cfoutput>
      </cfif>

      <!--- Gestisce l'errore 404 ricevuto in risposta alla precedente chiamata --->
      <cfif IsDefined("result.Statuscode") and result.Statuscode eq '404'>
        <cfset error_output = '420'>
        <cfoutput>#error_output# | Statuscode='404'<br /></cfoutput>
      </cfif>

      <!--- Gestisce l'errore 401 ricevuto in risposta alla precedente chiamata --->
      <cfif IsDefined("result.Statuscode") and result.Statuscode eq '401 Unauthorized'>
        <cfset error_output = '430'>
        <cfoutput>#error_output# | Statuscode='401 Unauthorized'<br /></cfoutput>
      </cfif>

      <!--- Verifica la presenza del Filecontent nella risposta alla precedente chiamata --->
      <cfif NOT IsDefined("result.Filecontent") or len(trim(result.Filecontent)) eq 0>
        <cfset error_output = '440'>
        <cfoutput>#error_output# | Filecontent non presente o non popolato<br /></cfoutput>
        <cfdump var="#result#">
      </cfif>

      <!--- Processa quanto ricevuto dalla precedente chiamata --->
      <cftry>
        <cfset fattura_inviata=DeserializeJSON(result.Filecontent)>
        <cfcatch>
          <cfset error_output = '450'>
          <cfoutput>#error_output# | Errore interpretazione 'Filecontent'<br /></cfoutput>
        </cfcatch>
      </cftry>
      <cfif IsDefined("fattura_ricevuta.Message") and fattura_ricevuta.Message eq "Authorization has been denied for this request.">
        <cfset error_output = '350'>
        <cfoutput>#error_output# | Authorization has been denied for this request.<br /></cfoutput>
      <cfelseif IsDefined("fattura_ricevuta.error") and fattura_ricevuta.error eq 'invalid_token'>
        <cfset error_output = '360'>
        <cfoutput>#error_output# | Invalid token | Cannot convert access token to JSON<br /></cfoutput>
        <cfdump var="#result#">
      <cfelse>
        <!--- <cfdump var="#fattura_inviata#"> --->
        <cfif IsDefined("fattura_inviata.invoices") and ArrayLen(fattura_inviata.invoices) gt 0>
          <cfset fattura_dettaglio = fattura_inviata.invoices[1]>
 		  <cfset Data_update_ = replace(fattura_inviata.lastUpdate, "T", " ", "all")>
		  <cfset Data_update = left(Data_update_,19)>
		  <cfset Data_update = DateAdd("h",+2,Data_update)>
         <cfif IsDefined("fattura_dettaglio.status") and Len(Trim(fattura_dettaglio.status)) gt 0>
            <cfset new_StatoFattura = Trim(fattura_dettaglio.status)>
            <cfoutput>Ultimo stato: #StatoFattura#<br />Stato attuale: #new_StatoFattura#<br /></cfoutput>
            <cfif StatoFattura neq new_StatoFattura>
              <cfquery datasource="#active_session_dsn#" name="aggiorna_stato">
                CALL `#active_session_dsn#`.`pr_fattura_attivo_aggiorna_stato_sdi`( #IDDocumento#, '#new_StatoFattura#', #CreateODBCDateTime(Data_update)# )
              </cfquery>
              <cfoutput>Stato della fattura aggiornato!<br /></cfoutput>
            <cfelse>
              <cfoutput>Stato della fattura invariato...<br /></cfoutput>
            </cfif>
          </cfif>
        </cfif>
      </cfif>

      <cfcatch>Errore caricamento fattura<br /><cfoutput>#cfcatch.Message#</cfoutput></cfcatch>
    </cftry>
    <!--- <cftransaction action="rollback"> --->
  </cftransaction>
  </cfloop>
</cfif>