タイムカードを作成しております。
現在、打刻する仕組みや、検索する仕組み、表示、修正、削除といった仕組みに関してはなんとか形になってきております。
最後に、集計といいますか、一ヶ月分の実働の合計を出す仕組みを探しております。
PHP
1// 少し、回答者様からすると、無駄の多いコードになっているかもしれませんが、ご容赦ください。。。。 2 3// 基本的に、年月と名前を選択して、検索します。 4// 結果としては、○○年○○月の○○さんのデータという形になります。 5// 並びは昇順です。 6 7// DB接続 SELECT実行 8省略いたします 9$stmt->execute(); 10 11while ($row = $stmt->fetch()) : 12$data = []; 13$jitsudo = 0; 14// datetimeを分解 15$datetime = $row['period_dttm']; 16list($year, $month, $day, $hour, $minutes, $second) = preg_split('/[-: ]/', $datetime); 17 18// 丸め処理 19$minutes = round($minutes / 5) * 5; 20$time = mktime($hour, $minutes, 0, 1, 1, 2000); 21$minutes = date('i', $time); 22$hour = date('H', $time); 23 24// 実働計算 25if ($year != $data['year'] || $month != $data['month'] || $day = $data['day']) { 26$jitsudo = ($data['退勤'] - $data['出勤']) - ($data['休戻'] - $data['休入']) - ($data['待戻'] - $data['待入']); 27$data = []; 28} 29$data['year'] = $year; 30$data['month'] = $month; 31$data['day'] = $day; 32$data[$row['dakoku']] = $time; 33 34if ($jitsudo) : 35// 実働を時間表示 36$jitsudo = date('H:i', strtotime('-1 hours', $jitsudo)); 37?> 38 39// table表示 40<tr> 41<td colspan="4">実働 :<?= $jitsudo; ?></td> 42</tr> 43<tr> 44<td><?= h($row['name']); ?></td> 45<td><?= h($row['dakoku']); ?></td> 46<td><?= h($month) . '/' . h($day); ?></td> 47<td><?= h($hour) . ':' . h($minutes); ?></td> 48</tr> 49<?php endwhile; 50$jitsudo = ($data['退勤'] - $data['出勤']) - ($data['休戻'] - $data['休入']) - ($data['待戻'] - $data['待入']); 51$jitsudo = date('H:i', strtotime('-1 hours', $jitsudo)); 52<tr> 53<td colspan="4">実働 :<?= $jitsudo; ?></td> 54</tr>
こちらで教えていただきながら、一応このように書きました。
表示に関しては特に問題もなく、「一日分の実働」がその日の終わりのとこに表示されます。
ここから質問となります。
1.「一日分の実働」の一ヶ月分の合計を出したい。
$jitsudoをなんとか足して足してでいきたいのですが、そのロジックがわかりません。
2.これは、難しければいいのですが、、、
待機の条件に
○待戻 - 待入 = 30分未満だったら、計算しない又は0
を追加できますか?
例えば
○○さんのデータで、
出勤 9:00
休入 12:00
休戻 13:00
退勤 18:00
=実働 8:00
出勤 9:00
待入 10:00
待戻 11:00
休入 12:00
休戻 13:00
退勤 18:00
=実働 7:00
出勤 9:00
待入 10:00
待戻 10:20→30分未満なので0とする
休入 12:00
休戻 13:00
退勤 18:00
=実働 8:00
出勤 9:00
待入 10:00
待戻 10:20→30分未満なので0とする
休入 12:00
休戻 13:00
待入 15:00
待戻 15:30→30分以上なので計算する
退勤 18:00
=実働 7:30
// 1.の質問内容
合計実働 = 30:30
難しい内容かもしれませんが、どうかアドバイスいただけますでしょうか?
よろしくお願い致します。
[追記]
本当に理解力が乏しく、、、いろいろやってみているのですが、結局うまくいかず、、、こちらに追記させてください。。。
PHP
1$data = []; // $dataっていう配列の初期化 2$jitsudo = 0; // $jitsudoの初期値? 3if ($day = @data['day'] && $data) { // もしも、$dayがdata['day']と$dataだったら 4$jitsudo = 計算 // $jitsudoに計算式を入れる。 5$data = []; // 配列の初期化 6} 7 8$data['year'] = $year; 9$data['month'] = $month; 10$data['day'] = $day; 11$data[$row['dakoku']] = $time; // dakokuにmktimeした$timeを? 12 13if ($jitsudo) : // もし$jitsudoがあったら 14?> 15<tr> 16<td colspan="4">実働:<?= $jitsudo; ?></td> // 実働表示 17</tr> 18<?php 19$jitsudo = 0; 20endif; 21?> 22<tr> 23<td><?= h($row['name']); ?></td> // 名前表示 24<td><?= h($row['dakoku']); ?></td> // 打刻の種別 25<td><?= h($month) . '/' . h($day); ?></td> // 月/日 26<td><?= h($hour) . ':' . h($minutes); ?></td> // 時:分 27</tr> 28<?php 29endwhile; 30$jitsudo = 計算 31?> 32<tr> 33<td colspan="4">実働:<?= $jitsudo; ?></td> // 実働表示 34</tr> 35<?php 36$jitsudo = 0; 37endif; 38?>
流れとして
while内に計算と表示があって、while抜けてから最後の計算って流れなんですが、
while内では無いようにしたりとかしたり、してみたのですが、、、
どうなっているのか、よくわからなくなってしまい、、、、
手が詰まりました。。。。
待機のことなどは、特にあれば良いななので、ここでは実働の表示だけで大丈夫です。
レベルが低く申し訳ありません。。。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/22 06:25
2016/03/22 06:30
2016/03/22 06:35
2016/03/22 06:42 編集
2016/03/22 06:44
2016/03/22 06:44