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.
macOS 10.15.5 ruby 2.7.1
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.
--Émission de jeton d'accès (GET) --Get company_id (GET) --Obtenir l'identifiant du compte (GET)
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.
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.
Vous pouvez émettre une facture à CFO Co., Ltd.! Le montant et le montant de la taxe à la consommation sont correctement inclus. Ensuite, regardons les transactions.
Le montant après la mise à jour est de 0 yen!La date de mise à jour inclut également le dernier jour de 12 mois, y compris la fin du mois d'émission.
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