[RUBY] [Journal de développement ⑪] Calculez le nombre total de jours passés entre la date d'octroi des vacances et le présent - à partir du nombre de jours restants

À propos de la prémisse

Ravi de vous rencontrer, je m'appelle Irifune et je vais dans une école de programmation. Cet article est utilisé pour ma propre sortie en écrivant un compte rendu du développement d'applications personnelles, qui est un sujet de l'école. Si quelqu'un l'a lu, je vous serais reconnaissant de bien vouloir me faire part de vos commentaires.

Nous développerons un «outil de gestion des congés payés». Pour les spécifications, voir Articles précédents.

L'application sera déployée, mais elle n'est pas fournie en tant que service. Veuillez comprendre que ce n'est qu'une partie de l'auto-apprentissage. Passez ensuite au sujet principal.

Contenu de cette implémentation

Jusqu'à la fois précédente, nous avons pu calculer la date d'attribution (la date à laquelle le congé payé est accordé 6 mois après la date d'embauche) et l'ancienneté en fonction de la date d'embauche de l'employé. Aujourd'hui, permettez-moi de calculer le nombre total de jours de digestion. Plus précisément, envisagez la procédure suivante.

―― Quel est le nombre total de jours de digestion? ―― Quel est le nombre total de jours de digestion traités cette fois?

Quel est le nombre total de jours de digestion?

Tout d'abord, le congé payé que vous recevez chaque année est valable deux ans après son octroi. Lors de la digestion, il est également important de digérer les plus anciens en premier.

Par exemple, si une personne qui a rejoint l'entreprise le 1er avril 2018 digère trois jours de vacances en deux parties, le déroulement sera le suivant.

Date Augmentation / diminution des jours fériés payés Jours restants
2018/4/1 Pas d'augmentation ni de diminution lors de l'entrée dans l'entreprise 0ème
2018/10/1 10 jours de congé Le 10
2019/1/1 3 jours de congé ★ Le 7
2019/10/1 11 jours de congé 18e
2020/1/1 3 jours de congé ★ 15ème jour
2020/5/17 Vérifiez le nombre de jours restants en vacances 15ème jour
2020/10/1 4 jours de vacances disparaissent sans être utilisés, 12 jours de vacances sont accordés Le 23

En d'autres termes, pour le nombre total de jours fériés au 17 mai 2020, vous pouvez rechercher dans le tableau les deux enregistrements suivants et les additionner.

--Total de la dernière date de subvention à aujourd'hui (2019/10/01 ~ 2020/5/17)

Cependant, si vous utilisez cette formule, vous devez calculer séparément les jours fériés qui disparaissent sans digestion le 01 octobre 2020.

Quel est le nombre total de jours de digestion traités cette fois?

Cette fois, le calcul du nombre de jours que vous souhaitez enfin implémenter dans l'application est le suivant.

① Nombre total de jours accordés au cours des deux dernières années ② Nombre total de jours de digestion depuis la dernière date d'attribution jusqu'à aujourd'hui ③ Nombre total de jours de digestion entre la date de la subvention précédente et la dernière date de la subvention ④ Nombre de jours restants après avoir soustrait ② et ③ de ①

Je l'ai écrit pendant longtemps, mais je l'ai rédigé comme mon propre mémorandum. Par conséquent, la façon de penser peut changer à l'avenir. Pensez-y comme un événement dans le cerveau d'Irifune au moment de la rédaction de l'article. Donc, cette fois, nous avons mis en œuvre "② Nombre total de jours de digestion entre la dernière date de subvention et le présent", nous allons donc introduire cela à partir de ce qui suit.

Rechercher la plage à totaliser

Jusqu'à la dernière fois, la table était créée uniquement avec les enregistrements d'employés, mais à partir de ce moment, les enregistrements de vacances payées seront également inclus dans le calcul. Les employés sont stockés dans la table des employés et les congés payés sont stockés dans la table des jours fériés, donc éditez-les à partir du contrôleur.

employees_controller.rb


class EmployeesController < ApplicationController
  def index
    @employees = Employee.where(branch_id: params[:branch_id]).includes(:holidays)
  end
~ Omis ~
end

Dans la seconde moitié, la méthode includes est utilisée pour obtenir l'enregistrement de vacances avec employee_id. La méthode inclut est apparue lorsque j'ai appris le "problème N + 1" dans le programme. Dans ce cas, j'ai appris que lors de la récupération de nombreux enregistrements avec une clé externe à partir d'une table un-à-plusieurs, l'enregistrement avec la clé primaire est utilisé pour regarder vers l'avenir. Cette fois, j'ai obtenu l'enregistrement de la clé externe lié à l'enregistrement avec la clé primaire, donc l'ordre est inversé, mais j'ai pu l'utiliser en toute sécurité.

Article référencé "Obtenir et afficher des données de table un-à-plusieurs avec Rails" @bitarx

Ensuite, dans le fichier modèle, définissez une méthode qui vous permet de rechercher «de la dernière date de délivrance au présent».

models/employee.rb


class Employee < ApplicationRecord
~ Omis ~
  def range_to_add_or_delete
    grant_day = hire_date >> 6
    month = grant_day.month
    day = grant_day.mday
    year = Date.today.year
    grant_date_this_year = Time.local(year, month, day)

    if grant_date_this_year > Date.today
      last_year = year - 1
      grant_date_this_year = Time.local(last_year, month, day)
    else
      grant_date_this_year
    end

    holidays.where(created_at: grant_date_this_year..Date.tomorrow)
end

Tout d'abord, grant_day au début calcule la date d'octroi statutaire (6 mois après avoir rejoint l'entreprise). J'utilise les méthodes ".month" et ".mday" pour extraire les numéros de mois et de jour et les stocker dans des variables. Pour l'année, nous préparons la date du jour avec "Date.today" et exécutons la méthode ".year" pour extraire le numéro de l'année. Enfin, combinez les trois nombres avec "Time.local" pour compléter la date de subvention la plus récente (grant_date_this_year).

Article référencé "[Introduction à Ruby] 14. Gestion des dates et heures (couvrant tous les modèles)" @prgseek

Ensuite, en ce qui concerne la déclaration IF, l'année est traitée selon les conditions permettant de déterminer la dernière date d'octroi la plus récente. La condition est de savoir si la date d'octroi la plus récente (Grant_date_this_year) créée plus tôt est supérieure à la date actuelle. La raison en est que si la date d'octroi statutaire est décembre, le résultat de la dernière date d'octroi statutaire sera le 1er décembre 2020, qui est une date future. Par conséquent, si la date d'attribution la plus récente une fois achevée est supérieure à la date actuelle, -1 est exécuté à partir de l'année et la dernière date d'attribution est recréée avec une nouvelle variable appelée "last_year". Après cela, il ne peut être déterminé à ce stade si cela est nécessaire. Je suis désolé.

スクリーンショット 2020-05-14 11.38.31.png

Dans la vue des résultats intermédiaires, la dernière date d'attribution de chaque employé est affichée dans la colonne des jours de digestion. Maître Shouta, qui a rejoint l'entreprise en avril, n'a pas besoin d'avoir une date ultérieure. C'était bon ~! !!

Revenons à la description du code. Recherchez created_at dans la plage allant de la dernière date d'octroi terminée dans la dernière phrase au présent et recherchez l'enregistrement requis.

L'article auquel j'ai fait référence "Comment écrire une recherche par plage de dates / heures simplement avec ActiveRecord" @ hachi8833

Résumer les résultats de la recherche

Puisque j'ai pu rechercher dans la plage spécifiée, je vais calculer le total en fonction de cela. Écrivez une autre méthode pour que le fichier modèle calcule le total. Puisque cette période est en cours de développement, nous avons décidé de calculer le nombre total de dates d'attribution en utilisant la même méthode. Comme mentionné ci-dessus, il existe une autre méthode pour calculer la date de la subvention totale, mais comme il existe d'autres méthodes qui doivent être mises en œuvre pour la date de la subvention totale, cette fois, nous laisserons la même chose pour la confirmation de la vue.

models/employee.rb


class Employee < ApplicationRecord
~ Omis ~
  def total_delete_day
    total_delete_day = range_to_add_or_delete.sum(:delete_day)
  end
  def total_add_day
    total_add_day = range_to_add_or_delete.sum(:add_day)
  end
  def calculate_remaining_days
    a = total_delete_day
    b = total_add_day
    b - a
  end
end

L'argument de la méthode ".sum" est le nom de la colonne pour laquelle vous souhaitez calculer le total. L'article auquel j'ai fait référence "Calculez la valeur totale des colonnes [Rails]!" @tomokichi_ruby

Ensuite, Calculate_remaining_days est défini pour calculer le nombre de jours restants. À l'origine, si le résultat de la soustraction du total de la date d'attribution et du total de la date de digestion est négatif, il doit être conditionnel pour qu'une erreur se produise, mais c'est aussi pour la confirmation de la vue et simplement soustrait.

Afficher le résultat total dans la vue

haml:branches/index.html.haml


.main
  =render 'branches/mainheader'
  .main__body
Cliquez sur "Nom" pour modifier les données des employés et supprimez-les à l'extrême droite.
    %table 
      %tr
~Omission~
        %th{id: "short"}
Nombre de jours accordés
        %th{id: "short"}
Jours de digestion
        %th{id: "short"}
Jours restants
        - @employees.each do |employee|
          %tr
~ Omis ~
            %th{id: "short"}
              = employee.total_add_day
            %th{id: "short"}
              = employee.total_delete_day
            %th{id: "short"}
              = employee.calculate_remaining_days
~ Omis ~

La méthode définie précédemment est reflétée dans "index.html.haml". Le résultat de la vue est le suivant. J'ai pu le calculer en toute sécurité. スクリーンショット 2020-05-14 11.51.20.png

La pile d'aujourd'hui

Je me suis habitué à publier des articles sur Qiita. J'ai l'impression qu'il y a beaucoup de phrases pour le contenu, mais si je pense que j'ai enquêté ou trébuché, et si cela aide le même débutant, le commentaire est-il stupide et poli? J'essaye de réfléchir. Cependant, il existe de nombreux articles qui sont rédigés de manière concise et peuvent être utilisés comme référence pour les débutants, tels que les articles auxquels j'ai fait référence, je voudrais donc être conscient de la concision. c'est tout.

Recommended Posts

[Journal de développement ⑪] Calculez le nombre total de jours passés entre la date d'octroi des vacances et le présent - à partir du nombre de jours restants
[Java] Je souhaite calculer la différence par rapport à la date
Programme pour trouver le nombre de jours par mois y compris hors-année
Comment trouver le nombre total de pages lors de la pagination en Java
Comment déterminer le nombre de parallèles
[Java] Calculer le jour à partir de la date (ne pas utiliser la classe Calendar)