Premetto che sto cercando di utilizzare la libreria eInvoice4D del fantastico gruppo Delphi Force per leggere le fatture elttroniche dal loro formato XML.
Non mi legge le mie fatture ed ho trovato un "inghippo?" nella libreria (o nel suo uso) per legger l'XML (di cui non sono però molto ferrato)...
Espongo il problema:
La mia fattura non viene letta dalla libreria perchè ha un prefisso (ed un Namespace) sull'item "FatturaElettronica" ("ns0:" che indirizza al namespace "http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2").
Nella libreria trovo un esempio di fattura elettronica anch'essa con un prefisso ("p:") e vedo che viene letta solo perchè viene pulito tale prefisso direttamente dall'XML prima di leggerlo con le seguenti linee di codice:
LEpuratedStringXML := StringReplace(AStringXML, '<p:', '<', [rfReplaceAll, rfIgnoreCase]);
LEpuratedStringXML := StringReplace(LEpuratedStringXML, '</p:', '</', [rfReplaceAll, rfIgnoreCase]);
Se aggiungo anche linee di codice simili per il mio prefisso, poi leggo anche la mia fattura elettronica, ma vorrei farlo con comandi XML invece che con uno StringReplace sull'XML e qui mi sono incartato....
Se prima faccio:
LNodeElement := LDocument.ChildNodes.FindNode('FatturaElettronica');
trovo il nodo indipendentemente dal Namespace e riesco a leggere sia il prefisso che il NameSpaceURI:
LNodeElement.Prefix (che mi viene "ns0")
LNodeElement.NamespaceURI (che mi viene 'http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2')
Ma poi se faccio il comando GetDocBinding NON riesco in nessun modo ad abbinare il nodo "FatturaElettronica" con tale prefisso e tale NameSpaceURI!
Credo di aver provato un po' tutte le combinazioni tipo:
Result := LoadXMLData(LNodeElement.XML).GetDocBinding(LNodeElement.Prefix+':FatturaElettronica', TeiInvoiceEx, LNodeElement.NamespaceURI) as IeiInvoiceEx;
senza che riesca a fargli trovare il nodo con il prefisso.
Altra strada, fare il GetDocBinding sul nodo trovato (LNodeElement), ma non riesco a fare nemmeno questo e non capisco perchè (o forse non so farlo io o forse non è memmeno possibile, boh)...
Aiuto!
Nel frattempo ho "aggirato" il problema con la seguente modifica in: DForce.ei.Invoice.Factory:
Era:
class function TeiInvoiceFactory.InternalNewInvoiceFromString(const AStringXML: String): IeiInvoiceEx;
var
LEpuratedStringXML: String;
begin
LEpuratedStringXML := StringReplace(AStringXML, '<p:', '<', [rfReplaceAll, rfIgnoreCase]);
LEpuratedStringXML := StringReplace(LEpuratedStringXML, '</p:', '</', [rfReplaceAll, rfIgnoreCase]);
Result := LoadXMLData(LEpuratedStringXML).GetDocBinding('FatturaElettronica', TeiInvoiceEx, TargetNamespace) as IeiInvoiceEx;
end;
Ho fatto:
class function TeiInvoiceFactory.InternalNewInvoiceFromString(const AStringXML: String): IeiInvoiceEx;
var
LEpuratedStringXML: String;
LDocument: IXMLDocument;
LNodeElement, LNode: IXMLNode;
begin
LDocument := TXMLDocument.Create(nil);
LDocument.LoadFromXML(AStringXML);
{ Find a specific node. }
LNodeElement := LDocument.ChildNodes.FindNode('FatturaElettronica');
if LNodeElement.Prefix<>'' then
Begin
LEpuratedStringXML := StringReplace(AStringXML, '<'+LNodeElement.Prefix+':', '<', [rfReplaceAll, rfIgnoreCase]);
LEpuratedStringXML := StringReplace(LEpuratedStringXML, '</'+LNodeElement.Prefix+':', '</', [rfReplaceAll, rfIgnoreCase]);
End
Else
LEpuratedStringXML:=AStringXML;
Result := LoadXMLData(LEpuratedStringXML).GetDocBinding('FatturaElettronica', TeiInvoiceEx, TargetNamespace) as IeiInvoiceEx;
end;
sto letteralmente impazzendo con una cavolata, ma da cui non riesco a uscire.
In pratica ho un'immagine PNG, ottenuta con GIMP fondendo due immagini diverse (incollate come livelli e fuse in un'unica immagine).
La dimensione è 256x256.
La esporto in ICO, della stessa dimensione.
La imposto come application icon della mia applicazione (VCL), e faccio la build.
Se da gestione risorse guardo l'eseguibile, e cambio modalità di visualizzazione (Dettagli - Elenco - Icone medie, Icone grandi, Icone molto grandi)... mi cambia immagine un po' come pare a lui, quindi prendendo versioni precedenti dell'immagine oparti dell'immagine (uno dei due livelli originali) in base alle dimensioni scelte.
Come si imposta un'icona in modo che mi si adatti a tutte le visualizzazioni di Windows ?
Avete mai avuto il problema di rispettare la correttezza e le proporzioni delle vostre GUI quando l'utente ha impostato una dimensione dei caratteri > 100% in Windows? Questo avviene quando si usano risoluzioni elevate su monitor che non sono sufficientemente grandi, oppure se l'utente ci vede male! Capita molto spesso, ultimamente, con i portatili: tutti gli schermi sono almeno in FHD, salvo poi avere dimensione di 15" e quindi la dimensione dei caratteri è impostata almeno al 120% se non al 150%, altrimenti i caratteri sarebbero troppi piccoli. Ma torniamo al problema.
La proprietà Scaled dell form è ovviamente già impostata a True. Così facendo va tutto meravigliosamente bene quando è Delphi a sistemare le cose (uso la CE di Rio 10.3, prima con D2010 non avveniva un corretto ridimensionamento dei caratteri e questi venivano renderizzati sfocati). Quindi al momento della creazione dei controlli (form compreseE) ci pensa Delphi. Il problema è quando vogliamo, sempre a run-time, modificare la posizione dei controlli oppure la dimensione degli stessi, anche le form, ad es. aggiungendo 100 px in altezza. A quel punto se sommo 100 (Self.Height := Self.Height + 100) funziona quando i caratteri sono impostati al 100%, ma se sono a dimensioni maggiori ecco che la form si ingrandisce sì, ma non abbastanza, come se a 100 dovessi aggiungere un fattore moltiplicativo, che però non so come calcolare per far sì che sia giusto in ogni situazione, a qualunque impostazione dei caratteri impostata.
Ci dev'essere una proporzione da applicare per ottenere il numero di pixel corretto da sommare… Se con caratteri 100% voglio aggiungere 100 px, con caratteri 120% devo forse aggiungere 120px? A intuito, matematicamente, sembrerebbe di sì… Quindi la proporzione sembrerebbe essere:
100 (% dimensione caratteri) : 100 (pixel in questa modalità) = 120(% dimensione caratteri) : x(pixel da utilizzare a run-time)
Ma come faccio a conoscere 120 ? Cioè la % impostata dall'utente in Windows? Questo è il dilemma.
Un cliente del mio gestionale mi ha fatto notare che sarebbe il momento di integrare la fatturazione elettronica (e-fatt) automatica e completamente trasparente per l'utente finale. In effetti non ha tutti i torti, ma io non so nulla a riguardo, perciò sono qua per farvi delle domande un po' da principiante, mi scuso in anticipo per l'ingenuità delle stesse.
Dunque, passo subito senza ulteriori preamboli al nocciolo dei miei dubbi:
1- è possibile che un gestionale per PC Windows (lato client) gestisca le e-fatt?
2- è corretto e soprattutto legale che un gestionale effettui la e-fatt?
3- quali marcatori deve avere il file XML generato?
4- dove si invia successivamente il file così generato?
5- è sufficiente fermarsi qui, o è necessario gestire l'archiviazione o altro, ai termini di legge?
Ovviamente poi dalle risposte nasceranno altri dubbi, ma per ora mi fermo qua!
Grazie mille a tutti fin da ora per l'attenzione.
volevo capire come vi siete gestiti con gli esiti delle fatture.
Avrei un po' di domande:
- Quanti tipi di esiti ci sono? Immagino fattura accettata o meno.
- Quando correggo la fattura per rimandarla è necessario solamente modificare il nome del file?
Se per caso avete dei file di esempio me li potete postare?Grazie.
Ho un dubbio poi per quanto riguarda la fattura differita. Ho visto che per le fatture accompagnatorie si posso emettere nel formato tradizionale ed emettere l'e-fattura entro la giornata. Con la fattura differita come funziona?
Mi confermate che il codice destinatario serve a chi emette la fattura solo per canale di tipo SDI? Chi userà l'SDI dove si collegherà per mandare le fatture?
Grazie mille.