0

PHP と Laravel 4 で Time Clock アプリケーションを構築しています。

私の上司は、私がデータベースに保存したタイム カード レコードのデータに基づいて、さまざまなレポートを取得および作成できることを求めています。

現在、私DateTimeはクロックインとクロックアウト、および両方の時間のタイムスタンプをデータベースに保存しています。

データベースにクエリを実行し、ユーザーのさまざまな支払い期間のレポートを作成できる必要があります。

たとえば、別のデータベース テーブルに、ユーザー ID 用のレコードと異なる支払い期間を持つレコードを格納します。したがって、開始日は月の 1 日で終了日は 15 日で、これが 1 支払期間 (約 2 週間) である可能性があります。これらのレコードを実際に保存する最良の方法はわかりません。

もう1つは、その月の16日から月末までです。そのため、1 か月の日数によって終了日が異なります。

ユーザーに対してこれらの支払い期間を定義する最善の方法がわかりません。月ごとに異なる数字になるので、1-15簡単に言うことはできません。16-3030

これがどのように行われるかについての洞察をいただければ幸いです。

したがって、すべてのユーザーが 2 週間ごとに支払いを受けるわけではないため、任意のレポートを作成できPay Periodsます。ユーザーごとに定義できるように柔軟にする必要があります。

この質問は、実際のコードではなくロジックに関するものです。

4

2 に答える 2

4

時間と出席の​​すばらしい世界へようこそ。あなたは氷山の一角に触れています。事前にパッケージ化された製品を購入する方が、独自に作成するよりも簡単な場合があります。

とはいえ、次の一般的なアドバイスを提供できます。

  • PHP と MySQL の両方で、データ型とその使用方法に十分注意してください

  • 現地時間と UTC、タイム ゾーン、および夏時間を理解していることを確認する必要があります。一般に、UTC からのオフセットも保存しない限り、現地時間を保存する必要はありません。そうしないと、夏時間の変更についてあいまいになります。これは、対処するタイム ゾーンが 1 つしかない場合でも重要です。

  • 支払い期間に関しては、一般的なタイプは次のとおりです。

    • 毎週
    • 隔週
    • 半月ごと
    • 毎月
    • Yから始まるX日ごと

  • 一部のシステムでは、個々の支払い期間を通常の日付から +/- の日数で調整できます。その際、境界期間も調整して補正する必要があります。

  • 特定の日時を指定して、支払い期間の開始日と終了日を計算できるビジネス ロジックから始める必要があります。その後、それを拡張して、前または次の支払い期間を簡単に取得できます。

  • 各支払い期間を独自のテーブルに保存できますが、必ずしも必要ではありません。それは、システムの内部に関する多くの詳細に依存します。

  • 支払期間は日付によって定義されるため、「今日は誰の日?」という情報が得られます。問題。会社によって定義された日である場合もあれば、従業員が異なるタイム ゾーンにいる場合は、「論理的な日」である場合もあります。対処するタイムゾーンが 1 つしかない場合は、この点で幸運です。

  • 支給期間と比較する場合は、半開区間を使用して[start, end)ください。言い換えると:

    periodStart <= punchTime < periodEnd
    

    または同様に

    periodStart <= punchTime && periodEnd > punchTime
    

    1 つのピリオドの終わりは、次のピリオドの開始とまったく同じでなければなりません。23:59:59.999 のようなばかげた値で期間の終わりを定義しようとしないでください...

ご覧のとおり、これは始まりにすぎません。これがお役に立てば幸いです。質問の焦点をさらに絞り込むことができれば、喜んでお手伝いさせていただきます。そうでなければ、在庫を保管する構造がわからないときに、ERP システムを構築する方法を尋ねるようなものです。

于 2013-09-03T23:45:49.283 に答える
1

あなたはこれを考えすぎていると思います。ユーザーが開始日と終了日を定義できるようにします。

ユーザーのタイムスタンプ (タイムインとタイムアウト) である UserId が必要です。

私はこのようなものを描いています:

UserId | DateIn | DateOut

ページにドロップダウンを配置し (または、気の利いたインターフェイスが必要な場合は JavaScript を使用する日付ピッカー)、マネージャーが選択したい開始日と終了日を選択できるようにします。

したがって、1 月 1 日から 2 月 31 日までの従業員の勤務時間を確認したい場合は、それらを開始日と終了日として選択できます。

これにより、管理者は開始日として 2 月 16 日、終了日として 2 月 29 日を選択できるなど、非常に柔軟に対応できます。彼がデータ要件を選択できるようにして、必要なものを表示できるようにすることは理にかなっています。

編集:

この投稿の下にある私のコメントの例では、次のようなことができます。

$startDate = new DateTime();
$startDate->modify('first day of this month'); //or 16th for second part of bi-monthly
$startDate->format(#some date formatting as you need#);

$endDate = new DateTime();
$endDate->modify('last day of this month'); //or 15th for first part of bi-monthly
$endDate->format(#some date formatting as you need#);

ただし、物事がさらに定義されていない場合は、いつでも特別な計算を試すことができます. date('t') は、1 か月の日数を示します。6日ごとに支払われるなど、給与日が固定されていない限り、これを使用することは控えます。

一般に、date() 関数を使用するよりも、PHP の DateTime クラスの機能を活用します。http://php.net/manual/en/class.datetime.php

于 2013-09-03T17:14:26.650 に答える