604 lines
14 KiB
Ruby
604 lines
14 KiB
Ruby
class Admin::PComptaExportsController < ApplicationController
|
|
layout "admin"
|
|
before_action :auth_admin
|
|
|
|
before_action :admin_space
|
|
|
|
|
|
|
|
def admin_space
|
|
@admin_space = "payments"
|
|
end
|
|
|
|
def index
|
|
@p_compta_exports = PComptaExport.order("id DESC").all
|
|
|
|
|
|
end
|
|
|
|
def show
|
|
@p_compta_export = PComptaExport.find(params[:id])
|
|
|
|
@p_compta_export.add_elements if !@p_compta_export.validated
|
|
|
|
|
|
|
|
@headers = [
|
|
"compte comptable","compte client","client","date","echeance","numero piece","débit","crédit"
|
|
|
|
]
|
|
|
|
|
|
@lines = []
|
|
|
|
@lines_pnm = []
|
|
|
|
@p_compta_export.price_documents.each do |price_document|
|
|
|
|
line_pnm = []
|
|
|
|
line_pnm << "C"
|
|
|
|
line_pnm << "9"
|
|
|
|
line_pnm << ('%-7.7s' % price_document.p_customer.code)
|
|
|
|
line_pnm << ('%-30.30s' % price_document.p_customer.show_name)
|
|
|
|
line_pnm << ('%-59.59s' % " " )
|
|
|
|
|
|
|
|
line_pnm << "41100000"
|
|
line_pnm << ('%-30.30s' % (price_document.p_customer and price_document.p_customer.particular ? price_document.p_customer.particular.address_2 : " "))
|
|
line_pnm << ('%-30.30s' % (price_document.p_customer and price_document.p_customer.particular ? price_document.p_customer.particular.address_3 : " "))
|
|
|
|
line_pnm << ('%-30.30s' % (price_document.p_customer and price_document.p_customer.particular ? price_document.p_customer.particular.cp.to_s+price_document.p_customer.particular.city : " "))
|
|
line_pnm << ('%-20.20s' % (price_document.p_customer and price_document.p_customer.particular ? price_document.p_customer.particular.tel.to_s : " "))
|
|
line_pnm << "1"
|
|
line_pnm << "C"
|
|
|
|
|
|
|
|
@lines_pnm << line_pnm
|
|
|
|
|
|
line = []
|
|
line << "41100000"
|
|
line << price_document.p_customer.code if price_document.p_customer
|
|
line << price_document.p_customer.show_name if price_document.p_customer
|
|
line << price_document.date.strftime("%d/%m/%Y")
|
|
line << price_document.payment_end_at
|
|
line << price_document.d_number
|
|
|
|
|
|
|
|
|
|
|
|
if price_document.tot_amount_ttc.to_f >= 0
|
|
line << price_document.tot_amount_ttc.to_s.gsub('.', ',')
|
|
line << ""
|
|
|
|
else
|
|
line << ""
|
|
line << (price_document.tot_amount_ttc*-1).to_s.gsub('.', ',')
|
|
|
|
end
|
|
|
|
@lines << line
|
|
|
|
|
|
|
|
line_pnm = []
|
|
|
|
line_pnm << "M"
|
|
|
|
line_pnm << "9"
|
|
|
|
line_pnm << ('%-7.7s' % price_document.p_customer.code)
|
|
line_pnm << "VE"
|
|
line_pnm << "000"
|
|
line_pnm << ('%-6.6s' % price_document.date.strftime("%d%m%y") )
|
|
|
|
if price_document.label == "Facture"
|
|
line_pnm << "F"
|
|
elsif price_document.label == "Avoir"
|
|
line_pnm << "A"
|
|
end
|
|
|
|
line_pnm << ('%-20.20s' % price_document.d_number )
|
|
|
|
if price_document.tot_amount_ttc.to_f >= 0
|
|
line_pnm << "D+"
|
|
|
|
|
|
|
|
else
|
|
line_pnm << "C+"
|
|
|
|
end
|
|
|
|
line_pnm << ('%12.12s' % (price_document.tot_amount_ttc.abs*100).to_i.to_s ).gsub(' ', "0")
|
|
|
|
line_pnm << ('%-8.8s' % " " )
|
|
|
|
line_pnm << ('%-6.6s' % price_document.payment_end_at.strftime("%d%m%y") )
|
|
|
|
line_pnm << ('%-5.5s' % " " )
|
|
|
|
line_pnm << ('%-5.5s' % price_document.d_number )
|
|
|
|
line_pnm << ('%-20.20s' % " " )
|
|
|
|
line_pnm << ('%-8.8s' % price_document.d_number )
|
|
|
|
line_pnm << "EUR"
|
|
|
|
|
|
line_pnm << "VE"
|
|
|
|
line_pnm << ('%-4.4s' % " " )
|
|
|
|
line_pnm << ('%-30.30s' % (price_document.d_number+ " "+price_document.p_customer.show_name.to_s) )
|
|
|
|
line_pnm << ('%-2.2s' % " " )
|
|
|
|
line_pnm << ('%-10.10s' % price_document.d_number )
|
|
|
|
|
|
|
|
@lines_pnm << line_pnm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
comptes = {}
|
|
comptes_tva = {}
|
|
tva_rate = nil
|
|
|
|
cpt_fdp = "70700200"
|
|
|
|
|
|
if tva_rate = TvaRate.where(:rate => 20.0,:accounting_zone_id => price_document.price_line_block.accounting_zone_id).first
|
|
cpt_fdp_tva = tva_rate.sale_account
|
|
else
|
|
cpt_fdp_tva = "TVAfdpnondefini"
|
|
end
|
|
|
|
if price_document.price_line_block.tot_fdp_ht != 0.0
|
|
comptes[cpt_fdp] = comptes[cpt_fdp] || 0.0
|
|
comptes[cpt_fdp] += price_document.price_line_block.tot_fdp_ht
|
|
|
|
comptes[cpt_fdp_tva] = comptes[cpt_fdp_tva] || 0.0
|
|
comptes[cpt_fdp_tva] += price_document.price_line_block.tot_fdp_tva
|
|
end
|
|
|
|
price_document.price_line_block.price_lines.each do |price_line|
|
|
|
|
if price_line.tva_account_id
|
|
tva_rate = TvaRate.where(:id => price_line.tva_account_id).first
|
|
elsif price_line.tva_account_value and price_line.accounting_zone_id
|
|
tva_rate = TvaRate.where(:rate => price_line.tva_account_value,:accounting_zone_id => price_line.accounting_zone_id).first
|
|
end
|
|
|
|
|
|
if price_line.tot_line_ht != 0.0
|
|
|
|
if price_line.product_no_remise
|
|
tot_amount_ht = price_line.tot_amount_ht
|
|
else
|
|
tot_amount_ht = (price_line.tot_amount_ht - ((price_document.price_line_block.ct_tot_discount_percent.to_f / 100.0) * (price_line.tot_amount_ht))).round(2)
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if tva_rate
|
|
sl_acc = tva_rate.sale_product_account
|
|
else
|
|
sl_acc = "70700800"
|
|
end
|
|
|
|
comptes[sl_acc] = comptes[sl_acc] || 0.0
|
|
comptes[sl_acc] +=tot_amount_ht
|
|
|
|
end
|
|
|
|
if price_line.tot_line_tva != 0.0
|
|
|
|
|
|
|
|
if price_line.product_no_remise
|
|
tot_amount_tva = price_line.tot_amount_tva
|
|
else
|
|
tot_amount_tva = (price_line.tot_amount_tva - ((price_document.price_line_block.ct_tot_discount_percent.to_f / 100.0) * (price_line.tot_amount_tva))).round(3)
|
|
end
|
|
|
|
if tva_rate
|
|
comptes[tva_rate.sale_account] = comptes[tva_rate.sale_account] || 0.0
|
|
comptes[tva_rate.sale_account] += tot_amount_tva
|
|
|
|
else
|
|
comptes["cpt TVA introuvable"] = comptes["cpt TVA introuvable"] || 0.0
|
|
comptes["cpt TVA introuvable"] += tot_amount_tva
|
|
end
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
comptes.each do |key, value|
|
|
|
|
line = []
|
|
line << key
|
|
line << ""
|
|
line << ""
|
|
line << price_document.date.strftime("%d/%m/%Y")
|
|
line << price_document.payment_end_at
|
|
line << price_document.d_number
|
|
|
|
if value.to_f >= 0
|
|
|
|
line << ""
|
|
line << value.to_s.gsub('.', ',')
|
|
|
|
else
|
|
line << (value*-1).to_s.gsub('.', ',')
|
|
line << ""
|
|
|
|
|
|
end
|
|
|
|
@lines << line
|
|
|
|
|
|
line_pnm = []
|
|
|
|
line_pnm << "M"
|
|
|
|
line_pnm << ('%-8.8s' % key)
|
|
line_pnm << "VE"
|
|
line_pnm << "000"
|
|
line_pnm << ('%-6.6s' % price_document.date.strftime("%d%m%y") )
|
|
|
|
if price_document.label == "Facture"
|
|
line_pnm << "F"
|
|
elsif price_document.label == "Avoir"
|
|
line_pnm << "A"
|
|
end
|
|
|
|
line_pnm << ('%-20.20s' % price_document.d_number )
|
|
|
|
if value.to_f >= 0
|
|
line_pnm << "C+"
|
|
|
|
|
|
|
|
else
|
|
line_pnm << "D+"
|
|
|
|
end
|
|
|
|
line_pnm << ('%12.12s' % (value.abs*100).to_i.to_s ).gsub(' ', "0")
|
|
|
|
line_pnm << ('%-8.8s' % " " )
|
|
|
|
line_pnm << ('%-6.6s' % "000000" )
|
|
|
|
line_pnm << ('%-5.5s' % " " )
|
|
|
|
line_pnm << ('%-5.5s' % price_document.d_number )
|
|
|
|
line_pnm << ('%-20.20s' % " " )
|
|
|
|
line_pnm << ('%-8.8s' % price_document.d_number )
|
|
|
|
line_pnm << "EUR"
|
|
|
|
|
|
line_pnm << "VE"
|
|
|
|
line_pnm << ('%-4.4s' % " " )
|
|
|
|
line_pnm << ('%-30.30s' % (price_document.d_number+ " "+price_document.p_customer.show_name.to_s) )
|
|
|
|
line_pnm << ('%-2.2s' % " " )
|
|
|
|
line_pnm << ('%-10.10s' % price_document.d_number )
|
|
|
|
|
|
|
|
@lines_pnm << line_pnm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
comptes_tva.each do |key, value|
|
|
line = []
|
|
line << key
|
|
line << ""
|
|
line << ""
|
|
line << price_document.date.strftime("%d/%m/%Y")
|
|
line << price_document.payment_end_at
|
|
line << price_document.d_number
|
|
if price_document.s_project
|
|
line << price_document.s_project.p_number
|
|
else
|
|
line << ""
|
|
end
|
|
line << price_document.libelle
|
|
|
|
|
|
if value.to_f >= 0
|
|
|
|
line << ""
|
|
line << value.to_s.gsub('.', ',')
|
|
|
|
else
|
|
line << value.to_s.gsub('.', ',')
|
|
line << ""
|
|
|
|
|
|
end
|
|
|
|
@lines << line
|
|
|
|
|
|
|
|
line_pnm = []
|
|
|
|
line_pnm << "M"
|
|
|
|
line_pnm << ('%-8.8s' % key)
|
|
line_pnm << "VE"
|
|
line_pnm << "000"
|
|
line_pnm << ('%-6.6s' % price_document.date.strftime("%d%m%y") )
|
|
|
|
if price_document.label == "Facture"
|
|
line_pnm << "F"
|
|
elsif price_document.label == "Avoir"
|
|
line_pnm << "A"
|
|
end
|
|
|
|
line_pnm << ('%-20.20s' % price_document.d_number )
|
|
|
|
if value.to_f >= 0
|
|
line_pnm << "C+"
|
|
|
|
|
|
|
|
else
|
|
line_pnm << "D+"
|
|
|
|
end
|
|
|
|
line_pnm << ('%12.12s' % (value.abs*100).to_i.to_s ).gsub(' ', "0")
|
|
|
|
line_pnm << ('%-8.8s' % " " )
|
|
|
|
line_pnm << ('%-6.6s' % "000000" )
|
|
|
|
line_pnm << ('%-5.5s' % " " )
|
|
|
|
line_pnm << ('%-5.5s' % price_document.d_number )
|
|
|
|
line_pnm << ('%-20.20s' % " " )
|
|
|
|
line_pnm << ('%-8.8s' % price_document.d_number )
|
|
|
|
line_pnm << "EUR"
|
|
|
|
|
|
line_pnm << "VE"
|
|
|
|
line_pnm << ('%-4.4s' % " " )
|
|
|
|
line_pnm << ('%-30.30s' % (price_document.d_number+ " "+price_document.p_customer.show_name.to_s) )
|
|
|
|
line_pnm << ('%-2.2s' % " " )
|
|
|
|
line_pnm << ('%-10.10s' % price_document.d_number )
|
|
|
|
|
|
|
|
@lines_pnm << line_pnm
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
@table_header = @headers
|
|
@table = @lines
|
|
|
|
xlsx_package = Axlsx::Package.new
|
|
wb = xlsx_package.workbook
|
|
wb.add_worksheet(name: "import") do |sheet|
|
|
sheet.add_row @table_header
|
|
@table.each do |tr|
|
|
sheet.add_row tr
|
|
end
|
|
end
|
|
|
|
directory_name = "price_document_exports"
|
|
Dir.mkdir("private_medias/#{directory_name}") unless File.exists?("private_medias/#{directory_name}")
|
|
|
|
@filename = "export-#{@p_compta_export.id}"
|
|
|
|
file_path = "private_medias/#{directory_name}/#{@filename}-#{Time.now.to_s.to_slug}.xlsx"
|
|
xlsx_package.serialize(file_path)
|
|
|
|
|
|
pnm_file_path = "private_medias/#{directory_name}/#{@filename}-#{Time.now.to_s.to_slug}.txt"
|
|
|
|
File.open(pnm_file_path, "w+:iso-8859-1") do |f|
|
|
#@data_to_send_pnm = "NOM\r\n"
|
|
@data_to_send_pnm = ""
|
|
@lines_pnm.each do |line|
|
|
|
|
@data_to_send_pnm += line.join("")
|
|
|
|
if false
|
|
@data_to_send_pnm += "M"
|
|
|
|
@data_to_send_pnm += ('%-8.8s' % line[1])
|
|
@data_to_send_pnm += "VE"
|
|
@data_to_send_pnm += "000"
|
|
@data_to_send_pnm += ('%-8.8s' % line[2])
|
|
|
|
|
|
@data_to_send_pnm += ('%-3.3s' % line[0])
|
|
|
|
|
|
@data_to_send_pnm += ('%-8.8s' % line[2])
|
|
@data_to_send_pnm += ('%32.32s' % line[3])
|
|
@data_to_send_pnm += ('%-25.25s' % line[4])
|
|
@data_to_send_pnm += ('%-7.7s' % line[5])
|
|
@data_to_send_pnm += ('%-1.1s' % line[6])
|
|
@data_to_send_pnm += ('%20.20s' % line[7])
|
|
@data_to_send_pnm += ('%-34.34s' % line[8])
|
|
@data_to_send_pnm += ('%-26.26s' % line[9])
|
|
end
|
|
@data_to_send_pnm += "\r\n"
|
|
end
|
|
f.write(@data_to_send_pnm.encode("iso-8859-1", invalid: :replace, undef: :replace))
|
|
end
|
|
|
|
|
|
|
|
|
|
respond_to do |format|
|
|
format.html{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
format.csv {
|
|
|
|
|
|
|
|
send_file file_path, :filename => "#{@filename}-#{Time.now.to_s.to_slug}.xlsx" #, :type => 'text/csv; charset=iso-8859-1; header=present'
|
|
|
|
}
|
|
|
|
|
|
format.pnm {
|
|
|
|
send_data @data_to_send_pnm.encode("iso-8859-1", :undef => :replace), filename: "export-ansi.txt", type: "text/plain; charset=iso-8859-1", :disposition => (false ? "inline" : "attachment")
|
|
|
|
#send_file pnm_file_path, :filename => "export-pnm.pnm", :type => 'text/plain; charset=iso-8859-1', :disposition => "attachment"
|
|
|
|
}
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
def new
|
|
|
|
|
|
@p_compta_export = PComptaExport.new
|
|
|
|
|
|
end
|
|
|
|
def lock
|
|
@p_compta_export = PComptaExport.find(params[:id])
|
|
@p_compta_export.valid_process
|
|
|
|
redirect_to [:admin, @p_compta_export]
|
|
end
|
|
|
|
def edit
|
|
|
|
|
|
@p_compta_export = PComptaExport.find(params[:id])
|
|
end
|
|
|
|
def create
|
|
@p_compta_export = PComptaExport.new(params.require(:p_compta_export).permit!)
|
|
|
|
|
|
if @p_compta_export.save
|
|
@p_compta_exports = PComptaExport.all
|
|
|
|
else
|
|
render action: "new"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
def update
|
|
@p_compta_export = PComptaExport.find(params[:id])
|
|
|
|
|
|
if @p_compta_export.update_attributes(params.require(:p_compta_export).permit!)
|
|
|
|
@p_compta_exports = PComptaExport.all
|
|
else
|
|
render action: "edit"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
def destroy
|
|
@p_compta_export = PComptaExport.find(params[:id])
|
|
@p_compta_export.destroy
|
|
|
|
|
|
end
|
|
end
|