0

我正在使用 PHP 和 Laravel 4 构建一个时钟应用程序。

我的老板要求他能够根据我存储在数据库中的数据来提取和构建不同的报告,以作为考勤卡记录。

现在,我存储了一个DateTime用于打卡和打卡的时钟以及这些时间的时间戳以及数据库。

我需要能够为用户查询数据库并为不同的支付周期构建报告。

因此,例如,我将存储在另一个数据库表中,记录将用于用户 ID 并且将具有不同的支付周期。因此,开始日可能是本月的 1 日,结束日可能是 15 日,这是 1 个支付期(大约 2 周),我不确定存储这些记录的最佳方式。

另一个将是本月 16 日到月底。所以结束日期会根据一个月的天数而有所不同

我不确定为用户定义这些支付期的最佳方式。我不能简单地说1-15,然后16-30因为30每个月都会有不同的数字。

希望了解如何做到这一点?

所以我可以为任何人构建报告,Pay Periods因为不是每个用户每 2 周获得一次报酬,所以它需要灵活,以便我可以在每个用户的基础上定义它

这个问题更多的是关于逻辑而不是实际代码。

4

2 回答 2

4

欢迎来到时间和出勤的美妙世界。你正在触及冰山一角。您可能会发现购买预包装产品可能比编写自己的产品更容易。

也就是说,我可以为您提供以下一般性建议:

  • 在 PHP 和 MySQL 中要非常小心您的数据类型以及它们的使用方式。

  • 您需要确保了解本地时间与 UTC、时区和夏令时。通常,您不希望存储本地时间,除非您还存储其与 UTC 的偏移量。否则,您将对夏令时更改产生歧义。即使您只有一个时区要处理,这一点也很重要。

  • 当谈到支付期时,常见的类型是:

    • 每周
    • 双周刊
    • 半月刊
    • 月刊
    • 从 Y 开始每 X 天

  • 在某些系统中,每个单独的支付期都可以从其正常日期起调整 +/- 天数。这样做时,还必须调整边界期以进行补偿。

  • 您应该从可以计算给定任何特定日期和时间的支付期的开始和结束日期的业务逻辑开始。然后,您可以扩展它以轻松获取上一个或下一个付款期。

  • 可以将每个支付期存储到它自己的表中,但这不是必需的。这将取决于您系统内部的许多细节。

  • 因为支付周期是由日期定义的,所以您有“今天是谁的日子?” 问题。这可能是公司定义的日子,或者如果员工在不同的时区,那么它可能是“合乎逻辑的日子”。如果你只有一个时区要处理,那么在这方面你是幸运的。

  • 与支付期进行比较时,使用半开区间,[start, end)。换句话说:

    periodStart <= punchTime < periodEnd
    

    或同样

    periodStart <= punchTime && periodEnd > punchTime
    

    一个时期的结束应该与下一个时期的开始完全相同。不要试图用一些愚蠢的值来定义周期的结束,比如 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') 会给你一个月的天数。除非您的发薪日是固定的,例如每 6 天支付一次,否则我不会使用它。

一般来说,我会利用 PHP DateTime 类的强大功能而不是使用 date() 函数。http://php.net/manual/en/class.datetime.php

于 2013-09-03T17:14:26.650 回答