Fatturazione elettronica B2B: programmi

di il
814 risposte

814 Risposte - Pagina 23

  • Re: Fatturazione elettronica B2B: programmi

    +m2+ ha scritto:


    marianzo ha scritto:


    Buongiorno

    usando il controllo della partita IVA alcune esistenti e attive mi dice che sono sbagliate o chiuse

    mi aiutate a capire

    Grazie Mille a tutti
    è semplice: non c'è un controllo affidabile per le partite IVA.
    O meglio c'è, ma ha il captcha (sul sito ade).

    Quello senza captcha (europeo) non è un granchè attendibile.
    Questo passa il convento (cioè ade)
    Scusa +m2+

    ti ringrazio già di quello che fai
  • Re: Fatturazione elettronica B2B: programmi

    Ciao +m2+
    sto provando i tuoi programmi e ti ringrazio per la generosità.

    Ho una domanda riguardo la procedura tleggo: tutto funziona bene se la mail si trova nella folder "posta in arrivo", ma se sposto la mail in altra folder, allora non si riesce più a recuperare la mail (o forse la funzionalità esiste e me la son persa).
    ...
    Apertura IMAP a buon fine
    Non trovato token SUBJECT valore invio fe
    Sarebbe utile poter specificare in tleggo la directory dove cercare: ad esempio aruba pec dispone del servizio "leggi fatture" per "centralizzare" le FE in arrivo in una cartella "Fatture Ricevute" (che se non erro, al momento è "irraggiungibile" da tleggo).

    aruba_leggipec.PNG
    aruba_leggipec.PNG

    Grazie
  • Re: Fatturazione elettronica B2B: programmi

    In realtà mettere a punto il client di posta non dovrebbe essere difficile.
    Compatibilmente con gli le priorità (tipo scoprire chi ha sparato a Bill) qualcosa potrei fare.
    molto di più, se qualche buon samaritano mi inviasse un po' di pec, notifiche ade etc per evolvere il programma
  • Re: Fatturazione elettronica B2B: programmi

    Oh, cacchio, hanno sparato a Bill? E Uma, ora, che fa?!?
  • Re: Fatturazione elettronica B2B: programmi

    niobi ha scritto:


    Oh, cacchio, hanno sparato a Bill? E Uma, ora, che fa?!?
    Bill Spencer, lo Spadone
  • Re: Fatturazione elettronica B2B: programmi

    Ciao -M2+,
    io ho provato a controllare la fattura elettronica che ti ho inviato ier sera, e Xml2Pdf (com.3) si blocca con un errore "non riesco a trovare il file pdf nella cartella..." dove avrebbe dovuto scompattarlo. Per superare l'errore bloccante, debbo chiudere l'eseguibile per poter proseguire. Non ha creato il file di rapporto, forse perché l'errore non è intercettato.
    Si è quindi ripresentato l'errore di cui ti parlavo precedentemente, solo che stavolta l'eseguibile si chiude chiedendone la distruzione col click sull'icona della barra delle applicazioni.
    Ti risulta?
    Antonio
  • Re: Fatturazione elettronica B2B: programmi

    Non sono andato in studio, ieri avevo impegni.
    Oggi pomeriggio invece conto di andare e verificare.
  • Re: Fatturazione elettronica B2B: programmi

    niobi ha scritto:


    Ciao -M2+,
    io ho provato a controllare la fattura elettronica che ti ho inviato ier sera, e Xml2Pdf (com.3) si blocca con un errore "non riesco a trovare il file pdf nella cartella..." dove avrebbe dovuto scompattarlo. Per superare l'errore bloccante, debbo chiudere l'eseguibile per poter proseguire. Non ha creato il file di rapporto, forse perché l'errore non è intercettato.
    Si è quindi ripresentato l'errore di cui ti parlavo precedentemente, solo che stavolta l'eseguibile si chiude chiedendone la distruzione col click sull'icona della barra delle applicazioni.
    Ti risulta?
    Antonio
    Mi risulta.
    Il motivo è abbastanza banale, ma non lo avevo considerato.
    Qualche "furbone" può chiamare gli allegati in modo incompatibile con il filesystem.
    Ad esempio
    Documento 2018/FEABCDE/123_stocazzo.pdf
    Fixo con una purga cattiva nome file

    Ora il file rapporto diventa qualcosa del tipo
    
    tipoeml=FEL RICEVUTA
    sottotipoeml=FATTURA
    mittente=IT012345678
    nomefattura=IT012345678_boh
    nomefatturaxml=IT012345678_boh.xml
    nomefatturaxmlp7m=IT012345678_boh.xml.p7m
    nomeallegato=IT012345678_boh_xml_Documento_2018_F.pdf
    nomericevuta=IT012345678_boh_MT_001.xml
    tipomessaggio=MT Notifica dei metadati
    identificativosdi=123456789
    hash=tantebellecose
    codicedestinatario=0000000
    tentativiinvio=1
    messageid=77777344556667
    fatturainpdf=fatturainpdf.pdf
    codicedestinatario=0000000
    pecdestinatario=latuapecchebelchebel@pec.it
    cessionariocommittente_idfiscaleiva_idcodice=098764321
    
    Le tipologie sono per ora
    
    tipoemail
    FEL INVIATA se ha subject che inizia per G_FEL_HEADER
    sottotipo
    RICEVUTA CONSEGNA OK
    
    
    tipoemail
    FEL RICEVUTA
    sottotipo
    FATTURA
    
    FEL INVIATA
    INVIO A SERVER SMTPS
    
    FEL INVIATA
    ACCETTAZIONE OK
    
    FEL INVIATA
    ERRORE (errore-consegna), tipicamente indirizzo sbagliato eccetera
    
    può andar bene?
  • Re: Fatturazione elettronica B2B: programmi

    Per cominciare, dovrebbe essere sufficiente.
    Dunque:
    - FEL INVIATA -> Ric. consegna: dovrebbe corrispondere al messaggio di accettazione da parte del server pec. Codice RI (ricevuta invio)
    - FEL INVIATA -> accettazione: dovrebbe corrispondere all'esito della consegna: codice RC
    - FEL INVIATA -> errore consegna: e qui ci sono NS, notifica scarto (individuabile facilmente); MC mancata consegna; DT decorrenza termini; poi c'è una pletora di codici simili: NE (esito cedente), EC (esito cess.) AT (attestaz. di impossibilità recapito), SE (scarto esito cess.). Come riconoscere queste tipologie? Ci sarà una "ricevuta ad hoc" per ciascuna? E a che dovrebbe servire censire queste tipologie? le mettiamo in archivio?
    - FEL RICEVUTA -> fattura da fornitore, codice FR (facile & rapido *_*)
    Io credo che questo copra tutte le possibilità; resta il problema del riconoscimento... in base alle descrizioni adottate.
    Per me il riconoscimento resta dificile, tu invece sei un mago, hai l'occhio poliedrico, e riesci a codificare inizio e termine di ogni sezione del messaggio... cacchio!!
    Antonio
  • Re: Fatturazione elettronica B2B: programmi

    Ah,
    credo sia utile anche riportare la data di arrivo della fattura ricevuta (presso il server), in modo da regolare automaticamente la registrazione in contabilità del documento (periodo di liquidazione).
  • Re: Fatturazione elettronica B2B: programmi

    La questione della data in effetti mi pare interessante.
    non si sa mai cosa inventeranno per la competenza iva
  • Re: Fatturazione elettronica B2B: programmi

    Su richiesta ecco un programmello
    https://ufile.io/7i4j
    
    TINIETTO 0.1 - inietto file dentro FEL-XML
    Devono esistere esattamente 3 parametri
    filexml filedainiettare filexmliniettato
    esempio
    "f:\IT123456780_0001.xml" "z:\fatturainpdf.pdf" "z:\fatturainiettata.xml"
    col sorgentello
    program tinietto;
    
    {$APPTYPE CONSOLE}
    /// serve il file jclmime.pas
    /// essenzialmente la libreria JEDI
    
    uses
       Jclmime,
      classes,
      SysUtils;
    
    procedure logganow(i_stringa:string);
    begin
       writeln(i_stringa);
    end;
    /// è una funzione a 64bit, sprecata ma pazienza
    function prendiDimensioneFile(i_nomefile:string):int64;
    var
      SearchRec : TSearchRec;
    begin
       if FindFirst(i_nomefile, faAnyFile, SearchRec ) = 0 then
           Result := Int64(SearchRec.FindData.nFileSizeHigh) shl Int64(32) +
               Int64(SearchREc.FindData.nFileSizeLow)
       else
           Result := 0;
       sysutils.FindClose(SearchRec);
    end;
    
    /// abbastanza triste, ma per estensioni multiple
    function prendiEstensione(i_nomefile:string):string;
    var
       i:integer;
       punto:integer;
    begin
       Result:='';
    	if i_nomefile='' then
           exit;
       i_nomefile:=extractfilename(i_nomefile);
       punto:=pos('.',i_nomefile);
       if punto=0 then
           exit;
       punto:=length(i_nomefile);
       while (i_nomefile[punto]<>'.') and (punto>1) do
       	dec(punto);
       if punto=0 then
           exit;
    	for i:=punto+1 to length(i_nomefile) do
       	result:=result+i_nomefile[i];
    end;
    
    function isEstensione(i_nomefile:string;i_estensione:string):boolean;
    begin
      result:=false;
      if i_nomefile='' then Exit;
      if i_estensione='' then Exit;
      Result:=UpperCase(prendiEstensione(i_nomefile))=UpperCase(i_estensione);
    end;
    function isXML(i_nomeword:string):boolean;
    begin
       result:=isestensione(i_nomeword,'XML')
    end;
    
    /// usiamo la libreria per convertire il file in stringa.
    function g_filetomime64(i_file:string):string;
    var
       aOutput: TStringStream;
       FS:TMemoryStream;
    begin
       Result:='';
       if not FileExists(i_file) then
       begin
           logganow('Errore 6923 non esiste file '+i_file);
           exit;
       end;
    
       FS := TMemoryStream.Create;
       FS.LoadFromFile(i_file);
       aOutput := TStringStream.Create('');
       try
           MimeEncodeStreamNoCRLF(fs, aOutput);
           Result := aOutput.DataString;
       finally
          aOutput.Free;
          fs.Free;
       end;
    end;
    
    
    /// queste sono funzioncine che ho scritto per creare i file XML
    /// come quelli dell'AdE.
    
    /// 0 manipolazioni XML; tutto stringhe
    function g_spazi(i_volte:integer):string;
    var
       i:integer;
    begin
       result:='';
       if i_volte<=0 then Exit;
       for i:=1 to i_volte div 4 do
           Result:=result+chr(9);
    end;
    
    
    function g_fatturaScriviRiga(i_offset:Integer;i_fattura:tstringlist;i_riga:string):Boolean;
    begin
       result:=False;
       if i_offset<0 then
       begin
         loggaNow('Errore 12212 i_offset negativo');
         exit;
       end;
       if i_fattura=nil then
       begin
           loggaNow('Errore 445 i_fattura vuota');
           Exit;
       end;
       if i_riga='' then
       begin
           logganow('Errore 3359 i_riga vuota');
           Exit;
       end;
       i_fattura.add(g_spazi(i_offset)+i_riga);
       result:=True;
    end;
    
    function g_fatturaScriviTag(i_offset:Integer;i_fattura:tstringlist;i_tag:string;i_stringa:string):Boolean;
    begin
       result:=False;
       if i_offset<0 then
       begin
         loggaNow('Errore 44212 i_offset negativo');
         exit;
       end;
       if i_fattura=nil then
       begin
           logganow('Errore 3422 fattura vuota');
           exit;
       end;
        if i_tag='' then
       begin
           logganow('Errore 6859 i_tag vuoto');
           Exit;
       end;
       i_fattura.add(g_spazi(i_offset)+'<'+i_tag+'>'+i_stringa+'</'+i_tag+'>');
       result:=True;
    end;
    
    
    /// funzione molto triste, ma molto utile
    function g_fatturasostituiscitag(i_stringa:string;i_nometag:string;i_sostituto:String):string;
    var
       inizio:integer;
       fine:integer;
       i:integer;
       s:string;
    begin
       Result:=i_stringa;
       inizio:=Pos('<'+lowercase(i_nometag)+'>',LowerCase(i_stringa));
       if inizio>0 then
       begin
           fine:=Pos('</'+lowercase(i_nometag)+'>',LowerCase(i_stringa));
           if fine>0 then
           begin
               s:='';
               for i:=1 to inizio-1 do
                   s:=s+i_stringa[i];
               s:=s+i_sostituto;
               for i:=fine+length(i_nometag)+3 to Length(i_stringa) do
                   s:=s+i_stringa[i];
               result:=s;
           end;
       end
       else
       begin
           inizio:=Pos('</'+lowercase('FatturaElettronicaBody')+'>',LowerCase(i_stringa));
           if inizio>0 then
           begin
               s:='';
               for i:=1 to inizio-1 do
                   s:=s+i_stringa[i];
               s:=s+i_sostituto;
               for i:=inizio to Length(i_stringa) do
                   s:=s+i_stringa[i];
               result:=s;
           end;
       end;
    end;
    
    
    /// qui c'è un minimo di resilienza: se il file XML ha già una sezione
    /// attachment viene sostituita. Ma solo la PRIMA!
    
    function g_fel_inietta_file(i_filexml:string;i_fileiniettato:string;i_fileoutput:string):Boolean;
    var
       filemime:string;
       fattura:TStringList;
       sl:TStringList;
       filestringa:string;
       s:string;
    begin
       Result:=false;
       if i_filexml='' then
       begin
           logganow('Errore 3012 file xml vuoto');
           Exit;
       end;
       if not FileExists(i_filexml) then
       begin
           logganow('Errore 3011 file xml non esiste '+i_filexml);
           exit;
       end;
       if i_fileiniettato='' then
       begin
           logganow('Errore 3013 file iniettato vuoto');
           Exit;
       end;
       if not FileExists(i_fileiniettato) then
       begin
           logganow('Errore 3045 file iniettato non esiste '+i_fileiniettato);
           Exit;
       end;
       if prendiDimensioneFile(i_fileiniettato)>2000000 then
       begin
           logganow('Errore 3044 file da iniettare >2MB '+i_fileiniettato);
           Exit;
       end;
       filemime:=g_filetomime64(i_fileiniettato);
    
       fattura:=tstringlist.create;
       g_fatturaScriviRiga(4,fattura,'<Allegati>');
           g_fatturaScriviTag(8,fattura,'NomeAttachment',ExtractFileName(i_fileiniettato));
           g_fatturaScriviTag(8,fattura,'FormatoAttachment',prendiestensione(i_fileiniettato));
           g_fatturaScriviTag(8,fattura,'DescrizioneAttachment','allegati fattura');
           g_fatturaScriviTag(8,fattura,'Attachment',filemime);
       g_fatturaScriviRiga(4,fattura,'</Allegati>');
    
       sl:=tstringlist.create;
       sl.LoadFromFile(i_filexml);
       filestringa:=sl.text;
       s:=g_fatturasostituiscitag(filestringa,'allegati',fattura.text);
       sl.Text:=s;
       if fileexists(i_fileoutput) then
           deletefile(pchar(i_fileoutput));
    
       if fileexists(i_fileoutput) then
           logganow('Errore 333 highlander i_fileoutput '+i_fileoutput);
       try
           sl.SaveToFile(i_fileoutput);
       except
           on e:exception do
           begin
               logganow('Errore 239 '+e.Message);
           end;
       end;
       sl.Free;
       fattura.free;
       Result:=FileExists(i_fileoutput);
    end;
    
    var
       filexmlin:string;
       filedainiettare:string;
       filexmlout:string;
       s:string;
       inizio:TDateTime;
    
    begin
       if ParamCount<>3 then
       begin
           Writeln('TINIETTO 0.1 - inietto file dentro FEL-XML');
           Writeln('Devono esistere esattamente 3 parametri');
           Writeln('filexml filedainiettare filexmliniettato');
           writeln('esempio');
           Writeln('"f:\IT123456780_0001.xml" "z:\fatturainpdf.pdf" "z:\fatturainiettata.xml"');
           exit;
       end;
       filexmlin:=ParamStr(1);
       filedainiettare:=ParamStr(2);
       filexmlout:=ParamStr(3);
    
       if not FileExists(filexmlin) then
       begin
           writeln('Errore 260 il file XML in non esiste '+filexmlin);
           exit;
       end;
       if not isXML(filexmlin) then
       begin
           writeln('Errore 288 il file XML non ha estensione xml '+filexmlin);
           Exit;
       end;
    
       if not FileExists(filedainiettare) then
       begin
           writeln('Errore 261 il file da iniettare non esiste '+filedainiettare);
           exit;
       end;
    
    /// in questo esempio non sovrascrivo output.
    /// ognuno si regoli come gli pare
       if FileExists(filexmlout) then
       begin
           writeln('Errore 263 il file FEL-XML destinazione ESISTE '+filexmlout);
           exit;
       end;
       if not isXML(filexmlout) then
       begin
           writeln('Errore 307 il file XML out ha estensione xml '+filexmlout);
           Exit;
       end;
       writeln('TINIETTO: inietto in FEL XML un file qualsiasi');
       Writeln('Lavoro con parametri');
       Writeln('File FEL-XML in   '+filexmlin);
       Writeln('File da iniettare '+filedainiettare);
       Writeln('File FEL-XML out  '+filexmlout);
    
    
       inizio:=now;
       if g_fel_inietta_file(filexmlin,filedainiettare,filexmlout) then
           Writeln('Iniezione effettuata su '+filexmlout+' ('+inttostr(prendidimensionefile(filexmlout))+' bytes) in '+floattostr(now-inizio))
       else
           writeln('+KO qualcosa andato storto');
    
    
    end.
  • Re: Fatturazione elettronica B2B: programmi

    +m2+ ha scritto:


    Su richiesta ecco un programmello
    https://ufile.io/7i4j
    
    TINIETTO 0.1 - inietto file dentro FEL-XML
    Devono esistere esattamente 3 parametri
    filexml filedainiettare filexmliniettato
    esempio
    "f:\IT123456780_0001.xml" "z:\fatturainpdf.pdf" "z:\fatturainiettata.xml"
    col sorgentello

    end.[/code]

    E' arrivato babbo natale
    Bellissimo regalo
    Grazie
  • Re: Fatturazione elettronica B2B: programmi

    Ciao, +m2+,
    col "sorgentello" (si fa per dire) mi hai migliorato la creazione del file xml: io lo creavo con un unico listato di codice comprendente tutte le voci dei tag, ma forse chiamare tante procedure intestate ai singoli tag per aggiungere un tag al file mi sembra meglio. Ok!
    - - -
    Che, per caso avresti rivisto in Xml2pdf quel problema di lettura del xml ricevuto da fornitori?
    - - -
    Con l'occasione, a quelli che (come me) debbono lavorare ANCHE nei periodi di festa comandata, e che non hanno ancora finito (GULP!), ma anche a quelli che (ho letto) hanno finito perché hanno iniziato da Maggio,
    auguro BUON NATALE e "buon programma"... (^-^)
    Antonio
  • Re: Fatturazione elettronica B2B: programmi

    Ovviamente sì ho corretto
    ora sto però facendo le tab, e son tanti campi, un po' ci vuole.
    pensavo anche di metterci un db vero, sotto, ma non so se avrebbe un utilizzo.

    Per XML come sempre detto sono stringhe : dopo essere abituato a manipolarle in assembler 6502 con delphi mi addormento quasi quando programmo.
    il parser è ancora più fico col distruttore di tag
Devi accedere o registrarti per scrivere nel forum
814 risposte