add status limit_reached to phone and check raspisms sms limit when updating phone status

This commit is contained in:
osaajani 2023-03-17 16:09:32 +01:00
parent b8ab352deb
commit e7a6c486ee
6 changed files with 111 additions and 12 deletions

View File

@ -161,7 +161,7 @@ interface AdapterInterface
/** /**
* Method called to verify phone status * 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; public function check_phone_status(): string;

View File

@ -1030,10 +1030,37 @@ namespace controllers\publics;
return $this->json($return); return $this->json($return);
} }
//Check adapter is working correctly with thoses names and data // If user have activated phone limits, check if RaspiSMS phone limit have already been reached
$adapter_classname = $phone['adapter']; $limit_reached = false;
$adapter_instance = new $adapter_classname($phone['adapter_data']); if ((int) ($this->user['settings']['phone_limit'] ?? false))
$new_status = $adapter_instance->check_phone_status(); {
$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); $status_update = $this->internal_phone->update_status($id, $new_status);
$return['response'] = $new_status; $return['response'] = $new_status;

View File

@ -18,11 +18,13 @@ class Phone extends \descartes\Controller
{ {
private $internal_phone; private $internal_phone;
private $internal_adapter; private $internal_adapter;
private $internal_sended;
public function __construct() public function __construct()
{ {
$bdd = \descartes\Model::_connect(DATABASE_HOST, DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD); $bdd = \descartes\Model::_connect(DATABASE_HOST, DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD);
$this->internal_phone = new \controllers\internals\Phone($bdd); $this->internal_phone = new \controllers\internals\Phone($bdd);
$this->internal_sended = new \controllers\internals\Sended($bdd);
$this->internal_adapter = new \controllers\internals\Adapter(); $this->internal_adapter = new \controllers\internals\Adapter();
\controllers\internals\Tool::verifyconnect(); \controllers\internals\Tool::verifyconnect();
@ -533,16 +535,43 @@ class Phone extends \descartes\Controller
foreach ($ids as $id) foreach ($ids as $id)
{ {
$phone = $this->internal_phone->get_for_user($id_user, $id); $phone = $this->internal_phone->get_for_user($id_user, $id);
//Check adapter is working correctly with thoses names and data // If user have activated phone limits, check if RaspiSMS phone limit have already been reached
$adapter_classname = $phone['adapter']; $limit_reached = false;
if (!call_user_func([$adapter_classname, 'meta_support_phone_status'])) 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']); if ($limit_reached)
$new_status = $adapter_instance->check_phone_status(); {
$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); $status_update = $this->internal_phone->update_status($id, $new_status);
} }

View File

@ -0,0 +1,38 @@
<?php
use Phinx\Migration\AbstractMigration;
class AddReachedLimitPhoneStatus extends AbstractMigration
{
/**
* Change Method.
*
* Write your reversible migrations using this method.
*
* More information on writing migrations is available here:
* https://book.cakephp.org/phinx/0/en/migrations.html
*
* The following commands can be used in this method and Phinx will
* automatically reverse them when rolling back:
*
* createTable
* renameTable
* addColumn
* addCustomColumn
* renameColumn
* addIndex
* addForeignKey
*
* Any other destructive changes will result in an error when trying to
* rollback the migration.
*
* Remember to call "create()" or "update()" and NOT "save()" when working
* with the Table class.
*/
public function change()
{
$table = $this->table('phone');
$table->changeColumn('status', 'enum', ['values' => ['available', 'unavailable', 'no_credit', 'limit_reached'], 'default' => 'available']);
$table->save();
}
}

View File

@ -17,6 +17,7 @@ namespace models;
const STATUS_AVAILABLE = 'available'; const STATUS_AVAILABLE = 'available';
const STATUS_UNAVAILABLE = 'unavailable'; const STATUS_UNAVAILABLE = 'unavailable';
const STATUS_NO_CREDIT = 'no_credit'; const STATUS_NO_CREDIT = 'no_credit';
const STATUS_LIMIT_REACHED = 'limit_reached';
/** /**
* Return all phones that belongs to active users * Return all phones that belongs to active users

View File

@ -112,6 +112,10 @@ jQuery(document).ready(function ()
case 'no_credit': case 'no_credit':
html += ' - <span class="text-warning">Plus de crédit</span>' html += ' - <span class="text-warning">Plus de crédit</span>'
break; break;
case 'limit_reached':
html += ' - <span class="text-warning">Limite RaspiSMS atteinte</span>'
break;
} }
return html return html