Class: FE::Document

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Validations
Defined in:
lib/facturacr/document.rb,
lib/facturacr/document/fax.rb,
lib/facturacr/document/tax.rb,
lib/facturacr/document/item.rb,
lib/facturacr/document/phone.rb,
lib/facturacr/document/issuer.rb,
lib/facturacr/document/summary.rb,
lib/facturacr/document/location.rb,
lib/facturacr/document/receiver.rb,
lib/facturacr/document/reference.rb,
lib/facturacr/document/other_text.rb,
lib/facturacr/document/phone_type.rb,
lib/facturacr/document/regulation.rb,
lib/facturacr/document/exoneration.rb,
lib/facturacr/document/other_content.rb,
lib/facturacr/document/identification_document.rb,
lib/facturacr/document/other_content/price_smart.rb

Direct Known Subclasses

CreditNote, DebitNote, Invoice, Ticket

Defined Under Namespace

Classes: Exoneration, Fax, IdentificationDocument, Issuer, Item, Location, OtherContent, OtherText, Phone, PhoneType, Receiver, Reference, Regulation, Summary, Tax

Constant Summary collapse

CONDITIONS =
{
  "01"=>"Contado", 
  "02"=>"Crédito", 
  "03"=>"Consignación", 
  "04"=>"Apartado", 
  "05"=>"Arrendamiento con Opción de Compra", 
  "06"=>"Arrendamiento en Función Financiera",
  "99"=>"Otros"
}.freeze
PAYMENT_TYPES =
{
  "01"=>"Efectivo",
  "02"=>"Tarjeta",
  "03"=>"Cheque",
  "04"=>"Transferencia",
  "05"=>"Recaudado por Terceros",
  "99"=>"Otros"
}.freeze
DOCUMENT_TYPES =
{
  "01"=> "Factura Electronica",
  "02"=> "Nota de débito",
  "03"=> "Nota de crédito",
  "04"=> "Tiquete Electrónico",
  "05"=> "Nota de despacho",
  "06"=> "Contrato",
  "07"=> "Procedimiento",
  "08"=> "Comprobante Emitido en Contingencia",
  "99"=> "Otros"
  
}.freeze
DOCUMENT_SITUATION =
{
  "1" => "Normal",
  "2" => "Contingencia",
  "3" => "Sin Internet"
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDocument

Returns a new instance of Document.



62
63
64
# File 'lib/facturacr/document.rb', line 62

def initialize
  raise "Subclasses must implement this method"
end

Instance Attribute Details

#conditionObject

Returns the value of attribute condition.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def condition
  @condition
end

#credit_termObject

Returns the value of attribute credit_term.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def credit_term
  @credit_term
end

#dateObject

Returns the value of attribute date.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def date
  @date
end

#document_situationObject

Returns the value of attribute document_situation.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def document_situation
  @document_situation
end

#document_typeObject

Returns the value of attribute document_type.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def document_type
  @document_type
end

#headquartersObject

Returns the value of attribute headquarters.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def headquarters
  @headquarters
end

#issuerObject

Returns the value of attribute issuer.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def issuer
  @issuer
end

#itemsObject

Returns the value of attribute items.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def items
  @items
end

#keyObject

Returns the value of attribute key.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def key
  @key
end

#namespacesObject

Returns the value of attribute namespaces.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def namespaces
  @namespaces
end

#numberObject

Returns the value of attribute number.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def number
  @number
end

#othersObject

Returns the value of attribute others.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def others
  @others
end

#payment_typeObject

Returns the value of attribute payment_type.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def payment_type
  @payment_type
end

#receiverObject

Returns the value of attribute receiver.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def receiver
  @receiver
end

#reference_informationObject

Returns the value of attribute reference_information.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def reference_information
  @reference_information
end

#referencesObject

Returns the value of attribute references.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def references
  @references
end

#regulationObject

Returns the value of attribute regulation.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def regulation
  @regulation
end

#security_codeObject

Returns the value of attribute security_code.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def security_code
  @security_code
end

#serialObject

Returns the value of attribute serial.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def serial
  @serial
end

#service_typeObject

Returns the value of attribute service_type.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def service_type
  @service_type
end

#summaryObject

Returns the value of attribute summary.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def summary
  @summary
end

#terminalObject

Returns the value of attribute terminal.



42
43
44
# File 'lib/facturacr/document.rb', line 42

def terminal
  @terminal
end

Instance Method Details

#api_payloadObject



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/facturacr/document.rb', line 147

def api_payload
  payload = {}
  payload[:clave] = key
  payload[:fecha] = @date.xmlschema
  payload[:emisor] = {
    tipoIdentificacion: @issuer.identification_document.document_type,
    numeroIdentificacion: @issuer.identification_document.id_number
  }
  if @receiver&.identification_document.present?
    payload[:receptor] = {
      tipoIdentificacion: @receiver.identification_document.document_type,
      numeroIdentificacion: @receiver.identification_document.id_number
    }
  end
  
  payload
end

#build_xmlObject



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/facturacr/document.rb', line 102

def build_xml
  raise "Documento inválido: #{errors.messages}" unless valid?
  builder  = Nokogiri::XML::Builder.new(encoding: 'UTF-8')
  
  builder.send(document_tag, @namespaces) do |xml|
    xml.Clave key
    xml.NumeroConsecutivo sequence
    xml.FechaEmision @date.xmlschema
    issuer.build_xml(xml)
    receiver.build_xml(xml) if receiver.present?
    xml.CondicionVenta @condition
    xml.PlazoCredito @credit_term if @credit_term.present? && @condition.eql?("02")
    xml.MedioPago @payment_type
    xml.DetalleServicio do |x|
      @items.each do |item|
        item.build_xml(x)
      end
    end
    
    summary.build_xml(xml)
    
    if references.present?
      references.each do |r|
        r.build_xml(xml)
      end
    end
    
    regulation.build_xml(xml)
    
    if others.any?
      xml.Otros do |x|
        @others.each do |o|
          o.build_xml(x)
        end
      end
    end
  end
  
  builder
end

#document_nameObject



66
67
68
# File 'lib/facturacr/document.rb', line 66

def document_name
  raise "Subclasses must implement this method"
end

#generateObject



143
144
145
# File 'lib/facturacr/document.rb', line 143

def generate
  build_xml.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::AS_XML)
end

#sequenceObject



97
98
99
100
# File 'lib/facturacr/document.rb', line 97

def sequence
  cons = ("%010d" % @number)
  "#{headquarters}#{terminal}#{@document_type}#{cons}"
end