Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
801d2dd
New documents: credit and debit notes
nan-apps Nov 7, 2018
dbcccce
New bill attribute: custom text
nan-apps Nov 7, 2018
0d2ca8c
path fix
nan-apps Nov 7, 2018
d539408
ajustando algunos margenes
nan-apps Nov 8, 2018
6d52034
Ajuste en nombre de fantasia en encabezado
nan-apps Nov 9, 2018
28faad5
Fixed margins and zoom level WOMM
ceneon Nov 9, 2018
a4af56c
Merge branch 'develop' of github.com:wecodeio/afip_bill into develop
ceneon Nov 9, 2018
af71fc7
Main margin improvements
ceneon Nov 12, 2018
f7d81b2
Compress items' lines to fit more of them
ceneon Nov 12, 2018
9a0d972
Improve alignment for unit prices
ceneon Nov 12, 2018
c83bdec
Merge remote-tracking branch 'origin/develop' into develop
nan-apps Nov 12, 2018
2c8e20e
some width and alignment fixes
nan-apps Nov 13, 2018
02a8a84
different iva's in lines and totals
nan-apps Nov 13, 2018
27df05d
Alignment fix in B notes
nan-apps Nov 13, 2018
fbff3a8
Some small fixes
nan-apps Nov 14, 2018
e4845ab
configuration fix
nan-apps Dec 11, 2018
1301416
condition sale configurable and with default value "Otra" for backwar…
nan-apps Dec 14, 2018
8c3a697
missing space
nan-apps Dec 14, 2018
02d6ce7
fix in logo size
nan-apps Dec 14, 2018
dcde884
preparing for c invoicing
nan-apps Dec 24, 2018
5af2f91
more description space in A invoices lines
nan-apps Jan 9, 2019
67969c7
more descripcion space in all documents and some other adjustments
nan-apps Jan 17, 2019
2e76403
css fix in client address
nan-apps Jan 17, 2019
1ae14b3
adding code parameter to line item
nan-apps Jan 21, 2019
e6bf0dd
small codefix
nan-apps Jan 23, 2019
4c9ad82
gaining more space for companies bank information
nan-apps Jan 30, 2019
3923eeb
lines number formating
nan-apps Jan 30, 2019
2979175
adjusting totals in notes A with new template image
nan-apps Feb 14, 2019
84e38ff
ganing code space from amount and using smaller font when code too long
nan-apps Mar 3, 2019
8eab777
quantity position fix in b template
nan-apps Mar 3, 2019
1b6ab03
fixed width for line descriptions
nan-apps Apr 29, 2019
c0b12f8
related invoice data for notes
nan-apps Sep 29, 2020
86c8ff3
Reorganized footer to display AFIP QR code
Feb 28, 2021
866350e
removed trash css
Feb 28, 2021
c9ffb24
Addes header_obs to invoices (remit number etc)
ceneon Jul 5, 2021
728d715
Added invoice discounts mode
ceneon Sep 10, 2021
c5b9d13
Reorganized footer with ARCA shitty logo and QR on the left
ceneon Mar 17, 2025
15542fc
Added missing shitty logo
ceneon Mar 17, 2025
8e2750c
Added support for law 27.743 (stupidiest ever)
ceneon Mar 22, 2025
550ac8b
fixed alignment
ceneon Mar 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 42 additions & 24 deletions afip_bill.gemspec
Original file line number Diff line number Diff line change
@@ -1,31 +1,49 @@
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'afip_bill/version'
# -*- encoding: utf-8 -*-
# stub: afip_bill 0.1.0 ruby lib

Gem::Specification.new do |s|
s.name = "afip_bill"
s.version = AfipBill::VERSION
s.authors = ["Luciano Becerra", "Mauro Otonelli"]
s.email = ["luciano@ombulabs.com"]
s.name = "afip_bill".freeze
s.version = "0.1.0"

s.summary = "AFIP PDF bill"
s.description = "Allows you to generate an AFIP bill in PDF format"
s.homepage = "http://github.com/ombulabs/afip_bill"
s.license = "MIT"
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
s.require_paths = ["lib".freeze]
s.authors = ["Luciano Becerra".freeze, "Mauro Otonelli".freeze]
s.bindir = "exe".freeze
s.date = "2025-03-17"
s.description = "Allows you to generate an AFIP bill in PDF format".freeze
s.email = ["luciano@ombulabs.com".freeze]
s.files = [".gitignore".freeze, ".rspec".freeze, ".travis.yml".freeze, "Gemfile".freeze, "Gemfile.lock".freeze, "LICENSE.txt".freeze, "README.md".freeze, "Rakefile".freeze, "afip_bill.gemspec".freeze, "bill_sample.pdf".freeze, "lib/afip_bill.rb".freeze, "lib/afip_bill/assets/images/ARCA_logo.png".freeze, "lib/afip_bill/assets/images/factura_a.jpg".freeze, "lib/afip_bill/assets/images/factura_b.jpg".freeze, "lib/afip_bill/assets/images/factura_c.jpg".freeze, "lib/afip_bill/check_digit.rb".freeze, "lib/afip_bill/generator.rb".freeze, "lib/afip_bill/line_item.rb".freeze, "lib/afip_bill/user.rb".freeze, "lib/afip_bill/version.rb".freeze, "lib/afip_bill/views/bills/factura_a.html.erb".freeze, "lib/afip_bill/views/bills/factura_b.html.erb".freeze, "lib/afip_bill/views/notes/nota_a.html.erb".freeze, "lib/afip_bill/views/notes/nota_b.html.erb".freeze, "lib/afip_bill/views/shared/_factura_footer.html.erb".freeze, "lib/afip_bill/views/shared/_factura_header.html.erb".freeze, "spec/afip_bill/check_digit_spec.rb".freeze, "spec/afip_bill/generator_spec.rb".freeze, "spec/spec_helper.rb".freeze, "spec/support/type_a.json".freeze, "spec/support/type_b.json".freeze]
s.homepage = "http://github.com/ombulabs/afip_bill".freeze
s.licenses = ["MIT".freeze]
s.rubygems_version = "2.7.10".freeze
s.summary = "AFIP PDF bill".freeze

s.files = `git ls-files -z`.split("\x0").reject do |f|
f.match(%r{^(test|s|features)/})
end
s.bindir = "exe"
s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
s.require_paths = ["lib"]
s.installed_by_version = "2.7.10" if s.respond_to? :installed_by_version

s.add_development_dependency "bundler", "~> 1.13"
s.add_development_dependency "rake", "~> 10.0"
s.add_development_dependency "rspec", "~> 3.0"
s.add_development_dependency "pry-byebug", "~> 3.4.0"
if s.respond_to? :specification_version then
s.specification_version = 4

s.add_dependency "barby", "~> 0.6.2"
s.add_dependency "pdfkit", "~> 0.8.2"
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_development_dependency(%q<bundler>.freeze, ["~> 1.13"])
s.add_development_dependency(%q<rake>.freeze, ["~> 10.0"])
s.add_development_dependency(%q<rspec>.freeze, ["~> 3.0"])
s.add_development_dependency(%q<pry-byebug>.freeze, ["~> 3.4.0"])
s.add_runtime_dependency(%q<barby>.freeze, ["~> 0.6.2"])
s.add_runtime_dependency(%q<pdfkit>.freeze, ["~> 0.8.2"])
else
s.add_dependency(%q<bundler>.freeze, ["~> 1.13"])
s.add_dependency(%q<rake>.freeze, ["~> 10.0"])
s.add_dependency(%q<rspec>.freeze, ["~> 3.0"])
s.add_dependency(%q<pry-byebug>.freeze, ["~> 3.4.0"])
s.add_dependency(%q<barby>.freeze, ["~> 0.6.2"])
s.add_dependency(%q<pdfkit>.freeze, ["~> 0.8.2"])
end
else
s.add_dependency(%q<bundler>.freeze, ["~> 1.13"])
s.add_dependency(%q<rake>.freeze, ["~> 10.0"])
s.add_dependency(%q<rspec>.freeze, ["~> 3.0"])
s.add_dependency(%q<pry-byebug>.freeze, ["~> 3.4.0"])
s.add_dependency(%q<barby>.freeze, ["~> 0.6.2"])
s.add_dependency(%q<pdfkit>.freeze, ["~> 0.8.2"])
end
end
2 changes: 2 additions & 0 deletions lib/afip_bill.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ def self.configuration
ingresos_brutos: nil,
iva: nil,
sale_point: nil,
logo_path: nil,
invoice_discounts_mode: nil
}
end
end
Binary file added lib/afip_bill/assets/images/ARCA_logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified lib/afip_bill/assets/images/factura_a.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified lib/afip_bill/assets/images/factura_b.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added lib/afip_bill/assets/images/factura_c.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
65 changes: 50 additions & 15 deletions lib/afip_bill/generator.rb
Original file line number Diff line number Diff line change
@@ -1,51 +1,86 @@
require "json"
require "date"
require "afip_bill/check_digit"
require "barby/barcode/code_25_interleaved"
require "barby/outputter/html_outputter"
#require "barby/barcode/code_25_interleaved"
#require "barby/outputter/html_outputter"
require "pdfkit"

module AfipBill
class Generator
attr_reader :afip_bill, :bill_type, :user, :line_items, :header_text

attr_reader :afip_bill, :bill_name, :bill_type, :user, :line_items, :header_text
HEADER_PATH = File.dirname(__FILE__) + '/views/shared/_factura_header.html.erb'.freeze
FOOTER_PATH = File.dirname(__FILE__) + '/views/shared/_factura_footer.html.erb'.freeze
BRAVO_CBTE_TIPO = { "01" => "Factura A", "06" => "Factura B" }.freeze
BRAVO_CBTE_TIPO = {
'01' => { directory: 'bills', template: 'factura_a', doc_name: 'factura', doc_type: 'a' },
'02' => { directory: 'bills', template: 'factura_a', doc_name: 'Nota de débito', doc_type: 'a' },
'03' => { directory: 'bills', template: 'factura_a', doc_name: 'Nota de crédito', doc_type: 'a' },
'06' => { directory: 'bills', template: 'factura_b', doc_name: 'factura', doc_type: 'b' },
'07' => { directory: 'bills', template: 'factura_b', doc_name: 'Nota de débito', doc_type: 'b' },
'08' => { directory: 'bills', template: 'factura_b', doc_name: 'Nota de crédito', doc_type: 'b' },
'11' => { directory: 'bills', template: 'factura_b', doc_name: 'factura', doc_type: 'c' },
'12' => { directory: 'bills', template: 'factura_b', doc_name: 'Nota de débito', doc_type: 'c' },
'13' => { directory: 'bills', template: 'factura_b', doc_name: 'Nota de crédito', doc_type: 'c' }
}.freeze
IVA = 21.freeze
Copy link
Member Author

@ceneon ceneon Nov 9, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nan-apps empresa 1 vende algunos items con IVA 10.5% 😱

DEFAULTS = {
"cond_venta" => 'Otra'
}.freeze

def initialize(bill, user, line_items = [], header_text = 'ORIGINAL')
@afip_bill = JSON.parse(bill)
@afip_bill = DEFAULTS.merge(JSON.parse(bill))
@user = user
@bill_type = type_a_or_b_bill
@bill_name = bill_name_s
@bill_type = bill_type_s
@line_items = line_items
@template_header = ERB.new(File.read(HEADER_PATH)).result(binding)
@template_footer = ERB.new(File.read(FOOTER_PATH)).result(binding)
@header_text = header_text
end

def type_a_or_b_bill
BRAVO_CBTE_TIPO[afip_bill["cbte_tipo"]][-1].downcase
def bill_name_s
BRAVO_CBTE_TIPO[afip_bill["cbte_tipo"]][:doc_name].capitalize
end

def bill_type_s
BRAVO_CBTE_TIPO[afip_bill["cbte_tipo"]][:doc_type]
end

def barcode
@barcode ||= Barby::Code25Interleaved.new(code_numbers)
#def barcode
# @barcode ||= Barby::Code25Interleaved.new(code_numbers)
#end

def pdfkit_options
{
zoom: '1.65',
'margin-bottom': '0.05in',
'margin-top': '0.05in',
'margin-left': '0.2in',
'margin-right': '0.2in'
}
end

def generate_pdf_file
tempfile = Tempfile.new("afip_bill.pdf")

PDFKit.new(template).to_file(tempfile.path)
PDFKit.new(template, pdfkit_options).to_file(tempfile.path)
end

def generate_pdf_string
PDFKit.new(template).to_pdf
PDFKit.new(template, pdfkit_options).to_pdf
end

private

def bill_path
File.dirname(__FILE__) + "/views/bills/factura_#{bill_type}.html.erb"
File.dirname(__FILE__) + "/views/#{template_directory}/#{template_name}.html.erb"
end

def template_name
BRAVO_CBTE_TIPO[afip_bill["cbte_tipo"]][:template]
end

def template_directory
BRAVO_CBTE_TIPO[afip_bill["cbte_tipo"]][:directory]
end

def code_numbers
Expand Down
12 changes: 8 additions & 4 deletions lib/afip_bill/line_item.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
module AfipBill
class LineItem
attr_reader :name, :quantity, :imp_unitario
IVA = 21.freeze
attr_reader :name, :quantity, :imp_unitario, :iva, :code, :discount_percentage1, :discount_percentage2, :base_price

def initialize(name, quantity, imp_unitario)
def initialize(name, quantity, imp_unitario, iva=21, code=nil, discount_percentage1=nil, discount_percentage2=nil, base_price=nil)
@name = name
@quantity = quantity
@imp_unitario = imp_unitario
@iva = iva
@code = code
@discount_percentage1 = discount_percentage1
@discount_percentage2 = discount_percentage2
@base_price = base_price
end

def imp_total_unitario
quantity * imp_unitario
end

def imp_iva
imp_total_unitario * IVA / 100
imp_total_unitario * iva / 100
end

def imp_total_unitario_con_iva
Expand Down
Loading