roomify/bat

预订和可用性管理库

1.4.0 2020-08-25 16:07 UTC

README

Software License Build Status Quality Score Total Downloads

BAT代表预订和可用性管理工具。

它是Roomify.us团队创建的一套工具,旨在提供一个基础框架,通过该框架可以解决各种可用性管理、预订和预订用例。BAT将与各种CMS和PHP框架协同工作,其中第一个是Drupal(查看我们的Drupal模块)。

BAT建立在我们的Rooms经验之上,该模块专门处理租赁用例的预订问题(如度假租赁、酒店、B&B等)。有了BAT,我们吸收了所有学到的经验,并构建了一个系统,可以让你构建类似于Rooms的应用程序——或者是餐厅餐桌预订、会议室预订、与朋友分享电动工具、预订活动……等等。

BAT本身是一个预订和可用性管理框架——类似于Drupal是一个内容管理框架或Drupal Commerce是一个电子商务框架。我们的目标是基于BAT构建特定解决方案,以解决特定应用领域。

基本概念

单元

单元是可以预订的事物。对于BAT来说,它们只是一个id、一个默认状态(针对给定的事件类型——我们稍后会讨论)以及可以定义约束。约束是关于特定单元是否可用的额外规则(我们稍后会再次讨论)。

对于每个应用程序,单元将代表具体的事物,例如酒店房间、汽车、餐桌等。

事件

事件定义了单元在给定时间段内的值。可以有多个事件类型,事件的值加上事件类型将在应用程序中提供一些意义。

例如,一组事件可以表示“可用性”,而另一组表示“价格”。可用性类型事件的值将指示单元是否可用(1)、不可用(0)或已预订(2),即它们指示单元的状态。价格类型事件的值可以表示将单元状态从可用变为预订的给定时间段的每晚费用。因此,要使单元1在给定的几天内从可用变为预订,您可以检索该时间段的所有定价事件,并乘以该事件的值所关联的夜晚数。

日历

日历允许我们检索给定一组单元的给定类型的事件,以及搜索单元以查看哪些单元匹配特定的事件值。

例如,您可以使用日历来查找所有从2016年1月1日到2016年1月15日只有可用性事件值为2的单元——根据我们上面的定义——这表示已预订的单元。

CalendarResponse

使用日历进行搜索将返回一个CalendarResponse——这将指示在搜索中涉及的每个单元是否是包含单元或排除单元,以及它最终进入一个或另一个集合的原因。这允许我们的应用程序思考为什么某些内容没有通过筛选,并将其显示给最终用户。

约束

当日历进行搜索时,它会在给定的时间范围内和一组有效值上进行搜索。我们可以在全局级别或单元级别进一步确定约束条件。例如,一个特定的单元可能表明只有在搜索范围从星期一开始或至少为7天时,它才会使自己可用。

日历响应将包含有关哪个约束条件将单元从包含集移动到排除集的信息。

估值器

估值器对事件值执行操作,以确定给定时间段内单元的价值,前提是给定特定的估值策略。对于酒店来说,最简单的情况是将每晚的成本相加。我们的应用程序可以定义多个估值器,并引用不同的事件类型,以适应各种估值策略。

存储

存储存储特定时间点的单元价值。存储细化到分钟粒度,这意味着我们的单元在每一分钟的时间点都可以有不同的价值。存储数据结构设计得可以快速确定给定时间范围内的单元价值,并快速更改它。

目前,我们支持SQLite存储(用于我们的测试)和DrupalStore。正在开发额外的存储支持。

安装

通过Composer

$ composer require Roomify/Bat

使用方法

创建一个ID为1的单元,默认值为1,并具有最小事件约束长度。

$constraint = new MinMaxDaysConstraint([], 5)

$unit = new Unit(1,1, array($constraint)); 

为可用性和定价类型的事件创建一个存储,为单元1创建一个事件并保存。

$state_store = new SqlLiteDBStore($this->pdo, 'availability_event', SqlDBStore::BAT_STATE);

$start_date = new \DateTime('2016-01-01 12:12');
$end_date = new \DateTime('2016-01-04 07:07');

$state_event = new Event($start_date, $end_date, $unit, 0); \\ Event value is 0 (i.e. unavailable)

$state_calendar = new Calendar(array($unit), $state_store);
$state_calendar->addEvents(array($state_event), Event::BAT_HOURLY); \\ BAT_HOURLY denotes granularity

然后我们可以搜索匹配的单元。在这种情况下,我们正在搜索从日期$s1到日期$s2的所有单元,这些单元的事件值仅为1(可用)。鉴于我们的单元在该期间的价值也为0,我们的日历将找不到任何匹配的单元。

$s1 = new \DateTime('2016-01-01 00:00');
$s2 = new \DateTime('2016-01-31 12:00');

$response = $state_calendar->getMatchingUnits($s1, $s2, array(1), array());

变更日志

有关最近更改的更多信息,请参阅变更日志

测试

$ composer test

贡献

有关详细信息,请参阅贡献指南

安全性

如果您发现任何与安全相关的问题,请通过电子邮件hello@roomify.us而不是使用问题跟踪器。

鸣谢

许可

MIT许可(MIT)。有关更多信息,请参阅许可文件