[RUBY] Si vous émettez une facture freeeAPI, faisons + mise à jour automatiquement! !!

Bonjour, c'est mk, qui s'adresse aux ingénieurs qui changent de métier par des inexpérimentés. Cette fois, j'ai touché l'API freee.

Comme le titre l'indique, il est compliqué de télécharger une facture et de la mettre à jour à chaque fois. J'ai écrit un programme en Ruby qui émet une facture via API et fait tout jusqu'à + mise à jour.

github

environnement

macOS 10.15.5 ruby 2.7.1

Tout d'abord, qu'est-ce que + update?

Comment utiliser freee en cas de réception anticipée (lien externe) Cet article est organisé de manière simple à comprendre, Bref, c'est un bouton qui vous permet de changer l'acompte en vente. (Je m'excuse si je me trompe,)

J'ai une application gratuite de gestion des précommandes dans la boutique d'applications freee. J'ai créé cela parce que je voulais automatiser le travail de division du montant des ventes reçues n mois avant l'émission de la facture en ventes mensuelles à partir de zéro.

Traitement requis

--Émission de jeton d'accès (GET) --Get company_id (GET) --Obtenir l'identifiant du compte (GET)

Facturation → + code de mise à jour

Tout d'abord, nous allons décrire le traitement de type helper.

helper.rb


#Traitement du mois
def add_month(num)
  if num < 12
    return num = num + 1
  elsif num == 12
    num = 1
  end
end

#Traitement pour trouver le montant de renouvellement positif pour le premier mois
def first_price(price,times)
  (price % times) + (price / times)
end

Définissez add_month car vous devez obtenir la fin du mois de renouvellement, y compris le mois d'émission de la facture.

De plus, si le montant facturé n'est pas divisible par le nombre de mises à jour, définissez first_price pour inclure le reste dans la première mise à jour.

Un module qui spécifie l'en-tête d'une requête http

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

Code de facturation

invoice.rb



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

class Invoice
  BASE_URL = 'https://api.freee.co.jp'
  #Créer une facture en passant des paramètres comme arguments
  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 le code de création de mise à jour

koushin.rb



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

class Koushin
  BASE_URL = 'https://api.freee.co.jp'
  #Identifiant de transaction,Appliquer une mise à jour positive en passant un paramètre comme argument
  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

Et mettre en œuvre de la facturation au renouvellement plus Le montant facturé est de 12345678 yens (hors taxes), le taux d'imposition est de 10%

invoice_koushin.rb


require 'invoice.rb'
require 'koushin.rb'
require 'date'
require 'helper.rb'
#D'autres exigences diverses sont requises, mais omises

#Définition des éléments requis
month = Time.now.month
year = Time.now.year
count = 1
company_id = Company.company_id #Reportez-vous à github Obtenir l'identifiant du bureau

#Montant facturé(Impôt étranger)
amount = 12345678
#taxe de consommation(10%)
vat = (amount * 0.1).floor
#+Nombre de mises à jour
num = 12


#Paramètres de facturation
invoice_params = {
  "company_id": company_id,
  "issue_date": Date.today,
  "due_date": Date.new(year, month, -1),
  "partner_id": Supplier.supplier_id('CFO'), #Voir github Obtenir l'identifiant du compte
  "booking_date": Date.today,
  "description": "#{Date.today.month}Facture mensuelle",
  "invoice_status": "issue",
  "partner_display_name": "CFO Co., Ltd.",
  "partner_title": "Tu",
  "partner_contact_info": "Personnel de vente",
  "partner_zipcode": "012-0009",
  "partner_prefecture_code": 4,
  "partner_address1": "Ville de Yuzawa",
  "partner_address2": "Construire un",
  "company_name": "freee Co., Ltd.",
  "company_zipcode": "000-0000",
  "company_prefecture_code": 12,
  "company_address1": "XX Quartier YY1-1-1",
  "company_address2": "Bâtiment 1F",
  "company_contact_info": "Représentant des ventes corporatives",
  "payment_type": "transfer",
  "payment_bank_info": "XX Bank YY Branch 1111111",
  "message": "Nous vous facturerons comme suit.",
  "notes": "Merci à chaque fois",
  "invoice_layout": "default_classic",
  "tax_entry_method": "exclusive",
  "invoice_contents": [
    {
      "order": 0,
      "type": "normal",
      "qty": 1,
      "unit": "Pièces",
      "unit_price": amount,
      "vat": vat,
      "description": "Remarques",
      "tax_code": 2,
      "account_item_id": AccountItem.account_item_id('Revenu non gagné') #github参照 Revenu non gagnéのaccount_item_Obtenir l'identifiant
    }
  ]
}

#Émission de factures
invoice = Invoice.make_invoice(invoice_params)
puts 'Émis une facture'
#Obtenir l'ID de transaction à partir de la réponse d'émission de la facture
torihiki_id = invoice['invoice']['deal_id']
#Obtenez l'ID de ligne de transaction de l'ID de transaction ci-dessus
renew_target_id = Torihiki.target_id(torihiki_id) #Voir github torihiki_Obtenez les détails de la transaction associés à l'identifiant et obtenez l'identifiant de la ligne de transaction à partir de là
#+Identifiant de compte au moment de la mise à jour(montant des ventes)Avoir
uriagedaka_id = AccountItem.account_item_id('montant des ventes') #Voir github

#ID de transaction num fois en utilisant l'ID de ligne de transaction+Mise à jour
num.times do
  #Lorsque le nombre est 1+Montant de renouvellement en premier_Changer de prix
  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) 
#+Définir les paramètres de mise à jour
  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
      }
    ]
  }
  #Identifiant de transaction,Avec paramètres+Créer une mise à jour
  Koushin.post_koushin(torihiki_id,koushin_params)
  puts "#{date}A été mis à jour"
  #Obtenez le mois du mois suivant
  month = add_month(month)
  #Si le mois est janvier, ajoutez 1 AD
  year += 1 if month == 1
  count += 1
end

Essayez de l'exécuter localement.

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

Le processus semble s'être déroulé correctement. Le temps d'exécution est d'environ 5 secondes (un peu long ...) Jetons un coup d'œil à la comptabilité freee.

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

Vous pouvez émettre une facture à CFO Co., Ltd.! Le montant et le montant de la taxe à la consommation sont correctement inclus. スクリーンショット 2020-07-15 22.06.04.png Ensuite, regardons les transactions.

スクリーンショット 2020-07-15 19.53.04.png Le montant après la mise à jour est de 0 yen! スクリーンショット 2020-07-15 19.52.21.png

La date de mise à jour inclut également le dernier jour de 12 mois, y compris la fin du mois d'émission.

Tâches futures

Je souhaite améliorer la facture émise à la fin du mois afin de pouvoir répondre de manière flexible, comme quoi faire, je souhaite mettre à jour à partir du mois suivant la confirmation du transfert. Il vous permet également d'importer chaque paramètre de facture et de mettre à jour le nombre avec csv. Et le code n'est pas beau ... lol

Dédié chaque jour

Recommended Posts

Si vous émettez une facture freeeAPI, faisons + mise à jour automatiquement! !!
Que faire si vous créez accidentellement un modèle
Que faire lorsqu'une exception java.io.IOException se produit dans GlassFish
Si vous avez des calculs compliqués, créons une classe CalcRule
Que faire si vous obtenez une erreur gcc dans Docker
Que faire si vous obtenez un avertissement groovy dans Thymeleaf Layout
Que faire si vous recevez une alerte de vulnérabilité MiniMagick sur GitHub