diff --git a/adapters/AdapterInterface.php b/adapters/AdapterInterface.php index 5de6a5c..0371436 100644 --- a/adapters/AdapterInterface.php +++ b/adapters/AdapterInterface.php @@ -161,7 +161,7 @@ interface AdapterInterface /** * Method called to verify phone status * - * @return string : Return one phone status among 'available', 'unavailable', 'no_credit' + * @return string : Return one phone status among 'available', 'unavailable', 'no_credit', 'limit_reached' */ public function check_phone_status(): string; diff --git a/controllers/publics/Api.php b/controllers/publics/Api.php index c2e0636..57a4b44 100644 --- a/controllers/publics/Api.php +++ b/controllers/publics/Api.php @@ -1030,10 +1030,37 @@ namespace controllers\publics; return $this->json($return); } - //Check adapter is working correctly with thoses names and data - $adapter_classname = $phone['adapter']; - $adapter_instance = new $adapter_classname($phone['adapter_data']); - $new_status = $adapter_instance->check_phone_status(); + // If user have activated phone limits, check if RaspiSMS phone limit have already been reached + $limit_reached = false; + if ((int) ($this->user['settings']['phone_limit'] ?? false)) + { + $limits = $this->internal_phone->get_limits($id); + + $remaining_volume = PHP_INT_MAX; + foreach ($limits as $limit) + { + $startpoint = new \DateTime($limit['startpoint']); + $consumed = $this->internal_sended->count_since_for_phone_and_user($this->user['id'], $id, $startpoint); + $remaining_volume = min(($limit['volume'] - $consumed), $remaining_volume); + } + + if ($remaining_volume < 1) + { + $limit_reached = true; + } + } + + if ($limit_reached) + { + $new_status = \models\Phone::STATUS_LIMIT_REACHED; + } + else + { + //Check status on provider side + $adapter_classname = $phone['adapter']; + $adapter_instance = new $adapter_classname($phone['adapter_data']); + $new_status = $adapter_instance->check_phone_status(); + } $status_update = $this->internal_phone->update_status($id, $new_status); $return['response'] = $new_status; diff --git a/controllers/publics/Phone.php b/controllers/publics/Phone.php index 3ce81e0..ef06f7b 100644 --- a/controllers/publics/Phone.php +++ b/controllers/publics/Phone.php @@ -18,11 +18,13 @@ class Phone extends \descartes\Controller { private $internal_phone; private $internal_adapter; + private $internal_sended; public function __construct() { $bdd = \descartes\Model::_connect(DATABASE_HOST, DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD); $this->internal_phone = new \controllers\internals\Phone($bdd); + $this->internal_sended = new \controllers\internals\Sended($bdd); $this->internal_adapter = new \controllers\internals\Adapter(); \controllers\internals\Tool::verifyconnect(); @@ -533,16 +535,43 @@ class Phone extends \descartes\Controller foreach ($ids as $id) { $phone = $this->internal_phone->get_for_user($id_user, $id); - - //Check adapter is working correctly with thoses names and data - $adapter_classname = $phone['adapter']; - if (!call_user_func([$adapter_classname, 'meta_support_phone_status'])) + + // If user have activated phone limits, check if RaspiSMS phone limit have already been reached + $limit_reached = false; + if ((int) ($_SESSION['user']['settings']['phone_limit'] ?? false)) { - continue; + $limits = $this->internal_phone->get_limits($id); + + $remaining_volume = PHP_INT_MAX; + foreach ($limits as $limit) + { + $startpoint = new \DateTime($limit['startpoint']); + $consumed = $this->internal_sended->count_since_for_phone_and_user($_SESSION['user']['id'], $id, $startpoint); + $remaining_volume = min(($limit['volume'] - $consumed), $remaining_volume); + } + + if ($remaining_volume < 1) + { + $limit_reached = true; + } } - $adapter_instance = new $adapter_classname($phone['adapter_data']); - $new_status = $adapter_instance->check_phone_status(); + if ($limit_reached) + { + $new_status = \models\Phone::STATUS_LIMIT_REACHED; + } + else + { + //Check status on provider side + $adapter_classname = $phone['adapter']; + if (!call_user_func([$adapter_classname, 'meta_support_phone_status'])) + { + continue; + } + + $adapter_instance = new $adapter_classname($phone['adapter_data']); + $new_status = $adapter_instance->check_phone_status(); + } $status_update = $this->internal_phone->update_status($id, $new_status); } diff --git a/db/migrations/20230317144204_add_reached_limit_phone_status.php b/db/migrations/20230317144204_add_reached_limit_phone_status.php new file mode 100644 index 0000000..18f43b4 --- /dev/null +++ b/db/migrations/20230317144204_add_reached_limit_phone_status.php @@ -0,0 +1,38 @@ +table('phone'); + $table->changeColumn('status', 'enum', ['values' => ['available', 'unavailable', 'no_credit', 'limit_reached'], 'default' => 'available']); + $table->save(); + } +} diff --git a/models/Phone.php b/models/Phone.php index 41fde4d..6be3735 100644 --- a/models/Phone.php +++ b/models/Phone.php @@ -17,6 +17,7 @@ namespace models; const STATUS_AVAILABLE = 'available'; const STATUS_UNAVAILABLE = 'unavailable'; const STATUS_NO_CREDIT = 'no_credit'; + const STATUS_LIMIT_REACHED = 'limit_reached'; /** * Return all phones that belongs to active users diff --git a/templates/phone/list.php b/templates/phone/list.php index d0b192d..20aa0e9 100644 --- a/templates/phone/list.php +++ b/templates/phone/list.php @@ -112,6 +112,10 @@ jQuery(document).ready(function () case 'no_credit': html += ' - Plus de crédit' break; + + case 'limit_reached': + html += ' - Limite RaspiSMS atteinte' + break; } return html