facturapi 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Guardfile +14 -0
- data/README.md +113 -16
- data/config/locales/es.yml +21 -0
- data/facturapi.gemspec +4 -3
- data/lib/facturapi.rb +4 -2
- data/lib/facturapi/client.rb +30 -18
- data/lib/facturapi/helpers.rb +2 -0
- data/lib/facturapi/helpers/descuento_global.rb +10 -0
- data/lib/facturapi/helpers/detalle.rb +132 -13
- data/lib/facturapi/helpers/dsc_rcg_global.rb +47 -6
- data/lib/facturapi/helpers/dte.rb +52 -7
- data/lib/facturapi/helpers/emisor.rb +38 -7
- data/lib/facturapi/helpers/encabezado.rb +1 -1
- data/lib/facturapi/helpers/id_doc.rb +147 -14
- data/lib/facturapi/helpers/recargo_global.rb +10 -0
- data/lib/facturapi/helpers/receptor.rb +39 -4
- data/lib/facturapi/helpers/referencia.rb +62 -1
- data/lib/facturapi/helpers/totales.rb +119 -14
- data/lib/facturapi/services.rb +2 -0
- data/lib/facturapi/services/obtener_link.rb +50 -0
- data/lib/facturapi/services/procesar.rb +30 -0
- data/lib/facturapi/services/responses.rb +1 -0
- data/lib/facturapi/services/responses/obtener_link.rb +17 -0
- data/lib/facturapi/services/responses/procesar.rb +33 -0
- data/lib/facturapi/utils.rb +1 -0
- data/lib/facturapi/utils/dte_types.rb +38 -0
- data/lib/facturapi/version.rb +1 -1
- metadata +47 -12
- data/foo.xml +0 -119
- data/lala.html +0 -1
- data/lib/facturapi/service.rb +0 -1
- data/lib/facturapi/service/procesar.rb +0 -24
- data/todo.rb +0 -246
@@ -1,16 +1,49 @@
|
|
1
1
|
module Facturapi
|
2
2
|
module Helpers
|
3
|
+
# Corresponde a la o las lineas de descuento / recargo global de una
|
4
|
+
# Boleta Electronica, etiqueta e informacion opcional, con un maximo
|
5
|
+
# de 20
|
3
6
|
class DscRcgGlobal
|
4
|
-
|
5
|
-
|
7
|
+
# Indica el numero secuencial de linea de descuento /
|
8
|
+
# recargo de la Boleta Electronica, el cual puede ser desde la linea 1
|
9
|
+
# hasta la linea 20
|
10
|
+
attr_accessor :nro_lin_dr
|
11
|
+
|
12
|
+
# Indica el tipo de movimiento de la linea de descuento /
|
13
|
+
# recargo, informando que tipo de aplicacion tendran los posteriores
|
14
|
+
# valores en la linea, los tipos son:
|
15
|
+
# - D: Corresponde a una DESCUENTO
|
16
|
+
# - R: Corresponde a una RECARGO
|
17
|
+
attr_accessor :tpo_mov
|
18
|
+
|
19
|
+
# Corresponde a una breve descripcion del descuento / recargo
|
20
|
+
attr_accessor :glosa_dr
|
21
|
+
|
22
|
+
# Indica el tipo de valor de la linea de descuento / recargo. El valor
|
23
|
+
# sera indicado en el campo ValorDR, los tipos son:
|
24
|
+
# - % : Corresponde a un porcentaje
|
25
|
+
# - $ : Corresponde a un valor en moneda nacional
|
26
|
+
attr_accessor :tpo_valor
|
27
|
+
|
28
|
+
# Es el valor de descuento / recargo. Su valor debe ser hasta 16 digitos y
|
29
|
+
# 2 decimales. Al ser un campo de monto, se debe indicar sin decimales y
|
30
|
+
# sin separadores de miles.
|
31
|
+
attr_accessor :valor_dr
|
32
|
+
|
33
|
+
# Indicador de exencion de un descuento / recargo, para la Boleta
|
34
|
+
# Electronica. Los indicadores son:
|
35
|
+
# - 0: Descuento / Recargo se aplica a items afectos a IVA
|
36
|
+
# - 1: Descuento / Recargo se aplica a items exentos
|
37
|
+
# - 2: Descuento / Recargo se aplica a items facturables
|
38
|
+
attr_accessor :ind_exe_dr
|
6
39
|
|
7
40
|
def initialize(params = {})
|
8
41
|
@nro_lin_dr = params[:nro_lin_dr]
|
9
|
-
@tpo_mov = params[:tpo_mov]
|
42
|
+
@tpo_mov = params[:tpo_mov].to_s.upcase
|
10
43
|
@glosa_dr = params[:glosa_dr]
|
11
|
-
@tpo_valor = params[:tpo_valor]
|
12
|
-
@valor_dr = params[:valor_dr]
|
13
|
-
@ind_exe_dr = params[:ind_exe_dr]
|
44
|
+
@tpo_valor = /^[\$\%]$/ =~ params[:tpo_valor].to_s ? params[:tpo_valor] : '$'
|
45
|
+
@valor_dr = params[:valor_dr].to_i if params[:valor_dr]
|
46
|
+
@ind_exe_dr = /^[0-2]$/ =~ params[:ind_exe_dr].to_s ? params[:ind_exe_dr] : 0
|
14
47
|
end
|
15
48
|
|
16
49
|
def as_node
|
@@ -23,6 +56,14 @@ module Facturapi
|
|
23
56
|
dsc_rcg_global << create_node('IndExeDR') { |n| n << ind_exe_dr }
|
24
57
|
end
|
25
58
|
end
|
59
|
+
|
60
|
+
def descuento?
|
61
|
+
tpo_mov == 'D'
|
62
|
+
end
|
63
|
+
|
64
|
+
def recargo?
|
65
|
+
tpo_mov == 'R'
|
66
|
+
end
|
26
67
|
end
|
27
68
|
end
|
28
69
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Facturapi
|
2
2
|
module Helpers
|
3
3
|
class Dte
|
4
|
-
attr_accessor :encabezado, :detalle, :dsc_rcg_global, :referencia
|
4
|
+
attr_accessor :encabezado, :detalle, :dsc_rcg_global, :referencia, :id
|
5
5
|
|
6
6
|
def initialize(params = {})
|
7
7
|
@encabezado = params[:encabezado]
|
@@ -13,7 +13,7 @@ module Facturapi
|
|
13
13
|
def detalle=(detalle)
|
14
14
|
@detalle = @detalle.nil? ? [] : @detalle
|
15
15
|
@detalle =
|
16
|
-
if
|
16
|
+
if detalle.is_a?(Array)
|
17
17
|
@detalle.push(*detalle)
|
18
18
|
else
|
19
19
|
@detalle.push(detalle)
|
@@ -23,7 +23,7 @@ module Facturapi
|
|
23
23
|
def dsc_rcg_global=(dsc_rcg_global)
|
24
24
|
@dsc_rcg_global = @dsc_rcg_global.nil? ? [] : @dsc_rcg_global
|
25
25
|
@dsc_rcg_global =
|
26
|
-
if
|
26
|
+
if dsc_rcg_global.is_a?(Array)
|
27
27
|
@dsc_rcg_global.push(*dsc_rcg_global)
|
28
28
|
else
|
29
29
|
@dsc_rcg_global.push(dsc_rcg_global)
|
@@ -33,25 +33,70 @@ module Facturapi
|
|
33
33
|
def referencia=(referencia)
|
34
34
|
@referencia = @referencia.nil? ? [] : @referencia
|
35
35
|
@referencia =
|
36
|
-
if
|
36
|
+
if referencia.is_a?(Array)
|
37
37
|
@referencia.push(*referencia)
|
38
38
|
else
|
39
39
|
@referencia.push(referencia)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
def totales
|
44
|
+
encabezado.totales
|
45
|
+
end
|
46
|
+
|
43
47
|
def as_node
|
44
48
|
doc = XML::Document.new
|
49
|
+
param = { 'ID' => id } unless id.blank?
|
45
50
|
doc.root = create_node('DTE', version: '1.0') do |dte|
|
46
|
-
dte << create_node('Documento',
|
51
|
+
dte << create_node('Documento', param) do |documento|
|
47
52
|
documento << encabezado.as_node
|
48
53
|
detalle.each { |d| documento << d.as_node }
|
49
|
-
dsc_rcg_global.each { |d| documento << d.as_node }
|
50
|
-
referencia.each { |r| documento << r.as_node }
|
54
|
+
dsc_rcg_global.each { |d| documento << d.as_node } if dsc_rcg_global && dsc_rcg_global.any?
|
55
|
+
referencia.each { |r| documento << r.as_node } if referencia && referencia.any?
|
51
56
|
end
|
52
57
|
end
|
53
58
|
doc
|
54
59
|
end
|
60
|
+
|
61
|
+
def autocomplete!
|
62
|
+
mnt_neto = 0
|
63
|
+
mnt_exe = 0
|
64
|
+
monto_nf = 0
|
65
|
+
detalle.each_with_index do |det, idx|
|
66
|
+
det.nro_lin_det = idx + 1 if det.nro_lin_det.blank?
|
67
|
+
det.autocomplete!
|
68
|
+
mnt_neto += det.monto_item if det.afecto_iva?
|
69
|
+
mnt_exe += det.monto_item if det.exento_iva?
|
70
|
+
monto_nf += det.monto_item if det.no_fact? || det.no_fact_neg?
|
71
|
+
end
|
72
|
+
if dsc_rcg_global && dsc_rcg_global.any?
|
73
|
+
dsc_rcg_global.each_with_index do |drg, idx|
|
74
|
+
drg.nro_lin_dr = idx + 1 if drg.nro_lin_dr.blank?
|
75
|
+
if drg.descuento?
|
76
|
+
mnt_neto -= drg.valor_dr
|
77
|
+
else
|
78
|
+
mnt_neto += drg.valor_dr
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
if referencia && referencia.any?
|
83
|
+
referencia.each_with_index do |ref, idx|
|
84
|
+
ref.nro_lin_ref = idx + 1 if ref.nro_lin_ref.blank?
|
85
|
+
end
|
86
|
+
end
|
87
|
+
totales.autocomplete!(
|
88
|
+
is_monto_neto: encabezado.id_doc.monto_neto?,
|
89
|
+
is_boleta: encabezado.id_doc.boleta?,
|
90
|
+
mnt_neto: mnt_neto,
|
91
|
+
mnt_exe: mnt_exe,
|
92
|
+
monto_nf: monto_nf
|
93
|
+
)
|
94
|
+
self
|
95
|
+
end
|
96
|
+
|
97
|
+
def to_s
|
98
|
+
as_node.to_s
|
99
|
+
end
|
55
100
|
end
|
56
101
|
end
|
57
102
|
end
|
@@ -1,8 +1,35 @@
|
|
1
1
|
module Facturapi
|
2
2
|
module Helpers
|
3
|
+
# Corresponde a los datos del Emisor de una Boleta Electronica
|
3
4
|
class Emisor
|
4
|
-
|
5
|
-
|
5
|
+
# Corresponde al RUT del Emisor, con valor desde 100.000
|
6
|
+
# hasta 99 millones, guion y digito verificador (sin separador de miles).
|
7
|
+
attr_accessor :rut_emisor
|
8
|
+
|
9
|
+
# Corresponde a la razon social o nombre del contribuyente Emisor.
|
10
|
+
attr_accessor :rzn_soc_emisor
|
11
|
+
|
12
|
+
# Corresponde al giro del negocio del Emisor antes identificado.
|
13
|
+
attr_accessor :giro_emisor
|
14
|
+
|
15
|
+
# Corresponde a la direccion legal del Emisor (registrada en el SII), no
|
16
|
+
# se especifica la comuna ni la ciudad.
|
17
|
+
attr_accessor :dir_origen
|
18
|
+
|
19
|
+
# Corresponde a la comuna legal del Emisor (registrada en el SII).
|
20
|
+
attr_accessor :cmna_origen
|
21
|
+
|
22
|
+
# Corresponde a la ciudad legal del Emisor (registrada en el SII)
|
23
|
+
attr_accessor :ciudad_origen
|
24
|
+
|
25
|
+
# Indica nombre de la sucursal que emite el Documento. Corresponde a un
|
26
|
+
# dato administrado por el emisor que puede ser un texto o un numero, con
|
27
|
+
# un maximo de 20 caracteres.
|
28
|
+
attr_accessor :sucursal
|
29
|
+
|
30
|
+
# Corresponde a la Glosa con identificador del vendedor, con un maximo de
|
31
|
+
# 60 caracteres.
|
32
|
+
attr_accessor :cdg_vendedor
|
6
33
|
|
7
34
|
def initialize(params = {})
|
8
35
|
@rut_emisor = params[:rut_emisor]
|
@@ -11,16 +38,20 @@ module Facturapi
|
|
11
38
|
@dir_origen = params[:dir_origen]
|
12
39
|
@cmna_origen = params[:cmna_origen]
|
13
40
|
@ciudad_origen = params[:ciudad_origen]
|
41
|
+
@sucursal = params[:sucursal]
|
42
|
+
@cdg_vendedor = params[:cdg_vendedor]
|
14
43
|
end
|
15
44
|
|
16
45
|
def as_node
|
17
46
|
create_node('Emisor') do |emisor|
|
18
47
|
emisor << create_node('RUTEmisor') { |n| n << rut_emisor }
|
19
|
-
emisor << create_node('RznSocEmisor') { |n| n << rzn_soc_emisor }
|
20
|
-
emisor << create_node('GiroEmisor') { |n| n << giro_emisor }
|
21
|
-
emisor << create_node('DirOrigen') { |n| n << dir_origen }
|
22
|
-
emisor << create_node('CmnaOrigen') { |n| n << cmna_origen }
|
23
|
-
emisor << create_node('CiudadOrigen') { |n| n << ciudad_origen }
|
48
|
+
emisor << create_node('RznSocEmisor') { |n| n << rzn_soc_emisor } if rzn_soc_emisor
|
49
|
+
emisor << create_node('GiroEmisor') { |n| n << giro_emisor } if giro_emisor
|
50
|
+
emisor << create_node('DirOrigen') { |n| n << dir_origen } if dir_origen
|
51
|
+
emisor << create_node('CmnaOrigen') { |n| n << cmna_origen } if cmna_origen
|
52
|
+
emisor << create_node('CiudadOrigen') { |n| n << ciudad_origen } if ciudad_origen
|
53
|
+
emisor << create_node('Sucursal') { |n| n << sucursal } if sucursal
|
54
|
+
emisor << create_node('CdgVendedor') { |n| n << cdg_vendedor } if cdg_vendedor
|
24
55
|
end
|
25
56
|
end
|
26
57
|
end
|
@@ -1,18 +1,124 @@
|
|
1
1
|
module Facturapi
|
2
2
|
module Helpers
|
3
|
+
# Corresponde a la Identificacion del Documento en el encabezado de una
|
4
|
+
# Boleta Electronica
|
3
5
|
class IdDoc
|
4
|
-
|
5
|
-
|
6
|
+
# Corresponde al numero de Tipo de Documento codificado por el Servicio de
|
7
|
+
# Impuestos Internos (SII).
|
8
|
+
# - 30: FACTURA
|
9
|
+
# - 32: FACTURA EXENTA
|
10
|
+
# - 33: FACTURA ELECTRONICA
|
11
|
+
# - 34: FACTURA EXENTA ELECTRONICA
|
12
|
+
# - 35: BOLETA
|
13
|
+
# - 38: BOLETA EXENTA
|
14
|
+
# - 39: BOLETA ELECTRONICA
|
15
|
+
# - 40: LIQUIDACION FACTURA
|
16
|
+
# - 41: BOLETA EXENTA ELECTRONICA
|
17
|
+
# - 43: LIQUIDACION FACTURA ELECTRONICA
|
18
|
+
# - 45: FACTURA DE COMPRA
|
19
|
+
# - 46: FACTURA DE COMPRA ELECTRONICA
|
20
|
+
# - 50: GUIA DE DESPACHO
|
21
|
+
# - 52: GUIA DE DESPACHO ELECTRONICA
|
22
|
+
# - 55: NOTA DE DEBITO
|
23
|
+
# - 56: NOTA DE DEBITO ELECTRONICA
|
24
|
+
# - 60: NOTA DE CREDITO
|
25
|
+
# - 61: NOTA DE CREDITO ELECTRONICA
|
26
|
+
attr_accessor :tipo_dte
|
27
|
+
|
28
|
+
# Es el folio del documento de acuerdo con los correlativos
|
29
|
+
# autorizados por el SII y disponibles para el tipo de documento antes
|
30
|
+
# mencionado. En el caso que se requiera auto-asignacion de folio,
|
31
|
+
# entonces se debe indicar el valor 0 (cero) en este campo.
|
32
|
+
attr_accessor :folio
|
33
|
+
|
34
|
+
# Es la fecha de emision del documento en cuestion, el formato de la fecha
|
35
|
+
# es "AAAA-MM-DD' (anio, mes, dia).
|
36
|
+
attr_accessor :fch_emis
|
37
|
+
|
38
|
+
# Corresponde a la Fecha de vencimiento y es obligatoria en
|
39
|
+
# el caso de una facturacion de servicios periodicos domiciliarios, el
|
40
|
+
# formato de la fecha es "AAAA-MM-DD' (anio, mes, dia)
|
41
|
+
attr_accessor :fch_venc
|
42
|
+
|
43
|
+
# Corresponde al indicador que identifica el tipo de transaccion que se
|
44
|
+
# realiza con el documento de acuerdo a lo codificado por el SII.
|
45
|
+
# - 1: Servicios Periodicos.
|
46
|
+
# - 2: Servicios Periodicos Domiciliarios.
|
47
|
+
# - 3: Ventas y Servicios.
|
48
|
+
# - 4: Espectaculos emitida por cuenta de terceros.
|
49
|
+
attr_accessor :ind_servicio
|
50
|
+
|
51
|
+
# Este indicador se utiliza para expresar que el precio unitario y el
|
52
|
+
# valor de todas las lineas de detalles corresponden a Montos Netos, es
|
53
|
+
# decir, no incluyen el IVA. Solo se aplica para empresas que tienen
|
54
|
+
# autorizacion para emitir las boletas desglosando el IVA. No aplica en
|
55
|
+
# Boleta Exenta.
|
56
|
+
# - 0: Lineas de Detalle indicadas en Montos Brutos.
|
57
|
+
# - 2: Lineas de Detalle indicadas en Montos Netos.
|
58
|
+
attr_accessor :ind_mnt_neto
|
59
|
+
|
60
|
+
# Es el periodo desde de una facturacion de servicios
|
61
|
+
# periodicos y aplica solamente para estos casos, el formato de la fecha
|
62
|
+
# es "AAAA-MM-DD' (anio, mes, dia).
|
63
|
+
attr_accessor :periodo_desde
|
64
|
+
|
65
|
+
# Es el periodo hasta de una facturacion de servicios
|
66
|
+
# periodicos y aplica solamente para estos casos, el formato de la fecha
|
67
|
+
# es "AAAA-MM-DD' (anio, mes, dia)
|
68
|
+
attr_accessor :periodo_hasta
|
69
|
+
|
70
|
+
# Indica si las lineas de detalle, descuentos y recargos se expresan
|
71
|
+
# en montos brutos. (Solo para documentos sin impuestos adicionales).
|
72
|
+
# Solamente se acepta el valor 1 ( <MntBruto>1</MntBruto> ).
|
73
|
+
# Si no se indica, se asume los valores en montos Netos.
|
74
|
+
attr_accessor :mnt_bruto
|
75
|
+
|
76
|
+
# (Solo para Guias de despacho) Indica si el documento acompania bienes y
|
77
|
+
# el despacho es por cuenta del vendedor o del comprador.
|
78
|
+
# No se incluye si el documento no acompania bienes o se trata de una
|
79
|
+
# Factura o Nota correspondiente a la prestacion de servicios.
|
80
|
+
# Sus valores pueden ser:
|
81
|
+
#
|
82
|
+
# - 0: Sin Despacho.
|
83
|
+
# - 1: Despacho por cuenta del receptor del documento (cliente o vendedor
|
84
|
+
# en caso de Facturas de compra).
|
85
|
+
# - 2: Despacho por cuenta del emisor a instalaciones del cliente.
|
86
|
+
# - 3: Despacho por cuenta del emisor a otras instalaciones
|
87
|
+
# (Ejemplo: entrega en Obra).
|
88
|
+
attr_accessor :tipo_despacho
|
89
|
+
|
90
|
+
# (Solo para Guias de despacho) Indica si el traslado de mercaderia es por
|
91
|
+
# Venta (valor 1) o por otros motivos que no corresponden a venta
|
92
|
+
# (valores mayores a 1). Sus valores pueden ser:
|
93
|
+
#
|
94
|
+
# - 1: Operacion constituye venta.
|
95
|
+
# - 2: Ventas por efectuar.
|
96
|
+
# - 3: Consignaciones.
|
97
|
+
# - 4: Entrega gratuita.
|
98
|
+
# - 5: Traslados internos.
|
99
|
+
# - 6: Otros traslados no venta.
|
100
|
+
# - 7: Guia de devolucion.
|
101
|
+
attr_accessor :ind_traslado
|
6
102
|
|
7
103
|
def initialize(params = {})
|
8
|
-
@tipo_dte = params[:tipo_dte]
|
9
|
-
@folio = params[:folio]
|
10
|
-
@fch_emis = params[:fch_emis]
|
11
|
-
@
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
104
|
+
@tipo_dte = params[:tipo_dte].to_s if Facturapi::Utils::DteTypes::VALID_REGEXP =~ params[:tipo_dte].to_s
|
105
|
+
@folio = params[:folio] || 0
|
106
|
+
@fch_emis = format_date(params[:fch_emis])
|
107
|
+
@fch_venc = format_date(params[:fch_venc])
|
108
|
+
|
109
|
+
if boleta?
|
110
|
+
@ind_servicio = params[:ind_servicio].to_s if /^[1-4]$/ =~ params[:ind_servicio].to_s
|
111
|
+
@ind_mnt_neto = params[:ind_mnt_neto].to_s if /^[02]$/ =~ params[:ind_mnt_neto].to_s
|
112
|
+
@periodo_desde = format_date(params[:periodo_desde])
|
113
|
+
@periodo_hasta = format_date(params[:periodo_hasta])
|
114
|
+
end
|
115
|
+
|
116
|
+
if guia_de_despacho?
|
117
|
+
@tipo_despacho = params[:tipo_despacho].to_s if /^[0-3]$/ =~ params[:tipo_despacho].to_s
|
118
|
+
@ind_traslado = params[:ind_traslado].to_s if /^[1-7]$/ =~ params[:ind_traslado].to_s
|
119
|
+
end
|
120
|
+
|
121
|
+
@mnt_bruto = 1 if params[:mnt_bruto]
|
16
122
|
end
|
17
123
|
|
18
124
|
def as_node
|
@@ -20,13 +126,40 @@ module Facturapi
|
|
20
126
|
id_doc << create_node('TipoDTE') { |n| n << tipo_dte }
|
21
127
|
id_doc << create_node('Folio') { |n| n << folio }
|
22
128
|
id_doc << create_node('FchEmis') { |n| n << fch_emis }
|
23
|
-
id_doc << create_node('IndServicio') { |n| n << ind_servicio }
|
24
|
-
id_doc << create_node('IndMntNeto') { |n| n << ind_mnt_neto }
|
25
|
-
id_doc << create_node('PeriodoDesde') { |n| n << periodo_desde }
|
26
|
-
id_doc << create_node('PeriodoHasta') { |n| n << periodo_hasta }
|
27
129
|
id_doc << create_node('FchVenc') { |n| n << fch_venc }
|
130
|
+
if boleta?
|
131
|
+
id_doc << create_node('IndServicio') { |n| n << ind_servicio }
|
132
|
+
id_doc << create_node('IndMntNeto') { |n| n << ind_mnt_neto }
|
133
|
+
id_doc << create_node('PeriodoDesde') { |n| n << periodo_desde }
|
134
|
+
id_doc << create_node('PeriodoHasta') { |n| n << periodo_hasta }
|
135
|
+
end
|
136
|
+
if guia_de_despacho?
|
137
|
+
id_doc << create_node('TipoDespacho') { |n| n << tipo_despacho }
|
138
|
+
id_doc << create_node('IndTraslado') { |n| n << ind_traslado }
|
139
|
+
end
|
140
|
+
id_doc << create_node('MntBruto') { |n| n << mnt_bruto } if mnt_bruto
|
28
141
|
end
|
29
142
|
end
|
143
|
+
|
144
|
+
def format_date(date)
|
145
|
+
date.strftime('%Y-%m-%d') if date
|
146
|
+
end
|
147
|
+
|
148
|
+
def monto_bruto?
|
149
|
+
ind_mnt_neto == '0' || mnt_bruto == 1
|
150
|
+
end
|
151
|
+
|
152
|
+
def monto_neto?
|
153
|
+
ind_mnt_neto == '2' || mnt_bruto != 1
|
154
|
+
end
|
155
|
+
|
156
|
+
def boleta?
|
157
|
+
/^39|41$/ =~ tipo_dte
|
158
|
+
end
|
159
|
+
|
160
|
+
def guia_de_despacho?
|
161
|
+
/^50|52$/ =~ tipo_dte
|
162
|
+
end
|
30
163
|
end
|
31
164
|
end
|
32
165
|
end
|
@@ -1,11 +1,45 @@
|
|
1
1
|
module Facturapi
|
2
2
|
module Helpers
|
3
|
+
# Corresponde a los datos del Receptor de una Boleta Electronica.
|
3
4
|
class Receptor
|
4
|
-
|
5
|
-
|
5
|
+
RUT_AUXILIAR = '66666666-6'.freeze
|
6
|
+
|
7
|
+
# Corresponde al RUT del Cliente con valor desde 100.000 hasta 99
|
8
|
+
# millones, guion y digito verificador (sin separador de miles).
|
9
|
+
# En el caso que para una Boleta Electronica se desconozcan los datos del
|
10
|
+
# cliente, el SII ha proporcionado un RUT de Cliente Auxiliar para emitir
|
11
|
+
# en estas circunstancias.
|
12
|
+
attr_accessor :rut_recep
|
13
|
+
|
14
|
+
# Corresponde a la razon social o nombre del Cliente.
|
15
|
+
attr_accessor :rzn_soc_recep
|
16
|
+
|
17
|
+
# Corresponde a la direccion de correo electronico del Cliente a la que
|
18
|
+
# sera enviado el documento electronico tras su generacion. En el caso que
|
19
|
+
# no se desee enviar por correo electronico el documento, no debe venir
|
20
|
+
# informacion en este campo.
|
21
|
+
attr_accessor :contacto
|
22
|
+
|
23
|
+
# Corresponde a la direccion legal del Cliente (registrada en el SII), no
|
24
|
+
# se especifica la comuna ni la ciudad.
|
25
|
+
attr_accessor :dir_recep
|
26
|
+
|
27
|
+
# Corresponde a la comuna legal del Cliente (registrada en el SII)
|
28
|
+
attr_accessor :cmna_recep
|
29
|
+
|
30
|
+
# Corresponde a la ciudad legal del Cliente (registrada en el SII)
|
31
|
+
attr_accessor :ciudad_recep
|
32
|
+
|
33
|
+
# Este campo es utilizado para identificar de manera adicional al cliente,
|
34
|
+
# basado en una codificacion interna.
|
35
|
+
attr_accessor :cdg_int_recep
|
36
|
+
|
37
|
+
# Corresponde al giro del negocio del Cliente antes identificado, con un
|
38
|
+
# maximo de 40 caracteres
|
39
|
+
attr_accessor :giro_recep
|
6
40
|
|
7
41
|
def initialize(params = {})
|
8
|
-
@rut_recep = params[:rut_recep]
|
42
|
+
@rut_recep = params[:rut_recep] || RUT_AUXILIAR
|
9
43
|
@cdg_int_recep = params[:cdg_int_recep]
|
10
44
|
@rzn_soc_recep = params[:rzn_soc_recep]
|
11
45
|
@contacto = params[:contacto]
|
@@ -17,12 +51,13 @@ module Facturapi
|
|
17
51
|
def as_node
|
18
52
|
create_node('Receptor') do |receptor|
|
19
53
|
receptor << create_node('RUTRecep') { |n| n << rut_recep }
|
20
|
-
receptor << create_node('CdgIntRecep') { |n| n << cdg_int_recep }
|
21
54
|
receptor << create_node('RznSocRecep') { |n| n << rzn_soc_recep }
|
22
55
|
receptor << create_node('Contacto') { |n| n << contacto }
|
23
56
|
receptor << create_node('DirRecep') { |n| n << dir_recep }
|
24
57
|
receptor << create_node('CmnaRecep') { |n| n << cmna_recep }
|
25
58
|
receptor << create_node('CiudadRecep') { |n| n << ciudad_recep }
|
59
|
+
receptor << create_node('CdgIntRecep') { |n| n << cdg_int_recep } if cdg_int_recep
|
60
|
+
receptor << create_node('GiroRecep') { |n| n << giro_recep } if giro_recep
|
26
61
|
end
|
27
62
|
end
|
28
63
|
end
|