class Facturama::Samples::SampleApiWeb

Constants

Items
Taxes
Total

Public Class Methods

new() click to toggle source
# File lib/samples/sample_api_web.rb, line 14
def initialize

end

Public Instance Methods

add_items_to_cfdi(facturama, currency, cfdi) click to toggle source
# File lib/samples/sample_api_web.rb, line 371
def add_items_to_cfdi(facturama, currency, cfdi)

    lst_products = facturama.products.list
    lst_products_size = lst_products.length

    n_items = (rand( lst_products.length ) % 10) + 1

    decimals = currency['Decimals'].to_i

    # Lista de conceptos para el CFDI
    lst_items = Array.new


    n_begin = lst_products_size - 1 - n_items

    for index in n_begin..lst_products_size

        product = lst_products[index]        # Un producto cualquiera

        if( product.nil? )
            break

        end

        quantity = rand(5) + 1          # una cantidad aleatoria de elementos de este producto

        discount = product['Price'] % ( product['Price']) == 0 ? 1 : rand( (product['Price'].to_i ) )
        subtotal = ( product['Price'] * quantity).round(decimals)    # Redondeo de acuerdo a la moneda



        item = Facturama::Models::Item.new({
                                               ProductCode: product['CodeProdServ'],
                                               UnitCode: product['UnitCode'],
                                               Unit: product['Unit'],
                                               Description: product['Description'],
                                               IdentificationNumber: product['IdentificationNumber'],
                                               Quantity: quantity,
                                               Discount: discount.round(decimals),
                                               UnitPrice: product['Price'].round(decimals),
                                               Subtotal: subtotal,
                                               Taxes: nil

                                           })


        base_amount = (subtotal - discount).round(decimals)
        taxes = product['Taxes'].map { |t|
            Facturama::Models::Tax.new(
                Name: t['Name'],
                IsQuota: t['IsQuota'],
                IsRetention: t['IsRetention'],
                Rate: t['Rate'].to_f.round(decimals),
                Base: base_amount,
                Total: (base_amount * t['Rate'].to_f).round(decimals)
            )
        }

        retentions_amount = 0
        transfers_amount = 0
        if taxes.length > 0
            item.Taxes = taxes
            # Calculo del monto total del concepto, tomando en cuenta los impuestos
            retentions_amount = item.Taxes.select { |tax| tax.IsRetention  }.sum(&:Total)
            transfers_amount = item.Taxes.select { |tax| ! tax.IsRetention  }.sum(&:Total)

        end

        item.Total = (item.Subtotal - item.Discount  + transfers_amount - retentions_amount).round(decimals)

        lst_items.push(item)

    end

    cfdi.Items = lst_items

end
create_api_instance() click to toggle source

CONFIGURACION DEL ENTORNO DE LA API

# File lib/samples/sample_api_web.rb, line 70
def create_api_instance
    facturama_user='pruebas'
    facturama_password='pruebas2011'
    is_development = true             # true = Modo de pruebas / sandbox,   false = Modo de Producción (Timbrado real)


    #Creacion de una instancia de FacturamaApi
    Facturama::FacturamaApiWeb.new(facturama_user,facturama_password,is_development)
end
run() click to toggle source
# File lib/samples/sample_api_web.rb, line 18
        def run




            puts "============================================================"
            puts "                    FACTURAMA WEB SDK   #{Facturama::VERSION}"
            puts "============================================================"


            # Creación de una instacia de la API Facturama, configurado con los datos del usuario de pruebas
            facturama = create_api_instance


            # Invocaciones a los ejemplos de uso de los servicios de Facturama API
            begin
                #sample_clients(facturama)          # Servicio de cliente

                sample_products(facturama)          # Servicio de productos

                #sample_cfdis(facturama)              # Servicio de CFDI





            rescue FacturamaException => ex
                puts "----------- EXCEPCIONES -----------"
                puts " * " + ex.message

                if ex.details
                    ex.details.each do |item|
                        puts "#{item[0]}: " + item[1].join(",")
                    end
                end





            rescue Exception => ex
                puts "----------- EXCEPCIONES -----------"
                puts " * " + ex.to_s
            end
end
sample_cfdis( facturama ) click to toggle source

EJEMPLO DEL SERVICIO DE CFDI En la API WEB el emisor es Siempre la entidad fiscal configurada en la cuenta

# File lib/samples/sample_api_web.rb, line 277
def sample_cfdis( facturama )
    puts "===== Ejemplo de CFDI - Inicio ====="

    # Se obtiene la moneda con el valor "MXN"
    lst_currencies = facturama::catalog.currencies
    currency = lst_currencies.select {|currency| currency["Value"] == "MXN" }.first


    # Creacion del cfdi en su forma general (sin items / productos) asociados
    cfdi_model = sample_cfdis_create(facturama, currency)

    # Agregar los items que lleva el cfdi ( para este ejemplo, se agregan con datos aleatorios)
    add_items_to_cfdi(facturama, currency, cfdi_model)

    # Creación del CFDI mediante la API, para su creación
    cfdi = facturama.cfdis.create(cfdi_model)
    cfdi_uuid = cfdi['Complement']['TaxStamp']['Uuid']
    puts "Se creó exitosamente el cfdi con el folio fiscal:  " + cfdi_uuid

    # Descarga de los arvhivos PDF y XML del cfdi recien creado
    file_path = "factura" + cfdi_uuid
    facturama.cfdis.save_pdf( file_path + ".pdf",  cfdi['Id'])
    facturama.cfdis.save_xml( file_path + ".xml",  cfdi['Id'])

    # Envio del cfdi por correo
    if facturama.cfdis.send_by_mail(cfdi['Id'], "chucho@facturama.mx", "Factura del servicio" )
        puts "Se envió por correo exitosamente el cfdi con el folio fiscal: " + cfdi_uuid
    end

    # Se elmina el cfdi recien creado
    facturama.cfdis.remove(cfdi['Id'])
    puts "Se elminó exitosamente el cfdi con el folio fiscal: " + cfdi_uuid


    # Consulta de cfdi por palabra clave o Rfc
    lst_by_rfc = facturama.cfdis.list_by_rfc("ESO1202108R2")
    lst_by_keyword = facturama.cfdis.list_by_keyword("Software")

    puts "Se obtiene la lista de facturas por RFC: #{lst_by_rfc.length}"
    puts "Se obtiene la lista de facturas por KEYWORD: #{lst_by_keyword.length}"



    puts "===== Ejemplo de CFDI - Fin ====="
end
sample_cfdis_create(facturama, currency) click to toggle source
# File lib/samples/sample_api_web.rb, line 325
def sample_cfdis_create(facturama, currency)

    # Nombre para el CFDI, para el ejemplo, tomado el primero de la lista del catálogo de nombres en el PDF
    name_for_pdf = facturama.catalog.name_ids.first; # Nombre en el pdf: "Factura"

    # Método de pago
    payment_method = facturama.catalog.payment_methods.select {|method| method["Name"] == "Pago en una sola exhibición" }.first


    # Forma de pago
    payment_form = facturama.catalog.payment_forms.select {|method| method["Name"] == "Efectivo" }.first


    # Cliente (se toma como cliente el "cliente generico", aquel que tiene el RFC genérico),
    #(como los clientes son exclusivos para cada usuario, se debe previamente dar de alta este cliente)
    client = facturama.clients.list.select {|client| client["Rfc"] == "XAXX010101000" }.first


    # Lugar de expedición
    branch_office = facturama.branch_office.list.first

    # Fecha de emision (ahora mismo)
    date = Time.now.strftime("%Y-%m-%d %H:%M:%S")

    cfdi = Facturama::Models::Cfdi.new(
        {
            NameId: name_for_pdf['Value'],
            CfdiType: Facturama::CfdiType::INGRESO,
            PaymentForm: payment_form['Value'],
            PaymentMethod: payment_method['Value'],
            Currency: currency['Value'],
            Date: date,
            ExpeditionPlace: branch_office['Address']['ZipCode'],
            Receiver: {
                CfdiUse: client['CfdiUse'],
                Name: client['Name'],
                Rfc: client['Rfc']
            },
            Items: []
        }
    )


end
sample_clients(facturama) click to toggle source

EJEMPLO DEL SERVICIO DE CLIENTES

  • Listado de clientes

  • Agregar cliente

  • Obtener cliente específico y editarlo

# File lib/samples/sample_api_web.rb, line 88
def sample_clients(facturama)

        sample_clients_list(facturama)    # Listar todos los clientes

        new_client = sample_clients_create(facturama)  # Agregar cliente
        client_id = new_client['Id']                    # Id del cliente recientemente agregado

        sample_clients_retrieve_and_update(facturama, client_id)

        sample_clients_remove(facturama, client_id)

    end
sample_clients_create(facturama) click to toggle source

Agrega un cliente

# File lib/samples/sample_api_web.rb, line 120
def sample_clients_create(facturama)
        puts "===== Agregar cliente - Inicio ====="

        facturama.clients.create(Facturama::Models::Client.new(
            {   Email: "info@pedroperez.net",
                Rfc: "RODJ899315654",
                CfdiUse: "P01",
                Name: "Pedro Perez Development Environment",

                Address: {Country: "MEXICO",
                          ExteriorNumber: "1230",
                          InteriorNumber: "B",
                          Locality: "San Luis",
                          Municipality: "San Luis Potosí",
                          Neighborhood: "Lomas 4ta",
                          State: "San Luis Potosí",
                          Street: "Cañada de Gomez",
                          ZipCode: "78220"
                }
            }))

        puts "===== Agregar cliente - Fin ====="
    end
sample_clients_list(facturama) click to toggle source

Obtiene el listado de clientes y muestra la cantidad de los mismos

# File lib/samples/sample_api_web.rb, line 104
def sample_clients_list(facturama)
        puts "===== Obtener los clientes - Inicio ====="

        lst_clients = facturama.clients.list      # Se obtiene una lista con todos los clientes
        lst_clients_count = lst_clients.count         # Cantidad inicial de clientes



        puts "Cantidad inicial de clientes: " + lst_clients_count.to_s

        puts "===== Obtener los clientes - Fin ====="
    end
sample_clients_remove(facturama, client_id) click to toggle source

Elimina un cliente

# File lib/samples/sample_api_web.rb, line 184
def sample_clients_remove(facturama, client_id)

        puts "===== Eliminar cliente - Inicio ====="

        specific_client = facturama.clients.remove(client_id)

        puts "Cliente eliminado: "
        puts JSON[specific_client]

        puts "===== Eliminar cliente - Fin ====="

    end
sample_clients_retrieve_and_update(facturama, client_id) click to toggle source

Obtiene un cliente específico, lo edita y lo guarda

# File lib/samples/sample_api_web.rb, line 147
def sample_clients_retrieve_and_update(facturama, client_id)

        puts "===== Obtener cliente y editarlo - Inicio ====="

        # Se obtiene el cliente con el Id especificado
        specific_client = facturama.clients.retrieve(client_id)


        # Se ha encontrado un cliente con ese Id
        if specific_client != nil then

            puts "Specific Client: "
            puts JSON[specific_client]

            # Edición del campo RFC
            specific_client['Rfc'] = "XAXX010101000"
            specific_client['Email'] = "wm@joseromero.net"
            facturama.clients.update(specific_client, client_id)


            # Se obtiene nuevamente el cliente para confirmar que ha cambiado
            specific_client = facturama.clients.retrieve(client_id)

            if specific_client['Rfc'] == "XAXX010101000" then
                puts "Cliente editado, ahora su RFC es XAXX010101000"
            else
                puts "Error al editar cliente"
            end
        end


        puts "===== Obtener cliente y editarlo - Fin ====="
    end
sample_products( facturama ) click to toggle source

EJEMPLO DEL SERVICIO DE PRODUCTOS

# File lib/samples/sample_api_web.rb, line 203
def sample_products( facturama )
    sample_products_list(facturama)         # Listar todos los productos

    sample_products_create(facturama)       # Agregar producto y eliminarlo
end
sample_products_create(facturama) click to toggle source

Agrega un cliente

# File lib/samples/sample_api_web.rb, line 226
def sample_products_create(facturama)
    puts "===== Agregar producto - Inicio ====="

    unit = facturama.catalog.units("servicio").first                        # La primera unidad que tenga que ver con servicio
    prod = facturama.catalog.products_or_services("desarrollo").first       # Se toma el primer producto o servicio



    product_model = Facturama::Models::Product.new(
        {
            Unit: "Servicio",
            UnitCode: unit['Value'],
            IdentificationNumber: "WEB003",
            Name: "Sitio Web CMS",
            Description: "Desarrollo e implementación de sitio web empleando un CMS",
            Price: 6500.0,
            CodeProdServ: prod['Value'],
            CuentaPredial: "123",

            Taxes: [
                {
                    Name: "IVA",
                    Rate: 0.16,
                    IsRetention: false
                }
            ]
        }
    )

    product = facturama.products.create(product_model)

    puts "Se creo exitosamente un producto con el id: " + product['Id']


    facturama.products.delete( product['Id'] )
    puts "Se eliminó exitosamente un producto con el id: " + product['Id']


    puts "===== Agregar producto - Fin ====="
end
sample_products_list(facturama) click to toggle source

Obtiene el listado de productos y muestra la cantidad de los mismos

# File lib/samples/sample_api_web.rb, line 212
def sample_products_list(facturama)
        puts "===== Obtener los productos - Inicio ====="

        lst_products = facturama.products.list       # Se obtiene una lista con todos los productos
        lst_products_count = lst_products.count       # Cantidad inicial de productos

        puts "Cantidad inicial de productos: " + lst_products_count.to_s

        puts "===== Obtener los productos - Fin ====="
    end