簡體   English   中英

在PHP和MySQL中確定和存儲時鍾的支付周期的最佳方法

[英]Best way to determine and store Pay Periods for a time clock in PHP and MySQL

我正在使用PHP和Laravel 4構建Time Clock應用程序。

我的老板要求他能夠基於我存儲在數據庫中的數據來提取和構建不同的報告,以記錄考勤卡。

現在,我存儲一個DateTime用於時鍾的進出,以及這兩個時間的Timestamp以及到數據庫中。

我需要能夠查詢數據庫並為用戶建立不同付款周期的報告。

因此,例如,我將存儲在另一個數據庫表中,這些記錄將用於一個用戶ID,並具有不同的付款期限。 因此,開始日期可能是該月的1號,結束日期是15號,也就是1個付款期(大約2個星期),我不確定真的是存儲這些記錄的最佳方法。

另一個將是每月的16號到月底。 因此,結束日期會有所不同,具體取決於一個月中有多少天

我不確定為用戶定義這些付款期限的最佳方法。 我不能簡單地說1-15 ,然后再說16-30因為每個月30會有所不同。

希望對如何做到這一點有任何見解?

因此,我可以針對任何“ Pay Periods期限”構建報告,因為並非每個用戶每2周都會收到一次付款,因此它需要靈活一些,以便我可以針對每個用戶定義報告

這個問題更多地是關於邏輯而不是實際的代碼。

歡迎來到美好的時間和出勤世界。 您正在觸摸冰山一角。 您可能會發現購買預包裝產品可能比編寫自己的產品容易。

也就是說,我可以為您提供以下一般建議:

  • 非常小心,你的數據類型以及如何使用它們,無論是在PHP和MySQL中。

  • 您需要確保您了解本地時間與UTC,時區和夏時制。 通常,除非您還存儲其與UTC的偏移量,否則您不希望存儲本地時間。 否則,您將對夏令時更改有歧義。 即使您只有一個時區要處理,這也很重要。

  • 當涉及“付款期限”時,常見的類型有:

    • 每周
    • 雙周
    • 半月刊
    • 每月一次
    • 從Y開始的每X天

  • 在某些系統中,每個單獨的付款期限可以從正常日期起+/-天數進行調整。 這樣做時,還必須調整邊界周期以進行補償。

  • 您應該從業務邏輯開始,該邏輯可以在給定任何特定日期和時間的情況下計算支付期的開始和結束日期。 然后,您可以擴展它以輕松獲得上一個或下一個支付期。

  • 可以將每個支付期存儲在其自己的表中,但這不是必需的。 這將取決於系統內部的許多細節。

  • 因為工資期是由日期定義的,所以您具有“今天是哪一天?” 問題。 可能是公司定義的日期,或者如果員工位於不同的時區,則可能是“邏輯日”。 如果您只有一個時區需要處理,那么您在這方面很幸運。

  • 與支付期進行比較時,請使用半開放時間間隔[start, end) 換一種說法:

     periodStart <= punchTime < periodEnd 

    或同樣

     periodStart <= punchTime && periodEnd > punchTime 

    一個周期的結束應與下一個周期的開始完全相同 不要試圖以一些愚蠢的值來定義周期的結束時間,例如23:59:59.999 ...

如您所見,這僅僅是開始。 我希望這對您有用。 如果您可以進一步縮小問題的重點,我們將很樂意為您提供更多幫助。 否則,這就像在不確定要存儲庫存的結構時詢問如何構建ERP系統。

我認為您已經考慮過了。 讓用戶定義開始和結束日期。

您將需要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')將為您提供一個月中的天數。 除非您的發薪日是固定的,例如每6天支付一次,否則我將避免使用此功能。

通常,我會利用date()函數來利用PHP DateTime類的功能。 http://php.net/manual/en/class.datetime.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM