forked from bambucode/tfacturaelectronica
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CadenaOriginalTimbre.pas
102 lines (83 loc) · 3.04 KB
/
CadenaOriginalTimbre.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
{******************************************************************************
PROYECTO FACTURACION ELECTRONICA
Copyright (C) 2010-2014 - Bambu Code SA de CV - Ing. Luis Carrasco
Clase usada para generar la Cadena Original del XML del Timbre Fiscal
recibido cuando se manda el comprobante a un PAC para su timbrado.
Este archivo pertenece al proyecto de codigo abierto de Bambu Code:
http://bambucode.com/codigoabierto
La licencia de este codigo fuente se encuentra en:
http://github.com/bambucode/tfacturaelectronica/blob/master/LICENCIA
******************************************************************************}
unit CadenaOriginalTimbre;
interface
// Incluimos el recurso que guarda el archivo XSLT para cuando se compile
// esta unidad en cualquier proyecto que la use, se incluya en el ejecutable
// Ref: http://delphi.about.com/od/objectpascalide/a/embed_resources.htm
{$R 'CadenaOriginalTimbre.res' 'CadenaOriginalTimbre.rc'}
uses FacturaTipos,
Classes,
XMLDoc,
XMLIntf,
XSLProd,
System.SysUtils;
type
{$REGION 'Documentation'}
/// <summary>
/// Clase que se encarga de generar la Cadena Original del Timbre para
/// mostrarla en la representación gráfica.
/// </summary>
{$ENDREGION}
TCadenaOriginalDeTimbre = class
private
fXMLTimbre: TStringCadenaOriginal;
fXSLT: string;
function LeerXSLTDeRecurso(const aNombreRecurso: string): string;
public
constructor Create(const aXMLTimbre: WideString; const aRutaXSLT: WideString);
overload;
function Generar: TStringCadenaOriginal;
end;
implementation
constructor TCadenaOriginalDeTimbre.Create(const aXMLTimbre: WideString; const
aRutaXSLT: WideString);
const
_NOMBRE_DEL_RECURSO_XSLT = 'CADENA_ORIGINAL_TFD_1_0';
begin
fXMLTimbre := aXMLTimbre;
// Obtenemos el archivo XSLT para transformar el XML del timbre a cadena original usando
// el XSLT proveido por el SAT de la direccion:
// ftp://ftp2.sat.gob.mx/asistencia_servicio_ftp/publicaciones/solcedi/cadenaoriginal_TFD_1_0.xslt
fXSLT := LeerXSLTDeRecurso(_NOMBRE_DEL_RECURSO_XSLT);
Assert(fXMLTimbre <> '', 'El XML del timbre no debe ser vacio');
Assert(fXSLT <> '', 'El XSLT de transformacion del timbre no debe ser vacio');
end;
function TCadenaOriginalDeTimbre.Generar: TStringCadenaOriginal;
var
XML : IXMLDocument;
XSL : IXMLDocument;
res: WideString;
begin
XML := LoadXMLData(fXMLTimbre);
XSL := LoadXMLData(fXSLT);
// Transformamos el XML del timbre usando el XSLT proveido por el SAT
XML.DocumentElement.TransformNode(XSL.DocumentElement, res);
// Fix temporal debido a que por alguna razon el XSLT no aplica correctamente las cadenas de inicio y terminacion
Result := '|' + res + '||';
end;
function TCadenaOriginalDeTimbre.LeerXSLTDeRecurso(const aNombreRecurso:
string): string;
var
RS: TResourceStream;
sl: TStringList;
begin
RS := TResourceStream.Create(HInstance, aNombreRecurso, 'TEXT');
try
SL := TStringList.Create;
SL.LoadFromStream(RS);
Result := sl.Text;
finally
RS.Free;
sl.Free;
end;
end;
end.