En regardant la table des équipes que j'utilise actuellement, j'ai vérifié si c'était nécessaire car il y avait des heures de travail quotidiennes, et lorsque l'administrateur la créait, j'ai entendu qu'un temps total était nécessaire, j'ai donc changé le champ total Je vais l'ajouter.
Pensez à avoir des heures de travail et des heures supplémentaires. Il est possible de répondre en entrant un temps négatif lorsque le temps de passage est inférieur au temps de passage en tirant tôt ou tard ...
Pensons aux mérites de l'avoir séparément.
・ Il n'est plus nécessaire d'avoir du temps de travail sur le terrain. ・ Il semble que nous pouvons gérer les plus et les moins ... ・ Lors de la copie le mois suivant, vous pouvez copier sauf pour les heures supplémentaires. ・ Heures supplémentaires faciles
Eh bien, j'ai l'impression qu'il n'y a pas de succès décisif.
Si vous l'avez simplement ・ Le traitement des calculs est requis lors de la copie le mois suivant ・ Les heures supplémentaires en retard sont faciles à comprendre car elles corrigent directement les heures de travail ・ Le calcul des heures supplémentaires nécessite un traitement de calcul
J'ai décidé qu'il n'y avait pas beaucoup de mérite à avoir.
Ajouter un champ au modèle
python:schesule.models.py
from django.db import models
from shisetsu.models import *
from accounts.models import *
from django.contrib.auth.models import User
from django.core.validators import MaxValueValidator,MinValueValidator
# Create your models here.
class Shift(models.Model):
id = models.AutoField(verbose_name='Identifiant d'équipe',primary_key=True)
name = models.CharField(verbose_name='Nom de l'équipe', max_length=1)
start_time = models.TimeField(verbose_name="Heure de début")
end_time = models.TimeField(verbose_name="heure de fin")
wrok_time = models.IntegerField(verbose_name='Heures d'ouverture')
def __str__(self):
return self.name
class Schedule(models.Model):
id = models.AutoField(verbose_name='ID de planification',primary_key=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Nom de l'employé')
date = models.DateField(verbose_name='Date')
year = models.PositiveIntegerField(validators=[MinValueValidator(1),])
month = models.PositiveIntegerField(validators=[MaxValueValidator(12),MinValueValidator(1),])
shift_name_1 = models.ForeignKey(Shift, verbose_name='1 nom d'équipe', related_name='shift_name1',on_delete=models.SET_NULL,null= True)
shisetsu_name_1 = models.ForeignKey(Shisetsu, verbose_name='1 établissement', related_name='shisetsu_name1',on_delete=models.SET_NULL,blank=True, null=True)
shift_name_2 = models.ForeignKey(Shift, verbose_name='2 nom d'équipe', related_name='shift_name2',on_delete=models.SET_NULL,blank=True, null=True)
shisetsu_name_2 = models.ForeignKey(Shisetsu, verbose_name='2 installations', related_name='shisetsu_name2',on_delete=models.SET_NULL,blank=True, null=True)
shift_name_3 = models.ForeignKey(Shift, verbose_name='3 nom d'équipe', related_name='shift_name3',on_delete=models.SET_NULL,blank=True, null=True)
shisetsu_name_3 = models.ForeignKey(Shisetsu, verbose_name='3 installations', related_name='shisetsu_name3',on_delete=models.SET_NULL,blank=True, null=True)
shift_name_4 = models.ForeignKey(Shift, verbose_name='4 nom d'équipe', related_name='shift_name4',on_delete=models.SET_NULL,blank=True, null=True)
shisetsu_name_4 = models.ForeignKey(Shisetsu, verbose_name='4 établissements', related_name='shisetsu_name4',on_delete=models.SET_NULL,blank=True, null=True)
day_total_worktime = models.IntegerField(verbose_name='Heures de travail quotidiennes', default=0)) ###ajouter à
Maintenant que nous avons ajouté les champs, nous allons migrer
terminal
python3 manage.py makemigrations
python3 manage.py migrate
Ceci complète le champ! Nous le modifierons pour que l'heure soit affichée à partir d'ici. Je veux y aller sans problème, mais j'ai l'impression qu'il se passe quelque chose (rires)
Tout d'abord, j'ai mis au défi de régler l'heure tous les jours. Je comprends à peine le HTML, donc je peux me battre et l'afficher pendant 2 à 3 heures.
Le code est ici.
schedule/month.html
{% extends 'schedule/base.html' %}
{% block header %}
{% endblock header %}
{% block content %}
<table class="table table-striped table-bordered">
<thead>
<tr align="center" class="info"> <!--Date-->
<th rowspan="2"></th>
{% for item in calender_object %}
<th class="day_{{ item.date }}">{{ item.date | date:"d" }}</th>
{% endfor %}
<tr align="center" class="info"> <!--journée-->
{% for item in youbi_object %}
<th class="day_{{ item.date }}">{{ item }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for staff in user_list %}
<tr align="center">
<th rowspan="2" class="staff_name" staff_id="{{ staff.staff_id }}" width="200" >{{ staff.last_name }} {{ staff.first_name }}</th> <!--staff_Élément id utilisé dans js-->
{% for item in object_list %}
{% if item.user|stringformat:"s" == staff.username|stringformat:"s" %}<!--Si le nom d'utilisateur est le même-->
<td class="day" id="s{{ staff.id }}d{{ item.date }}">
{% if item.shift_name_1 != None %}
{% if item.shift_name_1|stringformat:"s" == "Oui" or item.shift_name_1|stringformat:"s" == "Fermé" %}
{{ item.shift_name_1 }}
{% else %}
{% for shisetsu in shisetsu_object %}
{% if item.shisetsu_name_1|stringformat:"s" == shisetsu.name|stringformat:"s" %}
<span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_1 }}</span>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% if item.shift_name_2 != None %}
{% if item.shift_name_2|stringformat:"s" == "Oui" or item.shift_name_2|stringformat:"s" == "Fermé" %}
{{ item.shift_name_2 }}
{% else %}
{% for shisetsu in shisetsu_object %}
{% if item.shisetsu_name_2|stringformat:"s" == shisetsu.name|stringformat:"s" %}
<span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_2 }}</span>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% if item.shift_name_3 != None %}
{% if item.shift_name_3|stringformat:"s" == "Oui" or item.shift_name_3|stringformat:"s" == "Fermé" %}
{{ item.shift_name_3 }}
{% else %}
{% for shisetsu in shisetsu_object %}
{% if item.shisetsu_name_3|stringformat:"s" == shisetsu.name|stringformat:"s" %}
<span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_3 }}</span>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% if item.shift_name_4 != None %}
{% if item.shift_name_4|stringformat:"s" == "Oui" or item.shift_name_4|stringformat:"s" == "Fermé" %}
{{ item.shift_name_4 }}
{% else %}
{% for shisetsu in shisetsu_object %}
{% if item.shisetsu_name_4|stringformat:"s" == shisetsu.name|stringformat:"s" %}
<span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_4 }}</span>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
</td>
<tr align="center">
{% for item in object_list %}
{% if item.user|stringformat:"s" == staff.username|stringformat:"s" %}<!--Si le nom d'utilisateur est le même-->
<td class="day" id="s{{ staff.id }}d{{ item.date }}">
{{ item.day_total_worktime }}
</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
{% endblock content %}
De là, je vais mettre le total de la journée. Quand je l'ai recherché, il a été dit que django avait une fonction pour agréger le total. J'ai vérifié la fonction d'annotation et l'ai ajoutée aux vues
schedule/views.py
#Ajoute ça
from django.db.models import Sum
from django.contrib.auth.models import User
#Mettez le temps total du mois pour chaque utilisateur dans le type de dictionnaire
month_total = Schedule.objects.select_related('User').filter(year = year, month = month).values("user").order_by("user").annotate(month_total_worktime = Sum("day_total_worktime"))
context = {
'month_total': month_total,
}
return render(request,'schedule/month.html', {
'month_total' : month_total,
}, )
Passez-le au modèle html et modifiez le html pour l'afficher en html
schedule/month.py
{% extends 'schedule/base.html' %}
{% block header %}
{% endblock header %}
{% block content %}
<table class="table table-striped table-bordered">
<thead>
<tr align="center" class="info"> <!--Date-->
<th rowspan="2"></th>
{% for item in calender_object %}
<th class="day_{{ item.date }}">{{ item.date | date:"d" }}</th>
{% endfor %}
<tr align="center" class="info"> <!--journée-->
{% for item in youbi_object %}
<th class="day_{{ item.date }}">{{ item }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for staff in user_list %}
<tr align="center">
<th rowspan="1" class="staff_name" staff_id="{{ staff.staff_id }}" width="200" >{{ staff.last_name }} {{ staff.first_name }}</th> <!--staff_Élément id utilisé dans js-->
{% for item in object_list %}
{% if item.user|stringformat:"s" == staff.username|stringformat:"s" %}<!--Si le nom d'utilisateur est le même-->
<td class="day" id="s{{ staff.id }}d{{ item.date }}">
{% if item.shift_name_1 != None %}
{% if item.shift_name_1|stringformat:"s" == "Oui" or item.shift_name_1|stringformat:"s" == "Fermé" %}
{{ item.shift_name_1 }}
{% else %}
{% for shisetsu in shisetsu_object %}
{% if item.shisetsu_name_1|stringformat:"s" == shisetsu.name|stringformat:"s" %}
<span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_1 }}</span>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% if item.shift_name_2 != None %}
{% if item.shift_name_2|stringformat:"s" == "Oui" or item.shift_name_2|stringformat:"s" == "Fermé" %}
{{ item.shift_name_2 }}
{% else %}
{% for shisetsu in shisetsu_object %}
{% if item.shisetsu_name_2|stringformat:"s" == shisetsu.name|stringformat:"s" %}
<span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_2 }}</span>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% if item.shift_name_3 != None %}
{% if item.shift_name_3|stringformat:"s" == "Oui" or item.shift_name_3|stringformat:"s" == "Fermé" %}
{{ item.shift_name_3 }}
{% else %}
{% for shisetsu in shisetsu_object %}
{% if item.shisetsu_name_3|stringformat:"s" == shisetsu.name|stringformat:"s" %}
<span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_3 }}</span>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% if item.shift_name_4 != None %}
{% if item.shift_name_4|stringformat:"s" == "Oui" or item.shift_name_4|stringformat:"s" == "Fermé" %}
{{ item.shift_name_4 }}
{% else %}
{% for shisetsu in shisetsu_object %}
{% if item.shisetsu_name_4|stringformat:"s" == shisetsu.name|stringformat:"s" %}
<span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_4 }}</span>
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
</td>
<tr align="center">
{% for month in month_total %}
{% if month.user == staff.id %}<!--Si le nom d'utilisateur est le même-->
<td><b>{{ month.month_total_worktime }}</b></td>
{% endif %}
{% endfor %}
{% for item in object_list %}
{% if item.user|stringformat:"s" == staff.username|stringformat:"s" %}<!--Si le nom d'utilisateur est le même-->
<td class="day" id="s{{ staff.id }}d{{ item.date }}">
{{ item.day_total_worktime }}
</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
{% endblock content %}
html a été fait après avoir combattu pendant 1-2 heures!
Cliquez ici pour les résultats
Non, ça fait du bien! Je pense qu'il est nécessaire de passer à une ligne épaisse et de faire des ajustements fins pour chaque membre du personnel, mais c'est super que ce à quoi je pensais devienne une forme!