[RUBY] Wenn Sie eine freeeAPI-Rechnung ausstellen, lassen Sie uns + automatisch aktualisieren! !!

Hallo, das ist mk, das sich an Ingenieure richtet, die ihre Jobs von unerfahrenen wechseln. Diesmal habe ich die kostenlose API berührt.

Wie der Titel schon sagt, ist es mühsam, eine Rechnung hochzuladen und jedes Mal zu aktualisieren. Ich habe in Ruby eine Rechnung geschrieben, die eine Rechnung über die API ausstellt und alles bis zum + Update erledigt.

github

Umgebung

macOS 10.15.5 ruby 2.7.1

Was ist + Update?

Verwendung von freee bei Vorabempfang (externer Link) Dieser Artikel ist leicht verständlich organisiert. Kurz gesagt, es ist eine Schaltfläche, mit der Sie die Vorauszahlung in Verkäufe ändern können. (Ich entschuldige mich, wenn ich mich irre ,,,)

Ich habe eine kostenlose Vorbestellungsverwaltungs-App im kostenlosen App Store. Ich habe dies erstellt, weil ich die Aufteilung des Verkaufsbetrags, der n Monate vor der Ausstellung der Rechnung eingegangen war, in monatliche Verkäufe von Grund auf automatisieren wollte.

Erforderliche Verarbeitung

Fakturierung → + Code aktualisieren

Zunächst beschreiben wir die helferähnliche Verarbeitung.

helper.rb


#Monatsverarbeitung
def add_month(num)
  if num < 12
    return num = num + 1
  elsif num == 12
    num = 1
  end
end

#Verarbeitung, um den positiven Verlängerungsbetrag für den ersten Monat zu ermitteln
def first_price(price,times)
  (price % times) + (price / times)
end

Definieren Sie add_month, da Sie das Ende des Verlängerungsmonats einschließlich des Rechnungsausstellungsmonats erhalten müssen.

Wenn der in Rechnung gestellte Betrag nicht durch die Anzahl der Aktualisierungen teilbar ist, definieren Sie first_price, um den Rest in die erste Aktualisierung aufzunehmen.

Ein Modul, das den Header einer http-Anforderung angibt

set_header.rb



module Header
  def self.get_header
    headers = {
      "accept" => "application/json",
      "Authorization"=> "Bearer #{YOUR_ACCESS_TOKEN}"
    }
  end
  def self.post_header
    headers = {
      "accept" => "application/json",
      "Authorization"=> "Bearer #{YOUR_ACCESS_TOKEN}",
      "Content-Type" => "application/json"
    }
  end
end

Rechnungscode

invoice.rb



require 'set_header.rb'
require 'json'
require 'net/http'

class Invoice
  BASE_URL = 'https://api.freee.co.jp'
  #Erstellen Sie eine Rechnung, indem Sie Parameter als Argumente übergeben
  def self.make_invoice(params)
    uri = URI.parse(BASE_URL + '/api/1/invoices')
    http = Net::HTTP.new(uri.host,uri.port)
    http.use_ssl = uri.scheme === "https"
    req = Net::HTTP::Post.new(uri.path)
    req.body = params.to_json
    req.initialize_http_header(Header.post_header)
    response = http.request(req)
    res_hash = JSON.parse(response.body)
  end
end

Plus Update-Erstellungscode

koushin.rb



require_relative 'set_header.rb'
require 'json'
require 'net/http'

class Koushin
  BASE_URL = 'https://api.freee.co.jp'
  #Transaktions-ID,Wenden Sie eine positive Aktualisierung an, indem Sie einen Parameter als Argument übergeben
  def self.post_koushin(torihiki_id,params)
    uri = URI.parse(BASE_URL + "/api/1/deals/#{torihiki_id}/renews")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = uri.scheme === "https"
    req = Net::HTTP::Post.new(uri.path)
    req.body = params.to_json
    req.initialize_http_header(Header.post_header)
    response = http.request(req)
    res_hash = JSON.parse(response.body)
  end
end

Und implementieren Sie von der Rechnungsstellung bis zur Verlängerung Der in Rechnung gestellte Betrag beträgt 12345678 Yen (ohne Steuern), der Steuersatz beträgt 10%

invoice_koushin.rb


require 'invoice.rb'
require 'koushin.rb'
require 'date'
require 'helper.rb'
#Andere verschiedene Anforderungen sind erforderlich, werden jedoch weggelassen

#Erforderliche Elemente einstellen
month = Time.now.month
year = Time.now.year
count = 1
company_id = Company.company_id #Siehe github Abrufen der Geschäftsbüro-ID

#Rechnungsbetrag(Ausländische Steuer)
amount = 12345678
#Verbraucher Steuer(10%)
vat = (amount * 0.1).floor
#+Anzahl der Updates
num = 12


#Rechnungsparameter
invoice_params = {
  "company_id": company_id,
  "issue_date": Date.today,
  "due_date": Date.new(year, month, -1),
  "partner_id": Supplier.supplier_id('CFO'), #Siehe github Konto-ID abrufen
  "booking_date": Date.today,
  "description": "#{Date.today.month}Monatliche Rechnung",
  "invoice_status": "issue",
  "partner_display_name": "CFO Co., Ltd.",
  "partner_title": "Du",
  "partner_contact_info": "Verkaufspersonal",
  "partner_zipcode": "012-0009",
  "partner_prefecture_code": 4,
  "partner_address1": "Yuzawa City",
  "partner_address2": "Gebäude A.",
  "company_name": "freee Co., Ltd.",
  "company_zipcode": "000-0000",
  "company_prefecture_code": 12,
  "company_address1": "XX Ward YY1-1-1",
  "company_address2": "Gebäude 1F",
  "company_contact_info": "Vertriebsmitarbeiter",
  "payment_type": "transfer",
  "payment_bank_info": "XX Bank YY Filiale 1111111",
  "message": "Wir berechnen Ihnen wie folgt.",
  "notes": "Vielen Dank jedes Mal",
  "invoice_layout": "default_classic",
  "tax_entry_method": "exclusive",
  "invoice_contents": [
    {
      "order": 0,
      "type": "normal",
      "qty": 1,
      "unit": "Stücke",
      "unit_price": amount,
      "vat": vat,
      "description": "Bemerkungen",
      "tax_code": 2,
      "account_item_id": AccountItem.account_item_id('Unverdientes Einkommen') #github参照 Unverdientes Einkommenのaccount_item_ID abrufen
    }
  ]
}

#Ausstellung von Rechnungen
invoice = Invoice.make_invoice(invoice_params)
puts 'Eine Rechnung ausgestellt'
#Abrufen der Transaktions-ID aus der Antwort auf die Rechnungsausstellung
torihiki_id = invoice['invoice']['deal_id']
#Rufen Sie die Transaktionszeilen-ID der obigen Transaktions-ID ab
renew_target_id = Torihiki.target_id(torihiki_id) #Siehe Github Torihiki_Rufen Sie die Details der Transaktion ab, die der ID zugeordnet ist, und rufen Sie von dort die Transaktionszeilen-ID ab
#+Konto-ID zum Zeitpunkt der Aktualisierung(Umsatz)Erhalten
uriagedaka_id = AccountItem.account_item_id('Umsatz') #Siehe Github

#Anzahl der Transaktions-IDs unter Verwendung der Transaktionszeilen-ID+Aktualisieren
num.times do
  #Wenn die Anzahl 1 ist+Verlängerungsbetrag zuerst_Zum Preis wechseln
  if count == 1
    koushin_amount = first_price(amount,num)
    koushin_vat = first_price(vat,num)
  else
    koushin_amount = amount / num
    koushin_vat = vat / num
  end

  date = Date.new(year, month, -1) 
#+Aktualisierungsparameter einstellen
  koushin_params = {
    "company_id": company_id,
    "update_date": date,
    "renew_target_id": renew_target_id,
    "details": [
      {
        "account_item_id": uriagedaka_id,
        "tax_code": 21,
        "amount": (koushin_amount + koushin_vat),
        "vat": koushin_vat
      }
    ]
  }
  #Transaktions-ID,Mit Parametern+Update erstellen
  Koushin.post_koushin(torihiki_id,koushin_params)
  puts "#{date}Wurde aktualisiert"
  #Holen Sie sich den Monat des nächsten Monats
  month = add_month(month)
  #Wenn der Monat Januar ist, fügen Sie 1 AD hinzu
  year += 1 if month == 1
  count += 1
end

Versuchen Sie es lokal auszuführen.

スクリーンショット 2020-07-15 20.01.48.png

Der Prozess scheint ordnungsgemäß gelaufen zu sein. Die Ausführungszeit beträgt ca. 5 Sekunden (etwas lang ...) Werfen wir einen Blick auf Accounting Freee.

スクリーンショット 2020-07-15 19.54.43.png

Sie können eine Rechnung an CFO Co., Ltd. ausstellen! Der Betrag und der Verbrauchsteuerbetrag sind ordnungsgemäß enthalten. スクリーンショット 2020-07-15 22.06.04.png Schauen wir uns als nächstes die Transaktionen an.

スクリーンショット 2020-07-15 19.53.04.png Der Betrag nach dem Update beträgt 0 Yen! スクリーンショット 2020-07-15 19.52.21.png

Das Aktualisierungsdatum umfasst auch den letzten Tag von 12 Monaten einschließlich des Endes des Ausgabemonats.

Zukünftige Aufgaben

Ich möchte die am Monatsende ausgestellte Rechnung verbessern, damit ich flexibel reagieren kann, z. B. was zu tun ist, das ich ab dem Monat nach Bestätigung der Überweisung aktualisieren möchte. Außerdem können Sie jeden Rechnungsparameter importieren und die Anzahl mit csv aktualisieren. Und der Code ist nicht schön ... lol

Jeden Tag gewidmet

Recommended Posts

Wenn Sie eine freeeAPI-Rechnung ausstellen, lassen Sie uns + automatisch aktualisieren! !!
Was tun, wenn Sie versehentlich ein Modell erstellen?
Was tun, wenn in GlassFish eine java.io.IOException auftritt?
Wenn Sie komplizierte Berechnungen haben, erstellen wir eine CalcRule-Klasse
Was tun, wenn in Docker ein gcc-Fehler auftritt?
Was tun, wenn Sie in Thymeleaf Layout eine groovige Warnung erhalten?
Was tun, wenn auf GitHub eine MiniMagick-Sicherheitsanfälligkeitswarnung angezeigt wird?